@raqm/ui 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/LICENSE +21 -0
- package/NOTICE.md +28 -0
- package/README.md +126 -3
- package/combobox/README.md +17 -0
- package/fesm2022/raqm-ui-accordion.mjs +414 -0
- package/fesm2022/raqm-ui-accordion.mjs.map +1 -0
- package/fesm2022/raqm-ui-alert-dialog.mjs +457 -0
- package/fesm2022/raqm-ui-alert-dialog.mjs.map +1 -0
- package/fesm2022/raqm-ui-alert.mjs +195 -0
- package/fesm2022/raqm-ui-alert.mjs.map +1 -0
- package/fesm2022/raqm-ui-aspect-ratio.mjs +66 -0
- package/fesm2022/raqm-ui-aspect-ratio.mjs.map +1 -0
- package/fesm2022/raqm-ui-attachment.mjs +435 -0
- package/fesm2022/raqm-ui-attachment.mjs.map +1 -0
- package/fesm2022/raqm-ui-avatar.mjs +337 -0
- package/fesm2022/raqm-ui-avatar.mjs.map +1 -0
- package/fesm2022/raqm-ui-badge.mjs +68 -0
- package/fesm2022/raqm-ui-badge.mjs.map +1 -0
- package/fesm2022/raqm-ui-breadcrumb.mjs +309 -0
- package/fesm2022/raqm-ui-breadcrumb.mjs.map +1 -0
- package/fesm2022/raqm-ui-button-group.mjs +138 -0
- package/fesm2022/raqm-ui-button-group.mjs.map +1 -0
- package/fesm2022/raqm-ui-button.mjs +295 -0
- package/fesm2022/raqm-ui-button.mjs.map +1 -0
- package/fesm2022/raqm-ui-calendar.mjs +1394 -0
- package/fesm2022/raqm-ui-calendar.mjs.map +1 -0
- package/fesm2022/raqm-ui-card.mjs +331 -0
- package/fesm2022/raqm-ui-card.mjs.map +1 -0
- package/fesm2022/raqm-ui-carousel.mjs +410 -0
- package/fesm2022/raqm-ui-carousel.mjs.map +1 -0
- package/fesm2022/raqm-ui-checkbox.mjs +86 -0
- package/fesm2022/raqm-ui-checkbox.mjs.map +1 -0
- package/fesm2022/raqm-ui-collapsible.mjs +266 -0
- package/fesm2022/raqm-ui-collapsible.mjs.map +1 -0
- package/fesm2022/raqm-ui-combobox.mjs +1584 -0
- package/fesm2022/raqm-ui-combobox.mjs.map +1 -0
- package/fesm2022/raqm-ui-command.mjs +1210 -0
- package/fesm2022/raqm-ui-command.mjs.map +1 -0
- package/fesm2022/raqm-ui-context-menu.mjs +723 -0
- package/fesm2022/raqm-ui-context-menu.mjs.map +1 -0
- package/fesm2022/raqm-ui-dialog.mjs +1214 -0
- package/fesm2022/raqm-ui-dialog.mjs.map +1 -0
- package/fesm2022/raqm-ui-drawer.mjs +687 -0
- package/fesm2022/raqm-ui-drawer.mjs.map +1 -0
- package/fesm2022/raqm-ui-dropdown-menu.mjs +1168 -0
- package/fesm2022/raqm-ui-dropdown-menu.mjs.map +1 -0
- package/fesm2022/raqm-ui-empty.mjs +272 -0
- package/fesm2022/raqm-ui-empty.mjs.map +1 -0
- package/fesm2022/raqm-ui-field.mjs +517 -0
- package/fesm2022/raqm-ui-field.mjs.map +1 -0
- package/fesm2022/raqm-ui-hover-card.mjs +828 -0
- package/fesm2022/raqm-ui-hover-card.mjs.map +1 -0
- package/fesm2022/raqm-ui-input-group.mjs +270 -0
- package/fesm2022/raqm-ui-input-group.mjs.map +1 -0
- package/fesm2022/raqm-ui-input-otp.mjs +788 -0
- package/fesm2022/raqm-ui-input-otp.mjs.map +1 -0
- package/fesm2022/raqm-ui-input.mjs +73 -0
- package/fesm2022/raqm-ui-input.mjs.map +1 -0
- package/fesm2022/raqm-ui-item.mjs +495 -0
- package/fesm2022/raqm-ui-item.mjs.map +1 -0
- package/fesm2022/raqm-ui-kbd.mjs +80 -0
- package/fesm2022/raqm-ui-kbd.mjs.map +1 -0
- package/fesm2022/raqm-ui-label.mjs +44 -0
- package/fesm2022/raqm-ui-label.mjs.map +1 -0
- package/fesm2022/raqm-ui-menubar.mjs +536 -0
- package/fesm2022/raqm-ui-menubar.mjs.map +1 -0
- package/fesm2022/raqm-ui-native-select.mjs +131 -0
- package/fesm2022/raqm-ui-native-select.mjs.map +1 -0
- package/fesm2022/raqm-ui-navigation-menu.mjs +1399 -0
- package/fesm2022/raqm-ui-navigation-menu.mjs.map +1 -0
- package/fesm2022/raqm-ui-overlay-internal.mjs +185 -0
- package/fesm2022/raqm-ui-overlay-internal.mjs.map +1 -0
- package/fesm2022/raqm-ui-pagination.mjs +440 -0
- package/fesm2022/raqm-ui-pagination.mjs.map +1 -0
- package/fesm2022/raqm-ui-popover.mjs +1495 -0
- package/fesm2022/raqm-ui-popover.mjs.map +1 -0
- package/fesm2022/raqm-ui-progress.mjs +369 -0
- package/fesm2022/raqm-ui-progress.mjs.map +1 -0
- package/fesm2022/raqm-ui-questionnaire.mjs +1005 -0
- package/fesm2022/raqm-ui-questionnaire.mjs.map +1 -0
- package/fesm2022/raqm-ui-radio-group.mjs +151 -0
- package/fesm2022/raqm-ui-radio-group.mjs.map +1 -0
- package/fesm2022/raqm-ui-resizable.mjs +439 -0
- package/fesm2022/raqm-ui-resizable.mjs.map +1 -0
- package/fesm2022/raqm-ui-scroll-area.mjs +510 -0
- package/fesm2022/raqm-ui-scroll-area.mjs.map +1 -0
- package/fesm2022/raqm-ui-select.mjs +1073 -0
- package/fesm2022/raqm-ui-select.mjs.map +1 -0
- package/fesm2022/raqm-ui-separator.mjs +103 -0
- package/fesm2022/raqm-ui-separator.mjs.map +1 -0
- package/fesm2022/raqm-ui-sheet.mjs +411 -0
- package/fesm2022/raqm-ui-sheet.mjs.map +1 -0
- package/fesm2022/raqm-ui-sidebar.mjs +1784 -0
- package/fesm2022/raqm-ui-sidebar.mjs.map +1 -0
- package/fesm2022/raqm-ui-skeleton.mjs +50 -0
- package/fesm2022/raqm-ui-skeleton.mjs.map +1 -0
- package/fesm2022/raqm-ui-slider.mjs +609 -0
- package/fesm2022/raqm-ui-slider.mjs.map +1 -0
- package/fesm2022/raqm-ui-spinner.mjs +137 -0
- package/fesm2022/raqm-ui-spinner.mjs.map +1 -0
- package/fesm2022/raqm-ui-switch.mjs +109 -0
- package/fesm2022/raqm-ui-switch.mjs.map +1 -0
- package/fesm2022/raqm-ui-table.mjs +271 -0
- package/fesm2022/raqm-ui-table.mjs.map +1 -0
- package/fesm2022/raqm-ui-tabs.mjs +536 -0
- package/fesm2022/raqm-ui-tabs.mjs.map +1 -0
- package/fesm2022/raqm-ui-textarea.mjs +37 -0
- package/fesm2022/raqm-ui-textarea.mjs.map +1 -0
- package/fesm2022/raqm-ui-toast.mjs +918 -0
- package/fesm2022/raqm-ui-toast.mjs.map +1 -0
- package/fesm2022/raqm-ui-toggle-group.mjs +462 -0
- package/fesm2022/raqm-ui-toggle-group.mjs.map +1 -0
- package/fesm2022/raqm-ui-toggle.mjs +158 -0
- package/fesm2022/raqm-ui-toggle.mjs.map +1 -0
- package/fesm2022/raqm-ui-tooltip.mjs +1226 -0
- package/fesm2022/raqm-ui-tooltip.mjs.map +1 -0
- package/fesm2022/raqm-ui.mjs +50 -0
- package/input-otp/README.md +12 -0
- package/package.json +275 -3
- package/styles/theme.css +4324 -0
- package/types/raqm-ui-accordion.d.ts +124 -0
- package/types/raqm-ui-alert-dialog.d.ts +81 -0
- package/types/raqm-ui-alert.d.ts +29 -0
- package/types/raqm-ui-aspect-ratio.d.ts +13 -0
- package/types/raqm-ui-attachment.d.ts +72 -0
- package/types/raqm-ui-avatar.d.ts +67 -0
- package/types/raqm-ui-badge.d.ts +20 -0
- package/types/raqm-ui-breadcrumb.d.ts +35 -0
- package/types/raqm-ui-button-group.d.ts +27 -0
- package/types/raqm-ui-button.d.ts +80 -0
- package/types/raqm-ui-calendar.d.ts +359 -0
- package/types/raqm-ui-card.d.ts +34 -0
- package/types/raqm-ui-carousel.d.ts +81 -0
- package/types/raqm-ui-checkbox.d.ts +24 -0
- package/types/raqm-ui-collapsible.d.ts +72 -0
- package/types/raqm-ui-combobox.d.ts +405 -0
- package/types/raqm-ui-command.d.ts +256 -0
- package/types/raqm-ui-context-menu.d.ts +196 -0
- package/types/raqm-ui-dialog.d.ts +232 -0
- package/types/raqm-ui-drawer.d.ts +121 -0
- package/types/raqm-ui-dropdown-menu.d.ts +319 -0
- package/types/raqm-ui-empty.d.ts +35 -0
- package/types/raqm-ui-field.d.ts +88 -0
- package/types/raqm-ui-hover-card.d.ts +139 -0
- package/types/raqm-ui-input-group.d.ts +45 -0
- package/types/raqm-ui-input-otp.d.ts +197 -0
- package/types/raqm-ui-input.d.ts +16 -0
- package/types/raqm-ui-item.d.ts +71 -0
- package/types/raqm-ui-kbd.d.ts +12 -0
- package/types/raqm-ui-label.d.ts +6 -0
- package/types/raqm-ui-menubar.d.ts +159 -0
- package/types/raqm-ui-native-select.d.ts +23 -0
- package/types/raqm-ui-navigation-menu.d.ts +230 -0
- package/types/raqm-ui-overlay-internal.d.ts +5 -0
- package/types/raqm-ui-pagination.d.ts +84 -0
- package/types/raqm-ui-popover.d.ts +235 -0
- package/types/raqm-ui-progress.d.ts +79 -0
- package/types/raqm-ui-questionnaire.d.ts +217 -0
- package/types/raqm-ui-radio-group.d.ts +48 -0
- package/types/raqm-ui-resizable.d.ts +98 -0
- package/types/raqm-ui-scroll-area.d.ts +132 -0
- package/types/raqm-ui-select.d.ts +205 -0
- package/types/raqm-ui-separator.d.ts +21 -0
- package/types/raqm-ui-sheet.d.ts +79 -0
- package/types/raqm-ui-sidebar.d.ts +285 -0
- package/types/raqm-ui-skeleton.d.ts +6 -0
- package/types/raqm-ui-slider.d.ts +129 -0
- package/types/raqm-ui-spinner.d.ts +32 -0
- package/types/raqm-ui-switch.d.ts +32 -0
- package/types/raqm-ui-table.d.ts +36 -0
- package/types/raqm-ui-tabs.d.ts +154 -0
- package/types/raqm-ui-textarea.d.ts +6 -0
- package/types/raqm-ui-toast.d.ts +190 -0
- package/types/raqm-ui-toggle-group.d.ts +167 -0
- package/types/raqm-ui-toggle.d.ts +42 -0
- package/types/raqm-ui-tooltip.d.ts +207 -0
- package/types/raqm-ui.d.ts +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raqm-ui-navigation-menu.mjs","names":[],"sources":["../../../projects/ui/navigation-menu/navigation-menu-context.ts","../../../projects/ui/navigation-menu/navigation-menu-model.ts","../../../projects/ui/navigation-menu/navigation-menu-dismiss.ts","../../../projects/ui/navigation-menu/navigation-menu-effects.ts","../../../projects/ui/navigation-menu/navigation-menu-items.ts","../../../projects/ui/navigation-menu/navigation-menu-keyboard.ts","../../../projects/ui/navigation-menu/navigation-menu-overlay.ts","../../../projects/ui/navigation-menu/navigation-menu-pane.ts","../../../projects/ui/navigation-menu/navigation-menu-position.ts","../../../projects/ui/navigation-menu/navigation-menu-view-state.ts","../../../projects/ui/navigation-menu/navigation-menu.ts","../../../projects/ui/navigation-menu/navigation-menu.component.html","../../../projects/ui/navigation-menu/navigation-menu.directive.ts","../../../projects/ui/navigation-menu/public-api.ts"],"sourcesContent":["import { InjectionToken, Signal, TemplateRef } from '@angular/core';\r\n\r\n/** Stable reference to one registered top-level item: a trigger or a direct link. */\r\nexport interface RaqmNavigationMenuTopLevelRef {\r\n /** The native element the root anchors the overlay to and focuses. */\r\n readonly element: HTMLElement;\r\n readonly triggerValue: string | null;\r\n readonly content: Signal<TemplateRef<unknown> | null>;\r\n readonly disabled: boolean;\r\n // Focuses the item; the key manager origin argument is ignored.\r\n focus(): void;\r\n}\r\n\r\n/** The typed contract a navigation menu root publishes to its descendants. */\r\nexport interface RaqmNavigationMenuContext {\r\n readonly open: Signal<boolean>;\r\n readonly activeValue: Signal<string | null>;\r\n readonly panelId: Signal<string | null>;\r\n isActive(value: string): boolean;\r\n registerTopLevel(ref: RaqmNavigationMenuTopLevelRef): void;\r\n unregisterTopLevel(ref: RaqmNavigationMenuTopLevelRef): void;\r\n /** Records a panel link element for the open panel's logical Tab boundaries. */\r\n registerPanelLink(element: HTMLElement): void;\r\n unregisterPanelLink(element: HTMLElement): void;\r\n /** Opens the disclosure for a trigger as a user action (may emit). */\r\n openFromTrigger(\r\n ref: RaqmNavigationMenuTopLevelRef,\r\n focusContent: 'first' | 'last' | 'none',\r\n ): void;\r\n /** Toggles the disclosure for a trigger as a user action (may emit). */\r\n toggleFromTrigger(ref: RaqmNavigationMenuTopLevelRef): void;\r\n /** Closes the open disclosure as a user action (Escape/link/outside). */\r\n closeFromUser(): void;\r\n /** Delays a pointer-open for a hovered trigger (the single shared open timer). */\r\n scheduleHoverOpen(ref: RaqmNavigationMenuTopLevelRef): void;\r\n cancelHoverOpen(): void;\r\n scheduleHoverClose(): void;\r\n /** Whether a pointer destination belongs to a detached owned overlay. */\r\n isInsideDetachedOverlay(node: Node | null): boolean;\r\n cancelHoverClose(): void;\r\n moveFocusAcrossTopLevel(event: KeyboardEvent, ref: RaqmNavigationMenuTopLevelRef): void;\r\n handleTopLevelTab(event: KeyboardEvent, ref: RaqmNavigationMenuTopLevelRef): void;\r\n handlePanelTab(event: KeyboardEvent, element: HTMLElement): void;\r\n focusContent(focus: 'first' | 'last'): void;\r\n}\r\n\r\n/** Injection token for the parent navigation menu root; injected optionally. */\r\nexport const RAQM_NAVIGATION_MENU = new InjectionToken<RaqmNavigationMenuContext>(\r\n 'RaqmNavigationMenu',\r\n);\r\n","// Navigation menu model: the shared timing/animation constants and the two small helpers\r\n// every navigation-menu file reads.\r\n\r\nexport const HOVER_OPEN_DELAY_MS = 50;\r\n\r\nexport const HOVER_CLOSE_DELAY_MS = 50;\r\n\r\n// Outgoing content is dropped after this bound.\r\nexport const SWITCH_TRANSITION_MS = 350;\r\n\r\n// Horizontal glide fallbacks are armed only for a switch; a vertical one would stretch the pane.\r\nexport const PANE_GLIDE_CLASS = 'raqm-navigation-menu-overlay-pane--glide';\r\nexport const PANE_GLIDE_LEFT_CLASS = 'raqm-navigation-menu-overlay-pane--x-left';\r\nexport const PANE_GLIDE_RIGHT_CLASS = 'raqm-navigation-menu-overlay-pane--x-right';\r\n\r\n// Suppresses the popup block-size transition for one post-render pass.\r\nexport const POPUP_MEASURE_CLASS = 'raqm-navigation-menu-popup--measure';\r\n\r\n// The overlay is disposed only after this bound.\r\nexport const EXIT_ANIMATION_MS = 150;\r\n\r\nexport const SIDE_OFFSET = 8;\r\nexport const COLLISION_MARGIN = 5;\r\n\r\n// Read at each animation decision so no stale value is cached.\r\nexport function prefersReducedMotion(): boolean {\r\n return typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n}\r\n\r\n// Hidden (responsively collapsed) items are skipped like disabled ones.\r\nexport function isVisible(element: HTMLElement): boolean {\r\n return element.getClientRects().length > 0;\r\n}\r\n","// Navigation menu dismissal: hover intent timers, the document-level pointer/focus\r\n// listeners, and the containment tests the pointer and focus paths share.\r\n\r\nimport { containsOwnedOverlay } from '@raqm/ui/overlay-internal';\r\n\r\nimport { RaqmNavigationMenuTopLevelRef } from './navigation-menu-context';\r\nimport { HOVER_CLOSE_DELAY_MS, HOVER_OPEN_DELAY_MS } from './navigation-menu-model';\r\n\r\nexport interface RaqmNavigationMenuDismissalHost {\r\n /** The native `<nav>` host; its document carries the owned listeners. */\r\n root: HTMLElement;\r\n open(): boolean;\r\n /** The live overlay pane element, or `undefined` while closed. */\r\n pane(): HTMLElement | undefined;\r\n openFromTrigger(\r\n ref: RaqmNavigationMenuTopLevelRef,\r\n focusContent: 'first' | 'last' | 'none',\r\n ): void;\r\n closeFromUser(): void;\r\n setUserValue(value: string | null): void;\r\n}\r\n\r\nexport class RaqmNavigationMenuDismissal {\r\n // One hover-open and one hover-close timer.\r\n private openTimer: ReturnType<typeof setTimeout> | undefined;\r\n private closeTimer: ReturnType<typeof setTimeout> | undefined;\r\n\r\n private readonly documentPointerDown = (event: PointerEvent): void => {\r\n if (this.host.open() && !this.isInsideRootOrOverlay(event.target as Node | null)) {\r\n this.host.closeFromUser();\r\n }\r\n };\r\n private readonly documentFocusOut = (event: FocusEvent): void => {\r\n const target = event.target as Node | null;\r\n const overlay = this.host.pane();\r\n if (\r\n target &&\r\n !this.host.root.contains(target) &&\r\n !overlay?.contains(target) &&\r\n this.isInsideRootOrOverlay(target)\r\n ) {\r\n this.maybeCloseOnFocusOut(event);\r\n }\r\n };\r\n private readonly documentPointerOver = (event: PointerEvent): void => {\r\n if (event.pointerType !== 'touch' && this.isInsideRootOrOverlay(event.target as Node | null)) {\r\n this.cancelHoverClose();\r\n }\r\n };\r\n private readonly documentPointerOut = (event: PointerEvent): void => {\r\n const overlay = this.host.pane();\r\n const target = event.target as Node | null;\r\n if (\r\n event.pointerType !== 'touch' &&\r\n target &&\r\n !this.host.root.contains(target) &&\r\n !overlay?.contains(target) &&\r\n this.isInsideRootOrOverlay(target) &&\r\n !this.isInsideRootOrOverlay(event.relatedTarget as Node | null)\r\n ) {\r\n this.scheduleHoverClose();\r\n }\r\n };\r\n\r\n constructor(private readonly host: RaqmNavigationMenuDismissalHost) {}\r\n\r\n attach(): void {\r\n const document = this.host.root.ownerDocument;\r\n document.addEventListener('pointerdown', this.documentPointerDown, true);\r\n document.addEventListener('focusout', this.documentFocusOut, true);\r\n document.addEventListener('pointerover', this.documentPointerOver, true);\r\n document.addEventListener('pointerout', this.documentPointerOut, true);\r\n }\r\n\r\n detach(): void {\r\n const document = this.host.root.ownerDocument;\r\n document.removeEventListener('pointerdown', this.documentPointerDown, true);\r\n document.removeEventListener('focusout', this.documentFocusOut, true);\r\n document.removeEventListener('pointerover', this.documentPointerOver, true);\r\n document.removeEventListener('pointerout', this.documentPointerOut, true);\r\n }\r\n\r\n // One open timer only: hovering while open switches immediately and clears the close timer.\r\n scheduleHoverOpen(ref: RaqmNavigationMenuTopLevelRef): void {\r\n if (ref.disabled || ref.triggerValue === null) {\r\n return;\r\n }\r\n this.cancelHoverClose();\r\n if (this.host.open()) {\r\n this.cancelHoverOpen();\r\n this.host.openFromTrigger(ref, 'none');\r\n return;\r\n }\r\n this.cancelHoverOpen();\r\n this.openTimer = setTimeout(() => {\r\n this.openTimer = undefined;\r\n this.host.openFromTrigger(ref, 'none');\r\n }, HOVER_OPEN_DELAY_MS);\r\n }\r\n\r\n /** Cancels a pending pointer-open. */\r\n cancelHoverOpen(): void {\r\n if (this.openTimer !== undefined) {\r\n clearTimeout(this.openTimer);\r\n this.openTimer = undefined;\r\n }\r\n }\r\n\r\n /** Delays a pointer-close through the single close timer. */\r\n scheduleHoverClose(): void {\r\n this.cancelHoverOpen();\r\n this.cancelHoverClose();\r\n if (!this.host.open()) {\r\n return;\r\n }\r\n this.closeTimer = setTimeout(() => {\r\n this.closeTimer = undefined;\r\n this.host.closeFromUser();\r\n }, HOVER_CLOSE_DELAY_MS);\r\n }\r\n\r\n /** Cancels a pending pointer-close (the pointer entered the panel). */\r\n cancelHoverClose(): void {\r\n if (this.closeTimer !== undefined) {\r\n clearTimeout(this.closeTimer);\r\n this.closeTimer = undefined;\r\n }\r\n }\r\n\r\n /** Cancels a pending pointer-close when the pointer enters the panel. */\r\n onPanelPointerEnter(): void {\r\n this.cancelHoverClose();\r\n }\r\n\r\n /** Schedules a pointer-close when the pointer leaves the panel. */\r\n onPanelPointerLeave(event: PointerEvent): void {\r\n if (\r\n event.pointerType === 'touch' ||\r\n this.isInsideRootOrOverlay(event.relatedTarget as Node | null)\r\n ) {\r\n return;\r\n }\r\n this.scheduleHoverClose();\r\n }\r\n\r\n // Closes on focus-out only when focus truly leaves the root and its overlay.\r\n maybeCloseOnFocusOut(event: FocusEvent): void {\r\n const next = event.relatedTarget as Node | null;\r\n if (this.isInsideRootOrOverlay(next)) {\r\n return;\r\n }\r\n if (!this.host.open()) {\r\n return;\r\n }\r\n const target = event.target as Node | null;\r\n const targetInPanel = !!target && this.host.pane()?.contains(target) === true;\r\n // A source swap blurs the discarded node; defer a microtask and re-check before closing.\r\n queueMicrotask(() => {\r\n if (!this.host.open()) {\r\n return;\r\n }\r\n if (targetInPanel && target && !target.isConnected) {\r\n return;\r\n }\r\n if (this.isInsideRootOrOverlay(this.host.root.ownerDocument.activeElement)) {\r\n return;\r\n }\r\n this.host.setUserValue(null);\r\n });\r\n }\r\n\r\n // Whether a node sits inside the host (its triggers, links and list) or the overlay.\r\n isInsideRootOrOverlay(node: Node | null): boolean {\r\n if (!node) {\r\n return false;\r\n }\r\n const overlay = this.host.pane();\r\n return (\r\n containsOwnedOverlay(this.host.root, node) ||\r\n (overlay ? containsOwnedOverlay(overlay, node) : false)\r\n );\r\n }\r\n\r\n /** Detached destinations must not arm the trigger's hover-close timer. */\r\n isInsideDetachedOverlay(node: Node | null): boolean {\r\n return !!node && !this.host.root.contains(node) && this.isInsideRootOrOverlay(node);\r\n }\r\n}\r\n","// Navigation menu effects: the open/switch/close policy, the key-manager orientation and\r\n// the open panel's in-place realignment, registered from the component constructor.\r\n\r\nimport { effect, untracked } from '@angular/core';\r\n\r\nimport { RaqmNavigationMenuTopLevelRef } from './navigation-menu-context';\r\n\r\nexport interface RaqmNavigationMenuEffectsHost {\r\n activeEntry(): RaqmNavigationMenuTopLevelRef | null;\r\n resolvedDir(): 'ltr' | 'rtl';\r\n align(): 'start' | 'end';\r\n syncOverlay(next: RaqmNavigationMenuTopLevelRef | null): void;\r\n setKeyManagerDirection(direction: 'ltr' | 'rtl'): void;\r\n realignOpenPanel(align: 'start' | 'end'): void;\r\n}\r\n\r\nexport function connectNavigationMenuEffects(host: RaqmNavigationMenuEffectsHost): void {\r\n // Reacts to the derived open state: opens, switches or closes the one overlay.\r\n effect(() => {\r\n const next = host.activeEntry();\r\n untracked(() => host.syncOverlay(next));\r\n });\r\n\r\n // Keeps the top-level arrow orientation in step with the resolved direction.\r\n effect(() => {\r\n const dir = host.resolvedDir();\r\n untracked(() => host.setKeyManagerDirection(dir));\r\n });\r\n\r\n // Re-aligns an open panel in place when the `align` input changes.\r\n effect(() => {\r\n const align = host.align();\r\n untracked(() => host.realignOpenPanel(align));\r\n });\r\n}\r\n","// Navigation menu registration: the top-level items and panel links the descendants hand\r\n// to the root, and the derived active/open state every file reads.\r\n\r\nimport { computed, isDevMode, signal } from '@angular/core';\r\n\r\nimport { RaqmNavigationMenuTopLevelRef } from './navigation-menu-context';\r\n\r\n// Mints a stable per-instance panel id.\r\nlet nextNavigationMenuId = 0;\r\n\r\nexport interface RaqmNavigationMenuItemsHost {\r\n value(): string | null;\r\n}\r\n\r\nexport class RaqmNavigationMenuItems {\r\n // Registered top-level items in DOM order (triggers and direct top links).\r\n readonly topLevelItems = signal<RaqmNavigationMenuTopLevelRef[]>([]);\r\n\r\n // Registered panel links, used for the open panel's Tab boundaries.\r\n readonly panelLinkElements = signal<HTMLElement[]>([]);\r\n\r\n readonly panelRootId = `raqm-navigation-menu-panel-${++nextNavigationMenuId}`;\r\n\r\n // The registered item whose trigger value matches the current value, or null.\r\n readonly activeEntry = computed<RaqmNavigationMenuTopLevelRef | null>(() => {\r\n const value = this.host.value();\r\n if (value === null) {\r\n return null;\r\n }\r\n return this.topLevelItems().find((item) => item.triggerValue === value) ?? null;\r\n });\r\n\r\n /** Whether any disclosure is open. */\r\n readonly open = computed(() => this.activeEntry() !== null);\r\n\r\n /** The active trigger value, or `null`. */\r\n readonly activeValue = computed(() => this.activeEntry()?.triggerValue ?? null);\r\n\r\n constructor(private readonly host: RaqmNavigationMenuItemsHost) {}\r\n\r\n /** Registers a top-level item, reporting duplicate/empty values in development. */\r\n registerTopLevel(ref: RaqmNavigationMenuTopLevelRef): void {\r\n if (isDevMode() && ref.triggerValue !== null) {\r\n if (ref.triggerValue.trim() === '') {\r\n console.error('[raqm-navigation-menu] A trigger `value` must be a non-empty string.');\r\n } else if (this.topLevelItems().some((item) => item.triggerValue === ref.triggerValue)) {\r\n console.error(\r\n `[raqm-navigation-menu] Duplicate trigger value \"${ref.triggerValue}\"; trigger values must be unique.`,\r\n );\r\n }\r\n }\r\n this.topLevelItems.update((items) => [...items, ref]);\r\n }\r\n\r\n /** Unregisters a top-level item; never changes the value. */\r\n unregisterTopLevel(ref: RaqmNavigationMenuTopLevelRef): void {\r\n this.topLevelItems.update((items) => items.filter((item) => item !== ref));\r\n }\r\n\r\n /** Registers a panel link for the open panel's logical Tab boundaries. */\r\n registerPanelLink(element: HTMLElement): void {\r\n this.panelLinkElements.update((elements) => [...elements, element]);\r\n }\r\n\r\n /** Removes a panel link registered for Tab-boundary handling. */\r\n unregisterPanelLink(element: HTMLElement): void {\r\n this.panelLinkElements.update((elements) => elements.filter((item) => item !== element));\r\n }\r\n}\r\n","// Navigation menu keyboard: the top-level key manager and the focus/Tab policy shared by\r\n// the triggers, direct links and panel links.\r\n\r\nimport { Injector, Signal } from '@angular/core';\r\n\r\nimport { FocusKeyManager } from '@angular/cdk/a11y';\r\n\r\nimport { RaqmNavigationMenuTopLevelRef } from './navigation-menu-context';\r\nimport { isVisible } from './navigation-menu-model';\r\nimport { RaqmNavigationMenuState } from './navigation-menu-view-state';\r\n\r\nexport interface RaqmNavigationMenuKeyboardHost {\r\n /** The native `<nav>` host; its bounds start the \"next tabbable\" scan. */\r\n root: HTMLElement;\r\n open(): boolean;\r\n activeEntry(): RaqmNavigationMenuTopLevelRef | null;\r\n topLevelItems(): RaqmNavigationMenuTopLevelRef[];\r\n /** The live overlay pane element, or `undefined` while closed. */\r\n pane(): HTMLElement | undefined;\r\n panelLinkElements(): HTMLElement[];\r\n isInsideRootOrOverlay(node: Node | null): boolean;\r\n closeFromUser(): void;\r\n}\r\n\r\nexport class RaqmNavigationMenuKeyboard {\r\n // The CDK key manager over the top-level items (built in `init`).\r\n private keyManager: FocusKeyManager<RaqmNavigationMenuTopLevelRef> | undefined;\r\n\r\n constructor(\r\n private readonly state: RaqmNavigationMenuState,\r\n private readonly host: RaqmNavigationMenuKeyboardHost,\r\n ) {}\r\n\r\n // Built here, not in the constructor: the manager reads topLevelItems.\r\n init(\r\n items: Signal<RaqmNavigationMenuTopLevelRef[]>,\r\n injector: Injector,\r\n direction: 'ltr' | 'rtl',\r\n ): void {\r\n this.keyManager = new FocusKeyManager<RaqmNavigationMenuTopLevelRef>(items, injector)\r\n .withWrap(false)\r\n .withHorizontalOrientation(direction === 'rtl' ? 'rtl' : 'ltr')\r\n .withVerticalOrientation(false)\r\n .skipPredicate((item) => item.disabled || !isVisible(item.element));\r\n }\r\n\r\n setDirection(direction: 'ltr' | 'rtl'): void {\r\n this.keyManager?.withHorizontalOrientation(direction === 'rtl' ? 'rtl' : 'ltr');\r\n }\r\n\r\n destroy(): void {\r\n this.keyManager?.destroy();\r\n this.keyManager = undefined;\r\n }\r\n\r\n // Lets the key manager resolve the horizontal move, RTL-aware and skipping disabled or hidden items.\r\n moveFocusAcrossTopLevel(event: KeyboardEvent, ref: RaqmNavigationMenuTopLevelRef): void {\r\n if (!this.keyManager) {\r\n return;\r\n }\r\n this.keyManager.updateActiveItem(ref);\r\n this.keyManager.onKeydown(event);\r\n }\r\n\r\n // Forward Tab from the active trigger or the last top-level item enters the panel first link.\r\n handleTopLevelTab(event: KeyboardEvent, ref: RaqmNavigationMenuTopLevelRef): void {\r\n if (event.shiftKey || !this.host.open()) {\r\n return;\r\n }\r\n const focusable = this.host\r\n .topLevelItems()\r\n .filter((item) => !item.disabled && isVisible(item.element));\r\n const isLast = focusable[focusable.length - 1] === ref;\r\n if (this.host.activeEntry() === ref || isLast) {\r\n event.preventDefault();\r\n this.focusContent('first');\r\n }\r\n }\r\n\r\n // Shift+Tab from the first link returns to the active trigger; Tab from the last moves past the menu.\r\n handlePanelTab(event: KeyboardEvent, element: HTMLElement): void {\r\n const links = this.openPanelLinks();\r\n const index = links.indexOf(element);\r\n if (index === -1) {\r\n return;\r\n }\r\n if (event.shiftKey) {\r\n if (index === 0) {\r\n event.preventDefault();\r\n this.host.activeEntry()?.element.focus();\r\n }\r\n return;\r\n }\r\n if (index === links.length - 1) {\r\n event.preventDefault();\r\n const next = this.nextTabbableAfter(this.host.root);\r\n if (next) {\r\n next.focus();\r\n } else {\r\n this.host.closeFromUser();\r\n }\r\n }\r\n }\r\n\r\n /** Focuses the first or last link inside the open panel. */\r\n focusContent(focus: 'first' | 'last'): void {\r\n if (!this.host.open()) {\r\n return;\r\n }\r\n const links = this.openPanelLinks();\r\n if (links.length === 0) {\r\n return;\r\n }\r\n const target = focus === 'first' ? links[0] : links[links.length - 1];\r\n target.focus();\r\n }\r\n\r\n /** Records the focused top-level item as the key manager's active item. */\r\n onFocusIn(event: FocusEvent): void {\r\n const target = event.target as Node | null;\r\n if (!target) {\r\n return;\r\n }\r\n const item = this.host\r\n .topLevelItems()\r\n .find((candidate) => candidate.element === target || candidate.element.contains(target));\r\n if (item) {\r\n this.keyManager?.updateActiveItem(item);\r\n }\r\n }\r\n\r\n // Applies the requested focus once, retrying through one microtask if the portal had not flushed.\r\n applyPendingFocus(): void {\r\n const kind = this.state.pendingFocus;\r\n this.state.pendingFocus = null;\r\n if (kind === null) {\r\n return;\r\n }\r\n this.focusContent(kind);\r\n const overlay = this.host.pane();\r\n if (overlay && !overlay.contains(document.activeElement)) {\r\n queueMicrotask(() => this.focusContent(kind));\r\n }\r\n }\r\n\r\n // The panel links of the currently visible (non-inert) content, in DOM order.\r\n private openPanelLinks(): HTMLElement[] {\r\n const overlay = this.host.pane();\r\n if (!overlay) {\r\n return [];\r\n }\r\n return this.host.panelLinkElements().filter((element) => {\r\n if (!overlay.contains(element) || !isVisible(element)) {\r\n return false;\r\n }\r\n const content = element.closest('.raqm-navigation-menu-content');\r\n return content !== null && !content.hasAttribute('inert');\r\n });\r\n }\r\n\r\n // The first tabbable control after the menu root, excluding the overlay.\r\n private nextTabbableAfter(root: HTMLElement): HTMLElement | null {\r\n const selector =\r\n 'a[href], button:not([disabled]), input:not([disabled]), ' +\r\n 'select:not([disabled]), textarea:not([disabled]), ' +\r\n '[tabindex]:not([tabindex=\"-1\"])';\r\n const candidates = Array.from(document.querySelectorAll<HTMLElement>(selector)).filter(\r\n (element) =>\r\n isVisible(element) &&\r\n element.closest('[inert]') === null &&\r\n !this.host.isInsideRootOrOverlay(element),\r\n );\r\n for (const candidate of candidates) {\r\n const position = root.compareDocumentPosition(candidate);\r\n // Descendants of the root also report FOLLOWING, so they are excluded.\r\n if (\r\n position & Node.DOCUMENT_POSITION_FOLLOWING &&\r\n !(position & Node.DOCUMENT_POSITION_CONTAINED_BY)\r\n ) {\r\n return candidate;\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\n","// Navigation menu overlay: the one shared panel's creation, switch and bounded close, its\r\n// subscriptions and the document-listener ownership it shares with dismissal.\r\n\r\nimport { TemplateRef, ViewContainerRef } from '@angular/core';\r\n\r\nimport {\r\n FlexibleConnectedPositionStrategy,\r\n Overlay,\r\n OverlayConfig,\r\n OverlayRef,\r\n} from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { registerOverlayOwnership } from '@raqm/ui/overlay-internal';\r\n\r\nimport { RaqmNavigationMenuTopLevelRef } from './navigation-menu-context';\r\nimport { RaqmNavigationMenuDismissal } from './navigation-menu-dismiss';\r\nimport { RaqmNavigationMenuItems } from './navigation-menu-items';\r\nimport { RaqmNavigationMenuKeyboard } from './navigation-menu-keyboard';\r\nimport {\r\n EXIT_ANIMATION_MS,\r\n SWITCH_TRANSITION_MS,\r\n prefersReducedMotion,\r\n} from './navigation-menu-model';\r\nimport { RaqmNavigationMenuPane } from './navigation-menu-pane';\r\nimport { RaqmNavigationMenuPosition } from './navigation-menu-position';\r\nimport { RaqmNavigationMenuState } from './navigation-menu-view-state';\r\n\r\nexport interface RaqmNavigationMenuOverlayHost {\r\n panelTemplate(): TemplateRef<unknown>;\r\n direction(): 'ltr' | 'rtl';\r\n closeFromUser(): void;\r\n}\r\n\r\nexport class RaqmNavigationMenuOverlay {\r\n // The live overlay and its position strategy, undefined while closed.\r\n private overlayRef: OverlayRef | undefined;\r\n private positionStrategy: FlexibleConnectedPositionStrategy | undefined;\r\n\r\n // Overlay subscriptions, all torn down on every close path.\r\n private keydownSubscription: { unsubscribe(): void } | undefined;\r\n private detachSubscription: { unsubscribe(): void } | undefined;\r\n private releaseOwnership: (() => void) | undefined;\r\n\r\n // One switch and one exit-disposal timer.\r\n private switchTimer: ReturnType<typeof setTimeout> | undefined;\r\n private disposeTimer: ReturnType<typeof setTimeout> | undefined;\r\n\r\n // The overlay whose teardown waits behind the bounded exit animation.\r\n private pendingDisposeOverlay: OverlayRef | undefined;\r\n\r\n constructor(\r\n private readonly overlay: Overlay,\r\n private readonly viewContainerRef: ViewContainerRef,\r\n private readonly state: RaqmNavigationMenuState,\r\n private readonly items: RaqmNavigationMenuItems,\r\n private readonly position: RaqmNavigationMenuPosition,\r\n private readonly pane: RaqmNavigationMenuPane,\r\n private readonly dismissal: RaqmNavigationMenuDismissal,\r\n private readonly keyboard: RaqmNavigationMenuKeyboard,\r\n private readonly host: RaqmNavigationMenuOverlayHost,\r\n ) {}\r\n\r\n get ref(): OverlayRef | undefined {\r\n return this.overlayRef;\r\n }\r\n\r\n get element(): HTMLElement | undefined {\r\n return this.overlayRef?.overlayElement;\r\n }\r\n\r\n // The single reaction to the derived open state.\r\n syncOverlay(next: RaqmNavigationMenuTopLevelRef | null): void {\r\n if (next === this.state.currentRef) {\r\n return;\r\n }\r\n const previous = this.state.currentRef;\r\n if (next === null) {\r\n this.state.currentRef = null;\r\n // A stale value or removed trigger derives to no active entry, without emitting.\r\n this.beginClose();\r\n return;\r\n }\r\n if (previous === null) {\r\n this.state.currentRef = next;\r\n this.beginOpen(next);\r\n return;\r\n }\r\n this.beginSwitch(previous, next);\r\n this.state.currentRef = next;\r\n }\r\n\r\n // Re-aligns an open panel in place when the `align` input changes.\r\n realignOpenPanel(align: 'start' | 'end'): void {\r\n if (this.overlayRef && this.state.currentRef) {\r\n void align;\r\n const strategy = this.position.buildStrategy(this.state.currentRef.element);\r\n this.positionStrategy = strategy;\r\n this.overlayRef.updatePositionStrategy(strategy);\r\n }\r\n }\r\n\r\n // The single destroy path: unwinds the manager, timers, observers and overlays.\r\n destroy(): void {\r\n this.removeDocumentListeners();\r\n this.keyboard.destroy();\r\n this.dismissal.cancelHoverOpen();\r\n this.dismissal.cancelHoverClose();\r\n this.cancelSwitch();\r\n this.pane.cancelPaneTransaction();\r\n this.pane.releaseResizeObserver();\r\n this.position.releaseSideWatch();\r\n this.keydownSubscription?.unsubscribe();\r\n this.keydownSubscription = undefined;\r\n this.detachSubscription?.unsubscribe();\r\n this.detachSubscription = undefined;\r\n const overlayRef = this.overlayRef;\r\n this.overlayRef = undefined;\r\n this.positionStrategy = undefined;\r\n overlayRef?.dispose();\r\n this.flushPendingDispose();\r\n }\r\n\r\n private removeDocumentListeners(): void {\r\n this.dismissal.detach();\r\n this.releaseOwnership?.();\r\n this.releaseOwnership = undefined;\r\n }\r\n\r\n // Creates and attaches the one overlay for a fresh open.\r\n private beginOpen(entry: RaqmNavigationMenuTopLevelRef): void {\r\n // A rapid reopen cancels any overlay still playing its exit animation.\r\n this.flushPendingDispose();\r\n this.cancelSwitch();\r\n this.pane.cancelPaneTransaction();\r\n\r\n const direction = this.host.direction();\r\n this.state.overlayDir.set(direction);\r\n this.state.activationDirection.set(null);\r\n this.state.closing.set(false);\r\n this.state.side.set('bottom');\r\n this.state.panelId.set(this.items.panelRootId);\r\n this.state.previousTemplate.set(null);\r\n this.state.currentTemplate.set(entry.content());\r\n\r\n const strategy = this.position.buildStrategy(entry.element);\r\n this.positionStrategy = strategy;\r\n const config: OverlayConfig = {\r\n positionStrategy: strategy,\r\n // Nonmodal: no backdrop, no body scroll lock, no focus trap.\r\n hasBackdrop: false,\r\n // Repositioning follows document scroll without blocking or closing.\r\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\r\n panelClass: 'raqm-navigation-menu-overlay-pane',\r\n // A route change disposes the overlay rather than orphaning it.\r\n disposeOnNavigation: true,\r\n direction,\r\n };\r\n const overlayRef = this.overlay.create(config);\r\n this.overlayRef = overlayRef;\r\n this.releaseOwnership = registerOverlayOwnership(entry.element, overlayRef);\r\n this.dismissal.attach();\r\n this.position.watchSide(strategy);\r\n this.keydownSubscription = overlayRef\r\n .keydownEvents()\r\n .subscribe((event) => this.handleOverlayKeydown(event));\r\n this.detachSubscription = overlayRef.detachments().subscribe(() => this.handleDetached());\r\n overlayRef.attach(new TemplatePortal(this.host.panelTemplate(), this.viewContainerRef));\r\n this.pane.attachResizeObserver(entry.element);\r\n this.keyboard.applyPendingFocus();\r\n }\r\n\r\n // Moves the shared viewport to another trigger without teardown, so the slide transition plays.\r\n private beginSwitch(\r\n previous: RaqmNavigationMenuTopLevelRef,\r\n next: RaqmNavigationMenuTopLevelRef,\r\n ): void {\r\n const overlayRef = this.overlayRef;\r\n if (!overlayRef) {\r\n this.beginOpen(next);\r\n return;\r\n }\r\n this.releaseOwnership?.();\r\n this.releaseOwnership = registerOverlayOwnership(next.element, overlayRef);\r\n this.cancelSwitch();\r\n this.dismissal.cancelHoverClose();\r\n // Measure the outgoing block size before the template swap and before cancelling a pending pin.\r\n const previousSide = this.state.side();\r\n const previousBlockSize = this.pane.currentPopupBlockSize(overlayRef);\r\n this.pane.cancelPaneTransaction();\r\n this.state.activationDirection.set(this.directionBetween(previous, next));\r\n // A reused node keeps the same animation name, so restart the entering slide.\r\n this.pane.restartEnteringSlide();\r\n // Keep only the outgoing + incoming content while the bounded switch runs.\r\n this.state.previousTemplate.set(this.state.currentTemplate());\r\n this.state.currentTemplate.set(next.content());\r\n this.state.panelId.set(this.items.panelRootId);\r\n this.position.releaseSideWatch();\r\n const strategy = this.position.buildStrategy(next.element);\r\n this.positionStrategy = strategy;\r\n // Horizontal fallbacks stay armed until the glide ends; vertical placement is never transitioned.\r\n const pane = overlayRef.overlayElement;\r\n this.position.armPaneGlideAxes(pane);\r\n overlayRef.updatePositionStrategy(strategy);\r\n this.position.watchSide(strategy);\r\n this.pane.attachResizeObserver(next.element);\r\n\r\n // One bounded post-render pass resolves the incoming size and side before its first visible frame.\r\n this.pane.schedulePlacement(previousSide, previousBlockSize, () => {\r\n // Keyboard focus runs only once the current content is positioned.\r\n if (this.state.pendingFocus !== null) {\r\n this.keyboard.applyPendingFocus();\r\n }\r\n });\r\n\r\n if (prefersReducedMotion()) {\r\n this.state.previousTemplate.set(null);\r\n this.position.disarmPaneGlideAxes(pane);\r\n return;\r\n }\r\n this.switchTimer = setTimeout(() => {\r\n this.switchTimer = undefined;\r\n this.state.previousTemplate.set(null);\r\n // The glide is over; drop the fallbacks so the next reposition is instant.\r\n this.position.disarmPaneGlideAxes(overlayRef.overlayElement);\r\n }, SWITCH_TRANSITION_MS);\r\n }\r\n\r\n // Immediate under reduced motion, otherwise after the bounded exit animation.\r\n private beginClose(): void {\r\n this.removeDocumentListeners();\r\n this.cancelSwitch();\r\n this.pane.cancelPaneTransaction();\r\n this.dismissal.cancelHoverOpen();\r\n this.dismissal.cancelHoverClose();\r\n this.state.previousTemplate.set(null);\r\n this.state.panelId.set(null);\r\n\r\n const overlayRef = this.overlayRef;\r\n this.overlayRef = undefined;\r\n this.positionStrategy = undefined;\r\n this.position.releaseSideWatch();\r\n this.keydownSubscription?.unsubscribe();\r\n this.keydownSubscription = undefined;\r\n this.detachSubscription?.unsubscribe();\r\n this.detachSubscription = undefined;\r\n this.pane.releaseResizeObserver();\r\n\r\n if (!overlayRef) {\r\n this.state.currentTemplate.set(null);\r\n return;\r\n }\r\n // inert also drops focus, so no aria-hidden is set.\r\n overlayRef.overlayElement.setAttribute('inert', '');\r\n overlayRef.overlayElement.style.pointerEvents = 'none';\r\n\r\n if (prefersReducedMotion()) {\r\n this.state.currentTemplate.set(null);\r\n overlayRef.dispose();\r\n return;\r\n }\r\n this.state.closing.set(true);\r\n this.pendingDisposeOverlay = overlayRef;\r\n this.disposeTimer = setTimeout(() => {\r\n this.disposeTimer = undefined;\r\n this.pendingDisposeOverlay = undefined;\r\n this.state.closing.set(false);\r\n this.state.currentTemplate.set(null);\r\n overlayRef.dispose();\r\n }, EXIT_ANIMATION_MS);\r\n }\r\n\r\n // Cancels a pending exit and disposes its overlay now (rapid reopen/destroy).\r\n private flushPendingDispose(): void {\r\n if (this.disposeTimer !== undefined) {\r\n clearTimeout(this.disposeTimer);\r\n this.disposeTimer = undefined;\r\n }\r\n const overlayRef = this.pendingDisposeOverlay;\r\n this.pendingDisposeOverlay = undefined;\r\n this.state.closing.set(false);\r\n overlayRef?.dispose();\r\n }\r\n\r\n // Resets state when the overlay is detached externally (e.g. navigation).\r\n private handleDetached(): void {\r\n this.removeDocumentListeners();\r\n this.position.releaseSideWatch();\r\n this.keydownSubscription?.unsubscribe();\r\n this.keydownSubscription = undefined;\r\n this.detachSubscription?.unsubscribe();\r\n this.detachSubscription = undefined;\r\n this.pane.releaseResizeObserver();\r\n this.cancelSwitch();\r\n this.pane.cancelPaneTransaction();\r\n this.overlayRef = undefined;\r\n this.positionStrategy = undefined;\r\n this.state.currentTemplate.set(null);\r\n this.state.previousTemplate.set(null);\r\n this.state.panelId.set(null);\r\n this.state.closing.set(false);\r\n this.state.currentRef = null;\r\n }\r\n\r\n // Runs off the overlay keydownEvents() stream; the target is checked against the overlay element.\r\n private handleOverlayKeydown(event: KeyboardEvent): void {\r\n const overlay = this.overlayRef?.overlayElement;\r\n if (\r\n event.key !== 'Escape' ||\r\n !this.items.open() ||\r\n !overlay ||\r\n !overlay.contains(event.target as Node)\r\n ) {\r\n return;\r\n }\r\n event.preventDefault();\r\n const trigger = this.items.activeEntry()?.element;\r\n this.host.closeFromUser();\r\n trigger?.focus();\r\n }\r\n\r\n // Clears the single root-switch timer.\r\n private cancelSwitch(): void {\r\n if (this.switchTimer !== undefined) {\r\n clearTimeout(this.switchTimer);\r\n this.switchTimer = undefined;\r\n }\r\n }\r\n\r\n // The horizontal root-switch direction, from the two triggers' real positions.\r\n private directionBetween(\r\n previous: RaqmNavigationMenuTopLevelRef,\r\n next: RaqmNavigationMenuTopLevelRef,\r\n ): 'left' | 'right' {\r\n const previousRect = previous.element.getBoundingClientRect();\r\n const nextRect = next.element.getBoundingClientRect();\r\n return nextRect.left > previousRect.left ? 'right' : 'left';\r\n }\r\n}\r\n","// Navigation menu pane: the popup's block-size measurement and pinning, the anchor/content\r\n// resize observer and the one bounded switch-placement transaction.\r\n\r\nimport { AfterRenderRef, Injector, afterNextRender } from '@angular/core';\r\n\r\nimport { OverlayRef } from '@angular/cdk/overlay';\r\n\r\nimport { POPUP_MEASURE_CLASS, prefersReducedMotion } from './navigation-menu-model';\r\n\r\nexport interface RaqmNavigationMenuPaneHost {\r\n /** The live overlay ref, or `undefined` while closed. */\r\n overlay(): OverlayRef | undefined;\r\n side(): 'bottom' | 'top';\r\n}\r\n\r\nexport class RaqmNavigationMenuPane {\r\n // The live `ResizeObserver`, attached only while open.\r\n private resizeObserver: ResizeObserver | undefined;\r\n\r\n // The pending switch-placement transaction and its generation; a stale one cannot apply.\r\n private paneTransactionRef: AfterRenderRef | undefined;\r\n private paneTransactionGeneration = 0;\r\n\r\n // One bounded animation frame releasing a same-side size transition.\r\n private paneSizeFrame: number | undefined;\r\n\r\n // The popup whose outgoing block size is pinned inline, so a superseding path restores it.\r\n private panePinnedPopup: HTMLElement | undefined;\r\n\r\n constructor(\r\n private readonly injector: Injector,\r\n private readonly host: RaqmNavigationMenuPaneHost,\r\n ) {}\r\n\r\n // One bounded post-render pass resolves the incoming size and side before its first visible frame.\r\n schedulePlacement(\r\n previousSide: 'bottom' | 'top',\r\n previousBlockSize: string,\r\n afterPlacement: () => void,\r\n ): void {\r\n const generation = ++this.paneTransactionGeneration;\r\n this.paneTransactionRef = afterNextRender(\r\n () => {\r\n this.paneTransactionRef = undefined;\r\n if (generation !== this.paneTransactionGeneration) {\r\n return;\r\n }\r\n this.applySwitchPlacement(previousSide, previousBlockSize, generation);\r\n afterPlacement();\r\n },\r\n { injector: this.injector },\r\n );\r\n }\r\n\r\n // Resolves a switch final size and side with the transition suppressed, then repositions.\r\n private applySwitchPlacement(\r\n previousSide: 'bottom' | 'top',\r\n previousBlockSize: string,\r\n generation: number,\r\n ): void {\r\n const overlay = this.host.overlay()?.overlayElement;\r\n const popup = overlay?.querySelector<HTMLElement>('.raqm-navigation-menu-popup');\r\n if (!popup) {\r\n this.host.overlay()?.updatePosition();\r\n return;\r\n }\r\n popup.classList.add(POPUP_MEASURE_CLASS);\r\n this.syncPopupBlockSize();\r\n this.host.overlay()?.updatePosition();\r\n const finalBlockSize = popup.style.getPropertyValue('--raqm-navigation-menu-popup-block-size');\r\n popup.classList.remove(POPUP_MEASURE_CLASS);\r\n if (finalBlockSize === '') {\r\n popup.style.removeProperty('block-size');\r\n popup.style.removeProperty('transition');\r\n return;\r\n }\r\n if (this.host.side() === previousSide && previousBlockSize !== '' && !prefersReducedMotion()) {\r\n // Same side: pin the outgoing size with motion suppressed, then release one frame later.\r\n this.cancelPaneSizeFrame();\r\n popup.style.transition = 'none';\r\n popup.style.blockSize = previousBlockSize;\r\n this.panePinnedPopup = popup;\r\n if (typeof requestAnimationFrame === 'function') {\r\n this.paneSizeFrame = requestAnimationFrame(() => {\r\n this.paneSizeFrame = undefined;\r\n if (generation !== this.paneTransactionGeneration) {\r\n return;\r\n }\r\n this.releasePanePin();\r\n });\r\n } else {\r\n this.releasePanePin();\r\n }\r\n return;\r\n }\r\n // Side change, no outgoing size or reduced motion places instantly.\r\n popup.style.removeProperty('block-size');\r\n popup.style.removeProperty('transition');\r\n }\r\n\r\n // offsetHeight is transform-independent; an empty string disables the replay.\r\n currentPopupBlockSize(overlayRef: OverlayRef): string {\r\n const popup = overlayRef.overlayElement.querySelector<HTMLElement>(\r\n '.raqm-navigation-menu-popup',\r\n );\r\n if (!popup || popup.offsetHeight === 0) {\r\n return '';\r\n }\r\n return `${popup.offsetHeight}px`;\r\n }\r\n\r\n // A reused node keeps its animation name, so clear it, force a reflow, then restore it.\r\n restartEnteringSlide(): void {\r\n const entering = this.host\r\n .overlay()\r\n ?.overlayElement?.querySelector<HTMLElement>('.raqm-navigation-menu-content--entering');\r\n if (!entering) {\r\n return;\r\n }\r\n entering.style.animation = 'none';\r\n void entering.offsetWidth;\r\n entering.style.animation = '';\r\n }\r\n\r\n // Observes the anchor, popup and active content while open; always disconnected.\r\n attachResizeObserver(anchor: HTMLElement): void {\r\n this.releaseResizeObserver();\r\n if (typeof ResizeObserver === 'undefined') {\r\n return;\r\n }\r\n this.resizeObserver = new ResizeObserver(() => {\r\n this.syncPopupBlockSize();\r\n this.host.overlay()?.updatePosition();\r\n });\r\n this.resizeObserver.observe(anchor);\r\n const overlay = this.host.overlay()?.overlayElement;\r\n const popup = overlay?.querySelector('.raqm-navigation-menu-popup');\r\n if (popup) {\r\n this.resizeObserver.observe(popup);\r\n }\r\n const content = overlay?.querySelector('.raqm-navigation-menu-content--entering');\r\n if (content) {\r\n this.resizeObserver.observe(content);\r\n }\r\n }\r\n\r\n // Sizes the popup from the active content so its block-size transition animates a switch.\r\n syncPopupBlockSize(): void {\r\n const overlay = this.host.overlay()?.overlayElement;\r\n if (!overlay) {\r\n return;\r\n }\r\n const popup = overlay.querySelector<HTMLElement>('.raqm-navigation-menu-popup');\r\n const content = overlay.querySelector<HTMLElement>('.raqm-navigation-menu-content--entering');\r\n if (!popup || !content) {\r\n return;\r\n }\r\n popup.style.setProperty('--raqm-navigation-menu-popup-block-size', `${content.offsetHeight}px`);\r\n }\r\n\r\n releaseResizeObserver(): void {\r\n this.resizeObserver?.disconnect();\r\n this.resizeObserver = undefined;\r\n }\r\n\r\n // Bumping the generation makes an already-scheduled callback a no-op.\r\n cancelPaneTransaction(): void {\r\n this.paneTransactionGeneration++;\r\n this.paneTransactionRef?.destroy();\r\n this.paneTransactionRef = undefined;\r\n this.cancelPaneSizeFrame();\r\n }\r\n\r\n // Restores the inline size the pin owns, so no stale pinned size survives.\r\n private cancelPaneSizeFrame(): void {\r\n if (this.paneSizeFrame !== undefined && typeof cancelAnimationFrame === 'function') {\r\n cancelAnimationFrame(this.paneSizeFrame);\r\n }\r\n this.paneSizeFrame = undefined;\r\n this.releasePanePin();\r\n }\r\n\r\n // Removes the inline `block-size`/`transition` of an active pin; idempotent.\r\n private releasePanePin(): void {\r\n const popup = this.panePinnedPopup;\r\n if (!popup) {\r\n return;\r\n }\r\n popup.style.removeProperty('block-size');\r\n popup.style.removeProperty('transition');\r\n this.panePinnedPopup = undefined;\r\n }\r\n}\r\n","// Navigation menu placement: the connected position strategy, the side watch and the\r\n// switch-only glide classes on the overlay pane.\r\n\r\nimport {\r\n ConnectedPosition,\r\n FlexibleConnectedPositionStrategy,\r\n Overlay,\r\n} from '@angular/cdk/overlay';\r\n\r\nimport {\r\n COLLISION_MARGIN,\r\n PANE_GLIDE_CLASS,\r\n PANE_GLIDE_LEFT_CLASS,\r\n PANE_GLIDE_RIGHT_CLASS,\r\n SIDE_OFFSET,\r\n} from './navigation-menu-model';\r\nimport { RaqmNavigationMenuState } from './navigation-menu-view-state';\r\n\r\nexport interface RaqmNavigationMenuPositionHost {\r\n align(): 'start' | 'end';\r\n direction(): 'ltr' | 'rtl';\r\n /** The live overlay pane element, or `undefined` while closed. */\r\n pane(): HTMLElement | undefined;\r\n}\r\n\r\nexport class RaqmNavigationMenuPosition {\r\n private sideSubscription: { unsubscribe(): void } | undefined;\r\n\r\n constructor(\r\n private readonly overlay: Overlay,\r\n private readonly state: RaqmNavigationMenuState,\r\n private readonly host: RaqmNavigationMenuPositionHost,\r\n ) {}\r\n\r\n // Below the anchor logical edge, with a gap, collision margin and viewport push.\r\n buildStrategy(origin: HTMLElement): FlexibleConnectedPositionStrategy {\r\n const strategy = this.overlay.position().flexibleConnectedTo(origin);\r\n strategy\r\n .withPositions(this.buildPositions())\r\n .withFlexibleDimensions(false)\r\n .withGrowAfterOpen(false)\r\n .withPush(true)\r\n .withViewportMargin(COLLISION_MARGIN);\r\n return strategy;\r\n }\r\n\r\n // start and end resolve against the overlay direction, so RTL needs no physical override.\r\n private buildPositions(): ConnectedPosition[] {\r\n const align: 'start' | 'end' = this.host.align() === 'end' ? 'end' : 'start';\r\n return [\r\n {\r\n originX: align,\r\n originY: 'bottom',\r\n overlayX: align,\r\n overlayY: 'top',\r\n offsetY: SIDE_OFFSET,\r\n },\r\n {\r\n originX: align,\r\n originY: 'top',\r\n overlayX: align,\r\n overlayY: 'bottom',\r\n offsetY: -SIDE_OFFSET,\r\n },\r\n ];\r\n }\r\n\r\n // Tracks which side the strategy actually applied (below, or flipped above).\r\n watchSide(strategy: FlexibleConnectedPositionStrategy): void {\r\n this.sideSubscription = strategy.positionChanges.subscribe((change) => {\r\n this.state.side.set(change.connectionPair.originY === 'top' ? 'top' : 'bottom');\r\n // Armed for the next reposition, so the first open's own displacement never animates.\r\n this.armPaneGlide(this.host.pane() ?? null);\r\n });\r\n }\r\n\r\n releaseSideWatch(): void {\r\n this.sideSubscription?.unsubscribe();\r\n this.sideSubscription = undefined;\r\n }\r\n\r\n // Inert without an axis fallback (the CDK resets to `auto`), so only a switch interpolates.\r\n private armPaneGlide(pane: HTMLElement | null): void {\r\n pane?.classList.add(PANE_GLIDE_CLASS);\r\n }\r\n\r\n // Horizontal only: a vertical fallback would over-constrain a collision flip and stretch the pane.\r\n armPaneGlideAxes(pane: HTMLElement | null): void {\r\n if (!pane) {\r\n return;\r\n }\r\n const usesRight =\r\n this.host.direction() === 'rtl' ? this.host.align() === 'start' : this.host.align() === 'end';\r\n pane.classList.toggle(PANE_GLIDE_LEFT_CLASS, !usesRight);\r\n pane.classList.toggle(PANE_GLIDE_RIGHT_CLASS, usesRight);\r\n }\r\n\r\n // Removes the fallbacks so every non-switch reposition follows instantly again.\r\n disarmPaneGlideAxes(pane: HTMLElement | null): void {\r\n pane?.classList.remove(PANE_GLIDE_LEFT_CLASS, PANE_GLIDE_RIGHT_CLASS);\r\n }\r\n}\r\n","// Navigation menu pane state: the writable signals the template reads, plus the open\r\n// bookkeeping shared by the open, switch and close paths.\r\n\r\nimport { TemplateRef, signal } from '@angular/core';\r\n\r\nimport { RaqmNavigationMenuTopLevelRef } from './navigation-menu-context';\r\n\r\nexport class RaqmNavigationMenuState {\r\n /** The id of the live panel element (the `aria-controls` target). */\r\n readonly panelId = signal<string | null>(null);\r\n\r\n // The direction resolved at open time and applied to the panel and overlay.\r\n readonly overlayDir = signal<'ltr' | 'rtl'>('ltr');\r\n\r\n // The current template and the outgoing one held only for the switch transition.\r\n readonly currentTemplate = signal<TemplateRef<unknown> | null>(null);\r\n readonly previousTemplate = signal<TemplateRef<unknown> | null>(null);\r\n\r\n // The root-switch movement direction, driving the slide transition.\r\n readonly activationDirection = signal<'left' | 'right' | null>(null);\r\n\r\n // The side the panel actually opened on (drives the CSS bridge/collision path).\r\n readonly side = signal<'bottom' | 'top'>('bottom');\r\n\r\n readonly closing = signal<boolean>(false);\r\n\r\n // The trigger currently reflected as open, so a switch can be told from an open.\r\n currentRef: RaqmNavigationMenuTopLevelRef | null = null;\r\n\r\n // The focus target requested by a keyboard open, applied once the panel exists.\r\n pendingFocus: 'first' | 'last' | null = null;\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n Injector,\r\n OnDestroy,\r\n OnInit,\r\n TemplateRef,\r\n ViewContainerRef,\r\n computed,\r\n inject,\r\n input,\r\n model,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\n\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { Overlay } from '@angular/cdk/overlay';\r\n\r\nimport {\r\n RAQM_NAVIGATION_MENU,\r\n RaqmNavigationMenuContext,\r\n RaqmNavigationMenuTopLevelRef,\r\n} from './navigation-menu-context';\r\nimport { RaqmNavigationMenuDismissal } from './navigation-menu-dismiss';\r\nimport { connectNavigationMenuEffects } from './navigation-menu-effects';\r\nimport { RaqmNavigationMenuItems } from './navigation-menu-items';\r\nimport { RaqmNavigationMenuKeyboard } from './navigation-menu-keyboard';\r\nimport { RaqmNavigationMenuOverlay } from './navigation-menu-overlay';\r\nimport { RaqmNavigationMenuPane } from './navigation-menu-pane';\r\nimport { RaqmNavigationMenuPosition } from './navigation-menu-position';\r\nimport { RaqmNavigationMenuState } from './navigation-menu-view-state';\r\n\r\n/** A nav host coordinating one active disclosure trigger and its shared popup panel. */\r\n@Component({\r\n selector: 'nav[raqm-navigation-menu]',\r\n imports: [NgTemplateOutlet],\r\n templateUrl: './navigation-menu.component.html',\r\n styleUrl: './navigation-menu.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'raqm-navigation-menu',\r\n // Styles-only hook for the open state.\r\n '[attr.data-raqm-open]': 'open() ? \"\" : null',\r\n // Focus-out closes only when focus leaves BOTH the root and its overlay.\r\n '(focusout)': 'onFocusOut($event)',\r\n // Keeps arrow navigation continuing from the focused top-level item.\r\n '(focusin)': 'onFocusIn($event)',\r\n },\r\n providers: [\r\n // A dedicated token avoids a module cycle with a component import.\r\n { provide: RAQM_NAVIGATION_MENU, useExisting: RaqmNavigationMenuComponent },\r\n ],\r\n})\r\nexport class RaqmNavigationMenuComponent implements RaqmNavigationMenuContext, OnInit, OnDestroy {\r\n // Native `<nav>` host; resolves the direction, focus containment and Tab exit.\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n private readonly overlay = inject(Overlay);\r\n\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n\r\n // Captured so ngOnInit can build the key manager.\r\n private readonly injector = inject(Injector);\r\n\r\n // Optional; resolvedDir falls back to computed style for a CSS-only dir.\r\n private readonly directionality = inject(Directionality, { optional: true });\r\n\r\n private readonly panelTemplate = viewChild.required('panel', {\r\n read: TemplateRef,\r\n });\r\n\r\n readonly value = model<string | null>(null);\r\n\r\n /** Panel alignment against the trigger's logical edge. */\r\n readonly align = input<'start' | 'end'>('start');\r\n\r\n /** Explicit direction for the panel; falls back to the nearest one. */\r\n readonly dir = input<'ltr' | 'rtl' | undefined>(undefined);\r\n\r\n private readonly state: RaqmNavigationMenuState = new RaqmNavigationMenuState();\r\n\r\n // Registered top-level items and panel links, with the derived open state.\r\n private readonly items: RaqmNavigationMenuItems = new RaqmNavigationMenuItems({\r\n value: () => this.value(),\r\n });\r\n\r\n /** Whether any disclosure is open. */\r\n readonly open = this.items.open;\r\n\r\n /** The active trigger value, or `null`. */\r\n readonly activeValue = this.items.activeValue;\r\n\r\n /** The id of the live panel element (the `aria-controls` target). */\r\n readonly panelId = this.state.panelId;\r\n\r\n // The direction resolved at open time and applied to the panel and overlay.\r\n readonly overlayDir = this.state.overlayDir;\r\n\r\n // The current template and the outgoing one held only for the switch transition.\r\n readonly currentTemplate = this.state.currentTemplate;\r\n readonly previousTemplate = this.state.previousTemplate;\r\n\r\n // The root-switch movement direction, driving the slide transition.\r\n readonly activationDirection = this.state.activationDirection;\r\n\r\n // The side the panel actually opened on (drives the CSS bridge/collision path).\r\n readonly side = this.state.side;\r\n\r\n readonly closing = this.state.closing;\r\n\r\n private readonly position: RaqmNavigationMenuPosition = new RaqmNavigationMenuPosition(\r\n this.overlay,\r\n this.state,\r\n {\r\n align: () => this.align(),\r\n direction: () => this.resolvedDir(),\r\n pane: () => this.layer.element,\r\n },\r\n );\r\n\r\n private readonly pane: RaqmNavigationMenuPane = new RaqmNavigationMenuPane(this.injector, {\r\n overlay: () => this.layer.ref,\r\n side: () => this.state.side(),\r\n });\r\n\r\n private readonly dismissal: RaqmNavigationMenuDismissal = new RaqmNavigationMenuDismissal({\r\n root: this.host.nativeElement,\r\n open: () => this.open(),\r\n pane: () => this.layer.element,\r\n openFromTrigger: (ref, focusContent) => this.openFromTrigger(ref, focusContent),\r\n closeFromUser: () => this.closeFromUser(),\r\n setUserValue: (value) => this.setUserValue(value),\r\n });\r\n\r\n private readonly keyboard: RaqmNavigationMenuKeyboard = new RaqmNavigationMenuKeyboard(\r\n this.state,\r\n {\r\n root: this.host.nativeElement,\r\n open: () => this.open(),\r\n activeEntry: () => this.items.activeEntry(),\r\n topLevelItems: () => this.items.topLevelItems(),\r\n pane: () => this.layer.element,\r\n panelLinkElements: () => this.items.panelLinkElements(),\r\n isInsideRootOrOverlay: (node) => this.dismissal.isInsideRootOrOverlay(node),\r\n closeFromUser: () => this.closeFromUser(),\r\n },\r\n );\r\n\r\n private readonly layer: RaqmNavigationMenuOverlay = new RaqmNavigationMenuOverlay(\r\n this.overlay,\r\n this.viewContainerRef,\r\n this.state,\r\n this.items,\r\n this.position,\r\n this.pane,\r\n this.dismissal,\r\n this.keyboard,\r\n {\r\n panelTemplate: () => this.panelTemplate(),\r\n direction: () => this.resolvedDir(),\r\n closeFromUser: () => this.closeFromUser(),\r\n },\r\n );\r\n\r\n // Explicit input, then the host's computed style, then the CDK Bidi value.\r\n readonly resolvedDir = computed<'ltr' | 'rtl'>(() => {\r\n const explicit = this.dir();\r\n if (explicit === 'ltr' || explicit === 'rtl') {\r\n return explicit;\r\n }\r\n const computedStyle = getComputedStyle(this.host.nativeElement).direction;\r\n if (computedStyle === 'rtl') {\r\n return 'rtl';\r\n }\r\n return this.directionality?.value ?? 'ltr';\r\n });\r\n\r\n constructor() {\r\n connectNavigationMenuEffects({\r\n activeEntry: () => this.items.activeEntry(),\r\n resolvedDir: () => this.resolvedDir(),\r\n align: () => this.align(),\r\n syncOverlay: (next) => this.layer.syncOverlay(next),\r\n setKeyManagerDirection: (direction) => this.keyboard.setDirection(direction),\r\n realignOpenPanel: (align) => this.layer.realignOpenPanel(align),\r\n });\r\n }\r\n\r\n // Built here, not in the constructor: the manager reads topLevelItems.\r\n ngOnInit(): void {\r\n this.keyboard.init(this.items.topLevelItems, this.injector, this.resolvedDir());\r\n }\r\n\r\n /** Destroys the key manager and releases every overlay/timer/observer. */\r\n ngOnDestroy(): void {\r\n this.layer.destroy();\r\n }\r\n\r\n /** Whether the given trigger value is the root's active disclosure. */\r\n isActive(value: string): boolean {\r\n return this.activeValue() === value && this.open();\r\n }\r\n\r\n /** Registers a top-level item, reporting duplicate/empty values in development. */\r\n registerTopLevel(ref: RaqmNavigationMenuTopLevelRef): void {\r\n this.items.registerTopLevel(ref);\r\n }\r\n\r\n /** Unregisters a top-level item; never changes the value. */\r\n unregisterTopLevel(ref: RaqmNavigationMenuTopLevelRef): void {\r\n this.items.unregisterTopLevel(ref);\r\n }\r\n\r\n /** Registers a panel link for the open panel's logical Tab boundaries. */\r\n registerPanelLink(element: HTMLElement): void {\r\n this.items.registerPanelLink(element);\r\n }\r\n\r\n /** Removes a panel link registered for Tab-boundary handling. */\r\n unregisterPanelLink(element: HTMLElement): void {\r\n this.items.unregisterPanelLink(element);\r\n }\r\n\r\n // A disabled trigger or a direct link is a no-op; an active trigger only moves focus.\r\n openFromTrigger(\r\n ref: RaqmNavigationMenuTopLevelRef,\r\n focusContent: 'first' | 'last' | 'none',\r\n ): void {\r\n if (ref.disabled || ref.triggerValue === null) {\r\n return;\r\n }\r\n this.dismissal.cancelHoverOpen();\r\n this.dismissal.cancelHoverClose();\r\n if (this.items.activeEntry() === ref) {\r\n if (focusContent !== 'none') {\r\n this.keyboard.focusContent(focusContent);\r\n }\r\n return;\r\n }\r\n this.state.pendingFocus = focusContent === 'none' ? null : focusContent;\r\n this.setUserValue(ref.triggerValue);\r\n }\r\n\r\n /** Toggles a trigger's disclosure as a user action. */\r\n toggleFromTrigger(ref: RaqmNavigationMenuTopLevelRef): void {\r\n if (ref.disabled || ref.triggerValue === null) {\r\n return;\r\n }\r\n if (this.items.activeEntry() === ref) {\r\n this.closeFromUser();\r\n return;\r\n }\r\n this.openFromTrigger(ref, 'none');\r\n }\r\n\r\n /** Closes the open disclosure as a user action (Escape/link/outside). */\r\n closeFromUser(): void {\r\n this.dismissal.cancelHoverOpen();\r\n this.dismissal.cancelHoverClose();\r\n this.setUserValue(null);\r\n }\r\n\r\n /** Delays a pointer-open for a hovered trigger (the single shared open timer). */\r\n scheduleHoverOpen(ref: RaqmNavigationMenuTopLevelRef): void {\r\n this.dismissal.scheduleHoverOpen(ref);\r\n }\r\n\r\n cancelHoverOpen(): void {\r\n this.dismissal.cancelHoverOpen();\r\n }\r\n\r\n scheduleHoverClose(): void {\r\n this.dismissal.scheduleHoverClose();\r\n }\r\n\r\n cancelHoverClose(): void {\r\n this.dismissal.cancelHoverClose();\r\n }\r\n\r\n moveFocusAcrossTopLevel(event: KeyboardEvent, ref: RaqmNavigationMenuTopLevelRef): void {\r\n this.keyboard.moveFocusAcrossTopLevel(event, ref);\r\n }\r\n\r\n handleTopLevelTab(event: KeyboardEvent, ref: RaqmNavigationMenuTopLevelRef): void {\r\n this.keyboard.handleTopLevelTab(event, ref);\r\n }\r\n\r\n handlePanelTab(event: KeyboardEvent, element: HTMLElement): void {\r\n this.keyboard.handlePanelTab(event, element);\r\n }\r\n\r\n /** Focuses the first or last link inside the open panel. */\r\n focusContent(focus: 'first' | 'last'): void {\r\n this.keyboard.focusContent(focus);\r\n }\r\n\r\n /** Records the focused top-level item as the key manager's active item. */\r\n protected onFocusIn(event: FocusEvent): void {\r\n this.keyboard.onFocusIn(event);\r\n }\r\n\r\n /** Closes the panel only when focus leaves both the root and its overlay. */\r\n protected onFocusOut(event: FocusEvent): void {\r\n this.dismissal.maybeCloseOnFocusOut(event);\r\n }\r\n\r\n /** Panel-level focus-out; same rule as the host. */\r\n protected onPanelFocusOut(event: FocusEvent): void {\r\n this.dismissal.maybeCloseOnFocusOut(event);\r\n }\r\n\r\n /** Cancels a pending pointer-close when the pointer enters the panel. */\r\n protected onPanelPointerEnter(): void {\r\n this.dismissal.onPanelPointerEnter();\r\n }\r\n\r\n /** Schedules a pointer-close when the pointer leaves the panel. */\r\n protected onPanelPointerLeave(event: PointerEvent): void {\r\n this.dismissal.onPanelPointerLeave(event);\r\n }\r\n\r\n /** Detached destinations must not arm the trigger's hover-close timer. */\r\n isInsideDetachedOverlay(node: Node | null): boolean {\r\n return this.dismissal.isInsideDetachedOverlay(node);\r\n }\r\n\r\n // Sets the value as a user action; the model emits `valueChange` on a real change.\r\n private setUserValue(value: string | null): void {\r\n if (this.value() === value) {\r\n return;\r\n }\r\n this.value.set(value);\r\n }\r\n}\r\n","<ng-content />\r\n\r\n<ng-template #panel>\r\n <div\r\n class=\"raqm-navigation-menu-popup\"\r\n [attr.dir]=\"overlayDir()\"\r\n [attr.data-raqm-side]=\"side()\"\r\n [attr.data-raqm-activation]=\"activationDirection()\"\r\n [class.raqm-navigation-menu-popup--closing]=\"closing()\"\r\n (focusout)=\"onPanelFocusOut($event)\"\r\n (pointerenter)=\"onPanelPointerEnter()\"\r\n (pointerleave)=\"onPanelPointerLeave($event)\"\r\n >\r\n <!-- Safe pointer path across the 8px gap. -->\r\n <span class=\"raqm-navigation-menu-bridge\" aria-hidden=\"true\"></span>\r\n\r\n <div class=\"raqm-navigation-menu-viewport\">\r\n @if (previousTemplate(); as previous) {\r\n <!-- Outgoing content, inert and hidden from assistive technology while it fades. -->\r\n <div\r\n class=\"raqm-navigation-menu-content raqm-navigation-menu-content--leaving\"\r\n [attr.dir]=\"overlayDir()\"\r\n aria-hidden=\"true\"\r\n inert\r\n >\r\n <ng-container [ngTemplateOutlet]=\"previous\" />\r\n </div>\r\n }\r\n @if (currentTemplate(); as current) {\r\n <div\r\n class=\"raqm-navigation-menu-content raqm-navigation-menu-content--entering\"\r\n [attr.dir]=\"overlayDir()\"\r\n [attr.id]=\"panelId()\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"current\" />\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</ng-template>\r\n","import {\r\n Directive,\r\n ElementRef,\r\n DestroyRef,\r\n OnInit,\r\n TemplateRef,\r\n booleanAttribute,\r\n computed,\r\n contentChild,\r\n inject,\r\n input,\r\n isDevMode,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport {\r\n RAQM_NAVIGATION_MENU,\r\n RaqmNavigationMenuContext,\r\n RaqmNavigationMenuTopLevelRef,\r\n} from './navigation-menu-context';\r\n\r\n// Shared \"no content\" signal for a direct top-level link; avoids a per-instance signal.\r\nconst NO_CONTENT = signal<TemplateRef<unknown> | null>(null);\r\n\r\n/** The ul holding the navigation menu items, keeping native list semantics. */\r\n@Directive({\r\n selector: 'ul[raqm-navigation-menu-list]',\r\n host: {\r\n class: 'raqm-navigation-menu-list',\r\n },\r\n})\r\nexport class RaqmNavigationMenuListDirective {}\r\n\r\n/**\r\n * Navigation menu trigger: a native `<button>` opening one disclosure panel.\r\n *\r\n * @remarks\r\n * Panel content comes from the nested `ng-template[raqm-navigation-menu-content]`\r\n * (read by a content query), not a `TemplateRef` input. Sets the real\r\n * `aria-expanded`/`aria-controls` disclosure state; no `menubar`/`menu` role and no\r\n * `aria-haspopup`. Arrow Down/Enter/Space open at the first link, Arrow Up at the\r\n * last, Left/Right move across items, Escape restores focus. Registration happens in\r\n * `ngOnInit`, after the required `value` is bound.\r\n */\r\n@Directive({\r\n selector: 'button[raqm-navigation-menu-trigger]',\r\n host: {\r\n class: 'raqm-navigation-menu-trigger',\r\n // The real disclosure state, tied to the panel the root owns.\r\n '[attr.aria-expanded]': 'active() ? \"true\" : \"false\"',\r\n '[attr.aria-controls]': 'active() ? panelId() : null',\r\n // Presence-only hook for the shipped open/chevron-rotation styles.\r\n '[attr.data-raqm-open]': 'active() ? \"\" : null',\r\n // Native disabled state (also suppresses pointer/keyboard activation).\r\n '[attr.disabled]': 'disabled() ? \"\" : null',\r\n '(click)': 'onClick()',\r\n '(keydown)': 'onKeydown($event)',\r\n '(pointerenter)': 'onPointerEnter($event)',\r\n '(pointerleave)': 'onPointerLeave($event)',\r\n },\r\n})\r\nexport class RaqmNavigationMenuTriggerDirective implements OnInit {\r\n private readonly host = inject(ElementRef<HTMLButtonElement>);\r\n\r\n // Optional, so a misplaced trigger reports a development error instead of crashing.\r\n private readonly menu = inject<RaqmNavigationMenuContext | null>(RAQM_NAVIGATION_MENU, {\r\n optional: true,\r\n });\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n readonly value = input.required<string>();\r\n\r\n // The nested content marker consumed directly instead of a `TemplateRef` input.\r\n private readonly contentDirective = contentChild(RaqmNavigationMenuContentDirective);\r\n\r\n private readonly contentTemplate = computed<TemplateRef<unknown> | null>(\r\n () => this.contentDirective()?.content ?? null,\r\n );\r\n\r\n /** A disabled trigger never opens and is skipped by focus. */\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n\r\n // Tracks the real panel state through the shared context.\r\n readonly active = computed(() => this.menu?.isActive(this.value()) ?? false);\r\n\r\n // The root owns the id, so `aria-controls` always points at the real panel.\r\n readonly panelId = computed(() => this.menu?.panelId() ?? null);\r\n\r\n // Getters read live signals so registration, disabled changes and focus stay reactive.\r\n private readonly ref: RaqmNavigationMenuTopLevelRef = (() => {\r\n const self = this;\r\n return {\r\n get element(): HTMLElement {\r\n return self.host.nativeElement;\r\n },\r\n get triggerValue(): string {\r\n return self.value();\r\n },\r\n get content() {\r\n return self.contentTemplate;\r\n },\r\n get disabled(): boolean {\r\n return self.disabled();\r\n },\r\n focus(): void {\r\n self.host.nativeElement.focus();\r\n },\r\n };\r\n })();\r\n\r\n constructor() {\r\n // Default to `type=\"button\"`, preserving an authored type.\r\n const element = this.host.nativeElement;\r\n if (!element.hasAttribute('type')) {\r\n element.setAttribute('type', 'button');\r\n }\r\n\r\n if (isDevMode() && this.menu === null) {\r\n console.error(\r\n '[raqm-navigation-menu-trigger] No parent <nav raqm-navigation-menu> found; the trigger cannot open a panel.',\r\n );\r\n }\r\n\r\n // Registration waits for `ngOnInit`, after the required `value` is bound.\r\n this.destroyRef.onDestroy(() => this.menu?.unregisterTopLevel(this.ref));\r\n }\r\n\r\n ngOnInit(): void {\r\n this.menu?.registerTopLevel(this.ref);\r\n }\r\n\r\n // Toggles on a native click; the root moves focus into the panel on open.\r\n protected onClick(): void {\r\n if (this.disabled()) {\r\n return;\r\n }\r\n this.menu?.toggleFromTrigger(this.ref);\r\n }\r\n\r\n /** Routes every trigger keyboard interaction to the root's policy. */\r\n protected onKeydown(event: KeyboardEvent): void {\r\n if (this.disabled()) {\r\n return;\r\n }\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n this.menu?.openFromTrigger(this.ref, 'first');\r\n return;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this.menu?.openFromTrigger(this.ref, 'last');\r\n return;\r\n case 'Enter':\r\n case ' ':\r\n // Suppress the native click so Enter/Space cannot double-toggle.\r\n event.preventDefault();\r\n this.menu?.openFromTrigger(this.ref, 'first');\r\n return;\r\n case 'Escape':\r\n if (this.menu?.open()) {\r\n event.preventDefault();\r\n this.menu.closeFromUser();\r\n }\r\n return;\r\n case 'ArrowLeft':\r\n case 'ArrowRight':\r\n this.menu?.moveFocusAcrossTopLevel(event, this.ref);\r\n return;\r\n case 'Tab':\r\n this.menu?.handleTopLevelTab(event, this.ref);\r\n return;\r\n default:\r\n return;\r\n }\r\n }\r\n\r\n /** Schedules a delayed pointer-open; touch pointers never hover-open. */\r\n protected onPointerEnter(event: PointerEvent): void {\r\n if (event.pointerType === 'touch' || this.disabled()) {\r\n return;\r\n }\r\n this.menu?.scheduleHoverOpen(this.ref);\r\n }\r\n\r\n /** Schedules a delayed pointer-close; the panel's own enter cancels it. */\r\n protected onPointerLeave(event: PointerEvent): void {\r\n if (\r\n event.pointerType === 'touch' ||\r\n this.menu?.isInsideDetachedOverlay(event.relatedTarget as Node | null)\r\n ) {\r\n return;\r\n }\r\n this.menu?.scheduleHoverClose();\r\n }\r\n}\r\n\r\n/** The ng-template holding one trigger panel content; supplies content identity only. */\r\n@Directive({\r\n selector: 'ng-template[raqm-navigation-menu-content]',\r\n exportAs: 'raqmNavigationMenuContent',\r\n})\r\nexport class RaqmNavigationMenuContentDirective {\r\n readonly content = inject<TemplateRef<unknown>>(TemplateRef);\r\n\r\n // Optional, so a misplaced template reports instead of crashing.\r\n private readonly menu = inject<RaqmNavigationMenuContext | null>(RAQM_NAVIGATION_MENU, {\r\n optional: true,\r\n });\r\n\r\n constructor() {\r\n if (isDevMode() && this.menu === null) {\r\n console.error(\r\n '[raqm-navigation-menu-content] No parent <nav raqm-navigation-menu> found; the template is never rendered.',\r\n );\r\n }\r\n }\r\n}\r\n\r\n/** A native link; only an ordinary unmodified primary activation closes the menu. */\r\n@Directive({\r\n selector: 'a[raqm-navigation-menu-link]',\r\n host: {\r\n class: 'raqm-navigation-menu-link',\r\n // `aria-current=\"page\"` only for the active link — never a bare attribute.\r\n '[attr.aria-current]': 'active() ? \"page\" : null',\r\n '(click)': 'onClick($event)',\r\n '(keydown)': 'onKeydown($event)',\r\n },\r\n})\r\nexport class RaqmNavigationMenuLinkDirective implements OnInit {\r\n // Native host element; used for Tab-boundary registration.\r\n private readonly host = inject(ElementRef<HTMLAnchorElement>);\r\n\r\n // Optional, so a misplaced link still renders.\r\n private readonly menu = inject<RaqmNavigationMenuContext | null>(RAQM_NAVIGATION_MENU, {\r\n optional: true,\r\n });\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n readonly active = input(false, { transform: booleanAttribute });\r\n\r\n constructor() {\r\n this.destroyRef.onDestroy(() => this.menu?.unregisterPanelLink(this.host.nativeElement));\r\n }\r\n\r\n ngOnInit(): void {\r\n this.menu?.registerPanelLink(this.host.nativeElement);\r\n }\r\n\r\n // A modified or non-primary activation keeps native behaviour and never closes.\r\n protected onClick(event: MouseEvent): void {\r\n if (event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {\r\n return;\r\n }\r\n this.menu?.closeFromUser();\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'Tab') {\r\n this.menu?.handlePanelTab(event, this.host.nativeElement);\r\n }\r\n }\r\n}\r\n\r\n/** A native top-level link styled like a trigger, with no popup. */\r\n@Directive({\r\n selector: 'a[raqm-navigation-menu-top-link]',\r\n host: {\r\n class: 'raqm-navigation-menu-top-link',\r\n // Arrow navigation reaches a direct link too; Down/Up/Enter/Space stay native.\r\n '(keydown)': 'onKeydown($event)',\r\n },\r\n})\r\nexport class RaqmNavigationMenuTopLinkDirective implements OnInit {\r\n // Native host element; used for focus movement.\r\n private readonly host = inject(ElementRef<HTMLAnchorElement>);\r\n\r\n // Optional, so a misplaced link still renders.\r\n private readonly menu = inject<RaqmNavigationMenuContext | null>(RAQM_NAVIGATION_MENU, {\r\n optional: true,\r\n });\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n // A direct link has no popup, so its content is the shared empty signal.\r\n private readonly ref: RaqmNavigationMenuTopLevelRef = (() => {\r\n const self = this;\r\n return {\r\n get element(): HTMLElement {\r\n return self.host.nativeElement;\r\n },\r\n get triggerValue(): null {\r\n return null;\r\n },\r\n get content() {\r\n return NO_CONTENT;\r\n },\r\n get disabled(): boolean {\r\n return false;\r\n },\r\n focus(): void {\r\n self.host.nativeElement.focus();\r\n },\r\n };\r\n })();\r\n\r\n constructor() {\r\n this.destroyRef.onDestroy(() => this.menu?.unregisterTopLevel(this.ref));\r\n }\r\n\r\n ngOnInit(): void {\r\n this.menu?.registerTopLevel(this.ref);\r\n }\r\n\r\n // No popup, so Down/Up/Enter/Space stay the native link activation.\r\n protected onKeydown(event: KeyboardEvent): void {\r\n switch (event.key) {\r\n case 'ArrowLeft':\r\n case 'ArrowRight':\r\n this.menu?.moveFocusAcrossTopLevel(event, this.ref);\r\n return;\r\n case 'Tab':\r\n this.menu?.handleTopLevelTab(event, this.ref);\r\n return;\r\n default:\r\n return;\r\n }\r\n }\r\n}\r\n","import { RaqmNavigationMenuComponent } from './navigation-menu';\r\nimport {\r\n RaqmNavigationMenuContentDirective,\r\n RaqmNavigationMenuLinkDirective,\r\n RaqmNavigationMenuListDirective,\r\n RaqmNavigationMenuTopLinkDirective,\r\n RaqmNavigationMenuTriggerDirective,\r\n} from './navigation-menu.directive';\r\n\r\nexport {\r\n RaqmNavigationMenuComponent,\r\n RaqmNavigationMenuContentDirective,\r\n RaqmNavigationMenuLinkDirective,\r\n RaqmNavigationMenuListDirective,\r\n RaqmNavigationMenuTopLinkDirective,\r\n RaqmNavigationMenuTriggerDirective,\r\n};\r\n\r\nexport const RaqmNavigationMenu = [\r\n RaqmNavigationMenuComponent,\r\n RaqmNavigationMenuListDirective,\r\n RaqmNavigationMenuTriggerDirective,\r\n RaqmNavigationMenuContentDirective,\r\n RaqmNavigationMenuLinkDirective,\r\n RaqmNavigationMenuTopLinkDirective,\r\n] as const;\r\n"],"mappings":"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"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
const themeTokens = [
|
|
2
|
+
"--raqm-spacing",
|
|
3
|
+
"--raqm-radius",
|
|
4
|
+
"--raqm-radius-sm",
|
|
5
|
+
"--raqm-radius-md",
|
|
6
|
+
"--raqm-radius-lg",
|
|
7
|
+
"--raqm-radius-xl",
|
|
8
|
+
"--raqm-radius-2xl",
|
|
9
|
+
"--raqm-font-size-xs",
|
|
10
|
+
"--raqm-font-size-sm",
|
|
11
|
+
"--raqm-font-size-base",
|
|
12
|
+
"--raqm-font-size-lg",
|
|
13
|
+
"--raqm-line-height-none",
|
|
14
|
+
"--raqm-line-height-tight",
|
|
15
|
+
"--raqm-line-height-snug",
|
|
16
|
+
"--raqm-line-height-normal",
|
|
17
|
+
"--raqm-line-height-relaxed",
|
|
18
|
+
"--raqm-font-weight-normal",
|
|
19
|
+
"--raqm-font-weight-medium",
|
|
20
|
+
"--raqm-shadow-sm",
|
|
21
|
+
"--raqm-shadow-md",
|
|
22
|
+
"--raqm-shadow-lg",
|
|
23
|
+
"--raqm-focus-ring-width",
|
|
24
|
+
"--raqm-disabled-opacity",
|
|
25
|
+
"--raqm-duration-fast",
|
|
26
|
+
"--raqm-duration-base",
|
|
27
|
+
"--raqm-duration-slow",
|
|
28
|
+
"--raqm-duration-slower",
|
|
29
|
+
"--raqm-ease-standard",
|
|
30
|
+
"--raqm-ease-in-out",
|
|
31
|
+
"--raqm-ease-out",
|
|
32
|
+
"--raqm-ease-linear",
|
|
33
|
+
"--raqm-ease-emphasized",
|
|
34
|
+
"--raqm-background",
|
|
35
|
+
"--raqm-foreground",
|
|
36
|
+
"--raqm-card",
|
|
37
|
+
"--raqm-card-foreground",
|
|
38
|
+
"--raqm-popover",
|
|
39
|
+
"--raqm-popover-foreground",
|
|
40
|
+
"--raqm-primary",
|
|
41
|
+
"--raqm-primary-foreground",
|
|
42
|
+
"--raqm-secondary",
|
|
43
|
+
"--raqm-secondary-foreground",
|
|
44
|
+
"--raqm-muted",
|
|
45
|
+
"--raqm-muted-foreground",
|
|
46
|
+
"--raqm-accent",
|
|
47
|
+
"--raqm-accent-foreground",
|
|
48
|
+
"--raqm-destructive",
|
|
49
|
+
"--raqm-destructive-foreground",
|
|
50
|
+
"--raqm-border",
|
|
51
|
+
"--raqm-input",
|
|
52
|
+
"--raqm-ring",
|
|
53
|
+
"--raqm-white",
|
|
54
|
+
"--raqm-primary-hover",
|
|
55
|
+
"--raqm-secondary-hover",
|
|
56
|
+
"--raqm-control-bg",
|
|
57
|
+
"--raqm-input-disabled-bg",
|
|
58
|
+
"--raqm-invalid-border",
|
|
59
|
+
"--raqm-invalid-ring",
|
|
60
|
+
"--raqm-focus-ring-color",
|
|
61
|
+
"--raqm-outline-border",
|
|
62
|
+
"--raqm-outline-hover",
|
|
63
|
+
"--raqm-tooltip-kbd-bg",
|
|
64
|
+
"--raqm-theme-light-weight",
|
|
65
|
+
"--raqm-ghost-hover-alpha",
|
|
66
|
+
"--raqm-destructive-bg-alpha",
|
|
67
|
+
"--raqm-destructive-hover-alpha",
|
|
68
|
+
"--raqm-destructive-focus-alpha",
|
|
69
|
+
"--raqm-avatar-blend",
|
|
70
|
+
"--raqm-control-bg-alpha",
|
|
71
|
+
"--raqm-control-hover-alpha",
|
|
72
|
+
"--raqm-field-checked-border-alpha",
|
|
73
|
+
"--raqm-field-checked-bg-alpha",
|
|
74
|
+
"--raqm-switch-unchecked-alpha",
|
|
75
|
+
"--raqm-check-mark",
|
|
76
|
+
"--raqm-mixed-mark",
|
|
77
|
+
"--raqm-native-select-chevron",
|
|
78
|
+
"--raqm-sidebar",
|
|
79
|
+
"--raqm-sidebar-foreground",
|
|
80
|
+
"--raqm-sidebar-primary",
|
|
81
|
+
"--raqm-sidebar-primary-foreground",
|
|
82
|
+
"--raqm-sidebar-accent",
|
|
83
|
+
"--raqm-sidebar-accent-foreground",
|
|
84
|
+
"--raqm-sidebar-border",
|
|
85
|
+
"--raqm-sidebar-ring"
|
|
86
|
+
];
|
|
87
|
+
function bridgeOverlayTheme(origin, pane) {
|
|
88
|
+
const view = origin.ownerDocument?.defaultView;
|
|
89
|
+
if (!view || pane.ownerDocument !== origin.ownerDocument || !view.getComputedStyle) return () => {};
|
|
90
|
+
const properties = [...themeTokens, "color-scheme"];
|
|
91
|
+
const previous = properties.map((name) => ({
|
|
92
|
+
name,
|
|
93
|
+
value: pane.style.getPropertyValue(name),
|
|
94
|
+
priority: pane.style.getPropertyPriority(name)
|
|
95
|
+
}));
|
|
96
|
+
const previousTheme = pane.getAttribute("data-raqm-theme");
|
|
97
|
+
let disposed = false;
|
|
98
|
+
const refresh = () => {
|
|
99
|
+
if (disposed) return;
|
|
100
|
+
const computed = view.getComputedStyle(origin);
|
|
101
|
+
for (const name of properties) {
|
|
102
|
+
const value = computed.getPropertyValue(name).trim();
|
|
103
|
+
if (value) {
|
|
104
|
+
if (pane.style.getPropertyValue(name) !== value || pane.style.getPropertyPriority(name)) pane.style.setProperty(name, value);
|
|
105
|
+
} else if (pane.style.getPropertyValue(name)) pane.style.removeProperty(name);
|
|
106
|
+
}
|
|
107
|
+
const theme = origin.closest("[data-raqm-theme=\"light\"], [data-raqm-theme=\"dark\"]")?.getAttribute("data-raqm-theme");
|
|
108
|
+
if (theme) {
|
|
109
|
+
if (pane.getAttribute("data-raqm-theme") !== theme) pane.setAttribute("data-raqm-theme", theme);
|
|
110
|
+
} else if (pane.hasAttribute("data-raqm-theme")) pane.removeAttribute("data-raqm-theme");
|
|
111
|
+
};
|
|
112
|
+
refresh();
|
|
113
|
+
const observer = typeof view.MutationObserver === "function" ? new view.MutationObserver(refresh) : null;
|
|
114
|
+
for (let ancestor = origin; ancestor; ancestor = ancestor.parentElement) observer?.observe(ancestor, {
|
|
115
|
+
attributes: true,
|
|
116
|
+
attributeFilter: [
|
|
117
|
+
"class",
|
|
118
|
+
"style",
|
|
119
|
+
"data-raqm-theme"
|
|
120
|
+
]
|
|
121
|
+
});
|
|
122
|
+
view.addEventListener("resize", refresh);
|
|
123
|
+
const media = typeof view.matchMedia === "function" ? ["(prefers-color-scheme: dark)", "(prefers-reduced-motion: reduce)"].map((query) => view.matchMedia(query)) : [];
|
|
124
|
+
for (const query of media) query.addEventListener?.("change", refresh);
|
|
125
|
+
return () => {
|
|
126
|
+
if (disposed) return;
|
|
127
|
+
disposed = true;
|
|
128
|
+
observer?.disconnect();
|
|
129
|
+
view.removeEventListener("resize", refresh);
|
|
130
|
+
for (const query of media) query.removeEventListener?.("change", refresh);
|
|
131
|
+
for (const { name, value, priority } of previous) if (value) pane.style.setProperty(name, value, priority);
|
|
132
|
+
else pane.style.removeProperty(name);
|
|
133
|
+
if (previousTheme === null) pane.removeAttribute("data-raqm-theme");
|
|
134
|
+
else pane.setAttribute("data-raqm-theme", previousTheme);
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
const ownershipKey = Symbol.for("raqm.ui.overlay-ownership");
|
|
138
|
+
function registerOverlayOwnership(origin, ref, includeBackdrop = false) {
|
|
139
|
+
const document = origin.ownerDocument;
|
|
140
|
+
let panes = document[ownershipKey];
|
|
141
|
+
if (!panes) {
|
|
142
|
+
panes = /* @__PURE__ */ new Map();
|
|
143
|
+
document[ownershipKey] = panes;
|
|
144
|
+
}
|
|
145
|
+
const pane = ref.overlayElement;
|
|
146
|
+
panes.get(pane)?.release();
|
|
147
|
+
const releaseTheme = bridgeOverlayTheme(origin, pane);
|
|
148
|
+
let released = false;
|
|
149
|
+
let subscription;
|
|
150
|
+
const ownership = {
|
|
151
|
+
origin,
|
|
152
|
+
ref,
|
|
153
|
+
includeBackdrop,
|
|
154
|
+
release: () => release()
|
|
155
|
+
};
|
|
156
|
+
const release = () => {
|
|
157
|
+
if (released) return;
|
|
158
|
+
released = true;
|
|
159
|
+
if (panes?.get(pane) === ownership) panes.delete(pane);
|
|
160
|
+
subscription?.unsubscribe();
|
|
161
|
+
releaseTheme();
|
|
162
|
+
};
|
|
163
|
+
panes.set(pane, ownership);
|
|
164
|
+
subscription = ref.detachments().subscribe(release);
|
|
165
|
+
return release;
|
|
166
|
+
}
|
|
167
|
+
function containsOwnedOverlay(root, target) {
|
|
168
|
+
if (!target || target.ownerDocument !== root.ownerDocument) return false;
|
|
169
|
+
const panes = root.ownerDocument[ownershipKey];
|
|
170
|
+
const visited = /* @__PURE__ */ new Set();
|
|
171
|
+
const contains = (container) => {
|
|
172
|
+
if (container.contains(target)) return true;
|
|
173
|
+
if (visited.has(container)) return false;
|
|
174
|
+
visited.add(container);
|
|
175
|
+
for (const [pane, { origin, ref, includeBackdrop }] of panes ?? []) if (origin.isConnected && container.contains(origin)) {
|
|
176
|
+
if (includeBackdrop && ref.backdropElement?.contains(target)) return true;
|
|
177
|
+
if (contains(pane)) return true;
|
|
178
|
+
}
|
|
179
|
+
return false;
|
|
180
|
+
};
|
|
181
|
+
return contains(root);
|
|
182
|
+
}
|
|
183
|
+
export { containsOwnedOverlay, registerOverlayOwnership };
|
|
184
|
+
|
|
185
|
+
//# sourceMappingURL=raqm-ui-overlay-internal.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raqm-ui-overlay-internal.mjs","names":[],"sources":["../../../projects/ui/internal/overlay-theme.ts","../../../projects/ui/internal/overlay-ownership.ts"],"sourcesContent":["// Only stylesheet theme tokens belong here; pane-specific geometry variables\r\n// must remain under the overlay owner's control. Keep in sync with _tokens.scss.\r\nconst themeTokens = [\r\n '--raqm-spacing',\r\n '--raqm-radius',\r\n '--raqm-radius-sm',\r\n '--raqm-radius-md',\r\n '--raqm-radius-lg',\r\n '--raqm-radius-xl',\r\n '--raqm-radius-2xl',\r\n '--raqm-font-size-xs',\r\n '--raqm-font-size-sm',\r\n '--raqm-font-size-base',\r\n '--raqm-font-size-lg',\r\n '--raqm-line-height-none',\r\n '--raqm-line-height-tight',\r\n '--raqm-line-height-snug',\r\n '--raqm-line-height-normal',\r\n '--raqm-line-height-relaxed',\r\n '--raqm-font-weight-normal',\r\n '--raqm-font-weight-medium',\r\n '--raqm-shadow-sm',\r\n '--raqm-shadow-md',\r\n '--raqm-shadow-lg',\r\n '--raqm-focus-ring-width',\r\n '--raqm-disabled-opacity',\r\n '--raqm-duration-fast',\r\n '--raqm-duration-base',\r\n '--raqm-duration-slow',\r\n '--raqm-duration-slower',\r\n '--raqm-ease-standard',\r\n '--raqm-ease-in-out',\r\n '--raqm-ease-out',\r\n '--raqm-ease-linear',\r\n '--raqm-ease-emphasized',\r\n '--raqm-background',\r\n '--raqm-foreground',\r\n '--raqm-card',\r\n '--raqm-card-foreground',\r\n '--raqm-popover',\r\n '--raqm-popover-foreground',\r\n '--raqm-primary',\r\n '--raqm-primary-foreground',\r\n '--raqm-secondary',\r\n '--raqm-secondary-foreground',\r\n '--raqm-muted',\r\n '--raqm-muted-foreground',\r\n '--raqm-accent',\r\n '--raqm-accent-foreground',\r\n '--raqm-destructive',\r\n '--raqm-destructive-foreground',\r\n '--raqm-border',\r\n '--raqm-input',\r\n '--raqm-ring',\r\n '--raqm-white',\r\n '--raqm-primary-hover',\r\n '--raqm-secondary-hover',\r\n '--raqm-control-bg',\r\n '--raqm-input-disabled-bg',\r\n '--raqm-invalid-border',\r\n '--raqm-invalid-ring',\r\n '--raqm-focus-ring-color',\r\n '--raqm-outline-border',\r\n '--raqm-outline-hover',\r\n '--raqm-tooltip-kbd-bg',\r\n '--raqm-theme-light-weight',\r\n '--raqm-ghost-hover-alpha',\r\n '--raqm-destructive-bg-alpha',\r\n '--raqm-destructive-hover-alpha',\r\n '--raqm-destructive-focus-alpha',\r\n '--raqm-avatar-blend',\r\n '--raqm-control-bg-alpha',\r\n '--raqm-control-hover-alpha',\r\n '--raqm-field-checked-border-alpha',\r\n '--raqm-field-checked-bg-alpha',\r\n '--raqm-switch-unchecked-alpha',\r\n '--raqm-check-mark',\r\n '--raqm-mixed-mark',\r\n '--raqm-native-select-chevron',\r\n '--raqm-sidebar',\r\n '--raqm-sidebar-foreground',\r\n '--raqm-sidebar-primary',\r\n '--raqm-sidebar-primary-foreground',\r\n '--raqm-sidebar-accent',\r\n '--raqm-sidebar-accent-foreground',\r\n '--raqm-sidebar-border',\r\n '--raqm-sidebar-ring',\r\n] as const;\r\n\r\n/** @internal Mirror an origin's theme onto one attached pane until disposed. */\r\nexport function bridgeOverlayTheme(origin: HTMLElement, pane: HTMLElement): () => void {\r\n const view = origin.ownerDocument?.defaultView;\r\n if (!view || pane.ownerDocument !== origin.ownerDocument || !view.getComputedStyle)\r\n return () => {};\r\n\r\n const properties = [...themeTokens, 'color-scheme'];\r\n const previous = properties.map((name) => ({\r\n name,\r\n value: pane.style.getPropertyValue(name),\r\n priority: pane.style.getPropertyPriority(name),\r\n }));\r\n const previousTheme = pane.getAttribute('data-raqm-theme');\r\n let disposed = false;\r\n\r\n const refresh = () => {\r\n if (disposed) return;\r\n const computed = view.getComputedStyle(origin);\r\n for (const name of properties) {\r\n const value = computed.getPropertyValue(name).trim();\r\n if (value) {\r\n if (pane.style.getPropertyValue(name) !== value || pane.style.getPropertyPriority(name)) {\r\n pane.style.setProperty(name, value);\r\n }\r\n } else if (pane.style.getPropertyValue(name)) {\r\n pane.style.removeProperty(name);\r\n }\r\n }\r\n const theme = origin\r\n .closest('[data-raqm-theme=\"light\"], [data-raqm-theme=\"dark\"]')\r\n ?.getAttribute('data-raqm-theme');\r\n if (theme) {\r\n if (pane.getAttribute('data-raqm-theme') !== theme)\r\n pane.setAttribute('data-raqm-theme', theme);\r\n } else if (pane.hasAttribute('data-raqm-theme')) {\r\n pane.removeAttribute('data-raqm-theme');\r\n }\r\n };\r\n\r\n refresh();\r\n const observer =\r\n typeof view.MutationObserver === 'function' ? new view.MutationObserver(refresh) : null;\r\n for (let ancestor: Element | null = origin; ancestor; ancestor = ancestor.parentElement) {\r\n observer?.observe(ancestor, {\r\n attributes: true,\r\n attributeFilter: ['class', 'style', 'data-raqm-theme'],\r\n });\r\n }\r\n view.addEventListener('resize', refresh);\r\n const media =\r\n typeof view.matchMedia === 'function'\r\n ? ['(prefers-color-scheme: dark)', '(prefers-reduced-motion: reduce)'].map((query) =>\r\n view.matchMedia(query),\r\n )\r\n : [];\r\n for (const query of media) query.addEventListener?.('change', refresh);\r\n\r\n return () => {\r\n if (disposed) return;\r\n disposed = true;\r\n observer?.disconnect();\r\n view.removeEventListener('resize', refresh);\r\n for (const query of media) query.removeEventListener?.('change', refresh);\r\n for (const { name, value, priority } of previous) {\r\n if (value) pane.style.setProperty(name, value, priority);\r\n else pane.style.removeProperty(name);\r\n }\r\n if (previousTheme === null) pane.removeAttribute('data-raqm-theme');\r\n else pane.setAttribute('data-raqm-theme', previousTheme);\r\n };\r\n}\r\n","import type { OverlayRef } from '@angular/cdk/overlay';\r\nimport { bridgeOverlayTheme } from './overlay-theme';\r\n\r\n// Relationships are scoped to the origin's document, not to the global overlay\r\n// container: unrelated overlays must remain outside the owning disclosure.\r\n// Secondary entry points are independently bundled, so use a shared symbol on\r\n// each document rather than a module-local map duplicated in each bundle.\r\nconst ownershipKey = Symbol.for('raqm.ui.overlay-ownership');\r\ntype Ownership = {\r\n origin: HTMLElement;\r\n ref: OverlayRef;\r\n includeBackdrop: boolean;\r\n release: () => void;\r\n};\r\ntype OwnershipDocument = Document & { [ownershipKey]?: Map<HTMLElement, Ownership> };\r\n\r\n/** @internal Register an attached pane until its overlay detaches. */\r\nexport function registerOverlayOwnership(\r\n origin: HTMLElement,\r\n ref: OverlayRef,\r\n includeBackdrop = false,\r\n): () => void {\r\n const document = origin.ownerDocument as OwnershipDocument;\r\n let panes = document[ownershipKey];\r\n if (!panes) {\r\n panes = new Map();\r\n document[ownershipKey] = panes;\r\n }\r\n const pane = ref.overlayElement;\r\n panes.get(pane)?.release();\r\n const releaseTheme = bridgeOverlayTheme(origin, pane);\r\n let released = false;\r\n let subscription: { unsubscribe(): void } | undefined;\r\n const ownership: Ownership = { origin, ref, includeBackdrop, release: () => release() };\r\n const release = () => {\r\n if (released) return;\r\n released = true;\r\n if (panes?.get(pane) === ownership) panes.delete(pane);\r\n subscription?.unsubscribe();\r\n releaseTheme();\r\n };\r\n panes.set(pane, ownership);\r\n subscription = ref.detachments().subscribe(release);\r\n return release;\r\n}\r\n\r\n/** @internal Includes transitively owned panes whose origins remain connected. */\r\nexport function containsOwnedOverlay(root: HTMLElement, target: Node | null): boolean {\r\n if (!target || target.ownerDocument !== root.ownerDocument) return false;\r\n const panes = (root.ownerDocument as OwnershipDocument)[ownershipKey];\r\n const visited = new Set<HTMLElement>();\r\n const contains = (container: HTMLElement): boolean => {\r\n if (container.contains(target)) return true;\r\n if (visited.has(container)) return false;\r\n visited.add(container);\r\n for (const [pane, { origin, ref, includeBackdrop }] of panes ?? []) {\r\n if (origin.isConnected && container.contains(origin)) {\r\n if (includeBackdrop && ref.backdropElement?.contains(target)) return true;\r\n if (contains(pane)) return true;\r\n }\r\n }\r\n return false;\r\n };\r\n return contains(root);\r\n}\r\n"],"mappings":"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"}
|