@servicetitan/anvil2 1.46.1 → 1.46.2

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 (231) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/{Alert-BNGvfMAV.js → Alert-CPOBY6O5.js} +2 -2
  3. package/dist/{Alert-BNGvfMAV.js.map → Alert-CPOBY6O5.js.map} +1 -1
  4. package/dist/Alert.js +1 -1
  5. package/dist/{Announcement-CoheCP1i.js → Announcement-BvzAEdx8.js} +2 -2
  6. package/dist/{Announcement-CoheCP1i.js.map → Announcement-BvzAEdx8.js.map} +1 -1
  7. package/dist/Announcement.js +1 -1
  8. package/dist/AnvilProvider-C_qRQnE6.js.map +1 -1
  9. package/dist/Avatar-CyGjhToG.js.map +1 -1
  10. package/dist/Avatar-D07f9NH_.js.map +1 -1
  11. package/dist/Badge-DCA9mfc2.js.map +1 -1
  12. package/dist/Breadcrumbs-C4_PEolS.js.map +1 -1
  13. package/dist/{Button-BxFXQ0-n.js → Button-VNQQgZ45.js} +2 -2
  14. package/dist/{Button-BxFXQ0-n.js.map → Button-VNQQgZ45.js.map} +1 -1
  15. package/dist/Button.css +48 -48
  16. package/dist/Button.js +1 -1
  17. package/dist/Button.module-C1g9rrJs.js +25 -0
  18. package/dist/Button.module-C1g9rrJs.js.map +1 -0
  19. package/dist/{ButtonCompound-BF2Q6gGX.js → ButtonCompound-BbPK-Xjj.js} +2 -2
  20. package/dist/{ButtonCompound-BF2Q6gGX.js.map → ButtonCompound-BbPK-Xjj.js.map} +1 -1
  21. package/dist/ButtonCompound.js +1 -1
  22. package/dist/{ButtonLink-CXv65WVV.js → ButtonLink-CqR1F5Wn.js} +3 -3
  23. package/dist/{ButtonLink-CXv65WVV.js.map → ButtonLink-CqR1F5Wn.js.map} +1 -1
  24. package/dist/ButtonLink.js +1 -1
  25. package/dist/{ButtonToggle-pSwg7NvT.js → ButtonToggle-PCeSG-5D.js} +3 -3
  26. package/dist/{ButtonToggle-pSwg7NvT.js.map → ButtonToggle-PCeSG-5D.js.map} +1 -1
  27. package/dist/ButtonToggle.js +1 -1
  28. package/dist/{Calendar-BQ5F2ENO.js → Calendar-X9qUi6Vx.js} +269 -123
  29. package/dist/Calendar-X9qUi6Vx.js.map +1 -0
  30. package/dist/Calendar.js +1 -1
  31. package/dist/Card-vTYeSkxt.js.map +1 -1
  32. package/dist/{Checkbox-DDrmVC-u.js → Checkbox-BDohwHXQ.js} +2 -2
  33. package/dist/{Checkbox-DDrmVC-u.js.map → Checkbox-BDohwHXQ.js.map} +1 -1
  34. package/dist/{Checkbox-Dl4KTwEJ.js → Checkbox-CcYtto5f.js} +2 -2
  35. package/dist/{Checkbox-Dl4KTwEJ.js.map → Checkbox-CcYtto5f.js.map} +1 -1
  36. package/dist/Checkbox.js +2 -2
  37. package/dist/Chip-Bz-vlQ4D.js.map +1 -1
  38. package/dist/{Combobox-B9nesJuc.js → Combobox-DQmW8Tyl.js} +144 -53
  39. package/dist/Combobox-DQmW8Tyl.js.map +1 -0
  40. package/dist/Combobox.js +1 -1
  41. package/dist/{DateField-DXxPsRtf.js → DateField-C43nfkbx.js} +7 -7
  42. package/dist/{DateField-DXxPsRtf.js.map → DateField-C43nfkbx.js.map} +1 -1
  43. package/dist/DateField.js +1 -1
  44. package/dist/{DateFieldRange-Xauviu1w.js → DateFieldRange-g7n5QYww.js} +8 -8
  45. package/dist/{DateFieldRange-Xauviu1w.js.map → DateFieldRange-g7n5QYww.js.map} +1 -1
  46. package/dist/DateFieldRange.js +1 -1
  47. package/dist/{DateFieldSingle-yLnwpVzd.js → DateFieldSingle-D3tneqeG.js} +8 -8
  48. package/dist/{DateFieldSingle-yLnwpVzd.js.map → DateFieldSingle-D3tneqeG.js.map} +1 -1
  49. package/dist/DateFieldSingle.js +1 -1
  50. package/dist/{DateFieldYearless-Ba7HiTiI.js → DateFieldYearless-3JBVj3wn.js} +4 -4
  51. package/dist/{DateFieldYearless-Ba7HiTiI.js.map → DateFieldYearless-3JBVj3wn.js.map} +1 -1
  52. package/dist/DateFieldYearless.js +1 -1
  53. package/dist/{DaysOfTheWeek-BYSYZySH.js → DaysOfTheWeek-RcPgDoM3.js} +4 -4
  54. package/dist/{DaysOfTheWeek-BYSYZySH.js.map → DaysOfTheWeek-RcPgDoM3.js.map} +1 -1
  55. package/dist/DaysOfTheWeek.js +1 -1
  56. package/dist/Details-CF8DImjw.js.map +1 -1
  57. package/dist/{Dialog-CgkrvrQu.js → Dialog-FNJ16gY6.js} +6 -6
  58. package/dist/{Dialog-CgkrvrQu.js.map → Dialog-FNJ16gY6.js.map} +1 -1
  59. package/dist/Dialog.js +1 -1
  60. package/dist/Divider-DJe8kLf2.js.map +1 -1
  61. package/dist/Dnd.js +1 -1
  62. package/dist/DndSort.js +2 -2
  63. package/dist/DndSort.js.map +1 -1
  64. package/dist/{Drawer-CM4ZbAro.js → Drawer-DT31CMRd.js} +6 -6
  65. package/dist/{Drawer-CM4ZbAro.js.map → Drawer-DT31CMRd.js.map} +1 -1
  66. package/dist/Drawer.js +1 -1
  67. package/dist/{DrawerContext-DboTgTmo.js → DrawerContext-D4tWTLVf.js} +27 -10
  68. package/dist/DrawerContext-D4tWTLVf.js.map +1 -0
  69. package/dist/{EditCard-WKzZ2XCz.js → EditCard-CZzL0nx7.js} +2 -2
  70. package/dist/{EditCard-WKzZ2XCz.js.map → EditCard-CZzL0nx7.js.map} +1 -1
  71. package/dist/EditCard.js +1 -1
  72. package/dist/{FieldLabel-BsbTTyom.js → FieldLabel-BP8QK5UR.js} +2 -2
  73. package/dist/{FieldLabel-BsbTTyom.js.map → FieldLabel-BP8QK5UR.js.map} +1 -1
  74. package/dist/FieldLabel.js +1 -1
  75. package/dist/FieldMessage-B7uQ8vmr.js.map +1 -1
  76. package/dist/Flex-BdQMekvA.js.map +1 -1
  77. package/dist/Grid-MGUC698u.js.map +1 -1
  78. package/dist/Helper-BkIDJqgA.js.map +1 -1
  79. package/dist/Icon-D8SPKeO4.js.map +1 -1
  80. package/dist/{InputMask-_F139qFu.js → InputMask-CPuYMcw9.js} +3 -3
  81. package/dist/{InputMask-_F139qFu.js.map → InputMask-CPuYMcw9.js.map} +1 -1
  82. package/dist/InputMask.js +1 -1
  83. package/dist/Layout-CUUb2PVr.js.map +1 -1
  84. package/dist/Link-eRsLWPaQ.js.map +1 -1
  85. package/dist/LinkButton-2lXfrVoU.js.map +1 -1
  86. package/dist/{ListView-pb3rIcze.js → ListView-BJI8BQJ-.js} +2 -2
  87. package/dist/{ListView-pb3rIcze.js.map → ListView-BJI8BQJ-.js.map} +1 -1
  88. package/dist/ListView.js +1 -1
  89. package/dist/Listbox-CUhMbFm2.js.map +1 -1
  90. package/dist/LocalizationContext-UsmB5mnR.js.map +1 -1
  91. package/dist/LocalizationProvider-DEZyjW5d.js.map +1 -1
  92. package/dist/{Menu-DEVZz9xZ.js → Menu-t_11BIhU.js} +3 -3
  93. package/dist/{Menu-DEVZz9xZ.js.map → Menu-t_11BIhU.js.map} +1 -1
  94. package/dist/Menu.js +1 -1
  95. package/dist/{NumberField-CkZZrkYC.js → NumberField-Bjf9Tyvf.js} +6 -6
  96. package/dist/{NumberField-CkZZrkYC.js.map → NumberField-Bjf9Tyvf.js.map} +1 -1
  97. package/dist/NumberField.js +1 -1
  98. package/dist/Overflow.js.map +1 -1
  99. package/dist/{Page-BMDkbDcU.js → Page-BAyXnhz2.js} +9 -9
  100. package/dist/Page-BAyXnhz2.js.map +1 -0
  101. package/dist/Page.js +1 -1
  102. package/dist/{Pagination-BJsCppgW.js → Pagination-DCBic619.js} +47 -23
  103. package/dist/Pagination-DCBic619.js.map +1 -0
  104. package/dist/Pagination.css +6 -6
  105. package/dist/Pagination.js +1 -1
  106. package/dist/{Popover-r26xMIfm.js → Popover-CrksxqKk.js} +11 -5
  107. package/dist/Popover-CrksxqKk.js.map +1 -0
  108. package/dist/Popover.js +1 -1
  109. package/dist/PortalProvider-9lXkQ0xY.js.map +1 -1
  110. package/dist/{ProgressBar-DXcXZEJ2.js → ProgressBar-CgsAW2d8.js} +2 -2
  111. package/dist/{ProgressBar-DXcXZEJ2.js.map → ProgressBar-CgsAW2d8.js.map} +1 -1
  112. package/dist/ProgressBar.js +1 -1
  113. package/dist/{Radio-C89VCMXd.js → Radio-C_rvxw74.js} +2 -2
  114. package/dist/{Radio-C89VCMXd.js.map → Radio-C_rvxw74.js.map} +1 -1
  115. package/dist/Radio.js +2 -2
  116. package/dist/{RadioGroup-C_4buUtG.js → RadioGroup-DxBblSrx.js} +2 -2
  117. package/dist/{RadioGroup-C_4buUtG.js.map → RadioGroup-DxBblSrx.js.map} +1 -1
  118. package/dist/SearchField-Bb0uObwG.js.map +1 -1
  119. package/dist/{SegmentedControl-CsjjV1Dz.js → SegmentedControl-DC4BpdH5.js} +3 -3
  120. package/dist/{SegmentedControl-CsjjV1Dz.js.map → SegmentedControl-DC4BpdH5.js.map} +1 -1
  121. package/dist/SegmentedControl.js +1 -1
  122. package/dist/{SelectCard-BTYZg9TG.js → SelectCard-DunNE9R3.js} +3 -3
  123. package/dist/{SelectCard-BTYZg9TG.js.map → SelectCard-DunNE9R3.js.map} +1 -1
  124. package/dist/SelectCard.js +1 -1
  125. package/dist/{SelectTrigger-f1hvRrSC.js → SelectTrigger-BYysLREL.js} +2 -2
  126. package/dist/{SelectTrigger-f1hvRrSC.js.map → SelectTrigger-BYysLREL.js.map} +1 -1
  127. package/dist/SelectTrigger.js +1 -1
  128. package/dist/{SelectTriggerBase-DP9fmRSo.js → SelectTriggerBase-DqUpJgzk.js} +3 -3
  129. package/dist/{SelectTriggerBase-DP9fmRSo.js.map → SelectTriggerBase-DqUpJgzk.js.map} +1 -1
  130. package/dist/{SideNav-CBAzYyML.js → SideNav-B9AWmF_H.js} +2 -2
  131. package/dist/SideNav-B9AWmF_H.js.map +1 -0
  132. package/dist/SideNav.js +1 -1
  133. package/dist/Skeleton.js.map +1 -1
  134. package/dist/Spinner-wmO8Epw0.js.map +1 -1
  135. package/dist/SrOnly-CTsYSuby.js.map +1 -1
  136. package/dist/{Stepper-D-fOH9TF.js → Stepper-DHTrvfXw.js} +3 -3
  137. package/dist/{Stepper-D-fOH9TF.js.map → Stepper-DHTrvfXw.js.map} +1 -1
  138. package/dist/Stepper.js +1 -1
  139. package/dist/Switch-C2ddZcr9.js.map +1 -1
  140. package/dist/{Tab-wNucMTgo.js → Tab-0zx9hsw8.js} +44 -36
  141. package/dist/Tab-0zx9hsw8.js.map +1 -0
  142. package/dist/Tab.js +1 -1
  143. package/dist/Text-BqvcbXyp.js.map +1 -1
  144. package/dist/{TextField-D8fow9j7.js → TextField-CFWs3lm9.js} +2 -2
  145. package/dist/{TextField-D8fow9j7.js.map → TextField-CFWs3lm9.js.map} +1 -1
  146. package/dist/{TextField-BiHxlzE3.js → TextField-Cge6IRo5.js} +2 -2
  147. package/dist/{TextField-BiHxlzE3.js.map → TextField-Cge6IRo5.js.map} +1 -1
  148. package/dist/TextField.js +1 -1
  149. package/dist/{Textarea-BdVJJlbP.js → Textarea-CXd3NKkW.js} +2 -2
  150. package/dist/{Textarea-BdVJJlbP.js.map → Textarea-CXd3NKkW.js.map} +1 -1
  151. package/dist/Textarea.js +1 -1
  152. package/dist/ThemeProvider-Be3Pvtpz.js.map +1 -1
  153. package/dist/ThemeProviderContext-l52GohYT.js.map +1 -1
  154. package/dist/{TimeField-CmbErrsZ.js → TimeField-4v5aCwiG.js} +345 -355
  155. package/dist/TimeField-4v5aCwiG.js.map +1 -0
  156. package/dist/TimeField.js +1 -1
  157. package/dist/Toast.js +2 -2
  158. package/dist/{Toaster-9cpG_tWR.js → Toaster-D-rNSLTq.js} +17 -17
  159. package/dist/{Toaster-9cpG_tWR.js.map → Toaster-D-rNSLTq.js.map} +1 -1
  160. package/dist/{Toaster-B7zUwJOt.js → Toaster-bON5Xc1P.js} +2 -2
  161. package/dist/{Toaster-B7zUwJOt.js.map → Toaster-bON5Xc1P.js.map} +1 -1
  162. package/dist/{Toolbar-D4zuUFhb.js → Toolbar-B2Jsuptz.js} +14 -14
  163. package/dist/{Toolbar-D4zuUFhb.js.map → Toolbar-B2Jsuptz.js.map} +1 -1
  164. package/dist/Toolbar.js +1 -1
  165. package/dist/{Tooltip-BI3Xs75X.js → Tooltip-CtCLw_vx.js} +8 -2
  166. package/dist/{Tooltip-BI3Xs75X.js.map → Tooltip-CtCLw_vx.js.map} +1 -1
  167. package/dist/Tooltip.js +1 -1
  168. package/dist/TrackingProvider-BtSjkmpM.js.map +1 -1
  169. package/dist/beta.js +1 -1
  170. package/dist/childrenToString-Bz9MqbHb.js.map +1 -1
  171. package/dist/components/Combobox/ComboboxTypes.d.ts +10 -5
  172. package/dist/components/Combobox/internal/ComboboxGroupContext.d.ts +1 -1
  173. package/dist/components/Combobox/internal/useGroups.d.ts +2 -2
  174. package/dist/components/DndSort/internal/test-utils.d.ts +1 -1
  175. package/dist/components/TimeField/TimeField.d.ts +4 -1
  176. package/dist/extends-Bg2s_OKl.js.map +1 -1
  177. package/dist/getActiveElement-BcSyVE7S.js.map +1 -1
  178. package/dist/getKeyboardFocusableElements-QqcABz0D.js.map +1 -1
  179. package/dist/{index-V5Ez2gq_.js → index-DrM3iid4.js} +2 -2
  180. package/dist/{index-V5Ez2gq_.js.map → index-DrM3iid4.js.map} +1 -1
  181. package/dist/index-tZvMCc77.js.map +1 -1
  182. package/dist/{index.esm-D889iexm.js → index.esm-BwMVvxTV.js} +199 -144
  183. package/dist/index.esm-BwMVvxTV.js.map +1 -0
  184. package/dist/index.js +45 -45
  185. package/dist/index.js.map +1 -1
  186. package/dist/makeZeroShortcutPreprocessor-CxsiGTRW.js.map +1 -1
  187. package/dist/{proxy-CreWmH-e.js → proxy-BbFHSE6L.js} +8631 -8680
  188. package/dist/proxy-BbFHSE6L.js.map +1 -0
  189. package/dist/{use-reduced-motion-znCm41qB.js → use-reduced-motion-DSpxmqyT.js} +3 -3
  190. package/dist/use-reduced-motion-DSpxmqyT.js.map +1 -0
  191. package/dist/useAccessibleColor-BYKjkGRg.js.map +1 -1
  192. package/dist/useBreakpoint-Cv5fnZxs.js.map +1 -1
  193. package/dist/{useDateFieldOrchestration-BNJCsRkS.js → useDateFieldOrchestration-DyAc3gPJ.js} +3 -3
  194. package/dist/{useDateFieldOrchestration-BNJCsRkS.js.map → useDateFieldOrchestration-DyAc3gPJ.js.map} +1 -1
  195. package/dist/{useDialogTransitionStates-2NaE_noq.js → useDialogTransitionStates-C1TtiwA_.js} +3 -3
  196. package/dist/{useDialogTransitionStates-2NaE_noq.js.map → useDialogTransitionStates-C1TtiwA_.js.map} +1 -1
  197. package/dist/useFocusWithin-BhhgRXdZ.js.map +1 -1
  198. package/dist/useInfiniteCombobox-WcRgC9p6.js.map +1 -1
  199. package/dist/useIntersectionObserver-BEmMDO3P.js.map +1 -1
  200. package/dist/useLayoutPropsUtil-DjD5IMh0.js.map +1 -1
  201. package/dist/useMergeRefs-Bde85AWI.js.map +1 -1
  202. package/dist/{useOnClickOutside-BHEWMLa9.js → useOnClickOutside-B1ddwORK.js} +5 -2
  203. package/dist/useOnClickOutside-B1ddwORK.js.map +1 -0
  204. package/dist/useOptionallyControlledState-DbDuos5L.js.map +1 -1
  205. package/dist/usePopoverCloseDelayWorkaround-BZcjPkvT.js.map +1 -1
  206. package/dist/{usePopoverSupport-DIjjfodl.js → usePopoverSupport-CWTCDfN2.js} +2 -2
  207. package/dist/{usePopoverSupport-DIjjfodl.js.map → usePopoverSupport-CWTCDfN2.js.map} +1 -1
  208. package/dist/usePrefersColorScheme-_hT7dK7_.js.map +1 -1
  209. package/dist/usePrevious-Bvq-5auG.js.map +1 -1
  210. package/dist/useSize.js.map +1 -1
  211. package/dist/{useSwipe-CULmVQEk.js → useSwipe-Cp-CJxLU.js} +2 -2
  212. package/dist/{useSwipe-CULmVQEk.js.map → useSwipe-Cp-CJxLU.js.map} +1 -1
  213. package/dist/useSwipe.js +1 -1
  214. package/dist/useTrackingContext-DRwDL8DE.js.map +1 -1
  215. package/dist/useTrackingId.js.map +1 -1
  216. package/package.json +12 -18
  217. package/dist/Button.module-pUNSKoVC.js +0 -25
  218. package/dist/Button.module-pUNSKoVC.js.map +0 -1
  219. package/dist/Calendar-BQ5F2ENO.js.map +0 -1
  220. package/dist/Combobox-B9nesJuc.js.map +0 -1
  221. package/dist/DrawerContext-DboTgTmo.js.map +0 -1
  222. package/dist/Page-BMDkbDcU.js.map +0 -1
  223. package/dist/Pagination-BJsCppgW.js.map +0 -1
  224. package/dist/Popover-r26xMIfm.js.map +0 -1
  225. package/dist/SideNav-CBAzYyML.js.map +0 -1
  226. package/dist/Tab-wNucMTgo.js.map +0 -1
  227. package/dist/TimeField-CmbErrsZ.js.map +0 -1
  228. package/dist/index.esm-D889iexm.js.map +0 -1
  229. package/dist/proxy-CreWmH-e.js.map +0 -1
  230. package/dist/use-reduced-motion-znCm41qB.js.map +0 -1
  231. package/dist/useOnClickOutside-BHEWMLa9.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { useEffect } from 'react';
