@magmonium/one 0.4.99 → 0.4.101
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{magmonium-one-attribute-value-CPh-lJPV.mjs → magmonium-one-attribute-value-BXEWw7xP.mjs} +3 -3
- package/fesm2022/{magmonium-one-attribute-value-CPh-lJPV.mjs.map → magmonium-one-attribute-value-BXEWw7xP.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-base-checkbox-LdM6dqF_.mjs → magmonium-one-base-checkbox-CIUMxkzu.mjs} +2 -2
- package/fesm2022/{magmonium-one-base-checkbox-LdM6dqF_.mjs.map → magmonium-one-base-checkbox-CIUMxkzu.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-base-dropdown-CmUfiOAb.mjs → magmonium-one-base-dropdown-BMsV5USo.mjs} +9 -11
- package/fesm2022/magmonium-one-base-dropdown-BMsV5USo.mjs.map +1 -0
- package/fesm2022/{magmonium-one-size-converter-BqkALIWA.mjs → magmonium-one-base-input-BeyBAbV4.mjs} +190 -3
- package/fesm2022/magmonium-one-base-input-BeyBAbV4.mjs.map +1 -0
- package/fesm2022/{magmonium-one-base-text-ChjG3GNw.mjs → magmonium-one-base-text-BBeMl8XM.mjs} +2 -2
- package/fesm2022/{magmonium-one-base-text-ChjG3GNw.mjs.map → magmonium-one-base-text-BBeMl8XM.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-button-C5dk4R_m.mjs → magmonium-one-button-DC_fLy-J.mjs} +34 -8
- package/fesm2022/magmonium-one-button-DC_fLy-J.mjs.map +1 -0
- package/fesm2022/{magmonium-one-checkbox-BXNvtkzo.mjs → magmonium-one-checkbox-C85FEuTs.mjs} +5 -6
- package/fesm2022/magmonium-one-checkbox-C85FEuTs.mjs.map +1 -0
- package/fesm2022/{magmonium-one-color-utl-BA51l-Rw.mjs → magmonium-one-color-utl-DMLkkE-z.mjs} +2 -2
- package/fesm2022/{magmonium-one-color-utl-BA51l-Rw.mjs.map → magmonium-one-color-utl-DMLkkE-z.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-directives-hJ7wkmQn.mjs → magmonium-one-directives-CJK7xDPK.mjs} +4 -4
- package/fesm2022/{magmonium-one-directives-hJ7wkmQn.mjs.map → magmonium-one-directives-CJK7xDPK.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-group-bRamdzPO.mjs → magmonium-one-group-qu3xLiI8.mjs} +16 -9
- package/fesm2022/magmonium-one-group-qu3xLiI8.mjs.map +1 -0
- package/fesm2022/{magmonium-one-header-BZzD8uTJ.mjs → magmonium-one-header-BC-74GOn.mjs} +5 -4
- package/fesm2022/{magmonium-one-header-BZzD8uTJ.mjs.map → magmonium-one-header-BC-74GOn.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-icon-CH-g8CUR.mjs → magmonium-one-icon-CXFTG4mD.mjs} +4 -4
- package/fesm2022/{magmonium-one-icon-CH-g8CUR.mjs.map → magmonium-one-icon-CXFTG4mD.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-image-editor-BV0x-SA3.mjs → magmonium-one-image-editor-BAF7cdC2.mjs} +5 -4
- package/fesm2022/{magmonium-one-image-editor-BV0x-SA3.mjs.map → magmonium-one-image-editor-BAF7cdC2.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-label-D-wnA_Fl.mjs → magmonium-one-label-BNxbDSwc.mjs} +2 -2
- package/fesm2022/{magmonium-one-label-D-wnA_Fl.mjs.map → magmonium-one-label-BNxbDSwc.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-m-ref-DLIAzywu.mjs → magmonium-one-m-ref-CoK96ogW.mjs} +2 -2
- package/fesm2022/{magmonium-one-m-ref-DLIAzywu.mjs.map → magmonium-one-m-ref-CoK96ogW.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-menu-CJjjxFfu.mjs → magmonium-one-menu-D_HAqfel.mjs} +7 -6
- package/fesm2022/{magmonium-one-menu-CJjjxFfu.mjs.map → magmonium-one-menu-D_HAqfel.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-multi-range-C0S7udf5.mjs → magmonium-one-multi-range-DqtW4U_x.mjs} +5 -4
- package/fesm2022/magmonium-one-multi-range-DqtW4U_x.mjs.map +1 -0
- package/fesm2022/{magmonium-one-options-asset-BNd1hbLw.mjs → magmonium-one-options-asset-DWjdYQe0.mjs} +2 -2
- package/fesm2022/{magmonium-one-options-asset-BNd1hbLw.mjs.map → magmonium-one-options-asset-DWjdYQe0.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-otp-CeSz8ZZ2.mjs → magmonium-one-otp-DOPvjYJz.mjs} +5 -5
- package/fesm2022/{magmonium-one-otp-CeSz8ZZ2.mjs.map → magmonium-one-otp-DOPvjYJz.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-password-BKdXAZ_p.mjs → magmonium-one-password-BqdyEDF6.mjs} +7 -6
- package/fesm2022/{magmonium-one-password-BKdXAZ_p.mjs.map → magmonium-one-password-BqdyEDF6.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-radio-DlS31qJG.mjs → magmonium-one-radio-DGTbRRXb.mjs} +3 -3
- package/fesm2022/{magmonium-one-radio-DlS31qJG.mjs.map → magmonium-one-radio-DGTbRRXb.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-range-CR8go24u.mjs → magmonium-one-range-Dw4YACtP.mjs} +4 -4
- package/fesm2022/{magmonium-one-range-CR8go24u.mjs.map → magmonium-one-range-Dw4YACtP.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-selector-BK48N5us.mjs → magmonium-one-selector-QB49Ju9l.mjs} +4 -4
- package/fesm2022/{magmonium-one-selector-BK48N5us.mjs.map → magmonium-one-selector-QB49Ju9l.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-text-4zWYsKpH.mjs → magmonium-one-text-CMULvvAr.mjs} +6 -7
- package/fesm2022/{magmonium-one-text-4zWYsKpH.mjs.map → magmonium-one-text-CMULvvAr.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-text-output-E6pe3IOL.mjs → magmonium-one-text-output-DiA4R1pw.mjs} +4 -4
- package/fesm2022/{magmonium-one-text-output-E6pe3IOL.mjs.map → magmonium-one-text-output-DiA4R1pw.mjs.map} +1 -1
- package/fesm2022/magmonium-one-theme-DEgFM1wD.mjs +1 -0
- package/fesm2022/{magmonium-one-toggle-BPInV6K-.mjs → magmonium-one-toggle-sUSXzxMl.mjs} +3 -5
- package/fesm2022/magmonium-one-toggle-sUSXzxMl.mjs.map +1 -0
- package/fesm2022/magmonium-one.mjs +109 -47
- package/fesm2022/magmonium-one.mjs.map +1 -1
- package/package.json +1 -1
- package/types/magmonium-one.d.ts +64 -38
- package/fesm2022/magmonium-one-base-dropdown-CmUfiOAb.mjs.map +0 -1
- package/fesm2022/magmonium-one-base-input-B92NOmxz.mjs +0 -183
- package/fesm2022/magmonium-one-base-input-B92NOmxz.mjs.map +0 -1
- package/fesm2022/magmonium-one-button-C5dk4R_m.mjs.map +0 -1
- package/fesm2022/magmonium-one-checkbox-BXNvtkzo.mjs.map +0 -1
- package/fesm2022/magmonium-one-group-bRamdzPO.mjs.map +0 -1
- package/fesm2022/magmonium-one-multi-range-C0S7udf5.mjs.map +0 -1
- package/fesm2022/magmonium-one-size-converter-BqkALIWA.mjs.map +0 -1
- package/fesm2022/magmonium-one-theme-BtQyLRdQ.mjs +0 -1
- package/fesm2022/magmonium-one-toggle-BPInV6K-.mjs.map +0 -1
package/fesm2022/{magmonium-one-selector-BK48N5us.mjs.map → magmonium-one-selector-QB49Ju9l.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
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
|
+
{"version":3,"file":"magmonium-one-selector-QB49Ju9l.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,10 +1,10 @@
|
|
|
1
1
|
import { t as __exportAll } from "./magmonium-one-rolldown-runtime-DpJrqANO.mjs";
|
|
2
|
-
import {
|
|
3
|
-
import { t as LabelComponent } from "./magmonium-one-label-
|
|
4
|
-
import { r as IconComponent } from "./magmonium-one-icon-
|
|
2
|
+
import { u as TranslatePipe } from "./magmonium-one-base-input-BeyBAbV4.mjs";
|
|
3
|
+
import { t as LabelComponent } from "./magmonium-one-label-BNxbDSwc.mjs";
|
|
4
|
+
import { r as IconComponent } from "./magmonium-one-icon-CXFTG4mD.mjs";
|
|
5
5
|
import { t as InputType } from "./magmonium-one-input-DqHPorA1.mjs";
|
|
6
|
-
import { t as BaseTextInputComponent } from "./magmonium-one-base-text-
|
|
7
|
-
import { t as TextOutputComponent } from "./magmonium-one-text-output-
|
|
6
|
+
import { t as BaseTextInputComponent } from "./magmonium-one-base-text-BBeMl8XM.mjs";
|
|
7
|
+
import { t as TextOutputComponent } from "./magmonium-one-text-output-DiA4R1pw.mjs";
|
|
8
8
|
import * as i0 from "@angular/core";
|
|
9
9
|
import { ChangeDetectionStrategy, Component, computed, input, model } from "@angular/core";
|
|
10
10
|
var text_exports = /* @__PURE__ */ __exportAll({ TextInputComponent: () => TextInputComponent });
|
|
@@ -17,7 +17,6 @@ var TextInputComponent = class TextInputComponent extends BaseTextInputComponent
|
|
|
17
17
|
touched = model(false, ...ngDevMode ? [{ debugName: "touched" }] : /* istanbul ignore next */ []);
|
|
18
18
|
focused = input(false, ...ngDevMode ? [{ debugName: "focused" }] : /* istanbul ignore next */ []);
|
|
19
19
|
errors = input([], ...ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []);
|
|
20
|
-
showErrors = computed(() => this.touched() && this.invalid(), ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
|
|
21
20
|
hideErrors = input(false, ...ngDevMode ? [{ debugName: "hideErrors" }] : /* istanbul ignore next */ []);
|
|
22
21
|
isNumber = computed(() => {
|
|
23
22
|
const config = this.config();
|
|
@@ -407,4 +406,4 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
407
406
|
});
|
|
408
407
|
export { text_exports as n, TextInputComponent as t };
|
|
409
408
|
|
|
410
|
-
//# sourceMappingURL=magmonium-one-text-
|
|
409
|
+
//# sourceMappingURL=magmonium-one-text-CMULvvAr.mjs.map
|
package/fesm2022/{magmonium-one-text-4zWYsKpH.mjs.map → magmonium-one-text-CMULvvAr.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"magmonium-one-text-
|
|
1
|
+
{"version":3,"file":"magmonium-one-text-CMULvvAr.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/input/ui/text/text.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n} from '@angular/core';\nimport { LabelComponent } from '../label';\nimport { TextOutputComponent } from '../../../text-output';\nimport { BaseTextInputComponent } from './base-text';\nimport { IconComponent } from '../../../icon';\nimport { TranslatePipe } from '../../../../pipe';\nimport { Input, InputType, NumberInput } from '../../model/input';\nimport { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\n\n/**\n * What this one component draws: a line of text, or the same line typed\n * `number`. WrapperInputComponent has no case for a `number` Field, so it\n * lands here — and the figures a NumberInput carries have to be readable off\n * the config the template already holds.\n */\nexport type TextOrNumberInput = Omit<Input, 'type'> &\n Pick<NumberInput, 'min' | 'max' | 'step'> & {\n type: InputType.TEXT | InputType.NUMBER;\n };\n\n@Component({\n selector: 'm-text-input',\n template: `\n @if (config(); as text) {\n @if (text.label) {\n <m-label\n [for]=\"text.name ?? ''\"\n [placeholder]=\"text.label\"\n [params]=\"text.params\"\n [noTranslate]=\"text.noTranslate\"\n [required]=\"required()\"\n [disabled]=\"disabled()\"\n />\n }\n <div class=\"input-wrapper\">\n @if (text.icon) {\n <m-icon\n [name]=\"text.icon\"\n [color]=\"iconColor()\"\n [one]=\"text.one\"\n />\n }\n @if (text.prefix) {\n <span class=\"input-prefix\">{{ text.prefix }}</span>\n }\n <input\n [id]=\"text.name ?? ''\"\n [attr.data-testid]=\"text.testid ?? (text.name ? text.name + '-input' : null)\"\n [value]=\"value()\"\n #inputElement\n [class.error]=\"showErrors()\"\n [class.has-icon]=\"!!text.icon\"\n [class.has-prefix]=\"!!text.prefix\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly() || config()?.readonly\"\n [placeholder]=\"text.placeholder ?? '' | translate: text.params\"\n (input)=\"onInput($event)\"\n (focus)=\"isFocused.set(true)\"\n (blur)=\"isFocused.set(false); touched.set(true)\"\n [type]=\"isNumber() ? 'number' : 'text'\"\n [attr.min]=\"isNumber() ? text.min ?? null : null\"\n [attr.max]=\"isNumber() ? text.max ?? null : null\"\n [attr.step]=\"isNumber() ? text.step ?? null : null\"\n />\n @if (config()?.status; as status) {\n <div class=\"input-indicator\" [class]=\"'input-indicator--' + status\">\n @if (status === 'checking') {\n <span class=\"spinner\"></span>\n } @else if (status === 'available') {\n <m-icon name=\"check\" color=\"success\" />\n }\n </div>\n }\n @if (text.suffix) {\n <span class=\"input-suffix\">{{ text.suffix }}</span>\n }\n </div>\n @if (showErrors() && !hideErrors()) {\n @for (error of errors(); track $index) {\n <m-text-output\n variant=\"footer\"\n color=\"error\"\n [label]=\"error.message\"\n />\n }\n }\n }\n `,\n imports: [LabelComponent, TextOutputComponent, IconComponent, TranslatePipe],\n styleUrl: './text.sass',\n host: {\n '[class]': \"config()?.variant ? 'm-input--' + config()?.variant : ''\",\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TextInputComponent extends BaseTextInputComponent<TextOrNumberInput> {\n public override value = model<string>('');\n public override config = input<Partial<TextOrNumberInput> | undefined>();\n public override required = input<boolean>(false);\n public override disabled = input<boolean>(false);\n public override invalid = input<boolean>(false);\n public override touched = model<boolean>(false);\n public override focused = input<boolean>(false);\n public override errors = input<readonly WithOptionalFieldTree<ValidationError>[]>(\n []\n );\n readonly hideErrors = input<boolean>(false);\n\n // A `number` Field draws this same component (WrapperInputComponent has no\n // case of its own for it), so the type it declares decides the element it\n // draws. What *leaves* the field is coerced a level up, in the wrapper: an\n // `<input>` reads its value as text whatever its type, and every other\n // component on this base is a string field.\n protected readonly isNumber = computed(() => {\n const config = this.config();\n return !!config && config.type === InputType.NUMBER;\n });\n\n protected onInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.setValue(target?.value ?? '');\n }\n}\n"],"mappings":"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"}
|
package/fesm2022/{magmonium-one-text-output-E6pe3IOL.mjs → magmonium-one-text-output-DiA4R1pw.mjs}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { n as resolvePallet } from "./magmonium-one-color-utl-
|
|
3
|
-
import { r as ConfigComponent, t as toAttrBool } from "./magmonium-one-attribute-value-
|
|
1
|
+
import { d as TranslateService, st as LAYOUT_ASSET_FOLDER } from "./magmonium-one-base-input-BeyBAbV4.mjs";
|
|
2
|
+
import { n as resolvePallet } from "./magmonium-one-color-utl-DMLkkE-z.mjs";
|
|
3
|
+
import { r as ConfigComponent, t as toAttrBool } from "./magmonium-one-attribute-value-BXEWw7xP.mjs";
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
import { ChangeDetectionStrategy, Component, computed, inject, input, model, output } from "@angular/core";
|
|
6
6
|
var TextOutputComponent = class TextOutputComponent extends ConfigComponent {
|
|
@@ -311,4 +311,4 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
311
311
|
});
|
|
312
312
|
export { TextOutputComponent as t };
|
|
313
313
|
|
|
314
|
-
//# sourceMappingURL=magmonium-one-text-output-
|
|
314
|
+
//# sourceMappingURL=magmonium-one-text-output-DiA4R1pw.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"magmonium-one-text-output-E6pe3IOL.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/text-output/ui/text-output.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n model,\n output,\n} from '@angular/core';\nimport { TranslateService } from '../../../services/translate';\nimport { ConfigComponent } from '../../../lib/components/config-component';\nimport { Config } from '../../../type/config/config-type';\nimport { LAYOUT_ASSET_FOLDER } from '../../../enum';\nimport { toAttrBool } from '../../../functions/config/attribute-value';\nimport { resolvePallet } from '../../../lib/theme/lib/color-utl';\n\nexport type TextOutputAlign = 'left' | 'right' | 'center';\n\n// Variants are roles, not styles: each one says what the text is doing on the\n// page, and the Section it sits in decides how big that role renders. Every\n// size below is therefore an `em` multiple of the inherited Section font-size\n// — a `lead` in a compact Section stays proportionally a lead — which is the\n// one rule the plain (undefined) variant keeps by inheriting outright.\n//\n// - `lead` opening paragraph that introduces the block under it\n// - `big` one-line statement — a number, a verdict, a headline that is\n// not a SectionHeader\n// - `bold` emphasis at body size, for the line that must be read first\n// - `footer` annotation under the thing it describes — a field's validation\n// message, a caption, a disclaimer; 0.75 of body, body colour\n// - `footnote` aside the reader may skip — source, legal line, small print;\n// 0.6 of body, body colour\n// - `link` text that goes somewhere on click — an affordance rather than\n// a size, so it is the one role that stays inline, takes focus,\n// and emits `clicked`\n// - `link-small` the same affordance for a link that trails the content it\n// belongs to rather than carrying a line of its own — a \"see\n// all\", an \"edit\" beside a field; body size like `link`\nexport type TextOutputVariant =\n | 'lead'\n | 'big'\n | 'bold'\n | 'footer'\n | 'footnote'\n | 'link'\n | 'link-small';\n\n// Weight tokens of the type scale. Applied after the variant, so it overrides\n// the weight a role implies (`lead` light, `big` semibold, `bold` bold).\nexport type TextOutputFontWeight =\n | 'light'\n | 'normal'\n | 'medium'\n | 'semibold'\n | 'bold';\n\nexport interface TextOutputConfig extends Config {\n label?: string;\n noTranslate?: boolean;\n align?: TextOutputAlign;\n variant?: TextOutputVariant;\n color?: string;\n fontWeight?: TextOutputFontWeight;\n}\n\n@Component({\n selector: 'm-text-output',\n imports: [],\n template: `\n <div\n class=\"m-text-output\"\n [style.color]=\"resolvedColorPallet().color\"\n [innerHTML]=\"html()\"\n ></div>\n `,\n styleUrl: './text-output.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'm-text-output-host',\n '[class.is-design-mode]': 'isDesignMode',\n '[class.align-left]': 'resolvedAlign() === \"left\"',\n '[class.align-right]': 'resolvedAlign() === \"right\"',\n '[class.align-center]': 'resolvedAlign() === \"center\"',\n '[class.variant-lead]': 'resolvedVariant() === \"lead\"',\n '[class.variant-big]': 'resolvedVariant() === \"big\"',\n '[class.variant-bold]': 'resolvedVariant() === \"bold\"',\n '[class.variant-footer]': 'resolvedVariant() === \"footer\"',\n '[class.variant-footnote]': 'resolvedVariant() === \"footnote\"',\n '[class.variant-link]': 'resolvedVariant() === \"link\"',\n '[class.variant-link-small]': 'resolvedVariant() === \"link-small\"',\n '[class.weight-light]': 'resolvedFontWeight() === \"light\"',\n '[class.weight-normal]': 'resolvedFontWeight() === \"normal\"',\n '[class.weight-medium]': 'resolvedFontWeight() === \"medium\"',\n '[class.weight-semibold]': 'resolvedFontWeight() === \"semibold\"',\n '[class.weight-bold]': 'resolvedFontWeight() === \"bold\"',\n '[class.has-color]': '!!(color() ?? config()?.color)',\n '[class.is-truncated]': '!!truncate()',\n // Only a link is reachable and announced as one. Every other variant is a\n // size, and a focus stop on plain text is a tab stop that does nothing.\n '[attr.role]': 'isLink() ? \"link\" : null',\n '[attr.tabindex]': 'isLink() ? 0 : null',\n '(click)': 'onClick()',\n '(keydown.enter)': 'onClick()',\n '[style.--m-text-output-color]': 'resolvedColorPallet().color',\n '[style.--m-text-output-color-contrast]': 'resolvedColorPallet().contrastColor',\n '[style.--m-text-output-color-opposite]': 'resolvedColorPallet().oppositeColor',\n },\n})\nexport class TextOutputComponent extends ConfigComponent<TextOutputConfig> {\n override subFolder = LAYOUT_ASSET_FOLDER.text_output;\n override config = model<Partial<TextOutputConfig>>();\n private readonly translateService = inject(TranslateService);\n\n readonly align = input<TextOutputAlign | undefined>(undefined);\n readonly variant = input<TextOutputVariant | undefined>(undefined);\n // A theme colour key (`error`, `warning`, `success`, …) or a raw CSS colour,\n // resolved the same way an Icon's or a Logo's is so a token follows the\n // active theme instead of freezing one theme's hex into a template.\n readonly color = input<string | undefined>(undefined);\n readonly fontWeight = input<TextOutputFontWeight | undefined>(undefined);\n // `label` is the text itself, so a one-off TextOutput needs no asset behind\n // it (ADR 0010). Numeric display values are stringified before entering the\n // text and translation pipeline.\n readonly label = input<string | number | undefined>(undefined);\n readonly noTranslate = input<boolean | string | undefined>(undefined);\n // Values for the message's `<name>` / `<$name>` placeholders. An input and\n // deliberately not a TextOutputConfig key: an asset is resolved by name and\n // shared across every Control that names it, and these differ per render\n // (ADR 0020). The query-string form (`min_length?len=6`) still works and\n // still loses to this on a shared placeholder, that being the precedence\n // TranslateService already had. Bind a named member — an object literal in a\n // template is refused by `no-inline-config` (ADR 0010).\n readonly params = input<Record<string, string> | undefined>(undefined);\n // One line, cut with an ellipsis at the box's edge rather than wrapping or\n // spilling into a neighbour. For text whose length says nothing about the\n // layout — a bound path drawn as `{store.a.b.c}` on the design Canvas.\n readonly truncate = input<boolean | undefined>(undefined);\n\n readonly resolvedAlign = computed<TextOutputAlign>(\n () => this.align() ?? this.config()?.align ?? 'left'\n );\n\n protected readonly resolvedVariant = computed<TextOutputVariant | undefined>(\n () => this.variant() ?? this.config()?.variant\n );\n\n protected readonly resolvedFontWeight = computed<\n TextOutputFontWeight | undefined\n >(() => this.fontWeight() ?? this.config()?.fontWeight);\n\n // Both link roles are the same affordance, so both take the focus stop, the\n // `role=\"link\"` and the `clicked` output; only their size differs.\n protected readonly isLink = computed(() => {\n const variant = this.resolvedVariant();\n return variant === 'link' || variant === 'link-small';\n });\n\n /**\n * Fired by a `link` variant and by nothing else. A text that is not a link\n * draws no affordance and takes no focus, so a click on it is a click on\n * prose — emitting there would be a control only a mouse could find.\n *\n * Where the link goes to a route instead, the caller attaches `routerLink`\n * and binds nothing here: one click means one thing.\n */\n readonly clicked = output<void>();\n\n protected onClick(): void {\n if (this.isLink()) this.clicked.emit();\n }\n\n protected readonly resolvedColorPallet = computed(() =>\n resolvePallet(\n this.color() ?? this.config()?.color ?? this.defaultColor,\n this.themeStore.color()\n )\n );\n\n protected override resolveComponentOverrides(): Partial<TextOutputConfig> {\n const overrides: Partial<TextOutputConfig> = {};\n const align = this.align();\n if (align !== undefined) overrides.align = align;\n const label = this.label();\n if (label !== undefined) overrides.label = String(label);\n const noTranslate = toAttrBool(this.noTranslate());\n if (noTranslate !== undefined) overrides.noTranslate = noTranslate;\n const variant = this.variant();\n if (variant !== undefined) overrides.variant = variant;\n const color = this.color();\n if (color !== undefined) overrides.color = color;\n const fontWeight = this.fontWeight();\n if (fontWeight !== undefined) overrides.fontWeight = fontWeight;\n return overrides;\n }\n\n protected readonly resolvedLabel = computed(() => this.config()?.label);\n protected readonly shouldTranslate = computed(\n () => !this.config()?.noTranslate\n );\n protected readonly html = computed(() => {\n const label = this.resolvedLabel();\n return this.shouldTranslate()\n ? this.translateService.translateToHtml(label, this.params())\n : this.translateService.toSafeHtml(label);\n });\n}\n"],"mappings":";;;;;AA4GA,IAAa,sBAAb,MAAa,4BAA4B,gBAAiC;CAC/D,YAAY,oBAAoB;CAChC,SAAS,MAAkC,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACnC,mBAAmB,OAAO,gBAAgB;CAElD,QAAQ,MAAmC,QAAU,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACrD,UAAU,MAAqC,QAAU,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAIzD,QAAQ,MAA0B,QAAU,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAC5C,aAAa,MAAwC,QAAU,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAI/D,QAAQ,MAAmC,QAAU,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACrD,cAAc,MAAoC,QAAU,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAQ5D,SAAS,MAA0C,QAAU,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAI7D,WAAW,MAA2B,QAAU,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAEhD,gBAAgB,eACjB,KAAK,MAAK,KAAM,KAAK,OAAM,CAAE,EAAE,SAAS,QAC/C,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,kBAAkB,eAC7B,KAAK,QAAO,KAAM,KAAK,OAAM,CAAE,EAAE,SACxC,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,qBAAqB,eAEhC,KAAK,WAAU,KAAM,KAAK,OAAM,CAAE,EAAE,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,qBAAA,CAAA,+BAAA,CAAA,CAAA;CAIpC,SAAS,eAAc;EACxC,MAAM,UAAU,KAAK,gBAAe;EACpC,OAAO,YAAY,UAAU,YAAY;CAC3C,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAUO,UAAU,OAAM;CAEf,UAAO;EACf,IAAI,KAAK,OAAM,GAAI,KAAK,QAAQ,KAAI;CACtC;CAEmB,sBAAsB,eACvC,cACE,KAAK,MAAK,KAAM,KAAK,OAAM,CAAE,EAAE,SAAS,KAAK,cAC7C,KAAK,WAAW,MAAK,CAAE,GAE1B,GAAA,YAAA,CAAA,EAAA,WAAA,sBAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,4BAAyB;EAC1C,MAAM,YAAuC,CAAA;EAC7C,MAAM,QAAQ,KAAK,MAAK;EACxB,IAAI,UAAU,QAAW,UAAU,QAAQ;EAC3C,MAAM,QAAQ,KAAK,MAAK;EACxB,IAAI,UAAU,QAAW,UAAU,QAAQ,OAAO,KAAK;EACvD,MAAM,cAAc,WAAW,KAAK,YAAW,CAAE;EACjD,IAAI,gBAAgB,QAAW,UAAU,cAAc;EACvD,MAAM,UAAU,KAAK,QAAO;EAC5B,IAAI,YAAY,QAAW,UAAU,UAAU;EAC/C,MAAM,QAAQ,KAAK,MAAK;EACxB,IAAI,UAAU,QAAW,UAAU,QAAQ;EAC3C,MAAM,aAAa,KAAK,WAAU;EAClC,IAAI,eAAe,QAAW,UAAU,aAAa;EACrD,OAAO;CACT;CAEmB,gBAAgB,eAAe,KAAK,OAAM,CAAE,EAAE,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CACpD,kBAAkB,eAC7B,CAAC,KAAK,OAAM,CAAE,EAAE,aACvB,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CACkB,OAAO,eAAc;EACtC,MAAM,QAAQ,KAAK,cAAa;EAChC,OAAO,KAAK,gBAAe,IACvB,KAAK,iBAAiB,gBAAgB,OAAO,KAAK,OAAM,CAAE,IAC1D,KAAK,iBAAiB,WAAW,KAAK;CAC5C,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAhGS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAmB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,QAAA;GAAA,SAAA;EAAA;EAAA,MAAA;GAAA,WAAA;IAAA,SAAA;IAAA,iBAAA;GAAA;GAAA,YAAA;IAAA,wBAAA;IAAA,oBAAA;IAAA,qBAAA;IAAA,sBAAA;IAAA,sBAAA;IAAA,qBAAA;IAAA,sBAAA;IAAA,wBAAA;IAAA,0BAAA;IAAA,sBAAA;IAAA,4BAAA;IAAA,sBAAA;IAAA,uBAAA;IAAA,uBAAA;IAAA,yBAAA;IAAA,qBAAA;IAAA,mBAAA;IAAA,sBAAA;IAAA,aAAA;IAAA,iBAAA;IAAA,+BAAA;IAAA,wCAAA;IAAA,wCAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,iBAAA;EAAA,UAAA;EAAA,UAxCpB;;;;;;;EAMT,UAAA;EAAA,QAAA,CAAA,ogKAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAkCU,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EA3C/B,MAAA;EACW,MAAA,CAAA;GAAA,UAAA;GAAe,SAChB,CAAA;GAAE,UACD;;;;;;;GAMT,iBAEgB,wBAAwB;GAAM,MACzC;IACJ,OAAO;IACP,0BAA0B;IAC1B,sBAAsB;IACtB,uBAAuB;IACvB,wBAAwB;IACxB,wBAAwB;IACxB,uBAAuB;IACvB,wBAAwB;IACxB,0BAA0B;IAC1B,4BAA4B;IAC5B,wBAAwB;IACxB,8BAA8B;IAC9B,wBAAwB;IACxB,yBAAyB;IACzB,yBAAyB;IACzB,2BAA2B;IAC3B,uBAAuB;IACvB,qBAAqB;IACrB,wBAAwB;IAGxB,eAAe;IACf,mBAAmB;IACnB,WAAW;IACX,mBAAmB;IACnB,iCAAiC;IACjC,0CAA0C;IAC1C,0CAA0C;GAC3C;GAAA,QAAA,CAAA,ogKAAA;EAAA,CAAA"}
|
|
1
|
+
{"version":3,"file":"magmonium-one-text-output-DiA4R1pw.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/text-output/ui/text-output.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n model,\n output,\n} from '@angular/core';\nimport { TranslateService } from '../../../services/translate';\nimport { ConfigComponent } from '../../../lib/components/config-component';\nimport { Config } from '../../../type/config/config-type';\nimport { LAYOUT_ASSET_FOLDER } from '../../../enum';\nimport { toAttrBool } from '../../../functions/config/attribute-value';\nimport { resolvePallet } from '../../../lib/theme/lib/color-utl';\n\nexport type TextOutputAlign = 'left' | 'right' | 'center';\n\n// Variants are roles, not styles: each one says what the text is doing on the\n// page, and the Section it sits in decides how big that role renders. Every\n// size below is therefore an `em` multiple of the inherited Section font-size\n// — a `lead` in a compact Section stays proportionally a lead — which is the\n// one rule the plain (undefined) variant keeps by inheriting outright.\n//\n// - `lead` opening paragraph that introduces the block under it\n// - `big` one-line statement — a number, a verdict, a headline that is\n// not a SectionHeader\n// - `bold` emphasis at body size, for the line that must be read first\n// - `footer` annotation under the thing it describes — a field's validation\n// message, a caption, a disclaimer; 0.75 of body, body colour\n// - `footnote` aside the reader may skip — source, legal line, small print;\n// 0.6 of body, body colour\n// - `link` text that goes somewhere on click — an affordance rather than\n// a size, so it is the one role that stays inline, takes focus,\n// and emits `clicked`\n// - `link-small` the same affordance for a link that trails the content it\n// belongs to rather than carrying a line of its own — a \"see\n// all\", an \"edit\" beside a field; body size like `link`\nexport type TextOutputVariant =\n | 'lead'\n | 'big'\n | 'bold'\n | 'footer'\n | 'footnote'\n | 'link'\n | 'link-small';\n\n// Weight tokens of the type scale. Applied after the variant, so it overrides\n// the weight a role implies (`lead` light, `big` semibold, `bold` bold).\nexport type TextOutputFontWeight =\n | 'light'\n | 'normal'\n | 'medium'\n | 'semibold'\n | 'bold';\n\nexport interface TextOutputConfig extends Config {\n label?: string;\n noTranslate?: boolean;\n align?: TextOutputAlign;\n variant?: TextOutputVariant;\n color?: string;\n fontWeight?: TextOutputFontWeight;\n}\n\n@Component({\n selector: 'm-text-output',\n imports: [],\n template: `\n <div\n class=\"m-text-output\"\n [style.color]=\"resolvedColorPallet().color\"\n [innerHTML]=\"html()\"\n ></div>\n `,\n styleUrl: './text-output.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'm-text-output-host',\n '[class.is-design-mode]': 'isDesignMode',\n '[class.align-left]': 'resolvedAlign() === \"left\"',\n '[class.align-right]': 'resolvedAlign() === \"right\"',\n '[class.align-center]': 'resolvedAlign() === \"center\"',\n '[class.variant-lead]': 'resolvedVariant() === \"lead\"',\n '[class.variant-big]': 'resolvedVariant() === \"big\"',\n '[class.variant-bold]': 'resolvedVariant() === \"bold\"',\n '[class.variant-footer]': 'resolvedVariant() === \"footer\"',\n '[class.variant-footnote]': 'resolvedVariant() === \"footnote\"',\n '[class.variant-link]': 'resolvedVariant() === \"link\"',\n '[class.variant-link-small]': 'resolvedVariant() === \"link-small\"',\n '[class.weight-light]': 'resolvedFontWeight() === \"light\"',\n '[class.weight-normal]': 'resolvedFontWeight() === \"normal\"',\n '[class.weight-medium]': 'resolvedFontWeight() === \"medium\"',\n '[class.weight-semibold]': 'resolvedFontWeight() === \"semibold\"',\n '[class.weight-bold]': 'resolvedFontWeight() === \"bold\"',\n '[class.has-color]': '!!(color() ?? config()?.color)',\n '[class.is-truncated]': '!!truncate()',\n // Only a link is reachable and announced as one. Every other variant is a\n // size, and a focus stop on plain text is a tab stop that does nothing.\n '[attr.role]': 'isLink() ? \"link\" : null',\n '[attr.tabindex]': 'isLink() ? 0 : null',\n '(click)': 'onClick()',\n '(keydown.enter)': 'onClick()',\n '[style.--m-text-output-color]': 'resolvedColorPallet().color',\n '[style.--m-text-output-color-contrast]': 'resolvedColorPallet().contrastColor',\n '[style.--m-text-output-color-opposite]': 'resolvedColorPallet().oppositeColor',\n },\n})\nexport class TextOutputComponent extends ConfigComponent<TextOutputConfig> {\n override subFolder = LAYOUT_ASSET_FOLDER.text_output;\n override config = model<Partial<TextOutputConfig>>();\n private readonly translateService = inject(TranslateService);\n\n readonly align = input<TextOutputAlign | undefined>(undefined);\n readonly variant = input<TextOutputVariant | undefined>(undefined);\n // A theme colour key (`error`, `warning`, `success`, …) or a raw CSS colour,\n // resolved the same way an Icon's or a Logo's is so a token follows the\n // active theme instead of freezing one theme's hex into a template.\n readonly color = input<string | undefined>(undefined);\n readonly fontWeight = input<TextOutputFontWeight | undefined>(undefined);\n // `label` is the text itself, so a one-off TextOutput needs no asset behind\n // it (ADR 0010). Numeric display values are stringified before entering the\n // text and translation pipeline.\n readonly label = input<string | number | undefined>(undefined);\n readonly noTranslate = input<boolean | string | undefined>(undefined);\n // Values for the message's `<name>` / `<$name>` placeholders. An input and\n // deliberately not a TextOutputConfig key: an asset is resolved by name and\n // shared across every Control that names it, and these differ per render\n // (ADR 0020). The query-string form (`min_length?len=6`) still works and\n // still loses to this on a shared placeholder, that being the precedence\n // TranslateService already had. Bind a named member — an object literal in a\n // template is refused by `no-inline-config` (ADR 0010).\n readonly params = input<Record<string, string> | undefined>(undefined);\n // One line, cut with an ellipsis at the box's edge rather than wrapping or\n // spilling into a neighbour. For text whose length says nothing about the\n // layout — a bound path drawn as `{store.a.b.c}` on the design Canvas.\n readonly truncate = input<boolean | undefined>(undefined);\n\n readonly resolvedAlign = computed<TextOutputAlign>(\n () => this.align() ?? this.config()?.align ?? 'left'\n );\n\n protected readonly resolvedVariant = computed<TextOutputVariant | undefined>(\n () => this.variant() ?? this.config()?.variant\n );\n\n protected readonly resolvedFontWeight = computed<\n TextOutputFontWeight | undefined\n >(() => this.fontWeight() ?? this.config()?.fontWeight);\n\n // Both link roles are the same affordance, so both take the focus stop, the\n // `role=\"link\"` and the `clicked` output; only their size differs.\n protected readonly isLink = computed(() => {\n const variant = this.resolvedVariant();\n return variant === 'link' || variant === 'link-small';\n });\n\n /**\n * Fired by a `link` variant and by nothing else. A text that is not a link\n * draws no affordance and takes no focus, so a click on it is a click on\n * prose — emitting there would be a control only a mouse could find.\n *\n * Where the link goes to a route instead, the caller attaches `routerLink`\n * and binds nothing here: one click means one thing.\n */\n readonly clicked = output<void>();\n\n protected onClick(): void {\n if (this.isLink()) this.clicked.emit();\n }\n\n protected readonly resolvedColorPallet = computed(() =>\n resolvePallet(\n this.color() ?? this.config()?.color ?? this.defaultColor,\n this.themeStore.color()\n )\n );\n\n protected override resolveComponentOverrides(): Partial<TextOutputConfig> {\n const overrides: Partial<TextOutputConfig> = {};\n const align = this.align();\n if (align !== undefined) overrides.align = align;\n const label = this.label();\n if (label !== undefined) overrides.label = String(label);\n const noTranslate = toAttrBool(this.noTranslate());\n if (noTranslate !== undefined) overrides.noTranslate = noTranslate;\n const variant = this.variant();\n if (variant !== undefined) overrides.variant = variant;\n const color = this.color();\n if (color !== undefined) overrides.color = color;\n const fontWeight = this.fontWeight();\n if (fontWeight !== undefined) overrides.fontWeight = fontWeight;\n return overrides;\n }\n\n protected readonly resolvedLabel = computed(() => this.config()?.label);\n protected readonly shouldTranslate = computed(\n () => !this.config()?.noTranslate\n );\n protected readonly html = computed(() => {\n const label = this.resolvedLabel();\n return this.shouldTranslate()\n ? this.translateService.translateToHtml(label, this.params())\n : this.translateService.toSafeHtml(label);\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "./magmonium-one-color-utl-DMLkkE-z.mjs";
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as BaseInputComponent } from "./magmonium-one-base-input-B92NOmxz.mjs";
|
|
1
|
+
import { t as BaseInputComponent, u as TranslatePipe } from "./magmonium-one-base-input-BeyBAbV4.mjs";
|
|
3
2
|
import * as i0 from "@angular/core";
|
|
4
|
-
import { ChangeDetectionStrategy, Component,
|
|
3
|
+
import { ChangeDetectionStrategy, Component, input, model } from "@angular/core";
|
|
5
4
|
var ToggleInputComponent = class ToggleInputComponent extends BaseInputComponent {
|
|
6
5
|
value = void 0;
|
|
7
6
|
checked = model(false);
|
|
@@ -12,7 +11,6 @@ var ToggleInputComponent = class ToggleInputComponent extends BaseInputComponent
|
|
|
12
11
|
touched = model(false, ...ngDevMode ? [{ debugName: "touched" }] : /* istanbul ignore next */ []);
|
|
13
12
|
focused = input(false, ...ngDevMode ? [{ debugName: "focused" }] : /* istanbul ignore next */ []);
|
|
14
13
|
errors = input([], ...ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []);
|
|
15
|
-
showErrors = computed(() => this.touched() && this.invalid(), ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
|
|
16
14
|
constructor() {
|
|
17
15
|
super();
|
|
18
16
|
}
|
|
@@ -228,4 +226,4 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
228
226
|
});
|
|
229
227
|
export { ToggleInputComponent };
|
|
230
228
|
|
|
231
|
-
//# sourceMappingURL=magmonium-one-toggle-
|
|
229
|
+
//# sourceMappingURL=magmonium-one-toggle-sUSXzxMl.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"magmonium-one-toggle-sUSXzxMl.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/input/ui/toggle/toggle.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n input,\n model,\n ModelSignal,\n} from '@angular/core';\nimport { ToggleInput } from '../../model/input';\nimport { TranslatePipe } from '../../../../pipe/translate';\nimport {\n FormCheckboxControl,\n ValidationError,\n WithOptionalFieldTree,\n} from '@angular/forms/signals';\nimport { BaseInputComponent } from '../../lib/base-input';\n\n@Component({\n selector: 'm-toggle-input',\n template: `\n @if (config(); as toggle) {\n <div class=\"toggle\">\n <input\n [id]=\"toggle.name ?? ''\"\n [checked]=\"checked()\"\n (change)=\"onChange($event)\"\n type=\"checkbox\"\n />\n <label [attr.for]=\"toggle.name || null\">{{\n toggle.label | translate\n }}</label>\n </div>\n }\n `,\n imports: [TranslatePipe],\n styleUrl: './toggle.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ToggleInputComponent\n extends BaseInputComponent<ToggleInput>\n implements FormCheckboxControl\n{\n public value = undefined;\n public checked = model<boolean>(false) as ModelSignal<boolean>;\n public override config = input<Partial<ToggleInput> | undefined>();\n public override required = input<boolean>(false);\n public override disabled = input<boolean>(false);\n public override invalid = input<boolean>(false);\n public override touched = model<boolean>(false);\n public override focused = input<boolean>(false);\n public override errors = input<readonly WithOptionalFieldTree<ValidationError>[]>(\n []\n );\n\n /** Required by FormCheckboxControl interface */\n // public readonly checked: ModelSignal<boolean> = this.value; // Already defined above\n\n constructor() {\n super();\n }\n\n protected onChange(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.checked.set(target?.checked ?? false);\n }\n}\n"],"mappings":";;;AAqCA,IAAa,uBAAb,MAAa,6BACH,mBAA+B;CAGhC,QAAQ;CACR,UAAU,MAAe,KAAK;CACrB,SAAS,MAAyC,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAClD,WAAW,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAChC,WAAW,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAChC,UAAU,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAC/B,UAAU,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAC/B,UAAU,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAC/B,SAAS,MACvB,CAAA,GACD,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAKD,cAAA;EACE,MAAK;CACP;CAEU,SAAS,OAAY;EAC7B,MAAM,SAAS,MAAM;EACrB,KAAK,QAAQ,IAAI,QAAQ,WAAW,KAAK;CAC3C;CA1BW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAoB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAApB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAoB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,SAAA;GAAA,SAAA;EAAA;EAAA,iBAAA;EAAA,UAAA;EAAA,UAnBrB;;;;;;;;;;;;;;;EAcT,UAAA;EAAA,QAAA,CAAA,+6GAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MACS;GAAa,MAAA;EAAA,CAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAIZ,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAoB,YAAA,CAAA;EArBhC,MAAA;EACW,MAAA,CAAA;GAAA,UAAA;GAAgB,UAChB;;;;;;;;;;;;;;;GAcT,SACQ,CAAC,aAAa;GAAC,iBAEP,wBAAwB;GAAM,QAAA,CAAA,+6GAAA;EAAA,CAAA"}
|