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

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 (97) 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-combobox.mjs +1305 -572
  11. package/fesm2022/radix-ng-primitives-combobox.mjs.map +1 -1
  12. package/fesm2022/radix-ng-primitives-config.mjs +13 -4
  13. package/fesm2022/radix-ng-primitives-config.mjs.map +1 -1
  14. package/fesm2022/radix-ng-primitives-context-menu.mjs +51 -10
  15. package/fesm2022/radix-ng-primitives-context-menu.mjs.map +1 -1
  16. package/fesm2022/radix-ng-primitives-core.mjs +1345 -64
  17. package/fesm2022/radix-ng-primitives-core.mjs.map +1 -1
  18. package/fesm2022/radix-ng-primitives-date-field.mjs +5 -3
  19. package/fesm2022/radix-ng-primitives-date-field.mjs.map +1 -1
  20. package/fesm2022/radix-ng-primitives-dialog.mjs +240 -112
  21. package/fesm2022/radix-ng-primitives-dialog.mjs.map +1 -1
  22. package/fesm2022/radix-ng-primitives-direction-provider.mjs +70 -0
  23. package/fesm2022/radix-ng-primitives-direction-provider.mjs.map +1 -0
  24. package/fesm2022/radix-ng-primitives-dismissable-layer.mjs +519 -184
  25. package/fesm2022/radix-ng-primitives-dismissable-layer.mjs.map +1 -1
  26. package/fesm2022/radix-ng-primitives-drawer.mjs +3 -3
  27. package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
  28. package/fesm2022/radix-ng-primitives-field.mjs +3 -2
  29. package/fesm2022/radix-ng-primitives-field.mjs.map +1 -1
  30. package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs +517 -0
  31. package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs.map +1 -0
  32. package/fesm2022/radix-ng-primitives-focus-scope.mjs +296 -70
  33. package/fesm2022/radix-ng-primitives-focus-scope.mjs.map +1 -1
  34. package/fesm2022/radix-ng-primitives-menu.mjs +861 -286
  35. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  36. package/fesm2022/radix-ng-primitives-menubar.mjs +32 -4
  37. package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
  38. package/fesm2022/radix-ng-primitives-navigation-menu.mjs +144 -159
  39. package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
  40. package/fesm2022/radix-ng-primitives-popover.mjs +220 -205
  41. package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
  42. package/fesm2022/radix-ng-primitives-popper.mjs +94 -51
  43. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  44. package/fesm2022/radix-ng-primitives-presence.mjs +1 -1
  45. package/fesm2022/radix-ng-primitives-presence.mjs.map +1 -1
  46. package/fesm2022/radix-ng-primitives-preview-card.mjs +141 -173
  47. package/fesm2022/radix-ng-primitives-preview-card.mjs.map +1 -1
  48. package/fesm2022/radix-ng-primitives-roving-focus.mjs +4 -2
  49. package/fesm2022/radix-ng-primitives-roving-focus.mjs.map +1 -1
  50. package/fesm2022/radix-ng-primitives-scroll-area.mjs +5 -4
  51. package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -1
  52. package/fesm2022/radix-ng-primitives-select.mjs +211 -156
  53. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  54. package/fesm2022/radix-ng-primitives-slider.mjs +5 -3
  55. package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
  56. package/fesm2022/radix-ng-primitives-stepper.mjs +5 -3
  57. package/fesm2022/radix-ng-primitives-stepper.mjs.map +1 -1
  58. package/fesm2022/radix-ng-primitives-time-field.mjs +5 -3
  59. package/fesm2022/radix-ng-primitives-time-field.mjs.map +1 -1
  60. package/fesm2022/radix-ng-primitives-toast.mjs +15 -36
  61. package/fesm2022/radix-ng-primitives-toast.mjs.map +1 -1
  62. package/fesm2022/radix-ng-primitives-toggle-group.mjs +5 -3
  63. package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
  64. package/fesm2022/radix-ng-primitives-toolbar.mjs +5 -3
  65. package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
  66. package/fesm2022/radix-ng-primitives-tooltip.mjs +73 -110
  67. package/fesm2022/radix-ng-primitives-tooltip.mjs.map +1 -1
  68. package/package.json +10 -1
  69. package/types/radix-ng-primitives-accordion.d.ts +4 -3
  70. package/types/radix-ng-primitives-autocomplete.d.ts +217 -152
  71. package/types/radix-ng-primitives-calendar.d.ts +5 -3
  72. package/types/radix-ng-primitives-combobox.d.ts +672 -283
  73. package/types/radix-ng-primitives-config.d.ts +1 -1
  74. package/types/radix-ng-primitives-context-menu.d.ts +15 -5
  75. package/types/radix-ng-primitives-core.d.ts +762 -14
  76. package/types/radix-ng-primitives-date-field.d.ts +3 -2
  77. package/types/radix-ng-primitives-dialog.d.ts +77 -32
  78. package/types/radix-ng-primitives-direction-provider.d.ts +41 -0
  79. package/types/radix-ng-primitives-dismissable-layer.d.ts +147 -99
  80. package/types/radix-ng-primitives-field.d.ts +1 -0
  81. package/types/radix-ng-primitives-floating-focus-manager.d.ts +175 -0
  82. package/types/radix-ng-primitives-focus-scope.d.ts +132 -1
  83. package/types/radix-ng-primitives-menu.d.ts +186 -103
  84. package/types/radix-ng-primitives-navigation-menu.d.ts +37 -75
  85. package/types/radix-ng-primitives-popover.d.ts +59 -92
  86. package/types/radix-ng-primitives-popper.d.ts +39 -9
  87. package/types/radix-ng-primitives-preview-card.d.ts +39 -72
  88. package/types/radix-ng-primitives-roving-focus.d.ts +7 -6
  89. package/types/radix-ng-primitives-scroll-area.d.ts +2 -2
  90. package/types/radix-ng-primitives-select.d.ts +145 -108
  91. package/types/radix-ng-primitives-slider.d.ts +5 -4
  92. package/types/radix-ng-primitives-stepper.d.ts +4 -3
  93. package/types/radix-ng-primitives-time-field.d.ts +3 -2
  94. package/types/radix-ng-primitives-toast.d.ts +7 -7
  95. package/types/radix-ng-primitives-toggle-group.d.ts +5 -4
  96. package/types/radix-ng-primitives-toolbar.d.ts +3 -2
  97. package/types/radix-ng-primitives-tooltip.d.ts +24 -67
