@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
@@ -198,6 +198,8 @@ interface RdxDrawerRootContext {
198
198
  frontmostHeight: Signal<number>;
199
199
  /** Reports the popup's measured size (px) so the provider can expose it. */
200
200
  reportPopupHeight: (height: number) => void;
201
+ /** Whether the drawer is currently open. */
202
+ open: Signal<boolean>;
201
203
  }
202
204
  declare const injectRdxDrawerRootContext: _radix_ng_primitives_core.InjectContext<RdxDrawerRootContext>;
203
205
  declare const provideRdxDrawerRootContext: (useFactory: () => RdxDrawerRootContext) => i0.Provider;
@@ -334,6 +336,42 @@ declare class RdxDrawerViewport {
334
336
  static ɵdir: i0.ɵɵDirectiveDeclaration<RdxDrawerViewport, "[rdxDrawerViewport]", ["rdxDrawerViewport"], {}, {}, never, never, true, [{ directive: typeof i1.RdxDialogViewport; inputs: {}; outputs: {}; }]>;
335
337
  }
336
338
 
339
+ /**
340
+ * Provides mobile virtual-keyboard handling for bottom-sheet drawers with form fields.
341
+ *
342
+ * Put it on the drawer viewport that contains the popup. The directive writes
343
+ * `--drawer-keyboard-inset` to the host, keeps the focused keyboard input visible when
344
+ * `visualViewport` shrinks, adds temporary scroll slack to the nearest drawer scroller, and uses
345
+ * synchronous tap-to-focus on touch devices so iOS opens the software keyboard reliably.
346
+ */
347
+ declare class RdxDrawerVirtualKeyboardProvider {
348
+ private readonly drawerContext;
349
+ private readonly elementRef;
350
+ private readonly destroyRef;
351
+ private readonly element;
352
+ private pendingKeyboardFocusMoved;
353
+ private keyboardTouchStart;
354
+ private focusedKeyboardTarget;
355
+ private keyboardScrollAdjustment;
356
+ private keyboardFocusFrame;
357
+ constructor();
358
+ protected onTouchStart(event: TouchEvent): void;
359
+ protected onTouchMove(event: TouchEvent): void;
360
+ protected onTouchEnd(event: TouchEvent): void;
361
+ protected resetTouchTrackingState(): void;
362
+ private captureFocusedKeyboardTarget;
363
+ private alignFocusedKeyboardTarget;
364
+ private scheduleKeyboardFocusAlignment;
365
+ private cancelKeyboardFocusFrame;
366
+ private clearFocusedKeyboardTarget;
367
+ private setDrawerKeyboardInset;
368
+ private resetDrawerKeyboardInset;
369
+ private setKeyboardScrollSlack;
370
+ private restoreKeyboardScrollAdjustment;
371
+ static ɵfac: i0.ɵɵFactoryDeclaration<RdxDrawerVirtualKeyboardProvider, never>;
372
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RdxDrawerVirtualKeyboardProvider, "[rdxDrawerVirtualKeyboardProvider]", ["rdxDrawerVirtualKeyboardProvider"], {}, {}, never, never, true, never>;
373
+ }
374
+
337
375
  /**
338
376
  * A container for the drawer contents.
339
377
  *
@@ -445,9 +483,9 @@ declare function createRdxDrawerHandle<Payload = unknown>(): RdxDrawerHandle<Pay
445
483
  declare const drawerImports: (typeof RdxDrawerProviderDirective)[];
446
484
  declare class RdxDrawerModule {
447
485
  static ɵfac: i0.ɵɵFactoryDeclaration<RdxDrawerModule, never>;
448
- static ɵmod: i0.ɵɵNgModuleDeclaration<RdxDrawerModule, never, [typeof RdxDrawerProviderDirective, typeof RdxDrawerRoot, typeof RdxDrawerTrigger, typeof RdxDrawerSwipeArea, typeof RdxDrawerPortal, typeof RdxDrawerPortalMisuseGuard, typeof RdxDrawerBackdrop, typeof RdxDrawerViewport, typeof RdxDrawerPopup, typeof RdxDrawerContent, typeof RdxDrawerTitle, typeof RdxDrawerDescription, typeof RdxDrawerClose, typeof RdxDrawerIndent, typeof RdxDrawerIndentBackground], [typeof RdxDrawerProviderDirective, typeof RdxDrawerRoot, typeof RdxDrawerTrigger, typeof RdxDrawerSwipeArea, typeof RdxDrawerPortal, typeof RdxDrawerPortalMisuseGuard, typeof RdxDrawerBackdrop, typeof RdxDrawerViewport, typeof RdxDrawerPopup, typeof RdxDrawerContent, typeof RdxDrawerTitle, typeof RdxDrawerDescription, typeof RdxDrawerClose, typeof RdxDrawerIndent, typeof RdxDrawerIndentBackground]>;
486
+ static ɵmod: i0.ɵɵNgModuleDeclaration<RdxDrawerModule, never, [typeof RdxDrawerProviderDirective, typeof RdxDrawerRoot, typeof RdxDrawerTrigger, typeof RdxDrawerSwipeArea, typeof RdxDrawerPortal, typeof RdxDrawerPortalMisuseGuard, typeof RdxDrawerBackdrop, typeof RdxDrawerViewport, typeof RdxDrawerVirtualKeyboardProvider, typeof RdxDrawerPopup, typeof RdxDrawerContent, typeof RdxDrawerTitle, typeof RdxDrawerDescription, typeof RdxDrawerClose, typeof RdxDrawerIndent, typeof RdxDrawerIndentBackground], [typeof RdxDrawerProviderDirective, typeof RdxDrawerRoot, typeof RdxDrawerTrigger, typeof RdxDrawerSwipeArea, typeof RdxDrawerPortal, typeof RdxDrawerPortalMisuseGuard, typeof RdxDrawerBackdrop, typeof RdxDrawerViewport, typeof RdxDrawerVirtualKeyboardProvider, typeof RdxDrawerPopup, typeof RdxDrawerContent, typeof RdxDrawerTitle, typeof RdxDrawerDescription, typeof RdxDrawerClose, typeof RdxDrawerIndent, typeof RdxDrawerIndentBackground]>;
449
487
  static ɵinj: i0.ɵɵInjectorDeclaration<RdxDrawerModule>;
450
488
  }
451
489
 
452
- export { RdxDrawerBackdrop, RdxDrawerClose, RdxDrawerContent, RdxDrawerDescription, RdxDrawerHandle, RdxDrawerIndent, RdxDrawerIndentBackground, RdxDrawerModule, RdxDrawerPopup, RdxDrawerPortal, RdxDrawerPortalMisuseGuard, RdxDrawerProvider, RdxDrawerProviderDirective, RdxDrawerRoot, RdxDrawerSwipeArea, RdxDrawerTitle, RdxDrawerTrigger, RdxDrawerViewport, buildSnapEntries, createRdxDrawerHandle, dismissUnitVector, drawerImports, injectRdxDrawerRootContext, provideRdxDrawerProvider, provideRdxDrawerRootContext, resolveSnapTarget, snapPointReveal, useDrawerSwipe };
490
+ export { RdxDrawerBackdrop, RdxDrawerClose, RdxDrawerContent, RdxDrawerDescription, RdxDrawerHandle, RdxDrawerIndent, RdxDrawerIndentBackground, RdxDrawerModule, RdxDrawerPopup, RdxDrawerPortal, RdxDrawerPortalMisuseGuard, RdxDrawerProvider, RdxDrawerProviderDirective, RdxDrawerRoot, RdxDrawerSwipeArea, RdxDrawerTitle, RdxDrawerTrigger, RdxDrawerViewport, RdxDrawerVirtualKeyboardProvider, buildSnapEntries, createRdxDrawerHandle, dismissUnitVector, drawerImports, injectRdxDrawerRootContext, provideRdxDrawerProvider, provideRdxDrawerRootContext, resolveSnapTarget, snapPointReveal, useDrawerSwipe };
453
491
  export type { RdxDrawerRegistration, RdxDrawerRelease, RdxDrawerRootContext, RdxDrawerSnapEntry, RdxDrawerSnapPoint, RdxDrawerSnapResolveOptions, RdxDrawerSnapTarget, RdxDrawerSwipeConfig, RdxDrawerSwipeDirection };
@@ -7,7 +7,8 @@ import { RdxInteractionType } from '@radix-ng/primitives/floating-focus-manager'
7
7
  import * as i1 from '@radix-ng/primitives/popper';
8
8
  import { RdxPopperContentWrapper } from '@radix-ng/primitives/popper';
9
9
  import * as _radix_ng_primitives_menu from '@radix-ng/primitives/menu';
10
- import * as i1$1 from '@radix-ng/primitives/portal';
10
+ import * as i1$1 from '@radix-ng/primitives/composite';
11
+ import * as i1$2 from '@radix-ng/primitives/portal';
11
12
  import { RdxOutsidePressDomEvent } from '@radix-ng/primitives/dismissable-layer';
12
13
 
13
14
  type RdxMenuTransitionStatus = 'starting' | 'ending' | undefined;
@@ -47,6 +48,7 @@ interface RdxMenuOpenChange {
47
48
  interface RdxMenuRootContext {
48
49
  isOpen: Signal<boolean>;
49
50
  present: Signal<boolean>;
51
+ activeIndex: Signal<number | null>;
50
52
  disabled: Signal<boolean>;
51
53
  modal: Signal<boolean>;
52
54
  loopFocus: Signal<boolean>;
@@ -74,6 +76,7 @@ interface RdxMenuRootContext {
74
76
  beforeContentFocusGuard: Signal<HTMLElement | null>;
75
77
  transitionStatus: Signal<RdxMenuTransitionStatus>;
76
78
  close: (reason?: RdxMenuOpenChangeReason, event?: Event) => void;
79
+ setActiveIndex: (index: number | null) => void;
77
80
  /** Close this menu and every ancestor — used by item selection (the whole menu dismisses). */
