@ojiepermana/angular 22.1.13 → 22.2.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 (252) hide show
  1. package/README.md +8 -6
  2. package/SUPPORT.md +3 -3
  3. package/chart/README.md +1 -1
  4. package/component/README.md +2 -2
  5. package/component/calendar/README.md +3 -15
  6. package/component/drawer/README.md +1 -2
  7. package/fesm2022/ojiepermana-angular-chart-area.mjs +352 -137
  8. package/fesm2022/ojiepermana-angular-chart-bar.mjs +744 -524
  9. package/fesm2022/ojiepermana-angular-chart-core.mjs +1140 -1344
  10. package/fesm2022/ojiepermana-angular-chart-line.mjs +393 -147
  11. package/fesm2022/ojiepermana-angular-chart-pie.mjs +408 -179
  12. package/fesm2022/ojiepermana-angular-chart-primitives.mjs +1262 -920
  13. package/fesm2022/ojiepermana-angular-chart-radar.mjs +473 -205
  14. package/fesm2022/ojiepermana-angular-chart-radial.mjs +425 -182
  15. package/fesm2022/ojiepermana-angular-chart-scatter.mjs +386 -210
  16. package/fesm2022/ojiepermana-angular-chart.mjs +3 -19
  17. package/fesm2022/ojiepermana-angular-component-accordion.mjs +485 -243
  18. package/fesm2022/ojiepermana-angular-component-alert-dialog.mjs +963 -325
  19. package/fesm2022/ojiepermana-angular-component-alert.mjs +266 -103
  20. package/fesm2022/ojiepermana-angular-component-aspect-ratio.mjs +80 -35
  21. package/fesm2022/ojiepermana-angular-component-avatar.mjs +402 -135
  22. package/fesm2022/ojiepermana-angular-component-badge.mjs +109 -59
  23. package/fesm2022/ojiepermana-angular-component-breadcrumb.mjs +410 -142
  24. package/fesm2022/ojiepermana-angular-component-button-group.mjs +249 -96
  25. package/fesm2022/ojiepermana-angular-component-button.mjs +153 -75
  26. package/fesm2022/ojiepermana-angular-component-calendar.mjs +531 -418
  27. package/fesm2022/ojiepermana-angular-component-card.mjs +457 -171
  28. package/fesm2022/ojiepermana-angular-component-carousel.mjs +642 -272
  29. package/fesm2022/ojiepermana-angular-component-checkbox.mjs +312 -108
  30. package/fesm2022/ojiepermana-angular-component-collapsible.mjs +299 -115
  31. package/fesm2022/ojiepermana-angular-component-combobox.mjs +396 -183
  32. package/fesm2022/ojiepermana-angular-component-command.mjs +807 -347
  33. package/fesm2022/ojiepermana-angular-component-composer.mjs +807 -330
  34. package/fesm2022/ojiepermana-angular-component-context-menu.mjs +196 -161
  35. package/fesm2022/ojiepermana-angular-component-date-picker.mjs +650 -338
  36. package/fesm2022/ojiepermana-angular-component-dialog.mjs +710 -316
  37. package/fesm2022/ojiepermana-angular-component-drawer.mjs +2 -5
  38. package/fesm2022/ojiepermana-angular-component-dropdown-menu.mjs +1212 -646
  39. package/fesm2022/ojiepermana-angular-component-editor.mjs +987 -502
  40. package/fesm2022/ojiepermana-angular-component-empty.mjs +350 -137
  41. package/fesm2022/ojiepermana-angular-component-form.mjs +813 -434
  42. package/fesm2022/ojiepermana-angular-component-hover-card.mjs +486 -277
  43. package/fesm2022/ojiepermana-angular-component-icon.mjs +241 -140
  44. package/fesm2022/ojiepermana-angular-component-input-group.mjs +449 -176
  45. package/fesm2022/ojiepermana-angular-component-input-otp.mjs +891 -488
  46. package/fesm2022/ojiepermana-angular-component-input.mjs +86 -55
  47. package/fesm2022/ojiepermana-angular-component-item.mjs +713 -261
  48. package/fesm2022/ojiepermana-angular-component-kanban.mjs +714 -216
  49. package/fesm2022/ojiepermana-angular-component-kbd.mjs +124 -52
  50. package/fesm2022/ojiepermana-angular-component-label.mjs +82 -31
  51. package/fesm2022/ojiepermana-angular-component-menubar.mjs +479 -329
  52. package/fesm2022/ojiepermana-angular-component-native-select.mjs +167 -65
  53. package/fesm2022/ojiepermana-angular-component-navigation-menu.mjs +683 -380
  54. package/fesm2022/ojiepermana-angular-component-pagination.mjs +277 -94
  55. package/fesm2022/ojiepermana-angular-component-pillbox.mjs +1283 -607
  56. package/fesm2022/ojiepermana-angular-component-popover.mjs +291 -204
  57. package/fesm2022/ojiepermana-angular-component-progress.mjs +176 -53
  58. package/fesm2022/ojiepermana-angular-component-radio.mjs +449 -142
  59. package/fesm2022/ojiepermana-angular-component-resizable.mjs +659 -453
  60. package/fesm2022/ojiepermana-angular-component-scroll-area.mjs +117 -39
  61. package/fesm2022/ojiepermana-angular-component-segmented-control.mjs +351 -172
  62. package/fesm2022/ojiepermana-angular-component-select.mjs +475 -345
  63. package/fesm2022/ojiepermana-angular-component-separator.mjs +102 -35
  64. package/fesm2022/ojiepermana-angular-component-sheet.mjs +797 -347
  65. package/fesm2022/ojiepermana-angular-component-skeleton.mjs +62 -29
  66. package/fesm2022/ojiepermana-angular-component-slider.mjs +592 -376
  67. package/fesm2022/ojiepermana-angular-component-spinner.mjs +135 -38
  68. package/fesm2022/ojiepermana-angular-component-switch.mjs +315 -103
  69. package/fesm2022/ojiepermana-angular-component-table.mjs +440 -153
  70. package/fesm2022/ojiepermana-angular-component-tabs.mjs +590 -317
  71. package/fesm2022/ojiepermana-angular-component-textarea.mjs +85 -50
  72. package/fesm2022/ojiepermana-angular-component-timeline.mjs +609 -231
  73. package/fesm2022/ojiepermana-angular-component-toast.mjs +229 -243
  74. package/fesm2022/ojiepermana-angular-component-toggle-group.mjs +573 -288
  75. package/fesm2022/ojiepermana-angular-component-toggle.mjs +187 -78
  76. package/fesm2022/ojiepermana-angular-component-tooltip.mjs +798 -517
  77. package/fesm2022/ojiepermana-angular-component-utils-core.mjs +159 -292
  78. package/fesm2022/ojiepermana-angular-component-utils-overlay.mjs +46 -58
  79. package/fesm2022/ojiepermana-angular-component-utils-scale.mjs +76 -38
  80. package/fesm2022/ojiepermana-angular-component-utils.mjs +2 -8
  81. package/fesm2022/ojiepermana-angular-component.mjs +0 -10
  82. package/fesm2022/ojiepermana-angular-navigation-core.mjs +13 -23
  83. package/fesm2022/ojiepermana-angular-navigation-icon.mjs +35 -24
  84. package/fesm2022/ojiepermana-angular-navigation-navigation-badge-count.component-BKCeWzml.mjs +129 -0
  85. package/fesm2022/ojiepermana-angular-navigation-navigation-dockbar-menu.component-DFEJK2jD.mjs +811 -0
  86. package/fesm2022/{ojiepermana-angular-navigation-navigation-entry-grid.component-Cd-jh6tg.mjs → ojiepermana-angular-navigation-navigation-entry-grid.component-mpK9Ar08.mjs} +387 -183
  87. package/fesm2022/ojiepermana-angular-navigation-navigation-flyout-menu.component-BPgH7FJk.mjs +650 -0
  88. package/fesm2022/ojiepermana-angular-navigation-navigation-horizontal.component-DMpYcD9t.mjs +662 -0
  89. package/fesm2022/ojiepermana-angular-navigation-navigation-item.component-Basp5SIk.mjs +1228 -0
  90. package/fesm2022/ojiepermana-angular-navigation-navigation-list.component-YUzHI9Pj.mjs +311 -0
  91. package/fesm2022/ojiepermana-angular-navigation-service.mjs +542 -724
  92. package/fesm2022/ojiepermana-angular-navigation-types.mjs +27 -56
  93. package/fesm2022/ojiepermana-angular-navigation.mjs +3052 -4
  94. package/fesm2022/ojiepermana-angular-sdk.mjs +91 -201
  95. package/fesm2022/ojiepermana-angular-theme-component-settings.mjs +1115 -737
  96. package/fesm2022/ojiepermana-angular-theme-layout-services.mjs +245 -328
  97. package/fesm2022/ojiepermana-angular-theme-layout-types.mjs +35 -38
  98. package/fesm2022/ojiepermana-angular-theme-layout-wrapper.mjs +1719 -552
  99. package/fesm2022/ojiepermana-angular-theme-layout.mjs +847 -491
  100. package/fesm2022/ojiepermana-angular-theme-page-core.mjs +288 -358
  101. package/fesm2022/ojiepermana-angular-theme-page-filter.mjs +362 -224
  102. package/fesm2022/ojiepermana-angular-theme-page-overview.mjs +88 -0
  103. package/fesm2022/ojiepermana-angular-theme-page-root.mjs +576 -254
  104. package/fesm2022/ojiepermana-angular-theme-page-side.mjs +317 -177
  105. package/fesm2022/ojiepermana-angular-theme-page-slots.mjs +256 -112
  106. package/fesm2022/ojiepermana-angular-theme-page.mjs +7 -12
  107. package/fesm2022/ojiepermana-angular-theme-shell-services.mjs +215 -326
  108. package/fesm2022/ojiepermana-angular-theme-shell-types.mjs +68 -129
  109. package/fesm2022/ojiepermana-angular-theme-shell.mjs +907 -378
  110. package/fesm2022/ojiepermana-angular-theme-styles.mjs +521 -720
  111. package/fesm2022/ojiepermana-angular-theme.mjs +0 -10
  112. package/fesm2022/ojiepermana-angular.mjs +5 -24
  113. package/navigation/README.md +1 -1
  114. package/package.json +16 -12
  115. package/sdk/README.md +1 -1
  116. package/sdk/src/writer/index.js +2 -2
  117. package/theme/README.md +1 -1
  118. package/theme/layout/README.md +2 -4
  119. package/theme/page/README.md +50 -0
  120. package/theme/styles/README.md +10 -10
  121. package/theme/styles/css/base/prefers-dark.css +1 -1
  122. package/theme/styles/css/base/status.css +1 -1
  123. package/theme/styles/css/color/amber.css +1 -1
  124. package/theme/styles/css/color/blue.css +1 -1
  125. package/theme/styles/css/color/cyan.css +1 -1
  126. package/theme/styles/css/color/emerald.css +1 -1
  127. package/theme/styles/css/color/fuchsia.css +1 -1
  128. package/theme/styles/css/color/green.css +1 -1
  129. package/theme/styles/css/color/indigo.css +1 -1
  130. package/theme/styles/css/color/lime.css +1 -1
  131. package/theme/styles/css/color/orange.css +1 -1
  132. package/theme/styles/css/color/pink.css +1 -1
  133. package/theme/styles/css/color/purple.css +1 -1
  134. package/theme/styles/css/color/red.css +1 -1
  135. package/theme/styles/css/color/rose.css +1 -1
  136. package/theme/styles/css/color/sky.css +1 -1
  137. package/theme/styles/css/color/teal.css +1 -1
  138. package/theme/styles/css/color/violet.css +1 -1
  139. package/theme/styles/css/color/yellow.css +1 -1
  140. package/theme/styles/css/neutral/gray.css +1 -1
  141. package/theme/styles/css/neutral/mauve.css +1 -1
  142. package/theme/styles/css/neutral/mist.css +1 -1
  143. package/theme/styles/css/neutral/neutral.css +1 -1
  144. package/theme/styles/css/neutral/olive.css +1 -1
  145. package/theme/styles/css/neutral/slate.css +1 -1
  146. package/theme/styles/css/neutral/stone.css +1 -1
  147. package/theme/styles/css/neutral/taupe.css +1 -1
  148. package/theme/styles/css/neutral/zinc.css +1 -1
  149. package/types/ojiepermana-angular-chart-area.d.ts +126 -63
  150. package/types/ojiepermana-angular-chart-bar.d.ts +244 -154
  151. package/types/ojiepermana-angular-chart-core.d.ts +409 -398
  152. package/types/ojiepermana-angular-chart-line.d.ts +141 -68
  153. package/types/ojiepermana-angular-chart-pie.d.ts +192 -121
  154. package/types/ojiepermana-angular-chart-primitives.d.ts +283 -214
  155. package/types/ojiepermana-angular-chart-radar.d.ts +189 -108
  156. package/types/ojiepermana-angular-chart-radial.d.ts +177 -106
  157. package/types/ojiepermana-angular-chart-scatter.d.ts +166 -110
  158. package/types/ojiepermana-angular-chart.d.ts +3 -2
  159. package/types/ojiepermana-angular-component-accordion.d.ts +135 -81
  160. package/types/ojiepermana-angular-component-alert-dialog.d.ts +271 -123
  161. package/types/ojiepermana-angular-component-alert.d.ts +69 -39
  162. package/types/ojiepermana-angular-component-aspect-ratio.d.ts +20 -12
  163. package/types/ojiepermana-angular-component-avatar.d.ts +103 -49
  164. package/types/ojiepermana-angular-component-badge.d.ts +36 -24
  165. package/types/ojiepermana-angular-component-breadcrumb.d.ts +79 -40
  166. package/types/ojiepermana-angular-component-button-group.d.ts +48 -24
  167. package/types/ojiepermana-angular-component-button.d.ts +44 -27
  168. package/types/ojiepermana-angular-component-calendar.d.ts +145 -107
  169. package/types/ojiepermana-angular-component-card.d.ts +112 -63
  170. package/types/ojiepermana-angular-component-carousel.d.ts +150 -81
  171. package/types/ojiepermana-angular-component-checkbox.d.ts +96 -38
  172. package/types/ojiepermana-angular-component-collapsible.d.ts +65 -39
  173. package/types/ojiepermana-angular-component-combobox.d.ts +100 -55
  174. package/types/ojiepermana-angular-component-command.d.ts +206 -121
  175. package/types/ojiepermana-angular-component-composer.d.ts +184 -84
  176. package/types/ojiepermana-angular-component-context-menu.d.ts +51 -41
  177. package/types/ojiepermana-angular-component-date-picker.d.ts +199 -109
  178. package/types/ojiepermana-angular-component-dialog.d.ts +200 -105
  179. package/types/ojiepermana-angular-component-drawer.d.ts +2 -1
  180. package/types/ojiepermana-angular-component-dropdown-menu.d.ts +324 -202
  181. package/types/ojiepermana-angular-component-editor.d.ts +215 -117
  182. package/types/ojiepermana-angular-component-empty.d.ts +80 -45
  183. package/types/ojiepermana-angular-component-form.d.ts +185 -121
  184. package/types/ojiepermana-angular-component-hover-card.d.ts +130 -72
  185. package/types/ojiepermana-angular-component-icon.d.ts +87 -57
  186. package/types/ojiepermana-angular-component-input-group.d.ts +93 -46
  187. package/types/ojiepermana-angular-component-input-otp.d.ts +243 -150
  188. package/types/ojiepermana-angular-component-input.d.ts +27 -17
  189. package/types/ojiepermana-angular-component-item.d.ts +160 -84
  190. package/types/ojiepermana-angular-component-kanban.d.ts +157 -62
  191. package/types/ojiepermana-angular-component-kbd.d.ts +24 -15
  192. package/types/ojiepermana-angular-component-label.d.ts +19 -11
  193. package/types/ojiepermana-angular-component-menubar.d.ts +120 -90
  194. package/types/ojiepermana-angular-component-native-select.d.ts +37 -24
  195. package/types/ojiepermana-angular-component-navigation-menu.d.ts +157 -98
  196. package/types/ojiepermana-angular-component-pagination.d.ts +78 -28
  197. package/types/ojiepermana-angular-component-pillbox.d.ts +361 -204
  198. package/types/ojiepermana-angular-component-popover.d.ts +94 -64
  199. package/types/ojiepermana-angular-component-progress.d.ts +45 -17
  200. package/types/ojiepermana-angular-component-radio.d.ts +129 -53
  201. package/types/ojiepermana-angular-component-resizable.d.ts +160 -112
  202. package/types/ojiepermana-angular-component-scroll-area.d.ts +33 -15
  203. package/types/ojiepermana-angular-component-segmented-control.d.ts +94 -50
  204. package/types/ojiepermana-angular-component-select.d.ts +94 -77
  205. package/types/ojiepermana-angular-component-separator.d.ts +26 -14
  206. package/types/ojiepermana-angular-component-sheet.d.ts +226 -116
  207. package/types/ojiepermana-angular-component-skeleton.d.ts +13 -10
  208. package/types/ojiepermana-angular-component-slider.d.ts +140 -75
  209. package/types/ojiepermana-angular-component-spinner.d.ts +31 -13
  210. package/types/ojiepermana-angular-component-switch.d.ts +97 -40
  211. package/types/ojiepermana-angular-component-table.d.ts +102 -50
  212. package/types/ojiepermana-angular-component-tabs.d.ts +174 -115
  213. package/types/ojiepermana-angular-component-textarea.d.ts +27 -17
  214. package/types/ojiepermana-angular-component-timeline.d.ts +141 -59
  215. package/types/ojiepermana-angular-component-toast.d.ts +51 -55
  216. package/types/ojiepermana-angular-component-toggle-group.d.ts +159 -88
  217. package/types/ojiepermana-angular-component-toggle.d.ts +47 -25
  218. package/types/ojiepermana-angular-component-tooltip.d.ts +222 -132
  219. package/types/ojiepermana-angular-component-utils-core.d.ts +81 -90
  220. package/types/ojiepermana-angular-component-utils-overlay.d.ts +7 -11
  221. package/types/ojiepermana-angular-component-utils-scale.d.ts +20 -12
  222. package/types/ojiepermana-angular-component-utils.d.ts +2 -2
  223. package/types/ojiepermana-angular-component.d.ts +1 -2
  224. package/types/ojiepermana-angular-navigation-core.d.ts +46 -50
  225. package/types/ojiepermana-angular-navigation-icon.d.ts +9 -12
  226. package/types/ojiepermana-angular-navigation-service.d.ts +112 -115
  227. package/types/ojiepermana-angular-navigation-types.d.ts +121 -125
  228. package/types/ojiepermana-angular-navigation.d.ts +663 -374
  229. package/types/ojiepermana-angular-sdk.d.ts +69 -71
  230. package/types/ojiepermana-angular-theme-component-settings.d.ts +115 -83
  231. package/types/ojiepermana-angular-theme-layout-services.d.ts +119 -124
  232. package/types/ojiepermana-angular-theme-layout-types.d.ts +27 -31
  233. package/types/ojiepermana-angular-theme-layout-wrapper.d.ts +399 -187
  234. package/types/ojiepermana-angular-theme-layout.d.ts +201 -112
  235. package/types/ojiepermana-angular-theme-page-core.d.ts +136 -142
  236. package/types/ojiepermana-angular-theme-page-filter.d.ts +112 -62
  237. package/types/ojiepermana-angular-theme-page-overview.d.ts +28 -0
  238. package/types/ojiepermana-angular-theme-page-root.d.ts +172 -88
  239. package/types/ojiepermana-angular-theme-page-side.d.ts +89 -49
  240. package/types/ojiepermana-angular-theme-page-slots.d.ts +58 -37
  241. package/types/ojiepermana-angular-theme-page.d.ts +7 -5
  242. package/types/ojiepermana-angular-theme-shell-services.d.ts +119 -125
  243. package/types/ojiepermana-angular-theme-shell-types.d.ts +38 -41
  244. package/types/ojiepermana-angular-theme-shell.d.ts +139 -61
  245. package/types/ojiepermana-angular-theme-styles.d.ts +184 -196
  246. package/types/ojiepermana-angular-theme.d.ts +1 -2
  247. package/types/ojiepermana-angular.d.ts +5 -5
  248. package/fesm2022/ojiepermana-angular-navigation-navigation-badge-count.component-CDBxQ8rk.mjs +0 -91
  249. package/fesm2022/ojiepermana-angular-navigation-navigation-dockbar-menu.component-DBQHdvGa.mjs +0 -512
  250. package/fesm2022/ojiepermana-angular-navigation-navigation-flyout-menu.component-BCGvhoYj.mjs +0 -404
  251. package/fesm2022/ojiepermana-angular-navigation-navigation-horizontal.component-Dk_03e-6.mjs +0 -466
  252. package/fesm2022/ojiepermana-angular-navigation-ojiepermana-angular-navigation-DNKU6viC.mjs +0 -2642
