UNPKG

ngx-screen-saver

Version:
1 lines 27.8 kB
{"version":3,"file":"ngx-screen-saver.mjs","sources":["../../../projects/ngx-screen-saver/src/lib/utils/reverse-loop.ts","../../../projects/ngx-screen-saver/src/lib/screen-savers/stars/star.ts","../../../projects/ngx-screen-saver/src/lib/screen-savers/stars/stars.ts","../../../projects/ngx-screen-saver/src/lib/screen-savers/dvd/dvd.ts","../../../projects/ngx-screen-saver/src/lib/utils/random-hsl-from-range.ts","../../../projects/ngx-screen-saver/src/lib/screen-savers/fireworks/particle.ts","../../../projects/ngx-screen-saver/src/lib/screen-savers/fireworks/firework.ts","../../../projects/ngx-screen-saver/src/lib/screen-savers/fireworks/fireworks.ts","../../../projects/ngx-screen-saver/src/lib/services/idle-detection.service.ts","../../../projects/ngx-screen-saver/src/lib/components/screen-saver/ngx-screen-saver.component.ts","../../../projects/ngx-screen-saver/src/lib/ngx-screen-saver.module.ts","../../../projects/ngx-screen-saver/src/public-api.ts","../../../projects/ngx-screen-saver/src/ngx-screen-saver.ts"],"sourcesContent":["export const reverseLoop = <T = any>(\r\n arr: T[],\r\n callback: (item: T, index: number) => void\r\n) => {\r\n for (let i = arr.length - 1; i >= 0; i--) {\r\n callback(arr[i], i);\r\n }\r\n};\r\n","import * as p5 from 'p5';\r\n\r\nexport class Star {\r\n constructor(private p5: p5, private x: number, private y: number) {}\r\n\r\n MAX_SIZE: number = 5;\r\n\r\n size: number = 1;\r\n decay: boolean = false;\r\n destroy: boolean = false;\r\n\r\n growth = this.p5.random(15, 50) / 500;\r\n\r\n update() {\r\n if (this.decay === false) {\r\n this.size = this.size + this.growth;\r\n }\r\n\r\n if (this.decay === true) {\r\n this.size = this.size - this.growth;\r\n }\r\n\r\n if (this.size >= this.MAX_SIZE) {\r\n this.decay = true;\r\n }\r\n\r\n if (this.size <= 0) {\r\n this.destroy = true;\r\n }\r\n }\r\n\r\n draw() {\r\n this.p5.noStroke();\r\n this.p5.fill(255);\r\n\r\n this.p5.circle(this.x, this.y, this.size);\r\n }\r\n}\r\n","import p5 from 'p5';\r\nimport { reverseLoop } from '../../utils/reverse-loop';\r\nimport { Star } from './star';\r\n\r\nconst MAX_STARS = 100;\r\nconst starsArr: Star[] = [];\r\n\r\nexport const stars = (p5: p5) => {\r\n const width = p5.windowWidth;\r\n const height = p5.windowHeight;\r\n\r\n let backgroundImage: p5.Image;\r\n\r\n // PRELOAD\r\n p5.preload = () => {\r\n backgroundImage = p5.loadImage('assets/ngx-screen-saver/galaxy.jpg');\r\n };\r\n\r\n // SETUP\r\n p5.setup = () => {\r\n p5.createCanvas(width, height).addClass('ngx-screen-saver');\r\n\r\n p5.image(backgroundImage, 0, 0);\r\n\r\n for (let i = 0; i < MAX_STARS; i++) {\r\n const star = new Star(p5, p5.random(0, width), p5.random(0, height));\r\n\r\n starsArr.push(star);\r\n }\r\n };\r\n\r\n // DRAW\r\n p5.draw = () => {\r\n p5.image(backgroundImage, 0, 0);\r\n\r\n reverseLoop(starsArr, (star, idx) => {\r\n star.update();\r\n star.draw();\r\n\r\n if (star.destroy) {\r\n starsArr.splice(idx, 1);\r\n\r\n const newStar = new Star(p5, p5.random(0, width), p5.random(0, height));\r\n\r\n starsArr.push(newStar);\r\n }\r\n });\r\n };\r\n};\r\n","import p5 from 'p5';\r\n\r\nexport const dvd = (p5: p5) => {\r\n const width = p5.windowWidth;\r\n const height = p5.windowHeight;\r\n\r\n let dvdLogo: p5.Image;\r\n\r\n let posX = 300;\r\n let posY = 100;\r\n let velX: number;\r\n let velY: number;\r\n\r\n // PRELOAD\r\n p5.preload = () => {\r\n dvdLogo = p5.loadImage('assets/ngx-screen-saver/dvd_logo.png');\r\n };\r\n\r\n // SETUP\r\n p5.setup = () => {\r\n p5.createCanvas(width, height).addClass('ngx-screen-saver');\r\n p5.background(0);\r\n\r\n velX = 7;\r\n velY = 5;\r\n };\r\n\r\n // DRAW\r\n p5.draw = () => {\r\n p5.background(0);\r\n p5.image(dvdLogo, posX, posY);\r\n\r\n posX = posX + velX;\r\n posY = posY + velY;\r\n\r\n if (posX + dvdLogo.width >= width || posX <= 0) {\r\n velX = -velX;\r\n }\r\n\r\n if (posY + dvdLogo.height >= height || posY <= 0) {\r\n velY = -velY;\r\n }\r\n };\r\n};\r\n","import p5 from 'p5';\r\n\r\nexport const randomHslFromRange = (\r\n p5: p5,\r\n hue: number,\r\n margin: number\r\n): p5.Color => {\r\n let randomNumber = p5.random(hue - margin, hue + margin);\r\n\r\n if (randomNumber < 0) {\r\n randomNumber = 360 - randomNumber;\r\n }\r\n\r\n if (randomNumber > 360) {\r\n randomNumber = randomNumber - 360;\r\n }\r\n\r\n p5.colorMode(p5.HSL);\r\n\r\n return p5.color(randomNumber, 100, 50);\r\n};\r\n","import p5 from 'p5';\r\n\r\nexport class Particle {\r\n constructor(\r\n private p5: p5,\r\n public pos: p5.Vector,\r\n public vel: p5.Vector,\r\n public size: number,\r\n public color: p5.Color,\r\n public rotation?: number\r\n ) {\r\n if (this.rotation) {\r\n this.vel.rotate(this.rotation);\r\n this.vel.setMag(this.p5.random(1, 2));\r\n }\r\n }\r\n\r\n update() {\r\n this.pos.add(this.vel);\r\n }\r\n\r\n draw() {\r\n this.p5.noStroke();\r\n this.p5.fill(this.color);\r\n\r\n this.p5.circle(this.pos.x, this.pos.y, this.size);\r\n }\r\n}\r\n","import p5 from 'p5';\r\nimport { randomHslFromRange } from '../../utils/random-hsl-from-range';\r\nimport { reverseLoop } from '../../utils/reverse-loop';\r\nimport { Particle } from './particle';\r\n\r\nexport class Firework {\r\n constructor(private p5: p5, public posX: number, public maxHeight: number) {}\r\n\r\n pos = this.p5.createVector(this.posX, 0);\r\n vel = this.p5.createVector(0, this.p5.random(1.5, 2.5));\r\n randomHue = this.p5.random(0, 360);\r\n\r\n phase: 'fly' | 'explode' | 'dispose' = 'fly';\r\n\r\n explosionParticlesCreated: boolean = false;\r\n\r\n fireParticles: Particle[] = [];\r\n explosionParticles: Particle[] = [];\r\n\r\n update() {\r\n this.p5.push();\r\n this.p5.colorMode(this.p5.HSL);\r\n\r\n if (this.phase === 'fly') {\r\n this.pos.add(this.vel);\r\n\r\n this.fireParticles.push(\r\n new Particle(\r\n this.p5,\r\n this.p5.createVector(\r\n this.pos.x + this.p5.random(-2, 2),\r\n this.pos.y + this.p5.random(-2, 2)\r\n ),\r\n this.p5.createVector(0, 0),\r\n 3,\r\n randomHslFromRange(this.p5, 30, 20)\r\n )\r\n );\r\n\r\n if (this.fireParticles.length > 30) {\r\n this.fireParticles.splice(0, 1);\r\n }\r\n\r\n if (this.pos.y >= this.maxHeight) {\r\n this.phase = 'explode';\r\n }\r\n }\r\n\r\n if (this.phase === 'explode') {\r\n if (this.fireParticles.length > 0) {\r\n this.fireParticles.splice(0, 1);\r\n }\r\n\r\n if (this.explosionParticlesCreated === false) {\r\n for (let i = 0; i < 150; i++) {\r\n const newParticle = new Particle(\r\n this.p5,\r\n this.pos.copy(),\r\n this.p5.createVector(1, 0),\r\n 5,\r\n randomHslFromRange(this.p5, this.randomHue, 20),\r\n this.p5.random(0, 360)\r\n );\r\n\r\n this.explosionParticles.push(newParticle);\r\n }\r\n\r\n this.explosionParticlesCreated = true;\r\n }\r\n\r\n if (this.explosionParticles.length <= 0) {\r\n this.phase = 'dispose';\r\n }\r\n }\r\n\r\n this.p5.pop();\r\n }\r\n\r\n draw() {\r\n this.p5.noStroke();\r\n\r\n if (this.fireParticles.length > 0) {\r\n reverseLoop(this.fireParticles, (particle, idx) => {\r\n particle.update();\r\n particle.draw();\r\n });\r\n }\r\n\r\n if (this.explosionParticles.length > 0) {\r\n reverseLoop(this.explosionParticles, (particle, idx) => {\r\n if (this.pos.dist(particle.pos) <= 50) {\r\n particle.update();\r\n particle.draw();\r\n } else {\r\n this.explosionParticles.splice(idx, 1);\r\n }\r\n });\r\n }\r\n }\r\n}\r\n","import p5 from 'p5';\r\nimport { reverseLoop } from '../../utils/reverse-loop';\r\nimport { Firework } from './firework';\r\n\r\nexport const fireworks = (p5: p5) => {\r\n const WIDTH = p5.windowWidth;\r\n const HEIGHT = p5.windowHeight;\r\n const MAX_FIREWORKS: number = 10;\r\n\r\n const SAFE_MARGIN = 40;\r\n const SAFE_SPACE = {\r\n xStart: SAFE_MARGIN,\r\n xEnd: WIDTH - SAFE_MARGIN,\r\n yStart: 0,\r\n yEnd: HEIGHT - SAFE_MARGIN,\r\n };\r\n\r\n const fireworksArr: Firework[] = [];\r\n\r\n let backgroundImg: p5.Image;\r\n\r\n // PRELOAD\r\n p5.preload = () => {\r\n backgroundImg = p5.loadImage('assets/ngx-screen-saver/fireworks_bg.jpg');\r\n };\r\n\r\n // SETUP\r\n p5.setup = () => {\r\n p5.createCanvas(WIDTH, HEIGHT).addClass('ngx-screen-saver');\r\n p5.angleMode(p5.DEGREES);\r\n\r\n backgroundImg.resize(WIDTH, HEIGHT);\r\n\r\n for (let i = 0; i < MAX_FIREWORKS; i++) {\r\n fireworksArr.push(\r\n new Firework(\r\n p5,\r\n p5.random(SAFE_SPACE.xStart, SAFE_SPACE.xEnd),\r\n p5.random(SAFE_SPACE.yStart, SAFE_SPACE.yEnd)\r\n )\r\n );\r\n }\r\n };\r\n\r\n // DRAW\r\n p5.draw = () => {\r\n const heightOffset = HEIGHT - backgroundImg.height;\r\n\r\n p5.image(backgroundImg, 0, heightOffset);\r\n\r\n p5.translate(0, HEIGHT); // moves the origin to bottom left\r\n p5.scale(1, -1); // flips the y values so y increases \"up\"\r\n\r\n reverseLoop(fireworksArr, (firework, idx) => {\r\n firework.update();\r\n firework.draw();\r\n\r\n if (firework.phase === 'dispose') {\r\n fireworksArr.splice(idx, 1);\r\n\r\n fireworksArr.push(\r\n new Firework(\r\n p5,\r\n p5.random(SAFE_SPACE.xStart, SAFE_SPACE.xEnd),\r\n p5.random(SAFE_SPACE.yStart, SAFE_SPACE.yEnd)\r\n )\r\n );\r\n }\r\n });\r\n };\r\n};\r\n","import { Injectable } from '@angular/core';\r\nimport { Subscription, BehaviorSubject, fromEvent, merge, timer } from 'rxjs';\r\nimport { switchMap, tap, startWith, throttleTime } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class IdleDetectionService {\r\n constructor() {}\r\n\r\n idleAfterMs!: number;\r\n\r\n private isIdleSubject = new BehaviorSubject<boolean>(false);\r\n public isIdle$ = this.isIdleSubject.asObservable();\r\n\r\n private activityEvents$ = merge(\r\n fromEvent(window, 'mousemove'),\r\n fromEvent(window, 'resize'),\r\n fromEvent(document, 'keydown'),\r\n fromEvent(document, 'mousedown'),\r\n fromEvent(document, 'touchstart')\r\n );\r\n\r\n private idleDetectionSubscription?: Subscription;\r\n\r\n startIdleDetection(idleAfterMs: number) {\r\n this.idleAfterMs = idleAfterMs;\r\n\r\n this.idleDetectionSubscription = this.activityEvents$\r\n .pipe(\r\n // trigger idle detection before any user activity events\r\n startWith(undefined),\r\n throttleTime(100),\r\n tap(() => {\r\n this.isIdleSubject.next(false);\r\n }),\r\n switchMap(() => {\r\n return timer(this.idleAfterMs).pipe(\r\n tap(() => {\r\n this.isIdleSubject.next(true);\r\n })\r\n );\r\n })\r\n )\r\n .subscribe();\r\n }\r\n\r\n stopIdleDetection() {\r\n this.idleDetectionSubscription?.unsubscribe();\r\n }\r\n}\r\n","import { Component, Input, OnDestroy, OnInit } from '@angular/core';\r\nimport p5 from 'p5';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { stars, dvd, fireworks } from '../../screen-savers';\r\nimport { IdleDetectionService } from '../../services/idle-detection.service';\r\n\r\nexport type ScreenSaverOption = 'stars' | 'dvd' | 'fireworks';\r\n\r\n@Component({\r\n selector: 'ngx-screen-saver',\r\n template: '',\r\n styleUrls: ['./ngx-screen-saver.component.scss'],\r\n})\r\nexport class NgxScreenSaverComponent implements OnInit, OnDestroy {\r\n constructor(private idleDetectionService: IdleDetectionService) {}\r\n\r\n @Input() idleAfterMs: number = 10000;\r\n @Input() variant: ScreenSaverOption = 'fireworks';\r\n @Input() opacity: number = 1;\r\n @Input() zIndex: number = 1;\r\n\r\n isIdleSubscription!: Subscription;\r\n\r\n showScreenSaver: boolean = false;\r\n screenSaver?: p5;\r\n\r\n screenSavers = {\r\n stars,\r\n dvd,\r\n fireworks,\r\n };\r\n\r\n ngOnInit(): void {\r\n document.documentElement.style.setProperty(\r\n '--ngx-screen-saver-opacity',\r\n this.opacity.toString()\r\n );\r\n\r\n document.documentElement.style.setProperty(\r\n '--ngx-screen-saver-z-index',\r\n this.zIndex.toString()\r\n );\r\n\r\n this.idleDetectionService.startIdleDetection(this.idleAfterMs);\r\n\r\n this.isIdleSubscription = this.idleDetectionService.isIdle$.subscribe(\r\n (isIdle) => {\r\n if (isIdle === true) {\r\n this.showScreenSaver = true;\r\n\r\n this.screenSaver = new p5(\r\n this.screenSavers[this.variant],\r\n document.querySelector('ngx-screen-saver')! as HTMLElement\r\n );\r\n } else {\r\n this.showScreenSaver = false;\r\n this.screenSaver?.remove();\r\n this.screenSaver = undefined;\r\n }\r\n }\r\n );\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.idleDetectionService.stopIdleDetection();\r\n this.isIdleSubscription.unsubscribe();\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { NgxScreenSaverComponent } from './components/screen-saver/ngx-screen-saver.component';\r\n\r\n@NgModule({\r\n declarations: [NgxScreenSaverComponent],\r\n imports: [],\r\n exports: [NgxScreenSaverComponent],\r\n})\r\nexport class NgxScreenSaverModule {}\r\n","/*\r\n * Public API Surface of ngx-screen-saver\r\n */\r\n\r\nexport * from './lib/components/screen-saver/ngx-screen-saver.component';\r\nexport * from './lib/ngx-screen-saver.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.IdleDetectionService"],"mappings":"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"}