@@ -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 i3 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,85 @@ 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>;
38
74
  transitionStatus: Signal<RdxMenuTransitionStatus>;
39
- close: () => void;
40
- toggle: () => void;
41
- show: (autoFocus?: RdxMenuAutoFocusInput) => void;
75
+ close: (reason?: RdxMenuOpenChangeReason, event?: Event) => void;
76
+ /** Close this menu and every ancestor — used by item selection (the whole menu dismisses). */
77
+ closeEntireMenu: (reason?: RdxMenuOpenChangeReason, event?: Event) => void;
78
+ toggle: (reason?: RdxMenuOpenChangeReason, event?: Event) => void;
79
+ show: (autoFocus?: RdxMenuAutoFocusInput, reason?: RdxMenuOpenChangeReason, event?: Event) => void;
42
80
  /** Open the menu without moving focus into the popup (used for menubar hover-switching). */
43
- showWithoutAutoFocus: () => void;
81
+ showWithoutAutoFocus: (reason?: RdxMenuOpenChangeReason, event?: Event) => void;
44
82
  registerTrigger: (el: HTMLElement) => () => void;
45
83
  registerPopup: (el: HTMLElement) => () => void;
46
84
  registerTransitionElement: (element: HTMLElement) => () => void;
47
85
  registerPopupArrowNavigationHandler: (handler: (offset: 1 | -1) => boolean) => () => void;
48
86
  registerTriggerInteractionHandler: (handler: RdxMenuTriggerInteractionHandler) => () => void;