78
81
  closeEntireMenu: (reason?: RdxMenuOpenChangeReason, event?: Event) => void;
79
82
  toggle: (reason?: RdxMenuOpenChangeReason, event?: Event) => void;
@@ -135,7 +138,7 @@ declare const provideRdxMenuRootContext: (useFactory: () => RdxMenuRootContext)
135
138
  */
136
139
  declare class RdxMenuRoot {
137
140
  private readonly popper;
138
- private readonly parentRoot;
141
+ readonly parentRoot: RdxMenuRoot | null;
139
142
  private readonly providedDirection;
140
143
  /**
141
144
  * The shared per-popup floating context (ADR 0015 §1) — `open` mirrors this menu's open state, the
@@ -178,6 +181,7 @@ declare class RdxMenuRoot {
178
181
  readonly popupElement: _angular_core.WritableSignal<HTMLElement | undefined>;
179
182
  readonly beforeContentFocusGuard: _angular_core.WritableSignal<HTMLElement | null>;
180
183
  readonly transitionStatus: Signal<_radix_ng_primitives_core.RdxTransitionStatus>;
184
+ readonly activeIndex: _angular_core.WritableSignal<number | null>;
181
185
  /** Whether the popup grabs focus when it opens. Set false for menubar hover-switching. */
182
186
  readonly autoFocus: _angular_core.WritableSignal<RdxMenuAutoFocus>;
183
187
  readonly isSubmenu: _angular_core.WritableSignal<boolean>;
@@ -209,6 +213,7 @@ declare class RdxMenuRoot {
209
213
  close(reason?: RdxMenuOpenChangeReason, event?: Event): void;
210
214
  toggle(reason?: RdxMenuOpenChangeReason, event?: Event): void;
211
215
  markAsContextMenu(): void;
216
+ setActiveIndex(index: number | null): void;
212
217
  setAllowMouseUpTrigger(value: boolean): void;
213
218
  /**
214
219
  * Close this menu **and every ancestor menu** in the chain. Selecting an item dismisses the whole
@@ -226,6 +231,7 @@ declare class RdxMenuRoot {
226
231
  markAsSubmenu(): void;
227
232
  closeParent(): void;
228
233
  private createOpenChangeEvent;
234
+ private focusOpenPopup;
229
235
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuRoot, never>;
230
236
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuRoot, "[rdxMenuRoot],[rdxMenuSubmenuRoot]", ["rdxMenuRoot"], { "open": { "alias": "open"; "required": false; "isSignal": true; }; "defaultOpen": { "alias": "defaultOpen"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "modal": { "alias": "modal"; "required": false; "isSignal": true; }; "loopFocus": { "alias": "loopFocus"; "required": false; "isSignal": true; }; "highlightItemOnHover": { "alias": "highlightItemOnHover"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "dirInput": { "alias": "dir"; "required": false; "isSignal": true; }; "closeParentOnEsc": { "alias": "closeParentOnEsc"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "onOpenChange": "onOpenChange"; "onOpenChangeComplete": "onOpenChangeComplete"; }, never, never, true, [{ directive: typeof i1.RdxPopper; inputs: {}; outputs: {}; }]>;
231
237
  }
@@ -294,6 +300,8 @@ declare class RdxMenuTrigger {
294
300
  declare class RdxMenuSubTrigger {
295
301
  protected readonly submenuContext: _radix_ng_primitives_menu.RdxMenuRootContext;
296
302
  private readonly submenuRoot;
303
+ protected readonly parentMenuRoot: RdxMenuRoot | null;
304
+ private readonly listItem;
297
305
  private readonly elementRef;
298
306
  private readonly destroyRef;
299
307
  private readonly isBrowser;
@@ -317,7 +325,7 @@ declare class RdxMenuSubTrigger {
317
325
  readonly closeDelay: _angular_core.InputSignalWithTransform<number | undefined, NumberInput>;
318
326
  /** Explicit typeahead label. When set, overrides textContent for character search. */
319
327
  readonly label: _angular_core.InputSignal<string | undefined>;
320
- /** Highlighted when focused OR while the submenu is open. */
328
+ /** Highlighted when active in the parent menu or while the submenu is open. */
321
329
  protected readonly highlighted: _angular_core.Signal<boolean>;
322
330
  protected readonly effectiveDisabled: _angular_core.Signal<boolean>;
323
331
  protected readonly nativeButtonState: _angular_core.Signal<boolean>;
@@ -335,8 +343,10 @@ declare class RdxMenuSubTrigger {
335
343
  private closeSiblingSubmenus;
336
344
  private clearSiblingHighlights;
337
345
  private focusFirstSubmenuItem;
346
+ private setParentActiveIndex;
347
+ private clearParentActiveIndex;
338
348
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuSubTrigger, never>;
339
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuSubTrigger, "[rdxMenuSubTrigger]", ["rdxMenuSubTrigger"], { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "nativeButton": { "alias": "nativeButton"; "required": false; "isSignal": true; }; "openOnHover": { "alias": "openOnHover"; "required": false; "isSignal": true; }; "delay": { "alias": "delay"; "required": false; "isSignal": true; }; "closeDelay": { "alias": "closeDelay"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.RdxPopperAnchor; inputs: {}; outputs: {}; }]>;
349
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuSubTrigger, "[rdxMenuSubTrigger]", ["rdxMenuSubTrigger"], { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "nativeButton": { "alias": "nativeButton"; "required": false; "isSignal": true; }; "openOnHover": { "alias": "openOnHover"; "required": false; "isSignal": true; }; "delay": { "alias": "delay"; "required": false; "isSignal": true; }; "closeDelay": { "alias": "closeDelay"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.RdxPopperAnchor; inputs: {}; outputs: {}; }, { directive: typeof i1$1.RdxCompositeListItem; inputs: {}; outputs: {}; }]>;
340
350
  }
341
351
 
342
352
  /**
@@ -350,7 +360,7 @@ declare class RdxMenuSubTrigger {
350
360
  */
351
361
  declare class RdxMenuPortal {
352
362
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuPortal, never>;
353
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuPortal, "ng-template[rdxMenuPortal]", ["rdxMenuPortal"], {}, {}, never, never, true, [{ directive: typeof i1$1.RdxPortalPresence; inputs: { "container": "container"; }; outputs: {}; }]>;
363
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuPortal, "ng-template[rdxMenuPortal]", ["rdxMenuPortal"], {}, {}, never, never, true, [{ directive: typeof i1$2.RdxPortalPresence; inputs: { "container": "container"; }; outputs: {}; }]>;
354
364
  }
355
365
  /**
356
366
  * Dev-mode guard: `rdxMenuPortal` is a structural directive. The old `<div rdxMenuPortal>` markup
@@ -386,11 +396,12 @@ declare class RdxMenuPopup {
386
396
  private readonly registration;
387
397
  private readonly focusManager;
388
398
  private readonly focusScope;
399
+ private readonly compositeList;
389
400
  private readonly wrapper;
390
401
  private readonly elementRef;
391
402
  private search;
392
403
  private searchTimer;
393
- protected readonly align: _angular_core.Signal<"end" | "start" | "center" | undefined>;
404
+ protected readonly align: _angular_core.Signal<"center" | "end" | "start" | undefined>;
394
405
  protected readonly side: _angular_core.Signal<"top" | "right" | "bottom" | "left" | undefined>;
395
406
  /**
396
407
  * Event handler called when the escape key is pressed. Can be prevented.
@@ -421,8 +432,11 @@ declare class RdxMenuPopup {
421
432
  protected handleKeydown(event: KeyboardEvent): void;
422
433
  private scheduleSubmenuKeyboardFocus;
423
434
  private applySubmenuKeyboardFocus;
435
+ private menuItems;
436
+ private currentItemIndex;
437
+ private focusMenuItem;
424
438
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuPopup, never>;
425
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuPopup, "[rdxMenuPopup]", ["rdxMenuPopup"], {}, { "escapeKeyDown": "escapeKeyDown"; "pointerDownOutside": "pointerDownOutside"; "focusOutside": "focusOutside"; "interactOutside": "interactOutside"; "openAutoFocus": "openAutoFocus"; "closeAutoFocus": "closeAutoFocus"; }, never, never, true, [{ directive: typeof i1.RdxPopperContent; inputs: {}; outputs: {}; }, { directive: typeof _radix_ng_primitives_core.RdxFloatingNodeRegistration; inputs: {}; outputs: {}; }, { directive: typeof _radix_ng_primitives_floating_focus_manager.RdxFloatingFocusManager; inputs: {}; outputs: {}; }]>;
439
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuPopup, "[rdxMenuPopup]", ["rdxMenuPopup"], {}, { "escapeKeyDown": "escapeKeyDown"; "pointerDownOutside": "pointerDownOutside"; "focusOutside": "focusOutside"; "interactOutside": "interactOutside"; "openAutoFocus": "openAutoFocus"; "closeAutoFocus": "closeAutoFocus"; }, never, never, true, [{ directive: typeof i1.RdxPopperContent; inputs: {}; outputs: {}; }, { directive: typeof _radix_ng_primitives_core.RdxFloatingNodeRegistration; inputs: {}; outputs: {}; }, { directive: typeof _radix_ng_primitives_floating_focus_manager.RdxFloatingFocusManager; inputs: {}; outputs: {}; }, { directive: typeof i1$1.RdxCompositeList; inputs: {}; outputs: {}; }]>;
426
440
  }
427
441
 
428
442
  /**
@@ -476,7 +490,7 @@ declare class RdxMenuArrow {
476
490
  protected readonly rootContext: _radix_ng_primitives_menu.RdxMenuRootContext;
477
491
  private readonly wrapper;
478
492
  protected readonly side: _angular_core.Signal<"top" | "right" | "bottom" | "left" | undefined>;
479
- protected readonly align: _angular_core.Signal<"end" | "start" | "center" | undefined>;
493
+ protected readonly align: _angular_core.Signal<"center" | "end" | "start" | undefined>;
480
494
  protected readonly uncentered: _angular_core.Signal<boolean>;
481
495
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuArrow, never>;
482
496
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuArrow, "[rdxMenuArrow]", ["rdxMenuArrow"], {}, {}, never, never, true, [{ directive: typeof i1.RdxPopperArrow; inputs: {}; outputs: {}; }]>;
@@ -486,7 +500,8 @@ declare class RdxMenuArrow {
486
500
  * An individual menu item.
487
501
  */
488
502
  declare class RdxMenuItem {
489
- private readonly rootContext;
503
+ protected readonly rootContext: _radix_ng_primitives_menu.RdxMenuRootContext | null;
504
+ private readonly listItem;
490
505
  private readonly elementRef;
491
506
  private readonly isFocused;
492
507
  /** Whether this item is disabled. */
@@ -499,6 +514,7 @@ declare class RdxMenuItem {
499
514
  readonly onSelect: _angular_core.OutputEmitterRef<void>;
500
515
  protected readonly highlighted: _angular_core.Signal<boolean>;
501
516
  protected readonly effectiveDisabled: _angular_core.Signal<boolean>;
517
+ constructor();
502
518
  onFocus(): void;
503
519
  onBlur(): void;
504
520
  onPointerMove(event: PointerEvent): void;
@@ -506,15 +522,18 @@ declare class RdxMenuItem {
506
522
  onItemClick(): void;
507
523
  onMouseUp(event: MouseEvent): void;
508
524
  protected onActivate(event: Event): void;
525
+ private setActiveIndex;
526
+ private clearActiveIndex;
509
527
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuItem, never>;
510
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuItem, "[rdxMenuItem]", ["rdxMenuItem"], { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "closeOnClick": { "alias": "closeOnClick"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, { "onSelect": "onSelect"; }, never, never, true, never>;
528
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuItem, "[rdxMenuItem]", ["rdxMenuItem"], { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "closeOnClick": { "alias": "closeOnClick"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, { "onSelect": "onSelect"; }, never, never, true, [{ directive: typeof i1$1.RdxCompositeListItem; inputs: {}; outputs: {}; }]>;
511
529
  }
512
530
 
513
531
  /**
514
532
  * A menu item that renders as a link.
515
533
  */
516
534
  declare class RdxMenuLinkItem {
517
- private readonly rootContext;
535
+ protected readonly rootContext: _radix_ng_primitives_menu.RdxMenuRootContext | null;
536
+ private readonly listItem;
518
537
  private readonly elementRef;
519
538
  private readonly isFocused;
520
539
  /** Whether this item is disabled. */
@@ -527,6 +546,7 @@ declare class RdxMenuLinkItem {
527
546
  readonly onSelect: _angular_core.OutputEmitterRef<void>;
528
547
  protected readonly highlighted: _angular_core.Signal<boolean>;
529
548
  protected readonly effectiveDisabled: _angular_core.Signal<boolean>;
549
+ constructor();
530
550
  onFocus(): void;
531
551
  onBlur(): void;
532
552
  onPointerMove(event: PointerEvent): void;
@@ -534,8 +554,10 @@ declare class RdxMenuLinkItem {
534
554
  onItemClick(event: MouseEvent): void;
535
555
  onMouseUp(event: MouseEvent): void;
536
556
  protected onActivate(event: Event): void;
557
+ private setActiveIndex;
558
+ private clearActiveIndex;
537
559
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuLinkItem, never>;
538
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuLinkItem, "a[rdxMenuLinkItem]", ["rdxMenuLinkItem"], { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "closeOnClick": { "alias": "closeOnClick"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, { "onSelect": "onSelect"; }, never, never, true, never>;
560
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuLinkItem, "a[rdxMenuLinkItem]", ["rdxMenuLinkItem"], { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "closeOnClick": { "alias": "closeOnClick"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, { "onSelect": "onSelect"; }, never, never, true, [{ directive: typeof i1$1.RdxCompositeListItem; inputs: {}; outputs: {}; }]>;
539
561
  }
540
562
 
541
563
  /**
@@ -579,7 +601,8 @@ declare const provideRdxMenuCheckboxItemContext: (useFactory: () => RdxMenuCheck
579
601
  * A menu item that can be checked or unchecked.
580
602
  */
581
603
  declare class RdxMenuCheckboxItem {
582
- private readonly rootContext;
604
+ protected readonly rootContext: _radix_ng_primitives_menu.RdxMenuRootContext | null;
605
+ private readonly listItem;
583
606
  private readonly elementRef;
584
607
  private readonly isFocused;
585
608
  /** Whether this item is disabled. */
@@ -596,6 +619,7 @@ declare class RdxMenuCheckboxItem {
596
619
  protected readonly effectiveDisabled: Signal<boolean>;
597
620
  protected readonly isIndeterminate: typeof isIndeterminate;
598
621
  protected readonly getCheckedState: typeof getCheckedState;
622
+ constructor();
599
623
  onFocus(): void;
600
624
  onBlur(): void;
601
625
  onPointerMove(event: PointerEvent): void;
@@ -604,8 +628,10 @@ declare class RdxMenuCheckboxItem {
604
628
  onMouseUp(event: MouseEvent): void;
605
629
  protected onActivate(event: Event): void;
606
630
  private toggleChecked;
631
+ private setActiveIndex;
632
+ private clearActiveIndex;
607
633
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuCheckboxItem, never>;
608
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuCheckboxItem, "[rdxMenuCheckboxItem]", ["rdxMenuCheckboxItem"], { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "closeOnClick": { "alias": "closeOnClick"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "onCheckedChange": "onCheckedChange"; }, never, never, true, never>;
634
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuCheckboxItem, "[rdxMenuCheckboxItem]", ["rdxMenuCheckboxItem"], { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "closeOnClick": { "alias": "closeOnClick"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "onCheckedChange": "onCheckedChange"; }, never, never, true, [{ directive: typeof i1$1.RdxCompositeListItem; inputs: {}; outputs: {}; }]>;
609
635
  }
610
636
 
611
637
  /**
@@ -662,8 +688,9 @@ declare const provideRdxMenuRadioItemContext: (useFactory: () => RdxMenuRadioIte
662
688
  * A radio item within a menu radio group.
663
689
  */
664
690
  declare class RdxMenuRadioItem<T = unknown> {
665
- private readonly rootContext;
691
+ protected readonly rootContext: _radix_ng_primitives_menu.RdxMenuRootContext | null;
666
692
  private readonly radioGroupContext;
693
+ private readonly listItem;
667
694
  private readonly elementRef;
668
695
  private readonly isFocused;
669
696
  /** The value of this radio item. */
@@ -680,6 +707,7 @@ declare class RdxMenuRadioItem<T = unknown> {
680
707
  protected readonly highlighted: Signal<boolean>;
681
708
  protected readonly effectiveDisabled: Signal<boolean>;
682
709
  protected readonly getCheckedState: typeof getCheckedState;
710
+ constructor();
683
711
  onFocus(): void;
684
712
  onBlur(): void;
685
713
  onPointerMove(event: PointerEvent): void;
@@ -688,8 +716,10 @@ declare class RdxMenuRadioItem<T = unknown> {
688
716
  onMouseUp(event: MouseEvent): void;
689
717
  protected onActivate(event: Event): void;
690
718
  private selectItem;
719
+ private setActiveIndex;
720
+ private clearActiveIndex;
691
721
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuRadioItem<any>, never>;
692
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuRadioItem<any>, "[rdxMenuRadioItem]", ["rdxMenuRadioItem"], { "value": { "alias": "value"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "closeOnClick": { "alias": "closeOnClick"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, { "onSelect": "onSelect"; }, never, never, true, never>;
722
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuRadioItem<any>, "[rdxMenuRadioItem]", ["rdxMenuRadioItem"], { "value": { "alias": "value"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "closeOnClick": { "alias": "closeOnClick"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, { "onSelect": "onSelect"; }, never, never, true, [{ directive: typeof i1$1.RdxCompositeListItem; inputs: {}; outputs: {}; }]>;
693
723
  }
694
724
 
695
725
  /**
@@ -2,6 +2,7 @@ import * as _angular_core from '@angular/core';
2
2
  import { Signal } from '@angular/core';
3
3
  import * as _radix_ng_primitives_core from '@radix-ng/primitives/core';
4
4
  import { BooleanInput } from '@radix-ng/primitives/core';
5
+ import * as i1 from '@radix-ng/primitives/composite';
5
6
 
6
7
  type RdxMenubarOrientation = 'horizontal' | 'vertical';
7
8
  interface RdxMenubarContext {
@@ -22,9 +23,13 @@ declare const provideRdxMenubarContext: (useFactory: () => RdxMenubarContext) =>
22
23
  * Coordinates open/close state across multiple menus and provides arrow-key navigation.
23
24
  */
24
25
  declare class RdxMenubarRoot {
26
+ private readonly elementRef;
27
+ private readonly compositeRoot;
28
+ private readonly compositeList;
25
29
  private readonly menuRoots;
26
30
  private readonly ids;
27
31
  private items;
32
+ private readonly itemsVersion;
28
33
  /** Whether every menubar trigger is disabled. */
29
34
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
30
35
  /** Whether arrow-key navigation wraps at the first/last trigger. */
@@ -46,15 +51,17 @@ declare class RdxMenubarRoot {
46
51
  private handleTriggerArrow;
47
52
  private handleTriggerBoundary;
48
53
  focusAdjacent(currentId: string, offset: 1 | -1, openOnMove: boolean): void;
49
- protected handleArrowLeft(event: Event): void;
50
- protected handleArrowRight(event: Event): void;
51
- private handleOpenMenuNavigation;
52
54
  private focusItem;
53
- private updateTriggerTabStops;
55
+ protected handleFocusIn(event: FocusEvent): void;
56
+ private highlightItem;
54
57
  private enabledItems;
55
58
  private hasOpenMenu;
59
+ private sortItems;
60
+ private markItemsChanged;
61
+ private syncDisabledIndices;
62
+ private syncTabIndices;
56
63
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenubarRoot, never>;
57
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenubarRoot, "[rdxMenubarRoot]", ["rdxMenubarRoot"], { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loopFocus": { "alias": "loopFocus"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; }, {}, ["menuRoots"], never, true, never>;
64
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenubarRoot, "[rdxMenubarRoot]", ["rdxMenubarRoot"], { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loopFocus": { "alias": "loopFocus"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; }, {}, ["menuRoots"], never, true, [{ directive: typeof i1.RdxCompositeRoot; inputs: {}; outputs: {}; }]>;
58
65
  }
59
66
 
60
67
  declare class RdxMenubarModule {