forty-cdk 0.2.0 → 0.3.0

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 (220) hide show
  1. package/accordion/README.md +122 -0
  2. package/aspect-ratio/README.md +76 -0
  3. package/avatar/README.md +100 -0
  4. package/breadcrumbs/README.md +49 -0
  5. package/breakpoints/README.md +81 -0
  6. package/button/README.md +49 -0
  7. package/calendar/README.md +458 -0
  8. package/carousel/README.md +358 -0
  9. package/checkbox/README.md +146 -0
  10. package/combobox/README.md +535 -0
  11. package/context-menu/README.md +139 -0
  12. package/date-field/README.md +184 -0
  13. package/date-picker/README.md +338 -0
  14. package/dialog/README.md +388 -0
  15. package/disclosure/README.md +114 -0
  16. package/drag-drop/README.md +359 -0
  17. package/drawer/README.md +560 -0
  18. package/dropdown-menu/README.md +176 -0
  19. package/fesm2022/forty-cdk-accordion.mjs +348 -0
  20. package/fesm2022/forty-cdk-accordion.mjs.map +1 -0
  21. package/fesm2022/forty-cdk-aspect-ratio.mjs +74 -0
  22. package/fesm2022/forty-cdk-aspect-ratio.mjs.map +1 -0
  23. package/fesm2022/forty-cdk-avatar.mjs +308 -0
  24. package/fesm2022/forty-cdk-avatar.mjs.map +1 -0
  25. package/fesm2022/forty-cdk-breadcrumbs.mjs +125 -0
  26. package/fesm2022/forty-cdk-breadcrumbs.mjs.map +1 -0
  27. package/fesm2022/forty-cdk-breakpoints.mjs +117 -0
  28. package/fesm2022/forty-cdk-breakpoints.mjs.map +1 -0
  29. package/fesm2022/forty-cdk-button.mjs +134 -0
  30. package/fesm2022/forty-cdk-button.mjs.map +1 -0
  31. package/fesm2022/forty-cdk-calendar.mjs +2034 -0
  32. package/fesm2022/forty-cdk-calendar.mjs.map +1 -0
  33. package/fesm2022/forty-cdk-carousel.mjs +968 -0
  34. package/fesm2022/forty-cdk-carousel.mjs.map +1 -0
  35. package/fesm2022/forty-cdk-checkbox.mjs +226 -0
  36. package/fesm2022/forty-cdk-checkbox.mjs.map +1 -0
  37. package/fesm2022/forty-cdk-combobox.mjs +2596 -0
  38. package/fesm2022/forty-cdk-combobox.mjs.map +1 -0
  39. package/fesm2022/forty-cdk-context-menu.mjs +413 -0
  40. package/fesm2022/forty-cdk-context-menu.mjs.map +1 -0
  41. package/fesm2022/forty-cdk-core.mjs +9022 -0
  42. package/fesm2022/forty-cdk-core.mjs.map +1 -0
  43. package/fesm2022/forty-cdk-date-field.mjs +744 -0
  44. package/fesm2022/forty-cdk-date-field.mjs.map +1 -0
  45. package/fesm2022/forty-cdk-date-picker.mjs +1011 -0
  46. package/fesm2022/forty-cdk-date-picker.mjs.map +1 -0
  47. package/fesm2022/forty-cdk-dialog.mjs +707 -0
  48. package/fesm2022/forty-cdk-dialog.mjs.map +1 -0
  49. package/fesm2022/forty-cdk-disclosure.mjs +190 -0
  50. package/fesm2022/forty-cdk-disclosure.mjs.map +1 -0
  51. package/fesm2022/forty-cdk-drag-drop.mjs +1180 -0
  52. package/fesm2022/forty-cdk-drag-drop.mjs.map +1 -0
  53. package/fesm2022/forty-cdk-drawer.mjs +1641 -0
  54. package/fesm2022/forty-cdk-drawer.mjs.map +1 -0
  55. package/fesm2022/forty-cdk-dropdown-menu.mjs +350 -0
  56. package/fesm2022/forty-cdk-dropdown-menu.mjs.map +1 -0
  57. package/fesm2022/forty-cdk-field.mjs +425 -0
  58. package/fesm2022/forty-cdk-field.mjs.map +1 -0
  59. package/fesm2022/forty-cdk-fieldset.mjs +164 -0
  60. package/fesm2022/forty-cdk-fieldset.mjs.map +1 -0
  61. package/fesm2022/forty-cdk-file-upload.mjs +221 -0
  62. package/fesm2022/forty-cdk-file-upload.mjs.map +1 -0
  63. package/fesm2022/forty-cdk-hover-card.mjs +496 -0
  64. package/fesm2022/forty-cdk-hover-card.mjs.map +1 -0
  65. package/fesm2022/forty-cdk-input.mjs +274 -0
  66. package/fesm2022/forty-cdk-input.mjs.map +1 -0
  67. package/fesm2022/forty-cdk-internationalized-date.mjs +1 -1
  68. package/fesm2022/forty-cdk-internationalized-date.mjs.map +1 -1
  69. package/fesm2022/forty-cdk-listbox.mjs +1279 -0
  70. package/fesm2022/forty-cdk-listbox.mjs.map +1 -0
  71. package/fesm2022/forty-cdk-menu.mjs +1439 -0
  72. package/fesm2022/forty-cdk-menu.mjs.map +1 -0
  73. package/fesm2022/forty-cdk-menubar.mjs +787 -0
  74. package/fesm2022/forty-cdk-menubar.mjs.map +1 -0
  75. package/fesm2022/forty-cdk-meter.mjs +211 -0
  76. package/fesm2022/forty-cdk-meter.mjs.map +1 -0
  77. package/fesm2022/forty-cdk-navigation-menu.mjs +1145 -0
  78. package/fesm2022/forty-cdk-navigation-menu.mjs.map +1 -0
  79. package/fesm2022/forty-cdk-number-input.mjs +559 -0
  80. package/fesm2022/forty-cdk-number-input.mjs.map +1 -0
  81. package/fesm2022/forty-cdk-otp-input.mjs +527 -0
  82. package/fesm2022/forty-cdk-otp-input.mjs.map +1 -0
  83. package/fesm2022/forty-cdk-pagination.mjs +323 -0
  84. package/fesm2022/forty-cdk-pagination.mjs.map +1 -0
  85. package/fesm2022/forty-cdk-pane-resizer.mjs +297 -0
  86. package/fesm2022/forty-cdk-pane-resizer.mjs.map +1 -0
  87. package/fesm2022/forty-cdk-popover.mjs +698 -0
  88. package/fesm2022/forty-cdk-popover.mjs.map +1 -0
  89. package/fesm2022/forty-cdk-progress.mjs +226 -0
  90. package/fesm2022/forty-cdk-progress.mjs.map +1 -0
  91. package/fesm2022/forty-cdk-radio-group.mjs +378 -0
  92. package/fesm2022/forty-cdk-radio-group.mjs.map +1 -0
  93. package/fesm2022/forty-cdk-scroll-area.mjs +640 -0
  94. package/fesm2022/forty-cdk-scroll-area.mjs.map +1 -0
  95. package/fesm2022/forty-cdk-search.mjs +205 -0
  96. package/fesm2022/forty-cdk-search.mjs.map +1 -0
  97. package/fesm2022/forty-cdk-select.mjs +1661 -0
  98. package/fesm2022/forty-cdk-select.mjs.map +1 -0
  99. package/fesm2022/forty-cdk-separator.mjs +82 -0
  100. package/fesm2022/forty-cdk-separator.mjs.map +1 -0
  101. package/fesm2022/forty-cdk-signal-forms.mjs +97 -0
  102. package/fesm2022/forty-cdk-signal-forms.mjs.map +1 -0
  103. package/fesm2022/forty-cdk-slider.mjs +803 -0
  104. package/fesm2022/forty-cdk-slider.mjs.map +1 -0
  105. package/fesm2022/forty-cdk-stepper.mjs +886 -0
  106. package/fesm2022/forty-cdk-stepper.mjs.map +1 -0
  107. package/fesm2022/forty-cdk-switch.mjs +137 -0
  108. package/fesm2022/forty-cdk-switch.mjs.map +1 -0
  109. package/fesm2022/forty-cdk-table.mjs +1518 -0
  110. package/fesm2022/forty-cdk-table.mjs.map +1 -0
  111. package/fesm2022/forty-cdk-tabs.mjs +400 -0
  112. package/fesm2022/forty-cdk-tabs.mjs.map +1 -0
  113. package/fesm2022/forty-cdk-time-field.mjs +593 -0
  114. package/fesm2022/forty-cdk-time-field.mjs.map +1 -0
  115. package/fesm2022/forty-cdk-time-picker.mjs +1013 -0
  116. package/fesm2022/forty-cdk-time-picker.mjs.map +1 -0
  117. package/fesm2022/forty-cdk-toast.mjs +1153 -0
  118. package/fesm2022/forty-cdk-toast.mjs.map +1 -0
  119. package/fesm2022/forty-cdk-toggle.mjs +516 -0
  120. package/fesm2022/forty-cdk-toggle.mjs.map +1 -0
  121. package/fesm2022/forty-cdk-toolbar.mjs +374 -0
  122. package/fesm2022/forty-cdk-toolbar.mjs.map +1 -0
  123. package/fesm2022/forty-cdk-tooltip.mjs +672 -0
  124. package/fesm2022/forty-cdk-tooltip.mjs.map +1 -0
  125. package/fesm2022/forty-cdk-tree.mjs +2007 -0
  126. package/fesm2022/forty-cdk-tree.mjs.map +1 -0
  127. package/fesm2022/forty-cdk-virtualization.mjs +1 -1
  128. package/fesm2022/forty-cdk-virtualization.mjs.map +1 -1
  129. package/fesm2022/forty-cdk.mjs +0 -43310
  130. package/fesm2022/forty-cdk.mjs.map +1 -1
  131. package/field/README.md +97 -0
  132. package/fieldset/README.md +86 -0
  133. package/file-upload/README.md +73 -0
  134. package/hover-card/README.md +171 -0
  135. package/input/README.md +156 -0
  136. package/listbox/README.md +424 -0
  137. package/menu/README.md +181 -0
  138. package/menubar/README.md +140 -0
  139. package/meter/README.md +128 -0
  140. package/navigation-menu/README.md +253 -0
  141. package/number-input/README.md +171 -0
  142. package/otp-input/README.md +198 -0
  143. package/package.json +213 -1
  144. package/pagination/README.md +61 -0
  145. package/pane-resizer/README.md +136 -0
  146. package/popover/README.md +262 -0
  147. package/progress/README.md +115 -0
  148. package/radio-group/README.md +129 -0
  149. package/scroll-area/README.md +184 -0
  150. package/search/README.md +42 -0
  151. package/select/README.md +488 -0
  152. package/separator/README.md +84 -0
  153. package/signal-forms/README.md +72 -0
  154. package/slider/README.md +152 -0
  155. package/stepper/README.md +292 -0
  156. package/switch/README.md +116 -0
  157. package/table/README.md +769 -0
  158. package/tabs/README.md +130 -0
  159. package/time-field/README.md +157 -0
  160. package/time-picker/README.md +172 -0
  161. package/toast/README.md +398 -0
  162. package/toggle/README.md +224 -0
  163. package/toolbar/README.md +109 -0
  164. package/tooltip/README.md +274 -0
  165. package/tree/README.md +708 -0
  166. package/types/forty-cdk-accordion.d.ts +242 -0
  167. package/types/forty-cdk-aspect-ratio.d.ts +59 -0
  168. package/types/forty-cdk-avatar.d.ts +133 -0
  169. package/types/forty-cdk-breadcrumbs.d.ts +92 -0
  170. package/types/forty-cdk-breakpoints.d.ts +141 -0
  171. package/types/forty-cdk-button.d.ts +80 -0
  172. package/types/forty-cdk-calendar.d.ts +914 -0
  173. package/types/forty-cdk-carousel.d.ts +530 -0
  174. package/types/forty-cdk-checkbox.d.ts +141 -0
  175. package/types/forty-cdk-combobox.d.ts +1259 -0
  176. package/types/forty-cdk-context-menu.d.ts +313 -0
  177. package/types/forty-cdk-core.d.ts +5774 -0
  178. package/types/forty-cdk-date-field.d.ts +307 -0
  179. package/types/forty-cdk-date-picker.d.ts +622 -0
  180. package/types/forty-cdk-dialog.d.ts +546 -0
  181. package/types/forty-cdk-disclosure.d.ts +127 -0
  182. package/types/forty-cdk-drag-drop.d.ts +456 -0
  183. package/types/forty-cdk-drawer.d.ts +871 -0
  184. package/types/forty-cdk-dropdown-menu.d.ts +242 -0
  185. package/types/forty-cdk-field.d.ts +236 -0
  186. package/types/forty-cdk-fieldset.d.ts +119 -0
  187. package/types/forty-cdk-file-upload.d.ts +124 -0
  188. package/types/forty-cdk-hover-card.d.ts +320 -0
  189. package/types/forty-cdk-input.d.ts +169 -0
  190. package/types/forty-cdk-internationalized-date.d.ts +1 -1
  191. package/types/forty-cdk-listbox.d.ts +513 -0
  192. package/types/forty-cdk-menu.d.ts +629 -0
  193. package/types/forty-cdk-menubar.d.ts +451 -0
  194. package/types/forty-cdk-meter.d.ts +122 -0
  195. package/types/forty-cdk-navigation-menu.d.ts +514 -0
  196. package/types/forty-cdk-number-input.d.ts +319 -0
  197. package/types/forty-cdk-otp-input.d.ts +248 -0
  198. package/types/forty-cdk-pagination.d.ts +214 -0
  199. package/types/forty-cdk-pane-resizer.d.ts +145 -0
  200. package/types/forty-cdk-popover.d.ts +509 -0
  201. package/types/forty-cdk-progress.d.ts +143 -0
  202. package/types/forty-cdk-radio-group.d.ts +222 -0
  203. package/types/forty-cdk-scroll-area.d.ts +258 -0
  204. package/types/forty-cdk-search.d.ts +142 -0
  205. package/types/forty-cdk-select.d.ts +899 -0
  206. package/types/forty-cdk-separator.d.ts +59 -0
  207. package/types/forty-cdk-signal-forms.d.ts +58 -0
  208. package/types/forty-cdk-slider.d.ts +379 -0
  209. package/types/forty-cdk-stepper.d.ts +650 -0
  210. package/types/forty-cdk-switch.d.ts +87 -0
  211. package/types/forty-cdk-table.d.ts +723 -0
  212. package/types/forty-cdk-tabs.d.ts +235 -0
  213. package/types/forty-cdk-time-field.d.ts +307 -0
  214. package/types/forty-cdk-time-picker.d.ts +578 -0
  215. package/types/forty-cdk-toast.d.ts +598 -0
  216. package/types/forty-cdk-toggle.d.ts +310 -0
  217. package/types/forty-cdk-toolbar.d.ts +217 -0
  218. package/types/forty-cdk-tooltip.d.ts +436 -0
  219. package/types/forty-cdk-tree.d.ts +688 -0
  220. package/types/forty-cdk.d.ts +1 -19743
