ng-primitives 0.124.0 → 0.125.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/date-time-date-fns/README.md +3 -0
  2. package/fesm2022/ng-primitives-avatar.mjs +4 -2
  3. package/fesm2022/ng-primitives-avatar.mjs.map +1 -1
  4. package/fesm2022/ng-primitives-checkbox.mjs +4 -2
  5. package/fesm2022/ng-primitives-checkbox.mjs.map +1 -1
  6. package/fesm2022/ng-primitives-date-picker.mjs +42 -44
  7. package/fesm2022/ng-primitives-date-picker.mjs.map +1 -1
  8. package/fesm2022/ng-primitives-date-time-date-fns.mjs +95 -0
  9. package/fesm2022/ng-primitives-date-time-date-fns.mjs.map +1 -0
  10. package/fesm2022/ng-primitives-date-time-luxon.mjs +21 -3
  11. package/fesm2022/ng-primitives-date-time-luxon.mjs.map +1 -1
  12. package/fesm2022/ng-primitives-date-time.mjs +18 -3
  13. package/fesm2022/ng-primitives-date-time.mjs.map +1 -1
  14. package/fesm2022/ng-primitives-dialog.mjs +11 -4
  15. package/fesm2022/ng-primitives-dialog.mjs.map +1 -1
  16. package/fesm2022/ng-primitives-form-field.mjs +3 -0
  17. package/fesm2022/ng-primitives-form-field.mjs.map +1 -1
  18. package/fesm2022/ng-primitives-input-otp.mjs +15 -7
  19. package/fesm2022/ng-primitives-input-otp.mjs.map +1 -1
  20. package/fesm2022/ng-primitives-listbox.mjs +5 -4
  21. package/fesm2022/ng-primitives-listbox.mjs.map +1 -1
  22. package/fesm2022/ng-primitives-menu.mjs +8 -0
  23. package/fesm2022/ng-primitives-menu.mjs.map +1 -1
  24. package/fesm2022/ng-primitives-meter.mjs +20 -5
  25. package/fesm2022/ng-primitives-meter.mjs.map +1 -1
  26. package/fesm2022/ng-primitives-number-field.mjs +10 -0
  27. package/fesm2022/ng-primitives-number-field.mjs.map +1 -1
  28. package/fesm2022/ng-primitives-pagination.mjs +16 -6
  29. package/fesm2022/ng-primitives-pagination.mjs.map +1 -1
  30. package/fesm2022/ng-primitives-popover.mjs +4 -0
  31. package/fesm2022/ng-primitives-popover.mjs.map +1 -1
  32. package/fesm2022/ng-primitives-progress.mjs +36 -11
  33. package/fesm2022/ng-primitives-progress.mjs.map +1 -1
  34. package/fesm2022/ng-primitives-roving-focus.mjs +13 -2
  35. package/fesm2022/ng-primitives-roving-focus.mjs.map +1 -1
  36. package/fesm2022/ng-primitives-search.mjs +2 -1
  37. package/fesm2022/ng-primitives-search.mjs.map +1 -1
  38. package/fesm2022/ng-primitives-slider.mjs +38 -18
  39. package/fesm2022/ng-primitives-slider.mjs.map +1 -1
  40. package/fesm2022/ng-primitives-switch.mjs +18 -8
  41. package/fesm2022/ng-primitives-switch.mjs.map +1 -1
  42. package/fesm2022/ng-primitives-tabs.mjs +22 -6
  43. package/fesm2022/ng-primitives-tabs.mjs.map +1 -1
  44. package/fesm2022/ng-primitives-textarea.mjs +10 -8
  45. package/fesm2022/ng-primitives-textarea.mjs.map +1 -1
  46. package/fesm2022/ng-primitives-toast.mjs +3 -0
  47. package/fesm2022/ng-primitives-toast.mjs.map +1 -1
  48. package/fesm2022/ng-primitives-toggle-group.mjs +31 -8
  49. package/fesm2022/ng-primitives-toggle-group.mjs.map +1 -1
  50. package/package.json +8 -1
  51. package/schematics/ng-generate/templates/checkbox/checkbox.__fileSuffix@dasherize__.ts.template +2 -1
  52. package/schematics/ng-generate/templates/combobox/combobox.__fileSuffix@dasherize__.ts.template +3 -2
  53. package/schematics/ng-generate/templates/date-picker/date-picker.__fileSuffix@dasherize__.ts.template +2 -1
  54. package/schematics/ng-generate/templates/listbox/listbox.__fileSuffix@dasherize__.ts.template +9 -4
  55. package/schematics/ng-generate/templates/pagination/pagination.__fileSuffix@dasherize__.ts.template +7 -1
  56. package/schematics/ng-generate/templates/range-slider/range-slider.__fileSuffix@dasherize__.ts.template +4 -3
  57. package/schematics/ng-generate/templates/slider/slider.__fileSuffix@dasherize__.ts.template +2 -1
  58. package/schematics/ng-generate/templates/switch/switch.__fileSuffix@dasherize__.ts.template +2 -1
  59. package/types/ng-primitives-checkbox.d.ts +5 -1
  60. package/types/ng-primitives-date-picker.d.ts +7 -9
  61. package/types/ng-primitives-date-time-date-fns.d.ts +30 -0
  62. package/types/ng-primitives-date-time.d.ts +15 -3
  63. package/types/ng-primitives-dialog.d.ts +4 -0
  64. package/types/ng-primitives-input-otp.d.ts +5 -5
  65. package/types/ng-primitives-meter.d.ts +9 -2
  66. package/types/ng-primitives-pagination.d.ts +34 -8
  67. package/types/ng-primitives-progress.d.ts +4 -2
  68. package/types/ng-primitives-roving-focus.d.ts +7 -0
  69. package/types/ng-primitives-slider.d.ts +5 -4
  70. package/types/ng-primitives-switch.d.ts +14 -4
  71. package/types/ng-primitives-tabs.d.ts +6 -1
  72. package/types/ng-primitives-toggle-group.d.ts +51 -37
