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

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 (118) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/radix-ng-primitives-accordion.mjs +5 -3
  3. package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -1
  4. package/fesm2022/radix-ng-primitives-alert-dialog.mjs +3 -2
  5. package/fesm2022/radix-ng-primitives-alert-dialog.mjs.map +1 -1
  6. package/fesm2022/radix-ng-primitives-autocomplete.mjs +617 -659
  7. package/fesm2022/radix-ng-primitives-autocomplete.mjs.map +1 -1
  8. package/fesm2022/radix-ng-primitives-calendar.mjs +5 -3
  9. package/fesm2022/radix-ng-primitives-calendar.mjs.map +1 -1
  10. package/fesm2022/radix-ng-primitives-checkbox.mjs +33 -18
  11. package/fesm2022/radix-ng-primitives-checkbox.mjs.map +1 -1
  12. package/fesm2022/radix-ng-primitives-combobox.mjs +1305 -572
  13. package/fesm2022/radix-ng-primitives-combobox.mjs.map +1 -1
  14. package/fesm2022/radix-ng-primitives-config.mjs +13 -4
  15. package/fesm2022/radix-ng-primitives-config.mjs.map +1 -1
  16. package/fesm2022/radix-ng-primitives-context-menu.mjs +51 -10
  17. package/fesm2022/radix-ng-primitives-context-menu.mjs.map +1 -1
  18. package/fesm2022/radix-ng-primitives-core.mjs +1352 -64
  19. package/fesm2022/radix-ng-primitives-core.mjs.map +1 -1
  20. package/fesm2022/radix-ng-primitives-date-field.mjs +5 -3
  21. package/fesm2022/radix-ng-primitives-date-field.mjs.map +1 -1
  22. package/fesm2022/radix-ng-primitives-dialog.mjs +290 -120
  23. package/fesm2022/radix-ng-primitives-dialog.mjs.map +1 -1
  24. package/fesm2022/radix-ng-primitives-direction-provider.mjs +70 -0
  25. package/fesm2022/radix-ng-primitives-direction-provider.mjs.map +1 -0
  26. package/fesm2022/radix-ng-primitives-dismissable-layer.mjs +519 -184
  27. package/fesm2022/radix-ng-primitives-dismissable-layer.mjs.map +1 -1
  28. package/fesm2022/radix-ng-primitives-drawer.mjs +3 -3
  29. package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
  30. package/fesm2022/radix-ng-primitives-editable.mjs +12 -7
  31. package/fesm2022/radix-ng-primitives-editable.mjs.map +1 -1
  32. package/fesm2022/radix-ng-primitives-field.mjs +3 -2
  33. package/fesm2022/radix-ng-primitives-field.mjs.map +1 -1
  34. package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs +803 -0
  35. package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs.map +1 -0
  36. package/fesm2022/radix-ng-primitives-focus-scope.mjs +305 -70
  37. package/fesm2022/radix-ng-primitives-focus-scope.mjs.map +1 -1
  38. package/fesm2022/radix-ng-primitives-menu.mjs +893 -289
  39. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  40. package/fesm2022/radix-ng-primitives-menubar.mjs +32 -4
  41. package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
  42. package/fesm2022/radix-ng-primitives-navigation-menu.mjs +144 -159
  43. package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
  44. package/fesm2022/radix-ng-primitives-number-field.mjs +7 -2
  45. package/fesm2022/radix-ng-primitives-number-field.mjs.map +1 -1
  46. package/fesm2022/radix-ng-primitives-popover.mjs +284 -212
  47. package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
  48. package/fesm2022/radix-ng-primitives-popper.mjs +94 -51
  49. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  50. package/fesm2022/radix-ng-primitives-presence.mjs +1 -1
  51. package/fesm2022/radix-ng-primitives-presence.mjs.map +1 -1
  52. package/fesm2022/radix-ng-primitives-preview-card.mjs +141 -173
  53. package/fesm2022/radix-ng-primitives-preview-card.mjs.map +1 -1
  54. package/fesm2022/radix-ng-primitives-radio.mjs +19 -14
  55. package/fesm2022/radix-ng-primitives-radio.mjs.map +1 -1
  56. package/fesm2022/radix-ng-primitives-roving-focus.mjs +4 -2
  57. package/fesm2022/radix-ng-primitives-roving-focus.mjs.map +1 -1
  58. package/fesm2022/radix-ng-primitives-scroll-area.mjs +5 -4
  59. package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -1
  60. package/fesm2022/radix-ng-primitives-select.mjs +241 -164
  61. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  62. package/fesm2022/radix-ng-primitives-slider.mjs +262 -29
  63. package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
  64. package/fesm2022/radix-ng-primitives-stepper.mjs +16 -10
  65. package/fesm2022/radix-ng-primitives-stepper.mjs.map +1 -1
  66. package/fesm2022/radix-ng-primitives-switch.mjs +10 -5
  67. package/fesm2022/radix-ng-primitives-switch.mjs.map +1 -1
  68. package/fesm2022/radix-ng-primitives-tabs.mjs +15 -10
  69. package/fesm2022/radix-ng-primitives-tabs.mjs.map +1 -1
  70. package/fesm2022/radix-ng-primitives-time-field.mjs +5 -3
  71. package/fesm2022/radix-ng-primitives-time-field.mjs.map +1 -1
  72. package/fesm2022/radix-ng-primitives-toast.mjs +15 -36
  73. package/fesm2022/radix-ng-primitives-toast.mjs.map +1 -1
  74. package/fesm2022/radix-ng-primitives-toggle-group.mjs +14 -7
  75. package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
  76. package/fesm2022/radix-ng-primitives-toggle.mjs +12 -6
  77. package/fesm2022/radix-ng-primitives-toggle.mjs.map +1 -1
  78. package/fesm2022/radix-ng-primitives-toolbar.mjs +5 -3
  79. package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
  80. package/fesm2022/radix-ng-primitives-tooltip.mjs +251 -143
  81. package/fesm2022/radix-ng-primitives-tooltip.mjs.map +1 -1
  82. package/package.json +10 -1
  83. package/types/radix-ng-primitives-accordion.d.ts +4 -3
  84. package/types/radix-ng-primitives-autocomplete.d.ts +217 -152
  85. package/types/radix-ng-primitives-calendar.d.ts +5 -3
  86. package/types/radix-ng-primitives-checkbox.d.ts +27 -15
  87. package/types/radix-ng-primitives-combobox.d.ts +672 -283
  88. package/types/radix-ng-primitives-config.d.ts +1 -1
  89. package/types/radix-ng-primitives-context-menu.d.ts +15 -5
  90. package/types/radix-ng-primitives-core.d.ts +764 -14
  91. package/types/radix-ng-primitives-date-field.d.ts +3 -2
  92. package/types/radix-ng-primitives-dialog.d.ts +88 -32
  93. package/types/radix-ng-primitives-direction-provider.d.ts +41 -0
  94. package/types/radix-ng-primitives-dismissable-layer.d.ts +147 -99
  95. package/types/radix-ng-primitives-editable.d.ts +11 -5
  96. package/types/radix-ng-primitives-field.d.ts +1 -0
  97. package/types/radix-ng-primitives-floating-focus-manager.d.ts +272 -0
  98. package/types/radix-ng-primitives-focus-scope.d.ts +132 -1
  99. package/types/radix-ng-primitives-menu.d.ts +192 -103
  100. package/types/radix-ng-primitives-navigation-menu.d.ts +37 -75
  101. package/types/radix-ng-primitives-number-field.d.ts +8 -3
  102. package/types/radix-ng-primitives-popover.d.ts +71 -92
  103. package/types/radix-ng-primitives-popper.d.ts +39 -9
  104. package/types/radix-ng-primitives-preview-card.d.ts +39 -72
  105. package/types/radix-ng-primitives-radio.d.ts +13 -6
  106. package/types/radix-ng-primitives-roving-focus.d.ts +7 -6
  107. package/types/radix-ng-primitives-scroll-area.d.ts +2 -2
  108. package/types/radix-ng-primitives-select.d.ts +142 -109
  109. package/types/radix-ng-primitives-slider.d.ts +64 -12
  110. package/types/radix-ng-primitives-stepper.d.ts +15 -7
  111. package/types/radix-ng-primitives-switch.d.ts +10 -4
  112. package/types/radix-ng-primitives-tabs.d.ts +12 -6
  113. package/types/radix-ng-primitives-time-field.d.ts +3 -2
  114. package/types/radix-ng-primitives-toast.d.ts +7 -7
  115. package/types/radix-ng-primitives-toggle-group.d.ts +15 -8
  116. package/types/radix-ng-primitives-toggle.d.ts +10 -3
  117. package/types/radix-ng-primitives-toolbar.d.ts +3 -2
  118. package/types/radix-ng-primitives-tooltip.d.ts +61 -80
