@radix-ng/primitives 1.0.0-beta.5 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/composite/README.md +3 -0
  2. package/fesm2022/radix-ng-primitives-accordion.mjs +20 -44
  3. package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -1
  4. package/fesm2022/radix-ng-primitives-checkbox.mjs +134 -58
  5. package/fesm2022/radix-ng-primitives-checkbox.mjs.map +1 -1
  6. package/fesm2022/radix-ng-primitives-composite.mjs +599 -0
  7. package/fesm2022/radix-ng-primitives-composite.mjs.map +1 -0
  8. package/fesm2022/radix-ng-primitives-drawer.mjs +442 -2
  9. package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
  10. package/fesm2022/radix-ng-primitives-menu.mjs +315 -68
  11. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  12. package/fesm2022/radix-ng-primitives-menubar.mjs +91 -36
  13. package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
  14. package/fesm2022/radix-ng-primitives-navigation-menu.mjs +281 -88
  15. package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
  16. package/fesm2022/radix-ng-primitives-popover.mjs +40 -15
  17. package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
  18. package/fesm2022/radix-ng-primitives-popper.mjs +73 -65
  19. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  20. package/fesm2022/radix-ng-primitives-radio.mjs +63 -27
  21. package/fesm2022/radix-ng-primitives-radio.mjs.map +1 -1
  22. package/fesm2022/radix-ng-primitives-scroll-area.mjs +56 -25
  23. package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -1
  24. package/fesm2022/radix-ng-primitives-select.mjs +59 -29
  25. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  26. package/fesm2022/radix-ng-primitives-slider.mjs +57 -13
  27. package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
  28. package/fesm2022/radix-ng-primitives-tabs.mjs +335 -73
  29. package/fesm2022/radix-ng-primitives-tabs.mjs.map +1 -1
  30. package/fesm2022/radix-ng-primitives-toggle-group.mjs +66 -21
  31. package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
  32. package/fesm2022/radix-ng-primitives-toggle.mjs +29 -11
  33. package/fesm2022/radix-ng-primitives-toggle.mjs.map +1 -1
  34. package/fesm2022/radix-ng-primitives-toolbar.mjs +68 -36
  35. package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
  36. package/navigation-menu/README.md +5 -2
  37. package/package.json +6 -10
  38. package/types/radix-ng-primitives-accordion.d.ts +12 -16
  39. package/types/radix-ng-primitives-checkbox.d.ts +98 -70
  40. package/types/radix-ng-primitives-composite.d.ts +195 -0
  41. package/types/radix-ng-primitives-drawer.d.ts +40 -2
  42. package/types/radix-ng-primitives-menu.d.ts +46 -16
  43. package/types/radix-ng-primitives-menubar.d.ts +12 -5
  44. package/types/radix-ng-primitives-navigation-menu.d.ts +65 -33
  45. package/types/radix-ng-primitives-popover.d.ts +9 -5
  46. package/types/radix-ng-primitives-popper.d.ts +1 -0
  47. package/types/radix-ng-primitives-radio.d.ts +11 -9
  48. package/types/radix-ng-primitives-scroll-area.d.ts +4 -1
  49. package/types/radix-ng-primitives-select.d.ts +46 -32
  50. package/types/radix-ng-primitives-slider.d.ts +19 -4
  51. package/types/radix-ng-primitives-tabs.d.ts +69 -14
  52. package/types/radix-ng-primitives-toggle-group.d.ts +27 -16
  53. package/types/radix-ng-primitives-toggle.d.ts +5 -5
  54. package/types/radix-ng-primitives-toolbar.d.ts +84 -69
  55. package/collection/README.md +0 -1
  56. package/fesm2022/radix-ng-primitives-collection.mjs +0 -72
  57. package/fesm2022/radix-ng-primitives-collection.mjs.map +0 -1
  58. package/fesm2022/radix-ng-primitives-roving-focus.mjs +0 -388
  59. package/fesm2022/radix-ng-primitives-roving-focus.mjs.map +0 -1
  60. package/roving-focus/README.md +0 -3
  61. package/types/radix-ng-primitives-collection.d.ts +0 -44
  62. package/types/radix-ng-primitives-roving-focus.d.ts +0 -187
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radix-ng-primitives-composite.mjs","sources":["../../../packages/primitives/composite/src/utils.ts","../../../packages/primitives/composite/src/composite-list.ts","../../../packages/primitives/composite/src/composite-list-item.ts","../../../packages/primitives/composite/src/composite-root.ts","../../../packages/primitives/composite/src/composite-item.ts","../../../packages/primitives/composite/index.ts","../../../packages/primitives/composite/radix-ng-primitives-composite.ts"],"sourcesContent":["import { ARROW_DOWN, ARROW_LEFT, ARROW_RIGHT, ARROW_UP, Direction, END, HOME } from '@radix-ng/primitives/core';\nimport { RdxCompositeModifierKey, RdxCompositeOrientation } from './types';\n\nexport const ACTIVE_COMPOSITE_ITEM = 'data-composite-item-active';\n\nexport const ARROW_KEYS = new Set([ARROW_UP, ARROW_DOWN, ARROW_LEFT, ARROW_RIGHT]);\nexport const COMPOSITE_KEYS = new Set([...ARROW_KEYS, HOME, END]);\nexport const MODIFIER_KEYS: RdxCompositeModifierKey[] = ['Shift', 'Control', 'Alt', 'Meta'];\n\nexport function sortByDocumentPosition<T extends { element: HTMLElement }>(items: readonly T[]): T[] {\n return [...items]\n .filter((item) => item.element.isConnected)\n .sort((a, b) => {\n const position = a.element.compareDocumentPosition(b.element);\n\n if (position & Node.DOCUMENT_POSITION_FOLLOWING || position & Node.DOCUMENT_POSITION_CONTAINED_BY) {\n return -1;\n }\n\n if (position & Node.DOCUMENT_POSITION_PRECEDING || position & Node.DOCUMENT_POSITION_CONTAINS) {\n return 1;\n }\n\n return 0;\n });\n}\n\nexport function isModifierKeySet(\n event: KeyboardEvent,\n allowedModifierKeys: readonly RdxCompositeModifierKey[]\n): boolean {\n return MODIFIER_KEYS.some((key) => !allowedModifierKeys.includes(key) && event.getModifierState(key));\n}\n\nexport function isNativeTextInput(target: EventTarget | null): target is HTMLInputElement | HTMLTextAreaElement {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n\n return target.tagName === 'TEXTAREA' || target.tagName === 'INPUT';\n}\n\nexport function getCompositeNavigationKeys(orientation: RdxCompositeOrientation, dir: Direction) {\n const horizontalForwardKey = dir === 'rtl' ? ARROW_LEFT : ARROW_RIGHT;\n const horizontalBackwardKey = dir === 'rtl' ? ARROW_RIGHT : ARROW_LEFT;\n\n return {\n forwardKeys:\n orientation === 'horizontal'\n ? [horizontalForwardKey]\n : orientation === 'vertical'\n ? [ARROW_DOWN]\n : [horizontalForwardKey, ARROW_DOWN],\n backwardKeys:\n orientation === 'horizontal'\n ? [horizontalBackwardKey]\n : orientation === 'vertical'\n ? [ARROW_UP]\n : [horizontalBackwardKey, ARROW_UP]\n };\n}\n\nexport function shouldKeepNativeTextInputBehavior(\n event: KeyboardEvent,\n target: HTMLInputElement | HTMLTextAreaElement,\n orientation: RdxCompositeOrientation,\n dir: Direction\n): boolean {\n const { forwardKeys, backwardKeys } = getCompositeNavigationKeys(orientation, dir);\n const selectionStart = target.selectionStart;\n const selectionEnd = target.selectionEnd;\n const value = target.value ?? '';\n\n if (selectionStart == null || selectionEnd == null || event.shiftKey || selectionStart !== selectionEnd) {\n return true;\n }\n\n if (!backwardKeys.includes(event.key) && selectionStart < value.length) {\n return true;\n }\n\n if (!forwardKeys.includes(event.key) && selectionStart > 0) {\n return true;\n }\n\n return false;\n}\n\nexport function isIndexOutOfListBounds<T>(list: readonly T[], index: number): boolean {\n return index < 0 || index >= list.length;\n}\n\nexport function getMinListIndex(list: readonly HTMLElement[], disabledIndices?: readonly number[]): number {\n return findNonDisabledListIndex(list, { startingIndex: -1, disabledIndices });\n}\n\nexport function getMaxListIndex(list: readonly HTMLElement[], disabledIndices?: readonly number[]): number {\n return findNonDisabledListIndex(list, { startingIndex: list.length, decrement: true, disabledIndices });\n}\n\nexport function findNonDisabledListIndex(\n list: readonly HTMLElement[],\n options: { startingIndex?: number; decrement?: boolean; disabledIndices?: readonly number[] } = {}\n): number {\n const { startingIndex = -1, decrement = false, disabledIndices } = options;\n const step = decrement ? -1 : 1;\n\n for (let index = startingIndex + step; index >= 0 && index < list.length; index += step) {\n if (!isListIndexDisabled(list, index, disabledIndices)) {\n return index;\n }\n }\n\n return -1;\n}\n\nexport function isListIndexDisabled(\n list: readonly HTMLElement[],\n index: number,\n disabledIndices?: readonly number[]\n): boolean {\n if (disabledIndices?.includes(index)) {\n return true;\n }\n\n const element = list[index];\n\n if (!element) {\n return false;\n }\n\n if (!isElementVisible(element)) {\n return true;\n }\n\n return (\n disabledIndices === undefined &&\n (element.hasAttribute('disabled') || element.getAttribute('aria-disabled') === 'true')\n );\n}\n\nexport function isElementDisabled(element: HTMLElement | null): boolean {\n return element === null || element.hasAttribute('disabled') || element.getAttribute('aria-disabled') === 'true';\n}\n\nexport function isElementVisible(element: HTMLElement | null): boolean {\n if (!element || !element.isConnected) {\n return false;\n }\n\n if (typeof Element !== 'undefined' && !(element instanceof Element)) {\n return true;\n }\n\n let styles: CSSStyleDeclaration;\n try {\n styles = getComputedStyle(element);\n } catch {\n return true;\n }\n\n return styles.visibility !== 'hidden' && styles.visibility !== 'collapse';\n}\n\nexport function scrollIntoViewIfNeeded(\n scrollContainer: HTMLElement | null,\n element: HTMLElement | null,\n direction: Direction,\n orientation: RdxCompositeOrientation\n): void {\n if (!scrollContainer || !element || typeof scrollContainer.scrollTo !== 'function') {\n return;\n }\n\n const isOverflowingX = scrollContainer.clientWidth < scrollContainer.scrollWidth;\n const isOverflowingY = scrollContainer.clientHeight < scrollContainer.scrollHeight;\n let left = scrollContainer.scrollLeft;\n let top = scrollContainer.scrollTop;\n\n if (isOverflowingX && orientation !== 'vertical') {\n const elementOffsetLeft = getOffset(scrollContainer, element, 'left');\n const containerStyles = getScrollStyles(scrollContainer);\n const elementStyles = getScrollStyles(element);\n\n if (\n elementOffsetLeft - elementStyles.scrollMarginLeft <\n scrollContainer.scrollLeft + containerStyles.scrollPaddingLeft\n ) {\n left = elementOffsetLeft - elementStyles.scrollMarginLeft - containerStyles.scrollPaddingLeft;\n } else if (\n elementOffsetLeft + element.offsetWidth + elementStyles.scrollMarginRight >\n scrollContainer.scrollLeft + scrollContainer.clientWidth - containerStyles.scrollPaddingRight\n ) {\n left =\n elementOffsetLeft +\n element.offsetWidth +\n elementStyles.scrollMarginRight -\n scrollContainer.clientWidth +\n containerStyles.scrollPaddingRight;\n }\n\n if (direction === 'rtl') {\n left = Math.max(left, 0);\n }\n }\n\n if (isOverflowingY && orientation !== 'horizontal') {\n const elementOffsetTop = getOffset(scrollContainer, element, 'top');\n const containerStyles = getScrollStyles(scrollContainer);\n const elementStyles = getScrollStyles(element);\n\n if (\n elementOffsetTop - elementStyles.scrollMarginTop <\n scrollContainer.scrollTop + containerStyles.scrollPaddingTop\n ) {\n top = elementOffsetTop - elementStyles.scrollMarginTop - containerStyles.scrollPaddingTop;\n } else if (\n elementOffsetTop + element.offsetHeight + elementStyles.scrollMarginBottom >\n scrollContainer.scrollTop + scrollContainer.clientHeight - containerStyles.scrollPaddingBottom\n ) {\n top =\n elementOffsetTop +\n element.offsetHeight +\n elementStyles.scrollMarginBottom -\n scrollContainer.clientHeight +\n containerStyles.scrollPaddingBottom;\n }\n }\n\n scrollContainer.scrollTo({ left, top, behavior: 'auto' });\n}\n\nfunction getOffset(ancestor: HTMLElement, element: HTMLElement, side: 'left' | 'top'): number {\n const propName = side === 'left' ? 'offsetLeft' : 'offsetTop';\n let result = 0;\n let current: HTMLElement | null = element;\n\n while (current?.offsetParent) {\n result += current[propName];\n if (current.offsetParent === ancestor) {\n break;\n }\n current = current.offsetParent as HTMLElement;\n }\n\n return result;\n}\n\nfunction getScrollStyles(element: HTMLElement) {\n const styles = getComputedStyle(element);\n\n return {\n scrollMarginTop: parseFloat(styles.scrollMarginTop) || 0,\n scrollMarginRight: parseFloat(styles.scrollMarginRight) || 0,\n scrollMarginBottom: parseFloat(styles.scrollMarginBottom) || 0,\n scrollMarginLeft: parseFloat(styles.scrollMarginLeft) || 0,\n scrollPaddingTop: parseFloat(styles.scrollPaddingTop) || 0,\n scrollPaddingRight: parseFloat(styles.scrollPaddingRight) || 0,\n scrollPaddingBottom: parseFloat(styles.scrollPaddingBottom) || 0,\n scrollPaddingLeft: parseFloat(styles.scrollPaddingLeft) || 0\n };\n}\n","import { computed, Directive, effect, ElementRef, inject, output, signal } from '@angular/core';\nimport { createContext } from '@radix-ng/primitives/core';\nimport {\n RdxCompositeItemMetadata,\n RdxCompositeItemRegistration,\n RdxCompositeListContext,\n RdxCompositeMetadata\n} from './types';\nimport { sortByDocumentPosition } from './utils';\n\nconst listContext = (): RdxCompositeListContext => {\n const list = inject(RdxCompositeList);\n\n return {\n listElement: list.elementRef.nativeElement,\n items: list.items,\n itemMap: list.itemMap,\n registerItem: (item) => list.registerItem(item),\n indexOf: (element) => list.indexOf(element)\n };\n};\n\nexport const [injectRdxCompositeListContext, provideRdxCompositeListContext] = createContext<RdxCompositeListContext>(\n 'RdxCompositeListContext',\n 'utils/composite'\n);\n\n/**\n * Base UI-style composite list. Owns item registration and DOM-order metadata without applying\n * roving tabindex or keyboard navigation.\n */\n@Directive({\n selector: '[rdxCompositeList]',\n exportAs: 'rdxCompositeList',\n providers: [provideRdxCompositeListContext(listContext)]\n})\nexport class RdxCompositeList {\n readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly registeredItems = signal<RdxCompositeItemRegistration[]>([]);\n\n /** Emits when the ordered item map changes. */\n readonly onMapChange = output<Map<HTMLElement, RdxCompositeMetadata>>();\n\n /** Items registered with this list, sorted in DOM order. */\n readonly items = computed(() => sortByDocumentPosition(this.registeredItems()));\n\n /** Ordered metadata keyed by item element. */\n readonly itemMap = computed(() => {\n const map = new Map<HTMLElement, RdxCompositeMetadata>();\n\n this.items().forEach((item, index) => {\n map.set(item.element, { ...(item.metadata() ?? {}), index });\n });\n\n return map;\n });\n\n constructor() {\n effect(() => {\n this.onMapChange.emit(this.itemMap());\n });\n }\n\n registerItem<Metadata extends RdxCompositeItemMetadata>(item: RdxCompositeItemRegistration<Metadata>): () => void {\n this.registeredItems.update((items) => [\n ...items.filter((registered) => registered.element !== item.element),\n item\n ]);\n\n return () => {\n this.registeredItems.update((items) => items.filter((registered) => registered.element !== item.element));\n };\n }\n\n indexOf(element: HTMLElement): number {\n return this.items().findIndex((item) => item.element === element);\n }\n\n elements(): HTMLElement[] {\n return this.items().map((item) => item.element);\n }\n}\n","import {\n afterNextRender,\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n signal,\n untracked\n} from '@angular/core';\nimport { injectRdxCompositeListContext } from './composite-list';\nimport { RdxCompositeItemMetadata } from './types';\n\n/**\n * Registers the host with the nearest composite list without changing focus behavior.\n */\n@Directive({\n selector: '[rdxCompositeListItem]',\n exportAs: 'rdxCompositeListItem'\n})\nexport class RdxCompositeListItem {\n private readonly listContext = injectRdxCompositeListContext(true);\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly hasRendered = signal(false);\n\n /** Arbitrary metadata included in the list's ordered item map. */\n readonly metadataInput = input<RdxCompositeItemMetadata | null | undefined>(undefined, { alias: 'metadata' });\n private readonly _metadata = linkedSignal(() => this.metadataInput());\n\n readonly index = computed(() => this.listContext?.indexOf(this.elementRef.nativeElement) ?? -1);\n readonly inListElement = computed(() => {\n const listContext = this.listContext;\n return !!listContext && listContext.listElement.contains(this.elementRef.nativeElement);\n });\n\n constructor() {\n afterNextRender(() => {\n this.hasRendered.set(true);\n });\n\n effect((onCleanup) => {\n const listContext = this.listContext;\n if (!listContext || !this.hasRendered() || !this.inListElement()) {\n return;\n }\n\n const element = this.elementRef.nativeElement;\n const unregister = untracked(() =>\n listContext.registerItem({ element, metadata: this._metadata.asReadonly() })\n );\n\n onCleanup(unregister);\n });\n }\n\n setMetadata(value: RdxCompositeItemMetadata | null | undefined): void {\n this._metadata.set(value);\n }\n}\n","import {\n booleanAttribute,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n model,\n output\n} from '@angular/core';\nimport { BooleanInput, createContext, Direction } from '@radix-ng/primitives/core';\nimport { injectDirection } from '@radix-ng/primitives/direction-provider';\nimport { RdxCompositeList } from './composite-list';\nimport {\n RdxCompositeMetadata,\n RdxCompositeModifierKey,\n RdxCompositeOrientation,\n RdxCompositeRootContext\n} from './types';\nimport {\n ACTIVE_COMPOSITE_ITEM,\n ARROW_KEYS,\n COMPOSITE_KEYS,\n findNonDisabledListIndex,\n getCompositeNavigationKeys,\n getMaxListIndex,\n getMinListIndex,\n isElementDisabled,\n isIndexOutOfListBounds,\n isListIndexDisabled,\n isModifierKeySet,\n isNativeTextInput,\n scrollIntoViewIfNeeded,\n shouldKeepNativeTextInputBehavior\n} from './utils';\n\nconst rootContext = (): RdxCompositeRootContext => {\n const root = inject(RdxCompositeRoot);\n\n return {\n rootElement: root.elementRef.nativeElement,\n highlightedIndex: root.highlightedIndex.asReadonly(),\n highlightItemOnHover: root.highlightItemOnHover,\n orientation: root.orientation,\n dir: root.dir,\n isIndexDisabled: (index) => root.isIndexDisabled(index),\n setHighlightedIndex: (index, shouldScrollIntoView) => root.setHighlightedIndex(index, shouldScrollIntoView),\n relayKeyboardEvent: (event) => root.relayKeyboardEvent(event)\n };\n};\n\nexport const [injectRdxCompositeRootContext, provideRdxCompositeRootContext] = createContext<RdxCompositeRootContext>(\n 'RdxCompositeRootContext',\n 'utils/composite'\n);\n\n/**\n * Internal Base UI-style composite root for roving index and arrow-key navigation.\n */\n@Directive({\n selector: '[rdxCompositeRoot]',\n exportAs: 'rdxCompositeRoot',\n hostDirectives: [RdxCompositeList],\n providers: [provideRdxCompositeRootContext(rootContext)],\n host: {\n '(keydown)': 'handleKeydown($event)'\n }\n})\nexport class RdxCompositeRoot {\n readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly compositeList = inject(RdxCompositeList, { self: true });\n private hasSetInitialIndex = false;\n\n /** The composite orientation. */\n readonly orientationInput = input<RdxCompositeOrientation>('both', { alias: 'orientation' });\n private readonly _orientation = linkedSignal(() => this.orientationInput());\n readonly orientation = this._orientation.asReadonly();\n\n /** Text direction for horizontal arrow-key navigation. */\n readonly dirInput = input<Direction | undefined>(undefined, { alias: 'dir' });\n private readonly effectiveDir = injectDirection(this.dirInput);\n private readonly _dir = linkedSignal(() => this.effectiveDir());\n readonly dir = this._dir.asReadonly();\n\n /** Whether arrow-key navigation wraps at the first/last item. */\n readonly loopFocusInput = input<boolean, BooleanInput>(true, {\n alias: 'loopFocus',\n transform: booleanAttribute\n });\n private readonly _loopFocus = linkedSignal(() => this.loopFocusInput());\n readonly loopFocus = this._loopFocus.asReadonly();\n\n /** Enables Home and End keys. */\n readonly enableHomeAndEndKeysInput = input<boolean, BooleanInput>(false, {\n alias: 'enableHomeAndEndKeys',\n transform: booleanAttribute\n });\n private readonly _enableHomeAndEndKeys = linkedSignal(() => this.enableHomeAndEndKeysInput());\n readonly enableHomeAndEndKeys = this._enableHomeAndEndKeys.asReadonly();\n\n /** Indices that are skipped by keyboard navigation. */\n readonly disabledIndicesInput = input<readonly number[] | undefined>(undefined, { alias: 'disabledIndices' });\n private readonly _disabledIndices = linkedSignal(() => this.disabledIndicesInput());\n readonly disabledIndices = this._disabledIndices.asReadonly();\n\n /** Modifier keys that should not block composite navigation. */\n readonly modifierKeysInput = input<readonly RdxCompositeModifierKey[]>([], { alias: 'modifierKeys' });\n private readonly _modifierKeys = linkedSignal(() => this.modifierKeysInput());\n readonly modifierKeys = this._modifierKeys.asReadonly();\n\n /** Whether hovering an item should focus it. */\n readonly highlightItemOnHover = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n /** Whether handled navigation keys stop propagation. */\n readonly stopEventPropagation = input<boolean, BooleanInput>(true, { transform: booleanAttribute });\n\n /** The currently highlighted item index. */\n readonly highlightedIndex = model<number>(0);\n\n /** Emits when this root changes the highlighted index. */\n readonly onHighlightedIndexChange = output<number>();\n\n /** Emits when the ordered item map changes. */\n readonly onMapChange = output<Map<HTMLElement, RdxCompositeMetadata>>();\n\n readonly items = this.compositeList.items;\n\n readonly itemMap = this.compositeList.itemMap;\n\n constructor() {\n effect(() => {\n const items = this.items();\n if (items.length === 0) {\n return;\n }\n\n if (!this.hasSetInitialIndex) {\n this.hasSetInitialIndex = true;\n const activeIndex = items.findIndex((item) => item.element.hasAttribute(ACTIVE_COMPOSITE_ITEM));\n\n if (activeIndex !== -1) {\n this.setHighlightedIndex(activeIndex, true);\n return;\n }\n }\n\n if (this.isIndexDisabled(this.highlightedIndex())) {\n const firstEnabledIndex = getMinListIndex(this.elements(), this.disabledIndices());\n\n if (!isIndexOutOfListBounds(items, firstEnabledIndex)) {\n this.setHighlightedIndex(firstEnabledIndex);\n }\n }\n });\n\n effect(() => {\n this.onMapChange.emit(this.itemMap());\n });\n }\n\n indexOf(element: HTMLElement): number {\n return this.compositeList.indexOf(element);\n }\n\n setOrientation(value: RdxCompositeOrientation): void {\n this._orientation.set(value);\n }\n\n setLoopFocus(value: boolean): void {\n this._loopFocus.set(value);\n }\n\n setDir(value: Direction): void {\n this._dir.set(value);\n }\n\n setEnableHomeAndEndKeys(value: boolean): void {\n this._enableHomeAndEndKeys.set(value);\n }\n\n setDisabledIndices(value: readonly number[] | undefined): void {\n this._disabledIndices.set(value);\n }\n\n setModifierKeys(value: readonly RdxCompositeModifierKey[]): void {\n this._modifierKeys.set(value);\n }\n\n isIndexDisabled(index: number): boolean {\n return isListIndexDisabled(this.elements(), index, this.disabledIndices());\n }\n\n setHighlightedIndex(index: number, shouldScrollIntoView = false): void {\n if (this.highlightedIndex() !== index) {\n this.highlightedIndex.set(index);\n this.onHighlightedIndexChange.emit(index);\n }\n\n if (shouldScrollIntoView) {\n scrollIntoViewIfNeeded(\n this.elementRef.nativeElement,\n this.elements()[index],\n this.dir(),\n this.orientation()\n );\n }\n }\n\n relayKeyboardEvent(event: KeyboardEvent): void {\n this.handleCompositeKeydown(event, true);\n }\n\n protected handleKeydown(event: KeyboardEvent): void {\n this.handleCompositeKeydown(event, false);\n }\n\n private handleCompositeKeydown(event: KeyboardEvent, relayed: boolean): void {\n const relevantKeys = this.enableHomeAndEndKeys() ? COMPOSITE_KEYS : ARROW_KEYS;\n\n if (!relevantKeys.has(event.key) || isModifierKeySet(event, this.modifierKeys())) {\n return;\n }\n\n const target = event.target;\n const rootElement = this.elementRef.nativeElement;\n\n if (!relayed && target instanceof HTMLElement) {\n const closestRoot = target.closest('[rdxCompositeRoot]');\n if (closestRoot && closestRoot !== rootElement) {\n return;\n }\n }\n\n if (isNativeTextInput(target) && !isElementDisabled(target)) {\n try {\n if (shouldKeepNativeTextInputBehavior(event, target, this.orientation(), this.dir())) {\n return;\n }\n } catch {\n return;\n }\n }\n\n const elements = this.elements();\n if (elements.length === 0) {\n return;\n }\n\n const nextIndex = this.getNextIndex(event, elements);\n\n if (nextIndex === this.highlightedIndex() || isIndexOutOfListBounds(elements, nextIndex)) {\n return;\n }\n\n if (this.stopEventPropagation()) {\n event.stopPropagation();\n }\n\n event.preventDefault();\n this.setHighlightedIndex(nextIndex, true);\n\n queueMicrotask(() => {\n this.elements()[nextIndex]?.focus();\n });\n }\n\n private getNextIndex(event: KeyboardEvent, elements: HTMLElement[]): number {\n const highlightedIndex = this.highlightedIndex();\n const minIndex = getMinListIndex(elements, this.disabledIndices());\n const maxIndex = getMaxListIndex(elements, this.disabledIndices());\n\n if (this.enableHomeAndEndKeys()) {\n if (event.key === 'Home') {\n return minIndex;\n }\n\n if (event.key === 'End') {\n return maxIndex;\n }\n }\n\n const { forwardKeys, backwardKeys } = getCompositeNavigationKeys(this.orientation(), this.dir());\n const isForward = forwardKeys.includes(event.key);\n const isBackward = backwardKeys.includes(event.key);\n\n if (!isForward && !isBackward) {\n return highlightedIndex;\n }\n\n const decrement = isBackward;\n const boundaryIndex = decrement ? minIndex : maxIndex;\n const loopIndex = decrement ? maxIndex : minIndex;\n\n if (this.loopFocus() && highlightedIndex === boundaryIndex) {\n return loopIndex;\n }\n\n return findNonDisabledListIndex(elements, {\n startingIndex: highlightedIndex,\n decrement,\n disabledIndices: this.disabledIndices()\n });\n }\n\n private elements(): HTMLElement[] {\n return this.compositeList.elements();\n }\n}\n","import { computed, Directive, ElementRef, inject } from '@angular/core';\nimport { RdxCompositeListItem } from './composite-list-item';\nimport { injectRdxCompositeRootContext } from './composite-root';\nimport { RdxCompositeItemMetadata } from './types';\n\n/**\n * Internal Base UI-style composite item. Registers itself with the nearest composite root and\n * receives the roving `tabindex` from the root's highlighted index.\n */\n@Directive({\n selector: '[rdxCompositeItem]',\n exportAs: 'rdxCompositeItem',\n hostDirectives: [\n {\n directive: RdxCompositeListItem,\n inputs: ['metadata']\n }\n ],\n host: {\n '[attr.tabindex]': 'tabIndex()',\n '(focus)': 'handleFocus()',\n '(mousemove)': 'handleMouseMove()'\n }\n})\nexport class RdxCompositeItem {\n private readonly rootContext = injectRdxCompositeRootContext(true);\n private readonly listItem = inject(RdxCompositeListItem, { self: true });\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n readonly index = this.listItem.index;\n private readonly inRootElement = computed(() => {\n const rootContext = this.rootContext;\n return !!rootContext && rootContext.rootElement.contains(this.elementRef.nativeElement);\n });\n protected readonly highlighted = computed(() => this.rootContext?.highlightedIndex() === this.index());\n protected readonly tabIndex = computed(() => {\n const rootContext = this.rootContext;\n\n if (!rootContext || !this.inRootElement()) {\n return null;\n }\n\n const index = this.index();\n return index !== -1 && rootContext.highlightedIndex() === index && !rootContext.isIndexDisabled(index) ? 0 : -1;\n });\n\n setMetadata(value: RdxCompositeItemMetadata | null | undefined): void {\n this.listItem.setMetadata(value);\n }\n\n protected handleFocus(): void {\n const index = this.index();\n\n if (this.inRootElement() && index !== -1) {\n this.rootContext?.setHighlightedIndex(index);\n }\n }\n\n protected handleMouseMove(): void {\n const rootContext = this.rootContext;\n const index = this.index();\n\n if (\n !this.inRootElement() ||\n !rootContext ||\n index === -1 ||\n !rootContext.highlightItemOnHover() ||\n this.highlighted()\n ) {\n return;\n }\n\n if (!rootContext.isIndexDisabled(index)) {\n this.elementRef.nativeElement.focus();\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { RdxCompositeItem } from './src/composite-item';\nimport { RdxCompositeList } from './src/composite-list';\nimport { RdxCompositeListItem } from './src/composite-list-item';\nimport { RdxCompositeRoot } from './src/composite-root';\n\nexport * from './src/composite-item';\nexport * from './src/composite-list';\nexport * from './src/composite-list-item';\nexport * from './src/composite-root';\nexport * from './src/types';\nexport * from './src/utils';\n\nexport const compositeImports = [RdxCompositeList, RdxCompositeListItem, RdxCompositeRoot, RdxCompositeItem];\n\n@NgModule({\n imports: [...compositeImports],\n exports: [...compositeImports]\n})\nexport class RdxCompositeModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.RdxCompositeList","i1.RdxCompositeListItem"],"mappings":"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"}
@@ -78,7 +78,8 @@ const context = () => {
78
78
  nestedDrawerOpen: root.nestedDrawerOpen,
79
79
  nestedDrawerCount: root.nestedDrawerCount,
80
80
  frontmostHeight: root.frontmostHeight,
81
- reportPopupHeight: (height) => root.popupHeight.set(height)
81
+ reportPopupHeight: (height) => root.popupHeight.set(height),
82
+ open: root.open
82
83
  };
83
84
  };
84
85
  /**
@@ -974,6 +975,442 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
974
975
  }]
975
976
  }] });
976
977
 
978
+ const KEYBOARD_RESIZE_THRESHOLD = 60;
979
+ const KEYBOARD_VISIBILITY_MARGIN = 16;
980
+ const KEYBOARD_SCROLL_SLACK = 48;
981
+ const INPUT_TAP_MOVE_THRESHOLD = 10;
982
+ const INPUT_TAP_HIT_SLOP = 16;
983
+ const KEYBOARD_INPUT_TYPES = new Set(['email', 'number', 'password', 'search', 'tel', 'text', 'url']);
984
+ const KEYBOARD_TAP_BLOCKED = Symbol('KeyboardTapBlocked');
985
+ /**
986
+ * Provides mobile virtual-keyboard handling for bottom-sheet drawers with form fields.
987
+ *
988
+ * Put it on the drawer viewport that contains the popup. The directive writes
989
+ * `--drawer-keyboard-inset` to the host, keeps the focused keyboard input visible when
990
+ * `visualViewport` shrinks, adds temporary scroll slack to the nearest drawer scroller, and uses
991
+ * synchronous tap-to-focus on touch devices so iOS opens the software keyboard reliably.
992
+ */
993
+ class RdxDrawerVirtualKeyboardProvider {
994
+ constructor() {
995
+ this.drawerContext = injectRdxDrawerRootContext();
996
+ this.elementRef = inject(ElementRef);
997
+ this.destroyRef = inject(DestroyRef);
998
+ this.element = this.elementRef.nativeElement;
999
+ this.pendingKeyboardFocusMoved = false;
1000
+ this.keyboardTouchStart = null;
1001
+ this.focusedKeyboardTarget = null;
1002
+ this.keyboardScrollAdjustment = null;
1003
+ this.keyboardFocusFrame = 0;
1004
+ effect((onCleanup) => {
1005
+ const open = this.drawerContext.open();
1006
+ const nestedDrawerOpen = this.drawerContext.nestedDrawerOpen();
1007
+ if (!open || nestedDrawerOpen) {
1008
+ untracked(() => this.clearFocusedKeyboardTarget());
1009
+ return;
1010
+ }
1011
+ const doc = this.element.ownerDocument;
1012
+ const win = doc.defaultView;
1013
+ if (!win) {
1014
+ return;
1015
+ }
1016
+ const handleFocusIn = (event) => {
1017
+ if (this.captureFocusedKeyboardTarget(event.target)) {
1018
+ this.scheduleKeyboardFocusAlignment();
1019
+ }
1020
+ };
1021
+ const handleFocusOut = (event) => {
1022
+ if (this.captureFocusedKeyboardTarget(event.relatedTarget)) {
1023
+ this.scheduleKeyboardFocusAlignment();
1024
+ return;
1025
+ }
1026
+ this.clearFocusedKeyboardTarget();
1027
+ };
1028
+ const handleViewportUpdate = () => {
1029
+ if (this.focusedKeyboardTarget || this.captureFocusedKeyboardTarget(doc.activeElement)) {
1030
+ this.scheduleKeyboardFocusAlignment();
1031
+ }
1032
+ };
1033
+ const visualViewport = win.visualViewport;
1034
+ doc.addEventListener('focusin', handleFocusIn, true);
1035
+ doc.addEventListener('focusout', handleFocusOut, true);
1036
+ visualViewport?.addEventListener('resize', handleViewportUpdate);
1037
+ visualViewport?.addEventListener('scroll', handleViewportUpdate);
1038
+ if (this.captureFocusedKeyboardTarget(doc.activeElement)) {
1039
+ this.scheduleKeyboardFocusAlignment();
1040
+ }
1041
+ onCleanup(() => {
1042
+ doc.removeEventListener('focusin', handleFocusIn, true);
1043
+ doc.removeEventListener('focusout', handleFocusOut, true);
1044
+ visualViewport?.removeEventListener('resize', handleViewportUpdate);
1045
+ visualViewport?.removeEventListener('scroll', handleViewportUpdate);
1046
+ this.clearFocusedKeyboardTarget();
1047
+ this.element.style.removeProperty('--drawer-keyboard-inset');
1048
+ });
1049
+ });
1050
+ this.destroyRef.onDestroy(() => {
1051
+ this.cancelKeyboardFocusFrame();
1052
+ this.restoreKeyboardScrollAdjustment();
1053
+ this.element.style.removeProperty('--drawer-keyboard-inset');
1054
+ });
1055
+ }
1056
+ onTouchStart(event) {
1057
+ if (!this.drawerContext.open() || this.drawerContext.nestedDrawerOpen()) {
1058
+ this.resetTouchTrackingState();
1059
+ return;
1060
+ }
1061
+ const touch = event.touches[0];
1062
+ if (!touch) {
1063
+ return;
1064
+ }
1065
+ this.pendingKeyboardFocusMoved = false;
1066
+ this.keyboardTouchStart = { x: touch.clientX, y: touch.clientY };
1067
+ }
1068
+ onTouchMove(event) {
1069
+ const touch = event.touches[0];
1070
+ const touchStart = this.keyboardTouchStart;
1071
+ if (!touch || !touchStart || this.pendingKeyboardFocusMoved) {
1072
+ return;
1073
+ }
1074
+ if (Math.abs(touch.clientX - touchStart.x) > INPUT_TAP_MOVE_THRESHOLD ||
1075
+ Math.abs(touch.clientY - touchStart.y) > INPUT_TAP_MOVE_THRESHOLD) {
1076
+ this.pendingKeyboardFocusMoved = true;
1077
+ }
1078
+ }
1079
+ onTouchEnd(event) {
1080
+ if (!this.drawerContext.open() ||
1081
+ this.drawerContext.nestedDrawerOpen() ||
1082
+ !this.keyboardTouchStart ||
1083
+ this.pendingKeyboardFocusMoved) {
1084
+ this.resetTouchTrackingState();
1085
+ return;
1086
+ }
1087
+ const touch = event.changedTouches[0] ?? event.touches[0];
1088
+ const doc = this.element.ownerDocument;
1089
+ const nativeEventTarget = event.target;
1090
+ const pointTarget = touch ? resolveKeyboardTouchTargetFromPoint(doc, touch.clientX, touch.clientY) : null;
1091
+ if (pointTarget === KEYBOARD_TAP_BLOCKED) {
1092
+ this.resetTouchTrackingState();
1093
+ return;
1094
+ }
1095
+ const keyboardTarget = touch && (pointTarget ?? resolveKeyboardTouchTarget(nativeEventTarget));
1096
+ if (keyboardTarget &&
1097
+ (!this.element.contains(keyboardTarget.focusTarget) || !this.element.contains(keyboardTarget.clickTarget))) {
1098
+ this.resetTouchTrackingState();
1099
+ return;
1100
+ }
1101
+ if (!keyboardTarget || !touch) {
1102
+ this.resetTouchTrackingState();
1103
+ return;
1104
+ }
1105
+ const win = keyboardTarget.focusTarget.ownerDocument.defaultView;
1106
+ if (!win || (win.visualViewport && win.visualViewport.scale !== 1)) {
1107
+ this.resetTouchTrackingState();
1108
+ return;
1109
+ }
1110
+ if (doc.activeElement === keyboardTarget.focusTarget && isKeyboardVisualViewportOpen(win)) {
1111
+ this.resetTouchTrackingState();
1112
+ return;
1113
+ }
1114
+ event.preventDefault();
1115
+ focusKeyboardInputWithoutPageScroll(keyboardTarget.focusTarget);
1116
+ dispatchKeyboardClick(keyboardTarget.clickTarget, touch);
1117
+ this.resetTouchTrackingState();
1118
+ }
1119
+ resetTouchTrackingState() {
1120
+ this.pendingKeyboardFocusMoved = false;
1121
+ this.keyboardTouchStart = null;
1122
+ }
1123
+ captureFocusedKeyboardTarget(eventTarget) {
1124
+ if (this.drawerContext.nestedDrawerOpen()) {
1125
+ return false;
1126
+ }
1127
+ const target = resolveKeyboardInputTarget(eventTarget);
1128
+ if (!target || !this.element.contains(target)) {
1129
+ return false;
1130
+ }
1131
+ this.focusedKeyboardTarget = target;
1132
+ return true;
1133
+ }
1134
+ alignFocusedKeyboardTarget() {
1135
+ const target = this.focusedKeyboardTarget;
1136
+ const win = this.element.ownerDocument.defaultView;
1137
+ if (!win || this.drawerContext.nestedDrawerOpen() || !target || !this.element.contains(target)) {
1138
+ this.resetDrawerKeyboardInset();
1139
+ this.restoreKeyboardScrollAdjustment();
1140
+ return;
1141
+ }
1142
+ const keyboardViewport = getKeyboardVisualViewport(win);
1143
+ if (!keyboardViewport) {
1144
+ this.resetDrawerKeyboardInset();
1145
+ this.restoreKeyboardScrollAdjustment();
1146
+ return;
1147
+ }
1148
+ this.setDrawerKeyboardInset(getDrawerKeyboardInset(win, keyboardViewport));
1149
+ const scrollTarget = findKeyboardScrollTarget(target, this.element);
1150
+ if (!scrollTarget || !scrollTarget.isConnected || !this.element.contains(scrollTarget)) {
1151
+ this.restoreKeyboardScrollAdjustment();
1152
+ return;
1153
+ }
1154
+ const scrollTargetRect = scrollTarget.getBoundingClientRect();
1155
+ const clippedBottom = Math.min(scrollTargetRect.bottom, keyboardViewport.bottom);
1156
+ const overlap = Math.max(0, scrollTargetRect.bottom - keyboardViewport.bottom);
1157
+ this.setKeyboardScrollSlack(scrollTarget, overlap > 0 ? overlap + KEYBOARD_SCROLL_SLACK : 0);
1158
+ const maxScrollTop = Math.max(0, scrollTarget.scrollHeight - scrollTarget.clientHeight);
1159
+ if (maxScrollTop <= 0) {
1160
+ return;
1161
+ }
1162
+ const clippedTop = Math.max(scrollTargetRect.top, keyboardViewport.top);
1163
+ const visibleTop = clippedTop + KEYBOARD_VISIBILITY_MARGIN;
1164
+ const visibleBottom = clippedBottom - KEYBOARD_VISIBILITY_MARGIN;
1165
+ if (visibleBottom <= visibleTop) {
1166
+ return;
1167
+ }
1168
+ const targetRect = target.getBoundingClientRect();
1169
+ const targetCenter = (targetRect.top + targetRect.bottom) / 2;
1170
+ const visibleCenter = (visibleTop + visibleBottom) / 2;
1171
+ const nextScrollTop = scrollTarget.scrollTop + targetCenter - visibleCenter;
1172
+ scrollTarget.scrollTo({
1173
+ top: clamp(nextScrollTop, 0, maxScrollTop),
1174
+ behavior: prefersReducedMotion(win) ? 'auto' : 'smooth'
1175
+ });
1176
+ }
1177
+ scheduleKeyboardFocusAlignment() {
1178
+ this.cancelKeyboardFocusFrame();
1179
+ this.keyboardFocusFrame = requestAnimationFrame(() => {
1180
+ this.keyboardFocusFrame = 0;
1181
+ this.alignFocusedKeyboardTarget();
1182
+ });
1183
+ }
1184
+ cancelKeyboardFocusFrame() {
1185
+ if (this.keyboardFocusFrame) {
1186
+ cancelAnimationFrame(this.keyboardFocusFrame);
1187
+ this.keyboardFocusFrame = 0;
1188
+ }
1189
+ }
1190
+ clearFocusedKeyboardTarget() {
1191
+ this.focusedKeyboardTarget = null;
1192
+ this.resetDrawerKeyboardInset();
1193
+ this.restoreKeyboardScrollAdjustment();
1194
+ this.cancelKeyboardFocusFrame();
1195
+ }
1196
+ setDrawerKeyboardInset(inset) {
1197
+ this.element.style.setProperty('--drawer-keyboard-inset', `${Math.max(0, Math.ceil(inset))}px`);
1198
+ }
1199
+ resetDrawerKeyboardInset() {
1200
+ this.setDrawerKeyboardInset(0);
1201
+ }
1202
+ setKeyboardScrollSlack(element, slack) {
1203
+ const roundedSlack = Math.max(0, Math.ceil(slack));
1204
+ let adjustment = this.keyboardScrollAdjustment;
1205
+ if (adjustment && !adjustment.element.isConnected) {
1206
+ this.restoreKeyboardScrollAdjustment();
1207
+ adjustment = null;
1208
+ }
1209
+ if (roundedSlack === 0) {
1210
+ this.restoreKeyboardScrollAdjustment();
1211
+ return;
1212
+ }
1213
+ if (adjustment && adjustment.element !== element) {
1214
+ this.restoreKeyboardScrollAdjustment();
1215
+ adjustment = null;
1216
+ }
1217
+ if (!adjustment) {
1218
+ const styles = getComputedStyle(element);
1219
+ adjustment = {
1220
+ element,
1221
+ overflowAnchor: element.style.overflowAnchor,
1222
+ paddingBottom: element.style.paddingBottom,
1223
+ scrollPaddingBottom: element.style.scrollPaddingBottom,
1224
+ computedPaddingBottom: Number.parseFloat(styles.paddingBottom) || 0,
1225
+ computedScrollPaddingBottom: Number.parseFloat(styles.scrollPaddingBottom) || 0
1226
+ };
1227
+ this.keyboardScrollAdjustment = adjustment;
1228
+ }
1229
+ element.style.overflowAnchor = 'none';
1230
+ element.style.paddingBottom = `${adjustment.computedPaddingBottom + roundedSlack}px`;
1231
+ element.style.scrollPaddingBottom = `${adjustment.computedScrollPaddingBottom + KEYBOARD_VISIBILITY_MARGIN}px`;
1232
+ }
1233
+ restoreKeyboardScrollAdjustment() {
1234
+ const adjustment = this.keyboardScrollAdjustment;
1235
+ if (!adjustment) {
1236
+ return;
1237
+ }
1238
+ adjustment.element.style.overflowAnchor = adjustment.overflowAnchor;
1239
+ adjustment.element.style.paddingBottom = adjustment.paddingBottom;
1240
+ adjustment.element.style.scrollPaddingBottom = adjustment.scrollPaddingBottom;
1241
+ this.keyboardScrollAdjustment = null;
1242
+ }
1243
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxDrawerVirtualKeyboardProvider, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1244
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.9", type: RdxDrawerVirtualKeyboardProvider, isStandalone: true, selector: "[rdxDrawerVirtualKeyboardProvider]", host: { listeners: { "touchstart": "onTouchStart($event)", "touchmove": "onTouchMove($event)", "touchend": "onTouchEnd($event)", "touchcancel": "resetTouchTrackingState()" } }, exportAs: ["rdxDrawerVirtualKeyboardProvider"], ngImport: i0 }); }
1245
+ }
1246
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxDrawerVirtualKeyboardProvider, decorators: [{
1247
+ type: Directive,
1248
+ args: [{
1249
+ selector: '[rdxDrawerVirtualKeyboardProvider]',
1250
+ exportAs: 'rdxDrawerVirtualKeyboardProvider',
1251
+ host: {
1252
+ '(touchstart)': 'onTouchStart($event)',
1253
+ '(touchmove)': 'onTouchMove($event)',
1254
+ '(touchend)': 'onTouchEnd($event)',
1255
+ '(touchcancel)': 'resetTouchTrackingState()'
1256
+ }
1257
+ }]
1258
+ }], ctorParameters: () => [] });
1259
+ function isHTMLElement(target) {
1260
+ return target instanceof HTMLElement;
1261
+ }
1262
+ function isKeyboardInputElement(element) {
1263
+ if (element.isContentEditable) {
1264
+ return true;
1265
+ }
1266
+ if (element instanceof HTMLTextAreaElement) {
1267
+ return !element.matches(':disabled');
1268
+ }
1269
+ if (element instanceof HTMLInputElement && KEYBOARD_INPUT_TYPES.has(element.type)) {
1270
+ return !element.matches(':disabled');
1271
+ }
1272
+ return false;
1273
+ }
1274
+ function resolveKeyboardInputTarget(target) {
1275
+ if (!isHTMLElement(target)) {
1276
+ return null;
1277
+ }
1278
+ if (isKeyboardInputElement(target)) {
1279
+ return target.isContentEditable ? getContentEditableHost(target) : target;
1280
+ }
1281
+ const label = target.closest('label');
1282
+ const control = label?.control ?? null;
1283
+ return isHTMLElement(control) && isKeyboardInputElement(control) ? control : null;
1284
+ }
1285
+ function resolveKeyboardTouchTarget(target) {
1286
+ const focusTarget = resolveKeyboardInputTarget(target);
1287
+ if (!focusTarget) {
1288
+ return null;
1289
+ }
1290
+ return {
1291
+ focusTarget,
1292
+ clickTarget: isHTMLElement(target) ? target : focusTarget
1293
+ };
1294
+ }
1295
+ function getContentEditableHost(element) {
1296
+ let host = element;
1297
+ while (host.parentElement?.isContentEditable) {
1298
+ host = host.parentElement;
1299
+ }
1300
+ return host;
1301
+ }
1302
+ function resolveKeyboardTouchTargetFromPoint(doc, clientX, clientY) {
1303
+ const exactTarget = doc.elementFromPoint(clientX, clientY);
1304
+ const exactKeyboardTarget = resolveKeyboardInputTarget(exactTarget);
1305
+ if (exactKeyboardTarget) {
1306
+ return {
1307
+ focusTarget: exactKeyboardTarget,
1308
+ clickTarget: isHTMLElement(exactTarget) ? exactTarget : exactKeyboardTarget
1309
+ };
1310
+ }
1311
+ if (isInteractiveElement(exactTarget) || exactTarget?.closest('label') != null) {
1312
+ return KEYBOARD_TAP_BLOCKED;
1313
+ }
1314
+ for (const [offsetX, offsetY] of [
1315
+ [0, INPUT_TAP_HIT_SLOP],
1316
+ [0, -INPUT_TAP_HIT_SLOP],
1317
+ [INPUT_TAP_HIT_SLOP, 0],
1318
+ [-INPUT_TAP_HIT_SLOP, 0]
1319
+ ]) {
1320
+ const keyboardTarget = resolveKeyboardInputTarget(doc.elementFromPoint(clientX + offsetX, clientY + offsetY));
1321
+ if (keyboardTarget) {
1322
+ return {
1323
+ focusTarget: keyboardTarget,
1324
+ clickTarget: keyboardTarget
1325
+ };
1326
+ }
1327
+ }
1328
+ return null;
1329
+ }
1330
+ function isInteractiveElement(element) {
1331
+ if (!(element instanceof HTMLElement)) {
1332
+ return false;
1333
+ }
1334
+ return (element.isContentEditable ||
1335
+ element.matches('a[href],button,input,select,textarea,summary,[role="button"],[role="checkbox"],[role="radio"],[role="switch"],[tabindex]:not([tabindex="-1"])'));
1336
+ }
1337
+ function dispatchKeyboardClick(target, touch) {
1338
+ const win = target.ownerDocument.defaultView;
1339
+ if (!win) {
1340
+ return;
1341
+ }
1342
+ const ClickEvent = win.PointerEvent ?? win.MouseEvent;
1343
+ target.dispatchEvent(new ClickEvent('click', {
1344
+ bubbles: true,
1345
+ cancelable: true,
1346
+ clientX: touch.clientX,
1347
+ clientY: touch.clientY,
1348
+ detail: 1,
1349
+ view: win
1350
+ }));
1351
+ }
1352
+ function focusKeyboardInputWithoutPageScroll(target) {
1353
+ const wasFocused = target.ownerDocument.activeElement === target;
1354
+ const previousOpacity = target.style.opacity;
1355
+ const previousTransform = target.style.transform;
1356
+ const previousTransition = target.style.transition;
1357
+ target.style.transition = 'none';
1358
+ target.style.opacity = '0';
1359
+ target.style.transform = 'translateY(-2000px)';
1360
+ try {
1361
+ if (wasFocused) {
1362
+ target.blur();
1363
+ }
1364
+ target.focus({ preventScroll: true });
1365
+ }
1366
+ finally {
1367
+ target.style.opacity = previousOpacity;
1368
+ target.style.transform = previousTransform;
1369
+ target.style.transition = previousTransition;
1370
+ }
1371
+ }
1372
+ function findKeyboardScrollTarget(target, root) {
1373
+ let node = target.parentNode;
1374
+ while (node) {
1375
+ if (node instanceof HTMLElement && isKeyboardScrollable(node)) {
1376
+ return node;
1377
+ }
1378
+ if (node === root) {
1379
+ break;
1380
+ }
1381
+ node = node.parentNode;
1382
+ }
1383
+ return null;
1384
+ }
1385
+ function isKeyboardScrollable(element) {
1386
+ const overflowY = getComputedStyle(element).overflowY;
1387
+ return (overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'overlay') && element.scrollHeight > 0;
1388
+ }
1389
+ function getKeyboardVisualViewport(win) {
1390
+ const visualViewport = win.visualViewport;
1391
+ if (!visualViewport || visualViewport.scale !== 1) {
1392
+ return null;
1393
+ }
1394
+ const reducedHeight = win.innerHeight - visualViewport.height;
1395
+ if (reducedHeight <= KEYBOARD_RESIZE_THRESHOLD) {
1396
+ return null;
1397
+ }
1398
+ const top = Math.max(0, visualViewport.offsetTop);
1399
+ return {
1400
+ top,
1401
+ bottom: Math.min(win.innerHeight, top + visualViewport.height)
1402
+ };
1403
+ }
1404
+ function getDrawerKeyboardInset(win, keyboardViewport) {
1405
+ return Math.max(0, win.innerHeight - keyboardViewport.bottom);
1406
+ }
1407
+ function isKeyboardVisualViewportOpen(win) {
1408
+ return !win.visualViewport || getKeyboardVisualViewport(win) !== null;
1409
+ }
1410
+ function prefersReducedMotion(win) {
1411
+ return !!win.matchMedia?.('(prefers-reduced-motion: reduce)')?.matches;
1412
+ }
1413
+
977
1414
  /**
978
1415
  * Connects a drawer root with trigger elements rendered elsewhere in the DOM.
979
1416
  *
@@ -993,6 +1430,7 @@ const drawerImports = [
993
1430
  RdxDrawerPortalMisuseGuard,
994
1431
  RdxDrawerBackdrop,
995
1432
  RdxDrawerViewport,
1433
+ RdxDrawerVirtualKeyboardProvider,
996
1434
  RdxDrawerPopup,
997
1435
  RdxDrawerContent,
998
1436
  RdxDrawerTitle,
@@ -1011,6 +1449,7 @@ class RdxDrawerModule {
1011
1449
  RdxDrawerPortalMisuseGuard,
1012
1450
  RdxDrawerBackdrop,
1013
1451
  RdxDrawerViewport,
1452
+ RdxDrawerVirtualKeyboardProvider,
1014
1453
  RdxDrawerPopup,
1015
1454
  RdxDrawerContent,
1016
1455
  RdxDrawerTitle,
@@ -1025,6 +1464,7 @@ class RdxDrawerModule {
1025
1464
  RdxDrawerPortalMisuseGuard,
1026
1465
  RdxDrawerBackdrop,
1027
1466
  RdxDrawerViewport,
1467
+ RdxDrawerVirtualKeyboardProvider,
1028
1468
  RdxDrawerPopup,
1029
1469
  RdxDrawerContent,
1030
1470
  RdxDrawerTitle,
@@ -1046,5 +1486,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
1046
1486
  * Generated bundle index. Do not edit.
1047
1487
  */
