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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/radix-ng-primitives-accordion.mjs +5 -3
  3. package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -1
  4. package/fesm2022/radix-ng-primitives-alert-dialog.mjs +3 -2
  5. package/fesm2022/radix-ng-primitives-alert-dialog.mjs.map +1 -1
  6. package/fesm2022/radix-ng-primitives-autocomplete.mjs +617 -659
  7. package/fesm2022/radix-ng-primitives-autocomplete.mjs.map +1 -1
  8. package/fesm2022/radix-ng-primitives-calendar.mjs +5 -3
  9. package/fesm2022/radix-ng-primitives-calendar.mjs.map +1 -1
  10. package/fesm2022/radix-ng-primitives-combobox.mjs +1305 -572
  11. package/fesm2022/radix-ng-primitives-combobox.mjs.map +1 -1
  12. package/fesm2022/radix-ng-primitives-config.mjs +13 -4
  13. package/fesm2022/radix-ng-primitives-config.mjs.map +1 -1
  14. package/fesm2022/radix-ng-primitives-context-menu.mjs +51 -10
  15. package/fesm2022/radix-ng-primitives-context-menu.mjs.map +1 -1
  16. package/fesm2022/radix-ng-primitives-core.mjs +1345 -64
  17. package/fesm2022/radix-ng-primitives-core.mjs.map +1 -1
  18. package/fesm2022/radix-ng-primitives-date-field.mjs +5 -3
  19. package/fesm2022/radix-ng-primitives-date-field.mjs.map +1 -1
  20. package/fesm2022/radix-ng-primitives-dialog.mjs +240 -112
  21. package/fesm2022/radix-ng-primitives-dialog.mjs.map +1 -1
  22. package/fesm2022/radix-ng-primitives-direction-provider.mjs +70 -0
  23. package/fesm2022/radix-ng-primitives-direction-provider.mjs.map +1 -0
  24. package/fesm2022/radix-ng-primitives-dismissable-layer.mjs +519 -184
  25. package/fesm2022/radix-ng-primitives-dismissable-layer.mjs.map +1 -1
  26. package/fesm2022/radix-ng-primitives-drawer.mjs +3 -3
  27. package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
  28. package/fesm2022/radix-ng-primitives-field.mjs +3 -2
  29. package/fesm2022/radix-ng-primitives-field.mjs.map +1 -1
  30. package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs +517 -0
  31. package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs.map +1 -0
  32. package/fesm2022/radix-ng-primitives-focus-scope.mjs +296 -70
  33. package/fesm2022/radix-ng-primitives-focus-scope.mjs.map +1 -1
  34. package/fesm2022/radix-ng-primitives-menu.mjs +861 -286
  35. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  36. package/fesm2022/radix-ng-primitives-menubar.mjs +32 -4
  37. package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
  38. package/fesm2022/radix-ng-primitives-navigation-menu.mjs +144 -159
  39. package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
  40. package/fesm2022/radix-ng-primitives-popover.mjs +220 -205
  41. package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
  42. package/fesm2022/radix-ng-primitives-popper.mjs +94 -51
  43. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  44. package/fesm2022/radix-ng-primitives-presence.mjs +1 -1
  45. package/fesm2022/radix-ng-primitives-presence.mjs.map +1 -1
  46. package/fesm2022/radix-ng-primitives-preview-card.mjs +141 -173
  47. package/fesm2022/radix-ng-primitives-preview-card.mjs.map +1 -1
  48. package/fesm2022/radix-ng-primitives-roving-focus.mjs +4 -2
  49. package/fesm2022/radix-ng-primitives-roving-focus.mjs.map +1 -1
  50. package/fesm2022/radix-ng-primitives-scroll-area.mjs +5 -4
  51. package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -1
  52. package/fesm2022/radix-ng-primitives-select.mjs +211 -156
  53. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  54. package/fesm2022/radix-ng-primitives-slider.mjs +5 -3
  55. package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
  56. package/fesm2022/radix-ng-primitives-stepper.mjs +5 -3
  57. package/fesm2022/radix-ng-primitives-stepper.mjs.map +1 -1
  58. package/fesm2022/radix-ng-primitives-time-field.mjs +5 -3
  59. package/fesm2022/radix-ng-primitives-time-field.mjs.map +1 -1
  60. package/fesm2022/radix-ng-primitives-toast.mjs +15 -36
  61. package/fesm2022/radix-ng-primitives-toast.mjs.map +1 -1
  62. package/fesm2022/radix-ng-primitives-toggle-group.mjs +5 -3
  63. package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
  64. package/fesm2022/radix-ng-primitives-toolbar.mjs +5 -3
  65. package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
  66. package/fesm2022/radix-ng-primitives-tooltip.mjs +73 -110
  67. package/fesm2022/radix-ng-primitives-tooltip.mjs.map +1 -1
  68. package/package.json +10 -1
  69. package/types/radix-ng-primitives-accordion.d.ts +4 -3
  70. package/types/radix-ng-primitives-autocomplete.d.ts +217 -152
  71. package/types/radix-ng-primitives-calendar.d.ts +5 -3
  72. package/types/radix-ng-primitives-combobox.d.ts +672 -283
  73. package/types/radix-ng-primitives-config.d.ts +1 -1
  74. package/types/radix-ng-primitives-context-menu.d.ts +15 -5
  75. package/types/radix-ng-primitives-core.d.ts +762 -14
  76. package/types/radix-ng-primitives-date-field.d.ts +3 -2
  77. package/types/radix-ng-primitives-dialog.d.ts +77 -32
  78. package/types/radix-ng-primitives-direction-provider.d.ts +41 -0
  79. package/types/radix-ng-primitives-dismissable-layer.d.ts +147 -99
  80. package/types/radix-ng-primitives-field.d.ts +1 -0
  81. package/types/radix-ng-primitives-floating-focus-manager.d.ts +175 -0
  82. package/types/radix-ng-primitives-focus-scope.d.ts +132 -1
  83. package/types/radix-ng-primitives-menu.d.ts +186 -103
  84. package/types/radix-ng-primitives-navigation-menu.d.ts +37 -75
  85. package/types/radix-ng-primitives-popover.d.ts +59 -92
  86. package/types/radix-ng-primitives-popper.d.ts +39 -9
  87. package/types/radix-ng-primitives-preview-card.d.ts +39 -72
  88. package/types/radix-ng-primitives-roving-focus.d.ts +7 -6
  89. package/types/radix-ng-primitives-scroll-area.d.ts +2 -2
  90. package/types/radix-ng-primitives-select.d.ts +145 -108
  91. package/types/radix-ng-primitives-slider.d.ts +5 -4
  92. package/types/radix-ng-primitives-stepper.d.ts +4 -3
  93. package/types/radix-ng-primitives-time-field.d.ts +3 -2
  94. package/types/radix-ng-primitives-toast.d.ts +7 -7
  95. package/types/radix-ng-primitives-toggle-group.d.ts +5 -4
  96. package/types/radix-ng-primitives-toolbar.d.ts +3 -2
  97. package/types/radix-ng-primitives-tooltip.d.ts +24 -67
