@radix-ng/primitives 1.0.10 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +26 -5
  2. package/fesm2022/radix-ng-primitives-autocomplete.mjs +24 -16
  3. package/fesm2022/radix-ng-primitives-autocomplete.mjs.map +1 -1
  4. package/fesm2022/radix-ng-primitives-checkbox.mjs +55 -7
  5. package/fesm2022/radix-ng-primitives-checkbox.mjs.map +1 -1
  6. package/fesm2022/radix-ng-primitives-combobox.mjs +35 -18
  7. package/fesm2022/radix-ng-primitives-combobox.mjs.map +1 -1
  8. package/fesm2022/radix-ng-primitives-composite.mjs +221 -36
  9. package/fesm2022/radix-ng-primitives-composite.mjs.map +1 -1
  10. package/fesm2022/radix-ng-primitives-core.mjs +181 -21
  11. package/fesm2022/radix-ng-primitives-core.mjs.map +1 -1
  12. package/fesm2022/radix-ng-primitives-date-field.mjs +11 -5
  13. package/fesm2022/radix-ng-primitives-date-field.mjs.map +1 -1
  14. package/fesm2022/radix-ng-primitives-field.mjs +127 -23
  15. package/fesm2022/radix-ng-primitives-field.mjs.map +1 -1
  16. package/fesm2022/radix-ng-primitives-form.mjs +35 -4
  17. package/fesm2022/radix-ng-primitives-form.mjs.map +1 -1
  18. package/fesm2022/radix-ng-primitives-input.mjs +87 -15
  19. package/fesm2022/radix-ng-primitives-input.mjs.map +1 -1
  20. package/fesm2022/radix-ng-primitives-menu.mjs +34 -7
  21. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  22. package/fesm2022/radix-ng-primitives-popper.mjs +80 -11
  23. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  24. package/fesm2022/radix-ng-primitives-scroll-area.mjs +6 -3
  25. package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -1
  26. package/fesm2022/radix-ng-primitives-select.mjs +36 -12
  27. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  28. package/fesm2022/radix-ng-primitives-signal-forms.mjs +27 -11
  29. package/fesm2022/radix-ng-primitives-signal-forms.mjs.map +1 -1
  30. package/fesm2022/radix-ng-primitives-time-field.mjs +12 -6
  31. package/fesm2022/radix-ng-primitives-time-field.mjs.map +1 -1
  32. package/package.json +8 -3
  33. package/types/radix-ng-primitives-autocomplete.d.ts +7 -2
  34. package/types/radix-ng-primitives-checkbox.d.ts +10 -1
  35. package/types/radix-ng-primitives-combobox.d.ts +29 -2
  36. package/types/radix-ng-primitives-composite.d.ts +48 -2
  37. package/types/radix-ng-primitives-core.d.ts +152 -94
  38. package/types/radix-ng-primitives-date-field.d.ts +7 -4
  39. package/types/radix-ng-primitives-field.d.ts +55 -8
  40. package/types/radix-ng-primitives-form.d.ts +9 -0
  41. package/types/radix-ng-primitives-input.d.ts +10 -2
  42. package/types/radix-ng-primitives-menu.d.ts +45 -4
  43. package/types/radix-ng-primitives-navigation-menu.d.ts +2 -2
  44. package/types/radix-ng-primitives-popover.d.ts +2 -2
  45. package/types/radix-ng-primitives-popper.d.ts +60 -15
  46. package/types/radix-ng-primitives-preview-card.d.ts +2 -2
  47. package/types/radix-ng-primitives-select.d.ts +17 -3
  48. package/types/radix-ng-primitives-signal-forms.d.ts +22 -8
  49. package/types/radix-ng-primitives-time-field.d.ts +9 -6
  50. package/types/radix-ng-primitives-tooltip.d.ts +2 -2
@@ -7,19 +7,73 @@ const ACTIVE_COMPOSITE_ITEM = 'data-composite-item-active';
7
7
  const ARROW_KEYS = new Set([ARROW_UP, ARROW_DOWN, ARROW_LEFT, ARROW_RIGHT]);
8
8
  const COMPOSITE_KEYS = new Set([...ARROW_KEYS, HOME, END]);
9
9
  const MODIFIER_KEYS = ['Shift', 'Control', 'Alt', 'Meta'];
