@cradokski/fullscreen
Version:
An Angular service and **directives** that provide **fullscreen control**, **reactive state**, and **template-friendly utilities**.
1 lines • 21.7 kB
Source Map (JSON)
{"version":3,"file":"cradokski-fullscreen.mjs","sources":["../../../projects/fullscreen/src/lib/fullscreen.service.ts","../../../projects/fullscreen/src/lib/directives/fs-toggle.directive.ts","../../../projects/fullscreen/src/lib/directives/fs-exit.directive.ts","../../../projects/fullscreen/src/lib/directives/fs-doubletap.directive.ts","../../../projects/fullscreen/src/lib/directives/if-fullscreen.directive.ts","../../../projects/fullscreen/src/lib/directives/fs-activeclass.directive.ts","../../../projects/fullscreen/src/lib/fullscreen.module.ts","../../../projects/fullscreen/src/public-api.ts","../../../projects/fullscreen/src/cradokski-fullscreen.ts"],"sourcesContent":["import { Injectable, NgZone } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\nexport type FullscreenStatus = 'entered' | 'exited';\r\nexport type FullscreenCallback = (isFullscreen: boolean, element: Element | null) => void;\r\n\r\n/** Reactive fullscreen state for templates and directives */\r\nexport interface FullscreenState {\r\n /** Whether any element is currently fullscreen */\r\n active: boolean;\r\n /** Which element is fullscreen (if any) */\r\n element: Element | null;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FullScreenService {\r\n /** Internal flag for synchronous API compatibility */\r\n private isFullscreenFlag = false;\r\n\r\n /** Timestamp for double-tap detection */\r\n private lastTapTime: number | null = null;\r\n\r\n /** For testing: allows mocking time */\r\n private nowFn: () => number = () => Date.now();\r\n\r\n /** RxJS state observable for template bindings */\r\n readonly fullscreen$ = new BehaviorSubject<FullscreenState>({\r\n active: false,\r\n element: null\r\n });\r\n\r\n constructor(private zone: NgZone) {\r\n [\r\n 'fullscreenchange',\r\n 'webkitfullscreenchange',\r\n 'mozfullscreenchange',\r\n 'MSFullscreenChange'\r\n ].forEach(event =>\r\n document.addEventListener(event, this.handleFullscreenEvent)\r\n );\r\n }\r\n\r\n // ---------------------------------------------------------------------\r\n // Internal helpers\r\n // ---------------------------------------------------------------------\r\n\r\n /** Returns the currently fullscreen element (cross-browser) */\r\n private getFullscreenElement(): Element | null {\r\n return (\r\n document.fullscreenElement ||\r\n (document as any).webkitFullscreenElement ||\r\n (document as any).mozFullScreenElement ||\r\n (document as any).msFullscreenElement ||\r\n null\r\n );\r\n }\r\n\r\n /** Request fullscreen on a specific element (default: <html>) */\r\n private async enterFullscreenElement(\r\n element: HTMLElement = document.documentElement\r\n ): Promise<FullscreenStatus> {\r\n const request =\r\n element.requestFullscreen ??\r\n (element as any).webkitRequestFullscreen ??\r\n (element as any).mozRequestFullScreen ??\r\n (element as any).msRequestFullscreen;\r\n\r\n if (!request) {\r\n throw new Error('Fullscreen API not supported');\r\n }\r\n\r\n await request.call(element);\r\n return 'entered';\r\n }\r\n\r\n /** Exit fullscreen (cross-browser) */\r\n private async exitFullscreenElement(): Promise<FullscreenStatus> {\r\n const exit =\r\n document.exitFullscreen ??\r\n (document as any).webkitExitFullscreen ??\r\n (document as any).mozCancelFullScreen ??\r\n (document as any).msExitFullscreen;\r\n\r\n if (!exit) {\r\n throw new Error('Fullscreen API not supported');\r\n }\r\n\r\n await exit.call(document);\r\n return 'exited';\r\n }\r\n\r\n /** Sync check used by directives and consumers */\r\n isFullscreenActive(): boolean {\r\n const active = !!this.getFullscreenElement();\r\n this.isFullscreenFlag = active;\r\n return active;\r\n }\r\n\r\n // ---------------------------------------------------------------------\r\n // Public API (backwards compatible)\r\n // ---------------------------------------------------------------------\r\n\r\n enterFullscreen(element?: HTMLElement): void {\r\n this.enterFullscreenElement(element)\r\n .then(() => (this.isFullscreenFlag = true))\r\n .catch(() => { });\r\n }\r\n\r\n exitFullscreen(): void {\r\n this.exitFullscreenElement()\r\n .then(() => (this.isFullscreenFlag = false))\r\n .catch(() => { });\r\n }\r\n\r\n toggleFullscreen(element?: HTMLElement): Promise<FullscreenStatus> {\r\n return this.isFullscreenActive()\r\n ? this.exitFullscreenElement()\r\n : this.enterFullscreenElement(element);\r\n }\r\n\r\n ensureFullscreen(element?: HTMLElement): Promise<FullscreenStatus> {\r\n return this.isFullscreenActive()\r\n ? Promise.resolve('entered')\r\n : this.enterFullscreenElement(element);\r\n }\r\n\r\n ensureExitedFullscreen(): Promise<FullscreenStatus> {\r\n return this.isFullscreenActive()\r\n ? this.exitFullscreenElement()\r\n : Promise.resolve('exited');\r\n }\r\n\r\n // ---------------------------------------------------------------------\r\n // Double-tap browser toggle\r\n // ---------------------------------------------------------------------\r\n\r\n browserFsToggle(options?: { requireDoubleTap?: boolean; delayMs?: number }): boolean {\r\n this.browserFsToggleAsync(options);\r\n return this.isFullscreenFlag;\r\n }\r\n\r\n async browserFsToggleAsync(\r\n options?: { requireDoubleTap?: boolean; delayMs?: number }\r\n ): Promise<boolean> {\r\n const delayMs = options?.delayMs ?? 300;\r\n\r\n if (options?.requireDoubleTap) {\r\n const now = this.nowFn();\r\n\r\n if (this.lastTapTime && now - this.lastTapTime < delayMs) {\r\n this.lastTapTime = 0;\r\n const status = await this.toggleFullscreen();\r\n return status === 'entered';\r\n }\r\n\r\n this.lastTapTime = now;\r\n return false;\r\n }\r\n\r\n const status = await this.toggleFullscreen();\r\n return status === 'entered';\r\n }\r\n\r\n // ---------------------------------------------------------------------\r\n // Watch API (unified)\r\n // ---------------------------------------------------------------------\r\n\r\n /** Subscribe to fullscreen changes; returns unwatch() */\r\n watchFullscreen(callback: FullscreenCallback): () => void {\r\n const sub = this.fullscreen$.subscribe(({ active, element }) =>\r\n callback(active, element)\r\n );\r\n return () => sub.unsubscribe();\r\n }\r\n\r\n // ---------------------------------------------------------------------\r\n // DOM fullscreen event handler\r\n // ---------------------------------------------------------------------\r\n\r\n private handleFullscreenEvent = () => {\r\n const el = this.getFullscreenElement();\r\n const isFs = !!el;\r\n\r\n this.isFullscreenFlag = isFs;\r\n\r\n this.zone.run(() => {\r\n this.fullscreen$.next({ active: isFs, element: el });\r\n });\r\n };\r\n}\r\n","import { Directive, HostListener, ElementRef } from '@angular/core';\r\nimport { FullScreenService } from '../fullscreen.service';\r\n\r\n@Directive({\r\n\tstandalone: true,\r\n\tselector: '[fsToggle]'\r\n})\r\nexport class FsToggleDirective {\r\n\r\n\tconstructor(\r\n\t\tprivate host: ElementRef<HTMLElement>,\r\n\t\tprivate fs: FullScreenService\r\n\t) { }\r\n\r\n\t@HostListener('click')\r\n\tonClick(): void {\r\n\t\tconst el = this.host.nativeElement;\r\n\t\tthis.fs.toggleFullscreen(el);\r\n\t}\r\n}\r\n","import { Directive, HostListener } from '@angular/core';\r\nimport { FullScreenService } from '../fullscreen.service';\r\n\r\n@Directive({\r\n\tstandalone: true,\r\n\tselector: '[fsExit]'\r\n})\r\nexport class FsExitDirective {\r\n\r\n\tconstructor(private fs: FullScreenService) { }\r\n\r\n\t@HostListener('click')\r\n\tonClick(): void {\r\n\t\tthis.fs.ensureExitedFullscreen();\r\n\t}\r\n}\r\n","\r\nimport { Directive, HostListener } from '@angular/core';\r\nimport { FullScreenService } from '../fullscreen.service';\r\n\r\n@Directive({\r\n\tstandalone: true,\r\n\tselector: '[fsDoubleTap]'\r\n})\r\nexport class FsDoubleTapDirective {\r\n\tconstructor(\r\n\t\tprivate fs: FullScreenService\r\n\t) { }\r\n\r\n\t@HostListener('click')\r\n\tonClick(): void {\r\n\t\tthis.fs.browserFsToggle({ requireDoubleTap: true });\r\n\t}\r\n}\r\n","\r\nimport { Directive, TemplateRef, ViewContainerRef } from '@angular/core';\r\nimport { FullScreenService } from '../fullscreen.service';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Directive({\r\n\tstandalone: true,\r\n\tselector: '[ifFullscreen]'\r\n})\r\nexport class IfFullscreenDirective {\r\n\tprivate sub!: Subscription;\r\n\tprivate isShown = false;\r\n\r\n\tconstructor(\r\n\t\tprivate tpl: TemplateRef<any>,\r\n\t\tprivate vcr: ViewContainerRef,\r\n\t\tprivate fs: FullScreenService\r\n\t) { }\r\n\r\n\tngOnInit() {\r\n\t\tconsole.log('IfFullscreenDirective init');\r\n\t\tthis.sub = this.fs.fullscreen$.subscribe(status => {\r\n\t\t\tif (status.active && !this.isShown) {\r\n\t\t\t\tthis.vcr.createEmbeddedView(this.tpl);\r\n\t\t\t\tthis.isShown = true;\r\n\t\t\t\tconsole.log('IfFullscreenDirective active && !this.isShown');\r\n\t\t\t} else if (!status.active && this.isShown) {\r\n\t\t\t\tthis.vcr.clear();\r\n\t\t\t\tthis.isShown = false;\r\n\t\t\t\tconsole.log('IfFullscreenDirective !active && this.isShown');\r\n\t\t\t} else console.log('IfFullscreenDirective no change');\r\n\t\t});\r\n\t}\r\n\r\n\tngOnDestroy() {\r\n\t\tthis.sub?.unsubscribe();\r\n\t}\r\n}\r\n","import { Directive, ElementRef, Renderer2 } from '@angular/core';\r\nimport { FullScreenService } from '../fullscreen.service';\r\n\r\n@Directive({\r\n\tstandalone: true,\r\n\tselector: '[fsActiveClass]'\r\n})\r\nexport class FsActiveClassDirective {\r\n\tprivate unwatch: () => void = () => { };\r\n\r\n\tconstructor(\r\n\t\tprivate host: ElementRef<HTMLElement>,\r\n\t\tprivate renderer: Renderer2,\r\n\t\tprivate fs: FullScreenService\r\n\t) { }\r\n\r\n\tngOnInit() {\r\n\t\tconsole.log('FsActiveClassDirective init', this.host.nativeElement);\r\n\t\tthis.unwatch = this.fs.watchFullscreen((active, el) => {\r\n\t\t\tconst isHostFs = active;\r\n\r\n\t\t\tconsole.log('ngOnInit isHostFs', isHostFs, \" el =[\", el, \"] host.native` = [\", this.host.nativeElement, \"]\");\r\n\t\t\tif (isHostFs) {\r\n\t\t\t\tthis.renderer.addClass(this.host.nativeElement, 'fs-active');\r\n\t\t\t} else {\r\n\t\t\t\tthis.renderer.removeClass(this.host.nativeElement, 'fs-active');\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tngOnDestroy() {\r\n\t\tthis.unwatch();\r\n\t}\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { FsToggleDirective } from './directives/fs-toggle.directive';\r\nimport { FsExitDirective } from './directives/fs-exit.directive';\r\nimport { FsDoubleTapDirective } from './directives/fs-doubletap.directive';\r\n\r\nimport { IfFullscreenDirective } from './directives/if-fullscreen.directive';\r\nimport { FsActiveClassDirective } from './directives/fs-activeclass.directive';\r\nimport { FullScreenService } from './fullscreen.service';\r\n\r\n@NgModule({\r\n\timports: [\r\n\t\tCommonModule,\r\n\t\tFsToggleDirective,\r\n\t\tFsExitDirective,\r\n\t\tFsDoubleTapDirective,\r\n\t\tIfFullscreenDirective,\r\n\t\tFsActiveClassDirective\r\n\t],\r\n\texports: [\r\n\t\tFsToggleDirective,\r\n\t\tFsExitDirective,\r\n\t\tFsDoubleTapDirective,\r\n\t\tIfFullscreenDirective,\r\n\t\tFsActiveClassDirective\r\n\t]\r\n})\r\nexport class FullscreenModule { }\r\n","/*\n * Public API Surface of fullscreen\n */\nexport * from './lib/fullscreen.service';\n\nexport * from './lib/fullscreen.module';\n\nexport * from './lib/directives/fs-toggle.directive';\nexport * from './lib/directives/fs-exit.directive';\nexport * from './lib/directives/fs-doubletap.directive';\nexport * from './lib/directives/fs-activeclass.directive';\nexport * from './lib/directives/if-fullscreen.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.FullScreenService"],"mappings":"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"}