@@ -1,11 +1,10 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, DestroyRef, signal, model, input, booleanAttribute, output, computed, effect, untracked, Directive, ElementRef, isDevMode, numberAttribute, afterNextRender, NgModule } from '@angular/core';
2
+ import { inject, DestroyRef, ElementRef, signal, model, input, booleanAttribute, output, computed, effect, untracked, Directive, isDevMode, numberAttribute, afterNextRender, NgModule } from '@angular/core';
3
3
  import * as i1 from '@radix-ng/primitives/popper';
4
- import { RdxPopper, RdxPopperContentWrapper, RdxPopperArrow, RdxPopperContent, provideRdxPopperContentConfig, RdxPopperAnchor } from '@radix-ng/primitives/popper';
5
- import { createContext, useTransitionStatus, injectId, useGraceArea } from '@radix-ng/primitives/core';
6
- import { outputFromObservable, outputToObservable } from '@angular/core/rxjs-interop';
7
- import * as i2 from '@radix-ng/primitives/dismissable-layer';
8
- import { RdxDismissableLayer, provideRdxDismissableLayerConfig } from '@radix-ng/primitives/dismissable-layer';
4
+ import { RdxPopper, RdxPopperContentWrapper, RdxPopperArrow, RdxPopperContent, legacyPopperVars, provideRdxPopperContentWrapper, provideRdxPopperContentConfig, RdxPopperAnchor } from '@radix-ng/primitives/popper';
5
+ import * as i2 from '@radix-ng/primitives/core';
6
+ import { createContext, createFloatingRootContext, useTransitionStatus, injectId, createCancelableChangeEventDetails, provideFloatingTree, provideFloatingRootContext, RDX_FLOATING_ROOT_CONTEXT, RDX_FLOATING_REGISTRATION, RdxFloatingNodeRegistration, rdxDevError, useGraceArea, rdxCheckTriggerElement } from '@radix-ng/primitives/core';
7
+ import { RdxDismiss } from '@radix-ng/primitives/dismissable-layer';
9
8
  import * as i1$1 from '@radix-ng/primitives/portal';
10
9
  import { RdxPortalPresence } from '@radix-ng/primitives/portal';
11
10
  import { provideRdxPresenceContext } from '@radix-ng/primitives/presence';
