@radix-ng/primitives 1.0.10 → 1.1.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 (65) hide show
  1. package/README.md +26 -5
  2. package/fesm2022/radix-ng-primitives-autocomplete.mjs +88 -21
  3. package/fesm2022/radix-ng-primitives-autocomplete.mjs.map +1 -1
  4. package/fesm2022/radix-ng-primitives-checkbox.mjs +199 -129
  5. package/fesm2022/radix-ng-primitives-checkbox.mjs.map +1 -1
  6. package/fesm2022/radix-ng-primitives-combobox.mjs +203 -52
  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 +352 -24
  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-number-field.mjs +38 -7
  23. package/fesm2022/radix-ng-primitives-number-field.mjs.map +1 -1
  24. package/fesm2022/radix-ng-primitives-popper.mjs +80 -11
  25. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  26. package/fesm2022/radix-ng-primitives-radio.mjs +49 -2
  27. package/fesm2022/radix-ng-primitives-radio.mjs.map +1 -1
  28. package/fesm2022/radix-ng-primitives-scroll-area.mjs +6 -3
  29. package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -1
  30. package/fesm2022/radix-ng-primitives-select.mjs +70 -14
  31. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  32. package/fesm2022/radix-ng-primitives-signal-forms.mjs +27 -11
  33. package/fesm2022/radix-ng-primitives-signal-forms.mjs.map +1 -1
  34. package/fesm2022/radix-ng-primitives-slider.mjs +17 -2
  35. package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
  36. package/fesm2022/radix-ng-primitives-switch.mjs +60 -7
  37. package/fesm2022/radix-ng-primitives-switch.mjs.map +1 -1
  38. package/fesm2022/radix-ng-primitives-time-field.mjs +12 -6
  39. package/fesm2022/radix-ng-primitives-time-field.mjs.map +1 -1
  40. package/fesm2022/radix-ng-primitives-toggle-group.mjs +25 -3
  41. package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
  42. package/package.json +8 -3
  43. package/types/radix-ng-primitives-autocomplete.d.ts +16 -2
  44. package/types/radix-ng-primitives-checkbox.d.ts +66 -44
  45. package/types/radix-ng-primitives-combobox.d.ts +74 -3
  46. package/types/radix-ng-primitives-composite.d.ts +48 -2
  47. package/types/radix-ng-primitives-core.d.ts +212 -96
  48. package/types/radix-ng-primitives-date-field.d.ts +7 -4
  49. package/types/radix-ng-primitives-field.d.ts +55 -8
  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 +45 -4
  53. package/types/radix-ng-primitives-navigation-menu.d.ts +2 -2
  54. package/types/radix-ng-primitives-number-field.d.ts +12 -5
  55. package/types/radix-ng-primitives-popover.d.ts +2 -2
  56. package/types/radix-ng-primitives-popper.d.ts +60 -15
  57. package/types/radix-ng-primitives-preview-card.d.ts +2 -2
  58. package/types/radix-ng-primitives-radio.d.ts +6 -1
  59. package/types/radix-ng-primitives-select.d.ts +25 -4
  60. package/types/radix-ng-primitives-signal-forms.d.ts +22 -8
  61. package/types/radix-ng-primitives-slider.d.ts +2 -1
  62. package/types/radix-ng-primitives-switch.d.ts +19 -3
  63. package/types/radix-ng-primitives-time-field.d.ts +9 -6
  64. package/types/radix-ng-primitives-toggle-group.d.ts +5 -1
  65. package/types/radix-ng-primitives-tooltip.d.ts +2 -2
