@radix-ng/primitives 1.0.9 → 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 (65) hide show
  1. package/README.md +26 -5
  2. package/fesm2022/radix-ng-primitives-autocomplete.mjs +35 -19
  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 +46 -21
  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 +189 -26
  11. package/fesm2022/radix-ng-primitives-core.mjs.map +1 -1
  12. package/fesm2022/radix-ng-primitives-date-field.mjs +29 -13
  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-floating-focus-manager.mjs +9 -0
  17. package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs.map +1 -1
  18. package/fesm2022/radix-ng-primitives-focus-scope.mjs +241 -95
  19. package/fesm2022/radix-ng-primitives-focus-scope.mjs.map +1 -1
  20. package/fesm2022/radix-ng-primitives-form.mjs +35 -4
  21. package/fesm2022/radix-ng-primitives-form.mjs.map +1 -1
  22. package/fesm2022/radix-ng-primitives-input.mjs +87 -15
  23. package/fesm2022/radix-ng-primitives-input.mjs.map +1 -1
  24. package/fesm2022/radix-ng-primitives-menu.mjs +131 -16
  25. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  26. package/fesm2022/radix-ng-primitives-navigation-menu.mjs +17 -3
  27. package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
  28. package/fesm2022/radix-ng-primitives-popper.mjs +223 -29
  29. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  30. package/fesm2022/radix-ng-primitives-portal.mjs +16 -5
  31. package/fesm2022/radix-ng-primitives-portal.mjs.map +1 -1
  32. package/fesm2022/radix-ng-primitives-scroll-area.mjs +6 -3
  33. package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -1
  34. package/fesm2022/radix-ng-primitives-select.mjs +49 -17
  35. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  36. package/fesm2022/radix-ng-primitives-signal-forms.mjs +27 -11
  37. package/fesm2022/radix-ng-primitives-signal-forms.mjs.map +1 -1
  38. package/fesm2022/radix-ng-primitives-time-field.mjs +24 -10
  39. package/fesm2022/radix-ng-primitives-time-field.mjs.map +1 -1
  40. package/package.json +8 -7
  41. package/types/radix-ng-primitives-autocomplete.d.ts +7 -2
  42. package/types/radix-ng-primitives-checkbox.d.ts +10 -1
  43. package/types/radix-ng-primitives-combobox.d.ts +29 -2
  44. package/types/radix-ng-primitives-composite.d.ts +48 -2
  45. package/types/radix-ng-primitives-core.d.ts +165 -104
  46. package/types/radix-ng-primitives-date-field.d.ts +21 -8
  47. package/types/radix-ng-primitives-field.d.ts +55 -8
  48. package/types/radix-ng-primitives-floating-focus-manager.d.ts +7 -0
  49. package/types/radix-ng-primitives-focus-scope.d.ts +61 -44
  50. package/types/radix-ng-primitives-form.d.ts +9 -0
  51. package/types/radix-ng-primitives-input.d.ts +10 -2
  52. package/types/radix-ng-primitives-menu.d.ts +59 -7
  53. package/types/radix-ng-primitives-navigation-menu.d.ts +2 -2
  54. package/types/radix-ng-primitives-popover.d.ts +2 -2
  55. package/types/radix-ng-primitives-popper.d.ts +186 -48
  56. package/types/radix-ng-primitives-portal.d.ts +18 -8
  57. package/types/radix-ng-primitives-preview-card.d.ts +2 -2
  58. package/types/radix-ng-primitives-select.d.ts +17 -3
  59. package/types/radix-ng-primitives-signal-forms.d.ts +22 -8
  60. package/types/radix-ng-primitives-time-field.d.ts +21 -10
  61. package/types/radix-ng-primitives-tooltip.d.ts +2 -2
  62. package/fesm2022/radix-ng-primitives-focus-guards.mjs +0 -53
  63. package/fesm2022/radix-ng-primitives-focus-guards.mjs.map +0 -1
  64. package/focus-guards/README.md +0 -1
  65. package/types/radix-ng-primitives-focus-guards.d.ts +0 -15