@@ -1,523 +1,804 @@
1
- import * as i0 from '@angular/core';
2
- import { InjectionToken, input, forwardRef, Component, inject, TemplateRef, Directive, ViewContainerRef, ElementRef, DestroyRef, output, signal, computed, effect } from '@angular/core';
3
- import * as i1 from '@ojiepermana/angular/component/utils/scale';
4
- import { ComponentScaleDirective } from '@ojiepermana/angular/component/utils/scale';
5
- import { Overlay } from '@angular/cdk/overlay';
6
- import { TemplatePortal, ComponentPortal } from '@angular/cdk/portal';
7
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
8
- import { UI_ID_GENERATOR } from '@ojiepermana/angular/component/utils/core';
9
- import { connectedPositionFor, oppositeSide, overlayDismissals } from '@ojiepermana/angular/component/utils/overlay';
10
-
11
- const TOOLTIP_DEFAULTS = new InjectionToken('TOOLTIP_DEFAULTS');
12
- class TooltipComponent {
13
- side = input('top', /* @ts-ignore */
14
- ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
15
- align = input('center', /* @ts-ignore */
16
- ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
17
- sideOffset = input(4, /* @ts-ignore */
18
- ...(ngDevMode ? [{ debugName: "sideOffset" }] : /* istanbul ignore next */ []));
19
- openDelay = input(150, /* @ts-ignore */
20
- ...(ngDevMode ? [{ debugName: "openDelay" }] : /* istanbul ignore next */ []));
21
- /**
22
- * Delay before the tooltip hides after the pointer leaves.
23
- *
24
- * It matches `openDelay` rather than being zero so the pointer has time to
25
- * cross the `sideOffset` gap and land on the panel. That is what makes the
26
- * panel reachable, which WCAG 1.4.13 (hoverable) asks for. Set it to `0` for
27
- * an instant hide, accepting that the panel then cannot be hovered.
28
- */
29
- closeDelay = input(150, /* @ts-ignore */
30
- ...(ngDevMode ? [{ debugName: "closeDelay" }] : /* istanbul ignore next */ []));
31
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: TooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
32
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.4", type: TooltipComponent, isStandalone: true, selector: "Tooltip", inputs: { side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, sideOffset: { classPropertyName: "sideOffset", publicName: "sideOffset", 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 } }, host: { classAttribute: "contents" }, providers: [{ provide: TOOLTIP_DEFAULTS, useExisting: forwardRef(() => TooltipComponent) }], ngImport: i0, template: '<ng-content />', isInline: true });
33
- }
34
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: TooltipComponent, decorators: [{
35
- type: Component,
36
- args: [{
37
- selector: 'Tooltip',
38
- providers: [{ provide: TOOLTIP_DEFAULTS, useExisting: forwardRef(() => TooltipComponent) }],
39
- host: {
40
- class: 'contents',
41
- },
42
- template: '<ng-content />',
43
- }]
44
- }], propDecorators: { side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], sideOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "sideOffset", required: false }] }], openDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "openDelay", required: false }] }], closeDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeDelay", required: false }] }] } });
45
-
46
- class TooltipContentDirective {
47
- componentScale = inject(ComponentScaleDirective);
48
- radius = this.componentScale.radius;
49
- density = this.componentScale.density;
50
- template = inject(TemplateRef);
51
- /**
52
- * Resolved `--radius-base` / `--spacing-base` knob values (or `null` to
53
- * inherit the global axis). Public so {@link TooltipTriggerDirective} can mirror
54
- * them onto the CDK overlay panel — the element that actually paints the rounded
55
- * background + padding — since this directive sits on an `<ng-template>` whose
56
- * host bindings never reach the imperatively-created overlay subtree.
57
- */
58
- radiusBase = this.componentScale.radiusBase;
59
- densityBase = this.componentScale.densityBase;
60
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: TooltipContentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
61
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.4", type: TooltipContentDirective, isStandalone: true, selector: "ng-template[TooltipContent]", exportAs: ["TooltipContent"], hostDirectives: [{ directive: i1.ComponentScaleDirective, inputs: ["radius", "radius", "density", "density"] }], ngImport: i0 });
62
- }
63
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: TooltipContentDirective, decorators: [{
64
- type: Directive,
65
- args: [{
66
- selector: 'ng-template[TooltipContent]',
67
- hostDirectives: [
68
- {
69
- directive: ComponentScaleDirective,
70
- inputs: ['radius', 'density'],
71
- },
72
- ],
73
- exportAs: 'TooltipContent',
74
- host: {},
75
- }]
76
- }] });
77
-
78
- // No `pointer-events-none`: the panel has to be reachable by the pointer for
79
- // WCAG 1.4.13 (hoverable). Hovering it holds the tooltip open, see
80
- // `isPointerInsidePanel` below.
1
+ import * as i0 from "@angular/core";
2
+ import { Component, DestroyRef, Directive, ElementRef, InjectionToken, TemplateRef, ViewContainerRef, computed, effect, forwardRef, inject, input, output, signal } from "@angular/core";
3
+ import * as i1 from "@ojiepermana/angular/component/utils/scale";
4
+ import { ComponentScaleDirective } from "@ojiepermana/angular/component/utils/scale";
5
+ import { Overlay } from "@angular/cdk/overlay";
6
+ import { ComponentPortal, TemplatePortal } from "@angular/cdk/portal";
7
+ import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
8
+ import { UI_ID_GENERATOR } from "@ojiepermana/angular/component/utils/core";
9
+ import { connectedPositionFor, oppositeSide, overlayDismissals } from "@ojiepermana/angular/component/utils/overlay";
10
+ const TOOLTIP_DEFAULTS = new InjectionToken("TOOLTIP_DEFAULTS");
11
+ var TooltipComponent = class TooltipComponent {
12
+ side = input("top", ...ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []);
13
+ align = input("center", ...ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []);
14
+ sideOffset = input(4, ...ngDevMode ? [{ debugName: "sideOffset" }] : /* istanbul ignore next */ []);
15
+ openDelay = input(150, ...ngDevMode ? [{ debugName: "openDelay" }] : /* istanbul ignore next */ []);
16
+ closeDelay = input(150, ...ngDevMode ? [{ debugName: "closeDelay" }] : /* istanbul ignore next */ []);
17
+ static ɵfac = i0.ɵɵngDeclareFactory({
18
+ minVersion: "12.0.0",
19
+ version: "22.2.0",
20
+ ngImport: i0,
21
+ type: TooltipComponent,
22
+ deps: [],
23
+ target: i0.ɵɵFactoryTarget.Component
24
+ });
25
+ static ɵcmp = i0.ɵɵngDeclareComponent({
26
+ minVersion: "17.1.0",
27
+ version: "22.2.0",
28
+ type: TooltipComponent,
29
+ isStandalone: true,
30
+ selector: "Tooltip",
31
+ inputs: {
32
+ side: {
33
+ classPropertyName: "side",
34
+ publicName: "side",
35
+ isSignal: true,
36
+ isRequired: false,
37
+ transformFunction: null
38
+ },
39
+ align: {
40
+ classPropertyName: "align",
41
+ publicName: "align",
42
+ isSignal: true,
43
+ isRequired: false,
44
+ transformFunction: null
45
+ },
46
+ sideOffset: {
47
+ classPropertyName: "sideOffset",
48
+ publicName: "sideOffset",
49
+ isSignal: true,
50
+ isRequired: false,
51
+ transformFunction: null
52
+ },
53
+ openDelay: {
54
+ classPropertyName: "openDelay",
55
+ publicName: "openDelay",
56
+ isSignal: true,
57
+ isRequired: false,
58
+ transformFunction: null
59
+ },
60
+ closeDelay: {
61
+ classPropertyName: "closeDelay",
62
+ publicName: "closeDelay",
63
+ isSignal: true,
64
+ isRequired: false,
65
+ transformFunction: null
66
+ }
67
+ },
68
+ host: { classAttribute: "contents" },
69
+ providers: [{
70
+ provide: TOOLTIP_DEFAULTS,
71
+ useExisting: forwardRef(() => TooltipComponent)
72
+ }],
73
+ ngImport: i0,
74
+ template: "<ng-content />",
75
+ isInline: true
76
+ });
77
+ };
78
+ i0.ɵɵngDeclareClassMetadata({
79
+ minVersion: "12.0.0",
80
+ version: "22.2.0",
81
+ ngImport: i0,
82
+ type: TooltipComponent,
83
+ decorators: [{
84
+ type: Component,
85
+ args: [{
86
+ selector: "Tooltip",
87
+ providers: [{
88
+ provide: TOOLTIP_DEFAULTS,
89
+ useExisting: forwardRef(() => TooltipComponent)
90
+ }],
91
+ host: { class: "contents" },
92
+ template: "<ng-content />"
93
+ }]
94
+ }],
95
+ propDecorators: {
96
+ side: [{
97
+ type: i0.Input,
98
+ args: [{
99
+ isSignal: true,
100
+ alias: "side",
101
+ required: false
102
+ }]
103
+ }],
104
+ align: [{
105
+ type: i0.Input,
106
+ args: [{
107
+ isSignal: true,
108
+ alias: "align",
109
+ required: false
110
+ }]
111
+ }],
112
+ sideOffset: [{
113
+ type: i0.Input,
114
+ args: [{
115
+ isSignal: true,
116
+ alias: "sideOffset",
117
+ required: false
118
+ }]
119
+ }],
120
+ openDelay: [{
121
+ type: i0.Input,
122
+ args: [{
123
+ isSignal: true,
124
+ alias: "openDelay",
125
+ required: false
126
+ }]
127
+ }],
128
+ closeDelay: [{
129
+ type: i0.Input,
130
+ args: [{
131
+ isSignal: true,
132
+ alias: "closeDelay",
133
+ required: false
134
+ }]
135
+ }]
136
+ }
137
+ });
138
+ var TooltipContentDirective = class TooltipContentDirective {
139
+ componentScale = inject(ComponentScaleDirective);
140
+ radius = this.componentScale.radius;
141
+ density = this.componentScale.density;
142
+ template = inject(TemplateRef);
143
+ radiusBase = this.componentScale.radiusBase;
144
+ densityBase = this.componentScale.densityBase;
145
+ static ɵfac = i0.ɵɵngDeclareFactory({
146
+ minVersion: "12.0.0",
147
+ version: "22.2.0",
148
+ ngImport: i0,
149
+ type: TooltipContentDirective,
150
+ deps: [],
151
+ target: i0.ɵɵFactoryTarget.Directive
152
+ });
153
+ static ɵdir = i0.ɵɵngDeclareDirective({
154
+ minVersion: "14.0.0",
155
+ version: "22.2.0",
156
+ type: TooltipContentDirective,
157
+ isStandalone: true,
158
+ selector: "ng-template[TooltipContent]",
159
+ exportAs: ["TooltipContent"],
160
+ hostDirectives: [{
161
+ directive: i1.ComponentScaleDirective,
162
+ inputs: [
163
+ "radius",
164
+ "radius",
165
+ "density",
166
+ "density"
167
+ ]
168
+ }],
169
+ ngImport: i0
170
+ });
171
+ };
172
+ i0.ɵɵngDeclareClassMetadata({
173
+ minVersion: "12.0.0",
174
+ version: "22.2.0",
175
+ ngImport: i0,
176
+ type: TooltipContentDirective,
177
+ decorators: [{
178
+ type: Directive,
179
+ args: [{
180
+ selector: "ng-template[TooltipContent]",
181
+ hostDirectives: [{
182
+ directive: ComponentScaleDirective,
183
+ inputs: ["radius", "density"]
184
+ }],
185
+ exportAs: "TooltipContent",
186
+ host: {}
187
+ }]
188
+ }]
189
+ });
81
190
  const TOOLTIP_PANEL_CLASSES = [
82
- 'tooltip-panel',
83
- 'z-50',
84
- 'max-w-xs',
85
- 'overflow-hidden',
86
- 'rounded-md',
87
- 'border',
88
- 'border-border',
89
- 'bg-primary',
90
- 'px-3',
91
- 'py-1.5',
92
- 'text-xs',
93
- 'font-medium',
94
- 'leading-none',
95
- 'text-primary-foreground',
96
- 'shadow-md',
97
- 'select-none',
191
+ "tooltip-panel",
192
+ "z-50",
193
+ "max-w-xs",
194
+ "overflow-hidden",
195
+ "rounded-md",
196
+ "border",
197
+ "border-border",
198
+ "bg-primary",
199
+ "px-3",
200
+ "py-1.5",
201
+ "text-xs",
202
+ "font-medium",
203
+ "leading-none",
204
+ "text-primary-foreground",
205
+ "shadow-md",
206
+ "select-none"
98
207
  ];