@@ -1,13 +1,14 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { Signal, ElementRef } from '@angular/core';
2
+ import { Signal, WritableSignal } from '@angular/core';
3
3
  import * as _radix_ng_primitives_core from '@radix-ng/primitives/core';
4
- import { BooleanInput, NumberInput } from '@radix-ng/primitives/core';
4
+ import { RdxFloatingRootContext, BooleanInput, Direction, RdxCancelableChangeEventDetails, NumberInput } from '@radix-ng/primitives/core';
5
+ import * as _radix_ng_primitives_floating_focus_manager from '@radix-ng/primitives/floating-focus-manager';
6
+ import { RdxInteractionType } from '@radix-ng/primitives/floating-focus-manager';
5
7
  import * as i1 from '@radix-ng/primitives/popper';
6
- import { RdxPopperContentWrapper, RdxPopperAnchorElement } from '@radix-ng/primitives/popper';
8
+ import { RdxPopperContentWrapper } from '@radix-ng/primitives/popper';
7
9
  import * as _radix_ng_primitives_menu from '@radix-ng/primitives/menu';
8
- import * as i2 from '@radix-ng/primitives/dismissable-layer';
9
10
  import * as i1$1 from '@radix-ng/primitives/portal';
10
- import * as i3 from '@radix-ng/primitives/focus-scope';
11
+ import { RdxOutsidePressDomEvent } from '@radix-ng/primitives/dismissable-layer';
11
12
 
12
13
  type RdxMenuTransitionStatus = 'starting' | 'ending' | undefined;
