ng-primitives 0.120.4 → 0.121.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.
- package/example-theme/index.css +9 -0
- package/fesm2022/ng-primitives-a11y.mjs +5 -5
- package/fesm2022/ng-primitives-a11y.mjs.map +1 -1
- package/fesm2022/ng-primitives-accordion.mjs +34 -51
- package/fesm2022/ng-primitives-accordion.mjs.map +1 -1
- package/fesm2022/ng-primitives-ai.mjs +39 -52
- package/fesm2022/ng-primitives-ai.mjs.map +1 -1
- package/fesm2022/ng-primitives-autofill.mjs +4 -4
- package/fesm2022/ng-primitives-autofill.mjs.map +1 -1
- package/fesm2022/ng-primitives-avatar.mjs +14 -17
- package/fesm2022/ng-primitives-avatar.mjs.map +1 -1
- package/fesm2022/ng-primitives-breadcrumbs.mjs +21 -21
- package/fesm2022/ng-primitives-breadcrumbs.mjs.map +1 -1
- package/fesm2022/ng-primitives-button.mjs +7 -9
- package/fesm2022/ng-primitives-button.mjs.map +1 -1
- package/fesm2022/ng-primitives-checkbox.mjs +15 -30
- package/fesm2022/ng-primitives-checkbox.mjs.map +1 -1
- package/fesm2022/ng-primitives-combobox.mjs +60 -92
- package/fesm2022/ng-primitives-combobox.mjs.map +1 -1
- package/fesm2022/ng-primitives-common.mjs +4 -4
- package/fesm2022/ng-primitives-common.mjs.map +1 -1
- package/fesm2022/ng-primitives-context-menu.mjs +68 -121
- package/fesm2022/ng-primitives-context-menu.mjs.map +1 -1
- package/fesm2022/ng-primitives-date-picker.mjs +91 -115
- package/fesm2022/ng-primitives-date-picker.mjs.map +1 -1
- package/fesm2022/ng-primitives-dialog.mjs +35 -51
- package/fesm2022/ng-primitives-dialog.mjs.map +1 -1
- package/fesm2022/ng-primitives-file-upload.mjs +26 -53
- package/fesm2022/ng-primitives-file-upload.mjs.map +1 -1
- package/fesm2022/ng-primitives-focus-trap.mjs +5 -8
- package/fesm2022/ng-primitives-focus-trap.mjs.map +1 -1
- package/fesm2022/ng-primitives-form-field.mjs +39 -44
- package/fesm2022/ng-primitives-form-field.mjs.map +1 -1
- package/fesm2022/ng-primitives-input-otp.mjs +30 -43
- package/fesm2022/ng-primitives-input-otp.mjs.map +1 -1
- package/fesm2022/ng-primitives-input.mjs +6 -8
- package/fesm2022/ng-primitives-input.mjs.map +1 -1
- package/fesm2022/ng-primitives-interactions.mjs +31 -48
- package/fesm2022/ng-primitives-interactions.mjs.map +1 -1
- package/fesm2022/ng-primitives-internal.mjs +39 -35
- package/fesm2022/ng-primitives-internal.mjs.map +1 -1
- package/fesm2022/ng-primitives-listbox.mjs +34 -48
- package/fesm2022/ng-primitives-listbox.mjs.map +1 -1
- package/fesm2022/ng-primitives-menu.mjs +85 -151
- package/fesm2022/ng-primitives-menu.mjs.map +1 -1
- package/fesm2022/ng-primitives-meter.mjs +25 -36
- package/fesm2022/ng-primitives-meter.mjs.map +1 -1
- package/fesm2022/ng-primitives-navigation-menu.mjs +60 -108
- package/fesm2022/ng-primitives-navigation-menu.mjs.map +1 -1
- package/fesm2022/ng-primitives-number-field.mjs +35 -59
- package/fesm2022/ng-primitives-number-field.mjs.map +1 -1
- package/fesm2022/ng-primitives-pagination.mjs +270 -297
- package/fesm2022/ng-primitives-pagination.mjs.map +1 -1
- package/fesm2022/ng-primitives-popover.mjs +209 -223
- package/fesm2022/ng-primitives-popover.mjs.map +1 -1
- package/fesm2022/ng-primitives-portal.mjs +88 -59
- package/fesm2022/ng-primitives-portal.mjs.map +1 -1
- package/fesm2022/ng-primitives-progress.mjs +30 -41
- package/fesm2022/ng-primitives-progress.mjs.map +1 -1
- package/fesm2022/ng-primitives-radio.mjs +20 -30
- package/fesm2022/ng-primitives-radio.mjs.map +1 -1
- package/fesm2022/ng-primitives-resize.mjs +3 -3
- package/fesm2022/ng-primitives-resize.mjs.map +1 -1
- package/fesm2022/ng-primitives-roving-focus.mjs +20 -34
- package/fesm2022/ng-primitives-roving-focus.mjs.map +1 -1
- package/fesm2022/ng-primitives-search.mjs +9 -9
- package/fesm2022/ng-primitives-search.mjs.map +1 -1
- package/fesm2022/ng-primitives-select.mjs +720 -620
- package/fesm2022/ng-primitives-select.mjs.map +1 -1
- package/fesm2022/ng-primitives-separator.mjs +4 -6
- package/fesm2022/ng-primitives-separator.mjs.map +1 -1
- package/fesm2022/ng-primitives-slider.mjs +63 -100
- package/fesm2022/ng-primitives-slider.mjs.map +1 -1
- package/fesm2022/ng-primitives-state.mjs +3 -3
- package/fesm2022/ng-primitives-state.mjs.map +1 -1
- package/fesm2022/ng-primitives-switch.mjs +15 -21
- package/fesm2022/ng-primitives-switch.mjs.map +1 -1
- package/fesm2022/ng-primitives-tabs.mjs +31 -41
- package/fesm2022/ng-primitives-tabs.mjs.map +1 -1
- package/fesm2022/ng-primitives-textarea.mjs +5 -7
- package/fesm2022/ng-primitives-textarea.mjs.map +1 -1
- package/fesm2022/ng-primitives-toast.mjs +30 -23
- package/fesm2022/ng-primitives-toast.mjs.map +1 -1
- package/fesm2022/ng-primitives-toggle-group.mjs +20 -36
- package/fesm2022/ng-primitives-toggle-group.mjs.map +1 -1
- package/fesm2022/ng-primitives-toggle.mjs +10 -19
- package/fesm2022/ng-primitives-toggle.mjs.map +1 -1
- package/fesm2022/ng-primitives-toolbar.mjs +4 -6
- package/fesm2022/ng-primitives-toolbar.mjs.map +1 -1
- package/fesm2022/ng-primitives-tooltip.mjs +401 -402
- package/fesm2022/ng-primitives-tooltip.mjs.map +1 -1
- package/fesm2022/ng-primitives-utils.mjs +5 -4
- package/fesm2022/ng-primitives-utils.mjs.map +1 -1
- package/package.json +56 -55
- package/schematics/ng-generate/templates/select/select.__fileSuffix@dasherize__.ts.template +48 -48
- package/{a11y/index.d.ts → types/ng-primitives-a11y.d.ts} +18 -24
- package/{accordion/index.d.ts → types/ng-primitives-accordion.d.ts} +85 -98
- package/{autofill/index.d.ts → types/ng-primitives-autofill.d.ts} +3 -10
- package/{avatar/index.d.ts → types/ng-primitives-avatar.d.ts} +7 -30
- package/{breadcrumbs/index.d.ts → types/ng-primitives-breadcrumbs.d.ts} +15 -70
- package/{button/index.d.ts → types/ng-primitives-button.d.ts} +23 -29
- package/{checkbox/index.d.ts → types/ng-primitives-checkbox.d.ts} +68 -74
- package/{combobox/index.d.ts → types/ng-primitives-combobox.d.ts} +35 -35
- package/{context-menu/index.d.ts → types/ng-primitives-context-menu.d.ts} +2 -1
- package/{date-picker/index.d.ts → types/ng-primitives-date-picker.d.ts} +2 -2
- package/{dialog/index.d.ts → types/ng-primitives-dialog.d.ts} +7 -2
- package/{file-upload/index.d.ts → types/ng-primitives-file-upload.d.ts} +5 -20
- package/{focus-trap/index.d.ts → types/ng-primitives-focus-trap.d.ts} +3 -10
- package/{form-field/index.d.ts → types/ng-primitives-form-field.d.ts} +9 -40
- package/{input/index.d.ts → types/ng-primitives-input.d.ts} +3 -10
- package/{menu/index.d.ts → types/ng-primitives-menu.d.ts} +17 -63
- package/{navigation-menu/index.d.ts → types/ng-primitives-navigation-menu.d.ts} +15 -70
- package/{number-field/index.d.ts → types/ng-primitives-number-field.d.ts} +80 -110
- package/types/ng-primitives-pagination.d.ts +502 -0
- package/{popover/index.d.ts → types/ng-primitives-popover.d.ts} +244 -57
- package/{portal/index.d.ts → types/ng-primitives-portal.d.ts} +22 -13
- package/{progress/index.d.ts → types/ng-primitives-progress.d.ts} +3 -10
- package/{roving-focus/index.d.ts → types/ng-primitives-roving-focus.d.ts} +65 -79
- package/types/ng-primitives-select.d.ts +687 -0
- package/{separator/index.d.ts → types/ng-primitives-separator.d.ts} +3 -10
- package/{slider/index.d.ts → types/ng-primitives-slider.d.ts} +76 -138
- package/{state/index.d.ts → types/ng-primitives-state.d.ts} +26 -21
- package/{switch/index.d.ts → types/ng-primitives-switch.d.ts} +50 -64
- package/{tabs/index.d.ts → types/ng-primitives-tabs.d.ts} +9 -40
- package/{textarea/index.d.ts → types/ng-primitives-textarea.d.ts} +3 -10
- package/{toast/index.d.ts → types/ng-primitives-toast.d.ts} +13 -1
- package/{toggle-group/index.d.ts → types/ng-primitives-toggle-group.d.ts} +75 -89
- package/{toggle/index.d.ts → types/ng-primitives-toggle.d.ts} +50 -56
- package/{toolbar/index.d.ts → types/ng-primitives-toolbar.d.ts} +3 -10
- package/types/ng-primitives-tooltip.d.ts +691 -0
- package/pagination/index.d.ts +0 -211
- package/select/index.d.ts +0 -396
- package/tooltip/index.d.ts +0 -384
- /package/{ai/index.d.ts → types/ng-primitives-ai.d.ts} +0 -0
- /package/{common/index.d.ts → types/ng-primitives-common.d.ts} +0 -0
- /package/{date-time-luxon/index.d.ts → types/ng-primitives-date-time-luxon.d.ts} +0 -0
- /package/{date-time/index.d.ts → types/ng-primitives-date-time.d.ts} +0 -0
- /package/{input-otp/index.d.ts → types/ng-primitives-input-otp.d.ts} +0 -0
- /package/{interactions/index.d.ts → types/ng-primitives-interactions.d.ts} +0 -0
- /package/{internal/index.d.ts → types/ng-primitives-internal.d.ts} +0 -0
- /package/{listbox/index.d.ts → types/ng-primitives-listbox.d.ts} +0 -0
- /package/{meter/index.d.ts → types/ng-primitives-meter.d.ts} +0 -0
- /package/{radio/index.d.ts → types/ng-primitives-radio.d.ts} +0 -0
- /package/{resize/index.d.ts → types/ng-primitives-resize.d.ts} +0 -0
- /package/{search/index.d.ts → types/ng-primitives-search.d.ts} +0 -0
- /package/{utils/index.d.ts → types/ng-primitives-utils.d.ts} +0 -0
- /package/{index.d.ts → types/ng-primitives.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-primitives-interactions.mjs","sources":["../../../../packages/ng-primitives/interactions/src/config/interactions-config.ts","../../../../packages/ng-primitives/interactions/src/focus-visible/focus-visible-interaction.ts","../../../../packages/ng-primitives/interactions/src/focus/focus-interaction.ts","../../../../packages/ng-primitives/interactions/src/hover/hover-interaction.ts","../../../../packages/ng-primitives/interactions/src/press/press-interaction.ts","../../../../packages/ng-primitives/interactions/src/interactions/interactions.ts","../../../../packages/ng-primitives/interactions/src/focus-visible/focus-visible.ts","../../../../packages/ng-primitives/interactions/src/focus/focus.ts","../../../../packages/ng-primitives/interactions/src/hover/hover.ts","../../../../packages/ng-primitives/interactions/src/move/move.ts","../../../../packages/ng-primitives/interactions/src/press/press.ts","../../../../packages/ng-primitives/interactions/src/index.ts","../../../../packages/ng-primitives/interactions/src/ng-primitives-interactions.ts"],"sourcesContent":["import { InjectionToken, Provider, inject } from '@angular/core';\n\nexport interface NgpInteractionsConfig {\n /** Whether all interactions are disabled */\n disabled?: boolean;\n /** Whether hover interactions are enabled */\n hover?: boolean;\n /** Whether focus interactions are enabled */\n focus?: boolean;\n /** Whether focus-visible interactions are enabled */\n focusVisible?: boolean;\n /** Whether press interactions are enabled */\n press?: boolean;\n}\n\nexport const defaultInteractionsConfig: NgpInteractionsConfig = {\n disabled: false,\n hover: true,\n focus: true,\n focusVisible: true,\n press: true,\n};\n\nexport const NgpInteractionsConfigToken = new InjectionToken<NgpInteractionsConfig>(\n 'NgpInteractionsConfigToken',\n);\n\n/**\n * Provide the default Interactions configuration\n * @param config The Interactions configuration\n * @returns The provider\n */\nexport function provideInteractionsConfig(config: Partial<NgpInteractionsConfig>): Provider[] {\n return [\n {\n provide: NgpInteractionsConfigToken,\n useValue: { ...defaultInteractionsConfig, ...config },\n },\n ];\n}\n\n/**\n * Inject the Interactions configuration\n * @returns The global Interactions configuration\n */\nexport function injectInteractionsConfig(): NgpInteractionsConfig {\n return inject(NgpInteractionsConfigToken, { optional: true }) ?? defaultInteractionsConfig;\n}\n\nexport function isHoverEnabled(): boolean {\n const config = injectInteractionsConfig();\n return !config.disabled && !!config.hover;\n}\n\nexport function isFocusEnabled(): boolean {\n const config = injectInteractionsConfig();\n return !config.disabled && !!config.focus;\n}\n\nexport function isFocusVisibleEnabled(): boolean {\n const config = injectInteractionsConfig();\n return !config.disabled && !!config.focusVisible;\n}\n\nexport function isPressEnabled(): boolean {\n const config = injectInteractionsConfig();\n return !config.disabled && !!config.press;\n}\n","import { FocusMonitor, FocusOrigin } from '@angular/cdk/a11y';\nimport { ElementRef, inject, Renderer2, Signal, signal } from '@angular/core';\nimport { onBooleanChange, safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { isFocusVisibleEnabled } from '../config/interactions-config';\n\nexport interface NgpFocusVisibleProps {\n disabled?: Signal<boolean>;\n onFocusChange?: (value: boolean) => void;\n}\n\nexport interface NgpFocusVisibleState {\n isFocused: Signal<boolean>;\n}\n\n/**\n * @internal\n */\nexport function ngpFocusVisible({\n onFocusChange,\n disabled = signal(false),\n}: NgpFocusVisibleProps): NgpFocusVisibleState {\n const canFocusVisible = isFocusVisibleEnabled();\n\n if (!canFocusVisible) {\n return { isFocused: signal(false) };\n }\n\n const elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n const renderer = inject(Renderer2);\n const focusMonitor = inject(FocusMonitor);\n\n // Whether the element is currently focused.\n const isFocused = signal<boolean>(false);\n\n // handle focus state\n focusMonitor\n .monitor(elementRef.nativeElement)\n .pipe(safeTakeUntilDestroyed())\n .subscribe(origin =>\n // null indicates the element was blurred\n origin === null ? onBlur() : onFocus(origin),\n );\n\n // if the component becomes disabled and it is focused, hide the focus\n onBooleanChange(disabled, () => focus(false));\n\n function onFocus(origin: FocusOrigin): void {\n if (disabled() || isFocused()) {\n return;\n }\n\n // for some elements the focus visible state should always appear on focus\n if (alwaysShowFocus()) {\n focus(true, origin);\n return;\n }\n\n // if the focus origin is keyboard or program(focused programmatically), then the focus is visible\n if (origin === 'keyboard') {\n focus(true, 'keyboard');\n return;\n }\n }\n\n function onBlur(): void {\n if (disabled() || !isFocused()) {\n return;\n }\n\n focus(false);\n }\n\n /**\n * Trigger the focus signal along with the focusChange event.\n */\n function focus(value: boolean, origin?: FocusOrigin) {\n if (isFocused() === value) {\n return;\n }\n\n isFocused.set(value);\n onFocusChange?.(value);\n\n if (value) {\n renderer.setAttribute(elementRef.nativeElement, 'data-focus-visible', origin ?? '');\n } else {\n renderer.removeAttribute(elementRef.nativeElement, 'data-focus-visible');\n }\n }\n\n function alwaysShowFocus(): boolean {\n const nonTextInputTypes = [\n 'checkbox',\n 'radio',\n 'range',\n 'color',\n 'file',\n 'image',\n 'button',\n 'submit',\n 'reset',\n ];\n\n // if this is an input element and it is a text input\n if (\n elementRef.nativeElement instanceof HTMLInputElement &&\n !nonTextInputTypes.includes(elementRef.nativeElement.type)\n ) {\n return true;\n }\n\n // if this is a textarea\n if (elementRef.nativeElement instanceof HTMLTextAreaElement) {\n return true;\n }\n\n // if this is an element with contenteditable\n if (\n elementRef.nativeElement.isContentEditable ||\n elementRef.nativeElement.hasAttribute('contenteditable')\n ) {\n return true;\n }\n\n return false;\n }\n\n return {\n isFocused,\n };\n}\n","import { FocusMonitor } from '@angular/cdk/a11y';\nimport { ElementRef, Renderer2, Signal, inject, signal } from '@angular/core';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { isFocusEnabled } from '../config/interactions-config';\n\nexport interface NgpFocusProps {\n disabled?: Signal<boolean>;\n focusWithin?: boolean;\n onFocus?: () => void;\n onBlur?: () => void;\n}\n\nexport interface NgpFocusState {\n isFocused: Signal<boolean>;\n}\n\n/**\n * @internal\n */\nexport function ngpFocus({\n onFocus,\n onBlur,\n focusWithin = false,\n disabled = signal(false),\n}: NgpFocusProps): NgpFocusState {\n const canFocus = isFocusEnabled();\n\n if (!canFocus) {\n return { isFocused: signal(false) };\n }\n /**\n * Access the element reference.\n */\n const elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Access the focus monitor.\n */\n const focusMonitor = inject(FocusMonitor);\n\n /**\n * Access the renderer.\n */\n const renderer = inject(Renderer2);\n\n /**\n * Whether the element is currently focused.\n */\n const isFocused = signal<boolean>(false);\n\n focusMonitor\n .monitor(elementRef, focusWithin)\n .pipe(safeTakeUntilDestroyed())\n .subscribe(focusOrigin => {\n if (disabled()) {\n return;\n }\n\n isFocused.set(focusOrigin !== null);\n if (focusOrigin !== null) {\n if (onFocus) {\n onFocus();\n }\n renderer.setAttribute(elementRef.nativeElement, 'data-focus', '');\n } else {\n if (onBlur) {\n onBlur();\n }\n renderer.removeAttribute(elementRef.nativeElement, 'data-focus');\n }\n });\n\n return { isFocused };\n}\n","import { ElementRef, inject, Signal, signal } from '@angular/core';\nimport { onDomRemoval } from 'ng-primitives/internal';\nimport { dataBinding, listener } from 'ng-primitives/state';\nimport { onBooleanChange } from 'ng-primitives/utils';\nimport { isHoverEnabled } from '../config/interactions-config';\n\n// Module-level flag that tracks whether the user's last input was a touch.\n// Kept outside Angular DI so it survives service destruction during SSR\n// hydration, micro-frontend re-bootstrap, or any scenario that re-creates\n// the root injector. A timeout can't cover delayed emulated events — iOS\n// may fire an emulated pointerenter long after the originating touch\n// (e.g. after the user navigates away and then taps browser-back).\n//\n// iOS emulated mouse events never dispatch `pointermove`; only a real\n// pointing device does. So a non-touch pointermove is a reliable signal\n// that the user has returned to a real mouse.\nlet hadRecentTouch = false;\n\nif (typeof document !== 'undefined') {\n document.addEventListener('touchend', () => (hadRecentTouch = true), true);\n document.addEventListener(\n 'pointerup',\n event => {\n if ((event as PointerEvent).pointerType === 'touch') hadRecentTouch = true;\n },\n true,\n );\n document.addEventListener(\n 'pointermove',\n event => {\n if ((event as PointerEvent).pointerType !== 'touch') hadRecentTouch = false;\n },\n true,\n );\n}\n\ninterface NgpHoverProps {\n disabled?: Signal<boolean>;\n onHoverStart?: () => void;\n onHoverEnd?: () => void;\n}\n\nexport interface NgpHoverState {\n hovered: Signal<boolean>;\n}\n\n/**\n * Programatically add the hover functionality to an element.\n * This is useful in cases where we can't necessarily use a HostDirective,\n * because there is a chance the directive has already been used.\n * @internal\n */\nexport function ngpHover({\n onHoverStart,\n onHoverEnd,\n disabled = signal(false),\n}: NgpHoverProps): NgpHoverState {\n const canHover = isHoverEnabled();\n\n if (!canHover) {\n return { hovered: signal(false) };\n }\n\n /**\n * Access the element.\n */\n const elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Store the current hover state.\n */\n const hovered = signal<boolean>(false);\n\n /**\n * Whether this element should ignore emulated mouse events.\n */\n let ignoreEmulatedMouseEvents: boolean = false;\n\n /**\n * Setup event listeners.\n */\n listener(elementRef.nativeElement, 'pointerenter', onPointerEnter);\n listener(elementRef.nativeElement, 'pointerleave', onPointerLeave);\n listener(elementRef.nativeElement, 'touchstart', onTouchStart, { config: { passive: true } });\n listener(elementRef.nativeElement, 'mouseenter', onMouseEnter);\n listener(elementRef.nativeElement, 'mouseleave', onMouseLeave);\n\n // anytime the disabled state changes to true, we must reset the hover state\n if (disabled) {\n onBooleanChange(disabled, reset);\n }\n\n // if the element is removed from the dom, we want to reset the hover state\n onDomRemoval(elementRef.nativeElement, reset);\n\n // anytime the hover state changes we want to update the attribute\n dataBinding(elementRef, 'data-hover', hovered);\n\n /**\n * Reset the hover state.\n */\n function reset(): void {\n onHoverFinished('mouse');\n }\n\n /**\n * Trigger the hover start events.\n * @param event\n * @param pointerType\n */\n function onHoverBegin(event: Event, pointerType: string): void {\n if (\n disabled() ||\n pointerType === 'touch' ||\n hovered() ||\n !(event.currentTarget as Element)?.contains(event.target as Element)\n ) {\n return;\n }\n\n hovered.set(true);\n onHoverStart?.();\n }\n\n /**\n * Trigger the hover end events.\n * @param pointerType\n */\n function onHoverFinished(pointerType: string): void {\n if (pointerType === 'touch' || !hovered()) {\n return;\n }\n\n hovered.set(false);\n onHoverEnd?.();\n }\n\n function onPointerEnter(event: PointerEvent): void {\n if (event.pointerType === 'mouse' && (ignoreEmulatedMouseEvents || hadRecentTouch)) {\n return;\n }\n\n onHoverBegin(event, event.pointerType);\n }\n\n function onPointerLeave(event: PointerEvent): void {\n if (!disabled() && (event.currentTarget as Element)?.contains(event.target as Element)) {\n onHoverFinished(event.pointerType);\n }\n }\n\n function onTouchStart(): void {\n ignoreEmulatedMouseEvents = true;\n if (hovered()) {\n onHoverFinished('mouse');\n }\n }\n\n function onMouseEnter(event: MouseEvent): void {\n if (!ignoreEmulatedMouseEvents && !hadRecentTouch) {\n onHoverBegin(event, 'mouse');\n }\n\n ignoreEmulatedMouseEvents = false;\n }\n\n function onMouseLeave(event: MouseEvent): void {\n if (!disabled() && (event.currentTarget as Element)?.contains(event.target as Element)) {\n onHoverFinished('mouse');\n }\n }\n\n return { hovered };\n}\n","import { inject, Injector, Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { dataBinding, listener } from 'ng-primitives/state';\nimport { isPressEnabled } from '../config/interactions-config';\n\ninterface NgpPressState {\n pressed: Signal<boolean>;\n}\n\ninterface NgpPressProps {\n disabled?: Signal<boolean>;\n onPressStart?: () => void;\n onPressEnd?: () => void;\n}\n\nconst NON_TEXT_INPUT_TYPES = new Set([\n 'button',\n 'checkbox',\n 'color',\n 'file',\n 'image',\n 'radio',\n 'range',\n 'reset',\n 'submit',\n]);\n\n/**\n * @internal\n */\nexport function ngpPress({\n onPressStart,\n onPressEnd,\n disabled = signal(false),\n}: NgpPressProps): NgpPressState {\n const canPress = isPressEnabled();\n\n if (!canPress) {\n return { pressed: signal(false) };\n }\n\n const elementRef = injectElementRef();\n const injector = inject(Injector);\n\n /**\n * Whether the element is currently pressed.\n */\n const pressed = signal<boolean>(false);\n\n /**\n * Track which key started the press to prevent mismatched keyup from ending it.\n */\n let activeKey: string | null = null;\n\n // setup event listeners\n listener(elementRef, 'pointerdown', onPointerDown);\n listener(elementRef, 'keydown', onKeyDown);\n\n // anytime the press state changes we want to update the attribute\n dataBinding(elementRef, 'data-press', () => pressed() && !disabled());\n\n /**\n * Reset the press state.\n */\n function reset(): void {\n // if we are not pressing, then do nothing\n if (!pressed()) {\n return;\n }\n\n // clear any existing disposables\n disposableListeners.forEach(dispose => dispose());\n activeKey = null;\n pressed.set(false);\n onPressEnd?.();\n }\n\n /**\n * Store the list of disposables.\n */\n let disposableListeners: (() => void)[] = [];\n\n function onPointerDown(): void {\n if (disabled()) {\n return;\n }\n\n // clear any existing disposables\n disposableListeners.forEach(dispose => dispose());\n\n // update the press state\n pressed.set(true);\n onPressStart?.();\n\n // setup global event listeners to catch events on elements outside the directive\n const ownerDocument = elementRef.nativeElement.ownerDocument ?? document;\n\n // if the pointer up event happens on any elements, then we are no longer pressing on this element\n const pointerUp = listener(ownerDocument, 'pointerup', () => reset(), {\n config: false,\n injector,\n });\n\n // Instead of relying on the `pointerleave` event, which is not consistently called on iOS Safari,\n // we use the `pointermove` event to determine if we are still \"pressing\".\n // By checking if the target is still within the element, we can determine if the press is ongoing.\n const pointerMove = listener(ownerDocument, 'pointermove', onPointerMove as EventListener, {\n config: false,\n injector,\n });\n\n // if the pointer is cancelled, then we are no longer pressing on this element\n const pointerCancel = listener(ownerDocument, 'pointercancel', () => reset(), {\n config: false,\n injector,\n });\n\n disposableListeners = [pointerUp, pointerMove, pointerCancel];\n }\n\n function onKeyDown(event: KeyboardEvent): void {\n if (disabled() || pressed() || event.repeat) {\n return;\n }\n\n if (isEditableTarget(event)) {\n return;\n }\n\n if (event.key !== 'Enter' && event.key !== ' ') {\n return;\n }\n\n activeKey = event.key;\n pressed.set(true);\n onPressStart?.();\n\n const ownerDocument = elementRef.nativeElement.ownerDocument ?? document;\n\n const keyUp = listener(\n ownerDocument,\n 'keyup',\n (keyUpEvent: KeyboardEvent) => {\n if (keyUpEvent.key === activeKey) {\n reset();\n }\n },\n { config: false, injector },\n );\n\n const blur = listener(elementRef, 'blur', () => reset(), {\n config: false,\n injector,\n });\n\n disposableListeners = [keyUp, blur];\n }\n\n function onPointerMove(event: PointerEvent): void {\n if (\n elementRef.nativeElement !== event.target &&\n !elementRef.nativeElement.contains(event.target as Node)\n ) {\n reset();\n }\n }\n\n function isEditableTarget(event: KeyboardEvent): boolean {\n const target = event.target;\n\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n\n if (target.isContentEditable || target instanceof HTMLTextAreaElement) {\n return true;\n }\n\n if (!(target instanceof HTMLInputElement)) {\n return false;\n }\n\n const inputType = target.type.toLowerCase();\n return !NON_TEXT_INPUT_TYPES.has(inputType);\n }\n\n return { pressed };\n}\n","import { signal, Signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { ngpFocusVisible } from '../focus-visible/focus-visible-interaction';\nimport { ngpFocus } from '../focus/focus-interaction';\nimport { ngpHover } from '../hover/hover-interaction';\nimport { ngpPress } from '../press/press-interaction';\n\nexport interface NgpInteractionOptions {\n hover?: boolean;\n press?: boolean;\n focus?: boolean;\n focusWithin?: boolean;\n focusVisible?: boolean;\n disabled?: Signal<boolean>;\n}\n\n/**\n * Setup the interactions without relying on HostDirectives.\n * @internal\n */\nexport function ngpInteractions({\n focus,\n hover,\n press,\n focusWithin,\n focusVisible,\n disabled = signal(false),\n}: NgpInteractionOptions): void {\n const elementRef = injectElementRef();\n // If the interaction has already been setup, we can skip the setup.\n if (hasInteraction(elementRef.nativeElement, 'interactions')) {\n return;\n }\n\n if (hover) {\n ngpHover({ disabled });\n }\n if (press) {\n ngpPress({ disabled });\n }\n if (focus) {\n ngpFocus({ focusWithin, disabled });\n }\n if (focusVisible) {\n ngpFocusVisible({ disabled });\n }\n}\n\n/**\n * This function checks to see if a given interaction has already been setup on a given element.\n * If it has, it returns the existing interaction state.\n * If it has not, it sets up the interaction state for future checks.\n */\nexport function hasInteraction(element: HTMLElement, interaction: string): boolean {\n const hasInteraction = `__ngp-${interaction}` in element;\n\n // if the interaction has not been setup, we mark it as setup for future checks\n if (!hasInteraction) {\n (element as unknown as Record<string, unknown>)[`__ngp-${interaction}`] = true;\n }\n\n return hasInteraction;\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { Directive, booleanAttribute, input, output } from '@angular/core';\nimport { ngpFocusVisible } from './focus-visible-interaction';\n\n/**\n * Apply the `ngpFocusVisible` directive to an element that should be visually focused. This is similar to `ngpFocus`\n * but it will only apply the focus visible styles when the element is focused via keyboard navigation.\n */\n@Directive({\n selector: '[ngpFocusVisible]',\n exportAs: 'ngpFocusVisible',\n})\nexport class NgpFocusVisible {\n /**\n * Whether focus events are listened to.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpFocusVisibleDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Emit when the element is visually focused.\n */\n readonly focusChange = output<boolean>({\n alias: 'ngpFocusVisible',\n });\n\n constructor() {\n // setup the focus visible listener\n ngpFocusVisible({\n disabled: this.disabled,\n onFocusChange: value => this.focusChange.emit(value),\n });\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { Directive, booleanAttribute, input, output } from '@angular/core';\nimport { ngpFocus } from './focus-interaction';\n\n/**\n * This was inspired by the React Aria useFocus hook.\n * https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/interactions/src/useFocus.ts#L20\n */\n@Directive({\n selector: '[ngpFocus]',\n exportAs: 'ngpFocus',\n})\nexport class NgpFocus {\n /**\n * Whether listening for focus events is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpFocusDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Emit when the focus state changes.\n */\n readonly focus = output<boolean>({ alias: 'ngpFocus' });\n\n constructor() {\n // setup the focus listener\n ngpFocus({\n disabled: this.disabled,\n onFocus: () => this.focus.emit(true),\n onBlur: () => this.focus.emit(false),\n });\n }\n}\n","import type { BooleanInput } from '@angular/cdk/coercion';\nimport { Directive, booleanAttribute, input, output } from '@angular/core';\nimport { ngpHover } from './hover-interaction';\n\n// This is an Angular port of the useHover hook from react-aria: https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/interactions/src/useHover.ts\n\n/**\n * Apply the `ngpHover` directive to an element that you want to listen for hover events. T\n * his is particulaly useful for supporting hover events on touch devices, where hover events are not handled consistently.\n * On iOS relying on the `:hover` pseudo-class can result in the hover state being stuck until the user taps elsewhere on the screen.\n */\n@Directive({\n selector: '[ngpHover]',\n exportAs: 'ngpHover',\n})\nexport class NgpHover {\n /**\n * Whether hoving should be disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpHoverDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Emit an event when hovering starts.\n */\n readonly hoverStart = output<void>({ alias: 'ngpHoverStart' });\n\n /**\n * Emit an event when hovering ends.\n */\n readonly hoverEnd = output<void>({ alias: 'ngpHoverEnd' });\n\n /**\n * Emit an event when the hover state changes.\n */\n readonly hoverChange = output<boolean>({ alias: 'ngpHover' });\n\n /**\n * Setup the hover state.\n */\n constructor() {\n // setup the hover listener\n ngpHover({\n onHoverStart: () => {\n this.hoverStart.emit();\n this.hoverChange.emit(true);\n },\n onHoverEnd: () => {\n this.hoverEnd.emit();\n this.hoverChange.emit(false);\n },\n disabled: this.disabled,\n });\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, HostListener, input, output, signal } from '@angular/core';\nimport { injectDisposables } from 'ng-primitives/utils';\n\n// Inspired by react-aria useMove hook: https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/interactions/src/useMove.ts\n\n/**\n * The `NgpMove` directive is used to enable the pointer and keyboard move interactions on an element.\n */\n@Directive({\n selector: '[ngpMove]',\n exportAs: 'ngpMove',\n host: {\n '[attr.data-move]': 'isMoving() ? \"\" : null',\n },\n})\nexport class NgpMove {\n /**\n * Access the disposable helper.\n */\n private readonly disposables = injectDisposables();\n\n /**\n * Whether movement is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMoveDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Emit when the move event begins.\n */\n readonly start = output<NgpMoveStartEvent>({\n alias: 'ngpMoveStart',\n });\n\n /**\n * Emit when the element is moved.\n */\n readonly move = output<NgpMoveEvent>({\n alias: 'ngpMove',\n });\n\n /**\n * Emit when the move event ends.\n */\n readonly end = output<NgpMoveEndEvent>({\n alias: 'ngpMoveEnd',\n });\n\n /**\n * Whether the element is currently being moved.\n */\n protected isMoving = signal<boolean>(false);\n\n /**\n * Store the last x position of the element.\n */\n private x: number | null = null;\n\n /**\n * Store the last y position of the element.\n */\n private y: number | null = null;\n\n /**\n * Store the id of the last pointer.\n */\n private pointerId: number | null = null;\n\n /**\n * Store the disposable event listeners.\n */\n private disposableListeners: (() => void)[] = [];\n\n /**\n * Handle a move start.\n */\n private onMoveStart(event: PointerEvent | KeyboardEvent, pointerType: PointerType): void {\n this.start.emit({\n pointerType,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n altKey: event.altKey,\n });\n this.isMoving.set(true);\n }\n\n /**\n * Handle a move event.\n */\n private onMove(\n event: PointerEvent | KeyboardEvent,\n pointerType: PointerType,\n deltaX: number,\n deltaY: number,\n ): void {\n if (deltaX === 0 && deltaY === 0) {\n return;\n }\n\n this.move.emit({\n deltaX,\n deltaY,\n pointerType,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n altKey: event.altKey,\n });\n }\n\n /**\n * Handle a move end.\n */\n private onMoveEnd(event: PointerEvent | KeyboardEvent, pointerType: PointerType): void {\n this.end.emit({\n pointerType,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n altKey: event.altKey,\n });\n this.isMoving.set(false);\n }\n\n /**\n * Handle the pointer down event.\n */\n @HostListener('pointerdown', ['$event'])\n protected onPointerDown(event: PointerEvent): void {\n // ignore right-click or additional pointers\n if (event.button !== 0 || this.pointerId !== null || this.disabled()) {\n return;\n }\n\n // prevent the default behavior\n event.preventDefault();\n event.stopPropagation();\n\n this.onMoveStart(event, event.pointerType as PointerType);\n\n // store the pointer id and initial position\n this.pointerId = event.pointerId;\n this.x = event.pageX;\n this.y = event.pageY;\n\n // add global event listeners\n const pointerMove = this.disposables.addEventListener(\n window,\n 'pointermove',\n this.onPointerMove.bind(this) as EventListener,\n false,\n );\n\n const pointerUp = this.disposables.addEventListener(\n window,\n 'pointerup',\n this.onPointerUp.bind(this) as EventListener,\n false,\n );\n\n const pointerCancel = this.disposables.addEventListener(\n window,\n 'pointercancel',\n this.onPointerUp.bind(this) as EventListener,\n false,\n );\n\n // store the disposable event listeners\n this.disposableListeners = [pointerMove, pointerUp, pointerCancel];\n }\n\n /**\n * Handle the pointer up event.\n */\n protected onPointerUp(event: PointerEvent): void {\n if (this.pointerId !== event.pointerId) {\n return;\n }\n\n const pointerType = (event.pointerType ?? 'mouse') as PointerType;\n this.onMoveEnd(event, pointerType);\n this.pointerId = null;\n this.disposableListeners.forEach(dispose => dispose());\n }\n\n /**\n * Handle the pointer move event.\n */\n protected onPointerMove(event: PointerEvent): void {\n if (this.pointerId !== event.pointerId) {\n return;\n }\n\n // Problems with PointerEvent#movementX/movementY:\n // 1. it is always 0 on macOS Safari.\n // 2. On Chrome Android, it's scaled by devicePixelRatio, but not on Chrome macOS\n this.onMove(\n event,\n event.pointerType as PointerType,\n event.pageX - (this.x ?? 0),\n event.pageY - (this.y ?? 0),\n );\n this.x = event.pageX;\n this.y = event.pageY;\n }\n\n private triggerKeyboardMove(event: KeyboardEvent, deltaX: number, deltaY: number): void {\n if (this.disabled()) {\n return;\n }\n\n this.onMoveStart(event, 'keyboard');\n this.onMove(event, 'keyboard', deltaX, deltaY);\n this.onMoveEnd(event, 'keyboard');\n }\n\n @HostListener('keydown.ArrowUp', ['$event'])\n protected onArrowUp(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.triggerKeyboardMove(event as KeyboardEvent, 0, -1);\n }\n\n @HostListener('keydown.ArrowDown', ['$event'])\n protected onArrowDown(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.triggerKeyboardMove(event as KeyboardEvent, 0, 1);\n }\n\n @HostListener('keydown.ArrowLeft', ['$event'])\n protected onArrowLeft(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.triggerKeyboardMove(event as KeyboardEvent, -1, 0);\n }\n\n @HostListener('keydown.ArrowRight', ['$event'])\n protected onArrowRight(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.triggerKeyboardMove(event as KeyboardEvent, 1, 0);\n }\n}\n\ninterface NgpMoveBaseEvent {\n /**\n * Whether the event was triggered by a mouse or keyboard event.\n */\n pointerType: PointerType;\n /**\n * Whether the shift key was pressed during the event.\n */\n shiftKey: boolean;\n /**\n * Whether the control key was pressed during the event.\n */\n ctrlKey: boolean;\n /**\n * Whether the meta key was pressed during the event.\n */\n metaKey: boolean;\n /**\n * Whether the alt key was pressed during the event.\n */\n altKey: boolean;\n}\n\nexport type NgpMoveStartEvent = NgpMoveBaseEvent;\nexport type NgpMoveEndEvent = NgpMoveBaseEvent;\n\nexport interface NgpMoveEvent extends NgpMoveBaseEvent {\n /**\n * The amount of pixels moved in the x-axis.\n */\n deltaX: number;\n /**\n * The amount of pixels moved in the y-axis.\n */\n deltaY: number;\n}\n\nexport type PointerType = 'mouse' | 'pen' | 'touch' | 'keyboard' | 'virtual';\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { Directive, booleanAttribute, input, output } from '@angular/core';\nimport { ngpPress } from './press-interaction';\n\n// This was inpsired by Headless UI's active-press hook: https://github.com/tailwindlabs/headlessui/blob/main/packages/%40headlessui-react/src/hooks/use-active-press.tsx\n\n/**\n * The `ngpPress` directive listens for press events on an element. This is particularly useful for supporting press events on touch devices, where press events are not handled consistently.\n */\n@Directive({\n selector: '[ngpPress]',\n exportAs: 'ngpPress',\n})\nexport class NgpPress {\n /**\n * Whether listening for press events is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpPressDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Emit when the press begins.\n */\n readonly pressStart = output<void>({\n alias: 'ngpPressStart',\n });\n\n /**\n * Emit when the press ends.\n */\n readonly pressEnd = output<void>({\n alias: 'ngpPressEnd',\n });\n\n /**\n * Emit when the press changes.\n */\n readonly pressChange = output<boolean>({\n alias: 'ngpPress',\n });\n\n constructor() {\n // setup the press listener\n ngpPress({\n onPressStart: () => {\n this.pressStart.emit();\n this.pressChange.emit(true);\n },\n onPressEnd: () => {\n this.pressEnd.emit();\n this.pressChange.emit(false);\n },\n disabled: this.disabled,\n });\n }\n}\n","// re-export ngpInteractions as setupInteractions for backwards compatibility\nimport { ngpInteractions } from './interactions/interactions';\n\nexport { NgpInteractionsConfig, provideInteractionsConfig } from './config/interactions-config';\nexport { NgpFocusVisible } from './focus-visible/focus-visible';\nexport { ngpFocusVisible } from './focus-visible/focus-visible-interaction';\nexport { NgpFocus } from './focus/focus';\nexport { ngpFocus } from './focus/focus-interaction';\nexport { NgpHover } from './hover/hover';\nexport { ngpHover } from './hover/hover-interaction';\nexport { ngpInteractions } from './interactions/interactions';\nexport { NgpMove, NgpMoveEvent } from './move/move';\nexport { NgpPress } from './press/press';\nexport { ngpPress } from './press/press-interaction';\n\n/**\n * @deprecated use `ngpInteractions` instead\n */\nexport { ngpInteractions as setupInteractions };\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AAeO,MAAM,yBAAyB,GAA0B;AAC9D,IAAA,QAAQ,EAAE,KAAK;AACf,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,KAAK,EAAE,IAAI;CACZ;AAEM,MAAM,0BAA0B,GAAG,IAAI,cAAc,CAC1D,4BAA4B,CAC7B;AAED;;;;AAIG;AACG,SAAU,yBAAyB,CAAC,MAAsC,EAAA;IAC9E,OAAO;AACL,QAAA;AACE,YAAA,OAAO,EAAE,0BAA0B;AACnC,YAAA,QAAQ,EAAE,EAAE,GAAG,yBAAyB,EAAE,GAAG,MAAM,EAAE;AACtD,SAAA;KACF;AACH;AAEA;;;AAGG;SACa,wBAAwB,GAAA;AACtC,IAAA,OAAO,MAAM,CAAC,0BAA0B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,yBAAyB;AAC5F;SAEgB,cAAc,GAAA;AAC5B,IAAA,MAAM,MAAM,GAAG,wBAAwB,EAAE;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK;AAC3C;SAEgB,cAAc,GAAA;AAC5B,IAAA,MAAM,MAAM,GAAG,wBAAwB,EAAE;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK;AAC3C;SAEgB,qBAAqB,GAAA;AACnC,IAAA,MAAM,MAAM,GAAG,wBAAwB,EAAE;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,YAAY;AAClD;SAEgB,cAAc,GAAA;AAC5B,IAAA,MAAM,MAAM,GAAG,wBAAwB,EAAE;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK;AAC3C;;ACrDA;;AAEG;AACG,SAAU,eAAe,CAAC,EAC9B,aAAa,EACb,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GACH,EAAA;AACrB,IAAA,MAAM,eAAe,GAAG,qBAAqB,EAAE;IAE/C,IAAI,CAAC,eAAe,EAAE;QACpB,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;IACrC;AAEA,IAAA,MAAM,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC;AAC9D,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAClC,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;AAGzC,IAAA,MAAM,SAAS,GAAG,MAAM,CAAU,KAAK,qDAAC;;IAGxC;AACG,SAAA,OAAO,CAAC,UAAU,CAAC,aAAa;SAChC,IAAI,CAAC,sBAAsB,EAAE;SAC7B,SAAS,CAAC,MAAM;;AAEf,IAAA,MAAM,KAAK,IAAI,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAC7C;;IAGH,eAAe,CAAC,QAAQ,EAAE,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;IAE7C,SAAS,OAAO,CAAC,MAAmB,EAAA;AAClC,QAAA,IAAI,QAAQ,EAAE,IAAI,SAAS,EAAE,EAAE;YAC7B;QACF;;QAGA,IAAI,eAAe,EAAE,EAAE;AACrB,YAAA,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;YACnB;QACF;;AAGA,QAAA,IAAI,MAAM,KAAK,UAAU,EAAE;AACzB,YAAA,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC;YACvB;QACF;IACF;AAEA,IAAA,SAAS,MAAM,GAAA;AACb,QAAA,IAAI,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE;YAC9B;QACF;QAEA,KAAK,CAAC,KAAK,CAAC;IACd;AAEA;;AAEG;AACH,IAAA,SAAS,KAAK,CAAC,KAAc,EAAE,MAAoB,EAAA;AACjD,QAAA,IAAI,SAAS,EAAE,KAAK,KAAK,EAAE;YACzB;QACF;AAEA,QAAA,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,QAAA,aAAa,GAAG,KAAK,CAAC;QAEtB,IAAI,KAAK,EAAE;AACT,YAAA,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,aAAa,EAAE,oBAAoB,EAAE,MAAM,IAAI,EAAE,CAAC;QACrF;aAAO;YACL,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC,aAAa,EAAE,oBAAoB,CAAC;QAC1E;IACF;AAEA,IAAA,SAAS,eAAe,GAAA;AACtB,QAAA,MAAM,iBAAiB,GAAG;YACxB,UAAU;YACV,OAAO;YACP,OAAO;YACP,OAAO;YACP,MAAM;YACN,OAAO;YACP,QAAQ;YACR,QAAQ;YACR,OAAO;SACR;;AAGD,QAAA,IACE,UAAU,CAAC,aAAa,YAAY,gBAAgB;YACpD,CAAC,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,EAC1D;AACA,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,IAAI,UAAU,CAAC,aAAa,YAAY,mBAAmB,EAAE;AAC3D,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,IACE,UAAU,CAAC,aAAa,CAAC,iBAAiB;YAC1C,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,iBAAiB,CAAC,EACxD;AACA,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,KAAK;IACd;IAEA,OAAO;QACL,SAAS;KACV;AACH;;AClHA;;AAEG;SACa,QAAQ,CAAC,EACvB,OAAO,EACP,MAAM,EACN,WAAW,GAAG,KAAK,EACnB,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GACV,EAAA;AACd,IAAA,MAAM,QAAQ,GAAG,cAAc,EAAE;IAEjC,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;IACrC;AACA;;AAEG;AACH,IAAA,MAAM,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC;AAE9D;;AAEG;AACH,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AAEzC;;AAEG;AACH,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAElC;;AAEG;AACH,IAAA,MAAM,SAAS,GAAG,MAAM,CAAU,KAAK,qDAAC;IAExC;AACG,SAAA,OAAO,CAAC,UAAU,EAAE,WAAW;SAC/B,IAAI,CAAC,sBAAsB,EAAE;SAC7B,SAAS,CAAC,WAAW,IAAG;QACvB,IAAI,QAAQ,EAAE,EAAE;YACd;QACF;AAEA,QAAA,SAAS,CAAC,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC;AACnC,QAAA,IAAI,WAAW,KAAK,IAAI,EAAE;YACxB,IAAI,OAAO,EAAE;AACX,gBAAA,OAAO,EAAE;YACX;YACA,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,aAAa,EAAE,YAAY,EAAE,EAAE,CAAC;QACnE;aAAO;YACL,IAAI,MAAM,EAAE;AACV,gBAAA,MAAM,EAAE;YACV;YACA,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC,aAAa,EAAE,YAAY,CAAC;QAClE;AACF,IAAA,CAAC,CAAC;IAEJ,OAAO,EAAE,SAAS,EAAE;AACtB;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,cAAc,GAAG,KAAK;AAE1B,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;AACnC,IAAA,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,cAAc,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC;AAC1E,IAAA,QAAQ,CAAC,gBAAgB,CACvB,WAAW,EACX,KAAK,IAAG;AACN,QAAA,IAAK,KAAsB,CAAC,WAAW,KAAK,OAAO;YAAE,cAAc,GAAG,IAAI;IAC5E,CAAC,EACD,IAAI,CACL;AACD,IAAA,QAAQ,CAAC,gBAAgB,CACvB,aAAa,EACb,KAAK,IAAG;AACN,QAAA,IAAK,KAAsB,CAAC,WAAW,KAAK,OAAO;YAAE,cAAc,GAAG,KAAK;IAC7E,CAAC,EACD,IAAI,CACL;AACH;AAYA;;;;;AAKG;AACG,SAAU,QAAQ,CAAC,EACvB,YAAY,EACZ,UAAU,EACV,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GACV,EAAA;AACd,IAAA,MAAM,QAAQ,GAAG,cAAc,EAAE;IAEjC,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;IACnC;AAEA;;AAEG;AACH,IAAA,MAAM,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC;AAE9D;;AAEG;AACH,IAAA,MAAM,OAAO,GAAG,MAAM,CAAU,KAAK,mDAAC;AAEtC;;AAEG;IACH,IAAI,yBAAyB,GAAY,KAAK;AAE9C;;AAEG;IACH,QAAQ,CAAC,UAAU,CAAC,aAAa,EAAE,cAAc,EAAE,cAAc,CAAC;IAClE,QAAQ,CAAC,UAAU,CAAC,aAAa,EAAE,cAAc,EAAE,cAAc,CAAC;AAClE,IAAA,QAAQ,CAAC,UAAU,CAAC,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;IAC7F,QAAQ,CAAC,UAAU,CAAC,aAAa,EAAE,YAAY,EAAE,YAAY,CAAC;IAC9D,QAAQ,CAAC,UAAU,CAAC,aAAa,EAAE,YAAY,EAAE,YAAY,CAAC;;IAG9D,IAAI,QAAQ,EAAE;AACZ,QAAA,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC;IAClC;;AAGA,IAAA,YAAY,CAAC,UAAU,CAAC,aAAa,EAAE,KAAK,CAAC;;AAG7C,IAAA,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC;AAE9C;;AAEG;AACH,IAAA,SAAS,KAAK,GAAA;QACZ,eAAe,CAAC,OAAO,CAAC;IAC1B;AAEA;;;;AAIG;AACH,IAAA,SAAS,YAAY,CAAC,KAAY,EAAE,WAAmB,EAAA;AACrD,QAAA,IACE,QAAQ,EAAE;AACV,YAAA,WAAW,KAAK,OAAO;AACvB,YAAA,OAAO,EAAE;YACT,CAAE,KAAK,CAAC,aAAyB,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAiB,CAAC,EACpE;YACA;QACF;AAEA,QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACjB,YAAY,IAAI;IAClB;AAEA;;;AAGG;IACH,SAAS,eAAe,CAAC,WAAmB,EAAA;QAC1C,IAAI,WAAW,KAAK,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE;YACzC;QACF;AAEA,QAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QAClB,UAAU,IAAI;IAChB;IAEA,SAAS,cAAc,CAAC,KAAmB,EAAA;AACzC,QAAA,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,KAAK,yBAAyB,IAAI,cAAc,CAAC,EAAE;YAClF;QACF;AAEA,QAAA,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC;IACxC;IAEA,SAAS,cAAc,CAAC,KAAmB,EAAA;AACzC,QAAA,IAAI,CAAC,QAAQ,EAAE,IAAK,KAAK,CAAC,aAAyB,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAiB,CAAC,EAAE;AACtF,YAAA,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC;QACpC;IACF;AAEA,IAAA,SAAS,YAAY,GAAA;QACnB,yBAAyB,GAAG,IAAI;QAChC,IAAI,OAAO,EAAE,EAAE;YACb,eAAe,CAAC,OAAO,CAAC;QAC1B;IACF;IAEA,SAAS,YAAY,CAAC,KAAiB,EAAA;AACrC,QAAA,IAAI,CAAC,yBAAyB,IAAI,CAAC,cAAc,EAAE;AACjD,YAAA,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC;QAC9B;QAEA,yBAAyB,GAAG,KAAK;IACnC;IAEA,SAAS,YAAY,CAAC,KAAiB,EAAA;AACrC,QAAA,IAAI,CAAC,QAAQ,EAAE,IAAK,KAAK,CAAC,aAAyB,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAiB,CAAC,EAAE;YACtF,eAAe,CAAC,OAAO,CAAC;QAC1B;IACF;IAEA,OAAO,EAAE,OAAO,EAAE;AACpB;;AC9JA,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,QAAQ;IACR,UAAU;IACV,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,QAAQ;AACT,CAAA,CAAC;AAEF;;AAEG;AACG,SAAU,QAAQ,CAAC,EACvB,YAAY,EACZ,UAAU,EACV,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GACV,EAAA;AACd,IAAA,MAAM,QAAQ,GAAG,cAAc,EAAE;IAEjC,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;IACnC;AAEA,IAAA,MAAM,UAAU,GAAG,gBAAgB,EAAE;AACrC,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAEjC;;AAEG;AACH,IAAA,MAAM,OAAO,GAAG,MAAM,CAAU,KAAK,mDAAC;AAEtC;;AAEG;IACH,IAAI,SAAS,GAAkB,IAAI;;AAGnC,IAAA,QAAQ,CAAC,UAAU,EAAE,aAAa,EAAE,aAAa,CAAC;AAClD,IAAA,QAAQ,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC;;AAG1C,IAAA,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,MAAM,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAErE;;AAEG;AACH,IAAA,SAAS,KAAK,GAAA;;AAEZ,QAAA,IAAI,CAAC,OAAO,EAAE,EAAE;YACd;QACF;;QAGA,mBAAmB,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;QACjD,SAAS,GAAG,IAAI;AAChB,QAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QAClB,UAAU,IAAI;IAChB;AAEA;;AAEG;IACH,IAAI,mBAAmB,GAAmB,EAAE;AAE5C,IAAA,SAAS,aAAa,GAAA;QACpB,IAAI,QAAQ,EAAE,EAAE;YACd;QACF;;QAGA,mBAAmB,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;;AAGjD,QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACjB,YAAY,IAAI;;QAGhB,MAAM,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC,aAAa,IAAI,QAAQ;;AAGxE,QAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,EAAE,WAAW,EAAE,MAAM,KAAK,EAAE,EAAE;AACpE,YAAA,MAAM,EAAE,KAAK;YACb,QAAQ;AACT,SAAA,CAAC;;;;QAKF,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,EAAE,aAAa,EAAE,aAA8B,EAAE;AACzF,YAAA,MAAM,EAAE,KAAK;YACb,QAAQ;AACT,SAAA,CAAC;;AAGF,QAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,EAAE,eAAe,EAAE,MAAM,KAAK,EAAE,EAAE;AAC5E,YAAA,MAAM,EAAE,KAAK;YACb,QAAQ;AACT,SAAA,CAAC;QAEF,mBAAmB,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,aAAa,CAAC;IAC/D;IAEA,SAAS,SAAS,CAAC,KAAoB,EAAA;QACrC,IAAI,QAAQ,EAAE,IAAI,OAAO,EAAE,IAAI,KAAK,CAAC,MAAM,EAAE;YAC3C;QACF;AAEA,QAAA,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE;YAC3B;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;YAC9C;QACF;AAEA,QAAA,SAAS,GAAG,KAAK,CAAC,GAAG;AACrB,QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACjB,YAAY,IAAI;QAEhB,MAAM,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC,aAAa,IAAI,QAAQ;QAExE,MAAM,KAAK,GAAG,QAAQ,CACpB,aAAa,EACb,OAAO,EACP,CAAC,UAAyB,KAAI;AAC5B,YAAA,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,EAAE;AAChC,gBAAA,KAAK,EAAE;YACT;QACF,CAAC,EACD,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAC5B;AAED,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,KAAK,EAAE,EAAE;AACvD,YAAA,MAAM,EAAE,KAAK;YACb,QAAQ;AACT,SAAA,CAAC;AAEF,QAAA,mBAAmB,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;IACrC;IAEA,SAAS,aAAa,CAAC,KAAmB,EAAA;AACxC,QAAA,IACE,UAAU,CAAC,aAAa,KAAK,KAAK,CAAC,MAAM;YACzC,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,EACxD;AACA,YAAA,KAAK,EAAE;QACT;IACF;IAEA,SAAS,gBAAgB,CAAC,KAAoB,EAAA;AAC5C,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;AAE3B,QAAA,IAAI,EAAE,MAAM,YAAY,WAAW,CAAC,EAAE;AACpC,YAAA,OAAO,KAAK;QACd;QAEA,IAAI,MAAM,CAAC,iBAAiB,IAAI,MAAM,YAAY,mBAAmB,EAAE;AACrE,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,EAAE,MAAM,YAAY,gBAAgB,CAAC,EAAE;AACzC,YAAA,OAAO,KAAK;QACd;QAEA,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE;AAC3C,QAAA,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC;IAC7C;IAEA,OAAO,EAAE,OAAO,EAAE;AACpB;;AC3KA;;;AAGG;AACG,SAAU,eAAe,CAAC,EAC9B,KAAK,EACL,KAAK,EACL,KAAK,EACL,WAAW,EACX,YAAY,EACZ,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GACF,EAAA;AACtB,IAAA,MAAM,UAAU,GAAG,gBAAgB,EAAE;;IAErC,IAAI,cAAc,CAAC,UAAU,CAAC,aAAa,EAAE,cAAc,CAAC,EAAE;QAC5D;IACF;IAEA,IAAI,KAAK,EAAE;AACT,QAAA,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxB;IACA,IAAI,KAAK,EAAE;AACT,QAAA,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxB;IACA,IAAI,KAAK,EAAE;AACT,QAAA,QAAQ,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;IACrC;IACA,IAAI,YAAY,EAAE;AAChB,QAAA,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC/B;AACF;AAEA;;;;AAIG;AACG,SAAU,cAAc,CAAC,OAAoB,EAAE,WAAmB,EAAA;AACtE,IAAA,MAAM,cAAc,GAAG,CAAA,MAAA,EAAS,WAAW,CAAA,CAAE,IAAI,OAAO;;IAGxD,IAAI,CAAC,cAAc,EAAE;AAClB,QAAA,OAA8C,CAAC,CAAA,MAAA,EAAS,WAAW,EAAE,CAAC,GAAG,IAAI;IAChF;AAEA,IAAA,OAAO,cAAc;AACvB;;AC1DA;;;AAGG;MAKU,eAAe,CAAA;AAgB1B,IAAA,WAAA,GAAA;AAfA;;AAEG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwB,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EACpD,KAAK,EAAE,yBAAyB;gBAChC,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAF2B;AACtD,gBAAA,KAAK,EAAE,yBAAyB;AAChC,gBAAA,SAAS,EAAE,gBAAgB;AAC5B,aAAA,CAAA,CAAA,CAAC;AAEF;;AAEG;QACM,IAAA,CAAA,WAAW,GAAG,MAAM,CAAU;AACrC,YAAA,KAAK,EAAE,iBAAiB;AACzB,SAAA,CAAC;;AAIA,QAAA,eAAe,CAAC;YACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACvB,YAAA,aAAa,EAAE,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;AACrD,SAAA,CAAC;IACJ;8GAtBW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAJ3B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,QAAQ,EAAE,iBAAiB;AAC5B,iBAAA;;;ACPD;;;AAGG;MAKU,QAAQ,CAAA;AAcnB,IAAA,WAAA,GAAA;AAbA;;AAEG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwB,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EACpD,KAAK,EAAE,kBAAkB;gBACzB,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAF2B;AACtD,gBAAA,KAAK,EAAE,kBAAkB;AACzB,gBAAA,SAAS,EAAE,gBAAgB;AAC5B,aAAA,CAAA,CAAA,CAAC;AAEF;;AAEG;QACM,IAAA,CAAA,KAAK,GAAG,MAAM,CAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;;AAIrD,QAAA,QAAQ,CAAC;YACP,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YACpC,MAAM,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;AACrC,SAAA,CAAC;IACJ;8GArBW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAR,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAJpB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,QAAQ,EAAE,UAAU;AACrB,iBAAA;;;ACPD;AAEA;;;;AAIG;MAKU,QAAQ,CAAA;AAwBnB;;AAEG;AACH,IAAA,WAAA,GAAA;AA1BA;;AAEG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwB,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EACpD,KAAK,EAAE,kBAAkB;gBACzB,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAF2B;AACtD,gBAAA,KAAK,EAAE,kBAAkB;AACzB,gBAAA,SAAS,EAAE,gBAAgB;AAC5B,aAAA,CAAA,CAAA,CAAC;AAEF;;AAEG;QACM,IAAA,CAAA,UAAU,GAAG,MAAM,CAAO,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;AAE9D;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;AAE1D;;AAEG;QACM,IAAA,CAAA,WAAW,GAAG,MAAM,CAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;;AAO3D,QAAA,QAAQ,CAAC;YACP,YAAY,EAAE,MAAK;AACjB,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;AACtB,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7B,CAAC;YACD,UAAU,EAAE,MAAK;AACf,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;YAC9B,CAAC;YACD,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACxB,SAAA,CAAC;IACJ;8GAxCW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,aAAA,EAAA,WAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAR,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAJpB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,QAAQ,EAAE,UAAU;AACrB,iBAAA;;;ACVD;AAEA;;AAEG;MAQU,OAAO,CAAA;AAPpB,IAAA,WAAA,GAAA;AAQE;;AAEG;QACc,IAAA,CAAA,WAAW,GAAG,iBAAiB,EAAE;AAElD;;AAEG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwB,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EACpD,KAAK,EAAE,iBAAiB;gBACxB,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAF2B;AACtD,gBAAA,KAAK,EAAE,iBAAiB;AACxB,gBAAA,SAAS,EAAE,gBAAgB;AAC5B,aAAA,CAAA,CAAA,CAAC;AAEF;;AAEG;QACM,IAAA,CAAA,KAAK,GAAG,MAAM,CAAoB;AACzC,YAAA,KAAK,EAAE,cAAc;AACtB,SAAA,CAAC;AAEF;;AAEG;QACM,IAAA,CAAA,IAAI,GAAG,MAAM,CAAe;AACnC,YAAA,KAAK,EAAE,SAAS;AACjB,SAAA,CAAC;AAEF;;AAEG;QACM,IAAA,CAAA,GAAG,GAAG,MAAM,CAAkB;AACrC,YAAA,KAAK,EAAE,YAAY;AACpB,SAAA,CAAC;AAEF;;AAEG;AACO,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAU,KAAK,oDAAC;AAE3C;;AAEG;QACK,IAAA,CAAA,CAAC,GAAkB,IAAI;AAE/B;;AAEG;QACK,IAAA,CAAA,CAAC,GAAkB,IAAI;AAE/B;;AAEG;QACK,IAAA,CAAA,SAAS,GAAkB,IAAI;AAEvC;;AAEG;QACK,IAAA,CAAA,mBAAmB,GAAmB,EAAE;AA6KjD,IAAA;AA3KC;;AAEG;IACK,WAAW,CAAC,KAAmC,EAAE,WAAwB,EAAA;AAC/E,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACd,WAAW;YACX,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM;AACrB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;AAEA;;AAEG;AACK,IAAA,MAAM,CACZ,KAAmC,EACnC,WAAwB,EACxB,MAAc,EACd,MAAc,EAAA;QAEd,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE;YAChC;QACF;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YACb,MAAM;YACN,MAAM;YACN,WAAW;YACX,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM;AACrB,SAAA,CAAC;IACJ;AAEA;;AAEG;IACK,SAAS,CAAC,KAAmC,EAAE,WAAwB,EAAA;AAC7E,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YACZ,WAAW;YACX,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM;AACrB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B;AAEA;;AAEG;AAEO,IAAA,aAAa,CAAC,KAAmB,EAAA;;AAEzC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACpE;QACF;;QAGA,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QAEvB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,WAA0B,CAAC;;AAGzD,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;AAChC,QAAA,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK;AACpB,QAAA,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK;;QAGpB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CACnD,MAAM,EACN,aAAa,EACb,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAkB,EAC9C,KAAK,CACN;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CACjD,MAAM,EACN,WAAW,EACX,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAkB,EAC5C,KAAK,CACN;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CACrD,MAAM,EACN,eAAe,EACf,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAkB,EAC5C,KAAK,CACN;;QAGD,IAAI,CAAC,mBAAmB,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa,CAAC;IACpE;AAEA;;AAEG;AACO,IAAA,WAAW,CAAC,KAAmB,EAAA;QACvC,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE;YACtC;QACF;QAEA,MAAM,WAAW,IAAI,KAAK,CAAC,WAAW,IAAI,OAAO,CAAgB;AACjE,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC;AAClC,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;IACxD;AAEA;;AAEG;AACO,IAAA,aAAa,CAAC,KAAmB,EAAA;QACzC,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE;YACtC;QACF;;;;AAKA,QAAA,IAAI,CAAC,MAAM,CACT,KAAK,EACL,KAAK,CAAC,WAA0B,EAChC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAC3B,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAC5B;AACD,QAAA,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK;AACpB,QAAA,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK;IACtB;AAEQ,IAAA,mBAAmB,CAAC,KAAoB,EAAE,MAAc,EAAE,MAAc,EAAA;AAC9E,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB;QACF;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC;AAC9C,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC;IACnC;AAGU,IAAA,SAAS,CAAC,KAAY,EAAA;QAC9B,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,mBAAmB,CAAC,KAAsB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD;AAGU,IAAA,WAAW,CAAC,KAAY,EAAA;QAChC,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,mBAAmB,CAAC,KAAsB,EAAE,CAAC,EAAE,CAAC,CAAC;IACxD;AAGU,IAAA,WAAW,CAAC,KAAY,EAAA;QAChC,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,mBAAmB,CAAC,KAAsB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACzD;AAGU,IAAA,YAAY,CAAC,KAAY,EAAA;QACjC,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,mBAAmB,CAAC,KAAsB,EAAE,CAAC,EAAE,CAAC,CAAC;IACxD;8GAtOW,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAP,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,cAAA,EAAA,IAAA,EAAA,SAAA,EAAA,GAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,gBAAA,EAAA,0BAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAP,OAAO,EAAA,UAAA,EAAA,CAAA;kBAPnB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,WAAW;AACrB,oBAAA,QAAQ,EAAE,SAAS;AACnB,oBAAA,IAAI,EAAE;AACJ,wBAAA,kBAAkB,EAAE,wBAAwB;AAC7C,qBAAA;AACF,iBAAA;;sBAoHE,YAAY;uBAAC,aAAa,EAAE,CAAC,QAAQ,CAAC;;sBAyFtC,YAAY;uBAAC,iBAAiB,EAAE,CAAC,QAAQ,CAAC;;sBAO1C,YAAY;uBAAC,mBAAmB,EAAE,CAAC,QAAQ,CAAC;;sBAO5C,YAAY;uBAAC,mBAAmB,EAAE,CAAC,QAAQ,CAAC;;sBAO5C,YAAY;uBAAC,oBAAoB,EAAE,CAAC,QAAQ,CAAC;;;AC7OhD;AAEA;;AAEG;MAKU,QAAQ,CAAA;AA8BnB,IAAA,WAAA,GAAA;AA7BA;;AAEG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwB,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EACpD,KAAK,EAAE,kBAAkB;gBACzB,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAF2B;AACtD,gBAAA,KAAK,EAAE,kBAAkB;AACzB,gBAAA,SAAS,EAAE,gBAAgB;AAC5B,aAAA,CAAA,CAAA,CAAC;AAEF;;AAEG;QACM,IAAA,CAAA,UAAU,GAAG,MAAM,CAAO;AACjC,YAAA,KAAK,EAAE,eAAe;AACvB,SAAA,CAAC;AAEF;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAO;AAC/B,YAAA,KAAK,EAAE,aAAa;AACrB,SAAA,CAAC;AAEF;;AAEG;QACM,IAAA,CAAA,WAAW,GAAG,MAAM,CAAU;AACrC,YAAA,KAAK,EAAE,UAAU;AAClB,SAAA,CAAC;;AAIA,QAAA,QAAQ,CAAC;YACP,YAAY,EAAE,MAAK;AACjB,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;AACtB,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7B,CAAC;YACD,UAAU,EAAE,MAAK;AACf,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;YAC9B,CAAC;YACD,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACxB,SAAA,CAAC;IACJ;8GA3CW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,aAAA,EAAA,WAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAR,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAJpB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,QAAQ,EAAE,UAAU;AACrB,iBAAA;;;ACZD;;ACAA;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"ng-primitives-interactions.mjs","sources":["../../../../packages/ng-primitives/interactions/src/config/interactions-config.ts","../../../../packages/ng-primitives/interactions/src/focus-visible/focus-visible-interaction.ts","../../../../packages/ng-primitives/interactions/src/focus/focus-interaction.ts","../../../../packages/ng-primitives/interactions/src/hover/hover-interaction.ts","../../../../packages/ng-primitives/interactions/src/press/press-interaction.ts","../../../../packages/ng-primitives/interactions/src/interactions/interactions.ts","../../../../packages/ng-primitives/interactions/src/focus-visible/focus-visible.ts","../../../../packages/ng-primitives/interactions/src/focus/focus.ts","../../../../packages/ng-primitives/interactions/src/hover/hover.ts","../../../../packages/ng-primitives/interactions/src/move/move.ts","../../../../packages/ng-primitives/interactions/src/press/press.ts","../../../../packages/ng-primitives/interactions/src/index.ts","../../../../packages/ng-primitives/interactions/src/ng-primitives-interactions.ts"],"sourcesContent":["import { InjectionToken, Provider, inject } from '@angular/core';\n\nexport interface NgpInteractionsConfig {\n /** Whether all interactions are disabled */\n disabled?: boolean;\n /** Whether hover interactions are enabled */\n hover?: boolean;\n /** Whether focus interactions are enabled */\n focus?: boolean;\n /** Whether focus-visible interactions are enabled */\n focusVisible?: boolean;\n /** Whether press interactions are enabled */\n press?: boolean;\n}\n\nexport const defaultInteractionsConfig: NgpInteractionsConfig = {\n disabled: false,\n hover: true,\n focus: true,\n focusVisible: true,\n press: true,\n};\n\nexport const NgpInteractionsConfigToken = new InjectionToken<NgpInteractionsConfig>(\n 'NgpInteractionsConfigToken',\n);\n\n/**\n * Provide the default Interactions configuration\n * @param config The Interactions configuration\n * @returns The provider\n */\nexport function provideInteractionsConfig(config: Partial<NgpInteractionsConfig>): Provider[] {\n return [\n {\n provide: NgpInteractionsConfigToken,\n useValue: { ...defaultInteractionsConfig, ...config },\n },\n ];\n}\n\n/**\n * Inject the Interactions configuration\n * @returns The global Interactions configuration\n */\nexport function injectInteractionsConfig(): NgpInteractionsConfig {\n return inject(NgpInteractionsConfigToken, { optional: true }) ?? defaultInteractionsConfig;\n}\n\nexport function isHoverEnabled(): boolean {\n const config = injectInteractionsConfig();\n return !config.disabled && !!config.hover;\n}\n\nexport function isFocusEnabled(): boolean {\n const config = injectInteractionsConfig();\n return !config.disabled && !!config.focus;\n}\n\nexport function isFocusVisibleEnabled(): boolean {\n const config = injectInteractionsConfig();\n return !config.disabled && !!config.focusVisible;\n}\n\nexport function isPressEnabled(): boolean {\n const config = injectInteractionsConfig();\n return !config.disabled && !!config.press;\n}\n","import { FocusMonitor, FocusOrigin } from '@angular/cdk/a11y';\nimport { ElementRef, inject, Renderer2, Signal, signal } from '@angular/core';\nimport { onBooleanChange, safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { isFocusVisibleEnabled } from '../config/interactions-config';\n\nexport interface NgpFocusVisibleProps {\n disabled?: Signal<boolean>;\n onFocusChange?: (value: boolean) => void;\n}\n\nexport interface NgpFocusVisibleState {\n isFocused: Signal<boolean>;\n}\n\n/**\n * @internal\n */\nexport function ngpFocusVisible({\n onFocusChange,\n disabled = signal(false),\n}: NgpFocusVisibleProps): NgpFocusVisibleState {\n const canFocusVisible = isFocusVisibleEnabled();\n\n if (!canFocusVisible) {\n return { isFocused: signal(false) };\n }\n\n const elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n const renderer = inject(Renderer2);\n const focusMonitor = inject(FocusMonitor);\n\n // Whether the element is currently focused.\n const isFocused = signal<boolean>(false);\n\n // handle focus state\n focusMonitor\n .monitor(elementRef.nativeElement)\n .pipe(safeTakeUntilDestroyed())\n .subscribe(origin =>\n // null indicates the element was blurred\n origin === null ? onBlur() : onFocus(origin),\n );\n\n // if the component becomes disabled and it is focused, hide the focus\n onBooleanChange(disabled, () => focus(false));\n\n function onFocus(origin: FocusOrigin): void {\n if (disabled() || isFocused()) {\n return;\n }\n\n // for some elements the focus visible state should always appear on focus\n if (alwaysShowFocus()) {\n focus(true, origin);\n return;\n }\n\n // if the focus origin is keyboard or program(focused programmatically), then the focus is visible\n if (origin === 'keyboard') {\n focus(true, 'keyboard');\n return;\n }\n }\n\n function onBlur(): void {\n if (disabled() || !isFocused()) {\n return;\n }\n\n focus(false);\n }\n\n /**\n * Trigger the focus signal along with the focusChange event.\n */\n function focus(value: boolean, origin?: FocusOrigin) {\n if (isFocused() === value) {\n return;\n }\n\n isFocused.set(value);\n onFocusChange?.(value);\n\n if (value) {\n renderer.setAttribute(elementRef.nativeElement, 'data-focus-visible', origin ?? '');\n } else {\n renderer.removeAttribute(elementRef.nativeElement, 'data-focus-visible');\n }\n }\n\n function alwaysShowFocus(): boolean {\n const nonTextInputTypes = [\n 'checkbox',\n 'radio',\n 'range',\n 'color',\n 'file',\n 'image',\n 'button',\n 'submit',\n 'reset',\n ];\n\n // if this is an input element and it is a text input\n if (\n elementRef.nativeElement instanceof HTMLInputElement &&\n !nonTextInputTypes.includes(elementRef.nativeElement.type)\n ) {\n return true;\n }\n\n // if this is a textarea\n if (elementRef.nativeElement instanceof HTMLTextAreaElement) {\n return true;\n }\n\n // if this is an element with contenteditable\n if (\n elementRef.nativeElement.isContentEditable ||\n elementRef.nativeElement.hasAttribute('contenteditable')\n ) {\n return true;\n }\n\n return false;\n }\n\n return {\n isFocused,\n };\n}\n","import { FocusMonitor } from '@angular/cdk/a11y';\nimport { ElementRef, Renderer2, Signal, inject, signal } from '@angular/core';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { isFocusEnabled } from '../config/interactions-config';\n\nexport interface NgpFocusProps {\n disabled?: Signal<boolean>;\n focusWithin?: boolean;\n onFocus?: () => void;\n onBlur?: () => void;\n}\n\nexport interface NgpFocusState {\n isFocused: Signal<boolean>;\n}\n\n/**\n * @internal\n */\nexport function ngpFocus({\n onFocus,\n onBlur,\n focusWithin = false,\n disabled = signal(false),\n}: NgpFocusProps): NgpFocusState {\n const canFocus = isFocusEnabled();\n\n if (!canFocus) {\n return { isFocused: signal(false) };\n }\n /**\n * Access the element reference.\n */\n const elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Access the focus monitor.\n */\n const focusMonitor = inject(FocusMonitor);\n\n /**\n * Access the renderer.\n */\n const renderer = inject(Renderer2);\n\n /**\n * Whether the element is currently focused.\n */\n const isFocused = signal<boolean>(false);\n\n focusMonitor\n .monitor(elementRef, focusWithin)\n .pipe(safeTakeUntilDestroyed())\n .subscribe(focusOrigin => {\n if (disabled()) {\n return;\n }\n\n isFocused.set(focusOrigin !== null);\n if (focusOrigin !== null) {\n if (onFocus) {\n onFocus();\n }\n renderer.setAttribute(elementRef.nativeElement, 'data-focus', '');\n } else {\n if (onBlur) {\n onBlur();\n }\n renderer.removeAttribute(elementRef.nativeElement, 'data-focus');\n }\n });\n\n return { isFocused };\n}\n","import { ElementRef, inject, Signal, signal } from '@angular/core';\nimport { onDomRemoval } from 'ng-primitives/internal';\nimport { dataBinding, listener } from 'ng-primitives/state';\nimport { onBooleanChange } from 'ng-primitives/utils';\nimport { isHoverEnabled } from '../config/interactions-config';\n\n// Module-level flag that tracks whether the user's last input was a touch.\n// Kept outside Angular DI so it survives service destruction during SSR\n// hydration, micro-frontend re-bootstrap, or any scenario that re-creates\n// the root injector. A timeout can't cover delayed emulated events — iOS\n// may fire an emulated pointerenter long after the originating touch\n// (e.g. after the user navigates away and then taps browser-back).\n//\n// iOS emulated mouse events never dispatch `pointermove`; only a real\n// pointing device does. So a non-touch pointermove is a reliable signal\n// that the user has returned to a real mouse.\nlet hadRecentTouch = false;\n\nif (typeof document !== 'undefined') {\n document.addEventListener('touchend', () => (hadRecentTouch = true), true);\n document.addEventListener(\n 'pointerup',\n event => {\n if ((event as PointerEvent).pointerType === 'touch') hadRecentTouch = true;\n },\n true,\n );\n document.addEventListener(\n 'pointermove',\n event => {\n if ((event as PointerEvent).pointerType !== 'touch') hadRecentTouch = false;\n },\n true,\n );\n}\n\ninterface NgpHoverProps {\n disabled?: Signal<boolean>;\n onHoverStart?: () => void;\n onHoverEnd?: () => void;\n}\n\nexport interface NgpHoverState {\n hovered: Signal<boolean>;\n}\n\n/**\n * Programatically add the hover functionality to an element.\n * This is useful in cases where we can't necessarily use a HostDirective,\n * because there is a chance the directive has already been used.\n * @internal\n */\nexport function ngpHover({\n onHoverStart,\n onHoverEnd,\n disabled = signal(false),\n}: NgpHoverProps): NgpHoverState {\n const canHover = isHoverEnabled();\n\n if (!canHover) {\n return { hovered: signal(false) };\n }\n\n /**\n * Access the element.\n */\n const elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Store the current hover state.\n */\n const hovered = signal<boolean>(false);\n\n /**\n * Whether this element should ignore emulated mouse events.\n */\n let ignoreEmulatedMouseEvents: boolean = false;\n\n /**\n * Setup event listeners.\n */\n listener(elementRef.nativeElement, 'pointerenter', onPointerEnter);\n listener(elementRef.nativeElement, 'pointerleave', onPointerLeave);\n listener(elementRef.nativeElement, 'touchstart', onTouchStart, { config: { passive: true } });\n listener(elementRef.nativeElement, 'mouseenter', onMouseEnter);\n listener(elementRef.nativeElement, 'mouseleave', onMouseLeave);\n\n // anytime the disabled state changes to true, we must reset the hover state\n onBooleanChange(disabled, reset);\n\n // if the element is removed from the dom, we want to reset the hover state\n onDomRemoval(elementRef.nativeElement, reset);\n\n // anytime the hover state changes we want to update the attribute\n dataBinding(elementRef, 'data-hover', hovered);\n\n /**\n * Reset the hover state.\n */\n function reset(): void {\n onHoverFinished('mouse');\n }\n\n /**\n * Trigger the hover start events.\n * @param event\n * @param pointerType\n */\n function onHoverBegin(event: Event, pointerType: string): void {\n if (\n disabled() ||\n pointerType === 'touch' ||\n hovered() ||\n !(event.currentTarget as Element)?.contains(event.target as Element)\n ) {\n return;\n }\n\n hovered.set(true);\n onHoverStart?.();\n }\n\n /**\n * Trigger the hover end events.\n * @param pointerType\n */\n function onHoverFinished(pointerType: string): void {\n if (pointerType === 'touch' || !hovered()) {\n return;\n }\n\n hovered.set(false);\n onHoverEnd?.();\n }\n\n function onPointerEnter(event: PointerEvent): void {\n if (event.pointerType === 'mouse' && (ignoreEmulatedMouseEvents || hadRecentTouch)) {\n return;\n }\n\n onHoverBegin(event, event.pointerType);\n }\n\n function onPointerLeave(event: PointerEvent): void {\n if (!disabled() && (event.currentTarget as Element)?.contains(event.target as Element)) {\n onHoverFinished(event.pointerType);\n }\n }\n\n function onTouchStart(): void {\n ignoreEmulatedMouseEvents = true;\n if (hovered()) {\n onHoverFinished('mouse');\n }\n }\n\n function onMouseEnter(event: MouseEvent): void {\n if (!ignoreEmulatedMouseEvents && !hadRecentTouch) {\n onHoverBegin(event, 'mouse');\n }\n\n ignoreEmulatedMouseEvents = false;\n }\n\n function onMouseLeave(event: MouseEvent): void {\n if (!disabled() && (event.currentTarget as Element)?.contains(event.target as Element)) {\n onHoverFinished('mouse');\n }\n }\n\n return { hovered };\n}\n","import { inject, Injector, Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { dataBinding, listener } from 'ng-primitives/state';\nimport { isPressEnabled } from '../config/interactions-config';\n\ninterface NgpPressState {\n pressed: Signal<boolean>;\n}\n\ninterface NgpPressProps {\n disabled?: Signal<boolean>;\n onPressStart?: () => void;\n onPressEnd?: () => void;\n}\n\nconst NON_TEXT_INPUT_TYPES = new Set([\n 'button',\n 'checkbox',\n 'color',\n 'file',\n 'image',\n 'radio',\n 'range',\n 'reset',\n 'submit',\n]);\n\n/**\n * @internal\n */\nexport function ngpPress({\n onPressStart,\n onPressEnd,\n disabled = signal(false),\n}: NgpPressProps): NgpPressState {\n const canPress = isPressEnabled();\n\n if (!canPress) {\n return { pressed: signal(false) };\n }\n\n const elementRef = injectElementRef();\n const injector = inject(Injector);\n\n /**\n * Whether the element is currently pressed.\n */\n const pressed = signal<boolean>(false);\n\n /**\n * Track which key started the press to prevent mismatched keyup from ending it.\n */\n let activeKey: string | null = null;\n\n // setup event listeners\n listener(elementRef, 'pointerdown', onPointerDown);\n listener(elementRef, 'keydown', onKeyDown);\n\n // anytime the press state changes we want to update the attribute\n dataBinding(elementRef, 'data-press', () => pressed() && !disabled());\n\n /**\n * Reset the press state.\n */\n function reset(): void {\n // if we are not pressing, then do nothing\n if (!pressed()) {\n return;\n }\n\n // clear any existing disposables\n disposableListeners.forEach(dispose => dispose());\n activeKey = null;\n pressed.set(false);\n onPressEnd?.();\n }\n\n /**\n * Store the list of disposables.\n */\n let disposableListeners: (() => void)[] = [];\n\n function onPointerDown(): void {\n if (disabled()) {\n return;\n }\n\n // clear any existing disposables\n disposableListeners.forEach(dispose => dispose());\n\n // update the press state\n pressed.set(true);\n onPressStart?.();\n\n // setup global event listeners to catch events on elements outside the directive\n const ownerDocument = elementRef.nativeElement.ownerDocument ?? document;\n\n // if the pointer up event happens on any elements, then we are no longer pressing on this element\n const pointerUp = listener(ownerDocument, 'pointerup', () => reset(), {\n config: false,\n injector,\n });\n\n // Instead of relying on the `pointerleave` event, which is not consistently called on iOS Safari,\n // we use the `pointermove` event to determine if we are still \"pressing\".\n // By checking if the target is still within the element, we can determine if the press is ongoing.\n const pointerMove = listener(ownerDocument, 'pointermove', onPointerMove as EventListener, {\n config: false,\n injector,\n });\n\n // if the pointer is cancelled, then we are no longer pressing on this element\n const pointerCancel = listener(ownerDocument, 'pointercancel', () => reset(), {\n config: false,\n injector,\n });\n\n disposableListeners = [pointerUp, pointerMove, pointerCancel];\n }\n\n function onKeyDown(event: KeyboardEvent): void {\n if (disabled() || pressed() || event.repeat) {\n return;\n }\n\n if (isEditableTarget(event)) {\n return;\n }\n\n if (event.key !== 'Enter' && event.key !== ' ') {\n return;\n }\n\n activeKey = event.key;\n pressed.set(true);\n onPressStart?.();\n\n const ownerDocument = elementRef.nativeElement.ownerDocument ?? document;\n\n const keyUp = listener(\n ownerDocument,\n 'keyup',\n (keyUpEvent: KeyboardEvent) => {\n if (keyUpEvent.key === activeKey) {\n reset();\n }\n },\n { config: false, injector },\n );\n\n const blur = listener(elementRef, 'blur', () => reset(), {\n config: false,\n injector,\n });\n\n disposableListeners = [keyUp, blur];\n }\n\n function onPointerMove(event: PointerEvent): void {\n if (\n elementRef.nativeElement !== event.target &&\n !elementRef.nativeElement.contains(event.target as Node)\n ) {\n reset();\n }\n }\n\n function isEditableTarget(event: KeyboardEvent): boolean {\n const target = event.target;\n\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n\n if (target.isContentEditable || target instanceof HTMLTextAreaElement) {\n return true;\n }\n\n if (!(target instanceof HTMLInputElement)) {\n return false;\n }\n\n const inputType = target.type.toLowerCase();\n return !NON_TEXT_INPUT_TYPES.has(inputType);\n }\n\n return { pressed };\n}\n","import { signal, Signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { ngpFocusVisible } from '../focus-visible/focus-visible-interaction';\nimport { ngpFocus } from '../focus/focus-interaction';\nimport { ngpHover } from '../hover/hover-interaction';\nimport { ngpPress } from '../press/press-interaction';\n\nexport interface NgpInteractionOptions {\n hover?: boolean;\n press?: boolean;\n focus?: boolean;\n focusWithin?: boolean;\n focusVisible?: boolean;\n disabled?: Signal<boolean>;\n}\n\n/**\n * Setup the interactions without relying on HostDirectives.\n * @internal\n */\nexport function ngpInteractions({\n focus,\n hover,\n press,\n focusWithin,\n focusVisible,\n disabled = signal(false),\n}: NgpInteractionOptions): void {\n const elementRef = injectElementRef();\n // If the interaction has already been setup, we can skip the setup.\n if (hasInteraction(elementRef.nativeElement, 'interactions')) {\n return;\n }\n\n if (hover) {\n ngpHover({ disabled });\n }\n if (press) {\n ngpPress({ disabled });\n }\n if (focus) {\n ngpFocus({ focusWithin, disabled });\n }\n if (focusVisible) {\n ngpFocusVisible({ disabled });\n }\n}\n\n/**\n * This function checks to see if a given interaction has already been setup on a given element.\n * If it has, it returns the existing interaction state.\n * If it has not, it sets up the interaction state for future checks.\n */\nexport function hasInteraction(element: HTMLElement, interaction: string): boolean {\n const hasInteraction = `__ngp-${interaction}` in element;\n\n // if the interaction has not been setup, we mark it as setup for future checks\n if (!hasInteraction) {\n (element as unknown as Record<string, unknown>)[`__ngp-${interaction}`] = true;\n }\n\n return hasInteraction;\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { Directive, booleanAttribute, input, output } from '@angular/core';\nimport { ngpFocusVisible } from './focus-visible-interaction';\n\n/**\n * Apply the `ngpFocusVisible` directive to an element that should be visually focused. This is similar to `ngpFocus`\n * but it will only apply the focus visible styles when the element is focused via keyboard navigation.\n */\n@Directive({\n selector: '[ngpFocusVisible]',\n exportAs: 'ngpFocusVisible',\n})\nexport class NgpFocusVisible {\n /**\n * Whether focus events are listened to.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpFocusVisibleDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Emit when the element is visually focused.\n */\n readonly focusChange = output<boolean>({\n alias: 'ngpFocusVisible',\n });\n\n constructor() {\n // setup the focus visible listener\n ngpFocusVisible({\n disabled: this.disabled,\n onFocusChange: value => this.focusChange.emit(value),\n });\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { Directive, booleanAttribute, input, output } from '@angular/core';\nimport { ngpFocus } from './focus-interaction';\n\n/**\n * This was inspired by the React Aria useFocus hook.\n * https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/interactions/src/useFocus.ts#L20\n */\n@Directive({\n selector: '[ngpFocus]',\n exportAs: 'ngpFocus',\n})\nexport class NgpFocus {\n /**\n * Whether listening for focus events is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpFocusDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Emit when the focus state changes.\n */\n readonly focus = output<boolean>({ alias: 'ngpFocus' });\n\n constructor() {\n // setup the focus listener\n ngpFocus({\n disabled: this.disabled,\n onFocus: () => this.focus.emit(true),\n onBlur: () => this.focus.emit(false),\n });\n }\n}\n","import type { BooleanInput } from '@angular/cdk/coercion';\nimport { Directive, booleanAttribute, input, output } from '@angular/core';\nimport { ngpHover } from './hover-interaction';\n\n// This is an Angular port of the useHover hook from react-aria: https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/interactions/src/useHover.ts\n\n/**\n * Apply the `ngpHover` directive to an element that you want to listen for hover events. T\n * his is particulaly useful for supporting hover events on touch devices, where hover events are not handled consistently.\n * On iOS relying on the `:hover` pseudo-class can result in the hover state being stuck until the user taps elsewhere on the screen.\n */\n@Directive({\n selector: '[ngpHover]',\n exportAs: 'ngpHover',\n})\nexport class NgpHover {\n /**\n * Whether hoving should be disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpHoverDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Emit an event when hovering starts.\n */\n readonly hoverStart = output<void>({ alias: 'ngpHoverStart' });\n\n /**\n * Emit an event when hovering ends.\n */\n readonly hoverEnd = output<void>({ alias: 'ngpHoverEnd' });\n\n /**\n * Emit an event when the hover state changes.\n */\n readonly hoverChange = output<boolean>({ alias: 'ngpHover' });\n\n /**\n * Setup the hover state.\n */\n constructor() {\n // setup the hover listener\n ngpHover({\n onHoverStart: () => {\n this.hoverStart.emit();\n this.hoverChange.emit(true);\n },\n onHoverEnd: () => {\n this.hoverEnd.emit();\n this.hoverChange.emit(false);\n },\n disabled: this.disabled,\n });\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, HostListener, input, output, signal } from '@angular/core';\nimport { injectDisposables } from 'ng-primitives/utils';\n\n// Inspired by react-aria useMove hook: https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/interactions/src/useMove.ts\n\n/**\n * The `NgpMove` directive is used to enable the pointer and keyboard move interactions on an element.\n */\n@Directive({\n selector: '[ngpMove]',\n exportAs: 'ngpMove',\n host: {\n '[attr.data-move]': 'isMoving() ? \"\" : null',\n },\n})\nexport class NgpMove {\n /**\n * Access the disposable helper.\n */\n private readonly disposables = injectDisposables();\n\n /**\n * Whether movement is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMoveDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Emit when the move event begins.\n */\n readonly start = output<NgpMoveStartEvent>({\n alias: 'ngpMoveStart',\n });\n\n /**\n * Emit when the element is moved.\n */\n readonly move = output<NgpMoveEvent>({\n alias: 'ngpMove',\n });\n\n /**\n * Emit when the move event ends.\n */\n readonly end = output<NgpMoveEndEvent>({\n alias: 'ngpMoveEnd',\n });\n\n /**\n * Whether the element is currently being moved.\n */\n protected isMoving = signal<boolean>(false);\n\n /**\n * Store the last x position of the element.\n */\n private x: number | null = null;\n\n /**\n * Store the last y position of the element.\n */\n private y: number | null = null;\n\n /**\n * Store the id of the last pointer.\n */\n private pointerId: number | null = null;\n\n /**\n * Store the disposable event listeners.\n */\n private disposableListeners: (() => void)[] = [];\n\n /**\n * Handle a move start.\n */\n private onMoveStart(event: PointerEvent | KeyboardEvent, pointerType: PointerType): void {\n this.start.emit({\n pointerType,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n altKey: event.altKey,\n });\n this.isMoving.set(true);\n }\n\n /**\n * Handle a move event.\n */\n private onMove(\n event: PointerEvent | KeyboardEvent,\n pointerType: PointerType,\n deltaX: number,\n deltaY: number,\n ): void {\n if (deltaX === 0 && deltaY === 0) {\n return;\n }\n\n this.move.emit({\n deltaX,\n deltaY,\n pointerType,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n altKey: event.altKey,\n });\n }\n\n /**\n * Handle a move end.\n */\n private onMoveEnd(event: PointerEvent | KeyboardEvent, pointerType: PointerType): void {\n this.end.emit({\n pointerType,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n altKey: event.altKey,\n });\n this.isMoving.set(false);\n }\n\n /**\n * Handle the pointer down event.\n */\n @HostListener('pointerdown', ['$event'])\n protected onPointerDown(event: PointerEvent): void {\n // ignore right-click or additional pointers\n if (event.button !== 0 || this.pointerId !== null || this.disabled()) {\n return;\n }\n\n // prevent the default behavior\n event.preventDefault();\n event.stopPropagation();\n\n this.onMoveStart(event, event.pointerType as PointerType);\n\n // store the pointer id and initial position\n this.pointerId = event.pointerId;\n this.x = event.pageX;\n this.y = event.pageY;\n\n // add global event listeners\n const pointerMove = this.disposables.addEventListener(\n window,\n 'pointermove',\n this.onPointerMove.bind(this) as EventListener,\n false,\n );\n\n const pointerUp = this.disposables.addEventListener(\n window,\n 'pointerup',\n this.onPointerUp.bind(this) as EventListener,\n false,\n );\n\n const pointerCancel = this.disposables.addEventListener(\n window,\n 'pointercancel',\n this.onPointerUp.bind(this) as EventListener,\n false,\n );\n\n // store the disposable event listeners\n this.disposableListeners = [pointerMove, pointerUp, pointerCancel];\n }\n\n /**\n * Handle the pointer up event.\n */\n protected onPointerUp(event: PointerEvent): void {\n if (this.pointerId !== event.pointerId) {\n return;\n }\n\n const pointerType = (event.pointerType ?? 'mouse') as PointerType;\n this.onMoveEnd(event, pointerType);\n this.pointerId = null;\n this.disposableListeners.forEach(dispose => dispose());\n }\n\n /**\n * Handle the pointer move event.\n */\n protected onPointerMove(event: PointerEvent): void {\n if (this.pointerId !== event.pointerId) {\n return;\n }\n\n // Problems with PointerEvent#movementX/movementY:\n // 1. it is always 0 on macOS Safari.\n // 2. On Chrome Android, it's scaled by devicePixelRatio, but not on Chrome macOS\n this.onMove(\n event,\n event.pointerType as PointerType,\n event.pageX - (this.x ?? 0),\n event.pageY - (this.y ?? 0),\n );\n this.x = event.pageX;\n this.y = event.pageY;\n }\n\n private triggerKeyboardMove(event: KeyboardEvent, deltaX: number, deltaY: number): void {\n if (this.disabled()) {\n return;\n }\n\n this.onMoveStart(event, 'keyboard');\n this.onMove(event, 'keyboard', deltaX, deltaY);\n this.onMoveEnd(event, 'keyboard');\n }\n\n @HostListener('keydown.ArrowUp', ['$event'])\n protected onArrowUp(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.triggerKeyboardMove(event as KeyboardEvent, 0, -1);\n }\n\n @HostListener('keydown.ArrowDown', ['$event'])\n protected onArrowDown(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.triggerKeyboardMove(event as KeyboardEvent, 0, 1);\n }\n\n @HostListener('keydown.ArrowLeft', ['$event'])\n protected onArrowLeft(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.triggerKeyboardMove(event as KeyboardEvent, -1, 0);\n }\n\n @HostListener('keydown.ArrowRight', ['$event'])\n protected onArrowRight(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.triggerKeyboardMove(event as KeyboardEvent, 1, 0);\n }\n}\n\ninterface NgpMoveBaseEvent {\n /**\n * Whether the event was triggered by a mouse or keyboard event.\n */\n pointerType: PointerType;\n /**\n * Whether the shift key was pressed during the event.\n */\n shiftKey: boolean;\n /**\n * Whether the control key was pressed during the event.\n */\n ctrlKey: boolean;\n /**\n * Whether the meta key was pressed during the event.\n */\n metaKey: boolean;\n /**\n * Whether the alt key was pressed during the event.\n */\n altKey: boolean;\n}\n\nexport type NgpMoveStartEvent = NgpMoveBaseEvent;\nexport type NgpMoveEndEvent = NgpMoveBaseEvent;\n\nexport interface NgpMoveEvent extends NgpMoveBaseEvent {\n /**\n * The amount of pixels moved in the x-axis.\n */\n deltaX: number;\n /**\n * The amount of pixels moved in the y-axis.\n */\n deltaY: number;\n}\n\nexport type PointerType = 'mouse' | 'pen' | 'touch' | 'keyboard' | 'virtual';\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { Directive, booleanAttribute, input, output } from '@angular/core';\nimport { ngpPress } from './press-interaction';\n\n// This was inpsired by Headless UI's active-press hook: https://github.com/tailwindlabs/headlessui/blob/main/packages/%40headlessui-react/src/hooks/use-active-press.tsx\n\n/**\n * The `ngpPress` directive listens for press events on an element. This is particularly useful for supporting press events on touch devices, where press events are not handled consistently.\n */\n@Directive({\n selector: '[ngpPress]',\n exportAs: 'ngpPress',\n})\nexport class NgpPress {\n /**\n * Whether listening for press events is disabled.\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpPressDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Emit when the press begins.\n */\n readonly pressStart = output<void>({\n alias: 'ngpPressStart',\n });\n\n /**\n * Emit when the press ends.\n */\n readonly pressEnd = output<void>({\n alias: 'ngpPressEnd',\n });\n\n /**\n * Emit when the press changes.\n */\n readonly pressChange = output<boolean>({\n alias: 'ngpPress',\n });\n\n constructor() {\n // setup the press listener\n ngpPress({\n onPressStart: () => {\n this.pressStart.emit();\n this.pressChange.emit(true);\n },\n onPressEnd: () => {\n this.pressEnd.emit();\n this.pressChange.emit(false);\n },\n disabled: this.disabled,\n });\n }\n}\n","// re-export ngpInteractions as setupInteractions for backwards compatibility\nimport { ngpInteractions } from './interactions/interactions';\n\nexport { NgpInteractionsConfig, provideInteractionsConfig } from './config/interactions-config';\nexport { NgpFocusVisible } from './focus-visible/focus-visible';\nexport { ngpFocusVisible } from './focus-visible/focus-visible-interaction';\nexport { NgpFocus } from './focus/focus';\nexport { ngpFocus } from './focus/focus-interaction';\nexport { NgpHover } from './hover/hover';\nexport { ngpHover } from './hover/hover-interaction';\nexport { ngpInteractions } from './interactions/interactions';\nexport { NgpMove, NgpMoveEvent } from './move/move';\nexport { NgpPress } from './press/press';\nexport { ngpPress } from './press/press-interaction';\n\n/**\n * @deprecated use `ngpInteractions` instead\n */\nexport { ngpInteractions as setupInteractions };\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -33,10 +33,10 @@ class NgpExitAnimationManager {
|
|
|
33
33
|
async exit() {
|
|
34
34
|
await Promise.all(this.instances.map(instance => instance.exit()));
|
|
35
35
|
}
|
|
36
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
37
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
36
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpExitAnimationManager, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
37
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpExitAnimationManager }); }
|
|
38
38
|
}
|
|
39
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
39
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpExitAnimationManager, decorators: [{
|
|
40
40
|
type: Injectable
|
|
41
41
|
}] });
|
|
42
42
|
function provideExitAnimationManager() {
|
|
@@ -63,10 +63,10 @@ class NgpExitAnimation {
|
|
|
63
63
|
async exit() {
|
|
64
64
|
await this.ref.exit();
|
|
65
65
|
}
|
|
66
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
67
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
66
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpExitAnimation, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
67
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: NgpExitAnimation, isStandalone: true, selector: "[ngpExitAnimation]", exportAs: ["ngpExitAnimation"], ngImport: i0 }); }
|
|
68
68
|
}
|
|
69
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
69
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpExitAnimation, decorators: [{
|
|
70
70
|
type: Directive,
|
|
71
71
|
args: [{
|
|
72
72
|
selector: '[ngpExitAnimation]',
|
|
@@ -234,10 +234,10 @@ class StyleInjector {
|
|
|
234
234
|
}
|
|
235
235
|
});
|
|
236
236
|
}
|
|
237
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
238
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
237
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: StyleInjector, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
238
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: StyleInjector, providedIn: 'root' }); }
|
|
239
239
|
}
|
|
240
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
240
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: StyleInjector, decorators: [{
|
|
241
241
|
type: Injectable,
|
|
242
242
|
args: [{
|
|
243
243
|
providedIn: 'root',
|
|
@@ -279,31 +279,12 @@ function fromResizeEvent(element, { disabled = signal(false), injector } = {}) {
|
|
|
279
279
|
}
|
|
280
280
|
// otherwise, take the first entry and emit the dimensions
|
|
281
281
|
const entry = entries[0];
|
|
282
|
-
|
|
283
|
-
if ('borderBoxSize' in entry) {
|
|
284
|
-
const borderSizeEntry = entry['borderBoxSize'];
|
|
285
|
-
// this may be different across browsers so normalize it
|
|
286
|
-
const borderSize = Array.isArray(borderSizeEntry)
|
|
287
|
-
? borderSizeEntry[0]
|
|
288
|
-
: borderSizeEntry;
|
|
289
|
-
width = borderSize['inlineSize'];
|
|
290
|
-
height = borderSize['blockSize'];
|
|
291
|
-
}
|
|
292
|
-
else {
|
|
293
|
-
// fallback for browsers that don't support borderBoxSize
|
|
294
|
-
width = element.offsetWidth;
|
|
295
|
-
height = element.offsetHeight;
|
|
296
|
-
}
|
|
297
|
-
// For inline elements, ResizeObserver may report 0,0 dimensions
|
|
298
|
-
// Use getBoundingClientRect as fallback for inline elements with zero dimensions
|
|
299
|
-
if ((width === 0 || height === 0) && getComputedStyle(element).display === 'inline') {
|
|
300
|
-
const rect = element.getBoundingClientRect();
|
|
301
|
-
width = rect.width;
|
|
302
|
-
height = rect.height;
|
|
303
|
-
}
|
|
304
|
-
observable.next({ width, height });
|
|
282
|
+
observable.next(getElementDimensions(element, entry));
|
|
305
283
|
});
|
|
306
284
|
observer.observe(element);
|
|
285
|
+
// Emit an initial measurement immediately to avoid one-frame stale layout
|
|
286
|
+
// while waiting for the first ResizeObserver callback.
|
|
287
|
+
observable.next(getElementDimensions(element));
|
|
307
288
|
}
|
|
308
289
|
}
|
|
309
290
|
setupOrTeardownObserver();
|
|
@@ -315,7 +296,7 @@ function fromResizeEvent(element, { disabled = signal(false), injector } = {}) {
|
|
|
315
296
|
* A utility function to observe any element for resize events and return the dimensions as a signal.
|
|
316
297
|
*/
|
|
317
298
|
function observeResize(elementFn) {
|
|
318
|
-
const dimensions = signal({ width: 0, height: 0 }, ...(ngDevMode ? [{ debugName: "dimensions" }] : []));
|
|
299
|
+
const dimensions = signal({ width: 0, height: 0 }, ...(ngDevMode ? [{ debugName: "dimensions" }] : /* istanbul ignore next */ []));
|
|
319
300
|
const injector = inject(Injector);
|
|
320
301
|
const destroyRef = inject(DestroyRef);
|
|
321
302
|
// store the subscription to the resize event
|
|
@@ -336,13 +317,36 @@ function observeResize(elementFn) {
|
|
|
336
317
|
});
|
|
337
318
|
return dimensions;
|
|
338
319
|
}
|
|
320
|
+
function getElementDimensions(element, entry) {
|
|
321
|
+
let width, height;
|
|
322
|
+
if (entry && 'borderBoxSize' in entry) {
|
|
323
|
+
const borderSizeEntry = entry.borderBoxSize;
|
|
324
|
+
// this may be different across browsers so normalize it
|
|
325
|
+
const borderSize = Array.isArray(borderSizeEntry) ? borderSizeEntry[0] : borderSizeEntry;
|
|
326
|
+
width = borderSize.inlineSize;
|
|
327
|
+
height = borderSize.blockSize;
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
// fallback for browsers that don't support borderBoxSize
|
|
331
|
+
width = element.offsetWidth;
|
|
332
|
+
height = element.offsetHeight;
|
|
333
|
+
}
|
|
334
|
+
// For inline elements, ResizeObserver may report 0,0 dimensions
|
|
335
|
+
// Use getBoundingClientRect as fallback for inline elements with zero dimensions
|
|
336
|
+
if ((width === 0 || height === 0) && getComputedStyle(element).display === 'inline') {
|
|
337
|
+
const rect = element.getBoundingClientRect();
|
|
338
|
+
width = rect.width;
|
|
339
|
+
height = rect.height;
|
|
340
|
+
}
|
|
341
|
+
return { width, height };
|
|
342
|
+
}
|
|
339
343
|
/**
|
|
340
344
|
* A simple utility to get the dimensions of an element as a signal.
|
|
341
345
|
*/
|
|
342
346
|
function injectDimensions() {
|
|
343
347
|
const elementRef = injectElementRef();
|
|
344
348
|
const destroyRef = inject(DestroyRef);
|
|
345
|
-
const dimensions = signal({ width: 0, height: 0 }, ...(ngDevMode ? [{ debugName: "dimensions" }] : []));
|
|
349
|
+
const dimensions = signal({ width: 0, height: 0 }, ...(ngDevMode ? [{ debugName: "dimensions" }] : /* istanbul ignore next */ []));
|
|
346
350
|
fromResizeEvent(elementRef.nativeElement)
|
|
347
351
|
.pipe(safeTakeUntilDestroyed(destroyRef), map(({ width, height }) => ({ width, height })))
|
|
348
352
|
.subscribe(event => dimensions.set(event));
|
|
@@ -425,7 +429,7 @@ function fromMutationObserver(element, { childList, subtree, attributes, charact
|
|
|
425
429
|
}
|
|
426
430
|
|
|
427
431
|
function setupOverflowListener(element, { disabled = signal(false), injector }) {
|
|
428
|
-
const hasOverflow = signal(false, ...(ngDevMode ? [{ debugName: "hasOverflow" }] : []));
|
|
432
|
+
const hasOverflow = signal(false, ...(ngDevMode ? [{ debugName: "hasOverflow" }] : /* istanbul ignore next */ []));
|
|
429
433
|
const destroyRef = injector?.get(DestroyRef) ?? inject(DestroyRef);
|
|
430
434
|
// Merge both observables and update hasOverflow on any event
|
|
431
435
|
merge(fromResizeEvent(element, { disabled, injector }), fromMutationObserver(element, { disabled, injector, characterData: true }))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-primitives-internal.mjs","sources":["../../../../packages/ng-primitives/internal/src/utilities/element-ref.ts","../../../../packages/ng-primitives/internal/src/exit-animation/exit-animation-manager.ts","../../../../packages/ng-primitives/internal/src/exit-animation/exit-animation.ts","../../../../packages/ng-primitives/internal/src/signals/explicit-effect.ts","../../../../packages/ng-primitives/internal/src/style-injector/style-injector.ts","../../../../packages/ng-primitives/internal/src/utilities/resize.ts","../../../../packages/ng-primitives/internal/src/utilities/dom-removal.ts","../../../../packages/ng-primitives/internal/src/utilities/dom-sort.ts","../../../../packages/ng-primitives/internal/src/utilities/mutation-observer.ts","../../../../packages/ng-primitives/internal/src/utilities/overflow.ts","../../../../packages/ng-primitives/internal/src/utilities/scrolling.ts","../../../../packages/ng-primitives/internal/src/ng-primitives-internal.ts"],"sourcesContent":["import { ElementRef, inject } from '@angular/core';\n\n/**\n * A simple utility function to inject an element reference with less boilerplate.\n * @returns The element reference.\n */\nexport function injectElementRef<T extends HTMLElement>(): ElementRef<T> {\n return inject(ElementRef);\n}\n","import { ClassProvider, inject, Injectable } from '@angular/core';\nimport type { NgpExitAnimation } from './exit-animation';\n\n@Injectable()\nexport class NgpExitAnimationManager {\n /** Store the instances of the exit animation directive. */\n private readonly instances: NgpExitAnimation[] = [];\n\n /** Add an instance to the manager. */\n add(instance: NgpExitAnimation): void {\n this.instances.push(instance);\n }\n\n /** Remove an instance from the manager. */\n remove(instance: NgpExitAnimation): void {\n const index = this.instances.indexOf(instance);\n if (index !== -1) {\n this.instances.splice(index, 1);\n }\n }\n\n /** Exit all instances. */\n async exit(): Promise<void> {\n await Promise.all(this.instances.map(instance => instance.exit()));\n }\n}\n\nexport function provideExitAnimationManager(): ClassProvider {\n return { provide: NgpExitAnimationManager, useClass: NgpExitAnimationManager };\n}\n\nexport function injectExitAnimationManager(): NgpExitAnimationManager {\n return inject(NgpExitAnimationManager);\n}\n","import { Directive, OnDestroy } from '@angular/core';\nimport { injectElementRef } from '../utilities/element-ref';\nimport { injectExitAnimationManager } from './exit-animation-manager';\n\n@Directive({\n selector: '[ngpExitAnimation]',\n exportAs: 'ngpExitAnimation',\n})\nexport class NgpExitAnimation implements OnDestroy {\n /** The animation manager. */\n private readonly animationManager = injectExitAnimationManager();\n /** Access the element reference. */\n protected readonly elementRef = injectElementRef();\n\n /** Exist animation reference. */\n protected readonly ref = setupExitAnimation({ element: this.elementRef.nativeElement });\n\n constructor() {\n this.animationManager.add(this);\n }\n\n ngOnDestroy(): void {\n this.animationManager.remove(this);\n }\n\n /** Mark the element as exiting. */\n async exit(): Promise<void> {\n await this.ref.exit();\n }\n}\n\ninterface NgpExitAnimationOptions {\n /** The element to animate. */\n element: HTMLElement;\n /** If true, skip requestAnimationFrame delay and set enter state immediately. */\n immediate?: boolean;\n}\n\nexport interface NgpExitAnimationRef {\n /** Mark the element as exiting and wait for the animation to finish. */\n exit: () => Promise<void>;\n /** Cancel an in-progress exit animation and transition back to enter state. */\n cancel: () => void;\n}\n\nexport function setupExitAnimation({\n element,\n immediate,\n}: NgpExitAnimationOptions): NgpExitAnimationRef {\n let state: 'enter' | 'exit' = 'enter';\n let exitResolve: (() => void) | null = null;\n\n function setState(newState: 'enter' | 'exit') {\n state = newState;\n\n // remove all current animation state attributes\n element.removeAttribute('data-enter');\n element.removeAttribute('data-exit');\n\n // add the new animation state attribute\n if (state === 'enter') {\n element.setAttribute('data-enter', '');\n } else if (state === 'exit') {\n element.setAttribute('data-exit', '');\n }\n }\n\n // Set the initial state to 'enter' - immediately if instant, otherwise next frame\n if (immediate) {\n setState('enter');\n } else {\n requestAnimationFrame(() => setState('enter'));\n }\n\n return {\n exit: () => {\n return new Promise((resolve, reject) => {\n exitResolve = resolve;\n setState('exit');\n\n const animations = element.getAnimations();\n\n // Wait for the exit animations to finish\n if (animations.length > 0) {\n Promise.all(animations.map(anim => anim.finished))\n .then(() => {\n exitResolve = null;\n resolve();\n })\n .catch(err => {\n exitResolve = null;\n // AbortError is expected when element is removed during animation\n // e.g. when the user navigates away to another page\n // Note: Animation.finished can reject with DOMException which may not pass instanceof Error\n if ((err as { name?: string })?.name === 'AbortError') {\n resolve();\n } else {\n reject(err);\n }\n });\n } else {\n exitResolve = null;\n resolve();\n }\n });\n },\n cancel: () => {\n if (state === 'exit') {\n // Cancel any running animations\n const animations = element.getAnimations();\n for (const anim of animations) {\n anim.cancel();\n }\n // Transition back to enter state\n setState('enter');\n // Resolve the pending exit promise so detach() completes\n if (exitResolve) {\n exitResolve();\n exitResolve = null;\n }\n }\n },\n };\n}\n","/**\n * This implementation is heavily inspired by the great work on ngextension!\n * https://github.com/ngxtension/ngxtension-platform/blob/main/libs/ngxtension/explicit-effect/src/explicit-effect.ts\n */\nimport {\n CreateEffectOptions,\n EffectCleanupRegisterFn,\n EffectRef,\n effect,\n untracked,\n} from '@angular/core';\n\n/**\n * We want to have the Tuple in order to use the types in the function signature\n */\ntype ExplicitEffectValues<T> = {\n [K in keyof T]: () => T[K];\n};\n\n/**\n * This explicit effect function will take the dependencies and the function to run when the dependencies change.\n * @param deps - The dependencies that the effect will run on\n * @param fn - The function to run when the dependencies change\n * @param options - The options for the effect with the addition of defer (it allows the computation to run on first change, not immediately)\n */\nexport function explicitEffect<Input extends readonly unknown[], Params = Input>(\n deps: readonly [...ExplicitEffectValues<Input>],\n fn: (deps: Params, onCleanup: EffectCleanupRegisterFn) => void,\n options?: CreateEffectOptions,\n): EffectRef {\n return effect(onCleanup => {\n const depValues = deps.map(s => s());\n untracked(() => fn(depValues as Params, onCleanup));\n }, options);\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { CSP_NONCE, inject, Injectable, PLATFORM_ID } from '@angular/core';\n\n/**\n * A utility service for injecting styles into the document.\n * Angular doesn't allow directives to specify styles, only components.\n * As we ship directives, occasionally we need to associate styles with them.\n * This service allows us to programmatically inject styles into the document.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class StyleInjector {\n /**\n * Access the CSP nonce\n */\n private readonly cspNonce = inject(CSP_NONCE, { optional: true });\n\n /**\n * Access the document.\n */\n private readonly document = inject(DOCUMENT);\n\n /**\n * Detect the platform.\n */\n private readonly platformId = inject(PLATFORM_ID);\n\n /**\n * Store the map of style elements with their unique identifiers.\n */\n private readonly styleElements = new Map<string, HTMLStyleElement>();\n\n constructor() {\n if (isPlatformBrowser(this.platformId)) {\n this.collectServerStyles();\n }\n }\n\n /**\n * Inject a style into the document.\n * @param id The unique identifier for the style.\n * @param style The style to inject.\n */\n add(id: string, style: string): void {\n if (this.styleElements.has(id)) {\n return;\n }\n\n const styleElement = this.document.createElement('style');\n styleElement.setAttribute('data-ngp-style', id);\n styleElement.textContent = style;\n\n // If a CSP nonce is provided, set it on the style element\n if (this.cspNonce) {\n styleElement.setAttribute('nonce', this.cspNonce);\n }\n\n this.document.head.appendChild(styleElement);\n this.styleElements.set(id, styleElement);\n }\n\n /**\n * Remove a style from the document.\n * @param id The unique identifier for the style.\n */\n remove(id: string): void {\n const styleElement = this.styleElements.get(id);\n\n if (styleElement) {\n this.document.head.removeChild(styleElement);\n this.styleElements.delete(id);\n }\n }\n\n /**\n * Collect any styles that were rendered by the server.\n */\n private collectServerStyles(): void {\n const styleElements = this.document.querySelectorAll<HTMLStyleElement>('style[data-ngp-style]');\n\n styleElements.forEach(styleElement => {\n const id = styleElement.getAttribute('data-ngp-style');\n\n if (id) {\n this.styleElements.set(id, styleElement);\n }\n });\n }\n}\n\nexport function injectStyleInjector(): StyleInjector {\n return inject(StyleInjector);\n}\n","import { isPlatformServer } from '@angular/common';\nimport {\n DestroyRef,\n effect,\n inject,\n Injector,\n PLATFORM_ID,\n signal,\n Signal,\n untracked,\n} from '@angular/core';\nimport { isUndefined, safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { Observable, Subscription } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { explicitEffect } from '../signals/explicit-effect';\nimport { injectElementRef } from './element-ref';\n\ninterface NgpResizeObserverOptions {\n /**\n * Whether to listen for events.\n */\n disabled?: Signal<boolean>;\n\n /**\n * The injector to use when called from outside of the injector context.\n */\n injector?: Injector;\n}\n\n/**\n * A simple helper function to create a resize observer as an RxJS Observable.\n * @param element The element to observe for resize events.\n * @returns The resize event as an Observable.\n */\nexport function fromResizeEvent(\n element: HTMLElement,\n { disabled = signal(false), injector }: NgpResizeObserverOptions = {},\n): Observable<Dimensions> {\n const platformId = injector?.get(PLATFORM_ID) ?? inject(PLATFORM_ID);\n\n return new Observable(observable => {\n // ResizeObserver may not be available in all environments, so check for its existence\n if (isPlatformServer(platformId) || isUndefined(window?.ResizeObserver)) {\n // ResizeObserver is not available (SSR or unsupported browser)\n // Complete the observable without emitting any values\n observable.complete();\n return;\n }\n\n let observer: ResizeObserver | null = null;\n\n function setupOrTeardownObserver() {\n if (disabled()) {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n return;\n }\n\n if (!observer) {\n observer = new ResizeObserver(entries => {\n // if there are no entries, ignore the event\n if (!entries.length) {\n return;\n }\n\n // otherwise, take the first entry and emit the dimensions\n const entry = entries[0];\n\n let width: number, height: number;\n\n if ('borderBoxSize' in entry) {\n const borderSizeEntry = entry['borderBoxSize'];\n // this may be different across browsers so normalize it\n const borderSize = Array.isArray(borderSizeEntry)\n ? borderSizeEntry[0]\n : borderSizeEntry;\n\n width = borderSize['inlineSize'];\n height = borderSize['blockSize'];\n } else {\n // fallback for browsers that don't support borderBoxSize\n width = element.offsetWidth;\n height = element.offsetHeight;\n }\n\n // For inline elements, ResizeObserver may report 0,0 dimensions\n // Use getBoundingClientRect as fallback for inline elements with zero dimensions\n if ((width === 0 || height === 0) && getComputedStyle(element).display === 'inline') {\n const rect = element.getBoundingClientRect();\n width = rect.width;\n height = rect.height;\n }\n\n observable.next({ width, height });\n });\n\n observer.observe(element);\n }\n }\n\n setupOrTeardownObserver();\n\n explicitEffect([disabled], () => setupOrTeardownObserver(), { injector });\n\n return () => observer?.disconnect();\n });\n}\n\n/**\n * A utility function to observe any element for resize events and return the dimensions as a signal.\n */\nexport function observeResize(elementFn: () => HTMLElement | undefined): Signal<Dimensions> {\n const dimensions = signal<Dimensions>({ width: 0, height: 0 });\n const injector = inject(Injector);\n const destroyRef = inject(DestroyRef);\n\n // store the subscription to the resize event\n let subscription: Subscription | null = null;\n\n effect(() => {\n const targetElement = elementFn();\n\n untracked(() => {\n if (!targetElement) {\n return;\n }\n\n // if we already have a subscription, unsubscribe from it\n subscription?.unsubscribe();\n\n // create a new subscription to the resize event\n subscription = fromResizeEvent(targetElement, { injector })\n .pipe(safeTakeUntilDestroyed(destroyRef))\n .subscribe(event => dimensions.set({ width: event.width, height: event.height }));\n });\n });\n\n return dimensions;\n}\n\nexport interface Dimensions {\n width: number;\n height: number;\n}\n\n/**\n * A simple utility to get the dimensions of an element as a signal.\n */\nexport function injectDimensions(): Signal<Dimensions> {\n const elementRef = injectElementRef<HTMLElement>();\n const destroyRef = inject(DestroyRef);\n const dimensions = signal<Dimensions>({ width: 0, height: 0 });\n\n fromResizeEvent(elementRef.nativeElement)\n .pipe(\n safeTakeUntilDestroyed(destroyRef),\n map(({ width, height }) => ({ width, height })),\n )\n .subscribe(event => dimensions.set(event));\n\n return dimensions;\n}\n","import { isPlatformServer } from '@angular/common';\nimport { inject, PLATFORM_ID } from '@angular/core';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { fromResizeEvent } from './resize';\n\n/**\n * Whenever an element is removed from the DOM, we call the callback.\n * @param element The element to watch for removal.\n * @param callback The callback to call when the element is removed.\n */\nexport function onDomRemoval(element: HTMLElement, callback: () => void): void {\n const platform = inject(PLATFORM_ID);\n\n // Dont run this on the server\n if (isPlatformServer(platform)) {\n return;\n }\n\n // This is a bit of a hack, but it works. If the element dimensions become zero,\n // it's likely that the element has been removed from the DOM.\n fromResizeEvent(element)\n .pipe(safeTakeUntilDestroyed())\n .subscribe(dimensions => {\n // we check the dimensions first to short-circuit the check as it's faster\n if (dimensions.width === 0 && dimensions.height === 0 && !document.body.contains(element)) {\n callback();\n }\n });\n}\n","/**\n * This function sorts DOM elements based on their position in the document.\n * However items can also explitly define their index in which case it will be used\n * to sort the elements first. This allows for both natural DOM order sorting as well\n * as custom order for cases like virtual scrolling where items might be rendered\n * out of order.\n */\nexport function domSort<T>(\n items: T[],\n getElement: (item: T) => HTMLElement,\n getIndex?: (item: T) => number | undefined,\n): T[] {\n return items.slice().sort((a, b) => {\n const indexA = getIndex?.(a);\n const indexB = getIndex?.(b);\n\n if (indexA !== undefined && indexB !== undefined) {\n return indexA - indexB;\n }\n\n if (indexA !== undefined) {\n return -1;\n }\n\n if (indexB !== undefined) {\n return 1;\n }\n\n const elementA = getElement(a);\n const elementB = getElement(b);\n\n return elementA.compareDocumentPosition(elementB) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;\n });\n}\n","import { Injector, Signal, signal } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { explicitEffect } from '../signals/explicit-effect';\n\ninterface NgpMutationObserverOptions {\n /**\n * Whether to listen for events.\n */\n disabled?: Signal<boolean>;\n /**\n * The injector to use when called from outside of the injector context.\n */\n injector?: Injector;\n /**\n * Whether the childList should be observed.\n */\n childList?: boolean;\n /**\n * Whether the subtree should be observed.\n */\n subtree?: boolean;\n /**\n * Whether the attributes should be observed.\n */\n attributes?: boolean;\n /**\n * Whether the characterData should be observed.\n */\n characterData?: boolean;\n /**\n * Whether the attributeFilter should be observed.\n */\n attributeFilter?: string[];\n}\n\n/**\n * This function sets up a mutation observer to listen for changes in the DOM.\n * It will stop listening when the `disabled` signal is true, and re-enable when it is false.\n * @param options - Options for the mutation observer\n */\nexport function fromMutationObserver(\n element: HTMLElement,\n {\n childList,\n subtree,\n attributes,\n characterData,\n disabled = signal(false),\n injector,\n }: NgpMutationObserverOptions = {},\n): Observable<MutationRecord[]> {\n return new Observable<MutationRecord[]>(observable => {\n let observer: MutationObserver | null = null;\n\n function setupOrTeardownObserver() {\n if (disabled()) {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n return;\n }\n\n observer = new MutationObserver(mutations => observable.next(mutations));\n observer.observe(element, { childList, subtree, attributes, characterData });\n }\n\n setupOrTeardownObserver();\n\n // any time the disabled state changes, we need to re-evaluate the observer\n explicitEffect([disabled], () => setupOrTeardownObserver(), { injector });\n\n return () => observer?.disconnect();\n });\n}\n","import { DestroyRef, inject, Injector, Signal, signal } from '@angular/core';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { merge } from 'rxjs';\nimport { fromMutationObserver } from './mutation-observer';\nimport { fromResizeEvent } from './resize';\n\ninterface NgpOverflowListenerOptions {\n /**\n * Whether to listen for overflow changes.\n */\n disabled?: Signal<boolean>;\n /**\n * The injector to use when called from outside of the injector context.\n */\n injector?: Injector;\n}\n\nexport function setupOverflowListener(\n element: HTMLElement,\n { disabled = signal(false), injector }: NgpOverflowListenerOptions,\n): Signal<boolean> {\n const hasOverflow = signal<boolean>(false);\n const destroyRef = injector?.get(DestroyRef) ?? inject(DestroyRef);\n\n // Merge both observables and update hasOverflow on any event\n\n merge(\n fromResizeEvent(element, { disabled, injector }),\n fromMutationObserver(element, { disabled, injector, characterData: true }),\n )\n .pipe(safeTakeUntilDestroyed(destroyRef))\n .subscribe(() =>\n hasOverflow.set(\n element.scrollWidth > element.clientWidth || element.scrollHeight > element.clientHeight,\n ),\n );\n\n return hasOverflow;\n}\n","function getScrollableAncestor(element: HTMLElement): HTMLElement | null {\n let parent = element.parentElement;\n while (parent) {\n const style = window.getComputedStyle(parent);\n if (/(auto|scroll)/.test(style.overflowY) || /(auto|scroll)/.test(style.overflowX)) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return null;\n}\n\nexport function scrollIntoViewIfNeeded(element: HTMLElement): void {\n const scrollableAncestor = getScrollableAncestor(element);\n if (!scrollableAncestor) return;\n\n const parentRect = scrollableAncestor.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n\n if (elementRect.top < parentRect.top) {\n scrollableAncestor.scrollTop -= parentRect.top - elementRect.top;\n } else if (elementRect.bottom > parentRect.bottom) {\n scrollableAncestor.scrollTop += elementRect.bottom - parentRect.bottom;\n }\n\n if (elementRect.left < parentRect.left) {\n scrollableAncestor.scrollLeft -= parentRect.left - elementRect.left;\n } else if (elementRect.right > parentRect.right) {\n scrollableAncestor.scrollLeft += elementRect.right - parentRect.right;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ng-primitives-internal.mjs","sources":["../../../../packages/ng-primitives/internal/src/utilities/element-ref.ts","../../../../packages/ng-primitives/internal/src/exit-animation/exit-animation-manager.ts","../../../../packages/ng-primitives/internal/src/exit-animation/exit-animation.ts","../../../../packages/ng-primitives/internal/src/signals/explicit-effect.ts","../../../../packages/ng-primitives/internal/src/style-injector/style-injector.ts","../../../../packages/ng-primitives/internal/src/utilities/resize.ts","../../../../packages/ng-primitives/internal/src/utilities/dom-removal.ts","../../../../packages/ng-primitives/internal/src/utilities/dom-sort.ts","../../../../packages/ng-primitives/internal/src/utilities/mutation-observer.ts","../../../../packages/ng-primitives/internal/src/utilities/overflow.ts","../../../../packages/ng-primitives/internal/src/utilities/scrolling.ts","../../../../packages/ng-primitives/internal/src/ng-primitives-internal.ts"],"sourcesContent":["import { ElementRef, inject } from '@angular/core';\n\n/**\n * A simple utility function to inject an element reference with less boilerplate.\n * @returns The element reference.\n */\nexport function injectElementRef<T extends HTMLElement>(): ElementRef<T> {\n return inject(ElementRef);\n}\n","import { ClassProvider, inject, Injectable } from '@angular/core';\nimport type { NgpExitAnimation } from './exit-animation';\n\n@Injectable()\nexport class NgpExitAnimationManager {\n /** Store the instances of the exit animation directive. */\n private readonly instances: NgpExitAnimation[] = [];\n\n /** Add an instance to the manager. */\n add(instance: NgpExitAnimation): void {\n this.instances.push(instance);\n }\n\n /** Remove an instance from the manager. */\n remove(instance: NgpExitAnimation): void {\n const index = this.instances.indexOf(instance);\n if (index !== -1) {\n this.instances.splice(index, 1);\n }\n }\n\n /** Exit all instances. */\n async exit(): Promise<void> {\n await Promise.all(this.instances.map(instance => instance.exit()));\n }\n}\n\nexport function provideExitAnimationManager(): ClassProvider {\n return { provide: NgpExitAnimationManager, useClass: NgpExitAnimationManager };\n}\n\nexport function injectExitAnimationManager(): NgpExitAnimationManager {\n return inject(NgpExitAnimationManager);\n}\n","import { Directive, OnDestroy } from '@angular/core';\nimport { injectElementRef } from '../utilities/element-ref';\nimport { injectExitAnimationManager } from './exit-animation-manager';\n\n@Directive({\n selector: '[ngpExitAnimation]',\n exportAs: 'ngpExitAnimation',\n})\nexport class NgpExitAnimation implements OnDestroy {\n /** The animation manager. */\n private readonly animationManager = injectExitAnimationManager();\n /** Access the element reference. */\n protected readonly elementRef = injectElementRef();\n\n /** Exist animation reference. */\n protected readonly ref = setupExitAnimation({ element: this.elementRef.nativeElement });\n\n constructor() {\n this.animationManager.add(this);\n }\n\n ngOnDestroy(): void {\n this.animationManager.remove(this);\n }\n\n /** Mark the element as exiting. */\n async exit(): Promise<void> {\n await this.ref.exit();\n }\n}\n\ninterface NgpExitAnimationOptions {\n /** The element to animate. */\n element: HTMLElement;\n /** If true, skip requestAnimationFrame delay and set enter state immediately. */\n immediate?: boolean;\n}\n\nexport interface NgpExitAnimationRef {\n /** Mark the element as exiting and wait for the animation to finish. */\n exit: () => Promise<void>;\n /** Cancel an in-progress exit animation and transition back to enter state. */\n cancel: () => void;\n}\n\nexport function setupExitAnimation({\n element,\n immediate,\n}: NgpExitAnimationOptions): NgpExitAnimationRef {\n let state: 'enter' | 'exit' = 'enter';\n let exitResolve: (() => void) | null = null;\n\n function setState(newState: 'enter' | 'exit') {\n state = newState;\n\n // remove all current animation state attributes\n element.removeAttribute('data-enter');\n element.removeAttribute('data-exit');\n\n // add the new animation state attribute\n if (state === 'enter') {\n element.setAttribute('data-enter', '');\n } else if (state === 'exit') {\n element.setAttribute('data-exit', '');\n }\n }\n\n // Set the initial state to 'enter' - immediately if instant, otherwise next frame\n if (immediate) {\n setState('enter');\n } else {\n requestAnimationFrame(() => setState('enter'));\n }\n\n return {\n exit: () => {\n return new Promise((resolve, reject) => {\n exitResolve = resolve;\n setState('exit');\n\n const animations = element.getAnimations();\n\n // Wait for the exit animations to finish\n if (animations.length > 0) {\n Promise.all(animations.map(anim => anim.finished))\n .then(() => {\n exitResolve = null;\n resolve();\n })\n .catch(err => {\n exitResolve = null;\n // AbortError is expected when element is removed during animation\n // e.g. when the user navigates away to another page\n // Note: Animation.finished can reject with DOMException which may not pass instanceof Error\n if ((err as { name?: string })?.name === 'AbortError') {\n resolve();\n } else {\n reject(err);\n }\n });\n } else {\n exitResolve = null;\n resolve();\n }\n });\n },\n cancel: () => {\n if (state === 'exit') {\n // Cancel any running animations\n const animations = element.getAnimations();\n for (const anim of animations) {\n anim.cancel();\n }\n // Transition back to enter state\n setState('enter');\n // Resolve the pending exit promise so detach() completes\n if (exitResolve) {\n exitResolve();\n exitResolve = null;\n }\n }\n },\n };\n}\n","/**\n * This implementation is heavily inspired by the great work on ngextension!\n * https://github.com/ngxtension/ngxtension-platform/blob/main/libs/ngxtension/explicit-effect/src/explicit-effect.ts\n */\nimport {\n CreateEffectOptions,\n EffectCleanupRegisterFn,\n EffectRef,\n effect,\n untracked,\n} from '@angular/core';\n\n/**\n * We want to have the Tuple in order to use the types in the function signature\n */\ntype ExplicitEffectValues<T> = {\n [K in keyof T]: () => T[K];\n};\n\n/**\n * This explicit effect function will take the dependencies and the function to run when the dependencies change.\n * @param deps - The dependencies that the effect will run on\n * @param fn - The function to run when the dependencies change\n * @param options - The options for the effect with the addition of defer (it allows the computation to run on first change, not immediately)\n */\nexport function explicitEffect<Input extends readonly unknown[], Params = Input>(\n deps: readonly [...ExplicitEffectValues<Input>],\n fn: (deps: Params, onCleanup: EffectCleanupRegisterFn) => void,\n options?: CreateEffectOptions,\n): EffectRef {\n return effect(onCleanup => {\n const depValues = deps.map(s => s());\n untracked(() => fn(depValues as Params, onCleanup));\n }, options);\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { CSP_NONCE, inject, Injectable, PLATFORM_ID } from '@angular/core';\n\n/**\n * A utility service for injecting styles into the document.\n * Angular doesn't allow directives to specify styles, only components.\n * As we ship directives, occasionally we need to associate styles with them.\n * This service allows us to programmatically inject styles into the document.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class StyleInjector {\n /**\n * Access the CSP nonce\n */\n private readonly cspNonce = inject(CSP_NONCE, { optional: true });\n\n /**\n * Access the document.\n */\n private readonly document = inject(DOCUMENT);\n\n /**\n * Detect the platform.\n */\n private readonly platformId = inject(PLATFORM_ID);\n\n /**\n * Store the map of style elements with their unique identifiers.\n */\n private readonly styleElements = new Map<string, HTMLStyleElement>();\n\n constructor() {\n if (isPlatformBrowser(this.platformId)) {\n this.collectServerStyles();\n }\n }\n\n /**\n * Inject a style into the document.\n * @param id The unique identifier for the style.\n * @param style The style to inject.\n */\n add(id: string, style: string): void {\n if (this.styleElements.has(id)) {\n return;\n }\n\n const styleElement = this.document.createElement('style');\n styleElement.setAttribute('data-ngp-style', id);\n styleElement.textContent = style;\n\n // If a CSP nonce is provided, set it on the style element\n if (this.cspNonce) {\n styleElement.setAttribute('nonce', this.cspNonce);\n }\n\n this.document.head.appendChild(styleElement);\n this.styleElements.set(id, styleElement);\n }\n\n /**\n * Remove a style from the document.\n * @param id The unique identifier for the style.\n */\n remove(id: string): void {\n const styleElement = this.styleElements.get(id);\n\n if (styleElement) {\n this.document.head.removeChild(styleElement);\n this.styleElements.delete(id);\n }\n }\n\n /**\n * Collect any styles that were rendered by the server.\n */\n private collectServerStyles(): void {\n const styleElements = this.document.querySelectorAll<HTMLStyleElement>('style[data-ngp-style]');\n\n styleElements.forEach(styleElement => {\n const id = styleElement.getAttribute('data-ngp-style');\n\n if (id) {\n this.styleElements.set(id, styleElement);\n }\n });\n }\n}\n\nexport function injectStyleInjector(): StyleInjector {\n return inject(StyleInjector);\n}\n","import { isPlatformServer } from '@angular/common';\nimport {\n DestroyRef,\n effect,\n inject,\n Injector,\n PLATFORM_ID,\n signal,\n Signal,\n untracked,\n} from '@angular/core';\nimport { isUndefined, safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { Observable, Subscription } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { explicitEffect } from '../signals/explicit-effect';\nimport { injectElementRef } from './element-ref';\n\ninterface NgpResizeObserverOptions {\n /**\n * Whether to listen for events.\n */\n disabled?: Signal<boolean>;\n\n /**\n * The injector to use when called from outside of the injector context.\n */\n injector?: Injector;\n}\n\n/**\n * A simple helper function to create a resize observer as an RxJS Observable.\n * @param element The element to observe for resize events.\n * @returns The resize event as an Observable.\n */\nexport function fromResizeEvent(\n element: HTMLElement,\n { disabled = signal(false), injector }: NgpResizeObserverOptions = {},\n): Observable<Dimensions> {\n const platformId = injector?.get(PLATFORM_ID) ?? inject(PLATFORM_ID);\n\n return new Observable(observable => {\n // ResizeObserver may not be available in all environments, so check for its existence\n if (isPlatformServer(platformId) || isUndefined(window?.ResizeObserver)) {\n // ResizeObserver is not available (SSR or unsupported browser)\n // Complete the observable without emitting any values\n observable.complete();\n return;\n }\n\n let observer: ResizeObserver | null = null;\n\n function setupOrTeardownObserver() {\n if (disabled()) {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n return;\n }\n\n if (!observer) {\n observer = new ResizeObserver(entries => {\n // if there are no entries, ignore the event\n if (!entries.length) {\n return;\n }\n\n // otherwise, take the first entry and emit the dimensions\n const entry = entries[0];\n observable.next(getElementDimensions(element, entry));\n });\n\n observer.observe(element);\n\n // Emit an initial measurement immediately to avoid one-frame stale layout\n // while waiting for the first ResizeObserver callback.\n observable.next(getElementDimensions(element));\n }\n }\n\n setupOrTeardownObserver();\n\n explicitEffect([disabled], () => setupOrTeardownObserver(), { injector });\n\n return () => observer?.disconnect();\n });\n}\n\n/**\n * A utility function to observe any element for resize events and return the dimensions as a signal.\n */\nexport function observeResize(elementFn: () => HTMLElement | undefined): Signal<Dimensions> {\n const dimensions = signal<Dimensions>({ width: 0, height: 0 });\n const injector = inject(Injector);\n const destroyRef = inject(DestroyRef);\n\n // store the subscription to the resize event\n let subscription: Subscription | null = null;\n\n effect(() => {\n const targetElement = elementFn();\n\n untracked(() => {\n if (!targetElement) {\n return;\n }\n\n // if we already have a subscription, unsubscribe from it\n subscription?.unsubscribe();\n\n // create a new subscription to the resize event\n subscription = fromResizeEvent(targetElement, { injector })\n .pipe(safeTakeUntilDestroyed(destroyRef))\n .subscribe(event => dimensions.set({ width: event.width, height: event.height }));\n });\n });\n\n return dimensions;\n}\n\nfunction getElementDimensions(element: HTMLElement, entry?: ResizeObserverEntry): Dimensions {\n let width: number, height: number;\n if (entry && 'borderBoxSize' in entry) {\n const borderSizeEntry = entry.borderBoxSize;\n // this may be different across browsers so normalize it\n const borderSize = Array.isArray(borderSizeEntry) ? borderSizeEntry[0] : borderSizeEntry;\n\n width = borderSize.inlineSize;\n height = borderSize.blockSize;\n } else {\n // fallback for browsers that don't support borderBoxSize\n width = element.offsetWidth;\n height = element.offsetHeight;\n }\n\n // For inline elements, ResizeObserver may report 0,0 dimensions\n // Use getBoundingClientRect as fallback for inline elements with zero dimensions\n if ((width === 0 || height === 0) && getComputedStyle(element).display === 'inline') {\n const rect = element.getBoundingClientRect();\n width = rect.width;\n height = rect.height;\n }\n\n return { width, height };\n}\n\nexport interface Dimensions {\n width: number;\n height: number;\n}\n\n/**\n * A simple utility to get the dimensions of an element as a signal.\n */\nexport function injectDimensions(): Signal<Dimensions> {\n const elementRef = injectElementRef<HTMLElement>();\n const destroyRef = inject(DestroyRef);\n const dimensions = signal<Dimensions>({ width: 0, height: 0 });\n\n fromResizeEvent(elementRef.nativeElement)\n .pipe(\n safeTakeUntilDestroyed(destroyRef),\n map(({ width, height }) => ({ width, height })),\n )\n .subscribe(event => dimensions.set(event));\n\n return dimensions;\n}\n","import { isPlatformServer } from '@angular/common';\nimport { inject, PLATFORM_ID } from '@angular/core';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { fromResizeEvent } from './resize';\n\n/**\n * Whenever an element is removed from the DOM, we call the callback.\n * @param element The element to watch for removal.\n * @param callback The callback to call when the element is removed.\n */\nexport function onDomRemoval(element: HTMLElement, callback: () => void): void {\n const platform = inject(PLATFORM_ID);\n\n // Dont run this on the server\n if (isPlatformServer(platform)) {\n return;\n }\n\n // This is a bit of a hack, but it works. If the element dimensions become zero,\n // it's likely that the element has been removed from the DOM.\n fromResizeEvent(element)\n .pipe(safeTakeUntilDestroyed())\n .subscribe(dimensions => {\n // we check the dimensions first to short-circuit the check as it's faster\n if (dimensions.width === 0 && dimensions.height === 0 && !document.body.contains(element)) {\n callback();\n }\n });\n}\n","/**\n * This function sorts DOM elements based on their position in the document.\n * However items can also explitly define their index in which case it will be used\n * to sort the elements first. This allows for both natural DOM order sorting as well\n * as custom order for cases like virtual scrolling where items might be rendered\n * out of order.\n */\nexport function domSort<T>(\n items: T[],\n getElement: (item: T) => HTMLElement,\n getIndex?: (item: T) => number | undefined,\n): T[] {\n return items.slice().sort((a, b) => {\n const indexA = getIndex?.(a);\n const indexB = getIndex?.(b);\n\n if (indexA !== undefined && indexB !== undefined) {\n return indexA - indexB;\n }\n\n if (indexA !== undefined) {\n return -1;\n }\n\n if (indexB !== undefined) {\n return 1;\n }\n\n const elementA = getElement(a);\n const elementB = getElement(b);\n\n return elementA.compareDocumentPosition(elementB) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;\n });\n}\n","import { Injector, Signal, signal } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { explicitEffect } from '../signals/explicit-effect';\n\ninterface NgpMutationObserverOptions {\n /**\n * Whether to listen for events.\n */\n disabled?: Signal<boolean>;\n /**\n * The injector to use when called from outside of the injector context.\n */\n injector?: Injector;\n /**\n * Whether the childList should be observed.\n */\n childList?: boolean;\n /**\n * Whether the subtree should be observed.\n */\n subtree?: boolean;\n /**\n * Whether the attributes should be observed.\n */\n attributes?: boolean;\n /**\n * Whether the characterData should be observed.\n */\n characterData?: boolean;\n /**\n * Whether the attributeFilter should be observed.\n */\n attributeFilter?: string[];\n}\n\n/**\n * This function sets up a mutation observer to listen for changes in the DOM.\n * It will stop listening when the `disabled` signal is true, and re-enable when it is false.\n * @param options - Options for the mutation observer\n */\nexport function fromMutationObserver(\n element: HTMLElement,\n {\n childList,\n subtree,\n attributes,\n characterData,\n disabled = signal(false),\n injector,\n }: NgpMutationObserverOptions = {},\n): Observable<MutationRecord[]> {\n return new Observable<MutationRecord[]>(observable => {\n let observer: MutationObserver | null = null;\n\n function setupOrTeardownObserver() {\n if (disabled()) {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n return;\n }\n\n observer = new MutationObserver(mutations => observable.next(mutations));\n observer.observe(element, { childList, subtree, attributes, characterData });\n }\n\n setupOrTeardownObserver();\n\n // any time the disabled state changes, we need to re-evaluate the observer\n explicitEffect([disabled], () => setupOrTeardownObserver(), { injector });\n\n return () => observer?.disconnect();\n });\n}\n","import { DestroyRef, inject, Injector, Signal, signal } from '@angular/core';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { merge } from 'rxjs';\nimport { fromMutationObserver } from './mutation-observer';\nimport { fromResizeEvent } from './resize';\n\ninterface NgpOverflowListenerOptions {\n /**\n * Whether to listen for overflow changes.\n */\n disabled?: Signal<boolean>;\n /**\n * The injector to use when called from outside of the injector context.\n */\n injector?: Injector;\n}\n\nexport function setupOverflowListener(\n element: HTMLElement,\n { disabled = signal(false), injector }: NgpOverflowListenerOptions,\n): Signal<boolean> {\n const hasOverflow = signal<boolean>(false);\n const destroyRef = injector?.get(DestroyRef) ?? inject(DestroyRef);\n\n // Merge both observables and update hasOverflow on any event\n\n merge(\n fromResizeEvent(element, { disabled, injector }),\n fromMutationObserver(element, { disabled, injector, characterData: true }),\n )\n .pipe(safeTakeUntilDestroyed(destroyRef))\n .subscribe(() =>\n hasOverflow.set(\n element.scrollWidth > element.clientWidth || element.scrollHeight > element.clientHeight,\n ),\n );\n\n return hasOverflow;\n}\n","function getScrollableAncestor(element: HTMLElement): HTMLElement | null {\n let parent = element.parentElement;\n while (parent) {\n const style = window.getComputedStyle(parent);\n if (/(auto|scroll)/.test(style.overflowY) || /(auto|scroll)/.test(style.overflowX)) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return null;\n}\n\nexport function scrollIntoViewIfNeeded(element: HTMLElement): void {\n const scrollableAncestor = getScrollableAncestor(element);\n if (!scrollableAncestor) return;\n\n const parentRect = scrollableAncestor.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n\n if (elementRect.top < parentRect.top) {\n scrollableAncestor.scrollTop -= parentRect.top - elementRect.top;\n } else if (elementRect.bottom > parentRect.bottom) {\n scrollableAncestor.scrollTop += elementRect.bottom - parentRect.bottom;\n }\n\n if (elementRect.left < parentRect.left) {\n scrollableAncestor.scrollLeft -= parentRect.left - elementRect.left;\n } else if (elementRect.right > parentRect.right) {\n scrollableAncestor.scrollLeft += elementRect.right - parentRect.right;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|