@@ -19,6 +18,15 @@ class RdxPreviewCardRoot {
19
18
  constructor() {
20
19
  this.popper = inject(RdxPopper);
21
20
  this.destroyRef = inject(DestroyRef);
21
+ /**
22
+ * Per-popup floating root context (ADR 0015) — the shared store the popup's dismissal capability
23
+ * reads (`open`, `triggers`, the reference/floating elements). The tree node is registered by the
24
+ * popup; this context exists independently so dismissal can read `open()`.
25
+ */
26
+ this.floatingContext = createFloatingRootContext({
27
+ ownerDocument: inject(ElementRef).nativeElement.ownerDocument,
28
+ open: () => this.open()
29
+ });
22
30
  /** Shared open/close transition state machine (completes on the real animationend). */
23
31
  this.transition = useTransitionStatus((open) => {
24
32
  this.instant.set(false);
@@ -57,11 +65,13 @@ class RdxPreviewCardRoot {
57
65
  this.triggers = signal([], ...(ngDevMode ? [{ debugName: "triggers" }] : /* istanbul ignore next */ []));
58
66
  this.payload = signal(undefined, ...(ngDevMode ? [{ debugName: "payload" }] : /* istanbul ignore next */ []));
59
67
  this.isPointerDownOnTrigger = signal(false, ...(ngDevMode ? [{ debugName: "isPointerDownOnTrigger" }] : /* istanbul ignore next */ []));
68
+ this.preventUnmountOnClose = signal(false, ...(ngDevMode ? [{ debugName: "preventUnmountOnClose" }] : /* istanbul ignore next */ []));
60
69
  this.onOpenChange = output();
61
70
  this.onOpenChangeComplete = output();
62
71
  this.registeredTriggers = new Map();
63
72
  this.viewportTriggerChange = new Set();
64
73
  this.state = computed(() => (this.open() ? 'open' : 'closed'), ...(ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []));
74
+ this.present = computed(() => this.open() || this.preventUnmountOnClose(), ...(ngDevMode ? [{ debugName: "present" }] : /* istanbul ignore next */ []));
65
75
  let previousOpen = this.open();
66
76
  effect(() => {
67
77
  const defaultOpen = this.defaultOpen();
@@ -95,6 +105,14 @@ class RdxPreviewCardRoot {
95
105
  }
96
106
  });
97
107
  effect(() => this.popper.anchorOverride.set(this.trigger()));
108
+ // Sync the dismissal reference (the active trigger) so an outside-press on the trigger counts
109
+ // as "inside" and never dismisses (ADR 0015).
110
+ effect(() => this.floatingContext.setReferenceElement(this.trigger() ?? null));
111
+ effect(() => {
112
+ if (this.open() && this.preventUnmountOnClose()) {
113
+ this.preventUnmountOnClose.set(false);
114
+ }
115
+ });
98
116
  this.destroyRef.onDestroy(() => {
99
117
  this.clearHoverTimers();
100
118
  if (this.instantFrame !== undefined) {
@@ -104,10 +122,25 @@ class RdxPreviewCardRoot {
104
122
  }
105
123
  show(trigger = this.trigger(), payload, triggerId, reason = 'none', event = new Event('preview-card.open-change'), fromHover = false) {
106
124
  this.clearHoverTimers();
107
- this.isHoverActive.set(fromHover);
108
- this.openChangeReason.set(reason);
109
125
  const previousTrigger = this.trigger();
110
126
  const changedTriggerWhileOpen = this.open() && previousTrigger !== trigger;
127
+ const changed = !this.open() || previousTrigger !== trigger;
128
+ if (!changed) {
129
+ this.isHoverActive.set(fromHover);
130
+ this.openChangeReason.set(reason);
131
+ if (triggerId !== undefined) {
132
+ this.triggerId.set(triggerId);
133
+ }
134
+ this.payload.set(payload);
135
+ return;
136
+ }
137
+ const change = this.createOpenChangeEvent(true, reason, event, trigger, triggerId ?? this.triggerId());
138
+ this.onOpenChange.emit(change.payload);
139
+ if (change.eventDetails.isCanceled()) {
140
+ return;
141
+ }
142
+ this.isHoverActive.set(fromHover);
143
+ this.openChangeReason.set(reason);
111
144
  this.instant.set(changedTriggerWhileOpen || reason === 'trigger-focus');
112
145
  if (changedTriggerWhileOpen) {
113
146
  this.scheduleInstantReset();
@@ -122,22 +155,26 @@ class RdxPreviewCardRoot {
122
155
  this.triggerId.set(triggerId);
123
156
  }
124
157
  this.payload.set(payload);
125
- const changed = !this.open() || previousTrigger !== trigger;
158
+ this.preventUnmountOnClose.set(false);
126
159
  this.open.set(true);
127
- if (changed) {
128
- this.emitOpenChange(true, reason, event);
129
- }
160
+ this.floatingContext.events.emit('openchange', { open: true, reason, event: change.eventDetails.event });
130
161
  }
131
162
  close(reason = 'none', event = new Event('preview-card.open-change')) {
132
163
  this.clearHoverTimers();
133
- this.isHoverActive.set(false);
134
164
  if (!this.open()) {
135
165
  return;
136
166
  }
167
+ const change = this.createOpenChangeEvent(false, reason, event, this.trigger(), this.triggerId());
168
+ this.onOpenChange.emit(change.payload);
169
+ if (change.eventDetails.isCanceled()) {
170
+ return;
171
+ }
172
+ this.isHoverActive.set(false);
137
173
  this.instant.set(reason !== 'none' && reason !== 'trigger-hover');
138
174
  this.openChangeReason.set(reason);
175
+ this.preventUnmountOnClose.set(change.shouldPreventUnmountOnClose());
139
176
  this.open.set(false);
140
- this.emitOpenChange(false, reason, event);
177
+ this.floatingContext.events.emit('openchange', { open: false, reason, event: change.eventDetails.event });
141
178
  }
142
179
  toggle(triggerId, trigger, payload, event) {
143
180
  this.clearHoverTimers();
@@ -177,6 +214,7 @@ class RdxPreviewCardRoot {
177
214
  registerTrigger(id, trigger, payload) {
178
215
  this.registeredTriggers.set(id, { element: trigger, payload });
179
216
  this.triggers.update((triggers) => (triggers.includes(trigger) ? triggers : [...triggers, trigger]));
217
+ this.floatingContext.triggers.add(trigger);
180
218
  if (this.triggerId() === id) {
181
219
  this.trigger.set(trigger);
182
220
  this.payload.set(payload());
@@ -190,6 +228,7 @@ class RdxPreviewCardRoot {
190
228
  this.registeredTriggers.delete(id);
191
229
  }
192
230
  this.triggers.update((triggers) => triggers.filter((candidate) => candidate !== trigger));
231
+ this.floatingContext.triggers.delete(trigger);
193
232
  if (this.destroyRef.destroyed) {
194
233
  return;
195
234
  }
@@ -235,14 +274,20 @@ class RdxPreviewCardRoot {
235
274
  this.trigger.set(trigger.element);
236
275
  this.payload.set(trigger.payload());
237
276
  }
238
- emitOpenChange(open, reason, event) {
239
- this.onOpenChange.emit({
240
- open,
241
- triggerId: this.triggerId(),
242
- trigger: this.trigger(),
243
- reason,
244
- event
245
- });
277
+ createOpenChangeEvent(open, reason, event, trigger, triggerId) {
278
+ const change = createCancelableChangeEventDetails(reason, event, trigger);
279
+ return {
280
+ eventDetails: change.eventDetails,
281
+ shouldPreventUnmountOnClose: change.shouldPreventUnmountOnClose,
282
+ payload: {
283
+ open,
284
+ triggerId,
285
+ trigger: change.eventDetails.trigger,
286
+ reason: change.eventDetails.reason,
287
+ event: change.eventDetails.event,
288
+ eventDetails: change.eventDetails
289
+ }
290
+ };
246
291
  }
247
292
  clearHoverTimers() {
248
293
  this.clearOpenTimer();
@@ -272,14 +317,22 @@ class RdxPreviewCardRoot {
272
317
  });
273
318
  }
274
319
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxPreviewCardRoot, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
275
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxPreviewCardRoot, isStandalone: true, selector: "[rdxPreviewCardRoot]", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, defaultOpen: { classPropertyName: "defaultOpen", publicName: "defaultOpen", isSignal: true, isRequired: false, transformFunction: null }, triggerId: { classPropertyName: "triggerId", publicName: "triggerId", isSignal: true, isRequired: false, transformFunction: null }, defaultTriggerId: { classPropertyName: "defaultTriggerId", publicName: "defaultTriggerId", isSignal: true, isRequired: false, transformFunction: null }, handle: { classPropertyName: "handle", publicName: "handle", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", triggerId: "triggerIdChange", onOpenChange: "onOpenChange", onOpenChangeComplete: "onOpenChangeComplete" }, providers: [provideRdxPreviewCardRootContext(context)], exportAs: ["rdxPreviewCardRoot"], hostDirectives: [{ directive: i1.RdxPopper }], ngImport: i0 }); }
320
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxPreviewCardRoot, isStandalone: true, selector: "[rdxPreviewCardRoot]", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, defaultOpen: { classPropertyName: "defaultOpen", publicName: "defaultOpen", isSignal: true, isRequired: false, transformFunction: null }, triggerId: { classPropertyName: "triggerId", publicName: "triggerId", isSignal: true, isRequired: false, transformFunction: null }, defaultTriggerId: { classPropertyName: "defaultTriggerId", publicName: "defaultTriggerId", isSignal: true, isRequired: false, transformFunction: null }, handle: { classPropertyName: "handle", publicName: "handle", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", triggerId: "triggerIdChange", onOpenChange: "onOpenChange", onOpenChangeComplete: "onOpenChangeComplete" }, providers: [
321
+ provideRdxPreviewCardRootContext(context),
322
+ provideFloatingTree(),
323
+ provideFloatingRootContext(() => inject(RdxPreviewCardRoot).floatingContext)
324
+ ], exportAs: ["rdxPreviewCardRoot"], hostDirectives: [{ directive: i1.RdxPopper }], ngImport: i0 }); }
276
325
  }
277
326
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxPreviewCardRoot, decorators: [{
278
327
  type: Directive,
279
328
  args: [{
280
329
  selector: '[rdxPreviewCardRoot]',
281
330
  exportAs: 'rdxPreviewCardRoot',
282
- providers: [provideRdxPreviewCardRootContext(context)],
331
+ providers: [
332
+ provideRdxPreviewCardRootContext(context),
333
+ provideFloatingTree(),
334
+ provideFloatingRootContext(() => inject(RdxPreviewCardRoot).floatingContext)
335
+ ],
283
336
  hostDirectives: [RdxPopper]
284
337
  }]
285
338
  }], ctorParameters: () => [], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], defaultOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultOpen", required: false }] }], triggerId: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerId", required: false }] }, { type: i0.Output, args: ["triggerIdChange"] }], defaultTriggerId: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultTriggerId", required: false }] }], handle: [{ type: i0.Input, args: [{ isSignal: true, alias: "handle", required: false }] }], onOpenChange: [{ type: i0.Output, args: ["onOpenChange"] }], onOpenChangeComplete: [{ type: i0.Output, args: ["onOpenChangeComplete"] }] } });
@@ -287,6 +340,7 @@ function contextFor(root) {
287
340
  return {
288
341
  contentId: root.contentId,
289
342
  isOpen: root.open.asReadonly(),
343
+ present: root.present,
290
344
  trigger: root.trigger.asReadonly(),
291
345
  triggers: root.triggers.asReadonly(),
292
346
  payload: root.payload.asReadonly(),
@@ -366,79 +420,73 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
366
420
 
367
421
  /**
368
422
  * A container for the preview-card contents.
423
+ *
424
+ * **ADR 0015 migration** onto the new floating dismissal engine (dismissal-only — a preview-card has
425
+ * no focus manager, ADR 0017 §1). Escape, an outside press, and a focus-out all close it (the legacy's
426
+ * trigger-press preventDefault is now automatic: the trigger is the registered reference, so a press on
427
+ * it is "inside" and never fires `pointerDownOutside`). A focus-out while a pointer is held on the
428
+ * trigger is still vetoed.
369
429
  */
370
430
  class RdxPreviewCardPopup {
371
431
  constructor() {
372
432
  this.rootContext = injectRdxPreviewCardRootContext();
373
- this.dismissableLayer = inject(RdxDismissableLayer);
433
+ this.host = inject(ElementRef).nativeElement;
434
+ this.floatingContext = inject(RDX_FLOATING_ROOT_CONTEXT);
435
+ this.registration = inject(RDX_FLOATING_REGISTRATION, { optional: true });
374
436
  this.wrapper = inject(RdxPopperContentWrapper, { optional: true });
375
437
  this.align = computed(() => this.wrapper?.placedAlign(), ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
376
438
  this.side = computed(() => this.wrapper?.placedSide(), ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
377
- this.dismissDetails = {
378
- reason: 'none',
379
- event: new Event('preview-card.dismiss')
380
- };
381
439
  /**
382
440
  * Event handler called when the escape key is down. Can be prevented.
383
441
  */
384
- this.escapeKeyDown = outputFromObservable(outputToObservable(this.dismissableLayer.escapeKeyDown));
442
+ this.escapeKeyDown = output();
385
443
  /**
386
444
  * Event handler called when a pointerdown event happens outside of the popup. Can be prevented.
387
445
  */
388
- this.pointerDownOutside = outputFromObservable(outputToObservable(this.dismissableLayer.pointerDownOutside));
446
+ this.pointerDownOutside = output();
389
447
  /**
390
448
  * Event handler called when focus moves outside of the popup. Can be prevented.
391
449
  */
392
- this.focusOutside = outputFromObservable(outputToObservable(this.dismissableLayer.focusOutside));
450
+ this.focusOutside = output();
393
451
  /**
394
452
  * Event handler called when an interaction happens outside of the popup. Can be prevented.
395
453
  */
396
- this.interactOutside = outputFromObservable(outputToObservable(this.dismissableLayer.interactOutside));
397
- const unregisterTransitionElement = this.rootContext.registerTransitionElement(inject(ElementRef).nativeElement);
398
- inject(DestroyRef).onDestroy(() => {
399
- unregisterTransitionElement();
400
- });
401
- this.dismissableLayer.pointerDownOutside.subscribe((event) => {
402
- this.dismissDetails = { reason: 'outside-press', event };
403
- if (this.rootContext.triggers().some((trigger) => trigger.contains(event.target))) {
404
- event.preventDefault();
405
- }
406
- });
407
- this.dismissableLayer.focusOutside.subscribe((event) => {
408
- this.dismissDetails = { reason: 'none', event };
409
- if (this.rootContext.isPointerDownOnTrigger()) {
410
- event.preventDefault();
454
+ this.interactOutside = output();
455
+ this.floatingContext.setFloatingElement(this.host);
456
+ const unregisterTransitionElement = this.rootContext.registerTransitionElement(this.host);
457
+ inject(DestroyRef).onDestroy(unregisterTransitionElement);
458
+ new RdxDismiss(this.floatingContext, () => this.registration?.node() ?? null, {
459
+ escapeKey: () => true,
460
+ outsidePress: () => true,
461
+ focusOutside: () => true,
462
+ onEscapeKeyDown: (event) => this.escapeKeyDown.emit(event),
463
+ onPointerDownOutside: (event) => {
464
+ this.pointerDownOutside.emit(event);
465
+ this.interactOutside.emit(event);
466
+ },
467
+ onFocusOutside: (event) => {
468
+ // A focus-out triggered by a pointer press still in flight on the trigger must not close
469
+ // the card (the toggle handles it) — veto it like the legacy did.
470
+ if (this.rootContext.isPointerDownOnTrigger()) {
471
+ event.preventDefault();
472
+ }
473
+ this.focusOutside.emit(event);
474
+ this.interactOutside.emit(event);
475
+ },
476
+ onDismiss: (reason, event) => {
477
+ const mapped = reason === 'escape-key' ? 'escape-key' : reason === 'outside-press' ? 'outside-press' : 'none';
478
+ this.rootContext.close(mapped, event);
411
479
  }
412
480
  });
413
- this.dismissableLayer.escapeKeyDown.subscribe((event) => {
414
- this.dismissDetails = { reason: 'escape-key', event };
415
- });
416
- this.dismissableLayer.dismiss.subscribe(() => {
417
- this.rootContext.close(this.dismissDetails.reason, this.dismissDetails.event);
418
- this.dismissDetails = { reason: 'none', event: new Event('preview-card.dismiss') };
419
- });
420
481
  }
421
482
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxPreviewCardPopup, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
422
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.9", type: RdxPreviewCardPopup, isStandalone: true, selector: "[rdxPreviewCardPopup]", outputs: { escapeKeyDown: "escapeKeyDown", pointerDownOutside: "pointerDownOutside", focusOutside: "focusOutside", interactOutside: "interactOutside" }, host: { listeners: { "pointerenter": "rootContext.cancelHoverClose()" }, properties: { "attr.data-closed": "rootContext.isOpen() ? undefined : \"\"", "attr.data-ending-style": "rootContext.transitionStatus() === \"ending\" ? \"\" : undefined", "attr.data-instant": "rootContext.instant() ? \"\" : undefined", "attr.data-open": "rootContext.isOpen() ? \"\" : undefined", "attr.data-starting-style": "rootContext.transitionStatus() === \"starting\" ? \"\" : undefined", "attr.data-state": "rootContext.isOpen() ? \"open\" : \"closed\"", "attr.data-align": "align()", "attr.data-side": "side()", "id": "rootContext.contentId" } }, providers: [
423
- provideRdxDismissableLayerConfig(() => {
424
- return {
425
- disableOutsidePointerEvents: signal(false)
426
- };
427
- })
428
- ], hostDirectives: [{ directive: i1.RdxPopperContent }, { directive: i2.RdxDismissableLayer }], ngImport: i0 }); }
483
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.9", type: RdxPreviewCardPopup, isStandalone: true, selector: "[rdxPreviewCardPopup]", outputs: { escapeKeyDown: "escapeKeyDown", pointerDownOutside: "pointerDownOutside", focusOutside: "focusOutside", interactOutside: "interactOutside" }, host: { listeners: { "pointerenter": "rootContext.cancelHoverClose()" }, properties: { "attr.data-closed": "rootContext.isOpen() ? undefined : \"\"", "attr.data-ending-style": "rootContext.transitionStatus() === \"ending\" ? \"\" : undefined", "attr.data-instant": "rootContext.instant() ? \"\" : undefined", "attr.data-open": "rootContext.isOpen() ? \"\" : undefined", "attr.data-starting-style": "rootContext.transitionStatus() === \"starting\" ? \"\" : undefined", "attr.data-state": "rootContext.isOpen() ? \"open\" : \"closed\"", "attr.data-align": "align()", "attr.data-side": "side()", "id": "rootContext.contentId" } }, hostDirectives: [{ directive: i1.RdxPopperContent }, { directive: i2.RdxFloatingNodeRegistration }], ngImport: i0 }); }
429
484
  }
430
485
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxPreviewCardPopup, decorators: [{
431
486
  type: Directive,
432
487
  args: [{
433
488
  selector: '[rdxPreviewCardPopup]',
434
- hostDirectives: [RdxPopperContent, RdxDismissableLayer],
435
- providers: [
436
- provideRdxDismissableLayerConfig(() => {
437
- return {
438
- disableOutsidePointerEvents: signal(false)
439
- };
440
- })
441
- ],
489
+ hostDirectives: [RdxPopperContent, RdxFloatingNodeRegistration],
442
490
  host: {
443
491
  '[attr.data-closed]': 'rootContext.isOpen() ? undefined : ""',
444
492
  '[attr.data-ending-style]': 'rootContext.transitionStatus() === "ending" ? "" : undefined',
@@ -465,7 +513,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
465
513
  */
466
514
  class RdxPreviewCardPortal {
467
515
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxPreviewCardPortal, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
468
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.9", type: RdxPreviewCardPortal, isStandalone: true, selector: "ng-template[rdxPreviewCardPortal]", providers: [provideRdxPresenceContext(() => ({ present: injectRdxPreviewCardRootContext().isOpen }))], exportAs: ["rdxPreviewCardPortal"], hostDirectives: [{ directive: i1$1.RdxPortalPresence, inputs: ["container", "container"] }], ngImport: i0 }); }
516
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.9", type: RdxPreviewCardPortal, isStandalone: true, selector: "ng-template[rdxPreviewCardPortal]", providers: [provideRdxPresenceContext(() => ({ present: injectRdxPreviewCardRootContext().present }))], exportAs: ["rdxPreviewCardPortal"], hostDirectives: [{ directive: i1$1.RdxPortalPresence, inputs: ["container", "container"] }], ngImport: i0 }); }
469
517
  }
470
518
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxPreviewCardPortal, decorators: [{
471
519
  type: Directive,
@@ -473,7 +521,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
473
521
  selector: 'ng-template[rdxPreviewCardPortal]',
474
522
  exportAs: 'rdxPreviewCardPortal',
475
523
  hostDirectives: [{ directive: RdxPortalPresence, inputs: ['container'] }],
476
- providers: [provideRdxPresenceContext(() => ({ present: injectRdxPreviewCardRootContext().isOpen }))]
524
+ providers: [provideRdxPresenceContext(() => ({ present: injectRdxPreviewCardRootContext().present }))]
477
525
  }]
478
526
  }] });
479
527
  /**
@@ -484,9 +532,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
484
532
  class RdxPreviewCardPortalMisuseGuard {
485
533
  constructor() {
486
534
  if (isDevMode()) {
487
- throw new Error('[rdxPreviewCardPortal] is now a structural directive. ' +
535
+ rdxDevError('preview-card/portal-on-element', '`rdxPreviewCardPortal` is now a structural directive. ' +
488
536
  'Use `*rdxPreviewCardPortal` on the positioner element or `<ng-template rdxPreviewCardPortal>`. ' +
489
- 'rdxPreviewCardPortalPresence has been removed. See https://radix-ng.com/components/preview-card.md');
537
+ 'rdxPreviewCardPortalPresence has been removed.', 'components/preview-card');
490
538
  }
491
539
  }
492
540
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxPreviewCardPortalMisuseGuard, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
@@ -501,132 +549,51 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
501
549
 
502
550
  /**
503
551
  * Positions the preview-card against its trigger.
552
+ *
553
+ * A "thin" positioner (ADR 0012): it inherits the popper positioning surface (inputs, `placed`
554
+ * output, unified vars + placement attrs) from {@link RdxPopperContentWrapper} and adds preview-card's
555
+ * own concerns — Base UI-aligned defaults via the config provider, the open/closed/instant state
556
+ * attributes, the deprecated `--radix-preview-card-*` aliases, and the grace-area hover bridge.
504
557
  */
505
- class RdxPreviewCardPositioner {
558
+ class RdxPreviewCardPositioner extends RdxPopperContentWrapper {
506
559
  constructor() {
560
+ super();
507
561
  this.rootContext = injectRdxPreviewCardRootContext();
508
- this.wrapper = inject(RdxPopperContentWrapper);
509
- this.elementRef = inject(ElementRef);
562
+ this.legacyVars = legacyPopperVars('preview-card');
563
+ this.containerRef = inject(ElementRef);
510
564
  this.triggerEl = signal(null, ...(ngDevMode ? [{ debugName: "triggerEl" }] : /* istanbul ignore next */ []));
511
- this.containerEl = signal(this.elementRef.nativeElement, ...(ngDevMode ? [{ debugName: "containerEl" }] : /* istanbul ignore next */ []));
565
+ this.containerEl = signal(this.containerRef.nativeElement, ...(ngDevMode ? [{ debugName: "containerEl" }] : /* istanbul ignore next */ []));
512
566
  this.graceArea = useGraceArea(this.triggerEl, this.containerEl);
513
- /**
514
- * An element to position the popup against. Defaults to the trigger.
515
- */
516
- this.anchor = input(...(ngDevMode ? [undefined, { debugName: "anchor" }] : /* istanbul ignore next */ []));
517
- /**
518
- * The preferred side of the trigger to render against when open.
519
- */
520
- this.side = input('bottom', ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
521
- /**
522
- * Distance between the trigger and the popup in pixels.
523
- */
524
- this.sideOffset = input(0, { ...(ngDevMode ? { debugName: "sideOffset" } : /* istanbul ignore next */ {}), transform: numberAttribute });
525
- /**
526
- * How to align the popup relative to the specified side.
527
- */
528
- this.align = input('center', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
529
- /**
530
- * An offset in pixels from the `start` or `end` alignment options.
531
- */
532
- this.alignOffset = input(0, { ...(ngDevMode ? { debugName: "alignOffset" } : /* istanbul ignore next */ {}), transform: numberAttribute });
533
- /**
534
- * Minimum distance to maintain between the arrow and the edges of the popup.
535
- */
536
- this.arrowPadding = input(5, { ...(ngDevMode ? { debugName: "arrowPadding" } : /* istanbul ignore next */ {}), transform: numberAttribute });
537
- /**
538
- * Whether to override side and alignment preferences to prevent collisions.
539
- */
540
- this.avoidCollisions = input(true, { ...(ngDevMode ? { debugName: "avoidCollisions" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
541
- /**
542
- * The element used as the collision boundary.
543
- */
544
- this.collisionBoundary = input(...(ngDevMode ? [undefined, { debugName: "collisionBoundary" }] : /* istanbul ignore next */ []));
545
- /**
546
- * Distance in pixels from the boundary edges where collision detection should occur.
547
- */
548
- this.collisionPadding = input(5, ...(ngDevMode ? [{ debugName: "collisionPadding" }] : /* istanbul ignore next */ []));
549
- /**
550
- * The sticky behavior on the alignment axis.
551
- */
552
- this.sticky = input('partial', ...(ngDevMode ? [{ debugName: "sticky" }] : /* istanbul ignore next */ []));
553
- /**
554
- * Whether to hide the popup when the trigger becomes fully occluded.
555
- */
556
- this.hideWhenDetached = input(false, { ...(ngDevMode ? { debugName: "hideWhenDetached" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
557
- /**
558
- * The CSS position strategy used by Floating UI.
559
- */
560
- this.positionStrategy = input('fixed', ...(ngDevMode ? [{ debugName: "positionStrategy" }] : /* istanbul ignore next */ []));
561
- /**
562
- * Whether to update position on every animation frame.
563
- */
564
- this.updatePositionStrategy = input('always', ...(ngDevMode ? [{ debugName: "updatePositionStrategy" }] : /* istanbul ignore next */ []));
565
- /**
566
- * Emits when the popup has been placed.
567
- */
568
- this.placed = outputFromObservable(outputToObservable(inject(RdxPopperContentWrapper).placed));
569
567
  effect(() => this.triggerEl.set(this.rootContext.trigger() ?? null));
570
568
  this.graceArea.onPointerExit(() => {
571
569
  this.rootContext.closeOnHover();
572
570
  });
573
571
  }
574
572
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxPreviewCardPositioner, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
575
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxPreviewCardPositioner, isStandalone: true, selector: "[rdxPreviewCardPositioner]", inputs: { anchor: { classPropertyName: "anchor", publicName: "anchor", isSignal: true, isRequired: false, transformFunction: null }, side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null }, sideOffset: { classPropertyName: "sideOffset", publicName: "sideOffset", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, alignOffset: { classPropertyName: "alignOffset", publicName: "alignOffset", isSignal: true, isRequired: false, transformFunction: null }, arrowPadding: { classPropertyName: "arrowPadding", publicName: "arrowPadding", isSignal: true, isRequired: false, transformFunction: null }, avoidCollisions: { classPropertyName: "avoidCollisions", publicName: "avoidCollisions", isSignal: true, isRequired: false, transformFunction: null }, collisionBoundary: { classPropertyName: "collisionBoundary", publicName: "collisionBoundary", isSignal: true, isRequired: false, transformFunction: null }, collisionPadding: { classPropertyName: "collisionPadding", publicName: "collisionPadding", isSignal: true, isRequired: false, transformFunction: null }, sticky: { classPropertyName: "sticky", publicName: "sticky", isSignal: true, isRequired: false, transformFunction: null }, hideWhenDetached: { classPropertyName: "hideWhenDetached", publicName: "hideWhenDetached", isSignal: true, isRequired: false, transformFunction: null }, positionStrategy: { classPropertyName: "positionStrategy", publicName: "positionStrategy", isSignal: true, isRequired: false, transformFunction: null }, updatePositionStrategy: { classPropertyName: "updatePositionStrategy", publicName: "updatePositionStrategy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { placed: "placed" }, host: { properties: { "attr.data-open": "rootContext.isOpen() ? \"\" : undefined", "attr.data-closed": "rootContext.isOpen() ? undefined : \"\"", "attr.data-anchor-hidden": "wrapper.anchorHidden() ? \"\" : undefined", "attr.data-align": "wrapper.placedAlign()", "attr.data-side": "wrapper.placedSide()", "attr.data-instant": "rootContext.instant() ? \"\" : undefined", "style": "{\n '--anchor-width': 'var(--radix-popper-anchor-width)',\n '--anchor-height': 'var(--radix-popper-anchor-height)',\n '--available-width': 'var(--radix-popper-available-width)',\n '--available-height': 'var(--radix-popper-available-height)',\n '--positioner-width': 'var(--radix-popper-content-wrapper-width)',\n '--positioner-height': 'var(--radix-popper-content-wrapper-height)',\n '--transform-origin': 'var(--radix-popper-transform-origin)',\n '--radix-preview-card-content-transform-origin': 'var(--radix-popper-transform-origin)',\n '--radix-preview-card-content-available-width': 'var(--radix-popper-available-width)',\n '--radix-preview-card-content-available-height': 'var(--radix-popper-available-height)',\n '--radix-preview-card-trigger-width': 'var(--radix-popper-anchor-width)',\n '--radix-preview-card-trigger-height': 'var(--radix-popper-anchor-height)'\n }" } }, providers: [
573
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.9", type: RdxPreviewCardPositioner, isStandalone: true, selector: "[rdxPreviewCardPositioner]", host: { properties: { "attr.data-open": "rootContext.isOpen() ? \"\" : undefined", "attr.data-closed": "rootContext.isOpen() ? undefined : \"\"", "attr.data-instant": "rootContext.instant() ? \"\" : undefined", "style": "legacyVars" } }, providers: [
574
+ ...provideRdxPopperContentWrapper(RdxPreviewCardPositioner),
576
575
  provideRdxPopperContentConfig({ arrowPadding: 5, collisionPadding: 5, updatePositionStrategy: 'always' })
577
- ], hostDirectives: [{ directive: 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"] }], ngImport: i0 }); }
576
+ ], usesInheritance: true, ngImport: i0 }); }
578
577
  }
579
578
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxPreviewCardPositioner, decorators: [{
580
579
  type: Directive,
581
580
  args: [{
582
581
  selector: '[rdxPreviewCardPositioner]',
583
582
  providers: [
583
+ ...provideRdxPopperContentWrapper(RdxPreviewCardPositioner),
584
584
  provideRdxPopperContentConfig({ arrowPadding: 5, collisionPadding: 5, updatePositionStrategy: 'always' })
585
585
  ],
586
- hostDirectives: [
587
- {
588
- directive: RdxPopperContentWrapper,
589
- inputs: [
590
- 'anchor',
591
- 'side',
592
- 'sideOffset',
593
- 'align',
594
- 'alignOffset',
595
- 'arrowPadding',
596
- 'avoidCollisions',
597
- 'collisionBoundary',
598
- 'collisionPadding',
599
- 'sticky',
600
- 'hideWhenDetached',
601
- 'positionStrategy',
602
- 'updatePositionStrategy'
603
- ]
604
- }
605
- ],
606
586
  host: {
607
587
  '[attr.data-open]': 'rootContext.isOpen() ? "" : undefined',
608
588
  '[attr.data-closed]': 'rootContext.isOpen() ? undefined : ""',
609
- '[attr.data-anchor-hidden]': 'wrapper.anchorHidden() ? "" : undefined',
610
- '[attr.data-align]': 'wrapper.placedAlign()',
611
- '[attr.data-side]': 'wrapper.placedSide()',
612
589
  '[attr.data-instant]': 'rootContext.instant() ? "" : undefined',
613
- '[style]': `{
614
- '--anchor-width': 'var(--radix-popper-anchor-width)',
615
- '--anchor-height': 'var(--radix-popper-anchor-height)',
616
- '--available-width': 'var(--radix-popper-available-width)',
617
- '--available-height': 'var(--radix-popper-available-height)',
618
- '--positioner-width': 'var(--radix-popper-content-wrapper-width)',
619
- '--positioner-height': 'var(--radix-popper-content-wrapper-height)',
620
- '--transform-origin': 'var(--radix-popper-transform-origin)',
621
- '--radix-preview-card-content-transform-origin': 'var(--radix-popper-transform-origin)',
622
- '--radix-preview-card-content-available-width': 'var(--radix-popper-available-width)',
623
- '--radix-preview-card-content-available-height': 'var(--radix-popper-available-height)',
624
- '--radix-preview-card-trigger-width': 'var(--radix-popper-anchor-width)',
625
- '--radix-preview-card-trigger-height': 'var(--radix-popper-anchor-height)'
626
- }`
590
+ // `data-side`/`data-align`/`data-anchor-hidden` and the unified `--anchor-*`/`--available-*`/
591
+ // `--transform-origin` vars come from the inherited wrapper (ADR 0012); only the deprecated
592
+ // `--radix-preview-card-*` aliases remain, for one release of back-compat.
593
+ '[style]': 'legacyVars'
627
594
  }
628
595
  }]
629
- }], ctorParameters: () => [], propDecorators: { anchor: [{ type: i0.Input, args: [{ isSignal: true, alias: "anchor", required: false }] }], side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }], sideOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "sideOffset", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], alignOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "alignOffset", required: false }] }], arrowPadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "arrowPadding", required: false }] }], avoidCollisions: [{ type: i0.Input, args: [{ isSignal: true, alias: "avoidCollisions", required: false }] }], collisionBoundary: [{ type: i0.Input, args: [{ isSignal: true, alias: "collisionBoundary", required: false }] }], collisionPadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "collisionPadding", required: false }] }], sticky: [{ type: i0.Input, args: [{ isSignal: true, alias: "sticky", required: false }] }], hideWhenDetached: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideWhenDetached", required: false }] }], positionStrategy: [{ type: i0.Input, args: [{ isSignal: true, alias: "positionStrategy", required: false }] }], updatePositionStrategy: [{ type: i0.Input, args: [{ isSignal: true, alias: "updatePositionStrategy", required: false }] }], placed: [{ type: i0.Output, args: ["placed"] }] } });
596
+ }], ctorParameters: () => [] });
630
597
 
631
598
  /**
632
599
  * A link or element that opens the preview card.
@@ -664,6 +631,7 @@ class RdxPreviewCardTrigger {
664
631
  this.isOpen = computed(() => this.rootContext()?.isOpen() === true && this.rootContext()?.trigger() === this.elementRef.nativeElement, ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
665
632
  this.isPressed = computed(() => this.isOpen() && this.rootContext()?.openChangeReason() === 'trigger-press', ...(ngDevMode ? [{ debugName: "isPressed" }] : /* istanbul ignore next */ []));
666
633
  this.generatedId = injectId('rdx-preview-card-trigger-');
634
+ rdxCheckTriggerElement('rdxPreviewCardTrigger', 'preview-card/trigger-element', 'components/preview-card');
667
635
  effect((onCleanup) => {
668
636
  const handle = this.handle();
669
637
  if (handle) {