@@ -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. */
@@ -142,7 +144,7 @@ declare function useComboboxEngine(config: ComboboxEngineConfig): {
142
144
  readonly triggerElement: HTMLElement | null;
143
145
  setTrigger(el: HTMLElement | null): void;
144
146
  orderedItems: Signal<ComboboxItemRef[]>;
145
- visibleItems: Signal<ComboboxItemRef[]>;
147
+ visibleItems: Signal<readonly ComboboxItemRef[]>;
146
148
  visibleCount: Signal<number>;
147
149
  filteredItems: Signal<readonly AcceptableValue[]>;
148
150
  isVisible: (item: ComboboxItemRef) => boolean;
@@ -218,6 +220,9 @@ declare const context: () => {
218
220
  dir: _angular_core.Signal<Direction>;
219
221
  value: _angular_core.ModelSignal<ComboboxValue>;
220
222
  inputValue: _angular_core.ModelSignal<string>;
223
+ name: _angular_core.InputSignal<string | undefined>;
224
+ form: _angular_core.InputSignal<string | undefined>;
225
+ inputOwnsFormValue: _angular_core.Signal<boolean>;
221
226
  open: _angular_core.ModelSignal<boolean>;
222
227
  present: _angular_core.Signal<boolean>;
223
228
  multiple: _angular_core.Signal<boolean>;
@@ -226,6 +231,8 @@ declare const context: () => {
226
231
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
227
232
  requiredState: _angular_core.Signal<boolean>;
228
233
  invalidState: _angular_core.Signal<boolean>;
234
+ pendingState: _angular_core.Signal<boolean>;
235
+ validState: _angular_core.Signal<boolean | null>;
229
236
  touchedState: _angular_core.Signal<boolean>;
230
237
  dirtyState: _angular_core.Signal<boolean>;
231
238
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -293,6 +300,9 @@ declare const injectComboboxRootContext: _radix_ng_primitives_core.InjectContext
293
300
  dir: _angular_core.Signal<Direction>;
294
301
  value: _angular_core.ModelSignal<ComboboxValue>;
295
302
  inputValue: _angular_core.ModelSignal<string>;
303
+ name: _angular_core.InputSignal<string | undefined>;
304
+ form: _angular_core.InputSignal<string | undefined>;
305
+ inputOwnsFormValue: _angular_core.Signal<boolean>;
296
306
  open: _angular_core.ModelSignal<boolean>;
297
307
  present: _angular_core.Signal<boolean>;
298
308
  multiple: _angular_core.Signal<boolean>;
@@ -301,6 +311,8 @@ declare const injectComboboxRootContext: _radix_ng_primitives_core.InjectContext
301
311
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
302
312
  requiredState: _angular_core.Signal<boolean>;
303
313
  invalidState: _angular_core.Signal<boolean>;
314
+ pendingState: _angular_core.Signal<boolean>;
315
+ validState: _angular_core.Signal<boolean | null>;
304
316
  touchedState: _angular_core.Signal<boolean>;
305
317
  dirtyState: _angular_core.Signal<boolean>;
306
318
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -367,6 +379,9 @@ declare const provideComboboxRootContext: (useFactory: () => {
367
379
  dir: _angular_core.Signal<Direction>;
368
380
  value: _angular_core.ModelSignal<ComboboxValue>;
369
381
  inputValue: _angular_core.ModelSignal<string>;
382
+ name: _angular_core.InputSignal<string | undefined>;
383
+ form: _angular_core.InputSignal<string | undefined>;
384
+ inputOwnsFormValue: _angular_core.Signal<boolean>;
370
385
  open: _angular_core.ModelSignal<boolean>;
371
386
  present: _angular_core.Signal<boolean>;
372
387
  multiple: _angular_core.Signal<boolean>;
@@ -375,6 +390,8 @@ declare const provideComboboxRootContext: (useFactory: () => {
375
390
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
376
391
  requiredState: _angular_core.Signal<boolean>;
377
392
  invalidState: _angular_core.Signal<boolean>;
393
+ pendingState: _angular_core.Signal<boolean>;
394
+ validState: _angular_core.Signal<boolean | null>;
378
395
  touchedState: _angular_core.Signal<boolean>;
379
396
  dirtyState: _angular_core.Signal<boolean>;
380
397
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -467,6 +484,8 @@ declare class RdxComboboxRoot extends RdxFormUiControlBase implements ControlVal
467
484
  readonly mode: _angular_core.Signal<"none" | "single" | "multiple">;
468
485
  /** Whether the combobox is in multiple-selection mode. */
469
486
  readonly multiple: _angular_core.Signal<boolean>;
487
+ /** Whether the visible text input owns native serialization in filter-only mode. */
488
+ readonly inputOwnsFormValue: _angular_core.Signal<boolean>;
470
489
  /** In `'none'` mode, whether pressing an item fills the input with its label. */
471
490
  readonly fillInputOnItemPress: _angular_core.InputSignalWithTransform<boolean, unknown>;
472
491
  /** Text direction. */
@@ -478,6 +497,10 @@ declare class RdxComboboxRoot extends RdxFormUiControlBase implements ControlVal
478
497
  readonly readOnly: _angular_core.InputSignalWithTransform<boolean, unknown>;
479
498
  /** Whether a value is required (for forms). */
480
499
  readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
500
+ /** Name used when serializing the committed selection into native `FormData`. */
501
+ readonly name: _angular_core.InputSignal<string | undefined>;
502
+ /** Id of an external form that owns this control. */
503
+ readonly form: _angular_core.InputSignal<string | undefined>;
481
504
  /** Whether keyboard navigation wraps at the list boundaries. */
482
505
  readonly loopFocus: _angular_core.InputSignalWithTransform<boolean, unknown>;
483
506
  /**
@@ -514,6 +537,8 @@ declare class RdxComboboxRoot extends RdxFormUiControlBase implements ControlVal
514
537
  * - `null`: built-in filtering disabled (the consumer controls which items exist).
515
538
  */
516
539
  readonly filter: _angular_core.InputSignal<ComboboxFilter | null | undefined>;
540
+ /** Locale for the default `contains` filter's string comparison. Defaults to the runtime locale. */
541
+ readonly locale: _angular_core.InputSignal<Intl.LocalesArgument>;
517
542
  /** Maximum number of matching items to show. `-1` (default) means no limit. */
518
543
  readonly limit: _angular_core.InputSignalWithTransform<number, unknown>;
519
544
  /**
@@ -539,6 +564,8 @@ declare class RdxComboboxRoot extends RdxFormUiControlBase implements ControlVal
539
564
  readonly isItemEqualToValue: _angular_core.InputSignal<ItemValueComparator<AcceptableValue> | undefined>;
540
565
  /** Converts a value to its display label. Defaults to the matching item's text. */
541
566
  readonly itemToStringLabel: _angular_core.InputSignal<((value: AcceptableValue) => string) | undefined>;
567
+ /** Converts an item value to the string submitted by a native form. */
568
+ readonly itemToStringValue: _angular_core.InputSignal<((value: AcceptableValue) => string) | undefined>;
542
569
  /** Emits before the selection changes; call `eventDetails.cancel()` to veto it. */
543
570
  readonly onValueChange: _angular_core.OutputEmitterRef<RdxComboboxValueChange>;
544
571
  /** Emits before the input text changes; call `eventDetails.cancel()` to veto it. */
@@ -554,9 +581,13 @@ declare class RdxComboboxRoot extends RdxFormUiControlBase implements ControlVal
554
581
  readonly onOpenChangeComplete: _angular_core.OutputEmitterRef<boolean>;
555
582
  private readonly cvaDisabled;
556
583
  readonly disabledState: _angular_core.Signal<boolean>;
584
+ private readonly nativeFormValue;
585
+ private readonly nativeFormControl;
557
586
  readonly requiredState: _angular_core.Signal<boolean>;
558
587
  /** @ignore */
559
588
  readonly invalidState: _angular_core.Signal<boolean>;
589
+ readonly pendingState: _angular_core.Signal<boolean>;
590
+ readonly validState: _angular_core.Signal<boolean | null>;
560
591
  /** @ignore */
561
592
  readonly touchedState: _angular_core.Signal<boolean>;
562
593
  /** @ignore */
@@ -648,7 +679,7 @@ declare class RdxComboboxRoot extends RdxFormUiControlBase implements ControlVal
648
679
  registerOnTouched(fn: () => void): void;
649
680
  setDisabledState(isDisabled: boolean): void;
650
681
  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: {}; }]>;
682
+ 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; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "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; }; "itemToStringValue": { "alias": "itemToStringValue"; "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
683
  }
653
684
 
654
685
  /**
@@ -679,6 +710,9 @@ declare class RdxComboboxInput {
679
710
  dir: _angular_core.Signal<_radix_ng_primitives_core.Direction>;
680
711
  value: _angular_core.ModelSignal<_radix_ng_primitives_combobox.ComboboxValue>;
681
712
  inputValue: _angular_core.ModelSignal<string>;
713
+ name: _angular_core.InputSignal<string | undefined>;
714
+ form: _angular_core.InputSignal<string | undefined>;
715
+ inputOwnsFormValue: _angular_core.Signal<boolean>;
682
716
  open: _angular_core.ModelSignal<boolean>;
683
717
  present: _angular_core.Signal<boolean>;
684
718
  multiple: _angular_core.Signal<boolean>;
@@ -687,6 +721,8 @@ declare class RdxComboboxInput {
687
721
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
688
722
  requiredState: _angular_core.Signal<boolean>;
689
723
  invalidState: _angular_core.Signal<boolean>;
724
+ pendingState: _angular_core.Signal<boolean>;
725
+ validState: _angular_core.Signal<boolean | null>;
690
726
  touchedState: _angular_core.Signal<boolean>;
691
727
  dirtyState: _angular_core.Signal<boolean>;
692
728
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -752,7 +788,6 @@ declare class RdxComboboxInput {
752
788
  readonly id: _angular_core.InputSignal<string>;
753
789
  /** Marks the input as invalid independently of any Field state. */
754
790
  readonly invalid: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
755
- protected readonly invalidState: _angular_core.Signal<boolean>;
756
791
  /**
757
792
  * Tri-state *displayed* validity: the enclosing Field's gated `validState` when inside a `rdxFieldRoot`
758
793
  * (so a field whose `validationMode` defers display (e.g. `onBlur`) keeps the input neutral until revealed), else the input's
@@ -801,6 +836,9 @@ declare class RdxComboboxInputGroup {
801
836
  dir: _angular_core.Signal<_radix_ng_primitives_types_radix_ng_primitives_core.Direction>;
802
837
  value: _angular_core.ModelSignal<_radix_ng_primitives_combobox.ComboboxValue>;
803
838
  inputValue: _angular_core.ModelSignal<string>;
839
+ name: _angular_core.InputSignal<string | undefined>;
840
+ form: _angular_core.InputSignal<string | undefined>;
841
+ inputOwnsFormValue: _angular_core.Signal<boolean>;
804
842
  open: _angular_core.ModelSignal<boolean>;
805
843
  present: _angular_core.Signal<boolean>;
806
844
  multiple: _angular_core.Signal<boolean>;
@@ -809,6 +847,8 @@ declare class RdxComboboxInputGroup {
809
847
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
810
848
  requiredState: _angular_core.Signal<boolean>;
811
849
  invalidState: _angular_core.Signal<boolean>;
850
+ pendingState: _angular_core.Signal<boolean>;
851
+ validState: _angular_core.Signal<boolean | null>;
812
852
  touchedState: _angular_core.Signal<boolean>;
813
853
  dirtyState: _angular_core.Signal<boolean>;
814
854
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -921,6 +961,9 @@ declare class RdxComboboxTrigger {
921
961
  dir: _angular_core.Signal<_radix_ng_primitives_types_radix_ng_primitives_core.Direction>;
922
962
  value: _angular_core.ModelSignal<_radix_ng_primitives_combobox.ComboboxValue>;
923
963
  inputValue: _angular_core.ModelSignal<string>;
964
+ name: _angular_core.InputSignal<string | undefined>;
965
+ form: _angular_core.InputSignal<string | undefined>;
966
+ inputOwnsFormValue: _angular_core.Signal<boolean>;
924
967
  open: _angular_core.ModelSignal<boolean>;
925
968
  present: _angular_core.Signal<boolean>;
926
969
  multiple: _angular_core.Signal<boolean>;
@@ -929,6 +972,8 @@ declare class RdxComboboxTrigger {
929
972
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
930
973
  requiredState: _angular_core.Signal<boolean>;
931
974
  invalidState: _angular_core.Signal<boolean>;
975
+ pendingState: _angular_core.Signal<boolean>;
976
+ validState: _angular_core.Signal<boolean | null>;
932
977
  touchedState: _angular_core.Signal<boolean>;
933
978
  dirtyState: _angular_core.Signal<boolean>;
934
979
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -1022,6 +1067,9 @@ declare class RdxComboboxClear {
1022
1067
  dir: _angular_core.Signal<_radix_ng_primitives_types_radix_ng_primitives_core.Direction>;
1023
1068
  value: _angular_core.ModelSignal<_radix_ng_primitives_combobox.ComboboxValue>;
1024
1069
  inputValue: _angular_core.ModelSignal<string>;
1070
+ name: _angular_core.InputSignal<string | undefined>;
1071
+ form: _angular_core.InputSignal<string | undefined>;
1072
+ inputOwnsFormValue: _angular_core.Signal<boolean>;
1025
1073
  open: _angular_core.ModelSignal<boolean>;
1026
1074
  present: _angular_core.Signal<boolean>;
1027
1075
  multiple: _angular_core.Signal<boolean>;
@@ -1030,6 +1078,8 @@ declare class RdxComboboxClear {
1030
1078
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
1031
1079
  requiredState: _angular_core.Signal<boolean>;
1032
1080
  invalidState: _angular_core.Signal<boolean>;
1081
+ pendingState: _angular_core.Signal<boolean>;
1082
+ validState: _angular_core.Signal<boolean | null>;
1033
1083
  touchedState: _angular_core.Signal<boolean>;
1034
1084
  dirtyState: _angular_core.Signal<boolean>;
1035
1085
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -1152,6 +1202,9 @@ declare class RdxComboboxBackdrop {
1152
1202
  dir: _angular_core.Signal<_radix_ng_primitives_types_radix_ng_primitives_core.Direction>;
1153
1203
  value: _angular_core.ModelSignal<_radix_ng_primitives_combobox.ComboboxValue>;
1154
1204
  inputValue: _angular_core.ModelSignal<string>;
1205
+ name: _angular_core.InputSignal<string | undefined>;
1206
+ form: _angular_core.InputSignal<string | undefined>;
1207
+ inputOwnsFormValue: _angular_core.Signal<boolean>;
1155
1208
  open: _angular_core.ModelSignal<boolean>;
1156
1209
  present: _angular_core.Signal<boolean>;
1157
1210
  multiple: _angular_core.Signal<boolean>;
@@ -1160,6 +1213,8 @@ declare class RdxComboboxBackdrop {
1160
1213
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
1161
1214
  requiredState: _angular_core.Signal<boolean>;
1162
1215
  invalidState: _angular_core.Signal<boolean>;
1216
+ pendingState: _angular_core.Signal<boolean>;
1217
+ validState: _angular_core.Signal<boolean | null>;
1163
1218
  touchedState: _angular_core.Signal<boolean>;
1164
1219
  dirtyState: _angular_core.Signal<boolean>;
1165
1220
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -1254,6 +1309,9 @@ declare class RdxComboboxPopup {
1254
1309
  dir: _angular_core.Signal<_radix_ng_primitives_core.Direction>;
1255
1310
  value: _angular_core.ModelSignal<_radix_ng_primitives_combobox.ComboboxValue>;
1256
1311
  inputValue: _angular_core.ModelSignal<string>;
1312
+ name: _angular_core.InputSignal<string | undefined>;
1313
+ form: _angular_core.InputSignal<string | undefined>;
1314
+ inputOwnsFormValue: _angular_core.Signal<boolean>;
1257
1315
  open: _angular_core.ModelSignal<boolean>;
1258
1316
  present: _angular_core.Signal<boolean>;
1259
1317
  multiple: _angular_core.Signal<boolean>;
@@ -1262,6 +1320,8 @@ declare class RdxComboboxPopup {
1262
1320
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
1263
1321
  requiredState: _angular_core.Signal<boolean>;
1264
1322
  invalidState: _angular_core.Signal<boolean>;
1323
+ pendingState: _angular_core.Signal<boolean>;
1324
+ validState: _angular_core.Signal<boolean | null>;
1265
1325
  touchedState: _angular_core.Signal<boolean>;
1266
1326
  dirtyState: _angular_core.Signal<boolean>;
1267
1327
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -1363,6 +1423,9 @@ declare class RdxComboboxList {
1363
1423
  dir: _angular_core.Signal<_radix_ng_primitives_types_radix_ng_primitives_core.Direction>;
1364
1424
  value: _angular_core.ModelSignal<_radix_ng_primitives_combobox.ComboboxValue>;
1365
1425
  inputValue: _angular_core.ModelSignal<string>;
1426
+ name: _angular_core.InputSignal<string | undefined>;
1427
+ form: _angular_core.InputSignal<string | undefined>;
1428
+ inputOwnsFormValue: _angular_core.Signal<boolean>;
1366
1429
  open: _angular_core.ModelSignal<boolean>;
1367
1430
  present: _angular_core.Signal<boolean>;
1368
1431
  multiple: _angular_core.Signal<boolean>;
@@ -1371,6 +1434,8 @@ declare class RdxComboboxList {
1371
1434
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
1372
1435
  requiredState: _angular_core.Signal<boolean>;
1373
1436
  invalidState: _angular_core.Signal<boolean>;
1437
+ pendingState: _angular_core.Signal<boolean>;
1438
+ validState: _angular_core.Signal<boolean | null>;
1374
1439
  touchedState: _angular_core.Signal<boolean>;
1375
1440
  dirtyState: _angular_core.Signal<boolean>;
1376
1441
  openOnInputClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -1563,6 +1628,7 @@ declare class RdxComboboxGroup {
1563
1628
  private readonly rootContext;
1564
1629
  readonly labelId: _angular_core.WritableSignal<string | undefined>;
1565
1630
  private readonly items;
1631
+ private readonly itemsTick;
1566
1632
  protected readonly hasItems: _angular_core.Signal<boolean>;
1567
1633
  protected readonly hasVisibleItems: _angular_core.Signal<boolean>;
1568
1634
  registerItem(item: ComboboxItemRef): void;
@@ -1613,6 +1679,9 @@ declare class RdxComboboxEmpty {
1613
1679
  dir: _angular_core.Signal<_radix_ng_primitives_types_radix_ng_primitives_core.Direction>;
1614
1680
  value: _angular_core.ModelSignal<_radix_ng_primitives_combobox.ComboboxValue>;
1615
1681
  inputValue: _angular_core.ModelSignal<string>;
1682
+ name: _angular_core.InputSignal<string | undefined>;
1683
+ form: _angular_core.InputSignal<string | undefined>;
1684
+ inputOwnsFormValue: _angular_core.Signal<boolean>;
1616
1685
  open: _angular_core.ModelSignal<boolean>;
1617
1686
  present: _angular_core.Signal<boolean>;
1618
1687
  multiple: _angular_core.Signal<boolean>;
@@ -1621,6 +1690,8 @@ declare class RdxComboboxEmpty {
1621
1690
  readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
1622
1691
  requiredState: _angular_core.Signal<boolean>;
1623
1692
  invalidState: _angular_core.Signal<boolean>;
1693
+ pendingState: _angular_core.Signal<boolean>;
1694
+ validState: _angular_core.Signal<boolean | null>;
1624
1695
  touchedState: _angular_core.Signal<boolean>;
1625
1696
  dirtyState: _angular_core.Signal<boolean>;
1626
1697
  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 };