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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/radix-ng-primitives-accordion.mjs +5 -3
  3. package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -1
  4. package/fesm2022/radix-ng-primitives-alert-dialog.mjs +3 -2
  5. package/fesm2022/radix-ng-primitives-alert-dialog.mjs.map +1 -1
  6. package/fesm2022/radix-ng-primitives-autocomplete.mjs +617 -659
  7. package/fesm2022/radix-ng-primitives-autocomplete.mjs.map +1 -1
  8. package/fesm2022/radix-ng-primitives-calendar.mjs +5 -3
  9. package/fesm2022/radix-ng-primitives-calendar.mjs.map +1 -1
  10. package/fesm2022/radix-ng-primitives-checkbox.mjs +33 -18
  11. package/fesm2022/radix-ng-primitives-checkbox.mjs.map +1 -1
  12. package/fesm2022/radix-ng-primitives-combobox.mjs +1305 -572
  13. package/fesm2022/radix-ng-primitives-combobox.mjs.map +1 -1
  14. package/fesm2022/radix-ng-primitives-config.mjs +13 -4
  15. package/fesm2022/radix-ng-primitives-config.mjs.map +1 -1
  16. package/fesm2022/radix-ng-primitives-context-menu.mjs +51 -10
  17. package/fesm2022/radix-ng-primitives-context-menu.mjs.map +1 -1
  18. package/fesm2022/radix-ng-primitives-core.mjs +1352 -64
  19. package/fesm2022/radix-ng-primitives-core.mjs.map +1 -1
  20. package/fesm2022/radix-ng-primitives-date-field.mjs +5 -3
  21. package/fesm2022/radix-ng-primitives-date-field.mjs.map +1 -1
  22. package/fesm2022/radix-ng-primitives-dialog.mjs +290 -120
  23. package/fesm2022/radix-ng-primitives-dialog.mjs.map +1 -1
  24. package/fesm2022/radix-ng-primitives-direction-provider.mjs +70 -0
  25. package/fesm2022/radix-ng-primitives-direction-provider.mjs.map +1 -0
  26. package/fesm2022/radix-ng-primitives-dismissable-layer.mjs +519 -184
  27. package/fesm2022/radix-ng-primitives-dismissable-layer.mjs.map +1 -1
  28. package/fesm2022/radix-ng-primitives-drawer.mjs +3 -3
  29. package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
  30. package/fesm2022/radix-ng-primitives-editable.mjs +12 -7
  31. package/fesm2022/radix-ng-primitives-editable.mjs.map +1 -1
  32. package/fesm2022/radix-ng-primitives-field.mjs +3 -2
  33. package/fesm2022/radix-ng-primitives-field.mjs.map +1 -1
  34. package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs +803 -0
  35. package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs.map +1 -0
  36. package/fesm2022/radix-ng-primitives-focus-scope.mjs +305 -70
  37. package/fesm2022/radix-ng-primitives-focus-scope.mjs.map +1 -1
  38. package/fesm2022/radix-ng-primitives-menu.mjs +893 -289
  39. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  40. package/fesm2022/radix-ng-primitives-menubar.mjs +32 -4
  41. package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
  42. package/fesm2022/radix-ng-primitives-navigation-menu.mjs +144 -159
  43. package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
  44. package/fesm2022/radix-ng-primitives-number-field.mjs +7 -2
  45. package/fesm2022/radix-ng-primitives-number-field.mjs.map +1 -1
  46. package/fesm2022/radix-ng-primitives-popover.mjs +284 -212
  47. package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
  48. package/fesm2022/radix-ng-primitives-popper.mjs +94 -51
  49. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  50. package/fesm2022/radix-ng-primitives-presence.mjs +1 -1
  51. package/fesm2022/radix-ng-primitives-presence.mjs.map +1 -1
  52. package/fesm2022/radix-ng-primitives-preview-card.mjs +141 -173
  53. package/fesm2022/radix-ng-primitives-preview-card.mjs.map +1 -1
  54. package/fesm2022/radix-ng-primitives-radio.mjs +19 -14
  55. package/fesm2022/radix-ng-primitives-radio.mjs.map +1 -1
  56. package/fesm2022/radix-ng-primitives-roving-focus.mjs +4 -2
  57. package/fesm2022/radix-ng-primitives-roving-focus.mjs.map +1 -1
  58. package/fesm2022/radix-ng-primitives-scroll-area.mjs +5 -4
  59. package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -1
  60. package/fesm2022/radix-ng-primitives-select.mjs +241 -164
  61. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  62. package/fesm2022/radix-ng-primitives-slider.mjs +262 -29
  63. package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
  64. package/fesm2022/radix-ng-primitives-stepper.mjs +16 -10
  65. package/fesm2022/radix-ng-primitives-stepper.mjs.map +1 -1
  66. package/fesm2022/radix-ng-primitives-switch.mjs +10 -5
  67. package/fesm2022/radix-ng-primitives-switch.mjs.map +1 -1
  68. package/fesm2022/radix-ng-primitives-tabs.mjs +15 -10
  69. package/fesm2022/radix-ng-primitives-tabs.mjs.map +1 -1
  70. package/fesm2022/radix-ng-primitives-time-field.mjs +5 -3
  71. package/fesm2022/radix-ng-primitives-time-field.mjs.map +1 -1
  72. package/fesm2022/radix-ng-primitives-toast.mjs +15 -36
  73. package/fesm2022/radix-ng-primitives-toast.mjs.map +1 -1
  74. package/fesm2022/radix-ng-primitives-toggle-group.mjs +14 -7
  75. package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
  76. package/fesm2022/radix-ng-primitives-toggle.mjs +12 -6
  77. package/fesm2022/radix-ng-primitives-toggle.mjs.map +1 -1
  78. package/fesm2022/radix-ng-primitives-toolbar.mjs +5 -3
  79. package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
  80. package/fesm2022/radix-ng-primitives-tooltip.mjs +251 -143
  81. package/fesm2022/radix-ng-primitives-tooltip.mjs.map +1 -1
  82. package/package.json +10 -1
  83. package/types/radix-ng-primitives-accordion.d.ts +4 -3
  84. package/types/radix-ng-primitives-autocomplete.d.ts +217 -152
  85. package/types/radix-ng-primitives-calendar.d.ts +5 -3
  86. package/types/radix-ng-primitives-checkbox.d.ts +27 -15
  87. package/types/radix-ng-primitives-combobox.d.ts +672 -283
  88. package/types/radix-ng-primitives-config.d.ts +1 -1
  89. package/types/radix-ng-primitives-context-menu.d.ts +15 -5
  90. package/types/radix-ng-primitives-core.d.ts +764 -14
  91. package/types/radix-ng-primitives-date-field.d.ts +3 -2
  92. package/types/radix-ng-primitives-dialog.d.ts +88 -32
  93. package/types/radix-ng-primitives-direction-provider.d.ts +41 -0
  94. package/types/radix-ng-primitives-dismissable-layer.d.ts +147 -99
  95. package/types/radix-ng-primitives-editable.d.ts +11 -5
  96. package/types/radix-ng-primitives-field.d.ts +1 -0
  97. package/types/radix-ng-primitives-floating-focus-manager.d.ts +272 -0
  98. package/types/radix-ng-primitives-focus-scope.d.ts +132 -1
  99. package/types/radix-ng-primitives-menu.d.ts +192 -103
  100. package/types/radix-ng-primitives-navigation-menu.d.ts +37 -75
  101. package/types/radix-ng-primitives-number-field.d.ts +8 -3
  102. package/types/radix-ng-primitives-popover.d.ts +71 -92
  103. package/types/radix-ng-primitives-popper.d.ts +39 -9
  104. package/types/radix-ng-primitives-preview-card.d.ts +39 -72
  105. package/types/radix-ng-primitives-radio.d.ts +13 -6
  106. package/types/radix-ng-primitives-roving-focus.d.ts +7 -6
  107. package/types/radix-ng-primitives-scroll-area.d.ts +2 -2
  108. package/types/radix-ng-primitives-select.d.ts +142 -109
  109. package/types/radix-ng-primitives-slider.d.ts +64 -12
  110. package/types/radix-ng-primitives-stepper.d.ts +15 -7
  111. package/types/radix-ng-primitives-switch.d.ts +10 -4
  112. package/types/radix-ng-primitives-tabs.d.ts +12 -6
  113. package/types/radix-ng-primitives-time-field.d.ts +3 -2
  114. package/types/radix-ng-primitives-toast.d.ts +7 -7
  115. package/types/radix-ng-primitives-toggle-group.d.ts +15 -8
  116. package/types/radix-ng-primitives-toggle.d.ts +10 -3
  117. package/types/radix-ng-primitives-toolbar.d.ts +3 -2
  118. package/types/radix-ng-primitives-tooltip.d.ts +61 -80