49
87
  markAsSubmenu: () => void;
88
+ /** Marks this menu as the root of a Context Menu (called by `RdxContextMenuRoot`). */
89
+ markAsContextMenu: () => void;
90
+ setAllowMouseUpTrigger: (value: boolean) => void;
50
91
  closeParent: () => void;
51
92
  handlePopupArrowNavigation: (offset: 1 | -1) => boolean;
52
93
  handleTriggerInteraction: (interaction: RdxMenuTriggerInteraction) => boolean;
53
94
  }
54
95
  type RdxMenuTriggerInteraction = {
55
96
  type: 'click';
97
+ } | {
98
+ type: 'enter';
99
+ event: Event;
100
+ } | {
101
+ type: 'space';
102
+ event: Event;
56
103
  } | {
57
104
  type: 'pointerenter';
58
105
  event: PointerEvent;
@@ -86,6 +133,14 @@ declare const provideRdxMenuRootContext: (useFactory: () => RdxMenuRootContext)
86
133
  */
87
134
  declare class RdxMenuRoot {
88
135
  private readonly popper;
136
+ private readonly parentRoot;
137
+ private readonly providedDirection;
138
+ /**
139
+ * The shared per-popup floating context (ADR 0015 §1) — `open` mirrors this menu's open state, the
140
+ * trigger registry is bridged from {@link registerTrigger}, and the reference / floating elements are
141
+ * set by the trigger / popup. The new dismissal engine reads this once the popup migrates.
142
+ */
143
+ readonly floatingContext: RdxFloatingRootContext;
89
144
  /** Shared open/close transition state machine (completes on the real animationend). */
90
145
  private readonly transition;
91
146
  private registeredTrigger;
@@ -98,7 +153,10 @@ declare class RdxMenuRoot {
98
153
  readonly defaultOpen: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
99
154
  /** Whether interactions with the menu are disabled. */
100
155
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
101
- /** Whether the menu should block outside interactions. */
156
+ /**
157
+ * Whether the menu should block outside interactions and page scrolling.
158
+ * Nested menus are always non-modal.
159
+ */
102
160
  readonly modal: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
103
161
  /** Whether keyboard navigation wraps at list boundaries. */
104
162
  readonly loopFocus: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
@@ -106,10 +164,12 @@ declare class RdxMenuRoot {
106
164
  readonly highlightItemOnHover: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
107
165
  /** The menu orientation. */
108
166
  readonly orientation: _angular_core.InputSignal<RdxMenuOrientation>;
167
+ /** Text direction for submenu arrow-key behavior. Inherited by nested submenu roots. */
168
+ readonly dirInput: _angular_core.InputSignal<Direction | undefined>;
109
169
  /** Whether pressing Escape inside a submenu closes the whole menu chain. */
110
170
  readonly closeParentOnEsc: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
111
171
  /** Emits when the open state changes. */
112
- readonly onOpenChange: _angular_core.OutputEmitterRef<boolean>;
172
+ readonly onOpenChange: _angular_core.OutputEmitterRef<RdxMenuOpenChange>;
113
173
  /** Emits when the open/close CSS transition or animation finishes. */
114
174
  readonly onOpenChangeComplete: _angular_core.OutputEmitterRef<boolean>;
115
175
  readonly trigger: _angular_core.WritableSignal<HTMLElement | undefined>;
@@ -118,12 +178,40 @@ declare class RdxMenuRoot {
118
178
  /** Whether the popup grabs focus when it opens. Set false for menubar hover-switching. */
119
179
  readonly autoFocus: _angular_core.WritableSignal<RdxMenuAutoFocus>;
120
180
  readonly isSubmenu: _angular_core.WritableSignal<boolean>;
181
+ /** Set by `RdxContextMenuRoot` (it composes this root) — distinguishes a context menu from a dropdown. */
182
+ readonly isContextMenu: _angular_core.WritableSignal<boolean>;
121
183
  readonly hasTriggerInteractionHandler: _angular_core.WritableSignal<boolean>;
184
+ private readonly preventUnmountOnClose;
185
+ /**
186
+ * What kind of parent this menu has (Base UI `MenuParent.type`). A submenu wins over everything (its
187
+ * parent is a menu); otherwise a context-menu marker, then a menubar (detected by the trigger
188
+ * interaction handler the menubar registers), else a standalone dropdown.
189
+ */
190
+ readonly parentType: Signal<RdxMenuParentType>;
191
+ /** The reason for the most recent open-change (Base UI open-change `reason`), for the per-kind policy. */
192
+ readonly lastOpenChangeReason: _angular_core.WritableSignal<RdxMenuOpenChangeReason>;
193
+ private readonly localAllowMouseUpTrigger;
194
+ readonly allowMouseUpTrigger: Signal<boolean>;
195
+ /** Whether the current open was initiated by **touch** (ADR 0016 §3 — gates the anchored scroll lock). */
196
+ readonly openedByTouch: _angular_core.WritableSignal<boolean>;
197
+ readonly openInteractionType: _angular_core.WritableSignal<RdxInteractionType>;
198
+ readonly closeInteractionType: _angular_core.WritableSignal<RdxInteractionType>;
199
+ readonly effectiveDisabled: Signal<boolean>;
200
+ readonly dir: Signal<Direction>;
201
+ readonly effectiveModal: Signal<boolean>;
122
202
  readonly state: Signal<"open" | "closed">;
203
+ readonly present: Signal<boolean>;
123
204
  constructor();
124
- show(autoFocus?: RdxMenuAutoFocusInput): void;
125
- close(): void;
126
- toggle(): void;
205
+ show(autoFocus?: RdxMenuAutoFocusInput, reason?: RdxMenuOpenChangeReason, event?: Event): void;
206
+ close(reason?: RdxMenuOpenChangeReason, event?: Event): void;
207
+ toggle(reason?: RdxMenuOpenChangeReason, event?: Event): void;
208
+ markAsContextMenu(): void;
209
+ setAllowMouseUpTrigger(value: boolean): void;
210
+ /**
211
+ * Close this menu **and every ancestor menu** in the chain. Selecting an item dismisses the whole
212
+ * menu, not just the innermost submenu (a submenu's `close()` would leave its parents open).
213
+ */
214
+ closeEntireMenu(reason?: RdxMenuOpenChangeReason, event?: Event): void;
127
215
  registerTrigger(el: HTMLElement): () => void;
128
216
  registerPopup(el: HTMLElement): () => void;
129
217
  registerTransitionElement(element: HTMLElement): () => void;
@@ -133,8 +221,9 @@ declare class RdxMenuRoot {
133
221
  handleTriggerInteraction(interaction: RdxMenuTriggerInteraction): boolean;
134
222
  markAsSubmenu(): void;
135
223
  closeParent(): void;
224
+ private createOpenChangeEvent;
136
225
  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: {}; }]>;
226
+ 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
227
  }
139
228
 
140
229
  /**
@@ -144,9 +233,14 @@ declare class RdxMenuTrigger {
144
233
  protected readonly rootContext: _radix_ng_primitives_menu.RdxMenuRootContext;
145
234
  private readonly elementRef;
146
235
  private readonly destroyRef;
147
- private readonly dismissableLayersContext;
236
+ private readonly isBrowser;
148
237
  private openTimer;
149
238
  private closeTimer;
239
+ private allowMouseUpTriggerTimer;
240
+ private lastPointer;
241
+ private openedByHover;
242
+ private ignoreNextClick;
243
+ private readonly handleDocumentMouseUp;
150
244
  /** Whether this trigger should be treated as a native button. Auto-detected for `<button>`. */
151
245
  readonly nativeButton: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
152
246
  /** Whether this trigger is disabled. */
@@ -160,7 +254,8 @@ declare class RdxMenuTrigger {
160
254
  protected readonly nativeButtonState: _angular_core.Signal<boolean>;
161
255
  protected readonly isDisabled: _angular_core.Signal<boolean>;
162
256
  constructor();
163
- protected handleClick(): void;
257
+ protected handleMouseDown(event: MouseEvent): void;
258
+ protected handleClick(event: MouseEvent): void;
164
259
  protected handleArrowDown(event: Event): void;
165
260
  protected handleArrowUp(event: Event): void;
166
261
  protected handleArrowLeft(event: Event): void;
@@ -171,8 +266,13 @@ declare class RdxMenuTrigger {
171
266
  protected handleKeyboardToggle(event: Event): void;
172
267
  protected handlePointerEnter(event: PointerEvent): void;
173
268
  protected handlePointerLeave(event: PointerEvent): void;
269
+ protected handlePointerMove(event: PointerEvent): void;
270
+ private scheduleClose;
174
271
  private clearOpenTimer;
175
272
  private clearCloseTimer;
273
+ private armMouseUpGuard;
274
+ private clearMouseUpGuard;
275
+ private restoreKeyboardPopupFocus;
176
276
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuTrigger, never>;
177
277
  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
278
  }
@@ -198,6 +298,7 @@ declare class RdxMenuSubTrigger {
198
298
  private lastPointer;
199
299
  /** Whether the current open was initiated by hover (vs keyboard / click). */
200
300
  private openedByHover;
301
+ private ignoreNextKeyboardClick;
201
302
  /** Whether this trigger (and therefore the submenu) is disabled. */
202
303
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
203
304
  /** Whether this trigger should be treated as a native button. Auto-detected for `<button>`. */
@@ -212,20 +313,24 @@ declare class RdxMenuSubTrigger {
212
313
  readonly label: _angular_core.InputSignal<string | undefined>;
213
314
  /** Highlighted when focused OR while the submenu is open. */
214
315
  protected readonly highlighted: _angular_core.Signal<boolean>;
316
+ protected readonly effectiveDisabled: _angular_core.Signal<boolean>;
215
317
  protected readonly nativeButtonState: _angular_core.Signal<boolean>;
216
318
  constructor();
217
319
  private scheduleClose;
218
320
  protected onFocus(): void;
219
321
  protected onBlur(): void;
220
- protected onClick(): void;
322
+ protected onClick(event: MouseEvent): void;
323
+ protected onEnter(event: Event): void;
221
324
  protected onArrowRight(event: Event): void;
325
+ protected onArrowLeft(event: Event): void;
222
326
  protected onPointerMove(event: PointerEvent): void;
223
327
  protected onPointerLeave(): void;
224
328
  protected clearHighlight(): void;
225
329
  private closeSiblingSubmenus;
226
330
  private clearSiblingHighlights;
331
+ private focusFirstSubmenuItem;
227
332
  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: {}; }]>;
333
+ 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
334
  }
230
335
 
231
336
  /**
@@ -253,68 +358,17 @@ declare class RdxMenuPortalMisuseGuard {
253
358
 
254
359
  /**
255
360
  * Positions the menu against its trigger.
361
+ *
362
+ * A "thin" positioner (ADR 0012): it inherits the popper positioning surface (inputs, `placed`
363
+ * output, unified vars + placement attrs) from {@link RdxPopperContentWrapper} and adds the menu
364
+ * defaults, the open/closed state attributes, and the deprecated `--radix-menu-*` aliases.
256
365
  */
257
- declare class RdxMenuPositioner {
366
+ declare class RdxMenuPositioner extends RdxPopperContentWrapper {
258
367
  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>;
368
+ protected readonly legacyVars: Record<string, string>;
369
+ constructor();
316
370
  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: {}; }]>;
371
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuPositioner, "[rdxMenuPositioner]", ["rdxMenuPositioner"], {}, {}, never, never, true, never>;
318
372
  }
319
373
 
320
374
  /**
@@ -322,11 +376,12 @@ declare class RdxMenuPositioner {
322
376
  */
323
377
  declare class RdxMenuPopup {
324
378
  protected readonly rootContext: _radix_ng_primitives_menu.RdxMenuRootContext;
325
- private readonly dismissableLayer;
379
+ private readonly floatingContext;
380
+ private readonly registration;
381
+ private readonly focusManager;
326
382
  private readonly focusScope;
327
383
  private readonly wrapper;
328
384
  private readonly elementRef;
329
- private readonly dismissableLayersContext;
330
385
  private search;
331
386
  private searchTimer;
332
387
  protected readonly align: _angular_core.Signal<"end" | "start" | "center" | undefined>;
@@ -334,19 +389,19 @@ declare class RdxMenuPopup {
334
389
  /**
335
390
  * Event handler called when the escape key is pressed. Can be prevented.
336
391
  */
337
- readonly escapeKeyDown: _angular_core.OutputRef<KeyboardEvent>;
392
+ readonly escapeKeyDown: _angular_core.OutputEmitterRef<KeyboardEvent>;
338
393
  /**
339
394
  * Event handler called when a pointerdown event happens outside of the popup. Can be prevented.
340
395
  */
341
- readonly pointerDownOutside: _angular_core.OutputRef<PointerEvent>;
396
+ readonly pointerDownOutside: _angular_core.OutputEmitterRef<RdxOutsidePressDomEvent>;
342
397
  /**
343
398
  * Event handler called when focus moves outside of the popup. Can be prevented.
344
399
  */
345
- readonly focusOutside: _angular_core.OutputRef<FocusEvent>;
400
+ readonly focusOutside: _angular_core.OutputEmitterRef<FocusEvent>;
346
401
  /**
347
402
  * Event handler called when an interaction happens outside of the popup. Can be prevented.
348
403
  */
349
- readonly interactOutside: _angular_core.OutputRef<PointerEvent | FocusEvent>;
404
+ readonly interactOutside: _angular_core.OutputEmitterRef<RdxOutsidePressDomEvent | FocusEvent>;
350
405
  /**
351
406
  * Event handler called before focus moves into the popup. Can be prevented.
352
407
  */
@@ -358,8 +413,10 @@ declare class RdxMenuPopup {
358
413
  constructor();
359
414
  protected handleCloseParent(event: Event): void;
360
415
  protected handleKeydown(event: KeyboardEvent): void;
416
+ private scheduleSubmenuKeyboardFocus;
417
+ private applySubmenuKeyboardFocus;
361
418
  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: {}; }]>;
419
+ 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 i3.RdxFloatingFocusManager; inputs: {}; outputs: {}; }]>;
363
420
  }
