@radix-ng/primitives 1.0.0-beta.2 → 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 (104) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +76 -6
  3. package/fesm2022/radix-ng-primitives-accordion.mjs +5 -3
  4. package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -1
  5. package/fesm2022/radix-ng-primitives-alert-dialog.mjs +31 -24
  6. package/fesm2022/radix-ng-primitives-alert-dialog.mjs.map +1 -1
  7. package/fesm2022/radix-ng-primitives-autocomplete.mjs +1744 -0
  8. package/fesm2022/radix-ng-primitives-autocomplete.mjs.map +1 -0
  9. package/fesm2022/radix-ng-primitives-calendar.mjs +5 -3
  10. package/fesm2022/radix-ng-primitives-calendar.mjs.map +1 -1
  11. package/fesm2022/radix-ng-primitives-combobox.mjs +1399 -606
  12. package/fesm2022/radix-ng-primitives-combobox.mjs.map +1 -1
  13. package/fesm2022/radix-ng-primitives-config.mjs +13 -4
  14. package/fesm2022/radix-ng-primitives-config.mjs.map +1 -1
  15. package/fesm2022/radix-ng-primitives-context-menu.mjs +51 -10
  16. package/fesm2022/radix-ng-primitives-context-menu.mjs.map +1 -1
  17. package/fesm2022/radix-ng-primitives-core.mjs +1345 -64
  18. package/fesm2022/radix-ng-primitives-core.mjs.map +1 -1
  19. package/fesm2022/radix-ng-primitives-date-field.mjs +5 -3
  20. package/fesm2022/radix-ng-primitives-date-field.mjs.map +1 -1
  21. package/fesm2022/radix-ng-primitives-dialog.mjs +271 -145
  22. package/fesm2022/radix-ng-primitives-dialog.mjs.map +1 -1
  23. package/fesm2022/radix-ng-primitives-direction-provider.mjs +70 -0
  24. package/fesm2022/radix-ng-primitives-direction-provider.mjs.map +1 -0
  25. package/fesm2022/radix-ng-primitives-dismissable-layer.mjs +519 -184
  26. package/fesm2022/radix-ng-primitives-dismissable-layer.mjs.map +1 -1
  27. package/fesm2022/radix-ng-primitives-drawer.mjs +154 -64
  28. package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
  29. package/fesm2022/radix-ng-primitives-field.mjs +3 -2
  30. package/fesm2022/radix-ng-primitives-field.mjs.map +1 -1
  31. package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs +517 -0
  32. package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs.map +1 -0
  33. package/fesm2022/radix-ng-primitives-focus-scope.mjs +296 -70
  34. package/fesm2022/radix-ng-primitives-focus-scope.mjs.map +1 -1
  35. package/fesm2022/radix-ng-primitives-menu.mjs +894 -299
  36. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  37. package/fesm2022/radix-ng-primitives-menubar.mjs +32 -4
  38. package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
  39. package/fesm2022/radix-ng-primitives-navigation-menu.mjs +176 -207
  40. package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
  41. package/fesm2022/radix-ng-primitives-popover.mjs +250 -250
  42. package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
  43. package/fesm2022/radix-ng-primitives-popper.mjs +94 -45
  44. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  45. package/fesm2022/radix-ng-primitives-portal.mjs +107 -17
  46. package/fesm2022/radix-ng-primitives-portal.mjs.map +1 -1
  47. package/fesm2022/radix-ng-primitives-presence.mjs +262 -79
  48. package/fesm2022/radix-ng-primitives-presence.mjs.map +1 -1
  49. package/fesm2022/radix-ng-primitives-preview-card.mjs +172 -218
  50. package/fesm2022/radix-ng-primitives-preview-card.mjs.map +1 -1
  51. package/fesm2022/radix-ng-primitives-roving-focus.mjs +4 -2
  52. package/fesm2022/radix-ng-primitives-roving-focus.mjs.map +1 -1
  53. package/fesm2022/radix-ng-primitives-scroll-area.mjs +5 -4
  54. package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -1
  55. package/fesm2022/radix-ng-primitives-select.mjs +303 -234
  56. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  57. package/fesm2022/radix-ng-primitives-slider.mjs +5 -3
  58. package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
  59. package/fesm2022/radix-ng-primitives-stepper.mjs +5 -3
  60. package/fesm2022/radix-ng-primitives-stepper.mjs.map +1 -1
  61. package/fesm2022/radix-ng-primitives-time-field.mjs +5 -3
  62. package/fesm2022/radix-ng-primitives-time-field.mjs.map +1 -1
  63. package/fesm2022/radix-ng-primitives-toast.mjs +15 -36
  64. package/fesm2022/radix-ng-primitives-toast.mjs.map +1 -1
  65. package/fesm2022/radix-ng-primitives-toggle-group.mjs +5 -3
  66. package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
  67. package/fesm2022/radix-ng-primitives-toolbar.mjs +5 -3
  68. package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
  69. package/fesm2022/radix-ng-primitives-tooltip.mjs +105 -145
  70. package/fesm2022/radix-ng-primitives-tooltip.mjs.map +1 -1
  71. package/package.json +14 -1
  72. package/types/radix-ng-primitives-accordion.d.ts +4 -3
  73. package/types/radix-ng-primitives-alert-dialog.d.ts +17 -11
  74. package/types/radix-ng-primitives-autocomplete.d.ts +661 -0
  75. package/types/radix-ng-primitives-calendar.d.ts +5 -3
  76. package/types/radix-ng-primitives-combobox.d.ts +727 -293
  77. package/types/radix-ng-primitives-config.d.ts +1 -1
  78. package/types/radix-ng-primitives-context-menu.d.ts +15 -5
  79. package/types/radix-ng-primitives-core.d.ts +762 -14
  80. package/types/radix-ng-primitives-date-field.d.ts +3 -2
  81. package/types/radix-ng-primitives-dialog.d.ts +107 -55
  82. package/types/radix-ng-primitives-direction-provider.d.ts +41 -0
  83. package/types/radix-ng-primitives-dismissable-layer.d.ts +147 -99
  84. package/types/radix-ng-primitives-drawer.d.ts +49 -22
  85. package/types/radix-ng-primitives-field.d.ts +1 -0
  86. package/types/radix-ng-primitives-floating-focus-manager.d.ts +175 -0
  87. package/types/radix-ng-primitives-focus-scope.d.ts +132 -1
  88. package/types/radix-ng-primitives-menu.d.ts +204 -112
  89. package/types/radix-ng-primitives-navigation-menu.d.ts +61 -101
  90. package/types/radix-ng-primitives-popover.d.ts +82 -115
  91. package/types/radix-ng-primitives-popper.d.ts +46 -10
  92. package/types/radix-ng-primitives-portal.d.ts +53 -8
  93. package/types/radix-ng-primitives-presence.d.ts +98 -17
  94. package/types/radix-ng-primitives-preview-card.d.ts +63 -95
  95. package/types/radix-ng-primitives-roving-focus.d.ts +7 -6
  96. package/types/radix-ng-primitives-scroll-area.d.ts +2 -2
  97. package/types/radix-ng-primitives-select.d.ts +192 -158
  98. package/types/radix-ng-primitives-slider.d.ts +5 -4
  99. package/types/radix-ng-primitives-stepper.d.ts +4 -3
  100. package/types/radix-ng-primitives-time-field.d.ts +3 -2
  101. package/types/radix-ng-primitives-toast.d.ts +7 -7
  102. package/types/radix-ng-primitives-toggle-group.d.ts +5 -4
  103. package/types/radix-ng-primitives-toolbar.d.ts +3 -2
  104. package/types/radix-ng-primitives-tooltip.d.ts +48 -84
