ng-primitives 0.50.0 → 0.52.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.
@@ -481,11 +481,25 @@ class NgpCombobox {
481
481
  });
482
482
  /** The state of the combobox. */
483
483
  this.state = comboboxState(this);
484
+ setupInteractions({
485
+ focus: true,
486
+ focusWithin: true,
487
+ hover: true,
488
+ press: true,
489
+ disabled: this.state.disabled,
490
+ });
484
491
  // any time the active descendant changes, ensure we scroll it into view
485
492
  // perform after next render to ensure the DOM is updated
486
493
  // e.g. the dropdown is open before the option is scrolled into view
487
494
  afterRenderEffect({
488
- write: () => this.activeDescendantManager.activeItem()?.scrollIntoView?.(),
495
+ write: () => {
496
+ const isPositioned = this.portal()?.overlay()?.isPositioned() ?? false;
497
+ const activeItem = this.activeDescendantManager.activeItem();
498
+ if (!isPositioned || !activeItem) {
499
+ return;
500
+ }
501
+ this.activeDescendantManager.activeItem()?.scrollIntoView?.();
502
+ },
489
503
  });
490
504
  }
491
505
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ng-primitives-combobox.mjs","sources":["../../../../packages/ng-primitives/combobox/src/combobox/combobox-state.ts","../../../../packages/ng-primitives/combobox/src/combobox-dropdown/combobox-dropdown.ts","../../../../packages/ng-primitives/combobox/src/combobox-input/combobox-input.ts","../../../../packages/ng-primitives/combobox/src/combobox-option/combobox-option.ts","../../../../packages/ng-primitives/combobox/src/combobox-portal/combobox-portal.ts","../../../../packages/ng-primitives/combobox/src/combobox/combobox.ts","../../../../packages/ng-primitives/combobox/src/combobox-button/combobox-button.ts","../../../../packages/ng-primitives/combobox/src/ng-primitives-combobox.ts"],"sourcesContent":["import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpCombobox } from './combobox';\n\n/**\n * The state token for the Combobox primitive.\n */\nexport const NgpComboboxStateToken = createStateToken<NgpCombobox>('Combobox');\n\n/**\n * Provides the Combobox state.\n */\nexport const provideComboboxState = createStateProvider(NgpComboboxStateToken);\n\n/**\n * Injects the Combobox state.\n */\nexport const injectComboboxState = createStateInjector<NgpCombobox>(NgpComboboxStateToken);\n\n/**\n * The Combobox state registration function.\n */\nexport const comboboxState = createState(NgpComboboxStateToken);\n","import { Directive, input } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { observeResize } from 'ng-primitives/resize';\nimport { uniqueId } from 'ng-primitives/utils';\nimport { injectComboboxState } from '../combobox/combobox-state';\n\n@Directive({\n selector: '[ngpComboboxDropdown]',\n exportAs: 'ngpComboboxDropdown',\n host: {\n role: 'listbox',\n '[id]': 'id()',\n '[style.left.px]': 'state().overlay()?.position()?.x',\n '[style.top.px]': 'state().overlay()?.position()?.y',\n '[style.--ngp-combobox-transform-origin]': 'state().overlay()?.transformOrigin()',\n '[style.--ngp-combobox-width.px]': 'comboboxDimensions().width',\n '[style.--ngp-combobox-input-width.px]': 'inputDimensions().width',\n '[style.--ngp-combobox-button-width.px]': 'buttonDimensions().width',\n },\n})\nexport class NgpComboboxDropdown {\n /** Access the combobox state. */\n protected readonly state = injectComboboxState();\n\n /** The dimensions of the combobox. */\n protected readonly comboboxDimensions = observeResize(\n () => this.state().elementRef.nativeElement,\n );\n\n /** The dimensions of the combobox. */\n protected readonly inputDimensions = observeResize(\n () => this.state().input()?.elementRef.nativeElement,\n );\n\n /** Store the combobox button dimensions. */\n protected readonly buttonDimensions = observeResize(\n () => this.state().button()?.elementRef.nativeElement,\n );\n\n /**\n * Access the element reference.\n * @internal\n */\n readonly elementRef = injectElementRef();\n\n /** The id of the dropdown. */\n readonly id = input<string>(uniqueId('ngp-combobox-dropdown'));\n\n constructor() {\n this.state().registerDropdown(this);\n }\n}\n","import { computed, Directive, HostListener, input } from '@angular/core';\nimport { injectElementRef, setupInteractions } from 'ng-primitives/internal';\nimport { uniqueId } from 'ng-primitives/utils';\nimport type { NgpComboboxOption } from '../combobox-option/combobox-option';\nimport { injectComboboxState } from '../combobox/combobox-state';\n\n@Directive({\n selector: 'input[ngpComboboxInput]',\n exportAs: 'ngpComboboxInput',\n host: {\n role: 'combobox',\n type: 'text',\n autocomplete: 'off',\n autocorrect: 'off',\n spellcheck: 'false',\n 'aria-haspopup': 'listbox',\n 'aria-autocomplete': 'list',\n '[id]': 'id()',\n '[attr.aria-controls]': 'state().open() ? dropdownId() : undefined',\n '[attr.aria-expanded]': 'state().open()',\n '[attr.data-open]': 'state().open() ? \"\" : undefined',\n '[attr.data-disabled]': 'state().disabled() ? \"\" : undefined',\n '[attr.data-multiple]': 'state().multiple() ? \"\" : undefined',\n '[attr.aria-activedescendant]': 'activeDescendant()',\n '[disabled]': 'state().disabled()',\n },\n})\nexport class NgpComboboxInput {\n /** Access the combobox state. */\n protected readonly state = injectComboboxState();\n\n /**\n * Access the element reference.\n * @internal\n */\n readonly elementRef = injectElementRef<HTMLInputElement>();\n\n /** The id of the input. */\n readonly id = input<string>(uniqueId('ngp-combobox-input'));\n\n /** The id of the dropdown. */\n readonly dropdownId = computed(() => this.state().dropdown()?.id());\n\n /** The id of the active descendant. */\n protected readonly activeDescendant = computed(() =>\n this.state().activeDescendantManager.activeDescendant(),\n );\n\n /** Determine if the pointer was used to focus the input. */\n protected pointerFocused = false;\n\n constructor() {\n setupInteractions({\n focus: true,\n hover: true,\n press: true,\n disabled: this.state().disabled,\n });\n\n this.state().registerInput(this);\n }\n\n /** Handle keydown events for accessibility. */\n @HostListener('keydown', ['$event'])\n protected handleKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowDown':\n if (this.state().open()) {\n this.state().activateNextOption();\n } else {\n this.state().openDropdown();\n }\n event.preventDefault();\n break;\n case 'ArrowUp':\n if (this.state().open()) {\n this.state().activatePreviousOption();\n } else {\n this.state().openDropdown();\n this.state().activeDescendantManager.last();\n }\n event.preventDefault();\n break;\n case 'Home':\n if (this.state().open()) {\n this.state().activeDescendantManager.first();\n }\n event.preventDefault();\n break;\n case 'End':\n if (this.state().open()) {\n this.state().activeDescendantManager.last();\n }\n event.preventDefault();\n break;\n case 'Enter':\n if (this.state().open()) {\n this.state().selectOption(\n this.state().activeDescendantManager.activeItem() as NgpComboboxOption,\n );\n }\n event.preventDefault();\n break;\n case 'Escape':\n this.state().closeDropdown();\n event.preventDefault();\n break;\n case 'Backspace':\n // if the input is not empty then open the dropdown\n if (this.elementRef.nativeElement.value.length > 0) {\n this.state().openDropdown();\n }\n break;\n default:\n // Ignore keys with length > 1 (e.g., 'Shift', 'ArrowLeft', 'Enter', etc.)\n // Filter out control/meta key combos (e.g., Ctrl+C)\n if (event.key.length > 1 || event.ctrlKey || event.metaKey || event.altKey) {\n return;\n }\n\n // if this was a character key, we want to open the dropdown\n this.state().openDropdown();\n }\n }\n\n @HostListener('blur', ['$event'])\n protected closeDropdown(event: FocusEvent): void {\n const relatedTarget = event.relatedTarget as HTMLElement;\n\n // if the blur was caused by focus moving to the dropdown, don't close\n if (\n relatedTarget &&\n this.state().dropdown()?.elementRef.nativeElement.contains(relatedTarget)\n ) {\n return;\n }\n\n // if the blur was caused by focus moving to the button, don't close\n if (relatedTarget && this.state().button()?.elementRef.nativeElement.contains(relatedTarget)) {\n return;\n }\n\n this.state().closeDropdown();\n event.preventDefault();\n }\n\n /**\n * Focus the input field\n * @internal\n */\n focus(): void {\n this.elementRef.nativeElement.focus();\n }\n\n @HostListener('focus', ['$event'])\n protected highlightText(): void {\n if (this.pointerFocused) {\n this.pointerFocused = false;\n return;\n }\n\n // highlight the text in the input\n this.elementRef.nativeElement.setSelectionRange(0, this.elementRef.nativeElement.value.length);\n }\n\n @HostListener('pointerdown', ['$event'])\n protected handlePointerDown(): void {\n this.pointerFocused = true;\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n Directive,\n HostListener,\n input,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { NgpActivatable } from 'ng-primitives/a11y';\nimport { injectElementRef, setupInteractions } from 'ng-primitives/internal';\nimport { uniqueId } from 'ng-primitives/utils';\nimport { injectComboboxState } from '../combobox/combobox-state';\n\n@Directive({\n selector: '[ngpComboboxOption]',\n exportAs: 'ngpComboboxOption',\n host: {\n role: 'option',\n '[id]': 'id()',\n '[attr.tabindex]': '-1',\n '[attr.aria-selected]': 'selected() ? \"true\" : undefined',\n '[attr.data-selected]': 'selected() ? \"\" : undefined',\n '[attr.data-active]': 'active() ? \"\" : undefined',\n '[attr.data-disabled]': 'disabled() ? \"\" : undefined',\n '(click)': 'select()',\n },\n})\nexport class NgpComboboxOption implements OnInit, OnDestroy, NgpActivatable {\n /** Access the combobox state. */\n protected readonly state = injectComboboxState();\n\n /**\n * The element reference of the option.\n * @internal\n */\n readonly elementRef = injectElementRef();\n\n /** The id of the option. */\n readonly id = input<string>(uniqueId('ngp-combobox-option'));\n\n /** The value of the option. */\n readonly value = input<any>(undefined, {\n alias: 'ngpComboboxOptionValue',\n });\n\n /** The disabled state of the option. */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpComboboxOptionDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Whether this option is the active descendant.\n * @internal\n */\n protected readonly active = computed(\n () => this.state().activeDescendantManager.activeDescendant() === this.id(),\n );\n\n /** Whether this option is selected. */\n protected readonly selected = computed(() => {\n const value = this.value();\n\n if (!value) {\n return false;\n }\n\n if (this.state().multiple()) {\n return (\n Array.isArray(value) && value.some(v => this.state().compareWith()(v, this.state().value()))\n );\n }\n\n return this.state().compareWith()(value, this.state().value());\n });\n\n constructor() {\n this.state().registerOption(this);\n\n setupInteractions({\n hover: true,\n press: true,\n disabled: this.disabled,\n });\n }\n\n ngOnInit(): void {\n if (this.value() === undefined) {\n throw new Error(\n 'ngpComboboxOption: The value input is required. Please provide a value for the option.',\n );\n }\n }\n\n ngOnDestroy(): void {\n this.state().unregisterOption(this);\n }\n\n /**\n * Select the option.\n * @internal\n */\n select(): void {\n if (this.disabled()) {\n return;\n }\n\n this.state().toggleOption(this);\n }\n\n /**\n * Scroll the option into view.\n * @internal\n */\n scrollIntoView(): void {\n this.elementRef.nativeElement.scrollIntoView({ block: 'nearest' });\n }\n\n /**\n * Whenever the pointer enters the option, activate it.\n * @internal\n */\n @HostListener('pointerenter')\n protected onPointerEnter(): void {\n this.state().activeDescendantManager.activate(this);\n }\n\n /**\n * Whenever the pointer leaves the option, deactivate it.\n * @internal\n */\n @HostListener('pointerleave')\n protected onPointerLeave(): void {\n this.state().activeDescendantManager.activate(undefined);\n }\n}\n","import {\n Directive,\n inject,\n Injector,\n OnDestroy,\n signal,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport { createOverlay, NgpOverlay, NgpOverlayConfig } from 'ng-primitives/portal';\nimport { injectComboboxState } from '../combobox/combobox-state';\n\n@Directive({\n selector: '[ngpComboboxPortal]',\n exportAs: 'ngpComboboxPortal',\n})\nexport class NgpComboboxPortal implements OnDestroy {\n /** Access the combobox state. */\n private readonly state = injectComboboxState();\n /** Access the view container reference. */\n private readonly viewContainerRef = inject(ViewContainerRef);\n\n /** Access the template reference. */\n private readonly templateRef = inject(TemplateRef);\n\n /** Access the injector. */\n private readonly injector = inject(Injector);\n\n /**\n * The overlay that manages the popover\n * @internal\n */\n readonly overlay = signal<NgpOverlay<void> | null>(null);\n\n constructor() {\n this.state().registerPortal(this);\n }\n\n /** Cleanup the portal. */\n ngOnDestroy(): void {\n this.overlay()?.destroy();\n }\n\n /**\n * Attach the portal.\n * @internal\n */\n show(): Promise<void> {\n // Create the overlay if it doesn't exist yet\n if (!this.overlay()) {\n this.createOverlay();\n }\n\n // Show the overlay\n return this.overlay()!.show();\n }\n\n /**\n * Detach the portal.\n * @internal\n */\n async detach(): Promise<void> {\n this.overlay()?.hide();\n }\n\n /**\n * Create the overlay that will contain the dropdown\n */\n private createOverlay(): void {\n // Create config for the overlay\n const config: NgpOverlayConfig<void> = {\n content: this.templateRef,\n viewContainerRef: this.viewContainerRef,\n triggerElement: this.state().elementRef.nativeElement,\n injector: this.injector,\n placement: this.state().placement(),\n closeOnOutsideClick: true,\n closeOnEscape: true,\n restoreFocus: false,\n scrollBehaviour: 'reposition',\n };\n\n this.overlay.set(createOverlay(config));\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n afterRenderEffect,\n booleanAttribute,\n computed,\n Directive,\n inject,\n Injector,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { Placement } from '@floating-ui/dom';\nimport { activeDescendantManager } from 'ng-primitives/a11y';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport type { NgpComboboxButton } from '../combobox-button/combobox-button';\nimport type { NgpComboboxDropdown } from '../combobox-dropdown/combobox-dropdown';\nimport type { NgpComboboxInput } from '../combobox-input/combobox-input';\nimport { NgpComboboxOption } from '../combobox-option/combobox-option';\nimport type { NgpComboboxPortal } from '../combobox-portal/combobox-portal';\nimport { comboboxState, provideComboboxState } from './combobox-state';\n\n/**\n * Ideally we would use a generic type here, unfortunately, unlike in React,\n * we cannot infer the type based on another input. For example, if multiple\n * is true, we cannot infer that the value is an array of T. Using a union\n * type is not ideal either because it requires the user to handle multiple cases.\n * Using a generic also isn't ideal because we need to use T as both an array and\n * a single value.\n *\n * Any seems to be used by Angular Material, ng-select, and other libraries\n * so we will use it here as well.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype T = any;\n\n@Directive({\n selector: '[ngpCombobox]',\n exportAs: 'ngpCombobox',\n providers: [provideComboboxState()],\n host: {\n '[attr.data-open]': 'state.open() ? \"\" : undefined',\n '[attr.data-disabled]': 'state.disabled() ? \"\" : undefined',\n '[attr.data-multiple]': 'state.multiple() ? \"\" : undefined',\n },\n})\nexport class NgpCombobox {\n /** @internal Access the combobox element. */\n readonly elementRef = injectElementRef();\n\n /** Access the injector. */\n protected readonly injector = inject(Injector);\n\n /** The value of the combobox. */\n readonly value = input<T>(undefined, {\n alias: 'ngpComboboxValue',\n });\n\n /** Event emitted when the value changes. */\n readonly valueChange = output<T>({\n alias: 'ngpComboboxValueChange',\n });\n\n /** Whether the combobox is multiple selection. */\n readonly multiple = input<boolean, BooleanInput>(false, {\n alias: 'ngpComboboxMultiple',\n transform: booleanAttribute,\n });\n\n /** Whether the combobox is disabled. */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpComboboxDisabled',\n transform: booleanAttribute,\n });\n\n /** Emit when the dropdown open state changes. */\n readonly openChange = output<boolean>({\n alias: 'ngpComboboxOpenChange',\n });\n\n /** The comparator function used to compare options. */\n readonly compareWith = input<(a: T | undefined, b: T | undefined) => boolean>(Object.is, {\n alias: 'ngpComboboxCompareWith',\n });\n\n /** The position of the dropdown. */\n readonly placement = input<Placement>('bottom', {\n alias: 'ngpComboboxDropdownPlacement',\n });\n\n /**\n * Store the combobox input\n * @internal\n */\n readonly input = signal<NgpComboboxInput | undefined>(undefined);\n\n /**\n * Store the combobox button.\n * @internal\n */\n readonly button = signal<NgpComboboxButton | undefined>(undefined);\n\n /**\n * Store the combobox portal.\n * @internal\n */\n readonly portal = signal<NgpComboboxPortal | undefined>(undefined);\n\n /**\n * Store the combobox dropdown.\n * @internal\n */\n readonly dropdown = signal<NgpComboboxDropdown | undefined>(undefined);\n\n /**\n * Store the combobox options.\n * @internal\n */\n readonly options = signal<NgpComboboxOption[]>([]);\n\n /**\n * Access the overlay\n * @internal\n */\n readonly overlay = computed(() => this.portal()?.overlay());\n\n /**\n * The open state of the combobox.\n * @internal\n */\n readonly open = computed(() => this.overlay()?.isOpen() ?? false);\n\n /**\n * The active key descendant manager.\n * @internal\n */\n readonly activeDescendantManager = activeDescendantManager({\n // we must wrap the signal in a computed to ensure it is not used before it is defined\n disabled: computed(() => this.state.disabled()),\n items: this.options,\n });\n\n /** The state of the combobox. */\n protected readonly state = comboboxState<NgpCombobox>(this);\n\n constructor() {\n // any time the active descendant changes, ensure we scroll it into view\n // perform after next render to ensure the DOM is updated\n // e.g. the dropdown is open before the option is scrolled into view\n afterRenderEffect({\n write: () => this.activeDescendantManager.activeItem()?.scrollIntoView?.(),\n });\n }\n\n /**\n * Open the dropdown.\n * @internal\n */\n async openDropdown(): Promise<void> {\n if (this.state.disabled() || this.open()) {\n return;\n }\n\n await this.portal()?.show();\n\n // if there is a selected option(s), set the active descendant to the first selected option\n const selectedOption = this.options().find(option => this.isOptionSelected(option));\n\n // if there is no selected option, set the active descendant to the first option\n const targetOption = selectedOption ?? this.options()[0];\n\n // if there is no target option, do nothing\n if (!targetOption) {\n return;\n }\n\n // activate the selected option or the first option\n this.activeDescendantManager.activate(targetOption);\n }\n\n /**\n * Close the dropdown.\n * @internal\n */\n closeDropdown(): void {\n if (!this.open()) {\n return;\n }\n\n this.openChange.emit(false);\n this.portal()?.detach();\n\n // clear the active descendant\n this.activeDescendantManager.reset();\n }\n\n /**\n * Toggle the dropdown.\n * @internal\n */\n async toggleDropdown(): Promise<void> {\n if (this.open()) {\n this.closeDropdown();\n } else {\n await this.openDropdown();\n }\n }\n\n /**\n * Select an option.\n * @param option The option to select.\n * @internal\n */\n selectOption(option: NgpComboboxOption): void {\n if (this.state.disabled()) {\n return;\n }\n\n if (this.state.multiple()) {\n // if the option is already selected, do nothing\n if (this.isOptionSelected(option)) {\n return;\n }\n\n const value = [...(this.state.value() as T[]), option.value() as T];\n\n // add the option to the value\n this.state.value.set(value as T);\n this.valueChange.emit(value as T);\n } else {\n this.state.value.set(option.value() as T);\n this.valueChange.emit(option.value() as T);\n\n // close the dropdown on single selection\n this.closeDropdown();\n }\n }\n\n /**\n * Deselect an option.\n * @param option The option to deselect.\n * @internal\n */\n deselectOption(option: NgpComboboxOption): void {\n // if the combobox is disabled or the option is not selected, do nothing\n // if the combobox is single selection, we don't allow deselecting\n if (this.state.disabled() || !this.isOptionSelected(option) || !this.state.multiple()) {\n return;\n }\n\n const values = (this.state.value() as T[]) ?? [];\n\n const newValue = values.filter(v => !this.state.compareWith()(v, option.value() as T));\n\n // remove the option from the value\n this.state.value.set(newValue as T);\n this.valueChange.emit(newValue as T);\n }\n\n /**\n * Toggle the selection of an option.\n * @param option The option to toggle.\n * @internal\n */\n toggleOption(option: NgpComboboxOption): void {\n if (this.state.disabled()) {\n return;\n }\n\n // if the state is single selection, we don't allow toggling\n if (!this.state.multiple()) {\n // always select the option in single selection mode even if it is already selected so that we update the input\n this.selectOption(option);\n return;\n }\n\n // otherwise toggle the option\n if (this.isOptionSelected(option)) {\n this.deselectOption(option);\n } else {\n this.selectOption(option);\n }\n }\n\n /**\n * Determine if an option is selected.\n * @param option The option to check.\n * @internal\n */\n isOptionSelected(option: NgpComboboxOption): boolean {\n if (this.state.disabled()) {\n return false;\n }\n\n const value = this.state.value();\n\n if (!value) {\n return false;\n }\n\n if (this.state.multiple()) {\n return value && (value as T[]).some(v => this.state.compareWith()(option.value(), v));\n }\n\n return this.state.compareWith()(option.value(), value);\n }\n\n /**\n * Activate the next option in the list if there is one.\n * If there is no option currently active, activate the selected option or the first option.\n * @internal\n */\n activateNextOption(): void {\n if (this.state.disabled()) {\n return;\n }\n\n const options = this.options();\n\n // if there are no options, do nothing\n if (options.length === 0) {\n return;\n }\n\n // if there is no active option, activate the first option\n if (!this.activeDescendantManager.activeItem()) {\n const selectedOption = options.find(option => this.isOptionSelected(option));\n\n // if there is a selected option(s), set the active descendant to the first selected option\n const targetOption = selectedOption ?? options[0];\n\n this.activeDescendantManager.activate(targetOption);\n return;\n }\n\n // otherwise activate the next option\n this.activeDescendantManager.next();\n }\n\n /**\n * Activate the previous option in the list if there is one.\n * @internal\n */\n activatePreviousOption(): void {\n if (this.state.disabled()) {\n return;\n }\n const options = this.options();\n // if there are no options, do nothing\n if (options.length === 0) {\n return;\n }\n // if there is no active option, activate the last option\n if (!this.activeDescendantManager.activeItem()) {\n const selectedOption = options.find(option => this.isOptionSelected(option));\n // if there is a selected option(s), set the active descendant to the first selected option\n const targetOption = selectedOption ?? options[options.length - 1];\n this.activeDescendantManager.activate(targetOption);\n return;\n }\n // otherwise activate the previous option\n this.activeDescendantManager.previous();\n }\n\n /**\n * Register the dropdown portal with the combobox.\n * @param portal The dropdown portal.\n * @internal\n */\n registerPortal(portal: NgpComboboxPortal): void {\n this.portal.set(portal);\n }\n\n /**\n * Register the combobox input with the combobox.\n * @param input The combobox input.\n * @internal\n */\n registerInput(input: NgpComboboxInput): void {\n this.input.set(input);\n }\n\n /**\n * Register the combobox button with the combobox.\n * @param button The combobox button.\n * @internal\n */\n registerButton(button: NgpComboboxButton): void {\n this.button.set(button);\n }\n\n /**\n * Register the dropdown with the combobox.\n * @param dropdown The dropdown to register.\n * @internal\n */\n registerDropdown(dropdown: NgpComboboxDropdown): void {\n this.dropdown.set(dropdown);\n }\n\n /**\n * Register an option with the combobox.\n * @param option The option to register.\n * @internal\n */\n registerOption(option: NgpComboboxOption): void {\n this.options.update(options => [...options, option]);\n }\n\n /**\n * Unregister an option from the combobox.\n * @param option The option to unregister.\n * @internal\n */\n unregisterOption(option: NgpComboboxOption): void {\n this.options.update(options => options.filter(o => o !== option));\n }\n}\n","import { computed, Directive, HostListener, input } from '@angular/core';\nimport { injectElementRef, setupInteractions } from 'ng-primitives/internal';\nimport { uniqueId } from 'ng-primitives/utils';\nimport { injectComboboxState } from '../combobox/combobox-state';\n\n@Directive({\n selector: '[ngpComboboxButton]',\n exportAs: 'ngpComboboxButton',\n host: {\n type: 'button',\n tabindex: '-1',\n 'aria-haspopup': 'listbox',\n '[id]': 'id()',\n '[attr.aria-controls]': 'dropdownId()',\n '[attr.aria-expanded]': 'state().open()',\n '[attr.data-open]': 'state().open() ? \"\" : undefined',\n '[attr.data-disabled]': 'state().disabled() ? \"\" : undefined',\n '[attr.data-multiple]': 'state().multiple() ? \"\" : undefined',\n '[disabled]': 'state().disabled()',\n },\n})\nexport class NgpComboboxButton {\n /** Access the combobox state. */\n protected readonly state = injectComboboxState();\n\n /**\n * Access the element reference.\n * @internal\n */\n readonly elementRef = injectElementRef<HTMLButtonElement>();\n\n /** The id of the button. */\n readonly id = input<string>(uniqueId('ngp-combobox-button'));\n\n /** The id of the dropdown. */\n readonly dropdownId = computed(() => this.state().dropdown()?.id());\n\n constructor() {\n setupInteractions({\n hover: true,\n press: true,\n disabled: this.state().disabled,\n });\n\n this.state().registerButton(this);\n }\n\n @HostListener('click')\n protected async toggleDropdown(): Promise<void> {\n await this.state().toggleDropdown();\n this.state().input()?.focus();\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-combobox.mjs","sources":["../../../../packages/ng-primitives/combobox/src/combobox/combobox-state.ts","../../../../packages/ng-primitives/combobox/src/combobox-dropdown/combobox-dropdown.ts","../../../../packages/ng-primitives/combobox/src/combobox-input/combobox-input.ts","../../../../packages/ng-primitives/combobox/src/combobox-option/combobox-option.ts","../../../../packages/ng-primitives/combobox/src/combobox-portal/combobox-portal.ts","../../../../packages/ng-primitives/combobox/src/combobox/combobox.ts","../../../../packages/ng-primitives/combobox/src/combobox-button/combobox-button.ts","../../../../packages/ng-primitives/combobox/src/ng-primitives-combobox.ts"],"sourcesContent":["import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpCombobox } from './combobox';\n\n/**\n * The state token for the Combobox primitive.\n */\nexport const NgpComboboxStateToken = createStateToken<NgpCombobox>('Combobox');\n\n/**\n * Provides the Combobox state.\n */\nexport const provideComboboxState = createStateProvider(NgpComboboxStateToken);\n\n/**\n * Injects the Combobox state.\n */\nexport const injectComboboxState = createStateInjector<NgpCombobox>(NgpComboboxStateToken);\n\n/**\n * The Combobox state registration function.\n */\nexport const comboboxState = createState(NgpComboboxStateToken);\n","import { Directive, input } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { observeResize } from 'ng-primitives/resize';\nimport { uniqueId } from 'ng-primitives/utils';\nimport { injectComboboxState } from '../combobox/combobox-state';\n\n@Directive({\n selector: '[ngpComboboxDropdown]',\n exportAs: 'ngpComboboxDropdown',\n host: {\n role: 'listbox',\n '[id]': 'id()',\n '[style.left.px]': 'state().overlay()?.position()?.x',\n '[style.top.px]': 'state().overlay()?.position()?.y',\n '[style.--ngp-combobox-transform-origin]': 'state().overlay()?.transformOrigin()',\n '[style.--ngp-combobox-width.px]': 'comboboxDimensions().width',\n '[style.--ngp-combobox-input-width.px]': 'inputDimensions().width',\n '[style.--ngp-combobox-button-width.px]': 'buttonDimensions().width',\n },\n})\nexport class NgpComboboxDropdown {\n /** Access the combobox state. */\n protected readonly state = injectComboboxState();\n\n /** The dimensions of the combobox. */\n protected readonly comboboxDimensions = observeResize(\n () => this.state().elementRef.nativeElement,\n );\n\n /** The dimensions of the combobox. */\n protected readonly inputDimensions = observeResize(\n () => this.state().input()?.elementRef.nativeElement,\n );\n\n /** Store the combobox button dimensions. */\n protected readonly buttonDimensions = observeResize(\n () => this.state().button()?.elementRef.nativeElement,\n );\n\n /**\n * Access the element reference.\n * @internal\n */\n readonly elementRef = injectElementRef();\n\n /** The id of the dropdown. */\n readonly id = input<string>(uniqueId('ngp-combobox-dropdown'));\n\n constructor() {\n this.state().registerDropdown(this);\n }\n}\n","import { computed, Directive, HostListener, input } from '@angular/core';\nimport { injectElementRef, setupInteractions } from 'ng-primitives/internal';\nimport { uniqueId } from 'ng-primitives/utils';\nimport type { NgpComboboxOption } from '../combobox-option/combobox-option';\nimport { injectComboboxState } from '../combobox/combobox-state';\n\n@Directive({\n selector: 'input[ngpComboboxInput]',\n exportAs: 'ngpComboboxInput',\n host: {\n role: 'combobox',\n type: 'text',\n autocomplete: 'off',\n autocorrect: 'off',\n spellcheck: 'false',\n 'aria-haspopup': 'listbox',\n 'aria-autocomplete': 'list',\n '[id]': 'id()',\n '[attr.aria-controls]': 'state().open() ? dropdownId() : undefined',\n '[attr.aria-expanded]': 'state().open()',\n '[attr.data-open]': 'state().open() ? \"\" : undefined',\n '[attr.data-disabled]': 'state().disabled() ? \"\" : undefined',\n '[attr.data-multiple]': 'state().multiple() ? \"\" : undefined',\n '[attr.aria-activedescendant]': 'activeDescendant()',\n '[disabled]': 'state().disabled()',\n },\n})\nexport class NgpComboboxInput {\n /** Access the combobox state. */\n protected readonly state = injectComboboxState();\n\n /**\n * Access the element reference.\n * @internal\n */\n readonly elementRef = injectElementRef<HTMLInputElement>();\n\n /** The id of the input. */\n readonly id = input<string>(uniqueId('ngp-combobox-input'));\n\n /** The id of the dropdown. */\n readonly dropdownId = computed(() => this.state().dropdown()?.id());\n\n /** The id of the active descendant. */\n protected readonly activeDescendant = computed(() =>\n this.state().activeDescendantManager.activeDescendant(),\n );\n\n /** Determine if the pointer was used to focus the input. */\n protected pointerFocused = false;\n\n constructor() {\n setupInteractions({\n focus: true,\n hover: true,\n press: true,\n disabled: this.state().disabled,\n });\n\n this.state().registerInput(this);\n }\n\n /** Handle keydown events for accessibility. */\n @HostListener('keydown', ['$event'])\n protected handleKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowDown':\n if (this.state().open()) {\n this.state().activateNextOption();\n } else {\n this.state().openDropdown();\n }\n event.preventDefault();\n break;\n case 'ArrowUp':\n if (this.state().open()) {\n this.state().activatePreviousOption();\n } else {\n this.state().openDropdown();\n this.state().activeDescendantManager.last();\n }\n event.preventDefault();\n break;\n case 'Home':\n if (this.state().open()) {\n this.state().activeDescendantManager.first();\n }\n event.preventDefault();\n break;\n case 'End':\n if (this.state().open()) {\n this.state().activeDescendantManager.last();\n }\n event.preventDefault();\n break;\n case 'Enter':\n if (this.state().open()) {\n this.state().selectOption(\n this.state().activeDescendantManager.activeItem() as NgpComboboxOption,\n );\n }\n event.preventDefault();\n break;\n case 'Escape':\n this.state().closeDropdown();\n event.preventDefault();\n break;\n case 'Backspace':\n // if the input is not empty then open the dropdown\n if (this.elementRef.nativeElement.value.length > 0) {\n this.state().openDropdown();\n }\n break;\n default:\n // Ignore keys with length > 1 (e.g., 'Shift', 'ArrowLeft', 'Enter', etc.)\n // Filter out control/meta key combos (e.g., Ctrl+C)\n if (event.key.length > 1 || event.ctrlKey || event.metaKey || event.altKey) {\n return;\n }\n\n // if this was a character key, we want to open the dropdown\n this.state().openDropdown();\n }\n }\n\n @HostListener('blur', ['$event'])\n protected closeDropdown(event: FocusEvent): void {\n const relatedTarget = event.relatedTarget as HTMLElement;\n\n // if the blur was caused by focus moving to the dropdown, don't close\n if (\n relatedTarget &&\n this.state().dropdown()?.elementRef.nativeElement.contains(relatedTarget)\n ) {\n return;\n }\n\n // if the blur was caused by focus moving to the button, don't close\n if (relatedTarget && this.state().button()?.elementRef.nativeElement.contains(relatedTarget)) {\n return;\n }\n\n this.state().closeDropdown();\n event.preventDefault();\n }\n\n /**\n * Focus the input field\n * @internal\n */\n focus(): void {\n this.elementRef.nativeElement.focus();\n }\n\n @HostListener('focus', ['$event'])\n protected highlightText(): void {\n if (this.pointerFocused) {\n this.pointerFocused = false;\n return;\n }\n\n // highlight the text in the input\n this.elementRef.nativeElement.setSelectionRange(0, this.elementRef.nativeElement.value.length);\n }\n\n @HostListener('pointerdown', ['$event'])\n protected handlePointerDown(): void {\n this.pointerFocused = true;\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n Directive,\n HostListener,\n input,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { NgpActivatable } from 'ng-primitives/a11y';\nimport { injectElementRef, setupInteractions } from 'ng-primitives/internal';\nimport { uniqueId } from 'ng-primitives/utils';\nimport { injectComboboxState } from '../combobox/combobox-state';\n\n@Directive({\n selector: '[ngpComboboxOption]',\n exportAs: 'ngpComboboxOption',\n host: {\n role: 'option',\n '[id]': 'id()',\n '[attr.tabindex]': '-1',\n '[attr.aria-selected]': 'selected() ? \"true\" : undefined',\n '[attr.data-selected]': 'selected() ? \"\" : undefined',\n '[attr.data-active]': 'active() ? \"\" : undefined',\n '[attr.data-disabled]': 'disabled() ? \"\" : undefined',\n '(click)': 'select()',\n },\n})\nexport class NgpComboboxOption implements OnInit, OnDestroy, NgpActivatable {\n /** Access the combobox state. */\n protected readonly state = injectComboboxState();\n\n /**\n * The element reference of the option.\n * @internal\n */\n readonly elementRef = injectElementRef();\n\n /** The id of the option. */\n readonly id = input<string>(uniqueId('ngp-combobox-option'));\n\n /** The value of the option. */\n readonly value = input<any>(undefined, {\n alias: 'ngpComboboxOptionValue',\n });\n\n /** The disabled state of the option. */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpComboboxOptionDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Whether this option is the active descendant.\n * @internal\n */\n protected readonly active = computed(\n () => this.state().activeDescendantManager.activeDescendant() === this.id(),\n );\n\n /** Whether this option is selected. */\n protected readonly selected = computed(() => {\n const value = this.value();\n\n if (!value) {\n return false;\n }\n\n if (this.state().multiple()) {\n return (\n Array.isArray(value) && value.some(v => this.state().compareWith()(v, this.state().value()))\n );\n }\n\n return this.state().compareWith()(value, this.state().value());\n });\n\n constructor() {\n this.state().registerOption(this);\n\n setupInteractions({\n hover: true,\n press: true,\n disabled: this.disabled,\n });\n }\n\n ngOnInit(): void {\n if (this.value() === undefined) {\n throw new Error(\n 'ngpComboboxOption: The value input is required. Please provide a value for the option.',\n );\n }\n }\n\n ngOnDestroy(): void {\n this.state().unregisterOption(this);\n }\n\n /**\n * Select the option.\n * @internal\n */\n select(): void {\n if (this.disabled()) {\n return;\n }\n\n this.state().toggleOption(this);\n }\n\n /**\n * Scroll the option into view.\n * @internal\n */\n scrollIntoView(): void {\n this.elementRef.nativeElement.scrollIntoView({ block: 'nearest' });\n }\n\n /**\n * Whenever the pointer enters the option, activate it.\n * @internal\n */\n @HostListener('pointerenter')\n protected onPointerEnter(): void {\n this.state().activeDescendantManager.activate(this);\n }\n\n /**\n * Whenever the pointer leaves the option, deactivate it.\n * @internal\n */\n @HostListener('pointerleave')\n protected onPointerLeave(): void {\n this.state().activeDescendantManager.activate(undefined);\n }\n}\n","import {\n Directive,\n inject,\n Injector,\n OnDestroy,\n signal,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport { createOverlay, NgpOverlay, NgpOverlayConfig } from 'ng-primitives/portal';\nimport { injectComboboxState } from '../combobox/combobox-state';\n\n@Directive({\n selector: '[ngpComboboxPortal]',\n exportAs: 'ngpComboboxPortal',\n})\nexport class NgpComboboxPortal implements OnDestroy {\n /** Access the combobox state. */\n private readonly state = injectComboboxState();\n /** Access the view container reference. */\n private readonly viewContainerRef = inject(ViewContainerRef);\n\n /** Access the template reference. */\n private readonly templateRef = inject(TemplateRef);\n\n /** Access the injector. */\n private readonly injector = inject(Injector);\n\n /**\n * The overlay that manages the popover\n * @internal\n */\n readonly overlay = signal<NgpOverlay<void> | null>(null);\n\n constructor() {\n this.state().registerPortal(this);\n }\n\n /** Cleanup the portal. */\n ngOnDestroy(): void {\n this.overlay()?.destroy();\n }\n\n /**\n * Attach the portal.\n * @internal\n */\n show(): Promise<void> {\n // Create the overlay if it doesn't exist yet\n if (!this.overlay()) {\n this.createOverlay();\n }\n\n // Show the overlay\n return this.overlay()!.show();\n }\n\n /**\n * Detach the portal.\n * @internal\n */\n async detach(): Promise<void> {\n this.overlay()?.hide();\n }\n\n /**\n * Create the overlay that will contain the dropdown\n */\n private createOverlay(): void {\n // Create config for the overlay\n const config: NgpOverlayConfig<void> = {\n content: this.templateRef,\n viewContainerRef: this.viewContainerRef,\n triggerElement: this.state().elementRef.nativeElement,\n injector: this.injector,\n placement: this.state().placement(),\n closeOnOutsideClick: true,\n closeOnEscape: true,\n restoreFocus: false,\n scrollBehaviour: 'reposition',\n };\n\n this.overlay.set(createOverlay(config));\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n afterRenderEffect,\n booleanAttribute,\n computed,\n Directive,\n inject,\n Injector,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { Placement } from '@floating-ui/dom';\nimport { activeDescendantManager } from 'ng-primitives/a11y';\nimport { injectElementRef, setupInteractions } from 'ng-primitives/internal';\nimport type { NgpComboboxButton } from '../combobox-button/combobox-button';\nimport type { NgpComboboxDropdown } from '../combobox-dropdown/combobox-dropdown';\nimport type { NgpComboboxInput } from '../combobox-input/combobox-input';\nimport { NgpComboboxOption } from '../combobox-option/combobox-option';\nimport type { NgpComboboxPortal } from '../combobox-portal/combobox-portal';\nimport { comboboxState, provideComboboxState } from './combobox-state';\n\n/**\n * Ideally we would use a generic type here, unfortunately, unlike in React,\n * we cannot infer the type based on another input. For example, if multiple\n * is true, we cannot infer that the value is an array of T. Using a union\n * type is not ideal either because it requires the user to handle multiple cases.\n * Using a generic also isn't ideal because we need to use T as both an array and\n * a single value.\n *\n * Any seems to be used by Angular Material, ng-select, and other libraries\n * so we will use it here as well.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype T = any;\n\n@Directive({\n selector: '[ngpCombobox]',\n exportAs: 'ngpCombobox',\n providers: [provideComboboxState()],\n host: {\n '[attr.data-open]': 'state.open() ? \"\" : undefined',\n '[attr.data-disabled]': 'state.disabled() ? \"\" : undefined',\n '[attr.data-multiple]': 'state.multiple() ? \"\" : undefined',\n },\n})\nexport class NgpCombobox {\n /** @internal Access the combobox element. */\n readonly elementRef = injectElementRef();\n\n /** Access the injector. */\n protected readonly injector = inject(Injector);\n\n /** The value of the combobox. */\n readonly value = input<T>(undefined, {\n alias: 'ngpComboboxValue',\n });\n\n /** Event emitted when the value changes. */\n readonly valueChange = output<T>({\n alias: 'ngpComboboxValueChange',\n });\n\n /** Whether the combobox is multiple selection. */\n readonly multiple = input<boolean, BooleanInput>(false, {\n alias: 'ngpComboboxMultiple',\n transform: booleanAttribute,\n });\n\n /** Whether the combobox is disabled. */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpComboboxDisabled',\n transform: booleanAttribute,\n });\n\n /** Emit when the dropdown open state changes. */\n readonly openChange = output<boolean>({\n alias: 'ngpComboboxOpenChange',\n });\n\n /** The comparator function used to compare options. */\n readonly compareWith = input<(a: T | undefined, b: T | undefined) => boolean>(Object.is, {\n alias: 'ngpComboboxCompareWith',\n });\n\n /** The position of the dropdown. */\n readonly placement = input<Placement>('bottom', {\n alias: 'ngpComboboxDropdownPlacement',\n });\n\n /**\n * Store the combobox input\n * @internal\n */\n readonly input = signal<NgpComboboxInput | undefined>(undefined);\n\n /**\n * Store the combobox button.\n * @internal\n */\n readonly button = signal<NgpComboboxButton | undefined>(undefined);\n\n /**\n * Store the combobox portal.\n * @internal\n */\n readonly portal = signal<NgpComboboxPortal | undefined>(undefined);\n\n /**\n * Store the combobox dropdown.\n * @internal\n */\n readonly dropdown = signal<NgpComboboxDropdown | undefined>(undefined);\n\n /**\n * Store the combobox options.\n * @internal\n */\n readonly options = signal<NgpComboboxOption[]>([]);\n\n /**\n * Access the overlay\n * @internal\n */\n readonly overlay = computed(() => this.portal()?.overlay());\n\n /**\n * The open state of the combobox.\n * @internal\n */\n readonly open = computed(() => this.overlay()?.isOpen() ?? false);\n\n /**\n * The active key descendant manager.\n * @internal\n */\n readonly activeDescendantManager = activeDescendantManager({\n // we must wrap the signal in a computed to ensure it is not used before it is defined\n disabled: computed(() => this.state.disabled()),\n items: this.options,\n });\n\n /** The state of the combobox. */\n protected readonly state = comboboxState<NgpCombobox>(this);\n\n constructor() {\n setupInteractions({\n focus: true,\n focusWithin: true,\n hover: true,\n press: true,\n disabled: this.state.disabled,\n });\n\n // any time the active descendant changes, ensure we scroll it into view\n // perform after next render to ensure the DOM is updated\n // e.g. the dropdown is open before the option is scrolled into view\n afterRenderEffect({\n write: () => {\n const isPositioned = this.portal()?.overlay()?.isPositioned() ?? false;\n const activeItem = this.activeDescendantManager.activeItem();\n\n if (!isPositioned || !activeItem) {\n return;\n }\n\n this.activeDescendantManager.activeItem()?.scrollIntoView?.();\n },\n });\n }\n\n /**\n * Open the dropdown.\n * @internal\n */\n async openDropdown(): Promise<void> {\n if (this.state.disabled() || this.open()) {\n return;\n }\n\n await this.portal()?.show();\n\n // if there is a selected option(s), set the active descendant to the first selected option\n const selectedOption = this.options().find(option => this.isOptionSelected(option));\n\n // if there is no selected option, set the active descendant to the first option\n const targetOption = selectedOption ?? this.options()[0];\n\n // if there is no target option, do nothing\n if (!targetOption) {\n return;\n }\n\n // activate the selected option or the first option\n this.activeDescendantManager.activate(targetOption);\n }\n\n /**\n * Close the dropdown.\n * @internal\n */\n closeDropdown(): void {\n if (!this.open()) {\n return;\n }\n\n this.openChange.emit(false);\n this.portal()?.detach();\n\n // clear the active descendant\n this.activeDescendantManager.reset();\n }\n\n /**\n * Toggle the dropdown.\n * @internal\n */\n async toggleDropdown(): Promise<void> {\n if (this.open()) {\n this.closeDropdown();\n } else {\n await this.openDropdown();\n }\n }\n\n /**\n * Select an option.\n * @param option The option to select.\n * @internal\n */\n selectOption(option: NgpComboboxOption): void {\n if (this.state.disabled()) {\n return;\n }\n\n if (this.state.multiple()) {\n // if the option is already selected, do nothing\n if (this.isOptionSelected(option)) {\n return;\n }\n\n const value = [...(this.state.value() as T[]), option.value() as T];\n\n // add the option to the value\n this.state.value.set(value as T);\n this.valueChange.emit(value as T);\n } else {\n this.state.value.set(option.value() as T);\n this.valueChange.emit(option.value() as T);\n\n // close the dropdown on single selection\n this.closeDropdown();\n }\n }\n\n /**\n * Deselect an option.\n * @param option The option to deselect.\n * @internal\n */\n deselectOption(option: NgpComboboxOption): void {\n // if the combobox is disabled or the option is not selected, do nothing\n // if the combobox is single selection, we don't allow deselecting\n if (this.state.disabled() || !this.isOptionSelected(option) || !this.state.multiple()) {\n return;\n }\n\n const values = (this.state.value() as T[]) ?? [];\n\n const newValue = values.filter(v => !this.state.compareWith()(v, option.value() as T));\n\n // remove the option from the value\n this.state.value.set(newValue as T);\n this.valueChange.emit(newValue as T);\n }\n\n /**\n * Toggle the selection of an option.\n * @param option The option to toggle.\n * @internal\n */\n toggleOption(option: NgpComboboxOption): void {\n if (this.state.disabled()) {\n return;\n }\n\n // if the state is single selection, we don't allow toggling\n if (!this.state.multiple()) {\n // always select the option in single selection mode even if it is already selected so that we update the input\n this.selectOption(option);\n return;\n }\n\n // otherwise toggle the option\n if (this.isOptionSelected(option)) {\n this.deselectOption(option);\n } else {\n this.selectOption(option);\n }\n }\n\n /**\n * Determine if an option is selected.\n * @param option The option to check.\n * @internal\n */\n isOptionSelected(option: NgpComboboxOption): boolean {\n if (this.state.disabled()) {\n return false;\n }\n\n const value = this.state.value();\n\n if (!value) {\n return false;\n }\n\n if (this.state.multiple()) {\n return value && (value as T[]).some(v => this.state.compareWith()(option.value(), v));\n }\n\n return this.state.compareWith()(option.value(), value);\n }\n\n /**\n * Activate the next option in the list if there is one.\n * If there is no option currently active, activate the selected option or the first option.\n * @internal\n */\n activateNextOption(): void {\n if (this.state.disabled()) {\n return;\n }\n\n const options = this.options();\n\n // if there are no options, do nothing\n if (options.length === 0) {\n return;\n }\n\n // if there is no active option, activate the first option\n if (!this.activeDescendantManager.activeItem()) {\n const selectedOption = options.find(option => this.isOptionSelected(option));\n\n // if there is a selected option(s), set the active descendant to the first selected option\n const targetOption = selectedOption ?? options[0];\n\n this.activeDescendantManager.activate(targetOption);\n return;\n }\n\n // otherwise activate the next option\n this.activeDescendantManager.next();\n }\n\n /**\n * Activate the previous option in the list if there is one.\n * @internal\n */\n activatePreviousOption(): void {\n if (this.state.disabled()) {\n return;\n }\n const options = this.options();\n // if there are no options, do nothing\n if (options.length === 0) {\n return;\n }\n // if there is no active option, activate the last option\n if (!this.activeDescendantManager.activeItem()) {\n const selectedOption = options.find(option => this.isOptionSelected(option));\n // if there is a selected option(s), set the active descendant to the first selected option\n const targetOption = selectedOption ?? options[options.length - 1];\n this.activeDescendantManager.activate(targetOption);\n return;\n }\n // otherwise activate the previous option\n this.activeDescendantManager.previous();\n }\n\n /**\n * Register the dropdown portal with the combobox.\n * @param portal The dropdown portal.\n * @internal\n */\n registerPortal(portal: NgpComboboxPortal): void {\n this.portal.set(portal);\n }\n\n /**\n * Register the combobox input with the combobox.\n * @param input The combobox input.\n * @internal\n */\n registerInput(input: NgpComboboxInput): void {\n this.input.set(input);\n }\n\n /**\n * Register the combobox button with the combobox.\n * @param button The combobox button.\n * @internal\n */\n registerButton(button: NgpComboboxButton): void {\n this.button.set(button);\n }\n\n /**\n * Register the dropdown with the combobox.\n * @param dropdown The dropdown to register.\n * @internal\n */\n registerDropdown(dropdown: NgpComboboxDropdown): void {\n this.dropdown.set(dropdown);\n }\n\n /**\n * Register an option with the combobox.\n * @param option The option to register.\n * @internal\n */\n registerOption(option: NgpComboboxOption): void {\n this.options.update(options => [...options, option]);\n }\n\n /**\n * Unregister an option from the combobox.\n * @param option The option to unregister.\n * @internal\n */\n unregisterOption(option: NgpComboboxOption): void {\n this.options.update(options => options.filter(o => o !== option));\n }\n}\n","import { computed, Directive, HostListener, input } from '@angular/core';\nimport { injectElementRef, setupInteractions } from 'ng-primitives/internal';\nimport { uniqueId } from 'ng-primitives/utils';\nimport { injectComboboxState } from '../combobox/combobox-state';\n\n@Directive({\n selector: '[ngpComboboxButton]',\n exportAs: 'ngpComboboxButton',\n host: {\n type: 'button',\n tabindex: '-1',\n 'aria-haspopup': 'listbox',\n '[id]': 'id()',\n '[attr.aria-controls]': 'dropdownId()',\n '[attr.aria-expanded]': 'state().open()',\n '[attr.data-open]': 'state().open() ? \"\" : undefined',\n '[attr.data-disabled]': 'state().disabled() ? \"\" : undefined',\n '[attr.data-multiple]': 'state().multiple() ? \"\" : undefined',\n '[disabled]': 'state().disabled()',\n },\n})\nexport class NgpComboboxButton {\n /** Access the combobox state. */\n protected readonly state = injectComboboxState();\n\n /**\n * Access the element reference.\n * @internal\n */\n readonly elementRef = injectElementRef<HTMLButtonElement>();\n\n /** The id of the button. */\n readonly id = input<string>(uniqueId('ngp-combobox-button'));\n\n /** The id of the dropdown. */\n readonly dropdownId = computed(() => this.state().dropdown()?.id());\n\n constructor() {\n setupInteractions({\n hover: true,\n press: true,\n disabled: this.state().disabled,\n });\n\n this.state().registerButton(this);\n }\n\n @HostListener('click')\n protected async toggleDropdown(): Promise<void> {\n await this.state().toggleDropdown();\n this.state().input()?.focus();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, ElementRef, Injectable, Directive, Renderer2, signal, PLATFORM_ID, effect, untracked, CSP_NONCE } from '@angular/core';
3
- import { injectDisposables, onBooleanChange } from 'ng-primitives/utils';
4
3
  import { FocusMonitor } from '@angular/cdk/a11y';
5
4
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
+ import { onBooleanChange, injectDisposables } from 'ng-primitives/utils';
6
6
  import { isPlatformServer, DOCUMENT, isPlatformBrowser } from '@angular/common';
7
7
  import { fromResizeEvent } from 'ng-primitives/resize';
8
8
 
@@ -120,15 +120,15 @@ function setupExitAnimation({ element }) {
120
120
  };
121
121
  }
