@magmonium/one 0.4.86 → 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.
Files changed (27) hide show
  1. package/fesm2022/{magmonium-one-base-dropdown-9iIR64ME.mjs → magmonium-one-base-dropdown-2hgXcmhE.mjs} +4 -4
  2. package/fesm2022/{magmonium-one-base-dropdown-9iIR64ME.mjs.map → magmonium-one-base-dropdown-2hgXcmhE.mjs.map} +1 -1
  3. package/fesm2022/{magmonium-one-button-DO7FTwuF.mjs → magmonium-one-button-C5dk4R_m.mjs} +9 -3
  4. package/fesm2022/magmonium-one-button-C5dk4R_m.mjs.map +1 -0
  5. package/fesm2022/{magmonium-one-directives-DM6J1Hvs.mjs → magmonium-one-directives-hJ7wkmQn.mjs} +2 -2
  6. package/fesm2022/{magmonium-one-directives-DM6J1Hvs.mjs.map → magmonium-one-directives-hJ7wkmQn.mjs.map} +1 -1
  7. package/fesm2022/{magmonium-one-group-BsqCB8D2.mjs → magmonium-one-group-bRamdzPO.mjs} +3 -3
  8. package/fesm2022/{magmonium-one-group-BsqCB8D2.mjs.map → magmonium-one-group-bRamdzPO.mjs.map} +1 -1
  9. package/fesm2022/{magmonium-one-header-CgOV_m7w.mjs → magmonium-one-header-BZzD8uTJ.mjs} +2 -2
  10. package/fesm2022/{magmonium-one-header-CgOV_m7w.mjs.map → magmonium-one-header-BZzD8uTJ.mjs.map} +1 -1
  11. package/fesm2022/{magmonium-one-image-editor-B6eCXP9A.mjs → magmonium-one-image-editor-BLqlV2ki.mjs} +4 -4
  12. package/fesm2022/{magmonium-one-image-editor-B6eCXP9A.mjs.map → magmonium-one-image-editor-BLqlV2ki.mjs.map} +1 -1
  13. package/fesm2022/{magmonium-one-menu-CsoiLhVg.mjs → magmonium-one-menu-CJjjxFfu.mjs} +5 -5
  14. package/fesm2022/{magmonium-one-menu-CsoiLhVg.mjs.map → magmonium-one-menu-CJjjxFfu.mjs.map} +1 -1
  15. package/fesm2022/{magmonium-one-multi-range-RSLLKzLu.mjs → magmonium-one-multi-range-DL_JlKVL.mjs} +2 -2
  16. package/fesm2022/{magmonium-one-multi-range-RSLLKzLu.mjs.map → magmonium-one-multi-range-DL_JlKVL.mjs.map} +1 -1
  17. package/fesm2022/{magmonium-one-password-CJBa8k1l.mjs → magmonium-one-password-CvgWZkAX.mjs} +2 -2
  18. package/fesm2022/{magmonium-one-password-CJBa8k1l.mjs.map → magmonium-one-password-CvgWZkAX.mjs.map} +1 -1
  19. package/fesm2022/{magmonium-one-range-CqOSrC0Y.mjs → magmonium-one-range-DlQfnl9p.mjs} +2 -2
  20. package/fesm2022/{magmonium-one-range-CqOSrC0Y.mjs.map → magmonium-one-range-DlQfnl9p.mjs.map} +1 -1
  21. package/fesm2022/{magmonium-one-selector-CeqlecBa.mjs → magmonium-one-selector-BK48N5us.mjs} +4 -1
  22. package/fesm2022/{magmonium-one-selector-CeqlecBa.mjs.map → magmonium-one-selector-BK48N5us.mjs.map} +1 -1
  23. package/fesm2022/magmonium-one.mjs +79 -22
  24. package/fesm2022/magmonium-one.mjs.map +1 -1
  25. package/package.json +1 -1
  26. package/types/magmonium-one.d.ts +57 -22
  27. package/fesm2022/magmonium-one-button-DO7FTwuF.mjs.map +0 -1
@@ -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-CeqlecBa.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-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 { a as actionName, c as ReactiveElementComponent, d as shouldShowBadge, l as BadgeComponent, n as SECTION_FORM_CONTEXT, o as isButtonName, r as ImgComponent, s as enumValue, t as ButtonComponent, u as formatBadgeCount } from "./magmonium-one-button-DO7FTwuF.mjs";
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-DM6J1Hvs.mjs";
16
- import { t as HeaderComponent } from "./magmonium-one-header-CgOV_m7w.mjs";
17
- import { i as mergeUniqueWith, n as mergeUnique, r as mergeUniqueBy, t as ButtonGroupComponent } from "./magmonium-one-group-BsqCB8D2.mjs";
18
- import { n as ContextMenuBoxComponent, r as MenuComponent, t as ContextMenuComponent } from "./magmonium-one-menu-CsoiLhVg.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-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-RSLLKzLu.mjs";
26
- import { t as RangeInputComponent } from "./magmonium-one-range-CqOSrC0Y.mjs";
27
- import { n as DROPDOWN_IMPORTS, r as DROPDOWN_TEMPLATE, t as BaseDropdownComponent } from "./magmonium-one-base-dropdown-9iIR64ME.mjs";
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-CJBa8k1l.mjs");
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-CqOSrC0Y.mjs").then((n) => n.n);
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-RSLLKzLu.mjs").then((n) => n.n);
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
- return this.linkTrees().has(button) ? button.routerLink : void 0;
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.mergedButtons();
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.mergedButtons(), ...ngDevMode ? [{ debugName: "actionButtons" }] : /* istanbul ignore next */ []);
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) closePanel(activeId);
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-CJBa8k1l.mjs");
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-CqOSrC0Y.mjs").then((n) => n.n);
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-RSLLKzLu.mjs").then((n) => n.n);
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-B6eCXP9A.mjs");
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) => {