@@ -1,14 +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 { RdxPortalContainer } from '@radix-ng/primitives/portal';
11
- import * as i3 from '@radix-ng/primitives/focus-scope';
11
+ import { RdxOutsidePressDomEvent } from '@radix-ng/primitives/dismissable-layer';
12
12
 
13
13
  type RdxMenuTransitionStatus = 'starting' | 'ending' | undefined;
14
14
  /**
@@ -21,39 +21,85 @@ type RdxMenuTransitionStatus = 'starting' | 'ending' | undefined;
21
21
  type RdxMenuAutoFocus = 'first' | 'last' | 'popup' | false;
22
22
  type RdxMenuAutoFocusInput = boolean | RdxMenuAutoFocus;
23
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
+ }
24
47
  interface RdxMenuRootContext {
25
48
  isOpen: Signal<boolean>;
49
+ present: Signal<boolean>;
26
50
  disabled: Signal<boolean>;
27
51
  modal: Signal<boolean>;
28
52
  loopFocus: Signal<boolean>;
29
53
  highlightItemOnHover: Signal<boolean>;
30
54
  orientation: Signal<RdxMenuOrientation>;
55
+ dir: Signal<Direction>;
31
56
  closeParentOnEsc: Signal<boolean>;
32
57
  /** Whether the popup should focus its first item when it opens. */