99
- class TooltipTriggerDirective {
100
- overlay = inject(Overlay);
101
- vcr = inject(ViewContainerRef);
102
- el = inject(ElementRef);
103
- destroyRef = inject(DestroyRef);
104
- defaults = inject(TOOLTIP_DEFAULTS, { optional: true });
105
- idGenerator = inject(UI_ID_GENERATOR);
106
- TooltipTrigger = input.required(/* @ts-ignore */
107
- ...(ngDevMode ? [{ debugName: "TooltipTrigger" }] : /* istanbul ignore next */ []));
108
- side = input(undefined, /* @ts-ignore */
109
- ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
110
- align = input(undefined, /* @ts-ignore */
111
- ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
112
- sideOffset = input(undefined, /* @ts-ignore */
113
- ...(ngDevMode ? [{ debugName: "sideOffset" }] : /* istanbul ignore next */ []));
114
- openDelay = input(undefined, /* @ts-ignore */
115
- ...(ngDevMode ? [{ debugName: "openDelay" }] : /* istanbul ignore next */ []));
116
- closeDelay = input(undefined, /* @ts-ignore */
117
- ...(ngDevMode ? [{ debugName: "closeDelay" }] : /* istanbul ignore next */ []));
118
- disabled = input(false, /* @ts-ignore */
119
- ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
120
- openedChange = output();
121
- isOpen = signal(false, /* @ts-ignore */
122
- ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
123
- contentId = signal(null, /* @ts-ignore */
124
- ...(ngDevMode ? [{ debugName: "contentId" }] : /* istanbul ignore next */ []));
125
- overlayRef = null;
126
- openTimeoutId = null;
127
- closeTimeoutId = null;
128
- isPointerInsideTrigger = false;
129
- isPointerInsidePanel = false;
130
- isTriggerFocused = false;
131
- isDestroying = false;
132
- /**
133
- * Holds the tooltip open while the pointer rests on the panel, so a user can
134
- * move onto it to read or copy the content (WCAG 1.4.13, hoverable).
135
- */
136
- onPanelPointerEnter = () => {
137
- this.isPointerInsidePanel = true;
138
- this.clearCloseTimeout();
139
- };
140
- onPanelPointerLeave = (event) => {
141
- if (this.overlayRef?.overlayElement.contains(event.relatedTarget)) {
142
- return;
143
- }
144
- this.isPointerInsidePanel = false;
145
- this.scheduleClose();
146
- };
147
- constructor() {
148
- this.destroyRef.onDestroy(() => {
149
- this.isDestroying = true;
150
- this.clearOpenTimeout();
151
- this.clearCloseTimeout();
152
- this.contentId.set(null);
153
- this.isOpen.set(false);
154
- this.releasePanel();
155
- this.overlayRef?.dispose();
156
- this.overlayRef = null;
157
- });
158
- }
159
- handlePointerEnter() {
160
- if (this.disabled()) {
161
- return;
162
- }
163
- this.isPointerInsideTrigger = true;
164
- this.clearCloseTimeout();
165
- this.scheduleOpen();
166
- }
167
- handlePointerLeave(event) {
168
- if (this.el.nativeElement.contains(event.relatedTarget)) {
169
- return;
170
- }
171
- this.isPointerInsideTrigger = false;
172
- this.scheduleClose();
173
- }
174
- handleFocusIn() {
175
- if (this.disabled()) {
176
- return;
177
- }
178
- this.isTriggerFocused = true;
179
- this.clearCloseTimeout();
180
- this.scheduleOpen();
181
- }
182
- handleFocusOut(event) {
183
- if (this.el.nativeElement.contains(event.relatedTarget)) {
184
- return;
185
- }
186
- this.isTriggerFocused = false;
187
- this.scheduleClose();
188
- }
189
- open() {
190
- if (this.isOpen() || this.disabled()) {
191
- return;
192
- }
193
- const side = this.side() ?? this.defaults?.side() ?? 'top';
194
- const align = this.align() ?? this.defaults?.align() ?? 'center';
195
- const sideOffset = this.sideOffset() ?? this.defaults?.sideOffset() ?? 4;
196
- const primary = connectedPositionFor(side, align, sideOffset);
197
- const fallback = connectedPositionFor(oppositeSide(side), align, sideOffset);
198
- const positionStrategy = this.overlay
199
- .position()
200
- .flexibleConnectedTo(this.el)
201
- .withPositions([primary, fallback])
202
- .withPush(true)
203
- .withViewportMargin(8)
204
- .withFlexibleDimensions(false);
205
- this.overlayRef = this.overlay.create({
206
- positionStrategy,
207
- scrollStrategy: this.overlay.scrollStrategies.reposition(),
208
- hasBackdrop: false,
209
- panelClass: [...TOOLTIP_PANEL_CLASSES],
210
- });
211
- const tooltipId = this.idGenerator.next('Tooltip');
212
- this.overlayRef.overlayElement.id = tooltipId;
213
- this.overlayRef.overlayElement.setAttribute('role', 'tooltip');
214
- // The painted surface is this overlay panel (rounded-md / px-3 / py-1.5), not
215
- // the content directive's <ng-template>. Mirror the content directive's
216
- // radius/density override onto it so the per-component knob actually rescales
217
- // the tooltip; `null` removes the property and keeps following the global axis.
218
- this.applySurfaceVars(this.overlayRef.overlayElement, this.TooltipTrigger());
219
- const panel = this.overlayRef.overlayElement;
220
- panel.addEventListener('pointerenter', this.onPanelPointerEnter);
221
- panel.addEventListener('pointerleave', this.onPanelPointerLeave);
222
- const portal = new TemplatePortal(this.TooltipTrigger().template, this.vcr);
223
- this.overlayRef.attach(portal);
224
- this.bindOverlayLifecycle();
225
- this.contentId.set(tooltipId);
226
- this.isOpen.set(true);
227
- if (!this.isDestroying) {
228
- this.openedChange.emit(true);
229
- }
230
- }
231
- close() {
232
- this.clearOpenTimeout();
233
- this.clearCloseTimeout();
234
- if (!this.isOpen()) {
235
- return;
236
- }
237
- this.releasePanel();
238
- this.overlayRef?.dispose();
239
- this.overlayRef = null;
240
- this.contentId.set(null);
241
- this.isOpen.set(false);
242
- if (!this.isDestroying) {
243
- this.openedChange.emit(false);
244
- }
245
- }
246
- applySurfaceVars(panel, content) {
247
- const radiusBase = content.radiusBase();
248
- const spacingBase = content.densityBase();
249
- if (radiusBase === null) {
250
- panel.style.removeProperty('--radius-base');
251
- }
252
- else {
253
- panel.style.setProperty('--radius-base', radiusBase);
254
- }
255
- if (spacingBase === null) {
256
- panel.style.removeProperty('--spacing-base');
257
- }
258
- else {
259
- panel.style.setProperty('--spacing-base', spacingBase);
260
- }
261
- }
262
- bindOverlayLifecycle() {
263
- if (!this.overlayRef) {
264
- return;
265
- }
266
- overlayDismissals(this.overlayRef, this.el.nativeElement)
267
- .pipe(takeUntilDestroyed(this.destroyRef))
268
- .subscribe(() => this.close());
269
- }
270
- scheduleOpen() {
271
- this.clearCloseTimeout();
272
- if (this.isOpen()) {
273
- return;
274
- }
275
- this.clearOpenTimeout();
276
- this.openTimeoutId = window.setTimeout(() => {
277
- this.openTimeoutId = null;
278
- if (this.disabled() || (!this.isPointerInsideTrigger && !this.isTriggerFocused)) {
279
- return;
280
- }
281
- this.open();
282
- }, this.openDelay() ?? this.defaults?.openDelay() ?? 150);
283
- }
284
- scheduleClose() {
285
- this.clearOpenTimeout();
286
- if (!this.isOpen()) {
287
- return;
288
- }
289
- this.clearCloseTimeout();
290
- this.closeTimeoutId = window.setTimeout(() => {
291
- this.closeTimeoutId = null;
292
- if (this.isPointerInsideTrigger || this.isPointerInsidePanel || this.isTriggerFocused) {
293
- return;
294
- }
295
- this.close();
296
- }, this.closeDelay() ?? this.defaults?.closeDelay() ?? 150);
297
- }
298
- releasePanel() {
299
- const panel = this.overlayRef?.overlayElement;
300
- panel?.removeEventListener('pointerenter', this.onPanelPointerEnter);
301
- panel?.removeEventListener('pointerleave', this.onPanelPointerLeave);
302
- this.isPointerInsidePanel = false;
303
- }
304
- clearOpenTimeout() {
305
- if (this.openTimeoutId !== null) {
306
- window.clearTimeout(this.openTimeoutId);
307
- this.openTimeoutId = null;
308
- }
309
- }
310
- clearCloseTimeout() {
311
- if (this.closeTimeoutId !== null) {
312
- window.clearTimeout(this.closeTimeoutId);
313
- this.closeTimeoutId = null;
314
- }
315
- }
316
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: TooltipTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
317
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.4", type: TooltipTriggerDirective, isStandalone: true, selector: "[TooltipTrigger]", inputs: { TooltipTrigger: { classPropertyName: "TooltipTrigger", publicName: "TooltipTrigger", isSignal: true, isRequired: true, transformFunction: null }, side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, sideOffset: { classPropertyName: "sideOffset", publicName: "sideOffset", 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: { openedChange: "openedChange" }, host: { listeners: { "pointerenter": "handlePointerEnter()", "pointerleave": "handlePointerLeave($event)", "focusin": "handleFocusIn()", "focusout": "handleFocusOut($event)", "keydown.escape": "close()" }, properties: { "attr.aria-describedby": "contentId()", "attr.data-state": "isOpen() ? \"open\" : \"closed\"" } }, exportAs: ["TooltipTrigger"], ngImport: i0 });
318
- }
319
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: TooltipTriggerDirective, decorators: [{
320
- type: Directive,
321
- args: [{
322
- selector: '[TooltipTrigger]',
323
- exportAs: 'TooltipTrigger',
324
- host: {
325
- '[attr.aria-describedby]': 'contentId()',
326
- '[attr.data-state]': 'isOpen() ? "open" : "closed"',
327
- '(pointerenter)': 'handlePointerEnter()',
328
- '(pointerleave)': 'handlePointerLeave($event)',
329
- '(focusin)': 'handleFocusIn()',
330
- '(focusout)': 'handleFocusOut($event)',
331
- '(keydown.escape)': 'close()',
332
- },
333
- }]
334
- }], ctorParameters: () => [], propDecorators: { TooltipTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "TooltipTrigger", required: true }] }], side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], sideOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "sideOffset", 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 }] }], openedChange: [{ type: i0.Output, args: ["openedChange"] }] } });
335
-
208
+ var TooltipTriggerDirective = class TooltipTriggerDirective {
209
+ overlay = inject(Overlay);
210
+ vcr = inject(ViewContainerRef);
211
+ el = inject(ElementRef);
212
+ destroyRef = inject(DestroyRef);
213
+ defaults = inject(TOOLTIP_DEFAULTS, { optional: true });
214
+ idGenerator = inject(UI_ID_GENERATOR);
215
+ TooltipTrigger = input.required(...ngDevMode ? [{ debugName: "TooltipTrigger" }] : /* istanbul ignore next */ []);
216
+ side = input(void 0, ...ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []);
217
+ align = input(void 0, ...ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []);
218
+ sideOffset = input(void 0, ...ngDevMode ? [{ debugName: "sideOffset" }] : /* istanbul ignore next */ []);
219
+ openDelay = input(void 0, ...ngDevMode ? [{ debugName: "openDelay" }] : /* istanbul ignore next */ []);
220
+ closeDelay = input(void 0, ...ngDevMode ? [{ debugName: "closeDelay" }] : /* istanbul ignore next */ []);
221
+ disabled = input(false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
222
+ openedChange = output();
223
+ isOpen = signal(false, ...ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []);
224
+ contentId = signal(null, ...ngDevMode ? [{ debugName: "contentId" }] : /* istanbul ignore next */ []);
225
+ overlayRef = null;
226
+ openTimeoutId = null;
227
+ closeTimeoutId = null;
228
+ isPointerInsideTrigger = false;
229
+ isPointerInsidePanel = false;
230
+ isTriggerFocused = false;
231
+ isDestroying = false;
232
+ onPanelPointerEnter = () => {
233
+ this.isPointerInsidePanel = true;
234
+ this.clearCloseTimeout();
235
+ };
236
+ onPanelPointerLeave = (event) => {
237
+ if (this.overlayRef?.overlayElement.contains(event.relatedTarget)) return;
238
+ this.isPointerInsidePanel = false;
239
+ this.scheduleClose();
240
+ };
241
+ constructor() {
242
+ this.destroyRef.onDestroy(() => {
243
+ this.isDestroying = true;
244
+ this.clearOpenTimeout();
245
+ this.clearCloseTimeout();
246
+ this.contentId.set(null);
247
+ this.isOpen.set(false);
248
+ this.releasePanel();
249
+ this.overlayRef?.dispose();
250
+ this.overlayRef = null;
251
+ });
252
+ }
253
+ handlePointerEnter() {
254
+ if (this.disabled()) return;
255
+ this.isPointerInsideTrigger = true;
256
+ this.clearCloseTimeout();
257
+ this.scheduleOpen();
258
+ }
259
+ handlePointerLeave(event) {
260
+ if (this.el.nativeElement.contains(event.relatedTarget)) return;
261
+ this.isPointerInsideTrigger = false;
262
+ this.scheduleClose();
263
+ }
264
+ handleFocusIn() {
265
+ if (this.disabled()) return;
266
+ this.isTriggerFocused = true;
267
+ this.clearCloseTimeout();
268
+ this.scheduleOpen();
269
+ }
270
+ handleFocusOut(event) {
271
+ if (this.el.nativeElement.contains(event.relatedTarget)) return;
272
+ this.isTriggerFocused = false;
273
+ this.scheduleClose();
274
+ }
275
+ open() {
276
+ if (this.isOpen() || this.disabled()) return;
277
+ const side = this.side() ?? this.defaults?.side() ?? "top";
278
+ const align = this.align() ?? this.defaults?.align() ?? "center";
279
+ const sideOffset = this.sideOffset() ?? this.defaults?.sideOffset() ?? 4;
280
+ const primary = connectedPositionFor(side, align, sideOffset);
281
+ const fallback = connectedPositionFor(oppositeSide(side), align, sideOffset);
282
+ const positionStrategy = this.overlay.position().flexibleConnectedTo(this.el).withPositions([primary, fallback]).withPush(true).withViewportMargin(8).withFlexibleDimensions(false);
283
+ this.overlayRef = this.overlay.create({
284
+ positionStrategy,
285
+ scrollStrategy: this.overlay.scrollStrategies.reposition(),
286
+ hasBackdrop: false,
287
+ panelClass: [...TOOLTIP_PANEL_CLASSES]
288
+ });
289
+ const tooltipId = this.idGenerator.next("Tooltip");
290
+ this.overlayRef.overlayElement.id = tooltipId;
291
+ this.overlayRef.overlayElement.setAttribute("role", "tooltip");
292
+ this.applySurfaceVars(this.overlayRef.overlayElement, this.TooltipTrigger());
293
+ const panel = this.overlayRef.overlayElement;
294
+ panel.addEventListener("pointerenter", this.onPanelPointerEnter);
295
+ panel.addEventListener("pointerleave", this.onPanelPointerLeave);
296
+ const portal = new TemplatePortal(this.TooltipTrigger().template, this.vcr);
297
+ this.overlayRef.attach(portal);
298
+ this.bindOverlayLifecycle();
299
+ this.contentId.set(tooltipId);
300
+ this.isOpen.set(true);
301
+ if (!this.isDestroying) this.openedChange.emit(true);
302
+ }
303
+ close() {
304
+ this.clearOpenTimeout();
305
+ this.clearCloseTimeout();
306
+ if (!this.isOpen()) return;
307
+ this.releasePanel();
308
+ this.overlayRef?.dispose();
309
+ this.overlayRef = null;
310
+ this.contentId.set(null);
311
+ this.isOpen.set(false);
312
+ if (!this.isDestroying) this.openedChange.emit(false);
313
+ }
314
+ applySurfaceVars(panel, content) {
315
+ const radiusBase = content.radiusBase();
316
+ const spacingBase = content.densityBase();
317
+ if (radiusBase === null) panel.style.removeProperty("--radius-base");
318
+ else panel.style.setProperty("--radius-base", radiusBase);
319
+ if (spacingBase === null) panel.style.removeProperty("--spacing-base");
320
+ else panel.style.setProperty("--spacing-base", spacingBase);
321
+ }
322
+ bindOverlayLifecycle() {
323
+ if (!this.overlayRef) return;
324
+ overlayDismissals(this.overlayRef, this.el.nativeElement).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => this.close());
325
+ }
326
+ scheduleOpen() {
327
+ this.clearCloseTimeout();
328
+ if (this.isOpen()) return;
329
+ this.clearOpenTimeout();
330
+ this.openTimeoutId = window.setTimeout(() => {
331
+ this.openTimeoutId = null;
332
+ if (this.disabled() || !this.isPointerInsideTrigger && !this.isTriggerFocused) return;
333
+ this.open();
334
+ }, this.openDelay() ?? this.defaults?.openDelay() ?? 150);
335
+ }
336
+ scheduleClose() {
337
+ this.clearOpenTimeout();
338
+ if (!this.isOpen()) return;
339
+ this.clearCloseTimeout();
340
+ this.closeTimeoutId = window.setTimeout(() => {
341
+ this.closeTimeoutId = null;
342
+ if (this.isPointerInsideTrigger || this.isPointerInsidePanel || this.isTriggerFocused) return;
343
+ this.close();
344
+ }, this.closeDelay() ?? this.defaults?.closeDelay() ?? 150);
345
+ }
346
+ releasePanel() {
347
+ const panel = this.overlayRef?.overlayElement;
348
+ panel?.removeEventListener("pointerenter", this.onPanelPointerEnter);
349
+ panel?.removeEventListener("pointerleave", this.onPanelPointerLeave);
350
+ this.isPointerInsidePanel = false;
351
+ }
352
+ clearOpenTimeout() {
353
+ if (this.openTimeoutId !== null) {
354
+ window.clearTimeout(this.openTimeoutId);
355
+ this.openTimeoutId = null;
356
+ }
357
+ }
358
+ clearCloseTimeout() {
359
+ if (this.closeTimeoutId !== null) {
360
+ window.clearTimeout(this.closeTimeoutId);
361
+ this.closeTimeoutId = null;
362
+ }
363
+ }
364
+ static ɵfac = i0.ɵɵngDeclareFactory({
365
+ minVersion: "12.0.0",
366
+ version: "22.2.0",
367
+ ngImport: i0,
368
+ type: TooltipTriggerDirective,
369
+ deps: [],
370
+ target: i0.ɵɵFactoryTarget.Directive
371
+ });
372
+ static ɵdir = i0.ɵɵngDeclareDirective({
373
+ minVersion: "17.1.0",
374
+ version: "22.2.0",
375
+ type: TooltipTriggerDirective,
376
+ isStandalone: true,
377
+ selector: "[TooltipTrigger]",
378
+ inputs: {
379
+ TooltipTrigger: {
380
+ classPropertyName: "TooltipTrigger",
381
+ publicName: "TooltipTrigger",
382
+ isSignal: true,
383
+ isRequired: true,
384
+ transformFunction: null
385
+ },
386
+ side: {
387
+ classPropertyName: "side",
388
+ publicName: "side",
389
+ isSignal: true,
390
+ isRequired: false,
391
+ transformFunction: null
392
+ },
393
+ align: {
394
+ classPropertyName: "align",
395
+ publicName: "align",
396
+ isSignal: true,
397
+ isRequired: false,
398
+ transformFunction: null
399
+ },
400
+ sideOffset: {
401
+ classPropertyName: "sideOffset",
402
+ publicName: "sideOffset",
403
+ isSignal: true,
404
+ isRequired: false,
405
+ transformFunction: null
406
+ },
407
+ openDelay: {
408
+ classPropertyName: "openDelay",
409
+ publicName: "openDelay",
410
+ isSignal: true,
411
+ isRequired: false,
412
+ transformFunction: null
413
+ },
414
+ closeDelay: {
415
+ classPropertyName: "closeDelay",
416
+ publicName: "closeDelay",
417
+ isSignal: true,
418
+ isRequired: false,
419
+ transformFunction: null
420
+ },
421
+ disabled: {
422
+ classPropertyName: "disabled",
423
+ publicName: "disabled",
424
+ isSignal: true,
425
+ isRequired: false,
426
+ transformFunction: null
427
+ }
428
+ },
429
+ outputs: { openedChange: "openedChange" },
430
+ host: {
431
+ listeners: {
432
+ "pointerenter": "handlePointerEnter()",
433
+ "pointerleave": "handlePointerLeave($event)",
434
+ "focusin": "handleFocusIn()",
435
+ "focusout": "handleFocusOut($event)",
436
+ "keydown.escape": "close()"
437
+ },
438
+ properties: {
439
+ "attr.aria-describedby": "contentId()",
440
+ "attr.data-state": "isOpen() ? \"open\" : \"closed\""
441
+ }
442
+ },
443
+ exportAs: ["TooltipTrigger"],
444
+ ngImport: i0
445
+ });
446
+ };
447
+ i0.ɵɵngDeclareClassMetadata({
448
+ minVersion: "12.0.0",
449
+ version: "22.2.0",
450
+ ngImport: i0,
451
+ type: TooltipTriggerDirective,
452
+ decorators: [{
453
+ type: Directive,
454
+ args: [{
455
+ selector: "[TooltipTrigger]",
456
+ exportAs: "TooltipTrigger",
457
+ host: {
458
+ "[attr.aria-describedby]": "contentId()",
459
+ "[attr.data-state]": "isOpen() ? \"open\" : \"closed\"",
460
+ "(pointerenter)": "handlePointerEnter()",
461
+ "(pointerleave)": "handlePointerLeave($event)",
462
+ "(focusin)": "handleFocusIn()",
463
+ "(focusout)": "handleFocusOut($event)",
464
+ "(keydown.escape)": "close()"
465
+ }
466
+ }]
467
+ }],
468
+ ctorParameters: () => [],
469
+ propDecorators: {
470
+ TooltipTrigger: [{
471
+ type: i0.Input,
472
+ args: [{
473
+ isSignal: true,
474
+ alias: "TooltipTrigger",
475
+ required: true
476
+ }]
477
+ }],
478
+ side: [{
479
+ type: i0.Input,
480
+ args: [{
481
+ isSignal: true,
482
+ alias: "side",
483
+ required: false
484
+ }]
485
+ }],
486
+ align: [{
487
+ type: i0.Input,
488
+ args: [{
489
+ isSignal: true,
490
+ alias: "align",
491
+ required: false
492
+ }]
493
+ }],
494
+ sideOffset: [{
495
+ type: i0.Input,
496
+ args: [{
497
+ isSignal: true,
498
+ alias: "sideOffset",
499
+ required: false
500
+ }]
501
+ }],
502
+ openDelay: [{
503
+ type: i0.Input,
504
+ args: [{
505
+ isSignal: true,
506
+ alias: "openDelay",
507
+ required: false
508
+ }]
509
+ }],
510
+ closeDelay: [{
511
+ type: i0.Input,
512
+ args: [{
513
+ isSignal: true,
514
+ alias: "closeDelay",
515
+ required: false
516
+ }]
517
+ }],
518
+ disabled: [{
519
+ type: i0.Input,
520
+ args: [{
521
+ isSignal: true,
522
+ alias: "disabled",
523
+ required: false
524
+ }]
525
+ }],
526
+ openedChange: [{
527
+ type: i0.Output,
528
+ args: ["openedChange"]
529
+ }]
530
+ }
531
+ });
336
532
  const POSITION_TO_SIDE = {
337
- above: 'top',
338
- below: 'bottom',
339
- left: 'left',
340
- right: 'right',
341
- before: 'left',
342
- after: 'right',
533
+ above: "top",
534
+ below: "bottom",
535
+ left: "left",
536
+ right: "right",
537
+ before: "left",
538
+ after: "right"
343
539
  };
