react-restyle-components 0.4.39 → 0.4.41

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 (243) hide show
  1. package/lib/index.js +3 -1
  2. package/lib/src/core-components/index.js +1 -1
  3. package/lib/src/core-components/src/components/Accordion/AccordionSection/Accordion.js +15 -1
  4. package/lib/src/core-components/src/components/Accordion/AccordionSection/AccordionContext.js +6 -1
  5. package/lib/src/core-components/src/components/Accordion/AccordionSection/AccordionSection.js +39 -1
  6. package/lib/src/core-components/src/components/Accordion/AccordionSection/Header.js +39 -1
  7. package/lib/src/core-components/src/components/Accordion/AccordionSection/elements.js +94 -57
  8. package/lib/src/core-components/src/components/Accordion/AccordionSection/hooks/useCurrentAccordionIndex.js +13 -1
  9. package/lib/src/core-components/src/components/Accordion/AccordionSection/index.js +3 -1
  10. package/lib/src/core-components/src/components/Accordion/AccordionSection/types.js +9 -1
  11. package/lib/src/core-components/src/components/Accordion/Collapsible/Collapsible2.component.js +249 -1
  12. package/lib/src/core-components/src/components/Action/types.js +8 -1
  13. package/lib/src/core-components/src/components/AlertBanner/AlertBanner.js +45 -1
  14. package/lib/src/core-components/src/components/AlertBanner/elements.js +120 -45
  15. package/lib/src/core-components/src/components/AlertBanner/index.js +2 -1
  16. package/lib/src/core-components/src/components/AlertBanner/types.js +10 -1
  17. package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-group-by-multiple-select-multiple-fields-display/auto-complete-filter-group-by-multiple-select-multiple-fields-display.component.js +334 -1
  18. package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-multi-select-multi-fields-display-drag-drop/auto-complete-filter-multi-select-multi-fields-display-drag-drop.component.js +229 -1
  19. package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-multi-select-selected-top-display/auto-complete-filter-multi-select-selected-top-display.component.js +174 -1
  20. package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-multiple-select-multiple-fields-display/auto-complete-filter-multiple-select-multiple-fields-display.component.js +129 -2
  21. package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-single-select/auto-complete-filter-single-select.component.js +55 -1
  22. package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-single-select-multiple-fields-display/auto-complete-filter-single-select-multiple-fields-display.component.js +308 -2
  23. package/lib/src/core-components/src/components/AutoComplete/auto-complete-group-by/auto-complete-group-by.component.js +115 -1
  24. package/lib/src/core-components/src/components/AutoComplete/autocomplete/autocomplete.js +442 -2
  25. package/lib/src/core-components/src/components/AutoComplete/index.js +8 -1
  26. package/lib/src/core-components/src/components/Avatar/Avatar.js +148 -14
  27. package/lib/src/core-components/src/components/Badge/Badge.js +25 -2
  28. package/lib/src/core-components/src/components/Badge/InnerBadge/Inline.js +25 -1
  29. package/lib/src/core-components/src/components/Badge/InnerBadge/InnerBadge.js +25 -1
  30. package/lib/src/core-components/src/components/Badge/InnerBadge/elements.js +78 -32
  31. package/lib/src/core-components/src/components/Badge/InnerBadge/index.js +1 -1
  32. package/lib/src/core-components/src/components/Badge/index.js +1 -1
  33. package/lib/src/core-components/src/components/Badge/types.js +5 -1
  34. package/lib/src/core-components/src/components/Breadcrumb/Breadcrumb.js +83 -1
  35. package/lib/src/core-components/src/components/Breadcrumb/elements.js +166 -94
  36. package/lib/src/core-components/src/components/Breadcrumb/index.js +3 -1
  37. package/lib/src/core-components/src/components/Breadcrumb/types.js +3 -1
  38. package/lib/src/core-components/src/components/Button/button.component.js +18 -1
  39. package/lib/src/core-components/src/components/Button/buttonGroup/buttonGroup.component.js +4 -1
  40. package/lib/src/core-components/src/components/Button/index.js +2 -1
  41. package/lib/src/core-components/src/components/Button/types.js +1 -1
  42. package/lib/src/core-components/src/components/Chip/Chip.js +64 -1
  43. package/lib/src/core-components/src/components/Chip/elements.js +148 -48
  44. package/lib/src/core-components/src/components/Chip/index.js +2 -1
  45. package/lib/src/core-components/src/components/Chip/types.js +4 -1
  46. package/lib/src/core-components/src/components/Divider/Divider.js +25 -1
  47. package/lib/src/core-components/src/components/Divider/elements.js +68 -31
  48. package/lib/src/core-components/src/components/Divider/index.js +2 -1
  49. package/lib/src/core-components/src/components/Divider/types.js +4 -1
  50. package/lib/src/core-components/src/components/DynamicGrid/DynamicGrid.js +147 -1
  51. package/lib/src/core-components/src/components/DynamicGrid/GridContainer.js +24 -17
  52. package/lib/src/core-components/src/components/DynamicGrid/elements.js +162 -100
  53. package/lib/src/core-components/src/components/DynamicGrid/index.js +3 -1
  54. package/lib/src/core-components/src/components/DynamicGrid/types.js +28 -1
  55. package/lib/src/core-components/src/components/DynamicGrid/utils.js +193 -1
  56. package/lib/src/core-components/src/components/FormField/FormField.js +103 -1
  57. package/lib/src/core-components/src/components/FormField/components/CheckboxGroupInput.js +37 -1
  58. package/lib/src/core-components/src/components/FormField/components/CheckboxInput.js +8 -1
  59. package/lib/src/core-components/src/components/FormField/components/CssMultilineInput.js +192 -1
  60. package/lib/src/core-components/src/components/FormField/components/DatePickerInput.js +99 -1
  61. package/lib/src/core-components/src/components/FormField/components/DropdownInput.js +70 -1
  62. package/lib/src/core-components/src/components/FormField/components/OtpInput.js +81 -1
  63. package/lib/src/core-components/src/components/FormField/components/PasswordInput.js +40 -1
  64. package/lib/src/core-components/src/components/FormField/components/PinInput.js +75 -1
  65. package/lib/src/core-components/src/components/FormField/components/RadioInput.js +54 -1
  66. package/lib/src/core-components/src/components/FormField/components/TextDropdownInput.js +94 -1
  67. package/lib/src/core-components/src/components/FormField/components/ToggleInput.js +36 -1
  68. package/lib/src/core-components/src/components/FormField/components/index.js +11 -1
  69. package/lib/src/core-components/src/components/FormField/css-properties.js +161 -1
  70. package/lib/src/core-components/src/components/FormField/index.js +2 -1
  71. package/lib/src/core-components/src/components/Icon/Icon.js +79 -1
  72. package/lib/src/core-components/src/components/Icon/index.js +2 -1
  73. package/lib/src/core-components/src/components/Icon/types.js +9 -1
  74. package/lib/src/core-components/src/components/Loader/loader.component.js +215 -2
  75. package/lib/src/core-components/src/components/Masonry/Masonry.js +73 -1
  76. package/lib/src/core-components/src/components/Masonry/elements.js +46 -29
  77. package/lib/src/core-components/src/components/Masonry/hooks.js +100 -1
  78. package/lib/src/core-components/src/components/Masonry/index.js +3 -1
  79. package/lib/src/core-components/src/components/Masonry/types.js +1 -1
  80. package/lib/src/core-components/src/components/Modal/BasicModal/modal.component.js +116 -1
  81. package/lib/src/core-components/src/components/Modal/index.js +2 -1
  82. package/lib/src/core-components/src/components/Modal/modal-confirm/modal-confirm.component.js +147 -1
  83. package/lib/src/core-components/src/components/Picker/color-picker/color-picker.component.js +12 -1
  84. package/lib/src/core-components/src/components/Picker/color-picker-modal/color-picker-modal.component.js +40 -1
  85. package/lib/src/core-components/src/components/Picker/index.js +2 -1
  86. package/lib/src/core-components/src/components/Selection/index.js +4 -1
  87. package/lib/src/core-components/src/components/Selection/multi-select/multi-select.component.js +49 -1
  88. package/lib/src/core-components/src/components/Selection/multi-select-with-field/multi-select-with-field.component.js +58 -1
  89. package/lib/src/core-components/src/components/Selection/multi-selection-dropdown/multi-selection-dropdown.component.js +43 -1
  90. package/lib/src/core-components/src/components/Selection/single-select/single-select.component.js +87 -1
  91. package/lib/src/core-components/src/components/Skeleton/Skeleton.js +51 -1
  92. package/lib/src/core-components/src/components/Skeleton/elements.js +143 -54
  93. package/lib/src/core-components/src/components/Skeleton/index.js +2 -1
  94. package/lib/src/core-components/src/components/Skeleton/types.js +4 -1
  95. package/lib/src/core-components/src/components/SpeedDial/SpeedDial.js +128 -1
  96. package/lib/src/core-components/src/components/SpeedDial/elements.js +132 -62
  97. package/lib/src/core-components/src/components/SpeedDial/index.js +2 -1
  98. package/lib/src/core-components/src/components/SpeedDial/types.js +3 -1
  99. package/lib/src/core-components/src/components/Stepper2/stepper.component.js +139 -1
  100. package/lib/src/core-components/src/components/Switch/Switch.js +26 -1
  101. package/lib/src/core-components/src/components/Switch/elements.js +103 -34
  102. package/lib/src/core-components/src/components/Switch/index.js +2 -1
  103. package/lib/src/core-components/src/components/Switch/types.js +3 -1
  104. package/lib/src/core-components/src/components/Table/Table.js +1357 -1
  105. package/lib/src/core-components/src/components/Table/columnReorder.d.ts +128 -0
  106. package/lib/src/core-components/src/components/Table/columnReorder.js +530 -0
  107. package/lib/src/core-components/src/components/Table/columnResize.d.ts +99 -0
  108. package/lib/src/core-components/src/components/Table/columnResize.js +399 -0
  109. package/lib/src/core-components/src/components/Table/elements.d.ts +9 -1
  110. package/lib/src/core-components/src/components/Table/elements.js +324 -155
  111. package/lib/src/core-components/src/components/Table/filters.js +555 -30
  112. package/lib/src/core-components/src/components/Table/hooks.js +536 -2
  113. package/lib/src/core-components/src/components/Table/index.d.ts +4 -0
  114. package/lib/src/core-components/src/components/Table/index.js +6 -1
  115. package/lib/src/core-components/src/components/Table/types.d.ts +58 -0
  116. package/lib/src/core-components/src/components/Table/types.js +1 -1
  117. package/lib/src/core-components/src/components/Tabs/tabs.component.js +22 -1
  118. package/lib/src/core-components/src/components/Tags1/Tags.component.js +118 -1
  119. package/lib/src/core-components/src/components/Tags1/types.js +20 -1
  120. package/lib/src/core-components/src/components/Timer1/timer.component.js +76 -1
  121. package/lib/src/core-components/src/components/Toast/Toast.js +50 -1
  122. package/lib/src/core-components/src/components/Toast/elements.js +122 -41
  123. package/lib/src/core-components/src/components/Toast/index.js +2 -1
  124. package/lib/src/core-components/src/components/Toast/types.js +9 -1
  125. package/lib/src/core-components/src/components/Tooltip/Tooltip.js +200 -1
  126. package/lib/src/core-components/src/components/Tooltip/elements.js +117 -55
  127. package/lib/src/core-components/src/components/Tooltip/index.js +2 -1
  128. package/lib/src/core-components/src/components/Tooltip/types.js +17 -1
  129. package/lib/src/core-components/src/components/Tooltip/utils.js +140 -1
  130. package/lib/src/core-components/src/components/TreeSelect/TreeSelect.js +303 -1
  131. package/lib/src/core-components/src/components/TreeSelect/elements.js +216 -117
  132. package/lib/src/core-components/src/components/TreeSelect/hooks.js +252 -1
  133. package/lib/src/core-components/src/components/TreeSelect/index.js +3 -1
  134. package/lib/src/core-components/src/components/TreeSelect/types.js +1 -1
  135. package/lib/src/core-components/src/components/ag-grid/AgGrid.d.ts +11 -0
  136. package/lib/src/core-components/src/components/ag-grid/AgGrid.js +733 -0
  137. package/lib/src/core-components/src/components/ag-grid/elements.d.ts +246 -0
  138. package/lib/src/core-components/src/components/ag-grid/elements.js +1156 -0
  139. package/lib/src/core-components/src/components/ag-grid/hooks.d.ts +196 -0
  140. package/lib/src/core-components/src/components/ag-grid/hooks.js +943 -0
  141. package/lib/src/core-components/src/components/ag-grid/index.d.ts +9 -0
  142. package/lib/src/core-components/src/components/ag-grid/index.js +13 -0
  143. package/lib/src/core-components/src/components/ag-grid/types.d.ts +1367 -0
  144. package/lib/src/core-components/src/components/ag-grid/types.js +6 -0
  145. package/lib/src/core-components/src/components/index.d.ts +1 -0
  146. package/lib/src/core-components/src/components/index.js +31 -1
  147. package/lib/src/core-components/src/components/pdf/pdf-images.components.js +7 -1
  148. package/lib/src/core-components/src/components/pdf/pdf-table.components.js +48 -5
  149. package/lib/src/core-components/src/components/pdf/pdf-typography.components.js +70 -1
  150. package/lib/src/core-components/src/components/pdf/pdf-wrapped-view.components.js +50 -1
  151. package/lib/src/core-components/src/core-components/Avatar.js +33 -4
  152. package/lib/src/core-components/src/core-components/CoreButton/CoreButton.js +10 -1
  153. package/lib/src/core-components/src/core-components/CoreButton/elements.js +176 -67
  154. package/lib/src/core-components/src/core-components/CoreButton/index.js +3 -1
  155. package/lib/src/core-components/src/core-components/CoreButton/types.js +6 -1
  156. package/lib/src/core-components/src/core-components/CoreButton/utils.js +12 -1
  157. package/lib/src/core-components/src/core-components/Divider/Divider.js +19 -4
  158. package/lib/src/core-components/src/core-components/Divider/index.js +1 -1
  159. package/lib/src/core-components/src/core-components/SelectionCardStrip/index.js +1 -1
  160. package/lib/src/core-components/src/core-components/SelectionCardStrip/selectionCardStrip.js +33 -10
  161. package/lib/src/core-components/src/core-components/StateLayer.js +5 -3
  162. package/lib/src/core-components/src/core-components/ToggleCore/elements.js +50 -25
  163. package/lib/src/core-components/src/core-components/ToggleCore/index.js +2 -1
  164. package/lib/src/core-components/src/core-components/ToggleCore/toggleCore.js +14 -1
  165. package/lib/src/core-components/src/core-components/atoms/Input/Input.js +22 -1
  166. package/lib/src/core-components/src/core-components/atoms/Label/Label.js +21 -1
  167. package/lib/src/core-components/src/core-components/atoms/Textarea/Textarea.js +19 -1
  168. package/lib/src/core-components/src/core-components/index.js +3 -1
  169. package/lib/src/core-components/src/helpers/constants.js +11 -1
  170. package/lib/src/core-components/src/hooks/index.js +1 -1
  171. package/lib/src/core-components/src/hooks/outside.hook.js +28 -1
  172. package/lib/src/core-components/src/index.js +12 -1
  173. package/lib/src/core-components/src/tc.global.css +16 -3
  174. package/lib/src/core-components/src/tc.module.css +2 -2
  175. package/lib/src/core-components/src/utils/abstracts/breakpoints/index.js +28 -1
  176. package/lib/src/core-components/src/utils/abstracts/colors/index.js +49 -1
  177. package/lib/src/core-components/src/utils/abstracts/index.js +5 -1
  178. package/lib/src/core-components/src/utils/abstracts/space/index.js +26 -1
  179. package/lib/src/core-components/src/utils/abstracts/theme/ThemeBoundary.js +8 -1
  180. package/lib/src/core-components/src/utils/abstracts/theme/default-themes.js +30 -1
  181. package/lib/src/core-components/src/utils/abstracts/theme/index.js +3 -1
  182. package/lib/src/core-components/src/utils/abstracts/theme/theme.js +30 -1
  183. package/lib/src/core-components/src/utils/abstracts/theme/types.js +1 -1
  184. package/lib/src/core-components/src/utils/abstracts/theme/useTheme.js +17 -1
  185. package/lib/src/core-components/src/utils/abstracts/typography/index.js +25 -1
  186. package/lib/src/core-components/src/utils/context/DefaultsProvider.js +8 -1
  187. package/lib/src/core-components/src/utils/context/InternalProvider.js +24 -1
  188. package/lib/src/core-components/src/utils/context/index.js +2 -1
  189. package/lib/src/core-components/src/utils/designTokens.js +125 -1
  190. package/lib/src/core-components/src/utils/helpers/attachSubComponents.js +23 -1
  191. package/lib/src/core-components/src/utils/helpers/flattenChildren.js +11 -1
  192. package/lib/src/core-components/src/utils/helpers/getChildByType.js +3 -1
  193. package/lib/src/core-components/src/utils/helpers/index.js +5 -1
  194. package/lib/src/core-components/src/utils/helpers/isComponentType.js +16 -1
  195. package/lib/src/core-components/src/utils/helpers/separateChildrenByType.js +12 -1
  196. package/lib/src/core-components/src/utils/hooks/index.js +18 -1
  197. package/lib/src/core-components/src/utils/hooks/useClickOutside.js +18 -1
  198. package/lib/src/core-components/src/utils/hooks/useCombinedRefs.js +17 -1
  199. package/lib/src/core-components/src/utils/hooks/useDebouncedCallback.js +12 -1
  200. package/lib/src/core-components/src/utils/hooks/useDebouncedValue.js +20 -1
  201. package/lib/src/core-components/src/utils/hooks/useDeprecation.js +40 -1
  202. package/lib/src/core-components/src/utils/hooks/useDeviceDetect.js +10 -1
  203. package/lib/src/core-components/src/utils/hooks/useDeviceForm.js +24 -1
  204. package/lib/src/core-components/src/utils/hooks/useDisableBodyScroll.js +16 -1
  205. package/lib/src/core-components/src/utils/hooks/useHoverState.js +36 -1
  206. package/lib/src/core-components/src/utils/hooks/useId.js +7 -1
  207. package/lib/src/core-components/src/utils/hooks/useIsBrowser.js +11 -1
  208. package/lib/src/core-components/src/utils/hooks/useMediaQuery.js +16 -1
  209. package/lib/src/core-components/src/utils/hooks/useOverflow.js +22 -1
  210. package/lib/src/core-components/src/utils/hooks/useSafeLayoutEffect.js +5 -1
  211. package/lib/src/core-components/src/utils/hooks/useScrollingUp.js +18 -1
  212. package/lib/src/core-components/src/utils/hooks/useTrapFocus.js +30 -1
  213. package/lib/src/core-components/src/utils/hooks/useWindowDimensions.js +23 -1
  214. package/lib/src/core-components/src/utils/index.js +9 -1
  215. package/lib/src/core-components/src/utils/stories/Wrappers.js +23 -8
  216. package/lib/src/core-components/src/utils/stories/cleanProps.js +5 -1
  217. package/lib/src/core-components/src/utils/stories/index.js +4 -1
  218. package/lib/src/core-components/src/utils/stories/sleep.js +4 -1
  219. package/lib/src/core-components/src/utils/stories/view-ports.js +50 -1
  220. package/lib/src/core-components/src/utils/styling/calcWidthOfColumns.js +5 -1
  221. package/lib/src/core-components/src/utils/styling/createGridContainer.js +12 -6
  222. package/lib/src/core-components/src/utils/styling/createTransition.js +7 -2
  223. package/lib/src/core-components/src/utils/styling/forwardProps.js +10 -1
  224. package/lib/src/core-components/src/utils/styling/index.js +5 -1
  225. package/lib/src/core-components/src/utils/styling/pxToRem.js +6 -1
  226. package/lib/src/core-components/src/utils/testing/getComputedStyle.js +3 -1
  227. package/lib/src/core-components/src/utils/testing/index.js +1 -1
  228. package/lib/src/core-components/src/utils/utility.util.js +14 -1
  229. package/lib/src/core-components/tailwind.config.js +233 -1
  230. package/lib/src/core-hooks/index.js +3 -1
  231. package/lib/src/core-hooks/src/useClickOutside/useClickOutside.hook.js +46 -1
  232. package/lib/src/core-hooks/src/useDebounce/useDebounce.hook.js +30 -1
  233. package/lib/src/core-hooks/src/usePreventEKey/usePreventEKey.hook.js +8 -1
  234. package/lib/src/core-utils/index.js +7 -1
  235. package/lib/src/core-utils/src/calculation/calculation.util.js +89 -1
  236. package/lib/src/core-utils/src/colors/color.util.js +15 -1
  237. package/lib/src/core-utils/src/convert/numberToWords/numToWords.util.js +145 -1
  238. package/lib/src/core-utils/src/convert/typography/camelCaseToTitleCase.util.js +5 -1
  239. package/lib/src/core-utils/src/form-helper/form-helper.util.js +82 -1
  240. package/lib/src/core-utils/src/index.js +7 -1
  241. package/lib/src/core-utils/src/utility/utility.util.js +12 -1
  242. package/lib/src/core-utils/src/uuid/uuid.util.js +8 -1
  243. package/package.json +1 -1
