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

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/composite/README.md +3 -0
  2. package/fesm2022/radix-ng-primitives-accordion.mjs +12 -36
  3. package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -1
  4. package/fesm2022/radix-ng-primitives-composite.mjs +515 -0
  5. package/fesm2022/radix-ng-primitives-composite.mjs.map +1 -0
  6. package/fesm2022/radix-ng-primitives-drawer.mjs +442 -2
  7. package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
  8. package/fesm2022/radix-ng-primitives-menu.mjs +38 -16
  9. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  10. package/fesm2022/radix-ng-primitives-menubar.mjs +68 -36
  11. package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
  12. package/fesm2022/radix-ng-primitives-navigation-menu.mjs +281 -88
  13. package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
  14. package/fesm2022/radix-ng-primitives-popover.mjs +40 -15
  15. package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
  16. package/fesm2022/radix-ng-primitives-popper.mjs +73 -65
  17. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  18. package/fesm2022/radix-ng-primitives-radio.mjs +63 -27
  19. package/fesm2022/radix-ng-primitives-radio.mjs.map +1 -1
  20. package/fesm2022/radix-ng-primitives-roving-focus.mjs +40 -8
  21. package/fesm2022/radix-ng-primitives-roving-focus.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 +3 -0
  25. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  26. package/fesm2022/radix-ng-primitives-tabs.mjs +50 -21
  27. package/fesm2022/radix-ng-primitives-tabs.mjs.map +1 -1
  28. package/fesm2022/radix-ng-primitives-toggle-group.mjs +66 -21
  29. package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
  30. package/fesm2022/radix-ng-primitives-toggle.mjs +29 -11
  31. package/fesm2022/radix-ng-primitives-toggle.mjs.map +1 -1
  32. package/fesm2022/radix-ng-primitives-toolbar.mjs +50 -24
  33. package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
  34. package/navigation-menu/README.md +5 -2
  35. package/package.json +5 -1
  36. package/types/radix-ng-primitives-accordion.d.ts +9 -13
  37. package/types/radix-ng-primitives-composite.d.ts +152 -0
  38. package/types/radix-ng-primitives-drawer.d.ts +40 -2
  39. package/types/radix-ng-primitives-menu.d.ts +5 -3
  40. package/types/radix-ng-primitives-menubar.d.ts +10 -5
  41. package/types/radix-ng-primitives-navigation-menu.d.ts +65 -33
  42. package/types/radix-ng-primitives-popover.d.ts +9 -5
  43. package/types/radix-ng-primitives-popper.d.ts +1 -0
  44. package/types/radix-ng-primitives-radio.d.ts +11 -9
  45. package/types/radix-ng-primitives-roving-focus.d.ts +15 -1
  46. package/types/radix-ng-primitives-scroll-area.d.ts +4 -1
  47. package/types/radix-ng-primitives-tabs.d.ts +8 -5
  48. package/types/radix-ng-primitives-toggle-group.d.ts +27 -16
  49. package/types/radix-ng-primitives-toggle.d.ts +5 -5
  50. package/types/radix-ng-primitives-toolbar.d.ts +22 -14