33
58
  autoFocus: Signal<RdxMenuAutoFocus>;
34
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>;
35
70
  hasTriggerInteractionHandler: Signal<boolean>;
36
71
  trigger: Signal<HTMLElement | undefined>;
37
72
  /** The popup element, once mounted. Used by submenu safe-polygon geometry. */
38
73
  popupElement: Signal<HTMLElement | undefined>;
39
74
  transitionStatus: Signal<RdxMenuTransitionStatus>;
40
- close: () => void;
41
- toggle: () => void;
42
- 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;
43
80
  /** Open the menu without moving focus into the popup (used for menubar hover-switching). */
44
- showWithoutAutoFocus: () => void;
81
+ showWithoutAutoFocus: (reason?: RdxMenuOpenChangeReason, event?: Event) => void;
45
82
  registerTrigger: (el: HTMLElement) => () => void;
46
83
  registerPopup: (el: HTMLElement) => () => void;
47
84
  registerTransitionElement: (element: HTMLElement) => () => void;
48
85
  registerPopupArrowNavigationHandler: (handler: (offset: 1 | -1) => boolean) => () => void;
49
86
  registerTriggerInteractionHandler: (handler: RdxMenuTriggerInteractionHandler) => () => void;
50
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;
51
91
  closeParent: () => void;
52
92
  handlePopupArrowNavigation: (offset: 1 | -1) => boolean;
53
93
  handleTriggerInteraction: (interaction: RdxMenuTriggerInteraction) => boolean;
54
94
  }