13
14
  /**
@@ -20,39 +21,87 @@ type RdxMenuTransitionStatus = 'starting' | 'ending' | undefined;
20
21
  type RdxMenuAutoFocus = 'first' | 'last' | 'popup' | false;
21
22
  type RdxMenuAutoFocusInput = boolean | RdxMenuAutoFocus;
22
23
  type RdxMenuOrientation = 'horizontal' | 'vertical';
24
+ /**
25
+ * What kind of parent a menu has (Base UI `MenuParent.type`). Drives the per-kind dismissal / focus /
26
+ * backdrop / scroll-lock policy:
27
+ * - `'menu'` — a **submenu** (its parent is another menu).
28
+ * - `'menubar'` — a menu coordinated by a `Menubar`.
29
+ * - `'context-menu'` — the root of a `ContextMenu` (opened at the pointer).
30
+ * - `undefined` — a standalone menu (a plain dropdown).
31
+ */
32
+ type RdxMenuParentType = 'menu' | 'menubar' | 'context-menu' | undefined;
33
+ /**
34
+ * Why a menu's open state changed (Base UI open-change `reason`). Read by the per-kind policy — e.g. a
35
+ * `'trigger-hover'` open suppresses the modal backdrop / scroll-lock, and the dismissal reason decides
36
+ * return-focus.
37
+ */
38
+ type RdxMenuOpenChangeReason = 'trigger-press' | 'trigger-hover' | 'trigger-focus' | 'list-navigation' | 'sibling-open' | 'escape-key' | 'outside-press' | 'cancel-open' | 'focus-out' | 'none';
39
+ type RdxMenuOpenChangeEventDetails = RdxCancelableChangeEventDetails<RdxMenuOpenChangeReason>;
40
+ interface RdxMenuOpenChange {
41
+ open: boolean;
42
+ trigger: HTMLElement | undefined;
43
+ reason: RdxMenuOpenChangeReason;
44
+ event: Event;
45
+ eventDetails: RdxMenuOpenChangeEventDetails;
46
+ }
23
47
  interface RdxMenuRootContext {
24
48
  isOpen: Signal<boolean>;
49
+ present: Signal<boolean>;
25
50
  disabled: Signal<boolean>;
26
51
  modal: Signal<boolean>;
27
52
  loopFocus: Signal<boolean>;
28
53
  highlightItemOnHover: Signal<boolean>;
29
54
  orientation: Signal<RdxMenuOrientation>;
55
+ dir: Signal<Direction>;
30
56
  closeParentOnEsc: Signal<boolean>;
31
57
  /** Whether the popup should focus its first item when it opens. */
32
58
  autoFocus: Signal<RdxMenuAutoFocus>;
33
59
  isSubmenu: Signal<boolean>;
60
+ /** What kind of parent this menu has (ADR 0015/0017 parity) — drives the per-kind policy. */
61
+ parentType: Signal<RdxMenuParentType>;
62
+ /** The reason for the most recent open-change (Base UI open-change `reason`). */
63
+ lastOpenChangeReason: Signal<RdxMenuOpenChangeReason>;
64
+ /** Whether a trigger-originated press may activate an item on the following mouseup. */
65
+ allowMouseUpTrigger: Signal<boolean>;
66
+ /** Whether the current open was initiated by touch (ADR 0016 §3 — gates the anchored scroll lock). */
67
+ openedByTouch: Signal<boolean>;
68
+ openInteractionType: Signal<RdxInteractionType>;
69
+ closeInteractionType: Signal<RdxInteractionType>;
34
70
  hasTriggerInteractionHandler: Signal<boolean>;
35
71
  trigger: Signal<HTMLElement | undefined>;
36
72
  /** The popup element, once mounted. Used by submenu safe-polygon geometry. */
37
73
  popupElement: Signal<HTMLElement | undefined>;
74
+ beforeContentFocusGuard: Signal<HTMLElement | null>;
38
75
  transitionStatus: Signal<RdxMenuTransitionStatus>;
39
- close: () => void;
40
- toggle: () => void;
41
- show: (autoFocus?: RdxMenuAutoFocusInput) => void;
76
+ close: (reason?: RdxMenuOpenChangeReason, event?: Event) => void;
77
+ /** Close this menu and every ancestor — used by item selection (the whole menu dismisses). */
78
+ closeEntireMenu: (reason?: RdxMenuOpenChangeReason, event?: Event) => void;
79
+ toggle: (reason?: RdxMenuOpenChangeReason, event?: Event) => void;
80
+ show: (autoFocus?: RdxMenuAutoFocusInput, reason?: RdxMenuOpenChangeReason, event?: Event) => void;
42
81
  /** Open the menu without moving focus into the popup (used for menubar hover-switching). */
43
- showWithoutAutoFocus: () => void;
82
+ showWithoutAutoFocus: (reason?: RdxMenuOpenChangeReason, event?: Event) => void;
44
83
  registerTrigger: (el: HTMLElement) => () => void;
45
84
  registerPopup: (el: HTMLElement) => () => void;
85
+ setBeforeContentFocusGuard: (element: HTMLElement | null) => void;
46
86
  registerTransitionElement: (element: HTMLElement) => () => void;
47
87
  registerPopupArrowNavigationHandler: (handler: (offset: 1 | -1) => boolean) => () => void;
48
88
  registerTriggerInteractionHandler: (handler: RdxMenuTriggerInteractionHandler) => () => void;
49
89
  markAsSubmenu: () => void;
90
+ /** Marks this menu as the root of a Context Menu (called by `RdxContextMenuRoot`). */
91
+ markAsContextMenu: () => void;
92
+ setAllowMouseUpTrigger: (value: boolean) => void;
50
93
  closeParent: () => void;
51
94
  handlePopupArrowNavigation: (offset: 1 | -1) => boolean;
52
95
  handleTriggerInteraction: (interaction: RdxMenuTriggerInteraction) => boolean;
53
96
  }
