ngx-radiant 21.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/LICENSE +21 -0
- package/README.md +216 -0
- package/fesm2022/ngx-radiant.mjs +721 -0
- package/fesm2022/ngx-radiant.mjs.map +1 -0
- package/package.json +43 -0
- package/types/ngx-radiant.d.ts +143 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-radiant.mjs","sources":["../../../projects/ngx-radiant/src/lib/ngx-radiant.ts","../../../projects/ngx-radiant/src/lib/ngx-radiant.directive.ts","../../../projects/ngx-radiant/src/public-api.ts","../../../projects/ngx-radiant/src/ngx-radiant.ts"],"sourcesContent":["import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\n\nexport type NgxRadiantItemType = 'image' | 'video' | 'iframe';\n\nexport interface NgxRadiantItem {\n src: string;\n type?: NgxRadiantItemType;\n alt?: string;\n caption?: string;\n thumb?: string;\n}\n\nexport interface NgxRadiantConfig {\n ariaLabel?: string;\n closeOnEscape?: boolean;\n loop?: boolean;\n showThumbnails?: boolean;\n showCounter?: boolean;\n showNavigation?: boolean;\n zoomable?: boolean;\n initialZoom?: number;\n minZoom?: number;\n maxZoom?: number;\n zoomStep?: number;\n showZoomSlider?: boolean;\n iframeAspectRatio?: string;\n iframeAutoplay?: boolean;\n iframeMuted?: boolean;\n iframeAllowedOrigins?: string[];\n}\n\nconst NGX_RADIANT_DEFAULT_CONFIG: Required<NgxRadiantConfig> = {\n ariaLabel: 'Image gallery lightbox',\n closeOnEscape: true,\n loop: true,\n showThumbnails: true,\n showCounter: true,\n showNavigation: true,\n zoomable: true,\n initialZoom: 1,\n minZoom: 1,\n maxZoom: 3,\n zoomStep: 0.25,\n showZoomSlider: false,\n iframeAspectRatio: '16 / 9',\n iframeAutoplay: false,\n iframeMuted: false,\n iframeAllowedOrigins: [],\n};\n\n@Component({\n selector: 'ngx-radiant-lightbox',\n imports: [NgClass],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.ngx-radiant-host-open]': 'open()',\n },\n template: `\n @if (open()) {\n <div class=\"ngx-radiant\" role=\"dialog\" aria-modal=\"true\" [attr.aria-label]=\"resolvedAriaLabel()\">\n <button\n type=\"button\"\n class=\"ngx-radiant__backdrop\"\n aria-label=\"Close lightbox\"\n (click)=\"close()\"\n ></button>\n\n <div class=\"ngx-radiant__shell\" (keydown)=\"handleKeydown($event)\" tabindex=\"-1\">\n <header class=\"ngx-radiant__toolbar\">\n <div class=\"ngx-radiant__toolbar-start\">\n @if (showCounterControl() && canNavigate()) {\n <div class=\"ngx-radiant__counter\" aria-live=\"polite\">\n {{ currentIndex() + 1 }} / {{ items().length }}\n </div>\n }\n </div>\n\n <div class=\"ngx-radiant__toolbar-actions\">\n @if (canZoom()) {\n <div class=\"ngx-radiant__zoom-controls\" aria-label=\"Image zoom controls\">\n <button type=\"button\" class=\"ngx-radiant__button\" aria-label=\"Zoom out\" (click)=\"zoomOut()\">−</button>\n <button type=\"button\" class=\"ngx-radiant__zoom-value\" aria-label=\"Reset zoom\" (click)=\"resetZoom()\">\n {{ zoomPercent() }}%\n </button>\n <button type=\"button\" class=\"ngx-radiant__button\" aria-label=\"Zoom in\" (click)=\"zoomIn()\">+</button>\n @if (showZoomSliderControl()) {\n <label class=\"ngx-radiant__zoom-slider-label\">\n <span>Zoom</span>\n <input\n class=\"ngx-radiant__zoom-slider\"\n type=\"range\"\n [min]=\"resolvedMinZoom()\"\n [max]=\"resolvedMaxZoom()\"\n [step]=\"resolvedZoomStep()\"\n [value]=\"zoomLevel()\"\n aria-label=\"Zoom level\"\n (input)=\"setZoomFromInput($event)\"\n />\n </label>\n }\n </div>\n }\n\n <button type=\"button\" class=\"ngx-radiant__button\" aria-label=\"Close\" (click)=\"close()\">\n ×\n </button>\n </div>\n </header>\n\n @if (showNavigationControl() && canNavigate()) {\n <button\n type=\"button\"\n class=\"ngx-radiant__nav ngx-radiant__nav--prev\"\n aria-label=\"Previous item\"\n (click)=\"previous()\"\n >\n ‹\n </button>\n }\n\n <figure class=\"ngx-radiant__stage\">\n @switch (currentItem().type ?? 'image') {\n @case ('video') {\n <video class=\"ngx-radiant__media\" [src]=\"currentItem().src\" controls playsinline></video>\n }\n @case ('iframe') {\n <iframe\n class=\"ngx-radiant__frame\"\n [src]=\"trustedFrameSrc()\"\n [style.aspect-ratio]=\"resolvedIframeAspectRatio()\"\n title=\"Ngx Radiant embedded content\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n allowfullscreen\n ></iframe>\n }\n @default {\n <img\n #zoomMedia\n class=\"ngx-radiant__media\"\n [style.transform]=\"zoomTransform()\"\n [class.ngx-radiant__media--zoomed]=\"zoomLevel() > 1\"\n [class.ngx-radiant__media--dragging]=\"dragging()\"\n [src]=\"currentItem().src\"\n [alt]=\"currentItem().alt ?? currentItem().caption ?? ''\"\n draggable=\"false\"\n (dblclick)=\"toggleZoom()\"\n (pointerdown)=\"startPan($event)\"\n (pointermove)=\"movePan($event)\"\n (pointerup)=\"endPan($event)\"\n (pointercancel)=\"endPan($event)\"\n (lostpointercapture)=\"endPan($event)\"\n />\n }\n }\n\n @if (currentItem().caption) {\n <figcaption class=\"ngx-radiant__caption\">{{ currentItem().caption }}</figcaption>\n }\n </figure>\n\n @if (showNavigationControl() && canNavigate()) {\n <button\n type=\"button\"\n class=\"ngx-radiant__nav ngx-radiant__nav--next\"\n aria-label=\"Next item\"\n (click)=\"next()\"\n >\n ›\n </button>\n }\n\n @if (resolvedShowThumbnails() && items().length > 1) {\n <footer class=\"ngx-radiant__thumbs\" aria-label=\"Lightbox thumbnails\">\n @for (item of items(); track item.src; let index = $index) {\n <button\n type=\"button\"\n class=\"ngx-radiant__thumb\"\n [ngClass]=\"{ 'ngx-radiant__thumb--active': index === currentIndex() }\"\n [attr.aria-label]=\"'Open item ' + (index + 1)\"\n [attr.aria-current]=\"index === currentIndex() ? 'true' : null\"\n (click)=\"goTo(index)\"\n >\n <img [src]=\"item.thumb ?? item.src\" [alt]=\"item.alt ?? ''\" />\n </button>\n }\n </footer>\n }\n </div>\n </div>\n }\n `,\n styles: `\n :host {\n display: contents;\n }\n\n .ngx-radiant {\n position: fixed;\n inset: 0;\n z-index: var(--ngx-radiant-z-index, 1000);\n display: grid;\n place-items: center;\n color: #fff;\n font-family:\n Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n }\n\n .ngx-radiant__backdrop {\n position: absolute;\n inset: 0;\n border: 0;\n background: color-mix(in srgb, #020617 88%, transparent);\n cursor: zoom-out;\n }\n\n .ngx-radiant__shell {\n position: relative;\n z-index: 1;\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n grid-template-rows: auto minmax(0, 1fr) auto;\n width: min(94vw, 1180px);\n height: min(92vh, 840px);\n gap: 1rem;\n outline: none;\n }\n\n .ngx-radiant__toolbar {\n grid-column: 1 / -1;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n }\n\n .ngx-radiant__toolbar-start,\n .ngx-radiant__toolbar-actions,\n .ngx-radiant__zoom-controls {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .ngx-radiant__zoom-slider-label {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n border: 1px solid rgb(255 255 255 / 18%);\n border-radius: 999px;\n background: rgb(15 23 42 / 72%);\n padding: 0.35rem 0.65rem;\n box-shadow: 0 18px 50px rgb(0 0 0 / 28%);\n backdrop-filter: blur(14px);\n }\n\n .ngx-radiant__zoom-slider-label span {\n font-size: 0.72rem;\n font-weight: 800;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n }\n\n .ngx-radiant__zoom-slider {\n width: min(22vw, 12rem);\n accent-color: var(--ngx-radiant-accent, #67e8f9);\n }\n\n .ngx-radiant__toolbar-start {\n min-width: 0;\n }\n\n .ngx-radiant__toolbar-actions {\n margin-left: auto;\n }\n\n .ngx-radiant__counter,\n .ngx-radiant__button,\n .ngx-radiant__zoom-value,\n .ngx-radiant__nav {\n border: 1px solid rgb(255 255 255 / 18%);\n border-radius: 999px;\n background: rgb(15 23 42 / 72%);\n color: inherit;\n box-shadow: 0 18px 50px rgb(0 0 0 / 28%);\n backdrop-filter: blur(14px);\n }\n\n .ngx-radiant__counter,\n .ngx-radiant__zoom-value {\n padding: 0.55rem 0.9rem;\n font-size: 0.86rem;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n }\n\n .ngx-radiant__button,\n .ngx-radiant__zoom-value,\n .ngx-radiant__nav {\n cursor: pointer;\n transition:\n transform 160ms ease,\n background 160ms ease,\n opacity 160ms ease;\n }\n\n .ngx-radiant__button {\n width: 2.6rem;\n height: 2.6rem;\n font-size: 1.35rem;\n line-height: 1;\n }\n\n .ngx-radiant__zoom-value {\n min-width: 4.4rem;\n }\n\n .ngx-radiant__nav {\n align-self: center;\n width: 3rem;\n height: 3rem;\n border: 0;\n font-size: 2.6rem;\n line-height: 1;\n }\n\n .ngx-radiant__button:hover,\n .ngx-radiant__zoom-value:hover,\n .ngx-radiant__nav:hover,\n .ngx-radiant__thumb:hover {\n transform: translateY(-1px);\n background: rgb(30 41 59 / 86%);\n }\n\n .ngx-radiant__stage {\n grid-column: 2;\n grid-row: 2;\n display: grid;\n place-items: center;\n overflow: hidden;\n min-width: 0;\n min-height: 0;\n margin: 0;\n }\n\n .ngx-radiant__media,\n .ngx-radiant__frame {\n max-width: 100%;\n max-height: 100%;\n border: 0;\n border-radius: 1.25rem;\n background: #020617;\n box-shadow: 0 28px 80px rgb(0 0 0 / 42%);\n }\n\n .ngx-radiant__media {\n transform-origin: center center;\n transition: transform 180ms ease;\n }\n\n .ngx-radiant__media--zoomed {\n cursor: grab;\n touch-action: none;\n user-select: none;\n }\n\n .ngx-radiant__media--dragging {\n cursor: grabbing;\n transition: none;\n }\n\n .ngx-radiant__frame {\n width: min(100%, 960px);\n height: auto;\n max-height: 100%;\n }\n\n .ngx-radiant__caption {\n justify-self: center;\n max-width: min(80ch, 84vw);\n margin-top: 0.85rem;\n padding: 0.6rem 0.9rem;\n border-radius: 999px;\n background: rgb(15 23 42 / 68%);\n color: rgb(226 232 240);\n text-align: center;\n backdrop-filter: blur(12px);\n }\n\n .ngx-radiant__thumbs {\n grid-column: 1 / -1;\n display: flex;\n justify-content: center;\n gap: 0.5rem;\n overflow-x: auto;\n padding: 0.25rem;\n }\n\n .ngx-radiant__thumb {\n width: 4rem;\n height: 3rem;\n flex: 0 0 auto;\n overflow: hidden;\n border: 1px solid rgb(255 255 255 / 14%);\n border-radius: 0.7rem;\n background: rgb(15 23 42 / 70%);\n cursor: pointer;\n opacity: 0.68;\n padding: 0;\n transition: 160ms ease;\n }\n\n .ngx-radiant__thumb--active {\n border-color: var(--ngx-radiant-accent, #67e8f9);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--ngx-radiant-accent, #67e8f9) 30%, transparent);\n opacity: 1;\n }\n\n .ngx-radiant__thumb img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n\n @media (max-width: 720px) {\n .ngx-radiant__shell {\n width: 96vw;\n height: 94vh;\n grid-template-columns: 1fr 1fr;\n }\n\n .ngx-radiant__toolbar {\n align-items: flex-start;\n }\n\n .ngx-radiant__toolbar-actions,\n .ngx-radiant__zoom-controls {\n flex-wrap: wrap;\n justify-content: flex-end;\n }\n\n .ngx-radiant__zoom-slider {\n width: 8rem;\n }\n\n .ngx-radiant__stage {\n grid-column: 1 / -1;\n }\n\n .ngx-radiant__nav {\n grid-row: 3;\n justify-self: center;\n }\n\n .ngx-radiant__nav--prev {\n grid-column: 1;\n }\n\n .ngx-radiant__nav--next {\n grid-column: 2;\n }\n\n .ngx-radiant__thumbs {\n display: none;\n }\n }\n `,\n})\nexport class NgxRadiantLightbox {\n readonly items = input<NgxRadiantItem[]>([]);\n readonly config = input<NgxRadiantConfig | null>(null);\n readonly ariaLabel = input<string | undefined>(undefined);\n readonly closeOnEscape = input<boolean | undefined>(undefined);\n readonly loop = input<boolean | undefined>(undefined);\n readonly showThumbnails = input<boolean | undefined>(undefined);\n readonly showCounter = input<boolean | undefined>(undefined);\n readonly showNavigation = input<boolean | undefined>(undefined);\n readonly zoomable = input<boolean | undefined>(undefined);\n readonly initialZoom = input<number | undefined>(undefined);\n readonly minZoom = input<number | undefined>(undefined);\n readonly maxZoom = input<number | undefined>(undefined);\n readonly zoomStep = input<number | undefined>(undefined);\n readonly showZoomSlider = input<boolean | undefined>(undefined);\n readonly iframeAspectRatio = input<string | undefined>(undefined);\n readonly iframeAutoplay = input<boolean | undefined>(undefined);\n readonly iframeMuted = input<boolean | undefined>(undefined);\n readonly iframeAllowedOrigins = input<string[] | undefined>(undefined);\n\n readonly open = input(false);\n readonly index = input(0);\n\n readonly openChange = output<boolean>();\n readonly indexChange = output<number>();\n readonly closed = output<void>();\n\n private readonly sanitizer = inject(DomSanitizer);\n private readonly zoomMedia = viewChild<ElementRef<HTMLElement>>('zoomMedia');\n protected readonly zoomLevel = signal(1);\n protected readonly panX = signal(0);\n protected readonly panY = signal(0);\n protected readonly dragging = signal(false);\n private dragStart: { pointerId: number; x: number; y: number; panX: number; panY: number } | null = null;\n\n private readonly resolvedConfig = computed<Required<NgxRadiantConfig>>(() => {\n const config = this.config() ?? {};\n return {\n ...NGX_RADIANT_DEFAULT_CONFIG,\n ...config,\n ariaLabel: this.ariaLabel() ?? config.ariaLabel ?? NGX_RADIANT_DEFAULT_CONFIG.ariaLabel,\n closeOnEscape: this.closeOnEscape() ?? config.closeOnEscape ?? NGX_RADIANT_DEFAULT_CONFIG.closeOnEscape,\n loop: this.loop() ?? config.loop ?? NGX_RADIANT_DEFAULT_CONFIG.loop,\n showThumbnails: this.showThumbnails() ?? config.showThumbnails ?? NGX_RADIANT_DEFAULT_CONFIG.showThumbnails,\n showCounter: this.showCounter() ?? config.showCounter ?? NGX_RADIANT_DEFAULT_CONFIG.showCounter,\n showNavigation: this.showNavigation() ?? config.showNavigation ?? NGX_RADIANT_DEFAULT_CONFIG.showNavigation,\n zoomable: this.zoomable() ?? config.zoomable ?? NGX_RADIANT_DEFAULT_CONFIG.zoomable,\n initialZoom: this.initialZoom() ?? config.initialZoom ?? NGX_RADIANT_DEFAULT_CONFIG.initialZoom,\n minZoom: this.minZoom() ?? config.minZoom ?? NGX_RADIANT_DEFAULT_CONFIG.minZoom,\n maxZoom: this.maxZoom() ?? config.maxZoom ?? NGX_RADIANT_DEFAULT_CONFIG.maxZoom,\n zoomStep: this.zoomStep() ?? config.zoomStep ?? NGX_RADIANT_DEFAULT_CONFIG.zoomStep,\n showZoomSlider: this.showZoomSlider() ?? config.showZoomSlider ?? NGX_RADIANT_DEFAULT_CONFIG.showZoomSlider,\n iframeAspectRatio: this.iframeAspectRatio() ?? config.iframeAspectRatio ?? NGX_RADIANT_DEFAULT_CONFIG.iframeAspectRatio,\n iframeAutoplay: this.iframeAutoplay() ?? config.iframeAutoplay ?? NGX_RADIANT_DEFAULT_CONFIG.iframeAutoplay,\n iframeMuted: this.iframeMuted() ?? config.iframeMuted ?? NGX_RADIANT_DEFAULT_CONFIG.iframeMuted,\n iframeAllowedOrigins:\n this.iframeAllowedOrigins() ?? config.iframeAllowedOrigins ?? NGX_RADIANT_DEFAULT_CONFIG.iframeAllowedOrigins,\n };\n });\n\n protected readonly currentIndex = computed(() => this.normalizeIndex(this.index()));\n protected readonly currentItem = computed(() => this.items()[this.currentIndex()] ?? { src: '' });\n protected readonly canNavigate = computed(() => this.items().length > 1);\n protected readonly canZoom = computed(\n () => this.resolvedConfig().zoomable && (this.currentItem().type ?? 'image') === 'image',\n );\n protected readonly zoomPercent = computed(() => Math.round(this.zoomLevel() * 100));\n protected readonly zoomTransform = computed(() => `translate(${this.panX()}px, ${this.panY()}px) scale(${this.zoomLevel()})`);\n protected readonly resolvedMinZoom = computed(() => Math.max(this.resolvedConfig().minZoom, 0.1));\n protected readonly resolvedMaxZoom = computed(() => Math.max(this.resolvedConfig().maxZoom, this.resolvedMinZoom()));\n protected readonly resolvedZoomStep = computed(() => Math.max(this.resolvedConfig().zoomStep, 0.01));\n protected readonly resolvedIframeAspectRatio = computed(() => this.resolvedConfig().iframeAspectRatio);\n protected readonly trustedFrameSrc = computed<SafeResourceUrl>(() =>\n this.sanitizer.bypassSecurityTrustResourceUrl(this.resolveFrameSrc()),\n );\n protected readonly resolvedAriaLabel = computed(() => this.resolvedConfig().ariaLabel);\n protected readonly resolvedShowThumbnails = computed(() => this.resolvedConfig().showThumbnails);\n protected readonly showCounterControl = computed(() => this.resolvedConfig().showCounter);\n protected readonly showNavigationControl = computed(() => this.resolvedConfig().showNavigation);\n protected readonly showZoomSliderControl = computed(() => this.resolvedConfig().showZoomSlider);\n\n constructor() {\n effect(() => {\n this.open();\n this.currentIndex();\n this.currentItem().src;\n const config = this.resolvedConfig();\n this.zoomLevel.set(this.clampZoom(config.initialZoom));\n this.resetPan();\n });\n }\n\n openAt(index: number): void {\n this.indexChange.emit(this.normalizeIndex(index));\n this.openChange.emit(this.items().length > 0);\n }\n\n close(): void {\n if (!this.open()) {\n return;\n }\n\n this.openChange.emit(false);\n this.closed.emit();\n }\n\n next(): void {\n this.goTo(this.currentIndex() + 1);\n }\n\n previous(): void {\n this.goTo(this.currentIndex() - 1);\n }\n\n goTo(index: number): void {\n if (!this.canNavigate()) {\n return;\n }\n\n const itemCount = this.items().length;\n const nextIndex = this.resolvedConfig().loop\n ? (index + itemCount) % itemCount\n : Math.min(Math.max(index, 0), itemCount - 1);\n\n this.indexChange.emit(nextIndex);\n }\n\n zoomIn(): void {\n if (!this.canZoom()) {\n return;\n }\n\n this.setZoom(this.zoomLevel() + this.resolvedZoomStep());\n }\n\n zoomOut(): void {\n if (!this.canZoom()) {\n return;\n }\n\n this.setZoom(this.zoomLevel() - this.resolvedZoomStep());\n }\n\n resetZoom(): void {\n this.zoomLevel.set(this.clampZoom(this.resolvedConfig().initialZoom));\n this.resetPan();\n }\n\n setZoomFromInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.setZoom(Number(input.value));\n }\n\n setZoom(zoom: number): void {\n const nextZoom = this.clampZoom(zoom);\n this.zoomLevel.set(nextZoom);\n if (nextZoom <= this.resolvedMinZoom()) {\n this.resetPan();\n return;\n }\n\n this.clampCurrentPan();\n }\n\n toggleZoom(): void {\n if (!this.canZoom()) {\n return;\n }\n\n this.setZoom(this.zoomLevel() > this.resolvedMinZoom() ? this.resolvedMinZoom() : this.resolvedMaxZoom());\n }\n\n startPan(event: PointerEvent): void {\n if (!this.canPan()) {\n return;\n }\n\n event.preventDefault();\n (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);\n this.dragStart = {\n pointerId: event.pointerId,\n x: event.clientX,\n y: event.clientY,\n panX: this.panX(),\n panY: this.panY(),\n };\n this.dragging.set(true);\n }\n\n movePan(event: PointerEvent): void {\n if (!this.dragStart || this.dragStart.pointerId !== event.pointerId) {\n return;\n }\n\n event.preventDefault();\n const bounds = this.getPanBounds(event.currentTarget as HTMLElement);\n this.panX.set(this.clamp(this.dragStart.panX + event.clientX - this.dragStart.x, -bounds.x, bounds.x));\n this.panY.set(this.clamp(this.dragStart.panY + event.clientY - this.dragStart.y, -bounds.y, bounds.y));\n }\n\n endPan(event: PointerEvent): void {\n if (this.dragStart?.pointerId === event.pointerId) {\n this.dragStart = null;\n this.dragging.set(false);\n }\n }\n\n handleKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.resolvedConfig().closeOnEscape) {\n event.preventDefault();\n this.close();\n return;\n }\n\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n this.next();\n return;\n }\n\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n this.previous();\n return;\n }\n\n if (event.key === '+' || event.key === '=') {\n event.preventDefault();\n this.zoomIn();\n return;\n }\n\n if (event.key === '-' || event.key === '_') {\n event.preventDefault();\n this.zoomOut();\n return;\n }\n\n if (event.key === '0') {\n event.preventDefault();\n this.resetZoom();\n }\n }\n\n private resolveFrameSrc(): string {\n const config = this.resolvedConfig();\n const source = this.currentItem().src;\n const baseHref = this.getBaseHref();\n\n try {\n const url = new URL(source, baseHref);\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n return 'about:blank';\n }\n\n if (config.iframeAllowedOrigins.length > 0 && !config.iframeAllowedOrigins.includes(url.origin)) {\n return 'about:blank';\n }\n\n if (config.iframeAutoplay) {\n url.searchParams.set('autoplay', '1');\n }\n if (config.iframeMuted) {\n url.searchParams.set('mute', '1');\n url.searchParams.set('muted', '1');\n }\n\n return this.isRelativeUrl(source) ? `${url.pathname}${url.search}${url.hash}` : url.toString();\n } catch {\n return 'about:blank';\n }\n }\n\n private getBaseHref(): string {\n return typeof globalThis.location !== 'undefined' ? globalThis.location.origin : 'http://localhost';\n }\n\n private isRelativeUrl(url: string): boolean {\n return !/^[a-z][a-z\\d+.-]*:/i.test(url) && !url.startsWith('//');\n }\n\n private clampCurrentPan(): void {\n if (!this.open()) {\n return;\n }\n\n const media = this.zoomMedia()?.nativeElement;\n if (!media) {\n return;\n }\n\n const bounds = this.getPanBounds(media);\n this.panX.set(this.clamp(this.panX(), -bounds.x, bounds.x));\n this.panY.set(this.clamp(this.panY(), -bounds.y, bounds.y));\n }\n\n private getPanBounds(media: HTMLElement): { x: number; y: number } {\n const stage = media.parentElement as HTMLElement | null;\n const zoom = this.zoomLevel();\n const mediaWidth = media.clientWidth || media.getBoundingClientRect().width;\n const mediaHeight = media.clientHeight || media.getBoundingClientRect().height;\n const stageWidth = stage?.clientWidth || mediaWidth;\n const stageHeight = stage?.clientHeight || mediaHeight;\n return {\n x: Math.max((mediaWidth * zoom - stageWidth) / 2, 0),\n y: Math.max((mediaHeight * zoom - stageHeight) / 2, 0),\n };\n }\n\n private clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n }\n\n private normalizeIndex(index: number): number {\n const itemCount = this.items().length;\n if (itemCount === 0) {\n return 0;\n }\n\n return Math.min(Math.max(Math.trunc(index) || 0, 0), itemCount - 1);\n }\n\n private clampZoom(zoom: number): number {\n const minZoom = this.resolvedMinZoom();\n const maxZoom = this.resolvedMaxZoom();\n return Math.min(Math.max(Number.isFinite(zoom) ? zoom : this.resolvedConfig().initialZoom, minZoom), maxZoom);\n }\n\n private canPan(): boolean {\n return this.canZoom() && this.zoomLevel() > this.resolvedMinZoom();\n }\n\n private resetPan(): void {\n this.panX.set(0);\n this.panY.set(0);\n this.dragStart = null;\n this.dragging.set(false);\n }\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n ApplicationRef,\n ComponentRef,\n DestroyRef,\n Directive,\n EnvironmentInjector,\n HostListener,\n PLATFORM_ID,\n createComponent,\n inject,\n input,\n} from '@angular/core';\n\nimport { NgxRadiantConfig, NgxRadiantItem, NgxRadiantItemType, NgxRadiantLightbox } from './ngx-radiant';\n\ninterface NgxRadiantSubscription {\n unsubscribe(): void;\n}\n\n@Directive({\n selector: '[ngxRadiant]',\n exportAs: 'ngxRadiant',\n})\nexport class NgxRadiantDirective {\n readonly ngxRadiant = input<NgxRadiantItem | NgxRadiantItem[] | string | null>(null);\n readonly radiantItems = input<NgxRadiantItem[] | null>(null);\n readonly radiantIndex = input(0);\n readonly radiantType = input<NgxRadiantItemType | undefined>(undefined);\n readonly radiantAlt = input<string | undefined>(undefined);\n readonly radiantCaption = input<string | undefined>(undefined);\n readonly radiantThumb = input<string | undefined>(undefined);\n readonly radiantAriaLabel = input<string | undefined>(undefined);\n readonly radiantConfig = input<NgxRadiantConfig | null>(null);\n readonly radiantCloseOnEscape = input<boolean | undefined>(undefined);\n readonly radiantLoop = input<boolean | undefined>(undefined);\n readonly radiantShowThumbnails = input<boolean | undefined>(undefined);\n\n private readonly appRef = inject(ApplicationRef);\n private readonly environmentInjector = inject(EnvironmentInjector);\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n private readonly platformId = inject(PLATFORM_ID);\n\n private lightboxRef: ComponentRef<NgxRadiantLightbox> | null = null;\n private hostElement: HTMLElement | null = null;\n private subscriptions: NgxRadiantSubscription[] = [];\n private activeIndex = 0;\n\n constructor() {\n this.destroyRef.onDestroy(() => this.destroyLightbox());\n }\n\n @HostListener('click', ['$event'])\n open(event?: Event): void {\n event?.preventDefault();\n\n const items = this.resolveItems();\n if (!items.length || !isPlatformBrowser(this.platformId)) {\n return;\n }\n\n this.activeIndex = this.normalizeIndex(this.radiantIndex(), items.length);\n const lightboxRef = this.ensureLightbox();\n this.syncLightboxInputs(lightboxRef, items, true);\n }\n\n close(): void {\n this.destroyLightbox();\n }\n\n private ensureLightbox(): ComponentRef<NgxRadiantLightbox> {\n if (this.lightboxRef) {\n return this.lightboxRef;\n }\n\n this.hostElement = this.document.createElement('ngx-radiant-overlay');\n this.document.body.appendChild(this.hostElement);\n\n this.lightboxRef = createComponent(NgxRadiantLightbox, {\n environmentInjector: this.environmentInjector,\n hostElement: this.hostElement,\n });\n\n this.appRef.attachView(this.lightboxRef.hostView);\n this.subscriptions = [\n this.lightboxRef.instance.indexChange.subscribe((index) => {\n this.activeIndex = index;\n this.lightboxRef?.setInput('index', index);\n this.lightboxRef?.changeDetectorRef.detectChanges();\n }),\n this.lightboxRef.instance.openChange.subscribe((open) => {\n if (!open) {\n this.destroyLightbox();\n }\n }),\n this.lightboxRef.instance.closed.subscribe(() => this.destroyLightbox()),\n ];\n\n return this.lightboxRef;\n }\n\n private syncLightboxInputs(\n lightboxRef: ComponentRef<NgxRadiantLightbox>,\n items: NgxRadiantItem[],\n open: boolean,\n ): void {\n lightboxRef.setInput('items', items);\n lightboxRef.setInput('index', this.activeIndex);\n lightboxRef.setInput('open', open);\n lightboxRef.setInput('config', this.radiantConfig());\n lightboxRef.setInput('ariaLabel', this.radiantAriaLabel());\n lightboxRef.setInput('closeOnEscape', this.radiantCloseOnEscape());\n lightboxRef.setInput('loop', this.radiantLoop());\n lightboxRef.setInput('showThumbnails', this.radiantShowThumbnails());\n lightboxRef.changeDetectorRef.detectChanges();\n }\n\n private destroyLightbox(): void {\n for (const subscription of this.subscriptions) {\n subscription.unsubscribe();\n }\n this.subscriptions = [];\n\n if (this.lightboxRef) {\n this.appRef.detachView(this.lightboxRef.hostView);\n this.lightboxRef.destroy();\n this.lightboxRef = null;\n }\n\n this.hostElement?.remove();\n this.hostElement = null;\n }\n\n private resolveItems(): NgxRadiantItem[] {\n const explicitItems = this.radiantItems();\n if (explicitItems?.length) {\n return explicitItems;\n }\n\n const value = this.ngxRadiant();\n if (!value) {\n return [];\n }\n\n if (Array.isArray(value)) {\n return value;\n }\n\n if (typeof value === 'string') {\n return [\n {\n src: value,\n type: this.radiantType(),\n alt: this.radiantAlt(),\n caption: this.radiantCaption(),\n thumb: this.radiantThumb(),\n },\n ];\n }\n\n return [value];\n }\n\n private normalizeIndex(index: number, itemCount: number): number {\n return Math.min(Math.max(Math.trunc(index) || 0, 0), itemCount - 1);\n }\n}\n","/*\n * Public API Surface of ngx-radiant\n */\n\nexport * from './lib/ngx-radiant';\nexport * from './lib/ngx-radiant.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ngx-radiant",
|
|
3
|
+
"version": "21.0.0",
|
|
4
|
+
"description": "A modern Angular 21+ lightbox library for image galleries and media previews.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"angular",
|
|
7
|
+
"angular-21-plus",
|
|
8
|
+
"lightbox",
|
|
9
|
+
"gallery",
|
|
10
|
+
"modal",
|
|
11
|
+
"fancybox"
|
|
12
|
+
],
|
|
13
|
+
"author": "Edward",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/edward124689/ngx-radiant.git"
|
|
18
|
+
},
|
|
19
|
+
"bugs": {
|
|
20
|
+
"url": "https://github.com/edward124689/ngx-radiant/issues"
|
|
21
|
+
},
|
|
22
|
+
"homepage": "https://github.com/edward124689/ngx-radiant#readme",
|
|
23
|
+
"peerDependencies": {
|
|
24
|
+
"@angular/common": ">=21.0.0",
|
|
25
|
+
"@angular/core": ">=21.0.0"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"tslib": "^2.3.0"
|
|
29
|
+
},
|
|
30
|
+
"sideEffects": false,
|
|
31
|
+
"module": "fesm2022/ngx-radiant.mjs",
|
|
32
|
+
"typings": "types/ngx-radiant.d.ts",
|
|
33
|
+
"exports": {
|
|
34
|
+
"./package.json": {
|
|
35
|
+
"default": "./package.json"
|
|
36
|
+
},
|
|
37
|
+
".": {
|
|
38
|
+
"types": "./types/ngx-radiant.d.ts",
|
|
39
|
+
"default": "./fesm2022/ngx-radiant.mjs"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"type": "module"
|
|
43
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { SafeResourceUrl } from '@angular/platform-browser';
|
|
3
|
+
|
|
4
|
+
type NgxRadiantItemType = 'image' | 'video' | 'iframe';
|
|
5
|
+
interface NgxRadiantItem {
|
|
6
|
+
src: string;
|
|
7
|
+
type?: NgxRadiantItemType;
|
|
8
|
+
alt?: string;
|
|
9
|
+
caption?: string;
|
|
10
|
+
thumb?: string;
|
|
11
|
+
}
|
|
12
|
+
interface NgxRadiantConfig {
|
|
13
|
+
ariaLabel?: string;
|
|
14
|
+
closeOnEscape?: boolean;
|
|
15
|
+
loop?: boolean;
|
|
16
|
+
showThumbnails?: boolean;
|
|
17
|
+
showCounter?: boolean;
|
|
18
|
+
showNavigation?: boolean;
|
|
19
|
+
zoomable?: boolean;
|
|
20
|
+
initialZoom?: number;
|
|
21
|
+
minZoom?: number;
|
|
22
|
+
maxZoom?: number;
|
|
23
|
+
zoomStep?: number;
|
|
24
|
+
showZoomSlider?: boolean;
|
|
25
|
+
iframeAspectRatio?: string;
|
|
26
|
+
iframeAutoplay?: boolean;
|
|
27
|
+
iframeMuted?: boolean;
|
|
28
|
+
iframeAllowedOrigins?: string[];
|
|
29
|
+
}
|
|
30
|
+
declare class NgxRadiantLightbox {
|
|
31
|
+
readonly items: _angular_core.InputSignal<NgxRadiantItem[]>;
|
|
32
|
+
readonly config: _angular_core.InputSignal<NgxRadiantConfig | null>;
|
|
33
|
+
readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
|
|
34
|
+
readonly closeOnEscape: _angular_core.InputSignal<boolean | undefined>;
|
|
35
|
+
readonly loop: _angular_core.InputSignal<boolean | undefined>;
|
|
36
|
+
readonly showThumbnails: _angular_core.InputSignal<boolean | undefined>;
|
|
37
|
+
readonly showCounter: _angular_core.InputSignal<boolean | undefined>;
|
|
38
|
+
readonly showNavigation: _angular_core.InputSignal<boolean | undefined>;
|
|
39
|
+
readonly zoomable: _angular_core.InputSignal<boolean | undefined>;
|
|
40
|
+
readonly initialZoom: _angular_core.InputSignal<number | undefined>;
|
|
41
|
+
readonly minZoom: _angular_core.InputSignal<number | undefined>;
|
|
42
|
+
readonly maxZoom: _angular_core.InputSignal<number | undefined>;
|
|
43
|
+
readonly zoomStep: _angular_core.InputSignal<number | undefined>;
|
|
44
|
+
readonly showZoomSlider: _angular_core.InputSignal<boolean | undefined>;
|
|
45
|
+
readonly iframeAspectRatio: _angular_core.InputSignal<string | undefined>;
|
|
46
|
+
readonly iframeAutoplay: _angular_core.InputSignal<boolean | undefined>;
|
|
47
|
+
readonly iframeMuted: _angular_core.InputSignal<boolean | undefined>;
|
|
48
|
+
readonly iframeAllowedOrigins: _angular_core.InputSignal<string[] | undefined>;
|
|
49
|
+
readonly open: _angular_core.InputSignal<boolean>;
|
|
50
|
+
readonly index: _angular_core.InputSignal<number>;
|
|
51
|
+
readonly openChange: _angular_core.OutputEmitterRef<boolean>;
|
|
52
|
+
readonly indexChange: _angular_core.OutputEmitterRef<number>;
|
|
53
|
+
readonly closed: _angular_core.OutputEmitterRef<void>;
|
|
54
|
+
private readonly sanitizer;
|
|
55
|
+
private readonly zoomMedia;
|
|
56
|
+
protected readonly zoomLevel: _angular_core.WritableSignal<number>;
|
|
57
|
+
protected readonly panX: _angular_core.WritableSignal<number>;
|
|
58
|
+
protected readonly panY: _angular_core.WritableSignal<number>;
|
|
59
|
+
protected readonly dragging: _angular_core.WritableSignal<boolean>;
|
|
60
|
+
private dragStart;
|
|
61
|
+
private readonly resolvedConfig;
|
|
62
|
+
protected readonly currentIndex: _angular_core.Signal<number>;
|
|
63
|
+
protected readonly currentItem: _angular_core.Signal<NgxRadiantItem>;
|
|
64
|
+
protected readonly canNavigate: _angular_core.Signal<boolean>;
|
|
65
|
+
protected readonly canZoom: _angular_core.Signal<boolean>;
|
|
66
|
+
protected readonly zoomPercent: _angular_core.Signal<number>;
|
|
67
|
+
protected readonly zoomTransform: _angular_core.Signal<string>;
|
|
68
|
+
protected readonly resolvedMinZoom: _angular_core.Signal<number>;
|
|
69
|
+
protected readonly resolvedMaxZoom: _angular_core.Signal<number>;
|
|
70
|
+
protected readonly resolvedZoomStep: _angular_core.Signal<number>;
|
|
71
|
+
protected readonly resolvedIframeAspectRatio: _angular_core.Signal<string>;
|
|
72
|
+
protected readonly trustedFrameSrc: _angular_core.Signal<SafeResourceUrl>;
|
|
73
|
+
protected readonly resolvedAriaLabel: _angular_core.Signal<string>;
|
|
74
|
+
protected readonly resolvedShowThumbnails: _angular_core.Signal<boolean>;
|
|
75
|
+
protected readonly showCounterControl: _angular_core.Signal<boolean>;
|
|
76
|
+
protected readonly showNavigationControl: _angular_core.Signal<boolean>;
|
|
77
|
+
protected readonly showZoomSliderControl: _angular_core.Signal<boolean>;
|
|
78
|
+
constructor();
|
|
79
|
+
openAt(index: number): void;
|
|
80
|
+
close(): void;
|
|
81
|
+
next(): void;
|
|
82
|
+
previous(): void;
|
|
83
|
+
goTo(index: number): void;
|
|
84
|
+
zoomIn(): void;
|
|
85
|
+
zoomOut(): void;
|
|
86
|
+
resetZoom(): void;
|
|
87
|
+
setZoomFromInput(event: Event): void;
|
|
88
|
+
setZoom(zoom: number): void;
|
|
89
|
+
toggleZoom(): void;
|
|
90
|
+
startPan(event: PointerEvent): void;
|
|
91
|
+
movePan(event: PointerEvent): void;
|
|
92
|
+
endPan(event: PointerEvent): void;
|
|
93
|
+
handleKeydown(event: KeyboardEvent): void;
|
|
94
|
+
private resolveFrameSrc;
|
|
95
|
+
private getBaseHref;
|
|
96
|
+
private isRelativeUrl;
|
|
97
|
+
private clampCurrentPan;
|
|
98
|
+
private getPanBounds;
|
|
99
|
+
private clamp;
|
|
100
|
+
private normalizeIndex;
|
|
101
|
+
private clampZoom;
|
|
102
|
+
private canPan;
|
|
103
|
+
private resetPan;
|
|
104
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxRadiantLightbox, never>;
|
|
105
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxRadiantLightbox, "ngx-radiant-lightbox", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "loop": { "alias": "loop"; "required": false; "isSignal": true; }; "showThumbnails": { "alias": "showThumbnails"; "required": false; "isSignal": true; }; "showCounter": { "alias": "showCounter"; "required": false; "isSignal": true; }; "showNavigation": { "alias": "showNavigation"; "required": false; "isSignal": true; }; "zoomable": { "alias": "zoomable"; "required": false; "isSignal": true; }; "initialZoom": { "alias": "initialZoom"; "required": false; "isSignal": true; }; "minZoom": { "alias": "minZoom"; "required": false; "isSignal": true; }; "maxZoom": { "alias": "maxZoom"; "required": false; "isSignal": true; }; "zoomStep": { "alias": "zoomStep"; "required": false; "isSignal": true; }; "showZoomSlider": { "alias": "showZoomSlider"; "required": false; "isSignal": true; }; "iframeAspectRatio": { "alias": "iframeAspectRatio"; "required": false; "isSignal": true; }; "iframeAutoplay": { "alias": "iframeAutoplay"; "required": false; "isSignal": true; }; "iframeMuted": { "alias": "iframeMuted"; "required": false; "isSignal": true; }; "iframeAllowedOrigins": { "alias": "iframeAllowedOrigins"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "index": { "alias": "index"; "required": false; "isSignal": true; }; }, { "openChange": "openChange"; "indexChange": "indexChange"; "closed": "closed"; }, never, never, true, never>;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
declare class NgxRadiantDirective {
|
|
109
|
+
readonly ngxRadiant: _angular_core.InputSignal<string | NgxRadiantItem | NgxRadiantItem[] | null>;
|
|
110
|
+
readonly radiantItems: _angular_core.InputSignal<NgxRadiantItem[] | null>;
|
|
111
|
+
readonly radiantIndex: _angular_core.InputSignal<number>;
|
|
112
|
+
readonly radiantType: _angular_core.InputSignal<NgxRadiantItemType | undefined>;
|
|
113
|
+
readonly radiantAlt: _angular_core.InputSignal<string | undefined>;
|
|
114
|
+
readonly radiantCaption: _angular_core.InputSignal<string | undefined>;
|
|
115
|
+
readonly radiantThumb: _angular_core.InputSignal<string | undefined>;
|
|
116
|
+
readonly radiantAriaLabel: _angular_core.InputSignal<string | undefined>;
|
|
117
|
+
readonly radiantConfig: _angular_core.InputSignal<NgxRadiantConfig | null>;
|
|
118
|
+
readonly radiantCloseOnEscape: _angular_core.InputSignal<boolean | undefined>;
|
|
119
|
+
readonly radiantLoop: _angular_core.InputSignal<boolean | undefined>;
|
|
120
|
+
readonly radiantShowThumbnails: _angular_core.InputSignal<boolean | undefined>;
|
|
121
|
+
private readonly appRef;
|
|
122
|
+
private readonly environmentInjector;
|
|
123
|
+
private readonly document;
|
|
124
|
+
private readonly destroyRef;
|
|
125
|
+
private readonly platformId;
|
|
126
|
+
private lightboxRef;
|
|
127
|
+
private hostElement;
|
|
128
|
+
private subscriptions;
|
|
129
|
+
private activeIndex;
|
|
130
|
+
constructor();
|
|
131
|
+
open(event?: Event): void;
|
|
132
|
+
close(): void;
|
|
133
|
+
private ensureLightbox;
|
|
134
|
+
private syncLightboxInputs;
|
|
135
|
+
private destroyLightbox;
|
|
136
|
+
private resolveItems;
|
|
137
|
+
private normalizeIndex;
|
|
138
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxRadiantDirective, never>;
|
|
139
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgxRadiantDirective, "[ngxRadiant]", ["ngxRadiant"], { "ngxRadiant": { "alias": "ngxRadiant"; "required": false; "isSignal": true; }; "radiantItems": { "alias": "radiantItems"; "required": false; "isSignal": true; }; "radiantIndex": { "alias": "radiantIndex"; "required": false; "isSignal": true; }; "radiantType": { "alias": "radiantType"; "required": false; "isSignal": true; }; "radiantAlt": { "alias": "radiantAlt"; "required": false; "isSignal": true; }; "radiantCaption": { "alias": "radiantCaption"; "required": false; "isSignal": true; }; "radiantThumb": { "alias": "radiantThumb"; "required": false; "isSignal": true; }; "radiantAriaLabel": { "alias": "radiantAriaLabel"; "required": false; "isSignal": true; }; "radiantConfig": { "alias": "radiantConfig"; "required": false; "isSignal": true; }; "radiantCloseOnEscape": { "alias": "radiantCloseOnEscape"; "required": false; "isSignal": true; }; "radiantLoop": { "alias": "radiantLoop"; "required": false; "isSignal": true; }; "radiantShowThumbnails": { "alias": "radiantShowThumbnails"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export { NgxRadiantDirective, NgxRadiantLightbox };
|
|
143
|
+
export type { NgxRadiantConfig, NgxRadiantItem, NgxRadiantItemType };
|