@@ -0,0 +1,496 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, inject, computed, Injectable, model, input, numberAttribute, booleanAttribute, output, signal, DestroyRef, Directive, ElementRef, effect } from '@angular/core';
3
+ import { createDefaults, SkipDelayCoordinator, ANCHORED_POSITIONING_DEFAULTS, forceCloseWhenDisabled, createHoverIntent, emitVetoableNativeEvent, injectOverlayShell, toFloatingPositioner, registerHandle } from 'forty-cdk/core';
4
+
5
+ const FOR_HOVER_CARD_CONTEXT = new InjectionToken('FOR_HOVER_CARD_CONTEXT');
6
+ function injectHoverCardContext(piece) {
7
+ const ctx = inject(FOR_HOVER_CARD_CONTEXT, { optional: true });
8
+ if (!ctx) {
9
+ throw new Error(`[forty-cdk/hover-card] ${piece} must be used inside a [forHoverCard] element. ` +
10
+ "If it is declared inside an ng-template, DI resolves at the template's declaration site — " +
11
+ 'not where it is stamped (e.g. via ngTemplateOutlet) — so declare the template inside the ' +
12
+ '[forHoverCard] root.');
13
+ }
14
+ return ctx;
15
+ }
16
+ /**
17
+ * Resolves the trigger's root context: the explicit reference when the
18
+ * `[forHoverCardTrigger]` input carries one, the injected
19
+ * `FOR_HOVER_CARD_CONTEXT` otherwise. The orphan error only fires when neither
20
+ * resolves, on first read of the returned signal. Must be called in an
21
+ * injection context.
22
+ */
23
+ function injectHoverCardTriggerContext(explicitRoot) {
24
+ const injected = inject(FOR_HOVER_CARD_CONTEXT, { optional: true });
25
+ return computed(() => {
26
+ const explicit = explicitRoot();
27
+ if (explicit !== '') {
28
+ return explicit;
29
+ }
30
+ if (injected) {
31
+ return injected;
32
+ }
33
+ throw new Error('[forty-cdk/hover-card] ForHoverCardTrigger could not resolve its [forHoverCard] root: ' +
34
+ 'no FOR_HOVER_CARD_CONTEXT provider is visible and no explicit root reference was passed. ' +
35
+ "If this trigger is declared inside an ng-template, DI resolves at the template's declaration " +
36
+ 'site — not where it is stamped — so either declare the template inside the root or pass the ' +
37
+ 'root explicitly: [forHoverCardTrigger]="root" with #root="forHoverCard".');
38
+ });
39
+ }
40
+
41
+ /**
42
+ * Library fallback for hover-card defaults, read at the root injector when no
43
+ * consumer has called `provideForHoverCardDefaults`. Exported for the shared
44
+ * defaults contract spec; not re-exported from the primitive's public entry.
45
+ */
46
+ const FOR_HOVER_CARD_FALLBACK_DEFAULTS = {
47
+ openDelay: 700,
48
+ closeDelay: 300,
49
+ skipDelayDuration: 300,
50
+ side: 'top',
51
+ align: 'center',
52
+ sideOffset: 8,
53
+ collisionPadding: 8,
54
+ };
55
+ const { token, provideDefaults } = createDefaults('FOR_HOVER_CARD_DEFAULTS', FOR_HOVER_CARD_FALLBACK_DEFAULTS);
56
+ /** Token holding the resolved hover-card defaults for the current scope. */
57
+ const FOR_HOVER_CARD_DEFAULTS = token;
58
+ /**
59
+ * Per-injector-scope coordinator: thin subclass of the shared
60
+ * `SkipDelayCoordinator` bound to this primitive's own DI token. Each
61
+ * `provideForHoverCardDefaults` call re-provides it so the corresponding
62
+ * subtree gets its own skip-delay window. Independent from
63
+ * `TooltipCoordinator` — tooltips and hover-cards have different cadences and
64
+ * separate scopes.
65
+ */
66
+ class HoverCardCoordinator extends SkipDelayCoordinator {
67
+ constructor() {
68
+ super(inject(FOR_HOVER_CARD_DEFAULTS));
69
+ }
70
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: HoverCardCoordinator, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
71
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: HoverCardCoordinator, providedIn: 'root' });
72
+ }
73
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: HoverCardCoordinator, decorators: [{
74
+ type: Injectable,
75
+ args: [{ providedIn: 'root' }]
76
+ }], ctorParameters: () => [] });
77
+ /**
78
+ * Configures forty-cdk hover-card defaults for this injector scope.
79
+ * Partial overrides inherit unspecified keys from the parent scope (or
80
+ * library defaults at the root). Each call establishes a new coordinator
81
+ * scope.
82
+ */
83
+ function provideForHoverCardDefaults(defaults = {}) {
84
+ return [...provideDefaults(defaults), HoverCardCoordinator];
85
+ }
86
+
87
+ /**
88
+ * Headless hover-preview card. Use it to surface rich, interactive previews
89
+ * (profile snapshots, link previews, definition cards) on hover or focus
90
+ * of an already-meaningful trigger (a link, a name).
91
+ *
92
+ * **Not a tooltip.** Hover-cards may contain interactive content
93
+ * (clickable links, copy buttons, …); the trigger must convey full meaning
94
+ * on its own so keyboard-only users miss nothing.
95
+ *
96
+ * Open / close delays default to 700 / 300 ms; the per-injector-scope
97
+ * `provideForHoverCardDefaults` configures the cadence and the skip-delay
98
+ * window for adjacent cards.
99
+ *
100
+ * @example
101
+ * ```html
102
+ * <span forHoverCard #card="forHoverCard">
103
+ * <a forHoverCardTrigger href="/users/ada">Ada Lovelace</a>
104
+ * @if (card.open()) {
105
+ * <div forHoverCardContent animate.enter="fade-in" animate.leave="fade-out">
106
+ * <img src="/api/avatar/ada" alt="" />
107
+ * <h3>Ada Lovelace</h3>
108
+ * <p>Mathematician.</p>
109
+ * </div>
110
+ * }
111
+ * </span>
112
+ * ```
113
+ */
114
+ class ForHoverCard {
115
+ #defaults = inject(FOR_HOVER_CARD_DEFAULTS);
116
+ /**
117
+ * Two-way bindable. Whether the card is currently shown. The `model()`
118
+ * change emitter (`(openChange)`) fires only on internal transitions
119
+ * (delay-driven, escape, blur, and the force-close that runs when `disabled`
120
+ * flips to true), never on consumer writes through `[(open)]`.
121
+ */
122
+ open = model(false, /* @ts-ignore */
123
+ ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
124
+ /**
125
+ * Per-card override for the side the card is anchored to. Pair with
126
+ * `align` for the full positioning API. When `undefined` (default), falls
127
+ * back to `ForHoverCardDefaults.side` from the surrounding
128
+ * `provideForHoverCardDefaults` scope (`'top'` unless configured).
129
+ *
130
+ * The input is aliased to `side`; consumers bind `[side]="..."` and read
131
+ * the effective value via the public `side` computed below.
132
+ */
133
+ _sideInput = input(undefined, { ...(ngDevMode ? { debugName: "_sideInput" } : /* istanbul ignore next */ {}), alias: 'side' });
134
+ /** Effective anchor side: the `side` input when set, else the scope default. */
135
+ side = computed(() => this._sideInput() ?? this.#defaults.side, /* @ts-ignore */
136
+ ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
137
+ /**
138
+ * Per-card override for the alignment along the chosen `side`. When
139
+ * `undefined` (default), falls back to `ForHoverCardDefaults.align` from the
140
+ * surrounding `provideForHoverCardDefaults` scope (`'center'` unless
141
+ * configured).
142
+ *
143
+ * The input is aliased to `align`; consumers bind `[align]="..."` and read
144
+ * the effective value via the public `align` computed below.
145
+ */
146
+ _alignInput = input(undefined, { ...(ngDevMode ? { debugName: "_alignInput" } : /* istanbul ignore next */ {}), alias: 'align' });
147
+ /** Effective alignment: the `align` input when set, else the scope default. */
148
+ align = computed(() => this._alignInput() ?? this.#defaults.align, /* @ts-ignore */
149
+ ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
150
+ /**
151
+ * Per-card override for the gap (px) between trigger and card along the
152
+ * main axis. When `undefined` (default),
153
+ * falls back to `ForHoverCardDefaults.sideOffset` from the surrounding
154
+ * `provideForHoverCardDefaults` scope (`8` unless configured).
155
+ *
156
+ * The input is aliased to `sideOffset`; consumers bind `[sideOffset]="..."`
157
+ * and read the effective value via the public `sideOffset` computed below.
158
+ */
159
+ _sideOffsetInput = input(undefined, { ...(ngDevMode ? { debugName: "_sideOffsetInput" } : /* istanbul ignore next */ {}), alias: 'sideOffset',
160
+ transform: (v) => (v == null ? undefined : numberAttribute(v)) });
161
+ /** Effective main-axis gap (px): the `sideOffset` input when set, else the scope default. */
162
+ sideOffset = computed(() => this._sideOffsetInput() ?? this.#defaults.sideOffset, /* @ts-ignore */
163
+ ...(ngDevMode ? [{ debugName: "sideOffset" }] : /* istanbul ignore next */ []));
164
+ /** Gap (px) along the cross axis. Default `0`. */
165
+ alignOffset = input(ANCHORED_POSITIONING_DEFAULTS.alignOffset, { ...(ngDevMode ? { debugName: "alignOffset" } : /* istanbul ignore next */ {}), transform: numberAttribute });
166
+ /** When `true` (default), `flip` and `shift` keep the card inside the viewport. */
167
+ avoidCollisions = input(ANCHORED_POSITIONING_DEFAULTS.avoidCollisions, { ...(ngDevMode ? { debugName: "avoidCollisions" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
168
+ /**
169
+ * Per-card override for the padding (px) applied uniformly to the `flip`,
170
+ * `shift`, and `size` middlewares. When `undefined` (default), falls back
171
+ * to `ForHoverCardDefaults.collisionPadding` from the surrounding
172
+ * `provideForHoverCardDefaults` scope (`8` unless configured).
173
+ *
174
+ * The input is aliased to `collisionPadding`; consumers bind
175
+ * `[collisionPadding]="..."` and read the effective value via the public
176
+ * `collisionPadding` computed below.
177
+ */
178
+ _collisionPaddingInput = input(undefined, { ...(ngDevMode ? { debugName: "_collisionPaddingInput" } : /* istanbul ignore next */ {}), alias: 'collisionPadding',
179
+ transform: (v) => (v == null ? undefined : numberAttribute(v)) });
180
+ /** Effective collision padding (px): the `collisionPadding` input when set, else the scope default. */
181
+ collisionPadding = computed(() => this._collisionPaddingInput() ?? this.#defaults.collisionPadding, /* @ts-ignore */
182
+ ...(ngDevMode ? [{ debugName: "collisionPadding" }] : /* istanbul ignore next */ []));
183
+ /** Padding (px) for the `arrow` middleware. Default `0`. */
184
+ arrowPadding = input(ANCHORED_POSITIONING_DEFAULTS.arrowPadding, { ...(ngDevMode ? { debugName: "arrowPadding" } : /* istanbul ignore next */ {}), transform: numberAttribute });
185
+ /** Stickiness behaviour for `shift`. Default `'partial'`. */
186
+ sticky = input(ANCHORED_POSITIONING_DEFAULTS.sticky, /* @ts-ignore */
187
+ ...(ngDevMode ? [{ debugName: "sticky" }] : /* istanbul ignore next */ []));
188
+ /** When `true`, sets `data-detached=""` while the trigger is scrolled off-screen. */
189
+ hideWhenDetached = input(ANCHORED_POSITIONING_DEFAULTS.hideWhenDetached, { ...(ngDevMode ? { debugName: "hideWhenDetached" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
190
+ /**
191
+ * When `true` (default), the content is clipped until floating-ui resolves
192
+ * its first position, preventing a flash at the viewport corner. Set to
193
+ * `false` so a dramatic `animate.enter` plays from its first frame (the
194
+ * surface may flash briefly at the unresolved position while positioning
195
+ * computes).
196
+ */
197
+ clipUntilPositioned = input(ANCHORED_POSITIONING_DEFAULTS.clipUntilPositioned, { ...(ngDevMode ? { debugName: "clipUntilPositioned" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
198
+ /** Per-card override for open delay (ms). Falls back to coordinator (700ms). */
199
+ openDelay = input(undefined, /* @ts-ignore */
200
+ ...(ngDevMode ? [{ debugName: "openDelay" }] : /* istanbul ignore next */ []));
201
+ /** Per-card override for close delay (ms). Falls back to coordinator (300ms). */
202
+ closeDelay = input(undefined, /* @ts-ignore */
203
+ ...(ngDevMode ? [{ debugName: "closeDelay" }] : /* istanbul ignore next */ []));
204
+ /** When true, all hover / focus interaction is ignored and any open card is forced closed. */
205
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
206
+ /**
207
+ * Fires when the user presses Escape while the card is open, regardless of
208
+ * where focus currently lives — on the trigger, inside the portaled
209
+ * content, or on an unrelated element (the common case for a card opened by
210
+ * hover). Routed through the content's document-level dismissable layer.
211
+ * Call `preventDefault()` on the emitted veto to suppress the automatic
212
+ * close. The native `KeyboardEvent` is on `.event`.
213
+ */
214
+ escapeKeyDown = output();
215
+ #triggerEl = signal(null, /* @ts-ignore */
216
+ ...(ngDevMode ? [{ debugName: "#triggerEl" }] : /* istanbul ignore next */ []));
217
+ trigger = this.#triggerEl.asReadonly();
218
+ #arrowEl = signal(null, /* @ts-ignore */
219
+ ...(ngDevMode ? [{ debugName: "#arrowEl" }] : /* istanbul ignore next */ []));
220
+ arrow = this.#arrowEl.asReadonly();
221
+ #contentEl = signal(null, /* @ts-ignore */
222
+ ...(ngDevMode ? [{ debugName: "#contentEl" }] : /* istanbul ignore next */ []));
223
+ content = this.#contentEl.asReadonly();
224
+ #coordinator = inject(HoverCardCoordinator);
225
+ #hoverIntent;
226
+ constructor() {
227
+ forceCloseWhenDisabled({
228
+ open: this.open,
229
+ disabled: this.disabled,
230
+ onForceClose: () => this.cancelPending(),
231
+ });
232
+ this.#hoverIntent = createHoverIntent({
233
+ open: this.open,
234
+ isDisabled: () => this.disabled(),
235
+ openDelay: () => this.openDelay() ?? this.#coordinator.openDelay,
236
+ closeDelay: () => this.closeDelay() ?? this.#coordinator.closeDelay,
237
+ coordinator: this.#coordinator,
238
+ });
239
+ inject(DestroyRef).onDestroy(() => this.cancelPending());
240
+ }
241
+ registerTrigger(el) {
242
+ this.#triggerEl.set(el);
243
+ }
244
+ unregisterTrigger(el) {
245
+ if (this.#triggerEl() === el) {
246
+ this.#triggerEl.set(null);
247
+ }
248
+ }
249
+ registerArrow(el) {
250
+ this.#arrowEl.set(el);
251
+ }
252
+ unregisterArrow(el) {
253
+ if (this.#arrowEl() === el) {
254
+ this.#arrowEl.set(null);
255
+ }
256
+ }
257
+ registerContent(el) {
258
+ this.#contentEl.set(el);
259
+ }
260
+ unregisterContent(el) {
261
+ if (this.#contentEl() === el) {
262
+ this.#contentEl.set(null);
263
+ }
264
+ }
265
+ scheduleOpen(_reason) {
266
+ this.#hoverIntent.scheduleOpen();
267
+ }
268
+ scheduleClose(reason) {
269
+ this.#hoverIntent.scheduleClose(reason === 'escape');
270
+ }
271
+ cancelPending() {
272
+ this.#hoverIntent.cancelPending();
273
+ }
274
+ /**
275
+ * Emit `(escapeKeyDown)` and, unless the consumer calls `preventDefault()`
276
+ * on the veto, close immediately. Driven by the content's document-level
277
+ * dismissable layer so Escape works no matter where focus currently lives
278
+ * — including a hover-opened card with focus on an unrelated element.
279
+ */
280
+ emitEscapeKeyDown(event) {
281
+ if (!this.open()) {
282
+ return;
283
+ }
284
+ const vetoed = emitVetoableNativeEvent(this.escapeKeyDown, event);
285
+ if (!vetoed) {
286
+ event.preventDefault();
287
+ event.stopPropagation();
288
+ this.scheduleClose('escape');
289
+ }
290
+ }
291
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ForHoverCard, deps: [], target: i0.ɵɵFactoryTarget.Directive });
292
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: ForHoverCard, isStandalone: true, selector: "[forHoverCard]", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, _sideInput: { classPropertyName: "_sideInput", publicName: "side", isSignal: true, isRequired: false, transformFunction: null }, _alignInput: { classPropertyName: "_alignInput", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, _sideOffsetInput: { classPropertyName: "_sideOffsetInput", publicName: "sideOffset", isSignal: true, isRequired: false, transformFunction: null }, alignOffset: { classPropertyName: "alignOffset", publicName: "alignOffset", isSignal: true, isRequired: false, transformFunction: null }, avoidCollisions: { classPropertyName: "avoidCollisions", publicName: "avoidCollisions", isSignal: true, isRequired: false, transformFunction: null }, _collisionPaddingInput: { classPropertyName: "_collisionPaddingInput", publicName: "collisionPadding", isSignal: true, isRequired: false, transformFunction: null }, arrowPadding: { classPropertyName: "arrowPadding", publicName: "arrowPadding", 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 }, clipUntilPositioned: { classPropertyName: "clipUntilPositioned", publicName: "clipUntilPositioned", isSignal: true, isRequired: false, transformFunction: null }, openDelay: { classPropertyName: "openDelay", publicName: "openDelay", isSignal: true, isRequired: false, transformFunction: null }, closeDelay: { classPropertyName: "closeDelay", publicName: "closeDelay", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", escapeKeyDown: "escapeKeyDown" }, host: { properties: { "attr.data-state": "open() ? \"open\" : \"closed\"", "attr.data-disabled": "disabled() ? \"\" : null" } }, providers: [{ provide: FOR_HOVER_CARD_CONTEXT, useExisting: ForHoverCard }], exportAs: ["forHoverCard"], ngImport: i0 });
293
+ }
294
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ForHoverCard, decorators: [{
295
+ type: Directive,
296
+ args: [{
297
+ selector: '[forHoverCard]',
298
+ exportAs: 'forHoverCard',
299
+ host: {
300
+ '[attr.data-state]': 'open() ? "open" : "closed"',
301
+ '[attr.data-disabled]': 'disabled() ? "" : null',
302
+ },
303
+ providers: [{ provide: FOR_HOVER_CARD_CONTEXT, useExisting: ForHoverCard }],
304
+ }]
305
+ }], ctorParameters: () => [], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], _sideInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }], _alignInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], _sideOffsetInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "sideOffset", required: false }] }], alignOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "alignOffset", required: false }] }], avoidCollisions: [{ type: i0.Input, args: [{ isSignal: true, alias: "avoidCollisions", required: false }] }], _collisionPaddingInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "collisionPadding", required: false }] }], arrowPadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "arrowPadding", required: false }] }], sticky: [{ type: i0.Input, args: [{ isSignal: true, alias: "sticky", required: false }] }], hideWhenDetached: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideWhenDetached", required: false }] }], clipUntilPositioned: [{ type: i0.Input, args: [{ isSignal: true, alias: "clipUntilPositioned", required: false }] }], openDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "openDelay", required: false }] }], closeDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeDelay", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], escapeKeyDown: [{ type: i0.Output, args: ["escapeKeyDown"] }] } });
306
+
307
+ /**
308
+ * Element that activates the hover-card on hover or focus. Apply on a link,
309
+ * a button, or any focusable element that already conveys the underlying
310
+ * action (the card adds preview, not meaning).
311
+ *
312
+ * Reflects `data-state` so consumers can style the trigger when its card is
313
+ * open (e.g. an underline that turns solid).
314
+ *
315
+ * **Intentional ARIA exception.** The trigger exposes no `aria-controls`,
316
+ * `aria-expanded`, or `aria-describedby`, and `[forHoverCardContent]` carries
317
+ * no role. This is deliberate: the trigger must already be
318
+ * self-meaningful (a link or button that conveys the underlying action on its
319
+ * own — the card adds preview, not meaning), and the card is non-essential
320
+ * supplementary content that is hover/focus-revealed and not part of the
321
+ * accessibility relationship. Popover / Tooltip, whose content is meant to be
322
+ * discovered via the trigger, do wire trigger ARIA — HoverCard intentionally
323
+ * does not.
324
+ *
325
+ * Escape dismissal is owned by the content's document-level dismissable
326
+ * layer (see `ForHoverCardContent`), so it works from the trigger and from
327
+ * unrelated focus alike — the trigger carries no Escape listener of its own.
328
+ *
329
+ * The root is normally resolved via DI from the enclosing `[forHoverCard]`.
330
+ * When the trigger is declared inside an `ng-template` stamped into the root
331
+ * (e.g. via `ngTemplateOutlet`), DI resolves at the template's declaration
332
+ * site and misses the root — pass it explicitly through the selector input,
333
+ * `routerLink`-style: `[forHoverCardTrigger]="root"` with `#root="forHoverCard"`.
334
+ */
335
+ class ForHoverCardTrigger {
336
+ #host = inject(ElementRef);
337
+ /**
338
+ * Optional explicit reference to the `[forHoverCard]` root, named after the
339
+ * selector `routerLink`-style. The bare valueless attribute keeps resolving
340
+ * the enclosing root via DI; pass the root explicitly
341
+ * (`[forHoverCardTrigger]="root"`, with `#root="forHoverCard"`) when the
342
+ * trigger is declared in an `ng-template` stamped inside the root — DI
343
+ * resolves at the template's declaration site, so the enclosing root is
344
+ * invisible there. The empty string (what the valueless attribute yields)
345
+ * is treated as unset.
346
+ */
347
+ forHoverCardTrigger = input('', /* @ts-ignore */
348
+ ...(ngDevMode ? [{ debugName: "forHoverCardTrigger" }] : /* istanbul ignore next */ []));
349
+ ctx = injectHoverCardTriggerContext(this.forHoverCardTrigger);
350
+ #hovered = false;
351
+ #focused = false;
352
+ constructor() {
353
+ const el = this.#host.nativeElement;
354
+ // Registration is an imperative call into the resolved root's registry,
355
+ // not state derivation — the effect only re-registers the element when the
356
+ // resolved root changes (explicit reference swapped at runtime).
357
+ effect((onCleanup) => {
358
+ const ctx = this.ctx();
359
+ ctx.registerTrigger(el);
360
+ onCleanup(() => ctx.unregisterTrigger(el));
361
+ });
362
+ }
363
+ onPointerEnter() {
364
+ this.#hovered = true;
365
+ this.ctx().scheduleOpen('hover-trigger');
366
+ }
367
+ onPointerLeave(event) {
368
+ this.#hovered = false;
369
+ const content = this.ctx().content();
370
+ if (content?.contains(event.relatedTarget)) {
371
+ return;
372
+ }
373
+ this.#scheduleCloseIfInactive('hover-trigger');
374
+ }
375
+ onFocus() {
376
+ this.#focused = true;
377
+ this.ctx().scheduleOpen('focus');
378
+ }
379
+ onBlur() {
380
+ this.#focused = false;
381
+ this.#scheduleCloseIfInactive('focus');
382
+ }
383
+ #scheduleCloseIfInactive(reason) {
384
+ if (this.#hovered || this.#focused) {
385
+ return;
386
+ }
387
+ this.ctx().scheduleClose(reason);
388
+ }
389
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ForHoverCardTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
390
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: ForHoverCardTrigger, isStandalone: true, selector: "[forHoverCardTrigger]", inputs: { forHoverCardTrigger: { classPropertyName: "forHoverCardTrigger", publicName: "forHoverCardTrigger", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "pointerenter": "onPointerEnter()", "pointerleave": "onPointerLeave($event)", "focus": "onFocus()", "blur": "onBlur()" }, properties: { "attr.data-state": "ctx().open() ? \"open\" : \"closed\"" } }, exportAs: ["forHoverCardTrigger"], ngImport: i0 });
391
+ }
392
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ForHoverCardTrigger, decorators: [{
393
+ type: Directive,
394
+ args: [{
395
+ selector: '[forHoverCardTrigger]',
396
+ exportAs: 'forHoverCardTrigger',
397
+ host: {
398
+ '[attr.data-state]': 'ctx().open() ? "open" : "closed"',
399
+ '(pointerenter)': 'onPointerEnter()',
400
+ '(pointerleave)': 'onPointerLeave($event)',
401
+ '(focus)': 'onFocus()',
402
+ '(blur)': 'onBlur()',
403
+ },
404
+ }]
405
+ }], ctorParameters: () => [], propDecorators: { forHoverCardTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "forHoverCardTrigger", required: false }] }] } });
406
+
407
+ /**
408
+ * The hover-card surface. Portaled to `document.body` and positioned by
409
+ * floating-ui (via the shared `injectOverlayShell` helper). Pointer-enter
410
+ * on the content cancels the pending close, so the user can move the
411
+ * cursor from the trigger into the card to interact with its content
412
+ * (links, buttons, copy targets).
413
+ *
414
+ * Mount / unmount via `@if (card.open())` on the consumer side so
415
+ * `animate.enter` / `animate.leave` work natively.
416
+ *
417
+ * Escape is routed through the shared document-level `DismissableLayer`
418
+ * (Escape-only — outside dismissal stays implicit via pointer-leave
419
+ * timing), so it dismisses the card no matter where focus lives when the
420
+ * card was hover-opened. Initial-focus and return-focus bundles are
421
+ * omitted because the surface is informational and never steals focus.
422
+ *
423
+ * **Intentional ARIA exception.** The content carries no role (only
424
+ * `data-state` for styling) and the trigger exposes no ARIA linkage — the
425
+ * card is non-essential supplementary content. See
426
+ * `ForHoverCardTrigger` for the full rationale.
427
+ */
428
+ class ForHoverCardContent {
429
+ ctx = injectHoverCardContext('ForHoverCardContent');
430
+ constructor() {
431
+ const el = inject(ElementRef).nativeElement;
432
+ this.ctx.registerContent(el);
433
+ inject(DestroyRef).onDestroy(() => this.ctx.unregisterContent(el));
434
+ injectOverlayShell({
435
+ positioner: toFloatingPositioner(this.ctx, this.ctx.trigger),
436
+ dismiss: {
437
+ emitEscapeKeyDown: (event) => this.ctx.emitEscapeKeyDown(event),
438
+ },
439
+ });
440
+ }
441
+ onPointerEnter() {
442
+ // Moving the cursor onto the card cancels any pending close so the
443
+ // user can interact with content inside.
444
+ this.ctx.cancelPending();
445
+ }
446
+ onPointerLeave() {
447
+ this.ctx.scheduleClose('hover-content');
448
+ }
449
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ForHoverCardContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
450
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.2", type: ForHoverCardContent, isStandalone: true, selector: "[forHoverCardContent]", host: { listeners: { "pointerenter": "onPointerEnter()", "pointerleave": "onPointerLeave()" }, properties: { "attr.data-state": "ctx.open() ? \"open\" : \"closed\"" } }, exportAs: ["forHoverCardContent"], ngImport: i0 });
451
+ }
452
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ForHoverCardContent, decorators: [{
453
+ type: Directive,
454
+ args: [{
455
+ selector: '[forHoverCardContent]',
456
+ exportAs: 'forHoverCardContent',
457
+ host: {
458
+ '[attr.data-state]': 'ctx.open() ? "open" : "closed"',
459
+ '(pointerenter)': 'onPointerEnter()',
460
+ '(pointerleave)': 'onPointerLeave()',
461
+ },
462
+ }]
463
+ }], ctorParameters: () => [] });
464
+
465
+ /**
466
+ * Arrow pointing from the card back to its trigger. Floating-ui places it
467
+ * along the right edge so the consumer only has to give it a size and a
468
+ * background — no positioning math required.
469
+ */
470
+ class ForHoverCardArrow {
471
+ #ctx = injectHoverCardContext('ForHoverCardArrow');
472
+ #host = inject(ElementRef);
473
+ constructor() {
474
+ registerHandle(this.#host.nativeElement, (el) => this.#ctx.registerArrow(el), (el) => this.#ctx.unregisterArrow(el));
475
+ }
476
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ForHoverCardArrow, deps: [], target: i0.ɵɵFactoryTarget.Directive });
477
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.2", type: ForHoverCardArrow, isStandalone: true, selector: "[forHoverCardArrow]", host: { attributes: { "aria-hidden": "true", "data-hover-card-arrow": "" } }, exportAs: ["forHoverCardArrow"], ngImport: i0 });
478
+ }
479
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ForHoverCardArrow, decorators: [{
480
+ type: Directive,
481
+ args: [{
482
+ selector: '[forHoverCardArrow]',
483
+ exportAs: 'forHoverCardArrow',
484
+ host: {
485
+ 'aria-hidden': 'true',
486
+ 'data-hover-card-arrow': '',
487
+ },
488
+ }]
489
+ }], ctorParameters: () => [] });
490
+
491
+ /**
492
+ * Generated bundle index. Do not edit.
493
+ */
494
+
495
+ export { FOR_HOVER_CARD_CONTEXT, FOR_HOVER_CARD_DEFAULTS, ForHoverCard, ForHoverCardArrow, ForHoverCardContent, ForHoverCardTrigger, provideForHoverCardDefaults };
496
+ //# sourceMappingURL=forty-cdk-hover-card.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forty-cdk-hover-card.mjs","sources":["../../../projects/forty-cdk/hover-card/src/hover-card-context.ts","../../../projects/forty-cdk/hover-card/src/hover-card-defaults.ts","../../../projects/forty-cdk/hover-card/src/hover-card.ts","../../../projects/forty-cdk/hover-card/src/hover-card-trigger.ts","../../../projects/forty-cdk/hover-card/src/hover-card-content.ts","../../../projects/forty-cdk/hover-card/src/hover-card-arrow.ts","../../../projects/forty-cdk/hover-card/src/forty-cdk-hover-card.ts"],"sourcesContent":["import { computed, inject, InjectionToken, type Signal } from '@angular/core';\n\nimport { type AnchoredPositioningContext } from 'forty-cdk/core';\n\n/** Why an open / close was scheduled. */\nexport type HoverCardScheduleReason = 'hover-trigger' | 'hover-content' | 'focus' | 'escape';\n\nexport interface ForHoverCardContext extends AnchoredPositioningContext {\n readonly open: Signal<boolean>;\n readonly disabled: Signal<boolean>;\n readonly trigger: Signal<HTMLElement | null>;\n readonly content: Signal<HTMLElement | null>;\n\n registerTrigger(el: HTMLElement): void;\n unregisterTrigger(el: HTMLElement): void;\n registerArrow(el: HTMLElement): void;\n unregisterArrow(el: HTMLElement): void;\n registerContent(el: HTMLElement): void;\n unregisterContent(el: HTMLElement): void;\n\n /** Schedule the card to open after `openDelay` ms (instant when delay is 0). */\n scheduleOpen(reason: HoverCardScheduleReason): void;\n /** Schedule the card to close after `closeDelay` ms (instant on `escape`). */\n scheduleClose(reason: HoverCardScheduleReason): void;\n /** Cancel any pending open / close timer without changing state. */\n cancelPending(): void;\n /**\n * Emit the public `(escapeKeyDown)` output and, unless prevented, close.\n * Driven by the content's document-level dismissable layer, so the card\n * responds to Escape regardless of where focus lives — including a card\n * opened by hover while focus sits on an unrelated element.\n */\n emitEscapeKeyDown(event: KeyboardEvent): void;\n}\n\nexport const FOR_HOVER_CARD_CONTEXT = new InjectionToken<ForHoverCardContext>(\n 'FOR_HOVER_CARD_CONTEXT',\n);\n\nexport function injectHoverCardContext(piece: string): ForHoverCardContext {\n const ctx = inject(FOR_HOVER_CARD_CONTEXT, { optional: true });\n if (!ctx) {\n throw new Error(\n `[forty-cdk/hover-card] ${piece} must be used inside a [forHoverCard] element. ` +\n \"If it is declared inside an ng-template, DI resolves at the template's declaration site — \" +\n 'not where it is stamped (e.g. via ngTemplateOutlet) — so declare the template inside the ' +\n '[forHoverCard] root.',\n );\n }\n return ctx;\n}\n\n/**\n * Resolves the trigger's root context: the explicit reference when the\n * `[forHoverCardTrigger]` input carries one, the injected\n * `FOR_HOVER_CARD_CONTEXT` otherwise. The orphan error only fires when neither\n * resolves, on first read of the returned signal. Must be called in an\n * injection context.\n */\nexport function injectHoverCardTriggerContext(\n explicitRoot: Signal<ForHoverCardContext | ''>,\n): Signal<ForHoverCardContext> {\n const injected = inject(FOR_HOVER_CARD_CONTEXT, { optional: true });\n return computed(() => {\n const explicit = explicitRoot();\n if (explicit !== '') {\n return explicit;\n }\n if (injected) {\n return injected;\n }\n throw new Error(\n '[forty-cdk/hover-card] ForHoverCardTrigger could not resolve its [forHoverCard] root: ' +\n 'no FOR_HOVER_CARD_CONTEXT provider is visible and no explicit root reference was passed. ' +\n \"If this trigger is declared inside an ng-template, DI resolves at the template's declaration \" +\n 'site — not where it is stamped — so either declare the template inside the root or pass the ' +\n 'root explicitly: [forHoverCardTrigger]=\"root\" with #root=\"forHoverCard\".',\n );\n });\n}\n","import { inject, Injectable, type Provider } from '@angular/core';\n\nimport {\n createDefaults,\n type FloatingAlign,\n type FloatingSide,\n SkipDelayCoordinator,\n} from 'forty-cdk/core';\n\n/**\n * Defaults inherited by descendant hover-cards in the surrounding injector\n * scope. Configure with `provideForHoverCardDefaults` at the app root or in\n * any component's `providers`.\n */\nexport interface ForHoverCardDefaults {\n /** Open delay (ms) for cards that don't override `openDelay` locally. */\n openDelay: number;\n /** Close delay (ms) for cards that don't override `closeDelay` locally. */\n closeDelay: number;\n /**\n * Window (ms) after a peer card in this scope closes during which the\n * next open is instant — useful for adjacent profile cards in a list,\n * so cursor movement doesn't feel sluggish.\n */\n skipDelayDuration: number;\n /**\n * Side the card is anchored to for cards that don't override `side`\n * locally. Library fallback `'top'`.\n */\n side: FloatingSide;\n /**\n * Alignment along the chosen `side` for cards that don't override `align`\n * locally. Library fallback `'center'`.\n */\n align: FloatingAlign;\n /**\n * Gap (px) between trigger and card along the main axis for cards that\n * don't override `sideOffset` locally.\n * Library fallback `8`.\n */\n sideOffset: number;\n /**\n * Padding (px) applied uniformly to the `flip`, `shift`, and `size`\n * middlewares for cards that don't override `collisionPadding` locally.\n * Library fallback `8`.\n */\n collisionPadding: number;\n}\n\n/**\n * Library fallback for hover-card defaults, read at the root injector when no\n * consumer has called `provideForHoverCardDefaults`. Exported for the shared\n * defaults contract spec; not re-exported from the primitive's public entry.\n */\nexport const FOR_HOVER_CARD_FALLBACK_DEFAULTS: ForHoverCardDefaults = {\n openDelay: 700,\n closeDelay: 300,\n skipDelayDuration: 300,\n side: 'top',\n align: 'center',\n sideOffset: 8,\n collisionPadding: 8,\n};\n\nconst { token, provideDefaults } = createDefaults<ForHoverCardDefaults>(\n 'FOR_HOVER_CARD_DEFAULTS',\n FOR_HOVER_CARD_FALLBACK_DEFAULTS,\n);\n\n/** Token holding the resolved hover-card defaults for the current scope. */\nexport const FOR_HOVER_CARD_DEFAULTS = token;\n\n/**\n * Per-injector-scope coordinator: thin subclass of the shared\n * `SkipDelayCoordinator` bound to this primitive's own DI token. Each\n * `provideForHoverCardDefaults` call re-provides it so the corresponding\n * subtree gets its own skip-delay window. Independent from\n * `TooltipCoordinator` — tooltips and hover-cards have different cadences and\n * separate scopes.\n */\n@Injectable({ providedIn: 'root' })\nexport class HoverCardCoordinator extends SkipDelayCoordinator {\n constructor() {\n super(inject(FOR_HOVER_CARD_DEFAULTS));\n }\n}\n\n/**\n * Configures forty-cdk hover-card defaults for this injector scope.\n * Partial overrides inherit unspecified keys from the parent scope (or\n * library defaults at the root). Each call establishes a new coordinator\n * scope.\n */\nexport function provideForHoverCardDefaults(\n defaults: Partial<ForHoverCardDefaults> = {},\n): Provider[] {\n return [...provideDefaults(defaults), HoverCardCoordinator];\n}\n","import {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n inject,\n input,\n model,\n numberAttribute,\n output,\n signal,\n} from '@angular/core';\n\nimport {\n ANCHORED_POSITIONING_DEFAULTS,\n type FloatingAlign,\n type FloatingSide,\n forceCloseWhenDisabled,\n createHoverIntent,\n type HoverIntentScheduler,\n emitVetoableNativeEvent,\n type VetoableNativeEvent,\n} from 'forty-cdk/core';\nimport {\n FOR_HOVER_CARD_CONTEXT,\n type ForHoverCardContext,\n type HoverCardScheduleReason,\n} from './hover-card-context';\nimport { FOR_HOVER_CARD_DEFAULTS, HoverCardCoordinator } from './hover-card-defaults';\n\n/**\n * Headless hover-preview card. Use it to surface rich, interactive previews\n * (profile snapshots, link previews, definition cards) on hover or focus\n * of an already-meaningful trigger (a link, a name).\n *\n * **Not a tooltip.** Hover-cards may contain interactive content\n * (clickable links, copy buttons, …); the trigger must convey full meaning\n * on its own so keyboard-only users miss nothing.\n *\n * Open / close delays default to 700 / 300 ms; the per-injector-scope\n * `provideForHoverCardDefaults` configures the cadence and the skip-delay\n * window for adjacent cards.\n *\n * @example\n * ```html\n * <span forHoverCard #card=\"forHoverCard\">\n * <a forHoverCardTrigger href=\"/users/ada\">Ada Lovelace</a>\n * @if (card.open()) {\n * <div forHoverCardContent animate.enter=\"fade-in\" animate.leave=\"fade-out\">\n * <img src=\"/api/avatar/ada\" alt=\"\" />\n * <h3>Ada Lovelace</h3>\n * <p>Mathematician.</p>\n * </div>\n * }\n * </span>\n * ```\n */\n@Directive({\n selector: '[forHoverCard]',\n exportAs: 'forHoverCard',\n host: {\n '[attr.data-state]': 'open() ? \"open\" : \"closed\"',\n '[attr.data-disabled]': 'disabled() ? \"\" : null',\n },\n providers: [{ provide: FOR_HOVER_CARD_CONTEXT, useExisting: ForHoverCard }],\n})\nexport class ForHoverCard implements ForHoverCardContext {\n readonly #defaults = inject(FOR_HOVER_CARD_DEFAULTS);\n\n /**\n * Two-way bindable. Whether the card is currently shown. The `model()`\n * change emitter (`(openChange)`) fires only on internal transitions\n * (delay-driven, escape, blur, and the force-close that runs when `disabled`\n * flips to true), never on consumer writes through `[(open)]`.\n */\n readonly open = model<boolean>(false);\n\n /**\n * Per-card override for the side the card is anchored to. Pair with\n * `align` for the full positioning API. When `undefined` (default), falls\n * back to `ForHoverCardDefaults.side` from the surrounding\n * `provideForHoverCardDefaults` scope (`'top'` unless configured).\n *\n * The input is aliased to `side`; consumers bind `[side]=\"...\"` and read\n * the effective value via the public `side` computed below.\n */\n readonly _sideInput = input<FloatingSide | undefined>(undefined, { alias: 'side' });\n\n /** Effective anchor side: the `side` input when set, else the scope default. */\n readonly side = computed<FloatingSide>(() => this._sideInput() ?? this.#defaults.side);\n\n /**\n * Per-card override for the alignment along the chosen `side`. When\n * `undefined` (default), falls back to `ForHoverCardDefaults.align` from the\n * surrounding `provideForHoverCardDefaults` scope (`'center'` unless\n * configured).\n *\n * The input is aliased to `align`; consumers bind `[align]=\"...\"` and read\n * the effective value via the public `align` computed below.\n */\n readonly _alignInput = input<FloatingAlign | undefined>(undefined, { alias: 'align' });\n\n /** Effective alignment: the `align` input when set, else the scope default. */\n readonly align = computed<FloatingAlign>(() => this._alignInput() ?? this.#defaults.align);\n\n /**\n * Per-card override for the gap (px) between trigger and card along the\n * main axis. When `undefined` (default),\n * falls back to `ForHoverCardDefaults.sideOffset` from the surrounding\n * `provideForHoverCardDefaults` scope (`8` unless configured).\n *\n * The input is aliased to `sideOffset`; consumers bind `[sideOffset]=\"...\"`\n * and read the effective value via the public `sideOffset` computed below.\n */\n readonly _sideOffsetInput = input(undefined, {\n alias: 'sideOffset',\n transform: (v: unknown): number | undefined => (v == null ? undefined : numberAttribute(v)),\n });\n\n /** Effective main-axis gap (px): the `sideOffset` input when set, else the scope default. */\n readonly sideOffset = computed<number>(\n () => this._sideOffsetInput() ?? this.#defaults.sideOffset,\n );\n\n /** Gap (px) along the cross axis. Default `0`. */\n readonly alignOffset = input(ANCHORED_POSITIONING_DEFAULTS.alignOffset, {\n transform: numberAttribute,\n });\n\n /** When `true` (default), `flip` and `shift` keep the card inside the viewport. */\n readonly avoidCollisions = input(ANCHORED_POSITIONING_DEFAULTS.avoidCollisions, {\n transform: booleanAttribute,\n });\n\n /**\n * Per-card override for the padding (px) applied uniformly to the `flip`,\n * `shift`, and `size` middlewares. When `undefined` (default), falls back\n * to `ForHoverCardDefaults.collisionPadding` from the surrounding\n * `provideForHoverCardDefaults` scope (`8` unless configured).\n *\n * The input is aliased to `collisionPadding`; consumers bind\n * `[collisionPadding]=\"...\"` and read the effective value via the public\n * `collisionPadding` computed below.\n */\n readonly _collisionPaddingInput = input(undefined, {\n alias: 'collisionPadding',\n transform: (v: unknown): number | undefined => (v == null ? undefined : numberAttribute(v)),\n });\n\n /** Effective collision padding (px): the `collisionPadding` input when set, else the scope default. */\n readonly collisionPadding = computed<number>(\n () => this._collisionPaddingInput() ?? this.#defaults.collisionPadding,\n );\n\n /** Padding (px) for the `arrow` middleware. Default `0`. */\n readonly arrowPadding = input(ANCHORED_POSITIONING_DEFAULTS.arrowPadding, {\n transform: numberAttribute,\n });\n\n /** Stickiness behaviour for `shift`. Default `'partial'`. */\n readonly sticky = input<'partial' | 'always' | false>(ANCHORED_POSITIONING_DEFAULTS.sticky);\n\n /** When `true`, sets `data-detached=\"\"` while the trigger is scrolled off-screen. */\n readonly hideWhenDetached = input(ANCHORED_POSITIONING_DEFAULTS.hideWhenDetached, {\n transform: booleanAttribute,\n });\n\n /**\n * When `true` (default), the content is clipped until floating-ui resolves\n * its first position, preventing a flash at the viewport corner. Set to\n * `false` so a dramatic `animate.enter` plays from its first frame (the\n * surface may flash briefly at the unresolved position while positioning\n * computes).\n */\n readonly clipUntilPositioned = input(ANCHORED_POSITIONING_DEFAULTS.clipUntilPositioned, {\n transform: booleanAttribute,\n });\n\n /** Per-card override for open delay (ms). Falls back to coordinator (700ms). */\n readonly openDelay = input<number | undefined>(undefined);\n\n /** Per-card override for close delay (ms). Falls back to coordinator (300ms). */\n readonly closeDelay = input<number | undefined>(undefined);\n\n /** When true, all hover / focus interaction is ignored and any open card is forced closed. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Fires when the user presses Escape while the card is open, regardless of\n * where focus currently lives — on the trigger, inside the portaled\n * content, or on an unrelated element (the common case for a card opened by\n * hover). Routed through the content's document-level dismissable layer.\n * Call `preventDefault()` on the emitted veto to suppress the automatic\n * close. The native `KeyboardEvent` is on `.event`.\n */\n readonly escapeKeyDown = output<VetoableNativeEvent<KeyboardEvent>>();\n\n readonly #triggerEl = signal<HTMLElement | null>(null);\n readonly trigger = this.#triggerEl.asReadonly();\n\n readonly #arrowEl = signal<HTMLElement | null>(null);\n readonly arrow = this.#arrowEl.asReadonly();\n\n readonly #contentEl = signal<HTMLElement | null>(null);\n readonly content = this.#contentEl.asReadonly();\n\n readonly #coordinator = inject(HoverCardCoordinator);\n readonly #hoverIntent: HoverIntentScheduler;\n\n constructor() {\n forceCloseWhenDisabled({\n open: this.open,\n disabled: this.disabled,\n onForceClose: () => this.cancelPending(),\n });\n\n this.#hoverIntent = createHoverIntent({\n open: this.open,\n isDisabled: () => this.disabled(),\n openDelay: () => this.openDelay() ?? this.#coordinator.openDelay,\n closeDelay: () => this.closeDelay() ?? this.#coordinator.closeDelay,\n coordinator: this.#coordinator,\n });\n\n inject(DestroyRef).onDestroy(() => this.cancelPending());\n }\n\n registerTrigger(el: HTMLElement): void {\n this.#triggerEl.set(el);\n }\n\n unregisterTrigger(el: HTMLElement): void {\n if (this.#triggerEl() === el) {\n this.#triggerEl.set(null);\n }\n }\n\n registerArrow(el: HTMLElement): void {\n this.#arrowEl.set(el);\n }\n\n unregisterArrow(el: HTMLElement): void {\n if (this.#arrowEl() === el) {\n this.#arrowEl.set(null);\n }\n }\n\n registerContent(el: HTMLElement): void {\n this.#contentEl.set(el);\n }\n\n unregisterContent(el: HTMLElement): void {\n if (this.#contentEl() === el) {\n this.#contentEl.set(null);\n }\n }\n\n scheduleOpen(_reason: HoverCardScheduleReason): void {\n this.#hoverIntent.scheduleOpen();\n }\n\n scheduleClose(reason: HoverCardScheduleReason): void {\n this.#hoverIntent.scheduleClose(reason === 'escape');\n }\n\n cancelPending(): void {\n this.#hoverIntent.cancelPending();\n }\n\n /**\n * Emit `(escapeKeyDown)` and, unless the consumer calls `preventDefault()`\n * on the veto, close immediately. Driven by the content's document-level\n * dismissable layer so Escape works no matter where focus currently lives\n * — including a hover-opened card with focus on an unrelated element.\n */\n emitEscapeKeyDown(event: KeyboardEvent): void {\n if (!this.open()) {\n return;\n }\n const vetoed = emitVetoableNativeEvent(this.escapeKeyDown, event);\n if (!vetoed) {\n event.preventDefault();\n event.stopPropagation();\n this.scheduleClose('escape');\n }\n }\n}\n","import { Directive, effect, ElementRef, inject, input } from '@angular/core';\n\nimport { type ForHoverCardContext, injectHoverCardTriggerContext } from './hover-card-context';\n\n/**\n * Element that activates the hover-card on hover or focus. Apply on a link,\n * a button, or any focusable element that already conveys the underlying\n * action (the card adds preview, not meaning).\n *\n * Reflects `data-state` so consumers can style the trigger when its card is\n * open (e.g. an underline that turns solid).\n *\n * **Intentional ARIA exception.** The trigger exposes no `aria-controls`,\n * `aria-expanded`, or `aria-describedby`, and `[forHoverCardContent]` carries\n * no role. This is deliberate: the trigger must already be\n * self-meaningful (a link or button that conveys the underlying action on its\n * own — the card adds preview, not meaning), and the card is non-essential\n * supplementary content that is hover/focus-revealed and not part of the\n * accessibility relationship. Popover / Tooltip, whose content is meant to be\n * discovered via the trigger, do wire trigger ARIA — HoverCard intentionally\n * does not.\n *\n * Escape dismissal is owned by the content's document-level dismissable\n * layer (see `ForHoverCardContent`), so it works from the trigger and from\n * unrelated focus alike — the trigger carries no Escape listener of its own.\n *\n * The root is normally resolved via DI from the enclosing `[forHoverCard]`.\n * When the trigger is declared inside an `ng-template` stamped into the root\n * (e.g. via `ngTemplateOutlet`), DI resolves at the template's declaration\n * site and misses the root — pass it explicitly through the selector input,\n * `routerLink`-style: `[forHoverCardTrigger]=\"root\"` with `#root=\"forHoverCard\"`.\n */\n@Directive({\n selector: '[forHoverCardTrigger]',\n exportAs: 'forHoverCardTrigger',\n host: {\n '[attr.data-state]': 'ctx().open() ? \"open\" : \"closed\"',\n '(pointerenter)': 'onPointerEnter()',\n '(pointerleave)': 'onPointerLeave($event)',\n '(focus)': 'onFocus()',\n '(blur)': 'onBlur()',\n },\n})\nexport class ForHoverCardTrigger {\n readonly #host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Optional explicit reference to the `[forHoverCard]` root, named after the\n * selector `routerLink`-style. The bare valueless attribute keeps resolving\n * the enclosing root via DI; pass the root explicitly\n * (`[forHoverCardTrigger]=\"root\"`, with `#root=\"forHoverCard\"`) when the\n * trigger is declared in an `ng-template` stamped inside the root — DI\n * resolves at the template's declaration site, so the enclosing root is\n * invisible there. The empty string (what the valueless attribute yields)\n * is treated as unset.\n */\n readonly forHoverCardTrigger = input<ForHoverCardContext | ''>('');\n\n protected readonly ctx = injectHoverCardTriggerContext(this.forHoverCardTrigger);\n\n #hovered = false;\n #focused = false;\n\n constructor() {\n const el = this.#host.nativeElement;\n // Registration is an imperative call into the resolved root's registry,\n // not state derivation — the effect only re-registers the element when the\n // resolved root changes (explicit reference swapped at runtime).\n effect((onCleanup) => {\n const ctx = this.ctx();\n ctx.registerTrigger(el);\n onCleanup(() => ctx.unregisterTrigger(el));\n });\n }\n\n protected onPointerEnter(): void {\n this.#hovered = true;\n this.ctx().scheduleOpen('hover-trigger');\n }\n\n protected onPointerLeave(event: PointerEvent): void {\n this.#hovered = false;\n const content = this.ctx().content();\n if (content?.contains(event.relatedTarget as Node | null)) {\n return;\n }\n this.#scheduleCloseIfInactive('hover-trigger');\n }\n\n protected onFocus(): void {\n this.#focused = true;\n this.ctx().scheduleOpen('focus');\n }\n\n protected onBlur(): void {\n this.#focused = false;\n this.#scheduleCloseIfInactive('focus');\n }\n\n #scheduleCloseIfInactive(reason: 'hover-trigger' | 'focus'): void {\n if (this.#hovered || this.#focused) {\n return;\n }\n this.ctx().scheduleClose(reason);\n }\n}\n","import { DestroyRef, Directive, ElementRef, inject } from '@angular/core';\n\nimport { toFloatingPositioner, injectOverlayShell } from 'forty-cdk/core';\nimport { injectHoverCardContext } from './hover-card-context';\n\n/**\n * The hover-card surface. Portaled to `document.body` and positioned by\n * floating-ui (via the shared `injectOverlayShell` helper). Pointer-enter\n * on the content cancels the pending close, so the user can move the\n * cursor from the trigger into the card to interact with its content\n * (links, buttons, copy targets).\n *\n * Mount / unmount via `@if (card.open())` on the consumer side so\n * `animate.enter` / `animate.leave` work natively.\n *\n * Escape is routed through the shared document-level `DismissableLayer`\n * (Escape-only — outside dismissal stays implicit via pointer-leave\n * timing), so it dismisses the card no matter where focus lives when the\n * card was hover-opened. Initial-focus and return-focus bundles are\n * omitted because the surface is informational and never steals focus.\n *\n * **Intentional ARIA exception.** The content carries no role (only\n * `data-state` for styling) and the trigger exposes no ARIA linkage — the\n * card is non-essential supplementary content. See\n * `ForHoverCardTrigger` for the full rationale.\n */\n@Directive({\n selector: '[forHoverCardContent]',\n exportAs: 'forHoverCardContent',\n host: {\n '[attr.data-state]': 'ctx.open() ? \"open\" : \"closed\"',\n '(pointerenter)': 'onPointerEnter()',\n '(pointerleave)': 'onPointerLeave()',\n },\n})\nexport class ForHoverCardContent {\n protected readonly ctx = injectHoverCardContext('ForHoverCardContent');\n\n constructor() {\n const el = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n this.ctx.registerContent(el);\n inject(DestroyRef).onDestroy(() => this.ctx.unregisterContent(el));\n\n injectOverlayShell({\n positioner: toFloatingPositioner(this.ctx, this.ctx.trigger),\n dismiss: {\n emitEscapeKeyDown: (event) => this.ctx.emitEscapeKeyDown(event),\n },\n });\n }\n\n protected onPointerEnter(): void {\n // Moving the cursor onto the card cancels any pending close so the\n // user can interact with content inside.\n this.ctx.cancelPending();\n }\n\n protected onPointerLeave(): void {\n this.ctx.scheduleClose('hover-content');\n }\n}\n","import { Directive, ElementRef, inject } from '@angular/core';\n\nimport { registerHandle } from 'forty-cdk/core';\nimport { injectHoverCardContext } from './hover-card-context';\n\n/**\n * Arrow pointing from the card back to its trigger. Floating-ui places it\n * along the right edge so the consumer only has to give it a size and a\n * background — no positioning math required.\n */\n@Directive({\n selector: '[forHoverCardArrow]',\n exportAs: 'forHoverCardArrow',\n host: {\n 'aria-hidden': 'true',\n 'data-hover-card-arrow': '',\n },\n})\nexport class ForHoverCardArrow {\n readonly #ctx = injectHoverCardContext('ForHoverCardArrow');\n readonly #host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n constructor() {\n registerHandle(\n this.#host.nativeElement,\n (el) => this.#ctx.registerArrow(el),\n (el) => this.#ctx.unregisterArrow(el),\n );\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}