@proyecto-viviana/solidaria-components 0.3.2 → 0.4.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 (398) hide show
  1. package/dist/ActionBar.js +184 -0
  2. package/dist/ActionBar.js.map +1 -0
  3. package/dist/ActionBar.jsx +128 -0
  4. package/dist/ActionBar.jsx.map +1 -0
  5. package/dist/ActionGroup.js +179 -0
  6. package/dist/ActionGroup.js.map +1 -0
  7. package/dist/ActionGroup.jsx +129 -0
  8. package/dist/ActionGroup.jsx.map +1 -0
  9. package/dist/Alert.js +111 -0
  10. package/dist/Alert.js.map +1 -0
  11. package/dist/Alert.jsx +82 -0
  12. package/dist/Alert.jsx.map +1 -0
  13. package/dist/Autocomplete.js +130 -0
  14. package/dist/Autocomplete.js.map +1 -0
  15. package/dist/Autocomplete.jsx +116 -0
  16. package/dist/Autocomplete.jsx.map +1 -0
  17. package/dist/Breadcrumbs.d.ts.map +1 -1
  18. package/dist/Breadcrumbs.js +334 -0
  19. package/dist/Breadcrumbs.js.map +1 -0
  20. package/dist/Breadcrumbs.jsx +266 -0
  21. package/dist/Breadcrumbs.jsx.map +1 -0
  22. package/dist/Button.d.ts.map +1 -1
  23. package/dist/Button.js +348 -0
  24. package/dist/Button.js.map +1 -0
  25. package/dist/Button.jsx +314 -0
  26. package/dist/Button.jsx.map +1 -0
  27. package/dist/Calendar.d.ts +4 -4
  28. package/dist/Calendar.d.ts.map +1 -1
  29. package/dist/Calendar.js +538 -0
  30. package/dist/Calendar.js.map +1 -0
  31. package/dist/Calendar.jsx +333 -0
  32. package/dist/Calendar.jsx.map +1 -0
  33. package/dist/CalendarPicker.d.ts +33 -0
  34. package/dist/CalendarPicker.d.ts.map +1 -0
  35. package/dist/CalendarPicker.js +44 -0
  36. package/dist/CalendarPicker.js.map +1 -0
  37. package/dist/CalendarPicker.jsx +44 -0
  38. package/dist/CalendarPicker.jsx.map +1 -0
  39. package/dist/Checkbox.d.ts +83 -4
  40. package/dist/Checkbox.d.ts.map +1 -1
  41. package/dist/Checkbox.js +923 -0
  42. package/dist/Checkbox.js.map +1 -0
  43. package/dist/Checkbox.jsx +707 -0
  44. package/dist/Checkbox.jsx.map +1 -0
  45. package/dist/Collection.d.ts.map +1 -1
  46. package/dist/Collection.js +202 -0
  47. package/dist/Collection.js.map +1 -0
  48. package/dist/Collection.jsx +152 -0
  49. package/dist/Collection.jsx.map +1 -0
  50. package/dist/Color.d.ts.map +1 -1
  51. package/dist/Color.js +1720 -0
  52. package/dist/Color.js.map +1 -0
  53. package/dist/Color.jsx +1344 -0
  54. package/dist/Color.jsx.map +1 -0
  55. package/dist/ColorEditor.js +208 -0
  56. package/dist/ColorEditor.js.map +1 -0
  57. package/dist/ColorEditor.jsx +120 -0
  58. package/dist/ColorEditor.jsx.map +1 -0
  59. package/dist/ComboBox.d.ts +4 -4
  60. package/dist/ComboBox.d.ts.map +1 -1
  61. package/dist/ComboBox.js +992 -0
  62. package/dist/ComboBox.js.map +1 -0
  63. package/dist/ComboBox.jsx +714 -0
  64. package/dist/ComboBox.jsx.map +1 -0
  65. package/dist/ContextualHelpTrigger.js +146 -0
  66. package/dist/ContextualHelpTrigger.js.map +1 -0
  67. package/dist/ContextualHelpTrigger.jsx +109 -0
  68. package/dist/ContextualHelpTrigger.jsx.map +1 -0
  69. package/dist/DateField.d.ts +3 -3
  70. package/dist/DateField.d.ts.map +1 -1
  71. package/dist/DateField.js +4 -0
  72. package/dist/DateField.jsx +4 -0
  73. package/dist/DateField2.js +499 -0
  74. package/dist/DateField2.js.map +1 -0
  75. package/dist/DateField2.jsx +317 -0
  76. package/dist/DateField2.jsx.map +1 -0
  77. package/dist/DatePicker.d.ts +4 -4
  78. package/dist/DatePicker.d.ts.map +1 -1
  79. package/dist/DatePicker.js +991 -0
  80. package/dist/DatePicker.js.map +1 -0
  81. package/dist/DatePicker.jsx +682 -0
  82. package/dist/DatePicker.jsx.map +1 -0
  83. package/dist/Dialog.d.ts.map +1 -1
  84. package/dist/Dialog.js +337 -0
  85. package/dist/Dialog.js.map +1 -0
  86. package/dist/Dialog.jsx +192 -0
  87. package/dist/Dialog.jsx.map +1 -0
  88. package/dist/Disclosure.d.ts.map +1 -1
  89. package/dist/Disclosure.js +328 -0
  90. package/dist/Disclosure.js.map +1 -0
  91. package/dist/Disclosure.jsx +230 -0
  92. package/dist/Disclosure.jsx.map +1 -0
  93. package/dist/DragAndDrop.d.ts.map +1 -1
  94. package/dist/DragAndDrop.js +176 -0
  95. package/dist/DragAndDrop.js.map +1 -0
  96. package/dist/DragAndDrop.jsx +160 -0
  97. package/dist/DragAndDrop.jsx.map +1 -0
  98. package/dist/DropZone.d.ts.map +1 -1
  99. package/dist/DropZone.js +189 -0
  100. package/dist/DropZone.js.map +1 -0
  101. package/dist/DropZone.jsx +144 -0
  102. package/dist/DropZone.jsx.map +1 -0
  103. package/dist/FieldError.js +66 -0
  104. package/dist/FieldError.js.map +1 -0
  105. package/dist/FieldError.jsx +47 -0
  106. package/dist/FieldError.jsx.map +1 -0
  107. package/dist/FileTrigger.js +79 -0
  108. package/dist/FileTrigger.js.map +1 -0
  109. package/dist/FileTrigger.jsx +49 -0
  110. package/dist/FileTrigger.jsx.map +1 -0
  111. package/dist/Focusable.js +70 -0
  112. package/dist/Focusable.js.map +1 -0
  113. package/dist/Focusable.jsx +69 -0
  114. package/dist/Focusable.jsx.map +1 -0
  115. package/dist/Form.js +99 -0
  116. package/dist/Form.js.map +1 -0
  117. package/dist/Form.jsx +73 -0
  118. package/dist/Form.jsx.map +1 -0
  119. package/dist/GridList.d.ts +34 -2
  120. package/dist/GridList.d.ts.map +1 -1
  121. package/dist/GridList.js +723 -0
  122. package/dist/GridList.js.map +1 -0
  123. package/dist/GridList.jsx +552 -0
  124. package/dist/GridList.jsx.map +1 -0
  125. package/dist/HiddenTimeInput.js +104 -0
  126. package/dist/HiddenTimeInput.js.map +1 -0
  127. package/dist/HiddenTimeInput.jsx +69 -0
  128. package/dist/HiddenTimeInput.jsx.map +1 -0
  129. package/dist/Icon.d.ts.map +1 -1
  130. package/dist/Icon.js +127 -0
  131. package/dist/Icon.js.map +1 -0
  132. package/dist/Icon.jsx +72 -0
  133. package/dist/Icon.jsx.map +1 -0
  134. package/dist/Keyboard.js +30 -0
  135. package/dist/Keyboard.js.map +1 -0
  136. package/dist/Keyboard.jsx +24 -0
  137. package/dist/Keyboard.jsx.map +1 -0
  138. package/dist/Landmark.js +134 -0
  139. package/dist/Landmark.js.map +1 -0
  140. package/dist/Landmark.jsx +118 -0
  141. package/dist/Landmark.jsx.map +1 -0
  142. package/dist/Link.d.ts.map +1 -1
  143. package/dist/Link.js +219 -0
  144. package/dist/Link.js.map +1 -0
  145. package/dist/Link.jsx +189 -0
  146. package/dist/Link.jsx.map +1 -0
  147. package/dist/ListBox.d.ts.map +1 -1
  148. package/dist/ListBox.js +670 -0
  149. package/dist/ListBox.js.map +1 -0
  150. package/dist/ListBox.jsx +508 -0
  151. package/dist/ListBox.jsx.map +1 -0
  152. package/dist/Menu.d.ts +27 -9
  153. package/dist/Menu.d.ts.map +1 -1
  154. package/dist/Menu.js +1254 -0
  155. package/dist/Menu.js.map +1 -0
  156. package/dist/Menu.jsx +1042 -0
  157. package/dist/Menu.jsx.map +1 -0
  158. package/dist/Meter.d.ts.map +1 -1
  159. package/dist/Meter.js +123 -0
  160. package/dist/Meter.js.map +1 -0
  161. package/dist/Meter.jsx +107 -0
  162. package/dist/Meter.jsx.map +1 -0
  163. package/dist/Modal.d.ts.map +1 -1
  164. package/dist/Modal.js +380 -0
  165. package/dist/Modal.js.map +1 -0
  166. package/dist/Modal.jsx +314 -0
  167. package/dist/Modal.jsx.map +1 -0
  168. package/dist/NumberField.d.ts +3 -3
  169. package/dist/NumberField.d.ts.map +1 -1
  170. package/dist/NumberField.js +573 -0
  171. package/dist/NumberField.js.map +1 -0
  172. package/dist/NumberField.jsx +443 -0
  173. package/dist/NumberField.jsx.map +1 -0
  174. package/dist/Popover.d.ts +10 -2
  175. package/dist/Popover.d.ts.map +1 -1
  176. package/dist/Popover.js +464 -0
  177. package/dist/Popover.js.map +1 -0
  178. package/dist/Popover.jsx +333 -0
  179. package/dist/Popover.jsx.map +1 -0
  180. package/dist/Pressable.js +69 -0
  181. package/dist/Pressable.js.map +1 -0
  182. package/dist/Pressable.jsx +68 -0
  183. package/dist/Pressable.jsx.map +1 -0
  184. package/dist/ProgressBar.d.ts.map +1 -1
  185. package/dist/ProgressBar.js +130 -0
  186. package/dist/ProgressBar.js.map +1 -0
  187. package/dist/ProgressBar.jsx +114 -0
  188. package/dist/ProgressBar.jsx.map +1 -0
  189. package/dist/RadioGroup.d.ts +82 -4
  190. package/dist/RadioGroup.d.ts.map +1 -1
  191. package/dist/RadioGroup.js +931 -0
  192. package/dist/RadioGroup.js.map +1 -0
  193. package/dist/RadioGroup.jsx +681 -0
  194. package/dist/RadioGroup.jsx.map +1 -0
  195. package/dist/RangeCalendar.d.ts.map +1 -1
  196. package/dist/RangeCalendar.js +410 -0
  197. package/dist/RangeCalendar.js.map +1 -0
  198. package/dist/RangeCalendar.jsx +253 -0
  199. package/dist/RangeCalendar.jsx.map +1 -0
  200. package/dist/RouterProvider.js +118 -0
  201. package/dist/RouterProvider.js.map +1 -0
  202. package/dist/RouterProvider.jsx +112 -0
  203. package/dist/RouterProvider.jsx.map +1 -0
  204. package/dist/SearchField.d.ts +2 -2
  205. package/dist/SearchField.d.ts.map +1 -1
  206. package/dist/SearchField.js +643 -0
  207. package/dist/SearchField.js.map +1 -0
  208. package/dist/SearchField.jsx +526 -0
  209. package/dist/SearchField.jsx.map +1 -0
  210. package/dist/Select.d.ts.map +1 -1
  211. package/dist/Select.js +1031 -0
  212. package/dist/Select.js.map +1 -0
  213. package/dist/Select.jsx +744 -0
  214. package/dist/Select.jsx.map +1 -0
  215. package/dist/SelectionIndicator.d.ts.map +1 -1
  216. package/dist/SelectionIndicator.js +86 -0
  217. package/dist/SelectionIndicator.js.map +1 -0
  218. package/dist/SelectionIndicator.jsx +50 -0
  219. package/dist/SelectionIndicator.jsx.map +1 -0
  220. package/dist/Separator.js +97 -0
  221. package/dist/Separator.js.map +1 -0
  222. package/dist/Separator.jsx +85 -0
  223. package/dist/Separator.jsx.map +1 -0
  224. package/dist/SharedElementTransition.d.ts.map +1 -1
  225. package/dist/SharedElementTransition.js +165 -0
  226. package/dist/SharedElementTransition.js.map +1 -0
  227. package/dist/SharedElementTransition.jsx +138 -0
  228. package/dist/SharedElementTransition.jsx.map +1 -0
  229. package/dist/Slider.d.ts +33 -1
  230. package/dist/Slider.d.ts.map +1 -1
  231. package/dist/Slider.js +515 -0
  232. package/dist/Slider.js.map +1 -0
  233. package/dist/Slider.jsx +403 -0
  234. package/dist/Slider.jsx.map +1 -0
  235. package/dist/StepList.js +198 -0
  236. package/dist/StepList.js.map +1 -0
  237. package/dist/StepList.jsx +141 -0
  238. package/dist/StepList.jsx.map +1 -0
  239. package/dist/Switch.d.ts +65 -2
  240. package/dist/Switch.d.ts.map +1 -1
  241. package/dist/Switch.js +534 -0
  242. package/dist/Switch.js.map +1 -0
  243. package/dist/Switch.jsx +393 -0
  244. package/dist/Switch.jsx.map +1 -0
  245. package/dist/Table.d.ts +48 -0
  246. package/dist/Table.d.ts.map +1 -1
  247. package/dist/Table.js +1759 -0
  248. package/dist/Table.js.map +1 -0
  249. package/dist/Table.jsx +1348 -0
  250. package/dist/Table.jsx.map +1 -0
  251. package/dist/Tabs.d.ts +0 -4
  252. package/dist/Tabs.d.ts.map +1 -1
  253. package/dist/Tabs.js +595 -0
  254. package/dist/Tabs.js.map +1 -0
  255. package/dist/Tabs.jsx +367 -0
  256. package/dist/Tabs.jsx.map +1 -0
  257. package/dist/TagGroup.d.ts.map +1 -1
  258. package/dist/TagGroup.js +378 -0
  259. package/dist/TagGroup.js.map +1 -0
  260. package/dist/TagGroup.jsx +270 -0
  261. package/dist/TagGroup.jsx.map +1 -0
  262. package/dist/Text.d.ts +18 -6
  263. package/dist/Text.d.ts.map +1 -1
  264. package/dist/Text.js +42 -0
  265. package/dist/Text.js.map +1 -0
  266. package/dist/Text.jsx +35 -0
  267. package/dist/Text.jsx.map +1 -0
  268. package/dist/TextField.d.ts +6 -6
  269. package/dist/TextField.d.ts.map +1 -1
  270. package/dist/TextField.js +436 -0
  271. package/dist/TextField.js.map +1 -0
  272. package/dist/TextField.jsx +403 -0
  273. package/dist/TextField.jsx.map +1 -0
  274. package/dist/TimeField.d.ts +3 -3
  275. package/dist/TimeField.d.ts.map +1 -1
  276. package/dist/TimeField.js +372 -0
  277. package/dist/TimeField.js.map +1 -0
  278. package/dist/TimeField.jsx +224 -0
  279. package/dist/TimeField.jsx.map +1 -0
  280. package/dist/Toast.d.ts +14 -0
  281. package/dist/Toast.d.ts.map +1 -1
  282. package/dist/Toast.js +551 -0
  283. package/dist/Toast.js.map +1 -0
  284. package/dist/Toast.jsx +361 -0
  285. package/dist/Toast.jsx.map +1 -0
  286. package/dist/ToggleButton.d.ts.map +1 -1
  287. package/dist/ToggleButton.js +123 -0
  288. package/dist/ToggleButton.js.map +1 -0
  289. package/dist/ToggleButton.jsx +88 -0
  290. package/dist/ToggleButton.jsx.map +1 -0
  291. package/dist/ToggleButtonGroup.d.ts.map +1 -1
  292. package/dist/ToggleButtonGroup.js +114 -0
  293. package/dist/ToggleButtonGroup.js.map +1 -0
  294. package/dist/ToggleButtonGroup.jsx +85 -0
  295. package/dist/ToggleButtonGroup.jsx.map +1 -0
  296. package/dist/Toolbar.js +112 -0
  297. package/dist/Toolbar.js.map +1 -0
  298. package/dist/Toolbar.jsx +92 -0
  299. package/dist/Toolbar.jsx.map +1 -0
  300. package/dist/Tooltip.d.ts.map +1 -1
  301. package/dist/Tooltip.js +539 -0
  302. package/dist/Tooltip.js.map +1 -0
  303. package/dist/Tooltip.jsx +465 -0
  304. package/dist/Tooltip.jsx.map +1 -0
  305. package/dist/Tree.d.ts +14 -2
  306. package/dist/Tree.d.ts.map +1 -1
  307. package/dist/Tree.js +1424 -0
  308. package/dist/Tree.js.map +1 -0
  309. package/dist/Tree.jsx +1172 -0
  310. package/dist/Tree.jsx.map +1 -0
  311. package/dist/Virtualizer.d.ts +16 -2
  312. package/dist/Virtualizer.d.ts.map +1 -1
  313. package/dist/Virtualizer.js +2 -0
  314. package/dist/Virtualizer.jsx +2 -0
  315. package/dist/Virtualizer2.js +751 -0
  316. package/dist/Virtualizer2.js.map +1 -0
  317. package/dist/Virtualizer2.jsx +730 -0
  318. package/dist/Virtualizer2.jsx.map +1 -0
  319. package/dist/VirtualizerLayouts.d.ts +18 -0
  320. package/dist/VirtualizerLayouts.d.ts.map +1 -1
  321. package/dist/VisuallyHidden.js +42 -0
  322. package/dist/VisuallyHidden.js.map +1 -0
  323. package/dist/VisuallyHidden.jsx +35 -0
  324. package/dist/VisuallyHidden.jsx.map +1 -0
  325. package/dist/contexts.js +33 -0
  326. package/dist/contexts.js.map +1 -0
  327. package/dist/contexts.jsx +33 -0
  328. package/dist/contexts.jsx.map +1 -0
  329. package/dist/index.d.ts +7 -6
  330. package/dist/index.d.ts.map +1 -1
  331. package/dist/index.js +70 -23932
  332. package/dist/index.jsx +70 -18337
  333. package/dist/useDragAndDrop.js +2 -0
  334. package/dist/useDragAndDrop.jsx +2 -0
  335. package/dist/useDragAndDrop2.js +395 -0
  336. package/dist/useDragAndDrop2.js.map +1 -0
  337. package/dist/useDragAndDrop2.jsx +395 -0
  338. package/dist/useDragAndDrop2.jsx.map +1 -0
  339. package/dist/utils.d.ts +83 -11
  340. package/dist/utils.d.ts.map +1 -1
  341. package/dist/utils.js +285 -0
  342. package/dist/utils.js.map +1 -0
  343. package/dist/utils.jsx +277 -0
  344. package/dist/utils.jsx.map +1 -0
  345. package/dist/virtualizer/Layout.js +144 -0
  346. package/dist/virtualizer/Layout.js.map +1 -0
  347. package/dist/virtualizer/Layout.jsx +144 -0
  348. package/dist/virtualizer/Layout.jsx.map +1 -0
  349. package/package.json +401 -4
  350. package/src/Breadcrumbs.tsx +3 -1
  351. package/src/Button.tsx +22 -2
  352. package/src/Calendar.tsx +27 -10
  353. package/src/CalendarPicker.tsx +73 -0
  354. package/src/Checkbox.tsx +539 -3
  355. package/src/Collection.tsx +9 -3
  356. package/src/Color.tsx +42 -14
  357. package/src/ComboBox.tsx +50 -6
  358. package/src/DateField.tsx +20 -2
  359. package/src/DatePicker.tsx +57 -5
  360. package/src/Dialog.tsx +13 -5
  361. package/src/Disclosure.tsx +3 -1
  362. package/src/DragAndDrop.tsx +3 -1
  363. package/src/DropZone.tsx +3 -1
  364. package/src/GridList.tsx +125 -24
  365. package/src/Icon.tsx +3 -1
  366. package/src/Link.tsx +3 -1
  367. package/src/ListBox.tsx +31 -4
  368. package/src/Menu.tsx +252 -128
  369. package/src/Meter.tsx +3 -1
  370. package/src/Modal.tsx +100 -52
  371. package/src/NumberField.tsx +51 -8
  372. package/src/Popover.tsx +40 -10
  373. package/src/ProgressBar.tsx +3 -1
  374. package/src/RadioGroup.tsx +468 -4
  375. package/src/RangeCalendar.tsx +3 -1
  376. package/src/SearchField.tsx +27 -3
  377. package/src/Select.tsx +22 -7
  378. package/src/SelectionIndicator.tsx +3 -1
  379. package/src/SharedElementTransition.tsx +3 -1
  380. package/src/Slider.tsx +159 -13
  381. package/src/Switch.tsx +395 -2
  382. package/src/Table.tsx +409 -95
  383. package/src/Tabs.tsx +16 -45
  384. package/src/TagGroup.tsx +3 -1
  385. package/src/Text.tsx +31 -10
  386. package/src/TextField.tsx +43 -5
  387. package/src/TimeField.tsx +20 -2
  388. package/src/Toast.tsx +79 -14
  389. package/src/ToggleButton.tsx +3 -1
  390. package/src/ToggleButtonGroup.tsx +3 -1
  391. package/src/Tooltip.tsx +3 -1
  392. package/src/Tree.tsx +77 -9
  393. package/src/Virtualizer.tsx +180 -31
  394. package/src/VirtualizerLayouts.ts +45 -10
  395. package/src/index.ts +50 -0
  396. package/src/utils.tsx +243 -27
  397. package/dist/index.js.map +0 -1
  398. package/dist/index.jsx.map +0 -1