10
+ function compareNodeDocumentPosition(a, b) {
11
+ const position = a.compareDocumentPosition(b);
12
+ if (position & Node.DOCUMENT_POSITION_FOLLOWING || position & Node.DOCUMENT_POSITION_CONTAINED_BY) {
13
+ return -1;
14
+ }
15
+ if (position & Node.DOCUMENT_POSITION_PRECEDING || position & Node.DOCUMENT_POSITION_CONTAINS) {
16
+ return 1;
17
+ }
18
+ return 0;
19
+ }
10
20
  function sortByDocumentPosition(items) {
11
21
  return [...items]
12
22
  .filter((item) => item.element.isConnected)
13
- .sort((a, b) => {
14
- const position = a.element.compareDocumentPosition(b.element);
15
- if (position & Node.DOCUMENT_POSITION_FOLLOWING || position & Node.DOCUMENT_POSITION_CONTAINED_BY) {
16
- return -1;
23
+ .sort((a, b) => compareNodeDocumentPosition(a.element, b.element));
24
+ }
25
+ /**
26
+ * Smallest set of container elements whose child order can change the relative
27
+ * order of the given (already document-sorted) nodes. Observing each adjacent
28
+ * pair's common ancestor catches both direct item moves and wrapper moves at the
29
+ * boundary, mirroring Base UI's composite list observer.
30
+ */
31
+ function getAdjacentNodeRoots(nodes) {
32
+ const roots = new Set();
33
+ for (let index = 1; index < nodes.length; index += 1) {
34
+ const ancestor = getCommonAncestor(nodes[index - 1], nodes[index]);
35
+ if (ancestor) {
36
+ roots.add(ancestor);
37
+ }
38
+ }
39
+ return roots;
40
+ }
41
+ function getCommonAncestor(firstNode, lastNode) {
42
+ let ancestor = firstNode.parentElement;
43
+ // `parentElement` cannot cross shadow boundaries, so native `contains` suffices.
44
+ while (ancestor && !ancestor.contains(lastNode)) {
45
+ ancestor = ancestor.parentElement;
46
+ }
47
+ return ancestor;
48
+ }
49
+ /**
50
+ * Whether a batch of mutations moved a node (removed then re-added in the same
51
+ * batch, or reparented so a removed node is still connected) rather than a pure
52
+ * add/remove. Pure adds/removals re-sort through register/unregister and cannot
53
+ * change the relative order of the remaining items.
54
+ */
55
+ function hasMovedNode(entries) {
56
+ const removed = new Set();
57
+ // Records are chronological: an addition following a removal is a move, while
58
+ // a removal following an addition is a net removal.
59
+ for (const entry of entries) {
60
+ for (let i = 0; i < entry.addedNodes.length; i += 1) {
61
+ if (removed.has(entry.addedNodes[i])) {
62
+ return true;
63
+ }
17
64
  }
18
- if (position & Node.DOCUMENT_POSITION_PRECEDING || position & Node.DOCUMENT_POSITION_CONTAINS) {
19
- return 1;
65
+ for (let i = 0; i < entry.removedNodes.length; i += 1) {
66
+ removed.add(entry.removedNodes[i]);
20
67
  }
21
- return 0;
22
- });
68
+ }
69
+ // A removed node that is still connected was reparented into a container this
70
+ // observer does not watch.
71
+ for (const node of removed) {
72
+ if (node.isConnected) {
73
+ return true;
74
+ }
75
+ }
76
+ return false;
23
77
  }
24
78
  function isModifierKeySet(event, allowedModifierKeys) {
25
79
  return MODIFIER_KEYS.some((key) => !allowedModifierKeys.includes(key) && event.getModifierState(key));
@@ -108,6 +162,12 @@ function isListIndexDisabled(list, index, disabledIndices) {
108
162
  if (!isElementVisible(element)) {
109
163
  return true;
110
164
  }
165
+ // A natively disabled element can never receive focus, so it is always skipped — even when
166
+ // `disabledIndices` marks it as enabled. Only `aria-disabled` items can be
167
+ // focusable-while-disabled.
168
+ if (element.matches(':disabled')) {
169
+ return true;
170
+ }
111
171
  return (disabledIndices === undefined &&
112
172
  (element.hasAttribute('disabled') || element.getAttribute('aria-disabled') === 'true'));
113
173
  }
@@ -142,21 +202,42 @@ function scrollIntoViewIfNeeded(scrollContainer, element, direction, orientation
142
202
  const elementOffsetLeft = getOffset(scrollContainer, element, 'left');
143
203
  const containerStyles = getScrollStyles(scrollContainer);
144
204
  const elementStyles = getScrollStyles(element);
145
- if (elementOffsetLeft - elementStyles.scrollMarginLeft <
146
- scrollContainer.scrollLeft + containerStyles.scrollPaddingLeft) {
147
- left = elementOffsetLeft - elementStyles.scrollMarginLeft - containerStyles.scrollPaddingLeft;
148
- }
149
- else if (elementOffsetLeft + element.offsetWidth + elementStyles.scrollMarginRight >
150
- scrollContainer.scrollLeft + scrollContainer.clientWidth - containerStyles.scrollPaddingRight) {
151
- left =
152
- elementOffsetLeft +
153
- element.offsetWidth +
154
- elementStyles.scrollMarginRight -
155
- scrollContainer.clientWidth +
156
- containerStyles.scrollPaddingRight;
205
+ // Which edge to align first differs by direction (Base UI parity): LTR resolves a
206
+ // right-edge overflow before a left one, RTL the reverse. It only matters when the
207
+ // element is wider than the container, where both edges overflow at once.
208
+ if (direction === 'ltr') {
209
+ if (elementOffsetLeft + element.offsetWidth + elementStyles.scrollMarginRight >
210
+ scrollContainer.scrollLeft + scrollContainer.clientWidth - containerStyles.scrollPaddingRight) {
211
+ // overflow to the right, align right edges
212
+ left =
213
+ elementOffsetLeft +
214
+ element.offsetWidth +
215
+ elementStyles.scrollMarginRight -
216
+ scrollContainer.clientWidth +
217
+ containerStyles.scrollPaddingRight;
218
+ }
219
+ else if (elementOffsetLeft - elementStyles.scrollMarginLeft <
220
+ scrollContainer.scrollLeft + containerStyles.scrollPaddingLeft) {
221
+ // overflow to the left, align left edges
222
+ left = elementOffsetLeft - elementStyles.scrollMarginLeft - containerStyles.scrollPaddingLeft;
223
+ }
157
224
  }
158
225
  if (direction === 'rtl') {
159
- left = Math.max(left, 0);
226
+ if (elementOffsetLeft - elementStyles.scrollMarginRight <
227
+ scrollContainer.scrollLeft + containerStyles.scrollPaddingLeft) {
228
+ // overflow to the left, align left edges
229
+ left = elementOffsetLeft - elementStyles.scrollMarginLeft - containerStyles.scrollPaddingLeft;
230
+ }
231
+ else if (elementOffsetLeft + element.offsetWidth + elementStyles.scrollMarginRight >
232
+ scrollContainer.scrollLeft + scrollContainer.clientWidth - containerStyles.scrollPaddingRight) {
233
+ // overflow to the right, align right edges
234
+ left =
235
+ elementOffsetLeft +
236
+ element.offsetWidth +
237
+ elementStyles.scrollMarginRight -
238
+ scrollContainer.clientWidth +
239
+ containerStyles.scrollPaddingRight;
240
+ }
160
241
  }
161
242
  }
162
243
  if (isOverflowingY && orientation !== 'horizontal') {
@@ -224,13 +305,48 @@ const [injectRdxCompositeListContext, provideRdxCompositeListContext] = createCo
224
305
  class RdxCompositeList {
225
306
  constructor() {
226
307
  this.elementRef = inject(ElementRef);
227
- this.registeredItems = signal([], /* @ts-ignore */
228
- ...(ngDevMode ? [{ debugName: "registeredItems" }] : /* istanbul ignore next */ []));
308
+ /**
309
+ * Stable element registration map. Kept as a plain (mutable) Map so a registration is an O(1)
310
+ * `set`/`delete` instead of re-creating the whole array on every mount — with N items each
311
+ * registering, an array copy per item is an O(n^2) mount. `registrationTick` is the reactive
312
+ * trigger: bumped on every register/unregister so `items` re-derives. Mirrors Base UI's composite
313
+ * list (stable map + `mapTick`).
314
+ */
315
+ this.registrations = new Map();
316
+ this.registrationTick = signal(0, /* @ts-ignore */
317
+ ...(ngDevMode ? [{ debugName: "registrationTick" }] : /* istanbul ignore next */ []));
318
+ /**
319
+ * Bumped when registered items are moved in the DOM without re-registering
320
+ * (e.g. an `@for` reorder that reuses views). Angular does not re-run the item
321
+ * registration effect on such moves, so `registeredItems` is unchanged and the
322
+ * document-order sort would go stale; a MutationObserver detects the move and
323
+ * bumps this tick to force `items` to re-sort. Mirrors Base UI's composite list.
324
+ */
325
+ this.reorderTick = signal(0, /* @ts-ignore */
326
+ ...(ngDevMode ? [{ debugName: "reorderTick" }] : /* istanbul ignore next */ []));
229
327
  /** Emits when the ordered item map changes. */
230
328
  this.onMapChange = output();
231
329
  /** Items registered with this list, sorted in DOM order. */
232
- this.items = computed(() => sortByDocumentPosition(this.registeredItems()), /* @ts-ignore */
330
+ this.items = computed(() => {
331
+ this.reorderTick();
332
+ this.registrationTick();
333
+ return sortByDocumentPosition([...this.registrations.values()]);
334
+ }, /* @ts-ignore */
233
335
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
336
+ /**
337
+ * Element → document-order index. Depends only on `items()` (not on any item's metadata), so
338
+ * `indexOf` is an O(1) lookup and rebuilds only when the item set/order changes — the mount hot
339
+ * path where N items each read their index. Keeping metadata out of it avoids invalidating every
340
+ * item's index when a single item's metadata changes.
341
+ */
342
+ this.indexMap = computed(() => {
343
+ const map = new Map();
344
+ this.items().forEach((item, index) => {
345
+ map.set(item.element, index);
346
+ });
347
+ return map;
348
+ }, /* @ts-ignore */
349
+ ...(ngDevMode ? [{ debugName: "indexMap" }] : /* istanbul ignore next */ []));
234
350
  /** Ordered metadata keyed by item element. */
235
351
  this.itemMap = computed(() => {
236
352
  const map = new Map();
@@ -243,18 +359,64 @@ class RdxCompositeList {
243
359
  effect(() => {
244
360
  this.onMapChange.emit(this.itemMap());
245
361
  });
362
+ this.observeItemReordering();
363
+ }
364
+ /**
365
+ * Watches the smallest containers that bound the registered items and re-sorts
366
+ * when a move inverts their document order. Re-established whenever the item set
367
+ * changes; a no-op where `MutationObserver` is unavailable (SSR).
368
+ */
369
+ observeItemReordering() {
370
+ if (typeof MutationObserver !== 'function') {
371
+ return;
372
+ }
373
+ effect((onCleanup) => {
374
+ const orderedNodes = this.items().map((item) => item.element);
375
+ // A single item cannot reorder.
376
+ if (orderedNodes.length < 2) {
377
+ return;
378
+ }
379
+ const roots = getAdjacentNodeRoots(orderedNodes);
380
+ if (roots.size === 0) {
381
+ return;
382
+ }
383
+ const observer = new MutationObserver((entries) => {
384
+ // Only react to moves; pure adds/removals re-sort through registration.
385
+ if (!hasMovedNode(entries)) {
386
+ return;
387
+ }
388
+ let previous = null;
389
+ for (const node of orderedNodes) {
390
+ if (!node.isConnected) {
391
+ continue;
392
+ }
393
+ // A connected node now preceding its predecessor means the order inverted.
394
+ if (previous && compareNodeDocumentPosition(previous, node) > 0) {
395
+ observer.disconnect();
396
+ this.reorderTick.update((tick) => tick + 1);
397
+ return;
398
+ }
399
+ previous = node;
400
+ }
401
+ });
402
+ roots.forEach((root) => observer.observe(root, { childList: true }));
403
+ onCleanup(() => observer.disconnect());
404
+ });
246
405
  }
247
406
  registerItem(item) {
248
- this.registeredItems.update((items) => [
249
- ...items.filter((registered) => registered.element !== item.element),
250
- item
251
- ]);
407
+ this.registrations.set(item.element, item);
408
+ this.registrationTick.update((tick) => tick + 1);
252
409
  return () => {
253
- this.registeredItems.update((items) => items.filter((registered) => registered.element !== item.element));
410
+ // Only unregister if this exact registration is still current — a re-registration of the
411
+ // same element must not be removed by the previous registration's cleanup.
412
+ if (this.registrations.get(item.element) === item) {
413
+ this.registrations.delete(item.element);
414
+ this.registrationTick.update((tick) => tick + 1);
415
+ }
254
416
  };
255
417
  }
256
418
  indexOf(element) {
257
- return this.items().findIndex((item) => item.element === element);
419
+ return this.indexMap().get(element) ?? -1;
258
420
  }
259
421
  elements() {
260
422
  return this.items().map((item) => item.element);
@@ -398,18 +560,41 @@ class RdxCompositeRoot {
398
560
  this.setHighlightedIndex(activeIndex, true);
399
561
  return;
400
562
  }
563
+ // Initial pass: move the tab stop off a disabled default item. The DOM disabled /
564
+ // aria-disabled fallback is intentionally allowed here (Base UI init parity).
565
+ this.moveHighlightOffDisabledItem();
566
+ return;
401
567
  }
402
- if (this.isIndexDisabled(this.highlightedIndex())) {
403
- const firstEnabledIndex = getMinListIndex(this.elements(), this.disabledIndices());
404
- if (!isIndexOutOfListBounds(items, firstEnabledIndex)) {
405
- this.setHighlightedIndex(firstEnabledIndex);
406
- }
568
+ // Re-validation after the initial pass. `disabledIndices` can resolve a render late (e.g.
569
+ // Toolbar derives it from item metadata), leaving the tab stop on a now-disabled item. Gated
570
+ // on `disabledIndices` being provided, so composites relying on the DOM disabled fallback keep
571
+ // their index untouched (Base UI's `disabledIndices == null` skip in useCompositeRoot).
572
+ //
573
+ // Deliberate divergence from Base UI's second gate (`externalHighlightedIndex != null`):
574
+ // Angular's `model()` cannot distinguish a controlled `[(highlightedIndex)]` from an
575
+ // uncontrolled one, so when `disabledIndices` IS provided this re-validation also applies to a
576
+ // controlled index — a consumer that both controls the index and passes `disabledIndices` may
577
+ // see it corrected and written back through the binding. That combination is contradictory,
578
+ // and moving to the first enabled item keeps a reachable tab stop.
579
+ if (this.disabledIndices() != null) {
580
+ this.moveHighlightOffDisabledItem();
407
581
  }
408
582
  });
409
583
  effect(() => {
410
584
  this.onMapChange.emit(this.itemMap());
411
585
  });
412
586
  }
587
+ /** Move the roving tab stop to the first enabled item when the highlighted one is disabled. */
588
+ moveHighlightOffDisabledItem() {
589
+ if (!this.isIndexDisabled(this.highlightedIndex())) {
590
+ return;
591
+ }
592
+ const elements = this.elements();
593
+ const firstEnabledIndex = getMinListIndex(elements, this.disabledIndices());
594
+ if (!isIndexOutOfListBounds(elements, firstEnabledIndex)) {
595
+ this.setHighlightedIndex(firstEnabledIndex);
596
+ }
597
+ }
413
598
  indexOf(element) {
414
599
  return this.compositeList.indexOf(element);
415
600
  }
@@ -636,5 +821,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
636
821
  * Generated bundle index. Do not edit.
637
822
  */
638
823
 
639
- export { ACTIVE_COMPOSITE_ITEM, ARROW_KEYS, COMPOSITE_KEYS, MODIFIER_KEYS, RdxCompositeItem, RdxCompositeList, RdxCompositeListItem, RdxCompositeModule, RdxCompositeRoot, compositeImports, findNonDisabledListIndex, getCompositeNavigationKeys, getMaxListIndex, getMinListIndex, injectRdxCompositeListContext, injectRdxCompositeRootContext, isElementDisabled, isElementVisible, isIndexOutOfListBounds, isListIndexDisabled, isModifierKeySet, isNativeTextInput, provideRdxCompositeListContext, provideRdxCompositeRootContext, scrollIntoViewIfNeeded, shouldKeepNativeTextInputBehavior, sortByDocumentPosition };
824
+ export { ACTIVE_COMPOSITE_ITEM, ARROW_KEYS, COMPOSITE_KEYS, MODIFIER_KEYS, RdxCompositeItem, RdxCompositeList, RdxCompositeListItem, RdxCompositeModule, RdxCompositeRoot, compareNodeDocumentPosition, compositeImports, findNonDisabledListIndex, getAdjacentNodeRoots, getCompositeNavigationKeys, getMaxListIndex, getMinListIndex, hasMovedNode, injectRdxCompositeListContext, injectRdxCompositeRootContext, isElementDisabled, isElementVisible, isIndexOutOfListBounds, isListIndexDisabled, isModifierKeySet, isNativeTextInput, provideRdxCompositeListContext, provideRdxCompositeRootContext, scrollIntoViewIfNeeded, shouldKeepNativeTextInputBehavior, sortByDocumentPosition };
640
825
  //# sourceMappingURL=radix-ng-primitives-composite.mjs.map
@@ -1 +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 if (target.tagName === 'TEXTAREA') {\n return true;\n }\n\n if (target.tagName !== 'INPUT') {\n return false;\n }\n\n // Only inputs that expose a text caret count: `selectionStart` is `null` for\n // input types without text selection (checkbox, radio, number, email, …) and\n // may even throw in older engines. Either way such controls are not text\n // inputs and must not block arrow-key navigation when they are the focused\n // composite item.\n try {\n return (target as HTMLInputElement).selectionStart != null;\n } catch {\n return false;\n }\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 '(focusin)': 'handleFocusIn($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 /** Select the whole value when focus lands on a native text input item (Base UI parity). */\n protected handleFocusIn(event: FocusEvent): void {\n const target = event.target;\n\n if (isNativeTextInput(target)) {\n target.setSelectionRange(0, target.value.length);\n }\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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"}
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 compareNodeDocumentPosition(a: Node, b: Node): number {\n const position = a.compareDocumentPosition(b);\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\nexport function sortByDocumentPosition<T extends { element: HTMLElement }>(items: readonly T[]): T[] {\n return [...items]\n .filter((item) => item.element.isConnected)\n .sort((a, b) => compareNodeDocumentPosition(a.element, b.element));\n}\n\n/**\n * Smallest set of container elements whose child order can change the relative\n * order of the given (already document-sorted) nodes. Observing each adjacent\n * pair's common ancestor catches both direct item moves and wrapper moves at the\n * boundary, mirroring Base UI's composite list observer.\n */\nexport function getAdjacentNodeRoots(nodes: readonly Element[]): Set<Element> {\n const roots = new Set<Element>();\n\n for (let index = 1; index < nodes.length; index += 1) {\n const ancestor = getCommonAncestor(nodes[index - 1], nodes[index]);\n\n if (ancestor) {\n roots.add(ancestor);\n }\n }\n\n return roots;\n}\n\nfunction getCommonAncestor(firstNode: Element, lastNode: Element): Element | null {\n let ancestor = firstNode.parentElement;\n\n // `parentElement` cannot cross shadow boundaries, so native `contains` suffices.\n while (ancestor && !ancestor.contains(lastNode)) {\n ancestor = ancestor.parentElement;\n }\n\n return ancestor;\n}\n\n/**\n * Whether a batch of mutations moved a node (removed then re-added in the same\n * batch, or reparented so a removed node is still connected) rather than a pure\n * add/remove. Pure adds/removals re-sort through register/unregister and cannot\n * change the relative order of the remaining items.\n */\nexport function hasMovedNode(entries: readonly MutationRecord[]): boolean {\n const removed = new Set<Node>();\n\n // Records are chronological: an addition following a removal is a move, while\n // a removal following an addition is a net removal.\n for (const entry of entries) {\n for (let i = 0; i < entry.addedNodes.length; i += 1) {\n if (removed.has(entry.addedNodes[i])) {\n return true;\n }\n }\n\n for (let i = 0; i < entry.removedNodes.length; i += 1) {\n removed.add(entry.removedNodes[i]);\n }\n }\n\n // A removed node that is still connected was reparented into a container this\n // observer does not watch.\n for (const node of removed) {\n if (node.isConnected) {\n return true;\n }\n }\n\n return false;\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 if (target.tagName === 'TEXTAREA') {\n return true;\n }\n\n if (target.tagName !== 'INPUT') {\n return false;\n }\n\n // Only inputs that expose a text caret count: `selectionStart` is `null` for\n // input types without text selection (checkbox, radio, number, email, …) and\n // may even throw in older engines. Either way such controls are not text\n // inputs and must not block arrow-key navigation when they are the focused\n // composite item.\n try {\n return (target as HTMLInputElement).selectionStart != null;\n } catch {\n return false;\n }\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 // A natively disabled element can never receive focus, so it is always skipped — even when\n // `disabledIndices` marks it as enabled. Only `aria-disabled` items can be\n // focusable-while-disabled.\n if (element.matches(':disabled')) {\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 // Which edge to align first differs by direction (Base UI parity): LTR resolves a\n // right-edge overflow before a left one, RTL the reverse. It only matters when the\n // element is wider than the container, where both edges overflow at once.\n if (direction === 'ltr') {\n if (\n elementOffsetLeft + element.offsetWidth + elementStyles.scrollMarginRight >\n scrollContainer.scrollLeft + scrollContainer.clientWidth - containerStyles.scrollPaddingRight\n ) {\n // overflow to the right, align right edges\n left =\n elementOffsetLeft +\n element.offsetWidth +\n elementStyles.scrollMarginRight -\n scrollContainer.clientWidth +\n containerStyles.scrollPaddingRight;\n } else if (\n elementOffsetLeft - elementStyles.scrollMarginLeft <\n scrollContainer.scrollLeft + containerStyles.scrollPaddingLeft\n ) {\n // overflow to the left, align left edges\n left = elementOffsetLeft - elementStyles.scrollMarginLeft - containerStyles.scrollPaddingLeft;\n }\n }\n\n if (direction === 'rtl') {\n if (\n elementOffsetLeft - elementStyles.scrollMarginRight <\n scrollContainer.scrollLeft + containerStyles.scrollPaddingLeft\n ) {\n // overflow to the left, align left edges\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 // overflow to the right, align right edges\n left =\n elementOffsetLeft +\n element.offsetWidth +\n elementStyles.scrollMarginRight -\n scrollContainer.clientWidth +\n containerStyles.scrollPaddingRight;\n }\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 { compareNodeDocumentPosition, getAdjacentNodeRoots, hasMovedNode, 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\n /**\n * Stable element → registration map. Kept as a plain (mutable) Map so a registration is an O(1)\n * `set`/`delete` instead of re-creating the whole array on every mount — with N items each\n * registering, an array copy per item is an O(n^2) mount. `registrationTick` is the reactive\n * trigger: bumped on every register/unregister so `items` re-derives. Mirrors Base UI's composite\n * list (stable map + `mapTick`).\n */\n private readonly registrations = new Map<HTMLElement, RdxCompositeItemRegistration>();\n private readonly registrationTick = signal(0);\n\n /**\n * Bumped when registered items are moved in the DOM without re-registering\n * (e.g. an `@for` reorder that reuses views). Angular does not re-run the item\n * registration effect on such moves, so `registeredItems` is unchanged and the\n * document-order sort would go stale; a MutationObserver detects the move and\n * bumps this tick to force `items` to re-sort. Mirrors Base UI's composite list.\n */\n private readonly reorderTick = signal(0);\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(() => {\n this.reorderTick();\n this.registrationTick();\n return sortByDocumentPosition([...this.registrations.values()]);\n });\n\n /**\n * Element → document-order index. Depends only on `items()` (not on any item's metadata), so\n * `indexOf` is an O(1) lookup and rebuilds only when the item set/order changes — the mount hot\n * path where N items each read their index. Keeping metadata out of it avoids invalidating every\n * item's index when a single item's metadata changes.\n */\n private readonly indexMap = computed(() => {\n const map = new Map<HTMLElement, number>();\n\n this.items().forEach((item, index) => {\n map.set(item.element, index);\n });\n\n return map;\n });\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 this.observeItemReordering();\n }\n\n /**\n * Watches the smallest containers that bound the registered items and re-sorts\n * when a move inverts their document order. Re-established whenever the item set\n * changes; a no-op where `MutationObserver` is unavailable (SSR).\n */\n private observeItemReordering(): void {\n if (typeof MutationObserver !== 'function') {\n return;\n }\n\n effect((onCleanup) => {\n const orderedNodes = this.items().map((item) => item.element);\n\n // A single item cannot reorder.\n if (orderedNodes.length < 2) {\n return;\n }\n\n const roots = getAdjacentNodeRoots(orderedNodes);\n if (roots.size === 0) {\n return;\n }\n\n const observer = new MutationObserver((entries) => {\n // Only react to moves; pure adds/removals re-sort through registration.\n if (!hasMovedNode(entries)) {\n return;\n }\n\n let previous: Element | null = null;\n\n for (const node of orderedNodes) {\n if (!node.isConnected) {\n continue;\n }\n\n // A connected node now preceding its predecessor means the order inverted.\n if (previous && compareNodeDocumentPosition(previous, node) > 0) {\n observer.disconnect();\n this.reorderTick.update((tick) => tick + 1);\n return;\n }\n\n previous = node;\n }\n });\n\n roots.forEach((root) => observer.observe(root, { childList: true }));\n\n onCleanup(() => observer.disconnect());\n });\n }\n\n registerItem<Metadata extends RdxCompositeItemMetadata>(item: RdxCompositeItemRegistration<Metadata>): () => void {\n this.registrations.set(item.element, item);\n this.registrationTick.update((tick) => tick + 1);\n\n return () => {\n // Only unregister if this exact registration is still current — a re-registration of the\n // same element must not be removed by the previous registration's cleanup.\n if (this.registrations.get(item.element) === item) {\n this.registrations.delete(item.element);\n this.registrationTick.update((tick) => tick + 1);\n }\n };\n }\n\n indexOf(element: HTMLElement): number {\n return this.indexMap().get(element) ?? -1;\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 '(focusin)': 'handleFocusIn($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\n const activeIndex = items.findIndex((item) => item.element.hasAttribute(ACTIVE_COMPOSITE_ITEM));\n if (activeIndex !== -1) {\n this.setHighlightedIndex(activeIndex, true);\n return;\n }\n\n // Initial pass: move the tab stop off a disabled default item. The DOM disabled /\n // aria-disabled fallback is intentionally allowed here (Base UI init parity).\n this.moveHighlightOffDisabledItem();\n return;\n }\n\n // Re-validation after the initial pass. `disabledIndices` can resolve a render late (e.g.\n // Toolbar derives it from item metadata), leaving the tab stop on a now-disabled item. Gated\n // on `disabledIndices` being provided, so composites relying on the DOM disabled fallback keep\n // their index untouched (Base UI's `disabledIndices == null` skip in useCompositeRoot).\n //\n // Deliberate divergence from Base UI's second gate (`externalHighlightedIndex != null`):\n // Angular's `model()` cannot distinguish a controlled `[(highlightedIndex)]` from an\n // uncontrolled one, so when `disabledIndices` IS provided this re-validation also applies to a\n // controlled index — a consumer that both controls the index and passes `disabledIndices` may\n // see it corrected and written back through the binding. That combination is contradictory,\n // and moving to the first enabled item keeps a reachable tab stop.\n if (this.disabledIndices() != null) {\n this.moveHighlightOffDisabledItem();\n }\n });\n\n effect(() => {\n this.onMapChange.emit(this.itemMap());\n });\n }\n\n /** Move the roving tab stop to the first enabled item when the highlighted one is disabled. */\n private moveHighlightOffDisabledItem(): void {\n if (!this.isIndexDisabled(this.highlightedIndex())) {\n return;\n }\n\n const elements = this.elements();\n const firstEnabledIndex = getMinListIndex(elements, this.disabledIndices());\n if (!isIndexOutOfListBounds(elements, firstEnabledIndex)) {\n this.setHighlightedIndex(firstEnabledIndex);\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 /** Select the whole value when focus lands on a native text input item (Base UI parity). */\n protected handleFocusIn(event: FocusEvent): void {\n const target = event.target;\n\n if (isNativeTextInput(target)) {\n target.setSelectionRange(0, target.value.length);\n }\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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"}