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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/composite/README.md +3 -0
  2. package/fesm2022/radix-ng-primitives-accordion.mjs +20 -44
  3. package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -1
  4. package/fesm2022/radix-ng-primitives-checkbox.mjs +134 -58
  5. package/fesm2022/radix-ng-primitives-checkbox.mjs.map +1 -1
  6. package/fesm2022/radix-ng-primitives-composite.mjs +599 -0
  7. package/fesm2022/radix-ng-primitives-composite.mjs.map +1 -0
  8. package/fesm2022/radix-ng-primitives-drawer.mjs +442 -2
  9. package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
  10. package/fesm2022/radix-ng-primitives-menu.mjs +315 -68
  11. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  12. package/fesm2022/radix-ng-primitives-menubar.mjs +91 -36
  13. package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
  14. package/fesm2022/radix-ng-primitives-navigation-menu.mjs +281 -88
  15. package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
  16. package/fesm2022/radix-ng-primitives-popover.mjs +40 -15
  17. package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
  18. package/fesm2022/radix-ng-primitives-popper.mjs +73 -65
  19. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  20. package/fesm2022/radix-ng-primitives-radio.mjs +63 -27
  21. package/fesm2022/radix-ng-primitives-radio.mjs.map +1 -1
  22. package/fesm2022/radix-ng-primitives-scroll-area.mjs +56 -25
  23. package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -1
  24. package/fesm2022/radix-ng-primitives-select.mjs +59 -29
  25. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  26. package/fesm2022/radix-ng-primitives-slider.mjs +57 -13
  27. package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
  28. package/fesm2022/radix-ng-primitives-tabs.mjs +335 -73
  29. package/fesm2022/radix-ng-primitives-tabs.mjs.map +1 -1
  30. package/fesm2022/radix-ng-primitives-toggle-group.mjs +66 -21
  31. package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
  32. package/fesm2022/radix-ng-primitives-toggle.mjs +29 -11
  33. package/fesm2022/radix-ng-primitives-toggle.mjs.map +1 -1
  34. package/fesm2022/radix-ng-primitives-toolbar.mjs +68 -36
  35. package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
  36. package/navigation-menu/README.md +5 -2
  37. package/package.json +6 -10
  38. package/types/radix-ng-primitives-accordion.d.ts +12 -16
  39. package/types/radix-ng-primitives-checkbox.d.ts +98 -70
  40. package/types/radix-ng-primitives-composite.d.ts +195 -0
  41. package/types/radix-ng-primitives-drawer.d.ts +40 -2
  42. package/types/radix-ng-primitives-menu.d.ts +46 -16
  43. package/types/radix-ng-primitives-menubar.d.ts +12 -5
  44. package/types/radix-ng-primitives-navigation-menu.d.ts +65 -33
  45. package/types/radix-ng-primitives-popover.d.ts +9 -5
  46. package/types/radix-ng-primitives-popper.d.ts +1 -0
  47. package/types/radix-ng-primitives-radio.d.ts +11 -9
  48. package/types/radix-ng-primitives-scroll-area.d.ts +4 -1
  49. package/types/radix-ng-primitives-select.d.ts +46 -32
  50. package/types/radix-ng-primitives-slider.d.ts +19 -4
  51. package/types/radix-ng-primitives-tabs.d.ts +69 -14
  52. package/types/radix-ng-primitives-toggle-group.d.ts +27 -16
  53. package/types/radix-ng-primitives-toggle.d.ts +5 -5
  54. package/types/radix-ng-primitives-toolbar.d.ts +84 -69
  55. package/collection/README.md +0 -1
  56. package/fesm2022/radix-ng-primitives-collection.mjs +0 -72
  57. package/fesm2022/radix-ng-primitives-collection.mjs.map +0 -1
  58. package/fesm2022/radix-ng-primitives-roving-focus.mjs +0 -388
  59. package/fesm2022/radix-ng-primitives-roving-focus.mjs.map +0 -1
  60. package/roving-focus/README.md +0 -3
  61. package/types/radix-ng-primitives-collection.d.ts +0 -44
  62. package/types/radix-ng-primitives-roving-focus.d.ts +0 -187
@@ -2,17 +2,17 @@ import * as _angular_core from '@angular/core';
2
2
  import { TemplateRef, Signal } from '@angular/core';
3
3
  import * as i1 from '@radix-ng/primitives/portal';
4
4
  import * as _radix_ng_primitives_core from '@radix-ng/primitives/core';
5
- import { RdxCancelableChangeEventDetails, RdxTransitionStatus, RdxFloatingRootContext, BooleanInput, NumberInput } from '@radix-ng/primitives/core';
5
+ import { RdxCancelableChangeEventDetails, RdxTransitionStatus, RdxFloatingRootContext, NumberInput } from '@radix-ng/primitives/core';
6
6
  import * as i1$1 from '@radix-ng/primitives/popper';
7
7
  import { RdxPopperContentWrapper } from '@radix-ng/primitives/popper';
8
8
  import * as _radix_ng_primitives_navigation_menu from '@radix-ng/primitives/navigation-menu';
9
- import * as i1$2 from '@radix-ng/primitives/roving-focus';
9
+ import * as i1$2 from '@radix-ng/primitives/composite';
10
10
  import { RdxOutsidePressDomEvent } from '@radix-ng/primitives/dismissable-layer';
11
11
 
12
12
  /**
13
13
  * Structural directive that teleports the navigation menu popup into a container (default
14
14
  * `document.body`) while the menu is open, and keeps it mounted until any CSS exit `@keyframes`
15
- * finishes.
15
+ * finishes. Set `[keepMounted]="true"` to keep the portal mounted while closed.
16
16
  *
17
17
  * Apply it with the `*` microsyntax on the positioner —
18
18
  * `<div *rdxNavigationMenuPortal rdxNavigationMenuPositioner>` — or as an explicit
@@ -20,8 +20,14 @@ import { RdxOutsidePressDomEvent } from '@radix-ng/primitives/dismissable-layer'
20
20
  * `[container]`.
21
21
  */
22
22
  declare class RdxNavigationMenuPortal {
23
+ private readonly rootContext;
24
+ /**
25
+ * Keep the portal mounted while the menu is closed.
26
+ */
27
+ readonly keepMounted: _angular_core.InputSignalWithTransform<boolean, unknown>;
28
+ readonly present: _angular_core.Signal<boolean>;
23
29
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxNavigationMenuPortal, never>;
24
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxNavigationMenuPortal, "ng-template[rdxNavigationMenuPortal]", ["rdxNavigationMenuPortal"], {}, {}, never, never, true, [{ directive: typeof i1.RdxPortalPresence; inputs: { "container": "container"; }; outputs: {}; }]>;
30
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxNavigationMenuPortal, "ng-template[rdxNavigationMenuPortal]", ["rdxNavigationMenuPortal"], { "keepMounted": { "alias": "keepMounted"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.RdxPortalPresence; inputs: { "container": "container"; }; outputs: {}; }]>;
25
31
  }