2
- import { u as useOpenCloseTransitionStates } from './useOnClickOutside-BHEWMLa9.js';
2
+ import { u as useOpenCloseTransitionStates } from './useOnClickOutside-B1ddwORK.js';
3
3
 
4
4
  const ATTRIBUTE_NAME_LIST = "data-anv-dialogs";
5
5
  const ATTRIBUTE_NAME_BOOL = "data-anv-dialogs-open";
@@ -53,7 +53,7 @@ const useDialogTransitionStates = (ref, openProp, options = {}) => {
53
53
  onCloseAnimationComplete?.();
54
54
  },
55
55
  durationMs: () => {
56
- if (!ref.current) return 0;
56
+ if (!ref.current || !window) return 0;
57
57
  const duration = window.getComputedStyle(ref.current).animationDuration;
58
58
  return parseFloat(duration) * 1e3;
59
59
  }
@@ -61,4 +61,4 @@ const useDialogTransitionStates = (ref, openProp, options = {}) => {
61
61
  };
62
62
 
63
63
  export { useDialogScrollLock as a, useDialogTransitionStates as u };
64
- //# sourceMappingURL=useDialogTransitionStates-2NaE_noq.js.map
64
+ //# sourceMappingURL=useDialogTransitionStates-C1TtiwA_.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDialogTransitionStates-2NaE_noq.js","sources":["../src/internal/hooks/useDialogScrollLock/useDialogScrollLock.ts","../src/internal/hooks/useDialogTransitionStates/useDialogTransitionStates.ts"],"sourcesContent":["import { useEffect } from \"react\";\n\nconst ATTRIBUTE_NAME_LIST = \"data-anv-dialogs\";\nconst ATTRIBUTE_NAME_BOOL = \"data-anv-dialogs-open\";\n\n/**\n * Props for the useDialogScrollLock hook\n * @property {boolean} open - Whether the dialog is open\n * @property {string} id - Unique identifier for the dialog\n * @property {boolean} [enableScrollChaining] - Whether to enable scroll chaining\n * @property {React.RefObject<HTMLElement>} elementRef - Reference to the dialog element\n */\nexport interface UseDialogScrollLockProps {\n /**\n * Whether the dialog is open\n */\n open: boolean;\n /**\n * Unique identifier for the dialog\n */\n id: string;\n /**\n * Whether to enable scroll chaining\n */\n enableScrollChaining?: boolean;\n /**\n * Reference to the dialog element\n */\n elementRef: React.RefObject<HTMLElement>;\n}\n\n/**\n * Custom hook for managing dialog scroll lock in shadow DOM environments.\n *\n * Features:\n * - Manages scroll lock state for dialogs in shadow DOM\n * - Tracks multiple open dialogs with unique IDs\n * - Prevents scroll chaining when dialogs are open\n * - Automatically cleans up scroll lock on unmount\n * - Supports enabling/disabling scroll chaining\n * - Uses data attributes to track dialog state\n *\n * @param props - Configuration object containing dialog state and element reference\n * @returns void\n */\nexport const useDialogScrollLock = ({\n open,\n id,\n enableScrollChaining,\n elementRef,\n}: UseDialogScrollLockProps) => {\n useEffect(() => {\n if (enableScrollChaining) return () => {};\n const root = elementRef.current?.getRootNode();\n if (!(root instanceof ShadowRoot)) return () => {};\n\n const updateDialogAttributes = (shouldAdd: boolean) => {\n const currentDialogs =\n root.host\n .getAttribute(ATTRIBUTE_NAME_LIST)\n ?.split(\" \")\n .filter(Boolean) ?? [];\n\n const newDialogs = new Set(currentDialogs);\n if (shouldAdd) {\n newDialogs.add(id);\n } else {\n newDialogs.delete(id);\n }\n\n const dialogList = Array.from(newDialogs);\n root.host.setAttribute(ATTRIBUTE_NAME_LIST, dialogList.join(\" \"));\n\n if (dialogList.length > 0) {\n root.host.setAttribute(ATTRIBUTE_NAME_BOOL, \"true\");\n } else {\n root.host.removeAttribute(ATTRIBUTE_NAME_BOOL);\n }\n };\n\n updateDialogAttributes(open);\n\n return () => {\n updateDialogAttributes(false);\n };\n }, [open, id, enableScrollChaining, elementRef]);\n};\n","import { RefObject } from \"react\";\nimport {\n useOpenCloseTransitionStates,\n type OpenCloseTransitionStateEffects,\n} from \"../useOpenCloseTransitionStates\";\n\n/**\n * Effects configuration for dialog transition states\n * @property {() => void} [onOpenAnimationStart] - Callback when opening animation starts\n * @property {() => void} [onCloseAnimationStart] - Callback when closing animation starts\n * @property {() => void} [onOpenAnimationComplete] - Callback when opening animation completes\n * @property {() => void} [onCloseAnimationComplete] - Callback when closing animation completes\n */\n\n/**\n * Custom hook for managing dialog transition states and animations.\n *\n * Features:\n * - Manages dialog open/close transition states\n * - Handles animation timing based on CSS animation duration\n * - Provides callbacks for animation lifecycle events\n * - Supports controlled dialog state management\n * - Automatically handles showModal() and close() calls\n * - Provides utility flags for open/closed states\n *\n * @param ref - The ref to the dialog element\n * @param openProp - The open prop controlling dialog visibility\n * @param options - Additional, optional options including callbacks for animation start, complete, and initialization\n * @returns Object containing dialog state, control functions, and utility flags\n */\n\n/**\n * Effects configuration for dialog transition states\n * @param openProp - The open prop controlling dialog visibility\n * @param options - The effects configuration\n * @returns The dialog transition state\n */\nexport const useDialogTransitionStates = (\n ref: RefObject<HTMLDialogElement>,\n openProp: boolean | undefined,\n options: OpenCloseTransitionStateEffects = {},\n) => {\n const { onOpenAnimationStart, onCloseAnimationComplete } = options;\n return useOpenCloseTransitionStates(openProp, {\n ...options,\n onOpenAnimationStart: () => {\n if (!ref.current) return;\n ref.current.showModal();\n onOpenAnimationStart?.();\n },\n onCloseAnimationComplete: () => {\n if (!ref.current) return;\n ref.current.close();\n onCloseAnimationComplete?.();\n },\n durationMs: () => {\n if (!ref.current) return 0;\n const duration = window.getComputedStyle(ref.current).animationDuration;\n return parseFloat(duration) * 1000;\n },\n });\n};\n"],"names":[],"mappings":";;;AAEA,MAAM,mBAAsB,GAAA,kBAAA;AAC5B,MAAM,mBAAsB,GAAA,uBAAA;AA0CrB,MAAM,sBAAsB,CAAC;AAAA,EAClC,IAAA;AAAA,EACA,EAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAgC,KAAA;AAC9B,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,oBAAA,SAA6B,MAAM;AAAA,KAAC;AACxC,IAAM,MAAA,IAAA,GAAO,UAAW,CAAA,OAAA,EAAS,WAAY,EAAA;AAC7C,IAAA,IAAI,EAAE,IAAA,YAAgB,UAAa,CAAA,EAAA,OAAO,MAAM;AAAA,KAAC;AAEjD,IAAM,MAAA,sBAAA,GAAyB,CAAC,SAAuB,KAAA;AACrD,MAAA,MAAM,cACJ,GAAA,IAAA,CAAK,IACF,CAAA,YAAA,CAAa,mBAAmB,CAAA,EAC/B,KAAM,CAAA,GAAG,CACV,CAAA,MAAA,CAAO,OAAO,CAAA,IAAK,EAAC;AAEzB,MAAM,MAAA,UAAA,GAAa,IAAI,GAAA,CAAI,cAAc,CAAA;AACzC,MAAA,IAAI,SAAW,EAAA;AACb,QAAA,UAAA,CAAW,IAAI,EAAE,CAAA;AAAA,OACZ,MAAA;AACL,QAAA,UAAA,CAAW,OAAO,EAAE,CAAA;AAAA;AAGtB,MAAM,MAAA,UAAA,GAAa,KAAM,CAAA,IAAA,CAAK,UAAU,CAAA;AACxC,MAAA,IAAA,CAAK,KAAK,YAAa,CAAA,mBAAA,EAAqB,UAAW,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA;AAEhE,MAAI,IAAA,UAAA,CAAW,SAAS,CAAG,EAAA;AACzB,QAAK,IAAA,CAAA,IAAA,CAAK,YAAa,CAAA,mBAAA,EAAqB,MAAM,CAAA;AAAA,OAC7C,MAAA;AACL,QAAK,IAAA,CAAA,IAAA,CAAK,gBAAgB,mBAAmB,CAAA;AAAA;AAC/C,KACF;AAEA,IAAA,sBAAA,CAAuB,IAAI,CAAA;AAE3B,IAAA,OAAO,MAAM;AACX,MAAA,sBAAA,CAAuB,KAAK,CAAA;AAAA,KAC9B;AAAA,KACC,CAAC,IAAA,EAAM,EAAI,EAAA,oBAAA,EAAsB,UAAU,CAAC,CAAA;AACjD;;ACjDO,MAAM,4BAA4B,CACvC,GAAA,EACA,QACA,EAAA,OAAA,GAA2C,EACxC,KAAA;AACH,EAAM,MAAA,EAAE,oBAAsB,EAAA,wBAAA,EAA6B,GAAA,OAAA;AAC3D,EAAA,OAAO,6BAA6B,QAAU,EAAA;AAAA,IAC5C,GAAG,OAAA;AAAA,IACH,sBAAsB,MAAM;AAC1B,MAAI,IAAA,CAAC,IAAI,OAAS,EAAA;AAClB,MAAA,GAAA,CAAI,QAAQ,SAAU,EAAA;AACtB,MAAuB,oBAAA,IAAA;AAAA,KACzB;AAAA,IACA,0BAA0B,MAAM;AAC9B,MAAI,IAAA,CAAC,IAAI,OAAS,EAAA;AAClB,MAAA,GAAA,CAAI,QAAQ,KAAM,EAAA;AAClB,MAA2B,wBAAA,IAAA;AAAA,KAC7B;AAAA,IACA,YAAY,MAAM;AAChB,MAAI,IAAA,CAAC,GAAI,CAAA,OAAA,EAAgB,OAAA,CAAA;AACzB,MAAA,MAAM,QAAW,GAAA,MAAA,CAAO,gBAAiB,CAAA,GAAA,CAAI,OAAO,CAAE,CAAA,iBAAA;AACtD,MAAO,OAAA,UAAA,CAAW,QAAQ,CAAI,GAAA,GAAA;AAAA;AAChC,GACD,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"useDialogTransitionStates-C1TtiwA_.js","sources":["../src/internal/hooks/useDialogScrollLock/useDialogScrollLock.ts","../src/internal/hooks/useDialogTransitionStates/useDialogTransitionStates.ts"],"sourcesContent":["import { useEffect } from \"react\";\n\nconst ATTRIBUTE_NAME_LIST = \"data-anv-dialogs\";\nconst ATTRIBUTE_NAME_BOOL = \"data-anv-dialogs-open\";\n\n/**\n * Props for the useDialogScrollLock hook\n * @property {boolean} open - Whether the dialog is open\n * @property {string} id - Unique identifier for the dialog\n * @property {boolean} [enableScrollChaining] - Whether to enable scroll chaining\n * @property {React.RefObject<HTMLElement>} elementRef - Reference to the dialog element\n */\nexport interface UseDialogScrollLockProps {\n /**\n * Whether the dialog is open\n */\n open: boolean;\n /**\n * Unique identifier for the dialog\n */\n id: string;\n /**\n * Whether to enable scroll chaining\n */\n enableScrollChaining?: boolean;\n /**\n * Reference to the dialog element\n */\n elementRef: React.RefObject<HTMLElement>;\n}\n\n/**\n * Custom hook for managing dialog scroll lock in shadow DOM environments.\n *\n * Features:\n * - Manages scroll lock state for dialogs in shadow DOM\n * - Tracks multiple open dialogs with unique IDs\n * - Prevents scroll chaining when dialogs are open\n * - Automatically cleans up scroll lock on unmount\n * - Supports enabling/disabling scroll chaining\n * - Uses data attributes to track dialog state\n *\n * @param props - Configuration object containing dialog state and element reference\n * @returns void\n */\nexport const useDialogScrollLock = ({\n open,\n id,\n enableScrollChaining,\n elementRef,\n}: UseDialogScrollLockProps) => {\n useEffect(() => {\n if (enableScrollChaining) return () => {};\n const root = elementRef.current?.getRootNode();\n if (!(root instanceof ShadowRoot)) return () => {};\n\n const updateDialogAttributes = (shouldAdd: boolean) => {\n const currentDialogs =\n root.host\n .getAttribute(ATTRIBUTE_NAME_LIST)\n ?.split(\" \")\n .filter(Boolean) ?? [];\n\n const newDialogs = new Set(currentDialogs);\n if (shouldAdd) {\n newDialogs.add(id);\n } else {\n newDialogs.delete(id);\n }\n\n const dialogList = Array.from(newDialogs);\n root.host.setAttribute(ATTRIBUTE_NAME_LIST, dialogList.join(\" \"));\n\n if (dialogList.length > 0) {\n root.host.setAttribute(ATTRIBUTE_NAME_BOOL, \"true\");\n } else {\n root.host.removeAttribute(ATTRIBUTE_NAME_BOOL);\n }\n };\n\n updateDialogAttributes(open);\n\n return () => {\n updateDialogAttributes(false);\n };\n }, [open, id, enableScrollChaining, elementRef]);\n};\n","import { RefObject } from \"react\";\nimport {\n useOpenCloseTransitionStates,\n type OpenCloseTransitionStateEffects,\n} from \"../useOpenCloseTransitionStates\";\n\n/**\n * Effects configuration for dialog transition states\n * @property {() => void} [onOpenAnimationStart] - Callback when opening animation starts\n * @property {() => void} [onCloseAnimationStart] - Callback when closing animation starts\n * @property {() => void} [onOpenAnimationComplete] - Callback when opening animation completes\n * @property {() => void} [onCloseAnimationComplete] - Callback when closing animation completes\n */\n\n/**\n * Custom hook for managing dialog transition states and animations.\n *\n * Features:\n * - Manages dialog open/close transition states\n * - Handles animation timing based on CSS animation duration\n * - Provides callbacks for animation lifecycle events\n * - Supports controlled dialog state management\n * - Automatically handles showModal() and close() calls\n * - Provides utility flags for open/closed states\n *\n * @param ref - The ref to the dialog element\n * @param openProp - The open prop controlling dialog visibility\n * @param options - Additional, optional options including callbacks for animation start, complete, and initialization\n * @returns Object containing dialog state, control functions, and utility flags\n */\n\n/**\n * Effects configuration for dialog transition states\n * @param openProp - The open prop controlling dialog visibility\n * @param options - The effects configuration\n * @returns The dialog transition state\n */\nexport const useDialogTransitionStates = (\n ref: RefObject<HTMLDialogElement>,\n openProp: boolean | undefined,\n options: OpenCloseTransitionStateEffects = {},\n) => {\n const { onOpenAnimationStart, onCloseAnimationComplete } = options;\n return useOpenCloseTransitionStates(openProp, {\n ...options,\n onOpenAnimationStart: () => {\n if (!ref.current) return;\n ref.current.showModal();\n onOpenAnimationStart?.();\n },\n onCloseAnimationComplete: () => {\n if (!ref.current) return;\n ref.current.close();\n onCloseAnimationComplete?.();\n },\n durationMs: () => {\n if (!ref.current || !window) return 0;\n const duration = window.getComputedStyle(ref.current).animationDuration;\n return parseFloat(duration) * 1000;\n },\n });\n};\n"],"names":[],"mappings":";;;AAEA,MAAM,mBAAA,GAAsB,kBAAA;AAC5B,MAAM,mBAAA,GAAsB,uBAAA;AA0CrB,MAAM,sBAAsB,CAAC;AAAA,EAClC,IAAA;AAAA,EACA,EAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAA,KAAgC;AAC9B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,oBAAA,SAA6B,MAAM;AAAA,IAAC,CAAA;AACxC,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,OAAA,EAAS,WAAA,EAAY;AAC7C,IAAA,IAAI,EAAE,IAAA,YAAgB,UAAA,CAAA,EAAa,OAAO,MAAM;AAAA,IAAC,CAAA;AAEjD,IAAA,MAAM,sBAAA,GAAyB,CAAC,SAAA,KAAuB;AACrD,MAAA,MAAM,cAAA,GACJ,IAAA,CAAK,IAAA,CACF,YAAA,CAAa,mBAAmB,CAAA,EAC/B,KAAA,CAAM,GAAG,CAAA,CACV,MAAA,CAAO,OAAO,CAAA,IAAK,EAAC;AAEzB,MAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,cAAc,CAAA;AACzC,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,UAAA,CAAW,IAAI,EAAE,CAAA;AAAA,MACnB,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,OAAO,EAAE,CAAA;AAAA,MACtB;AAEA,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AACxC,MAAA,IAAA,CAAK,KAAK,YAAA,CAAa,mBAAA,EAAqB,UAAA,CAAW,IAAA,CAAK,GAAG,CAAC,CAAA;AAEhE,MAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,QAAA,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,mBAAA,EAAqB,MAAM,CAAA;AAAA,MACpD,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,mBAAmB,CAAA;AAAA,MAC/C;AAAA,IACF,CAAA;AAEA,IAAA,sBAAA,CAAuB,IAAI,CAAA;AAE3B,IAAA,OAAO,MAAM;AACX,MAAA,sBAAA,CAAuB,KAAK,CAAA;AAAA,IAC9B,CAAA;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,EAAA,EAAI,oBAAA,EAAsB,UAAU,CAAC,CAAA;AACjD;;ACjDO,MAAM,4BAA4B,CACvC,GAAA,EACA,QAAA,EACA,OAAA,GAA2C,EAAC,KACzC;AACH,EAAA,MAAM,EAAE,oBAAA,EAAsB,wBAAA,EAAyB,GAAI,OAAA;AAC3D,EAAA,OAAO,6BAA6B,QAAA,EAAU;AAAA,IAC5C,GAAG,OAAA;AAAA,IACH,sBAAsB,MAAM;AAC1B,MAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAClB,MAAA,GAAA,CAAI,QAAQ,SAAA,EAAU;AACtB,MAAA,oBAAA,IAAuB;AAAA,IACzB,CAAA;AAAA,IACA,0BAA0B,MAAM;AAC9B,MAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAClB,MAAA,GAAA,CAAI,QAAQ,KAAA,EAAM;AAClB,MAAA,wBAAA,IAA2B;AAAA,IAC7B,CAAA;AAAA,IACA,YAAY,MAAM;AAChB,MAAA,IAAI,CAAC,GAAA,CAAI,OAAA,IAAW,CAAC,QAAQ,OAAO,CAAA;AACpC,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,gBAAA,CAAiB,GAAA,CAAI,OAAO,CAAA,CAAE,iBAAA;AACtD,MAAA,OAAO,UAAA,CAAW,QAAQ,CAAA,GAAI,GAAA;AAAA,IAChC;AAAA,GACD,CAAA;AACH;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useFocusWithin-BhhgRXdZ.js","sources":["../src/internal/hooks/useFocusWithin/useFocusWithin.ts"],"sourcesContent":["import { FocusEventHandler, useRef } from \"react\";\nexport interface UseFocusWithinOptions {\n onFocus?: (event: React.FocusEvent) => void;\n onBlur?: (event: React.FocusEvent) => void;\n}\n\nexport interface UseFocusWithinReturnValue<\n T extends HTMLElement = HTMLElement,\n> {\n props: {\n onFocus: FocusEventHandler<T>;\n onBlur: FocusEventHandler<T>;\n };\n}\n\n/**\n * Custom hook for tracking focus state within a DOM element.\n *\n * @param options Configuration options for the hook\n * @param options.onFocus Optional callback when focus enters the element\n * @param options.onBlur Optional callback when focus leaves the element\n * @returns Object containing props for the element\n *\n * @example\n * const { props } = useFocusWithin({\n * onFocus: () => console.log('Focus entered'),\n * onBlur: () => console.log('Focus left')\n * });\n *\n * return <div {...props}>Content</div>;\n */\nexport function useFocusWithin<T extends HTMLElement = any>({\n onBlur,\n onFocus,\n}: UseFocusWithinOptions = {}): UseFocusWithinReturnValue<T> {\n const isFocusedRef = useRef(false);\n\n const handleFocus: FocusEventHandler<T> = (event) => {\n if (!isFocusedRef.current) {\n isFocusedRef.current = true;\n onFocus?.(event);\n }\n };\n\n const handleBlur: FocusEventHandler<T> = (event) => {\n if (isFocusedRef.current && !containsRelatedTarget(event)) {\n isFocusedRef.current = false;\n onBlur?.(event);\n }\n };\n\n return {\n props: { onFocus: handleFocus, onBlur: handleBlur },\n };\n}\n\nfunction containsRelatedTarget(event: React.FocusEvent) {\n if (\n event.currentTarget instanceof HTMLElement &&\n event.relatedTarget instanceof HTMLElement\n ) {\n return event.currentTarget.contains(event.relatedTarget);\n }\n\n return false;\n}\n"],"names":[],"mappings":";;AA+BO,SAAS,cAA4C,CAAA;AAAA,EAC1D,MAAA;AAAA,EACA;AACF,CAAA,GAA2B,EAAkC,EAAA;AAC3D,EAAM,MAAA,YAAA,GAAe,OAAO,KAAK,CAAA;AAEjC,EAAM,MAAA,WAAA,GAAoC,CAAC,KAAU,KAAA;AACnD,IAAI,IAAA,CAAC,aAAa,OAAS,EAAA;AACzB,MAAA,YAAA,CAAa,OAAU,GAAA,IAAA;AACvB,MAAA,OAAA,GAAU,KAAK,CAAA;AAAA;AACjB,GACF;AAEA,EAAM,MAAA,UAAA,GAAmC,CAAC,KAAU,KAAA;AAClD,IAAA,IAAI,YAAa,CAAA,OAAA,IAAW,CAAC,qBAAA,CAAsB,KAAK,CAAG,EAAA;AACzD,MAAA,YAAA,CAAa,OAAU,GAAA,KAAA;AACvB,MAAA,MAAA,GAAS,KAAK,CAAA;AAAA;AAChB,GACF;AAEA,EAAO,OAAA;AAAA,IACL,KAAO,EAAA,EAAE,OAAS,EAAA,WAAA,EAAa,QAAQ,UAAW;AAAA,GACpD;AACF;AAEA,SAAS,sBAAsB,KAAyB,EAAA;AACtD,EAAA,IACE,KAAM,CAAA,aAAA,YAAyB,WAC/B,IAAA,KAAA,CAAM,yBAAyB,WAC/B,EAAA;AACA,IAAA,OAAO,KAAM,CAAA,aAAA,CAAc,QAAS,CAAA,KAAA,CAAM,aAAa,CAAA;AAAA;AAGzD,EAAO,OAAA,KAAA;AACT;;;;"}
1
+ {"version":3,"file":"useFocusWithin-BhhgRXdZ.js","sources":["../src/internal/hooks/useFocusWithin/useFocusWithin.ts"],"sourcesContent":["import { FocusEventHandler, useRef } from \"react\";\nexport interface UseFocusWithinOptions {\n onFocus?: (event: React.FocusEvent) => void;\n onBlur?: (event: React.FocusEvent) => void;\n}\n\nexport interface UseFocusWithinReturnValue<\n T extends HTMLElement = HTMLElement,\n> {\n props: {\n onFocus: FocusEventHandler<T>;\n onBlur: FocusEventHandler<T>;\n };\n}\n\n/**\n * Custom hook for tracking focus state within a DOM element.\n *\n * @param options Configuration options for the hook\n * @param options.onFocus Optional callback when focus enters the element\n * @param options.onBlur Optional callback when focus leaves the element\n * @returns Object containing props for the element\n *\n * @example\n * const { props } = useFocusWithin({\n * onFocus: () => console.log('Focus entered'),\n * onBlur: () => console.log('Focus left')\n * });\n *\n * return <div {...props}>Content</div>;\n */\nexport function useFocusWithin<T extends HTMLElement = any>({\n onBlur,\n onFocus,\n}: UseFocusWithinOptions = {}): UseFocusWithinReturnValue<T> {\n const isFocusedRef = useRef(false);\n\n const handleFocus: FocusEventHandler<T> = (event) => {\n if (!isFocusedRef.current) {\n isFocusedRef.current = true;\n onFocus?.(event);\n }\n };\n\n const handleBlur: FocusEventHandler<T> = (event) => {\n if (isFocusedRef.current && !containsRelatedTarget(event)) {\n isFocusedRef.current = false;\n onBlur?.(event);\n }\n };\n\n return {\n props: { onFocus: handleFocus, onBlur: handleBlur },\n };\n}\n\nfunction containsRelatedTarget(event: React.FocusEvent) {\n if (\n event.currentTarget instanceof HTMLElement &&\n event.relatedTarget instanceof HTMLElement\n ) {\n return event.currentTarget.contains(event.relatedTarget);\n }\n\n return false;\n}\n"],"names":[],"mappings":";;AA+BO,SAAS,cAAA,CAA4C;AAAA,EAC1D,MAAA;AAAA,EACA;AACF,CAAA,GAA2B,EAAC,EAAiC;AAC3D,EAAA,MAAM,YAAA,GAAe,OAAO,KAAK,CAAA;AAEjC,EAAA,MAAM,WAAA,GAAoC,CAAC,KAAA,KAAU;AACnD,IAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACzB,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,MAAA,OAAA,GAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAA,GAAmC,CAAC,KAAA,KAAU;AAClD,IAAA,IAAI,YAAA,CAAa,OAAA,IAAW,CAAC,qBAAA,CAAsB,KAAK,CAAA,EAAG;AACzD,MAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,MAAA,MAAA,GAAS,KAAK,CAAA;AAAA,IAChB;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,EAAE,OAAA,EAAS,WAAA,EAAa,QAAQ,UAAA;AAAW,GACpD;AACF;AAEA,SAAS,sBAAsB,KAAA,EAAyB;AACtD,EAAA,IACE,KAAA,CAAM,aAAA,YAAyB,WAAA,IAC/B,KAAA,CAAM,yBAAyB,WAAA,EAC/B;AACA,IAAA,OAAO,KAAA,CAAM,aAAA,CAAc,QAAA,CAAS,KAAA,CAAM,aAAa,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,KAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useInfiniteCombobox-WcRgC9p6.js","sources":["../src/components/Combobox/useInfiniteCombobox.ts"],"sourcesContent":["import {\n useState,\n useEffect,\n useLayoutEffect,\n useRef,\n useDeferredValue,\n type UIEvent,\n useCallback,\n} from \"react\";\nimport { UseInfiniteComboboxProps, type ComboboxProps } from \"./ComboboxTypes\";\n\nconst SCROLL_THRESHOLD = 0.64; // arbitrary number\n\n/**\n * Hook for implementing infinite scroll functionality in combobox components.\n *\n * Features:\n * - Automatic pagination with scroll-based loading\n * - Configurable query triggers (input change, selection change, scroll)\n * - Debounced query execution to prevent excessive API calls\n * - Automatic retry logic with exponential backoff\n * - Support for both single and multiple selection modes\n * - Customizable scroll threshold for triggering new queries\n * - Loading state management with deferred updates\n * - Automatic detection of pagination end\n * - Support for initial items or query-based initialization\n *\n * @param options Configuration options for the infinite combobox\n * @returns Object containing comboboxProps and contentProps for use with Combobox component\n *\n * @example\n * const { comboboxProps, contentProps } = useInfiniteCombobox({\n * initialItems: [],\n * initialPage: 0,\n * initialLoading: true,\n * query: async ({ page, inputValue, selectedItems }) => {\n * return await fetchItems({\n * page,\n * pageSize: 25,\n * searchTerm: inputValue,\n * excludeIds: selectedItems.map(item => item.id),\n * });\n * },\n * });\n *\n * return (\n * <Combobox {...comboboxProps}>\n * <Combobox.SearchField label=\"Search items\" />\n * <Combobox.Content {...contentProps}>\n * {({ items }) => (\n * <Combobox.List>\n * {items.map((item, i) => (\n * <Combobox.Item key={item.id} item={item} index={i}>\n * {item.name}\n * </Combobox.Item>\n * ))}\n * </Combobox.List>\n * )}\n * </Combobox.Content>\n * </Combobox>\n * );\n */\nexport function useInfiniteCombobox<Item = any>({\n query,\n queryInitialItems,\n initialItems = [],\n initialPage = 0,\n initialLoading = false,\n initialInputValue,\n defaultInputValue,\n initialSelectedItem,\n defaultSelectedItem,\n initialSelectedItems,\n defaultSelectedItems,\n updateOnInputValueChange = true,\n updateOnSelectedItemChange = true,\n updateOnSelectedItemsChange = true,\n queryOnFirstRender = false,\n shouldTriggerQuery: shouldTriggerQueryProp,\n}: UseInfiniteComboboxProps<Item>) {\n const [items, setItems] = useState(initialItems);\n const deferredItems = useDeferredValue(items);\n const [page, setPage] = useState(initialPage);\n const [loading, setLoading] = useState(initialLoading);\n const deferredLoading = useDeferredValue(loading);\n const [inputValue, setInputValue] = useState(\n initialInputValue ?? defaultInputValue ?? \"\",\n );\n const [selectedItem, setSelectedItem] = useState<Item | null>(\n initialSelectedItem ?? defaultSelectedItem ?? null,\n );\n const [selectedItems, setSelectedItems] = useState<Item[]>(\n initialSelectedItems ?? defaultSelectedItems ?? [],\n );\n\n const scrollerRef = useRef<HTMLDivElement>(null);\n\n const defaultShouldTriggerQuery = (element: EventTarget & HTMLElement) => {\n const totalScrollHeight = element.scrollHeight - element.clientHeight;\n return element.scrollTop / totalScrollHeight > SCROLL_THRESHOLD;\n };\n\n // using both state and ref here since the state will be \"behind\" the ref\n // if another query has been triggered while the current one is in flight\n const [triggerQueryCount, setTriggerQueryCount] = useState(0);\n const triggerQueryCountRef = useRef(0);\n const triggerQuery = () => {\n setTriggerQueryCount((x) => x + 1);\n triggerQueryCountRef.current += 1;\n };\n\n const [done, setDone] = useState(false);\n\n const firstRenderRef = useRef(true);\n const scrollTimeoutRef = useRef(false);\n\n // using a similar state/ref idea for managing loading as well, since we\n // need to know immediately if queries are in flight, but state won't be\n // updated in the onScroll handler fast enough\n const loadingRef = useRef(false);\n const setLoadingStateAndRef = (isLoading: boolean) => {\n setLoading(isLoading);\n loadingRef.current = isLoading;\n };\n\n const queryRetryCountRef = useRef(0);\n\n useEffect(() => {\n if (firstRenderRef.current && queryInitialItems) {\n setItems(queryInitialItems());\n }\n\n // don't run on initial render unless we explicitly choose to\n if (firstRenderRef.current && !queryOnFirstRender) {\n firstRenderRef.current = false;\n return;\n }\n\n setLoadingStateAndRef(true);\n\n // using a short debounce delay to batch updates\n const timeoutID = setTimeout(() => {\n // if this query is outdated, don't call it\n if (triggerQueryCount < triggerQueryCountRef.current) return;\n\n query({\n page,\n inputValue,\n selectedItem,\n selectedItems,\n })\n .then((res) => {\n queryRetryCountRef.current = 0;\n\n // if this query is outdated, throw away it's results\n if (triggerQueryCount < triggerQueryCountRef.current) return;\n\n setLoadingStateAndRef(false);\n setPage((x) => x + 1);\n\n // if the result is nullish or empty\n // assume we've reached the end of the pagination\n if (res == null || (page > 0 && res.length === 0)) {\n setDone(true);\n } else if (page === 0) {\n setItems(() => [...res]);\n } else {\n setItems((prevItems) => [...prevItems, ...res]);\n }\n })\n .catch(() => {\n // if we fail, retry up to 8 times with exponential back-off\n queryRetryCountRef.current += 1;\n\n if (queryRetryCountRef.current > 7) {\n queryRetryCountRef.current = 0;\n return;\n } else {\n setTimeout(\n () => {\n triggerQuery();\n },\n 2 ** queryRetryCountRef.current * 160,\n );\n }\n });\n }, 160);\n\n return () => {\n clearTimeout(timeoutID);\n };\n\n // only re-query when we manually call triggerQuery\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [triggerQueryCount]);\n\n // if the popover isn't scrollable, keep firing more queries\n useLayoutEffect(() => {\n setTimeout(() => {\n if (\n scrollerRef.current &&\n scrollerRef.current.scrollHeight > 0 &&\n scrollerRef.current.clientHeight > 0 &&\n scrollerRef.current.scrollHeight <= scrollerRef.current.clientHeight\n ) {\n triggerQuery();\n }\n }, 160);\n }, [items]);\n\n // making this separate variable to satisfy react hooks deps linter\n const isEmpty = items.length === 0 && page === 0;\n\n const onStateChange = useCallback(\n (changes: Parameters<NonNullable<ComboboxProps[\"onStateChange\"]>>[0]) => {\n // if the user interacts and we're empty, fire the first query\n if (isEmpty && \"isOpen\" in changes && changes.isOpen === true) {\n triggerQuery();\n }\n\n // otherwise, if inputValue or selectedItems changes, assume we need an\n // entirely new list back from the query\n const inputValueShouldUpdate =\n updateOnInputValueChange && \"inputValue\" in changes;\n const selectedItemsShouldUpdate =\n updateOnSelectedItemsChange &&\n \"selectedItems\" in changes &&\n changes.selectedItems;\n const selectedItemShouldUpdate =\n updateOnSelectedItemChange &&\n \"selectedItem\" in changes &&\n changes.selectedItem !== undefined;\n\n if (inputValueShouldUpdate) {\n setInputValue(changes.inputValue ?? \"\");\n }\n\n if (selectedItemsShouldUpdate) {\n setSelectedItems(changes.selectedItems ?? []);\n }\n\n if (selectedItemShouldUpdate) {\n setSelectedItem(changes.selectedItem);\n }\n\n if (\n inputValueShouldUpdate ||\n selectedItemsShouldUpdate ||\n selectedItemShouldUpdate\n ) {\n setPage(0);\n setDone(false);\n triggerQuery();\n }\n },\n [\n isEmpty,\n updateOnInputValueChange,\n updateOnSelectedItemsChange,\n updateOnSelectedItemChange,\n ],\n );\n\n const onScroll = useCallback(\n (e: UIEvent<HTMLElement>) => {\n // React events don't persist, so we need to store the element through the timeout\n const element = e.currentTarget;\n\n // using timeoutRef to throttle scroll calls\n // using loadingRef to not make additional queries if a query is already in flight\n if (!scrollTimeoutRef.current && !loadingRef.current) {\n setTimeout(() => {\n const shouldTriggerQuery =\n shouldTriggerQueryProp ?? defaultShouldTriggerQuery;\n\n if (shouldTriggerQuery(element) && !done) {\n triggerQuery();\n }\n\n scrollTimeoutRef.current = false;\n }, 40);\n\n scrollTimeoutRef.current = true;\n }\n },\n [done, shouldTriggerQueryProp],\n );\n\n return {\n comboboxProps: {\n items: deferredItems,\n loading: deferredLoading,\n initialInputValue,\n defaultInputValue,\n initialSelectedItem,\n defaultSelectedItem,\n initialSelectedItems,\n defaultSelectedItems,\n disableFilter: true, // assume the query will return a filtered/sorted list\n onStateChange,\n },\n contentProps: {\n onScroll,\n scrollerRef,\n },\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useInfiniteCombobox-WcRgC9p6.js","sources":["../src/components/Combobox/useInfiniteCombobox.ts"],"sourcesContent":["import {\n useState,\n useEffect,\n useLayoutEffect,\n useRef,\n useDeferredValue,\n type UIEvent,\n useCallback,\n} from \"react\";\nimport { UseInfiniteComboboxProps, type ComboboxProps } from \"./ComboboxTypes\";\n\nconst SCROLL_THRESHOLD = 0.64; // arbitrary number\n\n/**\n * Hook for implementing infinite scroll functionality in combobox components.\n *\n * Features:\n * - Automatic pagination with scroll-based loading\n * - Configurable query triggers (input change, selection change, scroll)\n * - Debounced query execution to prevent excessive API calls\n * - Automatic retry logic with exponential backoff\n * - Support for both single and multiple selection modes\n * - Customizable scroll threshold for triggering new queries\n * - Loading state management with deferred updates\n * - Automatic detection of pagination end\n * - Support for initial items or query-based initialization\n *\n * @param options Configuration options for the infinite combobox\n * @returns Object containing comboboxProps and contentProps for use with Combobox component\n *\n * @example\n * const { comboboxProps, contentProps } = useInfiniteCombobox({\n * initialItems: [],\n * initialPage: 0,\n * initialLoading: true,\n * query: async ({ page, inputValue, selectedItems }) => {\n * return await fetchItems({\n * page,\n * pageSize: 25,\n * searchTerm: inputValue,\n * excludeIds: selectedItems.map(item => item.id),\n * });\n * },\n * });\n *\n * return (\n * <Combobox {...comboboxProps}>\n * <Combobox.SearchField label=\"Search items\" />\n * <Combobox.Content {...contentProps}>\n * {({ items }) => (\n * <Combobox.List>\n * {items.map((item, i) => (\n * <Combobox.Item key={item.id} item={item} index={i}>\n * {item.name}\n * </Combobox.Item>\n * ))}\n * </Combobox.List>\n * )}\n * </Combobox.Content>\n * </Combobox>\n * );\n */\nexport function useInfiniteCombobox<Item = any>({\n query,\n queryInitialItems,\n initialItems = [],\n initialPage = 0,\n initialLoading = false,\n initialInputValue,\n defaultInputValue,\n initialSelectedItem,\n defaultSelectedItem,\n initialSelectedItems,\n defaultSelectedItems,\n updateOnInputValueChange = true,\n updateOnSelectedItemChange = true,\n updateOnSelectedItemsChange = true,\n queryOnFirstRender = false,\n shouldTriggerQuery: shouldTriggerQueryProp,\n}: UseInfiniteComboboxProps<Item>) {\n const [items, setItems] = useState(initialItems);\n const deferredItems = useDeferredValue(items);\n const [page, setPage] = useState(initialPage);\n const [loading, setLoading] = useState(initialLoading);\n const deferredLoading = useDeferredValue(loading);\n const [inputValue, setInputValue] = useState(\n initialInputValue ?? defaultInputValue ?? \"\",\n );\n const [selectedItem, setSelectedItem] = useState<Item | null>(\n initialSelectedItem ?? defaultSelectedItem ?? null,\n );\n const [selectedItems, setSelectedItems] = useState<Item[]>(\n initialSelectedItems ?? defaultSelectedItems ?? [],\n );\n\n const scrollerRef = useRef<HTMLDivElement>(null);\n\n const defaultShouldTriggerQuery = (element: EventTarget & HTMLElement) => {\n const totalScrollHeight = element.scrollHeight - element.clientHeight;\n return element.scrollTop / totalScrollHeight > SCROLL_THRESHOLD;\n };\n\n // using both state and ref here since the state will be \"behind\" the ref\n // if another query has been triggered while the current one is in flight\n const [triggerQueryCount, setTriggerQueryCount] = useState(0);\n const triggerQueryCountRef = useRef(0);\n const triggerQuery = () => {\n setTriggerQueryCount((x) => x + 1);\n triggerQueryCountRef.current += 1;\n };\n\n const [done, setDone] = useState(false);\n\n const firstRenderRef = useRef(true);\n const scrollTimeoutRef = useRef(false);\n\n // using a similar state/ref idea for managing loading as well, since we\n // need to know immediately if queries are in flight, but state won't be\n // updated in the onScroll handler fast enough\n const loadingRef = useRef(false);\n const setLoadingStateAndRef = (isLoading: boolean) => {\n setLoading(isLoading);\n loadingRef.current = isLoading;\n };\n\n const queryRetryCountRef = useRef(0);\n\n useEffect(() => {\n if (firstRenderRef.current && queryInitialItems) {\n setItems(queryInitialItems());\n }\n\n // don't run on initial render unless we explicitly choose to\n if (firstRenderRef.current && !queryOnFirstRender) {\n firstRenderRef.current = false;\n return;\n }\n\n setLoadingStateAndRef(true);\n\n // using a short debounce delay to batch updates\n const timeoutID = setTimeout(() => {\n // if this query is outdated, don't call it\n if (triggerQueryCount < triggerQueryCountRef.current) return;\n\n query({\n page,\n inputValue,\n selectedItem,\n selectedItems,\n })\n .then((res) => {\n queryRetryCountRef.current = 0;\n\n // if this query is outdated, throw away it's results\n if (triggerQueryCount < triggerQueryCountRef.current) return;\n\n setLoadingStateAndRef(false);\n setPage((x) => x + 1);\n\n // if the result is nullish or empty\n // assume we've reached the end of the pagination\n if (res == null || (page > 0 && res.length === 0)) {\n setDone(true);\n } else if (page === 0) {\n setItems(() => [...res]);\n } else {\n setItems((prevItems) => [...prevItems, ...res]);\n }\n })\n .catch(() => {\n // if we fail, retry up to 8 times with exponential back-off\n queryRetryCountRef.current += 1;\n\n if (queryRetryCountRef.current > 7) {\n queryRetryCountRef.current = 0;\n return;\n } else {\n setTimeout(\n () => {\n triggerQuery();\n },\n 2 ** queryRetryCountRef.current * 160,\n );\n }\n });\n }, 160);\n\n return () => {\n clearTimeout(timeoutID);\n };\n\n // only re-query when we manually call triggerQuery\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [triggerQueryCount]);\n\n // if the popover isn't scrollable, keep firing more queries\n useLayoutEffect(() => {\n setTimeout(() => {\n if (\n scrollerRef.current &&\n scrollerRef.current.scrollHeight > 0 &&\n scrollerRef.current.clientHeight > 0 &&\n scrollerRef.current.scrollHeight <= scrollerRef.current.clientHeight\n ) {\n triggerQuery();\n }\n }, 160);\n }, [items]);\n\n // making this separate variable to satisfy react hooks deps linter\n const isEmpty = items.length === 0 && page === 0;\n\n const onStateChange = useCallback(\n (changes: Parameters<NonNullable<ComboboxProps[\"onStateChange\"]>>[0]) => {\n // if the user interacts and we're empty, fire the first query\n if (isEmpty && \"isOpen\" in changes && changes.isOpen === true) {\n triggerQuery();\n }\n\n // otherwise, if inputValue or selectedItems changes, assume we need an\n // entirely new list back from the query\n const inputValueShouldUpdate =\n updateOnInputValueChange && \"inputValue\" in changes;\n const selectedItemsShouldUpdate =\n updateOnSelectedItemsChange &&\n \"selectedItems\" in changes &&\n changes.selectedItems;\n const selectedItemShouldUpdate =\n updateOnSelectedItemChange &&\n \"selectedItem\" in changes &&\n changes.selectedItem !== undefined;\n\n if (inputValueShouldUpdate) {\n setInputValue(changes.inputValue ?? \"\");\n }\n\n if (selectedItemsShouldUpdate) {\n setSelectedItems(changes.selectedItems ?? []);\n }\n\n if (selectedItemShouldUpdate) {\n setSelectedItem(changes.selectedItem);\n }\n\n if (\n inputValueShouldUpdate ||\n selectedItemsShouldUpdate ||\n selectedItemShouldUpdate\n ) {\n setPage(0);\n setDone(false);\n triggerQuery();\n }\n },\n [\n isEmpty,\n updateOnInputValueChange,\n updateOnSelectedItemsChange,\n updateOnSelectedItemChange,\n ],\n );\n\n const onScroll = useCallback(\n (e: UIEvent<HTMLElement>) => {\n // React events don't persist, so we need to store the element through the timeout\n const element = e.currentTarget;\n\n // using timeoutRef to throttle scroll calls\n // using loadingRef to not make additional queries if a query is already in flight\n if (!scrollTimeoutRef.current && !loadingRef.current) {\n setTimeout(() => {\n const shouldTriggerQuery =\n shouldTriggerQueryProp ?? defaultShouldTriggerQuery;\n\n if (shouldTriggerQuery(element) && !done) {\n triggerQuery();\n }\n\n scrollTimeoutRef.current = false;\n }, 40);\n\n scrollTimeoutRef.current = true;\n }\n },\n [done, shouldTriggerQueryProp],\n );\n\n return {\n comboboxProps: {\n items: deferredItems,\n loading: deferredLoading,\n initialInputValue,\n defaultInputValue,\n initialSelectedItem,\n defaultSelectedItem,\n initialSelectedItems,\n defaultSelectedItems,\n disableFilter: true, // assume the query will return a filtered/sorted list\n onStateChange,\n },\n contentProps: {\n onScroll,\n scrollerRef,\n },\n };\n}\n"],"names":[],"mappings":";;AAWA,MAAM,gBAAA,GAAmB,IAAA;AAmDlB,SAAS,mBAAA,CAAgC;AAAA,EAC9C,KAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAe,EAAC;AAAA,EAChB,WAAA,GAAc,CAAA;AAAA,EACd,cAAA,GAAiB,KAAA;AAAA,EACjB,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AAAA,EACA,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,wBAAA,GAA2B,IAAA;AAAA,EAC3B,0BAAA,GAA6B,IAAA;AAAA,EAC7B,2BAAA,GAA8B,IAAA;AAAA,EAC9B,kBAAA,GAAqB,KAAA;AAAA,EACrB,kBAAA,EAAoB;AACtB,CAAA,EAAmC;AACjC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,YAAY,CAAA;AAC/C,EAAA,MAAM,aAAA,GAAgB,iBAAiB,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,WAAW,CAAA;AAC5C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,cAAc,CAAA;AACrD,EAAA,MAAM,eAAA,GAAkB,iBAAiB,OAAO,CAAA;AAChD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,QAAA;AAAA,IAClC,qBAAqB,iBAAA,IAAqB;AAAA,GAC5C;AACA,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,QAAA;AAAA,IACtC,uBAAuB,mBAAA,IAAuB;AAAA,GAChD;AACA,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA;AAAA,IACxC,oBAAA,IAAwB,wBAAwB;AAAC,GACnD;AAEA,EAAA,MAAM,WAAA,GAAc,OAAuB,IAAI,CAAA;AAE/C,EAAA,MAAM,yBAAA,GAA4B,CAAC,OAAA,KAAuC;AACxE,IAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,YAAA,GAAe,OAAA,CAAQ,YAAA;AACzD,IAAA,OAAO,OAAA,CAAQ,YAAY,iBAAA,GAAoB,gBAAA;AAAA,EACjD,CAAA;AAIA,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAS,CAAC,CAAA;AAC5D,EAAA,MAAM,oBAAA,GAAuB,OAAO,CAAC,CAAA;AACrC,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,oBAAA,CAAqB,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACjC,IAAA,oBAAA,CAAqB,OAAA,IAAW,CAAA;AAAA,EAClC,CAAA;AAEA,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AAEtC,EAAA,MAAM,cAAA,GAAiB,OAAO,IAAI,CAAA;AAClC,EAAA,MAAM,gBAAA,GAAmB,OAAO,KAAK,CAAA;AAKrC,EAAA,MAAM,UAAA,GAAa,OAAO,KAAK,CAAA;AAC/B,EAAA,MAAM,qBAAA,GAAwB,CAAC,SAAA,KAAuB;AACpD,IAAA,UAAA,CAAW,SAAS,CAAA;AACpB,IAAA,UAAA,CAAW,OAAA,GAAU,SAAA;AAAA,EACvB,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,OAAO,CAAC,CAAA;AAEnC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,cAAA,CAAe,WAAW,iBAAA,EAAmB;AAC/C,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAAA,IAC9B;AAGA,IAAA,IAAI,cAAA,CAAe,OAAA,IAAW,CAAC,kBAAA,EAAoB;AACjD,MAAA,cAAA,CAAe,OAAA,GAAU,KAAA;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,qBAAA,CAAsB,IAAI,CAAA;AAG1B,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM;AAEjC,MAAA,IAAI,iBAAA,GAAoB,qBAAqB,OAAA,EAAS;AAEtD,MAAA,KAAA,CAAM;AAAA,QACJ,IAAA;AAAA,QACA,UAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA,OACD,CAAA,CACE,IAAA,CAAK,CAAC,GAAA,KAAQ;AACb,QAAA,kBAAA,CAAmB,OAAA,GAAU,CAAA;AAG7B,QAAA,IAAI,iBAAA,GAAoB,qBAAqB,OAAA,EAAS;AAEtD,QAAA,qBAAA,CAAsB,KAAK,CAAA;AAC3B,QAAA,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAIpB,QAAA,IAAI,OAAO,IAAA,IAAS,IAAA,GAAO,CAAA,IAAK,GAAA,CAAI,WAAW,CAAA,EAAI;AACjD,UAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,QACd,CAAA,MAAA,IAAW,SAAS,CAAA,EAAG;AACrB,UAAA,QAAA,CAAS,MAAM,CAAC,GAAG,GAAG,CAAC,CAAA;AAAA,QACzB,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,CAAC,SAAA,KAAc,CAAC,GAAG,SAAA,EAAW,GAAG,GAAG,CAAC,CAAA;AAAA,QAChD;AAAA,MACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAEX,QAAA,kBAAA,CAAmB,OAAA,IAAW,CAAA;AAE9B,QAAA,IAAI,kBAAA,CAAmB,UAAU,CAAA,EAAG;AAClC,UAAA,kBAAA,CAAmB,OAAA,GAAU,CAAA;AAC7B,UAAA;AAAA,QACF,CAAA,MAAO;AACL,UAAA,UAAA;AAAA,YACE,MAAM;AACJ,cAAA,YAAA,EAAa;AAAA,YACf,CAAA;AAAA,YACA,CAAA,IAAK,mBAAmB,OAAA,GAAU;AAAA,WACpC;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAAA,IACL,GAAG,GAAG,CAAA;AAEN,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB,CAAA;AAAA,EAIF,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAGtB,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,IACE,WAAA,CAAY,OAAA,IACZ,WAAA,CAAY,OAAA,CAAQ,eAAe,CAAA,IACnC,WAAA,CAAY,OAAA,CAAQ,YAAA,GAAe,KACnC,WAAA,CAAY,OAAA,CAAQ,YAAA,IAAgB,WAAA,CAAY,QAAQ,YAAA,EACxD;AACA,QAAA,YAAA,EAAa;AAAA,MACf;AAAA,IACF,GAAG,GAAG,CAAA;AAAA,EACR,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,IAAA,KAAS,CAAA;AAE/C,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,OAAA,KAAwE;AAEvE,MAAA,IAAI,OAAA,IAAW,QAAA,IAAY,OAAA,IAAW,OAAA,CAAQ,WAAW,IAAA,EAAM;AAC7D,QAAA,YAAA,EAAa;AAAA,MACf;AAIA,MAAA,MAAM,sBAAA,GACJ,4BAA4B,YAAA,IAAgB,OAAA;AAC9C,MAAA,MAAM,yBAAA,GACJ,2BAAA,IACA,eAAA,IAAmB,OAAA,IACnB,OAAA,CAAQ,aAAA;AACV,MAAA,MAAM,wBAAA,GACJ,0BAAA,IACA,cAAA,IAAkB,OAAA,IAClB,QAAQ,YAAA,KAAiB,MAAA;AAE3B,MAAA,IAAI,sBAAA,EAAwB;AAC1B,QAAA,aAAA,CAAc,OAAA,CAAQ,cAAc,EAAE,CAAA;AAAA,MACxC;AAEA,MAAA,IAAI,yBAAA,EAA2B;AAC7B,QAAA,gBAAA,CAAiB,OAAA,CAAQ,aAAA,IAAiB,EAAE,CAAA;AAAA,MAC9C;AAEA,MAAA,IAAI,wBAAA,EAA0B;AAC5B,QAAA,eAAA,CAAgB,QAAQ,YAAY,CAAA;AAAA,MACtC;AAEA,MAAA,IACE,sBAAA,IACA,6BACA,wBAAA,EACA;AACA,QAAA,OAAA,CAAQ,CAAC,CAAA;AACT,QAAA,OAAA,CAAQ,KAAK,CAAA;AACb,QAAA,YAAA,EAAa;AAAA,MACf;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,OAAA;AAAA,MACA,wBAAA;AAAA,MACA,2BAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,QAAA,GAAW,WAAA;AAAA,IACf,CAAC,CAAA,KAA4B;AAE3B,MAAA,MAAM,UAAU,CAAA,CAAE,aAAA;AAIlB,MAAA,IAAI,CAAC,gBAAA,CAAiB,OAAA,IAAW,CAAC,WAAW,OAAA,EAAS;AACpD,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,MAAM,qBACJ,sBAAA,IAA0B,yBAAA;AAE5B,UAAA,IAAI,kBAAA,CAAmB,OAAO,CAAA,IAAK,CAAC,IAAA,EAAM;AACxC,YAAA,YAAA,EAAa;AAAA,UACf;AAEA,UAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAAA,QAC7B,GAAG,EAAE,CAAA;AAEL,QAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM,sBAAsB;AAAA,GAC/B;AAEA,EAAA,OAAO;AAAA,IACL,aAAA,EAAe;AAAA,MACb,KAAA,EAAO,aAAA;AAAA,MACP,OAAA,EAAS,eAAA;AAAA,MACT,iBAAA;AAAA,MACA,iBAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA,oBAAA;AAAA,MACA,oBAAA;AAAA,MACA,aAAA,EAAe,IAAA;AAAA;AAAA,MACf;AAAA,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,QAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useIntersectionObserver-BEmMDO3P.js","sources":["../src/internal/hooks/useIntersectionObserver/useIntersectionObserver.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\n\n/**\n * Internal state type for intersection observer\n * @property {boolean} isIntersecting - Whether the element is intersecting\n * @property {IntersectionObserverEntry} [entry] - The intersection observer entry\n */\ntype State = {\n /**\n * Whether the element is intersecting\n */\n isIntersecting: boolean;\n /**\n * The intersection observer entry\n */\n entry?: IntersectionObserverEntry;\n};\n\n/**\n * Options for the useIntersectionObserver hook\n * @property {Element | Document | null} [root] - The root element for intersection calculations\n * @property {string} [rootMargin] - Margin around the root element\n * @property {number | number[]} [threshold] - Threshold values for intersection detection\n * @property {boolean} [freezeOnceVisible] - Whether to freeze once the element becomes visible\n * @property {(isIntersecting: boolean, entry: IntersectionObserverEntry) => void} [onChange] - Callback when intersection changes\n * @property {boolean} [initialIsIntersecting] - Initial intersection state\n */\nexport type UseIntersectionObserverOptions = {\n /**\n * The root element for intersection calculations\n */\n root?: Element | Document | null;\n /**\n * Margin around the root element\n */\n rootMargin?: string;\n /**\n * Threshold values for intersection detection\n */\n threshold?: number | number[];\n /**\n * Whether to freeze once the element becomes visible\n */\n freezeOnceVisible?: boolean;\n /**\n * Callback when intersection changes\n */\n onChange?: (\n isIntersecting: boolean,\n entry: IntersectionObserverEntry,\n ) => void;\n /**\n * Initial intersection state\n */\n initialIsIntersecting?: boolean;\n};\n\n/**\n * Return type for the useIntersectionObserver hook\n * @property {(node?: Element | null) => void} ref - Function to set the element to observe\n * @property {boolean} isIntersecting - Whether the element is intersecting\n * @property {IntersectionObserverEntry} [entry] - The intersection observer entry\n */\nexport type IntersectionReturn = [\n (node?: Element | null) => void,\n boolean,\n IntersectionObserverEntry | undefined,\n] & {\n ref: (node?: Element | null) => void;\n isIntersecting: boolean;\n entry?: IntersectionObserverEntry;\n};\n\n/**\n * Custom hook for observing element intersection with viewport or root element.\n *\n * Features:\n * - Observes element intersection with viewport or custom root element\n * - Supports configurable threshold values and root margins\n * - Provides intersection state and detailed entry information\n * - Supports freezing observation once element becomes visible\n * - Handles browser compatibility gracefully\n * - Provides both array and object destructuring support\n * - Automatically cleans up observer on unmount\n * - Supports onChange callback for custom intersection handling\n *\n * @param options - Configuration options for the intersection observer\n * @returns Array containing ref function, intersection state, and entry, with additional object properties\n */\nexport function useIntersectionObserver({\n threshold = 0,\n root = null,\n rootMargin = \"0%\",\n freezeOnceVisible = false,\n initialIsIntersecting = false,\n onChange,\n}: UseIntersectionObserverOptions = {}): IntersectionReturn {\n const [ref, setRef] = useState<Element | null>(null);\n\n const [state, setState] = useState<State>(() => ({\n isIntersecting: initialIsIntersecting,\n entry: undefined,\n }));\n\n const callbackRef = useRef<UseIntersectionObserverOptions[\"onChange\"]>();\n\n callbackRef.current = onChange;\n\n const frozen = state.entry?.isIntersecting && freezeOnceVisible;\n\n useEffect(() => {\n // Ensure we have a ref to observe\n if (!ref) return;\n\n // Ensure the browser supports the Intersection Observer API\n if (!(\"IntersectionObserver\" in window)) return;\n\n // Skip if frozen\n if (frozen) return;\n\n let unobserve: (() => void) | undefined;\n\n const observer = new IntersectionObserver(\n (entries: IntersectionObserverEntry[]): void => {\n const thresholds = Array.isArray(observer.thresholds)\n ? observer.thresholds\n : [observer.thresholds];\n\n entries.forEach((entry) => {\n const isIntersecting =\n entry.isIntersecting &&\n thresholds.some(\n (threshold) => entry.intersectionRatio >= threshold,\n );\n\n setState({ isIntersecting, entry });\n\n if (callbackRef.current) {\n callbackRef.current(isIntersecting, entry);\n }\n\n if (isIntersecting && freezeOnceVisible && unobserve) {\n unobserve();\n unobserve = undefined;\n }\n });\n },\n { threshold, root, rootMargin },\n );\n\n observer.observe(ref);\n\n return () => {\n observer.disconnect();\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n ref,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(threshold),\n root,\n rootMargin,\n frozen,\n freezeOnceVisible,\n ]);\n\n // ensures that if the observed element changes, the intersection observer is reinitialized\n const prevRef = useRef<Element | null>(null);\n\n useEffect(() => {\n if (\n !ref &&\n state.entry?.target &&\n !freezeOnceVisible &&\n !frozen &&\n prevRef.current !== state.entry.target\n ) {\n prevRef.current = state.entry.target;\n setState({ isIntersecting: initialIsIntersecting, entry: undefined });\n }\n }, [ref, state.entry, freezeOnceVisible, frozen, initialIsIntersecting]);\n\n const result = [\n setRef,\n !!state.isIntersecting,\n state.entry,\n ] as IntersectionReturn;\n\n // Support object destructuring, by adding the specific values.\n result.ref = result[0];\n result.isIntersecting = result[1];\n result.entry = result[2];\n\n return result;\n}\n"],"names":["threshold"],"mappings":"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"}
1
+ {"version":3,"file":"useIntersectionObserver-BEmMDO3P.js","sources":["../src/internal/hooks/useIntersectionObserver/useIntersectionObserver.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\n\n/**\n * Internal state type for intersection observer\n * @property {boolean} isIntersecting - Whether the element is intersecting\n * @property {IntersectionObserverEntry} [entry] - The intersection observer entry\n */\ntype State = {\n /**\n * Whether the element is intersecting\n */\n isIntersecting: boolean;\n /**\n * The intersection observer entry\n */\n entry?: IntersectionObserverEntry;\n};\n\n/**\n * Options for the useIntersectionObserver hook\n * @property {Element | Document | null} [root] - The root element for intersection calculations\n * @property {string} [rootMargin] - Margin around the root element\n * @property {number | number[]} [threshold] - Threshold values for intersection detection\n * @property {boolean} [freezeOnceVisible] - Whether to freeze once the element becomes visible\n * @property {(isIntersecting: boolean, entry: IntersectionObserverEntry) => void} [onChange] - Callback when intersection changes\n * @property {boolean} [initialIsIntersecting] - Initial intersection state\n */\nexport type UseIntersectionObserverOptions = {\n /**\n * The root element for intersection calculations\n */\n root?: Element | Document | null;\n /**\n * Margin around the root element\n */\n rootMargin?: string;\n /**\n * Threshold values for intersection detection\n */\n threshold?: number | number[];\n /**\n * Whether to freeze once the element becomes visible\n */\n freezeOnceVisible?: boolean;\n /**\n * Callback when intersection changes\n */\n onChange?: (\n isIntersecting: boolean,\n entry: IntersectionObserverEntry,\n ) => void;\n /**\n * Initial intersection state\n */\n initialIsIntersecting?: boolean;\n};\n\n/**\n * Return type for the useIntersectionObserver hook\n * @property {(node?: Element | null) => void} ref - Function to set the element to observe\n * @property {boolean} isIntersecting - Whether the element is intersecting\n * @property {IntersectionObserverEntry} [entry] - The intersection observer entry\n */\nexport type IntersectionReturn = [\n (node?: Element | null) => void,\n boolean,\n IntersectionObserverEntry | undefined,\n] & {\n ref: (node?: Element | null) => void;\n isIntersecting: boolean;\n entry?: IntersectionObserverEntry;\n};\n\n/**\n * Custom hook for observing element intersection with viewport or root element.\n *\n * Features:\n * - Observes element intersection with viewport or custom root element\n * - Supports configurable threshold values and root margins\n * - Provides intersection state and detailed entry information\n * - Supports freezing observation once element becomes visible\n * - Handles browser compatibility gracefully\n * - Provides both array and object destructuring support\n * - Automatically cleans up observer on unmount\n * - Supports onChange callback for custom intersection handling\n *\n * @param options - Configuration options for the intersection observer\n * @returns Array containing ref function, intersection state, and entry, with additional object properties\n */\nexport function useIntersectionObserver({\n threshold = 0,\n root = null,\n rootMargin = \"0%\",\n freezeOnceVisible = false,\n initialIsIntersecting = false,\n onChange,\n}: UseIntersectionObserverOptions = {}): IntersectionReturn {\n const [ref, setRef] = useState<Element | null>(null);\n\n const [state, setState] = useState<State>(() => ({\n isIntersecting: initialIsIntersecting,\n entry: undefined,\n }));\n\n const callbackRef = useRef<UseIntersectionObserverOptions[\"onChange\"]>();\n\n callbackRef.current = onChange;\n\n const frozen = state.entry?.isIntersecting && freezeOnceVisible;\n\n useEffect(() => {\n // Ensure we have a ref to observe\n if (!ref) return;\n\n // Ensure the browser supports the Intersection Observer API\n if (!(\"IntersectionObserver\" in window)) return;\n\n // Skip if frozen\n if (frozen) return;\n\n let unobserve: (() => void) | undefined;\n\n const observer = new IntersectionObserver(\n (entries: IntersectionObserverEntry[]): void => {\n const thresholds = Array.isArray(observer.thresholds)\n ? observer.thresholds\n : [observer.thresholds];\n\n entries.forEach((entry) => {\n const isIntersecting =\n entry.isIntersecting &&\n thresholds.some(\n (threshold) => entry.intersectionRatio >= threshold,\n );\n\n setState({ isIntersecting, entry });\n\n if (callbackRef.current) {\n callbackRef.current(isIntersecting, entry);\n }\n\n if (isIntersecting && freezeOnceVisible && unobserve) {\n unobserve();\n unobserve = undefined;\n }\n });\n },\n { threshold, root, rootMargin },\n );\n\n observer.observe(ref);\n\n return () => {\n observer.disconnect();\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n ref,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(threshold),\n root,\n rootMargin,\n frozen,\n freezeOnceVisible,\n ]);\n\n // ensures that if the observed element changes, the intersection observer is reinitialized\n const prevRef = useRef<Element | null>(null);\n\n useEffect(() => {\n if (\n !ref &&\n state.entry?.target &&\n !freezeOnceVisible &&\n !frozen &&\n prevRef.current !== state.entry.target\n ) {\n prevRef.current = state.entry.target;\n setState({ isIntersecting: initialIsIntersecting, entry: undefined });\n }\n }, [ref, state.entry, freezeOnceVisible, frozen, initialIsIntersecting]);\n\n const result = [\n setRef,\n !!state.isIntersecting,\n state.entry,\n ] as IntersectionReturn;\n\n // Support object destructuring, by adding the specific values.\n result.ref = result[0];\n result.isIntersecting = result[1];\n result.entry = result[2];\n\n return result;\n}\n"],"names":["threshold"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useLayoutPropsUtil-DjD5IMh0.js","sources":["../src/internal/functions/sizeToToken.ts","../src/internal/hooks/useLayoutPropsUtil/useLayoutPropsUtil.ts"],"sourcesContent":["import { core } from \"@servicetitan/hammer-token\";\nimport { GapSize } from \"../../types\";\n\ntype PrimitiveSizes =\n | \"Size0\"\n | \"SizeHalf\"\n | \"Size1\"\n | \"Size2\"\n | \"Size3\"\n | \"Size4\"\n | \"Size5\"\n | \"Size6\"\n | \"Size7\"\n | \"Size8\"\n | \"Size9\"\n | \"Size10\"\n | \"Size11\"\n | \"Size12\"\n | \"Size13\"\n | \"Size14\";\n\nexport const sizeToToken = (value?: GapSize) => {\n if (typeof value === \"undefined\") return undefined;\n let gap = value;\n const stringifiedValue = String(value);\n if (stringifiedValue === \"half\") {\n gap =\n `${stringifiedValue[0].toUpperCase()}${stringifiedValue.slice(1)}` as GapSize;\n }\n\n return core.primitive?.[`Size${gap}` as PrimitiveSizes]?.value;\n};\n","import { CSSProperties, useMemo } from \"react\";\nimport { GapSize, LayoutUtilProps } from \"../../../types\";\nimport { useBreakpoint } from \"../../../hooks/useBreakpoint\";\nimport { sizeToToken } from \"../../functions/sizeToToken\";\n\nconst LAYOUT_PROP_ARR = [\n \"gridTemplateColumns\",\n \"gridTemplateRows\",\n \"gridTemplateAreas\",\n \"gridAutoColumns\",\n \"gridAutoRows\",\n \"gridArea\",\n \"gridColumn\",\n \"gridRow\",\n \"gridColumnStart\",\n \"gridColumnEnd\",\n \"gridRowStart\",\n \"gridRowEnd\",\n \"flex\",\n \"flexDirection\",\n \"flexGrow\",\n \"flexShrink\",\n \"flexBasis\",\n \"flexWrap\",\n \"order\",\n \"justifySelf\",\n \"justifyItems\",\n \"justifyContent\",\n \"alignSelf\",\n \"alignItems\",\n \"alignContent\",\n \"placeItems\",\n \"placeContent\",\n \"placeSelf\",\n \"wrap\",\n \"gap\",\n \"rowGap\",\n \"columnGap\",\n];\n\nconst RESPONSIVE_SIZES_ARR = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"xxl\"];\n\n/**\n * Layout CSS variables type excluding responsive properties\n */\ntype LayoutCSSVariables = Omit<LayoutUtilProps, keyof ResponsiveLayout>;\n\n/**\n * Responsive layout configuration type\n */\ntype ResponsiveLayout = {\n /**\n * Base layout properties\n */\n base?: LayoutUtilProps;\n /**\n * Extra small breakpoint layout properties\n */\n xs?: LayoutUtilProps;\n /**\n * Small breakpoint layout properties\n */\n sm?: LayoutUtilProps;\n /**\n * Medium breakpoint layout properties\n */\n md?: LayoutUtilProps;\n /**\n * Large breakpoint layout properties\n */\n lg?: LayoutUtilProps;\n /**\n * Extra large breakpoint layout properties\n */\n xl?: LayoutUtilProps;\n /**\n * Extra extra large breakpoint layout properties\n */\n xxl?: LayoutUtilProps;\n};\n\n/**\n * Custom hook for managing responsive layout properties and CSS styles.\n *\n * Features:\n * - Separates layout properties from component properties\n * - Provides responsive breakpoint support for all layout properties\n * - Automatically converts gap sizes to CSS tokens\n * - Uses breakpoint cascade for responsive values\n * - Optimized with useMemo for performance\n * - Supports all CSS Grid and Flexbox properties\n * - Handles responsive size inheritance (larger breakpoints inherit from smaller ones)\n * - Returns both layout styles and filtered component props\n *\n * @param props - Object containing layout and component properties\n * @returns Object containing layout styles and filtered component props\n */\nexport function useLayoutPropsUtil<T extends ResponsiveLayout>(\n props: T,\n): { layoutStyles?: CSSProperties; componentProps: T } {\n const baseSizeProps = Object.fromEntries(\n Object.entries(props).filter(([key, _val]) =>\n LAYOUT_PROP_ARR.includes(key),\n ),\n );\n\n const responsiveSizeProps = Object.fromEntries(\n Object.entries(props).filter(([key, _val]) =>\n RESPONSIVE_SIZES_ARR.includes(key),\n ),\n );\n\n const sizeProps: ResponsiveLayout = useMemo(\n () => ({\n ...responsiveSizeProps,\n base: baseSizeProps,\n }),\n [baseSizeProps, responsiveSizeProps],\n );\n\n const componentProps = Object.fromEntries(\n Object.entries(props).filter(\n ([key, _val]) =>\n !RESPONSIVE_SIZES_ARR.includes(key) && !LAYOUT_PROP_ARR.includes(key),\n ),\n );\n\n const breakpoint = useBreakpoint();\n\n const getValue = (style: keyof LayoutCSSVariables) => {\n if (breakpoint?.name === \"xxl\") {\n const xxlValue =\n sizeProps.xxl?.[style] ??\n sizeProps.xl?.[style] ??\n sizeProps.lg?.[style] ??\n sizeProps.md?.[style] ??\n sizeProps.sm?.[style] ??\n sizeProps.xs?.[style] ??\n sizeProps.base?.[style];\n\n if (style.toLowerCase().endsWith(\"gap\")) {\n return sizeToToken(xxlValue as GapSize);\n }\n return xxlValue;\n }\n if (breakpoint?.name === \"xl\") {\n const xlValue =\n sizeProps.xl?.[style] ??\n sizeProps.lg?.[style] ??\n sizeProps.md?.[style] ??\n sizeProps.sm?.[style] ??\n sizeProps.xs?.[style] ??\n sizeProps.base?.[style];\n if (style.toLowerCase().endsWith(\"gap\")) {\n return sizeToToken(xlValue as GapSize);\n }\n return xlValue;\n }\n if (breakpoint?.name === \"lg\") {\n const lgValue =\n sizeProps.lg?.[style] ??\n sizeProps.md?.[style] ??\n sizeProps.sm?.[style] ??\n sizeProps.xs?.[style] ??\n sizeProps.base?.[style];\n\n if (style.toLowerCase().endsWith(\"gap\")) {\n return sizeToToken(lgValue as GapSize);\n }\n return lgValue;\n }\n if (breakpoint?.name === \"md\") {\n const mdValue =\n sizeProps.md?.[style] ??\n sizeProps.sm?.[style] ??\n sizeProps.xs?.[style] ??\n sizeProps.base?.[style];\n if (style.toLowerCase().endsWith(\"gap\")) {\n return sizeToToken(mdValue as GapSize);\n }\n return mdValue;\n }\n if (breakpoint?.name === \"sm\") {\n const smValue =\n sizeProps.sm?.[style] ??\n sizeProps.xs?.[style] ??\n sizeProps.base?.[style];\n if (style.toLowerCase().endsWith(\"gap\")) {\n return sizeToToken(smValue as GapSize);\n }\n return smValue;\n }\n if (breakpoint?.name === \"xs\") {\n const xsValue = sizeProps.xs?.[style] ?? sizeProps.base?.[style];\n if (style.toLowerCase().endsWith(\"gap\")) {\n return sizeToToken(xsValue as GapSize);\n }\n return xsValue;\n }\n\n if (style.toLowerCase().endsWith(\"gap\")) {\n return sizeToToken(sizeProps.base?.[style] as GapSize);\n }\n return sizeProps.base?.[style];\n };\n\n const layoutStyleObject = LAYOUT_PROP_ARR.reduce((o, key) => {\n const value = getValue(key as keyof LayoutCSSVariables);\n\n if (typeof value === \"undefined\") return o;\n return { ...o, [key]: value };\n }, {});\n\n return {\n layoutStyles: layoutStyleObject,\n componentProps: componentProps as T,\n };\n}\n"],"names":["core.primitive"],"mappings":"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"}
1
+ {"version":3,"file":"useLayoutPropsUtil-DjD5IMh0.js","sources":["../src/internal/functions/sizeToToken.ts","../src/internal/hooks/useLayoutPropsUtil/useLayoutPropsUtil.ts"],"sourcesContent":["import { core } from \"@servicetitan/hammer-token\";\nimport { GapSize } from \"../../types\";\n\ntype PrimitiveSizes =\n | \"Size0\"\n | \"SizeHalf\"\n | \"Size1\"\n | \"Size2\"\n | \"Size3\"\n | \"Size4\"\n | \"Size5\"\n | \"Size6\"\n | \"Size7\"\n | \"Size8\"\n | \"Size9\"\n | \"Size10\"\n | \"Size11\"\n | \"Size12\"\n | \"Size13\"\n | \"Size14\";\n\nexport const sizeToToken = (value?: GapSize) => {\n if (typeof value === \"undefined\") return undefined;\n let gap = value;\n const stringifiedValue = String(value);\n if (stringifiedValue === \"half\") {\n gap =\n `${stringifiedValue[0].toUpperCase()}${stringifiedValue.slice(1)}` as GapSize;\n }\n\n return core.primitive?.[`Size${gap}` as PrimitiveSizes]?.value;\n};\n","import { CSSProperties, useMemo } from \"react\";\nimport { GapSize, LayoutUtilProps } from \"../../../types\";\nimport { useBreakpoint } from \"../../../hooks/useBreakpoint\";\nimport { sizeToToken } from \"../../functions/sizeToToken\";\n\nconst LAYOUT_PROP_ARR = [\n \"gridTemplateColumns\",\n \"gridTemplateRows\",\n \"gridTemplateAreas\",\n \"gridAutoColumns\",\n \"gridAutoRows\",\n \"gridArea\",\n \"gridColumn\",\n \"gridRow\",\n \"gridColumnStart\",\n \"gridColumnEnd\",\n \"gridRowStart\",\n \"gridRowEnd\",\n \"flex\",\n \"flexDirection\",\n \"flexGrow\",\n \"flexShrink\",\n \"flexBasis\",\n \"flexWrap\",\n \"order\",\n \"justifySelf\",\n \"justifyItems\",\n \"justifyContent\",\n \"alignSelf\",\n \"alignItems\",\n \"alignContent\",\n \"placeItems\",\n \"placeContent\",\n \"placeSelf\",\n \"wrap\",\n \"gap\",\n \"rowGap\",\n \"columnGap\",\n];\n\nconst RESPONSIVE_SIZES_ARR = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"xxl\"];\n\n/**\n * Layout CSS variables type excluding responsive properties\n */\ntype LayoutCSSVariables = Omit<LayoutUtilProps, keyof ResponsiveLayout>;\n\n/**\n * Responsive layout configuration type\n */\ntype ResponsiveLayout = {\n /**\n * Base layout properties\n */\n base?: LayoutUtilProps;\n /**\n * Extra small breakpoint layout properties\n */\n xs?: LayoutUtilProps;\n /**\n * Small breakpoint layout properties\n */\n sm?: LayoutUtilProps;\n /**\n * Medium breakpoint layout properties\n */\n md?: LayoutUtilProps;\n /**\n * Large breakpoint layout properties\n */\n lg?: LayoutUtilProps;\n /**\n * Extra large breakpoint layout properties\n */\n xl?: LayoutUtilProps;\n /**\n * Extra extra large breakpoint layout properties\n */\n xxl?: LayoutUtilProps;\n};\n\n/**\n * Custom hook for managing responsive layout properties and CSS styles.\n *\n * Features:\n * - Separates layout properties from component properties\n * - Provides responsive breakpoint support for all layout properties\n * - Automatically converts gap sizes to CSS tokens\n * - Uses breakpoint cascade for responsive values\n * - Optimized with useMemo for performance\n * - Supports all CSS Grid and Flexbox properties\n * - Handles responsive size inheritance (larger breakpoints inherit from smaller ones)\n * - Returns both layout styles and filtered component props\n *\n * @param props - Object containing layout and component properties\n * @returns Object containing layout styles and filtered component props\n */\nexport function useLayoutPropsUtil<T extends ResponsiveLayout>(\n props: T,\n): { layoutStyles?: CSSProperties; componentProps: T } {\n const baseSizeProps = Object.fromEntries(\n Object.entries(props).filter(([key, _val]) =>\n LAYOUT_PROP_ARR.includes(key),\n ),\n );\n\n const responsiveSizeProps = Object.fromEntries(\n Object.entries(props).filter(([key, _val]) =>\n RESPONSIVE_SIZES_ARR.includes(key),\n ),\n );\n\n const sizeProps: ResponsiveLayout = useMemo(\n () => ({\n ...responsiveSizeProps,\n base: baseSizeProps,\n }),\n [baseSizeProps, responsiveSizeProps],\n );\n\n const componentProps = Object.fromEntries(\n Object.entries(props).filter(\n ([key, _val]) =>\n !RESPONSIVE_SIZES_ARR.includes(key) && !LAYOUT_PROP_ARR.includes(key),\n ),\n );\n\n const breakpoint = useBreakpoint();\n\n const getValue = (style: keyof LayoutCSSVariables) => {\n if (breakpoint?.name === \"xxl\") {\n const xxlValue =\n sizeProps.xxl?.[style] ??\n sizeProps.xl?.[style] ??\n sizeProps.lg?.[style] ??\n sizeProps.md?.[style] ??\n sizeProps.sm?.[style] ??\n sizeProps.xs?.[style] ??\n sizeProps.base?.[style];\n\n if (style.toLowerCase().endsWith(\"gap\")) {\n return sizeToToken(xxlValue as GapSize);\n }\n return xxlValue;\n }\n if (breakpoint?.name === \"xl\") {\n const xlValue =\n sizeProps.xl?.[style] ??\n sizeProps.lg?.[style] ??\n sizeProps.md?.[style] ??\n sizeProps.sm?.[style] ??\n sizeProps.xs?.[style] ??\n sizeProps.base?.[style];\n if (style.toLowerCase().endsWith(\"gap\")) {\n return sizeToToken(xlValue as GapSize);\n }\n return xlValue;\n }\n if (breakpoint?.name === \"lg\") {\n const lgValue =\n sizeProps.lg?.[style] ??\n sizeProps.md?.[style] ??\n sizeProps.sm?.[style] ??\n sizeProps.xs?.[style] ??\n sizeProps.base?.[style];\n\n if (style.toLowerCase().endsWith(\"gap\")) {\n return sizeToToken(lgValue as GapSize);\n }\n return lgValue;\n }\n if (breakpoint?.name === \"md\") {\n const mdValue =\n sizeProps.md?.[style] ??\n sizeProps.sm?.[style] ??\n sizeProps.xs?.[style] ??\n sizeProps.base?.[style];\n if (style.toLowerCase().endsWith(\"gap\")) {\n return sizeToToken(mdValue as GapSize);\n }\n return mdValue;\n }\n if (breakpoint?.name === \"sm\") {\n const smValue =\n sizeProps.sm?.[style] ??\n sizeProps.xs?.[style] ??\n sizeProps.base?.[style];\n if (style.toLowerCase().endsWith(\"gap\")) {\n return sizeToToken(smValue as GapSize);\n }\n return smValue;\n }\n if (breakpoint?.name === \"xs\") {\n const xsValue = sizeProps.xs?.[style] ?? sizeProps.base?.[style];\n if (style.toLowerCase().endsWith(\"gap\")) {\n return sizeToToken(xsValue as GapSize);\n }\n return xsValue;\n }\n\n if (style.toLowerCase().endsWith(\"gap\")) {\n return sizeToToken(sizeProps.base?.[style] as GapSize);\n }\n return sizeProps.base?.[style];\n };\n\n const layoutStyleObject = LAYOUT_PROP_ARR.reduce((o, key) => {\n const value = getValue(key as keyof LayoutCSSVariables);\n\n if (typeof value === \"undefined\") return o;\n return { ...o, [key]: value };\n }, {});\n\n return {\n layoutStyles: layoutStyleObject,\n componentProps: componentProps as T,\n };\n}\n"],"names":["core.primitive"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useMergeRefs-Bde85AWI.js","sources":["../src/hooks/useMergeRefs/useMergeRefs.ts"],"sourcesContent":["import {\n useMemo,\n type Ref,\n type RefCallback,\n type MutableRefObject,\n} from \"react\";\n\n/**\n * Custom hook for merging multiple React refs into a single callback ref.\n * @see https://floating-ui.com/docs/react-utils#usemergerefs\n *\n * Features:\n * - Merges an array of refs into a single callback ref\n * - Handles both function refs and object refs\n * - Optimized with useMemo for performance\n * - Returns null when all refs are null/undefined\n * - Supports generic types for type safety\n * - Automatically handles ref assignment and cleanup\n *\n * @param refs - Array of React refs to merge\n * @returns Single callback ref that handles all provided refs, or null if all refs are null\n */\nexport function useMergeRefs<Instance>(\n refs: Array<Ref<Instance> | undefined>,\n): RefCallback<Instance> | null {\n return useMemo(() => {\n if (refs.every((ref) => ref == null)) {\n return null;\n }\n\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref != null) {\n (ref as MutableRefObject<Instance | null>).current = value;\n }\n });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, refs);\n}\n"],"names":[],"mappings":";;AAsBO,SAAS,aACd,IAC8B,EAAA;AAC9B,EAAA,OAAO,QAAQ,MAAM;AACnB,IAAA,IAAI,KAAK,KAAM,CAAA,CAAC,GAAQ,KAAA,GAAA,IAAO,IAAI,CAAG,EAAA;AACpC,MAAO,OAAA,IAAA;AAAA;AAGT,IAAA,OAAO,CAAC,KAAU,KAAA;AAChB,MAAK,IAAA,CAAA,OAAA,CAAQ,CAAC,GAAQ,KAAA;AACpB,QAAI,IAAA,OAAO,QAAQ,UAAY,EAAA;AAC7B,UAAA,GAAA,CAAI,KAAK,CAAA;AAAA,SACX,MAAA,IAAW,OAAO,IAAM,EAAA;AACtB,UAAC,IAA0C,OAAU,GAAA,KAAA;AAAA;AACvD,OACD,CAAA;AAAA,KACH;AAAA,KAEC,IAAI,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"useMergeRefs-Bde85AWI.js","sources":["../src/hooks/useMergeRefs/useMergeRefs.ts"],"sourcesContent":["import {\n useMemo,\n type Ref,\n type RefCallback,\n type MutableRefObject,\n} from \"react\";\n\n/**\n * Custom hook for merging multiple React refs into a single callback ref.\n * @see https://floating-ui.com/docs/react-utils#usemergerefs\n *\n * Features:\n * - Merges an array of refs into a single callback ref\n * - Handles both function refs and object refs\n * - Optimized with useMemo for performance\n * - Returns null when all refs are null/undefined\n * - Supports generic types for type safety\n * - Automatically handles ref assignment and cleanup\n *\n * @param refs - Array of React refs to merge\n * @returns Single callback ref that handles all provided refs, or null if all refs are null\n */\nexport function useMergeRefs<Instance>(\n refs: Array<Ref<Instance> | undefined>,\n): RefCallback<Instance> | null {\n return useMemo(() => {\n if (refs.every((ref) => ref == null)) {\n return null;\n }\n\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref != null) {\n (ref as MutableRefObject<Instance | null>).current = value;\n }\n });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, refs);\n}\n"],"names":[],"mappings":";;AAsBO,SAAS,aACd,IAAA,EAC8B;AAC9B,EAAA,OAAO,QAAQ,MAAM;AACnB,IAAA,IAAI,KAAK,KAAA,CAAM,CAAC,GAAA,KAAQ,GAAA,IAAO,IAAI,CAAA,EAAG;AACpC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,CAAC,KAAA,KAAU;AAChB,MAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACpB,QAAA,IAAI,OAAO,QAAQ,UAAA,EAAY;AAC7B,UAAA,GAAA,CAAI,KAAK,CAAA;AAAA,QACX,CAAA,MAAA,IAAW,OAAO,IAAA,EAAM;AACtB,UAAC,IAA0C,OAAA,GAAU,KAAA;AAAA,QACvD;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,EAEF,GAAG,IAAI,CAAA;AACT;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { useRef, useState, useEffect, useCallback } from 'react';
2
- import { t as tabbable } from './DrawerContext-DboTgTmo.js';
2
+ import { t as tabbable } from './DrawerContext-D4tWTLVf.js';
3
3
 
4
4
  const useOpenCloseTransitionStates = (openProp, options = {
5
5
  durationMs: 0
@@ -74,6 +74,7 @@ const useKeyboardFocusables = (element, options = {
74
74
  }) => {
75
75
  const [focusables, setFocusables] = useState(null);
76
76
  const observerRef = useRef();
77
+ const mountedRef = useRef(true);
77
78
  useEffect(() => {
78
79
  const target = element instanceof HTMLElement ? element : element?.current;
79
80
  if (!target) return;
@@ -91,6 +92,7 @@ const useKeyboardFocusables = (element, options = {
91
92
  clearTimeout(timeoutId);
92
93
  }
93
94
  timeoutId = setTimeout(() => {
95
+ if (!mountedRef.current) return;
94
96
  setFocusables(targetArr);
95
97
  }, debounceDelay);
96
98
  };
@@ -109,6 +111,7 @@ const useKeyboardFocusables = (element, options = {
109
111
  }, [element, options]);
110
112
  useEffect(() => {
111
113
  return () => {
114
+ mountedRef.current = false;
112
115
  if (!observerRef.current) return;
113
116
  observerRef.current.disconnect();
114
117
  };
@@ -167,4 +170,4 @@ const useOnClickOutside = ({
167
170
  };
168
171
 
169
172
  export { useKeyboardFocusables as a, useOnClickOutside as b, useOpenCloseTransitionStates as u };
170
- //# sourceMappingURL=useOnClickOutside-BHEWMLa9.js.map
173
+ //# sourceMappingURL=useOnClickOutside-B1ddwORK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOnClickOutside-B1ddwORK.js","sources":["../src/internal/hooks/useOpenCloseTransitionStates/useOpenCloseTransitionStates.ts","../src/internal/hooks/useKeyboardFocusables/useKeyboardFocusables.ts","../src/internal/hooks/useOnClickOutside/useOnClickOutside.ts"],"sourcesContent":["import { useEffect, useState, useRef, useCallback } from \"react\";\n\n/**\n * Possible states for open/close transitions\n */\nexport type OpenCloseTransitionStates =\n | \"opening\"\n | \"open\"\n | \"closing\"\n | \"closed\";\n\n/**\n * Effects configuration for open/close transition states\n * @property {() => void} [onOpenAnimationStart] - Callback when opening animation starts\n * @property {() => void} [onCloseAnimationStart] - Callback when closing animation starts\n * @property {() => void} [onOpenAnimationComplete] - Callback when opening animation completes\n * @property {() => void} [onCloseAnimationComplete] - Callback when closing animation completes\n * @property {number | (() => number)} [durationMs] - Duration of the animation in milliseconds (or a function that returns the duration)\n */\nexport type OpenCloseTransitionStateEffects = {\n /**\n * Callback when opening animation starts\n */\n onOpenAnimationStart?: () => void;\n /**\n * Callback when closing animation starts\n */\n onCloseAnimationStart?: () => void;\n /**\n * Callback when opening animation completes\n */\n onOpenAnimationComplete?: () => void;\n /**\n * Callback when closing animation completes\n */\n onCloseAnimationComplete?: () => void;\n};\n\nexport type OpenCloseTransitionState = {\n state: OpenCloseTransitionStates;\n beginClosing: () => void;\n isOpenOrOpening: boolean;\n isClosedOrClosing: boolean;\n};\n\nexport type OpenCloseTransitionStateOptions = {\n durationMs: number | (() => number);\n onOpenAnimationStart?: () => void;\n onCloseAnimationStart?: () => void;\n onOpenAnimationComplete?: () => void;\n onCloseAnimationComplete?: () => void;\n};\n\n/**\n * Custom hook for managing open/close transition states and animations.\n *\n * @param openProp - The open prop controlling visibility\n * @param options - Additional, optional options including callbacks for animation start, complete, and initialization\n * @returns Object containing state, control functions, and utility flags\n */\nexport const useOpenCloseTransitionStates = (\n openProp: boolean | undefined,\n options: OpenCloseTransitionStateOptions = {\n durationMs: 0,\n },\n): OpenCloseTransitionState => {\n const {\n onOpenAnimationStart,\n onCloseAnimationStart,\n onOpenAnimationComplete,\n onCloseAnimationComplete,\n durationMs,\n } = options;\n const prevOpenProp = useRef<boolean | undefined>(openProp);\n const [state, setState] = useState<OpenCloseTransitionStates>(\n openProp ? \"open\" : \"closed\",\n );\n\n // Handle open/close prop changes\n useEffect(() => {\n if (prevOpenProp.current && !openProp) {\n // previously open, now closed\n setState(\"closing\");\n } else if (!prevOpenProp.current && openProp) {\n // previously closed, now open\n setState(\"opening\");\n } else {\n // Note: Using \"opening\" here catches the case where the element is initially open, allowing callbacks and animations to run.\n setState(openProp ? \"opening\" : \"closed\");\n }\n prevOpenProp.current = openProp;\n }, [openProp]);\n\n // Handle opening/closing animations\n useEffect(() => {\n if (!durationMs) return;\n if (state === \"open\" || state === \"closed\") return;\n if (state === \"opening\") {\n onOpenAnimationStart?.();\n } else if (state === \"closing\") {\n onCloseAnimationStart?.();\n }\n const d: number =\n typeof durationMs === \"function\" ? durationMs() : durationMs;\n const timeout = setTimeout(() => {\n if (state === \"opening\") {\n setState(\"open\");\n onOpenAnimationComplete?.();\n } else if (state === \"closing\") {\n setState(\"closed\");\n onCloseAnimationComplete?.();\n }\n }, d);\n\n return () => {\n clearTimeout(timeout);\n };\n }, [\n state,\n onOpenAnimationComplete,\n onCloseAnimationComplete,\n onOpenAnimationStart,\n onCloseAnimationStart,\n durationMs,\n ]);\n\n const beginClosing = useCallback(() => {\n setState(\"closing\");\n }, []);\n\n return {\n state,\n beginClosing,\n isOpenOrOpening: state === \"open\" || state === \"opening\",\n isClosedOrClosing: state === \"closed\" || state === \"closing\",\n };\n};\n","import { RefObject, useEffect, useRef, useState } from \"react\";\nimport { FocusableElement, tabbable } from \"tabbable\";\n\n/**\n * Options for the useKeyboardFocusables hook\n */\ntype OptionProps =\n | {\n /**\n * Disable mutation observer\n */\n observeChange: false;\n }\n | {\n /**\n * Enable mutation observer with optional configuration\n */\n observeChange: true;\n /**\n * Observe attribute changes\n */\n attributes?: boolean;\n /**\n * Observe text content changes\n */\n characterData?: boolean;\n /**\n * Observe child element changes\n */\n childList?: boolean;\n /**\n * Observe descendant changes\n */\n subtree?: boolean;\n };\n\n/**\n * Custom hook for tracking keyboard focusable elements within a container.\n *\n * Features:\n * - Tracks all keyboard focusable elements within a target container\n * - Supports both ref objects and direct element references\n * - Optional mutation observer for real-time updates\n * - Debounced updates to prevent excessive re-renders\n * - Configurable mutation observer options\n * - Manual update function for immediate refresh\n * - Uses tabbable library for accurate focusable detection\n * - Automatically cleans up mutation observer\n *\n * @param element - Target element or ref to monitor for focusable elements\n * @param options - Configuration options for mutation observer behavior\n * @returns Object containing current focusable elements and update function\n */\nexport const useKeyboardFocusables = (\n element: RefObject<HTMLElement> | HTMLElement | undefined,\n options: OptionProps = {\n observeChange: true,\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true,\n },\n) => {\n const [focusables, setFocusables] = useState<FocusableElement[] | null>(null);\n const observerRef = useRef<MutationObserver>();\n const mountedRef = useRef<boolean>(true);\n\n useEffect(() => {\n const target = element instanceof HTMLElement ? element : element?.current;\n if (!target) return;\n\n if (observerRef.current) return;\n if (!options.observeChange && !focusables) {\n setFocusables(tabbable(target as Element));\n return;\n }\n\n let timeoutId: NodeJS.Timeout | null = null;\n const debounceDelay = 100;\n const mutationCallback = () => {\n const targetArr = tabbable(target as Element);\n if (targetArr.length === 0) return;\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n // Set a new timeout\n timeoutId = setTimeout(() => {\n if (!mountedRef.current) return;\n // This code will execute after the debounceDelay if no new mutations occur\n setFocusables(targetArr);\n }, debounceDelay);\n };\n\n const observer = new MutationObserver(mutationCallback);\n observerRef.current = observer;\n observer.observe(target, {\n childList: true, // Observe changes to child elements\n subtree: true, // Observe changes to descendants of the target\n attributes: true, // Observe changes to attributes\n characterData: true, // Observe changes to text content\n });\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [element, options]);\n\n useEffect(() => {\n return () => {\n mountedRef.current = false;\n\n if (!observerRef.current) return;\n observerRef.current.disconnect();\n };\n }, []);\n\n const updateFocusables = () => {\n const target = element instanceof HTMLElement ? element : element?.current;\n if (!target) return;\n setFocusables(tabbable(target as Element));\n };\n\n return { focusables, updateFocusables };\n};\n","import { useEffect } from \"react\";\n\n/**\n * Props for the useOnClickOutside hook\n */\ntype UseOnClickOutsideProps = {\n /**\n * Callback when clicking outside targets\n */\n onOutsidePress?: (e: globalThis.MouseEvent) => void;\n /**\n * Callback when closing (after outside press)\n */\n onClose?: () => void;\n /**\n * Array of target elements to monitor\n */\n targets: (HTMLElement | undefined)[];\n};\n\n/**\n * Custom hook for detecting clicks outside of specified target elements.\n *\n * Features:\n * - Detects clicks outside of multiple target elements\n * - Supports both mousedown and mouseup event handling\n * - Provides separate callbacks for outside press and close actions\n * - Handles SSR environments gracefully\n * - Automatically cleans up event listeners\n * - Uses composedPath for accurate event target detection\n * - Supports optional callbacks for flexible usage\n *\n * @param props - Configuration object containing targets and optional callbacks\n * @returns void\n */\nexport const useOnClickOutside = ({\n onOutsidePress,\n targets,\n onClose,\n}: UseOnClickOutsideProps) => {\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n\n let isClosable = false;\n const onMouseDownHandler = (e: globalThis.MouseEvent) => {\n let isTarget = false;\n const path = e.composedPath();\n for (const el of targets) {\n if (el && path.includes(el)) {\n isTarget = true;\n break;\n }\n }\n\n if (!isTarget) {\n onOutsidePress?.(e);\n isClosable = true;\n }\n };\n const onMouseUpHandler = (e: globalThis.MouseEvent) => {\n if (!isClosable) return;\n let isTarget = false;\n const path = e.composedPath();\n for (const el of targets) {\n if (el && path.includes(el)) {\n isTarget = true;\n break;\n }\n }\n if (!isTarget) {\n onClose?.();\n }\n };\n\n document.addEventListener(\"mousedown\", onMouseDownHandler);\n document.addEventListener(\"mouseup\", onMouseUpHandler);\n return () => {\n document.removeEventListener(\"mousedown\", onMouseDownHandler);\n document.removeEventListener(\"mouseup\", onMouseUpHandler);\n };\n }, [onClose, onOutsidePress, targets]);\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useOptionallyControlledState-DbDuos5L.js","sources":["../src/internal/hooks/useOptionallyControlledState/useOptionallyControlledState.ts"],"sourcesContent":["import { useState, useCallback, SetStateAction, Dispatch } from \"react\";\n\n/**\n * Props for the useOptionallyControlledState hook\n */\ntype UseOptionallyControlledStateProps<T> = {\n /**\n * The controlled value of the state.\n * When provided, the component becomes controlled.\n */\n controlledValue?: T;\n /**\n * The default value of the state.\n * Used when the component is uncontrolled.\n */\n defaultValue?: T;\n /**\n * A function that is called when the value changes.\n * @param value The new value\n */\n onChange?: (value: T) => void;\n};\n\n/**\n * Custom hook for managing optionally controlled state.\n *\n * Features:\n * - Supports both controlled and uncontrolled state management\n * - Automatically switches between controlled and uncontrolled modes\n * - Provides consistent API regardless of control mode\n * - Handles onChange callbacks for both modes\n * - Uses useCallback for optimized setter function\n * - Supports generic types for flexible state values\n *\n * @param props - Configuration object containing controlled value, default value, and onChange callback\n * @returns Tuple containing current value and setter function\n */\n/**\n * Custom hook that manages state that can be either controlled or uncontrolled.\n *\n * This hook provides a unified interface for managing component state that can be\n * controlled externally or managed internally. It automatically detects whether\n * the component should be controlled based on the presence of a controlledValue.\n *\n * @param controlledValue - The controlled value (makes component controlled when provided)\n * @param defaultValue - The default value for uncontrolled mode\n * @param onChange - Callback function called when the value changes\n * @returns Tuple containing the current value and a setter function\n *\n * @example\n * const [value, setValue] = useOptionallyControlledState({\n * controlledValue: props.value,\n * defaultValue: 0,\n * onChange: props.onChange\n * });\n */\nexport function useOptionallyControlledState<T>({\n controlledValue,\n defaultValue,\n onChange,\n}: UseOptionallyControlledStateProps<T>): [\n T,\n Dispatch<SetStateAction<T | undefined>>,\n] {\n const [internalValue, setInternalValue] = useState<T | undefined>(\n defaultValue,\n );\n\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : internalValue;\n\n const setValue = useCallback(\n (newValue: SetStateAction<T | undefined>) => {\n if (!isControlled) {\n setInternalValue(newValue);\n }\n if (typeof newValue === \"function\") {\n onChange?.(\n (newValue as (prevState: T | undefined) => T | undefined)(value) ??\n (value as T),\n );\n } else {\n onChange?.(newValue as T);\n }\n },\n [isControlled, onChange, value],\n );\n\n return [value as T, setValue];\n}\n"],"names":[],"mappings":";;AAwDO,SAAS,4BAAgC,CAAA;AAAA,EAC9C,eAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAGE,EAAA;AACA,EAAM,MAAA,CAAC,aAAe,EAAA,gBAAgB,CAAI,GAAA,QAAA;AAAA,IACxC;AAAA,GACF;AAEA,EAAA,MAAM,eAAe,eAAoB,KAAA,MAAA;AACzC,EAAM,MAAA,KAAA,GAAQ,eAAe,eAAkB,GAAA,aAAA;AAE/C,EAAA,MAAM,QAAW,GAAA,WAAA;AAAA,IACf,CAAC,QAA4C,KAAA;AAC3C,MAAA,IAAI,CAAC,YAAc,EAAA;AACjB,QAAA,gBAAA,CAAiB,QAAQ,CAAA;AAAA;AAE3B,MAAI,IAAA,OAAO,aAAa,UAAY,EAAA;AAClC,QAAA,QAAA;AAAA,UACG,QAAA,CAAyD,KAAK,CAC5D,IAAA;AAAA,SACL;AAAA,OACK,MAAA;AACL,QAAA,QAAA,GAAW,QAAa,CAAA;AAAA;AAC1B,KACF;AAAA,IACA,CAAC,YAAc,EAAA,QAAA,EAAU,KAAK;AAAA,GAChC;AAEA,EAAO,OAAA,CAAC,OAAY,QAAQ,CAAA;AAC9B;;;;"}
1
+ {"version":3,"file":"useOptionallyControlledState-DbDuos5L.js","sources":["../src/internal/hooks/useOptionallyControlledState/useOptionallyControlledState.ts"],"sourcesContent":["import { useState, useCallback, SetStateAction, Dispatch } from \"react\";\n\n/**\n * Props for the useOptionallyControlledState hook\n */\ntype UseOptionallyControlledStateProps<T> = {\n /**\n * The controlled value of the state.\n * When provided, the component becomes controlled.\n */\n controlledValue?: T;\n /**\n * The default value of the state.\n * Used when the component is uncontrolled.\n */\n defaultValue?: T;\n /**\n * A function that is called when the value changes.\n * @param value The new value\n */\n onChange?: (value: T) => void;\n};\n\n/**\n * Custom hook for managing optionally controlled state.\n *\n * Features:\n * - Supports both controlled and uncontrolled state management\n * - Automatically switches between controlled and uncontrolled modes\n * - Provides consistent API regardless of control mode\n * - Handles onChange callbacks for both modes\n * - Uses useCallback for optimized setter function\n * - Supports generic types for flexible state values\n *\n * @param props - Configuration object containing controlled value, default value, and onChange callback\n * @returns Tuple containing current value and setter function\n */\n/**\n * Custom hook that manages state that can be either controlled or uncontrolled.\n *\n * This hook provides a unified interface for managing component state that can be\n * controlled externally or managed internally. It automatically detects whether\n * the component should be controlled based on the presence of a controlledValue.\n *\n * @param controlledValue - The controlled value (makes component controlled when provided)\n * @param defaultValue - The default value for uncontrolled mode\n * @param onChange - Callback function called when the value changes\n * @returns Tuple containing the current value and a setter function\n *\n * @example\n * const [value, setValue] = useOptionallyControlledState({\n * controlledValue: props.value,\n * defaultValue: 0,\n * onChange: props.onChange\n * });\n */\nexport function useOptionallyControlledState<T>({\n controlledValue,\n defaultValue,\n onChange,\n}: UseOptionallyControlledStateProps<T>): [\n T,\n Dispatch<SetStateAction<T | undefined>>,\n] {\n const [internalValue, setInternalValue] = useState<T | undefined>(\n defaultValue,\n );\n\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : internalValue;\n\n const setValue = useCallback(\n (newValue: SetStateAction<T | undefined>) => {\n if (!isControlled) {\n setInternalValue(newValue);\n }\n if (typeof newValue === \"function\") {\n onChange?.(\n (newValue as (prevState: T | undefined) => T | undefined)(value) ??\n (value as T),\n );\n } else {\n onChange?.(newValue as T);\n }\n },\n [isControlled, onChange, value],\n );\n\n return [value as T, setValue];\n}\n"],"names":[],"mappings":";;AAwDO,SAAS,4BAAA,CAAgC;AAAA,EAC9C,eAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAGE;AACA,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA;AAAA,IACxC;AAAA,GACF;AAEA,EAAA,MAAM,eAAe,eAAA,KAAoB,MAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,eAAe,eAAA,GAAkB,aAAA;AAE/C,EAAA,MAAM,QAAA,GAAW,WAAA;AAAA,IACf,CAAC,QAAA,KAA4C;AAC3C,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,gBAAA,CAAiB,QAAQ,CAAA;AAAA,MAC3B;AACA,MAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,QAAA,QAAA;AAAA,UACG,QAAA,CAAyD,KAAK,CAAA,IAC5D;AAAA,SACL;AAAA,MACF,CAAA,MAAO;AACL,QAAA,QAAA,GAAW,QAAa,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,YAAA,EAAc,QAAA,EAAU,KAAK;AAAA,GAChC;AAEA,EAAA,OAAO,CAAC,OAAY,QAAQ,CAAA;AAC9B;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"usePopoverCloseDelayWorkaround-BZcjPkvT.js","sources":["../src/internal/hooks/usePopoverCloseDelayWorkaround/usePopoverCloseDelayWorkaround.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\n// The Popover continues to render Popover.Content for X milliseconds after the popover is closed.\n// To prevent the popover content from appearing empty, we need to continue to show it inside Popover.Content for X milliseconds.\n// This is just a hack until we have a `onCloseAnimationEnd` prop on Popover.\nexport const usePopoverCloseDelayWorkaround = (\n popoverOpen: boolean,\n delay: number = 300,\n) => {\n const [shouldShowContent, setShouldShowContent] = useState(popoverOpen);\n\n useEffect(() => {\n if (!popoverOpen) {\n const timeout = setTimeout(() => {\n setShouldShowContent(false);\n }, delay);\n return () => clearTimeout(timeout);\n }\n setShouldShowContent(true);\n }, [popoverOpen, delay]);\n\n return shouldShowContent;\n};\n"],"names":[],"mappings":";;AAKO,MAAM,8BAAiC,GAAA,CAC5C,WACA,EAAA,KAAA,GAAgB,GACb,KAAA;AACH,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAS,WAAW,CAAA;AAEtE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAa,EAAA;AAChB,MAAM,MAAA,OAAA,GAAU,WAAW,MAAM;AAC/B,QAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,SACzB,KAAK,CAAA;AACR,MAAO,OAAA,MAAM,aAAa,OAAO,CAAA;AAAA;AAEnC,IAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,GACxB,EAAA,CAAC,WAAa,EAAA,KAAK,CAAC,CAAA;AAEvB,EAAO,OAAA,iBAAA;AACT;;;;"}
1
+ {"version":3,"file":"usePopoverCloseDelayWorkaround-BZcjPkvT.js","sources":["../src/internal/hooks/usePopoverCloseDelayWorkaround/usePopoverCloseDelayWorkaround.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\n// The Popover continues to render Popover.Content for X milliseconds after the popover is closed.\n// To prevent the popover content from appearing empty, we need to continue to show it inside Popover.Content for X milliseconds.\n// This is just a hack until we have a `onCloseAnimationEnd` prop on Popover.\nexport const usePopoverCloseDelayWorkaround = (\n popoverOpen: boolean,\n delay: number = 300,\n) => {\n const [shouldShowContent, setShouldShowContent] = useState(popoverOpen);\n\n useEffect(() => {\n if (!popoverOpen) {\n const timeout = setTimeout(() => {\n setShouldShowContent(false);\n }, delay);\n return () => clearTimeout(timeout);\n }\n setShouldShowContent(true);\n }, [popoverOpen, delay]);\n\n return shouldShowContent;\n};\n"],"names":[],"mappings":";;AAKO,MAAM,8BAAA,GAAiC,CAC5C,WAAA,EACA,KAAA,GAAgB,GAAA,KACb;AACH,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAS,WAAW,CAAA;AAEtE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,QAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,MAC5B,GAAG,KAAK,CAAA;AACR,MAAA,OAAO,MAAM,aAAa,OAAO,CAAA;AAAA,IACnC;AACA,IAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,WAAA,EAAa,KAAK,CAAC,CAAA;AAEvB,EAAA,OAAO,iBAAA;AACT;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { useState, useEffect } from 'react';
2
- import { s as supportsPopover } from './DrawerContext-DboTgTmo.js';
2
+ import { s as supportsPopover } from './DrawerContext-D4tWTLVf.js';
3
3
 
4
4
  function usePopoverSupport() {
5
5
  const [popoverSupported, setPopoverSupported] = useState(
@@ -12,4 +12,4 @@ function usePopoverSupport() {
12
12
  }
13
13
 
14
14
  export { usePopoverSupport as u };
15
- //# sourceMappingURL=usePopoverSupport-DIjjfodl.js.map
15
+ //# sourceMappingURL=usePopoverSupport-CWTCDfN2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePopoverSupport-DIjjfodl.js","sources":["../src/internal/hooks/usePopoverSupport/usePopoverSupport.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { supportsPopover } from \"../../functions/supportsPopover\";\n\nexport function usePopoverSupport() {\n const [popoverSupported, setPopoverSupported] = useState<boolean | undefined>(\n undefined,\n );\n\n useEffect(() => {\n setPopoverSupported(supportsPopover());\n }, []);\n\n return popoverSupported;\n}\n"],"names":[],"mappings":";;;AAGO,SAAS,iBAAoB,GAAA;AAClC,EAAM,MAAA,CAAC,gBAAkB,EAAA,mBAAmB,CAAI,GAAA,QAAA;AAAA,IAC9C;AAAA,GACF;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,mBAAA,CAAoB,iBAAiB,CAAA;AAAA,GACvC,EAAG,EAAE,CAAA;AAEL,EAAO,OAAA,gBAAA;AACT;;;;"}
1
+ {"version":3,"file":"usePopoverSupport-CWTCDfN2.js","sources":["../src/internal/hooks/usePopoverSupport/usePopoverSupport.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { supportsPopover } from \"../../functions/supportsPopover\";\n\nexport function usePopoverSupport() {\n const [popoverSupported, setPopoverSupported] = useState<boolean | undefined>(\n undefined,\n );\n\n useEffect(() => {\n setPopoverSupported(supportsPopover());\n }, []);\n\n return popoverSupported;\n}\n"],"names":[],"mappings":";;;AAGO,SAAS,iBAAA,GAAoB;AAClC,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,QAAA;AAAA,IAC9C;AAAA,GACF;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,mBAAA,CAAoB,iBAAiB,CAAA;AAAA,EACvC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,gBAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"usePrefersColorScheme-_hT7dK7_.js","sources":["../src/hooks/usePrefersColorScheme/usePrefersColorScheme.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\n/**\n * Custom hook for detecting system color scheme preference.\n *\n * Features:\n * - Detects system dark/light mode preference\n * - Listens for changes in system color scheme\n * - Supports both modern and legacy event listeners\n * - Handles SSR environments gracefully\n * - Automatically cleans up event listeners\n * - Returns consistent light/dark mode values\n *\n * @returns Object containing current color scheme mode\n */\nexport const usePrefersColorScheme = (): { mode: \"light\" | \"dark\" } => {\n const [systemPrefersDark, setSystemPrefersDark] = useState();\n\n useEffect(() => {\n function isSystemDark(event: any) {\n setSystemPrefersDark(event.matches);\n }\n if (typeof window !== \"undefined\") {\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n\n if (mediaQuery?.addEventListener != null) {\n mediaQuery.addEventListener(\"change\", isSystemDark);\n } else {\n mediaQuery.addListener(isSystemDark);\n }\n\n return () => {\n if (mediaQuery?.addEventListener != null) {\n mediaQuery.removeEventListener(\"change\", isSystemDark);\n } else {\n mediaQuery.removeListener(isSystemDark);\n }\n };\n }\n }, []);\n\n return {\n mode: systemPrefersDark ? \"dark\" : \"light\",\n };\n};\n"],"names":[],"mappings":";;AAeO,MAAM,wBAAwB,MAAkC;AACrE,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,QAAS,EAAA;AAE3D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,SAAS,aAAa,KAAY,EAAA;AAChC,MAAA,oBAAA,CAAqB,MAAM,OAAO,CAAA;AAAA;AAEpC,IAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AACjC,MAAM,MAAA,UAAA,GAAa,MAAO,CAAA,UAAA,CAAW,8BAA8B,CAAA;AAEnE,MAAI,IAAA,UAAA,EAAY,oBAAoB,IAAM,EAAA;AACxC,QAAW,UAAA,CAAA,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAAA,OAC7C,MAAA;AACL,QAAA,UAAA,CAAW,YAAY,YAAY,CAAA;AAAA;AAGrC,MAAA,OAAO,MAAM;AACX,QAAI,IAAA,UAAA,EAAY,oBAAoB,IAAM,EAAA;AACxC,UAAW,UAAA,CAAA,mBAAA,CAAoB,UAAU,YAAY,CAAA;AAAA,SAChD,MAAA;AACL,UAAA,UAAA,CAAW,eAAe,YAAY,CAAA;AAAA;AACxC,OACF;AAAA;AACF,GACF,EAAG,EAAE,CAAA;AAEL,EAAO,OAAA;AAAA,IACL,IAAA,EAAM,oBAAoB,MAAS,GAAA;AAAA,GACrC;AACF;;;;"}
1
+ {"version":3,"file":"usePrefersColorScheme-_hT7dK7_.js","sources":["../src/hooks/usePrefersColorScheme/usePrefersColorScheme.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\n/**\n * Custom hook for detecting system color scheme preference.\n *\n * Features:\n * - Detects system dark/light mode preference\n * - Listens for changes in system color scheme\n * - Supports both modern and legacy event listeners\n * - Handles SSR environments gracefully\n * - Automatically cleans up event listeners\n * - Returns consistent light/dark mode values\n *\n * @returns Object containing current color scheme mode\n */\nexport const usePrefersColorScheme = (): { mode: \"light\" | \"dark\" } => {\n const [systemPrefersDark, setSystemPrefersDark] = useState();\n\n useEffect(() => {\n function isSystemDark(event: any) {\n setSystemPrefersDark(event.matches);\n }\n if (typeof window !== \"undefined\") {\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n\n if (mediaQuery?.addEventListener != null) {\n mediaQuery.addEventListener(\"change\", isSystemDark);\n } else {\n mediaQuery.addListener(isSystemDark);\n }\n\n return () => {\n if (mediaQuery?.addEventListener != null) {\n mediaQuery.removeEventListener(\"change\", isSystemDark);\n } else {\n mediaQuery.removeListener(isSystemDark);\n }\n };\n }\n }, []);\n\n return {\n mode: systemPrefersDark ? \"dark\" : \"light\",\n };\n};\n"],"names":[],"mappings":";;AAeO,MAAM,wBAAwB,MAAkC;AACrE,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,QAAA,EAAS;AAE3D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,SAAS,aAAa,KAAA,EAAY;AAChC,MAAA,oBAAA,CAAqB,MAAM,OAAO,CAAA;AAAA,IACpC;AACA,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA;AAEnE,MAAA,IAAI,UAAA,EAAY,oBAAoB,IAAA,EAAM;AACxC,QAAA,UAAA,CAAW,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAAA,MACpD,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,YAAY,YAAY,CAAA;AAAA,MACrC;AAEA,MAAA,OAAO,MAAM;AACX,QAAA,IAAI,UAAA,EAAY,oBAAoB,IAAA,EAAM;AACxC,UAAA,UAAA,CAAW,mBAAA,CAAoB,UAAU,YAAY,CAAA;AAAA,QACvD,CAAA,MAAO;AACL,UAAA,UAAA,CAAW,eAAe,YAAY,CAAA;AAAA,QACxC;AAAA,MACF,CAAA;AAAA,IACF;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,oBAAoB,MAAA,GAAS;AAAA,GACrC;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"usePrevious-Bvq-5auG.js","sources":["../src/internal/hooks/usePrevious/usePrevious.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\n\nexport function usePrevious<T>(value: T, initialValue?: T): T | undefined {\n const ref = useRef<T | undefined>(initialValue); // Create a ref to store the previous value\n\n useEffect(() => {\n ref.current = value; // Update the ref's current value after render\n }, [value]); // Re-run effect only when 'value' changes\n\n return ref.current; // Return the value from the previous render\n}\n"],"names":[],"mappings":";;AAEgB,SAAA,WAAA,CAAe,OAAU,YAAiC,EAAA;AACxE,EAAM,MAAA,GAAA,GAAM,OAAsB,YAAY,CAAA;AAE9C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,GAAA,CAAI,OAAU,GAAA,KAAA;AAAA,GAChB,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,OAAO,GAAI,CAAA,OAAA;AACb;;;;"}
1
+ {"version":3,"file":"usePrevious-Bvq-5auG.js","sources":["../src/internal/hooks/usePrevious/usePrevious.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\n\nexport function usePrevious<T>(value: T, initialValue?: T): T | undefined {\n const ref = useRef<T | undefined>(initialValue); // Create a ref to store the previous value\n\n useEffect(() => {\n ref.current = value; // Update the ref's current value after render\n }, [value]); // Re-run effect only when 'value' changes\n\n return ref.current; // Return the value from the previous render\n}\n"],"names":[],"mappings":";;AAEO,SAAS,WAAA,CAAe,OAAU,YAAA,EAAiC;AACxE,EAAA,MAAM,GAAA,GAAM,OAAsB,YAAY,CAAA;AAE9C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,GAAA,CAAI,OAAA,GAAU,KAAA;AAAA,EAChB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,OAAO,GAAA,CAAI,OAAA;AACb;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useSize.js","sources":["../../../node_modules/.pnpm/@react-hook+passive-layout-effect@1.2.1_react@18.2.0/node_modules/@react-hook/passive-layout-effect/dist/module/index.js","../../../node_modules/.pnpm/@react-hook+latest@1.0.3_react@18.2.0/node_modules/@react-hook/latest/dist/module/index.js","../../../node_modules/.pnpm/@react-hook+resize-observer@2.0.2_react@18.2.0/node_modules/@react-hook/resize-observer/dist/module/index.js","../src/hooks/useSize/index.ts"],"sourcesContent":["import React from 'react';\nconst usePassiveLayoutEffect = React[typeof document !== 'undefined' && document.createElement !== void 0 ? 'useLayoutEffect' : 'useEffect'];\nexport default usePassiveLayoutEffect;","import * as React from 'react';\n\nconst useLatest = current => {\n const storedValue = React.useRef(current);\n React.useEffect(() => {\n storedValue.current = current;\n });\n return storedValue;\n};\n\nexport default useLatest;","/* eslint-disable no-return-assign */\n/* eslint-disable no-underscore-dangle */\n\nimport useLayoutEffect from '@react-hook/passive-layout-effect';\nimport useLatest from '@react-hook/latest';\n\n/**\n * A React hook that fires a callback whenever ResizeObserver detects a change to its size\n *\n * @param target A React ref created by `useRef()` or an HTML element\n * @param callback Invoked with a single `ResizeObserverEntry` any time\n * the `target` resizes\n */\n\nfunction _ref() {}\nfunction useResizeObserver(target, callback, options = {}) {\n const resizeObserver = getResizeObserver(options.polyfill);\n const storedCallback = useLatest(callback);\n useLayoutEffect(() => {\n let didUnsubscribe = false;\n const targetEl = target && 'current' in target ? target.current : target;\n if (!targetEl) return _ref;\n function cb(entry, observer) {\n if (didUnsubscribe) return;\n storedCallback.current(entry, observer);\n }\n resizeObserver.subscribe(targetEl, cb);\n return () => {\n didUnsubscribe = true;\n resizeObserver.unsubscribe(targetEl, cb);\n };\n }, [target, resizeObserver, storedCallback]);\n return resizeObserver.observer;\n}\nfunction createResizeObserver(polyfill) {\n let ticking = false;\n let allEntries = [];\n const callbacks = new Map();\n const observer = new (polyfill || window.ResizeObserver)((entries, obs) => {\n allEntries = allEntries.concat(entries);\n function _ref2() {\n const triggered = new Set();\n for (let i = 0; i < allEntries.length; i++) {\n if (triggered.has(allEntries[i].target)) continue;\n triggered.add(allEntries[i].target);\n const cbs = callbacks.get(allEntries[i].target);\n cbs === null || cbs === void 0 ? void 0 : cbs.forEach(cb => cb(allEntries[i], obs));\n }\n allEntries = [];\n ticking = false;\n }\n if (!ticking) {\n window.requestAnimationFrame(_ref2);\n }\n ticking = true;\n });\n return {\n observer,\n subscribe(target, callback) {\n var _callbacks$get;\n observer.observe(target);\n const cbs = (_callbacks$get = callbacks.get(target)) !== null && _callbacks$get !== void 0 ? _callbacks$get : [];\n cbs.push(callback);\n callbacks.set(target, cbs);\n },\n unsubscribe(target, callback) {\n var _callbacks$get2;\n const cbs = (_callbacks$get2 = callbacks.get(target)) !== null && _callbacks$get2 !== void 0 ? _callbacks$get2 : [];\n if (cbs.length === 1) {\n observer.unobserve(target);\n callbacks.delete(target);\n return;\n }\n const cbIndex = cbs.indexOf(callback);\n if (cbIndex !== -1) cbs.splice(cbIndex, 1);\n callbacks.set(target, cbs);\n }\n };\n}\nlet _resizeObserver;\nconst getResizeObserver = polyfill => !_resizeObserver ? _resizeObserver = createResizeObserver(polyfill) : _resizeObserver;\nexport default useResizeObserver;","import useResizeObserver from \"@react-hook/resize-observer\";\nimport { RefObject, useLayoutEffect, useState } from \"react\";\n\n/**\n * Custom hook for measuring element dimensions and tracking size changes.\n *\n * Features:\n * - Measures element dimensions using getBoundingClientRect\n * - Tracks size changes using ResizeObserver\n * - Provides real-time size updates\n * - Handles initial size measurement on mount\n * - Returns DOMRectReadOnly for comprehensive size information\n * - Automatically cleans up observer on unmount\n * - Uses useLayoutEffect for immediate initial measurement\n *\n * @param target - Reference to the element to measure\n * @returns Current element size as DOMRectReadOnly or undefined\n */\nexport const useSize = (target: RefObject<HTMLElement>) => {\n const [size, setSize] = useState<DOMRectReadOnly>();\n\n useLayoutEffect(() => {\n setSize(target.current?.getBoundingClientRect());\n }, [target]);\n\n useResizeObserver(target, (entry) => setSize(entry.contentRect));\n return size;\n};\n\nexport default useSize;\n"],"names":["React","useLayoutEffect"],"mappings":"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","x_google_ignoreList":[0,1,2]}
1
+ {"version":3,"file":"useSize.js","sources":["../../../node_modules/.pnpm/@react-hook+passive-layout-effect@1.2.1_react@18.2.0/node_modules/@react-hook/passive-layout-effect/dist/module/index.js","../../../node_modules/.pnpm/@react-hook+latest@1.0.3_react@18.2.0/node_modules/@react-hook/latest/dist/module/index.js","../../../node_modules/.pnpm/@react-hook+resize-observer@2.0.2_react@18.2.0/node_modules/@react-hook/resize-observer/dist/module/index.js","../src/hooks/useSize/index.ts"],"sourcesContent":["import React from 'react';\nconst usePassiveLayoutEffect = React[typeof document !== 'undefined' && document.createElement !== void 0 ? 'useLayoutEffect' : 'useEffect'];\nexport default usePassiveLayoutEffect;","import * as React from 'react';\n\nconst useLatest = current => {\n const storedValue = React.useRef(current);\n React.useEffect(() => {\n storedValue.current = current;\n });\n return storedValue;\n};\n\nexport default useLatest;","/* eslint-disable no-return-assign */\n/* eslint-disable no-underscore-dangle */\n\nimport useLayoutEffect from '@react-hook/passive-layout-effect';\nimport useLatest from '@react-hook/latest';\n\n/**\n * A React hook that fires a callback whenever ResizeObserver detects a change to its size\n *\n * @param target A React ref created by `useRef()` or an HTML element\n * @param callback Invoked with a single `ResizeObserverEntry` any time\n * the `target` resizes\n */\n\nfunction _ref() {}\nfunction useResizeObserver(target, callback, options = {}) {\n const resizeObserver = getResizeObserver(options.polyfill);\n const storedCallback = useLatest(callback);\n useLayoutEffect(() => {\n let didUnsubscribe = false;\n const targetEl = target && 'current' in target ? target.current : target;\n if (!targetEl) return _ref;\n function cb(entry, observer) {\n if (didUnsubscribe) return;\n storedCallback.current(entry, observer);\n }\n resizeObserver.subscribe(targetEl, cb);\n return () => {\n didUnsubscribe = true;\n resizeObserver.unsubscribe(targetEl, cb);\n };\n }, [target, resizeObserver, storedCallback]);\n return resizeObserver.observer;\n}\nfunction createResizeObserver(polyfill) {\n let ticking = false;\n let allEntries = [];\n const callbacks = new Map();\n const observer = new (polyfill || window.ResizeObserver)((entries, obs) => {\n allEntries = allEntries.concat(entries);\n function _ref2() {\n const triggered = new Set();\n for (let i = 0; i < allEntries.length; i++) {\n if (triggered.has(allEntries[i].target)) continue;\n triggered.add(allEntries[i].target);\n const cbs = callbacks.get(allEntries[i].target);\n cbs === null || cbs === void 0 ? void 0 : cbs.forEach(cb => cb(allEntries[i], obs));\n }\n allEntries = [];\n ticking = false;\n }\n if (!ticking) {\n window.requestAnimationFrame(_ref2);\n }\n ticking = true;\n });\n return {\n observer,\n subscribe(target, callback) {\n var _callbacks$get;\n observer.observe(target);\n const cbs = (_callbacks$get = callbacks.get(target)) !== null && _callbacks$get !== void 0 ? _callbacks$get : [];\n cbs.push(callback);\n callbacks.set(target, cbs);\n },\n unsubscribe(target, callback) {\n var _callbacks$get2;\n const cbs = (_callbacks$get2 = callbacks.get(target)) !== null && _callbacks$get2 !== void 0 ? _callbacks$get2 : [];\n if (cbs.length === 1) {\n observer.unobserve(target);\n callbacks.delete(target);\n return;\n }\n const cbIndex = cbs.indexOf(callback);\n if (cbIndex !== -1) cbs.splice(cbIndex, 1);\n callbacks.set(target, cbs);\n }\n };\n}\nlet _resizeObserver;\nconst getResizeObserver = polyfill => !_resizeObserver ? _resizeObserver = createResizeObserver(polyfill) : _resizeObserver;\nexport default useResizeObserver;","import useResizeObserver from \"@react-hook/resize-observer\";\nimport { RefObject, useLayoutEffect, useState } from \"react\";\n\n/**\n * Custom hook for measuring element dimensions and tracking size changes.\n *\n * Features:\n * - Measures element dimensions using getBoundingClientRect\n * - Tracks size changes using ResizeObserver\n * - Provides real-time size updates\n * - Handles initial size measurement on mount\n * - Returns DOMRectReadOnly for comprehensive size information\n * - Automatically cleans up observer on unmount\n * - Uses useLayoutEffect for immediate initial measurement\n *\n * @param target - Reference to the element to measure\n * @returns Current element size as DOMRectReadOnly or undefined\n */\nexport const useSize = (target: RefObject<HTMLElement>) => {\n const [size, setSize] = useState<DOMRectReadOnly>();\n\n useLayoutEffect(() => {\n setSize(target.current?.getBoundingClientRect());\n }, [target]);\n\n useResizeObserver(target, (entry) => setSize(entry.contentRect));\n return size;\n};\n\nexport default useSize;\n"],"names":["React","useLayoutEffect"],"mappings":"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","x_google_ignoreList":[0,1,2]}
@@ -10,7 +10,7 @@ const useSwipe = (func) => {
10
10
  if (!touchStart || !touchEnd) return;
11
11
  const distance = touchStart - touchEnd;
12
12
  const isLeftSwipe = distance > minSwipeDistance;
13
- const isRightSwipe = distance < -50;
13
+ const isRightSwipe = distance < -minSwipeDistance;
14
14
  let dir = null;
15
15
  if (isLeftSwipe) dir = "left";
16
16
  if (isRightSwipe) dir = "right";
@@ -25,4 +25,4 @@ const useSwipe = (func) => {
25
25
  };
26
26
 
27
27
  export { useSwipe as u };
28
- //# sourceMappingURL=useSwipe-CULmVQEk.js.map
28
+ //# sourceMappingURL=useSwipe-Cp-CJxLU.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSwipe-CULmVQEk.js","sources":["../src/hooks/useSwipe/useSwipe.ts"],"sourcesContent":["import { useState, TouchEvent } from \"react\";\n\n/**\n * Type definition for swipe direction\n * @property {string | null} direction - The direction of the swipe (left, right, or null)\n */\nexport type UseSwipeFn = {\n /**\n * The direction of the swipe (left, right, or null)\n */\n direction: string | null;\n};\n\n/**\n * Custom hook for detecting swipe gestures on touch devices.\n *\n * Features:\n * - Detects left and right swipe gestures\n * - Configurable minimum swipe distance threshold\n * - Provides touch event handlers for easy integration\n * - Supports optional callback function for swipe events\n * - Tracks current swipe direction state\n * - Handles touch start, move, and end events\n * - Prevents false positives from regular touch events\n *\n * @param func - Optional callback function called when a swipe is detected\n * @returns Object containing touch event handlers and current swipe direction\n */\nexport const useSwipe = (\n func?: (direction: UseSwipeFn[\"direction\"]) => void,\n) => {\n const [direction, setDirection] = useState<null | string>(null);\n const [touchStart, setTouchStart] = useState<null | number>(null);\n const [touchEnd, setTouchEnd] = useState<null | number>(null);\n const minSwipeDistance = 50;\n const onTouchMove = (e: TouchEvent<HTMLElement>) =>\n setTouchEnd(e.targetTouches[0].clientX);\n\n const onTouchEnd = (_e: TouchEvent<HTMLElement>) => {\n if (!touchStart || !touchEnd) return;\n const distance = touchStart - touchEnd;\n const isLeftSwipe = distance > minSwipeDistance;\n const isRightSwipe = distance < -minSwipeDistance;\n let dir = null;\n if (isLeftSwipe) dir = \"left\";\n if (isRightSwipe) dir = \"right\";\n\n func?.(dir);\n setDirection(dir);\n };\n\n const onTouchStart = (e: TouchEvent<HTMLElement>) => {\n setTouchEnd(null); // otherwise the swipe is fired even with usual touch events\n setTouchStart(e.targetTouches[0].clientX);\n };\n\n return { onTouchMove, onTouchEnd, onTouchStart, direction };\n};\n"],"names":[],"mappings":";;AA4Ba,MAAA,QAAA,GAAW,CACtB,IACG,KAAA;AACH,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,gBAAmB,GAAA,EAAA;AACzB,EAAM,MAAA,WAAA,GAAc,CAAC,CACnB,KAAA,WAAA,CAAY,EAAE,aAAc,CAAA,CAAC,EAAE,OAAO,CAAA;AAExC,EAAM,MAAA,UAAA,GAAa,CAAC,EAAgC,KAAA;AAClD,IAAI,IAAA,CAAC,UAAc,IAAA,CAAC,QAAU,EAAA;AAC9B,IAAA,MAAM,WAAW,UAAa,GAAA,QAAA;AAC9B,IAAA,MAAM,cAAc,QAAW,GAAA,gBAAA;AAC/B,IAAM,MAAA,YAAA,GAAe,WAAW,GAAC;AACjC,IAAA,IAAI,GAAM,GAAA,IAAA;AACV,IAAA,IAAI,aAAmB,GAAA,GAAA,MAAA;AACvB,IAAA,IAAI,cAAoB,GAAA,GAAA,OAAA;AAExB,IAAA,IAAA,GAAO,GAAG,CAAA;AACV,IAAA,YAAA,CAAa,GAAG,CAAA;AAAA,GAClB;AAEA,EAAM,MAAA,YAAA,GAAe,CAAC,CAA+B,KAAA;AACnD,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,aAAA,CAAc,CAAE,CAAA,aAAA,CAAc,CAAC,CAAA,CAAE,OAAO,CAAA;AAAA,GAC1C;AAEA,EAAA,OAAO,EAAE,WAAA,EAAa,UAAY,EAAA,YAAA,EAAc,SAAU,EAAA;AAC5D;;;;"}
1
+ {"version":3,"file":"useSwipe-Cp-CJxLU.js","sources":["../src/hooks/useSwipe/useSwipe.ts"],"sourcesContent":["import { useState, TouchEvent } from \"react\";\n\n/**\n * Type definition for swipe direction\n * @property {string | null} direction - The direction of the swipe (left, right, or null)\n */\nexport type UseSwipeFn = {\n /**\n * The direction of the swipe (left, right, or null)\n */\n direction: string | null;\n};\n\n/**\n * Custom hook for detecting swipe gestures on touch devices.\n *\n * Features:\n * - Detects left and right swipe gestures\n * - Configurable minimum swipe distance threshold\n * - Provides touch event handlers for easy integration\n * - Supports optional callback function for swipe events\n * - Tracks current swipe direction state\n * - Handles touch start, move, and end events\n * - Prevents false positives from regular touch events\n *\n * @param func - Optional callback function called when a swipe is detected\n * @returns Object containing touch event handlers and current swipe direction\n */\nexport const useSwipe = (\n func?: (direction: UseSwipeFn[\"direction\"]) => void,\n) => {\n const [direction, setDirection] = useState<null | string>(null);\n const [touchStart, setTouchStart] = useState<null | number>(null);\n const [touchEnd, setTouchEnd] = useState<null | number>(null);\n const minSwipeDistance = 50;\n const onTouchMove = (e: TouchEvent<HTMLElement>) =>\n setTouchEnd(e.targetTouches[0].clientX);\n\n const onTouchEnd = (_e: TouchEvent<HTMLElement>) => {\n if (!touchStart || !touchEnd) return;\n const distance = touchStart - touchEnd;\n const isLeftSwipe = distance > minSwipeDistance;\n const isRightSwipe = distance < -minSwipeDistance;\n let dir = null;\n if (isLeftSwipe) dir = \"left\";\n if (isRightSwipe) dir = \"right\";\n\n func?.(dir);\n setDirection(dir);\n };\n\n const onTouchStart = (e: TouchEvent<HTMLElement>) => {\n setTouchEnd(null); // otherwise the swipe is fired even with usual touch events\n setTouchStart(e.targetTouches[0].clientX);\n };\n\n return { onTouchMove, onTouchEnd, onTouchStart, direction };\n};\n"],"names":[],"mappings":";;AA4BO,MAAM,QAAA,GAAW,CACtB,IAAA,KACG;AACH,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,gBAAA,GAAmB,EAAA;AACzB,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KACnB,WAAA,CAAY,EAAE,aAAA,CAAc,CAAC,EAAE,OAAO,CAAA;AAExC,EAAA,MAAM,UAAA,GAAa,CAAC,EAAA,KAAgC;AAClD,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,QAAA,EAAU;AAC9B,IAAA,MAAM,WAAW,UAAA,GAAa,QAAA;AAC9B,IAAA,MAAM,cAAc,QAAA,GAAW,gBAAA;AAC/B,IAAA,MAAM,YAAA,GAAe,WAAW,CAAC,gBAAA;AACjC,IAAA,IAAI,GAAA,GAAM,IAAA;AACV,IAAA,IAAI,aAAa,GAAA,GAAM,MAAA;AACvB,IAAA,IAAI,cAAc,GAAA,GAAM,OAAA;AAExB,IAAA,IAAA,GAAO,GAAG,CAAA;AACV,IAAA,YAAA,CAAa,GAAG,CAAA;AAAA,EAClB,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAA+B;AACnD,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,aAAA,CAAc,CAAA,CAAE,aAAA,CAAc,CAAC,CAAA,CAAE,OAAO,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,OAAO,EAAE,WAAA,EAAa,UAAA,EAAY,YAAA,EAAc,SAAA,EAAU;AAC5D;;;;"}
package/dist/useSwipe.js CHANGED
@@ -1,2 +1,2 @@
1
- export { u as default, u as useSwipe } from './useSwipe-CULmVQEk.js';
1
+ export { u as default, u as useSwipe } from './useSwipe-Cp-CJxLU.js';
2
2
  //# sourceMappingURL=useSwipe.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTrackingContext-DRwDL8DE.js","sources":["../src/providers/TrackingProvider/useTrackingContext.tsx"],"sourcesContent":["import { useContext } from \"react\";\nimport { TrackingContext } from \"./TrackingProvider\";\n\nexport const useTrackingContext = () => {\n const context = useContext(TrackingContext);\n return context;\n};\n"],"names":[],"mappings":";;;AAGO,MAAM,qBAAqB,MAAM;AACtC,EAAM,MAAA,OAAA,GAAU,WAAW,eAAe,CAAA;AAC1C,EAAO,OAAA,OAAA;AACT;;;;"}
1
+ {"version":3,"file":"useTrackingContext-DRwDL8DE.js","sources":["../src/providers/TrackingProvider/useTrackingContext.tsx"],"sourcesContent":["import { useContext } from \"react\";\nimport { TrackingContext } from \"./TrackingProvider\";\n\nexport const useTrackingContext = () => {\n const context = useContext(TrackingContext);\n return context;\n};\n"],"names":[],"mappings":";;;AAGO,MAAM,qBAAqB,MAAM;AACtC,EAAA,MAAM,OAAA,GAAU,WAAW,eAAe,CAAA;AAC1C,EAAA,OAAO,OAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTrackingId.js","sources":["../src/hooks/useTrackingId/index.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { useTrackingContext } from \"../../providers/TrackingProvider\";\n\n/**\n * Custom hook for generating and managing tracking IDs for analytics.\n *\n * Features:\n * - Generates unique tracking IDs for analytics events\n * - Integrates with TrackingProvider for centralized tracking management\n * - Supports opt-out functionality for privacy compliance\n * - Handles tracking overrides for testing or special cases\n * - Uses JSON stringification for consistent data serialization\n * - Automatically updates tracking ID when data or name changes\n * - Respects user privacy preferences through opt-out mechanism\n * - Provides async tracking ID generation\n *\n * @param props - Configuration object containing tracking parameters\n * @param props.name - The name identifier for the tracking event\n * @param props.data - The data object to track\n * @param props.hasOverride - Whether to override tracking behavior\n * @returns Generated tracking ID string or undefined if tracking is disabled\n */\nexport const useTrackingId = ({\n name,\n data,\n hasOverride,\n}: {\n name: string;\n data: { [key: string]: unknown };\n hasOverride?: boolean;\n}) => {\n const [trackingId, setTrackingId] = useState<string | undefined>(undefined);\n const { getTrackingId, optOut } = useTrackingContext();\n\n useEffect(() => {\n if (hasOverride || optOut) {\n return;\n }\n getTrackingId(JSON.stringify(data), name).then((result) =>\n setTrackingId(result),\n );\n }, [hasOverride, data, name, optOut, getTrackingId]);\n\n return trackingId;\n};\n"],"names":[],"mappings":";;;AAsBO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,IAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAIM,KAAA;AACJ,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAA6B,MAAS,CAAA;AAC1E,EAAA,MAAM,EAAE,aAAA,EAAe,MAAO,EAAA,GAAI,kBAAmB,EAAA;AAErD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,eAAe,MAAQ,EAAA;AACzB,MAAA;AAAA;AAEF,IAAA,aAAA,CAAc,IAAK,CAAA,SAAA,CAAU,IAAI,CAAA,EAAG,IAAI,CAAE,CAAA,IAAA;AAAA,MAAK,CAAC,MAC9C,KAAA,aAAA,CAAc,MAAM;AAAA,KACtB;AAAA,KACC,CAAC,WAAA,EAAa,MAAM,IAAM,EAAA,MAAA,EAAQ,aAAa,CAAC,CAAA;AAEnD,EAAO,OAAA,UAAA;AACT;;;;"}
1
+ {"version":3,"file":"useTrackingId.js","sources":["../src/hooks/useTrackingId/index.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { useTrackingContext } from \"../../providers/TrackingProvider\";\n\n/**\n * Custom hook for generating and managing tracking IDs for analytics.\n *\n * Features:\n * - Generates unique tracking IDs for analytics events\n * - Integrates with TrackingProvider for centralized tracking management\n * - Supports opt-out functionality for privacy compliance\n * - Handles tracking overrides for testing or special cases\n * - Uses JSON stringification for consistent data serialization\n * - Automatically updates tracking ID when data or name changes\n * - Respects user privacy preferences through opt-out mechanism\n * - Provides async tracking ID generation\n *\n * @param props - Configuration object containing tracking parameters\n * @param props.name - The name identifier for the tracking event\n * @param props.data - The data object to track\n * @param props.hasOverride - Whether to override tracking behavior\n * @returns Generated tracking ID string or undefined if tracking is disabled\n */\nexport const useTrackingId = ({\n name,\n data,\n hasOverride,\n}: {\n name: string;\n data: { [key: string]: unknown };\n hasOverride?: boolean;\n}) => {\n const [trackingId, setTrackingId] = useState<string | undefined>(undefined);\n const { getTrackingId, optOut } = useTrackingContext();\n\n useEffect(() => {\n if (hasOverride || optOut) {\n return;\n }\n getTrackingId(JSON.stringify(data), name).then((result) =>\n setTrackingId(result),\n );\n }, [hasOverride, data, name, optOut, getTrackingId]);\n\n return trackingId;\n};\n"],"names":[],"mappings":";;;AAsBO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,IAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,KAIM;AACJ,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAA6B,MAAS,CAAA;AAC1E,EAAA,MAAM,EAAE,aAAA,EAAe,MAAA,EAAO,GAAI,kBAAA,EAAmB;AAErD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,MAAA;AAAA,IACF;AACA,IAAA,aAAA,CAAc,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG,IAAI,CAAA,CAAE,IAAA;AAAA,MAAK,CAAC,MAAA,KAC9C,aAAA,CAAc,MAAM;AAAA,KACtB;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,MAAM,IAAA,EAAM,MAAA,EAAQ,aAAa,CAAC,CAAA;AAEnD,EAAA,OAAO,UAAA;AACT;;;;"}