54
97
  type RdxMenuTriggerInteraction = {
55
98
  type: 'click';
99
+ } | {
100
+ type: 'enter';
101
+ event: Event;
102
+ } | {
103
+ type: 'space';
104
+ event: Event;
56
105
  } | {
57
106
  type: 'pointerenter';
58
107
  event: PointerEvent;
@@ -86,6 +135,14 @@ declare const provideRdxMenuRootContext: (useFactory: () => RdxMenuRootContext)
86
135
  */
87
136
  declare class RdxMenuRoot {
88
137
  private readonly popper;
138
+ private readonly parentRoot;
139
+ private readonly providedDirection;
140
+ /**
141
+ * The shared per-popup floating context (ADR 0015 §1) — `open` mirrors this menu's open state, the
142
+ * trigger registry is bridged from {@link registerTrigger}, and the reference / floating elements are
143
+ * set by the trigger / popup. The new dismissal engine reads this once the popup migrates.
144
+ */
145
+ readonly floatingContext: RdxFloatingRootContext;
89
146
  /** Shared open/close transition state machine (completes on the real animationend). */
90
147
  private readonly transition;
91
148
  private registeredTrigger;
@@ -98,7 +155,10 @@ declare class RdxMenuRoot {
98
155
  readonly defaultOpen: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
99
156
  /** Whether interactions with the menu are disabled. */
100
157
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
101
- /** Whether the menu should block outside interactions. */
158
+ /**
159
+ * Whether the menu should block outside interactions and page scrolling.
160
+ * Nested menus are always non-modal.
161
+ */
102
162
  readonly modal: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
103
163
  /** Whether keyboard navigation wraps at list boundaries. */
104
164
  readonly loopFocus: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
@@ -106,26 +166,58 @@ declare class RdxMenuRoot {
106
166
  readonly highlightItemOnHover: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
107
167
  /** The menu orientation. */
108
168
  readonly orientation: _angular_core.InputSignal<RdxMenuOrientation>;
169
+ /** Text direction for submenu arrow-key behavior. Inherited by nested submenu roots. */
170
+ readonly dirInput: _angular_core.InputSignal<Direction | undefined>;
109
171
  /** Whether pressing Escape inside a submenu closes the whole menu chain. */
110
172
  readonly closeParentOnEsc: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
111
173
  /** Emits when the open state changes. */
112
- readonly onOpenChange: _angular_core.OutputEmitterRef<boolean>;
174
+ readonly onOpenChange: _angular_core.OutputEmitterRef<RdxMenuOpenChange>;
113
175
  /** Emits when the open/close CSS transition or animation finishes. */
114
176
  readonly onOpenChangeComplete: _angular_core.OutputEmitterRef<boolean>;
115
177
  readonly trigger: _angular_core.WritableSignal<HTMLElement | undefined>;
116
178
  readonly popupElement: _angular_core.WritableSignal<HTMLElement | undefined>;
179
+ readonly beforeContentFocusGuard: _angular_core.WritableSignal<HTMLElement | null>;
117
180
  readonly transitionStatus: Signal<_radix_ng_primitives_core.RdxTransitionStatus>;
118
181
  /** Whether the popup grabs focus when it opens. Set false for menubar hover-switching. */
119
182
  readonly autoFocus: _angular_core.WritableSignal<RdxMenuAutoFocus>;
120
183
  readonly isSubmenu: _angular_core.WritableSignal<boolean>;
184
+ /** Set by `RdxContextMenuRoot` (it composes this root) — distinguishes a context menu from a dropdown. */
185
+ readonly isContextMenu: _angular_core.WritableSignal<boolean>;
121
186
  readonly hasTriggerInteractionHandler: _angular_core.WritableSignal<boolean>;
187
+ private readonly preventUnmountOnClose;
188
+ /**
189
+ * What kind of parent this menu has (Base UI `MenuParent.type`). A submenu wins over everything (its
190
+ * parent is a menu); otherwise a context-menu marker, then a menubar (detected by the trigger
191
+ * interaction handler the menubar registers), else a standalone dropdown.
192
+ */
193
+ readonly parentType: Signal<RdxMenuParentType>;
194
+ /** The reason for the most recent open-change (Base UI open-change `reason`), for the per-kind policy. */
195
+ readonly lastOpenChangeReason: _angular_core.WritableSignal<RdxMenuOpenChangeReason>;
196
+ private readonly localAllowMouseUpTrigger;
197
+ readonly allowMouseUpTrigger: Signal<boolean>;
198
+ /** Whether the current open was initiated by **touch** (ADR 0016 §3 — gates the anchored scroll lock). */
199
+ readonly openedByTouch: _angular_core.WritableSignal<boolean>;
200
+ readonly openInteractionType: _angular_core.WritableSignal<RdxInteractionType>;
201
+ readonly closeInteractionType: _angular_core.WritableSignal<RdxInteractionType>;
202
+ readonly effectiveDisabled: Signal<boolean>;
203
+ readonly dir: Signal<Direction>;
204
+ readonly effectiveModal: Signal<boolean>;
122
205
  readonly state: Signal<"open" | "closed">;
206
+ readonly present: Signal<boolean>;
123
207
  constructor();
124
- show(autoFocus?: RdxMenuAutoFocusInput): void;
125
- close(): void;
126
- toggle(): void;
208
+ show(autoFocus?: RdxMenuAutoFocusInput, reason?: RdxMenuOpenChangeReason, event?: Event): void;
209
+ close(reason?: RdxMenuOpenChangeReason, event?: Event): void;
210
+ toggle(reason?: RdxMenuOpenChangeReason, event?: Event): void;
211
+ markAsContextMenu(): void;
212
+ setAllowMouseUpTrigger(value: boolean): void;
213
+ /**
214
+ * Close this menu **and every ancestor menu** in the chain. Selecting an item dismisses the whole
215
+ * menu, not just the innermost submenu (a submenu's `close()` would leave its parents open).
216
+ */
217
+ closeEntireMenu(reason?: RdxMenuOpenChangeReason, event?: Event): void;
127
218
  registerTrigger(el: HTMLElement): () => void;
128
219
  registerPopup(el: HTMLElement): () => void;
220
+ setBeforeContentFocusGuard(element: HTMLElement | null): void;
129
221
  registerTransitionElement(element: HTMLElement): () => void;
130
222
  registerPopupArrowNavigationHandler(handler: (offset: 1 | -1) => boolean): () => void;
131
223
  handlePopupArrowNavigation(offset: 1 | -1): boolean;
@@ -133,8 +225,9 @@ declare class RdxMenuRoot {
133
225
  handleTriggerInteraction(interaction: RdxMenuTriggerInteraction): boolean;
134
226
  markAsSubmenu(): void;
135
227
  closeParent(): void;
228
+ private createOpenChangeEvent;
136
229
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuRoot, never>;
137
- 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; }; "closeParentOnEsc": { "alias": "closeParentOnEsc"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "onOpenChange": "onOpenChange"; "onOpenChangeComplete": "onOpenChangeComplete"; }, never, never, true, [{ directive: typeof i1.RdxPopper; inputs: {}; outputs: {}; }]>;
230
+ 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: {}; }]>;
138
231
  }
139
232
 
140
233
  /**
@@ -144,9 +237,14 @@ declare class RdxMenuTrigger {
144
237
  protected readonly rootContext: _radix_ng_primitives_menu.RdxMenuRootContext;
145
238
  private readonly elementRef;
146
239
  private readonly destroyRef;
147
- private readonly dismissableLayersContext;
240
+ private readonly isBrowser;
148
241
  private openTimer;
149
242
  private closeTimer;
243
+ private allowMouseUpTriggerTimer;
244
+ private lastPointer;
245
+ private openedByHover;
246
+ private ignoreNextClick;
247
+ private readonly handleDocumentMouseUp;
150
248
  /** Whether this trigger should be treated as a native button. Auto-detected for `<button>`. */
151
249
  readonly nativeButton: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
152
250
  /** Whether this trigger is disabled. */
@@ -159,8 +257,11 @@ declare class RdxMenuTrigger {
159
257
  readonly closeDelay: _angular_core.InputSignalWithTransform<number | undefined, NumberInput>;
160
258
  protected readonly nativeButtonState: _angular_core.Signal<boolean>;
161
259
  protected readonly isDisabled: _angular_core.Signal<boolean>;
260
+ protected readonly triggerInteraction: _radix_ng_primitives_floating_focus_manager.RdxTriggerInteraction;
162
261
  constructor();
163
- protected handleClick(): void;
262
+ protected handleMouseDown(event: MouseEvent): void;
263
+ protected handlePointerDown(event: PointerEvent): void;
264
+ protected handleClick(event: MouseEvent): void;
164
265
  protected handleArrowDown(event: Event): void;
165
266
  protected handleArrowUp(event: Event): void;
166
267
  protected handleArrowLeft(event: Event): void;
@@ -171,8 +272,13 @@ declare class RdxMenuTrigger {
171
272
  protected handleKeyboardToggle(event: Event): void;
172
273
  protected handlePointerEnter(event: PointerEvent): void;
173
274
  protected handlePointerLeave(event: PointerEvent): void;
275
+ protected handlePointerMove(event: PointerEvent): void;
276
+ private scheduleClose;
174
277
  private clearOpenTimer;
175
278
  private clearCloseTimer;
279
+ private armMouseUpGuard;
280
+ private clearMouseUpGuard;
281
+ private restoreKeyboardPopupFocus;
176
282
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuTrigger, never>;
177
283
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuTrigger, "[rdxMenuTrigger]", ["rdxMenuTrigger"], { "nativeButton": { "alias": "nativeButton"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "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; }; }, {}, never, never, true, [{ directive: typeof i1.RdxPopperAnchor; inputs: {}; outputs: {}; }]>;
178
284
  }
@@ -198,6 +304,7 @@ declare class RdxMenuSubTrigger {
198
304
  private lastPointer;
199
305
  /** Whether the current open was initiated by hover (vs keyboard / click). */
200
306
  private openedByHover;
307
+ private ignoreNextKeyboardClick;
201
308
  /** Whether this trigger (and therefore the submenu) is disabled. */
202
309
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
203
310
  /** Whether this trigger should be treated as a native button. Auto-detected for `<button>`. */
@@ -212,20 +319,24 @@ declare class RdxMenuSubTrigger {
212
319
  readonly label: _angular_core.InputSignal<string | undefined>;
213
320
  /** Highlighted when focused OR while the submenu is open. */
214
321
  protected readonly highlighted: _angular_core.Signal<boolean>;
322
+ protected readonly effectiveDisabled: _angular_core.Signal<boolean>;
215
323
  protected readonly nativeButtonState: _angular_core.Signal<boolean>;
216
324
  constructor();
217
325
  private scheduleClose;
218
326
  protected onFocus(): void;
219
327
  protected onBlur(): void;
220
- protected onClick(): void;
328
+ protected onClick(event: MouseEvent): void;
329
+ protected onEnter(event: Event): void;
221
330
  protected onArrowRight(event: Event): void;
331
+ protected onArrowLeft(event: Event): void;
222
332
  protected onPointerMove(event: PointerEvent): void;
223
333
  protected onPointerLeave(): void;
224
334
  protected clearHighlight(): void;
225
335
  private closeSiblingSubmenus;
226
336
  private clearSiblingHighlights;
337
+ private focusFirstSubmenuItem;
227
338
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuSubTrigger, never>;
228
- 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 i2.RdxDismissableLayerBranch; inputs: {}; outputs: {}; }]>;
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: {}; }]>;
229
340
  }
230
341
 
231
342
  /**
@@ -253,68 +364,17 @@ declare class RdxMenuPortalMisuseGuard {
253
364
 
254
365
  /**
255
366
  * Positions the menu against its trigger.
367
+ *
368
+ * A "thin" positioner (ADR 0012): it inherits the popper positioning surface (inputs, `placed`
369
+ * output, unified vars + placement attrs) from {@link RdxPopperContentWrapper} and adds the menu
370
+ * defaults, the open/closed state attributes, and the deprecated `--radix-menu-*` aliases.
256
371
  */
257
- declare class RdxMenuPositioner {
372
+ declare class RdxMenuPositioner extends RdxPopperContentWrapper {
258
373
  protected readonly rootContext: _radix_ng_primitives_menu.RdxMenuRootContext;
259
- protected readonly wrapper: RdxPopperContentWrapper;
260
- /**
261
- * An element to position the popup against. Defaults to the trigger.
262
- */
263
- readonly anchor: _angular_core.InputSignal<RdxPopperAnchorElement>;
264
- /**
265
- * The preferred side of the trigger to render against when open.
266
- */
267
- readonly side: _angular_core.InputSignal<"top" | "right" | "bottom" | "left">;
268
- /**
269
- * Distance between the trigger and the popup in pixels.
270
- */
271
- readonly sideOffset: _angular_core.InputSignalWithTransform<number, NumberInput>;
272
- /**
273
- * How to align the popup relative to the specified side.
274
- */
275
- readonly align: _angular_core.InputSignal<"end" | "start" | "center">;
276
- /**
277
- * An offset in pixels from the `start` or `end` alignment options.
278
- */
279
- readonly alignOffset: _angular_core.InputSignalWithTransform<number, NumberInput>;
280
- /**
281
- * Minimum distance to maintain between the arrow and the edges of the popup.
282
- */
283
- readonly arrowPadding: _angular_core.InputSignalWithTransform<number, NumberInput>;
284
- /**
285
- * Whether to override side and alignment preferences to prevent collisions.
286
- */
287
- readonly avoidCollisions: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
288
- /**
289
- * The element used as the collision boundary.
290
- */
291
- readonly collisionBoundary: _angular_core.InputSignal<ElementRef<HTMLElement> | ElementRef<HTMLElement>[] | undefined>;
292
- /**
293
- * Distance in pixels from the boundary edges where collision detection should occur.
294
- */
295
- readonly collisionPadding: _angular_core.InputSignal<number | Partial<Record<"top" | "right" | "bottom" | "left", number>>>;
296
- /**
297
- * The sticky behavior on the alignment axis.
298
- */
299
- readonly sticky: _angular_core.InputSignal<"always" | "partial">;
300
- /**
301
- * Whether to hide the popup when the trigger becomes fully occluded.
302
- */
303
- readonly hideWhenDetached: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
304
- /**
305
- * The CSS position strategy used by Floating UI.
306
- */
307
- readonly positionStrategy: _angular_core.InputSignal<"fixed" | "absolute">;
308
- /**
309
- * Whether to update position on every animation frame.
310
- */
311
- readonly updatePositionStrategy: _angular_core.InputSignal<"always" | "optimized">;
312
- /**
313
- * Emits when the popup has been placed.
314
- */
315
- readonly placed: _angular_core.OutputRef<void>;
374
+ protected readonly legacyVars: Record<string, string>;
375
+ constructor();
316
376
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuPositioner, never>;
317
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuPositioner, "[rdxMenuPositioner]", ["rdxMenuPositioner"], { "anchor": { "alias": "anchor"; "required": false; "isSignal": true; }; "side": { "alias": "side"; "required": false; "isSignal": true; }; "sideOffset": { "alias": "sideOffset"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "alignOffset": { "alias": "alignOffset"; "required": false; "isSignal": true; }; "arrowPadding": { "alias": "arrowPadding"; "required": false; "isSignal": true; }; "avoidCollisions": { "alias": "avoidCollisions"; "required": false; "isSignal": true; }; "collisionBoundary": { "alias": "collisionBoundary"; "required": false; "isSignal": true; }; "collisionPadding": { "alias": "collisionPadding"; "required": false; "isSignal": true; }; "sticky": { "alias": "sticky"; "required": false; "isSignal": true; }; "hideWhenDetached": { "alias": "hideWhenDetached"; "required": false; "isSignal": true; }; "positionStrategy": { "alias": "positionStrategy"; "required": false; "isSignal": true; }; "updatePositionStrategy": { "alias": "updatePositionStrategy"; "required": false; "isSignal": true; }; }, { "placed": "placed"; }, never, never, true, [{ directive: typeof i1.RdxPopperContentWrapper; inputs: { "anchor": "anchor"; "side": "side"; "sideOffset": "sideOffset"; "align": "align"; "alignOffset": "alignOffset"; "arrowPadding": "arrowPadding"; "avoidCollisions": "avoidCollisions"; "collisionBoundary": "collisionBoundary"; "collisionPadding": "collisionPadding"; "sticky": "sticky"; "hideWhenDetached": "hideWhenDetached"; "positionStrategy": "positionStrategy"; "updatePositionStrategy": "updatePositionStrategy"; }; outputs: {}; }]>;
377
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuPositioner, "[rdxMenuPositioner]", ["rdxMenuPositioner"], {}, {}, never, never, true, never>;
318
378
  }
319
379
 
320
380
  /**
@@ -322,11 +382,12 @@ declare class RdxMenuPositioner {
322
382
  */
323
383
  declare class RdxMenuPopup {
324
384
  protected readonly rootContext: _radix_ng_primitives_menu.RdxMenuRootContext;
325
- private readonly dismissableLayer;
385
+ private readonly floatingContext;
386
+ private readonly registration;
387
+ private readonly focusManager;
326
388
  private readonly focusScope;
327
389
  private readonly wrapper;
328
390
  private readonly elementRef;
329
- private readonly dismissableLayersContext;
330
391
  private search;
331
392
  private searchTimer;
332
393
  protected readonly align: _angular_core.Signal<"end" | "start" | "center" | undefined>;
@@ -334,19 +395,19 @@ declare class RdxMenuPopup {
334
395
  /**
335
396
  * Event handler called when the escape key is pressed. Can be prevented.
336
397
  */
337
- readonly escapeKeyDown: _angular_core.OutputRef<KeyboardEvent>;
398
+ readonly escapeKeyDown: _angular_core.OutputEmitterRef<KeyboardEvent>;
338
399
  /**
339
400
  * Event handler called when a pointerdown event happens outside of the popup. Can be prevented.
340
401
  */
341
- readonly pointerDownOutside: _angular_core.OutputRef<PointerEvent>;
402
+ readonly pointerDownOutside: _angular_core.OutputEmitterRef<RdxOutsidePressDomEvent>;
342
403
  /**
343
404
  * Event handler called when focus moves outside of the popup. Can be prevented.
344
405
  */
345
- readonly focusOutside: _angular_core.OutputRef<FocusEvent>;
406
+ readonly focusOutside: _angular_core.OutputEmitterRef<FocusEvent>;
346
407
  /**
347
408
  * Event handler called when an interaction happens outside of the popup. Can be prevented.
348
409
  */
349
- readonly interactOutside: _angular_core.OutputRef<PointerEvent | FocusEvent>;
410
+ readonly interactOutside: _angular_core.OutputEmitterRef<RdxOutsidePressDomEvent | FocusEvent>;
350
411
  /**
351
412
  * Event handler called before focus moves into the popup. Can be prevented.
352
413
  */
@@ -358,8 +419,10 @@ declare class RdxMenuPopup {
358
419
  constructor();
359
420
  protected handleCloseParent(event: Event): void;
360
421
  protected handleKeydown(event: KeyboardEvent): void;
422
+ private scheduleSubmenuKeyboardFocus;
423
+ private applySubmenuKeyboardFocus;
361
424
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuPopup, never>;
362
- 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 i2.RdxDismissableLayer; inputs: {}; outputs: {}; }, { directive: typeof i3.RdxFocusScope; inputs: {}; outputs: {}; }]>;
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: {}; }]>;
363
426
  }
364
427
 
365
428
  /**
@@ -435,11 +498,13 @@ declare class RdxMenuItem {
435
498
  /** Emits when the item is selected. */
436
499
  readonly onSelect: _angular_core.OutputEmitterRef<void>;
437
500
  protected readonly highlighted: _angular_core.Signal<boolean>;
501
+ protected readonly effectiveDisabled: _angular_core.Signal<boolean>;
438
502
  onFocus(): void;
439
503
  onBlur(): void;
440
504
  onPointerMove(event: PointerEvent): void;
441
505
  onPointerLeave(event: PointerEvent): void;
442
506
  onItemClick(): void;
507
+ onMouseUp(event: MouseEvent): void;
443
508
  protected onActivate(event: Event): void;
444
509
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuItem, never>;
445
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>;
@@ -461,11 +526,13 @@ declare class RdxMenuLinkItem {
461
526
  /** Emits when the item is selected. */
462
527
  readonly onSelect: _angular_core.OutputEmitterRef<void>;
463
528
  protected readonly highlighted: _angular_core.Signal<boolean>;
529
+ protected readonly effectiveDisabled: _angular_core.Signal<boolean>;
464
530
  onFocus(): void;
465
531
  onBlur(): void;
466
532
  onPointerMove(event: PointerEvent): void;
467
533
  onPointerLeave(event: PointerEvent): void;
468
534
  onItemClick(event: MouseEvent): void;
535
+ onMouseUp(event: MouseEvent): void;
469
536
  protected onActivate(event: Event): void;
470
537
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuLinkItem, never>;
471
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>;
@@ -475,6 +542,7 @@ declare class RdxMenuLinkItem {
475
542
  * Groups related menu items together.
476
543
  */
477
544
  declare class RdxMenuGroup {
545
+ readonly labelId: _angular_core.WritableSignal<string | undefined>;
478
546
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuGroup, never>;
479
547
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuGroup, "[rdxMenuGroup]", ["rdxMenuGroup"], {}, {}, never, never, true, never>;
480
548
  }
@@ -483,6 +551,9 @@ declare class RdxMenuGroup {
483
551
  * A label for a menu group.
484
552
  */
485
553
  declare class RdxMenuGroupLabel {
554
+ private readonly groupContext;
555
+ readonly id: string;
556
+ constructor();
486
557
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuGroupLabel, never>;
487
558
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuGroupLabel, "[rdxMenuGroupLabel]", ["rdxMenuGroupLabel"], {}, {}, never, never, true, never>;
488
559
  }
@@ -522,6 +593,7 @@ declare class RdxMenuCheckboxItem {
522
593
  /** Emits when the checked state changes. */
523
594
  readonly onCheckedChange: _angular_core.OutputEmitterRef<CheckedState>;
524
595
  protected readonly highlighted: Signal<boolean>;
596
+ protected readonly effectiveDisabled: Signal<boolean>;
525
597
  protected readonly isIndeterminate: typeof isIndeterminate;
526
598
  protected readonly getCheckedState: typeof getCheckedState;
527
599
  onFocus(): void;
@@ -529,6 +601,7 @@ declare class RdxMenuCheckboxItem {
529
601
  onPointerMove(event: PointerEvent): void;
530
602
  onPointerLeave(event: PointerEvent): void;
531
603
  onItemClick(): void;
604
+ onMouseUp(event: MouseEvent): void;
532
605
  protected onActivate(event: Event): void;
533
606
  private toggleChecked;
534
607
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuCheckboxItem, never>;
@@ -549,27 +622,35 @@ declare class RdxMenuCheckboxItemIndicator {
549
622
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuCheckboxItemIndicator, "[rdxMenuCheckboxItemIndicator]", ["rdxMenuCheckboxItemIndicator"], { "keepMounted": { "alias": "keepMounted"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
550
623
  }
551
624
 
552
- interface RdxMenuRadioGroupContext {
553
- value: Signal<string | undefined>;
554
- selectValue: (value: string) => void;
625
+ interface RdxMenuRadioGroupContext<T = unknown> {
626
+ value: Signal<T | undefined>;
627
+ disabled: Signal<boolean>;
628
+ selectValue: (value: T) => void;
555
629
  }
556
- declare const injectRdxMenuRadioGroupContext: _radix_ng_primitives_core.InjectContext<RdxMenuRadioGroupContext>;
557
- declare const provideRdxMenuRadioGroupContext: (useFactory: () => RdxMenuRadioGroupContext) => _angular_core.Provider;
630
+ declare const injectRdxMenuRadioGroupContext: _radix_ng_primitives_core.InjectContext<RdxMenuRadioGroupContext<unknown>>;
631
+ declare const provideRdxMenuRadioGroupContext: (useFactory: () => RdxMenuRadioGroupContext<unknown>) => _angular_core.Provider;
558
632
  /**
559
633
  * Groups radio items in a menu.
560
634
  */
561
- declare class RdxMenuRadioGroup {
635
+ declare class RdxMenuRadioGroup<T = unknown> {
636
+ private hasAppliedDefaultValue;
562
637
  /**
563
638
  * The currently selected value.
564
639
  */
565
- readonly value: _angular_core.ModelSignal<string | undefined>;
640
+ readonly value: _angular_core.ModelSignal<T | undefined>;
641
+ /** The initially selected value for uncontrolled usage. */
642
+ readonly defaultValue: _angular_core.InputSignal<T | undefined>;
643
+ /** Whether all radio items in the group are disabled. */
644
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
566
645
  /**
567
646
  * Emits when the selected value changes.
568
647
  */
569
- readonly onValueChange: _angular_core.OutputEmitterRef<string>;
570
- selectValue(newValue: string): void;
571
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuRadioGroup, never>;
572
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuRadioGroup, "[rdxMenuRadioGroup]", ["rdxMenuRadioGroup"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "onValueChange": "onValueChange"; }, never, never, true, never>;
648
+ readonly onValueChange: _angular_core.OutputEmitterRef<T>;
649
+ readonly labelId: _angular_core.WritableSignal<string | undefined>;
650
+ constructor();
651
+ selectValue(newValue: T): void;
652
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuRadioGroup<any>, never>;
653
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuRadioGroup<any>, "[rdxMenuRadioGroup]", ["rdxMenuRadioGroup"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "defaultValue": { "alias": "defaultValue"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "onValueChange": "onValueChange"; }, never, never, true, never>;
573
654
  }
574
655
 
575
656
  interface RdxMenuRadioItemContext {
@@ -580,13 +661,13 @@ declare const provideRdxMenuRadioItemContext: (useFactory: () => RdxMenuRadioIte
580
661
  /**
581
662
  * A radio item within a menu radio group.
582
663
  */
583
- declare class RdxMenuRadioItem {
664
+ declare class RdxMenuRadioItem<T = unknown> {
584
665
  private readonly rootContext;
585
666
  private readonly radioGroupContext;
586
667
  private readonly elementRef;
587
668
  private readonly isFocused;
588
669
  /** The value of this radio item. */
589
- readonly value: _angular_core.InputSignal<string>;
670
+ readonly value: _angular_core.InputSignal<T>;
590
671
  /** Whether this item is disabled. */
591
672
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
592
673
  /** Whether selecting closes the menu. Defaults to false — radio items stay open. */
@@ -594,19 +675,21 @@ declare class RdxMenuRadioItem {
594
675
  /** Explicit typeahead label. When set, overrides textContent for character search. */
595
676
  readonly label: _angular_core.InputSignal<string | undefined>;
596
677
  /** Emits when this item is selected. */
597
- readonly onSelect: _angular_core.OutputEmitterRef<string>;
678
+ readonly onSelect: _angular_core.OutputEmitterRef<T>;
598
679
  readonly checked: Signal<boolean>;
599
680
  protected readonly highlighted: Signal<boolean>;
681
+ protected readonly effectiveDisabled: Signal<boolean>;
600
682
  protected readonly getCheckedState: typeof getCheckedState;
601
683
  onFocus(): void;
602
684
  onBlur(): void;
603
685
  onPointerMove(event: PointerEvent): void;
604
686
  onPointerLeave(event: PointerEvent): void;
605
687
  onItemClick(): void;
688
+ onMouseUp(event: MouseEvent): void;
606
689
  protected onActivate(event: Event): void;
607
690
  private selectItem;
608
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuRadioItem, never>;
609
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuRadioItem, "[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>;
691
+ 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>;
610
693
  }
611
694
 
612
695
  /**
@@ -623,11 +706,17 @@ declare class RdxMenuRadioItemIndicator {
623
706
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuRadioItemIndicator, "[rdxMenuRadioItemIndicator]", ["rdxMenuRadioItemIndicator"], { "keepMounted": { "alias": "keepMounted"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
624
707
  }
625
708
 
709
+ interface RdxMenuGroupContext {
710
+ labelId: WritableSignal<string | undefined>;
711
+ }
712
+ declare const injectRdxMenuGroupContext: _radix_ng_primitives_core.InjectContext<RdxMenuGroupContext>;
713
+ declare const provideRdxMenuGroupContext: (useFactory: () => RdxMenuGroupContext) => _angular_core.Provider;
714
+
626
715
  declare class RdxMenuModule {
627
716
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuModule, never>;
628
717
  static ɵmod: _angular_core.ɵɵNgModuleDeclaration<RdxMenuModule, never, [typeof RdxMenuRoot, typeof RdxMenuTrigger, typeof RdxMenuSubTrigger, typeof RdxMenuPortal, typeof RdxMenuPortalMisuseGuard, typeof RdxMenuPositioner, typeof RdxMenuPopup, typeof RdxMenuViewport, typeof RdxMenuBackdrop, typeof RdxMenuArrow, typeof RdxMenuItem, typeof RdxMenuLinkItem, typeof RdxMenuGroup, typeof RdxMenuGroupLabel, typeof RdxMenuSeparator, typeof RdxMenuCheckboxItem, typeof RdxMenuCheckboxItemIndicator, typeof RdxMenuRadioGroup, typeof RdxMenuRadioItem, typeof RdxMenuRadioItemIndicator], [typeof RdxMenuRoot, typeof RdxMenuTrigger, typeof RdxMenuSubTrigger, typeof RdxMenuPortal, typeof RdxMenuPortalMisuseGuard, typeof RdxMenuPositioner, typeof RdxMenuPopup, typeof RdxMenuViewport, typeof RdxMenuBackdrop, typeof RdxMenuArrow, typeof RdxMenuItem, typeof RdxMenuLinkItem, typeof RdxMenuGroup, typeof RdxMenuGroupLabel, typeof RdxMenuSeparator, typeof RdxMenuCheckboxItem, typeof RdxMenuCheckboxItemIndicator, typeof RdxMenuRadioGroup, typeof RdxMenuRadioItem, typeof RdxMenuRadioItemIndicator]>;
629
718
  static ɵinj: _angular_core.ɵɵInjectorDeclaration<RdxMenuModule>;
630
719
  }
631
720
 
632
- export { RdxMenuArrow, RdxMenuBackdrop, RdxMenuCheckboxItem, RdxMenuCheckboxItemIndicator, RdxMenuGroup, RdxMenuGroupLabel, RdxMenuItem, RdxMenuLinkItem, RdxMenuModule, RdxMenuPopup, RdxMenuPortal, RdxMenuPortalMisuseGuard, RdxMenuPositioner, RdxMenuRadioGroup, RdxMenuRadioItem, RdxMenuRadioItemIndicator, RdxMenuRoot, RdxMenuSeparator, RdxMenuSubTrigger, RdxMenuTrigger, RdxMenuViewport, getCheckedState, injectRdxMenuCheckboxItemContext, injectRdxMenuRadioGroupContext, injectRdxMenuRadioItemContext, injectRdxMenuRootContext, isIndeterminate, provideRdxMenuCheckboxItemContext, provideRdxMenuRadioGroupContext, provideRdxMenuRadioItemContext, provideRdxMenuRootContext };
633
- export type { CheckedState, RdxMenuAutoFocus, RdxMenuAutoFocusInput, RdxMenuCheckboxItemContext, RdxMenuOrientation, RdxMenuRadioGroupContext, RdxMenuRadioItemContext, RdxMenuRootContext, RdxMenuTransitionStatus, RdxMenuTriggerInteraction, RdxMenuTriggerInteractionHandler };
721
+ export { RdxMenuArrow, RdxMenuBackdrop, RdxMenuCheckboxItem, RdxMenuCheckboxItemIndicator, RdxMenuGroup, RdxMenuGroupLabel, RdxMenuItem, RdxMenuLinkItem, RdxMenuModule, RdxMenuPopup, RdxMenuPortal, RdxMenuPortalMisuseGuard, RdxMenuPositioner, RdxMenuRadioGroup, RdxMenuRadioItem, RdxMenuRadioItemIndicator, RdxMenuRoot, RdxMenuSeparator, RdxMenuSubTrigger, RdxMenuTrigger, RdxMenuViewport, getCheckedState, injectRdxMenuCheckboxItemContext, injectRdxMenuGroupContext, injectRdxMenuRadioGroupContext, injectRdxMenuRadioItemContext, injectRdxMenuRootContext, isIndeterminate, provideRdxMenuCheckboxItemContext, provideRdxMenuGroupContext, provideRdxMenuRadioGroupContext, provideRdxMenuRadioItemContext, provideRdxMenuRootContext };
722
+ export type { CheckedState, RdxMenuAutoFocus, RdxMenuAutoFocusInput, RdxMenuCheckboxItemContext, RdxMenuGroupContext, RdxMenuOpenChange, RdxMenuOpenChangeEventDetails, RdxMenuOpenChangeReason, RdxMenuOrientation, RdxMenuParentType, RdxMenuRadioGroupContext, RdxMenuRadioItemContext, RdxMenuRootContext, RdxMenuTransitionStatus, RdxMenuTriggerInteraction, RdxMenuTriggerInteractionHandler };