26
32
  /**
27
33
  * Dev-mode guard: `rdxNavigationMenuPortal` used to be an attribute directive on a `<div>`. It is now
@@ -36,7 +42,7 @@ declare class RdxNavigationMenuPortalMisuseGuard {
36
42
 
37
43
  type NavigationMenuOrientation = 'horizontal' | 'vertical';
38
44
  type NavigationMenuDirection = 'ltr' | 'rtl';
39
- type RdxNavigationMenuOpenChangeReason = 'trigger-hover' | 'trigger-focus' | 'trigger-press' | 'list-navigation' | 'outside-press' | 'focus-out' | 'escape-key' | 'link-select' | 'list-leave' | 'none';
45
+ type RdxNavigationMenuOpenChangeReason = 'trigger-hover' | 'trigger-press' | 'list-navigation' | 'outside-press' | 'focus-out' | 'escape-key' | 'link-select' | 'list-leave' | 'none';
40
46
  type RdxNavigationMenuOpenChangeEventDetails = RdxCancelableChangeEventDetails<RdxNavigationMenuOpenChangeReason>;
41
47
  interface RdxNavigationMenuOpenChange {
42
48
  value: string | null;
@@ -62,7 +68,6 @@ interface RdxNavigationMenuRootContext {
62
68
  readonly baseId: string;
63
69
  readonly orientation: Signal<NavigationMenuOrientation>;
64
70
  readonly dir: Signal<NavigationMenuDirection>;
65
- readonly loop: Signal<boolean>;
66
71
  /** Value of the currently open item, or `null` when closed. */
67
72
  readonly value: Signal<string | null>;
68
73
  /** Value of the previously open item (used for slide-direction morphing). */