@@ -0,0 +1,515 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, ElementRef, signal, input, linkedSignal, booleanAttribute, model, output, computed, effect, Directive, untracked, NgModule } from '@angular/core';
3
+ import { ARROW_UP, ARROW_DOWN, ARROW_LEFT, ARROW_RIGHT, HOME, END, createContext } from '@radix-ng/primitives/core';
4
+ import { injectDirection } from '@radix-ng/primitives/direction-provider';
5
+
6
+ const ACTIVE_COMPOSITE_ITEM = 'data-composite-item-active';
7
+ const ARROW_KEYS = new Set([ARROW_UP, ARROW_DOWN, ARROW_LEFT, ARROW_RIGHT]);
8
+ const COMPOSITE_KEYS = new Set([...ARROW_KEYS, HOME, END]);
9
+ const MODIFIER_KEYS = ['Shift', 'Control', 'Alt', 'Meta'];
10
+ function sortByDocumentPosition(items) {
11
+ return [...items]
12
+ .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;
17
+ }
18
+ if (position & Node.DOCUMENT_POSITION_PRECEDING || position & Node.DOCUMENT_POSITION_CONTAINS) {
19
+ return 1;
20
+ }
21
+ return 0;
22
+ });
23
+ }
24
+ function isModifierKeySet(event, allowedModifierKeys) {
25
+ return MODIFIER_KEYS.some((key) => !allowedModifierKeys.includes(key) && event.getModifierState(key));
26
+ }
27
+ function isNativeTextInput(target) {
28
+ if (!(target instanceof HTMLElement)) {
29
+ return false;
30
+ }
31
+ return target.tagName === 'TEXTAREA' || target.tagName === 'INPUT';
32
+ }
33
+ function getCompositeNavigationKeys(orientation, dir) {
34
+ const horizontalForwardKey = dir === 'rtl' ? ARROW_LEFT : ARROW_RIGHT;
35
+ const horizontalBackwardKey = dir === 'rtl' ? ARROW_RIGHT : ARROW_LEFT;
36
+ return {
37
+ forwardKeys: orientation === 'horizontal'
38
+ ? [horizontalForwardKey]
39
+ : orientation === 'vertical'
40
+ ? [ARROW_DOWN]
41
+ : [horizontalForwardKey, ARROW_DOWN],
42
+ backwardKeys: orientation === 'horizontal'
43
+ ? [horizontalBackwardKey]
44
+ : orientation === 'vertical'
45
+ ? [ARROW_UP]
46
+ : [horizontalBackwardKey, ARROW_UP]
47
+ };
48
+ }
49
+ function shouldKeepNativeTextInputBehavior(event, target, orientation, dir) {
50
+ const { forwardKeys, backwardKeys } = getCompositeNavigationKeys(orientation, dir);
51
+ const selectionStart = target.selectionStart;
52
+ const selectionEnd = target.selectionEnd;
53
+ const value = target.value ?? '';
54
+ if (selectionStart == null || selectionEnd == null || event.shiftKey || selectionStart !== selectionEnd) {
55
+ return true;
56
+ }
57
+ if (!backwardKeys.includes(event.key) && selectionStart < value.length) {
58
+ return true;
59
+ }
60
+ if (!forwardKeys.includes(event.key) && selectionStart > 0) {
61
+ return true;
62
+ }
63
+ return false;
64
+ }
65
+ function isIndexOutOfListBounds(list, index) {
66
+ return index < 0 || index >= list.length;
67
+ }
68
+ function getMinListIndex(list, disabledIndices) {
69
+ return findNonDisabledListIndex(list, { startingIndex: -1, disabledIndices });
70
+ }
71
+ function getMaxListIndex(list, disabledIndices) {
72
+ return findNonDisabledListIndex(list, { startingIndex: list.length, decrement: true, disabledIndices });
73
+ }
74
+ function findNonDisabledListIndex(list, options = {}) {
75
+ const { startingIndex = -1, decrement = false, disabledIndices } = options;
76
+ const step = decrement ? -1 : 1;
77
+ for (let index = startingIndex + step; index >= 0 && index < list.length; index += step) {
78
+ if (!isListIndexDisabled(list, index, disabledIndices)) {
79
+ return index;
80
+ }
81
+ }
82
+ return -1;
83
+ }
84
+ function isListIndexDisabled(list, index, disabledIndices) {
85
+ if (disabledIndices?.includes(index)) {
86
+ return true;
87
+ }
88
+ const element = list[index];
89
+ if (!element) {
90
+ return false;
91
+ }
92
+ if (!isElementVisible(element)) {
93
+ return true;
94
+ }
95
+ return (disabledIndices === undefined &&
96
+ (element.hasAttribute('disabled') || element.getAttribute('aria-disabled') === 'true'));
97
+ }
98
+ function isElementDisabled(element) {
99
+ return element === null || element.hasAttribute('disabled') || element.getAttribute('aria-disabled') === 'true';
100
+ }
101
+ function isElementVisible(element) {
102
+ if (!element || !element.isConnected) {
103
+ return false;
104
+ }
105
+ if (typeof Element !== 'undefined' && !(element instanceof Element)) {
106
+ return true;
107
+ }
108
+ let styles;
109
+ try {
110
+ styles = getComputedStyle(element);
111
+ }
112
+ catch {
113
+ return true;
114
+ }
115
+ return styles.visibility !== 'hidden' && styles.visibility !== 'collapse';
116
+ }
117
+ function scrollIntoViewIfNeeded(scrollContainer, element, direction, orientation) {
118
+ if (!scrollContainer || !element || typeof scrollContainer.scrollTo !== 'function') {
119
+ return;
120
+ }
121
+ const isOverflowingX = scrollContainer.clientWidth < scrollContainer.scrollWidth;
122
+ const isOverflowingY = scrollContainer.clientHeight < scrollContainer.scrollHeight;
123
+ let left = scrollContainer.scrollLeft;
124
+ let top = scrollContainer.scrollTop;
125
+ if (isOverflowingX && orientation !== 'vertical') {
126
+ const elementOffsetLeft = getOffset(scrollContainer, element, 'left');
127
+ const containerStyles = getScrollStyles(scrollContainer);
128
+ const elementStyles = getScrollStyles(element);
129
+ if (elementOffsetLeft - elementStyles.scrollMarginLeft <
130
+ scrollContainer.scrollLeft + containerStyles.scrollPaddingLeft) {
131
+ left = elementOffsetLeft - elementStyles.scrollMarginLeft - containerStyles.scrollPaddingLeft;
132
+ }
133
+ else if (elementOffsetLeft + element.offsetWidth + elementStyles.scrollMarginRight >
134
+ scrollContainer.scrollLeft + scrollContainer.clientWidth - containerStyles.scrollPaddingRight) {
135
+ left =
136
+ elementOffsetLeft +
137
+ element.offsetWidth +
138
+ elementStyles.scrollMarginRight -
139
+ scrollContainer.clientWidth +
140
+ containerStyles.scrollPaddingRight;
141
+ }
142
+ if (direction === 'rtl') {
143
+ left = Math.max(left, 0);
144
+ }
145
+ }
146
+ if (isOverflowingY && orientation !== 'horizontal') {
147
+ const elementOffsetTop = getOffset(scrollContainer, element, 'top');
148
+ const containerStyles = getScrollStyles(scrollContainer);
149
+ const elementStyles = getScrollStyles(element);
150
+ if (elementOffsetTop - elementStyles.scrollMarginTop <
151
+ scrollContainer.scrollTop + containerStyles.scrollPaddingTop) {
152
+ top = elementOffsetTop - elementStyles.scrollMarginTop - containerStyles.scrollPaddingTop;
153
+ }
154
+ else if (elementOffsetTop + element.offsetHeight + elementStyles.scrollMarginBottom >
155
+ scrollContainer.scrollTop + scrollContainer.clientHeight - containerStyles.scrollPaddingBottom) {
156
+ top =
157
+ elementOffsetTop +
158
+ element.offsetHeight +
159
+ elementStyles.scrollMarginBottom -
160
+ scrollContainer.clientHeight +
161
+ containerStyles.scrollPaddingBottom;
162
+ }
163
+ }
164
+ scrollContainer.scrollTo({ left, top, behavior: 'auto' });
165
+ }
166
+ function getOffset(ancestor, element, side) {
167
+ const propName = side === 'left' ? 'offsetLeft' : 'offsetTop';
168
+ let result = 0;
169
+ let current = element;
170
+ while (current?.offsetParent) {
171
+ result += current[propName];
172
+ if (current.offsetParent === ancestor) {
173
+ break;
174
+ }
175
+ current = current.offsetParent;
176
+ }
177
+ return result;
178
+ }
179
+ function getScrollStyles(element) {
180
+ const styles = getComputedStyle(element);
181
+ return {
182
+ scrollMarginTop: parseFloat(styles.scrollMarginTop) || 0,
183
+ scrollMarginRight: parseFloat(styles.scrollMarginRight) || 0,
184
+ scrollMarginBottom: parseFloat(styles.scrollMarginBottom) || 0,
185
+ scrollMarginLeft: parseFloat(styles.scrollMarginLeft) || 0,
186
+ scrollPaddingTop: parseFloat(styles.scrollPaddingTop) || 0,
187
+ scrollPaddingRight: parseFloat(styles.scrollPaddingRight) || 0,
188
+ scrollPaddingBottom: parseFloat(styles.scrollPaddingBottom) || 0,
189
+ scrollPaddingLeft: parseFloat(styles.scrollPaddingLeft) || 0
190
+ };
191
+ }
192
+
193
+ const rootContext = () => {
194
+ const root = inject(RdxCompositeRoot);
195
+ return {
196
+ rootElement: root.elementRef.nativeElement,
197
+ highlightedIndex: root.highlightedIndex.asReadonly(),
198
+ highlightItemOnHover: root.highlightItemOnHover,
199
+ orientation: root.orientation,
200
+ dir: root.dir,
201
+ registerItem: (item) => root.registerItem(item),
202
+ indexOf: (element) => root.indexOf(element),
203
+ isIndexDisabled: (index) => root.isIndexDisabled(index),
204
+ setHighlightedIndex: (index, shouldScrollIntoView) => root.setHighlightedIndex(index, shouldScrollIntoView),
205
+ relayKeyboardEvent: (event) => root.relayKeyboardEvent(event)
206
+ };
207
+ };
208
+ const [injectRdxCompositeRootContext, provideRdxCompositeRootContext] = createContext('RdxCompositeRootContext', 'utils/composite');
209
+ /**
210
+ * Internal Base UI-style composite root for roving index and arrow-key navigation.
211
+ */
212
+ class RdxCompositeRoot {
213
+ constructor() {
214
+ this.elementRef = inject(ElementRef);
215
+ this.registeredItems = signal([], ...(ngDevMode ? [{ debugName: "registeredItems" }] : /* istanbul ignore next */ []));
216
+ this.hasSetInitialIndex = false;
217
+ /** The composite orientation. */
218
+ this.orientationInput = input('both', { ...(ngDevMode ? { debugName: "orientationInput" } : /* istanbul ignore next */ {}), alias: 'orientation' });
219
+ this._orientation = linkedSignal(() => this.orientationInput(), ...(ngDevMode ? [{ debugName: "_orientation" }] : /* istanbul ignore next */ []));
220
+ this.orientation = this._orientation.asReadonly();
221
+ /** Text direction for horizontal arrow-key navigation. */
222
+ this.dirInput = input(undefined, { ...(ngDevMode ? { debugName: "dirInput" } : /* istanbul ignore next */ {}), alias: 'dir' });
223
+ this.effectiveDir = injectDirection(this.dirInput);
224
+ this._dir = linkedSignal(() => this.effectiveDir(), ...(ngDevMode ? [{ debugName: "_dir" }] : /* istanbul ignore next */ []));
225
+ this.dir = this._dir.asReadonly();
226
+ /** Whether arrow-key navigation wraps at the first/last item. */
227
+ this.loopFocusInput = input(true, { ...(ngDevMode ? { debugName: "loopFocusInput" } : /* istanbul ignore next */ {}), alias: 'loopFocus',
228
+ transform: booleanAttribute });
229
+ this._loopFocus = linkedSignal(() => this.loopFocusInput(), ...(ngDevMode ? [{ debugName: "_loopFocus" }] : /* istanbul ignore next */ []));
230
+ this.loopFocus = this._loopFocus.asReadonly();
231
+ /** Enables Home and End keys. */
232
+ this.enableHomeAndEndKeysInput = input(false, { ...(ngDevMode ? { debugName: "enableHomeAndEndKeysInput" } : /* istanbul ignore next */ {}), alias: 'enableHomeAndEndKeys',
233
+ transform: booleanAttribute });
234
+ this._enableHomeAndEndKeys = linkedSignal(() => this.enableHomeAndEndKeysInput(), ...(ngDevMode ? [{ debugName: "_enableHomeAndEndKeys" }] : /* istanbul ignore next */ []));
235
+ this.enableHomeAndEndKeys = this._enableHomeAndEndKeys.asReadonly();
236
+ /** Indices that are skipped by keyboard navigation. */
237
+ this.disabledIndicesInput = input(undefined, { ...(ngDevMode ? { debugName: "disabledIndicesInput" } : /* istanbul ignore next */ {}), alias: 'disabledIndices' });
238
+ this._disabledIndices = linkedSignal(() => this.disabledIndicesInput(), ...(ngDevMode ? [{ debugName: "_disabledIndices" }] : /* istanbul ignore next */ []));
239
+ this.disabledIndices = this._disabledIndices.asReadonly();
240
+ /** Modifier keys that should not block composite navigation. */
241
+ this.modifierKeysInput = input([], { ...(ngDevMode ? { debugName: "modifierKeysInput" } : /* istanbul ignore next */ {}), alias: 'modifierKeys' });
242
+ this._modifierKeys = linkedSignal(() => this.modifierKeysInput(), ...(ngDevMode ? [{ debugName: "_modifierKeys" }] : /* istanbul ignore next */ []));
243
+ this.modifierKeys = this._modifierKeys.asReadonly();
244
+ /** Whether hovering an item should focus it. */
245
+ this.highlightItemOnHover = input(false, { ...(ngDevMode ? { debugName: "highlightItemOnHover" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
246
+ /** Whether handled navigation keys stop propagation. */
247
+ this.stopEventPropagation = input(true, { ...(ngDevMode ? { debugName: "stopEventPropagation" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
248
+ /** The currently highlighted item index. */
249
+ this.highlightedIndex = model(0, ...(ngDevMode ? [{ debugName: "highlightedIndex" }] : /* istanbul ignore next */ []));
250
+ /** Emits when this root changes the highlighted index. */
251
+ this.onHighlightedIndexChange = output();
252
+ /** Emits when the ordered item map changes. */
253
+ this.onMapChange = output();
254
+ this.items = computed(() => sortByDocumentPosition(this.registeredItems()), ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
255
+ this.itemMap = computed(() => {
256
+ const map = new Map();
257
+ this.items().forEach((item, index) => {
258
+ map.set(item.element, { ...(item.metadata() ?? {}), index });
259
+ });
260
+ return map;
261
+ }, ...(ngDevMode ? [{ debugName: "itemMap" }] : /* istanbul ignore next */ []));
262
+ effect(() => {
263
+ const items = this.items();
264
+ if (items.length === 0) {
265
+ return;
266
+ }
267
+ if (!this.hasSetInitialIndex) {
268
+ this.hasSetInitialIndex = true;
269
+ const activeIndex = items.findIndex((item) => item.element.hasAttribute(ACTIVE_COMPOSITE_ITEM));
270
+ if (activeIndex !== -1) {
271
+ this.setHighlightedIndex(activeIndex, true);
272
+ return;
273
+ }
274
+ }
275
+ if (this.isIndexDisabled(this.highlightedIndex())) {
276
+ const firstEnabledIndex = getMinListIndex(this.elements(), this.disabledIndices());
277
+ if (!isIndexOutOfListBounds(items, firstEnabledIndex)) {
278
+ this.setHighlightedIndex(firstEnabledIndex);
279
+ }
280
+ }
281
+ });
282
+ effect(() => {
283
+ this.onMapChange.emit(this.itemMap());
284
+ });
285
+ }
286
+ registerItem(item) {
287
+ this.registeredItems.update((items) => [
288
+ ...items.filter((registered) => registered.element !== item.element),
289
+ item
290
+ ]);
291
+ return () => {
292
+ this.registeredItems.update((items) => items.filter((registered) => registered.element !== item.element));
293
+ };
294
+ }
295
+ indexOf(element) {
296
+ return this.items().findIndex((item) => item.element === element);
297
+ }
298
+ setOrientation(value) {
299
+ this._orientation.set(value);
300
+ }
301
+ setLoopFocus(value) {
302
+ this._loopFocus.set(value);
303
+ }
304
+ setDir(value) {
305
+ this._dir.set(value);
306
+ }
307
+ setEnableHomeAndEndKeys(value) {
308
+ this._enableHomeAndEndKeys.set(value);
309
+ }
310
+ setDisabledIndices(value) {
311
+ this._disabledIndices.set(value);
312
+ }
313
+ setModifierKeys(value) {
314
+ this._modifierKeys.set(value);
315
+ }
316
+ isIndexDisabled(index) {
317
+ return isListIndexDisabled(this.elements(), index, this.disabledIndices());
318
+ }
319
+ setHighlightedIndex(index, shouldScrollIntoView = false) {
320
+ if (this.highlightedIndex() !== index) {
321
+ this.highlightedIndex.set(index);
322
+ this.onHighlightedIndexChange.emit(index);
323
+ }
324
+ if (shouldScrollIntoView) {
325
+ scrollIntoViewIfNeeded(this.elementRef.nativeElement, this.elements()[index], this.dir(), this.orientation());
326
+ }
327
+ }
328
+ relayKeyboardEvent(event) {
329
+ this.handleCompositeKeydown(event, true);
330
+ }
331
+ handleKeydown(event) {
332
+ this.handleCompositeKeydown(event, false);
333
+ }
334
+ handleCompositeKeydown(event, relayed) {
335
+ const relevantKeys = this.enableHomeAndEndKeys() ? COMPOSITE_KEYS : ARROW_KEYS;
336
+ if (!relevantKeys.has(event.key) || isModifierKeySet(event, this.modifierKeys())) {
337
+ return;
338
+ }
339
+ const target = event.target;
340
+ const rootElement = this.elementRef.nativeElement;
341
+ if (!relayed && target instanceof HTMLElement) {
342
+ const closestRoot = target.closest('[rdxCompositeRoot]');
343
+ if (closestRoot && closestRoot !== rootElement) {
344
+ return;
345
+ }
346
+ }
347
+ if (isNativeTextInput(target) && !isElementDisabled(target)) {
348
+ try {
349
+ if (shouldKeepNativeTextInputBehavior(event, target, this.orientation(), this.dir())) {
350
+ return;
351
+ }
352
+ }
353
+ catch {
354
+ return;
355
+ }
356
+ }
357
+ const elements = this.elements();
358
+ if (elements.length === 0) {
359
+ return;
360
+ }
361
+ const nextIndex = this.getNextIndex(event, elements);
362
+ if (nextIndex === this.highlightedIndex() || isIndexOutOfListBounds(elements, nextIndex)) {
363
+ return;
364
+ }
365
+ if (this.stopEventPropagation()) {
366
+ event.stopPropagation();
367
+ }
368
+ event.preventDefault();
369
+ this.setHighlightedIndex(nextIndex, true);
370
+ queueMicrotask(() => {
371
+ this.elements()[nextIndex]?.focus();
372
+ });
373
+ }
374
+ getNextIndex(event, elements) {
375
+ const highlightedIndex = this.highlightedIndex();
376
+ const minIndex = getMinListIndex(elements, this.disabledIndices());
377
+ const maxIndex = getMaxListIndex(elements, this.disabledIndices());
378
+ if (this.enableHomeAndEndKeys()) {
379
+ if (event.key === 'Home') {
380
+ return minIndex;
381
+ }
382
+ if (event.key === 'End') {
383
+ return maxIndex;
384
+ }
385
+ }
386
+ const { forwardKeys, backwardKeys } = getCompositeNavigationKeys(this.orientation(), this.dir());
387
+ const isForward = forwardKeys.includes(event.key);
388
+ const isBackward = backwardKeys.includes(event.key);
389
+ if (!isForward && !isBackward) {
390
+ return highlightedIndex;
391
+ }
392
+ const decrement = isBackward;
393
+ const boundaryIndex = decrement ? minIndex : maxIndex;
394
+ const loopIndex = decrement ? maxIndex : minIndex;
395
+ if (this.loopFocus() && highlightedIndex === boundaryIndex) {
396
+ return loopIndex;
397
+ }
398
+ return findNonDisabledListIndex(elements, {
399
+ startingIndex: highlightedIndex,
400
+ decrement,
401
+ disabledIndices: this.disabledIndices()
402
+ });
403
+ }
404
+ elements() {
405
+ return this.items().map((item) => item.element);
406
+ }
407
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxCompositeRoot, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
408
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxCompositeRoot, isStandalone: true, selector: "[rdxCompositeRoot]", inputs: { orientationInput: { classPropertyName: "orientationInput", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, dirInput: { classPropertyName: "dirInput", publicName: "dir", isSignal: true, isRequired: false, transformFunction: null }, loopFocusInput: { classPropertyName: "loopFocusInput", publicName: "loopFocus", isSignal: true, isRequired: false, transformFunction: null }, enableHomeAndEndKeysInput: { classPropertyName: "enableHomeAndEndKeysInput", publicName: "enableHomeAndEndKeys", isSignal: true, isRequired: false, transformFunction: null }, disabledIndicesInput: { classPropertyName: "disabledIndicesInput", publicName: "disabledIndices", isSignal: true, isRequired: false, transformFunction: null }, modifierKeysInput: { classPropertyName: "modifierKeysInput", publicName: "modifierKeys", isSignal: true, isRequired: false, transformFunction: null }, highlightItemOnHover: { classPropertyName: "highlightItemOnHover", publicName: "highlightItemOnHover", isSignal: true, isRequired: false, transformFunction: null }, stopEventPropagation: { classPropertyName: "stopEventPropagation", publicName: "stopEventPropagation", isSignal: true, isRequired: false, transformFunction: null }, highlightedIndex: { classPropertyName: "highlightedIndex", publicName: "highlightedIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { highlightedIndex: "highlightedIndexChange", onHighlightedIndexChange: "onHighlightedIndexChange", onMapChange: "onMapChange" }, host: { listeners: { "keydown": "handleKeydown($event)" } }, providers: [provideRdxCompositeRootContext(rootContext)], exportAs: ["rdxCompositeRoot"], ngImport: i0 }); }
409
+ }
410
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxCompositeRoot, decorators: [{
411
+ type: Directive,
412
+ args: [{
413
+ selector: '[rdxCompositeRoot]',
414
+ exportAs: 'rdxCompositeRoot',
415
+ providers: [provideRdxCompositeRootContext(rootContext)],
416
+ host: {
417
+ '(keydown)': 'handleKeydown($event)'
418
+ }
419
+ }]
420
+ }], ctorParameters: () => [], propDecorators: { orientationInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], dirInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "dir", required: false }] }], loopFocusInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "loopFocus", required: false }] }], enableHomeAndEndKeysInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableHomeAndEndKeys", required: false }] }], disabledIndicesInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledIndices", required: false }] }], modifierKeysInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "modifierKeys", required: false }] }], highlightItemOnHover: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightItemOnHover", required: false }] }], stopEventPropagation: [{ type: i0.Input, args: [{ isSignal: true, alias: "stopEventPropagation", required: false }] }], highlightedIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightedIndex", required: false }] }, { type: i0.Output, args: ["highlightedIndexChange"] }], onHighlightedIndexChange: [{ type: i0.Output, args: ["onHighlightedIndexChange"] }], onMapChange: [{ type: i0.Output, args: ["onMapChange"] }] } });
421
+
422
+ /**
423
+ * Internal Base UI-style composite item. Registers itself with the nearest composite root and
424
+ * receives the roving `tabindex` from the root's highlighted index.
425
+ */
426
+ class RdxCompositeItem {
427
+ constructor() {
428
+ this.rootContext = injectRdxCompositeRootContext(true);
429
+ this.elementRef = inject(ElementRef);
430
+ /** Arbitrary metadata included in the root's ordered item map. */
431
+ this.metadataInput = input(undefined, { ...(ngDevMode ? { debugName: "metadataInput" } : /* istanbul ignore next */ {}), alias: 'metadata' });
432
+ this._metadata = linkedSignal(() => this.metadataInput(), ...(ngDevMode ? [{ debugName: "_metadata" }] : /* istanbul ignore next */ []));
433
+ this.index = computed(() => this.rootContext?.indexOf(this.elementRef.nativeElement) ?? -1, ...(ngDevMode ? [{ debugName: "index" }] : /* istanbul ignore next */ []));
434
+ this.inRootElement = computed(() => {
435
+ const rootContext = this.rootContext;
436
+ return !!rootContext && rootContext.rootElement.contains(this.elementRef.nativeElement);
437
+ }, ...(ngDevMode ? [{ debugName: "inRootElement" }] : /* istanbul ignore next */ []));
438
+ this.highlighted = computed(() => this.rootContext?.highlightedIndex() === this.index(), ...(ngDevMode ? [{ debugName: "highlighted" }] : /* istanbul ignore next */ []));
439
+ this.tabIndex = computed(() => {
440
+ const rootContext = this.rootContext;
441
+ if (!rootContext || !this.inRootElement()) {
442
+ return null;
443
+ }
444
+ const index = this.index();
445
+ return index !== -1 && rootContext.highlightedIndex() === index && !rootContext.isIndexDisabled(index) ? 0 : -1;
446
+ }, ...(ngDevMode ? [{ debugName: "tabIndex" }] : /* istanbul ignore next */ []));
447
+ effect((onCleanup) => {
448
+ const rootContext = this.rootContext;
449
+ if (!rootContext || !this.inRootElement()) {
450
+ return;
451
+ }
452
+ const element = this.elementRef.nativeElement;
453
+ const unregister = untracked(() => rootContext.registerItem({ element, metadata: this._metadata.asReadonly() }));
454
+ onCleanup(unregister);
455
+ });
456
+ }
457
+ setMetadata(value) {
458
+ this._metadata.set(value);
459
+ }
460
+ handleFocus() {
461
+ const index = this.index();
462
+ if (this.inRootElement() && index !== -1) {
463
+ this.rootContext?.setHighlightedIndex(index);
464
+ }
465
+ }
466
+ handleMouseMove() {
467
+ const rootContext = this.rootContext;
468
+ const index = this.index();
469
+ if (!this.inRootElement() ||
470
+ !rootContext ||
471
+ index === -1 ||
472
+ !rootContext.highlightItemOnHover() ||
473
+ this.highlighted()) {
474
+ return;
475
+ }
476
+ if (!rootContext.isIndexDisabled(index)) {
477
+ this.elementRef.nativeElement.focus();
478
+ }
479
+ }
480
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxCompositeItem, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
481
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxCompositeItem, isStandalone: true, selector: "[rdxCompositeItem]", inputs: { metadataInput: { classPropertyName: "metadataInput", publicName: "metadata", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "focus": "handleFocus()", "mousemove": "handleMouseMove()" }, properties: { "attr.tabindex": "tabIndex()" } }, exportAs: ["rdxCompositeItem"], ngImport: i0 }); }
482
+ }
483
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxCompositeItem, decorators: [{
484
+ type: Directive,
485
+ args: [{
486
+ selector: '[rdxCompositeItem]',
487
+ exportAs: 'rdxCompositeItem',
488
+ host: {
489
+ '[attr.tabindex]': 'tabIndex()',
490
+ '(focus)': 'handleFocus()',
491
+ '(mousemove)': 'handleMouseMove()'
492
+ }
493
+ }]
494
+ }], ctorParameters: () => [], propDecorators: { metadataInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "metadata", required: false }] }] } });
495
+
496
+ const compositeImports = [RdxCompositeRoot, RdxCompositeItem];
497
+ class RdxCompositeModule {
498
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxCompositeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
499
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: RdxCompositeModule, imports: [RdxCompositeRoot, RdxCompositeItem], exports: [RdxCompositeRoot, RdxCompositeItem] }); }
500
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxCompositeModule }); }
501
+ }
502
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxCompositeModule, decorators: [{
503
+ type: NgModule,
504
+ args: [{
505
+ imports: [...compositeImports],
506
+ exports: [...compositeImports]
507
+ }]
508
+ }] });
509
+
510
+ /**
511
+ * Generated bundle index. Do not edit.
512
+ */
513
+
514
+ export { ACTIVE_COMPOSITE_ITEM, ARROW_KEYS, COMPOSITE_KEYS, MODIFIER_KEYS, RdxCompositeItem, RdxCompositeModule, RdxCompositeRoot, compositeImports, findNonDisabledListIndex, getCompositeNavigationKeys, getMaxListIndex, getMinListIndex, injectRdxCompositeRootContext, isElementDisabled, isElementVisible, isIndexOutOfListBounds, isListIndexDisabled, isModifierKeySet, isNativeTextInput, provideRdxCompositeRootContext, scrollIntoViewIfNeeded, shouldKeepNativeTextInputBehavior, sortByDocumentPosition };
515
+ //# sourceMappingURL=radix-ng-primitives-composite.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radix-ng-primitives-composite.mjs","sources":["../../../packages/primitives/composite/src/utils.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 {\n booleanAttribute,\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n model,\n output,\n signal\n} from '@angular/core';\nimport { BooleanInput, createContext, Direction } from '@radix-ng/primitives/core';\nimport { injectDirection } from '@radix-ng/primitives/direction-provider';\nimport {\n RdxCompositeItemMetadata,\n RdxCompositeItemRegistration,\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 sortByDocumentPosition\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 registerItem: (item) => root.registerItem(item),\n indexOf: (element) => root.indexOf(element),\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 providers: [provideRdxCompositeRootContext(rootContext)],\n host: {\n '(keydown)': 'handleKeydown($event)'\n }\n})\nexport class RdxCompositeRoot {\n readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly registeredItems = signal<RdxCompositeItemRegistration[]>([]);\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 = computed(() => sortByDocumentPosition(this.registeredItems()));\n\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 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 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 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.items().map((item) => item.element);\n }\n}\n","import { computed, Directive, effect, ElementRef, inject, input, linkedSignal, untracked } from '@angular/core';\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 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 elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** Arbitrary metadata included in the root'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.rootContext?.indexOf(this.elementRef.nativeElement) ?? -1);\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 constructor() {\n effect((onCleanup) => {\n const rootContext = this.rootContext;\n if (!rootContext || !this.inRootElement()) {\n return;\n }\n\n const element = this.elementRef.nativeElement;\n const unregister = untracked(() =>\n rootContext.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 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 { RdxCompositeRoot } from './src/composite-root';\n\nexport * from './src/composite-item';\nexport * from './src/composite-root';\nexport * from './src/types';\nexport * from './src/utils';\n\nexport const compositeImports = [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":[],"mappings":"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"}