344
- // No `pointer-events-none`: the panel has to be reachable by the pointer for
345
- // WCAG 1.4.13 (hoverable). Hovering it holds the tooltip open.
346
540
  const PANEL_CLASSES = [
347
- 'tooltip-panel',
348
- 'z-50',
349
- 'max-w-xs',
350
- 'overflow-hidden',
351
- 'rounded-md',
352
- 'border',
353
- 'border-border',
354
- 'bg-primary',
355
- 'px-3',
356
- 'py-1.5',
357
- 'text-xs',
358
- 'font-medium',
359
- 'leading-none',
360
- 'text-primary-foreground',
361
- 'shadow-md',
362
- 'select-none',
541
+ "tooltip-panel",
542
+ "z-50",
543
+ "max-w-xs",
544
+ "overflow-hidden",
545
+ "rounded-md",
546
+ "border",
547
+ "border-border",
548
+ "bg-primary",
549
+ "px-3",
550
+ "py-1.5",
551
+ "text-xs",
552
+ "font-medium",
553
+ "leading-none",
554
+ "text-primary-foreground",
555
+ "shadow-md",
556
+ "select-none"
363
557
  ];
364
- class TooltipTextComponent {
365
- text = signal('', /* @ts-ignore */
366
- ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
367
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: TooltipTextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
368
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.4", type: TooltipTextComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: `{{ text() }}`, isInline: true });
369
- }
370
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: TooltipTextComponent, decorators: [{
371
- type: Component,
372
- args: [{
373
- template: `{{ text() }}`,
374
- }]
375
- }] });
376
- /**
377
- * Shadcn-styled text tooltip — CDK overlay, tanpa dependensi Material.
378
- *
379
- * @example
380
- * <button Button [Tooltip]="'Save changes'" TooltipPosition="above">Save</button>
381
- */
382
- class TooltipDirective {
383
- overlay = inject(Overlay);
384
- el = inject(ElementRef);
385
- destroyRef = inject(DestroyRef);
386
- idGenerator = inject(UI_ID_GENERATOR);
387
- Tooltip = input('', /* @ts-ignore */
388
- ...(ngDevMode ? [{ debugName: "Tooltip" }] : /* istanbul ignore next */ []));
389
- TooltipPosition = input('above', /* @ts-ignore */
390
- ...(ngDevMode ? [{ debugName: "TooltipPosition" }] : /* istanbul ignore next */ []));
391
- TooltipDisabled = input(false, /* @ts-ignore */
392
- ...(ngDevMode ? [{ debugName: "TooltipDisabled" }] : /* istanbul ignore next */ []));
393
- TooltipShowDelay = input(150, /* @ts-ignore */
394
- ...(ngDevMode ? [{ debugName: "TooltipShowDelay" }] : /* istanbul ignore next */ []));
395
- /**
396
- * Delay before hiding. It matches the show delay rather than being zero so the
397
- * pointer can cross the offset gap and land on the panel, which is what makes
398
- * the panel reachable (WCAG 1.4.13, hoverable). Set `0` for an instant hide,
399
- * accepting that the panel then cannot be hovered.
400
- */
401
- TooltipHideDelay = input(150, /* @ts-ignore */
402
- ...(ngDevMode ? [{ debugName: "TooltipHideDelay" }] : /* istanbul ignore next */ []));
403
- overlayRef = null;
404
- contentRef = null;
405
- showTimeoutId = null;
406
- hideTimeoutId = null;
407
- isPointerInsidePanel = false;
408
- onPanelPointerEnter = () => {
409
- this.isPointerInsidePanel = true;
410
- this.clearTimers();
411
- };
412
- onPanelPointerLeave = (event) => {
413
- if (this.overlayRef?.overlayElement.contains(event.relatedTarget)) {
414
- return;
415
- }
416
- this.isPointerInsidePanel = false;
417
- this.scheduleHide();
418
- };
419
- side = computed(() => POSITION_TO_SIDE[this.TooltipPosition()], /* @ts-ignore */
420
- ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
421
- constructor() {
422
- this.destroyRef.onDestroy(() => {
423
- this.clearTimers();
424
- this.hide();
425
- });
426
- // Update teks saat pesan berubah ketika tooltip sedang tampil.
427
- effect(() => {
428
- const message = this.Tooltip();
429
- this.contentRef?.instance.text.set(message);
430
- });
431
- }
432
- show() {
433
- if (this.overlayRef || this.TooltipDisabled() || !this.Tooltip()) {
434
- return;
435
- }
436
- const side = this.side();
437
- const positionStrategy = this.overlay
438
- .position()
439
- .flexibleConnectedTo(this.el)
440
- .withPositions([
441
- connectedPositionFor(side, 'center', 4),
442
- connectedPositionFor(oppositeSide(side), 'center', 4),
443
- ])
444
- .withPush(true)
445
- .withViewportMargin(8)
446
- .withFlexibleDimensions(false);
447
- this.overlayRef = this.overlay.create({
448
- positionStrategy,
449
- scrollStrategy: this.overlay.scrollStrategies.reposition(),
450
- hasBackdrop: false,
451
- panelClass: [...PANEL_CLASSES],
452
- });
453
- this.contentRef = this.overlayRef.attach(new ComponentPortal(TooltipTextComponent));
454
- this.contentRef.instance.text.set(this.Tooltip());
455
- const pane = this.overlayRef.overlayElement;
456
- pane.id = this.idGenerator.next('Tooltip');
457
- pane.setAttribute('role', 'tooltip');
458
- pane.addEventListener('pointerenter', this.onPanelPointerEnter);
459
- pane.addEventListener('pointerleave', this.onPanelPointerLeave);
460
- this.el.nativeElement.setAttribute('aria-describedby', pane.id);
461
- }
462
- hide() {
463
- this.clearTimers();
464
- this.el.nativeElement.removeAttribute('aria-describedby');
465
- this.contentRef = null;
466
- const pane = this.overlayRef?.overlayElement;
467
- pane?.removeEventListener('pointerenter', this.onPanelPointerEnter);
468
- pane?.removeEventListener('pointerleave', this.onPanelPointerLeave);
469
- this.isPointerInsidePanel = false;
470
- this.overlayRef?.dispose();
471
- this.overlayRef = null;
472
- }
473
- scheduleShow() {
474
- this.clearTimers();
475
- this.showTimeoutId = window.setTimeout(() => {
476
- this.showTimeoutId = null;
477
- this.show();
478
- }, this.TooltipShowDelay());
479
- }
480
- scheduleHide() {
481
- this.clearTimers();
482
- this.hideTimeoutId = window.setTimeout(() => {
483
- this.hideTimeoutId = null;
484
- // The pointer may have moved onto the panel while this was pending.
485
- if (this.isPointerInsidePanel) {
486
- return;
487
- }
488
- this.hide();
489
- }, this.TooltipHideDelay());
490
- }
491
- clearTimers() {
492
- if (this.showTimeoutId !== null) {
493
- window.clearTimeout(this.showTimeoutId);
494
- this.showTimeoutId = null;
495
- }
496
- if (this.hideTimeoutId !== null) {
497
- window.clearTimeout(this.hideTimeoutId);
498
- this.hideTimeoutId = null;
499
- }
500
- }
501
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: TooltipDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
502
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.4", type: TooltipDirective, isStandalone: true, selector: "[Tooltip]", inputs: { Tooltip: { classPropertyName: "Tooltip", publicName: "Tooltip", isSignal: true, isRequired: false, transformFunction: null }, TooltipPosition: { classPropertyName: "TooltipPosition", publicName: "TooltipPosition", isSignal: true, isRequired: false, transformFunction: null }, TooltipDisabled: { classPropertyName: "TooltipDisabled", publicName: "TooltipDisabled", isSignal: true, isRequired: false, transformFunction: null }, TooltipShowDelay: { classPropertyName: "TooltipShowDelay", publicName: "TooltipShowDelay", isSignal: true, isRequired: false, transformFunction: null }, TooltipHideDelay: { classPropertyName: "TooltipHideDelay", publicName: "TooltipHideDelay", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "pointerenter": "scheduleShow()", "pointerleave": "scheduleHide()", "focusin": "scheduleShow()", "focusout": "scheduleHide()", "keydown.escape": "hide()" } }, exportAs: ["Tooltip"], ngImport: i0 });
503
- }
504
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: TooltipDirective, decorators: [{
505
- type: Directive,
506
- args: [{
507
- selector: '[Tooltip]',
508
- exportAs: 'Tooltip',
509
- host: {
510
- '(pointerenter)': 'scheduleShow()',
511
- '(pointerleave)': 'scheduleHide()',
512
- '(focusin)': 'scheduleShow()',
513
- '(focusout)': 'scheduleHide()',
514
- '(keydown.escape)': 'hide()',
515
- },
516
- }]
517
- }], ctorParameters: () => [], propDecorators: { Tooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "Tooltip", required: false }] }], TooltipPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "TooltipPosition", required: false }] }], TooltipDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "TooltipDisabled", required: false }] }], TooltipShowDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "TooltipShowDelay", required: false }] }], TooltipHideDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "TooltipHideDelay", required: false }] }] } });
518
-
519
- /**
520
- * Generated bundle index. Do not edit.
521
- */
522
-
523
- export { TOOLTIP_DEFAULTS, TooltipComponent, TooltipContentDirective, TooltipDirective, TooltipTriggerDirective };
558
+ var TooltipTextComponent = class TooltipTextComponent {
559
+ text = signal("", ...ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []);
560
+ static ɵfac = i0.ɵɵngDeclareFactory({
561
+ minVersion: "12.0.0",
562
+ version: "22.2.0",
563
+ ngImport: i0,
564
+ type: TooltipTextComponent,
565
+ deps: [],
566
+ target: i0.ɵɵFactoryTarget.Component
567
+ });
568
+ static ɵcmp = i0.ɵɵngDeclareComponent({
569
+ minVersion: "14.0.0",
570
+ version: "22.2.0",
571
+ type: TooltipTextComponent,
572
+ isStandalone: true,
573
+ selector: "ng-component",
574
+ ngImport: i0,
575
+ template: `{{ text() }}`,
576
+ isInline: true
577
+ });
578
+ };
579
+ i0.ɵɵngDeclareClassMetadata({
580
+ minVersion: "12.0.0",
581
+ version: "22.2.0",
582
+ ngImport: i0,
583
+ type: TooltipTextComponent,
584
+ decorators: [{
585
+ type: Component,
586
+ args: [{ template: `{{ text() }}` }]
587
+ }]
588
+ });
589
+ var TooltipDirective = class TooltipDirective {
590
+ overlay = inject(Overlay);
591
+ el = inject(ElementRef);
592
+ destroyRef = inject(DestroyRef);
593
+ idGenerator = inject(UI_ID_GENERATOR);
594
+ Tooltip = input("", ...ngDevMode ? [{ debugName: "Tooltip" }] : /* istanbul ignore next */ []);
595
+ TooltipPosition = input("above", ...ngDevMode ? [{ debugName: "TooltipPosition" }] : /* istanbul ignore next */ []);
596
+ TooltipDisabled = input(false, ...ngDevMode ? [{ debugName: "TooltipDisabled" }] : /* istanbul ignore next */ []);
597
+ TooltipShowDelay = input(150, ...ngDevMode ? [{ debugName: "TooltipShowDelay" }] : /* istanbul ignore next */ []);
598
+ TooltipHideDelay = input(150, ...ngDevMode ? [{ debugName: "TooltipHideDelay" }] : /* istanbul ignore next */ []);
599
+ overlayRef = null;
600
+ contentRef = null;
601
+ showTimeoutId = null;
602
+ hideTimeoutId = null;
603
+ isPointerInsidePanel = false;
604
+ onPanelPointerEnter = () => {
605
+ this.isPointerInsidePanel = true;
606
+ this.clearTimers();
607
+ };
608
+ onPanelPointerLeave = (event) => {
609
+ if (this.overlayRef?.overlayElement.contains(event.relatedTarget)) return;
610
+ this.isPointerInsidePanel = false;
611
+ this.scheduleHide();
612
+ };
613
+ side = computed(() => POSITION_TO_SIDE[this.TooltipPosition()], ...ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []);
614
+ constructor() {
615
+ this.destroyRef.onDestroy(() => {
616
+ this.clearTimers();
617
+ this.hide();
618
+ });
619
+ effect(() => {
620
+ const message = this.Tooltip();
621
+ this.contentRef?.instance.text.set(message);
622
+ });
623
+ }
624
+ show() {
625
+ if (this.overlayRef || this.TooltipDisabled() || !this.Tooltip()) return;
626
+ const side = this.side();
627
+ const positionStrategy = this.overlay.position().flexibleConnectedTo(this.el).withPositions([connectedPositionFor(side, "center", 4), connectedPositionFor(oppositeSide(side), "center", 4)]).withPush(true).withViewportMargin(8).withFlexibleDimensions(false);
628
+ this.overlayRef = this.overlay.create({
629
+ positionStrategy,
630
+ scrollStrategy: this.overlay.scrollStrategies.reposition(),
631
+ hasBackdrop: false,
632
+ panelClass: [...PANEL_CLASSES]
633
+ });
634
+ this.contentRef = this.overlayRef.attach(new ComponentPortal(TooltipTextComponent));
635
+ this.contentRef.instance.text.set(this.Tooltip());
636
+ const pane = this.overlayRef.overlayElement;
637
+ pane.id = this.idGenerator.next("Tooltip");
638
+ pane.setAttribute("role", "tooltip");
639
+ pane.addEventListener("pointerenter", this.onPanelPointerEnter);
640
+ pane.addEventListener("pointerleave", this.onPanelPointerLeave);
641
+ this.el.nativeElement.setAttribute("aria-describedby", pane.id);
642
+ }
643
+ hide() {
644
+ this.clearTimers();
645
+ this.el.nativeElement.removeAttribute("aria-describedby");
646
+ this.contentRef = null;
647
+ const pane = this.overlayRef?.overlayElement;
648
+ pane?.removeEventListener("pointerenter", this.onPanelPointerEnter);
649
+ pane?.removeEventListener("pointerleave", this.onPanelPointerLeave);
650
+ this.isPointerInsidePanel = false;
651
+ this.overlayRef?.dispose();
652
+ this.overlayRef = null;
653
+ }
654
+ scheduleShow() {
655
+ this.clearTimers();
656
+ this.showTimeoutId = window.setTimeout(() => {
657
+ this.showTimeoutId = null;
658
+ this.show();
659
+ }, this.TooltipShowDelay());
660
+ }
661
+ scheduleHide() {
662
+ this.clearTimers();
663
+ this.hideTimeoutId = window.setTimeout(() => {
664
+ this.hideTimeoutId = null;
665
+ if (this.isPointerInsidePanel) return;
666
+ this.hide();
667
+ }, this.TooltipHideDelay());
668
+ }
669
+ clearTimers() {
670
+ if (this.showTimeoutId !== null) {
671
+ window.clearTimeout(this.showTimeoutId);
672
+ this.showTimeoutId = null;
673
+ }
674
+ if (this.hideTimeoutId !== null) {
675
+ window.clearTimeout(this.hideTimeoutId);
676
+ this.hideTimeoutId = null;
677
+ }
678
+ }
679
+ static ɵfac = i0.ɵɵngDeclareFactory({
680
+ minVersion: "12.0.0",
681
+ version: "22.2.0",
682
+ ngImport: i0,
683
+ type: TooltipDirective,
684
+ deps: [],
685
+ target: i0.ɵɵFactoryTarget.Directive
686
+ });
687
+ static ɵdir = i0.ɵɵngDeclareDirective({
688
+ minVersion: "17.1.0",
689
+ version: "22.2.0",
690
+ type: TooltipDirective,
691
+ isStandalone: true,
692
+ selector: "[Tooltip]",
693
+ inputs: {
694
+ Tooltip: {
695
+ classPropertyName: "Tooltip",
696
+ publicName: "Tooltip",
697
+ isSignal: true,
698
+ isRequired: false,
699
+ transformFunction: null
700
+ },
701
+ TooltipPosition: {
702
+ classPropertyName: "TooltipPosition",
703
+ publicName: "TooltipPosition",
704
+ isSignal: true,
705
+ isRequired: false,
706
+ transformFunction: null
707
+ },
708
+ TooltipDisabled: {
709
+ classPropertyName: "TooltipDisabled",
710
+ publicName: "TooltipDisabled",
711
+ isSignal: true,
712
+ isRequired: false,
713
+ transformFunction: null
714
+ },
715
+ TooltipShowDelay: {
716
+ classPropertyName: "TooltipShowDelay",
717
+ publicName: "TooltipShowDelay",
718
+ isSignal: true,
719
+ isRequired: false,
720
+ transformFunction: null
721
+ },
722
+ TooltipHideDelay: {
723
+ classPropertyName: "TooltipHideDelay",
724
+ publicName: "TooltipHideDelay",
725
+ isSignal: true,
726
+ isRequired: false,
727
+ transformFunction: null
728
+ }
729
+ },
730
+ host: { listeners: {
731
+ "pointerenter": "scheduleShow()",
732
+ "pointerleave": "scheduleHide()",
733
+ "focusin": "scheduleShow()",
734
+ "focusout": "scheduleHide()",
735
+ "keydown.escape": "hide()"
736
+ } },
737
+ exportAs: ["Tooltip"],
738
+ ngImport: i0
739
+ });
740
+ };
741
+ i0.ɵɵngDeclareClassMetadata({
742
+ minVersion: "12.0.0",
743
+ version: "22.2.0",
744
+ ngImport: i0,
745
+ type: TooltipDirective,
746
+ decorators: [{
747
+ type: Directive,
748
+ args: [{
749
+ selector: "[Tooltip]",
750
+ exportAs: "Tooltip",
751
+ host: {
752
+ "(pointerenter)": "scheduleShow()",
753
+ "(pointerleave)": "scheduleHide()",
754
+ "(focusin)": "scheduleShow()",
755
+ "(focusout)": "scheduleHide()",
756
+ "(keydown.escape)": "hide()"
757
+ }
758
+ }]
759
+ }],
760
+ ctorParameters: () => [],
761
+ propDecorators: {
762
+ Tooltip: [{
763
+ type: i0.Input,
764
+ args: [{
765
+ isSignal: true,
766
+ alias: "Tooltip",
767
+ required: false
768
+ }]
769
+ }],
770
+ TooltipPosition: [{
771
+ type: i0.Input,
772
+ args: [{
773
+ isSignal: true,
774
+ alias: "TooltipPosition",
775
+ required: false
776
+ }]
777
+ }],
778
+ TooltipDisabled: [{
779
+ type: i0.Input,
780
+ args: [{
781
+ isSignal: true,
782
+ alias: "TooltipDisabled",
783
+ required: false
784
+ }]
785
+ }],
786
+ TooltipShowDelay: [{
787
+ type: i0.Input,
788
+ args: [{
789
+ isSignal: true,
790
+ alias: "TooltipShowDelay",
791
+ required: false
792
+ }]
793
+ }],
794
+ TooltipHideDelay: [{
795
+ type: i0.Input,
796
+ args: [{
797
+ isSignal: true,
798
+ alias: "TooltipHideDelay",
799
+ required: false
800
+ }]
801
+ }]
802
+ }
803
+ });
804
+ export { TOOLTIP_DEFAULTS, TooltipComponent, TooltipContentDirective, TooltipDirective, TooltipTriggerDirective };