122
122
 
123
- function setupFocus({ focus, blur, disabled = signal(false), }) {
123
+ function setupFocus({ focus, blur, focusWithin = false, disabled = signal(false), }) {
124
124
  /**
125
125
  * Access the element reference.
126
126
  */
127
127
  const elementRef = inject(ElementRef);
128
128
  /**
129
- * Access the disposables helper.
129
+ * Access the focus monitor.
130
130
  */
131
- const disposables = injectDisposables();
131
+ const focusMonitor = inject(FocusMonitor);
132
132
  /**
133
133
  * Access the renderer.
134
134
  */
@@ -137,44 +137,28 @@ function setupFocus({ focus, blur, disabled = signal(false), }) {
137
137
  * Whether the element is currently focused.
138
138
  */
139
139
  const isFocused = signal(false);
140
- // setup event listeners
141
- disposables.addEventListener(elementRef.nativeElement, 'focus', onFocus);
142
- disposables.addEventListener(elementRef.nativeElement, 'blur', onBlur);
143
- /**
144
- * Listen for focus events.
145
- * @param event
146
- */
147
- function onFocus(event) {
140
+ focusMonitor
141
+ .monitor(elementRef, focusWithin)
142
+ .pipe(takeUntilDestroyed())
143
+ .subscribe(focusOrigin => {
148
144
  if (disabled()) {
149
145
  return;
150
146
  }
151
- const ownerDocument = event.target?.ownerDocument ?? document;
152
- // ensure this element is still focused
153
- if (ownerDocument.activeElement === event.target && event.currentTarget === event.target) {
154
- focus?.();
155
- isFocused.set(true);
156
- // set the data-focus attribute
147
+ isFocused.set(focusOrigin !== null);
148
+ if (focusOrigin !== null) {
149
+ if (focus) {
150
+ focus();
151
+ }
157
152
  renderer.setAttribute(elementRef.nativeElement, 'data-focus', '');
158
153
  }
159
- }
160
- /**
161
- * Listen for blur events.
162
- * @param event
163
- */
164
- function onBlur(event) {
165
- if (disabled()) {
166
- return;
167
- }
168
- if (event.currentTarget === event.target) {
169
- blur?.();
170
- isFocused.set(false);
171
- // remove the data-focus attribute
154
+ else {
155
+ if (blur) {
156
+ blur();
157
+ }
172
158
  renderer.removeAttribute(elementRef.nativeElement, 'data-focus');
173
159
  }
174
- }
175
- return {
176
- isFocused,
177
- };
160
+ });
161
+ return { isFocused };
178
162
  }
179
163
 
180
164
  function setupFocusVisible({ focusChange, disabled = signal(false), }) {
@@ -518,7 +502,7 @@ function setupPress({ pressStart, pressEnd, disabled = signal(false), }) {
518
502
  /**
519
503
  * Setup the interactions without relying on HostDirectives.
520
504
  */
521
- function setupInteractions({ focus, hover, press, focusVisible, disabled = signal(false), }) {
505
+ function setupInteractions({ focus, hover, press, focusWithin, focusVisible, disabled = signal(false), }) {
522
506
  if (hover) {
523
507
  setupHover({ disabled });
524
508
  }
@@ -526,7 +510,7 @@ function setupInteractions({ focus, hover, press, focusVisible, disabled = signa
526
510
  setupPress({ disabled });
527
511
  }
528
512
  if (focus) {
529
- setupFocus({ disabled });
513
+ setupFocus({ focusWithin, disabled });
530
514
  }
531
515
  if (focusVisible) {
532
516
  setupFocusVisible({ disabled });
@@ -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/interactions/focus.ts","../../../../packages/ng-primitives/internal/src/interactions/focus-visible.ts","../../../../packages/ng-primitives/internal/src/utilities/dom-removal.ts","../../../../packages/ng-primitives/internal/src/interactions/hover.ts","../../../../packages/ng-primitives/internal/src/interactions/press.ts","../../../../packages/ng-primitives/internal/src/interactions/interactions.ts","../../../../packages/ng-primitives/internal/src/signals/explicit-effect.ts","../../../../packages/ng-primitives/internal/src/signals/sync-state.ts","../../../../packages/ng-primitives/internal/src/style-injector/style-injector.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}\n\nexport interface NgpExitAnimationRef {\n /** Mark the element as exiting and wait for the animation to finish. */\n exit: () => Promise<void>;\n}\n\nexport function setupExitAnimation({ element }: NgpExitAnimationOptions): NgpExitAnimationRef {\n let state: 'enter' | 'exit' = 'enter';\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 element.removeAttribute('inert');\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 // make the element inert to prevent interaction while exiting\n element.setAttribute('inert', '');\n }\n }\n\n // Set the initial state to 'enter'\n setState('enter');\n\n return {\n exit: () => {\n return new Promise((resolve, reject) => {\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(() => resolve())\n .catch(err => {\n if (err instanceof Error && err.name !== 'AbortError') {\n return reject(err);\n }\n // Ignore abort errors as they are expected when the animation is interrupted\n // by the removal of the element - e.g. when the user navigates away to another page\n resolve();\n });\n } else {\n resolve();\n }\n });\n },\n };\n}\n","import { ElementRef, Renderer2, Signal, inject, signal } from '@angular/core';\nimport { injectDisposables } from 'ng-primitives/utils';\n\nexport interface NgpFocusOptions {\n disabled?: Signal<boolean>;\n focus?: () => void;\n blur?: () => void;\n}\n\nexport interface NgpFocusState {\n isFocused: Signal<boolean>;\n}\n\nexport function setupFocus({\n focus,\n blur,\n disabled = signal(false),\n}: NgpFocusOptions): NgpFocusState {\n /**\n * Access the element reference.\n */\n const elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Access the disposables helper.\n */\n const disposables = injectDisposables();\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 // setup event listeners\n disposables.addEventListener(elementRef.nativeElement, 'focus', onFocus);\n disposables.addEventListener(elementRef.nativeElement, 'blur', onBlur);\n\n /**\n * Listen for focus events.\n * @param event\n */\n function onFocus(event: FocusEvent): void {\n if (disabled()) {\n return;\n }\n\n const ownerDocument = (event.target as HTMLElement)?.ownerDocument ?? document;\n\n // ensure this element is still focused\n if (ownerDocument.activeElement === event.target && event.currentTarget === event.target) {\n focus?.();\n isFocused.set(true);\n // set the data-focus attribute\n renderer.setAttribute(elementRef.nativeElement, 'data-focus', '');\n }\n }\n\n /**\n * Listen for blur events.\n * @param event\n */\n function onBlur(event: FocusEvent): void {\n if (disabled()) {\n return;\n }\n\n if (event.currentTarget === event.target) {\n blur?.();\n isFocused.set(false);\n // remove the data-focus attribute\n renderer.removeAttribute(elementRef.nativeElement, 'data-focus');\n }\n }\n\n return {\n isFocused,\n };\n}\n","import { FocusMonitor, FocusOrigin } from '@angular/cdk/a11y';\nimport { ElementRef, inject, Renderer2, Signal, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { onBooleanChange } from 'ng-primitives/utils';\n\nexport interface NgpFocusVisibleOptions {\n disabled?: Signal<boolean>;\n focusChange?: (value: boolean) => void;\n}\n\nexport interface NgpFocusVisibleState {\n isFocused: Signal<boolean>;\n}\n\nexport function setupFocusVisible({\n focusChange,\n disabled = signal(false),\n}: NgpFocusVisibleOptions): NgpFocusVisibleState {\n /**\n * Access the element that the directive is applied to.\n */\n const elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Access the renderer.\n */\n const renderer = inject(Renderer2);\n\n /**\n * Access the focus monitor.\n */\n const focusMonitor = inject(FocusMonitor);\n\n /**\n * Whether the element is currently focused.\n */\n const isFocused = signal<boolean>(false);\n\n // handle focus state\n focusMonitor\n .monitor(elementRef.nativeElement)\n .pipe(takeUntilDestroyed())\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);\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);\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) {\n if (isFocused() === value) {\n return;\n }\n\n isFocused.set(value);\n focusChange?.(value);\n\n if (value) {\n renderer.setAttribute(elementRef.nativeElement, 'data-focus-visible', '');\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 { isPlatformServer } from '@angular/common';\nimport { inject, PLATFORM_ID } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { fromResizeEvent } from 'ng-primitives/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(takeUntilDestroyed())\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","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { effect, ElementRef, inject, Injectable, PLATFORM_ID, Signal, signal } from '@angular/core';\nimport { injectDisposables, onBooleanChange } from 'ng-primitives/utils';\nimport { onDomRemoval } from '../utilities/dom-removal';\n\n/**\n * We use a service here as this value is a singleton\n * and allows us to register the dom events once.\n */\n@Injectable({\n providedIn: 'root',\n})\nclass GlobalPointerEvents {\n /**\n * Whether global mouse events should be ignored.\n */\n ignoreEmulatedMouseEvents: boolean = false;\n\n /**\n * Access the document.\n */\n private readonly document = inject(DOCUMENT);\n\n /**\n * Determine the platform id.\n */\n private readonly platformId = inject(PLATFORM_ID);\n\n constructor() {\n // we only want to setup events on the client\n if (isPlatformBrowser(this.platformId)) {\n this.setupGlobalTouchEvents();\n }\n }\n\n private setupGlobalTouchEvents(): void {\n this.document.addEventListener('pointerup', this.handleGlobalPointerEvent.bind(this));\n this.document.addEventListener('touchend', this.setGlobalIgnoreEmulatedMouseEvents.bind(this));\n }\n\n private setGlobalIgnoreEmulatedMouseEvents(): void {\n this.ignoreEmulatedMouseEvents = true;\n // Clear globalIgnoreEmulatedMouseEvents after a short timeout. iOS fires onPointerEnter\n // with pointerType=\"mouse\" immediately after onPointerUp and before onFocus. On other\n // devices that don't have this quirk, we don't want to ignore a mouse hover sometime in\n // the distant future because a user previously touched the element.\n setTimeout(() => (this.ignoreEmulatedMouseEvents = false), 50);\n }\n\n private handleGlobalPointerEvent(event: PointerEvent): void {\n if (event.pointerType === 'touch') {\n this.setGlobalIgnoreEmulatedMouseEvents();\n }\n }\n}\n\ninterface NgpHoverOptions {\n disabled?: Signal<boolean>;\n hoverStart?: () => void;\n hoverEnd?: () => 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 */\nexport function setupHover({\n hoverStart,\n hoverEnd,\n disabled = signal(false),\n}: NgpHoverOptions): NgpHoverState {\n /**\n * Access the element.\n */\n const elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Access the global pointer events handler.\n */\n const globalPointerEvents = inject(GlobalPointerEvents);\n\n /**\n * Access the disposable helper.\n */\n const disposables = injectDisposables();\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 disposables.addEventListener(elementRef.nativeElement, 'pointerenter', onPointerEnter);\n disposables.addEventListener(elementRef.nativeElement, 'pointerleave', onPointerLeave);\n disposables.addEventListener(elementRef.nativeElement, 'touchstart', onTouchStart);\n disposables.addEventListener(elementRef.nativeElement, 'mouseenter', onMouseEnter);\n disposables.addEventListener(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 effect(() =>\n hovered()\n ? elementRef.nativeElement.setAttribute('data-hover', '')\n : elementRef.nativeElement.removeAttribute('data-hover'),\n );\n\n /**\n * Reset the hover state.\n */\n function reset(): void {\n onHoverEnd('mouse');\n }\n\n /**\n * Trigger the hover start events.\n * @param event\n * @param pointerType\n */\n function onHoverStart(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 hoverStart?.();\n }\n\n /**\n * Trigger the hover end events.\n * @param pointerType\n */\n function onHoverEnd(pointerType: string): void {\n if (pointerType === 'touch' || !hovered()) {\n return;\n }\n\n hovered.set(false);\n hoverEnd?.();\n }\n\n function onPointerEnter(event: PointerEvent): void {\n if (globalPointerEvents.ignoreEmulatedMouseEvents && event.pointerType === 'mouse') {\n return;\n }\n\n onHoverStart(event, event.pointerType);\n }\n\n function onPointerLeave(event: PointerEvent): void {\n if (!disabled() && (event.currentTarget as Element)?.contains(event.target as Element)) {\n onHoverEnd(event.pointerType);\n }\n }\n\n function onTouchStart(): void {\n ignoreEmulatedMouseEvents = true;\n }\n\n function onMouseEnter(event: MouseEvent): void {\n if (!ignoreEmulatedMouseEvents && !globalPointerEvents.ignoreEmulatedMouseEvents) {\n onHoverStart(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 onHoverEnd('mouse');\n }\n }\n\n return { hovered };\n}\n","import { ElementRef, Signal, effect, inject, signal } from '@angular/core';\nimport { injectDisposables } from 'ng-primitives/utils';\n\ninterface NgpPressState {\n pressed: Signal<boolean>;\n}\n\ninterface NgpPressOptions {\n disabled?: Signal<boolean>;\n pressStart?: () => void;\n pressEnd?: () => void;\n}\n\nexport function setupPress({\n pressStart,\n pressEnd,\n disabled = signal(false),\n}: NgpPressOptions): NgpPressState {\n /**\n * Access the element reference.\n */\n const elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Access the disposables helper.\n */\n const disposables = injectDisposables();\n\n /**\n * Whether the element is currently pressed.\n */\n const pressed = signal<boolean>(false);\n\n // setup event listeners\n disposables.addEventListener(elementRef.nativeElement, 'pointerdown', onPointerDown);\n\n // anytime the press state changes we want to update the attribute\n effect(() =>\n pressed() && !disabled()\n ? elementRef.nativeElement.setAttribute('data-press', '')\n : elementRef.nativeElement.removeAttribute('data-press'),\n );\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 pressed.set(false);\n pressEnd?.();\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 pressStart?.();\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 = disposables.addEventListener(\n ownerDocument,\n 'pointerup',\n () => reset(),\n false,\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 = disposables.addEventListener(\n ownerDocument,\n 'pointermove',\n () => onPointerMove as EventListener,\n false,\n );\n\n // if the pointer is cancelled, then we are no longer pressing on this element\n const pointerCancel = disposables.addEventListener(\n ownerDocument,\n 'pointercancel',\n () => reset(),\n false,\n );\n\n disposableListeners = [pointerUp, pointerMove, pointerCancel];\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 return { pressed };\n}\n","import { signal, Signal } from '@angular/core';\nimport { setupFocus } from './focus';\nimport { setupFocusVisible } from './focus-visible';\nimport { setupHover } from './hover';\nimport { setupPress } from './press';\n\nexport interface NgpInteractionOptions {\n hover?: boolean;\n press?: boolean;\n focus?: boolean;\n focusVisible?: boolean;\n disabled?: Signal<boolean>;\n}\n\n/**\n * Setup the interactions without relying on HostDirectives.\n */\nexport function setupInteractions({\n focus,\n hover,\n press,\n focusVisible,\n disabled = signal(false),\n}: NgpInteractionOptions): void {\n if (hover) {\n setupHover({ disabled });\n }\n if (press) {\n setupPress({ disabled });\n }\n if (focus) {\n setupFocus({ disabled });\n }\n if (focusVisible) {\n setupFocusVisible({ disabled });\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 { effect, Signal, untracked, WritableSignal } from '@angular/core';\n\nexport function syncState<T>(source: Signal<T>, target: WritableSignal<T>) {\n effect(() => {\n const sourceValue = source();\n untracked(() => target.set(sourceValue));\n });\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","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/interactions/focus.ts","../../../../packages/ng-primitives/internal/src/interactions/focus-visible.ts","../../../../packages/ng-primitives/internal/src/utilities/dom-removal.ts","../../../../packages/ng-primitives/internal/src/interactions/hover.ts","../../../../packages/ng-primitives/internal/src/interactions/press.ts","../../../../packages/ng-primitives/internal/src/interactions/interactions.ts","../../../../packages/ng-primitives/internal/src/signals/explicit-effect.ts","../../../../packages/ng-primitives/internal/src/signals/sync-state.ts","../../../../packages/ng-primitives/internal/src/style-injector/style-injector.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}\n\nexport interface NgpExitAnimationRef {\n /** Mark the element as exiting and wait for the animation to finish. */\n exit: () => Promise<void>;\n}\n\nexport function setupExitAnimation({ element }: NgpExitAnimationOptions): NgpExitAnimationRef {\n let state: 'enter' | 'exit' = 'enter';\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 element.removeAttribute('inert');\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 // make the element inert to prevent interaction while exiting\n element.setAttribute('inert', '');\n }\n }\n\n // Set the initial state to 'enter'\n setState('enter');\n\n return {\n exit: () => {\n return new Promise((resolve, reject) => {\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(() => resolve())\n .catch(err => {\n if (err instanceof Error && err.name !== 'AbortError') {\n return reject(err);\n }\n // Ignore abort errors as they are expected when the animation is interrupted\n // by the removal of the element - e.g. when the user navigates away to another page\n resolve();\n });\n } else {\n resolve();\n }\n });\n },\n };\n}\n","import { FocusMonitor } from '@angular/cdk/a11y';\nimport { ElementRef, Renderer2, Signal, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nexport interface NgpFocusOptions {\n disabled?: Signal<boolean>;\n focusWithin?: boolean;\n focus?: () => void;\n blur?: () => void;\n}\n\nexport interface NgpFocusState {\n isFocused: Signal<boolean>;\n}\n\nexport function setupFocus({\n focus,\n blur,\n focusWithin = false,\n disabled = signal(false),\n}: NgpFocusOptions): NgpFocusState {\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(takeUntilDestroyed())\n .subscribe(focusOrigin => {\n if (disabled()) {\n return;\n }\n\n isFocused.set(focusOrigin !== null);\n if (focusOrigin !== null) {\n if (focus) {\n focus();\n }\n renderer.setAttribute(elementRef.nativeElement, 'data-focus', '');\n } else {\n if (blur) {\n blur();\n }\n renderer.removeAttribute(elementRef.nativeElement, 'data-focus');\n }\n });\n\n return { isFocused };\n}\n","import { FocusMonitor, FocusOrigin } from '@angular/cdk/a11y';\nimport { ElementRef, inject, Renderer2, Signal, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { onBooleanChange } from 'ng-primitives/utils';\n\nexport interface NgpFocusVisibleOptions {\n disabled?: Signal<boolean>;\n focusChange?: (value: boolean) => void;\n}\n\nexport interface NgpFocusVisibleState {\n isFocused: Signal<boolean>;\n}\n\nexport function setupFocusVisible({\n focusChange,\n disabled = signal(false),\n}: NgpFocusVisibleOptions): NgpFocusVisibleState {\n /**\n * Access the element that the directive is applied to.\n */\n const elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Access the renderer.\n */\n const renderer = inject(Renderer2);\n\n /**\n * Access the focus monitor.\n */\n const focusMonitor = inject(FocusMonitor);\n\n /**\n * Whether the element is currently focused.\n */\n const isFocused = signal<boolean>(false);\n\n // handle focus state\n focusMonitor\n .monitor(elementRef.nativeElement)\n .pipe(takeUntilDestroyed())\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);\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);\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) {\n if (isFocused() === value) {\n return;\n }\n\n isFocused.set(value);\n focusChange?.(value);\n\n if (value) {\n renderer.setAttribute(elementRef.nativeElement, 'data-focus-visible', '');\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 { isPlatformServer } from '@angular/common';\nimport { inject, PLATFORM_ID } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { fromResizeEvent } from 'ng-primitives/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(takeUntilDestroyed())\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","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { effect, ElementRef, inject, Injectable, PLATFORM_ID, Signal, signal } from '@angular/core';\nimport { injectDisposables, onBooleanChange } from 'ng-primitives/utils';\nimport { onDomRemoval } from '../utilities/dom-removal';\n\n/**\n * We use a service here as this value is a singleton\n * and allows us to register the dom events once.\n */\n@Injectable({\n providedIn: 'root',\n})\nclass GlobalPointerEvents {\n /**\n * Whether global mouse events should be ignored.\n */\n ignoreEmulatedMouseEvents: boolean = false;\n\n /**\n * Access the document.\n */\n private readonly document = inject(DOCUMENT);\n\n /**\n * Determine the platform id.\n */\n private readonly platformId = inject(PLATFORM_ID);\n\n constructor() {\n // we only want to setup events on the client\n if (isPlatformBrowser(this.platformId)) {\n this.setupGlobalTouchEvents();\n }\n }\n\n private setupGlobalTouchEvents(): void {\n this.document.addEventListener('pointerup', this.handleGlobalPointerEvent.bind(this));\n this.document.addEventListener('touchend', this.setGlobalIgnoreEmulatedMouseEvents.bind(this));\n }\n\n private setGlobalIgnoreEmulatedMouseEvents(): void {\n this.ignoreEmulatedMouseEvents = true;\n // Clear globalIgnoreEmulatedMouseEvents after a short timeout. iOS fires onPointerEnter\n // with pointerType=\"mouse\" immediately after onPointerUp and before onFocus. On other\n // devices that don't have this quirk, we don't want to ignore a mouse hover sometime in\n // the distant future because a user previously touched the element.\n setTimeout(() => (this.ignoreEmulatedMouseEvents = false), 50);\n }\n\n private handleGlobalPointerEvent(event: PointerEvent): void {\n if (event.pointerType === 'touch') {\n this.setGlobalIgnoreEmulatedMouseEvents();\n }\n }\n}\n\ninterface NgpHoverOptions {\n disabled?: Signal<boolean>;\n hoverStart?: () => void;\n hoverEnd?: () => 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 */\nexport function setupHover({\n hoverStart,\n hoverEnd,\n disabled = signal(false),\n}: NgpHoverOptions): NgpHoverState {\n /**\n * Access the element.\n */\n const elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Access the global pointer events handler.\n */\n const globalPointerEvents = inject(GlobalPointerEvents);\n\n /**\n * Access the disposable helper.\n */\n const disposables = injectDisposables();\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 disposables.addEventListener(elementRef.nativeElement, 'pointerenter', onPointerEnter);\n disposables.addEventListener(elementRef.nativeElement, 'pointerleave', onPointerLeave);\n disposables.addEventListener(elementRef.nativeElement, 'touchstart', onTouchStart);\n disposables.addEventListener(elementRef.nativeElement, 'mouseenter', onMouseEnter);\n disposables.addEventListener(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 effect(() =>\n hovered()\n ? elementRef.nativeElement.setAttribute('data-hover', '')\n : elementRef.nativeElement.removeAttribute('data-hover'),\n );\n\n /**\n * Reset the hover state.\n */\n function reset(): void {\n onHoverEnd('mouse');\n }\n\n /**\n * Trigger the hover start events.\n * @param event\n * @param pointerType\n */\n function onHoverStart(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 hoverStart?.();\n }\n\n /**\n * Trigger the hover end events.\n * @param pointerType\n */\n function onHoverEnd(pointerType: string): void {\n if (pointerType === 'touch' || !hovered()) {\n return;\n }\n\n hovered.set(false);\n hoverEnd?.();\n }\n\n function onPointerEnter(event: PointerEvent): void {\n if (globalPointerEvents.ignoreEmulatedMouseEvents && event.pointerType === 'mouse') {\n return;\n }\n\n onHoverStart(event, event.pointerType);\n }\n\n function onPointerLeave(event: PointerEvent): void {\n if (!disabled() && (event.currentTarget as Element)?.contains(event.target as Element)) {\n onHoverEnd(event.pointerType);\n }\n }\n\n function onTouchStart(): void {\n ignoreEmulatedMouseEvents = true;\n }\n\n function onMouseEnter(event: MouseEvent): void {\n if (!ignoreEmulatedMouseEvents && !globalPointerEvents.ignoreEmulatedMouseEvents) {\n onHoverStart(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 onHoverEnd('mouse');\n }\n }\n\n return { hovered };\n}\n","import { ElementRef, Signal, effect, inject, signal } from '@angular/core';\nimport { injectDisposables } from 'ng-primitives/utils';\n\ninterface NgpPressState {\n pressed: Signal<boolean>;\n}\n\ninterface NgpPressOptions {\n disabled?: Signal<boolean>;\n pressStart?: () => void;\n pressEnd?: () => void;\n}\n\nexport function setupPress({\n pressStart,\n pressEnd,\n disabled = signal(false),\n}: NgpPressOptions): NgpPressState {\n /**\n * Access the element reference.\n */\n const elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Access the disposables helper.\n */\n const disposables = injectDisposables();\n\n /**\n * Whether the element is currently pressed.\n */\n const pressed = signal<boolean>(false);\n\n // setup event listeners\n disposables.addEventListener(elementRef.nativeElement, 'pointerdown', onPointerDown);\n\n // anytime the press state changes we want to update the attribute\n effect(() =>\n pressed() && !disabled()\n ? elementRef.nativeElement.setAttribute('data-press', '')\n : elementRef.nativeElement.removeAttribute('data-press'),\n );\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 pressed.set(false);\n pressEnd?.();\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 pressStart?.();\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 = disposables.addEventListener(\n ownerDocument,\n 'pointerup',\n () => reset(),\n false,\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 = disposables.addEventListener(\n ownerDocument,\n 'pointermove',\n () => onPointerMove as EventListener,\n false,\n );\n\n // if the pointer is cancelled, then we are no longer pressing on this element\n const pointerCancel = disposables.addEventListener(\n ownerDocument,\n 'pointercancel',\n () => reset(),\n false,\n );\n\n disposableListeners = [pointerUp, pointerMove, pointerCancel];\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 return { pressed };\n}\n","import { signal, Signal } from '@angular/core';\nimport { setupFocus } from './focus';\nimport { setupFocusVisible } from './focus-visible';\nimport { setupHover } from './hover';\nimport { setupPress } from './press';\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 */\nexport function setupInteractions({\n focus,\n hover,\n press,\n focusWithin,\n focusVisible,\n disabled = signal(false),\n}: NgpInteractionOptions): void {\n if (hover) {\n setupHover({ disabled });\n }\n if (press) {\n setupPress({ disabled });\n }\n if (focus) {\n setupFocus({ focusWithin, disabled });\n }\n if (focusVisible) {\n setupFocusVisible({ disabled });\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 { effect, Signal, untracked, WritableSignal } from '@angular/core';\n\nexport function syncState<T>(source: Signal<T>, target: WritableSignal<T>) {\n effect(() => {\n const sourceValue = source();\n untracked(() => target.set(sourceValue));\n });\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","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,7 +1,7 @@
1
1
  import { FocusMonitor } from '@angular/cdk/a11y';
2
2
  import { ViewportRuler } from '@angular/cdk/overlay';
3
3
  import { DOCUMENT } from '@angular/common';
4
- import { InjectionToken, inject, TemplateRef, DestroyRef, signal, Injector, runInInjectionContext } from '@angular/core';
4
+ import { InjectionToken, inject, TemplateRef, DestroyRef, signal, computed, Injector, runInInjectionContext } from '@angular/core';
5
5
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
6
  import { autoUpdate, offset, shift, flip, computePosition } from '@floating-ui/dom';
7
7
  import { fromResizeEvent } from 'ng-primitives/resize';
@@ -302,7 +302,15 @@ class NgpOverlay {
302
302
  /** Signal tracking the portal instance */
303
303
  this.portal = signal(null);
304
304
  /** Signal tracking the overlay position */
305
- this.position = signal({ x: 0, y: 0 });
305
+ this.position = signal({
306
+ x: undefined,
307
+ y: undefined,
308
+ });
309
+ /**
310
+ * Determine if the overlay has been positioned
311
+ * @internal
312
+ */
313
+ this.isPositioned = computed(() => this.position().x !== undefined && this.position().y !== undefined);
306
314
  /** Signal tracking the trigger element width */
307
315
  this.triggerWidth = signal(null);
308
316
  /** The transform origin for the overlay */