@@ -92,6 +92,8 @@ interface ComboboxEngineConfig {
92
92
  items: Signal<readonly AcceptableValue[] | undefined>;
93
93
  /** Filter: `undefined` → default contains; a function → custom; `null` → built-in filtering off. */
94
94
  filter: Signal<ComboboxFilter | null | undefined>;
95
+ /** Locale for the default `contains` collator; `undefined` → the runtime's default locale. */
96
+ locale: Signal<Intl.LocalesArgument>;
95
97
  /** Maximum number of matching items to show (`-1` = no limit). */
96
98
  limit: Signal<number>;
97
99
  /** Whether the list is a 2D grid (row/column arrow navigation). Defaults off for plain lists. */
@@ -226,6 +228,8 @@ declare const context: () => {
226
228
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
227
229
  requiredState: _angular_core.Signal<boolean>;
228
230
  invalidState: _angular_core.Signal<boolean>;
231
+ pendingState: _angular_core.Signal<boolean>;
232
+ validState: _angular_core.Signal<boolean | null>;
229
233
  touchedState: _angular_core.Signal<boolean>;
230
234
  dirtyState: _angular_core.Signal<boolean>;
231
235
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -301,6 +305,8 @@ declare const injectComboboxRootContext: _radix_ng_primitives_core.InjectContext
301
305
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
302
306
  requiredState: _angular_core.Signal<boolean>;
303
307
  invalidState: _angular_core.Signal<boolean>;
308
+ pendingState: _angular_core.Signal<boolean>;
309
+ validState: _angular_core.Signal<boolean | null>;
304
310
  touchedState: _angular_core.Signal<boolean>;
305
311
  dirtyState: _angular_core.Signal<boolean>;
306
312
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -375,6 +381,8 @@ declare const provideComboboxRootContext: (useFactory: () => {
375
381
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
376
382
  requiredState: _angular_core.Signal<boolean>;
377
383
  invalidState: _angular_core.Signal<boolean>;
384
+ pendingState: _angular_core.Signal<boolean>;
385
+ validState: _angular_core.Signal<boolean | null>;
378
386
  touchedState: _angular_core.Signal<boolean>;
379
387
  dirtyState: _angular_core.Signal<boolean>;
380
388
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -514,6 +522,8 @@ declare class RdxComboboxRoot extends RdxFormUiControlBase implements ControlVal
514
522
  * - `null`: built-in filtering disabled (the consumer controls which items exist).
515
523
  */
516
524
  readonly filter: _angular_core.InputSignal<ComboboxFilter | null | undefined>;
525
+ /** Locale for the default `contains` filter's string comparison. Defaults to the runtime locale. */
526
+ readonly locale: _angular_core.InputSignal<Intl.LocalesArgument>;
517
527
  /** Maximum number of matching items to show. `-1` (default) means no limit. */
518
528
  readonly limit: _angular_core.InputSignalWithTransform<number, unknown>;
519
529
  /**
@@ -557,6 +567,8 @@ declare class RdxComboboxRoot extends RdxFormUiControlBase implements ControlVal
557
567
  readonly requiredState: _angular_core.Signal<boolean>;
558
568
  /** @ignore */
559
569
  readonly invalidState: _angular_core.Signal<boolean>;
570
+ readonly pendingState: _angular_core.Signal<boolean>;
571
+ readonly validState: _angular_core.Signal<boolean | null>;
560
572
  /** @ignore */
561
573
  readonly touchedState: _angular_core.Signal<boolean>;
562
574
  /** @ignore */
@@ -648,7 +660,7 @@ declare class RdxComboboxRoot extends RdxFormUiControlBase implements ControlVal
648
660
  registerOnTouched(fn: () => void): void;
649
661
  setDisabledState(isDisabled: boolean): void;
650
662
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxComboboxRoot, never>;
651
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxComboboxRoot, "[rdxComboboxRoot]", ["rdxComboboxRoot"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "defaultValue": { "alias": "defaultValue"; "required": false; "isSignal": true; }; "inputValue": { "alias": "inputValue"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "defaultOpen": { "alias": "defaultOpen"; "required": false; "isSignal": true; }; "multipleInput": { "alias": "multiple"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "fillInputOnItemPress": { "alias": "fillInputOnItemPress"; "required": false; "isSignal": true; }; "dirInput": { "alias": "dir"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "loopFocus": { "alias": "loopFocus"; "required": false; "isSignal": true; }; "autoHighlight": { "alias": "autoHighlight"; "required": false; "isSignal": true; }; "highlightItemOnHover": { "alias": "highlightItemOnHover"; "required": false; "isSignal": true; }; "keepHighlight": { "alias": "keepHighlight"; "required": false; "isSignal": true; }; "openOnInputClick": { "alias": "openOnInputClick"; "required": false; "isSignal": true; }; "modal": { "alias": "modal"; "required": false; "isSignal": true; }; "submitOnItemClick": { "alias": "submitOnItemClick"; "required": false; "isSignal": true; }; "filter": { "alias": "filter"; "required": false; "isSignal": true; }; "limit": { "alias": "limit"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "virtualized": { "alias": "virtualized"; "required": false; "isSignal": true; }; "grid": { "alias": "grid"; "required": false; "isSignal": true; }; "isItemEqualToValue": { "alias": "isItemEqualToValue"; "required": false; "isSignal": true; }; "itemToStringLabel": { "alias": "itemToStringLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "inputValue": "inputValueChange"; "open": "openChange"; "onValueChange": "onValueChange"; "onInputValueChange": "onInputValueChange"; "onOpenChange": "onOpenChange"; "onItemHighlighted": "onItemHighlighted"; "onOpenChangeComplete": "onOpenChangeComplete"; }, never, never, true, [{ directive: typeof i1.RdxPopper; inputs: {}; outputs: {}; }]>;
663
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxComboboxRoot, "[rdxComboboxRoot]", ["rdxComboboxRoot"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "defaultValue": { "alias": "defaultValue"; "required": false; "isSignal": true; }; "inputValue": { "alias": "inputValue"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "defaultOpen": { "alias": "defaultOpen"; "required": false; "isSignal": true; }; "multipleInput": { "alias": "multiple"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "fillInputOnItemPress": { "alias": "fillInputOnItemPress"; "required": false; "isSignal": true; }; "dirInput": { "alias": "dir"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "loopFocus": { "alias": "loopFocus"; "required": false; "isSignal": true; }; "autoHighlight": { "alias": "autoHighlight"; "required": false; "isSignal": true; }; "highlightItemOnHover": { "alias": "highlightItemOnHover"; "required": false; "isSignal": true; }; "keepHighlight": { "alias": "keepHighlight"; "required": false; "isSignal": true; }; "openOnInputClick": { "alias": "openOnInputClick"; "required": false; "isSignal": true; }; "modal": { "alias": "modal"; "required": false; "isSignal": true; }; "submitOnItemClick": { "alias": "submitOnItemClick"; "required": false; "isSignal": true; }; "filter": { "alias": "filter"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "limit": { "alias": "limit"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "virtualized": { "alias": "virtualized"; "required": false; "isSignal": true; }; "grid": { "alias": "grid"; "required": false; "isSignal": true; }; "isItemEqualToValue": { "alias": "isItemEqualToValue"; "required": false; "isSignal": true; }; "itemToStringLabel": { "alias": "itemToStringLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "inputValue": "inputValueChange"; "open": "openChange"; "onValueChange": "onValueChange"; "onInputValueChange": "onInputValueChange"; "onOpenChange": "onOpenChange"; "onItemHighlighted": "onItemHighlighted"; "onOpenChangeComplete": "onOpenChangeComplete"; }, never, never, true, [{ directive: typeof i1.RdxPopper; inputs: {}; outputs: {}; }]>;
652
664
  }
653
665
 
654
666
  /**
@@ -687,6 +699,8 @@ declare class RdxComboboxInput {
687
699
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
688
700
  requiredState: _angular_core.Signal<boolean>;
689
701
  invalidState: _angular_core.Signal<boolean>;
702
+ pendingState: _angular_core.Signal<boolean>;
703
+ validState: _angular_core.Signal<boolean | null>;
690
704
  touchedState: _angular_core.Signal<boolean>;
691
705
  dirtyState: _angular_core.Signal<boolean>;
692
706
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -752,7 +766,6 @@ declare class RdxComboboxInput {
752
766
  readonly id: _angular_core.InputSignal<string>;
753
767
  /** Marks the input as invalid independently of any Field state. */
754
768
  readonly invalid: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
755
- protected readonly invalidState: _angular_core.Signal<boolean>;
756
769
  /**
757
770
  * Tri-state *displayed* validity: the enclosing Field's gated `validState` when inside a `rdxFieldRoot`
758
771
  * (so a field whose `validationMode` defers display (e.g. `onBlur`) keeps the input neutral until revealed), else the input's
@@ -809,6 +822,8 @@ declare class RdxComboboxInputGroup {
809
822
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
810
823
  requiredState: _angular_core.Signal<boolean>;
811
824
  invalidState: _angular_core.Signal<boolean>;
825
+ pendingState: _angular_core.Signal<boolean>;
826
+ validState: _angular_core.Signal<boolean | null>;
812
827
  touchedState: _angular_core.Signal<boolean>;
813
828
  dirtyState: _angular_core.Signal<boolean>;
814
829
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -929,6 +944,8 @@ declare class RdxComboboxTrigger {
929
944
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
930
945
  requiredState: _angular_core.Signal<boolean>;
931
946
  invalidState: _angular_core.Signal<boolean>;
947
+ pendingState: _angular_core.Signal<boolean>;
948
+ validState: _angular_core.Signal<boolean | null>;
932
949
  touchedState: _angular_core.Signal<boolean>;
933
950
  dirtyState: _angular_core.Signal<boolean>;
934
951
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -1030,6 +1047,8 @@ declare class RdxComboboxClear {
1030
1047
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
1031
1048
  requiredState: _angular_core.Signal<boolean>;
1032
1049
  invalidState: _angular_core.Signal<boolean>;
1050
+ pendingState: _angular_core.Signal<boolean>;
1051
+ validState: _angular_core.Signal<boolean | null>;
1033
1052
  touchedState: _angular_core.Signal<boolean>;
1034
1053
  dirtyState: _angular_core.Signal<boolean>;
1035
1054
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -1160,6 +1179,8 @@ declare class RdxComboboxBackdrop {
1160
1179
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
1161
1180
  requiredState: _angular_core.Signal<boolean>;
1162
1181
  invalidState: _angular_core.Signal<boolean>;
1182
+ pendingState: _angular_core.Signal<boolean>;
1183
+ validState: _angular_core.Signal<boolean | null>;
1163
1184
  touchedState: _angular_core.Signal<boolean>;
1164
1185
  dirtyState: _angular_core.Signal<boolean>;
1165
1186
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -1262,6 +1283,8 @@ declare class RdxComboboxPopup {
1262
1283
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
1263
1284
  requiredState: _angular_core.Signal<boolean>;
1264
1285
  invalidState: _angular_core.Signal<boolean>;
1286
+ pendingState: _angular_core.Signal<boolean>;
1287
+ validState: _angular_core.Signal<boolean | null>;
1265
1288
  touchedState: _angular_core.Signal<boolean>;
1266
1289
  dirtyState: _angular_core.Signal<boolean>;
1267
1290
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -1371,6 +1394,8 @@ declare class RdxComboboxList {
1371
1394
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
1372
1395
  requiredState: _angular_core.Signal<boolean>;
1373
1396
  invalidState: _angular_core.Signal<boolean>;
1397
+ pendingState: _angular_core.Signal<boolean>;
1398
+ validState: _angular_core.Signal<boolean | null>;
1374
1399
  touchedState: _angular_core.Signal<boolean>;
1375
1400
  dirtyState: _angular_core.Signal<boolean>;
1376
1401
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -1621,6 +1646,8 @@ declare class RdxComboboxEmpty {
1621
1646
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
1622
1647
  requiredState: _angular_core.Signal<boolean>;
1623
1648
  invalidState: _angular_core.Signal<boolean>;
1649
+ pendingState: _angular_core.Signal<boolean>;
1650
+ validState: _angular_core.Signal<boolean | null>;
1624
1651
  touchedState: _angular_core.Signal<boolean>;
1625
1652
  dirtyState: _angular_core.Signal<boolean>;
1626
1653
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -77,14 +77,43 @@ declare const provideRdxCompositeListContext: (useFactory: () => RdxCompositeLis
77
77
  */
78
78
  declare class RdxCompositeList {
79
79
  readonly elementRef: ElementRef<HTMLElement>;
80
- private readonly registeredItems;
80
+ /**
81
+ * Stable element → registration map. Kept as a plain (mutable) Map so a registration is an O(1)
82
+ * `set`/`delete` instead of re-creating the whole array on every mount — with N items each
83
+ * registering, an array copy per item is an O(n^2) mount. `registrationTick` is the reactive
84
+ * trigger: bumped on every register/unregister so `items` re-derives. Mirrors Base UI's composite
85
+ * list (stable map + `mapTick`).
86
+ */
87
+ private readonly registrations;
88
+ private readonly registrationTick;
89
+ /**
90
+ * Bumped when registered items are moved in the DOM without re-registering
91
+ * (e.g. an `@for` reorder that reuses views). Angular does not re-run the item
92
+ * registration effect on such moves, so `registeredItems` is unchanged and the
93
+ * document-order sort would go stale; a MutationObserver detects the move and
94
+ * bumps this tick to force `items` to re-sort. Mirrors Base UI's composite list.
95
+ */
96
+ private readonly reorderTick;
81
97
  /** Emits when the ordered item map changes. */
82
98
  readonly onMapChange: _angular_core.OutputEmitterRef<Map<HTMLElement, RdxCompositeMetadata>>;
83
99
  /** Items registered with this list, sorted in DOM order. */
84
100
  readonly items: _angular_core.Signal<RdxCompositeItemRegistration<RdxCompositeItemMetadata>[]>;
101
+ /**
102
+ * Element → document-order index. Depends only on `items()` (not on any item's metadata), so
103
+ * `indexOf` is an O(1) lookup and rebuilds only when the item set/order changes — the mount hot
104
+ * path where N items each read their index. Keeping metadata out of it avoids invalidating every
105
+ * item's index when a single item's metadata changes.
106
+ */
107
+ private readonly indexMap;
85
108
  /** Ordered metadata keyed by item element. */
86
109
  readonly itemMap: _angular_core.Signal<Map<HTMLElement, RdxCompositeMetadata>>;
87
110
  constructor();
111
+ /**
112
+ * Watches the smallest containers that bound the registered items and re-sorts
113
+ * when a move inverts their document order. Re-established whenever the item set
114
+ * changes; a no-op where `MutationObserver` is unavailable (SSR).
115
+ */
116
+ private observeItemReordering;
88
117
  registerItem<Metadata extends RdxCompositeItemMetadata>(item: RdxCompositeItemRegistration<Metadata>): () => void;
89
118
  indexOf(element: HTMLElement): number;
90
119
  elements(): HTMLElement[];
@@ -139,6 +168,8 @@ declare class RdxCompositeRoot {
139
168
  readonly items: _angular_core.Signal<_radix_ng_primitives_composite.RdxCompositeItemRegistration<_radix_ng_primitives_composite.RdxCompositeItemMetadata>[]>;
140
169
  readonly itemMap: _angular_core.Signal<Map<HTMLElement, RdxCompositeMetadata>>;
141
170
  constructor();
171
+ /** Move the roving tab stop to the first enabled item when the highlighted one is disabled. */
172
+ private moveHighlightOffDisabledItem;
142
173
  indexOf(element: HTMLElement): number;
143
174
  setOrientation(value: RdxCompositeOrientation): void;
144
175
  setLoopFocus(value: boolean): void;
@@ -163,9 +194,24 @@ declare const ACTIVE_COMPOSITE_ITEM = "data-composite-item-active";
163
194
  declare const ARROW_KEYS: Set<string>;
164
195
  declare const COMPOSITE_KEYS: Set<string>;
165
196
  declare const MODIFIER_KEYS: RdxCompositeModifierKey[];
197
+ declare function compareNodeDocumentPosition(a: Node, b: Node): number;
166
198
  declare function sortByDocumentPosition<T extends {
167
199
  element: HTMLElement;
168
200
  }>(items: readonly T[]): T[];
201
+ /**
202
+ * Smallest set of container elements whose child order can change the relative
203
+ * order of the given (already document-sorted) nodes. Observing each adjacent
204
+ * pair's common ancestor catches both direct item moves and wrapper moves at the
205
+ * boundary, mirroring Base UI's composite list observer.
206
+ */
207
+ declare function getAdjacentNodeRoots(nodes: readonly Element[]): Set<Element>;
208
+ /**
209
+ * Whether a batch of mutations moved a node (removed then re-added in the same
210
+ * batch, or reparented so a removed node is still connected) rather than a pure
211
+ * add/remove. Pure adds/removals re-sort through register/unregister and cannot
212
+ * change the relative order of the remaining items.
213
+ */
214
+ declare function hasMovedNode(entries: readonly MutationRecord[]): boolean;
169
215
  declare function isModifierKeySet(event: KeyboardEvent, allowedModifierKeys: readonly RdxCompositeModifierKey[]): boolean;
170
216
  declare function isNativeTextInput(target: EventTarget | null): target is HTMLInputElement | HTMLTextAreaElement;
171
217
  declare function getCompositeNavigationKeys(orientation: RdxCompositeOrientation, dir: Direction): {
@@ -193,5 +239,5 @@ declare class RdxCompositeModule {
193
239
  static ɵinj: _angular_core.ɵɵInjectorDeclaration<RdxCompositeModule>;
194
240
  }
195
241
 
196
- 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 };
242
+ 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 };
197
243
  export type { RdxCompositeItemMetadata, RdxCompositeItemRegistration, RdxCompositeListContext, RdxCompositeMetadata, RdxCompositeModifierKey, RdxCompositeOrientation, RdxCompositeRootContext };