@@ -1 +1 @@
1
- {"version":3,"file":"ng-primitives-menu.mjs","sources":["../../../../packages/ng-primitives/menu/src/config/menu-config.ts","../../../../packages/ng-primitives/menu/src/menu-trigger/menu-trigger-state.ts","../../../../packages/ng-primitives/menu/src/menu/menu-state.ts","../../../../packages/ng-primitives/menu/src/submenu-trigger/submenu-trigger-state.ts","../../../../packages/ng-primitives/menu/src/submenu-trigger/submenu-trigger.ts","../../../../packages/ng-primitives/menu/src/menu-item/menu-item-state.ts","../../../../packages/ng-primitives/menu/src/menu-item/menu-item.ts","../../../../packages/ng-primitives/menu/src/menu-item-checkbox/menu-item-checkbox-state.ts","../../../../packages/ng-primitives/menu/src/menu-item-checkbox/menu-item-checkbox.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio-group/menu-item-radio-group-state.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio/menu-item-radio-state.ts","../../../../packages/ng-primitives/menu/src/menu-item-indicator/menu-item-indicator.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio-group/menu-item-radio-group.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio/menu-item-radio.ts","../../../../packages/ng-primitives/menu/src/menu-trigger/menu-trigger.ts","../../../../packages/ng-primitives/menu/src/menu/menu.ts","../../../../packages/ng-primitives/menu/src/ng-primitives-menu.ts"],"sourcesContent":["import { InjectionToken, Provider, inject } from '@angular/core';\nimport { NgpFlip, NgpOffset, NgpShift } from 'ng-primitives/portal';\nimport type { NgpMenuPlacement } from '../menu-trigger/menu-trigger';\n\nexport type NgpMenuTriggerType = 'click' | 'hover' | 'focus' | 'enter' | 'arrowkey';\n\nexport interface NgpMenuConfig {\n /**\n * Define the offset of the menu relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 4\n */\n offset: NgpOffset;\n\n /**\n * Define the placement of the menu relative to the trigger.\n * @default 'bottom-start'\n */\n placement: NgpMenuPlacement;\n\n /**\n * Define whether the menu should flip when there is not enough space for the menu.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n flip: NgpFlip;\n\n /**\n * Define the container element or selector in to which the menu should be attached.\n * @default 'body'\n */\n container: HTMLElement | string | null;\n\n /**\n * Defines how the menu behaves when the window is scrolled.\n * @default scroll\n */\n scrollBehavior: 'reposition' | 'block' | 'close';\n\n /**\n * Configure shift behavior to keep the menu in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n shift: NgpShift;\n\n /**\n * Whether focus should wrap around when reaching the end of the menu.\n * @default true\n */\n wrap: boolean;\n\n /**\n * Cooldown duration in milliseconds.\n * When moving from one menu to another within this duration,\n * the showDelay is skipped for the new menu.\n * @default 0\n */\n cooldown: number;\n\n /**\n * Define which trigger types are enabled for the menu.\n * @default ['click']\n */\n triggers: NgpMenuTriggerType[];\n\n /**\n * Define the delay before the menu is displayed (hover/focus triggers).\n * @default 0\n */\n showDelay: number;\n\n /**\n * Define the delay before the menu is hidden (hover/focus triggers).\n * @default 0\n */\n hideDelay: number;\n}\n\nexport const defaultMenuConfig: NgpMenuConfig = {\n offset: 4,\n placement: 'bottom-start',\n flip: true,\n container: 'body',\n scrollBehavior: 'block',\n shift: undefined,\n wrap: true,\n cooldown: 0,\n triggers: ['click'],\n showDelay: 0,\n hideDelay: 0,\n};\n\nexport const NgpMenuConfigToken = new InjectionToken<NgpMenuConfig>('NgpMenuConfigToken');\n\n/**\n * Provide the default Menu configuration\n * @param config The Menu configuration\n * @returns The provider\n */\nexport function provideMenuConfig(config: Partial<NgpMenuConfig>): Provider[] {\n return [\n {\n provide: NgpMenuConfigToken,\n useValue: { ...defaultMenuConfig, ...config },\n },\n ];\n}\n\n/**\n * Inject the Menu configuration\n * @returns The global Menu configuration\n */\nexport function injectMenuConfig(): NgpMenuConfig {\n return inject(NgpMenuConfigToken, { optional: true }) ?? defaultMenuConfig;\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport {\n computed,\n effect,\n inject,\n Injector,\n signal,\n Signal,\n ViewContainerRef,\n WritableSignal,\n} from '@angular/core';\nimport { createHoverBridge, injectElementRef } from 'ng-primitives/internal';\nimport {\n createOverlay,\n NgpFlip,\n NgpOffset,\n NgpOverlay,\n NgpOverlayConfig,\n NgpOverlayContent,\n NgpShift,\n} from 'ng-primitives/portal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n deprecatedSetter,\n listener,\n StateInjectionOptions,\n} from 'ng-primitives/state';\nimport { injectDisposables } from 'ng-primitives/utils';\nimport { NgpMenuTriggerType } from '../config/menu-config';\nimport { NgpMenuPlacement } from './menu-trigger';\n\nexport interface NgpMenuTriggerState<T = unknown> {\n /**\n * The menu template or component.\n */\n readonly menu: WritableSignal<NgpOverlayContent<any> | undefined>;\n /**\n * The computed placement of the menu.\n */\n readonly placement: WritableSignal<NgpMenuPlacement>;\n /**\n * Whether the menu is open.\n */\n readonly open: Signal<boolean>;\n /**\n * The offset of the menu.\n */\n readonly offset: WritableSignal<NgpOffset>;\n\n /**\n * The disabled state of the trigger.\n */\n readonly disabled: WritableSignal<boolean>;\n\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip: WritableSignal<NgpFlip>;\n\n /**\n * The container in which the menu should be attached.\n * @default document.body\n */\n readonly container: WritableSignal<HTMLElement | string | null>;\n\n /**\n * The context provided to the menu.\n */\n readonly context: WritableSignal<T>;\n\n /**\n * The focus origin that was used to open the menu.\n * @internal\n */\n readonly openOrigin: Signal<FocusOrigin>;\n\n /**\n * Set whether the trigger is disabled.\n * @param isDisabled - Whether the trigger is disabled\n */\n setDisabled(isDisabled: boolean): void;\n\n /**\n * Set whether the menu should flip when there is not enough space.\n * @param shouldFlip - Whether the menu should flip\n */\n setFlip(shouldFlip: NgpFlip): void;\n\n /**\n * Set the placement of the menu.\n * @param placement - The new placement\n */\n setPlacement(placement: NgpMenuPlacement): void;\n\n /**\n * Set the offset of the menu.\n * @param offset - The new offset\n */\n setOffset(offset: NgpOffset): void;\n\n /**\n * Set the context provided to the menu.\n * @param context - The new context\n */\n setContext(context: T): void;\n\n /**\n * Set the container in which the menu should be attached. Takes effect the\n * next time the menu is opened; it does not move a menu that is already open.\n * @param container - The new container\n */\n setContainer(container: HTMLElement | string | null): void;\n\n /**\n * Show the menu.\n * @param origin - The focus origin\n */\n show(origin?: FocusOrigin): void;\n /**\n * Hide the menu.\n * @param origin - The focus origin\n * @internal\n */\n hide(origin?: FocusOrigin): void;\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void;\n\n /**\n * Set the menu content.\n * @param menu - The new menu\n */\n setMenu(menu: NgpOverlayContent<any>): void;\n\n /**\n * Set whether the pointer is over the menu content.\n * @param isOver - Whether the pointer is over the content\n * @internal\n */\n setPointerOverContent(isOver: boolean): void;\n}\n\nexport interface NgpMenuTriggerProps<T = unknown> {\n /**\n * Whether the trigger is disabled.\n */\n readonly disabled?: Signal<boolean>;\n /**\n * The menu template or component.\n */\n readonly menu?: Signal<NgpOverlayContent<T> | undefined>;\n /**\n * The placement of the menu.\n */\n readonly placement?: Signal<NgpMenuPlacement>;\n /**\n * The offset of the menu.\n */\n readonly offset?: Signal<NgpOffset>;\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip?: Signal<NgpFlip>;\n /**\n * The container in which the menu should be attached.\n */\n readonly container?: Signal<HTMLElement | string | null>;\n\n /**\n * Configure shift behavior to keep the menu in view.\n */\n readonly shift?: Signal<NgpShift>;\n\n /**\n * How the menu behaves when the window is scrolled.\n */\n readonly scrollBehavior?: Signal<'reposition' | 'block' | 'close'>;\n /**\n * Context to provide to the menu.\n */\n readonly context?: Signal<T>;\n /**\n * Cooldown duration in milliseconds.\n */\n readonly cooldown?: Signal<number>;\n\n /**\n * Which trigger types are enabled.\n */\n readonly triggers?: Signal<NgpMenuTriggerType[]>;\n\n /**\n * The delay before showing the menu.\n */\n readonly showDelay?: Signal<number>;\n\n /**\n * The delay before hiding the menu.\n */\n readonly hideDelay?: Signal<number>;\n}\n\nexport const [\n NgpMenuTriggerStateToken,\n ngpMenuTrigger,\n _injectMenuTriggerState,\n provideMenuTriggerState,\n] = createPrimitive(\n 'NgpMenuTrigger',\n <T>({\n disabled: _disabled = signal(false),\n menu: _menu = signal<NgpOverlayContent<T> | undefined>(undefined),\n placement: _placement = signal('bottom-start' as NgpMenuPlacement),\n offset: _offset = signal(4),\n flip: _flip = signal(true),\n shift: _shift = signal(undefined),\n context: _context = signal<T>(undefined as T),\n container: _container,\n scrollBehavior,\n cooldown,\n triggers = signal(['click'] as NgpMenuTriggerType[]),\n showDelay = signal(0),\n hideDelay = signal(0),\n }: NgpMenuTriggerProps<T>) => {\n const element = injectElementRef();\n const injector = inject(Injector);\n const viewContainerRef = inject(ViewContainerRef);\n const directionality = inject(Directionality);\n const disposables = injectDisposables();\n\n // Controlled properties\n const menu = controlled(_menu);\n const disabled = controlled(_disabled);\n const placement = controlled(_placement);\n const flip = controlled(_flip);\n const shift = controlled(_shift);\n const offset = controlled(_offset);\n const context = controlled(_context);\n const container = controlled(_container, 'body');\n\n // Internal state\n const overlay = signal<NgpOverlay<T> | null>(null);\n const open = computed(() => overlay()?.isOpen() ?? false);\n const openOrigin = signal<FocusOrigin>('program');\n const closeOrigin = signal<FocusOrigin>('program');\n\n // Track whether pointer is over trigger or content (for hover triggers)\n const pointerOverTrigger = signal(false);\n const pointerOverContent = signal(false);\n const isPointerOverMenuArea = computed(() => pointerOverTrigger() || pointerOverContent());\n\n // Safe-polygon hover intent: while the pointer travels inside a corridor from\n // the trigger exit point toward the open menu, the menu stays open. Reversing\n // away closes it (requireForwardMovement).\n const hoverBridge = createHoverBridge({\n isPointerInAnchor: isPointerOverMenuArea,\n close: () => hide(),\n requireForwardMovement: true,\n });\n\n // Reset pointer tracking when menu closes\n effect(() => {\n const isOpen = open();\n\n // When menu closes, reset pointer tracking state and tear down any\n // in-progress hover bridge (and its global listener).\n if (!isOpen) {\n hoverBridge.clear();\n pointerOverTrigger.set(false);\n pointerOverContent.set(false);\n }\n });\n\n // Computed signal to determine if focus should be restored\n // Only restore if opened via keyboard OR closed via keyboard\n const shouldRestoreFocus = computed(\n () => openOrigin() === 'keyboard' || closeOrigin() === 'keyboard',\n );\n\n // Host bindings\n attrBinding(element, 'aria-haspopup', 'true');\n attrBinding(element, 'aria-expanded', open);\n dataBinding(element, 'data-open', open);\n dataBinding(element, 'data-placement', placement);\n\n // Event listeners - conditionally add based on enabled triggers\n listener(element, 'click', onClick);\n listener(element, 'pointerenter', onPointerEnter);\n listener(element, 'pointerleave', onPointerLeave);\n listener(element, 'focus', onFocus);\n listener(element, 'blur', onBlur);\n listener(element, 'keydown', onKeydown);\n\n // Methods\n function onClick(event: MouseEvent): void {\n if (disabled?.() || !triggers().includes('click')) {\n return;\n }\n toggle(event);\n }\n\n function onPointerEnter(event: PointerEvent): void {\n if (disabled?.() || !triggers().includes('hover')) {\n return;\n }\n\n // Don't trigger on touch events\n if (event.pointerType === 'touch') {\n return;\n }\n\n pointerOverTrigger.set(true);\n\n // If already open, cancel any pending hide - the pointer is back on the\n // trigger, so any in-progress hover bridge is no longer needed.\n if (open()) {\n hoverBridge.clear();\n overlay()?.cancelPendingClose();\n return;\n }\n\n show('mouse');\n }\n\n function onPointerLeave(event: PointerEvent): void {\n if (disabled?.() || !triggers().includes('hover')) {\n return;\n }\n\n // Don't trigger on touch events\n if (event.pointerType === 'touch') {\n return;\n }\n\n pointerOverTrigger.set(false);\n\n const currentOverlay = overlay();\n\n // If the overlay hasn't been created, there's nothing to cancel\n if (!currentOverlay) {\n return;\n }\n\n // Build a safe-polygon corridor from the pointer exit point toward the\n // open menu. While the pointer stays inside it the menu stays open, so\n // diagonal travel across the offset gap doesn't collapse the menu.\n const menuElement = open() ? currentOverlay.getElements()[0] : undefined;\n const started =\n !!menuElement &&\n hoverBridge.track({\n triggerRect: element.nativeElement.getBoundingClientRect(),\n targetRect: menuElement.getBoundingClientRect(),\n exitPoint: { x: event.clientX, y: event.clientY },\n });\n\n if (started) {\n currentOverlay.cancelPendingClose();\n return;\n }\n\n // Fall back to a small grace period when we can't build the corridor.\n disposables.setTimeout(() => {\n if (!isPointerOverMenuArea()) {\n hide();\n }\n }, 50);\n }\n\n function onFocus(): void {\n if (disabled?.() || !triggers().includes('focus')) {\n return;\n }\n\n // If already open, do nothing\n if (open()) {\n return;\n }\n\n show('keyboard');\n }\n\n function onBlur(event: FocusEvent): void {\n if (disabled?.() || !triggers().includes('focus')) {\n return;\n }\n\n // If the overlay hasn't been created, there's nothing to cancel\n if (!overlay()) {\n return;\n }\n\n // Check if focus is moving to an element inside the menu\n const relatedTarget = event.relatedTarget as HTMLElement | null;\n if (relatedTarget) {\n const menuElements = overlay()?.getElements() ?? [];\n const isFocusInMenu = menuElements.some(el => el.contains(relatedTarget));\n if (isFocusInMenu) {\n return;\n }\n }\n\n hide();\n }\n\n function onKeydown(event: KeyboardEvent): void {\n if (disabled?.()) {\n return;\n }\n\n const enabledTriggers = triggers();\n\n // Handle Enter key - toggle behavior\n if (event.key === 'Enter' && enabledTriggers.includes('enter')) {\n event.preventDefault();\n const origin: FocusOrigin = 'keyboard';\n if (open()) {\n hide(origin);\n } else {\n show(origin);\n }\n return;\n }\n\n // Handle arrow keys - placement-aware\n if (!enabledTriggers.includes('arrowkey')) {\n return;\n }\n\n const isArrowKey =\n event.key === 'ArrowUp' ||\n event.key === 'ArrowDown' ||\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight';\n\n if (!isArrowKey) {\n return;\n }\n\n // Get RTL direction\n const isRtl = directionality.value === 'rtl';\n\n // Check if arrow direction matches placement\n const currentPlacement = placement();\n let shouldOpen = false;\n\n if (currentPlacement.startsWith('bottom') && event.key === 'ArrowDown') {\n shouldOpen = true;\n } else if (currentPlacement.startsWith('top') && event.key === 'ArrowUp') {\n shouldOpen = true;\n } else if (currentPlacement.startsWith('right')) {\n const isRightArrow = event.key === 'ArrowRight';\n const isLeftArrow = event.key === 'ArrowLeft';\n shouldOpen = (isRightArrow && !isRtl) || (isLeftArrow && isRtl);\n } else if (currentPlacement.startsWith('left')) {\n const isRightArrow = event.key === 'ArrowRight';\n const isLeftArrow = event.key === 'ArrowLeft';\n shouldOpen = (isLeftArrow && !isRtl) || (isRightArrow && isRtl);\n }\n\n if (shouldOpen && !open()) {\n event.preventDefault();\n show('keyboard');\n }\n }\n\n function toggle(event: MouseEvent): void {\n // determine the origin of the event, 0 is keyboard, 1 is mouse\n const origin: FocusOrigin = event.detail === 0 ? 'keyboard' : 'mouse';\n\n // if the menu is open then hide it\n if (open()) {\n hide(origin);\n } else {\n show(origin);\n }\n }\n\n function show(origin: FocusOrigin = 'program'): void {\n // Store the origin used to open the menu\n openOrigin.set(origin);\n\n // Create the overlay if it doesn't exist yet\n if (!overlay()) {\n createOverlayInstance();\n }\n\n // Show the overlay\n overlay()?.show();\n }\n\n function hide(origin: FocusOrigin = 'program'): void {\n const currentOverlay = overlay();\n if (!currentOverlay) {\n return;\n }\n\n // Hide the overlay (this will trigger onClose callback which updates closeOrigin)\n currentOverlay.hide({ origin });\n }\n\n function createOverlayInstance(): void {\n const menuContent = menu?.();\n\n if (!menuContent) {\n throw new Error('Menu must be either a TemplateRef or a ComponentType');\n }\n\n // Create config for the overlay\n const config: NgpOverlayConfig<T> = {\n content: menuContent,\n triggerElement: element.nativeElement,\n viewContainerRef,\n injector,\n context,\n container: container(),\n placement: placement,\n offset: offset(),\n flip: flip(),\n shift: shift(),\n closeOnOutsideClick: true,\n closeOnEscape: true,\n restoreFocus: shouldRestoreFocus,\n onClose: (origin: FocusOrigin) => closeOrigin.set(origin),\n scrollBehaviour: scrollBehavior?.() ?? 'block',\n overlayType: 'menu',\n cooldown: cooldown?.(),\n showDelay: showDelay(),\n hideDelay: hideDelay(),\n };\n\n overlay.set(createOverlay(config));\n }\n\n function setMenu(newMenu: NgpOverlayContent<T> | undefined): void {\n menu.set(newMenu);\n }\n\n function setDisabled(isDisabled: boolean): void {\n disabled.set(isDisabled);\n\n if (isDisabled && open()) {\n hide();\n }\n }\n\n function setFlip(shouldFlip: NgpFlip): void {\n flip.set(shouldFlip);\n }\n\n function setPlacement(newPlacement: NgpMenuPlacement): void {\n placement.set(newPlacement);\n }\n\n function setOffset(newOffset: NgpOffset): void {\n offset.set(newOffset);\n }\n\n function setContext(newContext: T): void {\n context.set(newContext);\n }\n\n function setContainer(newContainer: HTMLElement | string | null): void {\n container.set(newContainer);\n }\n\n /**\n * Called by menu content when pointer enters/leaves\n * @internal\n */\n function setPointerOverContent(isOver: boolean): void {\n pointerOverContent.set(isOver);\n\n if (isOver) {\n // The pointer reached the menu - the hover bridge has served its purpose.\n hoverBridge.clear();\n return;\n }\n\n if (open() && triggers().includes('hover')) {\n // Use a small delay to allow pointer to move back to trigger\n disposables.setTimeout(() => {\n // Only hide if pointer is not over trigger or content\n if (!isPointerOverMenuArea()) {\n hide();\n }\n }, 50);\n }\n }\n\n return {\n menu: deprecatedSetter(menu, 'setMenu'),\n placement: deprecatedSetter(placement, 'setPlacement'),\n offset: deprecatedSetter(offset, 'setOffset'),\n disabled: deprecatedSetter(disabled, 'setDisabled'),\n context: deprecatedSetter(context, 'setContext'),\n open,\n openOrigin,\n show,\n hide,\n toggle,\n setDisabled,\n setMenu,\n setFlip,\n setPlacement,\n setOffset,\n setContext,\n setContainer,\n setPointerOverContent,\n flip,\n container: deprecatedSetter(container, 'setContainer', setContainer),\n } satisfies NgpMenuTriggerState<T>;\n },\n);\n\nexport function injectMenuTriggerState<T>(\n options?: StateInjectionOptions,\n): Signal<NgpMenuTriggerState<T>> {\n return _injectMenuTriggerState(options) as Signal<NgpMenuTriggerState<T>>;\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { computed, inject } from '@angular/core';\nimport { ngpFocusTrap } from 'ng-primitives/focus-trap';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { injectOverlay } from 'ng-primitives/portal';\nimport { attrBinding, createPrimitive, listener, styleBinding } from 'ng-primitives/state';\nimport { Subject } from 'rxjs';\nimport { injectMenuTriggerState } from '../menu-trigger/menu-trigger-state';\n\nexport interface NgpMenuState {\n /**\n * Close the menu and any parent menus.\n * @param origin - The focus origin\n */\n closeAllMenus(origin: FocusOrigin): void;\n /**\n * Subject that emits when submenus should be closed.\n * @internal\n */\n readonly closeSubmenus: Subject<HTMLElement>;\n}\n\nexport interface NgpMenuProps {}\n\nexport const [NgpMenuStateToken, ngpMenu, injectMenuState, provideMenuState] = createPrimitive(\n 'NgpMenu',\n ({}: NgpMenuProps) => {\n const element = injectElementRef();\n const overlay = injectOverlay();\n const directionality = inject(Directionality, { optional: true });\n const menuTrigger = injectMenuTriggerState();\n const parentMenu = injectMenuState({ optional: true, skipSelf: true });\n\n // Always trap focus in menus per WAI-ARIA guidelines (Tab should not navigate within menus)\n // Pass the open origin so focus trap uses the correct origin for :focus-visible styling\n const openOrigin = computed(() => menuTrigger()?.openOrigin() ?? 'program');\n ngpFocusTrap({\n focusOrigin: openOrigin,\n });\n\n // Register this element as the overlay outlet so floating-ui positions it correctly,\n // even when this directive is on a nested child component rather than the portal root.\n overlay.registerOutletElement(element.nativeElement);\n\n // Host bindings\n attrBinding(element, 'role', 'menu');\n attrBinding(element, 'data-placement', overlay.finalPlacement);\n attrBinding(element, 'data-overlay', '');\n styleBinding(element, 'left.px', () => overlay.position().x ?? null);\n styleBinding(element, 'top.px', () => overlay.position().y ?? null);\n styleBinding(element, '--ngp-menu-trigger-width.px', overlay.triggerWidth);\n styleBinding(element, '--ngp-menu-transform-origin', overlay.transformOrigin);\n styleBinding(element, '--ngp-menu-available-width.px', overlay.availableWidth);\n styleBinding(element, '--ngp-menu-available-height.px', overlay.availableHeight);\n\n // Event listeners for pointer tracking and keyboard\n listener(element, 'pointerenter', onPointerEnter);\n listener(element, 'pointerleave', onPointerLeave);\n listener(element, 'keydown', onKeydown);\n\n // Subject to notify children to close submenus\n const closeSubmenus = new Subject<HTMLElement>();\n\n // Methods\n function onPointerEnter(): void {\n menuTrigger()?.setPointerOverContent(true);\n }\n\n function onPointerLeave(): void {\n menuTrigger()?.setPointerOverContent(false);\n }\n\n function onKeydown(event: KeyboardEvent): void {\n // Handle Escape key - close all menus and restore focus to root trigger\n // We handle this here instead of using overlay's closeOnEscape to ensure\n // proper focus restoration through the closeAllMenus chain\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n closeAllMenus('keyboard');\n return;\n }\n\n // Only handle arrow close keys for top-level menus (no parent submenu)\n // Submenus are handled by menu-item-state via NgpSubmenuTrigger\n if (parentMenu()) {\n return;\n }\n\n const placement = overlay.finalPlacement();\n if (!placement) {\n return;\n }\n\n const isRtl = (directionality?.value ?? 'ltr') === 'rtl';\n\n // Determine which arrow key should close based on placement\n // Note: Only Left/Right arrows close menus (for side-placed menus).\n // Up/Down arrows are reserved for roving focus navigation within the menu.\n let shouldClose = false;\n\n if (placement.startsWith('right')) {\n // Right-placed menu: Left Arrow closes (or Right Arrow in RTL)\n shouldClose = event.key === (isRtl ? 'ArrowRight' : 'ArrowLeft');\n } else if (placement.startsWith('left')) {\n // Left-placed menu: Right Arrow closes (or Left Arrow in RTL)\n shouldClose = event.key === (isRtl ? 'ArrowLeft' : 'ArrowRight');\n }\n\n if (shouldClose) {\n event.preventDefault();\n event.stopPropagation();\n menuTrigger()?.hide('keyboard');\n }\n }\n\n function closeAllMenus(origin: FocusOrigin): void {\n menuTrigger().hide(origin);\n parentMenu()?.closeAllMenus(origin);\n }\n\n return {\n closeAllMenus,\n closeSubmenus,\n } satisfies NgpMenuState;\n },\n);\n","import { FocusMonitor, FocusOrigin } from '@angular/cdk/a11y';\nimport {\n computed,\n effect,\n inject,\n Injector,\n signal,\n Signal,\n ViewContainerRef,\n WritableSignal,\n} from '@angular/core';\nimport { createHoverBridge, injectElementRef } from 'ng-primitives/internal';\nimport {\n createOverlay,\n NgpFlip,\n NgpOffset,\n NgpOverlay,\n NgpOverlayConfig,\n NgpOverlayContent,\n} from 'ng-primitives/portal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n deprecatedSetter,\n listener,\n} from 'ng-primitives/state';\nimport { injectDisposables, safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { NgpMenuPlacement } from '../menu-trigger/menu-trigger';\nimport { injectMenuState } from '../menu/menu-state';\n\nexport interface NgpSubmenuTriggerState {\n /**\n * The menu template or component.\n */\n readonly menu: WritableSignal<NgpOverlayContent<any> | undefined>;\n\n /**\n * The computed placement of the menu.\n */\n readonly placement: WritableSignal<NgpMenuPlacement>;\n\n /**\n * Whether the menu is open.\n */\n readonly open: Signal<boolean>;\n\n /**\n * The offset of the menu.\n */\n readonly offset: WritableSignal<NgpOffset>;\n\n /**\n * The disabled state of the trigger.\n */\n readonly disabled: WritableSignal<boolean>;\n\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip: WritableSignal<NgpFlip>;\n\n /**\n * The container in which the menu should be attached.\n * @default document.body\n */\n readonly container: WritableSignal<HTMLElement | string | null>;\n\n /**\n * The focus origin used to open the submenu.\n * Used by the submenu's focus trap for :focus-visible styling.\n * @internal\n */\n readonly openOrigin: Signal<FocusOrigin>;\n\n /**\n * Show the menu.\n * @param origin - The focus origin (keyboard, mouse, touch, or program)\n */\n show(origin?: FocusOrigin): void;\n\n /**\n * Hide the menu.\n * @param origin - The focus origin\n */\n hide(origin?: FocusOrigin): void;\n\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void;\n\n /**\n * Set whether the trigger is disabled.\n * @param isDisabled - Whether the trigger is disabled\n */\n setDisabled(isDisabled: boolean): void;\n\n /**\n * Set the menu template or component.\n * @param menu - The menu content\n */\n setMenu(menu: NgpOverlayContent<any> | undefined): void;\n\n /**\n * Set the placement of the menu.\n * @param placement - The menu placement\n */\n setPlacement(placement: NgpMenuPlacement): void;\n\n /**\n * Set the offset of the menu.\n * @param offset - The menu offset\n */\n setOffset(offset: NgpOffset): void;\n\n /**\n * Set whether the menu should flip when there is not enough space.\n * @param shouldFlip - Whether the menu should flip\n */\n setFlip(shouldFlip: NgpFlip): void;\n\n /**\n * Set the container in which the menu should be attached. Takes effect the\n * next time the menu is opened; it does not move a menu that is already open.\n * @param container - The new container\n */\n setContainer(container: HTMLElement | string | null): void;\n\n /**\n * Focus the trigger element.\n * @param origin - The focus origin\n */\n focus(origin: FocusOrigin): void;\n\n /**\n * Set whether the pointer is over the submenu content. Entering the submenu\n * tears down the hover bridge (the pointer arrived safely).\n * @param isOver - Whether the pointer is over the content\n * @internal\n */\n setPointerOverContent(isOver: boolean): void;\n}\n\nexport interface NgpSubmenuTriggerProps<T = unknown> {\n /**\n * Whether the trigger is disabled.\n */\n readonly disabled?: Signal<boolean>;\n /**\n * The menu template or component.\n */\n readonly menu?: Signal<NgpOverlayContent<T> | undefined>;\n /**\n * The placement of the menu.\n */\n readonly placement?: Signal<NgpMenuPlacement>;\n /**\n * The offset of the menu.\n */\n readonly offset?: Signal<NgpOffset>;\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip?: Signal<NgpFlip>;\n /**\n * The container in which the menu should be attached.\n */\n readonly container?: Signal<HTMLElement | string | null>;\n}\n\nexport const [\n NgpSubmenuTriggerStateToken,\n ngpSubmenuTrigger,\n injectSubmenuTriggerState,\n provideSubmenuTriggerState,\n] = createPrimitive(\n 'NgpSubmenuTrigger',\n <T>({\n disabled: _disabled = signal(false),\n menu: _menu = signal<NgpOverlayContent<T> | undefined>(undefined),\n placement: _placement = signal('right-start'),\n offset: _offset = signal(0),\n flip: _flip = signal(true),\n container: _container,\n }: NgpSubmenuTriggerProps<T>) => {\n const element = injectElementRef();\n const injector = inject(Injector);\n const viewContainerRef = inject(ViewContainerRef);\n const parentMenu = injectMenuState({ optional: true });\n const focusMonitor = inject(FocusMonitor);\n const disposables = injectDisposables();\n\n // Controlled properties\n const menu = controlled(_menu);\n const disabled = controlled(_disabled);\n const placement = controlled(_placement);\n const flip = controlled(_flip);\n const offset = controlled(_offset);\n const container = controlled(_container, 'body');\n\n const overlay = signal<NgpOverlay<T> | null>(null);\n const open = computed(() => overlay()?.isOpen() ?? false);\n const openOrigin = signal<FocusOrigin>('program');\n\n // Track pointer presence for the safe-polygon hover bridge.\n const pointerOverTrigger = signal(false);\n const pointerOverContent = signal(false);\n const isPointerOverSubmenu = computed(() => pointerOverTrigger() || pointerOverContent());\n\n // Safe-polygon hover intent: while the pointer travels inside a corridor from\n // the submenu trigger toward the open submenu, sibling hover events are\n // ignored so the submenu doesn't collapse mid-traversal.\n const hoverBridge = createHoverBridge({\n isPointerInAnchor: isPointerOverSubmenu,\n close: () => hide('mouse'),\n requireForwardMovement: true,\n });\n\n // Tear down any hover bridge whenever the submenu closes - including close\n // paths that bypass hide() (e.g. an outside click on the overlay), so a\n // stale corridor can't linger or wrongly suppress the next sibling hover.\n // Also reset the pointer flags: destroying the panel under the pointer never\n // fires its pointerleave, and a stuck pointerOverContent would make every\n // future corridor treat the pointer as anchored and never close.\n effect(() => {\n if (!open()) {\n hoverBridge.clear();\n pointerOverTrigger.set(false);\n pointerOverContent.set(false);\n }\n });\n\n // Subscribe to parent menu's closeSubmenus\n parentMenu()\n ?.closeSubmenus.pipe(safeTakeUntilDestroyed())\n .subscribe(submenuElement => {\n // if the element is not the trigger, we want to close the menu\n if (submenuElement === element.nativeElement) {\n return;\n }\n\n // While the pointer is still inside the safe-polygon corridor toward this\n // submenu, ignore sibling hover-driven closes. The pointer-move listener\n // closes the submenu itself once the pointer actually leaves the corridor.\n if (hoverBridge.isActive()) {\n return;\n }\n\n hide('mouse');\n });\n\n // Host bindings\n attrBinding(element, 'aria-haspopup', 'true');\n attrBinding(element, 'aria-expanded', open);\n dataBinding(element, 'data-open', open);\n\n // Event listeners\n listener(element, 'click', onClick);\n listener(element, 'keydown', handleArrowKey);\n listener(element, 'pointerenter', showSubmenuOnHover);\n listener(element, 'pointerleave', onPointerLeave);\n\n // Methods\n function onClick(event: MouseEvent): void {\n if (disabled?.()) {\n return;\n }\n toggle(event);\n }\n\n function toggle(event: MouseEvent): void {\n // determine the origin of the event, 0 is keyboard, 1 is mouse\n const origin: FocusOrigin = event.detail === 0 ? 'keyboard' : 'mouse';\n\n // if the menu is open then hide it\n if (open()) {\n hide(origin);\n } else {\n show(origin);\n }\n }\n\n function show(origin: FocusOrigin = 'program'): void {\n // If the trigger is disabled, don't show the menu\n if (disabled?.()) {\n return;\n }\n\n // Store the origin used to open the menu (for focus-visible styling in submenu)\n openOrigin.set(origin);\n\n // Create the overlay if it doesn't exist yet\n if (!overlay()) {\n createOverlayInstance();\n }\n\n // Show the overlay\n overlay()?.show();\n }\n\n function hide(origin: FocusOrigin = 'program'): void {\n // If the trigger is disabled or the menu is not open, do nothing\n if (disabled?.() || !open()) {\n return;\n }\n\n // The submenu is closing - any active hover bridge is no longer relevant.\n hoverBridge.clear();\n\n // Hide the overlay\n overlay()?.hide({ origin });\n }\n\n function createOverlayInstance(): void {\n const menuContent = menu?.();\n\n if (!menuContent) {\n throw new Error('Menu must be either a TemplateRef or a ComponentType');\n }\n\n // Create config for the overlay\n // Note: restoreFocus is false because submenus should never auto-restore focus.\n // When closeAllMenus is called, the ROOT menu's overlay handles focus restoration.\n // When closing just the submenu (Left Arrow), the caller handles focus explicitly.\n // closeOnEscape is false because we handle Escape in menu-state.ts to ensure\n // proper focus restoration through closeAllMenus.\n const config: NgpOverlayConfig<T> = {\n content: menuContent,\n triggerElement: element.nativeElement,\n injector,\n container: container(),\n placement,\n offset: offset(),\n flip: flip(),\n closeOnOutsideClick: true,\n closeOnEscape: false,\n restoreFocus: false,\n viewContainerRef,\n };\n\n overlay.set(createOverlay(config));\n }\n\n function handleArrowKey(event: Event): void {\n if (event instanceof KeyboardEvent === false) {\n return;\n }\n\n const direction = getComputedStyle(element.nativeElement).direction;\n const isRtl = direction === 'rtl';\n\n const isRightArrow = event.key === 'ArrowRight';\n const isLeftArrow = event.key === 'ArrowLeft';\n\n if ((isRightArrow && !isRtl) || (isLeftArrow && isRtl)) {\n event.preventDefault();\n show('keyboard');\n }\n }\n\n function showSubmenuOnHover(event: Event): void {\n if (event instanceof PointerEvent === false) {\n return;\n }\n\n // if this was triggered by a touch event, we don't want to show the submenu\n // as it will be shown by the click event - this prevents the submenu from being toggled\n if (event.pointerType === 'touch') {\n return;\n }\n\n pointerOverTrigger.set(true);\n // The pointer is back on the trigger - drop any in-progress hover bridge.\n hoverBridge.clear();\n\n show('mouse');\n }\n\n function onPointerLeave(event: Event): void {\n if (event instanceof PointerEvent === false || event.pointerType === 'touch') {\n return;\n }\n\n pointerOverTrigger.set(false);\n\n const currentOverlay = overlay();\n\n // Only build a corridor while the submenu is actually open.\n if (!open() || !currentOverlay) {\n return;\n }\n\n const submenuElement = currentOverlay.getElements()[0];\n const started =\n !!submenuElement &&\n hoverBridge.track({\n triggerRect: element.nativeElement.getBoundingClientRect(),\n targetRect: submenuElement.getBoundingClientRect(),\n exitPoint: { x: event.clientX, y: event.clientY },\n });\n\n if (!started) {\n // Defensive fallback: if the corridor can't be built, close after a short\n // grace period rather than leaving the submenu stuck open.\n disposables.setTimeout(() => {\n if (!isPointerOverSubmenu()) {\n hide('mouse');\n }\n }, 50);\n }\n }\n\n function setDisabled(isDisabled: boolean): void {\n disabled.set(isDisabled);\n\n if (isDisabled && open()) {\n hide();\n }\n }\n\n function setMenu(newMenu: NgpOverlayContent<T> | undefined): void {\n menu.set(newMenu);\n }\n\n function setPlacement(newPlacement: NgpMenuPlacement): void {\n placement.set(newPlacement);\n }\n\n function setOffset(newOffset: NgpOffset): void {\n offset.set(newOffset);\n }\n\n function setFlip(shouldFlip: NgpFlip): void {\n flip.set(shouldFlip);\n }\n\n function setContainer(newContainer: HTMLElement | string | null): void {\n container.set(newContainer);\n }\n\n function focus(origin: FocusOrigin): void {\n focusMonitor.focusVia(element.nativeElement, origin, { preventScroll: true });\n }\n\n function setPointerOverContent(isOver: boolean): void {\n pointerOverContent.set(isOver);\n\n // Reaching the submenu content means the pointer arrived safely, so the\n // hover bridge corridor is no longer needed.\n if (isOver) {\n hoverBridge.clear();\n }\n }\n\n return {\n placement: deprecatedSetter(placement, 'setPlacement'),\n offset: deprecatedSetter(offset, 'setOffset'),\n disabled: deprecatedSetter(disabled, 'setDisabled'),\n menu: deprecatedSetter(menu, 'setMenu'),\n flip: deprecatedSetter(flip, 'setFlip'),\n open,\n openOrigin,\n show,\n hide,\n toggle,\n setDisabled,\n setMenu,\n setFlip,\n setPlacement,\n setOffset,\n setContainer,\n focus,\n setPointerOverContent,\n container: deprecatedSetter(container, 'setContainer', setContainer),\n } satisfies NgpSubmenuTriggerState;\n },\n);\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport {\n coerceFlip,\n coerceOffset,\n NgpFlip,\n NgpFlipInput,\n NgpOffset,\n NgpOffsetInput,\n NgpOverlayContent,\n} from 'ng-primitives/portal';\nimport { NgpMenuPlacement } from '../menu-trigger/menu-trigger';\nimport { NgpMenuTriggerStateToken } from '../menu-trigger/menu-trigger-state';\nimport {\n NgpSubmenuTriggerStateToken,\n ngpSubmenuTrigger,\n provideSubmenuTriggerState,\n} from './submenu-trigger-state';\n\n@Directive({\n selector: '[ngpSubmenuTrigger]',\n exportAs: 'ngpSubmenuTrigger',\n providers: [\n // inherit: false - a nested submenu trigger lives inside the DI scope of its\n // parent submenu trigger (via the overlay's injector). Inheriting would reuse\n // the parent trigger's state signal and overwrite it with this trigger's\n // state, so the parent's menu would start talking to the wrong trigger.\n provideSubmenuTriggerState({ inherit: false }),\n // Also provide as NgpMenuTriggerStateToken so the submenu's menu-state\n // can find this trigger's openOrigin for :focus-visible styling\n { provide: NgpMenuTriggerStateToken, useExisting: NgpSubmenuTriggerStateToken },\n ],\n})\nexport class NgpSubmenuTrigger<T = unknown> {\n /**\n * Access the submenu template ref.\n */\n readonly menu = input<NgpOverlayContent<T>>(undefined, {\n alias: 'ngpSubmenuTrigger',\n });\n\n /**\n * Define if the trigger should be disabled.\n * @default false\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpSubmenuTriggerDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Define the placement of the menu relative to the trigger.\n * @default 'right-start'\n */\n readonly placement = input<NgpMenuPlacement>('right-start', {\n alias: 'ngpSubmenuTriggerPlacement',\n });\n\n /**\n * Define the offset of the menu relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 0\n */\n readonly offset = input<NgpOffset, NgpOffsetInput>(0, {\n alias: 'ngpSubmenuTriggerOffset',\n transform: coerceOffset,\n });\n\n /**\n * Define whether the menu should flip when there is not enough space for the menu.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n readonly flip = input<NgpFlip, NgpFlipInput>(true, {\n alias: 'ngpSubmenuTriggerFlip',\n transform: coerceFlip,\n });\n\n /**\n * Define the container in which the menu should be attached.\n * @default document.body\n */\n readonly container = input<HTMLElement | string | null>(null, {\n alias: 'ngpSubmenuTriggerContainer',\n });\n\n /**\n * Access the menu trigger state.\n */\n private readonly state = ngpSubmenuTrigger<T>({\n disabled: this.disabled,\n menu: this.menu,\n placement: this.placement,\n offset: this.offset,\n flip: this.flip,\n container: this.container,\n });\n\n /**\n * Show the menu.\n */\n show(): void {\n this.state.show();\n }\n\n /**\n * Hide the menu.\n */\n hide(origin: FocusOrigin = 'program'): void {\n this.state.hide(origin);\n }\n\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void {\n this.state.toggle(event);\n }\n\n /**\n * Focus the trigger element.\n * @param origin - The focus origin\n */\n focus(origin: FocusOrigin = 'program'): void {\n this.state.focus(origin);\n }\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { inject, Injector, signal, Signal } from '@angular/core';\nimport { ngpButton } from 'ng-primitives/button';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { attrBinding, createPrimitive, listener } from 'ng-primitives/state';\nimport { injectMenuState } from '../menu/menu-state';\nimport { NgpSubmenuTrigger } from '../submenu-trigger/submenu-trigger';\n\nexport interface NgpMenuItemState {}\n\nexport interface NgpMenuItemProps {\n /**\n * Whether the menu item is disabled.\n */\n readonly disabled?: Signal<boolean>;\n\n /**\n * Whether the menu should close when this item is selected.\n * @default signal(true)\n */\n readonly closeOnSelect?: Signal<boolean>;\n\n /**\n * The ARIA role for the menu item.\n * @default 'menuitem'\n */\n readonly role?: string;\n}\n\nexport const [NgpMenuItemStateToken, ngpMenuItem, injectMenuItemState, provideMenuItemState] =\n createPrimitive(\n 'NgpMenuItem',\n ({\n disabled = signal(false),\n closeOnSelect = signal(true),\n role = 'menuitem',\n }: NgpMenuItemProps) => {\n const element = injectElementRef();\n const injector = inject(Injector);\n const parentMenu = injectMenuState({ optional: true });\n\n ngpButton({ disabled });\n\n // Host bindings\n attrBinding(element, 'role', role);\n\n // Event listeners\n listener(element, 'click', onClick);\n listener(element, 'keydown', handleArrowKey);\n listener(element, 'mouseenter', showSubmenuOnHover);\n\n // Methods\n function onClick(event: MouseEvent): void {\n // we do this here to avoid circular dependency issues\n const trigger = injector.get(NgpSubmenuTrigger, null, { self: true, optional: true });\n\n const origin: FocusOrigin = event.detail === 0 ? 'keyboard' : 'mouse';\n\n // if this is a submenu trigger, we don't want to close the menu, we want to open the submenu\n // if closeOnSelect is false, we don't want to close the menu (e.g., checkbox/radio items)\n if (!trigger && closeOnSelect()) {\n parentMenu()?.closeAllMenus(origin);\n }\n }\n\n function handleArrowKey(event: Event): void {\n if (event instanceof KeyboardEvent === false) {\n return;\n }\n\n // if there is no parent menu, we don't want to do anything\n const trigger = injector.get(NgpSubmenuTrigger, null, { optional: true, skipSelf: true });\n\n if (!trigger) {\n return;\n }\n\n const direction = getComputedStyle(element.nativeElement).direction;\n const isRtl = direction === 'rtl';\n\n const isLeftArrow = event.key === 'ArrowLeft';\n const isRightArrow = event.key === 'ArrowRight';\n\n if ((isLeftArrow && !isRtl) || (isRightArrow && isRtl)) {\n event.preventDefault();\n\n if (trigger) {\n trigger.hide('keyboard');\n // Explicitly focus the submenu trigger since submenus have restoreFocus: false\n trigger.focus('keyboard');\n }\n }\n }\n\n function showSubmenuOnHover(): void {\n parentMenu()?.closeSubmenus.next(element.nativeElement);\n }\n\n return {} satisfies NgpMenuItemState;\n },\n );\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport { ngpRovingFocusItem, provideRovingFocusItemState } from 'ng-primitives/roving-focus';\nimport { ngpMenuItem, provideMenuItemState } from './menu-item-state';\n\n/**\n * The `NgpMenuItem` directive represents a menu item.\n */\n@Directive({\n selector: '[ngpMenuItem]',\n exportAs: 'ngpMenuItem',\n providers: [provideMenuItemState(), provideRovingFocusItemState()],\n})\nexport class NgpMenuItem {\n /** Whether the menu item is disabled */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemDisabled',\n transform: booleanAttribute,\n });\n\n /** Whether the menu should close when this item is selected */\n readonly closeOnSelect = input<boolean, BooleanInput>(true, {\n alias: 'ngpMenuItemCloseOnSelect',\n transform: booleanAttribute,\n });\n\n constructor() {\n ngpMenuItem({ disabled: this.disabled, closeOnSelect: this.closeOnSelect });\n ngpRovingFocusItem({ disabled: this.disabled });\n }\n}\n","import { Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n emitter,\n listener,\n} from 'ng-primitives/state';\nimport { Observable } from 'rxjs';\nimport { ngpMenuItem } from '../menu-item/menu-item-state';\n\nexport interface NgpMenuItemCheckboxState {\n /**\n * Whether the checkbox is checked.\n */\n readonly checked: Signal<boolean>;\n\n /**\n * Emits when the checked state changes.\n */\n readonly checkedChange: Observable<boolean>;\n\n /**\n * Toggle the checkbox value.\n */\n toggle(): void;\n}\n\nexport interface NgpMenuItemCheckboxProps {\n /**\n * Whether the checkbox is checked.\n */\n readonly checked?: Signal<boolean>;\n\n /**\n * Whether the checkbox is disabled.\n */\n readonly disabled?: Signal<boolean>;\n\n /**\n * Callback fired when the checked state changes.\n */\n readonly onCheckedChange?: (checked: boolean) => void;\n}\n\nexport const [\n NgpMenuItemCheckboxStateToken,\n ngpMenuItemCheckbox,\n injectMenuItemCheckboxState,\n provideMenuItemCheckboxState,\n] = createPrimitive(\n 'NgpMenuItemCheckbox',\n ({\n checked: _checked = signal(false),\n disabled = signal(false),\n onCheckedChange,\n }: NgpMenuItemCheckboxProps): NgpMenuItemCheckboxState => {\n const element = injectElementRef();\n const checked = controlled(_checked);\n const checkedChange = emitter<boolean>();\n\n // Use base menu item behavior but don't close on select\n ngpMenuItem({ disabled, closeOnSelect: signal(false), role: 'menuitemcheckbox' });\n\n // Host bindings\n attrBinding(element, 'aria-checked', checked);\n dataBinding(element, 'data-checked', checked);\n\n // Toggle on click\n listener(element, 'click', () => toggle());\n\n function toggle(): void {\n if (disabled()) {\n return;\n }\n\n const nextChecked = !checked();\n checked.set(nextChecked);\n onCheckedChange?.(nextChecked);\n checkedChange.emit(nextChecked);\n }\n\n return {\n checked,\n checkedChange: checkedChange.asObservable(),\n toggle,\n } satisfies NgpMenuItemCheckboxState;\n },\n);\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input, output } from '@angular/core';\nimport { ngpRovingFocusItem, provideRovingFocusItemState } from 'ng-primitives/roving-focus';\nimport { ngpMenuItemCheckbox, provideMenuItemCheckboxState } from './menu-item-checkbox-state';\n\n/**\n * The `NgpMenuItemCheckbox` directive represents a menu item that can be toggled on and off.\n */\n@Directive({\n selector: '[ngpMenuItemCheckbox]',\n exportAs: 'ngpMenuItemCheckbox',\n providers: [provideMenuItemCheckboxState(), provideRovingFocusItemState()],\n})\nexport class NgpMenuItemCheckbox {\n /** Whether the checkbox is checked */\n readonly checked = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemCheckboxChecked',\n transform: booleanAttribute,\n });\n\n /** Event emitted when the checked state changes */\n readonly checkedChange = output<boolean>({\n alias: 'ngpMenuItemCheckboxCheckedChange',\n });\n\n /** Whether the menu item checkbox is disabled */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemCheckboxDisabled',\n transform: booleanAttribute,\n });\n\n constructor() {\n ngpMenuItemCheckbox({\n checked: this.checked,\n disabled: this.disabled,\n onCheckedChange: value => this.checkedChange.emit(value),\n });\n ngpRovingFocusItem({ disabled: this.disabled });\n }\n}\n","import { Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { attrBinding, controlled, createPrimitive, emitter } from 'ng-primitives/state';\nimport { Observable } from 'rxjs';\n\nexport interface NgpMenuItemRadioGroupState {\n /**\n * The current value of the radio group.\n */\n readonly value: Signal<string | null>;\n\n /**\n * Emits when the value changes.\n */\n readonly valueChange: Observable<string>;\n\n /**\n * Select a radio item by value.\n */\n select(value: string): void;\n}\n\nexport interface NgpMenuItemRadioGroupProps {\n /**\n * The current value of the radio group.\n */\n readonly value?: Signal<string | null>;\n\n /**\n * Callback fired when the value changes.\n */\n readonly onValueChange?: (value: string) => void;\n}\n\nexport const [\n NgpMenuItemRadioGroupStateToken,\n ngpMenuItemRadioGroup,\n injectMenuItemRadioGroupState,\n provideMenuItemRadioGroupState,\n] = createPrimitive(\n 'NgpMenuItemRadioGroup',\n ({\n value: _value = signal(null),\n onValueChange,\n }: NgpMenuItemRadioGroupProps): NgpMenuItemRadioGroupState => {\n const element = injectElementRef();\n const value = controlled(_value);\n const valueChange = emitter<string>();\n\n // Host bindings\n attrBinding(element, 'role', 'group');\n\n function select(newValue: string): void {\n if (value() === newValue) {\n return;\n }\n\n value.set(newValue);\n onValueChange?.(newValue);\n valueChange.emit(newValue);\n }\n\n return {\n value,\n valueChange: valueChange.asObservable(),\n select,\n } satisfies NgpMenuItemRadioGroupState;\n },\n);\n","import { computed, Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { attrBinding, createPrimitive, dataBinding, listener } from 'ng-primitives/state';\nimport { injectMenuItemRadioGroupState } from '../menu-item-radio-group/menu-item-radio-group-state';\nimport { ngpMenuItem } from '../menu-item/menu-item-state';\n\nexport interface NgpMenuItemRadioState {\n /**\n * Whether the radio item is checked.\n */\n readonly checked: Signal<boolean>;\n}\n\nexport interface NgpMenuItemRadioProps {\n /**\n * The value this radio item represents.\n */\n readonly value: Signal<string>;\n\n /**\n * Whether the radio item is disabled.\n */\n readonly disabled?: Signal<boolean>;\n}\n\nexport const [\n NgpMenuItemRadioStateToken,\n ngpMenuItemRadio,\n injectMenuItemRadioState,\n provideMenuItemRadioState,\n] = createPrimitive(\n 'NgpMenuItemRadio',\n ({ value, disabled = signal(false) }: NgpMenuItemRadioProps): NgpMenuItemRadioState => {\n const element = injectElementRef();\n const radioGroup = injectMenuItemRadioGroupState();\n\n // Use base menu item behavior but don't close on select\n ngpMenuItem({ disabled, closeOnSelect: signal(false), role: 'menuitemradio' });\n\n // Computed checked state\n const checked = computed(() => radioGroup()?.value() === value());\n\n // Host bindings\n attrBinding(element, 'aria-checked', checked);\n dataBinding(element, 'data-checked', checked);\n\n // Select on click\n listener(element, 'click', () => {\n if (disabled()) {\n return;\n }\n radioGroup()?.select(value());\n });\n\n return {\n checked,\n } satisfies NgpMenuItemRadioState;\n },\n);\n","import { computed, Directive } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { dataBinding } from 'ng-primitives/state';\nimport { injectMenuItemCheckboxState } from '../menu-item-checkbox/menu-item-checkbox-state';\nimport { injectMenuItemRadioState } from '../menu-item-radio/menu-item-radio-state';\n\n/**\n * The `NgpMenuItemIndicator` directive renders inside a checkbox or radio menu item\n * and exposes `data-checked` based on the parent item's checked state.\n */\n@Directive({\n selector: '[ngpMenuItemIndicator]',\n exportAs: 'ngpMenuItemIndicator',\n})\nexport class NgpMenuItemIndicator {\n constructor() {\n const element = injectElementRef();\n const checkboxState = injectMenuItemCheckboxState({ optional: true });\n const radioState = injectMenuItemRadioState({ optional: true });\n\n const checked = computed(() => checkboxState()?.checked() ?? radioState()?.checked() ?? false);\n\n dataBinding(element, 'data-checked', checked);\n }\n}\n","import { Directive, input, output } from '@angular/core';\nimport {\n ngpMenuItemRadioGroup,\n provideMenuItemRadioGroupState,\n} from './menu-item-radio-group-state';\n\n/**\n * The `NgpMenuItemRadioGroup` directive represents a group of radio menu items.\n */\n@Directive({\n selector: '[ngpMenuItemRadioGroup]',\n exportAs: 'ngpMenuItemRadioGroup',\n providers: [provideMenuItemRadioGroupState()],\n})\nexport class NgpMenuItemRadioGroup {\n /** The current value of the radio group */\n readonly value = input<string | null>(null, {\n alias: 'ngpMenuItemRadioGroupValue',\n });\n\n /** Event emitted when the value changes */\n readonly valueChange = output<string>({\n alias: 'ngpMenuItemRadioGroupValueChange',\n });\n\n constructor() {\n ngpMenuItemRadioGroup({\n value: this.value,\n onValueChange: value => this.valueChange.emit(value),\n });\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport { ngpRovingFocusItem, provideRovingFocusItemState } from 'ng-primitives/roving-focus';\nimport { ngpMenuItemRadio, provideMenuItemRadioState } from './menu-item-radio-state';\n\n/**\n * The `NgpMenuItemRadio` directive represents a radio menu item within a radio group.\n */\n@Directive({\n selector: '[ngpMenuItemRadio]',\n exportAs: 'ngpMenuItemRadio',\n providers: [provideMenuItemRadioState(), provideRovingFocusItemState()],\n})\nexport class NgpMenuItemRadio {\n /** The value this radio item represents */\n readonly value = input.required<string>({\n alias: 'ngpMenuItemRadioValue',\n });\n\n /** Whether the radio item is disabled */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemRadioDisabled',\n transform: booleanAttribute,\n });\n\n constructor() {\n ngpMenuItemRadio({ value: this.value, disabled: this.disabled });\n ngpRovingFocusItem({ disabled: this.disabled });\n }\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input, numberAttribute, Signal } from '@angular/core';\nimport {\n coerceFlip,\n coerceOffset,\n coerceShift,\n NgpFlip,\n NgpFlipInput,\n NgpOffset,\n NgpOffsetInput,\n NgpOverlayContent,\n NgpShift,\n NgpShiftInput,\n} from 'ng-primitives/portal';\nimport { injectMenuConfig, NgpMenuTriggerType } from '../config/menu-config';\nimport { ngpMenuTrigger, provideMenuTriggerState } from './menu-trigger-state';\n\n/**\n * The `NgpMenuTrigger` directive allows you to turn an element into a menu trigger.\n */\n@Directive({\n selector: '[ngpMenuTrigger]',\n exportAs: 'ngpMenuTrigger',\n providers: [provideMenuTriggerState()],\n})\nexport class NgpMenuTrigger<T = unknown> {\n /**\n * Access the global menu configuration.\n */\n private readonly config = injectMenuConfig();\n\n /**\n * Access the menu template ref or ComponentType.\n */\n readonly menu = input<NgpOverlayContent<T>>(undefined, {\n alias: 'ngpMenuTrigger',\n });\n\n /**\n * Define if the trigger should be disabled.\n * @default false\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuTriggerDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Define the placement of the menu relative to the trigger.\n * @default 'bottom-start'\n */\n readonly placement = input<NgpMenuPlacement>(this.config.placement, {\n alias: 'ngpMenuTriggerPlacement',\n });\n\n /**\n * Define the offset of the menu relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 4\n */\n readonly offset = input<NgpOffset, NgpOffsetInput>(this.config.offset, {\n alias: 'ngpMenuTriggerOffset',\n transform: coerceOffset,\n });\n\n /**\n * Define whether the menu should flip when there is not enough space for the menu.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n readonly flip = input<NgpFlip, NgpFlipInput>(this.config.flip, {\n alias: 'ngpMenuTriggerFlip',\n transform: coerceFlip,\n });\n\n /**\n * Configure shift behavior to keep the menu in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n readonly shift = input<NgpShift, NgpShiftInput>(this.config.shift, {\n alias: 'ngpMenuTriggerShift',\n transform: coerceShift,\n });\n\n /**\n * Define the container in which the menu should be attached.\n * @default document.body\n */\n readonly container = input<HTMLElement | string | null>(this.config.container, {\n alias: 'ngpMenuTriggerContainer',\n });\n\n /**\n * Defines how the menu behaves when the window is scrolled.\n * @default 'block'\n */\n readonly scrollBehavior = input<'reposition' | 'block' | 'close'>(this.config.scrollBehavior, {\n alias: 'ngpMenuTriggerScrollBehavior',\n });\n\n /**\n * Define the cooldown duration in milliseconds.\n * When moving from one menu to another within this duration,\n * the showDelay is skipped for the new menu.\n * @default 0\n */\n readonly cooldown = input<number, NumberInput>(this.config.cooldown, {\n alias: 'ngpMenuTriggerCooldown',\n transform: numberAttribute,\n });\n\n /**\n * Provide context to the menu. This can be used to pass data to the menu content.\n */\n readonly context = input<T>(undefined, {\n alias: 'ngpMenuTriggerContext',\n });\n\n /**\n * Define which trigger types are enabled for the menu.\n * @default ['click']\n */\n readonly triggers = input<NgpMenuTriggerType[]>(this.config.triggers, {\n alias: 'ngpMenuTriggerOpenTriggers',\n });\n\n /**\n * Define the delay before the menu is displayed (hover/focus triggers).\n * @default 0\n */\n readonly showDelay = input<number, NumberInput>(this.config.showDelay, {\n alias: 'ngpMenuTriggerShowDelay',\n transform: numberAttribute,\n });\n\n /**\n * Define the delay before the menu is hidden (hover/focus triggers).\n * @default 0\n */\n readonly hideDelay = input<number, NumberInput>(this.config.hideDelay, {\n alias: 'ngpMenuTriggerHideDelay',\n transform: numberAttribute,\n });\n\n /**\n * The menu trigger state.\n */\n private readonly state = ngpMenuTrigger<T>({\n disabled: this.disabled,\n menu: this.menu,\n placement: this.placement,\n offset: this.offset,\n flip: this.flip,\n shift: this.shift,\n container: this.container,\n scrollBehavior: this.scrollBehavior,\n cooldown: this.cooldown,\n context: this.context as Signal<T>,\n triggers: this.triggers,\n showDelay: this.showDelay,\n hideDelay: this.hideDelay,\n });\n\n /**\n * Show the menu.\n */\n show(): void {\n this.state.show();\n }\n\n /**\n * Hide the menu.\n * @param origin - The focus origin\n * @internal\n */\n hide(origin?: FocusOrigin): void {\n this.state.hide(origin);\n }\n\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void {\n this.state.toggle(event);\n }\n}\n\nexport type NgpMenuPlacement =\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-start'\n | 'top-end'\n | 'right-start'\n | 'right-end'\n | 'bottom-start'\n | 'bottom-end'\n | 'left-start'\n | 'left-end';\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport { provideFocusTrapState } from 'ng-primitives/focus-trap';\nimport { provideControlContainerIsolation } from 'ng-primitives/portal';\nimport { ngpRovingFocusGroup, provideRovingFocusGroupState } from 'ng-primitives/roving-focus';\nimport { injectMenuConfig } from '../config/menu-config';\nimport { ngpMenu, provideMenuState } from './menu-state';\n\n/**\n * The `NgpMenu` is a container for menu items.\n */\n@Directive({\n selector: '[ngpMenu]',\n exportAs: 'ngpMenu',\n providers: [\n // ensure we don't inherit the focus group from the parent menu if there is one\n provideRovingFocusGroupState({ inherit: false }),\n provideMenuState({ inherit: false }),\n provideFocusTrapState(),\n provideControlContainerIsolation(),\n ],\n})\nexport class NgpMenu {\n private readonly config = injectMenuConfig();\n\n /**\n * Whether focus should wrap around when reaching the end of the menu.\n * @default true\n */\n readonly wrap = input<boolean, BooleanInput>(this.config.wrap, {\n alias: 'ngpMenuWrap',\n transform: booleanAttribute,\n });\n\n private readonly state = ngpMenu({ wrap: this.wrap });\n\n constructor() {\n ngpRovingFocusGroup({ inherit: false, wrap: this.wrap });\n }\n\n /** @internal Close the menu and any parent menus */\n closeAllMenus(origin: FocusOrigin): void {\n this.state.closeAllMenus(origin);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;AA+EO,MAAM,iBAAiB,GAAkB;AAC9C,IAAA,MAAM,EAAE,CAAC;AACT,IAAA,SAAS,EAAE,cAAc;AACzB,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,SAAS,EAAE,MAAM;AACjB,IAAA,cAAc,EAAE,OAAO;AACvB,IAAA,KAAK,EAAE,SAAS;AAChB,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,CAAC,OAAO,CAAC;AACnB,IAAA,SAAS,EAAE,CAAC;AACZ,IAAA,SAAS,EAAE,CAAC;CACb;AAEM,MAAM,kBAAkB,GAAG,IAAI,cAAc,CAAgB,oBAAoB,CAAC;AAEzF;;;;AAIG;AACG,SAAU,iBAAiB,CAAC,MAA8B,EAAA;IAC9D,OAAO;AACL,QAAA;AACE,YAAA,OAAO,EAAE,kBAAkB;AAC3B,YAAA,QAAQ,EAAE,EAAE,GAAG,iBAAiB,EAAE,GAAG,MAAM,EAAE;AAC9C,SAAA;KACF;AACH;AAEA;;;AAGG;SACa,gBAAgB,GAAA;AAC9B,IAAA,OAAO,MAAM,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,iBAAiB;AAC5E;;AC6FO,MAAM,CACX,wBAAwB,EACxB,cAAc,EACd,uBAAuB,EACvB,uBAAuB,EACxB,GAAG,eAAe,CACjB,gBAAgB,EAChB,CAAI,EACF,QAAQ,EAAE,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,EACnC,IAAI,EAAE,KAAK,GAAG,MAAM,CAAmC,SAAS,CAAC,EACjE,SAAS,EAAE,UAAU,GAAG,MAAM,CAAC,cAAkC,CAAC,EAClE,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,EAC3B,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAC1B,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,EACjC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAI,SAAc,CAAC,EAC7C,SAAS,EAAE,UAAU,EACrB,cAAc,EACd,QAAQ,EACR,QAAQ,GAAG,MAAM,CAAC,CAAC,OAAO,CAAyB,CAAC,EACpD,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,EACrB,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,GACE,KAAI;AAC3B,IAAA,MAAM,OAAO,GAAG,gBAAgB,EAAE;AAClC,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACjC,IAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACjD,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AAC7C,IAAA,MAAM,WAAW,GAAG,iBAAiB,EAAE;;AAGvC,IAAA,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC;AAC9B,IAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC;AACtC,IAAA,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC;AACxC,IAAA,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC;AAC9B,IAAA,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;AAChC,IAAA,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC;AAClC,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC;IACpC,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC;;AAGhD,IAAA,MAAM,OAAO,GAAG,MAAM,CAAuB,IAAI,8EAAC;AAClD,IAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,KAAK,2EAAC;AACzD,IAAA,MAAM,UAAU,GAAG,MAAM,CAAc,SAAS,iFAAC;AACjD,IAAA,MAAM,WAAW,GAAG,MAAM,CAAc,SAAS,kFAAC;;AAGlD,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,KAAK,yFAAC;AACxC,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,KAAK,yFAAC;AACxC,IAAA,MAAM,qBAAqB,GAAG,QAAQ,CAAC,MAAM,kBAAkB,EAAE,IAAI,kBAAkB,EAAE,4FAAC;;;;IAK1F,MAAM,WAAW,GAAG,iBAAiB,CAAC;AACpC,QAAA,iBAAiB,EAAE,qBAAqB;AACxC,QAAA,KAAK,EAAE,MAAM,IAAI,EAAE;AACnB,QAAA,sBAAsB,EAAE,IAAI;AAC7B,KAAA,CAAC;;IAGF,MAAM,CAAC,MAAK;AACV,QAAA,MAAM,MAAM,GAAG,IAAI,EAAE;;;QAIrB,IAAI,CAAC,MAAM,EAAE;YACX,WAAW,CAAC,KAAK,EAAE;AACnB,YAAA,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,YAAA,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B;AACF,IAAA,CAAC,CAAC;;;AAIF,IAAA,MAAM,kBAAkB,GAAG,QAAQ,CACjC,MAAM,UAAU,EAAE,KAAK,UAAU,IAAI,WAAW,EAAE,KAAK,UAAU,yFAClE;;AAGD,IAAA,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,CAAC;AAC7C,IAAA,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,CAAC;AAC3C,IAAA,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC;AACvC,IAAA,WAAW,CAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,CAAC;;AAGjD,IAAA,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC;AACnC,IAAA,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,cAAc,CAAC;AACjD,IAAA,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,cAAc,CAAC;AACjD,IAAA,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC;AACnC,IAAA,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;AACjC,IAAA,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC;;IAGvC,SAAS,OAAO,CAAC,KAAiB,EAAA;AAChC,QAAA,IAAI,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YACjD;QACF;QACA,MAAM,CAAC,KAAK,CAAC;IACf;IAEA,SAAS,cAAc,CAAC,KAAmB,EAAA;AACzC,QAAA,IAAI,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YACjD;QACF;;AAGA,QAAA,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE;YACjC;QACF;AAEA,QAAA,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;;;QAI5B,IAAI,IAAI,EAAE,EAAE;YACV,WAAW,CAAC,KAAK,EAAE;AACnB,YAAA,OAAO,EAAE,EAAE,kBAAkB,EAAE;YAC/B;QACF;QAEA,IAAI,CAAC,OAAO,CAAC;IACf;IAEA,SAAS,cAAc,CAAC,KAAmB,EAAA;AACzC,QAAA,IAAI,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YACjD;QACF;;AAGA,QAAA,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE;YACjC;QACF;AAEA,QAAA,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;AAE7B,QAAA,MAAM,cAAc,GAAG,OAAO,EAAE;;QAGhC,IAAI,CAAC,cAAc,EAAE;YACnB;QACF;;;;AAKA,QAAA,MAAM,WAAW,GAAG,IAAI,EAAE,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS;AACxE,QAAA,MAAM,OAAO,GACX,CAAC,CAAC,WAAW;YACb,WAAW,CAAC,KAAK,CAAC;AAChB,gBAAA,WAAW,EAAE,OAAO,CAAC,aAAa,CAAC,qBAAqB,EAAE;AAC1D,gBAAA,UAAU,EAAE,WAAW,CAAC,qBAAqB,EAAE;AAC/C,gBAAA,SAAS,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE;AAClD,aAAA,CAAC;QAEJ,IAAI,OAAO,EAAE;YACX,cAAc,CAAC,kBAAkB,EAAE;YACnC;QACF;;AAGA,QAAA,WAAW,CAAC,UAAU,CAAC,MAAK;AAC1B,YAAA,IAAI,CAAC,qBAAqB,EAAE,EAAE;AAC5B,gBAAA,IAAI,EAAE;YACR;QACF,CAAC,EAAE,EAAE,CAAC;IACR;AAEA,IAAA,SAAS,OAAO,GAAA;AACd,QAAA,IAAI,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YACjD;QACF;;QAGA,IAAI,IAAI,EAAE,EAAE;YACV;QACF;QAEA,IAAI,CAAC,UAAU,CAAC;IAClB;IAEA,SAAS,MAAM,CAAC,KAAiB,EAAA;AAC/B,QAAA,IAAI,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YACjD;QACF;;AAGA,QAAA,IAAI,CAAC,OAAO,EAAE,EAAE;YACd;QACF;;AAGA,QAAA,MAAM,aAAa,GAAG,KAAK,CAAC,aAAmC;QAC/D,IAAI,aAAa,EAAE;YACjB,MAAM,YAAY,GAAG,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;AACnD,YAAA,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YACzE,IAAI,aAAa,EAAE;gBACjB;YACF;QACF;AAEA,QAAA,IAAI,EAAE;IACR;IAEA,SAAS,SAAS,CAAC,KAAoB,EAAA;AACrC,QAAA,IAAI,QAAQ,IAAI,EAAE;YAChB;QACF;AAEA,QAAA,MAAM,eAAe,GAAG,QAAQ,EAAE;;AAGlC,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YAC9D,KAAK,CAAC,cAAc,EAAE;YACtB,MAAM,MAAM,GAAgB,UAAU;YACtC,IAAI,IAAI,EAAE,EAAE;gBACV,IAAI,CAAC,MAAM,CAAC;YACd;iBAAO;gBACL,IAAI,CAAC,MAAM,CAAC;YACd;YACA;QACF;;QAGA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;YACzC;QACF;AAEA,QAAA,MAAM,UAAU,GACd,KAAK,CAAC,GAAG,KAAK,SAAS;YACvB,KAAK,CAAC,GAAG,KAAK,WAAW;YACzB,KAAK,CAAC,GAAG,KAAK,WAAW;AACzB,YAAA,KAAK,CAAC,GAAG,KAAK,YAAY;QAE5B,IAAI,CAAC,UAAU,EAAE;YACf;QACF;;AAGA,QAAA,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,KAAK,KAAK;;AAG5C,QAAA,MAAM,gBAAgB,GAAG,SAAS,EAAE;QACpC,IAAI,UAAU,GAAG,KAAK;AAEtB,QAAA,IAAI,gBAAgB,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;YACtE,UAAU,GAAG,IAAI;QACnB;AAAO,aAAA,IAAI,gBAAgB,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;YACxE,UAAU,GAAG,IAAI;QACnB;AAAO,aAAA,IAAI,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AAC/C,YAAA,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,KAAK,YAAY;AAC/C,YAAA,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,KAAK,WAAW;AAC7C,YAAA,UAAU,GAAG,CAAC,YAAY,IAAI,CAAC,KAAK,MAAM,WAAW,IAAI,KAAK,CAAC;QACjE;AAAO,aAAA,IAAI,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;AAC9C,YAAA,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,KAAK,YAAY;AAC/C,YAAA,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,KAAK,WAAW;AAC7C,YAAA,UAAU,GAAG,CAAC,WAAW,IAAI,CAAC,KAAK,MAAM,YAAY,IAAI,KAAK,CAAC;QACjE;AAEA,QAAA,IAAI,UAAU,IAAI,CAAC,IAAI,EAAE,EAAE;YACzB,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,UAAU,CAAC;QAClB;IACF;IAEA,SAAS,MAAM,CAAC,KAAiB,EAAA;;AAE/B,QAAA,MAAM,MAAM,GAAgB,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG,UAAU,GAAG,OAAO;;QAGrE,IAAI,IAAI,EAAE,EAAE;YACV,IAAI,CAAC,MAAM,CAAC;QACd;aAAO;YACL,IAAI,CAAC,MAAM,CAAC;QACd;IACF;IAEA,SAAS,IAAI,CAAC,MAAA,GAAsB,SAAS,EAAA;;AAE3C,QAAA,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;;AAGtB,QAAA,IAAI,CAAC,OAAO,EAAE,EAAE;AACd,YAAA,qBAAqB,EAAE;QACzB;;AAGA,QAAA,OAAO,EAAE,EAAE,IAAI,EAAE;IACnB;IAEA,SAAS,IAAI,CAAC,MAAA,GAAsB,SAAS,EAAA;AAC3C,QAAA,MAAM,cAAc,GAAG,OAAO,EAAE;QAChC,IAAI,CAAC,cAAc,EAAE;YACnB;QACF;;AAGA,QAAA,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC;AAEA,IAAA,SAAS,qBAAqB,GAAA;AAC5B,QAAA,MAAM,WAAW,GAAG,IAAI,IAAI;QAE5B,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC;QACzE;;AAGA,QAAA,MAAM,MAAM,GAAwB;AAClC,YAAA,OAAO,EAAE,WAAW;YACpB,cAAc,EAAE,OAAO,CAAC,aAAa;YACrC,gBAAgB;YAChB,QAAQ;YACR,OAAO;YACP,SAAS,EAAE,SAAS,EAAE;AACtB,YAAA,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE,MAAM,EAAE;YAChB,IAAI,EAAE,IAAI,EAAE;YACZ,KAAK,EAAE,KAAK,EAAE;AACd,YAAA,mBAAmB,EAAE,IAAI;AACzB,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,YAAY,EAAE,kBAAkB;YAChC,OAAO,EAAE,CAAC,MAAmB,KAAK,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;AACzD,YAAA,eAAe,EAAE,cAAc,IAAI,IAAI,OAAO;AAC9C,YAAA,WAAW,EAAE,MAAM;YACnB,QAAQ,EAAE,QAAQ,IAAI;YACtB,SAAS,EAAE,SAAS,EAAE;YACtB,SAAS,EAAE,SAAS,EAAE;SACvB;QAED,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACpC;IAEA,SAAS,OAAO,CAAC,OAAyC,EAAA;AACxD,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;IACnB;IAEA,SAAS,WAAW,CAAC,UAAmB,EAAA;AACtC,QAAA,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;AAExB,QAAA,IAAI,UAAU,IAAI,IAAI,EAAE,EAAE;AACxB,YAAA,IAAI,EAAE;QACR;IACF;IAEA,SAAS,OAAO,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;IACtB;IAEA,SAAS,YAAY,CAAC,YAA8B,EAAA;AAClD,QAAA,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;IAC7B;IAEA,SAAS,SAAS,CAAC,SAAoB,EAAA;AACrC,QAAA,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;IACvB;IAEA,SAAS,UAAU,CAAC,UAAa,EAAA;AAC/B,QAAA,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACzB;IAEA,SAAS,YAAY,CAAC,YAAyC,EAAA;AAC7D,QAAA,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;IAC7B;AAEA;;;AAGG;IACH,SAAS,qBAAqB,CAAC,MAAe,EAAA;AAC5C,QAAA,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC;QAE9B,IAAI,MAAM,EAAE;;YAEV,WAAW,CAAC,KAAK,EAAE;YACnB;QACF;QAEA,IAAI,IAAI,EAAE,IAAI,QAAQ,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;;AAE1C,YAAA,WAAW,CAAC,UAAU,CAAC,MAAK;;AAE1B,gBAAA,IAAI,CAAC,qBAAqB,EAAE,EAAE;AAC5B,oBAAA,IAAI,EAAE;gBACR;YACF,CAAC,EAAE,EAAE,CAAC;QACR;IACF;IAEA,OAAO;AACL,QAAA,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC;AACvC,QAAA,SAAS,EAAE,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC;AACtD,QAAA,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC;AAC7C,QAAA,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC;AACnD,QAAA,OAAO,EAAE,gBAAgB,CAAC,OAAO,EAAE,YAAY,CAAC;QAChD,IAAI;QACJ,UAAU;QACV,IAAI;QACJ,IAAI;QACJ,MAAM;QACN,WAAW;QACX,OAAO;QACP,OAAO;QACP,YAAY;QACZ,SAAS;QACT,UAAU;QACV,YAAY;QACZ,qBAAqB;QACrB,IAAI;QACJ,SAAS,EAAE,gBAAgB,CAAC,SAAS,EAAE,cAAc,EAAE,YAAY,CAAC;KACpC;AACpC,CAAC;AAGG,SAAU,sBAAsB,CACpC,OAA+B,EAAA;AAE/B,IAAA,OAAO,uBAAuB,CAAC,OAAO,CAAmC;AAC3E;;ACvlBO,MAAM,CAAC,iBAAiB,EAAE,OAAO,EAAE,eAAe,EAAE,gBAAgB,CAAC,GAAG,eAAe,CAC5F,SAAS,EACT,CAAC,EAAgB,KAAI;AACnB,IAAA,MAAM,OAAO,GAAG,gBAAgB,EAAE;AAClC,IAAA,MAAM,OAAO,GAAG,aAAa,EAAE;AAC/B,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACjE,IAAA,MAAM,WAAW,GAAG,sBAAsB,EAAE;AAC5C,IAAA,MAAM,UAAU,GAAG,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;;AAItE,IAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,WAAW,EAAE,EAAE,UAAU,EAAE,IAAI,SAAS,iFAAC;AAC3E,IAAA,YAAY,CAAC;AACX,QAAA,WAAW,EAAE,UAAU;AACxB,KAAA,CAAC;;;AAIF,IAAA,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,aAAa,CAAC;;AAGpD,IAAA,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;IACpC,WAAW,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,cAAc,CAAC;AAC9D,IAAA,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC;AACxC,IAAA,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;AACpE,IAAA,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;IACnE,YAAY,CAAC,OAAO,EAAE,6BAA6B,EAAE,OAAO,CAAC,YAAY,CAAC;IAC1E,YAAY,CAAC,OAAO,EAAE,6BAA6B,EAAE,OAAO,CAAC,eAAe,CAAC;IAC7E,YAAY,CAAC,OAAO,EAAE,+BAA+B,EAAE,OAAO,CAAC,cAAc,CAAC;IAC9E,YAAY,CAAC,OAAO,EAAE,gCAAgC,EAAE,OAAO,CAAC,eAAe,CAAC;;AAGhF,IAAA,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,cAAc,CAAC;AACjD,IAAA,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,cAAc,CAAC;AACjD,IAAA,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC;;AAGvC,IAAA,MAAM,aAAa,GAAG,IAAI,OAAO,EAAe;;AAGhD,IAAA,SAAS,cAAc,GAAA;AACrB,QAAA,WAAW,EAAE,EAAE,qBAAqB,CAAC,IAAI,CAAC;IAC5C;AAEA,IAAA,SAAS,cAAc,GAAA;AACrB,QAAA,WAAW,EAAE,EAAE,qBAAqB,CAAC,KAAK,CAAC;IAC7C;IAEA,SAAS,SAAS,CAAC,KAAoB,EAAA;;;;AAIrC,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAC1B,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,eAAe,EAAE;YACvB,aAAa,CAAC,UAAU,CAAC;YACzB;QACF;;;QAIA,IAAI,UAAU,EAAE,EAAE;YAChB;QACF;AAEA,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,EAAE;QAC1C,IAAI,CAAC,SAAS,EAAE;YACd;QACF;QAEA,MAAM,KAAK,GAAG,CAAC,cAAc,EAAE,KAAK,IAAI,KAAK,MAAM,KAAK;;;;QAKxD,IAAI,WAAW,GAAG,KAAK;AAEvB,QAAA,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;;AAEjC,YAAA,WAAW,GAAG,KAAK,CAAC,GAAG,MAAM,KAAK,GAAG,YAAY,GAAG,WAAW,CAAC;QAClE;AAAO,aAAA,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;;AAEvC,YAAA,WAAW,GAAG,KAAK,CAAC,GAAG,MAAM,KAAK,GAAG,WAAW,GAAG,YAAY,CAAC;QAClE;QAEA,IAAI,WAAW,EAAE;YACf,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,eAAe,EAAE;AACvB,YAAA,WAAW,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;QACjC;IACF;IAEA,SAAS,aAAa,CAAC,MAAmB,EAAA;AACxC,QAAA,WAAW,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;AAC1B,QAAA,UAAU,EAAE,EAAE,aAAa,CAAC,MAAM,CAAC;IACrC;IAEA,OAAO;QACL,aAAa;QACb,aAAa;KACS;AAC1B,CAAC;;AC+CI,MAAM,CACX,2BAA2B,EAC3B,iBAAiB,EACjB,yBAAyB,EACzB,0BAA0B,EAC3B,GAAG,eAAe,CACjB,mBAAmB,EACnB,CAAI,EACF,QAAQ,EAAE,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,EACnC,IAAI,EAAE,KAAK,GAAG,MAAM,CAAmC,SAAS,CAAC,EACjE,SAAS,EAAE,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC,EAC7C,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,EAC3B,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAC1B,SAAS,EAAE,UAAU,GACK,KAAI;AAC9B,IAAA,MAAM,OAAO,GAAG,gBAAgB,EAAE;AAClC,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACjC,IAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACjD,MAAM,UAAU,GAAG,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACtD,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACzC,IAAA,MAAM,WAAW,GAAG,iBAAiB,EAAE;;AAGvC,IAAA,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC;AAC9B,IAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC;AACtC,IAAA,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC;AACxC,IAAA,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC;AAC9B,IAAA,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC;IAClC,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC;AAEhD,IAAA,MAAM,OAAO,GAAG,MAAM,CAAuB,IAAI,8EAAC;AAClD,IAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,KAAK,2EAAC;AACzD,IAAA,MAAM,UAAU,GAAG,MAAM,CAAc,SAAS,iFAAC;;AAGjD,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,KAAK,yFAAC;AACxC,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,KAAK,yFAAC;AACxC,IAAA,MAAM,oBAAoB,GAAG,QAAQ,CAAC,MAAM,kBAAkB,EAAE,IAAI,kBAAkB,EAAE,2FAAC;;;;IAKzF,MAAM,WAAW,GAAG,iBAAiB,CAAC;AACpC,QAAA,iBAAiB,EAAE,oBAAoB;AACvC,QAAA,KAAK,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC;AAC1B,QAAA,sBAAsB,EAAE,IAAI;AAC7B,KAAA,CAAC;;;;;;;IAQF,MAAM,CAAC,MAAK;AACV,QAAA,IAAI,CAAC,IAAI,EAAE,EAAE;YACX,WAAW,CAAC,KAAK,EAAE;AACnB,YAAA,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,YAAA,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B;AACF,IAAA,CAAC,CAAC;;AAGF,IAAA,UAAU;AACR,UAAE,aAAa,CAAC,IAAI,CAAC,sBAAsB,EAAE;SAC5C,SAAS,CAAC,cAAc,IAAG;;AAE1B,QAAA,IAAI,cAAc,KAAK,OAAO,CAAC,aAAa,EAAE;YAC5C;QACF;;;;AAKA,QAAA,IAAI,WAAW,CAAC,QAAQ,EAAE,EAAE;YAC1B;QACF;QAEA,IAAI,CAAC,OAAO,CAAC;AACf,IAAA,CAAC,CAAC;;AAGJ,IAAA,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,CAAC;AAC7C,IAAA,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,CAAC;AAC3C,IAAA,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC;;AAGvC,IAAA,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC;AACnC,IAAA,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC;AAC5C,IAAA,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,kBAAkB,CAAC;AACrD,IAAA,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,cAAc,CAAC;;IAGjD,SAAS,OAAO,CAAC,KAAiB,EAAA;AAChC,QAAA,IAAI,QAAQ,IAAI,EAAE;YAChB;QACF;QACA,MAAM,CAAC,KAAK,CAAC;IACf;IAEA,SAAS,MAAM,CAAC,KAAiB,EAAA;;AAE/B,QAAA,MAAM,MAAM,GAAgB,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG,UAAU,GAAG,OAAO;;QAGrE,IAAI,IAAI,EAAE,EAAE;YACV,IAAI,CAAC,MAAM,CAAC;QACd;aAAO;YACL,IAAI,CAAC,MAAM,CAAC;QACd;IACF;IAEA,SAAS,IAAI,CAAC,MAAA,GAAsB,SAAS,EAAA;;AAE3C,QAAA,IAAI,QAAQ,IAAI,EAAE;YAChB;QACF;;AAGA,QAAA,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;;AAGtB,QAAA,IAAI,CAAC,OAAO,EAAE,EAAE;AACd,YAAA,qBAAqB,EAAE;QACzB;;AAGA,QAAA,OAAO,EAAE,EAAE,IAAI,EAAE;IACnB;IAEA,SAAS,IAAI,CAAC,MAAA,GAAsB,SAAS,EAAA;;QAE3C,IAAI,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;YAC3B;QACF;;QAGA,WAAW,CAAC,KAAK,EAAE;;QAGnB,OAAO,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B;AAEA,IAAA,SAAS,qBAAqB,GAAA;AAC5B,QAAA,MAAM,WAAW,GAAG,IAAI,IAAI;QAE5B,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC;QACzE;;;;;;;AAQA,QAAA,MAAM,MAAM,GAAwB;AAClC,YAAA,OAAO,EAAE,WAAW;YACpB,cAAc,EAAE,OAAO,CAAC,aAAa;YACrC,QAAQ;YACR,SAAS,EAAE,SAAS,EAAE;YACtB,SAAS;YACT,MAAM,EAAE,MAAM,EAAE;YAChB,IAAI,EAAE,IAAI,EAAE;AACZ,YAAA,mBAAmB,EAAE,IAAI;AACzB,YAAA,aAAa,EAAE,KAAK;AACpB,YAAA,YAAY,EAAE,KAAK;YACnB,gBAAgB;SACjB;QAED,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACpC;IAEA,SAAS,cAAc,CAAC,KAAY,EAAA;AAClC,QAAA,IAAI,KAAK,YAAY,aAAa,KAAK,KAAK,EAAE;YAC5C;QACF;QAEA,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,SAAS;AACnE,QAAA,MAAM,KAAK,GAAG,SAAS,KAAK,KAAK;AAEjC,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,KAAK,YAAY;AAC/C,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,KAAK,WAAW;AAE7C,QAAA,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK,MAAM,WAAW,IAAI,KAAK,CAAC,EAAE;YACtD,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,UAAU,CAAC;QAClB;IACF;IAEA,SAAS,kBAAkB,CAAC,KAAY,EAAA;AACtC,QAAA,IAAI,KAAK,YAAY,YAAY,KAAK,KAAK,EAAE;YAC3C;QACF;;;AAIA,QAAA,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE;YACjC;QACF;AAEA,QAAA,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;;QAE5B,WAAW,CAAC,KAAK,EAAE;QAEnB,IAAI,CAAC,OAAO,CAAC;IACf;IAEA,SAAS,cAAc,CAAC,KAAY,EAAA;AAClC,QAAA,IAAI,KAAK,YAAY,YAAY,KAAK,KAAK,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE;YAC5E;QACF;AAEA,QAAA,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;AAE7B,QAAA,MAAM,cAAc,GAAG,OAAO,EAAE;;AAGhC,QAAA,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE;YAC9B;QACF;QAEA,MAAM,cAAc,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AACtD,QAAA,MAAM,OAAO,GACX,CAAC,CAAC,cAAc;YAChB,WAAW,CAAC,KAAK,CAAC;AAChB,gBAAA,WAAW,EAAE,OAAO,CAAC,aAAa,CAAC,qBAAqB,EAAE;AAC1D,gBAAA,UAAU,EAAE,cAAc,CAAC,qBAAqB,EAAE;AAClD,gBAAA,SAAS,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE;AAClD,aAAA,CAAC;QAEJ,IAAI,CAAC,OAAO,EAAE;;;AAGZ,YAAA,WAAW,CAAC,UAAU,CAAC,MAAK;AAC1B,gBAAA,IAAI,CAAC,oBAAoB,EAAE,EAAE;oBAC3B,IAAI,CAAC,OAAO,CAAC;gBACf;YACF,CAAC,EAAE,EAAE,CAAC;QACR;IACF;IAEA,SAAS,WAAW,CAAC,UAAmB,EAAA;AACtC,QAAA,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;AAExB,QAAA,IAAI,UAAU,IAAI,IAAI,EAAE,EAAE;AACxB,YAAA,IAAI,EAAE;QACR;IACF;IAEA,SAAS,OAAO,CAAC,OAAyC,EAAA;AACxD,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;IACnB;IAEA,SAAS,YAAY,CAAC,YAA8B,EAAA;AAClD,QAAA,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;IAC7B;IAEA,SAAS,SAAS,CAAC,SAAoB,EAAA;AACrC,QAAA,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;IACvB;IAEA,SAAS,OAAO,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;IACtB;IAEA,SAAS,YAAY,CAAC,YAAyC,EAAA;AAC7D,QAAA,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;IAC7B;IAEA,SAAS,KAAK,CAAC,MAAmB,EAAA;AAChC,QAAA,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IAC/E;IAEA,SAAS,qBAAqB,CAAC,MAAe,EAAA;AAC5C,QAAA,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC;;;QAI9B,IAAI,MAAM,EAAE;YACV,WAAW,CAAC,KAAK,EAAE;QACrB;IACF;IAEA,OAAO;AACL,QAAA,SAAS,EAAE,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC;AACtD,QAAA,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC;AAC7C,QAAA,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC;AACnD,QAAA,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC;AACvC,QAAA,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC;QACvC,IAAI;QACJ,UAAU;QACV,IAAI;QACJ,IAAI;QACJ,MAAM;QACN,WAAW;QACX,OAAO;QACP,OAAO;QACP,YAAY;QACZ,SAAS;QACT,YAAY;QACZ,KAAK;QACL,qBAAqB;QACrB,SAAS,EAAE,gBAAgB,CAAC,SAAS,EAAE,cAAc,EAAE,YAAY,CAAC;KACpC;AACpC,CAAC;;MC5bU,iBAAiB,CAAA;AAd9B,IAAA,WAAA,GAAA;AAeE;;AAEG;QACM,IAAA,CAAA,IAAI,GAAG,KAAK,CAAuB,SAAS,4EACnD,KAAK,EAAE,mBAAmB,EAAA,CAC1B;AAEF;;;AAGG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwB,KAAK,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,CAAA,EACpD,KAAK,EAAE,2BAA2B;YAClC,SAAS,EAAE,gBAAgB,EAAA,CAC3B;AAEF;;;AAGG;QACM,IAAA,CAAA,SAAS,GAAG,KAAK,CAAmB,aAAa,iFACxD,KAAK,EAAE,4BAA4B,EAAA,CACnC;AAEF;;;;AAIG;AACM,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAA4B,CAAC,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,CAAA,EAClD,KAAK,EAAE,yBAAyB;YAChC,SAAS,EAAE,YAAY,EAAA,CACvB;AAEF;;;;AAIG;AACM,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAwB,IAAI,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,MAAA,EAAA,8BAAA,EAAA,CAAA,EAC/C,KAAK,EAAE,uBAAuB;YAC9B,SAAS,EAAE,UAAU,EAAA,CACrB;AAEF;;;AAGG;QACM,IAAA,CAAA,SAAS,GAAG,KAAK,CAA8B,IAAI,iFAC1D,KAAK,EAAE,4BAA4B,EAAA,CACnC;AAEF;;AAEG;QACc,IAAA,CAAA,KAAK,GAAG,iBAAiB,CAAI;YAC5C,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,SAAS;AAC1B,SAAA,CAAC;AA+BH,IAAA;AA7BC;;AAEG;IACH,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;IACnB;AAEA;;AAEG;IACH,IAAI,CAAC,SAAsB,SAAS,EAAA;AAClC,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;IACzB;AAEA;;;AAGG;AACH,IAAA,MAAM,CAAC,KAAiB,EAAA;AACtB,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;IAC1B;AAEA;;;AAGG;IACH,KAAK,CAAC,SAAsB,SAAS,EAAA;AACnC,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;IAC1B;+GA7FW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,2BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAXjB;;;;;AAKT,YAAA,0BAA0B,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;;AAG9C,YAAA,EAAE,OAAO,EAAE,wBAAwB,EAAE,WAAW,EAAE,2BAA2B,EAAE;AAChF,SAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAEU,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAd7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;AAC/B,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,SAAS,EAAE;;;;;AAKT,wBAAA,0BAA0B,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;;AAG9C,wBAAA,EAAE,OAAO,EAAE,wBAAwB,EAAE,WAAW,EAAE,2BAA2B,EAAE;AAChF,qBAAA;AACF,iBAAA;;;ACJM,MAAM,CAAC,qBAAqB,EAAE,WAAW,EAAE,mBAAmB,EAAE,oBAAoB,CAAC,GAC1F,eAAe,CACb,aAAa,EACb,CAAC,EACC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,EACxB,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,EAC5B,IAAI,GAAG,UAAU,GACA,KAAI;AACrB,IAAA,MAAM,OAAO,GAAG,gBAAgB,EAAE;AAClC,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,MAAM,UAAU,GAAG,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEtD,IAAA,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;;AAGvB,IAAA,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC;;AAGlC,IAAA,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC;AACnC,IAAA,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC;AAC5C,IAAA,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,kBAAkB,CAAC;;IAGnD,SAAS,OAAO,CAAC,KAAiB,EAAA;;QAEhC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAErF,QAAA,MAAM,MAAM,GAAgB,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG,UAAU,GAAG,OAAO;;;AAIrE,QAAA,IAAI,CAAC,OAAO,IAAI,aAAa,EAAE,EAAE;AAC/B,YAAA,UAAU,EAAE,EAAE,aAAa,CAAC,MAAM,CAAC;QACrC;IACF;IAEA,SAAS,cAAc,CAAC,KAAY,EAAA;AAClC,QAAA,IAAI,KAAK,YAAY,aAAa,KAAK,KAAK,EAAE;YAC5C;QACF;;QAGA,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAEzF,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;QAEA,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,SAAS;AACnE,QAAA,MAAM,KAAK,GAAG,SAAS,KAAK,KAAK;AAEjC,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,KAAK,WAAW;AAC7C,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,KAAK,YAAY;AAE/C,QAAA,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,MAAM,YAAY,IAAI,KAAK,CAAC,EAAE;YACtD,KAAK,CAAC,cAAc,EAAE;YAEtB,IAAI,OAAO,EAAE;AACX,gBAAA,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;;AAExB,gBAAA,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;YAC3B;QACF;IACF;AAEA,IAAA,SAAS,kBAAkB,GAAA;QACzB,UAAU,EAAE,EAAE,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;IACzD;AAEA,IAAA,OAAO,EAA6B;AACtC,CAAC;;AC9FL;;AAEG;MAMU,WAAW,CAAA;AAatB,IAAA,WAAA,GAAA;;AAXS,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwB,KAAK,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,CAAA,EACpD,KAAK,EAAE,qBAAqB;YAC5B,SAAS,EAAE,gBAAgB,EAAA,CAC3B;;AAGO,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAwB,IAAI,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,eAAA,EAAA,8BAAA,EAAA,CAAA,EACxD,KAAK,EAAE,0BAA0B;YACjC,SAAS,EAAE,gBAAgB,EAAA,CAC3B;AAGA,QAAA,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;QAC3E,kBAAkB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IACjD;+GAhBW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAX,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,WAAW,+WAFX,CAAC,oBAAoB,EAAE,EAAE,2BAA2B,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAEvD,WAAW,EAAA,UAAA,EAAA,CAAA;kBALvB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,SAAS,EAAE,CAAC,oBAAoB,EAAE,EAAE,2BAA2B,EAAE,CAAC;AACnE,iBAAA;;;ACmCM,MAAM,CACX,6BAA6B,EAC7B,mBAAmB,EACnB,2BAA2B,EAC3B,4BAA4B,EAC7B,GAAG,eAAe,CACjB,qBAAqB,EACrB,CAAC,EACC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,EACjC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,EACxB,eAAe,GACU,KAA8B;AACvD,IAAA,MAAM,OAAO,GAAG,gBAAgB,EAAE;AAClC,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC;AACpC,IAAA,MAAM,aAAa,GAAG,OAAO,EAAW;;AAGxC,IAAA,WAAW,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;;AAGjF,IAAA,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC;AAC7C,IAAA,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC;;IAG7C,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,EAAE,CAAC;AAE1C,IAAA,SAAS,MAAM,GAAA;QACb,IAAI,QAAQ,EAAE,EAAE;YACd;QACF;AAEA,QAAA,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE;AAC9B,QAAA,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AACxB,QAAA,eAAe,GAAG,WAAW,CAAC;AAC9B,QAAA,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC;IACjC;IAEA,OAAO;QACL,OAAO;AACP,QAAA,aAAa,EAAE,aAAa,CAAC,YAAY,EAAE;QAC3C,MAAM;KAC4B;AACtC,CAAC;;ACpFH;;AAEG;MAMU,mBAAmB,CAAA;AAkB9B,IAAA,WAAA,GAAA;;AAhBS,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAwB,KAAK,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,SAAA,EAAA,8BAAA,EAAA,CAAA,EACnD,KAAK,EAAE,4BAA4B;YACnC,SAAS,EAAE,gBAAgB,EAAA,CAC3B;;QAGO,IAAA,CAAA,aAAa,GAAG,MAAM,CAAU;AACvC,YAAA,KAAK,EAAE,kCAAkC;AAC1C,SAAA,CAAC;;AAGO,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwB,KAAK,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,CAAA,EACpD,KAAK,EAAE,6BAA6B;YACpC,SAAS,EAAE,gBAAgB,EAAA,CAC3B;AAGA,QAAA,mBAAmB,CAAC;YAClB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACvB,YAAA,eAAe,EAAE,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;AACzD,SAAA,CAAC;QACF,kBAAkB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IACjD;+GAzBW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,qbAFnB,CAAC,4BAA4B,EAAE,EAAE,2BAA2B,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAE/D,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAL/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,uBAAuB;AACjC,oBAAA,QAAQ,EAAE,qBAAqB;AAC/B,oBAAA,SAAS,EAAE,CAAC,4BAA4B,EAAE,EAAE,2BAA2B,EAAE,CAAC;AAC3E,iBAAA;;;ACsBM,MAAM,CACX,+BAA+B,EAC/B,qBAAqB,EACrB,6BAA6B,EAC7B,8BAA8B,EAC/B,GAAG,eAAe,CACjB,uBAAuB,EACvB,CAAC,EACC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,EAC5B,aAAa,GACc,KAAgC;AAC3D,IAAA,MAAM,OAAO,GAAG,gBAAgB,EAAE;AAClC,IAAA,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;AAChC,IAAA,MAAM,WAAW,GAAG,OAAO,EAAU;;AAGrC,IAAA,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;IAErC,SAAS,MAAM,CAAC,QAAgB,EAAA;AAC9B,QAAA,IAAI,KAAK,EAAE,KAAK,QAAQ,EAAE;YACxB;QACF;AAEA,QAAA,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;AACnB,QAAA,aAAa,GAAG,QAAQ,CAAC;AACzB,QAAA,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC5B;IAEA,OAAO;QACL,KAAK;AACL,QAAA,WAAW,EAAE,WAAW,CAAC,YAAY,EAAE;QACvC,MAAM;KAC8B;AACxC,CAAC;;AC1CI,MAAM,CACX,0BAA0B,EAC1B,gBAAgB,EAChB,wBAAwB,EACxB,yBAAyB,EAC1B,GAAG,eAAe,CACjB,kBAAkB,EAClB,CAAC,EAAE,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,EAAyB,KAA2B;AACpF,IAAA,MAAM,OAAO,GAAG,gBAAgB,EAAE;AAClC,IAAA,MAAM,UAAU,GAAG,6BAA6B,EAAE;;AAGlD,IAAA,WAAW,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;;AAG9E,IAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,8EAAC;;AAGjE,IAAA,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC;AAC7C,IAAA,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC;;AAG7C,IAAA,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAK;QAC9B,IAAI,QAAQ,EAAE,EAAE;YACd;QACF;AACA,QAAA,UAAU,EAAE,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;AAC/B,IAAA,CAAC,CAAC;IAEF,OAAO;QACL,OAAO;KACwB;AACnC,CAAC;;ACnDH;;;AAGG;MAKU,oBAAoB,CAAA;AAC/B,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,OAAO,GAAG,gBAAgB,EAAE;QAClC,MAAM,aAAa,GAAG,2BAA2B,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACrE,MAAM,UAAU,GAAG,wBAAwB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAE/D,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAE9F,QAAA,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC;IAC/C;+GATW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAJhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;AAClC,oBAAA,QAAQ,EAAE,sBAAsB;AACjC,iBAAA;;;ACPD;;AAEG;MAMU,qBAAqB,CAAA;AAWhC,IAAA,WAAA,GAAA;;QATS,IAAA,CAAA,KAAK,GAAG,KAAK,CAAgB,IAAI,6EACxC,KAAK,EAAE,4BAA4B,EAAA,CACnC;;QAGO,IAAA,CAAA,WAAW,GAAG,MAAM,CAAS;AACpC,YAAA,KAAK,EAAE,kCAAkC;AAC1C,SAAA,CAAC;AAGA,QAAA,qBAAqB,CAAC;YACpB,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,YAAA,aAAa,EAAE,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;AACrD,SAAA,CAAC;IACJ;+GAhBW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,kCAAA,EAAA,EAAA,SAAA,EAFrB,CAAC,8BAA8B,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAElC,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBALjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,yBAAyB;AACnC,oBAAA,QAAQ,EAAE,uBAAuB;AACjC,oBAAA,SAAS,EAAE,CAAC,8BAA8B,EAAE,CAAC;AAC9C,iBAAA;;;ACRD;;AAEG;MAMU,gBAAgB,CAAA;AAY3B,IAAA,WAAA,GAAA;;QAVS,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,4EAC7B,KAAK,EAAE,uBAAuB,EAAA,CAC9B;;AAGO,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwB,KAAK,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,CAAA,EACpD,KAAK,EAAE,0BAA0B;YACjC,SAAS,EAAE,gBAAgB,EAAA,CAC3B;AAGA,QAAA,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChE,kBAAkB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IACjD;+GAfW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,qWAFhB,CAAC,yBAAyB,EAAE,EAAE,2BAA2B,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAE5D,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAL5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,SAAS,EAAE,CAAC,yBAAyB,EAAE,EAAE,2BAA2B,EAAE,CAAC;AACxE,iBAAA;;;ACMD;;AAEG;MAMU,cAAc,CAAA;AAL3B,IAAA,WAAA,GAAA;AAME;;AAEG;QACc,IAAA,CAAA,MAAM,GAAG,gBAAgB,EAAE;AAE5C;;AAEG;QACM,IAAA,CAAA,IAAI,GAAG,KAAK,CAAuB,SAAS,4EACnD,KAAK,EAAE,gBAAgB,EAAA,CACvB;AAEF;;;AAGG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwB,KAAK,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,CAAA,EACpD,KAAK,EAAE,wBAAwB;YAC/B,SAAS,EAAE,gBAAgB,EAAA,CAC3B;AAEF;;;AAGG;AACM,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAmB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,WAAA,EAAA,8BAAA,EAAA,CAAA,EAChE,KAAK,EAAE,yBAAyB,GAChC;AAEF;;;;AAIG;QACM,IAAA,CAAA,MAAM,GAAG,KAAK,CAA4B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,CAAA,EACnE,KAAK,EAAE,sBAAsB;YAC7B,SAAS,EAAE,YAAY,EAAA,CACvB;AAEF;;;;AAIG;QACM,IAAA,CAAA,IAAI,GAAG,KAAK,CAAwB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,MAAA,EAAA,8BAAA,EAAA,CAAA,EAC3D,KAAK,EAAE,oBAAoB;YAC3B,SAAS,EAAE,UAAU,EAAA,CACrB;AAEF;;;;AAIG;QACM,IAAA,CAAA,KAAK,GAAG,KAAK,CAA0B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,OAAA,EAAA,8BAAA,EAAA,CAAA,EAC/D,KAAK,EAAE,qBAAqB;YAC5B,SAAS,EAAE,WAAW,EAAA,CACtB;AAEF;;;AAGG;AACM,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAA8B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,WAAA,EAAA,8BAAA,EAAA,CAAA,EAC3E,KAAK,EAAE,yBAAyB,GAChC;AAEF;;;AAGG;AACM,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAmC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,8BAAA,EAAA,CAAA,EAC1F,KAAK,EAAE,8BAA8B,GACrC;AAEF;;;;;AAKG;QACM,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAsB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,CAAA,EACjE,KAAK,EAAE,wBAAwB;YAC/B,SAAS,EAAE,eAAe,EAAA,CAC1B;AAEF;;AAEG;QACM,IAAA,CAAA,OAAO,GAAG,KAAK,CAAI,SAAS,+EACnC,KAAK,EAAE,uBAAuB,EAAA,CAC9B;AAEF;;;AAGG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAuB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,CAAA,EAClE,KAAK,EAAE,4BAA4B,GACnC;AAEF;;;AAGG;QACM,IAAA,CAAA,SAAS,GAAG,KAAK,CAAsB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,WAAA,EAAA,8BAAA,EAAA,CAAA,EACnE,KAAK,EAAE,yBAAyB;YAChC,SAAS,EAAE,eAAe,EAAA,CAC1B;AAEF;;;AAGG;QACM,IAAA,CAAA,SAAS,GAAG,KAAK,CAAsB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,WAAA,EAAA,8BAAA,EAAA,CAAA,EACnE,KAAK,EAAE,yBAAyB;YAChC,SAAS,EAAE,eAAe,EAAA,CAC1B;AAEF;;AAEG;QACc,IAAA,CAAA,KAAK,GAAG,cAAc,CAAI;YACzC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAoB;YAClC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;AAC1B,SAAA,CAAC;AAyBH,IAAA;AAvBC;;AAEG;IACH,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;IACnB;AAEA;;;;AAIG;AACH,IAAA,IAAI,CAAC,MAAoB,EAAA;AACvB,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;IACzB;AAEA;;;AAGG;AACH,IAAA,MAAM,CAAC,KAAiB,EAAA;AACtB,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;IAC1B;+GAjKW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAFd,CAAC,uBAAuB,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAE3B,cAAc,EAAA,UAAA,EAAA,CAAA;kBAL1B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,SAAS,EAAE,CAAC,uBAAuB,EAAE,CAAC;AACvC,iBAAA;;;AChBD;;AAEG;MAYU,OAAO,CAAA;AAclB,IAAA,WAAA,GAAA;QAbiB,IAAA,CAAA,MAAM,GAAG,gBAAgB,EAAE;AAE5C;;;AAGG;QACM,IAAA,CAAA,IAAI,GAAG,KAAK,CAAwB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,MAAA,EAAA,8BAAA,EAAA,CAAA,EAC3D,KAAK,EAAE,aAAa;YACpB,SAAS,EAAE,gBAAgB,EAAA,CAC3B;QAEe,IAAA,CAAA,KAAK,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AAGnD,QAAA,mBAAmB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1D;;AAGA,IAAA,aAAa,CAAC,MAAmB,EAAA;AAC/B,QAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC;IAClC;+GArBW,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAP,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EARP;;AAET,YAAA,4BAA4B,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAChD,YAAA,gBAAgB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACpC,YAAA,qBAAqB,EAAE;AACvB,YAAA,gCAAgC,EAAE;AACnC,SAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAEU,OAAO,EAAA,UAAA,EAAA,CAAA;kBAXnB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,WAAW;AACrB,oBAAA,QAAQ,EAAE,SAAS;AACnB,oBAAA,SAAS,EAAE;;AAET,wBAAA,4BAA4B,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAChD,wBAAA,gBAAgB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACpC,wBAAA,qBAAqB,EAAE;AACvB,wBAAA,gCAAgC,EAAE;AACnC,qBAAA;AACF,iBAAA;;;ACtBD;;AAEG;;;;"}
1
+ {"version":3,"file":"ng-primitives-menu.mjs","sources":["../../../../packages/ng-primitives/menu/src/config/menu-config.ts","../../../../packages/ng-primitives/menu/src/menu-trigger/menu-trigger-state.ts","../../../../packages/ng-primitives/menu/src/menu/menu-state.ts","../../../../packages/ng-primitives/menu/src/submenu-trigger/submenu-trigger-state.ts","../../../../packages/ng-primitives/menu/src/submenu-trigger/submenu-trigger.ts","../../../../packages/ng-primitives/menu/src/menu-item/menu-item-state.ts","../../../../packages/ng-primitives/menu/src/menu-item/menu-item.ts","../../../../packages/ng-primitives/menu/src/menu-item-checkbox/menu-item-checkbox-state.ts","../../../../packages/ng-primitives/menu/src/menu-item-checkbox/menu-item-checkbox.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio-group/menu-item-radio-group-state.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio/menu-item-radio-state.ts","../../../../packages/ng-primitives/menu/src/menu-item-indicator/menu-item-indicator.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio-group/menu-item-radio-group.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio/menu-item-radio.ts","../../../../packages/ng-primitives/menu/src/menu-trigger/menu-trigger.ts","../../../../packages/ng-primitives/menu/src/menu/menu.ts","../../../../packages/ng-primitives/menu/src/ng-primitives-menu.ts"],"sourcesContent":["import { InjectionToken, Provider, inject } from '@angular/core';\nimport { NgpFlip, NgpOffset, NgpShift } from 'ng-primitives/portal';\nimport type { NgpMenuPlacement } from '../menu-trigger/menu-trigger';\n\nexport type NgpMenuTriggerType = 'click' | 'hover' | 'focus' | 'enter' | 'arrowkey';\n\nexport interface NgpMenuConfig {\n /**\n * Define the offset of the menu relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 4\n */\n offset: NgpOffset;\n\n /**\n * Define the placement of the menu relative to the trigger.\n * @default 'bottom-start'\n */\n placement: NgpMenuPlacement;\n\n /**\n * Define whether the menu should flip when there is not enough space for the menu.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n flip: NgpFlip;\n\n /**\n * Define the container element or selector in to which the menu should be attached.\n * @default 'body'\n */\n container: HTMLElement | string | null;\n\n /**\n * Defines how the menu behaves when the window is scrolled.\n * @default scroll\n */\n scrollBehavior: 'reposition' | 'block' | 'close';\n\n /**\n * Configure shift behavior to keep the menu in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n shift: NgpShift;\n\n /**\n * Whether focus should wrap around when reaching the end of the menu.\n * @default true\n */\n wrap: boolean;\n\n /**\n * Cooldown duration in milliseconds.\n * When moving from one menu to another within this duration,\n * the showDelay is skipped for the new menu.\n * @default 0\n */\n cooldown: number;\n\n /**\n * Define which trigger types are enabled for the menu.\n * @default ['click']\n */\n triggers: NgpMenuTriggerType[];\n\n /**\n * Define the delay before the menu is displayed (hover/focus triggers).\n * @default 0\n */\n showDelay: number;\n\n /**\n * Define the delay before the menu is hidden (hover/focus triggers).\n * @default 0\n */\n hideDelay: number;\n}\n\nexport const defaultMenuConfig: NgpMenuConfig = {\n offset: 4,\n placement: 'bottom-start',\n flip: true,\n container: 'body',\n scrollBehavior: 'block',\n shift: undefined,\n wrap: true,\n cooldown: 0,\n triggers: ['click'],\n showDelay: 0,\n hideDelay: 0,\n};\n\nexport const NgpMenuConfigToken = new InjectionToken<NgpMenuConfig>('NgpMenuConfigToken');\n\n/**\n * Provide the default Menu configuration\n * @param config The Menu configuration\n * @returns The provider\n */\nexport function provideMenuConfig(config: Partial<NgpMenuConfig>): Provider[] {\n return [\n {\n provide: NgpMenuConfigToken,\n useValue: { ...defaultMenuConfig, ...config },\n },\n ];\n}\n\n/**\n * Inject the Menu configuration\n * @returns The global Menu configuration\n */\nexport function injectMenuConfig(): NgpMenuConfig {\n return inject(NgpMenuConfigToken, { optional: true }) ?? defaultMenuConfig;\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport {\n computed,\n effect,\n inject,\n Injector,\n signal,\n Signal,\n ViewContainerRef,\n WritableSignal,\n} from '@angular/core';\nimport { createHoverBridge, injectElementRef } from 'ng-primitives/internal';\nimport {\n createOverlay,\n NgpFlip,\n NgpOffset,\n NgpOverlay,\n NgpOverlayConfig,\n NgpOverlayContent,\n NgpShift,\n} from 'ng-primitives/portal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n deprecatedSetter,\n listener,\n StateInjectionOptions,\n} from 'ng-primitives/state';\nimport { injectDisposables } from 'ng-primitives/utils';\nimport { NgpMenuTriggerType } from '../config/menu-config';\nimport { NgpMenuPlacement } from './menu-trigger';\n\nexport interface NgpMenuTriggerState<T = unknown> {\n /**\n * The menu template or component.\n */\n readonly menu: WritableSignal<NgpOverlayContent<any> | undefined>;\n /**\n * The computed placement of the menu.\n */\n readonly placement: WritableSignal<NgpMenuPlacement>;\n /**\n * Whether the menu is open.\n */\n readonly open: Signal<boolean>;\n /**\n * The offset of the menu.\n */\n readonly offset: WritableSignal<NgpOffset>;\n\n /**\n * The disabled state of the trigger.\n */\n readonly disabled: WritableSignal<boolean>;\n\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip: WritableSignal<NgpFlip>;\n\n /**\n * The container in which the menu should be attached.\n * @default document.body\n */\n readonly container: WritableSignal<HTMLElement | string | null>;\n\n /**\n * The context provided to the menu.\n */\n readonly context: WritableSignal<T>;\n\n /**\n * The focus origin that was used to open the menu.\n * @internal\n */\n readonly openOrigin: Signal<FocusOrigin>;\n\n /**\n * Set whether the trigger is disabled.\n * @param isDisabled - Whether the trigger is disabled\n */\n setDisabled(isDisabled: boolean): void;\n\n /**\n * Set whether the menu should flip when there is not enough space.\n * @param shouldFlip - Whether the menu should flip\n */\n setFlip(shouldFlip: NgpFlip): void;\n\n /**\n * Set the placement of the menu.\n * @param placement - The new placement\n */\n setPlacement(placement: NgpMenuPlacement): void;\n\n /**\n * Set the offset of the menu.\n * @param offset - The new offset\n */\n setOffset(offset: NgpOffset): void;\n\n /**\n * Set the context provided to the menu.\n * @param context - The new context\n */\n setContext(context: T): void;\n\n /**\n * Set the container in which the menu should be attached. Takes effect the\n * next time the menu is opened; it does not move a menu that is already open.\n * @param container - The new container\n */\n setContainer(container: HTMLElement | string | null): void;\n\n /**\n * Show the menu.\n * @param origin - The focus origin\n */\n show(origin?: FocusOrigin): void;\n /**\n * Hide the menu.\n * @param origin - The focus origin\n * @internal\n */\n hide(origin?: FocusOrigin): void;\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void;\n\n /**\n * Set the menu content.\n * @param menu - The new menu\n */\n setMenu(menu: NgpOverlayContent<any>): void;\n\n /**\n * Set whether the pointer is over the menu content.\n * @param isOver - Whether the pointer is over the content\n * @internal\n */\n setPointerOverContent(isOver: boolean): void;\n}\n\nexport interface NgpMenuTriggerProps<T = unknown> {\n /**\n * Whether the trigger is disabled.\n */\n readonly disabled?: Signal<boolean>;\n /**\n * The menu template or component.\n */\n readonly menu?: Signal<NgpOverlayContent<T> | undefined>;\n /**\n * The placement of the menu.\n */\n readonly placement?: Signal<NgpMenuPlacement>;\n /**\n * The offset of the menu.\n */\n readonly offset?: Signal<NgpOffset>;\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip?: Signal<NgpFlip>;\n /**\n * The container in which the menu should be attached.\n */\n readonly container?: Signal<HTMLElement | string | null>;\n\n /**\n * Configure shift behavior to keep the menu in view.\n */\n readonly shift?: Signal<NgpShift>;\n\n /**\n * How the menu behaves when the window is scrolled.\n */\n readonly scrollBehavior?: Signal<'reposition' | 'block' | 'close'>;\n /**\n * Context to provide to the menu.\n */\n readonly context?: Signal<T>;\n /**\n * Cooldown duration in milliseconds.\n */\n readonly cooldown?: Signal<number>;\n\n /**\n * Which trigger types are enabled.\n */\n readonly triggers?: Signal<NgpMenuTriggerType[]>;\n\n /**\n * The delay before showing the menu.\n */\n readonly showDelay?: Signal<number>;\n\n /**\n * The delay before hiding the menu.\n */\n readonly hideDelay?: Signal<number>;\n}\n\nexport const [\n NgpMenuTriggerStateToken,\n ngpMenuTrigger,\n _injectMenuTriggerState,\n provideMenuTriggerState,\n] = createPrimitive(\n 'NgpMenuTrigger',\n <T>({\n disabled: _disabled = signal(false),\n menu: _menu = signal<NgpOverlayContent<T> | undefined>(undefined),\n placement: _placement = signal('bottom-start' as NgpMenuPlacement),\n offset: _offset = signal(4),\n flip: _flip = signal(true),\n shift: _shift = signal(undefined),\n context: _context = signal<T>(undefined as T),\n container: _container,\n scrollBehavior,\n cooldown,\n triggers = signal(['click'] as NgpMenuTriggerType[]),\n showDelay = signal(0),\n hideDelay = signal(0),\n }: NgpMenuTriggerProps<T>) => {\n const element = injectElementRef();\n const injector = inject(Injector);\n const viewContainerRef = inject(ViewContainerRef);\n const directionality = inject(Directionality);\n const disposables = injectDisposables();\n\n // Controlled properties\n const menu = controlled(_menu);\n const disabled = controlled(_disabled);\n const placement = controlled(_placement);\n const flip = controlled(_flip);\n const shift = controlled(_shift);\n const offset = controlled(_offset);\n const context = controlled(_context);\n const container = controlled(_container, 'body');\n\n // Internal state\n const overlay = signal<NgpOverlay<T> | null>(null);\n const open = computed(() => overlay()?.isOpen() ?? false);\n const openOrigin = signal<FocusOrigin>('program');\n const closeOrigin = signal<FocusOrigin>('program');\n\n // Track whether pointer is over trigger or content (for hover triggers)\n const pointerOverTrigger = signal(false);\n const pointerOverContent = signal(false);\n const isPointerOverMenuArea = computed(() => pointerOverTrigger() || pointerOverContent());\n\n // Safe-polygon hover intent: while the pointer travels inside a corridor from\n // the trigger exit point toward the open menu, the menu stays open. Reversing\n // away closes it (requireForwardMovement).\n const hoverBridge = createHoverBridge({\n isPointerInAnchor: isPointerOverMenuArea,\n close: () => hide(),\n requireForwardMovement: true,\n });\n\n // Reset pointer tracking when menu closes\n effect(() => {\n const isOpen = open();\n\n // When menu closes, reset pointer tracking state and tear down any\n // in-progress hover bridge (and its global listener).\n if (!isOpen) {\n hoverBridge.clear();\n pointerOverTrigger.set(false);\n pointerOverContent.set(false);\n }\n });\n\n // Computed signal to determine if focus should be restored\n // Only restore if opened via keyboard OR closed via keyboard\n const shouldRestoreFocus = computed(\n () => openOrigin() === 'keyboard' || closeOrigin() === 'keyboard',\n );\n\n // Host bindings\n attrBinding(element, 'aria-haspopup', 'true');\n attrBinding(element, 'aria-expanded', open);\n dataBinding(element, 'data-open', open);\n dataBinding(element, 'data-placement', placement);\n\n // Event listeners - conditionally add based on enabled triggers\n listener(element, 'click', onClick);\n listener(element, 'pointerenter', onPointerEnter);\n listener(element, 'pointerleave', onPointerLeave);\n listener(element, 'focus', onFocus);\n listener(element, 'blur', onBlur);\n listener(element, 'keydown', onKeydown);\n\n // Methods\n function onClick(event: MouseEvent): void {\n if (disabled?.() || !triggers().includes('click')) {\n return;\n }\n toggle(event);\n }\n\n function onPointerEnter(event: PointerEvent): void {\n if (disabled?.() || !triggers().includes('hover')) {\n return;\n }\n\n // Don't trigger on touch events\n if (event.pointerType === 'touch') {\n return;\n }\n\n pointerOverTrigger.set(true);\n\n // If already open, cancel any pending hide - the pointer is back on the\n // trigger, so any in-progress hover bridge is no longer needed.\n if (open()) {\n hoverBridge.clear();\n overlay()?.cancelPendingClose();\n return;\n }\n\n show('mouse');\n }\n\n function onPointerLeave(event: PointerEvent): void {\n if (disabled?.() || !triggers().includes('hover')) {\n return;\n }\n\n // Don't trigger on touch events\n if (event.pointerType === 'touch') {\n return;\n }\n\n pointerOverTrigger.set(false);\n\n const currentOverlay = overlay();\n\n // If the overlay hasn't been created, there's nothing to cancel\n if (!currentOverlay) {\n return;\n }\n\n // Build a safe-polygon corridor from the pointer exit point toward the\n // open menu. While the pointer stays inside it the menu stays open, so\n // diagonal travel across the offset gap doesn't collapse the menu.\n const menuElement = open() ? currentOverlay.getElements()[0] : undefined;\n const started =\n !!menuElement &&\n hoverBridge.track({\n triggerRect: element.nativeElement.getBoundingClientRect(),\n targetRect: menuElement.getBoundingClientRect(),\n exitPoint: { x: event.clientX, y: event.clientY },\n });\n\n if (started) {\n currentOverlay.cancelPendingClose();\n return;\n }\n\n // Fall back to a small grace period when we can't build the corridor.\n disposables.setTimeout(() => {\n if (!isPointerOverMenuArea()) {\n hide();\n }\n }, 50);\n }\n\n function onFocus(): void {\n if (disabled?.() || !triggers().includes('focus')) {\n return;\n }\n\n // If already open, do nothing\n if (open()) {\n return;\n }\n\n show('keyboard');\n }\n\n function onBlur(event: FocusEvent): void {\n if (disabled?.() || !triggers().includes('focus')) {\n return;\n }\n\n // If the overlay hasn't been created, there's nothing to cancel\n if (!overlay()) {\n return;\n }\n\n // Check if focus is moving to an element inside the menu\n const relatedTarget = event.relatedTarget as HTMLElement | null;\n if (relatedTarget) {\n const menuElements = overlay()?.getElements() ?? [];\n const isFocusInMenu = menuElements.some(el => el.contains(relatedTarget));\n if (isFocusInMenu) {\n return;\n }\n }\n\n hide();\n }\n\n function onKeydown(event: KeyboardEvent): void {\n if (disabled?.()) {\n return;\n }\n\n const enabledTriggers = triggers();\n\n // Handle Enter key - toggle behavior\n if (event.key === 'Enter' && enabledTriggers.includes('enter')) {\n event.preventDefault();\n const origin: FocusOrigin = 'keyboard';\n if (open()) {\n hide(origin);\n } else {\n show(origin);\n }\n return;\n }\n\n // Handle arrow keys - placement-aware\n if (!enabledTriggers.includes('arrowkey')) {\n return;\n }\n\n const isArrowKey =\n event.key === 'ArrowUp' ||\n event.key === 'ArrowDown' ||\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight';\n\n if (!isArrowKey) {\n return;\n }\n\n // Get RTL direction\n const isRtl = directionality.value === 'rtl';\n\n // Check if arrow direction matches placement\n const currentPlacement = placement();\n let shouldOpen = false;\n\n if (currentPlacement.startsWith('bottom') && event.key === 'ArrowDown') {\n shouldOpen = true;\n } else if (currentPlacement.startsWith('top') && event.key === 'ArrowUp') {\n shouldOpen = true;\n } else if (currentPlacement.startsWith('right')) {\n const isRightArrow = event.key === 'ArrowRight';\n const isLeftArrow = event.key === 'ArrowLeft';\n shouldOpen = (isRightArrow && !isRtl) || (isLeftArrow && isRtl);\n } else if (currentPlacement.startsWith('left')) {\n const isRightArrow = event.key === 'ArrowRight';\n const isLeftArrow = event.key === 'ArrowLeft';\n shouldOpen = (isLeftArrow && !isRtl) || (isRightArrow && isRtl);\n }\n\n if (shouldOpen && !open()) {\n event.preventDefault();\n show('keyboard');\n }\n }\n\n function toggle(event: MouseEvent): void {\n // determine the origin of the event, 0 is keyboard, 1 is mouse\n const origin: FocusOrigin = event.detail === 0 ? 'keyboard' : 'mouse';\n\n // if the menu is open then hide it\n if (open()) {\n hide(origin);\n } else {\n show(origin);\n }\n }\n\n function show(origin: FocusOrigin = 'program'): void {\n // Store the origin used to open the menu\n openOrigin.set(origin);\n\n // Create the overlay if it doesn't exist yet\n if (!overlay()) {\n createOverlayInstance();\n }\n\n // Show the overlay\n overlay()?.show();\n }\n\n function hide(origin: FocusOrigin = 'program'): void {\n const currentOverlay = overlay();\n if (!currentOverlay) {\n return;\n }\n\n // Hide the overlay (this will trigger onClose callback which updates closeOrigin)\n currentOverlay.hide({ origin });\n }\n\n function createOverlayInstance(): void {\n const menuContent = menu?.();\n\n if (!menuContent) {\n throw new Error('Menu must be either a TemplateRef or a ComponentType');\n }\n\n // Create config for the overlay\n const config: NgpOverlayConfig<T> = {\n content: menuContent,\n triggerElement: element.nativeElement,\n viewContainerRef,\n injector,\n context,\n container: container(),\n placement: placement,\n offset: offset(),\n flip: flip(),\n shift: shift(),\n closeOnOutsideClick: true,\n closeOnEscape: true,\n restoreFocus: shouldRestoreFocus,\n onClose: (origin: FocusOrigin) => closeOrigin.set(origin),\n scrollBehaviour: scrollBehavior?.() ?? 'block',\n overlayType: 'menu',\n cooldown: cooldown?.(),\n showDelay: showDelay(),\n hideDelay: hideDelay(),\n };\n\n overlay.set(createOverlay(config));\n }\n\n function setMenu(newMenu: NgpOverlayContent<T> | undefined): void {\n menu.set(newMenu);\n }\n\n function setDisabled(isDisabled: boolean): void {\n disabled.set(isDisabled);\n\n if (isDisabled && open()) {\n hide();\n }\n }\n\n function setFlip(shouldFlip: NgpFlip): void {\n flip.set(shouldFlip);\n }\n\n function setPlacement(newPlacement: NgpMenuPlacement): void {\n placement.set(newPlacement);\n }\n\n function setOffset(newOffset: NgpOffset): void {\n offset.set(newOffset);\n }\n\n function setContext(newContext: T): void {\n context.set(newContext);\n }\n\n function setContainer(newContainer: HTMLElement | string | null): void {\n container.set(newContainer);\n }\n\n /**\n * Called by menu content when pointer enters/leaves\n * @internal\n */\n function setPointerOverContent(isOver: boolean): void {\n pointerOverContent.set(isOver);\n\n if (isOver) {\n // The pointer reached the menu - the hover bridge has served its purpose.\n hoverBridge.clear();\n return;\n }\n\n if (open() && triggers().includes('hover')) {\n // Use a small delay to allow pointer to move back to trigger\n disposables.setTimeout(() => {\n // Only hide if pointer is not over trigger or content\n if (!isPointerOverMenuArea()) {\n hide();\n }\n }, 50);\n }\n }\n\n return {\n menu: deprecatedSetter(menu, 'setMenu'),\n placement: deprecatedSetter(placement, 'setPlacement'),\n offset: deprecatedSetter(offset, 'setOffset'),\n disabled: deprecatedSetter(disabled, 'setDisabled'),\n context: deprecatedSetter(context, 'setContext'),\n open,\n openOrigin,\n show,\n hide,\n toggle,\n setDisabled,\n setMenu,\n setFlip,\n setPlacement,\n setOffset,\n setContext,\n setContainer,\n setPointerOverContent,\n flip,\n container: deprecatedSetter(container, 'setContainer', setContainer),\n } satisfies NgpMenuTriggerState<T>;\n },\n);\n\nexport function injectMenuTriggerState<T>(\n options?: StateInjectionOptions,\n): Signal<NgpMenuTriggerState<T>> {\n return _injectMenuTriggerState(options) as Signal<NgpMenuTriggerState<T>>;\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { computed, inject } from '@angular/core';\nimport { ngpFocusTrap } from 'ng-primitives/focus-trap';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { injectOverlay } from 'ng-primitives/portal';\nimport { attrBinding, createPrimitive, listener, styleBinding } from 'ng-primitives/state';\nimport { Subject } from 'rxjs';\nimport { injectMenuTriggerState } from '../menu-trigger/menu-trigger-state';\n\nexport interface NgpMenuState {\n /**\n * Close the menu and any parent menus.\n * @param origin - The focus origin\n */\n closeAllMenus(origin: FocusOrigin): void;\n /**\n * Subject that emits when submenus should be closed.\n * @internal\n */\n readonly closeSubmenus: Subject<HTMLElement>;\n}\n\nexport interface NgpMenuProps {}\n\nexport const [NgpMenuStateToken, ngpMenu, injectMenuState, provideMenuState] = createPrimitive(\n 'NgpMenu',\n ({}: NgpMenuProps) => {\n const element = injectElementRef();\n const overlay = injectOverlay();\n const directionality = inject(Directionality, { optional: true });\n const menuTrigger = injectMenuTriggerState();\n const parentMenu = injectMenuState({ optional: true, skipSelf: true });\n\n // Always trap focus in menus per WAI-ARIA guidelines (Tab should not navigate within menus)\n // Pass the open origin so focus trap uses the correct origin for :focus-visible styling\n const openOrigin = computed(() => menuTrigger()?.openOrigin() ?? 'program');\n ngpFocusTrap({\n focusOrigin: openOrigin,\n });\n\n // Register this element as the overlay outlet so floating-ui positions it correctly,\n // even when this directive is on a nested child component rather than the portal root.\n overlay.registerOutletElement(element.nativeElement);\n\n // Host bindings\n attrBinding(element, 'role', 'menu');\n attrBinding(element, 'data-placement', overlay.finalPlacement);\n attrBinding(element, 'data-overlay', '');\n styleBinding(element, 'left.px', () => overlay.position().x ?? null);\n styleBinding(element, 'top.px', () => overlay.position().y ?? null);\n styleBinding(element, '--ngp-menu-trigger-width.px', overlay.triggerWidth);\n styleBinding(element, '--ngp-menu-transform-origin', overlay.transformOrigin);\n styleBinding(element, '--ngp-menu-available-width.px', overlay.availableWidth);\n styleBinding(element, '--ngp-menu-available-height.px', overlay.availableHeight);\n\n // Event listeners for pointer tracking and keyboard\n listener(element, 'pointerenter', onPointerEnter);\n listener(element, 'pointerleave', onPointerLeave);\n listener(element, 'keydown', onKeydown);\n\n // Subject to notify children to close submenus\n const closeSubmenus = new Subject<HTMLElement>();\n\n // Methods\n function onPointerEnter(): void {\n menuTrigger()?.setPointerOverContent(true);\n }\n\n function onPointerLeave(): void {\n menuTrigger()?.setPointerOverContent(false);\n }\n\n function onKeydown(event: KeyboardEvent): void {\n // Handle Escape key - close all menus and restore focus to root trigger\n // We handle this here instead of using overlay's closeOnEscape to ensure\n // proper focus restoration through the closeAllMenus chain\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n closeAllMenus('keyboard');\n return;\n }\n\n // Only handle arrow close keys for top-level menus (no parent submenu)\n // Submenus are handled by menu-item-state via NgpSubmenuTrigger\n if (parentMenu()) {\n return;\n }\n\n const placement = overlay.finalPlacement();\n if (!placement) {\n return;\n }\n\n const isRtl = (directionality?.value ?? 'ltr') === 'rtl';\n\n // Determine which arrow key should close based on placement\n // Note: Only Left/Right arrows close menus (for side-placed menus).\n // Up/Down arrows are reserved for roving focus navigation within the menu.\n let shouldClose = false;\n\n if (placement.startsWith('right')) {\n // Right-placed menu: Left Arrow closes (or Right Arrow in RTL)\n shouldClose = event.key === (isRtl ? 'ArrowRight' : 'ArrowLeft');\n } else if (placement.startsWith('left')) {\n // Left-placed menu: Right Arrow closes (or Left Arrow in RTL)\n shouldClose = event.key === (isRtl ? 'ArrowLeft' : 'ArrowRight');\n }\n\n if (shouldClose) {\n event.preventDefault();\n event.stopPropagation();\n menuTrigger()?.hide('keyboard');\n }\n }\n\n function closeAllMenus(origin: FocusOrigin): void {\n menuTrigger().hide(origin);\n parentMenu()?.closeAllMenus(origin);\n }\n\n return {\n closeAllMenus,\n closeSubmenus,\n } satisfies NgpMenuState;\n },\n);\n","import { FocusMonitor, FocusOrigin } from '@angular/cdk/a11y';\nimport {\n computed,\n effect,\n inject,\n Injector,\n signal,\n Signal,\n ViewContainerRef,\n WritableSignal,\n} from '@angular/core';\nimport { createHoverBridge, injectElementRef } from 'ng-primitives/internal';\nimport {\n createOverlay,\n NgpFlip,\n NgpOffset,\n NgpOverlay,\n NgpOverlayConfig,\n NgpOverlayContent,\n} from 'ng-primitives/portal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n deprecatedSetter,\n listener,\n} from 'ng-primitives/state';\nimport { injectDisposables, safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { NgpMenuPlacement } from '../menu-trigger/menu-trigger';\nimport { injectMenuState } from '../menu/menu-state';\n\nexport interface NgpSubmenuTriggerState {\n /**\n * The menu template or component.\n */\n readonly menu: WritableSignal<NgpOverlayContent<any> | undefined>;\n\n /**\n * The computed placement of the menu.\n */\n readonly placement: WritableSignal<NgpMenuPlacement>;\n\n /**\n * Whether the menu is open.\n */\n readonly open: Signal<boolean>;\n\n /**\n * The offset of the menu.\n */\n readonly offset: WritableSignal<NgpOffset>;\n\n /**\n * The disabled state of the trigger.\n */\n readonly disabled: WritableSignal<boolean>;\n\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip: WritableSignal<NgpFlip>;\n\n /**\n * The container in which the menu should be attached.\n * @default document.body\n */\n readonly container: WritableSignal<HTMLElement | string | null>;\n\n /**\n * The focus origin used to open the submenu.\n * Used by the submenu's focus trap for :focus-visible styling.\n * @internal\n */\n readonly openOrigin: Signal<FocusOrigin>;\n\n /**\n * Show the menu.\n * @param origin - The focus origin (keyboard, mouse, touch, or program)\n */\n show(origin?: FocusOrigin): void;\n\n /**\n * Hide the menu.\n * @param origin - The focus origin\n */\n hide(origin?: FocusOrigin): void;\n\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void;\n\n /**\n * Set whether the trigger is disabled.\n * @param isDisabled - Whether the trigger is disabled\n */\n setDisabled(isDisabled: boolean): void;\n\n /**\n * Set the menu template or component.\n * @param menu - The menu content\n */\n setMenu(menu: NgpOverlayContent<any> | undefined): void;\n\n /**\n * Set the placement of the menu.\n * @param placement - The menu placement\n */\n setPlacement(placement: NgpMenuPlacement): void;\n\n /**\n * Set the offset of the menu.\n * @param offset - The menu offset\n */\n setOffset(offset: NgpOffset): void;\n\n /**\n * Set whether the menu should flip when there is not enough space.\n * @param shouldFlip - Whether the menu should flip\n */\n setFlip(shouldFlip: NgpFlip): void;\n\n /**\n * Set the container in which the menu should be attached. Takes effect the\n * next time the menu is opened; it does not move a menu that is already open.\n * @param container - The new container\n */\n setContainer(container: HTMLElement | string | null): void;\n\n /**\n * Focus the trigger element.\n * @param origin - The focus origin\n */\n focus(origin: FocusOrigin): void;\n\n /**\n * Set whether the pointer is over the submenu content. Entering the submenu\n * tears down the hover bridge (the pointer arrived safely).\n * @param isOver - Whether the pointer is over the content\n * @internal\n */\n setPointerOverContent(isOver: boolean): void;\n}\n\nexport interface NgpSubmenuTriggerProps<T = unknown> {\n /**\n * Whether the trigger is disabled.\n */\n readonly disabled?: Signal<boolean>;\n /**\n * The menu template or component.\n */\n readonly menu?: Signal<NgpOverlayContent<T> | undefined>;\n /**\n * The placement of the menu.\n */\n readonly placement?: Signal<NgpMenuPlacement>;\n /**\n * The offset of the menu.\n */\n readonly offset?: Signal<NgpOffset>;\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip?: Signal<NgpFlip>;\n /**\n * The container in which the menu should be attached.\n */\n readonly container?: Signal<HTMLElement | string | null>;\n}\n\nexport const [\n NgpSubmenuTriggerStateToken,\n ngpSubmenuTrigger,\n injectSubmenuTriggerState,\n provideSubmenuTriggerState,\n] = createPrimitive(\n 'NgpSubmenuTrigger',\n <T>({\n disabled: _disabled = signal(false),\n menu: _menu = signal<NgpOverlayContent<T> | undefined>(undefined),\n placement: _placement = signal('right-start'),\n offset: _offset = signal(0),\n flip: _flip = signal(true),\n container: _container,\n }: NgpSubmenuTriggerProps<T>) => {\n const element = injectElementRef();\n const injector = inject(Injector);\n const viewContainerRef = inject(ViewContainerRef);\n const parentMenu = injectMenuState({ optional: true });\n const focusMonitor = inject(FocusMonitor);\n const disposables = injectDisposables();\n\n // Controlled properties\n const menu = controlled(_menu);\n const disabled = controlled(_disabled);\n const placement = controlled(_placement);\n const flip = controlled(_flip);\n const offset = controlled(_offset);\n const container = controlled(_container, 'body');\n\n const overlay = signal<NgpOverlay<T> | null>(null);\n const open = computed(() => overlay()?.isOpen() ?? false);\n const openOrigin = signal<FocusOrigin>('program');\n\n // Track pointer presence for the safe-polygon hover bridge.\n const pointerOverTrigger = signal(false);\n const pointerOverContent = signal(false);\n const isPointerOverSubmenu = computed(() => pointerOverTrigger() || pointerOverContent());\n\n // Safe-polygon hover intent: while the pointer travels inside a corridor from\n // the submenu trigger toward the open submenu, sibling hover events are\n // ignored so the submenu doesn't collapse mid-traversal.\n const hoverBridge = createHoverBridge({\n isPointerInAnchor: isPointerOverSubmenu,\n close: () => hide('mouse'),\n requireForwardMovement: true,\n });\n\n // Tear down any hover bridge whenever the submenu closes - including close\n // paths that bypass hide() (e.g. an outside click on the overlay), so a\n // stale corridor can't linger or wrongly suppress the next sibling hover.\n // Also reset the pointer flags: destroying the panel under the pointer never\n // fires its pointerleave, and a stuck pointerOverContent would make every\n // future corridor treat the pointer as anchored and never close.\n effect(() => {\n if (!open()) {\n hoverBridge.clear();\n pointerOverTrigger.set(false);\n pointerOverContent.set(false);\n }\n });\n\n // Subscribe to parent menu's closeSubmenus\n parentMenu()\n ?.closeSubmenus.pipe(safeTakeUntilDestroyed())\n .subscribe(submenuElement => {\n // if the element is not the trigger, we want to close the menu\n if (submenuElement === element.nativeElement) {\n return;\n }\n\n // While the pointer is still inside the safe-polygon corridor toward this\n // submenu, ignore sibling hover-driven closes. The pointer-move listener\n // closes the submenu itself once the pointer actually leaves the corridor.\n if (hoverBridge.isActive()) {\n return;\n }\n\n hide('mouse');\n });\n\n // Host bindings\n attrBinding(element, 'aria-haspopup', 'true');\n attrBinding(element, 'aria-expanded', open);\n dataBinding(element, 'data-open', open);\n\n // Event listeners\n listener(element, 'click', onClick);\n listener(element, 'keydown', handleArrowKey);\n listener(element, 'pointerenter', showSubmenuOnHover);\n listener(element, 'pointerleave', onPointerLeave);\n\n // Methods\n function onClick(event: MouseEvent): void {\n if (disabled?.()) {\n return;\n }\n toggle(event);\n }\n\n function toggle(event: MouseEvent): void {\n // determine the origin of the event, 0 is keyboard, 1 is mouse\n const origin: FocusOrigin = event.detail === 0 ? 'keyboard' : 'mouse';\n\n // if the menu is open then hide it\n if (open()) {\n hide(origin);\n } else {\n show(origin);\n }\n }\n\n function show(origin: FocusOrigin = 'program'): void {\n // If the trigger is disabled, don't show the menu\n if (disabled?.()) {\n return;\n }\n\n // Store the origin used to open the menu (for focus-visible styling in submenu)\n openOrigin.set(origin);\n\n // Create the overlay if it doesn't exist yet\n if (!overlay()) {\n createOverlayInstance();\n }\n\n // Show the overlay\n overlay()?.show();\n }\n\n function hide(origin: FocusOrigin = 'program'): void {\n // If the trigger is disabled or the menu is not open, do nothing\n if (disabled?.() || !open()) {\n return;\n }\n\n // The submenu is closing - any active hover bridge is no longer relevant.\n hoverBridge.clear();\n\n // Hide the overlay\n overlay()?.hide({ origin });\n }\n\n function createOverlayInstance(): void {\n const menuContent = menu?.();\n\n if (!menuContent) {\n throw new Error('Menu must be either a TemplateRef or a ComponentType');\n }\n\n // Create config for the overlay\n // Note: restoreFocus is false because submenus should never auto-restore focus.\n // When closeAllMenus is called, the ROOT menu's overlay handles focus restoration.\n // When closing just the submenu (Left Arrow), the caller handles focus explicitly.\n // closeOnEscape is false because we handle Escape in menu-state.ts to ensure\n // proper focus restoration through closeAllMenus.\n const config: NgpOverlayConfig<T> = {\n content: menuContent,\n triggerElement: element.nativeElement,\n injector,\n container: container(),\n placement,\n offset: offset(),\n flip: flip(),\n closeOnOutsideClick: true,\n closeOnEscape: false,\n restoreFocus: false,\n viewContainerRef,\n };\n\n overlay.set(createOverlay(config));\n }\n\n function handleArrowKey(event: Event): void {\n if (event instanceof KeyboardEvent === false) {\n return;\n }\n\n const direction = getComputedStyle(element.nativeElement).direction;\n const isRtl = direction === 'rtl';\n\n const isRightArrow = event.key === 'ArrowRight';\n const isLeftArrow = event.key === 'ArrowLeft';\n\n if ((isRightArrow && !isRtl) || (isLeftArrow && isRtl)) {\n event.preventDefault();\n show('keyboard');\n }\n }\n\n function showSubmenuOnHover(event: Event): void {\n if (event instanceof PointerEvent === false) {\n return;\n }\n\n // if this was triggered by a touch event, we don't want to show the submenu\n // as it will be shown by the click event - this prevents the submenu from being toggled\n if (event.pointerType === 'touch') {\n return;\n }\n\n pointerOverTrigger.set(true);\n // The pointer is back on the trigger - drop any in-progress hover bridge.\n hoverBridge.clear();\n\n show('mouse');\n }\n\n function onPointerLeave(event: Event): void {\n if (event instanceof PointerEvent === false || event.pointerType === 'touch') {\n return;\n }\n\n pointerOverTrigger.set(false);\n\n const currentOverlay = overlay();\n\n // Only build a corridor while the submenu is actually open.\n if (!open() || !currentOverlay) {\n return;\n }\n\n const submenuElement = currentOverlay.getElements()[0];\n const started =\n !!submenuElement &&\n hoverBridge.track({\n triggerRect: element.nativeElement.getBoundingClientRect(),\n targetRect: submenuElement.getBoundingClientRect(),\n exitPoint: { x: event.clientX, y: event.clientY },\n });\n\n if (!started) {\n // Defensive fallback: if the corridor can't be built, close after a short\n // grace period rather than leaving the submenu stuck open.\n disposables.setTimeout(() => {\n if (!isPointerOverSubmenu()) {\n hide('mouse');\n }\n }, 50);\n }\n }\n\n function setDisabled(isDisabled: boolean): void {\n disabled.set(isDisabled);\n\n if (isDisabled && open()) {\n hide();\n }\n }\n\n function setMenu(newMenu: NgpOverlayContent<T> | undefined): void {\n menu.set(newMenu);\n }\n\n function setPlacement(newPlacement: NgpMenuPlacement): void {\n placement.set(newPlacement);\n }\n\n function setOffset(newOffset: NgpOffset): void {\n offset.set(newOffset);\n }\n\n function setFlip(shouldFlip: NgpFlip): void {\n flip.set(shouldFlip);\n }\n\n function setContainer(newContainer: HTMLElement | string | null): void {\n container.set(newContainer);\n }\n\n function focus(origin: FocusOrigin): void {\n focusMonitor.focusVia(element.nativeElement, origin, { preventScroll: true });\n }\n\n function setPointerOverContent(isOver: boolean): void {\n pointerOverContent.set(isOver);\n\n // Reaching the submenu content means the pointer arrived safely, so the\n // hover bridge corridor is no longer needed.\n if (isOver) {\n hoverBridge.clear();\n }\n }\n\n return {\n placement: deprecatedSetter(placement, 'setPlacement'),\n offset: deprecatedSetter(offset, 'setOffset'),\n disabled: deprecatedSetter(disabled, 'setDisabled'),\n menu: deprecatedSetter(menu, 'setMenu'),\n flip: deprecatedSetter(flip, 'setFlip'),\n open,\n openOrigin,\n show,\n hide,\n toggle,\n setDisabled,\n setMenu,\n setFlip,\n setPlacement,\n setOffset,\n setContainer,\n focus,\n setPointerOverContent,\n container: deprecatedSetter(container, 'setContainer', setContainer),\n } satisfies NgpSubmenuTriggerState;\n },\n);\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport {\n coerceFlip,\n coerceOffset,\n NgpFlip,\n NgpFlipInput,\n NgpOffset,\n NgpOffsetInput,\n NgpOverlayContent,\n} from 'ng-primitives/portal';\nimport { NgpMenuPlacement } from '../menu-trigger/menu-trigger';\nimport { NgpMenuTriggerStateToken } from '../menu-trigger/menu-trigger-state';\nimport {\n NgpSubmenuTriggerStateToken,\n ngpSubmenuTrigger,\n provideSubmenuTriggerState,\n} from './submenu-trigger-state';\n\n@Directive({\n selector: '[ngpSubmenuTrigger]',\n exportAs: 'ngpSubmenuTrigger',\n providers: [\n // inherit: false - a nested submenu trigger lives inside the DI scope of its\n // parent submenu trigger (via the overlay's injector). Inheriting would reuse\n // the parent trigger's state signal and overwrite it with this trigger's\n // state, so the parent's menu would start talking to the wrong trigger.\n provideSubmenuTriggerState({ inherit: false }),\n // Also provide as NgpMenuTriggerStateToken so the submenu's menu-state\n // can find this trigger's openOrigin for :focus-visible styling\n { provide: NgpMenuTriggerStateToken, useExisting: NgpSubmenuTriggerStateToken },\n ],\n})\nexport class NgpSubmenuTrigger<T = unknown> {\n /**\n * Access the submenu template ref.\n */\n readonly menu = input<NgpOverlayContent<T>>(undefined, {\n alias: 'ngpSubmenuTrigger',\n });\n\n /**\n * Define if the trigger should be disabled.\n * @default false\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpSubmenuTriggerDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Define the placement of the menu relative to the trigger.\n * @default 'right-start'\n */\n readonly placement = input<NgpMenuPlacement>('right-start', {\n alias: 'ngpSubmenuTriggerPlacement',\n });\n\n /**\n * Define the offset of the menu relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 0\n */\n readonly offset = input<NgpOffset, NgpOffsetInput>(0, {\n alias: 'ngpSubmenuTriggerOffset',\n transform: coerceOffset,\n });\n\n /**\n * Define whether the menu should flip when there is not enough space for the menu.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n readonly flip = input<NgpFlip, NgpFlipInput>(true, {\n alias: 'ngpSubmenuTriggerFlip',\n transform: coerceFlip,\n });\n\n /**\n * Define the container in which the menu should be attached.\n * @default document.body\n */\n readonly container = input<HTMLElement | string | null>(null, {\n alias: 'ngpSubmenuTriggerContainer',\n });\n\n /**\n * Access the menu trigger state.\n */\n private readonly state = ngpSubmenuTrigger<T>({\n disabled: this.disabled,\n menu: this.menu,\n placement: this.placement,\n offset: this.offset,\n flip: this.flip,\n container: this.container,\n });\n\n /**\n * Show the menu.\n */\n show(): void {\n this.state.show();\n }\n\n /**\n * Hide the menu.\n */\n hide(origin: FocusOrigin = 'program'): void {\n this.state.hide(origin);\n }\n\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void {\n this.state.toggle(event);\n }\n\n /**\n * Focus the trigger element.\n * @param origin - The focus origin\n */\n focus(origin: FocusOrigin = 'program'): void {\n this.state.focus(origin);\n }\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { inject, Injector, signal, Signal } from '@angular/core';\nimport { ngpButton } from 'ng-primitives/button';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { attrBinding, createPrimitive, listener } from 'ng-primitives/state';\nimport { injectMenuState } from '../menu/menu-state';\nimport { NgpSubmenuTrigger } from '../submenu-trigger/submenu-trigger';\n\nexport interface NgpMenuItemState {}\n\nexport interface NgpMenuItemProps {\n /**\n * Whether the menu item is disabled.\n */\n readonly disabled?: Signal<boolean>;\n\n /**\n * Whether the menu should close when this item is selected.\n * @default signal(true)\n */\n readonly closeOnSelect?: Signal<boolean>;\n\n /**\n * The ARIA role for the menu item.\n * @default 'menuitem'\n */\n readonly role?: string;\n}\n\nexport const [NgpMenuItemStateToken, ngpMenuItem, injectMenuItemState, provideMenuItemState] =\n createPrimitive(\n 'NgpMenuItem',\n ({\n disabled = signal(false),\n closeOnSelect = signal(true),\n role = 'menuitem',\n }: NgpMenuItemProps) => {\n const element = injectElementRef();\n const injector = inject(Injector);\n const parentMenu = injectMenuState({ optional: true });\n\n ngpButton({ disabled });\n\n // Host bindings\n attrBinding(element, 'role', role);\n\n // Event listeners\n listener(element, 'click', onClick);\n listener(element, 'keydown', handleArrowKey);\n listener(element, 'mouseenter', showSubmenuOnHover);\n\n // Methods\n function onClick(event: MouseEvent): void {\n // Disabled items are inert - they must not activate or close the menu.\n if (disabled()) {\n return;\n }\n\n // we do this here to avoid circular dependency issues\n const trigger = injector.get(NgpSubmenuTrigger, null, { self: true, optional: true });\n\n const origin: FocusOrigin = event.detail === 0 ? 'keyboard' : 'mouse';\n\n // if this is a submenu trigger, we don't want to close the menu, we want to open the submenu\n // if closeOnSelect is false, we don't want to close the menu (e.g., checkbox/radio items)\n if (!trigger && closeOnSelect()) {\n parentMenu()?.closeAllMenus(origin);\n }\n }\n\n function handleArrowKey(event: Event): void {\n // disabled items are inert - they must not respond to keyboard navigation\n if (disabled()) {\n return;\n }\n\n if (event instanceof KeyboardEvent === false) {\n return;\n }\n\n // if there is no parent menu, we don't want to do anything\n const trigger = injector.get(NgpSubmenuTrigger, null, { optional: true, skipSelf: true });\n\n if (!trigger) {\n return;\n }\n\n const direction = getComputedStyle(element.nativeElement).direction;\n const isRtl = direction === 'rtl';\n\n const isLeftArrow = event.key === 'ArrowLeft';\n const isRightArrow = event.key === 'ArrowRight';\n\n if ((isLeftArrow && !isRtl) || (isRightArrow && isRtl)) {\n event.preventDefault();\n\n if (trigger) {\n trigger.hide('keyboard');\n // Explicitly focus the submenu trigger since submenus have restoreFocus: false\n trigger.focus('keyboard');\n }\n }\n }\n\n function showSubmenuOnHover(): void {\n parentMenu()?.closeSubmenus.next(element.nativeElement);\n }\n\n return {} satisfies NgpMenuItemState;\n },\n );\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport { ngpRovingFocusItem, provideRovingFocusItemState } from 'ng-primitives/roving-focus';\nimport { ngpMenuItem, provideMenuItemState } from './menu-item-state';\n\n/**\n * The `NgpMenuItem` directive represents a menu item.\n */\n@Directive({\n selector: '[ngpMenuItem]',\n exportAs: 'ngpMenuItem',\n providers: [provideMenuItemState(), provideRovingFocusItemState()],\n})\nexport class NgpMenuItem {\n /** Whether the menu item is disabled */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemDisabled',\n transform: booleanAttribute,\n });\n\n /** Whether the menu should close when this item is selected */\n readonly closeOnSelect = input<boolean, BooleanInput>(true, {\n alias: 'ngpMenuItemCloseOnSelect',\n transform: booleanAttribute,\n });\n\n constructor() {\n ngpMenuItem({ disabled: this.disabled, closeOnSelect: this.closeOnSelect });\n ngpRovingFocusItem({ disabled: this.disabled });\n }\n}\n","import { Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n emitter,\n listener,\n} from 'ng-primitives/state';\nimport { Observable } from 'rxjs';\nimport { ngpMenuItem } from '../menu-item/menu-item-state';\n\nexport interface NgpMenuItemCheckboxState {\n /**\n * Whether the checkbox is checked.\n */\n readonly checked: Signal<boolean>;\n\n /**\n * Emits when the checked state changes.\n */\n readonly checkedChange: Observable<boolean>;\n\n /**\n * Toggle the checkbox value.\n */\n toggle(): void;\n}\n\nexport interface NgpMenuItemCheckboxProps {\n /**\n * Whether the checkbox is checked.\n */\n readonly checked?: Signal<boolean>;\n\n /**\n * Whether the checkbox is disabled.\n */\n readonly disabled?: Signal<boolean>;\n\n /**\n * Callback fired when the checked state changes.\n */\n readonly onCheckedChange?: (checked: boolean) => void;\n}\n\nexport const [\n NgpMenuItemCheckboxStateToken,\n ngpMenuItemCheckbox,\n injectMenuItemCheckboxState,\n provideMenuItemCheckboxState,\n] = createPrimitive(\n 'NgpMenuItemCheckbox',\n ({\n checked: _checked = signal(false),\n disabled = signal(false),\n onCheckedChange,\n }: NgpMenuItemCheckboxProps): NgpMenuItemCheckboxState => {\n const element = injectElementRef();\n const checked = controlled(_checked);\n const checkedChange = emitter<boolean>();\n\n // Use base menu item behavior but don't close on select\n ngpMenuItem({ disabled, closeOnSelect: signal(false), role: 'menuitemcheckbox' });\n\n // Host bindings\n attrBinding(element, 'aria-checked', checked);\n dataBinding(element, 'data-checked', checked);\n\n // Toggle on click\n listener(element, 'click', () => toggle());\n\n function toggle(): void {\n if (disabled()) {\n return;\n }\n\n const nextChecked = !checked();\n checked.set(nextChecked);\n onCheckedChange?.(nextChecked);\n checkedChange.emit(nextChecked);\n }\n\n return {\n checked,\n checkedChange: checkedChange.asObservable(),\n toggle,\n } satisfies NgpMenuItemCheckboxState;\n },\n);\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input, output } from '@angular/core';\nimport { ngpRovingFocusItem, provideRovingFocusItemState } from 'ng-primitives/roving-focus';\nimport { ngpMenuItemCheckbox, provideMenuItemCheckboxState } from './menu-item-checkbox-state';\n\n/**\n * The `NgpMenuItemCheckbox` directive represents a menu item that can be toggled on and off.\n */\n@Directive({\n selector: '[ngpMenuItemCheckbox]',\n exportAs: 'ngpMenuItemCheckbox',\n providers: [provideMenuItemCheckboxState(), provideRovingFocusItemState()],\n})\nexport class NgpMenuItemCheckbox {\n /** Whether the checkbox is checked */\n readonly checked = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemCheckboxChecked',\n transform: booleanAttribute,\n });\n\n /** Event emitted when the checked state changes */\n readonly checkedChange = output<boolean>({\n alias: 'ngpMenuItemCheckboxCheckedChange',\n });\n\n /** Whether the menu item checkbox is disabled */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemCheckboxDisabled',\n transform: booleanAttribute,\n });\n\n constructor() {\n ngpMenuItemCheckbox({\n checked: this.checked,\n disabled: this.disabled,\n onCheckedChange: value => this.checkedChange.emit(value),\n });\n ngpRovingFocusItem({ disabled: this.disabled });\n }\n}\n","import { Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { attrBinding, controlled, createPrimitive, emitter } from 'ng-primitives/state';\nimport { Observable } from 'rxjs';\n\nexport interface NgpMenuItemRadioGroupState {\n /**\n * The current value of the radio group.\n */\n readonly value: Signal<string | null>;\n\n /**\n * Emits when the value changes.\n */\n readonly valueChange: Observable<string>;\n\n /**\n * Select a radio item by value.\n */\n select(value: string): void;\n}\n\nexport interface NgpMenuItemRadioGroupProps {\n /**\n * The current value of the radio group.\n */\n readonly value?: Signal<string | null>;\n\n /**\n * Callback fired when the value changes.\n */\n readonly onValueChange?: (value: string) => void;\n}\n\nexport const [\n NgpMenuItemRadioGroupStateToken,\n ngpMenuItemRadioGroup,\n injectMenuItemRadioGroupState,\n provideMenuItemRadioGroupState,\n] = createPrimitive(\n 'NgpMenuItemRadioGroup',\n ({\n value: _value = signal(null),\n onValueChange,\n }: NgpMenuItemRadioGroupProps): NgpMenuItemRadioGroupState => {\n const element = injectElementRef();\n const value = controlled(_value);\n const valueChange = emitter<string>();\n\n // Host bindings\n attrBinding(element, 'role', 'group');\n\n function select(newValue: string): void {\n if (value() === newValue) {\n return;\n }\n\n value.set(newValue);\n onValueChange?.(newValue);\n valueChange.emit(newValue);\n }\n\n return {\n value,\n valueChange: valueChange.asObservable(),\n select,\n } satisfies NgpMenuItemRadioGroupState;\n },\n);\n","import { computed, Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { attrBinding, createPrimitive, dataBinding, listener } from 'ng-primitives/state';\nimport { injectMenuItemRadioGroupState } from '../menu-item-radio-group/menu-item-radio-group-state';\nimport { ngpMenuItem } from '../menu-item/menu-item-state';\n\nexport interface NgpMenuItemRadioState {\n /**\n * Whether the radio item is checked.\n */\n readonly checked: Signal<boolean>;\n}\n\nexport interface NgpMenuItemRadioProps {\n /**\n * The value this radio item represents.\n */\n readonly value: Signal<string>;\n\n /**\n * Whether the radio item is disabled.\n */\n readonly disabled?: Signal<boolean>;\n}\n\nexport const [\n NgpMenuItemRadioStateToken,\n ngpMenuItemRadio,\n injectMenuItemRadioState,\n provideMenuItemRadioState,\n] = createPrimitive(\n 'NgpMenuItemRadio',\n ({ value, disabled = signal(false) }: NgpMenuItemRadioProps): NgpMenuItemRadioState => {\n const element = injectElementRef();\n const radioGroup = injectMenuItemRadioGroupState();\n\n // Use base menu item behavior but don't close on select\n ngpMenuItem({ disabled, closeOnSelect: signal(false), role: 'menuitemradio' });\n\n // Computed checked state\n const checked = computed(() => radioGroup()?.value() === value());\n\n // Host bindings\n attrBinding(element, 'aria-checked', checked);\n dataBinding(element, 'data-checked', checked);\n\n // Select on click\n listener(element, 'click', () => {\n if (disabled()) {\n return;\n }\n radioGroup()?.select(value());\n });\n\n return {\n checked,\n } satisfies NgpMenuItemRadioState;\n },\n);\n","import { computed, Directive } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { dataBinding } from 'ng-primitives/state';\nimport { injectMenuItemCheckboxState } from '../menu-item-checkbox/menu-item-checkbox-state';\nimport { injectMenuItemRadioState } from '../menu-item-radio/menu-item-radio-state';\n\n/**\n * The `NgpMenuItemIndicator` directive renders inside a checkbox or radio menu item\n * and exposes `data-checked` based on the parent item's checked state.\n */\n@Directive({\n selector: '[ngpMenuItemIndicator]',\n exportAs: 'ngpMenuItemIndicator',\n})\nexport class NgpMenuItemIndicator {\n constructor() {\n const element = injectElementRef();\n const checkboxState = injectMenuItemCheckboxState({ optional: true });\n const radioState = injectMenuItemRadioState({ optional: true });\n\n const checked = computed(() => checkboxState()?.checked() ?? radioState()?.checked() ?? false);\n\n dataBinding(element, 'data-checked', checked);\n }\n}\n","import { Directive, input, output } from '@angular/core';\nimport {\n ngpMenuItemRadioGroup,\n provideMenuItemRadioGroupState,\n} from './menu-item-radio-group-state';\n\n/**\n * The `NgpMenuItemRadioGroup` directive represents a group of radio menu items.\n */\n@Directive({\n selector: '[ngpMenuItemRadioGroup]',\n exportAs: 'ngpMenuItemRadioGroup',\n providers: [provideMenuItemRadioGroupState()],\n})\nexport class NgpMenuItemRadioGroup {\n /** The current value of the radio group */\n readonly value = input<string | null>(null, {\n alias: 'ngpMenuItemRadioGroupValue',\n });\n\n /** Event emitted when the value changes */\n readonly valueChange = output<string>({\n alias: 'ngpMenuItemRadioGroupValueChange',\n });\n\n constructor() {\n ngpMenuItemRadioGroup({\n value: this.value,\n onValueChange: value => this.valueChange.emit(value),\n });\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport { ngpRovingFocusItem, provideRovingFocusItemState } from 'ng-primitives/roving-focus';\nimport { ngpMenuItemRadio, provideMenuItemRadioState } from './menu-item-radio-state';\n\n/**\n * The `NgpMenuItemRadio` directive represents a radio menu item within a radio group.\n */\n@Directive({\n selector: '[ngpMenuItemRadio]',\n exportAs: 'ngpMenuItemRadio',\n providers: [provideMenuItemRadioState(), provideRovingFocusItemState()],\n})\nexport class NgpMenuItemRadio {\n /** The value this radio item represents */\n readonly value = input.required<string>({\n alias: 'ngpMenuItemRadioValue',\n });\n\n /** Whether the radio item is disabled */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemRadioDisabled',\n transform: booleanAttribute,\n });\n\n constructor() {\n ngpMenuItemRadio({ value: this.value, disabled: this.disabled });\n ngpRovingFocusItem({ disabled: this.disabled });\n }\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input, numberAttribute, Signal } from '@angular/core';\nimport {\n coerceFlip,\n coerceOffset,\n coerceShift,\n NgpFlip,\n NgpFlipInput,\n NgpOffset,\n NgpOffsetInput,\n NgpOverlayContent,\n NgpShift,\n NgpShiftInput,\n} from 'ng-primitives/portal';\nimport { injectMenuConfig, NgpMenuTriggerType } from '../config/menu-config';\nimport { ngpMenuTrigger, provideMenuTriggerState } from './menu-trigger-state';\n\n/**\n * The `NgpMenuTrigger` directive allows you to turn an element into a menu trigger.\n */\n@Directive({\n selector: '[ngpMenuTrigger]',\n exportAs: 'ngpMenuTrigger',\n providers: [provideMenuTriggerState()],\n})\nexport class NgpMenuTrigger<T = unknown> {\n /**\n * Access the global menu configuration.\n */\n private readonly config = injectMenuConfig();\n\n /**\n * Access the menu template ref or ComponentType.\n */\n readonly menu = input<NgpOverlayContent<T>>(undefined, {\n alias: 'ngpMenuTrigger',\n });\n\n /**\n * Define if the trigger should be disabled.\n * @default false\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuTriggerDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Define the placement of the menu relative to the trigger.\n * @default 'bottom-start'\n */\n readonly placement = input<NgpMenuPlacement>(this.config.placement, {\n alias: 'ngpMenuTriggerPlacement',\n });\n\n /**\n * Define the offset of the menu relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 4\n */\n readonly offset = input<NgpOffset, NgpOffsetInput>(this.config.offset, {\n alias: 'ngpMenuTriggerOffset',\n transform: coerceOffset,\n });\n\n /**\n * Define whether the menu should flip when there is not enough space for the menu.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n readonly flip = input<NgpFlip, NgpFlipInput>(this.config.flip, {\n alias: 'ngpMenuTriggerFlip',\n transform: coerceFlip,\n });\n\n /**\n * Configure shift behavior to keep the menu in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n readonly shift = input<NgpShift, NgpShiftInput>(this.config.shift, {\n alias: 'ngpMenuTriggerShift',\n transform: coerceShift,\n });\n\n /**\n * Define the container in which the menu should be attached.\n * @default document.body\n */\n readonly container = input<HTMLElement | string | null>(this.config.container, {\n alias: 'ngpMenuTriggerContainer',\n });\n\n /**\n * Defines how the menu behaves when the window is scrolled.\n * @default 'block'\n */\n readonly scrollBehavior = input<'reposition' | 'block' | 'close'>(this.config.scrollBehavior, {\n alias: 'ngpMenuTriggerScrollBehavior',\n });\n\n /**\n * Define the cooldown duration in milliseconds.\n * When moving from one menu to another within this duration,\n * the showDelay is skipped for the new menu.\n * @default 0\n */\n readonly cooldown = input<number, NumberInput>(this.config.cooldown, {\n alias: 'ngpMenuTriggerCooldown',\n transform: numberAttribute,\n });\n\n /**\n * Provide context to the menu. This can be used to pass data to the menu content.\n */\n readonly context = input<T>(undefined, {\n alias: 'ngpMenuTriggerContext',\n });\n\n /**\n * Define which trigger types are enabled for the menu.\n * @default ['click']\n */\n readonly triggers = input<NgpMenuTriggerType[]>(this.config.triggers, {\n alias: 'ngpMenuTriggerOpenTriggers',\n });\n\n /**\n * Define the delay before the menu is displayed (hover/focus triggers).\n * @default 0\n */\n readonly showDelay = input<number, NumberInput>(this.config.showDelay, {\n alias: 'ngpMenuTriggerShowDelay',\n transform: numberAttribute,\n });\n\n /**\n * Define the delay before the menu is hidden (hover/focus triggers).\n * @default 0\n */\n readonly hideDelay = input<number, NumberInput>(this.config.hideDelay, {\n alias: 'ngpMenuTriggerHideDelay',\n transform: numberAttribute,\n });\n\n /**\n * The menu trigger state.\n */\n private readonly state = ngpMenuTrigger<T>({\n disabled: this.disabled,\n menu: this.menu,\n placement: this.placement,\n offset: this.offset,\n flip: this.flip,\n shift: this.shift,\n container: this.container,\n scrollBehavior: this.scrollBehavior,\n cooldown: this.cooldown,\n context: this.context as Signal<T>,\n triggers: this.triggers,\n showDelay: this.showDelay,\n hideDelay: this.hideDelay,\n });\n\n /**\n * Show the menu.\n */\n show(): void {\n this.state.show();\n }\n\n /**\n * Hide the menu.\n * @param origin - The focus origin\n * @internal\n */\n hide(origin?: FocusOrigin): void {\n this.state.hide(origin);\n }\n\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void {\n this.state.toggle(event);\n }\n}\n\nexport type NgpMenuPlacement =\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-start'\n | 'top-end'\n | 'right-start'\n | 'right-end'\n | 'bottom-start'\n | 'bottom-end'\n | 'left-start'\n | 'left-end';\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport { provideFocusTrapState } from 'ng-primitives/focus-trap';\nimport { provideControlContainerIsolation } from 'ng-primitives/portal';\nimport { ngpRovingFocusGroup, provideRovingFocusGroupState } from 'ng-primitives/roving-focus';\nimport { injectMenuConfig } from '../config/menu-config';\nimport { ngpMenu, provideMenuState } from './menu-state';\n\n/**\n * The `NgpMenu` is a container for menu items.\n */\n@Directive({\n selector: '[ngpMenu]',\n exportAs: 'ngpMenu',\n providers: [\n // ensure we don't inherit the focus group from the parent menu if there is one\n provideRovingFocusGroupState({ inherit: false }),\n provideMenuState({ inherit: false }),\n provideFocusTrapState(),\n provideControlContainerIsolation(),\n ],\n})\nexport class NgpMenu {\n private readonly config = injectMenuConfig();\n\n /**\n * Whether focus should wrap around when reaching the end of the menu.\n * @default true\n */\n readonly wrap = input<boolean, BooleanInput>(this.config.wrap, {\n alias: 'ngpMenuWrap',\n transform: booleanAttribute,\n });\n\n private readonly state = ngpMenu({ wrap: this.wrap });\n\n constructor() {\n ngpRovingFocusGroup({ inherit: false, wrap: this.wrap });\n }\n\n /** @internal Close the menu and any parent menus */\n closeAllMenus(origin: FocusOrigin): void {\n this.state.closeAllMenus(origin);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -35,12 +35,13 @@ class NgpMeter {
35
35
  * Define a function that returns the meter value label.
36
36
  * @param value The current value
37
37
  * @param max The maximum value
38
+ * @param min The minimum value
38
39
  * @returns The value label
39
40
  */
40
- this.valueLabel = input((value, max) => `${Math.round((value / max) * 100)}%`, { ...(ngDevMode ? { debugName: "valueLabel" } : /* istanbul ignore next */ {}), alias: 'ngpMeterValueLabel' });
41
+ this.valueLabel = input((value, max, min) => `${max === min ? 0 : Math.round(((value - min) / (max - min)) * 100)}%`, { ...(ngDevMode ? { debugName: "valueLabel" } : /* istanbul ignore next */ {}), alias: 'ngpMeterValueLabel' });
41
42
  /** @internal Store the label instance */
42
43
  this.label = signal(null, ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
43
- /** @internal The percentage of the meter. */
44
+ /** @internal The percentage of the meter, used for the visual indicator width. */
44
45
  this.percentage = computed(() => {
45
46
  const value = this.state.value();
46
47
  const min = this.state.min();
@@ -56,11 +57,25 @@ class NgpMeter {
56
57
  }
57
58
  return ((value - min) / (max - min)) * 100;
58
59
  }, ...(ngDevMode ? [{ debugName: "percentage" }] : /* istanbul ignore next */ []));
60
+ /**
61
+ * @internal
62
+ * The raw value exposed via `aria-valuenow`, clamped to the [min, max] range.
63
+ * Per the ARIA meter pattern, `aria-valuenow` is the actual value, not a percentage.
64
+ */
65
+ this.valueNow = computed(() => {
66
+ const value = this.state.value();
67
+ const min = this.state.min();
68
+ const max = this.state.max();
69
+ if (value == null) {
70
+ return min;
71
+ }
72
+ return Math.min(Math.max(value, min), max);
73
+ }, ...(ngDevMode ? [{ debugName: "valueNow" }] : /* istanbul ignore next */ []));
59
74
  /** The state of the meter. */
60
75
  this.state = meterState(this);
61
76
  }
62
77
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpMeter, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
63
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: NgpMeter, isStandalone: true, selector: "[ngpMeter]", inputs: { value: { classPropertyName: "value", publicName: "ngpMeterValue", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "ngpMeterMin", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "ngpMeterMax", isSignal: true, isRequired: false, transformFunction: null }, valueLabel: { classPropertyName: "valueLabel", publicName: "ngpMeterValueLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "meter" }, properties: { "attr.aria-valuenow": "percentage()", "attr.aria-valuemin": "min()", "attr.aria-valuemax": "max()", "attr.aria-valuetext": "valueLabel()(value(), max())", "attr.aria-labelledby": "label()?.id()" } }, providers: [provideMeterState()], exportAs: ["ngpMeter"], ngImport: i0 }); }
78
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: NgpMeter, isStandalone: true, selector: "[ngpMeter]", inputs: { value: { classPropertyName: "value", publicName: "ngpMeterValue", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "ngpMeterMin", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "ngpMeterMax", isSignal: true, isRequired: false, transformFunction: null }, valueLabel: { classPropertyName: "valueLabel", publicName: "ngpMeterValueLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "meter" }, properties: { "attr.aria-valuenow": "valueNow()", "attr.aria-valuemin": "min()", "attr.aria-valuemax": "max()", "attr.aria-valuetext": "valueLabel()(value(), max(), min())", "attr.aria-labelledby": "label()?.id()" } }, providers: [provideMeterState()], exportAs: ["ngpMeter"], ngImport: i0 }); }
64
79
  }
65
80
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpMeter, decorators: [{
66
81
  type: Directive,
@@ -70,10 +85,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
70
85
  providers: [provideMeterState()],
71
86
  host: {
72
87
  role: 'meter',
73
- '[attr.aria-valuenow]': 'percentage()',
88
+ '[attr.aria-valuenow]': 'valueNow()',
74
89
  '[attr.aria-valuemin]': 'min()',
75
90
  '[attr.aria-valuemax]': 'max()',
76
- '[attr.aria-valuetext]': 'valueLabel()(value(), max())',
91
+ '[attr.aria-valuetext]': 'valueLabel()(value(), max(), min())',
77
92
  '[attr.aria-labelledby]': 'label()?.id()',
78
93
  },
79
94
  }]