@@ -1,13 +1,13 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { TemplateRef, Signal, ElementRef } from '@angular/core';
2
+ import { TemplateRef, Signal } from '@angular/core';
3
3
  import * as i1 from '@radix-ng/primitives/portal';
4
4
  import * as _radix_ng_primitives_core from '@radix-ng/primitives/core';
5
- import { RdxTransitionStatus, BooleanInput, NumberInput } from '@radix-ng/primitives/core';
5
+ import { RdxCancelableChangeEventDetails, RdxTransitionStatus, RdxFloatingRootContext, BooleanInput, NumberInput } from '@radix-ng/primitives/core';
6
6
  import * as i1$1 from '@radix-ng/primitives/popper';
7
- import { RdxPopperContentWrapper, RdxPopperAnchorElement } from '@radix-ng/primitives/popper';
7
+ import { RdxPopperContentWrapper } from '@radix-ng/primitives/popper';
8
8
  import * as _radix_ng_primitives_navigation_menu from '@radix-ng/primitives/navigation-menu';
9
9
  import * as i1$2 from '@radix-ng/primitives/roving-focus';
10
- import * as i2 from '@radix-ng/primitives/dismissable-layer';
10
+ import { RdxOutsidePressDomEvent } from '@radix-ng/primitives/dismissable-layer';
11
11
 
12
12
  /**
13
13
  * Structural directive that teleports the navigation menu popup into a container (default
@@ -36,12 +36,15 @@ declare class RdxNavigationMenuPortalMisuseGuard {
36
36
 
37
37
  type NavigationMenuOrientation = 'horizontal' | 'vertical';
38
38
  type NavigationMenuDirection = 'ltr' | 'rtl';
39
- type RdxNavigationMenuOpenChangeReason = 'trigger-hover' | 'trigger-focus' | 'trigger-press' | 'outside-press' | 'focus-out' | 'escape-key' | 'link-select' | 'list-leave' | 'none';
39
+ type RdxNavigationMenuOpenChangeReason = 'trigger-hover' | 'trigger-focus' | 'trigger-press' | 'list-navigation' | 'outside-press' | 'focus-out' | 'escape-key' | 'link-select' | 'list-leave' | 'none';
40
+ type RdxNavigationMenuOpenChangeEventDetails = RdxCancelableChangeEventDetails<RdxNavigationMenuOpenChangeReason>;
40
41
  interface RdxNavigationMenuOpenChange {
41
42
  value: string | null;
42
43
  open: boolean;
43
44
  reason: RdxNavigationMenuOpenChangeReason;
44
45
  event: Event;
46
+ trigger: HTMLElement | undefined;
47
+ eventDetails: RdxNavigationMenuOpenChangeEventDetails;
45
48
  }
46
49
  /**
47
50
  * A registered item content template, rendered into the shared viewport when its item is active.
@@ -65,6 +68,7 @@ interface RdxNavigationMenuRootContext {
65
68
  /** Value of the previously open item (used for slide-direction morphing). */
66
69
  readonly previousValue: Signal<string | null>;
67
70
  readonly isOpen: Signal<boolean>;
71
+ readonly present: Signal<boolean>;
68
72
  readonly instant: Signal<boolean>;
69
73
  readonly transitionStatus: Signal<RdxTransitionStatus>;
70
74
  /** The active trigger element the popup is anchored to. */
