@magmonium/one 0.4.85 → 0.4.87
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/fesm2022/{magmonium-one-base-dropdown-9iIR64ME.mjs → magmonium-one-base-dropdown-2hgXcmhE.mjs} +4 -4
- package/fesm2022/{magmonium-one-base-dropdown-9iIR64ME.mjs.map → magmonium-one-base-dropdown-2hgXcmhE.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-button-DO7FTwuF.mjs → magmonium-one-button-C5dk4R_m.mjs} +9 -3
- package/fesm2022/magmonium-one-button-C5dk4R_m.mjs.map +1 -0
- package/fesm2022/{magmonium-one-directives-DM6J1Hvs.mjs → magmonium-one-directives-hJ7wkmQn.mjs} +2 -2
- package/fesm2022/{magmonium-one-directives-DM6J1Hvs.mjs.map → magmonium-one-directives-hJ7wkmQn.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-group-BsqCB8D2.mjs → magmonium-one-group-bRamdzPO.mjs} +3 -3
- package/fesm2022/{magmonium-one-group-BsqCB8D2.mjs.map → magmonium-one-group-bRamdzPO.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-header-CgOV_m7w.mjs → magmonium-one-header-BZzD8uTJ.mjs} +2 -2
- package/fesm2022/{magmonium-one-header-CgOV_m7w.mjs.map → magmonium-one-header-BZzD8uTJ.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-image-editor-B6eCXP9A.mjs → magmonium-one-image-editor-BLqlV2ki.mjs} +4 -4
- package/fesm2022/{magmonium-one-image-editor-B6eCXP9A.mjs.map → magmonium-one-image-editor-BLqlV2ki.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-menu-CsoiLhVg.mjs → magmonium-one-menu-CJjjxFfu.mjs} +5 -5
- package/fesm2022/{magmonium-one-menu-CsoiLhVg.mjs.map → magmonium-one-menu-CJjjxFfu.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-multi-range-RSLLKzLu.mjs → magmonium-one-multi-range-DL_JlKVL.mjs} +2 -2
- package/fesm2022/{magmonium-one-multi-range-RSLLKzLu.mjs.map → magmonium-one-multi-range-DL_JlKVL.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-password-CJBa8k1l.mjs → magmonium-one-password-CvgWZkAX.mjs} +2 -2
- package/fesm2022/{magmonium-one-password-CJBa8k1l.mjs.map → magmonium-one-password-CvgWZkAX.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-range-CqOSrC0Y.mjs → magmonium-one-range-DlQfnl9p.mjs} +2 -2
- package/fesm2022/{magmonium-one-range-CqOSrC0Y.mjs.map → magmonium-one-range-DlQfnl9p.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-selector-CeqlecBa.mjs → magmonium-one-selector-BK48N5us.mjs} +4 -1
- package/fesm2022/{magmonium-one-selector-CeqlecBa.mjs.map → magmonium-one-selector-BK48N5us.mjs.map} +1 -1
- package/fesm2022/magmonium-one.mjs +79 -22
- package/fesm2022/magmonium-one.mjs.map +1 -1
- package/package.json +1 -1
- package/types/magmonium-one.d.ts +57 -22
- package/fesm2022/magmonium-one-button-DO7FTwuF.mjs.map +0 -1
package/fesm2022/{magmonium-one-selector-CeqlecBa.mjs.map → magmonium-one-selector-BK48N5us.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"magmonium-one-selector-CeqlecBa.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/services/device.ts","../../../../libs/one/src/lib/shared/services/dom.ts","../../../../libs/one/src/lib/shared/services/scroll.ts","../../../../libs/one/src/lib/shared/services/overlay/overlay.service.ts","../../../../libs/one/src/lib/shared/services/theme.service.ts","../../../../libs/one/src/lib/shared/directives/selector/selector-type.ts","../../../../libs/one/src/lib/shared/directives/selector/selector-helper.ts","../../../../libs/one/src/lib/shared/directives/selector/selector.ts"],"sourcesContent":["import { DestroyRef, inject, Injectable, signal } from '@angular/core';\n\nconst MOBILE_QUERY = '(max-width: 767px)';\nconst TABLET_QUERY = '(min-width: 768px) and (max-width: 1199px)';\nconst DESKTOP_QUERY = '(min-width: 1200px)';\nconst TOUCH_QUERY = '(pointer: coarse)';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DeviceService {\n readonly isMobile = signal(this.matches(MOBILE_QUERY));\n readonly isTablet = signal(this.matches(TABLET_QUERY));\n readonly isDesktop = signal(this.matches(DESKTOP_QUERY));\n readonly isTouch = signal(this.matches(TOUCH_QUERY));\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n this.listen(MOBILE_QUERY, this.isMobile);\n this.listen(TABLET_QUERY, this.isTablet);\n this.listen(DESKTOP_QUERY, this.isDesktop);\n this.listen(TOUCH_QUERY, this.isTouch);\n }\n\n private matches(query: string): boolean {\n return typeof window !== 'undefined' && window.matchMedia(query).matches;\n }\n\n private listen(query: string, sig: ReturnType<typeof signal<boolean>>): void {\n if (typeof window === 'undefined') return;\n const mql = window.matchMedia(query);\n const handler = (e: MediaQueryListEvent): void => sig.set(e.matches);\n mql.addEventListener('change', handler);\n this.destroyRef.onDestroy(() => mql.removeEventListener('change', handler));\n }\n}\n","import {\n ApplicationRef,\n Binding,\n ComponentRef,\n createComponent,\n DOCUMENT,\n EmbeddedViewRef,\n inject,\n Injectable,\n Renderer2,\n RendererFactory2,\n signal,\n Type,\n} from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { DeviceService } from './device';\n\ntype DomCreate<T> = {\n component: Type<T>;\n className: string;\n styles?: Record<string, string | number>;\n id?: string;\n parentClassName?: string;\n parentStyles?: Record<string, string | number>;\n bindings?: Binding[];\n};\n\ntype DomDestroy<T> = {\n componentRef?: ComponentRef<T>;\n parentClassName?: string;\n id?: string;\n className?: string;\n};\n\ntype DomAppend = {\n child: HTMLDivElement;\n className: string;\n styles?: Record<string, string | number>;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DomService {\n readonly fullscreen = signal(false);\n private readonly document = inject(DOCUMENT);\n private readonly applicationRef = inject(ApplicationRef);\n private readonly renderer: Renderer2;\n private readonly rendererFactory = inject(RendererFactory2);\n private readonly deviceService = inject(DeviceService);\n private readonly animationDuration = 300;\n\n constructor() {\n this.renderer = this.rendererFactory.createRenderer(null, null);\n }\n\n /**\n * Creates and appends a component to the DOM\n * @param config - Configuration object for creating the component\n * @returns ComponentRef if successful, undefined if element already exists\n */\n public create<T>({\n component,\n className,\n styles,\n id,\n parentClassName,\n parentStyles,\n bindings,\n }: DomCreate<T>): ComponentRef<T> | undefined {\n const existingElement = this.document.querySelector(`#${id}`);\n if (existingElement) {\n return undefined;\n }\n const componentRef: ComponentRef<T> = createComponent(component, {\n environmentInjector: this.applicationRef.injector,\n bindings,\n });\n this.applicationRef.attachView(componentRef.hostView);\n const child = this.document.createElement('div');\n child.className = className;\n this.applyStyles(child, styles);\n if (id) {\n child.id = id;\n }\n this.renderer.appendChild(\n child,\n (componentRef.hostView as EmbeddedViewRef<T>).rootNodes[0]\n );\n if (parentClassName) {\n this.append({ className: parentClassName, child, styles: parentStyles });\n return componentRef;\n }\n this.renderer.appendChild(this.document.querySelector('body'), child);\n return componentRef;\n }\n\n /**\n * Destroys a component and removes its DOM element\n * @param config - Configuration object for destroying the component\n */\n public destroy<T>({\n componentRef,\n parentClassName,\n id,\n className,\n }: DomDestroy<T>): void {\n const parent = parentClassName\n ? this.document?.querySelector(`.${parentClassName}`)\n : undefined;\n const elm = parent\n ? id\n ? parent.querySelector(`#${id}`)\n : parent.querySelector(`.${className}`)\n : (this.document?.querySelector(`.${className}`) ??\n this.document?.querySelector(`#${id}`));\n if (!elm) {\n return;\n }\n if (componentRef) {\n this.applicationRef.detachView(componentRef.hostView);\n componentRef.destroy();\n }\n elm.remove();\n }\n\n /**\n * Enables scrolling on the document body\n */\n public addBodyScroll(): void {\n this.document.body.style.overflow = 'auto';\n }\n\n /**\n * Disables scrolling on the document body\n */\n\n public removeBodyScroll(): void {\n this.document.body.style.overflow = 'hidden';\n }\n\n readonly toggleFullScreen = (): void => {\n const doc = this.document as Document & {\n webkitFullscreenElement?: Element;\n webkitExitFullscreen?: () => Promise<void>;\n };\n const docEl = doc.documentElement as HTMLElement & {\n webkitRequestFullscreen?: () => Promise<void>;\n };\n\n if (doc.fullscreenElement || doc.webkitFullscreenElement) {\n const exit =\n doc.exitFullscreen?.bind(doc) ?? doc.webkitExitFullscreen?.bind(doc);\n exit?.();\n this.fullscreen.set(false);\n } else {\n const request =\n docEl.requestFullscreen?.bind(docEl) ??\n docEl.webkitRequestFullscreen?.bind(docEl);\n request?.();\n this.fullscreen.set(true);\n }\n };\n\n readonly showHideScroll = (className: string): void => {\n const element = this.document.querySelector(`.${className}`);\n this.document.body.style.overflow = element ? 'hidden' : 'auto';\n };\n\n readonly toggleBodyScroll = (): void => {\n const isHidden = this.document.body.style.overflow === 'hidden';\n this.document.body.style.overflow = isHidden ? 'auto' : 'hidden';\n };\n\n readonly remove = (\n id: string,\n parentClassName: string,\n componentRef?: ComponentRef<unknown>\n ): void => {\n const parent = this.document.querySelector(`.${parentClassName}`);\n const element = parent?.querySelector(`#${id}`) as HTMLElement | null;\n if (!element) return;\n\n element.style.transition = `opacity ${this.animationDuration}ms ease`;\n element.style.opacity = '0';\n\n setTimeout(() => {\n if (componentRef) {\n this.applicationRef.detachView(componentRef.hostView);\n componentRef.destroy();\n }\n element.remove();\n }, this.animationDuration);\n };\n\n readonly updateStyle = (\n className: string,\n styles?: Record<string, string | number>\n ): void => {\n const element = this.document.querySelector(\n `.${className}`\n ) as HTMLElement | null;\n if (!element || !styles) return;\n this.applyStyles(element, styles);\n };\n\n /**\n * Targets a single element by id. `updateStyle` resolves by class and takes the\n * first match, which cannot address one element among siblings sharing a class.\n */\n readonly updateStyleById = ({\n id,\n parentClassName,\n styles,\n }: {\n id: string;\n parentClassName?: string;\n styles?: Record<string, string | number>;\n }): void => {\n const parent = parentClassName\n ? this.document.querySelector(`.${parentClassName}`)\n : this.document;\n const element = parent?.querySelector(`#${id}`) as HTMLElement | null;\n if (!element || !styles) return;\n this.applyStyles(element, styles);\n };\n\n readonly positionRelativeTo = (\n element: HTMLElement,\n boundary: DOMRect\n ): void => {\n const positionClass = Array.from(element.classList).find((cls) =>\n ['top-left', 'top-right', 'bottom-left', 'bottom-right'].includes(cls)\n );\n this.applyPositionFromClass(\n element,\n boundary,\n positionClass ?? 'bottom-left'\n );\n };\n\n readonly createDom = (\n html: string,\n className: string,\n boundary?: DOMRect\n ): HTMLDivElement => {\n let element = this.document.querySelector(\n `.${className}`\n ) as HTMLDivElement | null;\n if (!element) {\n element = this.document.createElement('div');\n element.className = className;\n this.renderer.appendChild(this.document.body, element);\n }\n element.innerHTML = html;\n if (boundary) {\n this.positionRelativeTo(element, boundary);\n }\n return element;\n };\n\n readonly observeMutations = (\n targetNode: Node,\n config: MutationObserverInit = { childList: true, subtree: true }\n ): Observable<MutationRecord[]> => {\n return new Observable<MutationRecord[]>((subscriber) => {\n const observer = new MutationObserver((mutations) => {\n subscriber.next(mutations);\n });\n observer.observe(targetNode, config);\n return () => observer.disconnect();\n });\n };\n\n readonly cleanup = (parentClassName: string): void => {\n const parent = this.document.querySelector(`.${parentClassName}`);\n if (parent) {\n parent.remove();\n }\n };\n\n readonly createAndAppend = <T>(\n config: DomCreate<T> & { boundary?: DOMRect }\n ): ComponentRef<T> | undefined => {\n const { boundary, ...createConfig } = config;\n const componentRef = this.create<T>(createConfig);\n if (componentRef && boundary) {\n const hostElement = (componentRef.hostView as EmbeddedViewRef<T>)\n .rootNodes[0] as HTMLElement;\n const wrapper = hostElement?.parentElement;\n if (wrapper) {\n this.positionRelativeTo(wrapper, boundary);\n }\n }\n return componentRef;\n };\n\n /**\n * Applies styles to a DOM element using Angular Renderer2\n * @param element - The HTML element to apply styles to\n * @param styles - Object containing CSS property-value pairs\n */\n private applyStyles(\n element: HTMLElement,\n styles?: Record<string, string | number>\n ): void {\n if (!styles) return;\n\n Object.entries(styles).forEach(([property, value]) => {\n this.renderer.setStyle(element, property, value);\n });\n }\n\n /**\n * Appends a child element to a parent with the specified class name\n * Creates the parent if it doesn't exist\n * @param config - Configuration object for appending the element\n */\n private append({ className, styles, child }: DomAppend): void {\n const parentClass = `.${className}`;\n let parentElement = this.document.querySelector(parentClass) as HTMLElement;\n if (!parentElement) {\n parentElement = this.document.createElement('div') as HTMLElement;\n parentElement.className = className;\n this.applyStyles(parentElement, styles);\n this.renderer.appendChild(\n this.document.querySelector('body') as HTMLElement,\n parentElement\n );\n }\n this.renderer.appendChild(parentElement, child);\n }\n\n private readonly applyPositionFromClass = (\n element: HTMLElement,\n boundary: DOMRect,\n positionClass: string\n ): void => {\n const isMobile = this.deviceService.isMobile();\n const styles: Record<string, string> = { position: 'absolute' };\n\n if (isMobile) {\n styles['left'] = '0';\n styles['right'] = '0';\n styles['bottom'] = '0';\n } else {\n switch (positionClass) {\n case 'top-left':\n styles['top'] = `${boundary.top}px`;\n styles['left'] = `${boundary.left}px`;\n break;\n case 'top-right':\n styles['top'] = `${boundary.top}px`;\n styles['left'] = `${boundary.right}px`;\n break;\n case 'bottom-right':\n styles['top'] = `${boundary.bottom}px`;\n styles['left'] = `${boundary.right}px`;\n break;\n case 'bottom-left':\n default:\n styles['top'] = `${boundary.bottom}px`;\n styles['left'] = `${boundary.left}px`;\n break;\n }\n }\n\n Object.entries(styles).forEach(([prop, val]) => {\n this.renderer.setStyle(element, prop, val);\n });\n };\n}\n","import { Injectable, signal } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ScrollService {\n /**\n * Reactive signal containing the scroll top position of the window.\n */\n readonly scrollTop = signal(0);\n\n constructor() {\n this.setupWindowScroll();\n }\n\n private setupWindowScroll(): void {\n const onScroll = (event?: Event) => {\n let top = 0;\n\n // If we have an event and it's from an element (not document/window)\n if (\n event?.target &&\n event.target !== document &&\n event.target !== window\n ) {\n const target = event.target as HTMLElement;\n top = target.scrollTop;\n } else {\n // Fallback to window scroll\n top =\n window.pageYOffset ||\n document.documentElement.scrollTop ||\n document.body.scrollTop ||\n 0;\n }\n\n this.scrollTop.set(top);\n };\n\n // Use capture: true to catch scroll events that don't bubble\n window.addEventListener('scroll', onScroll, {\n passive: true,\n capture: true,\n });\n\n // Initial set\n onScroll();\n }\n}\n","import {\n ApplicationRef,\n ComponentRef,\n createComponent,\n EnvironmentInjector,\n inject,\n Injectable,\n Type,\n Binding,\n} from '@angular/core';\n\nexport interface OverlayConfig {\n triggerElement: HTMLElement;\n offsetY?: number;\n backdropClass?: string;\n bindings?: Binding[];\n closeOnFocusOut?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class OverlayService {\n private readonly appRef = inject(ApplicationRef);\n private readonly injector = inject(EnvironmentInjector);\n private overlayContainer?: HTMLElement;\n\n open<T>(component: Type<T>, config: OverlayConfig): OverlayRef<T> {\n // Check if container exists and is still in the DOM\n if (\n !this.overlayContainer ||\n !document.body.contains(this.overlayContainer)\n ) {\n this.overlayContainer = document.createElement('div');\n this.overlayContainer.className = 'overlay-container';\n document.body.appendChild(this.overlayContainer);\n }\n\n const backdrop = document.createElement('div');\n backdrop.className = config.backdropClass || 'overlay-backdrop';\n this.overlayContainer.appendChild(backdrop);\n\n const wrapper = document.createElement('div');\n wrapper.className = 'overlay-wrapper';\n this.overlayContainer.appendChild(wrapper);\n\n const componentRef = createComponent(component, {\n environmentInjector: this.injector,\n hostElement: wrapper,\n bindings: config.bindings || [],\n });\n\n this.appRef.attachView(componentRef.hostView);\n\n this.position(wrapper, config.triggerElement, config.offsetY || 4);\n\n return new OverlayRef(\n componentRef,\n backdrop,\n wrapper,\n this.overlayContainer,\n config.triggerElement,\n config.offsetY || 4,\n config.closeOnFocusOut ?? false\n );\n }\n\n private position(\n element: HTMLElement,\n trigger: HTMLElement,\n offsetY: number\n ): void {\n const triggerRect = trigger.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n element.style.position = 'fixed';\n element.style.zIndex = '9999';\n\n // Let the element render to get its natural dimensions\n element.style.visibility = 'hidden';\n element.style.display = 'block';\n const elementRect = element.getBoundingClientRect();\n element.style.visibility = '';\n\n const widthDiff = elementRect.width - triggerRect.width;\n const shouldConsiderHorizontal = widthDiff > 150;\n\n let position: 'top' | 'bottom' | 'left' | 'right' = 'bottom';\n let left = triggerRect.left;\n let top = triggerRect.bottom + offsetY;\n\n if (shouldConsiderHorizontal) {\n // Check if there's space on the right\n const spaceRight = viewportWidth - triggerRect.right;\n const spaceLeft = triggerRect.left;\n const spaceBottom = viewportHeight - triggerRect.bottom;\n // Prefer right, then left, then bottom, then top\n if (spaceRight >= elementRect.width + offsetY) {\n position = 'right';\n left = triggerRect.right + offsetY;\n top = triggerRect.top;\n } else if (spaceLeft >= elementRect.width + offsetY) {\n position = 'left';\n left = triggerRect.left - elementRect.width - offsetY;\n top = triggerRect.top;\n } else if (spaceBottom >= elementRect.height + offsetY) {\n position = 'bottom';\n left = Math.max(\n offsetY,\n Math.min(\n triggerRect.left,\n viewportWidth - elementRect.width - offsetY\n )\n );\n top = triggerRect.bottom + offsetY;\n } else {\n position = 'top';\n left = Math.max(\n offsetY,\n Math.min(\n triggerRect.left,\n viewportWidth - elementRect.width - offsetY\n )\n );\n top = triggerRect.top - elementRect.height - offsetY;\n }\n } else {\n // Only consider top/bottom positioning\n const spaceBottom = viewportHeight - triggerRect.bottom;\n const spaceTop = triggerRect.top;\n\n if (spaceBottom >= elementRect.height + offsetY) {\n position = 'bottom';\n left = triggerRect.left;\n top = triggerRect.bottom + offsetY;\n } else if (spaceTop >= elementRect.height + offsetY) {\n position = 'top';\n left = triggerRect.left;\n top = triggerRect.top - elementRect.height - offsetY;\n } else {\n // Not enough space either way, prefer bottom\n position = 'bottom';\n left = triggerRect.left;\n top = triggerRect.bottom + offsetY;\n }\n\n // Match trigger width when positioned top/bottom\n element.style.width = `${triggerRect.width}px`;\n }\n\n element.style.left = `${left}px`;\n element.style.top = `${top}px`;\n element.setAttribute('data-position', position);\n }\n}\n\nexport class OverlayRef<T> {\n private readonly repositionHandler: () => void;\n private readonly backdropClickPromise: Promise<void>;\n private backdropClickResolve?: () => void;\n private readonly backdropClickHandler: () => void;\n private readonly focusOutPromise: Promise<void>;\n private focusOutResolve?: () => void;\n private readonly triggerFocusOutHandler?: (event: FocusEvent) => void;\n private readonly overlayFocusOutHandler?: (event: FocusEvent) => void;\n\n constructor(\n public componentRef: ComponentRef<T>,\n private backdrop: HTMLElement,\n private wrapper: HTMLElement,\n private container: HTMLElement,\n private trigger: HTMLElement,\n private offsetY: number,\n private closeOnFocusOut: boolean\n ) {\n this.repositionHandler = () => this.updatePosition();\n window.addEventListener('scroll', this.repositionHandler, true);\n window.addEventListener('resize', this.repositionHandler);\n\n this.backdropClickPromise = new Promise((resolve) => {\n this.backdropClickResolve = resolve;\n });\n this.backdropClickHandler = () => {\n if (this.backdropClickResolve) {\n this.backdropClickResolve();\n }\n };\n this.backdrop.addEventListener('click', this.backdropClickHandler);\n\n // Setup focus tracking if enabled\n this.focusOutPromise = new Promise((resolve) => {\n this.focusOutResolve = resolve;\n });\n\n if (this.closeOnFocusOut) {\n this.triggerFocusOutHandler = (event: FocusEvent) => {\n this.handleFocusOut(event, 'trigger');\n };\n this.overlayFocusOutHandler = (event: FocusEvent) => {\n this.handleFocusOut(event, 'overlay');\n };\n\n this.trigger.addEventListener('focusout', this.triggerFocusOutHandler);\n this.wrapper.addEventListener('focusout', this.overlayFocusOutHandler);\n }\n }\n\n backdropClick(): Promise<void> {\n return this.backdropClickPromise;\n }\n\n focusOut(): Promise<void> {\n return this.focusOutPromise;\n }\n\n dispose(): void {\n // Clean up scroll/resize listeners\n window.removeEventListener('scroll', this.repositionHandler, true);\n window.removeEventListener('resize', this.repositionHandler);\n\n // Clean up backdrop click listener\n if (this.backdrop && this.backdropClickHandler) {\n this.backdrop.removeEventListener('click', this.backdropClickHandler);\n }\n\n // Clean up focus tracking listeners\n if (this.closeOnFocusOut) {\n if (this.trigger && this.triggerFocusOutHandler) {\n this.trigger.removeEventListener(\n 'focusout',\n this.triggerFocusOutHandler\n );\n }\n if (this.wrapper && this.overlayFocusOutHandler) {\n this.wrapper.removeEventListener(\n 'focusout',\n this.overlayFocusOutHandler\n );\n }\n }\n\n // Destroy component\n if (this.componentRef) {\n this.componentRef.destroy();\n }\n\n // Remove DOM elements\n if (this.backdrop && this.backdrop.parentNode) {\n this.backdrop.parentNode.removeChild(this.backdrop);\n }\n if (this.wrapper && this.wrapper.parentNode) {\n this.wrapper.parentNode.removeChild(this.wrapper);\n }\n\n // Clean up container if empty\n if (this.container && this.container.children.length === 0) {\n if (this.container.parentNode) {\n this.container.parentNode.removeChild(this.container);\n }\n }\n }\n\n private handleFocusOut(\n event: FocusEvent,\n _source: 'trigger' | 'overlay'\n ): void {\n const relatedTarget = event.relatedTarget as HTMLElement | null;\n\n // If relatedTarget is null, focus might be moving to a non-focusable element\n // (e.g., clicking a button that doesn't retain focus)\n // Use a timeout to check if focus actually left the overlay\n if (!relatedTarget) {\n setTimeout(() => {\n const activeElement = document.activeElement as HTMLElement | null;\n\n // If focus went to body or null, it likely means a click happened\n // inside the overlay on a non-focusable element - don't close\n if (!activeElement || activeElement === document.body) {\n return;\n }\n\n const focusInTrigger = this.trigger?.contains(activeElement);\n const focusInOverlay = this.wrapper?.contains(activeElement);\n\n if (!focusInTrigger && !focusInOverlay) {\n if (this.focusOutResolve) {\n this.focusOutResolve();\n }\n }\n }, 0);\n return;\n }\n\n // Check if focus is moving to the other element (trigger <-> overlay)\n const focusStaysInTrigger = this.trigger.contains(relatedTarget);\n const focusStaysInOverlay = this.wrapper.contains(relatedTarget);\n\n // Only trigger focusOut if focus moves outside both trigger and overlay\n if (!focusStaysInTrigger && !focusStaysInOverlay) {\n if (this.focusOutResolve) {\n this.focusOutResolve();\n }\n }\n }\n\n private updatePosition(): void {\n const triggerRect = this.trigger.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const elementRect = this.wrapper.getBoundingClientRect();\n\n const widthDiff = elementRect.width - triggerRect.width;\n const shouldConsiderHorizontal = widthDiff > 150;\n\n let left = triggerRect.left;\n let top = triggerRect.bottom + this.offsetY;\n let position: 'top' | 'bottom' | 'left' | 'right' = 'bottom';\n\n if (shouldConsiderHorizontal) {\n // Check available space in all directions\n const spaceRight = viewportWidth - triggerRect.right;\n const spaceLeft = triggerRect.left;\n const spaceBottom = viewportHeight - triggerRect.bottom;\n // Prefer right, then left, then bottom, then top\n if (spaceRight >= elementRect.width + this.offsetY) {\n position = 'right';\n left = triggerRect.right + this.offsetY;\n top = triggerRect.top;\n } else if (spaceLeft >= elementRect.width + this.offsetY) {\n position = 'left';\n left = triggerRect.left - elementRect.width - this.offsetY;\n top = triggerRect.top;\n } else if (spaceBottom >= elementRect.height + this.offsetY) {\n position = 'bottom';\n left = Math.max(\n this.offsetY,\n Math.min(\n triggerRect.left,\n viewportWidth - elementRect.width - this.offsetY\n )\n );\n top = triggerRect.bottom + this.offsetY;\n } else {\n position = 'top';\n left = Math.max(\n this.offsetY,\n Math.min(\n triggerRect.left,\n viewportWidth - elementRect.width - this.offsetY\n )\n );\n top = triggerRect.top - elementRect.height - this.offsetY;\n }\n\n // Remove width constraint for horizontal positioning\n this.wrapper.style.width = '';\n } else {\n // Only consider top/bottom positioning\n const spaceBottom = viewportHeight - triggerRect.bottom;\n const spaceTop = triggerRect.top;\n\n if (spaceBottom >= elementRect.height + this.offsetY) {\n position = 'bottom';\n left = triggerRect.left;\n top = triggerRect.bottom + this.offsetY;\n } else if (spaceTop >= elementRect.height + this.offsetY) {\n position = 'top';\n left = triggerRect.left;\n top = triggerRect.top - elementRect.height - this.offsetY;\n } else {\n // Not enough space either way, prefer bottom\n position = 'bottom';\n left = triggerRect.left;\n top = triggerRect.bottom + this.offsetY;\n }\n\n // Match trigger width when positioned top/bottom\n this.wrapper.style.width = `${triggerRect.width}px`;\n }\n\n this.wrapper.style.left = `${left}px`;\n this.wrapper.style.top = `${top}px`;\n this.wrapper.setAttribute('data-position', position);\n }\n}\n","import { computed, inject, Injectable } from '@angular/core';\nimport { ThemeStore } from '../lib/theme';\nimport { ThemeColor } from '@magmonium/cli';\n\n@Injectable({ providedIn: 'root' })\nexport class ThemeService {\n private readonly themeStore = inject(ThemeStore);\n\n readonly color = computed<ThemeColor | undefined>(() =>\n this.themeStore.color()\n );\n\n readonly theme = computed(() => this.themeStore.theme());\n}\n","import { Binding, Type } from '@angular/core';\n\nexport enum Direction {\n TOP = 'top',\n BOTTOM = 'bottom',\n LEFT = 'left',\n RIGHT = 'right',\n CENTER = 'center',\n UP_DOWN = 'up-down',\n}\n\nexport type SelectorConfig<T> = {\n component: Type<T>;\n base: string;\n width?: string;\n height?: string;\n toggle?: boolean;\n matchTriggerWidth?: boolean;\n dir?: Direction;\n align?: 'left' | 'right';\n bindings?: Binding[];\n};\n","import { Direction } from './selector-type';\n\nexport function isOutOfViewport(boundary: DOMRect): boolean {\n const margin = 8;\n return (\n boundary.top + boundary.height + margin < 0 ||\n boundary.left + boundary.width + margin < 0 ||\n boundary.bottom - margin > window.innerHeight ||\n boundary.right - margin > window.innerWidth\n );\n}\n\nexport function calculatePosition(\n boundary: DOMRect,\n direction?: Direction,\n width = '250px',\n height = '300px',\n align?: 'left' | 'right'\n): Record<string, string> {\n const margin = 8;\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n\n const contentWidth = parseInt(width) || 250;\n // Use 0 for unknown/auto height so direction picks the side with more space\n // rather than assuming a fixed 300px that causes unnecessary flips\n const contentHeight = parseInt(height) || 0;\n\n const space = {\n top: boundary.top,\n bottom: viewport.height - boundary.bottom,\n left: boundary.left,\n right: viewport.width - boundary.right,\n };\n\n const centerX = boundary.left + boundary.width / 2;\n const centerY = boundary.top + boundary.height / 2;\n\n direction = detectBestDirection(\n space,\n {\n width: contentWidth,\n height: contentHeight,\n },\n direction\n );\n\n const horizontalLeft =\n align === 'right'\n ? calculateRightAlignedPosition(boundary.right, contentWidth, viewport.width)\n : align === 'left'\n ? calculateLeftAlignedPosition(boundary.left, contentWidth, viewport.width)\n : calculateHorizontalPosition(centerX, contentWidth, viewport.width);\n\n const positionMap: Record<Direction, Record<string, string>> = {\n [Direction.TOP]: {\n top: 'unset',\n bottom: `${viewport.height - boundary.top + margin}px`,\n 'max-height': `${Math.max(space.top - margin * 2, 0)}px`,\n left: horizontalLeft,\n },\n [Direction.BOTTOM]: {\n top: `${boundary.bottom + margin}px`,\n bottom: 'unset',\n 'max-height': `${Math.max(space.bottom - margin * 2, 0)}px`,\n left: horizontalLeft,\n },\n [Direction.LEFT]: {\n right: `${viewport.width - boundary.left + margin}px`,\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n },\n [Direction.RIGHT]: {\n left: `${boundary.right + margin}px`,\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n },\n [Direction.CENTER]: {\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n left: horizontalLeft,\n },\n [Direction.UP_DOWN]: {\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n left: `${boundary.left}px`,\n },\n };\n\n return (\n positionMap[direction] || {\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n left: horizontalLeft,\n }\n );\n}\n\nexport function detectBestDirection(\n space: { top: number; bottom: number; left: number; right: number },\n content: { width: number; height: number },\n preferredDirection?: Direction\n): Direction {\n const margin = 8;\n const fits = (available: number, needed: number) =>\n available >= needed + margin;\n\n // If an explicit direction is requested and it fits, honour it\n if (preferredDirection && preferredDirection !== Direction.UP_DOWN) {\n const dirFits: Record<string, boolean> = {\n [Direction.BOTTOM]: fits(space.bottom, content.height),\n [Direction.TOP]: fits(space.top, content.height),\n [Direction.LEFT]: fits(space.left, content.width),\n [Direction.RIGHT]: fits(space.right, content.width),\n };\n if (dirFits[preferredDirection]) {\n return preferredDirection;\n }\n }\n\n // If height is unknown (0), always prefer BOTTOM\n if (content.height <= 0) {\n return Direction.BOTTOM;\n }\n\n // If height is known, check if it fits in the preferred vertical order\n if (fits(space.bottom, content.height)) {\n return Direction.BOTTOM;\n }\n if (fits(space.top, content.height)) {\n return Direction.TOP;\n }\n\n // If it doesn't fit vertically, but UP_DOWN was requested, still return BOTTOM (it will be clipped by max-height)\n if (preferredDirection === Direction.UP_DOWN) {\n return Direction.BOTTOM;\n }\n\n // Last resort: pick horizontal side that fits better\n if (fits(space.right, content.width)) {\n return Direction.RIGHT;\n }\n if (fits(space.left, content.width)) {\n return Direction.LEFT;\n }\n\n // Final fallback: BOTTOM (let max-height and scrolling handle it)\n return Direction.BOTTOM;\n}\n\nfunction calculateHorizontalPosition(\n center: number,\n width: number,\n viewportWidth: number\n): string {\n return calculatePosition1D(center, width, viewportWidth);\n}\n\nfunction calculateRightAlignedPosition(\n rightEdge: number,\n width: number,\n viewportWidth: number\n): string {\n const start = rightEdge - width;\n if (start < 0) return '0px';\n if (start + width > viewportWidth) return `${viewportWidth - width}px`;\n return `${start}px`;\n}\n\nfunction calculateLeftAlignedPosition(\n leftEdge: number,\n width: number,\n viewportWidth: number\n): string {\n if (leftEdge < 0) return '0px';\n if (leftEdge + width > viewportWidth) return `${viewportWidth - width}px`;\n return `${leftEdge}px`;\n}\n\nfunction calculateVerticalPosition(\n center: number,\n height: number,\n viewportHeight: number\n): string {\n return calculatePosition1D(center, height, viewportHeight);\n}\n\nfunction calculatePosition1D(\n center: number,\n size: number,\n viewportSize: number\n): string {\n const start = center - size / 2;\n if (start < 0) {\n return '0px';\n }\n if (start + size > viewportSize) {\n return `${viewportSize - size}px`;\n }\n return `${start}px`;\n}\n","import {\n ComponentRef,\n DOCUMENT,\n Directive,\n ElementRef,\n HostListener,\n inject,\n input,\n linkedSignal,\n OnDestroy,\n output,\n signal,\n} from '@angular/core';\nimport { DeviceService, DomService } from '../../services';\nimport { SelectorConfig, Direction } from './selector-type';\nimport {\n calculatePosition,\n isOutOfViewport,\n detectBestDirection,\n} from './selector-helper';\nimport { MODAL_STORE_REF, ModalStoreRef } from '../../config/tokens';\n\n@Directive({\n selector: '[mSelector]',\n exportAs: 'mSelector',\n host: {\n '[class.active]': 'isOpen()',\n },\n})\nexport class SelectorDirective implements OnDestroy {\n private static openSelector: Record<string, SelectorDirective> = {};\n mSelector = input<SelectorConfig<unknown> | undefined>(undefined);\n disabled = input<boolean>(false);\n readonly opened = output<void>();\n readonly closed = output<void>();\n private readonly deviceService = inject(DeviceService);\n private readonly domService = inject(DomService);\n private readonly modalStore = inject(MODAL_STORE_REF, {\n optional: true,\n }) as ModalStoreRef | null;\n private readonly element = inject(ElementRef<HTMLElement>);\n private readonly doc = inject(DOCUMENT);\n private componentRef?: ComponentRef<unknown>;\n private modalId = signal<string | undefined>(undefined);\n private triggerFocusOutHandler?: (event: FocusEvent) => void;\n private boxFocusOutHandler?: (event: FocusEvent) => void;\n private outsideMouseDownHandler?: (event: MouseEvent) => void;\n private readonly isCompact = (): boolean =>\n this.deviceService.isMobile() ||\n this.deviceService.isTablet() ||\n this.deviceService.isTouch();\n\n protected readonly isOpen = linkedSignal({\n source: () => ({\n triggerMap: this.modalStore?.modalTriggerMap() ?? {},\n id: this.modalId(),\n isCompact:\n this.deviceService.isMobile() ||\n this.deviceService.isTablet() ||\n this.deviceService.isTouch(),\n }),\n computation: ({ triggerMap, id, isCompact }, previous) => {\n if (isCompact && id && !triggerMap[id]) {\n this.closed.emit();\n return false;\n }\n return previous?.value ?? false;\n },\n });\n\n @HostListener('click', ['$event'])\n @HostListener('keydown.enter', ['$event'])\n @HostListener('keydown.space', ['$event'])\n @HostListener('keydown.tab', ['$event'])\n @HostListener('focus', ['$event'])\n onClick(_e: unknown): void {\n if (this.disabled()) {\n return;\n }\n if (this.isOpen()) {\n this.close();\n return;\n }\n this.open();\n }\n\n // Keyboard opening, for a trigger whose visible affordance sits out of tab\n // order — a dropdown chevron, a date calendar. The field itself is the tab\n // stop, and ArrowDown on it is what opens the panel. Open only: Escape and a\n // selection close it, and ArrowDown moving into the list must never toggle\n // the panel shut under it.\n @HostListener('keydown.arrowdown', ['$event'])\n onArrowDown(event: Event): void {\n if (this.disabled() || this.isOpen()) return;\n event.preventDefault();\n this.open();\n }\n\n @HostListener('window:scroll', ['$event'])\n @HostListener('window:resize', ['$event'])\n onScroll(_event: Event): void {\n this.handleViewportChange(_event);\n }\n\n ngOnDestroy(): void {\n this.teardownFocusTracking();\n this.close();\n const selector = this.mSelector();\n if (!selector) {\n return;\n }\n if (SelectorDirective.openSelector[selector.base] === this) {\n delete SelectorDirective.openSelector[selector.base];\n }\n }\n\n close(): void {\n if (!this.isOpen()) {\n return;\n }\n this.teardownFocusTracking();\n const selector = this.mSelector();\n if (!selector) {\n return;\n }\n const { base } = selector;\n if (this.isCompact()) {\n this.modalStore?.close(this.modalId());\n } else {\n this.domService.destroy({\n componentRef: this.componentRef,\n parentClassName: 'm-selector-box',\n className: base,\n });\n }\n if (SelectorDirective.openSelector[base] === this) {\n delete SelectorDirective.openSelector[base];\n }\n this.isOpen.set(false);\n this.closed.emit();\n }\n\n open() {\n if (this.isOpen()) {\n return;\n }\n const base = this.mSelector()?.base;\n if (!base) {\n return;\n }\n if (\n SelectorDirective.openSelector[base] &&\n SelectorDirective.openSelector[base] !== this\n ) {\n SelectorDirective.openSelector[base].close();\n }\n SelectorDirective.openSelector[base] = this;\n if (this.isCompact()) {\n this.openInModal();\n } else {\n this.openInBox();\n }\n this.isOpen.set(true);\n this.opened.emit();\n }\n\n private openInBox = () => {\n const selector = this.mSelector();\n\n if (!selector) {\n return;\n }\n\n const { component, base, bindings, dir, align, width, height } = selector;\n\n const boundary = this.element.nativeElement.getBoundingClientRect();\n const styles: Record<string, string> = {\n ...calculatePosition(boundary, dir, width, height, align),\n };\n\n this.componentRef = this.domService.create<unknown>({\n component,\n styles,\n parentClassName: 'm-selector-box',\n className: base,\n bindings,\n });\n\n if (selector.matchTriggerWidth) {\n this.alignToTrigger();\n } else if (!parseInt(height ?? '')) {\n // height was unknown/'auto' up front, so calculatePosition assumed 0\n // and defaulted to BOTTOM without checking available space — that same\n // \"unknown height\" branch also clamps the box's own max-height to\n // whatever little room is below the trigger, which pins its rendered\n // (clamped) height at/near 0 too, so getBoundingClientRect() can't be\n // used to recover the real size later. scrollHeight ignores that\n // clamp and reports the content's true intrinsic height once Angular\n // has actually rendered it (hence the rAF) — reflow off that instead.\n requestAnimationFrame(() => this.reflowAfterRender(boundary, selector));\n }\n\n requestAnimationFrame(() => this.setupFocusTracking());\n };\n\n private reflowAfterRender(\n boundary: DOMRect,\n selector: SelectorConfig<unknown>\n ): void {\n const boxElement = this.getBoxElement();\n if (!boxElement) return;\n const actualHeight = boxElement.scrollHeight;\n if (!actualHeight) return;\n\n const { base, dir, align, width } = selector;\n const style = calculatePosition(\n boundary,\n dir,\n width,\n `${actualHeight}px`,\n align\n );\n this.domService.updateStyle(base, { ...style });\n }\n\n private openInModal = () => {\n const selector = this.mSelector();\n if (!selector) {\n return;\n }\n const { component, bindings } = selector;\n this.modalId.set(\n this.modalStore?.open({\n component,\n bindings,\n name: 'bottom',\n one: true,\n // A sheet, not a card: dock the option list to the bottom edge like\n // every other compact overlay, so `.pop-up.align-bottom` and the box's\n // own `:host-context(.align-bottom)` de-chroming both apply.\n config: { align: 'bottom' },\n }) ?? undefined\n );\n };\n\n private getBoxElement(): HTMLElement | null {\n const base = this.mSelector()?.base;\n if (!base) return null;\n return this.doc.querySelector(\n `.m-selector-box .${base}`\n ) as HTMLElement | null;\n }\n\n private setupFocusTracking(): void {\n this.triggerFocusOutHandler = (event: FocusEvent) =>\n this.handleFocusOut(event);\n this.element.nativeElement.addEventListener(\n 'focusout',\n this.triggerFocusOutHandler\n );\n\n const boxElement = this.getBoxElement();\n if (boxElement) {\n this.boxFocusOutHandler = (event: FocusEvent) =>\n this.handleFocusOut(event);\n boxElement.addEventListener('focusout', this.boxFocusOutHandler);\n }\n\n this.outsideMouseDownHandler = (event: MouseEvent) =>\n this.handleOutsideMouseDown(event);\n this.doc.addEventListener('mousedown', this.outsideMouseDownHandler);\n }\n\n private teardownFocusTracking(): void {\n if (this.triggerFocusOutHandler) {\n this.element.nativeElement.removeEventListener(\n 'focusout',\n this.triggerFocusOutHandler\n );\n this.triggerFocusOutHandler = undefined;\n }\n if (this.boxFocusOutHandler) {\n const boxElement = this.getBoxElement();\n boxElement?.removeEventListener('focusout', this.boxFocusOutHandler);\n this.boxFocusOutHandler = undefined;\n }\n if (this.outsideMouseDownHandler) {\n this.doc.removeEventListener('mousedown', this.outsideMouseDownHandler);\n this.outsideMouseDownHandler = undefined;\n }\n }\n\n private handleFocusOut(event: FocusEvent): void {\n if (!this.isOpen()) return;\n\n const relatedTarget = event.relatedTarget as HTMLElement | null;\n const triggerElement = this.element.nativeElement;\n const boxElement = this.getBoxElement();\n const selectorContainer = this.doc.querySelector('.m-selector-box');\n\n if (!relatedTarget) {\n setTimeout(() => {\n if (!this.isOpen()) return;\n const activeElement = this.doc.activeElement as HTMLElement | null;\n if (!activeElement || activeElement === this.doc.body) return;\n\n const inTrigger = triggerElement.contains(activeElement);\n const inBox = boxElement?.contains(activeElement) ?? false;\n const inSelectorContainer =\n selectorContainer?.contains(activeElement) ?? false;\n if (!inTrigger && !inBox && !inSelectorContainer) {\n this.close();\n }\n }, 0);\n return;\n }\n\n const inTrigger = triggerElement.contains(relatedTarget);\n const inBox = boxElement?.contains(relatedTarget) ?? false;\n const inSelectorContainer =\n selectorContainer?.contains(relatedTarget) ?? false;\n if (!inTrigger && !inBox && !inSelectorContainer) {\n this.close();\n }\n }\n\n private handleOutsideMouseDown(event: MouseEvent): void {\n if (!this.isOpen()) return;\n\n const target = event.target as HTMLElement;\n const triggerElement = this.element.nativeElement;\n const boxElement = this.getBoxElement();\n\n const inTrigger = triggerElement.contains(target);\n const inBox = boxElement?.contains(target) ?? false;\n if (inTrigger || inBox) return;\n\n const selectorContainer = this.doc.querySelector('.m-selector-box');\n if (selectorContainer?.contains(target)) return;\n\n this.close();\n }\n\n private alignToTrigger(): void {\n const boxElement = this.getBoxElement();\n if (!boxElement) return;\n const boundary = this.element.nativeElement.getBoundingClientRect();\n const margin = 8;\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n const selector = this.mSelector();\n const width = selector?.width || '250px';\n const height = selector?.height || '300px';\n const contentWidth = parseInt(width) || 250;\n const contentHeight = parseInt(height) || 0;\n\n const space = {\n top: boundary.top,\n bottom: viewport.height - boundary.bottom,\n left: boundary.left,\n right: viewport.width - boundary.right,\n };\n\n const direction = detectBestDirection(\n space,\n {\n width: contentWidth,\n height: contentHeight,\n },\n selector?.dir\n );\n\n boxElement.style.width = `${boundary.width}px`;\n boxElement.style.left = `${boundary.left}px`;\n\n if (direction === Direction.TOP) {\n boxElement.style.top = 'unset';\n boxElement.style.bottom = `${viewport.height - boundary.top + margin}px`;\n boxElement.classList.add('open-upward');\n } else {\n boxElement.style.top = `${boundary.bottom + margin}px`;\n boxElement.style.bottom = 'unset';\n boxElement.classList.remove('open-upward');\n }\n }\n\n private handleViewportChange(_event: Event): void {\n const selector = this.mSelector();\n if (!selector) {\n return;\n }\n if (!this.isOpen() || this.isCompact()) {\n return;\n }\n const boundary = this.element.nativeElement.getBoundingClientRect();\n\n if (isOutOfViewport(boundary)) {\n this.close();\n return;\n }\n\n const { base, dir, align, width, height } = selector;\n\n const style = calculatePosition(boundary, dir, width, height, align);\n\n this.domService.updateStyle(base, {\n ...style,\n });\n\n if (selector.matchTriggerWidth) {\n this.alignToTrigger();\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"magmonium-one-selector-BK48N5us.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/services/device.ts","../../../../libs/one/src/lib/shared/services/dom.ts","../../../../libs/one/src/lib/shared/services/scroll.ts","../../../../libs/one/src/lib/shared/services/overlay/overlay.service.ts","../../../../libs/one/src/lib/shared/services/theme.service.ts","../../../../libs/one/src/lib/shared/directives/selector/selector-type.ts","../../../../libs/one/src/lib/shared/directives/selector/selector-helper.ts","../../../../libs/one/src/lib/shared/directives/selector/selector.ts"],"sourcesContent":["import { DestroyRef, inject, Injectable, signal } from '@angular/core';\n\nconst MOBILE_QUERY = '(max-width: 767px)';\nconst TABLET_QUERY = '(min-width: 768px) and (max-width: 1199px)';\nconst DESKTOP_QUERY = '(min-width: 1200px)';\nconst TOUCH_QUERY = '(pointer: coarse)';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DeviceService {\n readonly isMobile = signal(this.matches(MOBILE_QUERY));\n readonly isTablet = signal(this.matches(TABLET_QUERY));\n readonly isDesktop = signal(this.matches(DESKTOP_QUERY));\n readonly isTouch = signal(this.matches(TOUCH_QUERY));\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n this.listen(MOBILE_QUERY, this.isMobile);\n this.listen(TABLET_QUERY, this.isTablet);\n this.listen(DESKTOP_QUERY, this.isDesktop);\n this.listen(TOUCH_QUERY, this.isTouch);\n }\n\n private matches(query: string): boolean {\n return typeof window !== 'undefined' && window.matchMedia(query).matches;\n }\n\n private listen(query: string, sig: ReturnType<typeof signal<boolean>>): void {\n if (typeof window === 'undefined') return;\n const mql = window.matchMedia(query);\n const handler = (e: MediaQueryListEvent): void => sig.set(e.matches);\n mql.addEventListener('change', handler);\n this.destroyRef.onDestroy(() => mql.removeEventListener('change', handler));\n }\n}\n","import {\n ApplicationRef,\n Binding,\n ComponentRef,\n createComponent,\n DOCUMENT,\n EmbeddedViewRef,\n inject,\n Injectable,\n Renderer2,\n RendererFactory2,\n signal,\n Type,\n} from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { DeviceService } from './device';\n\ntype DomCreate<T> = {\n component: Type<T>;\n className: string;\n styles?: Record<string, string | number>;\n id?: string;\n parentClassName?: string;\n parentStyles?: Record<string, string | number>;\n bindings?: Binding[];\n};\n\ntype DomDestroy<T> = {\n componentRef?: ComponentRef<T>;\n parentClassName?: string;\n id?: string;\n className?: string;\n};\n\ntype DomAppend = {\n child: HTMLDivElement;\n className: string;\n styles?: Record<string, string | number>;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DomService {\n readonly fullscreen = signal(false);\n private readonly document = inject(DOCUMENT);\n private readonly applicationRef = inject(ApplicationRef);\n private readonly renderer: Renderer2;\n private readonly rendererFactory = inject(RendererFactory2);\n private readonly deviceService = inject(DeviceService);\n private readonly animationDuration = 300;\n\n constructor() {\n this.renderer = this.rendererFactory.createRenderer(null, null);\n }\n\n /**\n * Creates and appends a component to the DOM\n * @param config - Configuration object for creating the component\n * @returns ComponentRef if successful, undefined if element already exists\n */\n public create<T>({\n component,\n className,\n styles,\n id,\n parentClassName,\n parentStyles,\n bindings,\n }: DomCreate<T>): ComponentRef<T> | undefined {\n const existingElement = this.document.querySelector(`#${id}`);\n if (existingElement) {\n return undefined;\n }\n const componentRef: ComponentRef<T> = createComponent(component, {\n environmentInjector: this.applicationRef.injector,\n bindings,\n });\n this.applicationRef.attachView(componentRef.hostView);\n const child = this.document.createElement('div');\n child.className = className;\n this.applyStyles(child, styles);\n if (id) {\n child.id = id;\n }\n this.renderer.appendChild(\n child,\n (componentRef.hostView as EmbeddedViewRef<T>).rootNodes[0]\n );\n if (parentClassName) {\n this.append({ className: parentClassName, child, styles: parentStyles });\n return componentRef;\n }\n this.renderer.appendChild(this.document.querySelector('body'), child);\n return componentRef;\n }\n\n /**\n * Destroys a component and removes its DOM element\n * @param config - Configuration object for destroying the component\n */\n public destroy<T>({\n componentRef,\n parentClassName,\n id,\n className,\n }: DomDestroy<T>): void {\n const parent = parentClassName\n ? this.document?.querySelector(`.${parentClassName}`)\n : undefined;\n const elm = parent\n ? id\n ? parent.querySelector(`#${id}`)\n : parent.querySelector(`.${className}`)\n : (this.document?.querySelector(`.${className}`) ??\n this.document?.querySelector(`#${id}`));\n if (!elm) {\n return;\n }\n if (componentRef) {\n this.applicationRef.detachView(componentRef.hostView);\n componentRef.destroy();\n }\n elm.remove();\n }\n\n /**\n * Enables scrolling on the document body\n */\n public addBodyScroll(): void {\n this.document.body.style.overflow = 'auto';\n }\n\n /**\n * Disables scrolling on the document body\n */\n\n public removeBodyScroll(): void {\n this.document.body.style.overflow = 'hidden';\n }\n\n readonly toggleFullScreen = (): void => {\n const doc = this.document as Document & {\n webkitFullscreenElement?: Element;\n webkitExitFullscreen?: () => Promise<void>;\n };\n const docEl = doc.documentElement as HTMLElement & {\n webkitRequestFullscreen?: () => Promise<void>;\n };\n\n if (doc.fullscreenElement || doc.webkitFullscreenElement) {\n const exit =\n doc.exitFullscreen?.bind(doc) ?? doc.webkitExitFullscreen?.bind(doc);\n exit?.();\n this.fullscreen.set(false);\n } else {\n const request =\n docEl.requestFullscreen?.bind(docEl) ??\n docEl.webkitRequestFullscreen?.bind(docEl);\n request?.();\n this.fullscreen.set(true);\n }\n };\n\n readonly showHideScroll = (className: string): void => {\n const element = this.document.querySelector(`.${className}`);\n this.document.body.style.overflow = element ? 'hidden' : 'auto';\n };\n\n readonly toggleBodyScroll = (): void => {\n const isHidden = this.document.body.style.overflow === 'hidden';\n this.document.body.style.overflow = isHidden ? 'auto' : 'hidden';\n };\n\n readonly remove = (\n id: string,\n parentClassName: string,\n componentRef?: ComponentRef<unknown>\n ): void => {\n const parent = this.document.querySelector(`.${parentClassName}`);\n const element = parent?.querySelector(`#${id}`) as HTMLElement | null;\n if (!element) return;\n\n element.style.transition = `opacity ${this.animationDuration}ms ease`;\n element.style.opacity = '0';\n\n setTimeout(() => {\n if (componentRef) {\n this.applicationRef.detachView(componentRef.hostView);\n componentRef.destroy();\n }\n element.remove();\n }, this.animationDuration);\n };\n\n readonly updateStyle = (\n className: string,\n styles?: Record<string, string | number>\n ): void => {\n const element = this.document.querySelector(\n `.${className}`\n ) as HTMLElement | null;\n if (!element || !styles) return;\n this.applyStyles(element, styles);\n };\n\n /**\n * Targets a single element by id. `updateStyle` resolves by class and takes the\n * first match, which cannot address one element among siblings sharing a class.\n */\n readonly updateStyleById = ({\n id,\n parentClassName,\n styles,\n }: {\n id: string;\n parentClassName?: string;\n styles?: Record<string, string | number>;\n }): void => {\n const parent = parentClassName\n ? this.document.querySelector(`.${parentClassName}`)\n : this.document;\n const element = parent?.querySelector(`#${id}`) as HTMLElement | null;\n if (!element || !styles) return;\n this.applyStyles(element, styles);\n };\n\n readonly positionRelativeTo = (\n element: HTMLElement,\n boundary: DOMRect\n ): void => {\n const positionClass = Array.from(element.classList).find((cls) =>\n ['top-left', 'top-right', 'bottom-left', 'bottom-right'].includes(cls)\n );\n this.applyPositionFromClass(\n element,\n boundary,\n positionClass ?? 'bottom-left'\n );\n };\n\n readonly createDom = (\n html: string,\n className: string,\n boundary?: DOMRect\n ): HTMLDivElement => {\n let element = this.document.querySelector(\n `.${className}`\n ) as HTMLDivElement | null;\n if (!element) {\n element = this.document.createElement('div');\n element.className = className;\n this.renderer.appendChild(this.document.body, element);\n }\n element.innerHTML = html;\n if (boundary) {\n this.positionRelativeTo(element, boundary);\n }\n return element;\n };\n\n readonly observeMutations = (\n targetNode: Node,\n config: MutationObserverInit = { childList: true, subtree: true }\n ): Observable<MutationRecord[]> => {\n return new Observable<MutationRecord[]>((subscriber) => {\n const observer = new MutationObserver((mutations) => {\n subscriber.next(mutations);\n });\n observer.observe(targetNode, config);\n return () => observer.disconnect();\n });\n };\n\n readonly cleanup = (parentClassName: string): void => {\n const parent = this.document.querySelector(`.${parentClassName}`);\n if (parent) {\n parent.remove();\n }\n };\n\n readonly createAndAppend = <T>(\n config: DomCreate<T> & { boundary?: DOMRect }\n ): ComponentRef<T> | undefined => {\n const { boundary, ...createConfig } = config;\n const componentRef = this.create<T>(createConfig);\n if (componentRef && boundary) {\n const hostElement = (componentRef.hostView as EmbeddedViewRef<T>)\n .rootNodes[0] as HTMLElement;\n const wrapper = hostElement?.parentElement;\n if (wrapper) {\n this.positionRelativeTo(wrapper, boundary);\n }\n }\n return componentRef;\n };\n\n /**\n * Applies styles to a DOM element using Angular Renderer2\n * @param element - The HTML element to apply styles to\n * @param styles - Object containing CSS property-value pairs\n */\n private applyStyles(\n element: HTMLElement,\n styles?: Record<string, string | number>\n ): void {\n if (!styles) return;\n\n Object.entries(styles).forEach(([property, value]) => {\n this.renderer.setStyle(element, property, value);\n });\n }\n\n /**\n * Appends a child element to a parent with the specified class name\n * Creates the parent if it doesn't exist\n * @param config - Configuration object for appending the element\n */\n private append({ className, styles, child }: DomAppend): void {\n const parentClass = `.${className}`;\n let parentElement = this.document.querySelector(parentClass) as HTMLElement;\n if (!parentElement) {\n parentElement = this.document.createElement('div') as HTMLElement;\n parentElement.className = className;\n this.applyStyles(parentElement, styles);\n this.renderer.appendChild(\n this.document.querySelector('body') as HTMLElement,\n parentElement\n );\n }\n this.renderer.appendChild(parentElement, child);\n }\n\n private readonly applyPositionFromClass = (\n element: HTMLElement,\n boundary: DOMRect,\n positionClass: string\n ): void => {\n const isMobile = this.deviceService.isMobile();\n const styles: Record<string, string> = { position: 'absolute' };\n\n if (isMobile) {\n styles['left'] = '0';\n styles['right'] = '0';\n styles['bottom'] = '0';\n } else {\n switch (positionClass) {\n case 'top-left':\n styles['top'] = `${boundary.top}px`;\n styles['left'] = `${boundary.left}px`;\n break;\n case 'top-right':\n styles['top'] = `${boundary.top}px`;\n styles['left'] = `${boundary.right}px`;\n break;\n case 'bottom-right':\n styles['top'] = `${boundary.bottom}px`;\n styles['left'] = `${boundary.right}px`;\n break;\n case 'bottom-left':\n default:\n styles['top'] = `${boundary.bottom}px`;\n styles['left'] = `${boundary.left}px`;\n break;\n }\n }\n\n Object.entries(styles).forEach(([prop, val]) => {\n this.renderer.setStyle(element, prop, val);\n });\n };\n}\n","import { Injectable, signal } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ScrollService {\n /**\n * Reactive signal containing the scroll top position of the window.\n */\n readonly scrollTop = signal(0);\n\n constructor() {\n this.setupWindowScroll();\n }\n\n private setupWindowScroll(): void {\n const onScroll = (event?: Event) => {\n let top = 0;\n\n // If we have an event and it's from an element (not document/window)\n if (\n event?.target &&\n event.target !== document &&\n event.target !== window\n ) {\n const target = event.target as HTMLElement;\n top = target.scrollTop;\n } else {\n // Fallback to window scroll\n top =\n window.pageYOffset ||\n document.documentElement.scrollTop ||\n document.body.scrollTop ||\n 0;\n }\n\n this.scrollTop.set(top);\n };\n\n // Use capture: true to catch scroll events that don't bubble\n window.addEventListener('scroll', onScroll, {\n passive: true,\n capture: true,\n });\n\n // Initial set\n onScroll();\n }\n}\n","import {\n ApplicationRef,\n ComponentRef,\n createComponent,\n EnvironmentInjector,\n inject,\n Injectable,\n Type,\n Binding,\n} from '@angular/core';\n\nexport interface OverlayConfig {\n triggerElement: HTMLElement;\n offsetY?: number;\n backdropClass?: string;\n bindings?: Binding[];\n closeOnFocusOut?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class OverlayService {\n private readonly appRef = inject(ApplicationRef);\n private readonly injector = inject(EnvironmentInjector);\n private overlayContainer?: HTMLElement;\n\n open<T>(component: Type<T>, config: OverlayConfig): OverlayRef<T> {\n // Check if container exists and is still in the DOM\n if (\n !this.overlayContainer ||\n !document.body.contains(this.overlayContainer)\n ) {\n this.overlayContainer = document.createElement('div');\n this.overlayContainer.className = 'overlay-container';\n document.body.appendChild(this.overlayContainer);\n }\n\n const backdrop = document.createElement('div');\n backdrop.className = config.backdropClass || 'overlay-backdrop';\n this.overlayContainer.appendChild(backdrop);\n\n const wrapper = document.createElement('div');\n wrapper.className = 'overlay-wrapper';\n this.overlayContainer.appendChild(wrapper);\n\n const componentRef = createComponent(component, {\n environmentInjector: this.injector,\n hostElement: wrapper,\n bindings: config.bindings || [],\n });\n\n this.appRef.attachView(componentRef.hostView);\n\n this.position(wrapper, config.triggerElement, config.offsetY || 4);\n\n return new OverlayRef(\n componentRef,\n backdrop,\n wrapper,\n this.overlayContainer,\n config.triggerElement,\n config.offsetY || 4,\n config.closeOnFocusOut ?? false\n );\n }\n\n private position(\n element: HTMLElement,\n trigger: HTMLElement,\n offsetY: number\n ): void {\n const triggerRect = trigger.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n element.style.position = 'fixed';\n element.style.zIndex = '9999';\n\n // Let the element render to get its natural dimensions\n element.style.visibility = 'hidden';\n element.style.display = 'block';\n const elementRect = element.getBoundingClientRect();\n element.style.visibility = '';\n\n const widthDiff = elementRect.width - triggerRect.width;\n const shouldConsiderHorizontal = widthDiff > 150;\n\n let position: 'top' | 'bottom' | 'left' | 'right' = 'bottom';\n let left = triggerRect.left;\n let top = triggerRect.bottom + offsetY;\n\n if (shouldConsiderHorizontal) {\n // Check if there's space on the right\n const spaceRight = viewportWidth - triggerRect.right;\n const spaceLeft = triggerRect.left;\n const spaceBottom = viewportHeight - triggerRect.bottom;\n // Prefer right, then left, then bottom, then top\n if (spaceRight >= elementRect.width + offsetY) {\n position = 'right';\n left = triggerRect.right + offsetY;\n top = triggerRect.top;\n } else if (spaceLeft >= elementRect.width + offsetY) {\n position = 'left';\n left = triggerRect.left - elementRect.width - offsetY;\n top = triggerRect.top;\n } else if (spaceBottom >= elementRect.height + offsetY) {\n position = 'bottom';\n left = Math.max(\n offsetY,\n Math.min(\n triggerRect.left,\n viewportWidth - elementRect.width - offsetY\n )\n );\n top = triggerRect.bottom + offsetY;\n } else {\n position = 'top';\n left = Math.max(\n offsetY,\n Math.min(\n triggerRect.left,\n viewportWidth - elementRect.width - offsetY\n )\n );\n top = triggerRect.top - elementRect.height - offsetY;\n }\n } else {\n // Only consider top/bottom positioning\n const spaceBottom = viewportHeight - triggerRect.bottom;\n const spaceTop = triggerRect.top;\n\n if (spaceBottom >= elementRect.height + offsetY) {\n position = 'bottom';\n left = triggerRect.left;\n top = triggerRect.bottom + offsetY;\n } else if (spaceTop >= elementRect.height + offsetY) {\n position = 'top';\n left = triggerRect.left;\n top = triggerRect.top - elementRect.height - offsetY;\n } else {\n // Not enough space either way, prefer bottom\n position = 'bottom';\n left = triggerRect.left;\n top = triggerRect.bottom + offsetY;\n }\n\n // Match trigger width when positioned top/bottom\n element.style.width = `${triggerRect.width}px`;\n }\n\n element.style.left = `${left}px`;\n element.style.top = `${top}px`;\n element.setAttribute('data-position', position);\n }\n}\n\nexport class OverlayRef<T> {\n private readonly repositionHandler: () => void;\n private readonly backdropClickPromise: Promise<void>;\n private backdropClickResolve?: () => void;\n private readonly backdropClickHandler: () => void;\n private readonly focusOutPromise: Promise<void>;\n private focusOutResolve?: () => void;\n private readonly triggerFocusOutHandler?: (event: FocusEvent) => void;\n private readonly overlayFocusOutHandler?: (event: FocusEvent) => void;\n\n constructor(\n public componentRef: ComponentRef<T>,\n private backdrop: HTMLElement,\n private wrapper: HTMLElement,\n private container: HTMLElement,\n private trigger: HTMLElement,\n private offsetY: number,\n private closeOnFocusOut: boolean\n ) {\n this.repositionHandler = () => this.updatePosition();\n window.addEventListener('scroll', this.repositionHandler, true);\n window.addEventListener('resize', this.repositionHandler);\n\n this.backdropClickPromise = new Promise((resolve) => {\n this.backdropClickResolve = resolve;\n });\n this.backdropClickHandler = () => {\n if (this.backdropClickResolve) {\n this.backdropClickResolve();\n }\n };\n this.backdrop.addEventListener('click', this.backdropClickHandler);\n\n // Setup focus tracking if enabled\n this.focusOutPromise = new Promise((resolve) => {\n this.focusOutResolve = resolve;\n });\n\n if (this.closeOnFocusOut) {\n this.triggerFocusOutHandler = (event: FocusEvent) => {\n this.handleFocusOut(event, 'trigger');\n };\n this.overlayFocusOutHandler = (event: FocusEvent) => {\n this.handleFocusOut(event, 'overlay');\n };\n\n this.trigger.addEventListener('focusout', this.triggerFocusOutHandler);\n this.wrapper.addEventListener('focusout', this.overlayFocusOutHandler);\n }\n }\n\n backdropClick(): Promise<void> {\n return this.backdropClickPromise;\n }\n\n focusOut(): Promise<void> {\n return this.focusOutPromise;\n }\n\n dispose(): void {\n // Clean up scroll/resize listeners\n window.removeEventListener('scroll', this.repositionHandler, true);\n window.removeEventListener('resize', this.repositionHandler);\n\n // Clean up backdrop click listener\n if (this.backdrop && this.backdropClickHandler) {\n this.backdrop.removeEventListener('click', this.backdropClickHandler);\n }\n\n // Clean up focus tracking listeners\n if (this.closeOnFocusOut) {\n if (this.trigger && this.triggerFocusOutHandler) {\n this.trigger.removeEventListener(\n 'focusout',\n this.triggerFocusOutHandler\n );\n }\n if (this.wrapper && this.overlayFocusOutHandler) {\n this.wrapper.removeEventListener(\n 'focusout',\n this.overlayFocusOutHandler\n );\n }\n }\n\n // Destroy component\n if (this.componentRef) {\n this.componentRef.destroy();\n }\n\n // Remove DOM elements\n if (this.backdrop && this.backdrop.parentNode) {\n this.backdrop.parentNode.removeChild(this.backdrop);\n }\n if (this.wrapper && this.wrapper.parentNode) {\n this.wrapper.parentNode.removeChild(this.wrapper);\n }\n\n // Clean up container if empty\n if (this.container && this.container.children.length === 0) {\n if (this.container.parentNode) {\n this.container.parentNode.removeChild(this.container);\n }\n }\n }\n\n private handleFocusOut(\n event: FocusEvent,\n _source: 'trigger' | 'overlay'\n ): void {\n const relatedTarget = event.relatedTarget as HTMLElement | null;\n\n // If relatedTarget is null, focus might be moving to a non-focusable element\n // (e.g., clicking a button that doesn't retain focus)\n // Use a timeout to check if focus actually left the overlay\n if (!relatedTarget) {\n setTimeout(() => {\n const activeElement = document.activeElement as HTMLElement | null;\n\n // If focus went to body or null, it likely means a click happened\n // inside the overlay on a non-focusable element - don't close\n if (!activeElement || activeElement === document.body) {\n return;\n }\n\n const focusInTrigger = this.trigger?.contains(activeElement);\n const focusInOverlay = this.wrapper?.contains(activeElement);\n\n if (!focusInTrigger && !focusInOverlay) {\n if (this.focusOutResolve) {\n this.focusOutResolve();\n }\n }\n }, 0);\n return;\n }\n\n // Check if focus is moving to the other element (trigger <-> overlay)\n const focusStaysInTrigger = this.trigger.contains(relatedTarget);\n const focusStaysInOverlay = this.wrapper.contains(relatedTarget);\n\n // Only trigger focusOut if focus moves outside both trigger and overlay\n if (!focusStaysInTrigger && !focusStaysInOverlay) {\n if (this.focusOutResolve) {\n this.focusOutResolve();\n }\n }\n }\n\n private updatePosition(): void {\n const triggerRect = this.trigger.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const elementRect = this.wrapper.getBoundingClientRect();\n\n const widthDiff = elementRect.width - triggerRect.width;\n const shouldConsiderHorizontal = widthDiff > 150;\n\n let left = triggerRect.left;\n let top = triggerRect.bottom + this.offsetY;\n let position: 'top' | 'bottom' | 'left' | 'right' = 'bottom';\n\n if (shouldConsiderHorizontal) {\n // Check available space in all directions\n const spaceRight = viewportWidth - triggerRect.right;\n const spaceLeft = triggerRect.left;\n const spaceBottom = viewportHeight - triggerRect.bottom;\n // Prefer right, then left, then bottom, then top\n if (spaceRight >= elementRect.width + this.offsetY) {\n position = 'right';\n left = triggerRect.right + this.offsetY;\n top = triggerRect.top;\n } else if (spaceLeft >= elementRect.width + this.offsetY) {\n position = 'left';\n left = triggerRect.left - elementRect.width - this.offsetY;\n top = triggerRect.top;\n } else if (spaceBottom >= elementRect.height + this.offsetY) {\n position = 'bottom';\n left = Math.max(\n this.offsetY,\n Math.min(\n triggerRect.left,\n viewportWidth - elementRect.width - this.offsetY\n )\n );\n top = triggerRect.bottom + this.offsetY;\n } else {\n position = 'top';\n left = Math.max(\n this.offsetY,\n Math.min(\n triggerRect.left,\n viewportWidth - elementRect.width - this.offsetY\n )\n );\n top = triggerRect.top - elementRect.height - this.offsetY;\n }\n\n // Remove width constraint for horizontal positioning\n this.wrapper.style.width = '';\n } else {\n // Only consider top/bottom positioning\n const spaceBottom = viewportHeight - triggerRect.bottom;\n const spaceTop = triggerRect.top;\n\n if (spaceBottom >= elementRect.height + this.offsetY) {\n position = 'bottom';\n left = triggerRect.left;\n top = triggerRect.bottom + this.offsetY;\n } else if (spaceTop >= elementRect.height + this.offsetY) {\n position = 'top';\n left = triggerRect.left;\n top = triggerRect.top - elementRect.height - this.offsetY;\n } else {\n // Not enough space either way, prefer bottom\n position = 'bottom';\n left = triggerRect.left;\n top = triggerRect.bottom + this.offsetY;\n }\n\n // Match trigger width when positioned top/bottom\n this.wrapper.style.width = `${triggerRect.width}px`;\n }\n\n this.wrapper.style.left = `${left}px`;\n this.wrapper.style.top = `${top}px`;\n this.wrapper.setAttribute('data-position', position);\n }\n}\n","import { computed, inject, Injectable } from '@angular/core';\nimport { ThemeStore } from '../lib/theme';\nimport { ThemeColor } from '@magmonium/cli';\n\n@Injectable({ providedIn: 'root' })\nexport class ThemeService {\n private readonly themeStore = inject(ThemeStore);\n\n readonly color = computed<ThemeColor | undefined>(() =>\n this.themeStore.color()\n );\n\n readonly theme = computed(() => this.themeStore.theme());\n}\n","import { Binding, Type } from '@angular/core';\n\nexport enum Direction {\n TOP = 'top',\n BOTTOM = 'bottom',\n LEFT = 'left',\n RIGHT = 'right',\n CENTER = 'center',\n UP_DOWN = 'up-down',\n}\n\nexport type SelectorConfig<T> = {\n component: Type<T>;\n base: string;\n width?: string;\n height?: string;\n toggle?: boolean;\n matchTriggerWidth?: boolean;\n dir?: Direction;\n align?: 'left' | 'right';\n bindings?: Binding[];\n};\n","import { Direction } from './selector-type';\n\nexport function isOutOfViewport(boundary: DOMRect): boolean {\n const margin = 8;\n return (\n boundary.top + boundary.height + margin < 0 ||\n boundary.left + boundary.width + margin < 0 ||\n boundary.bottom - margin > window.innerHeight ||\n boundary.right - margin > window.innerWidth\n );\n}\n\nexport function calculatePosition(\n boundary: DOMRect,\n direction?: Direction,\n width = '250px',\n height = '300px',\n align?: 'left' | 'right'\n): Record<string, string> {\n const margin = 8;\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n\n const contentWidth = parseInt(width) || 250;\n // Use 0 for unknown/auto height so direction picks the side with more space\n // rather than assuming a fixed 300px that causes unnecessary flips\n const contentHeight = parseInt(height) || 0;\n\n const space = {\n top: boundary.top,\n bottom: viewport.height - boundary.bottom,\n left: boundary.left,\n right: viewport.width - boundary.right,\n };\n\n const centerX = boundary.left + boundary.width / 2;\n const centerY = boundary.top + boundary.height / 2;\n\n direction = detectBestDirection(\n space,\n {\n width: contentWidth,\n height: contentHeight,\n },\n direction\n );\n\n const horizontalLeft =\n align === 'right'\n ? calculateRightAlignedPosition(boundary.right, contentWidth, viewport.width)\n : align === 'left'\n ? calculateLeftAlignedPosition(boundary.left, contentWidth, viewport.width)\n : calculateHorizontalPosition(centerX, contentWidth, viewport.width);\n\n const positionMap: Record<Direction, Record<string, string>> = {\n [Direction.TOP]: {\n top: 'unset',\n bottom: `${viewport.height - boundary.top + margin}px`,\n 'max-height': `${Math.max(space.top - margin * 2, 0)}px`,\n left: horizontalLeft,\n },\n [Direction.BOTTOM]: {\n top: `${boundary.bottom + margin}px`,\n bottom: 'unset',\n 'max-height': `${Math.max(space.bottom - margin * 2, 0)}px`,\n left: horizontalLeft,\n },\n [Direction.LEFT]: {\n right: `${viewport.width - boundary.left + margin}px`,\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n },\n [Direction.RIGHT]: {\n left: `${boundary.right + margin}px`,\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n },\n [Direction.CENTER]: {\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n left: horizontalLeft,\n },\n [Direction.UP_DOWN]: {\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n left: `${boundary.left}px`,\n },\n };\n\n return (\n positionMap[direction] || {\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n left: horizontalLeft,\n }\n );\n}\n\nexport function detectBestDirection(\n space: { top: number; bottom: number; left: number; right: number },\n content: { width: number; height: number },\n preferredDirection?: Direction\n): Direction {\n const margin = 8;\n const fits = (available: number, needed: number) =>\n available >= needed + margin;\n\n // If an explicit direction is requested and it fits, honour it\n if (preferredDirection && preferredDirection !== Direction.UP_DOWN) {\n const dirFits: Record<string, boolean> = {\n [Direction.BOTTOM]: fits(space.bottom, content.height),\n [Direction.TOP]: fits(space.top, content.height),\n [Direction.LEFT]: fits(space.left, content.width),\n [Direction.RIGHT]: fits(space.right, content.width),\n };\n if (dirFits[preferredDirection]) {\n return preferredDirection;\n }\n }\n\n // If height is unknown (0), always prefer BOTTOM\n if (content.height <= 0) {\n return Direction.BOTTOM;\n }\n\n // If height is known, check if it fits in the preferred vertical order\n if (fits(space.bottom, content.height)) {\n return Direction.BOTTOM;\n }\n if (fits(space.top, content.height)) {\n return Direction.TOP;\n }\n\n // If it doesn't fit vertically, but UP_DOWN was requested, still return BOTTOM (it will be clipped by max-height)\n if (preferredDirection === Direction.UP_DOWN) {\n return Direction.BOTTOM;\n }\n\n // Last resort: pick horizontal side that fits better\n if (fits(space.right, content.width)) {\n return Direction.RIGHT;\n }\n if (fits(space.left, content.width)) {\n return Direction.LEFT;\n }\n\n // Final fallback: BOTTOM (let max-height and scrolling handle it)\n return Direction.BOTTOM;\n}\n\nfunction calculateHorizontalPosition(\n center: number,\n width: number,\n viewportWidth: number\n): string {\n return calculatePosition1D(center, width, viewportWidth);\n}\n\nfunction calculateRightAlignedPosition(\n rightEdge: number,\n width: number,\n viewportWidth: number\n): string {\n const start = rightEdge - width;\n if (start < 0) return '0px';\n if (start + width > viewportWidth) return `${viewportWidth - width}px`;\n return `${start}px`;\n}\n\nfunction calculateLeftAlignedPosition(\n leftEdge: number,\n width: number,\n viewportWidth: number\n): string {\n if (leftEdge < 0) return '0px';\n if (leftEdge + width > viewportWidth) return `${viewportWidth - width}px`;\n return `${leftEdge}px`;\n}\n\nfunction calculateVerticalPosition(\n center: number,\n height: number,\n viewportHeight: number\n): string {\n return calculatePosition1D(center, height, viewportHeight);\n}\n\nfunction calculatePosition1D(\n center: number,\n size: number,\n viewportSize: number\n): string {\n const start = center - size / 2;\n if (start < 0) {\n return '0px';\n }\n if (start + size > viewportSize) {\n return `${viewportSize - size}px`;\n }\n return `${start}px`;\n}\n","import {\n ComponentRef,\n DOCUMENT,\n Directive,\n ElementRef,\n HostListener,\n inject,\n input,\n linkedSignal,\n OnDestroy,\n output,\n signal,\n} from '@angular/core';\nimport { DeviceService, DomService } from '../../services';\nimport { SelectorConfig, Direction } from './selector-type';\nimport {\n calculatePosition,\n isOutOfViewport,\n detectBestDirection,\n} from './selector-helper';\nimport { MODAL_STORE_REF, ModalStoreRef } from '../../config/tokens';\n\n@Directive({\n selector: '[mSelector]',\n exportAs: 'mSelector',\n host: {\n '[class.active]': 'isOpen()',\n },\n})\nexport class SelectorDirective implements OnDestroy {\n private static openSelector: Record<string, SelectorDirective> = {};\n mSelector = input<SelectorConfig<unknown> | undefined>(undefined);\n disabled = input<boolean>(false);\n readonly opened = output<void>();\n readonly closed = output<void>();\n private readonly deviceService = inject(DeviceService);\n private readonly domService = inject(DomService);\n private readonly modalStore = inject(MODAL_STORE_REF, {\n optional: true,\n }) as ModalStoreRef | null;\n private readonly element = inject(ElementRef<HTMLElement>);\n private readonly doc = inject(DOCUMENT);\n private componentRef?: ComponentRef<unknown>;\n private modalId = signal<string | undefined>(undefined);\n private triggerFocusOutHandler?: (event: FocusEvent) => void;\n private boxFocusOutHandler?: (event: FocusEvent) => void;\n private outsideMouseDownHandler?: (event: MouseEvent) => void;\n private readonly isCompact = (): boolean =>\n this.deviceService.isMobile() ||\n this.deviceService.isTablet() ||\n this.deviceService.isTouch();\n\n protected readonly isOpen = linkedSignal({\n source: () => ({\n triggerMap: this.modalStore?.modalTriggerMap() ?? {},\n id: this.modalId(),\n isCompact:\n this.deviceService.isMobile() ||\n this.deviceService.isTablet() ||\n this.deviceService.isTouch(),\n }),\n computation: ({ triggerMap, id, isCompact }, previous) => {\n if (isCompact && id && !triggerMap[id]) {\n this.closed.emit();\n return false;\n }\n return previous?.value ?? false;\n },\n });\n\n @HostListener('click', ['$event'])\n @HostListener('keydown.enter', ['$event'])\n @HostListener('keydown.space', ['$event'])\n @HostListener('keydown.tab', ['$event'])\n @HostListener('focus', ['$event'])\n onClick(_e: unknown): void {\n if (this.disabled()) {\n return;\n }\n if (this.isOpen()) {\n this.close();\n return;\n }\n this.open();\n }\n\n // Keyboard opening, for a trigger whose visible affordance sits out of tab\n // order — a dropdown chevron, a date calendar. The field itself is the tab\n // stop, and ArrowDown on it is what opens the panel. Open only: Escape and a\n // selection close it, and ArrowDown moving into the list must never toggle\n // the panel shut under it.\n @HostListener('keydown.arrowdown', ['$event'])\n onArrowDown(event: Event): void {\n if (this.disabled() || this.isOpen()) return;\n event.preventDefault();\n this.open();\n }\n\n @HostListener('window:scroll', ['$event'])\n @HostListener('window:resize', ['$event'])\n onScroll(_event: Event): void {\n this.handleViewportChange(_event);\n }\n\n ngOnDestroy(): void {\n this.teardownFocusTracking();\n this.close();\n const selector = this.mSelector();\n if (!selector) {\n return;\n }\n if (SelectorDirective.openSelector[selector.base] === this) {\n delete SelectorDirective.openSelector[selector.base];\n }\n }\n\n close(): void {\n if (!this.isOpen()) {\n return;\n }\n this.teardownFocusTracking();\n const selector = this.mSelector();\n if (!selector) {\n return;\n }\n const { base } = selector;\n if (this.isCompact()) {\n this.modalStore?.close(this.modalId());\n } else {\n this.domService.destroy({\n componentRef: this.componentRef,\n parentClassName: 'm-selector-box',\n className: base,\n });\n }\n if (SelectorDirective.openSelector[base] === this) {\n delete SelectorDirective.openSelector[base];\n }\n this.isOpen.set(false);\n this.closed.emit();\n }\n\n open() {\n if (this.isOpen()) {\n return;\n }\n const base = this.mSelector()?.base;\n if (!base) {\n return;\n }\n if (\n SelectorDirective.openSelector[base] &&\n SelectorDirective.openSelector[base] !== this\n ) {\n SelectorDirective.openSelector[base].close();\n }\n SelectorDirective.openSelector[base] = this;\n if (this.isCompact()) {\n this.openInModal();\n } else {\n this.openInBox();\n }\n this.isOpen.set(true);\n this.opened.emit();\n }\n\n private openInBox = () => {\n const selector = this.mSelector();\n\n if (!selector) {\n return;\n }\n\n const { component, base, bindings, dir, align, width, height } = selector;\n\n const boundary = this.element.nativeElement.getBoundingClientRect();\n const styles: Record<string, string> = {\n ...calculatePosition(boundary, dir, width, height, align),\n };\n\n this.componentRef = this.domService.create<unknown>({\n component,\n styles,\n parentClassName: 'm-selector-box',\n className: base,\n bindings,\n });\n\n if (selector.matchTriggerWidth) {\n this.alignToTrigger();\n } else if (!parseInt(height ?? '')) {\n // height was unknown/'auto' up front, so calculatePosition assumed 0\n // and defaulted to BOTTOM without checking available space — that same\n // \"unknown height\" branch also clamps the box's own max-height to\n // whatever little room is below the trigger, which pins its rendered\n // (clamped) height at/near 0 too, so getBoundingClientRect() can't be\n // used to recover the real size later. scrollHeight ignores that\n // clamp and reports the content's true intrinsic height once Angular\n // has actually rendered it (hence the rAF) — reflow off that instead.\n requestAnimationFrame(() => this.reflowAfterRender(boundary, selector));\n }\n\n requestAnimationFrame(() => this.setupFocusTracking());\n };\n\n private reflowAfterRender(\n boundary: DOMRect,\n selector: SelectorConfig<unknown>\n ): void {\n const boxElement = this.getBoxElement();\n if (!boxElement) return;\n // Content that scrolls inside the box (m-menu inherits max-height) reports\n // only the clamped height; lift the clamp so scrollHeight is intrinsic.\n const clampedMaxHeight = boxElement.style.maxHeight;\n boxElement.style.maxHeight = 'none';\n const actualHeight = boxElement.scrollHeight;\n boxElement.style.maxHeight = clampedMaxHeight;\n if (!actualHeight) return;\n\n const { base, dir, align, width } = selector;\n const style = calculatePosition(\n boundary,\n dir,\n width,\n `${actualHeight}px`,\n align\n );\n this.domService.updateStyle(base, { ...style });\n }\n\n private openInModal = () => {\n const selector = this.mSelector();\n if (!selector) {\n return;\n }\n const { component, bindings } = selector;\n this.modalId.set(\n this.modalStore?.open({\n component,\n bindings,\n name: 'bottom',\n one: true,\n // A sheet, not a card: dock the option list to the bottom edge like\n // every other compact overlay, so `.pop-up.align-bottom` and the box's\n // own `:host-context(.align-bottom)` de-chroming both apply.\n config: { align: 'bottom' },\n }) ?? undefined\n );\n };\n\n private getBoxElement(): HTMLElement | null {\n const base = this.mSelector()?.base;\n if (!base) return null;\n return this.doc.querySelector(\n `.m-selector-box .${base}`\n ) as HTMLElement | null;\n }\n\n private setupFocusTracking(): void {\n this.triggerFocusOutHandler = (event: FocusEvent) =>\n this.handleFocusOut(event);\n this.element.nativeElement.addEventListener(\n 'focusout',\n this.triggerFocusOutHandler\n );\n\n const boxElement = this.getBoxElement();\n if (boxElement) {\n this.boxFocusOutHandler = (event: FocusEvent) =>\n this.handleFocusOut(event);\n boxElement.addEventListener('focusout', this.boxFocusOutHandler);\n }\n\n this.outsideMouseDownHandler = (event: MouseEvent) =>\n this.handleOutsideMouseDown(event);\n this.doc.addEventListener('mousedown', this.outsideMouseDownHandler);\n }\n\n private teardownFocusTracking(): void {\n if (this.triggerFocusOutHandler) {\n this.element.nativeElement.removeEventListener(\n 'focusout',\n this.triggerFocusOutHandler\n );\n this.triggerFocusOutHandler = undefined;\n }\n if (this.boxFocusOutHandler) {\n const boxElement = this.getBoxElement();\n boxElement?.removeEventListener('focusout', this.boxFocusOutHandler);\n this.boxFocusOutHandler = undefined;\n }\n if (this.outsideMouseDownHandler) {\n this.doc.removeEventListener('mousedown', this.outsideMouseDownHandler);\n this.outsideMouseDownHandler = undefined;\n }\n }\n\n private handleFocusOut(event: FocusEvent): void {\n if (!this.isOpen()) return;\n\n const relatedTarget = event.relatedTarget as HTMLElement | null;\n const triggerElement = this.element.nativeElement;\n const boxElement = this.getBoxElement();\n const selectorContainer = this.doc.querySelector('.m-selector-box');\n\n if (!relatedTarget) {\n setTimeout(() => {\n if (!this.isOpen()) return;\n const activeElement = this.doc.activeElement as HTMLElement | null;\n if (!activeElement || activeElement === this.doc.body) return;\n\n const inTrigger = triggerElement.contains(activeElement);\n const inBox = boxElement?.contains(activeElement) ?? false;\n const inSelectorContainer =\n selectorContainer?.contains(activeElement) ?? false;\n if (!inTrigger && !inBox && !inSelectorContainer) {\n this.close();\n }\n }, 0);\n return;\n }\n\n const inTrigger = triggerElement.contains(relatedTarget);\n const inBox = boxElement?.contains(relatedTarget) ?? false;\n const inSelectorContainer =\n selectorContainer?.contains(relatedTarget) ?? false;\n if (!inTrigger && !inBox && !inSelectorContainer) {\n this.close();\n }\n }\n\n private handleOutsideMouseDown(event: MouseEvent): void {\n if (!this.isOpen()) return;\n\n const target = event.target as HTMLElement;\n const triggerElement = this.element.nativeElement;\n const boxElement = this.getBoxElement();\n\n const inTrigger = triggerElement.contains(target);\n const inBox = boxElement?.contains(target) ?? false;\n if (inTrigger || inBox) return;\n\n const selectorContainer = this.doc.querySelector('.m-selector-box');\n if (selectorContainer?.contains(target)) return;\n\n this.close();\n }\n\n private alignToTrigger(): void {\n const boxElement = this.getBoxElement();\n if (!boxElement) return;\n const boundary = this.element.nativeElement.getBoundingClientRect();\n const margin = 8;\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n const selector = this.mSelector();\n const width = selector?.width || '250px';\n const height = selector?.height || '300px';\n const contentWidth = parseInt(width) || 250;\n const contentHeight = parseInt(height) || 0;\n\n const space = {\n top: boundary.top,\n bottom: viewport.height - boundary.bottom,\n left: boundary.left,\n right: viewport.width - boundary.right,\n };\n\n const direction = detectBestDirection(\n space,\n {\n width: contentWidth,\n height: contentHeight,\n },\n selector?.dir\n );\n\n boxElement.style.width = `${boundary.width}px`;\n boxElement.style.left = `${boundary.left}px`;\n\n if (direction === Direction.TOP) {\n boxElement.style.top = 'unset';\n boxElement.style.bottom = `${viewport.height - boundary.top + margin}px`;\n boxElement.classList.add('open-upward');\n } else {\n boxElement.style.top = `${boundary.bottom + margin}px`;\n boxElement.style.bottom = 'unset';\n boxElement.classList.remove('open-upward');\n }\n }\n\n private handleViewportChange(_event: Event): void {\n const selector = this.mSelector();\n if (!selector) {\n return;\n }\n if (!this.isOpen() || this.isCompact()) {\n return;\n }\n const boundary = this.element.nativeElement.getBoundingClientRect();\n\n if (isOutOfViewport(boundary)) {\n this.close();\n return;\n }\n\n const { base, dir, align, width, height } = selector;\n\n const style = calculatePosition(boundary, dir, width, height, align);\n\n this.domService.updateStyle(base, {\n ...style,\n });\n\n if (selector.matchTriggerWidth) {\n this.alignToTrigger();\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
import { t as __exportAll } from "./magmonium-one-rolldown-runtime-DpJrqANO.mjs";
|
|
2
2
|
import { $ as SEARCH_RESULTS_EVENT, A as isLocalhost, B as FOLDER_PICK_LISTENER, C as definedWcTierOf, D as wcLocalBaseOf, E as setWcTier, F as APP_LINK, G as LOADING_ACTIONS_REF, H as ICON_SOURCE, I as ASSET_BASE_URL, J as MODAL_STORE_REF, K as LOGIN_COMPONENT, L as AppAvailability, M as isUrlLocalhost, N as isWebComponent, O as wcTierOf, P as APP_CONTEXT_REF, Q as SEARCH_QUERY, R as AppRelationType, S as definedWcBundleOf, T as setWcLocalPort, U as IS_DESIGN_MODE, V as HOST_SESSION, W as IS_SIDE_PANEL, X as ONE_ASSET_BASE_URL, Y as NAV_STORE_REF, Z as OPTIONS_SOURCE, _ as StorageService, a as resolveSpacing, at as LAYOUT_ASSET_FOLDER, b as HttpService, c as TranslatePipe, ct as Size, d as browserLocale, et as TRANSLATION_SOURCE, f as escapeHtml, g as SharedStoreRegistry, h as AssetStore, i as resolveSize, it as FORM_ASSET_FOLDER, j as isTierPreview, k as getTierFromPreviewPath, l as TranslateService, m as miniMarkToHtml, n as isSize, nt as WC_BUNDLE, o as toCssLength, ot as Assets, p as miniMarkInlineToHtml, q as LOGIN_STORE, r as resolveIconSize, rt as WC_SEARCH_GROUPS, s as toLength, st as DEFAULT_SIZE, t as coerceSize, tt as USER_STORE_REF, u as BrowserLocaleService, v as isJson, w as recordDefinedWcTier, x as buildWcBaseUrl, y as ACCESS_DOMAINS, z as COMPONENT_INPUT_REGISTRY } from "./magmonium-one-size-converter-BqkALIWA.mjs";
|
|
3
|
-
import { a as OverlayService, c as DeviceService, i as OverlayRef, n as Direction, o as ScrollService, r as ThemeService, s as DomService, t as SelectorDirective } from "./magmonium-one-selector-
|
|
3
|
+
import { a as OverlayService, c as DeviceService, i as OverlayRef, n as Direction, o as ScrollService, r as ThemeService, s as DomService, t as SelectorDirective } from "./magmonium-one-selector-BK48N5us.mjs";
|
|
4
4
|
import { t as FileService } from "./magmonium-one-file.service-D39FjShR.mjs";
|
|
5
5
|
import { C as isLightAppColor, D as readableAppColor, E as normalizeAppColor, O as rebuildLogoGlyph, S as appLogoShadowColor, T as logoGlyphMaskUrl, _ as AppLogoState, a as calculateLuminance, b as LOGO_GLYPH_MAX_BYTES, c as hexToRgb, d as derivePropertyName, f as getProperty, g as APP_THEME_COLOR, h as APP_LOGO_SOURCE, i as deriveOppositeColor, k as ThemeDataService, l as hslToRgb, m as ThemeStore, n as resolvePallet, o as rgbToHex, p as setProperty, r as deriveContrastColor, s as rgbToHsl, t as applyColorsToElement, u as parseColor, v as appThemeColorFactory, w as isReadableOn, x as appColorBrand, y as paintAppColor } from "./magmonium-one-color-utl-BA51l-Rw.mjs";
|
|
6
6
|
import "./magmonium-one-theme-BtQyLRdQ.mjs";
|
|
7
7
|
import { _ as TimeAgoPipe, a as nextSectionTableSort, c as sectionTableFrozenCount, d as SectionTableSortDirection, f as AssetUrlPipe, g as MoneyPipe, h as PercentagePipe, i as defaultSectionTableSort, l as sortSectionTableRows, m as SignColorPipe, n as ToListPipe, o as sectionTableColumnId, p as CompactNumberPipe, r as SectionTableSortPipe, s as sectionTableColumnWidths, t as LabelComponent, u as SECTION_TABLE_VARIANTS } from "./magmonium-one-label-Dkis_mGP.mjs";
|
|
8
8
|
import { a as SIZE_CONTEXT, c as SHARED_ICONS, i as APP_LOGO_ICON, n as CustomIconClass, o as injectParentSize, r as IconComponent, s as provideSizeContext, t as CustomIconEditComponent } from "./magmonium-one-icon-CH-g8CUR.mjs";
|
|
9
9
|
import { i as resolveConfigAsset, n as toAttrNumber, r as ConfigComponent, t as toAttrBool } from "./magmonium-one-attribute-value-CPh-lJPV.mjs";
|
|
10
|
-
import {
|
|
10
|
+
import { c as enumValue, d as formatBadgeCount, f as shouldShowBadge, i as ACTION_BUTTON_HOST, l as ReactiveElementComponent, n as SECTION_FORM_CONTEXT, o as actionName, r as ImgComponent, s as isButtonName, t as ButtonComponent, u as BadgeComponent } from "./magmonium-one-button-C5dk4R_m.mjs";
|
|
11
11
|
import { t as MRefDirective } from "./magmonium-one-m-ref-DLIAzywu.mjs";
|
|
12
12
|
import { i as OptionsSourceDirective, n as normalizeAssetOptions, r as presetDefaultOption, t as assetOptions } from "./magmonium-one-options-asset-BNd1hbLw.mjs";
|
|
13
13
|
import { t as InputType } from "./magmonium-one-input-DqHPorA1.mjs";
|
|
14
14
|
import { r as PLACED_CHECKBOX, t as CheckboxInputComponent } from "./magmonium-one-checkbox-a3Dwmu2X.mjs";
|
|
15
|
-
import { a as ToolTipDirective, c as DragListItemDirective, d as MarginDirective, f as PaddingDirective, i as PositionDirective, l as DragListDirective, n as stringToColor, o as FileUploadDirective, p as SPACING_INWARD, r as HighlightDirective, s as AutosizeDirective, t as MHeroColorDirective, u as DraggableDirective } from "./magmonium-one-directives-
|
|
16
|
-
import { t as HeaderComponent } from "./magmonium-one-header-
|
|
17
|
-
import { i as mergeUniqueWith, n as mergeUnique, r as mergeUniqueBy, t as ButtonGroupComponent } from "./magmonium-one-group-
|
|
18
|
-
import { n as ContextMenuBoxComponent, r as MenuComponent, t as ContextMenuComponent } from "./magmonium-one-menu-
|
|
15
|
+
import { a as ToolTipDirective, c as DragListItemDirective, d as MarginDirective, f as PaddingDirective, i as PositionDirective, l as DragListDirective, n as stringToColor, o as FileUploadDirective, p as SPACING_INWARD, r as HighlightDirective, s as AutosizeDirective, t as MHeroColorDirective, u as DraggableDirective } from "./magmonium-one-directives-hJ7wkmQn.mjs";
|
|
16
|
+
import { t as HeaderComponent } from "./magmonium-one-header-BZzD8uTJ.mjs";
|
|
17
|
+
import { i as mergeUniqueWith, n as mergeUnique, r as mergeUniqueBy, t as ButtonGroupComponent } from "./magmonium-one-group-bRamdzPO.mjs";
|
|
18
|
+
import { n as ContextMenuBoxComponent, r as MenuComponent, t as ContextMenuComponent } from "./magmonium-one-menu-CJjjxFfu.mjs";
|
|
19
19
|
import { t as BaseInputComponent } from "./magmonium-one-base-input-B92NOmxz.mjs";
|
|
20
20
|
import { i as getScrollParent, n as activeElementWithin, r as classListSignal, t as BaseTextInputComponent } from "./magmonium-one-base-text-ChjG3GNw.mjs";
|
|
21
21
|
import { t as TextOutputComponent } from "./magmonium-one-text-output-E6pe3IOL.mjs";
|
|
22
22
|
import { t as BaseCheckboxInputComponent } from "./magmonium-one-base-checkbox-LdM6dqF_.mjs";
|
|
23
23
|
import { t as RadioInputComponent } from "./magmonium-one-radio-DPz4-SAJ.mjs";
|
|
24
24
|
import { t as TextInputComponent } from "./magmonium-one-text-vDPAhn74.mjs";
|
|
25
|
-
import { r as BaseArrayInputComponent, t as MultiRangeInputComponent } from "./magmonium-one-multi-range-
|
|
26
|
-
import { t as RangeInputComponent } from "./magmonium-one-range-
|
|
27
|
-
import { n as DROPDOWN_IMPORTS, r as DROPDOWN_TEMPLATE, t as BaseDropdownComponent } from "./magmonium-one-base-dropdown-
|
|
25
|
+
import { r as BaseArrayInputComponent, t as MultiRangeInputComponent } from "./magmonium-one-multi-range-DL_JlKVL.mjs";
|
|
26
|
+
import { t as RangeInputComponent } from "./magmonium-one-range-DlQfnl9p.mjs";
|
|
27
|
+
import { n as DROPDOWN_IMPORTS, r as DROPDOWN_TEMPLATE, t as BaseDropdownComponent } from "./magmonium-one-base-dropdown-2hgXcmhE.mjs";
|
|
28
28
|
import { o as isEditableImage, s as outputSize } from "./magmonium-one-image-frame-BTSaUSAi.mjs";
|
|
29
29
|
import * as i0 from "@angular/core";
|
|
30
30
|
import { ApplicationRef, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, DOCUMENT, DestroyRef, Directive, ElementRef, EventEmitter, HostAttributeToken, HostBinding, HostListener, Injectable, InjectionToken, Injector, Input, LOCALE_ID, Output, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation, afterEveryRender, afterNextRender, afterRenderEffect, booleanAttribute, computed, contentChild, contentChildren, createComponent, effect, forwardRef, inject, input, inputBinding, linkedSignal, makeEnvironmentProviders, model, numberAttribute, output, outputBinding, provideAppInitializer, provideBrowserGlobalErrorListeners, provideZonelessChangeDetection, reflectComponentType, runInInjectionContext, signal, twoWayBinding, untracked, viewChild, viewChildren } from "@angular/core";
|
|
@@ -759,7 +759,7 @@ var SectionFormItemComponent = class SectionFormItemComponent extends ConfigComp
|
|
|
759
759
|
break;
|
|
760
760
|
}
|
|
761
761
|
case InputType.PASSWORD: {
|
|
762
|
-
const { PasswordInputComponent } = await import("./magmonium-one-password-
|
|
762
|
+
const { PasswordInputComponent } = await import("./magmonium-one-password-CvgWZkAX.mjs");
|
|
763
763
|
this.createDynamicComponent(seq, PasswordInputComponent);
|
|
764
764
|
break;
|
|
765
765
|
}
|
|
@@ -789,12 +789,12 @@ var SectionFormItemComponent = class SectionFormItemComponent extends ConfigComp
|
|
|
789
789
|
break;
|
|
790
790
|
}
|
|
791
791
|
case InputType.RANGE: {
|
|
792
|
-
const { RangeInputComponent } = await import("./magmonium-one-range-
|
|
792
|
+
const { RangeInputComponent } = await import("./magmonium-one-range-DlQfnl9p.mjs").then((n) => n.n);
|
|
793
793
|
this.createDynamicComponent(seq, RangeInputComponent);
|
|
794
794
|
break;
|
|
795
795
|
}
|
|
796
796
|
case InputType.MULTI_RANGE: {
|
|
797
|
-
const { MultiRangeInputComponent } = await import("./magmonium-one-multi-range-
|
|
797
|
+
const { MultiRangeInputComponent } = await import("./magmonium-one-multi-range-DL_JlKVL.mjs").then((n) => n.n);
|
|
798
798
|
this.createDynamicComponent(seq, MultiRangeInputComponent);
|
|
799
799
|
break;
|
|
800
800
|
}
|
|
@@ -3384,6 +3384,24 @@ const BREAKPOINTS$2 = [
|
|
|
3384
3384
|
var ActionComponent = class ActionComponent extends ButtonGroupComponent {
|
|
3385
3385
|
sticky = input(false, ...ngDevMode ? [{ debugName: "sticky" }] : /* istanbul ignore next */ []);
|
|
3386
3386
|
isStuck = signal(false, ...ngDevMode ? [{ debugName: "isStuck" }] : /* istanbul ignore next */ []);
|
|
3387
|
+
projected = contentChildren(ButtonComponent, ...ngDevMode ? [{ debugName: "projected" }] : /* istanbul ignore next */ []);
|
|
3388
|
+
projectedButtons = computed(() => this.projected().map((child) => child.config()).filter((config) => !!config), ...ngDevMode ? [{ debugName: "projectedButtons" }] : /* istanbul ignore next */ []);
|
|
3389
|
+
projectedLinkTrees = computed(() => {
|
|
3390
|
+
const trees = /* @__PURE__ */ new Map();
|
|
3391
|
+
this.projected().forEach((child) => {
|
|
3392
|
+
const name = child.config()?.name;
|
|
3393
|
+
const link = child.routerLinkRef;
|
|
3394
|
+
if (!name || !link) return;
|
|
3395
|
+
try {
|
|
3396
|
+
const tree = link.urlTree;
|
|
3397
|
+
if (tree) trees.set(name, tree);
|
|
3398
|
+
} catch (error) {
|
|
3399
|
+
console.warn(`m-action: Button "${name}" links nowhere from here`, error);
|
|
3400
|
+
}
|
|
3401
|
+
});
|
|
3402
|
+
return trees;
|
|
3403
|
+
}, ...ngDevMode ? [{ debugName: "projectedLinkTrees" }] : /* istanbul ignore next */ []);
|
|
3404
|
+
sourceButtons = computed(() => [...this.mergedButtons(), ...this.projectedButtons()], ...ngDevMode ? [{ debugName: "sourceButtons" }] : /* istanbul ignore next */ []);
|
|
3387
3405
|
variant = input(...ngDevMode ? [void 0, { debugName: "variant" }] : /* istanbul ignore next */ []);
|
|
3388
3406
|
active = input(...ngDevMode ? [void 0, { debugName: "active" }] : /* istanbul ignore next */ []);
|
|
3389
3407
|
renderIds = input(...ngDevMode ? [void 0, { debugName: "renderIds" }] : /* istanbul ignore next */ []);
|
|
@@ -3395,7 +3413,13 @@ var ActionComponent = class ActionComponent extends ButtonGroupComponent {
|
|
|
3395
3413
|
linkTrees = computed(() => {
|
|
3396
3414
|
const trees = /* @__PURE__ */ new Map();
|
|
3397
3415
|
if (this.isDesignMode) return trees;
|
|
3416
|
+
const projected = this.projectedLinkTrees();
|
|
3398
3417
|
this.actionButtons().forEach((button) => {
|
|
3418
|
+
const written = button.name ? projected.get(button.name) : void 0;
|
|
3419
|
+
if (written) {
|
|
3420
|
+
trees.set(button, written);
|
|
3421
|
+
return;
|
|
3422
|
+
}
|
|
3399
3423
|
const link = button.routerLink;
|
|
3400
3424
|
if (!link) return;
|
|
3401
3425
|
try {
|
|
@@ -3407,7 +3431,14 @@ var ActionComponent = class ActionComponent extends ButtonGroupComponent {
|
|
|
3407
3431
|
return trees;
|
|
3408
3432
|
}, ...ngDevMode ? [{ debugName: "linkTrees" }] : /* istanbul ignore next */ []);
|
|
3409
3433
|
linkOf(button) {
|
|
3410
|
-
|
|
3434
|
+
const tree = this.linkTrees().get(button);
|
|
3435
|
+
if (!tree) return void 0;
|
|
3436
|
+
return button.routerLink ?? tree;
|
|
3437
|
+
}
|
|
3438
|
+
isDisabled(name) {
|
|
3439
|
+
const own = super.isDisabled(name);
|
|
3440
|
+
if (own !== void 0 || !name) return own;
|
|
3441
|
+
return this.projectedButtons().find((b) => b.name === name)?.disabled;
|
|
3411
3442
|
}
|
|
3412
3443
|
linkActive = computed(() => {
|
|
3413
3444
|
const active = /* @__PURE__ */ new Map();
|
|
@@ -3519,7 +3550,7 @@ var ActionComponent = class ActionComponent extends ButtonGroupComponent {
|
|
|
3519
3550
|
destroyRef = inject(DestroyRef);
|
|
3520
3551
|
actionButtonsResource = rxResource({
|
|
3521
3552
|
params: () => {
|
|
3522
|
-
const buttons = this.
|
|
3553
|
+
const buttons = this.sourceButtons();
|
|
3523
3554
|
if (!buttons.length) return void 0;
|
|
3524
3555
|
return {
|
|
3525
3556
|
buttons,
|
|
@@ -3537,7 +3568,7 @@ var ActionComponent = class ActionComponent extends ButtonGroupComponent {
|
|
|
3537
3568
|
}));
|
|
3538
3569
|
}
|
|
3539
3570
|
});
|
|
3540
|
-
actionButtons = computed(() => this.actionButtonsResource.value() ?? this.
|
|
3571
|
+
actionButtons = computed(() => this.actionButtonsResource.value() ?? this.sourceButtons(), ...ngDevMode ? [{ debugName: "actionButtons" }] : /* istanbul ignore next */ []);
|
|
3541
3572
|
constructor() {
|
|
3542
3573
|
super();
|
|
3543
3574
|
effect(this.announceDefault);
|
|
@@ -3630,6 +3661,15 @@ var ActionComponent = class ActionComponent extends ButtonGroupComponent {
|
|
|
3630
3661
|
}
|
|
3631
3662
|
},
|
|
3632
3663
|
host: { properties: { "class.m-action--host-sticky": "sticky()" } },
|
|
3664
|
+
providers: [{
|
|
3665
|
+
provide: ACTION_BUTTON_HOST,
|
|
3666
|
+
useValue: true
|
|
3667
|
+
}],
|
|
3668
|
+
queries: [{
|
|
3669
|
+
propertyName: "projected",
|
|
3670
|
+
predicate: ButtonComponent,
|
|
3671
|
+
isSignal: true
|
|
3672
|
+
}],
|
|
3633
3673
|
usesInheritance: true,
|
|
3634
3674
|
ngImport: i0,
|
|
3635
3675
|
template: "@let buttons = actionButtons();\n<!-- No `config()` guard: a bar the Design editor folded its Buttons into has no\n `button_groups/<name>.yml` behind it — they ride on `[buttons]` instead\n (ADR 0009, ADR 0010) — so what decides whether the row exists is whether\n there are Buttons in it. Empty, it draws only on the Canvas, where it is\n the drop space a Button lands on. -->\n@if (buttons.length || isDesignMode) {\n <div\n class=\"m-action\"\n [class.m-action--stuck]=\"isStuck()\"\n [class.m-action--toggle]=\"resolvedVariant() === 'toggle'\"\n >\n @for (button of visibleButtons(); track $index) {\n <!-- A routed Button is a real link, so the browser's own affordances —\n a middle-click, open in new tab, the URL on hover — reach it. A\n disabled one stays a <button>: an <a> cannot be disabled, and a\n RouterLink on one would still navigate. -->\n @let link = isDisabled(button.name) ? undefined : linkOf(button);\n @if (link) {\n <a\n class=\"m-action__btn\"\n [routerLink]=\"link\"\n [attr.data-testid]=\"(button.name || '') + '-btn'\"\n [class.active]=\"isActive(button)\"\n [class.m-action__btn--icon-only]=\"isLabelHidden(button)\"\n [attr.aria-label]=\"isLabelHidden(button) ? (button.label | translate) : null\"\n [attr.aria-current]=\"isActive(button) ? 'page' : null\"\n [style.--m-action-color]=\"fillColor(button)\"\n [style.--m-action-color-contrast]=\"contrastColor(button)\"\n [style.--m-action-label]=\"labelColor(button)\"\n (click)=\"select(button)\"\n >\n <ng-container\n *ngTemplateOutlet=\"buttonContent; context: { $implicit: button }\"\n />\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"m-action__btn\"\n [attr.data-testid]=\"(button.name || '') + '-btn'\"\n [attr.render-id]=\"renderIds()?.[button.name ?? '']\"\n [class.active]=\"isActive(button)\"\n [class.m-action__btn--icon-only]=\"isLabelHidden(button)\"\n [attr.aria-label]=\"isLabelHidden(button) ? (button.label | translate) : null\"\n [style.--m-action-color]=\"fillColor(button)\"\n [style.--m-action-color-contrast]=\"contrastColor(button)\"\n [style.--m-action-label]=\"labelColor(button)\"\n [disabled]=\"isDisabled(button.name)\"\n (click)=\"select(button)\"\n >\n <ng-container\n *ngTemplateOutlet=\"buttonContent; context: { $implicit: button }\"\n />\n </button>\n }\n }\n @if (menuButtons().length) {\n <!-- The Buttons the bar could not fit. Squeezed rather than dropped:\n an action the User can still reach behind one press beats an action\n that silently stopped existing at 400px. -->\n <m-context-menu\n class=\"m-action__overflow\"\n [config]=\"squeezeMenu()\"\n [remote]=\"remote() ?? config()?.remote\"\n (action)=\"onMenuAction($event)\"\n />\n }\n @if (!buttons.length) {\n <!-- A bar with nothing in it has no box, and a slot with no box is a slot\n nothing can be dropped on — the same rect an empty projected Card is\n given (m-one-ui `.card-drop-space`). -->\n <span class=\"m-action__drop\"></span>\n }\n </div>\n}\n\n<ng-template #buttonContent let-button>\n @if (button.icon) {\n <m-icon\n [name]=\"button.icon\"\n [color]=\"iconColor(button)\"\n [remote]=\"remote() ?? config()?.remote\"\n />\n }\n @if (button.label && !isLabelHidden(button)) {\n <span class=\"m-action__label\">{{ button.label | translate }}</span>\n }\n</ng-template>\n",
|
|
@@ -3729,6 +3769,10 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
3729
3769
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
3730
3770
|
encapsulation: ViewEncapsulation.None,
|
|
3731
3771
|
host: { "[class.m-action--host-sticky]": "sticky()" },
|
|
3772
|
+
providers: [{
|
|
3773
|
+
provide: ACTION_BUTTON_HOST,
|
|
3774
|
+
useValue: true
|
|
3775
|
+
}],
|
|
3732
3776
|
template: "@let buttons = actionButtons();\n<!-- No `config()` guard: a bar the Design editor folded its Buttons into has no\n `button_groups/<name>.yml` behind it — they ride on `[buttons]` instead\n (ADR 0009, ADR 0010) — so what decides whether the row exists is whether\n there are Buttons in it. Empty, it draws only on the Canvas, where it is\n the drop space a Button lands on. -->\n@if (buttons.length || isDesignMode) {\n <div\n class=\"m-action\"\n [class.m-action--stuck]=\"isStuck()\"\n [class.m-action--toggle]=\"resolvedVariant() === 'toggle'\"\n >\n @for (button of visibleButtons(); track $index) {\n <!-- A routed Button is a real link, so the browser's own affordances —\n a middle-click, open in new tab, the URL on hover — reach it. A\n disabled one stays a <button>: an <a> cannot be disabled, and a\n RouterLink on one would still navigate. -->\n @let link = isDisabled(button.name) ? undefined : linkOf(button);\n @if (link) {\n <a\n class=\"m-action__btn\"\n [routerLink]=\"link\"\n [attr.data-testid]=\"(button.name || '') + '-btn'\"\n [class.active]=\"isActive(button)\"\n [class.m-action__btn--icon-only]=\"isLabelHidden(button)\"\n [attr.aria-label]=\"isLabelHidden(button) ? (button.label | translate) : null\"\n [attr.aria-current]=\"isActive(button) ? 'page' : null\"\n [style.--m-action-color]=\"fillColor(button)\"\n [style.--m-action-color-contrast]=\"contrastColor(button)\"\n [style.--m-action-label]=\"labelColor(button)\"\n (click)=\"select(button)\"\n >\n <ng-container\n *ngTemplateOutlet=\"buttonContent; context: { $implicit: button }\"\n />\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"m-action__btn\"\n [attr.data-testid]=\"(button.name || '') + '-btn'\"\n [attr.render-id]=\"renderIds()?.[button.name ?? '']\"\n [class.active]=\"isActive(button)\"\n [class.m-action__btn--icon-only]=\"isLabelHidden(button)\"\n [attr.aria-label]=\"isLabelHidden(button) ? (button.label | translate) : null\"\n [style.--m-action-color]=\"fillColor(button)\"\n [style.--m-action-color-contrast]=\"contrastColor(button)\"\n [style.--m-action-label]=\"labelColor(button)\"\n [disabled]=\"isDisabled(button.name)\"\n (click)=\"select(button)\"\n >\n <ng-container\n *ngTemplateOutlet=\"buttonContent; context: { $implicit: button }\"\n />\n </button>\n }\n }\n @if (menuButtons().length) {\n <!-- The Buttons the bar could not fit. Squeezed rather than dropped:\n an action the User can still reach behind one press beats an action\n that silently stopped existing at 400px. -->\n <m-context-menu\n class=\"m-action__overflow\"\n [config]=\"squeezeMenu()\"\n [remote]=\"remote() ?? config()?.remote\"\n (action)=\"onMenuAction($event)\"\n />\n }\n @if (!buttons.length) {\n <!-- A bar with nothing in it has no box, and a slot with no box is a slot\n nothing can be dropped on — the same rect an empty projected Card is\n given (m-one-ui `.card-drop-space`). -->\n <span class=\"m-action__drop\"></span>\n }\n </div>\n}\n\n<ng-template #buttonContent let-button>\n @if (button.icon) {\n <m-icon\n [name]=\"button.icon\"\n [color]=\"iconColor(button)\"\n [remote]=\"remote() ?? config()?.remote\"\n />\n }\n @if (button.label && !isLabelHidden(button)) {\n <span class=\"m-action__label\">{{ button.label | translate }}</span>\n }\n</ng-template>\n",
|
|
3733
3777
|
styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}m-action,m-one-action{display:block;width:100%;grid-column:1/-1}m-action.m-action--host-sticky,m-one-action.m-action--host-sticky{position:sticky;top:0;z-index:50;background:color-mix(in srgb,var(--m-background) 92%,transparent);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}.m-action{display:flex;flex-wrap:nowrap;background:transparent;width:100%;border-bottom:1px solid var(--m-backdrop-border);--m-action-color: var(--m-button-color, var(--m-one-button-color, var(--m-mm)));--m-action-color-contrast: var(--m-button-color-contrast, var(--m-one-button-color-contrast, #ffffff))}.m-action--stuck{border-bottom-color:#00000014;box-shadow:0 2px 10px #0000000f}.m-action__btn{flex:1;min-width:0;padding:1rem 2rem;border:none;background:transparent;text-decoration:none;color:var(--m-action-label, var(--m-text));font-weight:300;font-size:.9rem;display:flex;align-items:center;justify-content:center;gap:.6rem;white-space:nowrap;overflow:hidden;cursor:pointer;border-right:1px solid var(--m-backdrop-border);transition:all .25s cubic-bezier(.4,0,.2,1)}.m-action__btn:last-child{border-right:none}.m-action__btn:hover{background:var(--m-background-lite);color:var(--m-action-color)}.m-action__btn .m-icon{transition:transform .2s ease}.m-action__btn:hover .m-icon{transform:scale(1.1)}.m-action__btn:disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.m-action__btn.active{color:var(--m-action-color);font-weight:500}.m-action__btn.m-action__btn--icon-only{padding:1rem .5rem;gap:0}.m-action--toggle .m-action__btn{position:relative;filter:grayscale(100%);transition:all .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1)}.m-action--toggle .m-action__btn.active{filter:none}.m-action--toggle .m-action__btn.active:hover:not(:disabled){filter:none}.m-action__overflow{display:flex;align-items:center;padding:0 .5rem;flex:0 0 auto}.m-action__drop{display:block;flex:1;min-height:3.5rem;margin:.5rem;border:1px dashed currentColor;border-radius:.25rem;opacity:.4;pointer-events:none}.m-action__label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}@container mag-grid (max-width: 767.98px){.m-action__btn{padding:1rem .75rem;gap:.4rem}}@container mag-grid (max-width: 575.98px){.m-action__btn{padding:.85rem .4rem;font-size:.8rem}}\n"]
|
|
3734
3778
|
}]
|
|
@@ -3743,6 +3787,10 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
3743
3787
|
required: false
|
|
3744
3788
|
}]
|
|
3745
3789
|
}],
|
|
3790
|
+
projected: [{
|
|
3791
|
+
type: i0.ContentChildren,
|
|
3792
|
+
args: [i0.forwardRef(() => ButtonComponent), { isSignal: true }]
|
|
3793
|
+
}],
|
|
3746
3794
|
variant: [{
|
|
3747
3795
|
type: i0.Input,
|
|
3748
3796
|
args: [{
|
|
@@ -10987,6 +11035,10 @@ const ModalStore = signalStore({ providedIn: "root" }, withState({
|
|
|
10987
11035
|
const viewportWidth = typeof window === "undefined" ? 0 : window.innerWidth;
|
|
10988
11036
|
return hasRoomToDock(base.width, width, viewportWidth) ? baseId : void 0;
|
|
10989
11037
|
};
|
|
11038
|
+
const replacePanel = (id) => {
|
|
11039
|
+
(state.panelTriggerMap()[id]?.providers?.find((p) => !!p && !Array.isArray(p) && "provide" in p && p.provide === MODAL_REF))?.useValue?.close(void 0);
|
|
11040
|
+
if (state.panelTriggerMap()[id]) closePanel(id);
|
|
11041
|
+
};
|
|
10990
11042
|
const openPanel = (panelTrigger) => {
|
|
10991
11043
|
const id = panelTrigger.id ?? getUniqueId();
|
|
10992
11044
|
const side = panelTrigger.side ?? "right";
|
|
@@ -10995,7 +11047,10 @@ const ModalStore = signalStore({ providedIn: "root" }, withState({
|
|
|
10995
11047
|
const isMobile = deviceService.isMobile();
|
|
10996
11048
|
if (panelTrigger.dock) {
|
|
10997
11049
|
const activeId = state.activePanel();
|
|
10998
|
-
if (activeId && state.panelTriggerMap()[activeId]?.dockedOver)
|
|
11050
|
+
if (activeId && state.panelTriggerMap()[activeId]?.dockedOver) replacePanel(activeId);
|
|
11051
|
+
} else if (panelTrigger.body !== void 0) {
|
|
11052
|
+
const sameId = Object.keys(state.panelTriggerMap()).find((key) => state.panelTriggerMap()[key]?.body === panelTrigger.body);
|
|
11053
|
+
if (sameId) replacePanel(sameId);
|
|
10999
11054
|
}
|
|
11000
11055
|
const dockedOver = panelTrigger.dock ? resolveDockTarget(side, width) : void 0;
|
|
11001
11056
|
const styles = isMobile ? {
|
|
@@ -11143,7 +11198,8 @@ const ModalStore = signalStore({ providedIn: "root" }, withState({
|
|
|
11143
11198
|
width: trigger.width,
|
|
11144
11199
|
height: trigger.height,
|
|
11145
11200
|
dock: trigger.dock,
|
|
11146
|
-
closeProhibited: trigger.closeProhibited
|
|
11201
|
+
closeProhibited: trigger.closeProhibited,
|
|
11202
|
+
body: trigger.screen ?? trigger.widget
|
|
11147
11203
|
});
|
|
11148
11204
|
modalRef.onClose((result) => {
|
|
11149
11205
|
trigger.onResult?.(result);
|
|
@@ -23915,7 +23971,7 @@ var WrapperInputComponent = class WrapperInputComponent extends ConfigComponent
|
|
|
23915
23971
|
break;
|
|
23916
23972
|
}
|
|
23917
23973
|
case InputType.PASSWORD: {
|
|
23918
|
-
const { PasswordInputComponent } = await import("./magmonium-one-password-
|
|
23974
|
+
const { PasswordInputComponent } = await import("./magmonium-one-password-CvgWZkAX.mjs");
|
|
23919
23975
|
this.createDynamicComponent(seq, PasswordInputComponent);
|
|
23920
23976
|
break;
|
|
23921
23977
|
}
|
|
@@ -23945,12 +24001,12 @@ var WrapperInputComponent = class WrapperInputComponent extends ConfigComponent
|
|
|
23945
24001
|
break;
|
|
23946
24002
|
}
|
|
23947
24003
|
case InputType.RANGE: {
|
|
23948
|
-
const { RangeInputComponent } = await import("./magmonium-one-range-
|
|
24004
|
+
const { RangeInputComponent } = await import("./magmonium-one-range-DlQfnl9p.mjs").then((n) => n.n);
|
|
23949
24005
|
this.createDynamicComponent(seq, RangeInputComponent);
|
|
23950
24006
|
break;
|
|
23951
24007
|
}
|
|
23952
24008
|
case InputType.MULTI_RANGE: {
|
|
23953
|
-
const { MultiRangeInputComponent } = await import("./magmonium-one-multi-range-
|
|
24009
|
+
const { MultiRangeInputComponent } = await import("./magmonium-one-multi-range-DL_JlKVL.mjs").then((n) => n.n);
|
|
23954
24010
|
this.createDynamicComponent(seq, MultiRangeInputComponent);
|
|
23955
24011
|
break;
|
|
23956
24012
|
}
|
|
@@ -26391,7 +26447,7 @@ var FileUploadInputComponent = class FileUploadInputComponent extends BaseInputC
|
|
|
26391
26447
|
openEditor = async (file, size) => {
|
|
26392
26448
|
const modalStore = this.modalStore;
|
|
26393
26449
|
if (!modalStore) return void 0;
|
|
26394
|
-
const { ImageEditorComponent } = await import("./magmonium-one-image-editor-
|
|
26450
|
+
const { ImageEditorComponent } = await import("./magmonium-one-image-editor-BLqlV2ki.mjs");
|
|
26395
26451
|
const ratio = String(this.config()?.ratio ?? "");
|
|
26396
26452
|
return new Promise((resolve) => {
|
|
26397
26453
|
const modalRef = new ModalRef();
|
|
@@ -45240,7 +45296,8 @@ var SidePanelDirective = class SidePanelDirective {
|
|
|
45240
45296
|
width: config.width,
|
|
45241
45297
|
height: config.height,
|
|
45242
45298
|
dock: config.dock,
|
|
45243
|
-
closeProhibited: config.closeProhibited
|
|
45299
|
+
closeProhibited: config.closeProhibited,
|
|
45300
|
+
body: config.component ?? (config.form ? `form:${config.form}` : void 0)
|
|
45244
45301
|
});
|
|
45245
45302
|
modalRef.onChange((result) => this.reported.emit(result));
|
|
45246
45303
|
modalRef.onClose((result) => {
|