@@ -0,0 +1,539 @@
1
+ import { filterDOMProps, useRenderProps } from "./utils.js";
2
+ import { createComponent, getNextElement, insert, isServer, mergeProps, runHydrationEvents, spread, template, use } from "solid-js/web";
3
+ import { Show, createContext, createEffect, createMemo, createSignal, onCleanup, useContext } from "solid-js";
4
+ import { OverlayContainer, createTooltip, createTooltipTrigger } from "@proyecto-viviana/solidaria";
5
+ import { createTooltipTriggerState } from "@proyecto-viviana/solid-stately";
6
+ //#region src/Tooltip.tsx
7
+ /**
8
+ * Tooltip component for solidaria-components
9
+ *
10
+ * A tooltip displays a description of an element on hover or focus.
11
+ * Port of react-aria-components/src/Tooltip.tsx
12
+ */
13
+ var _tmpl$ = /*#__PURE__*/ template(`<span>`), _tmpl$2 = /*#__PURE__*/ template(`<div>`);
14
+ const TooltipTriggerContext = createContext(null);
15
+ const TooltipContext = TooltipTriggerContext;
16
+ const TooltipTriggerStateContext = createContext(null);
17
+ /**
18
+ * TooltipTrigger wraps around a trigger element and a Tooltip.
19
+ * It handles opening and closing the Tooltip when the user hovers
20
+ * over or focuses the trigger.
21
+ *
22
+ * @example
23
+ * ```tsx
24
+ * <TooltipTrigger>
25
+ * <Button>Hover me</Button>
26
+ * <Tooltip>This is a tooltip</Tooltip>
27
+ * </TooltipTrigger>
28
+ * ```
29
+ */
30
+ const TooltipTrigger = (props) => {
31
+ let triggerRef = null;
32
+ const [tooltipId, setTooltipId] = createSignal();
33
+ const state = createTooltipTriggerState({
34
+ get delay() {
35
+ return props.delay;
36
+ },
37
+ get closeDelay() {
38
+ return props.closeDelay;
39
+ },
40
+ get isOpen() {
41
+ return props.isOpen;
42
+ },
43
+ get defaultOpen() {
44
+ return props.defaultOpen;
45
+ },
46
+ get onOpenChange() {
47
+ return props.onOpenChange;
48
+ }
49
+ });
50
+ const { triggerProps, tooltipProps } = createTooltipTrigger({
51
+ get isDisabled() {
52
+ return props.isDisabled;
53
+ },
54
+ get trigger() {
55
+ return props.trigger;
56
+ },
57
+ get shouldCloseOnPress() {
58
+ return props.shouldCloseOnPress;
59
+ },
60
+ get tooltipId() {
61
+ return tooltipId();
62
+ }
63
+ }, state, () => triggerRef);
64
+ const context = {
65
+ state,
66
+ tooltipProps,
67
+ setTooltipId,
68
+ triggerRef: () => triggerRef,
69
+ placement: () => props.placement,
70
+ containerPadding: () => props.containerPadding,
71
+ crossOffset: () => props.crossOffset,
72
+ shouldFlip: () => props.shouldFlip,
73
+ isDisabled: () => props.isDisabled
74
+ };
75
+ const processChildren = () => {
76
+ const children = props.children;
77
+ if (Array.isArray(children)) {
78
+ const [trigger, ...rest] = children;
79
+ return [createComponent(TriggerWrapper, {
80
+ triggerProps,
81
+ ref: (el) => {
82
+ triggerRef = el;
83
+ },
84
+ children: trigger
85
+ }), rest];
86
+ }
87
+ return children;
88
+ };
89
+ return createComponent(TooltipTriggerStateContext.Provider, {
90
+ value: state,
91
+ get children() {
92
+ return createComponent(TooltipTriggerContext.Provider, {
93
+ value: context,
94
+ get children() {
95
+ return processChildren();
96
+ }
97
+ });
98
+ }
99
+ });
100
+ };
101
+ /**
102
+ * Wrapper component that spreads trigger props onto its child
103
+ */
104
+ const TriggerWrapper = (props) => {
105
+ const child = () => props.children;
106
+ const [triggerElement, setTriggerElement] = createSignal(null);
107
+ const [wrapperElement, setWrapperElement] = createSignal(null);
108
+ const getWrapperEventProps = () => {
109
+ const triggerProps = props.triggerProps;
110
+ const wrapperProps = {};
111
+ for (const propName of [
112
+ "onFocus",
113
+ "onBlur",
114
+ "onPointerEnter",
115
+ "onPointerLeave",
116
+ "onPointerOver",
117
+ "onPointerOut",
118
+ "onMouseEnter",
119
+ "onMouseLeave",
120
+ "onTouchStart",
121
+ "onPointerDown",
122
+ "onKeyDown"
123
+ ]) {
124
+ const handler = triggerProps[propName];
125
+ if (typeof handler === "function") wrapperProps[propName] = handler;
126
+ }
127
+ if (!wrapperProps.onPointerEnter && typeof triggerProps.onMouseEnter === "function") wrapperProps.onPointerEnter = triggerProps.onMouseEnter;
128
+ if (!wrapperProps.onPointerLeave && typeof triggerProps.onMouseLeave === "function") wrapperProps.onPointerLeave = triggerProps.onMouseLeave;
129
+ return wrapperProps;
130
+ };
131
+ createEffect(() => {
132
+ const element = triggerElement();
133
+ if (!element) return;
134
+ const triggerProps = props.triggerProps;
135
+ const describedBy = triggerProps["aria-describedby"];
136
+ if (describedBy) element.setAttribute("aria-describedby", describedBy);
137
+ else element.removeAttribute("aria-describedby");
138
+ const wrapper = wrapperElement();
139
+ const targets = Array.from(new Set([element, wrapper].filter(Boolean)));
140
+ const listeners = [];
141
+ for (const [propName, eventName] of [
142
+ ["onFocus", "focus"],
143
+ ["onBlur", "blur"],
144
+ ["onPointerEnter", "pointerenter"],
145
+ ["onPointerLeave", "pointerleave"],
146
+ ["onPointerOver", "pointerover"],
147
+ ["onPointerOut", "pointerout"],
148
+ ["onMouseEnter", "mouseenter"],
149
+ ["onMouseLeave", "mouseleave"],
150
+ ["onTouchStart", "touchstart"],
151
+ ["onPointerDown", "pointerdown"],
152
+ ["onKeyDown", "keydown"]
153
+ ]) {
154
+ let handler = triggerProps[propName];
155
+ if (!handler && propName === "onPointerEnter") handler = triggerProps.onMouseEnter;
156
+ else if (!handler && propName === "onPointerLeave") handler = triggerProps.onMouseLeave;
157
+ if (typeof handler === "function") {
158
+ const listener = handler;
159
+ for (const target of targets) {
160
+ target.addEventListener(eventName, listener);
161
+ listeners.push([
162
+ target,
163
+ eventName,
164
+ listener
165
+ ]);
166
+ }
167
+ }
168
+ }
169
+ onCleanup(() => {
170
+ for (const [target, eventName, listener] of listeners) target.removeEventListener(eventName, listener);
171
+ if (describedBy && element.getAttribute("aria-describedby") === describedBy) element.removeAttribute("aria-describedby");
172
+ });
173
+ });
174
+ const handleRef = (span) => {
175
+ setWrapperElement(span);
176
+ const findElementChild = (el) => {
177
+ for (const child of el.children) {
178
+ if (child instanceof HTMLElement) return child;
179
+ const found = findElementChild(child);
180
+ if (found) return found;
181
+ }
182
+ return null;
183
+ };
184
+ const findVisibleChild = (el) => {
185
+ if (el instanceof HTMLElement) {
186
+ const rect = el.getBoundingClientRect();
187
+ if (rect.width > 0 && rect.height > 0) return el;
188
+ for (const child of el.children) {
189
+ const found = findVisibleChild(child);
190
+ if (found) return found;
191
+ }
192
+ }
193
+ return null;
194
+ };
195
+ const resolveRef = () => {
196
+ const elementChild = findElementChild(span);
197
+ const visibleChild = findVisibleChild(span);
198
+ setTriggerElement(elementChild ?? visibleChild ?? span);
199
+ props.ref(visibleChild ?? elementChild ?? span);
200
+ };
201
+ const elementChild = findElementChild(span);
202
+ if (elementChild) setTriggerElement(elementChild);
203
+ const immediateChild = findVisibleChild(span);
204
+ if (immediateChild) {
205
+ setTriggerElement(elementChild ?? immediateChild);
206
+ props.ref(immediateChild);
207
+ } else requestAnimationFrame(resolveRef);
208
+ };
209
+ return (() => {
210
+ var _el$ = getNextElement(_tmpl$);
211
+ use(handleRef, _el$);
212
+ spread(_el$, mergeProps(getWrapperEventProps, { "style": { display: "contents" } }), false, true);
213
+ insert(_el$, child);
214
+ runHydrationEvents();
215
+ return _el$;
216
+ })();
217
+ };
218
+ /**
219
+ * A tooltip displays a description of an element on hover or focus.
220
+ *
221
+ * @example
222
+ * ```tsx
223
+ * <TooltipTrigger>
224
+ * <Button>Hover me</Button>
225
+ * <Tooltip>This is helpful information</Tooltip>
226
+ * </TooltipTrigger>
227
+ * ```
228
+ */
229
+ function Tooltip(props) {
230
+ const context = useContext(TooltipTriggerContext);
231
+ createEffect(() => {
232
+ context?.setTooltipId(props.id);
233
+ onCleanup(() => {
234
+ context?.setTooltipId(void 0);
235
+ });
236
+ });
237
+ const localState = createTooltipTriggerState({
238
+ get isOpen() {
239
+ return props.isOpen;
240
+ },
241
+ get defaultOpen() {
242
+ return props.defaultOpen;
243
+ }
244
+ });
245
+ const state = () => context?.state ?? localState;
246
+ const placement = () => props.placement ?? context?.placement() ?? "top";
247
+ const containerPadding = () => props.containerPadding ?? context?.containerPadding() ?? 12;
248
+ const crossOffset = () => props.crossOffset ?? context?.crossOffset() ?? 0;
249
+ const shouldFlip = () => props.shouldFlip ?? context?.shouldFlip() ?? true;
250
+ const offset = () => props.offset ?? 9;
251
+ const arrowSize = () => props.arrowSize ?? 0;
252
+ const arrowBoundaryOffset = () => props.arrowBoundaryOffset ?? 0;
253
+ const isDisabled = () => props.isDisabled ?? context?.isDisabled() ?? false;
254
+ const isOpen = () => !isDisabled() && state().isOpen();
255
+ const [exitState, setExitState] = createSignal(isOpen() ? "open" : "closed");
256
+ createEffect(() => {
257
+ const open = isOpen();
258
+ const current = exitState();
259
+ if (current === "open" && !open) setExitState("exiting");
260
+ else if ((current === "closed" || current === "exiting") && open) setExitState("open");
261
+ });
262
+ const [tooltipEl, setTooltipEl] = createSignal(null);
263
+ createEffect(() => {
264
+ if (exitState() !== "exiting") return;
265
+ const el = tooltipEl();
266
+ if (!el || !("getAnimations" in el)) {
267
+ setExitState("closed");
268
+ return;
269
+ }
270
+ const animations = el.getAnimations();
271
+ if (animations.length === 0) {
272
+ setExitState("closed");
273
+ return;
274
+ }
275
+ let canceled = false;
276
+ Promise.all(animations.map((a) => a.finished)).then(() => {
277
+ if (!canceled) setExitState((s) => s === "exiting" ? "closed" : s);
278
+ }).catch(() => {
279
+ if (!canceled) setExitState((s) => s === "exiting" ? "closed" : s);
280
+ });
281
+ onCleanup(() => {
282
+ canceled = true;
283
+ });
284
+ });
285
+ const shouldRender = () => isOpen() || exitState() === "exiting";
286
+ const isExiting = () => exitState() === "exiting";
287
+ return createComponent(Show, {
288
+ get when() {
289
+ return shouldRender();
290
+ },
291
+ get children() {
292
+ return createComponent(TooltipContent, mergeProps(props, {
293
+ get state() {
294
+ return state();
295
+ },
296
+ get contextTooltipProps() {
297
+ return context?.tooltipProps ?? {};
298
+ },
299
+ get placement() {
300
+ return placement();
301
+ },
302
+ get containerPadding() {
303
+ return containerPadding();
304
+ },
305
+ get crossOffset() {
306
+ return crossOffset();
307
+ },
308
+ get shouldFlip() {
309
+ return shouldFlip();
310
+ },
311
+ get offset() {
312
+ return offset();
313
+ },
314
+ get arrowSize() {
315
+ return arrowSize();
316
+ },
317
+ get arrowBoundaryOffset() {
318
+ return arrowBoundaryOffset();
319
+ },
320
+ get triggerRef() {
321
+ return context?.triggerRef ?? (() => null);
322
+ },
323
+ get isExiting() {
324
+ return isExiting();
325
+ },
326
+ onTooltipRef: setTooltipEl
327
+ }));
328
+ }
329
+ });
330
+ }
331
+ /**
332
+ * Internal component that renders the tooltip content
333
+ */
334
+ function TooltipContent(props) {
335
+ if (isServer) return null;
336
+ let tooltipRef;
337
+ const { tooltipProps: ariaTooltipProps } = createTooltip({}, props.state);
338
+ const [positionStyles, setPositionStyles] = createSignal({
339
+ top: "0px",
340
+ left: "0px",
341
+ visibility: "visible"
342
+ });
343
+ const [renderedPlacement, setRenderedPlacement] = createSignal(resolvePlacement(props.placement));
344
+ const [isEntering, setIsEntering] = createSignal(true);
345
+ createEffect(() => {
346
+ if (!isEntering()) return;
347
+ if (!tooltipRef || !("getAnimations" in tooltipRef)) {
348
+ setIsEntering(false);
349
+ return;
350
+ }
351
+ for (const anim of tooltipRef.getAnimations()) if (anim instanceof CSSTransition) anim.cancel();
352
+ const animations = tooltipRef.getAnimations();
353
+ if (animations.length === 0) {
354
+ setIsEntering(false);
355
+ return;
356
+ }
357
+ let canceled = false;
358
+ Promise.all(animations.map((a) => a.finished)).then(() => {
359
+ if (!canceled) setIsEntering(false);
360
+ }).catch(() => {
361
+ if (!canceled) setIsEntering(false);
362
+ });
363
+ onCleanup(() => {
364
+ canceled = true;
365
+ });
366
+ });
367
+ const values = createMemo(() => ({
368
+ isEntering: isEntering(),
369
+ isExiting: props.isExiting,
370
+ placement: renderedPlacement()
371
+ }));
372
+ const renderProps = useRenderProps({
373
+ class: props.class,
374
+ style: props.style,
375
+ get children() {
376
+ return props.children;
377
+ },
378
+ defaultClassName: "solidaria-Tooltip"
379
+ }, values);
380
+ const updatePosition = () => {
381
+ const triggerEl = props.triggerRef();
382
+ if (!triggerEl || !tooltipRef) return false;
383
+ const triggerRect = triggerEl.getBoundingClientRect();
384
+ if (triggerRect.width === 0 || triggerRect.height === 0) return false;
385
+ const tooltipWidth = tooltipRef.offsetWidth;
386
+ const tooltipHeight = tooltipRef.offsetHeight;
387
+ const viewportWidth = window.innerWidth;
388
+ const viewportHeight = window.innerHeight;
389
+ const containerPadding = props.containerPadding;
390
+ const crossOffset = props.crossOffset;
391
+ const placement = maybeFlipPlacement(resolvePlacement(props.placement), triggerRect, tooltipWidth, tooltipHeight, viewportWidth, viewportHeight, containerPadding, props.offset, props.shouldFlip);
392
+ let top = 0;
393
+ let left = 0;
394
+ switch (placement) {
395
+ case "top":
396
+ top = triggerRect.top - tooltipHeight - props.offset;
397
+ left = triggerRect.left + (triggerRect.width - tooltipWidth) / 2 + crossOffset;
398
+ break;
399
+ case "bottom":
400
+ top = triggerRect.bottom + props.offset;
401
+ left = triggerRect.left + (triggerRect.width - tooltipWidth) / 2 + crossOffset;
402
+ break;
403
+ case "left":
404
+ top = triggerRect.top + (triggerRect.height - tooltipHeight) / 2 + crossOffset;
405
+ left = triggerRect.left - tooltipWidth - props.offset;
406
+ break;
407
+ case "right":
408
+ top = triggerRect.top + (triggerRect.height - tooltipHeight) / 2 + crossOffset;
409
+ left = triggerRect.right + props.offset;
410
+ break;
411
+ }
412
+ if (placement === "top" || placement === "bottom") {
413
+ left = clamp(left, triggerRect.left - tooltipWidth + props.arrowSize + props.arrowBoundaryOffset, triggerRect.left + triggerRect.width - props.arrowSize - props.arrowBoundaryOffset);
414
+ left = clamp(left, containerPadding, viewportWidth - tooltipWidth - containerPadding);
415
+ } else {
416
+ top = clamp(top, triggerRect.top - tooltipHeight + props.arrowSize + props.arrowBoundaryOffset, triggerRect.top + triggerRect.height - props.arrowSize - props.arrowBoundaryOffset);
417
+ top = clamp(top, containerPadding, viewportHeight - tooltipHeight - containerPadding);
418
+ }
419
+ setRenderedPlacement(placement);
420
+ setPositionStyles({
421
+ top: `${Math.floor(top + window.scrollY)}px`,
422
+ left: `${Math.floor(left + window.scrollX)}px`,
423
+ visibility: "visible"
424
+ });
425
+ return true;
426
+ };
427
+ createEffect(() => {
428
+ props.placement;
429
+ props.containerPadding;
430
+ props.crossOffset;
431
+ props.shouldFlip;
432
+ props.offset;
433
+ props.arrowSize;
434
+ props.arrowBoundaryOffset;
435
+ let retryCount = 0;
436
+ const maxRetries = 5;
437
+ let pendingRaf = 0;
438
+ let pendingTimeout = 0;
439
+ const tryUpdatePosition = () => {
440
+ pendingRaf = 0;
441
+ pendingTimeout = 0;
442
+ if (!updatePosition() && retryCount < maxRetries) {
443
+ retryCount++;
444
+ pendingTimeout = window.setTimeout(tryUpdatePosition, 16);
445
+ }
446
+ };
447
+ pendingRaf = requestAnimationFrame(tryUpdatePosition);
448
+ const closeOnScroll = (event) => {
449
+ const trigger = props.triggerRef();
450
+ const target = event.target;
451
+ if (!trigger || target instanceof Node && !target.contains(trigger)) return;
452
+ if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) return;
453
+ props.state.close(true);
454
+ };
455
+ window.addEventListener("scroll", closeOnScroll, true);
456
+ window.addEventListener("resize", updatePosition);
457
+ onCleanup(() => {
458
+ if (pendingRaf) cancelAnimationFrame(pendingRaf);
459
+ if (pendingTimeout) clearTimeout(pendingTimeout);
460
+ window.removeEventListener("scroll", closeOnScroll, true);
461
+ window.removeEventListener("resize", updatePosition);
462
+ });
463
+ });
464
+ const domProps = filterDOMProps(props, { global: true });
465
+ const tooltipId = () => props.contextTooltipProps.id ?? domProps.id;
466
+ const { ref: _ariaRef, ...cleanAriaProps } = ariaTooltipProps;
467
+ const setRef = (el) => {
468
+ tooltipRef = el;
469
+ if (!props.dir) el.dir = getDocumentDirection();
470
+ if (!props.lang) {
471
+ const documentLang = document.documentElement.lang;
472
+ const navigatorLang = typeof navigator !== "undefined" ? navigator.language : "";
473
+ el.lang = documentLang.includes("-") ? documentLang : navigatorLang || documentLang || "en-US";
474
+ }
475
+ props.onTooltipRef(el);
476
+ };
477
+ onCleanup(() => {
478
+ props.onTooltipRef(null);
479
+ });
480
+ return createComponent(OverlayContainer, { get children() {
481
+ var _el$2 = getNextElement(_tmpl$2);
482
+ use(setRef, _el$2);
483
+ spread(_el$2, mergeProps(domProps, cleanAriaProps, {
484
+ get id() {
485
+ return tooltipId();
486
+ },
487
+ "role": "tooltip",
488
+ get ["class"]() {
489
+ return renderProps.class();
490
+ },
491
+ get style() {
492
+ return {
493
+ position: "absolute",
494
+ "z-index": 1e5,
495
+ ...positionStyles(),
496
+ ...renderProps.style()
497
+ };
498
+ },
499
+ get ["data-placement"]() {
500
+ return renderedPlacement();
501
+ },
502
+ get ["data-entering"]() {
503
+ return isEntering() || void 0;
504
+ },
505
+ get ["data-exiting"]() {
506
+ return props.isExiting || void 0;
507
+ }
508
+ }), false, true);
509
+ insert(_el$2, () => renderProps.renderChildren());
510
+ runHydrationEvents();
511
+ return _el$2;
512
+ } });
513
+ }
514
+ function resolvePlacement(placement) {
515
+ if (placement === "start") return getDocumentDirection() === "rtl" ? "right" : "left";
516
+ if (placement === "end") return getDocumentDirection() === "rtl" ? "left" : "right";
517
+ return placement;
518
+ }
519
+ function getDocumentDirection() {
520
+ if (typeof document === "undefined") return "ltr";
521
+ return document.documentElement.dir === "rtl" ? "rtl" : "ltr";
522
+ }
523
+ function maybeFlipPlacement(placement, triggerRect, tooltipWidth, tooltipHeight, viewportWidth, viewportHeight, containerPadding, offset, shouldFlip) {
524
+ if (!shouldFlip) return placement;
525
+ switch (placement) {
526
+ case "top": return triggerRect.top - tooltipHeight - offset < containerPadding ? "bottom" : placement;
527
+ case "bottom": return triggerRect.bottom + tooltipHeight + offset > viewportHeight - containerPadding ? "top" : placement;
528
+ case "left": return triggerRect.left - tooltipWidth - offset < containerPadding ? "right" : placement;
529
+ case "right": return triggerRect.right + tooltipWidth + offset > viewportWidth - containerPadding ? "left" : placement;
530
+ }
531
+ }
532
+ function clamp(value, min, max) {
533
+ if (max < min) return min;
534
+ return Math.min(Math.max(value, min), max);
535
+ }
536
+ //#endregion
537
+ export { Tooltip, TooltipContext, TooltipTrigger, TooltipTriggerStateContext };
538
+
539
+ //# sourceMappingURL=Tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip.js","names":["JSX","ParentComponent","createContext","useContext","createMemo","createSignal","createEffect","onCleanup","Show","isServer","createTooltipTriggerState","TooltipTriggerState","TooltipTriggerProps","StateProps","createTooltip","createTooltipTrigger","AriaProps","OverlayContainer","RenderChildren","ClassNameOrFunction","StyleOrFunction","SlotProps","useRenderProps","filterDOMProps","TooltipRenderProps","isEntering","isExiting","placement","TooltipResolvedPlacement","TooltipPlacement","TooltipTriggerComponentProps","children","Element","containerPadding","crossOffset","shouldFlip","TooltipProps","id","class","style","isOpen","defaultOpen","offset","arrowSize","arrowBoundaryOffset","isDisabled","lang","dir","TooltipTriggerContextValue","state","tooltipProps","setTooltipId","triggerRef","HTMLElement","TooltipTriggerContext","TooltipContext","TooltipTriggerStateContext","TooltipTrigger","props","tooltipId","delay","closeDelay","onOpenChange","triggerProps","trigger","shouldCloseOnPress","context","processChildren","Array","isArray","rest","_$createComponent","TriggerWrapper","ref","el","Provider","value","HTMLAttributes","child","triggerElement","setTriggerElement","wrapperElement","setWrapperElement","HTMLSpanElement","getWrapperEventProps","Record","wrapperProps","eventPropNames","propName","handler","onPointerEnter","onMouseEnter","onPointerLeave","onMouseLeave","element","describedBy","setAttribute","removeAttribute","wrapper","targets","from","Set","filter","Boolean","listeners","EventListener","eventProps","const","eventName","listener","target","addEventListener","push","removeEventListener","getAttribute","handleRef","span","findElementChild","found","findVisibleChild","rect","getBoundingClientRect","width","height","resolveRef","elementChild","visibleChild","immediateChild","requestAnimationFrame","_el$","_$getNextElement","_tmpl$","_$use","_$spread","_$mergeProps","display","_$insert","_$runHydrationEvents","Tooltip","undefined","localState","exitState","setExitState","open","current","tooltipEl","setTooltipEl","HTMLDivElement","animations","getAnimations","length","canceled","Promise","all","map","a","finished","then","s","catch","shouldRender","when","TooltipContent","contextTooltipProps","onTooltipRef","tooltipRef","ariaTooltipProps","positionStyles","setPositionStyles","top","left","visibility","renderedPlacement","setRenderedPlacement","resolvePlacement","setIsEntering","anim","CSSTransition","cancel","values","renderProps","defaultClassName","updatePosition","triggerEl","triggerRect","tooltipWidth","offsetWidth","tooltipHeight","offsetHeight","viewportWidth","window","innerWidth","viewportHeight","innerHeight","maybeFlipPlacement","bottom","right","clamp","Math","floor","scrollY","scrollX","retryCount","maxRetries","pendingRaf","pendingTimeout","tryUpdatePosition","success","setTimeout","closeOnScroll","event","Event","Node","contains","HTMLInputElement","HTMLTextAreaElement","close","cancelAnimationFrame","clearTimeout","domProps","global","_ariaRef","cleanAriaProps","setRef","getDocumentDirection","documentLang","document","documentElement","navigatorLang","navigator","language","includes","_el$2","_tmpl$2","position","data-placement","data-entering","data-exiting","renderChildren","DOMRect","min","max"],"sources":["../src/Tooltip.tsx"],"sourcesContent":["/**\n * Tooltip component for solidaria-components\n *\n * A tooltip displays a description of an element on hover or focus.\n * Port of react-aria-components/src/Tooltip.tsx\n */\n\nimport {\n type JSX,\n type ParentComponent,\n createContext,\n useContext,\n createMemo,\n createSignal,\n createEffect,\n onCleanup,\n Show,\n} from \"solid-js\";\nimport { isServer } from \"solid-js/web\";\nimport {\n createTooltipTriggerState,\n type TooltipTriggerState,\n type TooltipTriggerProps as StateProps,\n} from \"@proyecto-viviana/solid-stately\";\nimport {\n createTooltip,\n createTooltipTrigger,\n type TooltipTriggerProps as AriaProps,\n OverlayContainer,\n} from \"@proyecto-viviana/solidaria\";\nimport {\n type RenderChildren,\n type ClassNameOrFunction,\n type StyleOrFunction,\n type SlotProps,\n useRenderProps,\n filterDOMProps,\n} from \"./utils\";\n\nexport interface TooltipRenderProps {\n /** Whether the tooltip is currently entering (for animations). */\n isEntering: boolean;\n /** Whether the tooltip is currently exiting (for animations). */\n isExiting: boolean;\n /** The placement of the tooltip relative to the trigger. */\n placement: TooltipResolvedPlacement | null;\n}\n\nexport type TooltipPlacement = \"top\" | \"bottom\" | \"left\" | \"right\" | \"start\" | \"end\";\nexport type TooltipResolvedPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface TooltipTriggerComponentProps extends StateProps, AriaProps {\n /** The children of the tooltip trigger (trigger element and tooltip). */\n children: JSX.Element;\n /** The placement of the tooltip relative to the trigger. */\n placement?: TooltipPlacement;\n /** The placement padding between the tooltip and viewport edge. */\n containerPadding?: number;\n /** The additional offset along the cross axis. */\n crossOffset?: number;\n /** Whether the tooltip should flip when there is insufficient room. */\n shouldFlip?: boolean;\n}\n\nexport interface TooltipProps extends SlotProps {\n /** The element id. */\n id?: string;\n /** Custom aria-label for the tooltip. */\n \"aria-label\"?: string;\n /** ID of an element that labels the tooltip. */\n \"aria-labelledby\"?: string;\n /** ID of an element that describes the tooltip. */\n \"aria-describedby\"?: string;\n /** ID of an element that provides details for the tooltip. */\n \"aria-details\"?: string;\n /** The children of the tooltip. A function may be provided to receive render props. */\n children?: RenderChildren<TooltipRenderProps>;\n /** The CSS className for the element. */\n class?: ClassNameOrFunction<TooltipRenderProps>;\n /** The inline style for the element. */\n style?: StyleOrFunction<TooltipRenderProps>;\n /** Whether the tooltip is open (controlled). */\n isOpen?: boolean;\n /** Whether the tooltip is open by default (uncontrolled). */\n defaultOpen?: boolean;\n /** The placement of the tooltip relative to the trigger. */\n placement?: TooltipPlacement;\n /** The placement padding between the tooltip and viewport edge. */\n containerPadding?: number;\n /** The additional offset along the cross axis. */\n crossOffset?: number;\n /** Whether the tooltip should flip when there is insufficient room. */\n shouldFlip?: boolean;\n /** The offset between the tooltip and trigger. */\n offset?: number;\n /** The arrow size used to keep the arrow overlapping the trigger. */\n arrowSize?: number;\n /** The padding between the arrow and tooltip edge. */\n arrowBoundaryOffset?: number;\n /** Whether the tooltip should be disabled. */\n isDisabled?: boolean;\n /** The element language. */\n lang?: string;\n /** The text direction. */\n dir?: \"ltr\" | \"rtl\";\n}\n\ninterface TooltipTriggerContextValue {\n state: TooltipTriggerState;\n tooltipProps: { readonly id: string };\n setTooltipId: (id: string | undefined) => void;\n triggerRef: () => HTMLElement | null | undefined;\n placement: () => TooltipPlacement | undefined;\n containerPadding: () => number | undefined;\n crossOffset: () => number | undefined;\n shouldFlip: () => boolean | undefined;\n isDisabled: () => boolean | undefined;\n}\n\nconst TooltipTriggerContext = createContext<TooltipTriggerContextValue | null>(null);\nexport const TooltipContext = TooltipTriggerContext;\nexport const TooltipTriggerStateContext = createContext<TooltipTriggerState | null>(null);\n\n/**\n * TooltipTrigger wraps around a trigger element and a Tooltip.\n * It handles opening and closing the Tooltip when the user hovers\n * over or focuses the trigger.\n *\n * @example\n * ```tsx\n * <TooltipTrigger>\n * <Button>Hover me</Button>\n * <Tooltip>This is a tooltip</Tooltip>\n * </TooltipTrigger>\n * ```\n */\nexport const TooltipTrigger: ParentComponent<TooltipTriggerComponentProps> = (props) => {\n let triggerRef: HTMLElement | null = null;\n const [tooltipId, setTooltipId] = createSignal<string | undefined>();\n\n const state = createTooltipTriggerState({\n get delay() {\n return props.delay;\n },\n get closeDelay() {\n return props.closeDelay;\n },\n get isOpen() {\n return props.isOpen;\n },\n get defaultOpen() {\n return props.defaultOpen;\n },\n get onOpenChange() {\n return props.onOpenChange;\n },\n });\n\n const { triggerProps, tooltipProps } = createTooltipTrigger(\n {\n get isDisabled() {\n return props.isDisabled;\n },\n get trigger() {\n return props.trigger;\n },\n get shouldCloseOnPress() {\n return props.shouldCloseOnPress;\n },\n get tooltipId() {\n return tooltipId();\n },\n },\n state,\n () => triggerRef,\n );\n\n const context: TooltipTriggerContextValue = {\n state,\n tooltipProps,\n setTooltipId,\n triggerRef: () => triggerRef,\n placement: () => props.placement,\n containerPadding: () => props.containerPadding,\n crossOffset: () => props.crossOffset,\n shouldFlip: () => props.shouldFlip,\n isDisabled: () => props.isDisabled,\n };\n\n const processChildren = () => {\n const children = props.children;\n if (Array.isArray(children)) {\n const [trigger, ...rest] = children;\n return (\n <>\n <TriggerWrapper\n triggerProps={triggerProps}\n ref={(el) => {\n triggerRef = el;\n }}\n >\n {trigger}\n </TriggerWrapper>\n {rest}\n </>\n );\n }\n return children;\n };\n\n return (\n <TooltipTriggerStateContext.Provider value={state}>\n <TooltipTriggerContext.Provider value={context}>\n {processChildren()}\n </TooltipTriggerContext.Provider>\n </TooltipTriggerStateContext.Provider>\n );\n};\n\n/**\n * Wrapper component that spreads trigger props onto its child\n */\nconst TriggerWrapper: ParentComponent<{\n triggerProps: JSX.HTMLAttributes<HTMLElement>;\n ref: (el: HTMLElement) => void;\n}> = (props) => {\n const child = () => props.children as JSX.Element;\n const [triggerElement, setTriggerElement] = createSignal<HTMLElement | null>(null);\n const [wrapperElement, setWrapperElement] = createSignal<HTMLSpanElement | null>(null);\n const getWrapperEventProps = () => {\n const triggerProps = props.triggerProps as Record<string, unknown>;\n const wrapperProps: Record<string, unknown> = {};\n const eventPropNames = [\n \"onFocus\",\n \"onBlur\",\n \"onPointerEnter\",\n \"onPointerLeave\",\n \"onPointerOver\",\n \"onPointerOut\",\n \"onMouseEnter\",\n \"onMouseLeave\",\n \"onTouchStart\",\n \"onPointerDown\",\n \"onKeyDown\",\n ];\n\n for (const propName of eventPropNames) {\n const handler = triggerProps[propName];\n if (typeof handler === \"function\") {\n wrapperProps[propName] = handler;\n }\n }\n\n if (!wrapperProps.onPointerEnter && typeof triggerProps.onMouseEnter === \"function\") {\n wrapperProps.onPointerEnter = triggerProps.onMouseEnter;\n }\n if (!wrapperProps.onPointerLeave && typeof triggerProps.onMouseLeave === \"function\") {\n wrapperProps.onPointerLeave = triggerProps.onMouseLeave;\n }\n\n return wrapperProps as JSX.HTMLAttributes<HTMLSpanElement>;\n };\n\n createEffect(() => {\n const element = triggerElement();\n if (!element) {\n return;\n }\n\n const triggerProps = props.triggerProps as Record<string, unknown>;\n const describedBy = triggerProps[\"aria-describedby\"] as string | undefined;\n if (describedBy) {\n element.setAttribute(\"aria-describedby\", describedBy);\n } else {\n element.removeAttribute(\"aria-describedby\");\n }\n\n const wrapper = wrapperElement();\n const targets = Array.from(new Set([element, wrapper].filter(Boolean))) as HTMLElement[];\n const listeners: Array<[HTMLElement, string, EventListener]> = [];\n const eventProps = [\n [\"onFocus\", \"focus\"],\n [\"onBlur\", \"blur\"],\n [\"onPointerEnter\", \"pointerenter\"],\n [\"onPointerLeave\", \"pointerleave\"],\n [\"onPointerOver\", \"pointerover\"],\n [\"onPointerOut\", \"pointerout\"],\n [\"onMouseEnter\", \"mouseenter\"],\n [\"onMouseLeave\", \"mouseleave\"],\n [\"onTouchStart\", \"touchstart\"],\n [\"onPointerDown\", \"pointerdown\"],\n [\"onKeyDown\", \"keydown\"],\n ] as const;\n\n for (const [propName, eventName] of eventProps) {\n let handler = triggerProps[propName];\n if (!handler && propName === \"onPointerEnter\") {\n handler = triggerProps.onMouseEnter;\n } else if (!handler && propName === \"onPointerLeave\") {\n handler = triggerProps.onMouseLeave;\n }\n if (typeof handler === \"function\") {\n const listener = handler as EventListener;\n for (const target of targets) {\n target.addEventListener(eventName, listener);\n listeners.push([target, eventName, listener]);\n }\n }\n }\n\n onCleanup(() => {\n for (const [target, eventName, listener] of listeners) {\n target.removeEventListener(eventName, listener);\n }\n if (describedBy && element.getAttribute(\"aria-describedby\") === describedBy) {\n element.removeAttribute(\"aria-describedby\");\n }\n });\n });\n\n // We wrap in a span with display:contents to not affect layout.\n // However, display:contents makes getBoundingClientRect return zeros,\n // so we pass a ref callback that finds the first actual element child.\n const handleRef = (span: HTMLSpanElement) => {\n setWrapperElement(span);\n\n const findElementChild = (el: Element): HTMLElement | null => {\n for (const child of el.children) {\n if (child instanceof HTMLElement) {\n return child;\n }\n const found = findElementChild(child);\n if (found) return found;\n }\n return null;\n };\n\n // Find the first element child that has dimensions (not display:contents)\n const findVisibleChild = (el: Element): HTMLElement | null => {\n if (el instanceof HTMLElement) {\n const rect = el.getBoundingClientRect();\n if (rect.width > 0 && rect.height > 0) {\n return el;\n }\n for (const child of el.children) {\n const found = findVisibleChild(child);\n if (found) return found;\n }\n }\n return null;\n };\n\n // Use requestAnimationFrame to ensure children are rendered and have dimensions\n // This is necessary because SolidJS may not have computed child layout yet\n const resolveRef = () => {\n const elementChild = findElementChild(span);\n const visibleChild = findVisibleChild(span);\n setTriggerElement(elementChild ?? visibleChild ?? span);\n props.ref(visibleChild ?? elementChild ?? span);\n };\n\n const elementChild = findElementChild(span);\n if (elementChild) {\n setTriggerElement(elementChild);\n }\n\n const immediateChild = findVisibleChild(span);\n if (immediateChild) {\n setTriggerElement(elementChild ?? immediateChild);\n props.ref(immediateChild);\n } else {\n requestAnimationFrame(resolveRef);\n }\n };\n\n return (\n <span {...getWrapperEventProps()} ref={handleRef} style={{ display: \"contents\" }}>\n {child()}\n </span>\n );\n};\n\n/**\n * A tooltip displays a description of an element on hover or focus.\n *\n * @example\n * ```tsx\n * <TooltipTrigger>\n * <Button>Hover me</Button>\n * <Tooltip>This is helpful information</Tooltip>\n * </TooltipTrigger>\n * ```\n */\nexport function Tooltip(props: TooltipProps): JSX.Element {\n const context = useContext(TooltipTriggerContext);\n\n createEffect(() => {\n context?.setTooltipId(props.id);\n onCleanup(() => {\n context?.setTooltipId(undefined);\n });\n });\n\n const localState = createTooltipTriggerState({\n get isOpen() {\n return props.isOpen;\n },\n get defaultOpen() {\n return props.defaultOpen;\n },\n });\n\n const state = () => context?.state ?? localState;\n const placement = () => props.placement ?? context?.placement() ?? \"top\";\n const containerPadding = () => props.containerPadding ?? context?.containerPadding() ?? 12;\n const crossOffset = () => props.crossOffset ?? context?.crossOffset() ?? 0;\n const shouldFlip = () => props.shouldFlip ?? context?.shouldFlip() ?? true;\n const offset = () => props.offset ?? 9;\n const arrowSize = () => props.arrowSize ?? 0;\n const arrowBoundaryOffset = () => props.arrowBoundaryOffset ?? 0;\n const isDisabled = () => props.isDisabled ?? context?.isDisabled() ?? false;\n\n const isOpen = () => !isDisabled() && state().isOpen();\n\n // Exit animation state machine: 'closed' | 'open' | 'exiting'\n // Keeps the tooltip mounted during exit animation so CSS transitions can play.\n const [exitState, setExitState] = createSignal<\"closed\" | \"open\" | \"exiting\">(\n isOpen() ? \"open\" : \"closed\",\n );\n\n createEffect(() => {\n const open = isOpen();\n const current = exitState();\n if (current === \"open\" && !open) {\n setExitState(\"exiting\");\n } else if ((current === \"closed\" || current === \"exiting\") && open) {\n setExitState(\"open\");\n }\n });\n\n // Signal for the tooltip ref so we can observe exit animations\n const [tooltipEl, setTooltipEl] = createSignal<HTMLDivElement | null>(null);\n\n // When exiting, wait for CSS animations to finish, then set state to closed\n createEffect(() => {\n if (exitState() !== \"exiting\") return;\n const el = tooltipEl();\n if (!el || !(\"getAnimations\" in el)) {\n setExitState(\"closed\");\n return;\n }\n const animations = el.getAnimations();\n if (animations.length === 0) {\n setExitState(\"closed\");\n return;\n }\n let canceled = false;\n Promise.all(animations.map((a) => a.finished))\n .then(() => {\n if (!canceled) setExitState((s) => (s === \"exiting\" ? \"closed\" : s));\n })\n .catch(() => {\n if (!canceled) setExitState((s) => (s === \"exiting\" ? \"closed\" : s));\n });\n onCleanup(() => {\n canceled = true;\n });\n });\n\n const shouldRender = () => isOpen() || exitState() === \"exiting\";\n const isExiting = () => exitState() === \"exiting\";\n\n return (\n <Show when={shouldRender()}>\n <TooltipContent\n {...props}\n state={state()}\n contextTooltipProps={context?.tooltipProps ?? {}}\n placement={placement()}\n containerPadding={containerPadding()}\n crossOffset={crossOffset()}\n shouldFlip={shouldFlip()}\n offset={offset()}\n arrowSize={arrowSize()}\n arrowBoundaryOffset={arrowBoundaryOffset()}\n triggerRef={context?.triggerRef ?? (() => null)}\n isExiting={isExiting()}\n onTooltipRef={setTooltipEl}\n />\n </Show>\n );\n}\n\n/**\n * Internal component that renders the tooltip content\n */\nfunction TooltipContent(\n props: TooltipProps & {\n state: TooltipTriggerState;\n contextTooltipProps: { readonly id?: string };\n placement: TooltipPlacement;\n containerPadding: number;\n crossOffset: number;\n shouldFlip: boolean;\n offset: number;\n arrowSize: number;\n arrowBoundaryOffset: number;\n triggerRef: () => HTMLElement | null | undefined;\n isExiting: boolean;\n onTooltipRef: (el: HTMLDivElement | null) => void;\n },\n): JSX.Element {\n if (isServer) {\n return null as unknown as JSX.Element;\n }\n\n let tooltipRef!: HTMLDivElement;\n const { tooltipProps: ariaTooltipProps } = createTooltip({}, props.state);\n\n // Start visible at 0,0 and update position asynchronously\n // This ensures the tooltip is immediately accessible (for screen readers and tests)\n // while the visual position gets calculated\n const [positionStyles, setPositionStyles] = createSignal({\n top: \"0px\",\n left: \"0px\",\n visibility: \"visible\" as \"hidden\" | \"visible\",\n });\n const [renderedPlacement, setRenderedPlacement] = createSignal<TooltipResolvedPlacement>(\n resolvePlacement(props.placement),\n );\n\n // Enter animation state: starts true on mount, clears after first animation frame.\n // Uses getAnimations() to detect CSS animations/transitions - if none exist (JSDOM,\n // no CSS defined, reduced-motion), clears immediately.\n const [isEntering, setIsEntering] = createSignal(true);\n\n createEffect(() => {\n if (!isEntering()) return;\n if (!tooltipRef || !(\"getAnimations\" in tooltipRef)) {\n setIsEntering(false);\n return;\n }\n // Cancel any premature CSS transitions triggered before layout\n for (const anim of tooltipRef.getAnimations()) {\n if (anim instanceof CSSTransition) {\n anim.cancel();\n }\n }\n const animations = tooltipRef.getAnimations();\n if (animations.length === 0) {\n setIsEntering(false);\n return;\n }\n let canceled = false;\n Promise.all(animations.map((a) => a.finished))\n .then(() => {\n if (!canceled) setIsEntering(false);\n })\n .catch(() => {\n if (!canceled) setIsEntering(false);\n });\n onCleanup(() => {\n canceled = true;\n });\n });\n\n const values = createMemo<TooltipRenderProps>(() => ({\n isEntering: isEntering(),\n isExiting: props.isExiting,\n placement: renderedPlacement(),\n }));\n\n const renderProps = useRenderProps(\n {\n class: props.class,\n style: props.style,\n get children() {\n return props.children;\n },\n defaultClassName: \"solidaria-Tooltip\",\n },\n values,\n );\n\n // Position the overlay in document coordinates, matching React Aria's\n // absolute overlay positioning when the portal container is the document.\n // Returns true if position was successfully updated, false if we need to retry\n const updatePosition = (): boolean => {\n const triggerEl = props.triggerRef();\n if (!triggerEl || !tooltipRef) return false;\n\n const triggerRect = triggerEl.getBoundingClientRect();\n\n // Check if the trigger has valid dimensions (not display:contents or not rendered yet)\n if (triggerRect.width === 0 || triggerRect.height === 0) {\n return false; // Need to retry\n }\n\n // Use offsetWidth/offsetHeight which are more reliable than getBoundingClientRect\n // when the element might be positioned off-screen initially\n const tooltipWidth = tooltipRef.offsetWidth;\n const tooltipHeight = tooltipRef.offsetHeight;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const containerPadding = props.containerPadding;\n const crossOffset = props.crossOffset;\n const placement = maybeFlipPlacement(\n resolvePlacement(props.placement),\n triggerRect,\n tooltipWidth,\n tooltipHeight,\n viewportWidth,\n viewportHeight,\n containerPadding,\n props.offset,\n props.shouldFlip,\n );\n\n let top = 0;\n let left = 0;\n\n switch (placement) {\n case \"top\":\n top = triggerRect.top - tooltipHeight - props.offset;\n left = triggerRect.left + (triggerRect.width - tooltipWidth) / 2 + crossOffset;\n break;\n case \"bottom\":\n top = triggerRect.bottom + props.offset;\n left = triggerRect.left + (triggerRect.width - tooltipWidth) / 2 + crossOffset;\n break;\n case \"left\":\n top = triggerRect.top + (triggerRect.height - tooltipHeight) / 2 + crossOffset;\n left = triggerRect.left - tooltipWidth - props.offset;\n break;\n case \"right\":\n top = triggerRect.top + (triggerRect.height - tooltipHeight) / 2 + crossOffset;\n left = triggerRect.right + props.offset;\n break;\n }\n\n if (placement === \"top\" || placement === \"bottom\") {\n left = clamp(\n left,\n triggerRect.left - tooltipWidth + props.arrowSize + props.arrowBoundaryOffset,\n triggerRect.left + triggerRect.width - props.arrowSize - props.arrowBoundaryOffset,\n );\n left = clamp(left, containerPadding, viewportWidth - tooltipWidth - containerPadding);\n } else {\n top = clamp(\n top,\n triggerRect.top - tooltipHeight + props.arrowSize + props.arrowBoundaryOffset,\n triggerRect.top + triggerRect.height - props.arrowSize - props.arrowBoundaryOffset,\n );\n top = clamp(top, containerPadding, viewportHeight - tooltipHeight - containerPadding);\n }\n setRenderedPlacement(placement);\n setPositionStyles({\n top: `${Math.floor(top + window.scrollY)}px`,\n left: `${Math.floor(left + window.scrollX)}px`,\n visibility: \"visible\",\n });\n\n return true;\n };\n\n // Set up positioning and scroll-close effects. Positioning retries while the\n // trigger ref resolves, and pending rAF/setTimeout IDs are canceled on cleanup.\n createEffect(() => {\n // Track positioning inputs synchronously so updates from controlled route\n // props reschedule measurement even though layout reads happen in rAF.\n props.placement;\n props.containerPadding;\n props.crossOffset;\n props.shouldFlip;\n props.offset;\n props.arrowSize;\n props.arrowBoundaryOffset;\n\n let retryCount = 0;\n const maxRetries = 5;\n let pendingRaf = 0;\n let pendingTimeout = 0;\n\n const tryUpdatePosition = () => {\n pendingRaf = 0;\n pendingTimeout = 0;\n const success = updatePosition();\n if (!success && retryCount < maxRetries) {\n retryCount++;\n pendingTimeout = window.setTimeout(tryUpdatePosition, 16);\n }\n };\n\n pendingRaf = requestAnimationFrame(tryUpdatePosition);\n\n const closeOnScroll = (event: Event) => {\n const trigger = props.triggerRef();\n const target = event.target;\n if (!trigger || (target instanceof Node && !target.contains(trigger))) {\n return;\n }\n if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) {\n return;\n }\n\n props.state.close(true);\n };\n\n window.addEventListener(\"scroll\", closeOnScroll, true);\n window.addEventListener(\"resize\", updatePosition);\n\n onCleanup(() => {\n if (pendingRaf) cancelAnimationFrame(pendingRaf);\n if (pendingTimeout) clearTimeout(pendingTimeout);\n window.removeEventListener(\"scroll\", closeOnScroll, true);\n window.removeEventListener(\"resize\", updatePosition);\n });\n });\n\n const domProps = filterDOMProps(props, { global: true });\n const tooltipId = () => props.contextTooltipProps.id ?? (domProps as { id?: string }).id;\n\n // Extract ref from ariaTooltipProps to avoid type conflicts (SolidJS ref types are element-specific)\n const { ref: _ariaRef, ...cleanAriaProps } = ariaTooltipProps as Record<string, unknown>;\n\n const setRef = (el: HTMLDivElement) => {\n tooltipRef = el;\n if (!props.dir) {\n el.dir = getDocumentDirection();\n }\n if (!props.lang) {\n const documentLang = document.documentElement.lang;\n const navigatorLang = typeof navigator !== \"undefined\" ? navigator.language : \"\";\n el.lang = documentLang.includes(\"-\")\n ? documentLang\n : navigatorLang || documentLang || \"en-US\";\n }\n props.onTooltipRef(el);\n };\n\n onCleanup(() => {\n props.onTooltipRef(null);\n });\n\n return (\n <OverlayContainer>\n <div\n {...domProps}\n {...cleanAriaProps}\n id={tooltipId()}\n role=\"tooltip\"\n ref={setRef}\n class={renderProps.class()}\n style={{\n position: \"absolute\",\n \"z-index\": 100000,\n ...positionStyles(),\n ...renderProps.style(),\n }}\n data-placement={renderedPlacement()}\n data-entering={isEntering() || undefined}\n data-exiting={props.isExiting || undefined}\n >\n {renderProps.renderChildren()}\n </div>\n </OverlayContainer>\n );\n}\n\nfunction resolvePlacement(placement: TooltipPlacement): TooltipResolvedPlacement {\n if (placement === \"start\") {\n return getDocumentDirection() === \"rtl\" ? \"right\" : \"left\";\n }\n if (placement === \"end\") {\n return getDocumentDirection() === \"rtl\" ? \"left\" : \"right\";\n }\n return placement;\n}\n\nfunction getDocumentDirection(): \"ltr\" | \"rtl\" {\n if (typeof document === \"undefined\") {\n return \"ltr\";\n }\n\n return document.documentElement.dir === \"rtl\" ? \"rtl\" : \"ltr\";\n}\n\nfunction maybeFlipPlacement(\n placement: TooltipResolvedPlacement,\n triggerRect: DOMRect,\n tooltipWidth: number,\n tooltipHeight: number,\n viewportWidth: number,\n viewportHeight: number,\n containerPadding: number,\n offset: number,\n shouldFlip: boolean,\n): TooltipResolvedPlacement {\n if (!shouldFlip) {\n return placement;\n }\n\n switch (placement) {\n case \"top\":\n return triggerRect.top - tooltipHeight - offset < containerPadding ? \"bottom\" : placement;\n case \"bottom\":\n return triggerRect.bottom + tooltipHeight + offset > viewportHeight - containerPadding\n ? \"top\"\n : placement;\n case \"left\":\n return triggerRect.left - tooltipWidth - offset < containerPadding ? \"right\" : placement;\n case \"right\":\n return triggerRect.right + tooltipWidth + offset > viewportWidth - containerPadding\n ? \"left\"\n : placement;\n }\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n if (max < min) {\n return min;\n }\n\n return Math.min(Math.max(value, min), max);\n}\n\nexport type { TooltipTriggerState };\n"],"mappings":"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"}