55
95
  type RdxMenuTriggerInteraction = {
56
96
  type: 'click';
97
+ } | {
98
+ type: 'enter';
99
+ event: Event;
100
+ } | {
101
+ type: 'space';
102
+ event: Event;
57
103
  } | {
58
104
  type: 'pointerenter';
59
105
  event: PointerEvent;
@@ -87,6 +133,14 @@ declare const provideRdxMenuRootContext: (useFactory: () => RdxMenuRootContext)
87
133
  */
88
134
  declare class RdxMenuRoot {
89
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;
90
144
  /** Shared open/close transition state machine (completes on the real animationend). */
91
145
  private readonly transition;
92
146
  private registeredTrigger;
@@ -99,7 +153,10 @@ declare class RdxMenuRoot {
99
153
  readonly defaultOpen: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
100
154
  /** Whether interactions with the menu are disabled. */
101
155
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
102
- /** 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
+ */
103
160
  readonly modal: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
104
161
  /** Whether keyboard navigation wraps at list boundaries. */
105
162
  readonly loopFocus: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
@@ -107,10 +164,12 @@ declare class RdxMenuRoot {
107
164
  readonly highlightItemOnHover: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
108
165
  /** The menu orientation. */
109
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>;
110
169
  /** Whether pressing Escape inside a submenu closes the whole menu chain. */
111
170
  readonly closeParentOnEsc: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
112
171
  /** Emits when the open state changes. */
113
- readonly onOpenChange: _angular_core.OutputEmitterRef<boolean>;
172
+ readonly onOpenChange: _angular_core.OutputEmitterRef<RdxMenuOpenChange>;
114
173
  /** Emits when the open/close CSS transition or animation finishes. */
115
174
  readonly onOpenChangeComplete: _angular_core.OutputEmitterRef<boolean>;
116
175
  readonly trigger: _angular_core.WritableSignal<HTMLElement | undefined>;
@@ -119,12 +178,40 @@ declare class RdxMenuRoot {
119
178
  /** Whether the popup grabs focus when it opens. Set false for menubar hover-switching. */
120
179
  readonly autoFocus: _angular_core.WritableSignal<RdxMenuAutoFocus>;
121
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>;
122
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>;
123
202
  readonly state: Signal<"open" | "closed">;
203
+ readonly present: Signal<boolean>;
124
204
  constructor();
125
- show(autoFocus?: RdxMenuAutoFocusInput): void;
126
- close(): void;
127
- 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;
128
215
  registerTrigger(el: HTMLElement): () => void;
129
216
  registerPopup(el: HTMLElement): () => void;
130
217
  registerTransitionElement(element: HTMLElement): () => void;
@@ -134,8 +221,9 @@ declare class RdxMenuRoot {
134
221
  handleTriggerInteraction(interaction: RdxMenuTriggerInteraction): boolean;
135
222
  markAsSubmenu(): void;
136
223
  closeParent(): void;
224
+ private createOpenChangeEvent;
137
225
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuRoot, never>;
138
- 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: {}; }]>;
139
227
  }
140
228
 
141
229
  /**
@@ -145,9 +233,14 @@ declare class RdxMenuTrigger {
145
233
  protected readonly rootContext: _radix_ng_primitives_menu.RdxMenuRootContext;
146
234
  private readonly elementRef;
147
235
  private readonly destroyRef;
148
- private readonly dismissableLayersContext;
236
+ private readonly isBrowser;
149
237
  private openTimer;
150
238
  private closeTimer;
239
+ private allowMouseUpTriggerTimer;
240
+ private lastPointer;
241
+ private openedByHover;
242
+ private ignoreNextClick;
243
+ private readonly handleDocumentMouseUp;
151
244
  /** Whether this trigger should be treated as a native button. Auto-detected for `<button>`. */
152
245
  readonly nativeButton: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
153
246
  /** Whether this trigger is disabled. */
@@ -161,7 +254,8 @@ declare class RdxMenuTrigger {
161
254
  protected readonly nativeButtonState: _angular_core.Signal<boolean>;
162
255
  protected readonly isDisabled: _angular_core.Signal<boolean>;
163
256
  constructor();
164
- protected handleClick(): void;
257
+ protected handleMouseDown(event: MouseEvent): void;
258
+ protected handleClick(event: MouseEvent): void;
165
259
  protected handleArrowDown(event: Event): void;
166
260
  protected handleArrowUp(event: Event): void;
167
261
  protected handleArrowLeft(event: Event): void;
@@ -172,8 +266,13 @@ declare class RdxMenuTrigger {
172
266
  protected handleKeyboardToggle(event: Event): void;
173
267
  protected handlePointerEnter(event: PointerEvent): void;
174
268
  protected handlePointerLeave(event: PointerEvent): void;
269
+ protected handlePointerMove(event: PointerEvent): void;
270
+ private scheduleClose;
175
271
  private clearOpenTimer;
176
272
  private clearCloseTimer;
273
+ private armMouseUpGuard;
274
+ private clearMouseUpGuard;
275
+ private restoreKeyboardPopupFocus;
177
276
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuTrigger, never>;
178
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: {}; }]>;
179
278
  }
@@ -199,6 +298,7 @@ declare class RdxMenuSubTrigger {
199
298
  private lastPointer;
200
299
  /** Whether the current open was initiated by hover (vs keyboard / click). */
201
300
  private openedByHover;
301
+ private ignoreNextKeyboardClick;
202
302
  /** Whether this trigger (and therefore the submenu) is disabled. */
203
303
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
204
304
  /** Whether this trigger should be treated as a native button. Auto-detected for `<button>`. */
@@ -213,99 +313,62 @@ declare class RdxMenuSubTrigger {
213
313
  readonly label: _angular_core.InputSignal<string | undefined>;
214
314
  /** Highlighted when focused OR while the submenu is open. */
215
315
  protected readonly highlighted: _angular_core.Signal<boolean>;
316
+ protected readonly effectiveDisabled: _angular_core.Signal<boolean>;
216
317
  protected readonly nativeButtonState: _angular_core.Signal<boolean>;
217
318
  constructor();
218
319
  private scheduleClose;
219
320
  protected onFocus(): void;
220
321
  protected onBlur(): void;
221
- protected onClick(): void;
322
+ protected onClick(event: MouseEvent): void;
323
+ protected onEnter(event: Event): void;
222
324
  protected onArrowRight(event: Event): void;
325
+ protected onArrowLeft(event: Event): void;
223
326
  protected onPointerMove(event: PointerEvent): void;
224
327
  protected onPointerLeave(): void;
225
328
  protected clearHighlight(): void;
226
329
  private closeSiblingSubmenus;
227
330
  private clearSiblingHighlights;
331
+ private focusFirstSubmenuItem;
228
332
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuSubTrigger, never>;
229
- 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: {}; }]>;
230
334
  }
231
335
 
232
336
  /**
233
- * Moves the menu to a different part of the DOM.
234
- * Applied on ng-template no host bindings (ng-template is not a real DOM node).
337
+ * Structural directive that teleports the menu popup into a container (default `document.body`) while
338
+ * the menu is open, and keeps it mounted until any CSS exit `@keyframes` finishes.
339
+ *
340
+ * This replaces the consumer-owned `@if (root.open())` mount: it adds both teleporting *and*
341
+ * exit-animation support. Apply it with the `*` microsyntax on the positioner —
342
+ * `<div *rdxMenuPortal rdxMenuPositioner>` — or as an explicit `<ng-template rdxMenuPortal>`. For a
343
+ * custom container, or a backdrop alongside the positioner (multi-root), use the explicit form.
235
344
  */
236
345
  declare class RdxMenuPortal {
237
- /**
238
- * Optional container to portal the content into. Defaults to `document.body`.
239
- */
240
- readonly container: _angular_core.InputSignal<RdxPortalContainer | undefined>;
241
346
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuPortal, never>;
242
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuPortal, "[rdxMenuPortal]", ["rdxMenuPortal"], { "container": { "alias": "container"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1$1.RdxPortal; inputs: { "container": "container"; }; outputs: {}; }]>;
347
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuPortal, "ng-template[rdxMenuPortal]", ["rdxMenuPortal"], {}, {}, never, never, true, [{ directive: typeof i1$1.RdxPortalPresence; inputs: { "container": "container"; }; outputs: {}; }]>;
348
+ }
349
+ /**
350
+ * Dev-mode guard: `rdxMenuPortal` is a structural directive. The old `<div rdxMenuPortal>` markup
351
+ * would silently stop portaling — fail loudly instead.
352
+ */
353
+ declare class RdxMenuPortalMisuseGuard {
354
+ constructor();
355
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuPortalMisuseGuard, never>;
356
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuPortalMisuseGuard, "[rdxMenuPortal]:not(ng-template)", never, {}, {}, never, never, true, never>;
243
357
  }
244
358
 
245
359
  /**
246
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.
247
365
  */
248
- declare class RdxMenuPositioner {
366
+ declare class RdxMenuPositioner extends RdxPopperContentWrapper {
249
367
  protected readonly rootContext: _radix_ng_primitives_menu.RdxMenuRootContext;
250
- protected readonly wrapper: RdxPopperContentWrapper;
251
- /**
252
- * An element to position the popup against. Defaults to the trigger.
253
- */
254
- readonly anchor: _angular_core.InputSignal<RdxPopperAnchorElement>;
255
- /**
256
- * The preferred side of the trigger to render against when open.
257
- */
258
- readonly side: _angular_core.InputSignal<"top" | "right" | "bottom" | "left">;
259
- /**
260
- * Distance between the trigger and the popup in pixels.
261
- */
262
- readonly sideOffset: _angular_core.InputSignalWithTransform<number, NumberInput>;
263
- /**
264
- * How to align the popup relative to the specified side.
265
- */
266
- readonly align: _angular_core.InputSignal<"end" | "start" | "center">;
267
- /**
268
- * An offset in pixels from the `start` or `end` alignment options.
269
- */
270
- readonly alignOffset: _angular_core.InputSignalWithTransform<number, NumberInput>;
271
- /**
272
- * Minimum distance to maintain between the arrow and the edges of the popup.
273
- */
274
- readonly arrowPadding: _angular_core.InputSignalWithTransform<number, NumberInput>;
275
- /**
276
- * Whether to override side and alignment preferences to prevent collisions.
277
- */
278
- readonly avoidCollisions: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
279
- /**
280
- * The element used as the collision boundary.
281
- */
282
- readonly collisionBoundary: _angular_core.InputSignal<ElementRef<HTMLElement> | ElementRef<HTMLElement>[] | undefined>;
283
- /**
284
- * Distance in pixels from the boundary edges where collision detection should occur.
285
- */
286
- readonly collisionPadding: _angular_core.InputSignal<number | Partial<Record<"top" | "right" | "bottom" | "left", number>>>;
287
- /**
288
- * The sticky behavior on the alignment axis.
289
- */
290
- readonly sticky: _angular_core.InputSignal<"always" | "partial">;
291
- /**
292
- * Whether to hide the popup when the trigger becomes fully occluded.
293
- */
294
- readonly hideWhenDetached: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
295
- /**
296
- * The CSS position strategy used by Floating UI.
297
- */
298
- readonly positionStrategy: _angular_core.InputSignal<"fixed" | "absolute">;
299
- /**
300
- * Whether to update position on every animation frame.
301
- */
302
- readonly updatePositionStrategy: _angular_core.InputSignal<"always" | "optimized">;
303
- /**
304
- * Emits when the popup has been placed.
305
- */
306
- readonly placed: _angular_core.OutputRef<void>;
368
+ protected readonly legacyVars: Record<string, string>;
369
+ constructor();
307
370
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuPositioner, never>;
308
- 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>;
309
372
  }
310
373
 
311
374
  /**
@@ -313,11 +376,12 @@ declare class RdxMenuPositioner {
313
376
  */
314
377
  declare class RdxMenuPopup {
315
378
  protected readonly rootContext: _radix_ng_primitives_menu.RdxMenuRootContext;
316
- private readonly dismissableLayer;
379
+ private readonly floatingContext;
380
+ private readonly registration;
381
+ private readonly focusManager;
317
382
  private readonly focusScope;
318
383
  private readonly wrapper;
319
384
  private readonly elementRef;
320
- private readonly dismissableLayersContext;
321
385
  private search;
322
386
  private searchTimer;
323
387
  protected readonly align: _angular_core.Signal<"end" | "start" | "center" | undefined>;
@@ -325,19 +389,19 @@ declare class RdxMenuPopup {
325
389
  /**
326
390
  * Event handler called when the escape key is pressed. Can be prevented.
327
391
  */
328
- readonly escapeKeyDown: _angular_core.OutputRef<KeyboardEvent>;
392
+ readonly escapeKeyDown: _angular_core.OutputEmitterRef<KeyboardEvent>;
329
393
  /**
330
394
  * Event handler called when a pointerdown event happens outside of the popup. Can be prevented.
331
395
  */
332
- readonly pointerDownOutside: _angular_core.OutputRef<PointerEvent>;
396
+ readonly pointerDownOutside: _angular_core.OutputEmitterRef<RdxOutsidePressDomEvent>;
333
397
  /**
334
398
  * Event handler called when focus moves outside of the popup. Can be prevented.
335
399
  */
336
- readonly focusOutside: _angular_core.OutputRef<FocusEvent>;
400
+ readonly focusOutside: _angular_core.OutputEmitterRef<FocusEvent>;
337
401
  /**
338
402
  * Event handler called when an interaction happens outside of the popup. Can be prevented.
339
403
  */
340
- readonly interactOutside: _angular_core.OutputRef<PointerEvent | FocusEvent>;
404
+ readonly interactOutside: _angular_core.OutputEmitterRef<RdxOutsidePressDomEvent | FocusEvent>;
341
405
  /**
342
406
  * Event handler called before focus moves into the popup. Can be prevented.
343
407
  */
@@ -349,8 +413,10 @@ declare class RdxMenuPopup {
349
413
  constructor();
350
414
  protected handleCloseParent(event: Event): void;
351
415
  protected handleKeydown(event: KeyboardEvent): void;
416
+ private scheduleSubmenuKeyboardFocus;
417
+ private applySubmenuKeyboardFocus;
352
418
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuPopup, never>;
353
- 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: {}; }]>;
354
420
  }
355
421
 
356
422
  /**
@@ -426,11 +492,13 @@ declare class RdxMenuItem {
426
492
  /** Emits when the item is selected. */
427
493
  readonly onSelect: _angular_core.OutputEmitterRef<void>;
428
494
  protected readonly highlighted: _angular_core.Signal<boolean>;
495
+ protected readonly effectiveDisabled: _angular_core.Signal<boolean>;
429
496
  onFocus(): void;
430
497
  onBlur(): void;
431
498
  onPointerMove(event: PointerEvent): void;
432
499
  onPointerLeave(event: PointerEvent): void;
433
500
  onItemClick(): void;
501
+ onMouseUp(event: MouseEvent): void;
434
502
  protected onActivate(event: Event): void;
435
503
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuItem, never>;
436
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>;
@@ -452,11 +520,13 @@ declare class RdxMenuLinkItem {
452
520
  /** Emits when the item is selected. */
453
521
  readonly onSelect: _angular_core.OutputEmitterRef<void>;
454
522
  protected readonly highlighted: _angular_core.Signal<boolean>;
523
+ protected readonly effectiveDisabled: _angular_core.Signal<boolean>;
455
524
  onFocus(): void;
456
525
  onBlur(): void;
457
526
  onPointerMove(event: PointerEvent): void;
458
527
  onPointerLeave(event: PointerEvent): void;
459
528
  onItemClick(event: MouseEvent): void;
529
+ onMouseUp(event: MouseEvent): void;
460
530
  protected onActivate(event: Event): void;
461
531
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuLinkItem, never>;
462
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>;
@@ -466,6 +536,7 @@ declare class RdxMenuLinkItem {
466
536
  * Groups related menu items together.
467
537
  */
468
538
  declare class RdxMenuGroup {
539
+ readonly labelId: _angular_core.WritableSignal<string | undefined>;
469
540
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuGroup, never>;
470
541
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuGroup, "[rdxMenuGroup]", ["rdxMenuGroup"], {}, {}, never, never, true, never>;
471
542
  }
@@ -474,6 +545,9 @@ declare class RdxMenuGroup {
474
545
  * A label for a menu group.
475
546
  */
476
547
  declare class RdxMenuGroupLabel {
548
+ private readonly groupContext;
549
+ readonly id: string;
550
+ constructor();
477
551
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuGroupLabel, never>;
478
552
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuGroupLabel, "[rdxMenuGroupLabel]", ["rdxMenuGroupLabel"], {}, {}, never, never, true, never>;
479
553
  }
@@ -513,6 +587,7 @@ declare class RdxMenuCheckboxItem {
513
587
  /** Emits when the checked state changes. */
514
588
  readonly onCheckedChange: _angular_core.OutputEmitterRef<CheckedState>;
515
589
  protected readonly highlighted: Signal<boolean>;
590
+ protected readonly effectiveDisabled: Signal<boolean>;
516
591
  protected readonly isIndeterminate: typeof isIndeterminate;
517
592
  protected readonly getCheckedState: typeof getCheckedState;
518
593
  onFocus(): void;
@@ -520,6 +595,7 @@ declare class RdxMenuCheckboxItem {
520
595
  onPointerMove(event: PointerEvent): void;
521
596
  onPointerLeave(event: PointerEvent): void;
522
597
  onItemClick(): void;
598
+ onMouseUp(event: MouseEvent): void;
523
599
  protected onActivate(event: Event): void;
524
600
  private toggleChecked;
525
601
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuCheckboxItem, never>;
@@ -540,27 +616,35 @@ declare class RdxMenuCheckboxItemIndicator {
540
616
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuCheckboxItemIndicator, "[rdxMenuCheckboxItemIndicator]", ["rdxMenuCheckboxItemIndicator"], { "keepMounted": { "alias": "keepMounted"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
541
617
  }
542
618
 
543
- interface RdxMenuRadioGroupContext {
544
- value: Signal<string | undefined>;
545
- selectValue: (value: string) => void;
619
+ interface RdxMenuRadioGroupContext<T = unknown> {
620
+ value: Signal<T | undefined>;
621
+ disabled: Signal<boolean>;
622
+ selectValue: (value: T) => void;
546
623
  }
547
- declare const injectRdxMenuRadioGroupContext: _radix_ng_primitives_core.InjectContext<RdxMenuRadioGroupContext>;
548
- 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;
549
626
  /**
550
627
  * Groups radio items in a menu.
551
628
  */
552
- declare class RdxMenuRadioGroup {
629
+ declare class RdxMenuRadioGroup<T = unknown> {
630
+ private hasAppliedDefaultValue;
553
631
  /**
554
632
  * The currently selected value.
555
633
  */
556
- 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>;
557
639
  /**
558
640
  * Emits when the selected value changes.
559
641
  */
560
- readonly onValueChange: _angular_core.OutputEmitterRef<string>;
561
- selectValue(newValue: string): void;
562
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuRadioGroup, never>;
563
- 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>;
564
648
  }
565
649
 
566
650
  interface RdxMenuRadioItemContext {
@@ -571,13 +655,13 @@ declare const provideRdxMenuRadioItemContext: (useFactory: () => RdxMenuRadioIte
571
655
  /**
572
656
  * A radio item within a menu radio group.
573
657
  */
574
- declare class RdxMenuRadioItem {
658
+ declare class RdxMenuRadioItem<T = unknown> {
575
659
  private readonly rootContext;
576
660
  private readonly radioGroupContext;
577
661
  private readonly elementRef;
578
662
  private readonly isFocused;
579
663
  /** The value of this radio item. */
580
- readonly value: _angular_core.InputSignal<string>;
664
+ readonly value: _angular_core.InputSignal<T>;
581
665
  /** Whether this item is disabled. */
582
666
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
583
667
  /** Whether selecting closes the menu. Defaults to false — radio items stay open. */
@@ -585,19 +669,21 @@ declare class RdxMenuRadioItem {
585
669
  /** Explicit typeahead label. When set, overrides textContent for character search. */
586
670
  readonly label: _angular_core.InputSignal<string | undefined>;
587
671
  /** Emits when this item is selected. */
588
- readonly onSelect: _angular_core.OutputEmitterRef<string>;
672
+ readonly onSelect: _angular_core.OutputEmitterRef<T>;
589
673
  readonly checked: Signal<boolean>;
590
674
  protected readonly highlighted: Signal<boolean>;
675
+ protected readonly effectiveDisabled: Signal<boolean>;
591
676
  protected readonly getCheckedState: typeof getCheckedState;
592
677
  onFocus(): void;
593
678
  onBlur(): void;
594
679
  onPointerMove(event: PointerEvent): void;
595
680
  onPointerLeave(event: PointerEvent): void;
596
681
  onItemClick(): void;
682
+ onMouseUp(event: MouseEvent): void;
597
683
  protected onActivate(event: Event): void;
598
684
  private selectItem;
599
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuRadioItem, never>;
600
- 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>;
601
687
  }
602
688
 
603
689
  /**
@@ -614,11 +700,17 @@ declare class RdxMenuRadioItemIndicator {
614
700
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxMenuRadioItemIndicator, "[rdxMenuRadioItemIndicator]", ["rdxMenuRadioItemIndicator"], { "keepMounted": { "alias": "keepMounted"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
615
701
  }
616
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
+
617
709
  declare class RdxMenuModule {
618
710
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxMenuModule, never>;
619
- static ɵmod: _angular_core.ɵɵNgModuleDeclaration<RdxMenuModule, never, [typeof RdxMenuRoot, typeof RdxMenuTrigger, typeof RdxMenuSubTrigger, typeof RdxMenuPortal, 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 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]>;
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]>;
620
712
  static ɵinj: _angular_core.ɵɵInjectorDeclaration<RdxMenuModule>;
621
713
  }
622
714
 
623
- export { RdxMenuArrow, RdxMenuBackdrop, RdxMenuCheckboxItem, RdxMenuCheckboxItemIndicator, RdxMenuGroup, RdxMenuGroupLabel, RdxMenuItem, RdxMenuLinkItem, RdxMenuModule, RdxMenuPopup, RdxMenuPortal, RdxMenuPositioner, RdxMenuRadioGroup, RdxMenuRadioItem, RdxMenuRadioItemIndicator, RdxMenuRoot, RdxMenuSeparator, RdxMenuSubTrigger, RdxMenuTrigger, RdxMenuViewport, getCheckedState, injectRdxMenuCheckboxItemContext, injectRdxMenuRadioGroupContext, injectRdxMenuRadioItemContext, injectRdxMenuRootContext, isIndeterminate, provideRdxMenuCheckboxItemContext, provideRdxMenuRadioGroupContext, provideRdxMenuRadioItemContext, provideRdxMenuRootContext };
624
- 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 };