@@ -1 +1,200 @@
1
- "use strict";"use client";import{Fragment as b,jsx as d,jsxs as K}from"react/jsx-runtime";import{forwardRef as ye,useState as y,useRef as E,useCallback as C,useEffect as f,useMemo as M}from"react";import{createPortal as Ee}from"react-dom";import{TooltipTrigger as Ce,TooltipContent as Pe,TooltipArrow as Le,TooltipPortal as ke}from"./elements";import{calculateTooltipPosition as Q,getAlternatePosition as xe,clampToViewport as Ae,sideAlignToPosition as Re}from"./utils";export const Tooltip=ye(function(X,m){const{children:O,content:p,position:P,side:L,align:z="center",variant:N="dark",size:Y="medium",delay:I=200,hideDelay:j=0,offset:Z=8,sideOffset:ee,maxWidth:te=280,showArrow:ne=!0,disabled:B=!1,trigger:h=["hover","focus"],open:W,onOpenChange:g,avoidCollisions:q=!0,portal:oe=!0,animated:re=!0,classNames:k={},styles:x={},className:ie,zIndex:se=9999,ariaLabel:ce,...le}=X,c=E(null),l=E(null),i=E(null),s=E(null),[ue,_]=y(!1),[H,ae]=y({top:-9999,left:-9999}),[S,de]=y("top"),[fe,me]=y(!1);f(()=>{me(!0)},[]);const u=W!==void 0,t=u?W:ue,w=M(()=>P||(L?Re(L,z):"top"),[P,L,z]),A=ee??Z,o=M(()=>Array.isArray(h)?h:[h],[h]),R=C(()=>{if(!c.current||!l.current)return;const e=c.current.getBoundingClientRect(),r=l.current.getBoundingClientRect(),U=window.innerWidth,G=window.innerHeight,T={width:r.width,height:r.height};let J=w,a=Q(w,e,T,A);if(q){const $=xe(w,a,T,U,G);$&&(J=$,a=Q($,e,T,A)),a=Ae(a,T,U,G)}de(J),ae(a)},[w,A,q]),v=C(()=>{B||!p||(s.current&&(clearTimeout(s.current),s.current=null),i.current=setTimeout(()=>{u?g?.(!0):_(!0)},I))},[B,p,I,u,g]),n=C(()=>{i.current&&(clearTimeout(i.current),i.current=null),s.current=setTimeout(()=>{u?g?.(!1):_(!1)},j)},[j,u,g]),pe=C(()=>{t?n():v()},[t,v,n]);f(()=>{if(t){requestAnimationFrame(()=>{requestAnimationFrame(()=>{R()})});const e=()=>{requestAnimationFrame(R)};return window.addEventListener("scroll",e,!0),window.addEventListener("resize",e),()=>{window.removeEventListener("scroll",e,!0),window.removeEventListener("resize",e)}}},[t,R]),f(()=>{if(!t)return;const e=r=>{r.key==="Escape"&&n()};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[t,n]),f(()=>{if(!t||!o.includes("click"))return;const e=r=>{c.current&&!c.current.contains(r.target)&&l.current&&!l.current.contains(r.target)&&n()};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[t,o,n]),f(()=>()=>{i.current&&clearTimeout(i.current),s.current&&clearTimeout(s.current)},[]);const he=o.includes("hover")?v:void 0,ge=o.includes("hover")?n:void 0,we=o.includes("focus")?v:void 0,ve=o.includes("focus")?n:void 0,Te=o.includes("click")?pe:void 0;if(!p)return d(b,{children:O});const V=M(()=>`tooltip-${Math.random().toString(36).substr(2,9)}`,[]),D=t&&K(Pe,{ref:l,role:"tooltip",id:V,"aria-label":ce,$variant:N,$size:Y,$maxWidth:te,$animated:re,$isVisible:t,$position:S,className:k.content,style:{top:H.top,left:H.left,...x.content},children:[p,ne&&d(Le,{$variant:N,$position:S,className:k.arrow,style:x.arrow})]});return K(b,{children:[d(Ce,{ref:e=>{c.current=e,typeof m=="function"?m(e):m&&(m.current=e)},className:ie||k.trigger,style:x.trigger,onMouseEnter:he,onMouseLeave:ge,onFocus:we,onBlur:ve,onClick:Te,"aria-describedby":t?V:void 0,"data-state":t?"open":"closed",...le,children:O}),oe&&fe?Ee(d(ke,{$zIndex:se,children:D}),document.body):D]})});Tooltip.displayName="Tooltip";export const TooltipProvider=({children:F})=>d(b,{children:F});
1
+ 'use client';
2
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { forwardRef, useState, useRef, useCallback, useEffect, useMemo, } from 'react';
4
+ import { createPortal } from 'react-dom';
5
+ import { TooltipTrigger, TooltipContent, TooltipArrow, TooltipPortal } from './elements';
6
+ import { calculateTooltipPosition, getAlternatePosition, clampToViewport, sideAlignToPosition, } from './utils';
7
+ export const Tooltip = forwardRef(function TooltipComponent(props, ref) {
8
+ const { children, content, position: positionProp, side, align = 'center', variant = 'dark', size = 'medium', delay = 200, hideDelay = 0, offset = 8, sideOffset, maxWidth = 280, showArrow = true, disabled = false, trigger = ['hover', 'focus'], open: controlledOpen, onOpenChange, avoidCollisions = true, portal = true, animated = true, classNames = {}, styles = {}, className, zIndex = 9999, ariaLabel, ...rest } = props;
9
+ // Refs
10
+ const triggerRef = useRef(null);
11
+ const tooltipRef = useRef(null);
12
+ const showTimeoutRef = useRef(null);
13
+ const hideTimeoutRef = useRef(null);
14
+ // State
15
+ const [isOpen, setIsOpen] = useState(false);
16
+ const [coords, setCoords] = useState({ top: -9999, left: -9999 });
17
+ const [actualPosition, setActualPosition] = useState('top');
18
+ const [isMounted, setIsMounted] = useState(false);
19
+ // Check if mounted (for SSR)
20
+ useEffect(() => {
21
+ setIsMounted(true);
22
+ }, []);
23
+ // Controlled vs uncontrolled
24
+ const isControlled = controlledOpen !== undefined;
25
+ const open = isControlled ? controlledOpen : isOpen;
26
+ // Determine position from props
27
+ const desiredPosition = useMemo(() => {
28
+ if (positionProp)
29
+ return positionProp;
30
+ if (side)
31
+ return sideAlignToPosition(side, align);
32
+ return 'top';
33
+ }, [positionProp, side, align]);
34
+ // Get final offset
35
+ const finalOffset = sideOffset ?? offset;
36
+ // Trigger modes
37
+ const triggers = useMemo(() => {
38
+ return Array.isArray(trigger) ? trigger : [trigger];
39
+ }, [trigger]);
40
+ // Calculate position
41
+ const updatePosition = useCallback(() => {
42
+ if (!triggerRef.current || !tooltipRef.current)
43
+ return;
44
+ const triggerRect = triggerRef.current.getBoundingClientRect();
45
+ const tooltipRect = tooltipRef.current.getBoundingClientRect();
46
+ const viewportWidth = window.innerWidth;
47
+ const viewportHeight = window.innerHeight;
48
+ const dimensions = {
49
+ width: tooltipRect.width,
50
+ height: tooltipRect.height,
51
+ };
52
+ let newPosition = desiredPosition;
53
+ let newCoords = calculateTooltipPosition(desiredPosition, triggerRect, dimensions, finalOffset);
54
+ // Collision detection
55
+ if (avoidCollisions) {
56
+ const alternatePosition = getAlternatePosition(desiredPosition, newCoords, dimensions, viewportWidth, viewportHeight);
57
+ if (alternatePosition) {
58
+ newPosition = alternatePosition;
59
+ newCoords = calculateTooltipPosition(alternatePosition, triggerRect, dimensions, finalOffset);
60
+ }
61
+ // Clamp to viewport
62
+ newCoords = clampToViewport(newCoords, dimensions, viewportWidth, viewportHeight);
63
+ }
64
+ setActualPosition(newPosition);
65
+ setCoords(newCoords);
66
+ }, [desiredPosition, finalOffset, avoidCollisions]);
67
+ // Show tooltip
68
+ const show = useCallback(() => {
69
+ if (disabled || !content)
70
+ return;
71
+ if (hideTimeoutRef.current) {
72
+ clearTimeout(hideTimeoutRef.current);
73
+ hideTimeoutRef.current = null;
74
+ }
75
+ showTimeoutRef.current = setTimeout(() => {
76
+ if (isControlled) {
77
+ onOpenChange?.(true);
78
+ }
79
+ else {
80
+ setIsOpen(true);
81
+ }
82
+ }, delay);
83
+ }, [disabled, content, delay, isControlled, onOpenChange]);
84
+ // Hide tooltip
85
+ const hide = useCallback(() => {
86
+ if (showTimeoutRef.current) {
87
+ clearTimeout(showTimeoutRef.current);
88
+ showTimeoutRef.current = null;
89
+ }
90
+ hideTimeoutRef.current = setTimeout(() => {
91
+ if (isControlled) {
92
+ onOpenChange?.(false);
93
+ }
94
+ else {
95
+ setIsOpen(false);
96
+ }
97
+ }, hideDelay);
98
+ }, [hideDelay, isControlled, onOpenChange]);
99
+ // Toggle for click trigger
100
+ const toggle = useCallback(() => {
101
+ if (open) {
102
+ hide();
103
+ }
104
+ else {
105
+ show();
106
+ }
107
+ }, [open, show, hide]);
108
+ // Update position when open changes
109
+ useEffect(() => {
110
+ if (open) {
111
+ // Use multiple RAF to ensure DOM is ready
112
+ requestAnimationFrame(() => {
113
+ requestAnimationFrame(() => {
114
+ updatePosition();
115
+ });
116
+ });
117
+ // Update on scroll/resize
118
+ const handleUpdate = () => {
119
+ requestAnimationFrame(updatePosition);
120
+ };
121
+ window.addEventListener('scroll', handleUpdate, true);
122
+ window.addEventListener('resize', handleUpdate);
123
+ return () => {
124
+ window.removeEventListener('scroll', handleUpdate, true);
125
+ window.removeEventListener('resize', handleUpdate);
126
+ };
127
+ }
128
+ }, [open, updatePosition]);
129
+ // Escape key handler
130
+ useEffect(() => {
131
+ if (!open)
132
+ return;
133
+ const handleEscape = (e) => {
134
+ if (e.key === 'Escape') {
135
+ hide();
136
+ }
137
+ };
138
+ document.addEventListener('keydown', handleEscape);
139
+ return () => document.removeEventListener('keydown', handleEscape);
140
+ }, [open, hide]);
141
+ // Click outside handler for click trigger
142
+ useEffect(() => {
143
+ if (!open || !triggers.includes('click'))
144
+ return;
145
+ const handleClickOutside = (e) => {
146
+ if (triggerRef.current &&
147
+ !triggerRef.current.contains(e.target) &&
148
+ tooltipRef.current &&
149
+ !tooltipRef.current.contains(e.target)) {
150
+ hide();
151
+ }
152
+ };
153
+ document.addEventListener('mousedown', handleClickOutside);
154
+ return () => document.removeEventListener('mousedown', handleClickOutside);
155
+ }, [open, triggers, hide]);
156
+ // Cleanup timeouts
157
+ useEffect(() => {
158
+ return () => {
159
+ if (showTimeoutRef.current)
160
+ clearTimeout(showTimeoutRef.current);
161
+ if (hideTimeoutRef.current)
162
+ clearTimeout(hideTimeoutRef.current);
163
+ };
164
+ }, []);
165
+ // Event handlers
166
+ const handleMouseEnter = triggers.includes('hover') ? show : undefined;
167
+ const handleMouseLeave = triggers.includes('hover') ? hide : undefined;
168
+ const handleFocus = triggers.includes('focus') ? show : undefined;
169
+ const handleBlur = triggers.includes('focus') ? hide : undefined;
170
+ const handleClick = triggers.includes('click') ? toggle : undefined;
171
+ // Don't render if no content
172
+ if (!content) {
173
+ return _jsx(_Fragment, { children: children });
174
+ }
175
+ // Generate unique ID for accessibility
176
+ const tooltipId = useMemo(() => `tooltip-${Math.random().toString(36).substr(2, 9)}`, []);
177
+ // Tooltip element
178
+ const tooltipElement = open && (_jsxs(TooltipContent, { ref: tooltipRef, role: "tooltip", id: tooltipId, "aria-label": ariaLabel, "$variant": variant, "$size": size, "$maxWidth": maxWidth, "$animated": animated, "$isVisible": open, "$position": actualPosition, className: classNames.content, style: {
179
+ top: coords.top,
180
+ left: coords.left,
181
+ ...styles.content,
182
+ }, children: [content, showArrow && (_jsx(TooltipArrow, { "$variant": variant, "$position": actualPosition, className: classNames.arrow, style: styles.arrow }))] }));
183
+ return (_jsxs(_Fragment, { children: [_jsx(TooltipTrigger, { ref: (node) => {
184
+ // Handle both refs
185
+ triggerRef.current = node;
186
+ if (typeof ref === 'function') {
187
+ ref(node);
188
+ }
189
+ else if (ref) {
190
+ ref.current = node;
191
+ }
192
+ }, className: className || classNames.trigger, style: styles.trigger, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, onFocus: handleFocus, onBlur: handleBlur, onClick: handleClick, "aria-describedby": open ? tooltipId : undefined, "data-state": open ? 'open' : 'closed', ...rest, children: children }), portal && isMounted
193
+ ? createPortal(_jsx(TooltipPortal, { "$zIndex": zIndex, children: tooltipElement }), document.body)
194
+ : tooltipElement] }));
195
+ });
196
+ Tooltip.displayName = 'Tooltip';
197
+ // Simple provider for compatibility (no longer needed but kept for migration)
198
+ export const TooltipProvider = ({ children }) => {
199
+ return _jsx(_Fragment, { children: children });
200
+ };
@@ -1,4 +1,6 @@
1
- "use strict";import{styled as d,css as o,keyframes as l}from"styled-components";const s=l`
1
+ import { styled, css, keyframes } from 'styled-components';
2
+ // Animations
3
+ const fadeIn = keyframes `
2
4
  from {
3
5
  opacity: 0;
4
6
  transform: scale(0.96);
@@ -7,34 +9,70 @@
7
9
  opacity: 1;
8
10
  transform: scale(1);
9
11
  }
10
- `,e={dark:{bg:"#1f2937",text:"#f9fafb",border:"#374151"},light:{bg:"#ffffff",text:"#1f2937",border:"#e5e7eb"}},a={small:{padding:"4px 8px",fontSize:"12px",borderRadius:"4px"},medium:{padding:"8px 12px",fontSize:"13px",borderRadius:"6px"},large:{padding:"12px 16px",fontSize:"14px",borderRadius:"8px"}},r=6;export const TooltipTrigger=d.span`
12
+ `;
13
+ // Variant colors
14
+ const variantStyles = {
15
+ dark: {
16
+ bg: '#1f2937',
17
+ text: '#f9fafb',
18
+ border: '#374151',
19
+ },
20
+ light: {
21
+ bg: '#ffffff',
22
+ text: '#1f2937',
23
+ border: '#e5e7eb',
24
+ },
25
+ };
26
+ // Size styles
27
+ const sizeStyles = {
28
+ small: {
29
+ padding: '4px 8px',
30
+ fontSize: '12px',
31
+ borderRadius: '4px',
32
+ },
33
+ medium: {
34
+ padding: '8px 12px',
35
+ fontSize: '13px',
36
+ borderRadius: '6px',
37
+ },
38
+ large: {
39
+ padding: '12px 16px',
40
+ fontSize: '14px',
41
+ borderRadius: '8px',
42
+ },
43
+ };
44
+ // Arrow size
45
+ const ARROW_SIZE = 6;
46
+ export const TooltipTrigger = styled.span `
11
47
  display: inline-flex;
12
48
  cursor: default;
13
- `,TooltipPortal=d.div`
49
+ `;
50
+ export const TooltipPortal = styled.div `
14
51
  position: fixed;
15
52
  top: 0;
16
53
  left: 0;
17
54
  width: 0;
18
55
  height: 0;
19
- z-index: ${({$zIndex:t})=>t};
20
- `,TooltipContent=d.div`
56
+ z-index: ${({ $zIndex }) => $zIndex};
57
+ `;
58
+ export const TooltipContent = styled.div `
21
59
  position: fixed;
22
60
  pointer-events: none;
23
61
  box-sizing: border-box;
24
62
 
25
63
  /* Variant */
26
- background: ${({$variant:t})=>e[t].bg};
27
- color: ${({$variant:t})=>e[t].text};
28
- border: 1px solid ${({$variant:t})=>e[t].border};
64
+ background: ${({ $variant }) => variantStyles[$variant].bg};
65
+ color: ${({ $variant }) => variantStyles[$variant].text};
66
+ border: 1px solid ${({ $variant }) => variantStyles[$variant].border};
29
67
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
30
68
 
31
69
  /* Size */
32
- padding: ${({$size:t})=>a[t].padding};
33
- font-size: ${({$size:t})=>a[t].fontSize};
34
- border-radius: ${({$size:t})=>a[t].borderRadius};
70
+ padding: ${({ $size }) => sizeStyles[$size].padding};
71
+ font-size: ${({ $size }) => sizeStyles[$size].fontSize};
72
+ border-radius: ${({ $size }) => sizeStyles[$size].borderRadius};
35
73
 
36
74
  /* Layout */
37
- max-width: ${({$maxWidth:t})=>t?`${t}px`:"280px"};
75
+ max-width: ${({ $maxWidth }) => ($maxWidth ? `${$maxWidth}px` : '280px')};
38
76
  width: max-content;
39
77
  text-align: left;
40
78
  line-height: 1.5;
@@ -43,91 +81,115 @@
43
81
 
44
82
  /* Animation */
45
83
  opacity: 0;
46
- ${({$animated:t,$isVisible:i})=>i&&(t?o`
47
- animation: ${s} 0.15s ease-out forwards;
48
- `:o`
84
+ ${({ $animated, $isVisible }) => $isVisible &&
85
+ ($animated
86
+ ? css `
87
+ animation: ${fadeIn} 0.15s ease-out forwards;
88
+ `
89
+ : css `
49
90
  opacity: 1;
50
91
  `)}
51
92
 
52
93
  /* Accessibility */
53
94
  @media (prefers-reduced-motion: reduce) {
54
95
  animation: none;
55
- opacity: ${({$isVisible:t})=>t?1:0};
96
+ opacity: ${({ $isVisible }) => ($isVisible ? 1 : 0)};
56
97
  }
57
- `,TooltipArrow=d.div`
98
+ `;
99
+ export const TooltipArrow = styled.div `
58
100
  position: absolute;
59
101
  width: 0;
60
102
  height: 0;
61
- border: ${r}px solid transparent;
103
+ border: ${ARROW_SIZE}px solid transparent;
62
104
 
63
105
  /* Position and color based on tooltip position */
64
- ${({$position:t,$variant:i})=>{const p=e[i].bg,n=e[i].border;return t.startsWith("top")?o`
106
+ ${({ $position, $variant }) => {
107
+ const color = variantStyles[$variant].bg;
108
+ const borderColor = variantStyles[$variant].border;
109
+ // Top positions - arrow at bottom
110
+ if ($position.startsWith('top')) {
111
+ return css `
65
112
  top: 100%;
66
- border-top-color: ${p};
113
+ border-top-color: ${color};
67
114
 
68
115
  &::before {
69
116
  content: '';
70
117
  position: absolute;
71
- top: -${r+1}px;
72
- left: -${r}px;
73
- border: ${r}px solid transparent;
74
- border-top-color: ${n};
118
+ top: -${ARROW_SIZE + 1}px;
119
+ left: -${ARROW_SIZE}px;
120
+ border: ${ARROW_SIZE}px solid transparent;
121
+ border-top-color: ${borderColor};
75
122
  z-index: -1;
76
123
  }
77
124
 
78
- ${t==="top"&&o`left: 50%; margin-left: -${r}px;`}
79
- ${t==="top-start"&&o`left: 12px;`}
80
- ${t==="top-end"&&o`right: 12px;`}
81
- `:t.startsWith("bottom")?o`
125
+ ${$position === 'top' && css `left: 50%; margin-left: -${ARROW_SIZE}px;`}
126
+ ${$position === 'top-start' && css `left: 12px;`}
127
+ ${$position === 'top-end' && css `right: 12px;`}
128
+ `;
129
+ }
130
+ // Bottom positions - arrow at top
131
+ if ($position.startsWith('bottom')) {
132
+ return css `
82
133
  bottom: 100%;
83
- border-bottom-color: ${p};
134
+ border-bottom-color: ${color};
84
135
 
85
136
  &::before {
86
137
  content: '';
87
138
  position: absolute;
88
- bottom: -${r+1}px;
89
- left: -${r}px;
90
- border: ${r}px solid transparent;
91
- border-bottom-color: ${n};
139
+ bottom: -${ARROW_SIZE + 1}px;
140
+ left: -${ARROW_SIZE}px;
141
+ border: ${ARROW_SIZE}px solid transparent;
142
+ border-bottom-color: ${borderColor};
92
143
  z-index: -1;
93
144
  }
94
145
 
95
- ${t==="bottom"&&o`left: 50%; margin-left: -${r}px;`}
96
- ${t==="bottom-start"&&o`left: 12px;`}
97
- ${t==="bottom-end"&&o`right: 12px;`}
98
- `:t.startsWith("left")?o`
146
+ ${$position === 'bottom' && css `left: 50%; margin-left: -${ARROW_SIZE}px;`}
147
+ ${$position === 'bottom-start' && css `left: 12px;`}
148
+ ${$position === 'bottom-end' && css `right: 12px;`}
149
+ `;
150
+ }
151
+ // Left positions - arrow at right
152
+ if ($position.startsWith('left')) {
153
+ return css `
99
154
  left: 100%;
100
- border-left-color: ${p};
155
+ border-left-color: ${color};
101
156
 
102
157
  &::before {
103
158
  content: '';
104
159
  position: absolute;
105
- left: -${r-1}px;
106
- top: -${r}px;
107
- border: ${r}px solid transparent;
108
- border-left-color: ${n};
160
+ left: -${ARROW_SIZE - 1}px;
161
+ top: -${ARROW_SIZE}px;
162
+ border: ${ARROW_SIZE}px solid transparent;
163
+ border-left-color: ${borderColor};
109
164
  z-index: -1;
110
165
  }
111
166
 
112
- ${t==="left"&&o`top: 50%; margin-top: -${r}px;`}
113
- ${t==="left-start"&&o`top: 12px;`}
114
- ${t==="left-end"&&o`bottom: 12px;`}
115
- `:t.startsWith("right")?o`
167
+ ${$position === 'left' && css `top: 50%; margin-top: -${ARROW_SIZE}px;`}
168
+ ${$position === 'left-start' && css `top: 12px;`}
169
+ ${$position === 'left-end' && css `bottom: 12px;`}
170
+ `;
171
+ }
172
+ // Right positions - arrow at left
173
+ if ($position.startsWith('right')) {
174
+ return css `
116
175
  right: 100%;
117
- border-right-color: ${p};
176
+ border-right-color: ${color};
118
177
 
119
178
  &::before {
120
179
  content: '';
121
180
  position: absolute;
122
- right: -${r-1}px;
123
- top: -${r}px;
124
- border: ${r}px solid transparent;
125
- border-right-color: ${n};
181
+ right: -${ARROW_SIZE - 1}px;
182
+ top: -${ARROW_SIZE}px;
183
+ border: ${ARROW_SIZE}px solid transparent;
184
+ border-right-color: ${borderColor};
126
185
  z-index: -1;
127
186
  }
128
187
 
129
- ${t==="right"&&o`top: 50%; margin-top: -${r}px;`}
130
- ${t==="right-start"&&o`top: 12px;`}
131
- ${t==="right-end"&&o`bottom: 12px;`}
132
- `:""}}
188
+ ${$position === 'right' && css `top: 50%; margin-top: -${ARROW_SIZE}px;`}
189
+ ${$position === 'right-start' && css `top: 12px;`}
190
+ ${$position === 'right-end' && css `bottom: 12px;`}
191
+ `;
192
+ }
193
+ return '';
194
+ }}
133
195
  `;
@@ -1 +1,2 @@
1
- "use strict";export{Tooltip,TooltipProvider}from"./Tooltip";export*from"./types";
1
+ export { Tooltip, TooltipProvider } from './Tooltip';
2
+ export * from './types';
@@ -1 +1,17 @@
1
- "use strict";export const TOOLTIP_POSITIONS=["top","top-start","top-end","bottom","bottom-start","bottom-end","left","left-start","left-end","right","right-start","right-end"],TOOLTIP_VARIANTS=["dark","light"],TOOLTIP_SIZES=["small","medium","large"],TOOLTIP_TRIGGERS=["hover","click","focus","manual"];
1
+ export const TOOLTIP_POSITIONS = [
2
+ 'top',
3
+ 'top-start',
4
+ 'top-end',
5
+ 'bottom',
6
+ 'bottom-start',
7
+ 'bottom-end',
8
+ 'left',
9
+ 'left-start',
10
+ 'left-end',
11
+ 'right',
12
+ 'right-start',
13
+ 'right-end',
14
+ ];
15
+ export const TOOLTIP_VARIANTS = ['dark', 'light'];
16
+ export const TOOLTIP_SIZES = ['small', 'medium', 'large'];
17
+ export const TOOLTIP_TRIGGERS = ['hover', 'click', 'focus', 'manual'];
@@ -1 +1,140 @@
1
- "use strict";const d=6;export const calculateTooltipPosition=(o,s,p,h=8)=>{const{top:r,left:t,width:a,height:f}=s,{width:n,height:c}=p;let e={top:0,left:0};const l=h+6;switch(o){case"top":e={top:r-c-l,left:t+a/2-n/2};break;case"top-start":e={top:r-c-l,left:t};break;case"top-end":e={top:r-c-l,left:t+a-n};break;case"bottom":e={top:r+f+l,left:t+a/2-n/2};break;case"bottom-start":e={top:r+f+l,left:t};break;case"bottom-end":e={top:r+f+l,left:t+a-n};break;case"left":e={top:r+f/2-c/2,left:t-n-l};break;case"left-start":e={top:r,left:t-n-l};break;case"left-end":e={top:r+f-c,left:t-n-l};break;case"right":e={top:r+f/2-c/2,left:t+a+l};break;case"right-start":e={top:r,left:t+a+l};break;case"right-end":e={top:r+f-c,left:t+a+l};break;default:e=calculateTooltipPosition("top",s,p,h)}return e},getAlternatePosition=(o,s,p,h,r)=>{const{top:t,left:a}=s,{width:f,height:n}=p,c=8,e=a<c,l=a+f>h-c,i=t<c,b=t+n>r-c;return!e&&!l&&!i&&!b?null:o.startsWith("top")&&i?o.replace("top","bottom"):o.startsWith("bottom")&&b?o.replace("bottom","top"):o.startsWith("left")&&e?o.replace("left","right"):o.startsWith("right")&&l?o.replace("right","left"):null},clampToViewport=(o,s,p,h)=>{const{width:r,height:t}=s,a=8;return{top:Math.max(a,Math.min(o.top,h-t-a)),left:Math.max(a,Math.min(o.left,p-r-a))}},sideAlignToPosition=(o,s)=>s==="center"?o:`${o}-${s}`;
1
+ const ARROW_SIZE = 6;
2
+ /**
3
+ * Calculate tooltip position relative to viewport (for fixed positioning)
4
+ */
5
+ export const calculateTooltipPosition = (position, targetRect, tooltipDimensions, offset = 8) => {
6
+ const { top, left, width, height } = targetRect;
7
+ const { width: tooltipWidth, height: tooltipHeight } = tooltipDimensions;
8
+ let coords = { top: 0, left: 0 };
9
+ const totalOffset = offset + ARROW_SIZE;
10
+ switch (position) {
11
+ // Top positions
12
+ case 'top':
13
+ coords = {
14
+ top: top - tooltipHeight - totalOffset,
15
+ left: left + width / 2 - tooltipWidth / 2,
16
+ };
17
+ break;
18
+ case 'top-start':
19
+ coords = {
20
+ top: top - tooltipHeight - totalOffset,
21
+ left: left,
22
+ };
23
+ break;
24
+ case 'top-end':
25
+ coords = {
26
+ top: top - tooltipHeight - totalOffset,
27
+ left: left + width - tooltipWidth,
28
+ };
29
+ break;
30
+ // Bottom positions
31
+ case 'bottom':
32
+ coords = {
33
+ top: top + height + totalOffset,
34
+ left: left + width / 2 - tooltipWidth / 2,
35
+ };
36
+ break;
37
+ case 'bottom-start':
38
+ coords = {
39
+ top: top + height + totalOffset,
40
+ left: left,
41
+ };
42
+ break;
43
+ case 'bottom-end':
44
+ coords = {
45
+ top: top + height + totalOffset,
46
+ left: left + width - tooltipWidth,
47
+ };
48
+ break;
49
+ // Left positions
50
+ case 'left':
51
+ coords = {
52
+ top: top + height / 2 - tooltipHeight / 2,
53
+ left: left - tooltipWidth - totalOffset,
54
+ };
55
+ break;
56
+ case 'left-start':
57
+ coords = {
58
+ top: top,
59
+ left: left - tooltipWidth - totalOffset,
60
+ };
61
+ break;
62
+ case 'left-end':
63
+ coords = {
64
+ top: top + height - tooltipHeight,
65
+ left: left - tooltipWidth - totalOffset,
66
+ };
67
+ break;
68
+ // Right positions
69
+ case 'right':
70
+ coords = {
71
+ top: top + height / 2 - tooltipHeight / 2,
72
+ left: left + width + totalOffset,
73
+ };
74
+ break;
75
+ case 'right-start':
76
+ coords = {
77
+ top: top,
78
+ left: left + width + totalOffset,
79
+ };
80
+ break;
81
+ case 'right-end':
82
+ coords = {
83
+ top: top + height - tooltipHeight,
84
+ left: left + width + totalOffset,
85
+ };
86
+ break;
87
+ default:
88
+ coords = calculateTooltipPosition('top', targetRect, tooltipDimensions, offset);
89
+ }
90
+ return coords;
91
+ };
92
+ /**
93
+ * Get alternate position when collision detected
94
+ */
95
+ export const getAlternatePosition = (position, coords, tooltipDimensions, viewportWidth, viewportHeight) => {
96
+ const { top, left } = coords;
97
+ const { width, height } = tooltipDimensions;
98
+ const padding = 8;
99
+ // Check if current position has collision
100
+ const leftOverflow = left < padding;
101
+ const rightOverflow = left + width > viewportWidth - padding;
102
+ const topOverflow = top < padding;
103
+ const bottomOverflow = top + height > viewportHeight - padding;
104
+ if (!leftOverflow && !rightOverflow && !topOverflow && !bottomOverflow) {
105
+ return null;
106
+ }
107
+ // Determine alternate position
108
+ if (position.startsWith('top') && topOverflow) {
109
+ return position.replace('top', 'bottom');
110
+ }
111
+ if (position.startsWith('bottom') && bottomOverflow) {
112
+ return position.replace('bottom', 'top');
113
+ }
114
+ if (position.startsWith('left') && leftOverflow) {
115
+ return position.replace('left', 'right');
116
+ }
117
+ if (position.startsWith('right') && rightOverflow) {
118
+ return position.replace('right', 'left');
119
+ }
120
+ return null;
121
+ };
122
+ /**
123
+ * Clamp coords within viewport
124
+ */
125
+ export const clampToViewport = (coords, tooltipDimensions, viewportWidth, viewportHeight) => {
126
+ const { width, height } = tooltipDimensions;
127
+ const padding = 8;
128
+ return {
129
+ top: Math.max(padding, Math.min(coords.top, viewportHeight - height - padding)),
130
+ left: Math.max(padding, Math.min(coords.left, viewportWidth - width - padding)),
131
+ };
132
+ };
133
+ /**
134
+ * Convert side + align to position
135
+ */
136
+ export const sideAlignToPosition = (side, align) => {
137
+ if (align === 'center')
138
+ return side;
139
+ return `${side}-${align}`;
140
+ };