1048
1488
 
1049
- export { RdxDrawerBackdrop, RdxDrawerClose, RdxDrawerContent, RdxDrawerDescription, RdxDrawerHandle, RdxDrawerIndent, RdxDrawerIndentBackground, RdxDrawerModule, RdxDrawerPopup, RdxDrawerPortal, RdxDrawerPortalMisuseGuard, RdxDrawerProvider, RdxDrawerProviderDirective, RdxDrawerRoot, RdxDrawerSwipeArea, RdxDrawerTitle, RdxDrawerTrigger, RdxDrawerViewport, buildSnapEntries, createRdxDrawerHandle, dismissUnitVector, drawerImports, injectRdxDrawerRootContext, provideRdxDrawerProvider, provideRdxDrawerRootContext, resolveSnapTarget, snapPointReveal, useDrawerSwipe };
1489
+ export { RdxDrawerBackdrop, RdxDrawerClose, RdxDrawerContent, RdxDrawerDescription, RdxDrawerHandle, RdxDrawerIndent, RdxDrawerIndentBackground, RdxDrawerModule, RdxDrawerPopup, RdxDrawerPortal, RdxDrawerPortalMisuseGuard, RdxDrawerProvider, RdxDrawerProviderDirective, RdxDrawerRoot, RdxDrawerSwipeArea, RdxDrawerTitle, RdxDrawerTrigger, RdxDrawerViewport, RdxDrawerVirtualKeyboardProvider, buildSnapEntries, createRdxDrawerHandle, dismissUnitVector, drawerImports, injectRdxDrawerRootContext, provideRdxDrawerProvider, provideRdxDrawerRootContext, resolveSnapTarget, snapPointReveal, useDrawerSwipe };
1050
1490
  //# sourceMappingURL=radix-ng-primitives-drawer.mjs.map