@@ -74,7 +79,14 @@ interface RdxNavigationMenuRootContext {
74
79
  /** The active trigger element the popup is anchored to. */
75
80
  readonly trigger: Signal<HTMLElement | undefined>;
76
81
  readonly triggers: Signal<HTMLElement[]>;
82
+ readonly list: Signal<HTMLElement | undefined>;
83
+ readonly contents: Signal<Map<string, RdxNavigationMenuContentEntry>>;
77
84
  readonly activeContent: Signal<RdxNavigationMenuContentEntry | undefined>;
85
+ readonly popup: Signal<HTMLElement | undefined>;
86
+ readonly size: Signal<{
87
+ width: number;
88
+ height: number;
89
+ } | null>;
78
90
  contentId(value: string): string;
79
91
  triggerId(value: string): string;
80
92
  setValue(value: string | null, reason?: RdxNavigationMenuOpenChangeReason, event?: Event): void;
@@ -85,8 +97,14 @@ interface RdxNavigationMenuRootContext {
85
97
  closeOnHover(event?: PointerEvent): void;
86
98
  cancelHoverOpen(): void;
87
99
  cancelHoverClose(): void;
100
+ setSize(size: {
101
+ width: number;
102
+ height: number;
103
+ } | null): void;
88
104
  registerTrigger(value: string, trigger: HTMLElement): () => void;
105
+ registerList(list: HTMLElement): () => void;
89
106
  registerContent(entry: RdxNavigationMenuContentEntry): () => void;
107
+ registerPopup(element: HTMLElement): () => void;
90
108
  registerTransitionElement(element: HTMLElement): () => void;
91
109
  registerViewport(onTriggerChange: (previous: HTMLElement, next: HTMLElement) => void): () => void;
92
110
  }
@@ -127,10 +145,6 @@ declare class RdxNavigationMenuRoot {
127
145
  */
128
146
  readonly dirInput: _angular_core.InputSignal<NavigationMenuDirection | undefined>;
129
147
  readonly dir: _angular_core.Signal<_radix_ng_primitives_core.Direction>;
130
- /**
131
- * Whether keyboard navigation loops from the last item back to the first and vice versa.
132
- */
133
- readonly loop: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
134
148
  /**
135
149
  * How long to wait before opening the menu on hover, in milliseconds.
136
150
  */
@@ -164,7 +178,13 @@ declare class RdxNavigationMenuRoot {
164
178
  readonly present: _angular_core.Signal<boolean>;
165
179
  readonly trigger: _angular_core.WritableSignal<HTMLElement | undefined>;
166
180
  readonly triggers: _angular_core.WritableSignal<HTMLElement[]>;
181
+ readonly list: _angular_core.WritableSignal<HTMLElement | undefined>;
167
182
  readonly contents: _angular_core.WritableSignal<Map<string, RdxNavigationMenuContentEntry>>;
183
+ readonly popup: _angular_core.WritableSignal<HTMLElement | undefined>;
184
+ readonly size: _angular_core.WritableSignal<{
185
+ width: number;
186
+ height: number;
187
+ } | null>;
168
188
  readonly activeContent: _angular_core.Signal<RdxNavigationMenuContentEntry | undefined>;
169
189
  private readonly registeredTriggers;
170
190
  private readonly viewportTriggerChange;
@@ -180,7 +200,13 @@ declare class RdxNavigationMenuRoot {
180
200
  cancelHoverOpen(): void;
181
201
  cancelHoverClose(): void;
182
202
  registerTrigger(value: string, trigger: HTMLElement): () => void;
203
+ registerList(list: HTMLElement): () => void;
183
204
  registerContent(entry: RdxNavigationMenuContentEntry): () => void;
205
+ registerPopup(element: HTMLElement): () => void;
206
+ setSize(size: {
207
+ width: number;
208
+ height: number;
209
+ } | null): void;
184
210
  registerTransitionElement(element: HTMLElement): () => void;
185
211
  registerViewport(onTriggerChange: (previous: HTMLElement, next: HTMLElement) => void): () => boolean;
186
212
  private createOpenChangeEvent;
@@ -190,19 +216,20 @@ declare class RdxNavigationMenuRoot {
190
216
  private clearCloseTimer;
191
217
  private isInsideOpenChild;
192
218
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxNavigationMenuRoot, never>;
193
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxNavigationMenuRoot, "[rdxNavigationMenuRoot]", ["rdxNavigationMenuRoot"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "defaultValue": { "alias": "defaultValue"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "dirInput": { "alias": "dir"; "required": false; "isSignal": true; }; "loop": { "alias": "loop"; "required": false; "isSignal": true; }; "delay": { "alias": "delay"; "required": false; "isSignal": true; }; "closeDelay": { "alias": "closeDelay"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "onValueChange": "onValueChange"; "onOpenChange": "onOpenChange"; "onOpenChangeComplete": "onOpenChangeComplete"; }, never, never, true, [{ directive: typeof i1$1.RdxPopper; inputs: {}; outputs: {}; }, { directive: typeof _radix_ng_primitives_core.RdxFloatingNodeRegistration; inputs: {}; outputs: {}; }]>;
219
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxNavigationMenuRoot, "[rdxNavigationMenuRoot]", ["rdxNavigationMenuRoot"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "defaultValue": { "alias": "defaultValue"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "dirInput": { "alias": "dir"; "required": false; "isSignal": true; }; "delay": { "alias": "delay"; "required": false; "isSignal": true; }; "closeDelay": { "alias": "closeDelay"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "onValueChange": "onValueChange"; "onOpenChange": "onOpenChange"; "onOpenChangeComplete": "onOpenChangeComplete"; }, never, never, true, [{ directive: typeof i1$1.RdxPopper; inputs: {}; outputs: {}; }, { directive: typeof _radix_ng_primitives_core.RdxFloatingNodeRegistration; inputs: {}; outputs: {}; }]>;
194
220
  }
195
221
 
196
222
  /**
197
- * Contains the navigation menu items. Renders as a menubar with roving keyboard focus.
223
+ * Contains the navigation menu items and coordinates composite keyboard focus between triggers.
198
224
  */
199
225
  declare class RdxNavigationMenuList {
200
226
  protected readonly rootContext: _radix_ng_primitives_navigation_menu.RdxNavigationMenuRootContext;
201
- private readonly rovingFocusGroup;
227
+ private readonly compositeRoot;
202
228
  constructor();
229
+ protected onKeydown(event: KeyboardEvent): void;
203
230
  protected onPointerLeave(event: PointerEvent): void;
204
231
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxNavigationMenuList, never>;
205
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxNavigationMenuList, "[rdxNavigationMenuList]", never, {}, {}, never, never, true, [{ directive: typeof i1$2.RdxRovingFocusGroupDirective; inputs: {}; outputs: {}; }]>;
232
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxNavigationMenuList, "[rdxNavigationMenuList]", never, {}, {}, never, never, true, [{ directive: typeof i1$2.RdxCompositeRoot; inputs: {}; outputs: {}; }]>;
206
233
  }
207
234
 
208
235
  /**
@@ -229,8 +256,7 @@ declare class RdxNavigationMenuItem {
229
256
  */
230
257
  declare class RdxNavigationMenuTrigger {
231
258
  protected readonly item: RdxNavigationMenuItem;
232
- private readonly rootContext;
233
- private readonly rovingFocusItem;
259
+ protected readonly rootContext: _radix_ng_primitives_navigation_menu.RdxNavigationMenuRootContext;
234
260
  private readonly elementRef;
235
261
  private readonly document;
236
262
  /**
@@ -246,18 +272,12 @@ declare class RdxNavigationMenuTrigger {
246
272
  protected onClick(event: MouseEvent): void;
247
273
  protected onPointerEnter(event: PointerEvent): void;
248
274
  protected onPointerLeave(event: PointerEvent): void;
249
- /**
250
- * Open-follows-focus: while the menu is already open, moving keyboard focus (arrow keys via
251
- * roving) to another trigger switches the shared popup to that item — matching Base UI, so the
252
- * open menu visibly responds to arrow-key navigation. Focus never *opens* a closed menu.
253
- */
254
- protected onFocus(): void;
255
275
  protected onKeydown(event: KeyboardEvent): void;
256
276
  /** The key that moves focus from the trigger into the open content, based on orientation/dir. */
257
277
  private entryKey;
258
278
  private focusContent;
259
279
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxNavigationMenuTrigger, never>;
260
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxNavigationMenuTrigger, "button[rdxNavigationMenuTrigger]", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "openOnHover": { "alias": "openOnHover"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1$2.RdxRovingFocusItemDirective; inputs: {}; outputs: {}; }]>;
280
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxNavigationMenuTrigger, "button[rdxNavigationMenuTrigger]", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "openOnHover": { "alias": "openOnHover"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1$2.RdxCompositeItem; inputs: {}; outputs: {}; }]>;
261
281
  }
262
282
 
263
283
  /**
@@ -297,10 +317,10 @@ declare class RdxNavigationMenuContent {
297
317
  }
298
318
 
299
319
  /**
300
- * A navigation link. Closes the menu on selection unless prevented.
320
+ * A navigation link. Can close the menu on selection when `closeOnClick` is enabled.
301
321
  *
302
- * Used both as a top-level menubar item and inside content. It is a plain tabbable anchor (not part
303
- * of the menubar's arrow-key roving), matching Base UI.
322
+ * Used both as a top-level navigation item and inside content. Top-level links join the list's
323
+ * composite collection, matching Base UI's CompositeItem-backed NavigationMenu.Link.
304
324
  */
305
325
  declare class RdxNavigationMenuLink {
306
326
  private readonly rootContext;
@@ -320,7 +340,7 @@ declare class RdxNavigationMenuLink {
320
340
  protected onClick(event: Event): void;
321
341
  protected onKeydown(event: KeyboardEvent): void;
322
342
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxNavigationMenuLink, never>;
323
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxNavigationMenuLink, "[rdxNavigationMenuLink]", never, { "active": { "alias": "active"; "required": false; "isSignal": true; }; "closeOnClick": { "alias": "closeOnClick"; "required": false; "isSignal": true; }; }, { "onSelect": "onSelect"; }, never, never, true, never>;
343
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxNavigationMenuLink, "[rdxNavigationMenuLink]", never, { "active": { "alias": "active"; "required": false; "isSignal": true; }; "closeOnClick": { "alias": "closeOnClick"; "required": false; "isSignal": true; }; }, { "onSelect": "onSelect"; }, never, never, true, [{ directive: typeof i1$2.RdxCompositeItem; inputs: {}; outputs: {}; }]>;
324
344
  }
325
345
 
326
346
  /**
@@ -328,6 +348,7 @@ declare class RdxNavigationMenuLink {
328
348
  */
329
349
  declare class RdxNavigationMenuBackdrop {
330
350
  protected readonly rootContext: _radix_ng_primitives_navigation_menu.RdxNavigationMenuRootContext;
351
+ constructor();
331
352
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxNavigationMenuBackdrop, never>;
332
353
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxNavigationMenuBackdrop, "[rdxNavigationMenuBackdrop]", never, {}, {}, never, never, true, never>;
333
354
  }
@@ -362,8 +383,7 @@ declare class RdxNavigationMenuPopup {
362
383
  private readonly elementRef;
363
384
  protected readonly side: _angular_core.Signal<"top" | "right" | "bottom" | "left" | undefined>;
364
385
  protected readonly align: _angular_core.Signal<"start" | "center" | "end" | undefined>;
365
- /** Names the menu after the active trigger so the `role="menu"` element has an accessible name. */
366
- protected readonly labelledBy: _angular_core.Signal<string | undefined>;
386
+ protected readonly id: _angular_core.Signal<string>;
367
387
  /**
368
388
  * Event handler called when the escape key is down. Can be prevented.
369
389
  */
@@ -379,11 +399,15 @@ declare class RdxNavigationMenuPopup {
379
399
  constructor();
380
400
  protected onPointerLeave(event: PointerEvent): void;
381
401
  /**
382
- * Keyboard navigation inside the open panel: Down/Up move between the panel's focusable items in
383
- * DOM order, Home/End jump to the first/last, and Up from the first item returns focus to the
384
- * trigger. (Tab keeps working natively; Escape is handled by the dismissal capability.)
402
+ * Keyboard navigation inside the open panel mirrors Base UI's CompositeRoot-backed content:
403
+ * arrow keys move between panel focusables in DOM order, Home/End jump to the first/last, Up from
404
+ * the first item returns focus to the trigger, and Tab exits the portalled panel through the
405
+ * logical top-level navigation order. Escape is handled by the dismissal capability.
385
406
  */
386
407
  protected onKeydown(event: KeyboardEvent): void;
408
+ private handleTabKey;
409
+ private getNextTopLevelItem;
410
+ private getTopLevelItems;
387
411
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxNavigationMenuPopup, never>;
388
412
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxNavigationMenuPopup, "[rdxNavigationMenuPopup]", never, {}, { "escapeKeyDown": "escapeKeyDown"; "pointerDownOutside": "pointerDownOutside"; "focusOutside": "focusOutside"; }, never, never, true, [{ directive: typeof i1$1.RdxPopperContent; inputs: {}; outputs: {}; }]>;
389
413
  }
@@ -422,13 +446,21 @@ declare class RdxNavigationMenuViewport {
422
446
  height: number;
423
447
  } | null>;
424
448
  private current;
449
+ private readonly rendered;
425
450
  private previousElement;
426
451
  private pendingDirection;
427
452
  private cleanupTimer;
428
453
  private readonly resizeObserver;
429
454
  private readonly activeContent;
455
+ private readonly contents;
430
456
  constructor();
457
+ private sync;
431
458
  private render;
459
+ private createRendered;
460
+ private deactivateCurrent;
461
+ private markCurrent;
462
+ private markInactive;
463
+ private destroyRendered;
432
464
  private startLeave;
433
465
  private removePrevious;
434
466
  private clearCleanupTimer;
@@ -437,7 +469,7 @@ declare class RdxNavigationMenuViewport {
437
469
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxNavigationMenuViewport, "[rdxNavigationMenuViewport]", never, { "forceMount": { "alias": "forceMount"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
438
470
  }
439
471
 
440
- declare const navigationMenuImports: (typeof RdxNavigationMenuPortal)[];
472
+ declare const navigationMenuImports: (typeof RdxNavigationMenuPortalMisuseGuard)[];
441
473
  declare class RdxNavigationMenuModule {
442
474
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxNavigationMenuModule, never>;
443
475
  static ɵmod: _angular_core.ɵɵNgModuleDeclaration<RdxNavigationMenuModule, never, [typeof RdxNavigationMenuRoot, typeof RdxNavigationMenuList, typeof RdxNavigationMenuItem, typeof RdxNavigationMenuTrigger, typeof RdxNavigationMenuIcon, typeof RdxNavigationMenuContent, typeof RdxNavigationMenuLink, typeof RdxNavigationMenuPortal, typeof RdxNavigationMenuPortalMisuseGuard, typeof RdxNavigationMenuBackdrop, typeof RdxNavigationMenuPositioner, typeof RdxNavigationMenuPopup, typeof RdxNavigationMenuArrow, typeof RdxNavigationMenuViewport], [typeof RdxNavigationMenuRoot, typeof RdxNavigationMenuList, typeof RdxNavigationMenuItem, typeof RdxNavigationMenuTrigger, typeof RdxNavigationMenuIcon, typeof RdxNavigationMenuContent, typeof RdxNavigationMenuLink, typeof RdxNavigationMenuPortal, typeof RdxNavigationMenuPortalMisuseGuard, typeof RdxNavigationMenuBackdrop, typeof RdxNavigationMenuPositioner, typeof RdxNavigationMenuPopup, typeof RdxNavigationMenuArrow, typeof RdxNavigationMenuViewport]>;
@@ -311,7 +311,7 @@ declare class RdxPopoverPopup {
311
311
  readonly closeAutoFocus: _angular_core.OutputRef<Event>;
312
312
  constructor();
313
313
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxPopoverPopup, never>;
314
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxPopoverPopup, "[rdxPopoverPopup]", never, {}, { "escapeKeyDown": "escapeKeyDown"; "pointerDownOutside": "pointerDownOutside"; "focusOutside": "focusOutside"; "interactOutside": "interactOutside"; "openAutoFocus": "openAutoFocus"; "closeAutoFocus": "closeAutoFocus"; }, never, never, true, [{ directive: typeof i1$1.RdxPopperContent; inputs: {}; outputs: {}; }, { directive: typeof _radix_ng_primitives_core.RdxFloatingNodeRegistration; inputs: {}; outputs: {}; }, { directive: typeof _radix_ng_primitives_floating_focus_manager.RdxFloatingFocusManager; inputs: {}; outputs: {}; }]>;
314
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxPopoverPopup, "[rdxPopoverPopup]", never, {}, { "escapeKeyDown": "escapeKeyDown"; "pointerDownOutside": "pointerDownOutside"; "focusOutside": "focusOutside"; "interactOutside": "interactOutside"; "openAutoFocus": "openAutoFocus"; "closeAutoFocus": "closeAutoFocus"; }, never, never, true, [{ directive: typeof i1$1.RdxPopperContent; inputs: {}; outputs: {}; }, { directive: typeof _radix_ng_primitives_core.RdxFloatingNodeRegistration; inputs: {}; outputs: {}; }, { directive: typeof _radix_ng_primitives_floating_focus_manager.RdxFloatingFocusManager; inputs: { "initialFocus": "initialFocus"; "returnFocus": "finalFocus"; }; outputs: {}; }]>;
315
315
  }
316
316
 
317
317
  /**
@@ -332,10 +332,12 @@ declare class RdxPopoverArrow {
332
332
  */
333
333
  declare class RdxPopoverTitle {
334
334
  private readonly rootContext;
335
- readonly id: string;
335
+ private readonly generatedId;
336
+ readonly idInput: _angular_core.InputSignal<string | undefined>;
337
+ readonly id: _angular_core.Signal<string>;
336
338
  constructor();
337
339
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxPopoverTitle, never>;
338
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxPopoverTitle, "[rdxPopoverTitle]", never, {}, {}, never, never, true, never>;
340
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxPopoverTitle, "[rdxPopoverTitle]", never, { "idInput": { "alias": "id"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
339
341
  }
340
342
 
341
343
  /**
@@ -343,10 +345,12 @@ declare class RdxPopoverTitle {
343
345
  */
344
346
  declare class RdxPopoverDescription {
345
347
  private readonly rootContext;
346
- readonly id: string;
348
+ private readonly generatedId;
349
+ readonly idInput: _angular_core.InputSignal<string | undefined>;
350
+ readonly id: _angular_core.Signal<string>;
347
351
  constructor();
348
352
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxPopoverDescription, never>;
349
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxPopoverDescription, "[rdxPopoverDescription]", never, {}, {}, never, never, true, never>;
353
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxPopoverDescription, "[rdxPopoverDescription]", never, { "idInput": { "alias": "id"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
350
354
  }
351
355
 
352
356
  /**
@@ -169,6 +169,7 @@ declare class RdxPopperContentWrapper {
169
169
  private readonly detectOverflowOptions;
170
170
  private readonly resolvedAnchor;
171
171
  private readonly position;
172
+ private positionParams;
172
173
  /**
173
174
  * The last successfully computed position, retained while a new one is being computed.
174
175
  *
@@ -2,10 +2,10 @@ import * as _angular_core from '@angular/core';
2
2
  import { ModelSignal, InputSignal, InputSignalWithTransform, Signal, InjectionToken } from '@angular/core';
3
3
  import { ControlValueAccessor } from '@angular/forms';
4
4
  import { BooleanInput, RdxFormValueControl, RdxCancelableChangeEventDetails } from '@radix-ng/primitives/core';
5
- import * as i1 from '@radix-ng/primitives/roving-focus';
6
- import { Orientation } from '@radix-ng/primitives/roving-focus';
5
+ import * as i1 from '@radix-ng/primitives/composite';
7
6
  import * as i1$1 from '@radix-ng/primitives/visually-hidden';
8
7
 
8
+ type RdxRadioValueChangeReason = 'none';
9
9
  interface RadioGroupProps {
10
10
  value: ModelSignal<string | null>;
11
11
  defaultValue: InputSignal<string | undefined>;
@@ -14,23 +14,23 @@ interface RadioGroupProps {
14
14
  disabled: InputSignalWithTransform<boolean, BooleanInput>;
15
15
  readonly: InputSignalWithTransform<boolean, BooleanInput>;
16
16
  required: InputSignalWithTransform<boolean, BooleanInput>;
17
- orientation: InputSignal<Orientation | undefined>;
18
17
  disabledState: Signal<boolean>;
19
18
  }
20
19
  interface RadioGroupDirective extends RadioGroupProps {
21
- select(value: string | null, event?: Event, reason?: string): void;
20
+ select(value: string | null, event?: Event, reason?: RdxRadioValueChangeReason): void;
22
21
  onTouched(): void;
23
22
  setArrowNavigation(value: boolean): void;
24
23
  isArrowNavigation(): boolean;
25
24
  }
26
25
 
27
- type RdxRadioValueChangeReason = 'trigger-press' | 'keyboard' | 'focus' | 'none';
28
26
  type RdxRadioValueChangeEventDetails = RdxCancelableChangeEventDetails<RdxRadioValueChangeReason>;
29
27
  interface RdxRadioValueChangeEvent {
30
28
  value: string;
31
29
  eventDetails: RdxRadioValueChangeEventDetails;
32
30
  }
33
31
  declare class RdxRadioGroupDirective implements RadioGroupProps, RadioGroupDirective, ControlValueAccessor, RdxFormValueControl<string | null> {
32
+ private readonly elementRef;
33
+ private readonly compositeRoot;
34
34
  readonly value: _angular_core.ModelSignal<string | null>;
35
35
  readonly defaultValue: _angular_core.InputSignal<string | undefined>;
36
36
  readonly name: _angular_core.InputSignal<string | undefined>;
@@ -38,7 +38,6 @@ declare class RdxRadioGroupDirective implements RadioGroupProps, RadioGroupDirec
38
38
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
39
39
  readonly readonly: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
40
40
  readonly required: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
41
- readonly orientation: _angular_core.InputSignal<Orientation | undefined>;
42
41
  /**
43
42
  * Event handler called when the value changes.
44
43
  */
@@ -46,6 +45,9 @@ declare class RdxRadioGroupDirective implements RadioGroupProps, RadioGroupDirec
46
45
  private readonly disable;
47
46
  readonly disabledState: _angular_core.Signal<boolean>;
48
47
  private readonly arrowNavigation;
48
+ private readonly itemMetadata;
49
+ private readonly disabledIndices;
50
+ private readonly activeIndex;
49
51
  /**
50
52
  * The callback function to call when the value of the radio group changes.
51
53
  */
@@ -86,7 +88,7 @@ declare class RdxRadioGroupDirective implements RadioGroupProps, RadioGroupDirec
86
88
  isArrowNavigation(): boolean;
87
89
  protected onKeydown(): void;
88
90
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxRadioGroupDirective, never>;
89
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxRadioGroupDirective, "[rdxRadioRoot]", ["rdxRadioRoot"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "defaultValue": { "alias": "defaultValue"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "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; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "onValueChange": "onValueChange"; }, never, never, true, [{ directive: typeof i1.RdxRovingFocusGroupDirective; inputs: { "dir": "dir"; "orientation": "orientation"; "loop": "loop"; }; outputs: {}; }]>;
91
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxRadioGroupDirective, "[rdxRadioRoot]", ["rdxRadioRoot"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "defaultValue": { "alias": "defaultValue"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "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; }; }, { "value": "valueChange"; "onValueChange": "onValueChange"; }, never, never, true, [{ directive: typeof i1.RdxCompositeRoot; inputs: {}; outputs: {}; }]>;
90
92
  }
91
93
 
92
94
  declare const RdxRadioItemToken: InjectionToken<RdxRadioItemDirective>;
@@ -95,7 +97,7 @@ declare class RdxRadioItemDirective {
95
97
  private readonly radioGroup;
96
98
  private readonly elementRef;
97
99
  private readonly renderer;
98
- private readonly rovingFocusItem;
100
+ private readonly compositeItem;
99
101
  private readonly destroyRef;
100
102
  private readonly inputElement;
101
103
  private previousCheckedState;
@@ -126,7 +128,7 @@ declare class RdxRadioItemDirective {
126
128
  private setOptionalAttribute;
127
129
  private setBooleanAttribute;
128
130
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxRadioItemDirective, never>;
129
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxRadioItemDirective, "[rdxRadioItem]", ["rdxRadioItem"], { "value": { "alias": "value"; "required": true; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "nativeButton": { "alias": "nativeButton"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.RdxRovingFocusItemDirective; inputs: { "tabStopId": "id"; "focusable": "focusable"; "active": "active"; "allowShiftKey": "allowShiftKey"; }; outputs: {}; }]>;
131
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxRadioItemDirective, "[rdxRadioItem]", ["rdxRadioItem"], { "value": { "alias": "value"; "required": true; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "nativeButton": { "alias": "nativeButton"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.RdxCompositeItem; inputs: {}; outputs: {}; }]>;
130
132
  }
131
133
 
132
134
  declare class RdxRadioIndicatorDirective {
@@ -42,6 +42,7 @@ interface ScrollAreaRootContext {
42
42
  yStart: number;
43
43
  yEnd: number;
44
44
  }>;
45
+ readonly disableStyleElements: Signal<boolean>;
45
46
  readonly hovering: Signal<boolean>;
46
47
  readonly scrollingX: Signal<boolean>;
47
48
  readonly scrollingY: Signal<boolean>;
@@ -90,6 +91,7 @@ declare class RdxScrollAreaRoot {
90
91
  * Accepts a single number for all edges or an object to configure them individually.
91
92
  */
92
93
  readonly overflowEdgeThreshold: _angular_core.InputSignal<OverflowEdgeThreshold>;
94
+ readonly disableStyleElements: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
93
95
  readonly normalizedThreshold: Signal<{
94
96
  xStart: number;
95
97
  xEnd: number;
@@ -135,7 +137,7 @@ declare class RdxScrollAreaRoot {
135
137
  onTouchModalityChange(event: PointerEvent): void;
136
138
  onPointerEnterOrMove(event: PointerEvent): void;
137
139
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxScrollAreaRoot, never>;
138
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxScrollAreaRoot, "[rdxScrollAreaRoot]", ["rdxScrollAreaRoot"], { "dirInput": { "alias": "dir"; "required": false; "isSignal": true; }; "overflowEdgeThreshold": { "alias": "overflowEdgeThreshold"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
140
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxScrollAreaRoot, "[rdxScrollAreaRoot]", ["rdxScrollAreaRoot"], { "dirInput": { "alias": "dir"; "required": false; "isSignal": true; }; "overflowEdgeThreshold": { "alias": "overflowEdgeThreshold"; "required": false; "isSignal": true; }; "disableStyleElements": { "alias": "disableStyleElements"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
139
141
  }
140
142
 
141
143
  interface ScrollAreaViewportContext {
@@ -155,6 +157,7 @@ declare class RdxScrollAreaViewport {
155
157
  private readonly element;
156
158
  private readonly destroyRef;
157
159
  private readonly isBrowser;
160
+ private readonly cspNonce;
158
161
  private programmaticScroll;
159
162
  private lastMeasuredMetrics;
160
163
  private scrollEndTimer;
@@ -5,14 +5,14 @@ import { AcceptableValue, RdxCancelableChangeEventDetails, RdxFloatingRootContex
5
5
  import * as _radix_ng_primitives_select from '@radix-ng/primitives/select';
6
6
  import * as _radix_ng_primitives_floating_focus_manager from '@radix-ng/primitives/floating-focus-manager';
7
7
  import { RdxInteractionType } from '@radix-ng/primitives/floating-focus-manager';
8
- import * as i1 from '@radix-ng/primitives/collection';
9
- import { RdxCollectionItem } from '@radix-ng/primitives/collection';
8
+ import * as i1 from '@radix-ng/primitives/composite';
9
+ import { RdxCompositeItemRegistration } from '@radix-ng/primitives/composite';
10
10
  import { RdxOutsidePressDomEvent } from '@radix-ng/primitives/dismissable-layer';
11
11
  import * as i1$1 from '@radix-ng/primitives/popper';
12
12
  import { RdxPopperContentWrapper } from '@radix-ng/primitives/popper';
13
13
  import * as _radix_ng_primitives_types_radix_ng_primitives_floating_focus_manager from '@radix-ng/primitives/types/radix-ng-primitives-floating-focus-manager';
14
14
  import * as _radix_ng_primitives_types_radix_ng_primitives_core from '@radix-ng/primitives/types/radix-ng-primitives-core';
15
- import * as _radix_ng_primitives_types_radix_ng_primitives_collection from '@radix-ng/primitives/types/radix-ng-primitives-collection';
15
+ import * as _radix_ng_primitives_types_radix_ng_primitives_composite from '@radix-ng/primitives/types/radix-ng-primitives-composite';
16
16
  import * as i1$2 from '@radix-ng/primitives/portal';
17
17
 
18
18
  declare class RdxSelectGroupLabel {
@@ -107,7 +107,7 @@ type SelectEvent = CustomEvent<{
107
107
  declare class RdxSelectItem {
108
108
  private readonly rootContext;
109
109
  private readonly contentContext;
110
- private readonly collectionItem;
110
+ private readonly listItem;
111
111
  private readonly currentElement;
112
112
  readonly value: _angular_core.InputSignal<any>;
113
113
  readonly textValue: _angular_core.InputSignal<string>;
@@ -121,12 +121,13 @@ declare class RdxSelectItem {
121
121
  readonly textId: string;
122
122
  private readonly afterNextRender;
123
123
  private SELECT_SELECT;
124
+ constructor();
124
125
  onPointerUp(event: PointerEvent | KeyboardEvent): void;
125
126
  onPointerLeave(event: Event): void;
126
127
  onPointerMove(event: Event): void;
127
128
  handleKeyDown(event: Event): void;
128
129
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxSelectItem, never>;
129
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxSelectItem, "[rdxSelectItem]", ["rdxSelectItem"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "textValue": { "alias": "textValue"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.RdxCollectionItem; inputs: { "value": "value"; "disabled": "disabled"; }; outputs: {}; }]>;
130
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxSelectItem, "[rdxSelectItem]", ["rdxSelectItem"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "textValue": { "alias": "textValue"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.RdxCompositeListItem; inputs: {}; outputs: {}; }]>;
130
131
  }
131
132
 
132
133
  declare class RdxSelectItemIndicator {
@@ -180,9 +181,10 @@ declare class RdxSelectItemText {
180
181
  isPositioned: _angular_core.WritableSignal<boolean>;
181
182
  selectedItem: _angular_core.WritableSignal<HTMLElement | undefined>;
182
183
  selectedItemText: _angular_core.WritableSignal<HTMLElement | undefined>;
183
- highlightedItem: _angular_core.Signal<_radix_ng_primitives_types_radix_ng_primitives_collection.RdxCollectionItem<unknown> | null>;
184
- isHighlighted: (item: _radix_ng_primitives_types_radix_ng_primitives_collection.RdxCollectionItem) => boolean;
185
- highlightItem: (item: _radix_ng_primitives_types_radix_ng_primitives_collection.RdxCollectionItem) => void;
184
+ items: _angular_core.Signal<_radix_ng_primitives_types_radix_ng_primitives_composite.RdxCompositeItemRegistration<_radix_ng_primitives_select.RdxSelectItemMetadata>[]>;
185
+ highlightedItem: _angular_core.Signal<_radix_ng_primitives_types_radix_ng_primitives_composite.RdxCompositeItemRegistration<_radix_ng_primitives_select.RdxSelectItemMetadata> | null>;
186
+ isHighlighted: (element: HTMLElement) => boolean;
187
+ highlightItem: (element: HTMLElement) => void;
186
188
  isKeyboardActive: () => boolean;
187
189
  setKeyboardActive: (value: boolean) => void;
188
190
  onViewportChange: (node: any) => void;
@@ -217,15 +219,31 @@ declare class RdxSelectList {
217
219
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxSelectList, "[rdxSelectList]", never, {}, {}, never, never, true, never>;
218
220
  }
219
221
 
222
+ declare const OPEN_KEYS: string[];
223
+ declare const SELECTION_KEYS: string[];
224
+ declare const CONTENT_MARGIN = 10;
225
+ interface RdxSelectItemMetadata {
226
+ [key: string]: unknown;
227
+ value: any;
228
+ disabled: boolean;
229
+ textValue?: string;
230
+ }
231
+ declare function valueComparator<T>(value: T | T[] | undefined, currentValue: T, comparator?: string | ((a: T, b: T) => boolean)): boolean;
232
+ declare function compare<T>(value?: T, currentValue?: T, comparator?: string | ((a: T, b: T) => boolean)): boolean;
233
+ declare function shouldShowPlaceholder(value?: AcceptableValue | AcceptableValue[]): boolean;
234
+ declare function focusFirst(candidates: HTMLElement[]): void;
235
+
236
+ type RdxSelectCompositeItem = RdxCompositeItemRegistration<RdxSelectItemMetadata>;
220
237
  declare const context$1: () => {
221
238
  content: _angular_core.WritableSignal<HTMLElement | null>;
222
239
  viewport: _angular_core.WritableSignal<HTMLElement | undefined>;
223
240
  isPositioned: _angular_core.WritableSignal<boolean>;
224
241
  selectedItem: _angular_core.WritableSignal<HTMLElement | undefined>;
225
242
  selectedItemText: _angular_core.WritableSignal<HTMLElement | undefined>;
226
- highlightedItem: Signal<RdxCollectionItem<unknown> | null>;
227
- isHighlighted: (item: RdxCollectionItem) => boolean;
228
- highlightItem: (item: RdxCollectionItem) => void;
243
+ items: Signal<RdxSelectCompositeItem[]>;
244
+ highlightedItem: Signal<RdxSelectCompositeItem | null>;
245
+ isHighlighted: (element: HTMLElement) => boolean;
246
+ highlightItem: (element: HTMLElement) => void;
229
247
  isKeyboardActive: () => boolean;
230
248
  setKeyboardActive: (value: boolean) => void;
231
249
  onViewportChange: (node: any) => void;
@@ -240,9 +258,10 @@ declare const injectSelectPopupContext: _radix_ng_primitives_core.InjectContext<
240
258
  isPositioned: _angular_core.WritableSignal<boolean>;
241
259
  selectedItem: _angular_core.WritableSignal<HTMLElement | undefined>;
242
260
  selectedItemText: _angular_core.WritableSignal<HTMLElement | undefined>;
243
- highlightedItem: Signal<RdxCollectionItem<unknown> | null>;
244
- isHighlighted: (item: RdxCollectionItem) => boolean;
245
- highlightItem: (item: RdxCollectionItem) => void;
261
+ items: Signal<RdxSelectCompositeItem[]>;
262
+ highlightedItem: Signal<RdxSelectCompositeItem | null>;
263
+ isHighlighted: (element: HTMLElement) => boolean;
264
+ highlightItem: (element: HTMLElement) => void;
246
265
  isKeyboardActive: () => boolean;
247
266
  setKeyboardActive: (value: boolean) => void;
248
267
  onViewportChange: (node: any) => void;
@@ -256,9 +275,10 @@ declare const provideSelectPopupContext: (useFactory: () => {
256
275
  isPositioned: _angular_core.WritableSignal<boolean>;
257
276
  selectedItem: _angular_core.WritableSignal<HTMLElement | undefined>;
258
277
  selectedItemText: _angular_core.WritableSignal<HTMLElement | undefined>;
259
- highlightedItem: Signal<RdxCollectionItem<unknown> | null>;
260
- isHighlighted: (item: RdxCollectionItem) => boolean;
261
- highlightItem: (item: RdxCollectionItem) => void;
278
+ items: Signal<RdxSelectCompositeItem[]>;
279
+ highlightedItem: Signal<RdxSelectCompositeItem | null>;
280
+ isHighlighted: (element: HTMLElement) => boolean;
281
+ highlightItem: (element: HTMLElement) => void;
262
282
  isKeyboardActive: () => boolean;
263
283
  setKeyboardActive: (value: boolean) => void;
264
284
  onViewportChange: (node: any) => void;
@@ -294,7 +314,7 @@ declare class RdxSelectPopup {
294
314
  private readonly floatingContext;
295
315
  private readonly registration;
296
316
  private readonly currentElement;
297
- private readonly collection;
317
+ private readonly compositeList;
298
318
  private readonly injector;
299
319
  readonly rootContext: {
300
320
  triggerElement: _angular_core.WritableSignal<HTMLElement | null>;
@@ -329,22 +349,23 @@ declare class RdxSelectPopup {
329
349
  };
330
350
  /**
331
351
  * The collected items (DOM order). Exposed so the `item-aligned` positioner — now the popup's
332
- * **ancestor** — can read them without injecting {@link RdxCollectionProvider} (which the popup
333
- * provides as a descendant, so an upward `inject` would not find it).
352
+ * **ancestor** — can read them without injecting the composite list (which the popup provides as
353
+ * a descendant, so an upward `inject` would not find it).
334
354
  */
335
- readonly items: Signal<readonly RdxCollectionItem<any>[]>;
355
+ readonly items: Signal<RdxSelectCompositeItem[]>;
336
356
  /**
337
357
  * Highlight-model navigation over the collected items (DOM order). `loop` is disabled so arrow
338
358
  * navigation stops at the first / last item instead of wrapping around — matching native
339
359
  * `<select>` behavior.
340
360
  */
341
- readonly highlight: _radix_ng_primitives_core.ListHighlight<RdxCollectionItem<unknown>>;
361
+ readonly highlight: _radix_ng_primitives_core.ListHighlight<RdxSelectCompositeItem>;
342
362
  readonly selectedItem: _angular_core.WritableSignal<HTMLElement | undefined>;
343
363
  readonly selectedItemText: _angular_core.WritableSignal<HTMLElement | undefined>;
344
364
  readonly firstValidItemFoundRef: _angular_core.WritableSignal<boolean>;
345
365
  readonly viewport: _angular_core.WritableSignal<HTMLElement | undefined>;
346
366
  readonly isPositioned: _angular_core.WritableSignal<boolean>;
347
367
  private keyboardActive;
368
+ private hasHighlightedOpen;
348
369
  /**
349
370
  * Event handler called when the escape key is down.
350
371
  * Can be prevented.
@@ -365,12 +386,13 @@ declare class RdxSelectPopup {
365
386
  constructor();
366
387
  /** Highlights the selected item (or the first enabled one) when the popup opens. */
367
388
  highlightSelectedItem(): void;
389
+ private highlightSelectedItemAfterPositioned;
368
390
  private scrollSelectedIntoView;
369
391
  setKeyboardActive(value: boolean): void;
370
392
  isKeyboardActive(): boolean;
371
393
  handleKeyDown(event: Event): void;
372
394
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxSelectPopup, never>;
373
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxSelectPopup, "[rdxSelectPopup]", never, {}, { "escapeKeyDown": "escapeKeyDown"; "pointerDownOutside": "pointerDownOutside"; }, never, never, true, [{ directive: typeof i1$1.RdxPopperContent; inputs: {}; outputs: {}; }, { directive: typeof _radix_ng_primitives_floating_focus_manager.RdxFloatingFocusManager; inputs: { "returnFocus": "finalFocus"; }; outputs: {}; }, { directive: typeof _radix_ng_primitives_core.RdxFloatingNodeRegistration; inputs: {}; outputs: {}; }, { directive: typeof i1.RdxCollectionProvider; inputs: {}; outputs: {}; }]>;
395
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxSelectPopup, "[rdxSelectPopup]", never, {}, { "escapeKeyDown": "escapeKeyDown"; "pointerDownOutside": "pointerDownOutside"; }, never, never, true, [{ directive: typeof i1$1.RdxPopperContent; inputs: {}; outputs: {}; }, { directive: typeof _radix_ng_primitives_floating_focus_manager.RdxFloatingFocusManager; inputs: { "returnFocus": "finalFocus"; }; outputs: {}; }, { directive: typeof _radix_ng_primitives_core.RdxFloatingNodeRegistration; inputs: {}; outputs: {}; }, { directive: typeof i1.RdxCompositeList; inputs: {}; outputs: {}; }]>;
374
396
  }
375
397
 
376
398
  /**
@@ -688,15 +710,7 @@ declare class RdxSelectValue {
688
710
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxSelectValue, "span[rdxSelectValue]", ["rdxSelectedValue"], { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
689
711
  }
690
712
 
691
- declare const OPEN_KEYS: string[];
692
- declare const SELECTION_KEYS: string[];
693
- declare const CONTENT_MARGIN = 10;
694
- declare function valueComparator<T>(value: T | T[] | undefined, currentValue: T, comparator?: string | ((a: T, b: T) => boolean)): boolean;
695
- declare function compare<T>(value?: T, currentValue?: T, comparator?: string | ((a: T, b: T) => boolean)): boolean;
696
- declare function shouldShowPlaceholder(value?: AcceptableValue | AcceptableValue[]): boolean;
697
- declare function focusFirst(candidates: HTMLElement[]): void;
698
-
699
713
  declare const _importsSelect: (typeof RdxSelectGroupLabel)[];
700
714
 
701
715
  export { CONTENT_MARGIN, OPEN_KEYS, RDX_SELECT_POSITIONER_TOKEN, RdxSelectBackdrop, RdxSelectGroup, RdxSelectGroupLabel, RdxSelectIcon, RdxSelectItem, RdxSelectItemIndicator, RdxSelectItemText, RdxSelectList, RdxSelectPopup, RdxSelectPortal, RdxSelectPortalMisuseGuard, RdxSelectPositioner, RdxSelectRoot, RdxSelectSeparator, RdxSelectTrigger, RdxSelectValue, SELECTION_KEYS, _importsSelect, compare, focusFirst, injectSelectItemContext, injectSelectPopupContext, injectSelectRootContext, provideSelectItemContext, provideSelectPopupContext, provideSelectRootContext, shouldShowPlaceholder, valueComparator };
702
- export type { RdxPositionerImpl, RdxSelectItemContext, RdxSelectOpenChangeEvent, RdxSelectOpenChangeEventDetails, RdxSelectOpenChangeReason, RdxSelectOpenMethod, RdxSelectPopupContext, RdxSelectRootContext, RdxSelectValueChangeEvent, RdxSelectValueChangeEventDetails, RdxSelectValueChangeReason, SelectEvent, SelectOption };
716
+ export type { RdxPositionerImpl, RdxSelectItemContext, RdxSelectItemMetadata, RdxSelectOpenChangeEvent, RdxSelectOpenChangeEventDetails, RdxSelectOpenChangeReason, RdxSelectOpenMethod, RdxSelectPopupContext, RdxSelectRootContext, RdxSelectValueChangeEvent, RdxSelectValueChangeEventDetails, RdxSelectValueChangeReason, SelectEvent, SelectOption };