364
421
 
365
422
  /**
@@ -435,11 +492,13 @@ declare class RdxMenuItem {
435
492
  /** Emits when the item is selected. */
436
493
  readonly onSelect: _angular_core.OutputEmitterRef<void>;
437
494
  protected readonly highlighted: _angular_core.Signal<boolean>;
495
+ protected readonly effectiveDisabled: _angular_core.Signal<boolean>;
438
496
  onFocus(): void;
439
497
  onBlur(): void;
440
498
  onPointerMove(event: PointerEvent): void;
441
499
  onPointerLeave(event: PointerEvent): void;
442
500
  onItemClick(): void;
501
+ onMouseUp(event: MouseEvent): void;
443
502
  protected onActivate(event: Event): void;
444
503
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuItem, never>;
445
504
  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 +520,13 @@ declare class RdxMenuLinkItem {
461
520
  /** Emits when the item is selected. */
462
521
  readonly onSelect: _angular_core.OutputEmitterRef<void>;
463
522
  protected readonly highlighted: _angular_core.Signal<boolean>;
523
+ protected readonly effectiveDisabled: _angular_core.Signal<boolean>;
464
524
  onFocus(): void;
465
525
  onBlur(): void;
466
526
  onPointerMove(event: PointerEvent): void;
467
527
  onPointerLeave(event: PointerEvent): void;
468
528
  onItemClick(event: MouseEvent): void;
529
+ onMouseUp(event: MouseEvent): void;
469
530
  protected onActivate(event: Event): void;
470
531
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuLinkItem, never>;
471
532
  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 +536,7 @@ declare class RdxMenuLinkItem {
475
536
  * Groups related menu items together.
476
537
  */
477
538
  declare class RdxMenuGroup {
539
+ readonly labelId: _angular_core.WritableSignal<string | undefined>;
478
540
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuGroup, never>;
479
541
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuGroup, "[rdxMenuGroup]", ["rdxMenuGroup"], {}, {}, never, never, true, never>;
480
542
  }
@@ -483,6 +545,9 @@ declare class RdxMenuGroup {
483
545
  * A label for a menu group.
484
546
  */
485
547
  declare class RdxMenuGroupLabel {
548
+ private readonly groupContext;
549
+ readonly id: string;
550
+ constructor();
486
551
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuGroupLabel, never>;
487
552
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuGroupLabel, "[rdxMenuGroupLabel]", ["rdxMenuGroupLabel"], {}, {}, never, never, true, never>;
488
553
  }
@@ -522,6 +587,7 @@ declare class RdxMenuCheckboxItem {
522
587
  /** Emits when the checked state changes. */
523
588
  readonly onCheckedChange: _angular_core.OutputEmitterRef<CheckedState>;
524
589
  protected readonly highlighted: Signal<boolean>;
590
+ protected readonly effectiveDisabled: Signal<boolean>;
525
591
  protected readonly isIndeterminate: typeof isIndeterminate;
526
592
  protected readonly getCheckedState: typeof getCheckedState;
527
593
  onFocus(): void;
@@ -529,6 +595,7 @@ declare class RdxMenuCheckboxItem {
529
595
  onPointerMove(event: PointerEvent): void;
530
596
  onPointerLeave(event: PointerEvent): void;
531
597
  onItemClick(): void;
598
+ onMouseUp(event: MouseEvent): void;
532
599
  protected onActivate(event: Event): void;
533
600
  private toggleChecked;
534
601
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuCheckboxItem, never>;
@@ -549,27 +616,35 @@ declare class RdxMenuCheckboxItemIndicator {
549
616
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuCheckboxItemIndicator, "[rdxMenuCheckboxItemIndicator]", ["rdxMenuCheckboxItemIndicator"], { "keepMounted": { "alias": "keepMounted"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
550
617
  }
551
618
 
552
- interface RdxMenuRadioGroupContext {
553
- value: Signal<string | undefined>;
554
- selectValue: (value: string) => void;
619
+ interface RdxMenuRadioGroupContext<T = unknown> {
620
+ value: Signal<T | undefined>;
621
+ disabled: Signal<boolean>;
622
+ selectValue: (value: T) => void;
555
623
  }
556
- declare const injectRdxMenuRadioGroupContext: _radix_ng_primitives_core.InjectContext<RdxMenuRadioGroupContext>;
557
- declare const provideRdxMenuRadioGroupContext: (useFactory: () => RdxMenuRadioGroupContext) => _angular_core.Provider;
624
+ declare const injectRdxMenuRadioGroupContext: _radix_ng_primitives_core.InjectContext<RdxMenuRadioGroupContext<unknown>>;
625
+ declare const provideRdxMenuRadioGroupContext: (useFactory: () => RdxMenuRadioGroupContext<unknown>) => _angular_core.Provider;
558
626
  /**
559
627
  * Groups radio items in a menu.
560
628
  */
561
- declare class RdxMenuRadioGroup {
629
+ declare class RdxMenuRadioGroup<T = unknown> {
630
+ private hasAppliedDefaultValue;
562
631
  /**
563
632
  * The currently selected value.
564
633
  */
565
- readonly value: _angular_core.ModelSignal<string | undefined>;
634
+ readonly value: _angular_core.ModelSignal<T | undefined>;
635
+ /** The initially selected value for uncontrolled usage. */
636
+ readonly defaultValue: _angular_core.InputSignal<T | undefined>;
637
+ /** Whether all radio items in the group are disabled. */
638
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
566
639
  /**
567
640
  * Emits when the selected value changes.
568
641
  */
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>;
642
+ readonly onValueChange: _angular_core.OutputEmitterRef<T>;
643
+ readonly labelId: _angular_core.WritableSignal<string | undefined>;
644
+ constructor();
645
+ selectValue(newValue: T): void;
646
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuRadioGroup<any>, never>;
647
+ 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
648
  }
574
649
 
575
650
  interface RdxMenuRadioItemContext {
@@ -580,13 +655,13 @@ declare const provideRdxMenuRadioItemContext: (useFactory: () => RdxMenuRadioIte
580
655
  /**
581
656
  * A radio item within a menu radio group.
582
657
  */
583
- declare class RdxMenuRadioItem {
658
+ declare class RdxMenuRadioItem<T = unknown> {
584
659
  private readonly rootContext;
585
660
  private readonly radioGroupContext;
586
661
  private readonly elementRef;
587
662
  private readonly isFocused;
588
663
  /** The value of this radio item. */
589
- readonly value: _angular_core.InputSignal<string>;
664
+ readonly value: _angular_core.InputSignal<T>;
590
665
  /** Whether this item is disabled. */
591
666
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
592
667
  /** Whether selecting closes the menu. Defaults to false — radio items stay open. */
@@ -594,19 +669,21 @@ declare class RdxMenuRadioItem {
594
669
  /** Explicit typeahead label. When set, overrides textContent for character search. */
595
670
  readonly label: _angular_core.InputSignal<string | undefined>;
596
671
  /** Emits when this item is selected. */
597
- readonly onSelect: _angular_core.OutputEmitterRef<string>;
672
+ readonly onSelect: _angular_core.OutputEmitterRef<T>;
598
673
  readonly checked: Signal<boolean>;
599
674
  protected readonly highlighted: Signal<boolean>;
675
+ protected readonly effectiveDisabled: Signal<boolean>;
600
676
  protected readonly getCheckedState: typeof getCheckedState;
601
677
  onFocus(): void;
602
678
  onBlur(): void;
603
679
  onPointerMove(event: PointerEvent): void;
604
680
  onPointerLeave(event: PointerEvent): void;
605
681
  onItemClick(): void;
682
+ onMouseUp(event: MouseEvent): void;
606
683
  protected onActivate(event: Event): void;
607
684
  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>;
685
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuRadioItem<any>, never>;
686
+ 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
687
  }
611
688
 
612
689
  /**
@@ -623,11 +700,17 @@ declare class RdxMenuRadioItemIndicator {
623
700
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuRadioItemIndicator, "[rdxMenuRadioItemIndicator]", ["rdxMenuRadioItemIndicator"], { "keepMounted": { "alias": "keepMounted"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
624
701
  }
625
702
 
703
+ interface RdxMenuGroupContext {
704
+ labelId: WritableSignal<string | undefined>;
705
+ }
706
+ declare const injectRdxMenuGroupContext: _radix_ng_primitives_core.InjectContext<RdxMenuGroupContext>;
707
+ declare const provideRdxMenuGroupContext: (useFactory: () => RdxMenuGroupContext) => _angular_core.Provider;
708
+
626
709
  declare class RdxMenuModule {
627
710
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuModule, never>;
628
711
  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
712
  static ɵinj: _angular_core.ɵɵInjectorDeclaration<RdxMenuModule>;
630
713
  }
631
714
 
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 };
715
+ 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 };
716
+ export type { CheckedState, RdxMenuAutoFocus, RdxMenuAutoFocusInput, RdxMenuCheckboxItemContext, RdxMenuGroupContext, RdxMenuOpenChange, RdxMenuOpenChangeEventDetails, RdxMenuOpenChangeReason, RdxMenuOrientation, RdxMenuParentType, RdxMenuRadioGroupContext, RdxMenuRadioItemContext, RdxMenuRootContext, RdxMenuTransitionStatus, RdxMenuTriggerInteraction, RdxMenuTriggerInteractionHandler };