@@ -78,7 +82,7 @@ interface RdxNavigationMenuRootContext {
78
82
  close(reason?: RdxNavigationMenuOpenChangeReason, event?: Event): void;
79
83
  toggle(value: string, trigger: HTMLElement, event?: Event): void;
80
84
  openOnHover(value: string, trigger: HTMLElement, event: PointerEvent): void;
81
- closeOnHover(): void;
85
+ closeOnHover(event?: PointerEvent): void;
82
86
  cancelHoverOpen(): void;
83
87
  cancelHoverClose(): void;
84
88
  registerTrigger(value: string, trigger: HTMLElement): () => void;
@@ -100,6 +104,9 @@ declare class RdxNavigationMenuRoot {
100
104
  private readonly popper;
101
105
  private readonly destroyRef;
102
106
  private readonly parentRoot;
107
+ private readonly registration;
108
+ /** Per-popup floating root context (ADR 0015) — `open` / `triggers` / reference for the dismissal engine. */
109
+ readonly floatingContext: RdxFloatingRootContext;
103
110
  /** Whether this root is nested inside another navigation menu's content. */
104
111
  readonly nested: boolean;
105
112
  readonly baseId: string;
@@ -118,7 +125,8 @@ declare class RdxNavigationMenuRoot {
118
125
  /**
119
126
  * The reading direction of the navigation menu.
120
127
  */
121
- readonly dir: _angular_core.InputSignal<NavigationMenuDirection>;
128
+ readonly dirInput: _angular_core.InputSignal<NavigationMenuDirection | undefined>;
129
+ readonly dir: _angular_core.Signal<_radix_ng_primitives_core.Direction>;
122
130
  /**
123
131
  * Whether keyboard navigation loops from the last item back to the first and vice versa.
124
132
  */
@@ -152,6 +160,8 @@ declare class RdxNavigationMenuRoot {
152
160
  readonly transitionStatus: _angular_core.Signal<_radix_ng_primitives_core.RdxTransitionStatus>;
153
161
  readonly previousValue: _angular_core.WritableSignal<string | null>;
154
162
  readonly isOpen: _angular_core.Signal<boolean>;
163
+ private readonly preventUnmountOnClose;
164
+ readonly present: _angular_core.Signal<boolean>;
155
165
  readonly trigger: _angular_core.WritableSignal<HTMLElement | undefined>;
156
166
  readonly triggers: _angular_core.WritableSignal<HTMLElement[]>;
157
167
  readonly contents: _angular_core.WritableSignal<Map<string, RdxNavigationMenuContentEntry>>;
@@ -166,19 +176,21 @@ declare class RdxNavigationMenuRoot {
166
176
  close(reason?: RdxNavigationMenuOpenChangeReason, event?: Event): void;
167
177
  toggle(value: string, trigger: HTMLElement, event?: Event): void;
168
178
  openOnHover(value: string, trigger: HTMLElement, event: PointerEvent): void;
169
- closeOnHover(): void;
179
+ closeOnHover(event?: PointerEvent): void;
170
180
  cancelHoverOpen(): void;
171
181
  cancelHoverClose(): void;
172
182
  registerTrigger(value: string, trigger: HTMLElement): () => void;
173
183
  registerContent(entry: RdxNavigationMenuContentEntry): () => void;
174
184
  registerTransitionElement(element: HTMLElement): () => void;
175
185
  registerViewport(onTriggerChange: (previous: HTMLElement, next: HTMLElement) => void): () => boolean;
186
+ private createOpenChangeEvent;
176
187
  private scheduleInstantReset;
177
188
  private clearHoverTimers;
178
189
  private clearOpenTimer;
179
190
  private clearCloseTimer;
191
+ private isInsideOpenChild;
180
192
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxNavigationMenuRoot, never>;
181
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxNavigationMenuRoot, "[rdxNavigationMenuRoot]", ["rdxNavigationMenuRoot"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "defaultValue": { "alias": "defaultValue"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "dir": { "alias": "dir"; "required": false; "isSignal": true; }; "loop": { "alias": "loop"; "required": false; "isSignal": true; }; "delay": { "alias": "delay"; "required": false; "isSignal": true; }; "closeDelay": { "alias": "closeDelay"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "onValueChange": "onValueChange"; "onOpenChange": "onOpenChange"; "onOpenChangeComplete": "onOpenChangeComplete"; }, never, never, true, [{ directive: typeof i1$1.RdxPopper; inputs: {}; outputs: {}; }]>;
193
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxNavigationMenuRoot, "[rdxNavigationMenuRoot]", ["rdxNavigationMenuRoot"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "defaultValue": { "alias": "defaultValue"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "dirInput": { "alias": "dir"; "required": false; "isSignal": true; }; "loop": { "alias": "loop"; "required": false; "isSignal": true; }; "delay": { "alias": "delay"; "required": false; "isSignal": true; }; "closeDelay": { "alias": "closeDelay"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "onValueChange": "onValueChange"; "onOpenChange": "onOpenChange"; "onOpenChangeComplete": "onOpenChangeComplete"; }, never, never, true, [{ directive: typeof i1$1.RdxPopper; inputs: {}; outputs: {}; }, { directive: typeof _radix_ng_primitives_core.RdxFloatingNodeRegistration; inputs: {}; outputs: {}; }]>;
182
194
  }
183
195
 
184
196
  /**
@@ -322,69 +334,21 @@ declare class RdxNavigationMenuBackdrop {
322
334
 
323
335
  /**
324
336
  * Positions the shared popup against the active trigger.
337
+ *
338
+ * A "thin" positioner (ADR 0012): it inherits the popper positioning surface (inputs, `placed`
339
+ * output, unified vars + placement attrs) from {@link RdxPopperContentWrapper} and adds the
340
+ * navigation-menu defaults, the open/closed/instant state attributes, and the grace-area hover
341
+ * bridge. It exposes no legacy `--radix-*` aliases.
325
342
  */
326
- declare class RdxNavigationMenuPositioner {
343
+ declare class RdxNavigationMenuPositioner extends RdxPopperContentWrapper {
327
344
  protected readonly rootContext: _radix_ng_primitives_navigation_menu.RdxNavigationMenuRootContext;
328
- protected readonly wrapper: RdxPopperContentWrapper;
329
- private readonly elementRef;
345
+ private readonly containerRef;
330
346
  private readonly triggerEl;
331
347
  private readonly containerEl;
332
348
  private readonly graceArea;
333
- /**
334
- * An element to position the popup against. Defaults to the active trigger.
335
- */
336
- readonly anchor: _angular_core.InputSignal<RdxPopperAnchorElement>;
337
- /**
338
- * The preferred side of the trigger to render against when open.
339
- */
340
- readonly side: _angular_core.InputSignal<"top" | "right" | "bottom" | "left">;
341
- /**
342
- * Distance between the trigger and the popup in pixels.
343
- */
344
- readonly sideOffset: _angular_core.InputSignalWithTransform<number, NumberInput>;
345
- /**
346
- * How to align the popup relative to the specified side.
347
- */
348
- readonly align: _angular_core.InputSignal<"start" | "center" | "end">;
349
- /**
350
- * An offset in pixels from the `start` or `end` alignment options.
351
- */
352
- readonly alignOffset: _angular_core.InputSignalWithTransform<number, NumberInput>;
353
- /**
354
- * Minimum distance to maintain between the arrow and the edges of the popup.
355
- */
356
- readonly arrowPadding: _angular_core.InputSignalWithTransform<number, NumberInput>;
357
- /**
358
- * Whether to override side and alignment preferences to prevent collisions.
359
- */
360
- readonly avoidCollisions: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
361
- /**
362
- * The element used as the collision boundary.
363
- */
364
- readonly collisionBoundary: _angular_core.InputSignal<ElementRef<HTMLElement> | ElementRef<HTMLElement>[] | undefined>;
365
- /**
366
- * Distance in pixels from the boundary edges where collision detection should occur.
367
- */
368
- readonly collisionPadding: _angular_core.InputSignal<number | Partial<Record<"top" | "right" | "bottom" | "left", number>>>;
369
- /**
370
- * The sticky behavior on the alignment axis.
371
- */
372
- readonly sticky: _angular_core.InputSignal<"always" | "partial">;
373
- /**
374
- * Whether to hide the popup when the trigger becomes fully occluded.
375
- */
376
- readonly hideWhenDetached: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
377
- /**
378
- * The CSS position strategy used by Floating UI.
379
- */
380
- readonly positionStrategy: _angular_core.InputSignal<"fixed" | "absolute">;
381
- /**
382
- * Whether to update position on every animation frame.
383
- */
384
- readonly updatePositionStrategy: _angular_core.InputSignal<"always" | "optimized">;
385
349
  constructor();
386
350
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxNavigationMenuPositioner, never>;
387
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxNavigationMenuPositioner, "[rdxNavigationMenuPositioner]", never, { "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; }; }, {}, never, never, true, [{ directive: typeof i1$1.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: {}; }]>;
351
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxNavigationMenuPositioner, "[rdxNavigationMenuPositioner]", never, {}, {}, never, never, true, never>;
388
352
  }
389
353
 
390
354
  /**
@@ -392,38 +356,36 @@ declare class RdxNavigationMenuPositioner {
392
356
  */
393
357
  declare class RdxNavigationMenuPopup {
394
358
  protected readonly rootContext: _radix_ng_primitives_navigation_menu.RdxNavigationMenuRootContext;
395
- private readonly dismissableLayer;
359
+ private readonly floatingContext;
360
+ private readonly registration;
396
361
  private readonly wrapper;
397
- private readonly layersContext;
398
362
  private readonly elementRef;
399
363
  protected readonly side: _angular_core.Signal<"top" | "right" | "bottom" | "left" | undefined>;
400
364
  protected readonly align: _angular_core.Signal<"start" | "center" | "end" | undefined>;
401
365
  /** Names the menu after the active trigger so the `role="menu"` element has an accessible name. */
402
366
  protected readonly labelledBy: _angular_core.Signal<string | undefined>;
403
- private dismissReason;
404
- private dismissEvent;
405
367
  /**
406
368
  * Event handler called when the escape key is down. Can be prevented.
407
369
  */
408
- readonly escapeKeyDown: _angular_core.OutputRef<KeyboardEvent>;
370
+ readonly escapeKeyDown: _angular_core.OutputEmitterRef<KeyboardEvent>;
409
371
  /**
410
372
  * Event handler called when a pointerdown event happens outside the popup. Can be prevented.
411
373
  */
412
- readonly pointerDownOutside: _angular_core.OutputRef<PointerEvent>;
374
+ readonly pointerDownOutside: _angular_core.OutputEmitterRef<RdxOutsidePressDomEvent>;
413
375
  /**
414
376
  * Event handler called when focus moves outside the popup. Can be prevented.
415
377
  */
416
- readonly focusOutside: _angular_core.OutputRef<FocusEvent>;
378
+ readonly focusOutside: _angular_core.OutputEmitterRef<FocusEvent>;
417
379
  constructor();
418
380
  protected onPointerLeave(event: PointerEvent): void;
419
381
  /**
420
382
  * Keyboard navigation inside the open panel: Down/Up move between the panel's focusable items in
421
383
  * DOM order, Home/End jump to the first/last, and Up from the first item returns focus to the
422
- * trigger. (Tab keeps working natively; Escape is handled by the dismissable layer.)
384
+ * trigger. (Tab keeps working natively; Escape is handled by the dismissal capability.)
423
385
  */
424
386
  protected onKeydown(event: KeyboardEvent): void;
425
387
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxNavigationMenuPopup, never>;
426
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxNavigationMenuPopup, "[rdxNavigationMenuPopup]", never, {}, { "escapeKeyDown": "escapeKeyDown"; "pointerDownOutside": "pointerDownOutside"; "focusOutside": "focusOutside"; }, never, never, true, [{ directive: typeof i1$1.RdxPopperContent; inputs: {}; outputs: {}; }, { directive: typeof i2.RdxDismissableLayer; inputs: {}; outputs: {}; }]>;
388
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxNavigationMenuPopup, "[rdxNavigationMenuPopup]", never, {}, { "escapeKeyDown": "escapeKeyDown"; "pointerDownOutside": "pointerDownOutside"; "focusOutside": "focusOutside"; }, never, never, true, [{ directive: typeof i1$1.RdxPopperContent; inputs: {}; outputs: {}; }]>;
427
389
  }
428
390
 
429
391
  /**
@@ -483,4 +445,4 @@ declare class RdxNavigationMenuModule {
483
445
  }
484
446
 
485
447
  export { RdxNavigationMenuArrow, RdxNavigationMenuBackdrop, RdxNavigationMenuContent, RdxNavigationMenuIcon, RdxNavigationMenuItem, RdxNavigationMenuLink, RdxNavigationMenuList, RdxNavigationMenuModule, RdxNavigationMenuPopup, RdxNavigationMenuPortal, RdxNavigationMenuPortalMisuseGuard, RdxNavigationMenuPositioner, RdxNavigationMenuRoot, RdxNavigationMenuTrigger, RdxNavigationMenuViewport, injectNavigationMenuRootContext, navigationMenuImports, provideNavigationMenuRootContext };
486
- export type { NavigationMenuDirection, NavigationMenuOrientation, RdxNavigationMenuContentEntry, RdxNavigationMenuOpenChange, RdxNavigationMenuOpenChangeReason, RdxNavigationMenuRootContext };
448
+ export type { NavigationMenuDirection, NavigationMenuOrientation, RdxNavigationMenuContentEntry, RdxNavigationMenuOpenChange, RdxNavigationMenuOpenChangeEventDetails, RdxNavigationMenuOpenChangeReason, RdxNavigationMenuRootContext };
@@ -1,7 +1,7 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { Signal } from '@angular/core';
3
3
  import * as _radix_ng_primitives_core from '@radix-ng/primitives/core';
4
- import { RdxFormValueControl, RdxControlValueAccessor, NumberInput, BooleanInput } from '@radix-ng/primitives/core';
4
+ import { RdxFormValueControl, RdxControlValueAccessor, NumberInput, BooleanInput, RdxCancelableChangeEventDetails } from '@radix-ng/primitives/core';
5
5
  import * as _radix_ng_primitives_number_field from '@radix-ng/primitives/number-field';
6
6
  import { NumberFormatter, NumberParser } from '@internationalized/number';
7
7
  import * as i1 from '@radix-ng/primitives/portal';
@@ -35,6 +35,11 @@ declare const REASONS: {
35
35
  readonly none: "none";
36
36
  };
37
37
 
38
+ type RdxNumberFieldValueChangeEventDetails = RdxCancelableChangeEventDetails<NumberFieldChangeReason>;
39
+ interface RdxNumberFieldValueChangeEvent {
40
+ value: number | null;
41
+ eventDetails: RdxNumberFieldValueChangeEventDetails;
42
+ }
38
43
  /**
39
44
  * Groups all parts of the number field and manages its state, parsing/formatting
40
45
  * and value-change logic. A single directive drives the whole family — parts read
@@ -110,7 +115,7 @@ declare class RdxNumberFieldRoot implements RdxFormValueControl<number | null> {
110
115
  /** The controlled value of the field. Use with `(onValueChange)` or two-way `[(value)]`. */
111
116
  readonly value: _angular_core.ModelSignal<number | null>;
112
117
  /** Emitted when the value changes (during interaction or programmatically). */
113
- readonly onValueChange: _angular_core.OutputEmitterRef<number | null>;
118
+ readonly onValueChange: _angular_core.OutputEmitterRef<RdxNumberFieldValueChangeEvent>;
114
119
  /**
115
120
  * Emitted when the value is committed: on blur after typing, or when a pointer is released
116
121
  * after scrubbing or pressing a button. Fires together with `onValueChange` for keyboard input.
@@ -461,4 +466,4 @@ declare class RdxNumberFieldModule {
461
466
  }
462
467
 
463
468
  export { CHANGE_VALUE_TICK_DELAY, DEFAULT_STEP, REASONS, RdxNumberFieldButton, RdxNumberFieldDecrement, RdxNumberFieldGroup, RdxNumberFieldHiddenInput, RdxNumberFieldIncrement, RdxNumberFieldInput, RdxNumberFieldModule, RdxNumberFieldRoot, RdxNumberFieldScrubArea, RdxNumberFieldScrubAreaCursor, SCROLLING_POINTER_MOVE_DISTANCE, START_AUTO_CHANGE_DELAY, createPressAndHold, hasNumberFormatRoundingOptions, injectNumberFieldRootContext, injectNumberFieldScrubAreaContext, numberOrUndefined, provideNumberFieldRootContext, provideNumberFieldScrubAreaContext, removeFloatingPointErrors, toValidatedNumber, useNumberFormatter, useNumberParser };
464
- export type { Direction, InputMode, NumberFieldChangeReason, PressAndHold, PressAndHoldOptions, RdxNumberFieldScrubAreaContext, ValidateOptions };
469
+ export type { Direction, InputMode, NumberFieldChangeReason, PressAndHold, PressAndHoldOptions, RdxNumberFieldScrubAreaContext, RdxNumberFieldValueChangeEvent, RdxNumberFieldValueChangeEventDetails, ValidateOptions };
@@ -2,12 +2,13 @@ import * as _angular_core from '@angular/core';
2
2
  import { Signal, ElementRef } from '@angular/core';
3
3
  import * as i1 from '@radix-ng/primitives/portal';
4
4
  import * as _radix_ng_primitives_core from '@radix-ng/primitives/core';
5
- import { RdxTransitionStatus, BooleanInput, NumberInput } from '@radix-ng/primitives/core';
5
+ import { RdxTransitionStatus, RdxFloatingRootContext, BooleanInput, RdxCancelableChangeEventDetails, NumberInput } from '@radix-ng/primitives/core';
6
+ import * as _radix_ng_primitives_floating_focus_manager from '@radix-ng/primitives/floating-focus-manager';
7
+ import { RdxInteractionType } from '@radix-ng/primitives/floating-focus-manager';
6
8
  import * as i1$1 from '@radix-ng/primitives/popper';
7
- import { RdxPopperContentWrapper, RdxPopperAnchorElement } from '@radix-ng/primitives/popper';
9
+ import { RdxPopperContentWrapper } from '@radix-ng/primitives/popper';
8
10
  import * as _radix_ng_primitives_popover from '@radix-ng/primitives/popover';
9
- import * as i2 from '@radix-ng/primitives/dismissable-layer';
10
- import * as i3 from '@radix-ng/primitives/focus-scope';
11
+ import { RdxOutsidePressDomEvent } from '@radix-ng/primitives/dismissable-layer';
11
12
 
12
13
  /**
13
14
  * Structural directive that teleports the popover content into a container (default `document.body`)
@@ -48,17 +49,20 @@ declare function createRdxPopoverHandle<Payload = unknown>(): RdxPopoverHandle<P
48
49
 
49
50
  type RdxPopoverModal = boolean | 'trap-focus';
50
51
  type RdxPopoverOpenChangeReason = 'trigger-hover' | 'trigger-focus' | 'trigger-press' | 'outside-press' | 'escape-key' | 'close-press' | 'focus-out' | 'imperative-action' | 'none';
52
+ type RdxPopoverOpenChangeEventDetails = RdxCancelableChangeEventDetails<RdxPopoverOpenChangeReason>;
51
53
  interface RdxPopoverOpenChange {
52
54
  open: boolean;
53
55
  triggerId: string | null;
54
56
  trigger: HTMLElement | undefined;
55
57
  reason: RdxPopoverOpenChangeReason;
56
58
  event: Event;
59
+ eventDetails: RdxPopoverOpenChangeEventDetails;
57
60
  }
58
61
  interface RdxPopoverRootContext {
59
62
  contentId: string;
60
63
  descriptionId: Signal<string | undefined>;
61
64
  isOpen: Signal<boolean>;
65
+ present: Signal<boolean>;
62
66
  modal: Signal<RdxPopoverModal>;
63
67
  titleId: Signal<string | undefined>;
64
68
  trigger: Signal<HTMLElement | undefined>;
@@ -68,6 +72,10 @@ interface RdxPopoverRootContext {
68
72
  instant: Signal<boolean>;
69
73
  openChangeReason: Signal<RdxPopoverOpenChangeReason>;
70
74
  isPointerDownOnTrigger: Signal<boolean>;
75
+ /** Whether the current open was initiated by touch (ADR 0016 §3 — gates the anchored scroll lock). */
76
+ openedByTouch: Signal<boolean>;
77
+ openInteractionType: Signal<RdxInteractionType>;
78
+ closeInteractionType: Signal<RdxInteractionType>;
71
79
  close: (reason?: RdxPopoverOpenChangeReason, event?: Event) => void;
72
80
  cancelHoverClose: () => void;
73
81
  cancelHoverOpen: () => void;
@@ -79,11 +87,15 @@ interface RdxPopoverRootContext {
79
87
  setDescriptionId: (id: string | undefined) => void;
80
88
  setTitleId: (id: string | undefined) => void;
81
89
  setPointerDownOnTrigger: (pointerDown: boolean) => void;
90
+ setOpenedByTouch: (value: boolean) => void;
91
+ setTriggerOpenInteractionType: (type: RdxInteractionType) => void;
82
92
  setHoverDelays: (delay: number, closeDelay: number) => void;
83
93
  registerPopupClose: () => () => void;
84
94
  registerTransitionElement: (element: HTMLElement) => () => void;
85
95
  transitionStatus: Signal<RdxPopoverTransitionStatus>;
96
+ beforeContentFocusGuard: Signal<HTMLElement | null>;
86
97
  registerViewport: (onTriggerChange: (previous: HTMLElement, next: HTMLElement) => void) => () => void;
98
+ setBeforeContentFocusGuard: (element: HTMLElement | null) => void;
87
99
  toggle: (triggerId: string, trigger: HTMLElement, payload?: unknown, event?: Event) => void;
88
100
  }
89
101
  declare const injectRdxPopoverRootContext: _radix_ng_primitives_core.InjectContext<RdxPopoverRootContext>;
@@ -95,6 +107,8 @@ type RdxPopoverTransitionStatus = RdxTransitionStatus;
95
107
  declare class RdxPopoverRoot {
96
108
  private readonly popper;
97
109
  private readonly destroyRef;
110
+ /** Shared per-popup floating context (ADR 0015 §1): `open`, trigger registry, reference / floating els. */
111
+ readonly floatingContext: RdxFloatingRootContext;
98
112
  private hasAppliedDefaultOpen;
99
113
  private hasAppliedDefaultTriggerId;
100
114
  private openTimer;
@@ -132,18 +146,26 @@ declare class RdxPopoverRoot {
132
146
  */
133
147
  readonly handle: _angular_core.InputSignal<RdxPopoverHandle<any> | undefined>;
134
148
  readonly contentId: string;
149
+ readonly beforeContentFocusGuard: _angular_core.WritableSignal<HTMLElement | null>;
135
150
  readonly descriptionId: _angular_core.WritableSignal<string | undefined>;
136
151
  readonly titleId: _angular_core.WritableSignal<string | undefined>;
137
152
  readonly trigger: _angular_core.WritableSignal<HTMLElement | undefined>;
138
153
  readonly triggers: _angular_core.WritableSignal<HTMLElement[]>;
139
154
  readonly payload: _angular_core.WritableSignal<unknown>;
140
155
  readonly isPointerDownOnTrigger: _angular_core.WritableSignal<boolean>;
156
+ /** Whether the current open was initiated by touch (ADR 0016 §3 — gates the anchored scroll lock). */
157
+ readonly openedByTouch: _angular_core.WritableSignal<boolean>;
158
+ readonly openInteractionType: _angular_core.WritableSignal<RdxInteractionType>;
159
+ readonly closeInteractionType: _angular_core.WritableSignal<RdxInteractionType>;
141
160
  readonly popupCloseCount: _angular_core.WritableSignal<number>;
161
+ private readonly preventUnmountOnClose;
162
+ private readonly pendingTriggerOpenInteractionType;
142
163
  readonly onOpenChange: _angular_core.OutputEmitterRef<RdxPopoverOpenChange>;
143
164
  readonly onOpenChangeComplete: _angular_core.OutputEmitterRef<boolean>;
144
165
  private readonly registeredTriggers;
145
166
  private readonly viewportTriggerChange;
146
167
  readonly state: Signal<"open" | "closed">;
168
+ readonly present: Signal<boolean>;
147
169
  constructor();
148
170
  show(trigger?: HTMLElement | undefined, payload?: unknown, triggerId?: string, reason?: RdxPopoverOpenChangeReason, event?: Event, fromHover?: boolean): void;
149
171
  close(reason?: RdxPopoverOpenChangeReason, event?: Event): void;
@@ -153,15 +175,18 @@ declare class RdxPopoverRoot {
153
175
  cancelHoverClose(): void;
154
176
  cancelHoverOpen(): void;
155
177
  setHoverDelays(delay: number, closeDelay: number): void;
178
+ setTriggerOpenInteractionType(type: RdxInteractionType): void;
156
179
  registerTrigger(id: string, trigger: HTMLElement, payload: () => unknown): () => void;
157
180
  registerViewport(onTriggerChange: (previous: HTMLElement, next: HTMLElement) => void): () => boolean;
181
+ setBeforeContentFocusGuard(element: HTMLElement | null): void;
158
182
  registerTransitionElement(element: HTMLElement): () => void;
159
183
  private syncTriggerId;
160
- private emitOpenChange;
184
+ private createOpenChangeEvent;
161
185
  private clearHoverTimers;
162
186
  private clearOpenTimer;
163
187
  private clearCloseTimer;
164
188
  private scheduleInstantReset;
189
+ private consumeOpenInteractionType;
165
190
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxPopoverRoot, never>;
166
191
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxPopoverRoot, "[rdxPopoverRoot]", ["rdxPopoverRoot"], { "open": { "alias": "open"; "required": false; "isSignal": true; }; "defaultOpen": { "alias": "defaultOpen"; "required": false; "isSignal": true; }; "triggerId": { "alias": "triggerId"; "required": false; "isSignal": true; }; "defaultTriggerId": { "alias": "defaultTriggerId"; "required": false; "isSignal": true; }; "modal": { "alias": "modal"; "required": false; "isSignal": true; }; "handle": { "alias": "handle"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "triggerId": "triggerIdChange"; "onOpenChange": "onOpenChange"; "onOpenChangeComplete": "onOpenChangeComplete"; }, never, never, true, [{ directive: typeof i1$1.RdxPopper; inputs: {}; outputs: {}; }]>;
167
192
  }
@@ -203,13 +228,14 @@ declare class RdxPopoverTrigger {
203
228
  protected readonly triggerId: _angular_core.Signal<string>;
204
229
  protected readonly rootContext: _angular_core.Signal<_radix_ng_primitives_popover.RdxPopoverRootContext | null>;
205
230
  protected readonly isOpen: _angular_core.Signal<boolean>;
231
+ protected readonly triggerInteraction: _radix_ng_primitives_floating_focus_manager.RdxTriggerInteraction;
206
232
  protected readonly isPressed: _angular_core.Signal<boolean>;
207
233
  private readonly generatedId;
208
234
  constructor();
209
235
  protected handleClick(event: MouseEvent): void;
210
236
  protected handlePointerEnter(event: PointerEvent): void;
211
237
  protected handlePointerLeave(event: PointerEvent): void;
212
- protected handlePointerDown(): void;
238
+ protected handlePointerDown(event: PointerEvent): void;
213
239
  protected handlePointerUp(): void;
214
240
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxPopoverTrigger, never>;
215
241
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxPopoverTrigger, "button[rdxPopoverTrigger]", never, { "handle": { "alias": "handle"; "required": false; "isSignal": true; }; "payload": { "alias": "payload"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "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$1.RdxPopperAnchor; inputs: {}; outputs: {}; }]>;
@@ -220,119 +246,72 @@ declare class RdxPopoverTrigger {
220
246
  */
221
247
  declare class RdxPopoverBackdrop {
222
248
  protected readonly rootContext: _radix_ng_primitives_popover.RdxPopoverRootContext;
249
+ constructor();
223
250
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxPopoverBackdrop, never>;
224
251
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxPopoverBackdrop, "[rdxPopoverBackdrop]", never, {}, {}, never, never, true, never>;
225
252
  }
226
253
 
227
254
  /**
228
255
  * Positions the popover against its trigger.
256
+ *
257
+ * A "thin" positioner (ADR 0012): it inherits the popper positioning surface (inputs, `placed`
258
+ * output, unified vars + placement attrs) from {@link RdxPopperContentWrapper} and adds popover's own
259
+ * concerns — Base UI-aligned defaults via the config provider, the open/closed/instant state
260
+ * attributes, the deprecated `--radix-popover-*` aliases, and the grace-area hover bridge.
229
261
  */
230
- declare class RdxPopoverPositioner {
262
+ declare class RdxPopoverPositioner extends RdxPopperContentWrapper {
231
263
  protected readonly rootContext: _radix_ng_primitives_popover.RdxPopoverRootContext;
232
- protected readonly wrapper: RdxPopperContentWrapper;
233
- private readonly elementRef;
264
+ protected readonly legacyVars: Record<string, string>;
265
+ private readonly containerRef;
234
266
  private readonly triggerEl;
235
267
  private readonly containerEl;
236
268
  private readonly graceArea;
237
- /**
238
- * An element to position the popup against. Defaults to the trigger.
239
- */
240
- readonly anchor: _angular_core.InputSignal<RdxPopperAnchorElement>;
241
- /**
242
- * The preferred side of the trigger to render against when open.
243
- */
244
- readonly side: _angular_core.InputSignal<"top" | "right" | "bottom" | "left">;
245
- /**
246
- * Distance between the trigger and the popup in pixels.
247
- */
248
- readonly sideOffset: _angular_core.InputSignalWithTransform<number, NumberInput>;
249
- /**
250
- * How to align the popup relative to the specified side.
251
- */
252
- readonly align: _angular_core.InputSignal<"start" | "center" | "end">;
253
- /**
254
- * An offset in pixels from the `start` or `end` alignment options.
255
- */
256
- readonly alignOffset: _angular_core.InputSignalWithTransform<number, NumberInput>;
257
- /**
258
- * Minimum distance to maintain between the arrow and the edges of the popup.
259
- */
260
- readonly arrowPadding: _angular_core.InputSignalWithTransform<number, NumberInput>;
261
- /**
262
- * Whether to override side and alignment preferences to prevent collisions.
263
- */
264
- readonly avoidCollisions: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
265
- /**
266
- * The element used as the collision boundary.
267
- */
268
- readonly collisionBoundary: _angular_core.InputSignal<ElementRef<HTMLElement> | ElementRef<HTMLElement>[] | undefined>;
269
- /**
270
- * Distance in pixels from the boundary edges where collision detection should occur.
271
- */
272
- readonly collisionPadding: _angular_core.InputSignal<number | Partial<Record<"top" | "right" | "bottom" | "left", number>>>;
273
- /**
274
- * The sticky behavior on the alignment axis.
275
- */
276
- readonly sticky: _angular_core.InputSignal<"always" | "partial">;
277
- /**
278
- * Whether to hide the popup when the trigger becomes fully occluded.
279
- */
280
- readonly hideWhenDetached: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
281
- /**
282
- * The CSS position strategy used by Floating UI.
283
- */
284
- readonly positionStrategy: _angular_core.InputSignal<"fixed" | "absolute">;
285
- /**
286
- * Whether to update position on every animation frame.
287
- */
288
- readonly updatePositionStrategy: _angular_core.InputSignal<"always" | "optimized">;
289
- /**
290
- * Emits when the popup has been placed.
291
- */
292
- readonly placed: _angular_core.OutputRef<void>;
293
269
  constructor();
294
270
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxPopoverPositioner, never>;
295
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxPopoverPositioner, "[rdxPopoverPositioner]", never, { "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$1.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: {}; }]>;
271
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxPopoverPositioner, "[rdxPopoverPositioner]", never, {}, {}, never, never, true, never>;
296
272
  }
297
273
 
298
274
  /**
299
275
  * A container for the popover contents.
276
+ *
277
+ * **ADR 0015/0017 Phase-4 migration** onto the new floating dismissal + focus engine (same pattern as
278
+ * Dialog; browser-verified via `popover.behavior` Playwright). Popover-specific:
279
+ * - **Hover-open disables the manager** (`enabled = isOpen && !isHoverActive`) — Base UI parity
280
+ * (`disabled={!mounted || openReason === triggerHover}`); a hover-opened popover does not trap / mark.
281
+ * (The legacy only suppressed auto-focus while still trapping — that Radix divergence is dropped.)
282
+ * - Trap = `'trap-focus' || (modal === true && hasPopupClose())`; scroll lock + real outside `inert`
283
+ * isolation key off the full modal (`modal === true`).
284
+ * - No `disablePointerDismissal` — outside-press + focus-out always close.
285
+ *
286
+ * Note: a positioned popover does **not** auto-focus into the popup on open (pre-existing — the legacy
287
+ * behaved the same; verified). The trap holds focus once it is inside; portal tab-order handoff is owned
288
+ * by `RdxFloatingFocusManager` and anchored to the active trigger below.
300
289
  */
301
290
  declare class RdxPopoverPopup {
302
291
  protected readonly rootContext: _radix_ng_primitives_popover.RdxPopoverRootContext;
303
- private readonly dismissableLayer;
292
+ private readonly host;
293
+ private readonly floatingContext;
294
+ private readonly registration;
295
+ private readonly focusManager;
304
296
  private readonly focusScope;
305
297
  private readonly wrapper;
306
298
  protected readonly align: _angular_core.Signal<"start" | "center" | "end" | undefined>;
307
299
  protected readonly side: _angular_core.Signal<"top" | "right" | "bottom" | "left" | undefined>;
308
- private dismissDetails;
309
- /**
310
- * Event handler called when the escape key is down. Can be prevented.
311
- */
312
- readonly escapeKeyDown: _angular_core.OutputRef<KeyboardEvent>;
313
- /**
314
- * Event handler called when a pointerdown event happens outside of the popup. Can be prevented.
315
- */
316
- readonly pointerDownOutside: _angular_core.OutputRef<PointerEvent>;
317
- /**
318
- * Event handler called when focus moves outside of the popup. Can be prevented.
319
- */
320
- readonly focusOutside: _angular_core.OutputRef<FocusEvent>;
321
- /**
322
- * Event handler called when an interaction happens outside of the popup. Can be prevented.
323
- */
324
- readonly interactOutside: _angular_core.OutputRef<PointerEvent | FocusEvent>;
325
- /**
326
- * Event handler called before focus moves into the popup. Can be prevented.
327
- */
300
+ /** Event handler called when the escape key is down. Can be prevented. */
301
+ readonly escapeKeyDown: _angular_core.OutputEmitterRef<KeyboardEvent>;
302
+ /** Event handler called when a pointerdown event happens outside of the popup. Can be prevented. */
303
+ readonly pointerDownOutside: _angular_core.OutputEmitterRef<RdxOutsidePressDomEvent>;
304
+ /** Event handler called when focus moves outside of the popup. Can be prevented. */
305
+ readonly focusOutside: _angular_core.OutputEmitterRef<FocusEvent>;
306
+ /** Event handler called when an interaction (pointer / focus) happens outside of the popup. */
307
+ readonly interactOutside: _angular_core.OutputEmitterRef<RdxOutsidePressDomEvent | FocusEvent>;
308
+ /** Event handler called before focus moves into the popup. Can be prevented. */
328
309
  readonly openAutoFocus: _angular_core.OutputRef<Event>;
329
- /**
330
- * Event handler called before focus returns after the popup is removed. Can be prevented.
331
- */
310
+ /** Event handler called before focus returns after the popup is removed. Can be prevented. */
332
311
  readonly closeAutoFocus: _angular_core.OutputRef<Event>;
333
312
  constructor();
334
313
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxPopoverPopup, never>;
335
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxPopoverPopup, "[rdxPopoverPopup]", never, {}, { "escapeKeyDown": "escapeKeyDown"; "pointerDownOutside": "pointerDownOutside"; "focusOutside": "focusOutside"; "interactOutside": "interactOutside"; "openAutoFocus": "openAutoFocus"; "closeAutoFocus": "closeAutoFocus"; }, never, never, true, [{ directive: typeof i1$1.RdxPopperContent; inputs: {}; outputs: {}; }, { directive: typeof i2.RdxDismissableLayer; inputs: {}; outputs: {}; }, { directive: typeof i3.RdxFocusScope; inputs: {}; outputs: {}; }]>;
314
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxPopoverPopup, "[rdxPopoverPopup]", never, {}, { "escapeKeyDown": "escapeKeyDown"; "pointerDownOutside": "pointerDownOutside"; "focusOutside": "focusOutside"; "interactOutside": "interactOutside"; "openAutoFocus": "openAutoFocus"; "closeAutoFocus": "closeAutoFocus"; }, never, never, true, [{ directive: typeof i1$1.RdxPopperContent; inputs: {}; outputs: {}; }, { directive: typeof _radix_ng_primitives_core.RdxFloatingNodeRegistration; inputs: {}; outputs: {}; }, { directive: typeof _radix_ng_primitives_floating_focus_manager.RdxFloatingFocusManager; inputs: {}; outputs: {}; }]>;
336
315
  }
337
316
 
338
317
  /**
@@ -414,4 +393,4 @@ declare class RdxPopoverModule {
414
393
  }
415
394
 
416
395
  export { RdxPopoverArrow, RdxPopoverBackdrop, RdxPopoverClose, RdxPopoverDescription, RdxPopoverHandle, RdxPopoverModule, RdxPopoverPopup, RdxPopoverPortal, RdxPopoverPortalMisuseGuard, RdxPopoverPositioner, RdxPopoverRoot, RdxPopoverTitle, RdxPopoverTrigger, RdxPopoverViewport, createRdxPopoverHandle, injectRdxPopoverRootContext, popoverImports, provideRdxPopoverRootContext };
417
- export type { RdxPopoverModal, RdxPopoverOpenChange, RdxPopoverOpenChangeReason, RdxPopoverRootContext, RdxPopoverTransitionStatus };
396
+ export type { RdxPopoverModal, RdxPopoverOpenChange, RdxPopoverOpenChangeEventDetails, RdxPopoverOpenChangeReason, RdxPopoverRootContext, RdxPopoverTransitionStatus };