@magmonium/one 0.4.47 → 0.4.49
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/assets/i18n/af.json +53 -11
- package/assets/i18n/am.json +61 -15
- package/assets/i18n/ar.json +59 -27
- package/assets/i18n/as.json +56 -16
- package/assets/i18n/az.json +56 -14
- package/assets/i18n/ba.json +50 -11
- package/assets/i18n/be.json +53 -12
- package/assets/i18n/bg.json +54 -13
- package/assets/i18n/bn.json +64 -13
- package/assets/i18n/br.json +51 -10
- package/assets/i18n/brx.json +50 -1
- package/assets/i18n/bs.json +55 -14
- package/assets/i18n/ca.json +53 -11
- package/assets/i18n/ceb.json +57 -14
- package/assets/i18n/cnr.json +54 -12
- package/assets/i18n/co.json +56 -14
- package/assets/i18n/cs.json +54 -11
- package/assets/i18n/cy.json +49 -11
- package/assets/i18n/da.json +54 -11
- package/assets/i18n/de.json +50 -21
- package/assets/i18n/doi.json +55 -13
- package/assets/i18n/el.json +55 -14
- package/assets/i18n/en.json +2 -2
- package/assets/i18n/eo.json +55 -12
- package/assets/i18n/es.json +51 -24
- package/assets/i18n/et.json +50 -8
- package/assets/i18n/eu.json +54 -12
- package/assets/i18n/fa.json +53 -12
- package/assets/i18n/fi.json +53 -11
- package/assets/i18n/fr.json +54 -24
- package/assets/i18n/fy.json +56 -12
- package/assets/i18n/ga.json +50 -11
- package/assets/i18n/gd.json +52 -13
- package/assets/i18n/gl.json +56 -12
- package/assets/i18n/gu.json +64 -13
- package/assets/i18n/ha.json +58 -13
- package/assets/i18n/haw.json +48 -12
- package/assets/i18n/he.json +51 -10
- package/assets/i18n/hi.json +61 -26
- package/assets/i18n/hmn.json +53 -12
- package/assets/i18n/hr.json +54 -11
- package/assets/i18n/hu.json +54 -13
- package/assets/i18n/hy.json +59 -12
- package/assets/i18n/id.json +48 -9
- package/assets/i18n/ie.json +48 -2
- package/assets/i18n/ig.json +50 -9
- package/assets/i18n/ilo.json +40 -9
- package/assets/i18n/is.json +53 -11
- package/assets/i18n/it.json +50 -21
- package/assets/i18n/iw.json +51 -10
- package/assets/i18n/ja.json +56 -26
- package/assets/i18n/jw.json +48 -10
- package/assets/i18n/ka.json +54 -10
- package/assets/i18n/kk.json +49 -10
- package/assets/i18n/km.json +53 -12
- package/assets/i18n/kn.json +62 -11
- package/assets/i18n/ko.json +53 -22
- package/assets/i18n/kok.json +53 -11
- package/assets/i18n/ks.json +49 -1
- package/assets/i18n/ku.json +52 -13
- package/assets/i18n/ky.json +52 -12
- package/assets/i18n/la.json +52 -9
- package/assets/i18n/lb.json +54 -9
- package/assets/i18n/lo.json +50 -9
- package/assets/i18n/lt.json +55 -10
- package/assets/i18n/lv.json +54 -9
- package/assets/i18n/ma.json +54 -1
- package/assets/i18n/mai.json +50 -10
- package/assets/i18n/me.json +49 -0
- package/assets/i18n/mg.json +55 -10
- package/assets/i18n/mi.json +55 -12
- package/assets/i18n/mk.json +52 -8
- package/assets/i18n/ml.json +59 -8
- package/assets/i18n/mn.json +54 -10
- package/assets/i18n/mni.json +52 -0
- package/assets/i18n/mr.json +61 -10
- package/assets/i18n/ms.json +52 -8
- package/assets/i18n/mt.json +54 -10
- package/assets/i18n/my.json +54 -11
- package/assets/i18n/ne.json +53 -10
- package/assets/i18n/nl.json +51 -22
- package/assets/i18n/no.json +52 -9
- package/assets/i18n/ny.json +53 -11
- package/assets/i18n/or.json +61 -9
- package/assets/i18n/pa.json +61 -9
- package/assets/i18n/pl.json +48 -20
- package/assets/i18n/ps.json +50 -8
- package/assets/i18n/pt.json +50 -20
- package/assets/i18n/rm.json +50 -1
- package/assets/i18n/ro.json +52 -10
- package/assets/i18n/ru.json +50 -20
- package/assets/i18n/sa.json +54 -11
- package/assets/i18n/sat.json +55 -11
- package/assets/i18n/sc.json +50 -1
- package/assets/i18n/sd.json +48 -10
- package/assets/i18n/si.json +50 -12
- package/assets/i18n/sk.json +48 -9
- package/assets/i18n/sl.json +46 -7
- package/assets/i18n/sm.json +52 -12
- package/assets/i18n/sn.json +48 -9
- package/assets/i18n/so.json +50 -11
- package/assets/i18n/sq.json +57 -9
- package/assets/i18n/sr.json +49 -11
- package/assets/i18n/st.json +47 -10
- package/assets/i18n/su.json +49 -11
- package/assets/i18n/sv.json +44 -6
- package/assets/i18n/sw.json +33 -10
- package/assets/i18n/ta.json +61 -10
- package/assets/i18n/te.json +62 -11
- package/assets/i18n/tg.json +50 -11
- package/assets/i18n/th.json +51 -12
- package/assets/i18n/tl.json +51 -9
- package/assets/i18n/tr.json +49 -23
- package/assets/i18n/uk.json +47 -9
- package/assets/i18n/ur.json +54 -11
- package/assets/i18n/uz.json +49 -11
- package/assets/i18n/vi.json +47 -7
- package/assets/i18n/xh.json +50 -13
- package/assets/i18n/yi.json +51 -11
- package/assets/i18n/yo.json +51 -11
- package/assets/i18n/zh.json +52 -25
- package/assets/i18n/zu.json +48 -10
- package/assets/icons/svg.json +1 -0
- package/assets/icons/wrench.svg +3 -0
- package/assets/index.json +1 -1
- package/assets/modal/authenticate.json +1 -1
- package/fesm2022/{magmonium-one-attribute-value-C1lqou2L.mjs → magmonium-one-attribute-value-DnctyCKp.mjs} +3 -3
- package/fesm2022/{magmonium-one-attribute-value-C1lqou2L.mjs.map → magmonium-one-attribute-value-DnctyCKp.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-base-checkbox-CIxAiA4Q.mjs → magmonium-one-base-checkbox-D3Z1FTXU.mjs} +2 -2
- package/fesm2022/{magmonium-one-base-checkbox-CIxAiA4Q.mjs.map → magmonium-one-base-checkbox-D3Z1FTXU.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-base-dropdown-XpTWe4Ii.mjs → magmonium-one-base-dropdown-DIaimBpG.mjs} +10 -10
- package/fesm2022/{magmonium-one-base-dropdown-XpTWe4Ii.mjs.map → magmonium-one-base-dropdown-DIaimBpG.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-base-input-C1Ek0Ezm.mjs → magmonium-one-base-input-CZyIcKrn.mjs} +2 -2
- package/fesm2022/{magmonium-one-base-input-C1Ek0Ezm.mjs.map → magmonium-one-base-input-CZyIcKrn.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-base-text-Di2V2ojp.mjs → magmonium-one-base-text-6T8KrJbz.mjs} +2 -2
- package/fesm2022/{magmonium-one-base-text-Di2V2ojp.mjs.map → magmonium-one-base-text-6T8KrJbz.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-button-DZ4wCJgb.mjs → magmonium-one-button-BKGxIBhw.mjs} +7 -7
- package/fesm2022/{magmonium-one-button-DZ4wCJgb.mjs.map → magmonium-one-button-BKGxIBhw.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-checkbox-R-hPZrCa.mjs → magmonium-one-checkbox-D1W18OGo.mjs} +5 -5
- package/fesm2022/{magmonium-one-checkbox-R-hPZrCa.mjs.map → magmonium-one-checkbox-D1W18OGo.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-color-utl-DI5p24iQ.mjs → magmonium-one-color-utl-DklqRa3m.mjs} +38 -13
- package/fesm2022/magmonium-one-color-utl-DklqRa3m.mjs.map +1 -0
- package/fesm2022/{magmonium-one-directives-B93p5bAL.mjs → magmonium-one-directives-R099YTUd.mjs} +217 -217
- package/fesm2022/magmonium-one-directives-R099YTUd.mjs.map +1 -0
- package/fesm2022/{magmonium-one-group-B7YeUd1u.mjs → magmonium-one-group-Blvejahi.mjs} +7 -7
- package/fesm2022/{magmonium-one-group-B7YeUd1u.mjs.map → magmonium-one-group-Blvejahi.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-header-DUiBhPUP.mjs → magmonium-one-header-qoXWebFN.mjs} +4 -4
- package/fesm2022/{magmonium-one-header-DUiBhPUP.mjs.map → magmonium-one-header-qoXWebFN.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-icon-C3jwzbb2.mjs → magmonium-one-icon-Ce44a1mo.mjs} +5 -4
- package/fesm2022/magmonium-one-icon-Ce44a1mo.mjs.map +1 -0
- package/fesm2022/{magmonium-one-image-editor-BRTk8i4O.mjs → magmonium-one-image-editor-DKiscgQU.mjs} +4 -4
- package/fesm2022/{magmonium-one-image-editor-BRTk8i4O.mjs.map → magmonium-one-image-editor-DKiscgQU.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-label-D_rU82nD.mjs → magmonium-one-label-lYMBMB7p.mjs} +2 -2
- package/fesm2022/{magmonium-one-label-D_rU82nD.mjs.map → magmonium-one-label-lYMBMB7p.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-m-ref-CEms7B6-.mjs → magmonium-one-m-ref-DVe-WAYR.mjs} +2 -2
- package/fesm2022/{magmonium-one-m-ref-CEms7B6-.mjs.map → magmonium-one-m-ref-DVe-WAYR.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-menu-cO34OcJc.mjs → magmonium-one-menu-DcqfcU1p.mjs} +6 -6
- package/fesm2022/{magmonium-one-menu-cO34OcJc.mjs.map → magmonium-one-menu-DcqfcU1p.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-multi-range-Bq3_3NHg.mjs → magmonium-one-multi-range-m86SzSZO.mjs} +3 -3
- package/fesm2022/{magmonium-one-multi-range-Bq3_3NHg.mjs.map → magmonium-one-multi-range-m86SzSZO.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-options-asset-BMd7W0Mk.mjs → magmonium-one-options-asset-CIKSNq4B.mjs} +2 -2
- package/fesm2022/{magmonium-one-options-asset-BMd7W0Mk.mjs.map → magmonium-one-options-asset-CIKSNq4B.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-otp-V2tFztLx.mjs → magmonium-one-otp-BrR0mijm.mjs} +5 -5
- package/fesm2022/{magmonium-one-otp-V2tFztLx.mjs.map → magmonium-one-otp-BrR0mijm.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-password-IdllPMUw.mjs → magmonium-one-password-CKIAFzs9.mjs} +6 -6
- package/fesm2022/{magmonium-one-password-IdllPMUw.mjs.map → magmonium-one-password-CKIAFzs9.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-radio-BAL3-3j5.mjs → magmonium-one-radio-6oN9j_F6.mjs} +3 -3
- package/fesm2022/{magmonium-one-radio-BAL3-3j5.mjs.map → magmonium-one-radio-6oN9j_F6.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-range-Cf7yUnhN.mjs → magmonium-one-range-BmimLpG6.mjs} +4 -4
- package/fesm2022/{magmonium-one-range-Cf7yUnhN.mjs.map → magmonium-one-range-BmimLpG6.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-selector-DAEI_0JX.mjs → magmonium-one-selector-CLSwVQCJ.mjs} +4 -4
- package/fesm2022/{magmonium-one-selector-DAEI_0JX.mjs.map → magmonium-one-selector-CLSwVQCJ.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-size-converter-BOBD8nHy.mjs → magmonium-one-size-converter-DFIowQHO.mjs} +13 -2
- package/fesm2022/magmonium-one-size-converter-DFIowQHO.mjs.map +1 -0
- package/fesm2022/{magmonium-one-text-BnTkYLJe.mjs → magmonium-one-text-evdqwPEz.mjs} +6 -6
- package/fesm2022/{magmonium-one-text-BnTkYLJe.mjs.map → magmonium-one-text-evdqwPEz.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-text-output-BZU61QIF.mjs → magmonium-one-text-output-BnS5Skz-.mjs} +4 -4
- package/fesm2022/{magmonium-one-text-output-BZU61QIF.mjs.map → magmonium-one-text-output-BnS5Skz-.mjs.map} +1 -1
- package/fesm2022/magmonium-one-theme-DPBeYB-G.mjs +1 -0
- package/fesm2022/{magmonium-one-toggle-V_YnZXx5.mjs → magmonium-one-toggle-BIoiSggh.mjs} +3 -3
- package/fesm2022/{magmonium-one-toggle-V_YnZXx5.mjs.map → magmonium-one-toggle-BIoiSggh.mjs.map} +1 -1
- package/fesm2022/magmonium-one.mjs +10695 -10491
- package/fesm2022/magmonium-one.mjs.map +1 -1
- package/package.json +1 -1
- package/types/magmonium-one.d.ts +95 -21
- package/fesm2022/magmonium-one-color-utl-DI5p24iQ.mjs.map +0 -1
- package/fesm2022/magmonium-one-directives-B93p5bAL.mjs.map +0 -1
- package/fesm2022/magmonium-one-icon-C3jwzbb2.mjs.map +0 -1
- package/fesm2022/magmonium-one-size-converter-BOBD8nHy.mjs.map +0 -1
- package/fesm2022/magmonium-one-theme-DYvNIWmo.mjs +0 -1
package/fesm2022/{magmonium-one-selector-DAEI_0JX.mjs.map → magmonium-one-selector-CLSwVQCJ.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"magmonium-one-selector-DAEI_0JX.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/services/device.ts","../../../../libs/one/src/lib/shared/services/dom.ts","../../../../libs/one/src/lib/shared/services/scroll.ts","../../../../libs/one/src/lib/shared/services/overlay/overlay.service.ts","../../../../libs/one/src/lib/shared/services/theme.service.ts","../../../../libs/one/src/lib/shared/directives/selector/selector-type.ts","../../../../libs/one/src/lib/shared/directives/selector/selector-helper.ts","../../../../libs/one/src/lib/shared/directives/selector/selector.ts"],"sourcesContent":["import { DestroyRef, inject, Injectable, signal } from '@angular/core';\n\nconst MOBILE_QUERY = '(max-width: 767px)';\nconst TABLET_QUERY = '(min-width: 768px) and (max-width: 1199px)';\nconst DESKTOP_QUERY = '(min-width: 1200px)';\nconst TOUCH_QUERY = '(pointer: coarse)';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DeviceService {\n readonly isMobile = signal(this.matches(MOBILE_QUERY));\n readonly isTablet = signal(this.matches(TABLET_QUERY));\n readonly isDesktop = signal(this.matches(DESKTOP_QUERY));\n readonly isTouch = signal(this.matches(TOUCH_QUERY));\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n this.listen(MOBILE_QUERY, this.isMobile);\n this.listen(TABLET_QUERY, this.isTablet);\n this.listen(DESKTOP_QUERY, this.isDesktop);\n this.listen(TOUCH_QUERY, this.isTouch);\n }\n\n private matches(query: string): boolean {\n return typeof window !== 'undefined' && window.matchMedia(query).matches;\n }\n\n private listen(query: string, sig: ReturnType<typeof signal<boolean>>): void {\n if (typeof window === 'undefined') return;\n const mql = window.matchMedia(query);\n const handler = (e: MediaQueryListEvent): void => sig.set(e.matches);\n mql.addEventListener('change', handler);\n this.destroyRef.onDestroy(() => mql.removeEventListener('change', handler));\n }\n}\n","import {\n ApplicationRef,\n Binding,\n ComponentRef,\n createComponent,\n DOCUMENT,\n EmbeddedViewRef,\n inject,\n Injectable,\n Renderer2,\n RendererFactory2,\n signal,\n Type,\n} from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { DeviceService } from './device';\n\ntype DomCreate<T> = {\n component: Type<T>;\n className: string;\n styles?: Record<string, string | number>;\n id?: string;\n parentClassName?: string;\n parentStyles?: Record<string, string | number>;\n bindings?: Binding[];\n};\n\ntype DomDestroy<T> = {\n componentRef?: ComponentRef<T>;\n parentClassName?: string;\n id?: string;\n className?: string;\n};\n\ntype DomAppend = {\n child: HTMLDivElement;\n className: string;\n styles?: Record<string, string | number>;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DomService {\n readonly fullscreen = signal(false);\n private readonly document = inject(DOCUMENT);\n private readonly applicationRef = inject(ApplicationRef);\n private readonly renderer: Renderer2;\n private readonly rendererFactory = inject(RendererFactory2);\n private readonly deviceService = inject(DeviceService);\n private readonly animationDuration = 300;\n\n constructor() {\n this.renderer = this.rendererFactory.createRenderer(null, null);\n }\n\n /**\n * Creates and appends a component to the DOM\n * @param config - Configuration object for creating the component\n * @returns ComponentRef if successful, undefined if element already exists\n */\n public create<T>({\n component,\n className,\n styles,\n id,\n parentClassName,\n parentStyles,\n bindings,\n }: DomCreate<T>): ComponentRef<T> | undefined {\n const existingElement = this.document.querySelector(`#${id}`);\n if (existingElement) {\n return undefined;\n }\n const componentRef: ComponentRef<T> = createComponent(component, {\n environmentInjector: this.applicationRef.injector,\n bindings,\n });\n this.applicationRef.attachView(componentRef.hostView);\n const child = this.document.createElement('div');\n child.className = className;\n this.applyStyles(child, styles);\n if (id) {\n child.id = id;\n }\n this.renderer.appendChild(\n child,\n (componentRef.hostView as EmbeddedViewRef<T>).rootNodes[0]\n );\n if (parentClassName) {\n this.append({ className: parentClassName, child, styles: parentStyles });\n return componentRef;\n }\n this.renderer.appendChild(this.document.querySelector('body'), child);\n return componentRef;\n }\n\n /**\n * Destroys a component and removes its DOM element\n * @param config - Configuration object for destroying the component\n */\n public destroy<T>({\n componentRef,\n parentClassName,\n id,\n className,\n }: DomDestroy<T>): void {\n const parent = parentClassName\n ? this.document?.querySelector(`.${parentClassName}`)\n : undefined;\n const elm = parent\n ? id\n ? parent.querySelector(`#${id}`)\n : parent.querySelector(`.${className}`)\n : (this.document?.querySelector(`.${className}`) ??\n this.document?.querySelector(`#${id}`));\n if (!elm) {\n return;\n }\n if (componentRef) {\n this.applicationRef.detachView(componentRef.hostView);\n componentRef.destroy();\n }\n elm.remove();\n }\n\n /**\n * Enables scrolling on the document body\n */\n public addBodyScroll(): void {\n this.document.body.style.overflow = 'auto';\n }\n\n /**\n * Disables scrolling on the document body\n */\n\n public removeBodyScroll(): void {\n this.document.body.style.overflow = 'hidden';\n }\n\n readonly toggleFullScreen = (): void => {\n const doc = this.document as Document & {\n webkitFullscreenElement?: Element;\n webkitExitFullscreen?: () => Promise<void>;\n };\n const docEl = doc.documentElement as HTMLElement & {\n webkitRequestFullscreen?: () => Promise<void>;\n };\n\n if (doc.fullscreenElement || doc.webkitFullscreenElement) {\n const exit =\n doc.exitFullscreen?.bind(doc) ?? doc.webkitExitFullscreen?.bind(doc);\n exit?.();\n this.fullscreen.set(false);\n } else {\n const request =\n docEl.requestFullscreen?.bind(docEl) ??\n docEl.webkitRequestFullscreen?.bind(docEl);\n request?.();\n this.fullscreen.set(true);\n }\n };\n\n readonly showHideScroll = (className: string): void => {\n const element = this.document.querySelector(`.${className}`);\n this.document.body.style.overflow = element ? 'hidden' : 'auto';\n };\n\n readonly toggleBodyScroll = (): void => {\n const isHidden = this.document.body.style.overflow === 'hidden';\n this.document.body.style.overflow = isHidden ? 'auto' : 'hidden';\n };\n\n readonly remove = (\n id: string,\n parentClassName: string,\n componentRef?: ComponentRef<unknown>\n ): void => {\n const parent = this.document.querySelector(`.${parentClassName}`);\n const element = parent?.querySelector(`#${id}`) as HTMLElement | null;\n if (!element) return;\n\n element.style.transition = `opacity ${this.animationDuration}ms ease`;\n element.style.opacity = '0';\n\n setTimeout(() => {\n if (componentRef) {\n this.applicationRef.detachView(componentRef.hostView);\n componentRef.destroy();\n }\n element.remove();\n }, this.animationDuration);\n };\n\n readonly updateStyle = (\n className: string,\n styles?: Record<string, string | number>\n ): void => {\n const element = this.document.querySelector(\n `.${className}`\n ) as HTMLElement | null;\n if (!element || !styles) return;\n this.applyStyles(element, styles);\n };\n\n /**\n * Targets a single element by id. `updateStyle` resolves by class and takes the\n * first match, which cannot address one element among siblings sharing a class.\n */\n readonly updateStyleById = ({\n id,\n parentClassName,\n styles,\n }: {\n id: string;\n parentClassName?: string;\n styles?: Record<string, string | number>;\n }): void => {\n const parent = parentClassName\n ? this.document.querySelector(`.${parentClassName}`)\n : this.document;\n const element = parent?.querySelector(`#${id}`) as HTMLElement | null;\n if (!element || !styles) return;\n this.applyStyles(element, styles);\n };\n\n readonly positionRelativeTo = (\n element: HTMLElement,\n boundary: DOMRect\n ): void => {\n const positionClass = Array.from(element.classList).find((cls) =>\n ['top-left', 'top-right', 'bottom-left', 'bottom-right'].includes(cls)\n );\n this.applyPositionFromClass(\n element,\n boundary,\n positionClass ?? 'bottom-left'\n );\n };\n\n readonly createDom = (\n html: string,\n className: string,\n boundary?: DOMRect\n ): HTMLDivElement => {\n let element = this.document.querySelector(\n `.${className}`\n ) as HTMLDivElement | null;\n if (!element) {\n element = this.document.createElement('div');\n element.className = className;\n this.renderer.appendChild(this.document.body, element);\n }\n element.innerHTML = html;\n if (boundary) {\n this.positionRelativeTo(element, boundary);\n }\n return element;\n };\n\n readonly observeMutations = (\n targetNode: Node,\n config: MutationObserverInit = { childList: true, subtree: true }\n ): Observable<MutationRecord[]> => {\n return new Observable<MutationRecord[]>((subscriber) => {\n const observer = new MutationObserver((mutations) => {\n subscriber.next(mutations);\n });\n observer.observe(targetNode, config);\n return () => observer.disconnect();\n });\n };\n\n readonly cleanup = (parentClassName: string): void => {\n const parent = this.document.querySelector(`.${parentClassName}`);\n if (parent) {\n parent.remove();\n }\n };\n\n readonly createAndAppend = <T>(\n config: DomCreate<T> & { boundary?: DOMRect }\n ): ComponentRef<T> | undefined => {\n const { boundary, ...createConfig } = config;\n const componentRef = this.create<T>(createConfig);\n if (componentRef && boundary) {\n const hostElement = (componentRef.hostView as EmbeddedViewRef<T>)\n .rootNodes[0] as HTMLElement;\n const wrapper = hostElement?.parentElement;\n if (wrapper) {\n this.positionRelativeTo(wrapper, boundary);\n }\n }\n return componentRef;\n };\n\n /**\n * Applies styles to a DOM element using Angular Renderer2\n * @param element - The HTML element to apply styles to\n * @param styles - Object containing CSS property-value pairs\n */\n private applyStyles(\n element: HTMLElement,\n styles?: Record<string, string | number>\n ): void {\n if (!styles) return;\n\n Object.entries(styles).forEach(([property, value]) => {\n this.renderer.setStyle(element, property, value);\n });\n }\n\n /**\n * Appends a child element to a parent with the specified class name\n * Creates the parent if it doesn't exist\n * @param config - Configuration object for appending the element\n */\n private append({ className, styles, child }: DomAppend): void {\n const parentClass = `.${className}`;\n let parentElement = this.document.querySelector(parentClass) as HTMLElement;\n if (!parentElement) {\n parentElement = this.document.createElement('div') as HTMLElement;\n parentElement.className = className;\n this.applyStyles(parentElement, styles);\n this.renderer.appendChild(\n this.document.querySelector('body') as HTMLElement,\n parentElement\n );\n }\n this.renderer.appendChild(parentElement, child);\n }\n\n private readonly applyPositionFromClass = (\n element: HTMLElement,\n boundary: DOMRect,\n positionClass: string\n ): void => {\n const isMobile = this.deviceService.isMobile();\n const styles: Record<string, string> = { position: 'absolute' };\n\n if (isMobile) {\n styles['left'] = '0';\n styles['right'] = '0';\n styles['bottom'] = '0';\n } else {\n switch (positionClass) {\n case 'top-left':\n styles['top'] = `${boundary.top}px`;\n styles['left'] = `${boundary.left}px`;\n break;\n case 'top-right':\n styles['top'] = `${boundary.top}px`;\n styles['left'] = `${boundary.right}px`;\n break;\n case 'bottom-right':\n styles['top'] = `${boundary.bottom}px`;\n styles['left'] = `${boundary.right}px`;\n break;\n case 'bottom-left':\n default:\n styles['top'] = `${boundary.bottom}px`;\n styles['left'] = `${boundary.left}px`;\n break;\n }\n }\n\n Object.entries(styles).forEach(([prop, val]) => {\n this.renderer.setStyle(element, prop, val);\n });\n };\n}\n","import { Injectable, signal } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ScrollService {\n /**\n * Reactive signal containing the scroll top position of the window.\n */\n readonly scrollTop = signal(0);\n\n constructor() {\n this.setupWindowScroll();\n }\n\n private setupWindowScroll(): void {\n const onScroll = (event?: Event) => {\n let top = 0;\n\n // If we have an event and it's from an element (not document/window)\n if (\n event?.target &&\n event.target !== document &&\n event.target !== window\n ) {\n const target = event.target as HTMLElement;\n top = target.scrollTop;\n } else {\n // Fallback to window scroll\n top =\n window.pageYOffset ||\n document.documentElement.scrollTop ||\n document.body.scrollTop ||\n 0;\n }\n\n this.scrollTop.set(top);\n };\n\n // Use capture: true to catch scroll events that don't bubble\n window.addEventListener('scroll', onScroll, {\n passive: true,\n capture: true,\n });\n\n // Initial set\n onScroll();\n }\n}\n","import {\n ApplicationRef,\n ComponentRef,\n createComponent,\n EnvironmentInjector,\n inject,\n Injectable,\n Type,\n Binding,\n} from '@angular/core';\n\nexport interface OverlayConfig {\n triggerElement: HTMLElement;\n offsetY?: number;\n backdropClass?: string;\n bindings?: Binding[];\n closeOnFocusOut?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class OverlayService {\n private readonly appRef = inject(ApplicationRef);\n private readonly injector = inject(EnvironmentInjector);\n private overlayContainer?: HTMLElement;\n\n open<T>(component: Type<T>, config: OverlayConfig): OverlayRef<T> {\n // Check if container exists and is still in the DOM\n if (\n !this.overlayContainer ||\n !document.body.contains(this.overlayContainer)\n ) {\n this.overlayContainer = document.createElement('div');\n this.overlayContainer.className = 'overlay-container';\n document.body.appendChild(this.overlayContainer);\n }\n\n const backdrop = document.createElement('div');\n backdrop.className = config.backdropClass || 'overlay-backdrop';\n this.overlayContainer.appendChild(backdrop);\n\n const wrapper = document.createElement('div');\n wrapper.className = 'overlay-wrapper';\n this.overlayContainer.appendChild(wrapper);\n\n const componentRef = createComponent(component, {\n environmentInjector: this.injector,\n hostElement: wrapper,\n bindings: config.bindings || [],\n });\n\n this.appRef.attachView(componentRef.hostView);\n\n this.position(wrapper, config.triggerElement, config.offsetY || 4);\n\n return new OverlayRef(\n componentRef,\n backdrop,\n wrapper,\n this.overlayContainer,\n config.triggerElement,\n config.offsetY || 4,\n config.closeOnFocusOut ?? false\n );\n }\n\n private position(\n element: HTMLElement,\n trigger: HTMLElement,\n offsetY: number\n ): void {\n const triggerRect = trigger.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n element.style.position = 'fixed';\n element.style.zIndex = '9999';\n\n // Let the element render to get its natural dimensions\n element.style.visibility = 'hidden';\n element.style.display = 'block';\n const elementRect = element.getBoundingClientRect();\n element.style.visibility = '';\n\n const widthDiff = elementRect.width - triggerRect.width;\n const shouldConsiderHorizontal = widthDiff > 150;\n\n let position: 'top' | 'bottom' | 'left' | 'right' = 'bottom';\n let left = triggerRect.left;\n let top = triggerRect.bottom + offsetY;\n\n if (shouldConsiderHorizontal) {\n // Check if there's space on the right\n const spaceRight = viewportWidth - triggerRect.right;\n const spaceLeft = triggerRect.left;\n const spaceBottom = viewportHeight - triggerRect.bottom;\n // Prefer right, then left, then bottom, then top\n if (spaceRight >= elementRect.width + offsetY) {\n position = 'right';\n left = triggerRect.right + offsetY;\n top = triggerRect.top;\n } else if (spaceLeft >= elementRect.width + offsetY) {\n position = 'left';\n left = triggerRect.left - elementRect.width - offsetY;\n top = triggerRect.top;\n } else if (spaceBottom >= elementRect.height + offsetY) {\n position = 'bottom';\n left = Math.max(\n offsetY,\n Math.min(\n triggerRect.left,\n viewportWidth - elementRect.width - offsetY\n )\n );\n top = triggerRect.bottom + offsetY;\n } else {\n position = 'top';\n left = Math.max(\n offsetY,\n Math.min(\n triggerRect.left,\n viewportWidth - elementRect.width - offsetY\n )\n );\n top = triggerRect.top - elementRect.height - offsetY;\n }\n } else {\n // Only consider top/bottom positioning\n const spaceBottom = viewportHeight - triggerRect.bottom;\n const spaceTop = triggerRect.top;\n\n if (spaceBottom >= elementRect.height + offsetY) {\n position = 'bottom';\n left = triggerRect.left;\n top = triggerRect.bottom + offsetY;\n } else if (spaceTop >= elementRect.height + offsetY) {\n position = 'top';\n left = triggerRect.left;\n top = triggerRect.top - elementRect.height - offsetY;\n } else {\n // Not enough space either way, prefer bottom\n position = 'bottom';\n left = triggerRect.left;\n top = triggerRect.bottom + offsetY;\n }\n\n // Match trigger width when positioned top/bottom\n element.style.width = `${triggerRect.width}px`;\n }\n\n element.style.left = `${left}px`;\n element.style.top = `${top}px`;\n element.setAttribute('data-position', position);\n }\n}\n\nexport class OverlayRef<T> {\n private readonly repositionHandler: () => void;\n private readonly backdropClickPromise: Promise<void>;\n private backdropClickResolve?: () => void;\n private readonly backdropClickHandler: () => void;\n private readonly focusOutPromise: Promise<void>;\n private focusOutResolve?: () => void;\n private readonly triggerFocusOutHandler?: (event: FocusEvent) => void;\n private readonly overlayFocusOutHandler?: (event: FocusEvent) => void;\n\n constructor(\n public componentRef: ComponentRef<T>,\n private backdrop: HTMLElement,\n private wrapper: HTMLElement,\n private container: HTMLElement,\n private trigger: HTMLElement,\n private offsetY: number,\n private closeOnFocusOut: boolean\n ) {\n this.repositionHandler = () => this.updatePosition();\n window.addEventListener('scroll', this.repositionHandler, true);\n window.addEventListener('resize', this.repositionHandler);\n\n this.backdropClickPromise = new Promise((resolve) => {\n this.backdropClickResolve = resolve;\n });\n this.backdropClickHandler = () => {\n if (this.backdropClickResolve) {\n this.backdropClickResolve();\n }\n };\n this.backdrop.addEventListener('click', this.backdropClickHandler);\n\n // Setup focus tracking if enabled\n this.focusOutPromise = new Promise((resolve) => {\n this.focusOutResolve = resolve;\n });\n\n if (this.closeOnFocusOut) {\n this.triggerFocusOutHandler = (event: FocusEvent) => {\n this.handleFocusOut(event, 'trigger');\n };\n this.overlayFocusOutHandler = (event: FocusEvent) => {\n this.handleFocusOut(event, 'overlay');\n };\n\n this.trigger.addEventListener('focusout', this.triggerFocusOutHandler);\n this.wrapper.addEventListener('focusout', this.overlayFocusOutHandler);\n }\n }\n\n backdropClick(): Promise<void> {\n return this.backdropClickPromise;\n }\n\n focusOut(): Promise<void> {\n return this.focusOutPromise;\n }\n\n dispose(): void {\n // Clean up scroll/resize listeners\n window.removeEventListener('scroll', this.repositionHandler, true);\n window.removeEventListener('resize', this.repositionHandler);\n\n // Clean up backdrop click listener\n if (this.backdrop && this.backdropClickHandler) {\n this.backdrop.removeEventListener('click', this.backdropClickHandler);\n }\n\n // Clean up focus tracking listeners\n if (this.closeOnFocusOut) {\n if (this.trigger && this.triggerFocusOutHandler) {\n this.trigger.removeEventListener(\n 'focusout',\n this.triggerFocusOutHandler\n );\n }\n if (this.wrapper && this.overlayFocusOutHandler) {\n this.wrapper.removeEventListener(\n 'focusout',\n this.overlayFocusOutHandler\n );\n }\n }\n\n // Destroy component\n if (this.componentRef) {\n this.componentRef.destroy();\n }\n\n // Remove DOM elements\n if (this.backdrop && this.backdrop.parentNode) {\n this.backdrop.parentNode.removeChild(this.backdrop);\n }\n if (this.wrapper && this.wrapper.parentNode) {\n this.wrapper.parentNode.removeChild(this.wrapper);\n }\n\n // Clean up container if empty\n if (this.container && this.container.children.length === 0) {\n if (this.container.parentNode) {\n this.container.parentNode.removeChild(this.container);\n }\n }\n }\n\n private handleFocusOut(\n event: FocusEvent,\n _source: 'trigger' | 'overlay'\n ): void {\n const relatedTarget = event.relatedTarget as HTMLElement | null;\n\n // If relatedTarget is null, focus might be moving to a non-focusable element\n // (e.g., clicking a button that doesn't retain focus)\n // Use a timeout to check if focus actually left the overlay\n if (!relatedTarget) {\n setTimeout(() => {\n const activeElement = document.activeElement as HTMLElement | null;\n\n // If focus went to body or null, it likely means a click happened\n // inside the overlay on a non-focusable element - don't close\n if (!activeElement || activeElement === document.body) {\n return;\n }\n\n const focusInTrigger = this.trigger?.contains(activeElement);\n const focusInOverlay = this.wrapper?.contains(activeElement);\n\n if (!focusInTrigger && !focusInOverlay) {\n if (this.focusOutResolve) {\n this.focusOutResolve();\n }\n }\n }, 0);\n return;\n }\n\n // Check if focus is moving to the other element (trigger <-> overlay)\n const focusStaysInTrigger = this.trigger.contains(relatedTarget);\n const focusStaysInOverlay = this.wrapper.contains(relatedTarget);\n\n // Only trigger focusOut if focus moves outside both trigger and overlay\n if (!focusStaysInTrigger && !focusStaysInOverlay) {\n if (this.focusOutResolve) {\n this.focusOutResolve();\n }\n }\n }\n\n private updatePosition(): void {\n const triggerRect = this.trigger.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const elementRect = this.wrapper.getBoundingClientRect();\n\n const widthDiff = elementRect.width - triggerRect.width;\n const shouldConsiderHorizontal = widthDiff > 150;\n\n let left = triggerRect.left;\n let top = triggerRect.bottom + this.offsetY;\n let position: 'top' | 'bottom' | 'left' | 'right' = 'bottom';\n\n if (shouldConsiderHorizontal) {\n // Check available space in all directions\n const spaceRight = viewportWidth - triggerRect.right;\n const spaceLeft = triggerRect.left;\n const spaceBottom = viewportHeight - triggerRect.bottom;\n // Prefer right, then left, then bottom, then top\n if (spaceRight >= elementRect.width + this.offsetY) {\n position = 'right';\n left = triggerRect.right + this.offsetY;\n top = triggerRect.top;\n } else if (spaceLeft >= elementRect.width + this.offsetY) {\n position = 'left';\n left = triggerRect.left - elementRect.width - this.offsetY;\n top = triggerRect.top;\n } else if (spaceBottom >= elementRect.height + this.offsetY) {\n position = 'bottom';\n left = Math.max(\n this.offsetY,\n Math.min(\n triggerRect.left,\n viewportWidth - elementRect.width - this.offsetY\n )\n );\n top = triggerRect.bottom + this.offsetY;\n } else {\n position = 'top';\n left = Math.max(\n this.offsetY,\n Math.min(\n triggerRect.left,\n viewportWidth - elementRect.width - this.offsetY\n )\n );\n top = triggerRect.top - elementRect.height - this.offsetY;\n }\n\n // Remove width constraint for horizontal positioning\n this.wrapper.style.width = '';\n } else {\n // Only consider top/bottom positioning\n const spaceBottom = viewportHeight - triggerRect.bottom;\n const spaceTop = triggerRect.top;\n\n if (spaceBottom >= elementRect.height + this.offsetY) {\n position = 'bottom';\n left = triggerRect.left;\n top = triggerRect.bottom + this.offsetY;\n } else if (spaceTop >= elementRect.height + this.offsetY) {\n position = 'top';\n left = triggerRect.left;\n top = triggerRect.top - elementRect.height - this.offsetY;\n } else {\n // Not enough space either way, prefer bottom\n position = 'bottom';\n left = triggerRect.left;\n top = triggerRect.bottom + this.offsetY;\n }\n\n // Match trigger width when positioned top/bottom\n this.wrapper.style.width = `${triggerRect.width}px`;\n }\n\n this.wrapper.style.left = `${left}px`;\n this.wrapper.style.top = `${top}px`;\n this.wrapper.setAttribute('data-position', position);\n }\n}\n","import { computed, inject, Injectable } from '@angular/core';\nimport { ThemeStore } from '../lib/theme';\nimport { ThemeColor } from '@magmonium/cli';\n\n@Injectable({ providedIn: 'root' })\nexport class ThemeService {\n private readonly themeStore = inject(ThemeStore);\n\n readonly color = computed<ThemeColor | undefined>(() =>\n this.themeStore.color()\n );\n\n readonly theme = computed(() => this.themeStore.theme());\n}\n","import { Binding, Type } from '@angular/core';\n\nexport enum Direction {\n TOP = 'top',\n BOTTOM = 'bottom',\n LEFT = 'left',\n RIGHT = 'right',\n CENTER = 'center',\n UP_DOWN = 'up-down',\n}\n\nexport type SelectorConfig<T> = {\n component: Type<T>;\n base: string;\n width?: string;\n height?: string;\n toggle?: boolean;\n matchTriggerWidth?: boolean;\n dir?: Direction;\n align?: 'left' | 'right';\n bindings?: Binding[];\n};\n","import { Direction } from './selector-type';\n\nexport function isOutOfViewport(boundary: DOMRect): boolean {\n const margin = 8;\n return (\n boundary.top + boundary.height + margin < 0 ||\n boundary.left + boundary.width + margin < 0 ||\n boundary.bottom - margin > window.innerHeight ||\n boundary.right - margin > window.innerWidth\n );\n}\n\nexport function calculatePosition(\n boundary: DOMRect,\n direction?: Direction,\n width = '250px',\n height = '300px',\n align?: 'left' | 'right'\n): Record<string, string> {\n const margin = 8;\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n\n const contentWidth = parseInt(width) || 250;\n // Use 0 for unknown/auto height so direction picks the side with more space\n // rather than assuming a fixed 300px that causes unnecessary flips\n const contentHeight = parseInt(height) || 0;\n\n const space = {\n top: boundary.top,\n bottom: viewport.height - boundary.bottom,\n left: boundary.left,\n right: viewport.width - boundary.right,\n };\n\n const centerX = boundary.left + boundary.width / 2;\n const centerY = boundary.top + boundary.height / 2;\n\n direction = detectBestDirection(\n space,\n {\n width: contentWidth,\n height: contentHeight,\n },\n direction\n );\n\n const horizontalLeft =\n align === 'right'\n ? calculateRightAlignedPosition(boundary.right, contentWidth, viewport.width)\n : align === 'left'\n ? calculateLeftAlignedPosition(boundary.left, contentWidth, viewport.width)\n : calculateHorizontalPosition(centerX, contentWidth, viewport.width);\n\n const positionMap: Record<Direction, Record<string, string>> = {\n [Direction.TOP]: {\n top: 'unset',\n bottom: `${viewport.height - boundary.top + margin}px`,\n 'max-height': `${Math.max(space.top - margin * 2, 0)}px`,\n left: horizontalLeft,\n },\n [Direction.BOTTOM]: {\n top: `${boundary.bottom + margin}px`,\n bottom: 'unset',\n 'max-height': `${Math.max(space.bottom - margin * 2, 0)}px`,\n left: horizontalLeft,\n },\n [Direction.LEFT]: {\n right: `${viewport.width - boundary.left + margin}px`,\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n },\n [Direction.RIGHT]: {\n left: `${boundary.right + margin}px`,\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n },\n [Direction.CENTER]: {\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n left: horizontalLeft,\n },\n [Direction.UP_DOWN]: {\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n left: `${boundary.left}px`,\n },\n };\n\n return (\n positionMap[direction] || {\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n left: horizontalLeft,\n }\n );\n}\n\nexport function detectBestDirection(\n space: { top: number; bottom: number; left: number; right: number },\n content: { width: number; height: number },\n preferredDirection?: Direction\n): Direction {\n const margin = 8;\n const fits = (available: number, needed: number) =>\n available >= needed + margin;\n\n // If an explicit direction is requested and it fits, honour it\n if (preferredDirection && preferredDirection !== Direction.UP_DOWN) {\n const dirFits: Record<string, boolean> = {\n [Direction.BOTTOM]: fits(space.bottom, content.height),\n [Direction.TOP]: fits(space.top, content.height),\n [Direction.LEFT]: fits(space.left, content.width),\n [Direction.RIGHT]: fits(space.right, content.width),\n };\n if (dirFits[preferredDirection]) {\n return preferredDirection;\n }\n }\n\n // If height is unknown (0), always prefer BOTTOM\n if (content.height <= 0) {\n return Direction.BOTTOM;\n }\n\n // If height is known, check if it fits in the preferred vertical order\n if (fits(space.bottom, content.height)) {\n return Direction.BOTTOM;\n }\n if (fits(space.top, content.height)) {\n return Direction.TOP;\n }\n\n // If it doesn't fit vertically, but UP_DOWN was requested, still return BOTTOM (it will be clipped by max-height)\n if (preferredDirection === Direction.UP_DOWN) {\n return Direction.BOTTOM;\n }\n\n // Last resort: pick horizontal side that fits better\n if (fits(space.right, content.width)) {\n return Direction.RIGHT;\n }\n if (fits(space.left, content.width)) {\n return Direction.LEFT;\n }\n\n // Final fallback: BOTTOM (let max-height and scrolling handle it)\n return Direction.BOTTOM;\n}\n\nfunction calculateHorizontalPosition(\n center: number,\n width: number,\n viewportWidth: number\n): string {\n return calculatePosition1D(center, width, viewportWidth);\n}\n\nfunction calculateRightAlignedPosition(\n rightEdge: number,\n width: number,\n viewportWidth: number\n): string {\n const start = rightEdge - width;\n if (start < 0) return '0px';\n if (start + width > viewportWidth) return `${viewportWidth - width}px`;\n return `${start}px`;\n}\n\nfunction calculateLeftAlignedPosition(\n leftEdge: number,\n width: number,\n viewportWidth: number\n): string {\n if (leftEdge < 0) return '0px';\n if (leftEdge + width > viewportWidth) return `${viewportWidth - width}px`;\n return `${leftEdge}px`;\n}\n\nfunction calculateVerticalPosition(\n center: number,\n height: number,\n viewportHeight: number\n): string {\n return calculatePosition1D(center, height, viewportHeight);\n}\n\nfunction calculatePosition1D(\n center: number,\n size: number,\n viewportSize: number\n): string {\n const start = center - size / 2;\n if (start < 0) {\n return '0px';\n }\n if (start + size > viewportSize) {\n return `${viewportSize - size}px`;\n }\n return `${start}px`;\n}\n","import {\n ComponentRef,\n DOCUMENT,\n Directive,\n ElementRef,\n HostListener,\n inject,\n input,\n linkedSignal,\n OnDestroy,\n output,\n signal,\n} from '@angular/core';\nimport { DeviceService, DomService } from '../../services';\nimport { SelectorConfig, Direction } from './selector-type';\nimport {\n calculatePosition,\n isOutOfViewport,\n detectBestDirection,\n} from './selector-helper';\nimport { MODAL_STORE_REF, ModalStoreRef } from '../../config/tokens';\n\n@Directive({\n selector: '[mSelector]',\n exportAs: 'mSelector',\n host: {\n '[class.active]': 'isOpen()',\n },\n})\nexport class SelectorDirective implements OnDestroy {\n private static openSelector: Record<string, SelectorDirective> = {};\n mSelector = input<SelectorConfig<unknown> | undefined>(undefined);\n disabled = input<boolean>(false);\n readonly opened = output<void>();\n readonly closed = output<void>();\n private readonly deviceService = inject(DeviceService);\n private readonly domService = inject(DomService);\n private readonly modalStore = inject(MODAL_STORE_REF, {\n optional: true,\n }) as ModalStoreRef | null;\n private readonly element = inject(ElementRef<HTMLElement>);\n private readonly doc = inject(DOCUMENT);\n private componentRef?: ComponentRef<unknown>;\n private modalId = signal<string | undefined>(undefined);\n private triggerFocusOutHandler?: (event: FocusEvent) => void;\n private boxFocusOutHandler?: (event: FocusEvent) => void;\n private outsideMouseDownHandler?: (event: MouseEvent) => void;\n private readonly isCompact = (): boolean =>\n this.deviceService.isMobile() ||\n this.deviceService.isTablet() ||\n this.deviceService.isTouch();\n\n protected readonly isOpen = linkedSignal({\n source: () => ({\n triggerMap: this.modalStore?.modalTriggerMap() ?? {},\n id: this.modalId(),\n isCompact:\n this.deviceService.isMobile() ||\n this.deviceService.isTablet() ||\n this.deviceService.isTouch(),\n }),\n computation: ({ triggerMap, id, isCompact }, previous) => {\n if (isCompact && id && !triggerMap[id]) {\n this.closed.emit();\n return false;\n }\n return previous?.value ?? false;\n },\n });\n\n @HostListener('click', ['$event'])\n @HostListener('keydown.enter', ['$event'])\n @HostListener('keydown.space', ['$event'])\n @HostListener('keydown.tab', ['$event'])\n @HostListener('focus', ['$event'])\n onClick(_e: unknown): void {\n if (this.disabled()) {\n return;\n }\n if (this.isOpen()) {\n this.close();\n return;\n }\n this.open();\n }\n\n // Keyboard opening, for a trigger whose visible affordance sits out of tab\n // order — a dropdown chevron, a date calendar. The field itself is the tab\n // stop, and ArrowDown on it is what opens the panel. Open only: Escape and a\n // selection close it, and ArrowDown moving into the list must never toggle\n // the panel shut under it.\n @HostListener('keydown.arrowdown', ['$event'])\n onArrowDown(event: Event): void {\n if (this.disabled() || this.isOpen()) return;\n event.preventDefault();\n this.open();\n }\n\n @HostListener('window:scroll', ['$event'])\n @HostListener('window:resize', ['$event'])\n onScroll(_event: Event): void {\n this.handleViewportChange(_event);\n }\n\n ngOnDestroy(): void {\n this.teardownFocusTracking();\n this.close();\n const selector = this.mSelector();\n if (!selector) {\n return;\n }\n if (SelectorDirective.openSelector[selector.base] === this) {\n delete SelectorDirective.openSelector[selector.base];\n }\n }\n\n close(): void {\n if (!this.isOpen()) {\n return;\n }\n this.teardownFocusTracking();\n const selector = this.mSelector();\n if (!selector) {\n return;\n }\n const { base } = selector;\n if (this.isCompact()) {\n this.modalStore?.close(this.modalId());\n } else {\n this.domService.destroy({\n componentRef: this.componentRef,\n parentClassName: 'm-selector-box',\n className: base,\n });\n }\n if (SelectorDirective.openSelector[base] === this) {\n delete SelectorDirective.openSelector[base];\n }\n this.isOpen.set(false);\n this.closed.emit();\n }\n\n open() {\n if (this.isOpen()) {\n return;\n }\n const base = this.mSelector()?.base;\n if (!base) {\n return;\n }\n if (\n SelectorDirective.openSelector[base] &&\n SelectorDirective.openSelector[base] !== this\n ) {\n SelectorDirective.openSelector[base].close();\n }\n SelectorDirective.openSelector[base] = this;\n if (this.isCompact()) {\n this.openInModal();\n } else {\n this.openInBox();\n }\n this.isOpen.set(true);\n this.opened.emit();\n }\n\n private openInBox = () => {\n const selector = this.mSelector();\n\n if (!selector) {\n return;\n }\n\n const { component, base, bindings, dir, align, width, height } = selector;\n\n const boundary = this.element.nativeElement.getBoundingClientRect();\n const styles: Record<string, string> = {\n ...calculatePosition(boundary, dir, width, height, align),\n };\n\n this.componentRef = this.domService.create<unknown>({\n component,\n styles,\n parentClassName: 'm-selector-box',\n className: base,\n bindings,\n });\n\n if (selector.matchTriggerWidth) {\n this.alignToTrigger();\n } else if (!parseInt(height ?? '')) {\n // height was unknown/'auto' up front, so calculatePosition assumed 0\n // and defaulted to BOTTOM without checking available space — that same\n // \"unknown height\" branch also clamps the box's own max-height to\n // whatever little room is below the trigger, which pins its rendered\n // (clamped) height at/near 0 too, so getBoundingClientRect() can't be\n // used to recover the real size later. scrollHeight ignores that\n // clamp and reports the content's true intrinsic height once Angular\n // has actually rendered it (hence the rAF) — reflow off that instead.\n requestAnimationFrame(() => this.reflowAfterRender(boundary, selector));\n }\n\n requestAnimationFrame(() => this.setupFocusTracking());\n };\n\n private reflowAfterRender(\n boundary: DOMRect,\n selector: SelectorConfig<unknown>\n ): void {\n const boxElement = this.getBoxElement();\n if (!boxElement) return;\n const actualHeight = boxElement.scrollHeight;\n if (!actualHeight) return;\n\n const { base, dir, align, width } = selector;\n const style = calculatePosition(\n boundary,\n dir,\n width,\n `${actualHeight}px`,\n align\n );\n this.domService.updateStyle(base, { ...style });\n }\n\n private openInModal = () => {\n const selector = this.mSelector();\n if (!selector) {\n return;\n }\n const { component, bindings } = selector;\n this.modalId.set(\n this.modalStore?.open({\n component,\n bindings,\n name: 'bottom',\n one: true,\n // A sheet, not a card: dock the option list to the bottom edge like\n // every other compact overlay, so `.pop-up.align-bottom` and the box's\n // own `:host-context(.align-bottom)` de-chroming both apply.\n config: { align: 'bottom' },\n }) ?? undefined\n );\n };\n\n private getBoxElement(): HTMLElement | null {\n const base = this.mSelector()?.base;\n if (!base) return null;\n return this.doc.querySelector(\n `.m-selector-box .${base}`\n ) as HTMLElement | null;\n }\n\n private setupFocusTracking(): void {\n this.triggerFocusOutHandler = (event: FocusEvent) =>\n this.handleFocusOut(event);\n this.element.nativeElement.addEventListener(\n 'focusout',\n this.triggerFocusOutHandler\n );\n\n const boxElement = this.getBoxElement();\n if (boxElement) {\n this.boxFocusOutHandler = (event: FocusEvent) =>\n this.handleFocusOut(event);\n boxElement.addEventListener('focusout', this.boxFocusOutHandler);\n }\n\n this.outsideMouseDownHandler = (event: MouseEvent) =>\n this.handleOutsideMouseDown(event);\n this.doc.addEventListener('mousedown', this.outsideMouseDownHandler);\n }\n\n private teardownFocusTracking(): void {\n if (this.triggerFocusOutHandler) {\n this.element.nativeElement.removeEventListener(\n 'focusout',\n this.triggerFocusOutHandler\n );\n this.triggerFocusOutHandler = undefined;\n }\n if (this.boxFocusOutHandler) {\n const boxElement = this.getBoxElement();\n boxElement?.removeEventListener('focusout', this.boxFocusOutHandler);\n this.boxFocusOutHandler = undefined;\n }\n if (this.outsideMouseDownHandler) {\n this.doc.removeEventListener('mousedown', this.outsideMouseDownHandler);\n this.outsideMouseDownHandler = undefined;\n }\n }\n\n private handleFocusOut(event: FocusEvent): void {\n if (!this.isOpen()) return;\n\n const relatedTarget = event.relatedTarget as HTMLElement | null;\n const triggerElement = this.element.nativeElement;\n const boxElement = this.getBoxElement();\n const selectorContainer = this.doc.querySelector('.m-selector-box');\n\n if (!relatedTarget) {\n setTimeout(() => {\n if (!this.isOpen()) return;\n const activeElement = this.doc.activeElement as HTMLElement | null;\n if (!activeElement || activeElement === this.doc.body) return;\n\n const inTrigger = triggerElement.contains(activeElement);\n const inBox = boxElement?.contains(activeElement) ?? false;\n const inSelectorContainer =\n selectorContainer?.contains(activeElement) ?? false;\n if (!inTrigger && !inBox && !inSelectorContainer) {\n this.close();\n }\n }, 0);\n return;\n }\n\n const inTrigger = triggerElement.contains(relatedTarget);\n const inBox = boxElement?.contains(relatedTarget) ?? false;\n const inSelectorContainer =\n selectorContainer?.contains(relatedTarget) ?? false;\n if (!inTrigger && !inBox && !inSelectorContainer) {\n this.close();\n }\n }\n\n private handleOutsideMouseDown(event: MouseEvent): void {\n if (!this.isOpen()) return;\n\n const target = event.target as HTMLElement;\n const triggerElement = this.element.nativeElement;\n const boxElement = this.getBoxElement();\n\n const inTrigger = triggerElement.contains(target);\n const inBox = boxElement?.contains(target) ?? false;\n if (inTrigger || inBox) return;\n\n const selectorContainer = this.doc.querySelector('.m-selector-box');\n if (selectorContainer?.contains(target)) return;\n\n this.close();\n }\n\n private alignToTrigger(): void {\n const boxElement = this.getBoxElement();\n if (!boxElement) return;\n const boundary = this.element.nativeElement.getBoundingClientRect();\n const margin = 8;\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n const selector = this.mSelector();\n const width = selector?.width || '250px';\n const height = selector?.height || '300px';\n const contentWidth = parseInt(width) || 250;\n const contentHeight = parseInt(height) || 0;\n\n const space = {\n top: boundary.top,\n bottom: viewport.height - boundary.bottom,\n left: boundary.left,\n right: viewport.width - boundary.right,\n };\n\n const direction = detectBestDirection(\n space,\n {\n width: contentWidth,\n height: contentHeight,\n },\n selector?.dir\n );\n\n boxElement.style.width = `${boundary.width}px`;\n boxElement.style.left = `${boundary.left}px`;\n\n if (direction === Direction.TOP) {\n boxElement.style.top = 'unset';\n boxElement.style.bottom = `${viewport.height - boundary.top + margin}px`;\n boxElement.classList.add('open-upward');\n } else {\n boxElement.style.top = `${boundary.bottom + margin}px`;\n boxElement.style.bottom = 'unset';\n boxElement.classList.remove('open-upward');\n }\n }\n\n private handleViewportChange(_event: Event): void {\n const selector = this.mSelector();\n if (!selector) {\n return;\n }\n if (!this.isOpen() || this.isCompact()) {\n return;\n }\n const boundary = this.element.nativeElement.getBoundingClientRect();\n\n if (isOutOfViewport(boundary)) {\n this.close();\n return;\n }\n\n const { base, dir, align, width, height } = selector;\n\n const style = calculatePosition(boundary, dir, width, height, align);\n\n this.domService.updateStyle(base, {\n ...style,\n });\n\n if (selector.matchTriggerWidth) {\n this.alignToTrigger();\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"magmonium-one-selector-CLSwVQCJ.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/services/device.ts","../../../../libs/one/src/lib/shared/services/dom.ts","../../../../libs/one/src/lib/shared/services/scroll.ts","../../../../libs/one/src/lib/shared/services/overlay/overlay.service.ts","../../../../libs/one/src/lib/shared/services/theme.service.ts","../../../../libs/one/src/lib/shared/directives/selector/selector-type.ts","../../../../libs/one/src/lib/shared/directives/selector/selector-helper.ts","../../../../libs/one/src/lib/shared/directives/selector/selector.ts"],"sourcesContent":["import { DestroyRef, inject, Injectable, signal } from '@angular/core';\n\nconst MOBILE_QUERY = '(max-width: 767px)';\nconst TABLET_QUERY = '(min-width: 768px) and (max-width: 1199px)';\nconst DESKTOP_QUERY = '(min-width: 1200px)';\nconst TOUCH_QUERY = '(pointer: coarse)';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DeviceService {\n readonly isMobile = signal(this.matches(MOBILE_QUERY));\n readonly isTablet = signal(this.matches(TABLET_QUERY));\n readonly isDesktop = signal(this.matches(DESKTOP_QUERY));\n readonly isTouch = signal(this.matches(TOUCH_QUERY));\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n this.listen(MOBILE_QUERY, this.isMobile);\n this.listen(TABLET_QUERY, this.isTablet);\n this.listen(DESKTOP_QUERY, this.isDesktop);\n this.listen(TOUCH_QUERY, this.isTouch);\n }\n\n private matches(query: string): boolean {\n return typeof window !== 'undefined' && window.matchMedia(query).matches;\n }\n\n private listen(query: string, sig: ReturnType<typeof signal<boolean>>): void {\n if (typeof window === 'undefined') return;\n const mql = window.matchMedia(query);\n const handler = (e: MediaQueryListEvent): void => sig.set(e.matches);\n mql.addEventListener('change', handler);\n this.destroyRef.onDestroy(() => mql.removeEventListener('change', handler));\n }\n}\n","import {\n ApplicationRef,\n Binding,\n ComponentRef,\n createComponent,\n DOCUMENT,\n EmbeddedViewRef,\n inject,\n Injectable,\n Renderer2,\n RendererFactory2,\n signal,\n Type,\n} from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { DeviceService } from './device';\n\ntype DomCreate<T> = {\n component: Type<T>;\n className: string;\n styles?: Record<string, string | number>;\n id?: string;\n parentClassName?: string;\n parentStyles?: Record<string, string | number>;\n bindings?: Binding[];\n};\n\ntype DomDestroy<T> = {\n componentRef?: ComponentRef<T>;\n parentClassName?: string;\n id?: string;\n className?: string;\n};\n\ntype DomAppend = {\n child: HTMLDivElement;\n className: string;\n styles?: Record<string, string | number>;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DomService {\n readonly fullscreen = signal(false);\n private readonly document = inject(DOCUMENT);\n private readonly applicationRef = inject(ApplicationRef);\n private readonly renderer: Renderer2;\n private readonly rendererFactory = inject(RendererFactory2);\n private readonly deviceService = inject(DeviceService);\n private readonly animationDuration = 300;\n\n constructor() {\n this.renderer = this.rendererFactory.createRenderer(null, null);\n }\n\n /**\n * Creates and appends a component to the DOM\n * @param config - Configuration object for creating the component\n * @returns ComponentRef if successful, undefined if element already exists\n */\n public create<T>({\n component,\n className,\n styles,\n id,\n parentClassName,\n parentStyles,\n bindings,\n }: DomCreate<T>): ComponentRef<T> | undefined {\n const existingElement = this.document.querySelector(`#${id}`);\n if (existingElement) {\n return undefined;\n }\n const componentRef: ComponentRef<T> = createComponent(component, {\n environmentInjector: this.applicationRef.injector,\n bindings,\n });\n this.applicationRef.attachView(componentRef.hostView);\n const child = this.document.createElement('div');\n child.className = className;\n this.applyStyles(child, styles);\n if (id) {\n child.id = id;\n }\n this.renderer.appendChild(\n child,\n (componentRef.hostView as EmbeddedViewRef<T>).rootNodes[0]\n );\n if (parentClassName) {\n this.append({ className: parentClassName, child, styles: parentStyles });\n return componentRef;\n }\n this.renderer.appendChild(this.document.querySelector('body'), child);\n return componentRef;\n }\n\n /**\n * Destroys a component and removes its DOM element\n * @param config - Configuration object for destroying the component\n */\n public destroy<T>({\n componentRef,\n parentClassName,\n id,\n className,\n }: DomDestroy<T>): void {\n const parent = parentClassName\n ? this.document?.querySelector(`.${parentClassName}`)\n : undefined;\n const elm = parent\n ? id\n ? parent.querySelector(`#${id}`)\n : parent.querySelector(`.${className}`)\n : (this.document?.querySelector(`.${className}`) ??\n this.document?.querySelector(`#${id}`));\n if (!elm) {\n return;\n }\n if (componentRef) {\n this.applicationRef.detachView(componentRef.hostView);\n componentRef.destroy();\n }\n elm.remove();\n }\n\n /**\n * Enables scrolling on the document body\n */\n public addBodyScroll(): void {\n this.document.body.style.overflow = 'auto';\n }\n\n /**\n * Disables scrolling on the document body\n */\n\n public removeBodyScroll(): void {\n this.document.body.style.overflow = 'hidden';\n }\n\n readonly toggleFullScreen = (): void => {\n const doc = this.document as Document & {\n webkitFullscreenElement?: Element;\n webkitExitFullscreen?: () => Promise<void>;\n };\n const docEl = doc.documentElement as HTMLElement & {\n webkitRequestFullscreen?: () => Promise<void>;\n };\n\n if (doc.fullscreenElement || doc.webkitFullscreenElement) {\n const exit =\n doc.exitFullscreen?.bind(doc) ?? doc.webkitExitFullscreen?.bind(doc);\n exit?.();\n this.fullscreen.set(false);\n } else {\n const request =\n docEl.requestFullscreen?.bind(docEl) ??\n docEl.webkitRequestFullscreen?.bind(docEl);\n request?.();\n this.fullscreen.set(true);\n }\n };\n\n readonly showHideScroll = (className: string): void => {\n const element = this.document.querySelector(`.${className}`);\n this.document.body.style.overflow = element ? 'hidden' : 'auto';\n };\n\n readonly toggleBodyScroll = (): void => {\n const isHidden = this.document.body.style.overflow === 'hidden';\n this.document.body.style.overflow = isHidden ? 'auto' : 'hidden';\n };\n\n readonly remove = (\n id: string,\n parentClassName: string,\n componentRef?: ComponentRef<unknown>\n ): void => {\n const parent = this.document.querySelector(`.${parentClassName}`);\n const element = parent?.querySelector(`#${id}`) as HTMLElement | null;\n if (!element) return;\n\n element.style.transition = `opacity ${this.animationDuration}ms ease`;\n element.style.opacity = '0';\n\n setTimeout(() => {\n if (componentRef) {\n this.applicationRef.detachView(componentRef.hostView);\n componentRef.destroy();\n }\n element.remove();\n }, this.animationDuration);\n };\n\n readonly updateStyle = (\n className: string,\n styles?: Record<string, string | number>\n ): void => {\n const element = this.document.querySelector(\n `.${className}`\n ) as HTMLElement | null;\n if (!element || !styles) return;\n this.applyStyles(element, styles);\n };\n\n /**\n * Targets a single element by id. `updateStyle` resolves by class and takes the\n * first match, which cannot address one element among siblings sharing a class.\n */\n readonly updateStyleById = ({\n id,\n parentClassName,\n styles,\n }: {\n id: string;\n parentClassName?: string;\n styles?: Record<string, string | number>;\n }): void => {\n const parent = parentClassName\n ? this.document.querySelector(`.${parentClassName}`)\n : this.document;\n const element = parent?.querySelector(`#${id}`) as HTMLElement | null;\n if (!element || !styles) return;\n this.applyStyles(element, styles);\n };\n\n readonly positionRelativeTo = (\n element: HTMLElement,\n boundary: DOMRect\n ): void => {\n const positionClass = Array.from(element.classList).find((cls) =>\n ['top-left', 'top-right', 'bottom-left', 'bottom-right'].includes(cls)\n );\n this.applyPositionFromClass(\n element,\n boundary,\n positionClass ?? 'bottom-left'\n );\n };\n\n readonly createDom = (\n html: string,\n className: string,\n boundary?: DOMRect\n ): HTMLDivElement => {\n let element = this.document.querySelector(\n `.${className}`\n ) as HTMLDivElement | null;\n if (!element) {\n element = this.document.createElement('div');\n element.className = className;\n this.renderer.appendChild(this.document.body, element);\n }\n element.innerHTML = html;\n if (boundary) {\n this.positionRelativeTo(element, boundary);\n }\n return element;\n };\n\n readonly observeMutations = (\n targetNode: Node,\n config: MutationObserverInit = { childList: true, subtree: true }\n ): Observable<MutationRecord[]> => {\n return new Observable<MutationRecord[]>((subscriber) => {\n const observer = new MutationObserver((mutations) => {\n subscriber.next(mutations);\n });\n observer.observe(targetNode, config);\n return () => observer.disconnect();\n });\n };\n\n readonly cleanup = (parentClassName: string): void => {\n const parent = this.document.querySelector(`.${parentClassName}`);\n if (parent) {\n parent.remove();\n }\n };\n\n readonly createAndAppend = <T>(\n config: DomCreate<T> & { boundary?: DOMRect }\n ): ComponentRef<T> | undefined => {\n const { boundary, ...createConfig } = config;\n const componentRef = this.create<T>(createConfig);\n if (componentRef && boundary) {\n const hostElement = (componentRef.hostView as EmbeddedViewRef<T>)\n .rootNodes[0] as HTMLElement;\n const wrapper = hostElement?.parentElement;\n if (wrapper) {\n this.positionRelativeTo(wrapper, boundary);\n }\n }\n return componentRef;\n };\n\n /**\n * Applies styles to a DOM element using Angular Renderer2\n * @param element - The HTML element to apply styles to\n * @param styles - Object containing CSS property-value pairs\n */\n private applyStyles(\n element: HTMLElement,\n styles?: Record<string, string | number>\n ): void {\n if (!styles) return;\n\n Object.entries(styles).forEach(([property, value]) => {\n this.renderer.setStyle(element, property, value);\n });\n }\n\n /**\n * Appends a child element to a parent with the specified class name\n * Creates the parent if it doesn't exist\n * @param config - Configuration object for appending the element\n */\n private append({ className, styles, child }: DomAppend): void {\n const parentClass = `.${className}`;\n let parentElement = this.document.querySelector(parentClass) as HTMLElement;\n if (!parentElement) {\n parentElement = this.document.createElement('div') as HTMLElement;\n parentElement.className = className;\n this.applyStyles(parentElement, styles);\n this.renderer.appendChild(\n this.document.querySelector('body') as HTMLElement,\n parentElement\n );\n }\n this.renderer.appendChild(parentElement, child);\n }\n\n private readonly applyPositionFromClass = (\n element: HTMLElement,\n boundary: DOMRect,\n positionClass: string\n ): void => {\n const isMobile = this.deviceService.isMobile();\n const styles: Record<string, string> = { position: 'absolute' };\n\n if (isMobile) {\n styles['left'] = '0';\n styles['right'] = '0';\n styles['bottom'] = '0';\n } else {\n switch (positionClass) {\n case 'top-left':\n styles['top'] = `${boundary.top}px`;\n styles['left'] = `${boundary.left}px`;\n break;\n case 'top-right':\n styles['top'] = `${boundary.top}px`;\n styles['left'] = `${boundary.right}px`;\n break;\n case 'bottom-right':\n styles['top'] = `${boundary.bottom}px`;\n styles['left'] = `${boundary.right}px`;\n break;\n case 'bottom-left':\n default:\n styles['top'] = `${boundary.bottom}px`;\n styles['left'] = `${boundary.left}px`;\n break;\n }\n }\n\n Object.entries(styles).forEach(([prop, val]) => {\n this.renderer.setStyle(element, prop, val);\n });\n };\n}\n","import { Injectable, signal } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ScrollService {\n /**\n * Reactive signal containing the scroll top position of the window.\n */\n readonly scrollTop = signal(0);\n\n constructor() {\n this.setupWindowScroll();\n }\n\n private setupWindowScroll(): void {\n const onScroll = (event?: Event) => {\n let top = 0;\n\n // If we have an event and it's from an element (not document/window)\n if (\n event?.target &&\n event.target !== document &&\n event.target !== window\n ) {\n const target = event.target as HTMLElement;\n top = target.scrollTop;\n } else {\n // Fallback to window scroll\n top =\n window.pageYOffset ||\n document.documentElement.scrollTop ||\n document.body.scrollTop ||\n 0;\n }\n\n this.scrollTop.set(top);\n };\n\n // Use capture: true to catch scroll events that don't bubble\n window.addEventListener('scroll', onScroll, {\n passive: true,\n capture: true,\n });\n\n // Initial set\n onScroll();\n }\n}\n","import {\n ApplicationRef,\n ComponentRef,\n createComponent,\n EnvironmentInjector,\n inject,\n Injectable,\n Type,\n Binding,\n} from '@angular/core';\n\nexport interface OverlayConfig {\n triggerElement: HTMLElement;\n offsetY?: number;\n backdropClass?: string;\n bindings?: Binding[];\n closeOnFocusOut?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class OverlayService {\n private readonly appRef = inject(ApplicationRef);\n private readonly injector = inject(EnvironmentInjector);\n private overlayContainer?: HTMLElement;\n\n open<T>(component: Type<T>, config: OverlayConfig): OverlayRef<T> {\n // Check if container exists and is still in the DOM\n if (\n !this.overlayContainer ||\n !document.body.contains(this.overlayContainer)\n ) {\n this.overlayContainer = document.createElement('div');\n this.overlayContainer.className = 'overlay-container';\n document.body.appendChild(this.overlayContainer);\n }\n\n const backdrop = document.createElement('div');\n backdrop.className = config.backdropClass || 'overlay-backdrop';\n this.overlayContainer.appendChild(backdrop);\n\n const wrapper = document.createElement('div');\n wrapper.className = 'overlay-wrapper';\n this.overlayContainer.appendChild(wrapper);\n\n const componentRef = createComponent(component, {\n environmentInjector: this.injector,\n hostElement: wrapper,\n bindings: config.bindings || [],\n });\n\n this.appRef.attachView(componentRef.hostView);\n\n this.position(wrapper, config.triggerElement, config.offsetY || 4);\n\n return new OverlayRef(\n componentRef,\n backdrop,\n wrapper,\n this.overlayContainer,\n config.triggerElement,\n config.offsetY || 4,\n config.closeOnFocusOut ?? false\n );\n }\n\n private position(\n element: HTMLElement,\n trigger: HTMLElement,\n offsetY: number\n ): void {\n const triggerRect = trigger.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n element.style.position = 'fixed';\n element.style.zIndex = '9999';\n\n // Let the element render to get its natural dimensions\n element.style.visibility = 'hidden';\n element.style.display = 'block';\n const elementRect = element.getBoundingClientRect();\n element.style.visibility = '';\n\n const widthDiff = elementRect.width - triggerRect.width;\n const shouldConsiderHorizontal = widthDiff > 150;\n\n let position: 'top' | 'bottom' | 'left' | 'right' = 'bottom';\n let left = triggerRect.left;\n let top = triggerRect.bottom + offsetY;\n\n if (shouldConsiderHorizontal) {\n // Check if there's space on the right\n const spaceRight = viewportWidth - triggerRect.right;\n const spaceLeft = triggerRect.left;\n const spaceBottom = viewportHeight - triggerRect.bottom;\n // Prefer right, then left, then bottom, then top\n if (spaceRight >= elementRect.width + offsetY) {\n position = 'right';\n left = triggerRect.right + offsetY;\n top = triggerRect.top;\n } else if (spaceLeft >= elementRect.width + offsetY) {\n position = 'left';\n left = triggerRect.left - elementRect.width - offsetY;\n top = triggerRect.top;\n } else if (spaceBottom >= elementRect.height + offsetY) {\n position = 'bottom';\n left = Math.max(\n offsetY,\n Math.min(\n triggerRect.left,\n viewportWidth - elementRect.width - offsetY\n )\n );\n top = triggerRect.bottom + offsetY;\n } else {\n position = 'top';\n left = Math.max(\n offsetY,\n Math.min(\n triggerRect.left,\n viewportWidth - elementRect.width - offsetY\n )\n );\n top = triggerRect.top - elementRect.height - offsetY;\n }\n } else {\n // Only consider top/bottom positioning\n const spaceBottom = viewportHeight - triggerRect.bottom;\n const spaceTop = triggerRect.top;\n\n if (spaceBottom >= elementRect.height + offsetY) {\n position = 'bottom';\n left = triggerRect.left;\n top = triggerRect.bottom + offsetY;\n } else if (spaceTop >= elementRect.height + offsetY) {\n position = 'top';\n left = triggerRect.left;\n top = triggerRect.top - elementRect.height - offsetY;\n } else {\n // Not enough space either way, prefer bottom\n position = 'bottom';\n left = triggerRect.left;\n top = triggerRect.bottom + offsetY;\n }\n\n // Match trigger width when positioned top/bottom\n element.style.width = `${triggerRect.width}px`;\n }\n\n element.style.left = `${left}px`;\n element.style.top = `${top}px`;\n element.setAttribute('data-position', position);\n }\n}\n\nexport class OverlayRef<T> {\n private readonly repositionHandler: () => void;\n private readonly backdropClickPromise: Promise<void>;\n private backdropClickResolve?: () => void;\n private readonly backdropClickHandler: () => void;\n private readonly focusOutPromise: Promise<void>;\n private focusOutResolve?: () => void;\n private readonly triggerFocusOutHandler?: (event: FocusEvent) => void;\n private readonly overlayFocusOutHandler?: (event: FocusEvent) => void;\n\n constructor(\n public componentRef: ComponentRef<T>,\n private backdrop: HTMLElement,\n private wrapper: HTMLElement,\n private container: HTMLElement,\n private trigger: HTMLElement,\n private offsetY: number,\n private closeOnFocusOut: boolean\n ) {\n this.repositionHandler = () => this.updatePosition();\n window.addEventListener('scroll', this.repositionHandler, true);\n window.addEventListener('resize', this.repositionHandler);\n\n this.backdropClickPromise = new Promise((resolve) => {\n this.backdropClickResolve = resolve;\n });\n this.backdropClickHandler = () => {\n if (this.backdropClickResolve) {\n this.backdropClickResolve();\n }\n };\n this.backdrop.addEventListener('click', this.backdropClickHandler);\n\n // Setup focus tracking if enabled\n this.focusOutPromise = new Promise((resolve) => {\n this.focusOutResolve = resolve;\n });\n\n if (this.closeOnFocusOut) {\n this.triggerFocusOutHandler = (event: FocusEvent) => {\n this.handleFocusOut(event, 'trigger');\n };\n this.overlayFocusOutHandler = (event: FocusEvent) => {\n this.handleFocusOut(event, 'overlay');\n };\n\n this.trigger.addEventListener('focusout', this.triggerFocusOutHandler);\n this.wrapper.addEventListener('focusout', this.overlayFocusOutHandler);\n }\n }\n\n backdropClick(): Promise<void> {\n return this.backdropClickPromise;\n }\n\n focusOut(): Promise<void> {\n return this.focusOutPromise;\n }\n\n dispose(): void {\n // Clean up scroll/resize listeners\n window.removeEventListener('scroll', this.repositionHandler, true);\n window.removeEventListener('resize', this.repositionHandler);\n\n // Clean up backdrop click listener\n if (this.backdrop && this.backdropClickHandler) {\n this.backdrop.removeEventListener('click', this.backdropClickHandler);\n }\n\n // Clean up focus tracking listeners\n if (this.closeOnFocusOut) {\n if (this.trigger && this.triggerFocusOutHandler) {\n this.trigger.removeEventListener(\n 'focusout',\n this.triggerFocusOutHandler\n );\n }\n if (this.wrapper && this.overlayFocusOutHandler) {\n this.wrapper.removeEventListener(\n 'focusout',\n this.overlayFocusOutHandler\n );\n }\n }\n\n // Destroy component\n if (this.componentRef) {\n this.componentRef.destroy();\n }\n\n // Remove DOM elements\n if (this.backdrop && this.backdrop.parentNode) {\n this.backdrop.parentNode.removeChild(this.backdrop);\n }\n if (this.wrapper && this.wrapper.parentNode) {\n this.wrapper.parentNode.removeChild(this.wrapper);\n }\n\n // Clean up container if empty\n if (this.container && this.container.children.length === 0) {\n if (this.container.parentNode) {\n this.container.parentNode.removeChild(this.container);\n }\n }\n }\n\n private handleFocusOut(\n event: FocusEvent,\n _source: 'trigger' | 'overlay'\n ): void {\n const relatedTarget = event.relatedTarget as HTMLElement | null;\n\n // If relatedTarget is null, focus might be moving to a non-focusable element\n // (e.g., clicking a button that doesn't retain focus)\n // Use a timeout to check if focus actually left the overlay\n if (!relatedTarget) {\n setTimeout(() => {\n const activeElement = document.activeElement as HTMLElement | null;\n\n // If focus went to body or null, it likely means a click happened\n // inside the overlay on a non-focusable element - don't close\n if (!activeElement || activeElement === document.body) {\n return;\n }\n\n const focusInTrigger = this.trigger?.contains(activeElement);\n const focusInOverlay = this.wrapper?.contains(activeElement);\n\n if (!focusInTrigger && !focusInOverlay) {\n if (this.focusOutResolve) {\n this.focusOutResolve();\n }\n }\n }, 0);\n return;\n }\n\n // Check if focus is moving to the other element (trigger <-> overlay)\n const focusStaysInTrigger = this.trigger.contains(relatedTarget);\n const focusStaysInOverlay = this.wrapper.contains(relatedTarget);\n\n // Only trigger focusOut if focus moves outside both trigger and overlay\n if (!focusStaysInTrigger && !focusStaysInOverlay) {\n if (this.focusOutResolve) {\n this.focusOutResolve();\n }\n }\n }\n\n private updatePosition(): void {\n const triggerRect = this.trigger.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const elementRect = this.wrapper.getBoundingClientRect();\n\n const widthDiff = elementRect.width - triggerRect.width;\n const shouldConsiderHorizontal = widthDiff > 150;\n\n let left = triggerRect.left;\n let top = triggerRect.bottom + this.offsetY;\n let position: 'top' | 'bottom' | 'left' | 'right' = 'bottom';\n\n if (shouldConsiderHorizontal) {\n // Check available space in all directions\n const spaceRight = viewportWidth - triggerRect.right;\n const spaceLeft = triggerRect.left;\n const spaceBottom = viewportHeight - triggerRect.bottom;\n // Prefer right, then left, then bottom, then top\n if (spaceRight >= elementRect.width + this.offsetY) {\n position = 'right';\n left = triggerRect.right + this.offsetY;\n top = triggerRect.top;\n } else if (spaceLeft >= elementRect.width + this.offsetY) {\n position = 'left';\n left = triggerRect.left - elementRect.width - this.offsetY;\n top = triggerRect.top;\n } else if (spaceBottom >= elementRect.height + this.offsetY) {\n position = 'bottom';\n left = Math.max(\n this.offsetY,\n Math.min(\n triggerRect.left,\n viewportWidth - elementRect.width - this.offsetY\n )\n );\n top = triggerRect.bottom + this.offsetY;\n } else {\n position = 'top';\n left = Math.max(\n this.offsetY,\n Math.min(\n triggerRect.left,\n viewportWidth - elementRect.width - this.offsetY\n )\n );\n top = triggerRect.top - elementRect.height - this.offsetY;\n }\n\n // Remove width constraint for horizontal positioning\n this.wrapper.style.width = '';\n } else {\n // Only consider top/bottom positioning\n const spaceBottom = viewportHeight - triggerRect.bottom;\n const spaceTop = triggerRect.top;\n\n if (spaceBottom >= elementRect.height + this.offsetY) {\n position = 'bottom';\n left = triggerRect.left;\n top = triggerRect.bottom + this.offsetY;\n } else if (spaceTop >= elementRect.height + this.offsetY) {\n position = 'top';\n left = triggerRect.left;\n top = triggerRect.top - elementRect.height - this.offsetY;\n } else {\n // Not enough space either way, prefer bottom\n position = 'bottom';\n left = triggerRect.left;\n top = triggerRect.bottom + this.offsetY;\n }\n\n // Match trigger width when positioned top/bottom\n this.wrapper.style.width = `${triggerRect.width}px`;\n }\n\n this.wrapper.style.left = `${left}px`;\n this.wrapper.style.top = `${top}px`;\n this.wrapper.setAttribute('data-position', position);\n }\n}\n","import { computed, inject, Injectable } from '@angular/core';\nimport { ThemeStore } from '../lib/theme';\nimport { ThemeColor } from '@magmonium/cli';\n\n@Injectable({ providedIn: 'root' })\nexport class ThemeService {\n private readonly themeStore = inject(ThemeStore);\n\n readonly color = computed<ThemeColor | undefined>(() =>\n this.themeStore.color()\n );\n\n readonly theme = computed(() => this.themeStore.theme());\n}\n","import { Binding, Type } from '@angular/core';\n\nexport enum Direction {\n TOP = 'top',\n BOTTOM = 'bottom',\n LEFT = 'left',\n RIGHT = 'right',\n CENTER = 'center',\n UP_DOWN = 'up-down',\n}\n\nexport type SelectorConfig<T> = {\n component: Type<T>;\n base: string;\n width?: string;\n height?: string;\n toggle?: boolean;\n matchTriggerWidth?: boolean;\n dir?: Direction;\n align?: 'left' | 'right';\n bindings?: Binding[];\n};\n","import { Direction } from './selector-type';\n\nexport function isOutOfViewport(boundary: DOMRect): boolean {\n const margin = 8;\n return (\n boundary.top + boundary.height + margin < 0 ||\n boundary.left + boundary.width + margin < 0 ||\n boundary.bottom - margin > window.innerHeight ||\n boundary.right - margin > window.innerWidth\n );\n}\n\nexport function calculatePosition(\n boundary: DOMRect,\n direction?: Direction,\n width = '250px',\n height = '300px',\n align?: 'left' | 'right'\n): Record<string, string> {\n const margin = 8;\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n\n const contentWidth = parseInt(width) || 250;\n // Use 0 for unknown/auto height so direction picks the side with more space\n // rather than assuming a fixed 300px that causes unnecessary flips\n const contentHeight = parseInt(height) || 0;\n\n const space = {\n top: boundary.top,\n bottom: viewport.height - boundary.bottom,\n left: boundary.left,\n right: viewport.width - boundary.right,\n };\n\n const centerX = boundary.left + boundary.width / 2;\n const centerY = boundary.top + boundary.height / 2;\n\n direction = detectBestDirection(\n space,\n {\n width: contentWidth,\n height: contentHeight,\n },\n direction\n );\n\n const horizontalLeft =\n align === 'right'\n ? calculateRightAlignedPosition(boundary.right, contentWidth, viewport.width)\n : align === 'left'\n ? calculateLeftAlignedPosition(boundary.left, contentWidth, viewport.width)\n : calculateHorizontalPosition(centerX, contentWidth, viewport.width);\n\n const positionMap: Record<Direction, Record<string, string>> = {\n [Direction.TOP]: {\n top: 'unset',\n bottom: `${viewport.height - boundary.top + margin}px`,\n 'max-height': `${Math.max(space.top - margin * 2, 0)}px`,\n left: horizontalLeft,\n },\n [Direction.BOTTOM]: {\n top: `${boundary.bottom + margin}px`,\n bottom: 'unset',\n 'max-height': `${Math.max(space.bottom - margin * 2, 0)}px`,\n left: horizontalLeft,\n },\n [Direction.LEFT]: {\n right: `${viewport.width - boundary.left + margin}px`,\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n },\n [Direction.RIGHT]: {\n left: `${boundary.right + margin}px`,\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n },\n [Direction.CENTER]: {\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n left: horizontalLeft,\n },\n [Direction.UP_DOWN]: {\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n left: `${boundary.left}px`,\n },\n };\n\n return (\n positionMap[direction] || {\n top: calculateVerticalPosition(centerY, contentHeight, viewport.height),\n left: horizontalLeft,\n }\n );\n}\n\nexport function detectBestDirection(\n space: { top: number; bottom: number; left: number; right: number },\n content: { width: number; height: number },\n preferredDirection?: Direction\n): Direction {\n const margin = 8;\n const fits = (available: number, needed: number) =>\n available >= needed + margin;\n\n // If an explicit direction is requested and it fits, honour it\n if (preferredDirection && preferredDirection !== Direction.UP_DOWN) {\n const dirFits: Record<string, boolean> = {\n [Direction.BOTTOM]: fits(space.bottom, content.height),\n [Direction.TOP]: fits(space.top, content.height),\n [Direction.LEFT]: fits(space.left, content.width),\n [Direction.RIGHT]: fits(space.right, content.width),\n };\n if (dirFits[preferredDirection]) {\n return preferredDirection;\n }\n }\n\n // If height is unknown (0), always prefer BOTTOM\n if (content.height <= 0) {\n return Direction.BOTTOM;\n }\n\n // If height is known, check if it fits in the preferred vertical order\n if (fits(space.bottom, content.height)) {\n return Direction.BOTTOM;\n }\n if (fits(space.top, content.height)) {\n return Direction.TOP;\n }\n\n // If it doesn't fit vertically, but UP_DOWN was requested, still return BOTTOM (it will be clipped by max-height)\n if (preferredDirection === Direction.UP_DOWN) {\n return Direction.BOTTOM;\n }\n\n // Last resort: pick horizontal side that fits better\n if (fits(space.right, content.width)) {\n return Direction.RIGHT;\n }\n if (fits(space.left, content.width)) {\n return Direction.LEFT;\n }\n\n // Final fallback: BOTTOM (let max-height and scrolling handle it)\n return Direction.BOTTOM;\n}\n\nfunction calculateHorizontalPosition(\n center: number,\n width: number,\n viewportWidth: number\n): string {\n return calculatePosition1D(center, width, viewportWidth);\n}\n\nfunction calculateRightAlignedPosition(\n rightEdge: number,\n width: number,\n viewportWidth: number\n): string {\n const start = rightEdge - width;\n if (start < 0) return '0px';\n if (start + width > viewportWidth) return `${viewportWidth - width}px`;\n return `${start}px`;\n}\n\nfunction calculateLeftAlignedPosition(\n leftEdge: number,\n width: number,\n viewportWidth: number\n): string {\n if (leftEdge < 0) return '0px';\n if (leftEdge + width > viewportWidth) return `${viewportWidth - width}px`;\n return `${leftEdge}px`;\n}\n\nfunction calculateVerticalPosition(\n center: number,\n height: number,\n viewportHeight: number\n): string {\n return calculatePosition1D(center, height, viewportHeight);\n}\n\nfunction calculatePosition1D(\n center: number,\n size: number,\n viewportSize: number\n): string {\n const start = center - size / 2;\n if (start < 0) {\n return '0px';\n }\n if (start + size > viewportSize) {\n return `${viewportSize - size}px`;\n }\n return `${start}px`;\n}\n","import {\n ComponentRef,\n DOCUMENT,\n Directive,\n ElementRef,\n HostListener,\n inject,\n input,\n linkedSignal,\n OnDestroy,\n output,\n signal,\n} from '@angular/core';\nimport { DeviceService, DomService } from '../../services';\nimport { SelectorConfig, Direction } from './selector-type';\nimport {\n calculatePosition,\n isOutOfViewport,\n detectBestDirection,\n} from './selector-helper';\nimport { MODAL_STORE_REF, ModalStoreRef } from '../../config/tokens';\n\n@Directive({\n selector: '[mSelector]',\n exportAs: 'mSelector',\n host: {\n '[class.active]': 'isOpen()',\n },\n})\nexport class SelectorDirective implements OnDestroy {\n private static openSelector: Record<string, SelectorDirective> = {};\n mSelector = input<SelectorConfig<unknown> | undefined>(undefined);\n disabled = input<boolean>(false);\n readonly opened = output<void>();\n readonly closed = output<void>();\n private readonly deviceService = inject(DeviceService);\n private readonly domService = inject(DomService);\n private readonly modalStore = inject(MODAL_STORE_REF, {\n optional: true,\n }) as ModalStoreRef | null;\n private readonly element = inject(ElementRef<HTMLElement>);\n private readonly doc = inject(DOCUMENT);\n private componentRef?: ComponentRef<unknown>;\n private modalId = signal<string | undefined>(undefined);\n private triggerFocusOutHandler?: (event: FocusEvent) => void;\n private boxFocusOutHandler?: (event: FocusEvent) => void;\n private outsideMouseDownHandler?: (event: MouseEvent) => void;\n private readonly isCompact = (): boolean =>\n this.deviceService.isMobile() ||\n this.deviceService.isTablet() ||\n this.deviceService.isTouch();\n\n protected readonly isOpen = linkedSignal({\n source: () => ({\n triggerMap: this.modalStore?.modalTriggerMap() ?? {},\n id: this.modalId(),\n isCompact:\n this.deviceService.isMobile() ||\n this.deviceService.isTablet() ||\n this.deviceService.isTouch(),\n }),\n computation: ({ triggerMap, id, isCompact }, previous) => {\n if (isCompact && id && !triggerMap[id]) {\n this.closed.emit();\n return false;\n }\n return previous?.value ?? false;\n },\n });\n\n @HostListener('click', ['$event'])\n @HostListener('keydown.enter', ['$event'])\n @HostListener('keydown.space', ['$event'])\n @HostListener('keydown.tab', ['$event'])\n @HostListener('focus', ['$event'])\n onClick(_e: unknown): void {\n if (this.disabled()) {\n return;\n }\n if (this.isOpen()) {\n this.close();\n return;\n }\n this.open();\n }\n\n // Keyboard opening, for a trigger whose visible affordance sits out of tab\n // order — a dropdown chevron, a date calendar. The field itself is the tab\n // stop, and ArrowDown on it is what opens the panel. Open only: Escape and a\n // selection close it, and ArrowDown moving into the list must never toggle\n // the panel shut under it.\n @HostListener('keydown.arrowdown', ['$event'])\n onArrowDown(event: Event): void {\n if (this.disabled() || this.isOpen()) return;\n event.preventDefault();\n this.open();\n }\n\n @HostListener('window:scroll', ['$event'])\n @HostListener('window:resize', ['$event'])\n onScroll(_event: Event): void {\n this.handleViewportChange(_event);\n }\n\n ngOnDestroy(): void {\n this.teardownFocusTracking();\n this.close();\n const selector = this.mSelector();\n if (!selector) {\n return;\n }\n if (SelectorDirective.openSelector[selector.base] === this) {\n delete SelectorDirective.openSelector[selector.base];\n }\n }\n\n close(): void {\n if (!this.isOpen()) {\n return;\n }\n this.teardownFocusTracking();\n const selector = this.mSelector();\n if (!selector) {\n return;\n }\n const { base } = selector;\n if (this.isCompact()) {\n this.modalStore?.close(this.modalId());\n } else {\n this.domService.destroy({\n componentRef: this.componentRef,\n parentClassName: 'm-selector-box',\n className: base,\n });\n }\n if (SelectorDirective.openSelector[base] === this) {\n delete SelectorDirective.openSelector[base];\n }\n this.isOpen.set(false);\n this.closed.emit();\n }\n\n open() {\n if (this.isOpen()) {\n return;\n }\n const base = this.mSelector()?.base;\n if (!base) {\n return;\n }\n if (\n SelectorDirective.openSelector[base] &&\n SelectorDirective.openSelector[base] !== this\n ) {\n SelectorDirective.openSelector[base].close();\n }\n SelectorDirective.openSelector[base] = this;\n if (this.isCompact()) {\n this.openInModal();\n } else {\n this.openInBox();\n }\n this.isOpen.set(true);\n this.opened.emit();\n }\n\n private openInBox = () => {\n const selector = this.mSelector();\n\n if (!selector) {\n return;\n }\n\n const { component, base, bindings, dir, align, width, height } = selector;\n\n const boundary = this.element.nativeElement.getBoundingClientRect();\n const styles: Record<string, string> = {\n ...calculatePosition(boundary, dir, width, height, align),\n };\n\n this.componentRef = this.domService.create<unknown>({\n component,\n styles,\n parentClassName: 'm-selector-box',\n className: base,\n bindings,\n });\n\n if (selector.matchTriggerWidth) {\n this.alignToTrigger();\n } else if (!parseInt(height ?? '')) {\n // height was unknown/'auto' up front, so calculatePosition assumed 0\n // and defaulted to BOTTOM without checking available space — that same\n // \"unknown height\" branch also clamps the box's own max-height to\n // whatever little room is below the trigger, which pins its rendered\n // (clamped) height at/near 0 too, so getBoundingClientRect() can't be\n // used to recover the real size later. scrollHeight ignores that\n // clamp and reports the content's true intrinsic height once Angular\n // has actually rendered it (hence the rAF) — reflow off that instead.\n requestAnimationFrame(() => this.reflowAfterRender(boundary, selector));\n }\n\n requestAnimationFrame(() => this.setupFocusTracking());\n };\n\n private reflowAfterRender(\n boundary: DOMRect,\n selector: SelectorConfig<unknown>\n ): void {\n const boxElement = this.getBoxElement();\n if (!boxElement) return;\n const actualHeight = boxElement.scrollHeight;\n if (!actualHeight) return;\n\n const { base, dir, align, width } = selector;\n const style = calculatePosition(\n boundary,\n dir,\n width,\n `${actualHeight}px`,\n align\n );\n this.domService.updateStyle(base, { ...style });\n }\n\n private openInModal = () => {\n const selector = this.mSelector();\n if (!selector) {\n return;\n }\n const { component, bindings } = selector;\n this.modalId.set(\n this.modalStore?.open({\n component,\n bindings,\n name: 'bottom',\n one: true,\n // A sheet, not a card: dock the option list to the bottom edge like\n // every other compact overlay, so `.pop-up.align-bottom` and the box's\n // own `:host-context(.align-bottom)` de-chroming both apply.\n config: { align: 'bottom' },\n }) ?? undefined\n );\n };\n\n private getBoxElement(): HTMLElement | null {\n const base = this.mSelector()?.base;\n if (!base) return null;\n return this.doc.querySelector(\n `.m-selector-box .${base}`\n ) as HTMLElement | null;\n }\n\n private setupFocusTracking(): void {\n this.triggerFocusOutHandler = (event: FocusEvent) =>\n this.handleFocusOut(event);\n this.element.nativeElement.addEventListener(\n 'focusout',\n this.triggerFocusOutHandler\n );\n\n const boxElement = this.getBoxElement();\n if (boxElement) {\n this.boxFocusOutHandler = (event: FocusEvent) =>\n this.handleFocusOut(event);\n boxElement.addEventListener('focusout', this.boxFocusOutHandler);\n }\n\n this.outsideMouseDownHandler = (event: MouseEvent) =>\n this.handleOutsideMouseDown(event);\n this.doc.addEventListener('mousedown', this.outsideMouseDownHandler);\n }\n\n private teardownFocusTracking(): void {\n if (this.triggerFocusOutHandler) {\n this.element.nativeElement.removeEventListener(\n 'focusout',\n this.triggerFocusOutHandler\n );\n this.triggerFocusOutHandler = undefined;\n }\n if (this.boxFocusOutHandler) {\n const boxElement = this.getBoxElement();\n boxElement?.removeEventListener('focusout', this.boxFocusOutHandler);\n this.boxFocusOutHandler = undefined;\n }\n if (this.outsideMouseDownHandler) {\n this.doc.removeEventListener('mousedown', this.outsideMouseDownHandler);\n this.outsideMouseDownHandler = undefined;\n }\n }\n\n private handleFocusOut(event: FocusEvent): void {\n if (!this.isOpen()) return;\n\n const relatedTarget = event.relatedTarget as HTMLElement | null;\n const triggerElement = this.element.nativeElement;\n const boxElement = this.getBoxElement();\n const selectorContainer = this.doc.querySelector('.m-selector-box');\n\n if (!relatedTarget) {\n setTimeout(() => {\n if (!this.isOpen()) return;\n const activeElement = this.doc.activeElement as HTMLElement | null;\n if (!activeElement || activeElement === this.doc.body) return;\n\n const inTrigger = triggerElement.contains(activeElement);\n const inBox = boxElement?.contains(activeElement) ?? false;\n const inSelectorContainer =\n selectorContainer?.contains(activeElement) ?? false;\n if (!inTrigger && !inBox && !inSelectorContainer) {\n this.close();\n }\n }, 0);\n return;\n }\n\n const inTrigger = triggerElement.contains(relatedTarget);\n const inBox = boxElement?.contains(relatedTarget) ?? false;\n const inSelectorContainer =\n selectorContainer?.contains(relatedTarget) ?? false;\n if (!inTrigger && !inBox && !inSelectorContainer) {\n this.close();\n }\n }\n\n private handleOutsideMouseDown(event: MouseEvent): void {\n if (!this.isOpen()) return;\n\n const target = event.target as HTMLElement;\n const triggerElement = this.element.nativeElement;\n const boxElement = this.getBoxElement();\n\n const inTrigger = triggerElement.contains(target);\n const inBox = boxElement?.contains(target) ?? false;\n if (inTrigger || inBox) return;\n\n const selectorContainer = this.doc.querySelector('.m-selector-box');\n if (selectorContainer?.contains(target)) return;\n\n this.close();\n }\n\n private alignToTrigger(): void {\n const boxElement = this.getBoxElement();\n if (!boxElement) return;\n const boundary = this.element.nativeElement.getBoundingClientRect();\n const margin = 8;\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n const selector = this.mSelector();\n const width = selector?.width || '250px';\n const height = selector?.height || '300px';\n const contentWidth = parseInt(width) || 250;\n const contentHeight = parseInt(height) || 0;\n\n const space = {\n top: boundary.top,\n bottom: viewport.height - boundary.bottom,\n left: boundary.left,\n right: viewport.width - boundary.right,\n };\n\n const direction = detectBestDirection(\n space,\n {\n width: contentWidth,\n height: contentHeight,\n },\n selector?.dir\n );\n\n boxElement.style.width = `${boundary.width}px`;\n boxElement.style.left = `${boundary.left}px`;\n\n if (direction === Direction.TOP) {\n boxElement.style.top = 'unset';\n boxElement.style.bottom = `${viewport.height - boundary.top + margin}px`;\n boxElement.classList.add('open-upward');\n } else {\n boxElement.style.top = `${boundary.bottom + margin}px`;\n boxElement.style.bottom = 'unset';\n boxElement.classList.remove('open-upward');\n }\n }\n\n private handleViewportChange(_event: Event): void {\n const selector = this.mSelector();\n if (!selector) {\n return;\n }\n if (!this.isOpen() || this.isCompact()) {\n return;\n }\n const boundary = this.element.nativeElement.getBoundingClientRect();\n\n if (isOutOfViewport(boundary)) {\n this.close();\n return;\n }\n\n const { base, dir, align, width, height } = selector;\n\n const style = calculatePosition(boundary, dir, width, height, align);\n\n this.domService.updateStyle(base, {\n ...style,\n });\n\n if (selector.matchTriggerWidth) {\n this.alignToTrigger();\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -58,6 +58,10 @@ var AppAvailability;
|
|
|
58
58
|
const LOGIN_COMPONENT = new InjectionToken("LOGIN_COMPONENT");
|
|
59
59
|
const LOGIN_STORE = new InjectionToken("LOGIN_STORE");
|
|
60
60
|
const WC_BUNDLE = new InjectionToken("WC_BUNDLE");
|
|
61
|
+
const HOST_SESSION = new InjectionToken("HOST_SESSION", {
|
|
62
|
+
providedIn: "root",
|
|
63
|
+
factory: () => null
|
|
64
|
+
});
|
|
61
65
|
const ASSET_BASE_URL = new InjectionToken("ASSET_BASE_URL");
|
|
62
66
|
const ONE_ASSET_BASE_URL = new InjectionToken("ONE_ASSET_BASE_URL");
|
|
63
67
|
const SEARCH_QUERY = new InjectionToken("SEARCH_QUERY");
|
|
@@ -453,6 +457,13 @@ var SharedStoreRegistry = class {
|
|
|
453
457
|
static getLoginStore() {
|
|
454
458
|
return window.sharedStores?.loginStore;
|
|
455
459
|
}
|
|
460
|
+
static setSessionRenewal(renew) {
|
|
461
|
+
this.check();
|
|
462
|
+
if (!window.sharedStores.sessionRenewal) window.sharedStores.sessionRenewal = renew;
|
|
463
|
+
}
|
|
464
|
+
static getSessionRenewal() {
|
|
465
|
+
return window.sharedStores?.sessionRenewal;
|
|
466
|
+
}
|
|
456
467
|
static setNotificationStore(store) {
|
|
457
468
|
this.check();
|
|
458
469
|
if (!window.sharedStores.notificationStore) window.sharedStores.notificationStore = store;
|
|
@@ -1064,6 +1075,6 @@ const toSpacingValue = (value) => {
|
|
|
1064
1075
|
function resolveSpacing(value) {
|
|
1065
1076
|
return value === void 0 || value === null || value === "" ? void 0 : toLength(toSpacingValue(value));
|
|
1066
1077
|
}
|
|
1067
|
-
export {
|
|
1078
|
+
export { USER_STORE_REF as $, isUrlLocalhost as A, ICON_SOURCE as B, setWcLocalPort as C, getTierFromPreviewPath as D, wcTierOf as E, AppAvailability as F, LOGIN_STORE as G, IS_SIDE_PANEL as H, AppRelationType as I, ONE_ASSET_BASE_URL as J, MODAL_STORE_REF as K, COMPONENT_INPUT_REGISTRY as L, APP_CONTEXT_REF as M, APP_LINK as N, isLocalhost as O, ASSET_BASE_URL as P, TRANSLATION_SOURCE as Q, FOLDER_PICK_LISTENER as R, recordDefinedWcTier as S, wcLocalBaseOf as T, LOADING_ACTIONS_REF as U, IS_DESIGN_MODE as V, LOGIN_COMPONENT as W, SEARCH_QUERY as X, OPTIONS_SOURCE as Y, SEARCH_RESULTS_EVENT as Z, ACCESS_DOMAINS as _, resolveSpacing as a, DEFAULT_SIZE as at, definedWcBundleOf as b, TranslatePipe as c, browserLocale as d, WC_BUNDLE as et, miniMarkToHtml as f, isJson as g, StorageService as h, resolveSize as i, Assets as it, isWebComponent as j, isTierPreview as k, TranslateService as l, SharedStoreRegistry as m, isSize as n, FORM_ASSET_FOLDER as nt, toCssLength as o, Size as ot, AssetStore as p, NAV_STORE_REF as q, resolveIconSize as r, LAYOUT_ASSET_FOLDER as rt, toLength as s, coerceSize as t, WC_SEARCH_GROUPS as tt, BrowserLocaleService as u, HttpService as v, setWcTier as w, definedWcTierOf as x, buildWcBaseUrl as y, HOST_SESSION as z };
|
|
1068
1079
|
|
|
1069
|
-
//# sourceMappingURL=magmonium-one-size-converter-
|
|
1080
|
+
//# sourceMappingURL=magmonium-one-size-converter-DFIowQHO.mjs.map
|