@economic/taco 14.0.0 → 14.1.0-EC-85807-code-report-fixes.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (364) hide show
  1. package/dist/charts/components/Area/AreaChart.cjs.map +1 -1
  2. package/dist/charts/components/Area/AreaChart.d.ts +1 -1
  3. package/dist/charts/components/Area/AreaChart.js.map +1 -1
  4. package/dist/charts/components/Bar/BarChart.cjs +2 -2
  5. package/dist/charts/components/Bar/BarChart.cjs.map +1 -1
  6. package/dist/charts/components/Bar/BarChart.d.ts +1 -1
  7. package/dist/charts/components/Bar/BarChart.js +2 -2
  8. package/dist/charts/components/Bar/BarChart.js.map +1 -1
  9. package/dist/charts/components/ChartWrapper.cjs.map +1 -1
  10. package/dist/charts/components/ChartWrapper.js.map +1 -1
  11. package/dist/charts/components/Composed/BarLineChart.cjs.map +1 -1
  12. package/dist/charts/components/Composed/BarLineChart.d.ts +2 -2
  13. package/dist/charts/components/Composed/BarLineChart.js.map +1 -1
  14. package/dist/charts/components/Donut/DonutChart.cjs.map +1 -1
  15. package/dist/charts/components/Donut/DonutChart.d.ts +1 -1
  16. package/dist/charts/components/Donut/DonutChart.js.map +1 -1
  17. package/dist/charts/components/LegacyDonut/ActiveShape.cjs +7 -5
  18. package/dist/charts/components/LegacyDonut/ActiveShape.cjs.map +1 -1
  19. package/dist/charts/components/LegacyDonut/ActiveShape.d.ts +6 -3
  20. package/dist/charts/components/LegacyDonut/ActiveShape.js +7 -5
  21. package/dist/charts/components/LegacyDonut/ActiveShape.js.map +1 -1
  22. package/dist/charts/components/LegacyDonut/CenteredLabel.cjs +1 -1
  23. package/dist/charts/components/LegacyDonut/CenteredLabel.cjs.map +1 -1
  24. package/dist/charts/components/LegacyDonut/CenteredLabel.js +1 -1
  25. package/dist/charts/components/LegacyDonut/CenteredLabel.js.map +1 -1
  26. package/dist/charts/components/LegacyDonut/LegacyDonutChart.cjs +119 -103
  27. package/dist/charts/components/LegacyDonut/LegacyDonutChart.cjs.map +1 -1
  28. package/dist/charts/components/LegacyDonut/LegacyDonutChart.d.ts +13 -2
  29. package/dist/charts/components/LegacyDonut/LegacyDonutChart.js +119 -103
  30. package/dist/charts/components/LegacyDonut/LegacyDonutChart.js.map +1 -1
  31. package/dist/charts/components/LegacyDonut/Legend.cjs +1 -1
  32. package/dist/charts/components/LegacyDonut/Legend.cjs.map +1 -1
  33. package/dist/charts/components/LegacyDonut/Legend.js +1 -1
  34. package/dist/charts/components/LegacyDonut/Legend.js.map +1 -1
  35. package/dist/charts/components/Legend.cjs +1 -1
  36. package/dist/charts/components/Legend.cjs.map +1 -1
  37. package/dist/charts/components/Legend.js +1 -1
  38. package/dist/charts/components/Legend.js.map +1 -1
  39. package/dist/charts/components/Line/LineChart.cjs.map +1 -1
  40. package/dist/charts/components/Line/LineChart.d.ts +3 -2
  41. package/dist/charts/components/Line/LineChart.js.map +1 -1
  42. package/dist/charts/components/Pie/PieChart.cjs +4 -4
  43. package/dist/charts/components/Pie/PieChart.cjs.map +1 -1
  44. package/dist/charts/components/Pie/PieChart.js +4 -4
  45. package/dist/charts/components/Pie/PieChart.js.map +1 -1
  46. package/dist/charts/components/Pie/util.cjs.map +1 -1
  47. package/dist/charts/components/Pie/util.d.ts +2 -1
  48. package/dist/charts/components/Pie/util.js.map +1 -1
  49. package/dist/charts/components/Tooltip.cjs.map +1 -1
  50. package/dist/charts/components/Tooltip.d.ts +2 -3
  51. package/dist/charts/components/Tooltip.js.map +1 -1
  52. package/dist/charts/components/types.d.ts +9 -5
  53. package/dist/charts/components/useChartData.cjs +5 -3
  54. package/dist/charts/components/useChartData.cjs.map +1 -1
  55. package/dist/charts/components/useChartData.d.ts +6 -2
  56. package/dist/charts/components/useChartData.js +5 -3
  57. package/dist/charts/components/useChartData.js.map +1 -1
  58. package/dist/charts/utils/color.cjs +6 -10
  59. package/dist/charts/utils/color.cjs.map +1 -1
  60. package/dist/charts/utils/color.js +6 -10
  61. package/dist/charts/utils/color.js.map +1 -1
  62. package/dist/charts/utils/common.cjs +10 -10
  63. package/dist/charts/utils/common.cjs.map +1 -1
  64. package/dist/charts/utils/common.d.ts +5 -6
  65. package/dist/charts/utils/common.js +10 -10
  66. package/dist/charts/utils/common.js.map +1 -1
  67. package/dist/components/AlertDialog/Context.cjs.map +1 -1
  68. package/dist/components/AlertDialog/Context.d.ts +1 -1
  69. package/dist/components/AlertDialog/Context.js.map +1 -1
  70. package/dist/components/Calendar/Calendar.cjs.map +1 -1
  71. package/dist/components/Calendar/Calendar.js.map +1 -1
  72. package/dist/components/Combobox/Combobox.cjs.map +1 -1
  73. package/dist/components/Combobox/Combobox.js.map +1 -1
  74. package/dist/components/Combobox/useCombobox.cjs +2 -4
  75. package/dist/components/Combobox/useCombobox.cjs.map +1 -1
  76. package/dist/components/Combobox/useCombobox.d.ts +1 -1
  77. package/dist/components/Combobox/useCombobox.js +2 -4
  78. package/dist/components/Combobox/useCombobox.js.map +1 -1
  79. package/dist/components/Datepicker/useDatepicker.cjs.map +1 -1
  80. package/dist/components/Datepicker/useDatepicker.js.map +1 -1
  81. package/dist/components/Dialog/Context.cjs.map +1 -1
  82. package/dist/components/Dialog/Context.d.ts +1 -1
  83. package/dist/components/Dialog/Context.js.map +1 -1
  84. package/dist/components/Dialog/components/Content.cjs.map +1 -1
  85. package/dist/components/Dialog/components/Content.js.map +1 -1
  86. package/dist/components/Drawer/components/Content.cjs +1 -1
  87. package/dist/components/Drawer/components/Content.cjs.map +1 -1
  88. package/dist/components/Drawer/components/Content.js +1 -1
  89. package/dist/components/Drawer/components/Content.js.map +1 -1
  90. package/dist/components/Drawer/useDrawerStack.cjs.map +1 -1
  91. package/dist/components/Drawer/useDrawerStack.js.map +1 -1
  92. package/dist/components/Hanger/Hanger.cjs.map +1 -1
  93. package/dist/components/Hanger/Hanger.js.map +1 -1
  94. package/dist/components/Header/Header.cjs +1 -1
  95. package/dist/components/Header/Header.cjs.map +1 -1
  96. package/dist/components/Header/Header.js +1 -1
  97. package/dist/components/Header/Header.js.map +1 -1
  98. package/dist/components/Header/components/PrimaryNavigation.cjs.map +1 -1
  99. package/dist/components/Header/components/PrimaryNavigation.js.map +1 -1
  100. package/dist/components/Icon/Icon.cjs.map +1 -1
  101. package/dist/components/Icon/Icon.js.map +1 -1
  102. package/dist/components/Layout/components/Sidebar.cjs +2 -1
  103. package/dist/components/Layout/components/Sidebar.cjs.map +1 -1
  104. package/dist/components/Layout/components/Sidebar.js +2 -1
  105. package/dist/components/Layout/components/Sidebar.js.map +1 -1
  106. package/dist/components/LegacyComponents/IconButton/IconButton.cjs.map +1 -1
  107. package/dist/components/LegacyComponents/IconButton/IconButton.js.map +1 -1
  108. package/dist/components/List/components/Toggle.cjs +0 -2
  109. package/dist/components/List/components/Toggle.cjs.map +1 -1
  110. package/dist/components/List/components/Toggle.js +0 -2
  111. package/dist/components/List/components/Toggle.js.map +1 -1
  112. package/dist/components/Listbox/Listbox.cjs +2 -5
  113. package/dist/components/Listbox/Listbox.cjs.map +1 -1
  114. package/dist/components/Listbox/Listbox.js +2 -5
  115. package/dist/components/Listbox/Listbox.js.map +1 -1
  116. package/dist/components/Listbox/useListbox.cjs +1 -1
  117. package/dist/components/Listbox/useListbox.cjs.map +1 -1
  118. package/dist/components/Listbox/useListbox.js +1 -1
  119. package/dist/components/Listbox/useListbox.js.map +1 -1
  120. package/dist/components/Listbox/useMultiListbox.cjs +1 -1
  121. package/dist/components/Listbox/useMultiListbox.cjs.map +1 -1
  122. package/dist/components/Listbox/useMultiListbox.js +1 -1
  123. package/dist/components/Listbox/useMultiListbox.js.map +1 -1
  124. package/dist/components/Listbox/util.cjs.map +1 -1
  125. package/dist/components/Listbox/util.js.map +1 -1
  126. package/dist/components/Menu/components/Content.cjs.map +1 -1
  127. package/dist/components/Menu/components/Content.js.map +1 -1
  128. package/dist/components/Menu/components/Item.cjs.map +1 -1
  129. package/dist/components/Menu/components/Item.d.ts +2 -2
  130. package/dist/components/Menu/components/Item.js.map +1 -1
  131. package/dist/components/Menu/components/Trigger.cjs +1 -5
  132. package/dist/components/Menu/components/Trigger.cjs.map +1 -1
  133. package/dist/components/Menu/components/Trigger.js +1 -5
  134. package/dist/components/Menu/components/Trigger.js.map +1 -1
  135. package/dist/components/Pagination/usePaginationShortcuts.cjs +0 -1
  136. package/dist/components/Pagination/usePaginationShortcuts.cjs.map +1 -1
  137. package/dist/components/Pagination/usePaginationShortcuts.js +0 -1
  138. package/dist/components/Pagination/usePaginationShortcuts.js.map +1 -1
  139. package/dist/components/Provider/Provider.cjs.map +1 -1
  140. package/dist/components/Provider/Provider.d.ts +1 -1
  141. package/dist/components/Provider/Provider.js.map +1 -1
  142. package/dist/components/SearchInput/SearchInput.cjs +0 -1
  143. package/dist/components/SearchInput/SearchInput.cjs.map +1 -1
  144. package/dist/components/SearchInput/SearchInput.js +0 -1
  145. package/dist/components/SearchInput/SearchInput.js.map +1 -1
  146. package/dist/components/SearchInput2/SearchInput2.cjs +0 -1
  147. package/dist/components/SearchInput2/SearchInput2.cjs.map +1 -1
  148. package/dist/components/SearchInput2/SearchInput2.js +0 -1
  149. package/dist/components/SearchInput2/SearchInput2.js.map +1 -1
  150. package/dist/components/Select2/Select2.cjs +6 -7
  151. package/dist/components/Select2/Select2.cjs.map +1 -1
  152. package/dist/components/Select2/Select2.js +6 -7
  153. package/dist/components/Select2/Select2.js.map +1 -1
  154. package/dist/components/Select2/components/Search.cjs +0 -1
  155. package/dist/components/Select2/components/Search.cjs.map +1 -1
  156. package/dist/components/Select2/components/Search.js +0 -1
  157. package/dist/components/Select2/components/Search.js.map +1 -1
  158. package/dist/components/Select2/components/Trigger.cjs +1 -1
  159. package/dist/components/Select2/components/Trigger.cjs.map +1 -1
  160. package/dist/components/Select2/components/Trigger.js +1 -1
  161. package/dist/components/Select2/components/Trigger.js.map +1 -1
  162. package/dist/components/Table3/components/Columns/Cell/EditingControlCell.cjs +1 -1
  163. package/dist/components/Table3/components/Columns/Cell/EditingControlCell.cjs.map +1 -1
  164. package/dist/components/Table3/components/Columns/Cell/EditingControlCell.js +1 -1
  165. package/dist/components/Table3/components/Columns/Cell/EditingControlCell.js.map +1 -1
  166. package/dist/components/Table3/components/Columns/Cell/util.cjs.map +1 -1
  167. package/dist/components/Table3/components/Columns/Cell/util.js.map +1 -1
  168. package/dist/components/Table3/components/Editing/Alert.cjs +4 -4
  169. package/dist/components/Table3/components/Editing/Alert.cjs.map +1 -1
  170. package/dist/components/Table3/components/Editing/Alert.js +4 -4
  171. package/dist/components/Table3/components/Editing/Alert.js.map +1 -1
  172. package/dist/components/Table3/features/useEditingState.cjs +1 -1
  173. package/dist/components/Table3/features/useEditingState.cjs.map +1 -1
  174. package/dist/components/Table3/features/useEditingState.js +1 -1
  175. package/dist/components/Table3/features/useEditingState.js.map +1 -1
  176. package/dist/components/Table3/types.d.ts +2 -2
  177. package/dist/components/Table3/useTable3.cjs +8 -6
  178. package/dist/components/Table3/useTable3.cjs.map +1 -1
  179. package/dist/components/Table3/useTable3.js +8 -6
  180. package/dist/components/Table3/useTable3.js.map +1 -1
  181. package/dist/components/Table3/util/editing.cjs +1 -1
  182. package/dist/components/Table3/util/editing.cjs.map +1 -1
  183. package/dist/components/Table3/util/editing.d.ts +1 -1
  184. package/dist/components/Table3/util/editing.js +1 -1
  185. package/dist/components/Table3/util/editing.js.map +1 -1
  186. package/dist/hooks/useBoundaryOverflowDetection.cjs.map +1 -1
  187. package/dist/hooks/useBoundaryOverflowDetection.d.ts +1 -1
  188. package/dist/hooks/useBoundaryOverflowDetection.js.map +1 -1
  189. package/dist/hooks/useBoundingClientRectListener.cjs.map +1 -1
  190. package/dist/hooks/useBoundingClientRectListener.d.ts +1 -1
  191. package/dist/hooks/useBoundingClientRectListener.js.map +1 -1
  192. package/dist/hooks/useControlled.cjs +6 -10
  193. package/dist/hooks/useControlled.cjs.map +1 -1
  194. package/dist/hooks/useControlled.js +6 -10
  195. package/dist/hooks/useControlled.js.map +1 -1
  196. package/dist/hooks/useIsFormControl.cjs.map +1 -1
  197. package/dist/hooks/useIsFormControl.d.ts +1 -1
  198. package/dist/hooks/useIsFormControl.js.map +1 -1
  199. package/dist/hooks/useMergedRef.cjs.map +1 -1
  200. package/dist/hooks/useMergedRef.js.map +1 -1
  201. package/dist/hooks/usePrevious.cjs.map +1 -1
  202. package/dist/hooks/usePrevious.js.map +1 -1
  203. package/dist/primitives/Button.cjs.map +1 -1
  204. package/dist/primitives/Button.js.map +1 -1
  205. package/dist/primitives/Collection/components/Root.cjs +9 -16
  206. package/dist/primitives/Collection/components/Root.cjs.map +1 -1
  207. package/dist/primitives/Collection/components/Root.js +9 -16
  208. package/dist/primitives/Collection/components/Root.js.map +1 -1
  209. package/dist/primitives/Listbox2/components/Context.cjs.map +1 -1
  210. package/dist/primitives/Listbox2/components/Context.d.ts +1 -0
  211. package/dist/primitives/Listbox2/components/Context.js.map +1 -1
  212. package/dist/primitives/Listbox2/components/Option.cjs +8 -2
  213. package/dist/primitives/Listbox2/components/Option.cjs.map +1 -1
  214. package/dist/primitives/Listbox2/components/Option.js +8 -2
  215. package/dist/primitives/Listbox2/components/Option.js.map +1 -1
  216. package/dist/primitives/Listbox2/components/Root.cjs +3 -2
  217. package/dist/primitives/Listbox2/components/Root.cjs.map +1 -1
  218. package/dist/primitives/Listbox2/components/Root.js +3 -2
  219. package/dist/primitives/Listbox2/components/Root.js.map +1 -1
  220. package/dist/primitives/Sortable/components/Item.cjs +2 -4
  221. package/dist/primitives/Sortable/components/Item.cjs.map +1 -1
  222. package/dist/primitives/Sortable/components/Item.js +2 -4
  223. package/dist/primitives/Sortable/components/Item.js.map +1 -1
  224. package/dist/primitives/Table/Core/components/Body/Body.cjs +4 -4
  225. package/dist/primitives/Table/Core/components/Body/Body.cjs.map +1 -1
  226. package/dist/primitives/Table/Core/components/Body/Body.js +4 -4
  227. package/dist/primitives/Table/Core/components/Body/Body.js.map +1 -1
  228. package/dist/primitives/Table/Core/components/Columns/Cell/BuiltIns/DisplayCell.cjs.map +1 -1
  229. package/dist/primitives/Table/Core/components/Columns/Cell/BuiltIns/DisplayCell.js.map +1 -1
  230. package/dist/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.cjs.map +1 -1
  231. package/dist/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.js.map +1 -1
  232. package/dist/primitives/Table/Core/components/Columns/Cell/util.cjs +22 -16
  233. package/dist/primitives/Table/Core/components/Columns/Cell/util.cjs.map +1 -1
  234. package/dist/primitives/Table/Core/components/Columns/Cell/util.js +22 -16
  235. package/dist/primitives/Table/Core/components/Columns/Cell/util.js.map +1 -1
  236. package/dist/primitives/Table/Core/components/Footer/Summary.cjs.map +1 -1
  237. package/dist/primitives/Table/Core/components/Footer/Summary.js.map +1 -1
  238. package/dist/primitives/Table/Core/components/Header/util.cjs +4 -3
  239. package/dist/primitives/Table/Core/components/Header/util.cjs.map +1 -1
  240. package/dist/primitives/Table/Core/components/Header/util.js +4 -3
  241. package/dist/primitives/Table/Core/components/Header/util.js.map +1 -1
  242. package/dist/primitives/Table/Core/components/Toolbar/components/Filters/Filters.cjs +1 -1
  243. package/dist/primitives/Table/Core/components/Toolbar/components/Filters/Filters.cjs.map +1 -1
  244. package/dist/primitives/Table/Core/components/Toolbar/components/Filters/Filters.js +1 -1
  245. package/dist/primitives/Table/Core/components/Toolbar/components/Filters/Filters.js.map +1 -1
  246. package/dist/primitives/Table/Core/components/Toolbar/components/Filters/ManageFiltersPopover.cjs +4 -2
  247. package/dist/primitives/Table/Core/components/Toolbar/components/Filters/ManageFiltersPopover.cjs.map +1 -1
  248. package/dist/primitives/Table/Core/components/Toolbar/components/Filters/ManageFiltersPopover.js +4 -2
  249. package/dist/primitives/Table/Core/components/Toolbar/components/Filters/ManageFiltersPopover.js.map +1 -1
  250. package/dist/primitives/Table/Core/components/Toolbar/components/Filters/components/Filter.cjs.map +1 -1
  251. package/dist/primitives/Table/Core/components/Toolbar/components/Filters/components/Filter.js.map +1 -1
  252. package/dist/primitives/Table/Core/components/Toolbar/components/Print/Print.cjs +1 -1
  253. package/dist/primitives/Table/Core/components/Toolbar/components/Print/Print.cjs.map +1 -1
  254. package/dist/primitives/Table/Core/components/Toolbar/components/Print/Print.js +1 -1
  255. package/dist/primitives/Table/Core/components/Toolbar/components/Print/Print.js.map +1 -1
  256. package/dist/primitives/Table/Core/features/useTableRef.cjs +7 -0
  257. package/dist/primitives/Table/Core/features/useTableRef.cjs.map +1 -1
  258. package/dist/primitives/Table/Core/features/useTableRef.js +7 -0
  259. package/dist/primitives/Table/Core/features/useTableRef.js.map +1 -1
  260. package/dist/primitives/Table/Core/features/useTableRenderer.cjs +2 -2
  261. package/dist/primitives/Table/Core/features/useTableRenderer.cjs.map +1 -1
  262. package/dist/primitives/Table/Core/features/useTableRenderer.js +2 -2
  263. package/dist/primitives/Table/Core/features/useTableRenderer.js.map +1 -1
  264. package/dist/primitives/Table/Core/features/useTableStyleColumnFreezing.cjs +2 -2
  265. package/dist/primitives/Table/Core/features/useTableStyleColumnFreezing.cjs.map +1 -1
  266. package/dist/primitives/Table/Core/features/useTableStyleColumnFreezing.js +2 -2
  267. package/dist/primitives/Table/Core/features/useTableStyleColumnFreezing.js.map +1 -1
  268. package/dist/primitives/Table/Core/features/useTableStyleGrid.cjs.map +1 -1
  269. package/dist/primitives/Table/Core/features/useTableStyleGrid.js.map +1 -1
  270. package/dist/primitives/Table/Core/listeners/useTableRowActiveListener.cjs +2 -4
  271. package/dist/primitives/Table/Core/listeners/useTableRowActiveListener.cjs.map +1 -1
  272. package/dist/primitives/Table/Core/listeners/useTableRowActiveListener.d.ts +2 -2
  273. package/dist/primitives/Table/Core/listeners/useTableRowActiveListener.js +2 -4
  274. package/dist/primitives/Table/Core/listeners/useTableRowActiveListener.js.map +1 -1
  275. package/dist/primitives/Table/types.cjs.map +1 -1
  276. package/dist/primitives/Table/types.d.ts +6 -0
  277. package/dist/primitives/Table/types.js.map +1 -1
  278. package/dist/primitives/Table/useTableDataLoader2.cjs +36 -3
  279. package/dist/primitives/Table/useTableDataLoader2.cjs.map +1 -1
  280. package/dist/primitives/Table/useTableDataLoader2.d.ts +2 -1
  281. package/dist/primitives/Table/useTableDataLoader2.js +36 -3
  282. package/dist/primitives/Table/useTableDataLoader2.js.map +1 -1
  283. package/dist/primitives/Table/useTableManager/features/useTableRowActive.cjs +0 -1
  284. package/dist/primitives/Table/useTableManager/features/useTableRowActive.cjs.map +1 -1
  285. package/dist/primitives/Table/useTableManager/features/useTableRowActive.d.ts +1 -1
  286. package/dist/primitives/Table/useTableManager/features/useTableRowActive.js +0 -1
  287. package/dist/primitives/Table/useTableManager/features/useTableRowActive.js.map +1 -1
  288. package/dist/primitives/Table/useTableManager/features/useTableRowClick.cjs +0 -2
  289. package/dist/primitives/Table/useTableManager/features/useTableRowClick.cjs.map +1 -1
  290. package/dist/primitives/Table/useTableManager/features/useTableRowClick.js +0 -2
  291. package/dist/primitives/Table/useTableManager/features/useTableRowClick.js.map +1 -1
  292. package/dist/primitives/Table/useTableManager/features/useTableRowSelection.cjs +0 -1
  293. package/dist/primitives/Table/useTableManager/features/useTableRowSelection.cjs.map +1 -1
  294. package/dist/primitives/Table/useTableManager/features/useTableRowSelection.js +0 -1
  295. package/dist/primitives/Table/useTableManager/features/useTableRowSelection.js.map +1 -1
  296. package/dist/primitives/Table/useTableManager/features/useTableServerLoading.cjs +10 -1
  297. package/dist/primitives/Table/useTableManager/features/useTableServerLoading.cjs.map +1 -1
  298. package/dist/primitives/Table/useTableManager/features/useTableServerLoading.d.ts +3 -2
  299. package/dist/primitives/Table/useTableManager/features/useTableServerLoading.js +10 -1
  300. package/dist/primitives/Table/useTableManager/features/useTableServerLoading.js.map +1 -1
  301. package/dist/primitives/Table/useTableManager/useTableManager.cjs +1 -5
  302. package/dist/primitives/Table/useTableManager/useTableManager.cjs.map +1 -1
  303. package/dist/primitives/Table/useTableManager/useTableManager.js +1 -5
  304. package/dist/primitives/Table/useTableManager/useTableManager.js.map +1 -1
  305. package/dist/primitives/Table/useTableManager/util/dataTypes.cjs.map +1 -1
  306. package/dist/primitives/Table/useTableManager/util/dataTypes.d.ts +3 -3
  307. package/dist/primitives/Table/useTableManager/util/dataTypes.js.map +1 -1
  308. package/dist/primitives/Table/useTableManager/util/filtering.cjs.map +1 -1
  309. package/dist/primitives/Table/useTableManager/util/filtering.js.map +1 -1
  310. package/dist/primitives/Table/useTableManager/util/search.cjs +1 -1
  311. package/dist/primitives/Table/useTableManager/util/search.cjs.map +1 -1
  312. package/dist/primitives/Table/useTableManager/util/search.js +1 -1
  313. package/dist/primitives/Table/useTableManager/util/search.js.map +1 -1
  314. package/dist/primitives/Table/useTableManager/util/setup.cjs +3 -3
  315. package/dist/primitives/Table/useTableManager/util/setup.cjs.map +1 -1
  316. package/dist/primitives/Table/useTableManager/util/setup.js +3 -3
  317. package/dist/primitives/Table/useTableManager/util/setup.js.map +1 -1
  318. package/dist/types.cjs.map +1 -1
  319. package/dist/types.d.ts +1 -1
  320. package/dist/types.js.map +1 -1
  321. package/dist/utils/dataTypes.cjs +4 -4
  322. package/dist/utils/dataTypes.cjs.map +1 -1
  323. package/dist/utils/dataTypes.d.ts +1 -1
  324. package/dist/utils/dataTypes.js +4 -4
  325. package/dist/utils/dataTypes.js.map +1 -1
  326. package/dist/utils/date.cjs +14 -16
  327. package/dist/utils/date.cjs.map +1 -1
  328. package/dist/utils/date.js +14 -16
  329. package/dist/utils/date.js.map +1 -1
  330. package/dist/utils/debounce.cjs.map +1 -1
  331. package/dist/utils/debounce.d.ts +1 -1
  332. package/dist/utils/debounce.js.map +1 -1
  333. package/dist/utils/device.cjs +1 -1
  334. package/dist/utils/device.cjs.map +1 -1
  335. package/dist/utils/device.js +1 -1
  336. package/dist/utils/device.js.map +1 -1
  337. package/dist/utils/dom.cjs +1 -1
  338. package/dist/utils/dom.cjs.map +1 -1
  339. package/dist/utils/dom.d.ts +2 -2
  340. package/dist/utils/dom.js +1 -1
  341. package/dist/utils/dom.js.map +1 -1
  342. package/dist/utils/hooks/useDraggable.cjs.map +1 -1
  343. package/dist/utils/hooks/useDraggable.d.ts +9 -1
  344. package/dist/utils/hooks/useDraggable.js.map +1 -1
  345. package/dist/utils/hooks/useListKeyboardNavigation.cjs +1 -1
  346. package/dist/utils/hooks/useListKeyboardNavigation.cjs.map +1 -1
  347. package/dist/utils/hooks/useListKeyboardNavigation.js +1 -1
  348. package/dist/utils/hooks/useListKeyboardNavigation.js.map +1 -1
  349. package/dist/utils/hooks/useListScrollTo.cjs.map +1 -1
  350. package/dist/utils/hooks/useListScrollTo.d.ts +4 -1
  351. package/dist/utils/hooks/useListScrollTo.js.map +1 -1
  352. package/dist/utils/hooks/useOnClickOutside.cjs.map +1 -1
  353. package/dist/utils/hooks/useOnClickOutside.d.ts +1 -1
  354. package/dist/utils/hooks/useOnClickOutside.js.map +1 -1
  355. package/dist/utils/hooks/useTruncated.cjs.map +1 -1
  356. package/dist/utils/hooks/useTruncated.d.ts +2 -1
  357. package/dist/utils/hooks/useTruncated.js.map +1 -1
  358. package/dist/utils/mergeRefs.cjs.map +1 -1
  359. package/dist/utils/mergeRefs.d.ts +1 -1
  360. package/dist/utils/mergeRefs.js.map +1 -1
  361. package/dist/utils/storyutils.d.ts +1 -3
  362. package/package.json +4 -5
  363. package/plugins/tailwindcss-group-peer.js +1 -1
  364. package/scripts/stylelint-plugin/radius.mjs +2 -2
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../src/types.ts"],"sourcesContent":["import React from 'react';\n\nimport type { AVAILABLE_COLORS } from './utils/tailwind';\n\nexport type Appearance = 'default' | 'primary' | 'danger' | 'ghost' | 'discrete' | 'transparent';\nexport type State = 'default' | 'success' | 'error' | 'experiment' | 'warning' | 'information';\nexport type Orientation = 'horizontal' | 'vertical';\nexport type Align = 'start' | 'center' | 'end';\nexport type Placement = 'right' | 'left' | 'top' | 'bottom';\nexport type Color = (typeof AVAILABLE_COLORS)[number];\n\nexport enum FontSizes {\n small = 'small',\n medium = 'medium',\n large = 'large',\n}\nexport type FontSize = keyof typeof FontSizes;\n\n// helpers\ntype FixedForwardRef = <T, P = object>(\n render: (props: P, ref: React.Ref<T>) => React.JSX.Element\n) => (props: P & React.RefAttributes<T>) => React.JSX.Element;\n\nexport const fixedForwardRef = React.forwardRef as FixedForwardRef;\n\n// oxlint-disable-next-line ban-types\nexport type StringWithAutocompleteOptions<T> = T | (string & {});\n\ntype Only<T, U> = {\n [P in keyof T]: T[P];\n} & {\n [P in keyof U]?: never;\n};\n\nexport type Either<T, U> = Only<T, U> | Only<U, T>;\n\n/* react-aria-components helpers */\nexport type RemapReactAriaIsProperties<T> = {\n [K in keyof T as K extends `is${infer Rest}` ? Uncapitalize<Rest> : K]: T[K];\n};\n\n// helpers for dot notation paths -- these types are generated with the help of Gemini,\ntype RecursionCounter = [never, 0, 1];\n\ntype DotNotationJoin<K, P> = K extends string | number\n ? P extends string | number\n ? `${K}${'' extends P ? '' : '.'}${P}`\n : never\n : never;\n\nexport type DotNotationPaths<T, D extends number = 2> = [D] extends [never]\n ? never\n : T extends object\n ? {\n [K in keyof T]-?: K extends string | number\n ? `${K}` | DotNotationJoin<K, DotNotationPaths<T[K], RecursionCounter[D]>>\n : never;\n }[keyof T]\n : '';\n\nexport type DotNotationPathValue<T, P extends string> = T extends any\n ? P extends `${infer Key}.${infer Rest}`\n ? Key extends keyof T\n ? DotNotationPathValue<T[Key], Rest>\n : never\n : P extends keyof T\n ? T[P]\n : never\n : never;\n"],"names":["FontSizes","React"],"mappings":";AAWO,IAAK,8BAAAA,eAAL;AACHA,aAAA,OAAA,IAAQ;AACRA,aAAA,QAAA,IAAS;AACTA,aAAA,OAAA,IAAQ;AAHA,SAAAA;AAAA,GAAA,aAAA,CAAA,CAAA;AAYL,MAAM,kBAAkBC,eAAM;"}
1
+ {"version":3,"file":"types.js","sources":["../src/types.ts"],"sourcesContent":["import React from 'react';\n\nimport type { AVAILABLE_COLORS } from './utils/tailwind';\n\nexport type Appearance = 'default' | 'primary' | 'danger' | 'ghost' | 'discrete' | 'transparent';\nexport type State = 'default' | 'success' | 'error' | 'experiment' | 'warning' | 'information';\nexport type Orientation = 'horizontal' | 'vertical';\nexport type Align = 'start' | 'center' | 'end';\nexport type Placement = 'right' | 'left' | 'top' | 'bottom';\nexport type Color = (typeof AVAILABLE_COLORS)[number];\n\nexport enum FontSizes {\n small = 'small',\n medium = 'medium',\n large = 'large',\n}\nexport type FontSize = keyof typeof FontSizes;\n\n// helpers\ntype FixedForwardRef = <T, P = object>(\n render: (props: P, ref: React.Ref<T>) => React.JSX.Element\n) => (props: P & React.RefAttributes<T>) => React.JSX.Element;\n\nexport const fixedForwardRef = React.forwardRef as FixedForwardRef;\n\n// oxlint-disable-next-line ban-types\nexport type StringWithAutocompleteOptions<T> = T | (string & {});\n\ntype Only<T, U> = {\n [P in keyof T]: T[P];\n} & {\n [P in keyof U]?: never;\n};\n\nexport type Either<T, U> = Only<T, U> | Only<U, T>;\n\n/* react-aria-components helpers */\nexport type RemapReactAriaIsProperties<T> = {\n [K in keyof T as K extends `is${infer Rest}` ? Uncapitalize<Rest> : K]: T[K];\n};\n\n// helpers for dot notation paths -- these types are generated with the help of Gemini,\ntype RecursionCounter = [never, 0, 1];\n\ntype DotNotationJoin<K, P> = K extends string | number\n ? P extends string | number\n ? `${K}${'' extends P ? '' : '.'}${P}`\n : never\n : never;\n\nexport type DotNotationPaths<T, D extends number = 2> = [D] extends [never]\n ? never\n : T extends object\n ? {\n [K in keyof T]-?: K extends string | number\n ? `${K}` | DotNotationJoin<K, DotNotationPaths<T[K], RecursionCounter[D]>>\n : never;\n }[keyof T]\n : '';\n\n// `T extends unknown` is a no-op condition that forces distribution over unions in T\nexport type DotNotationPathValue<T, P extends string> = T extends unknown\n ? P extends `${infer Key}.${infer Rest}`\n ? Key extends keyof T\n ? DotNotationPathValue<T[Key], Rest>\n : never\n : P extends keyof T\n ? T[P]\n : never\n : never;\n"],"names":["FontSizes","React"],"mappings":";AAWO,IAAK,8BAAAA,eAAL;AACHA,aAAA,OAAA,IAAQ;AACRA,aAAA,QAAA,IAAS;AACTA,aAAA,OAAA,IAAQ;AAHA,SAAAA;AAAA,GAAA,aAAA,CAAA,CAAA;AAYL,MAAM,kBAAkBC,eAAM;"}
@@ -10,7 +10,7 @@ class NumericDataType extends DataType {
10
10
  return "";
11
11
  }
12
12
  const localisedValue = new Intl.NumberFormat(locale, options).format(value);
13
- return localisedValue.replaceAll(/[\u00A0\u202F]/g, " ");
13
+ return localisedValue.replaceAll(/[\u00A0\u202F]/gu, " ");
14
14
  }
15
15
  static parse(value, locale) {
16
16
  if (value === void 0 || value === null || typeof value !== "string") {
@@ -19,7 +19,7 @@ class NumericDataType extends DataType {
19
19
  if (value === "Infinity" || value === "-Infinity") {
20
20
  return Number(value);
21
21
  }
22
- let sanitizedValue = value.replaceAll(" ", "").replaceAll(/[^0-9.,-]+/g, "");
22
+ let sanitizedValue = value.replaceAll(" ", "").replaceAll(/[^0-9.,-]+/gu, "");
23
23
  if (!sanitizedValue.length) {
24
24
  return void 0;
25
25
  }
@@ -58,7 +58,7 @@ class DateTimeDataType extends DataType {
58
58
  if (Number.isNaN(date.getTime())) {
59
59
  return "";
60
60
  }
61
- return new Intl.DateTimeFormat(locale, options).format(date).replaceAll(/[\u00A0\u202F]/g, " ");
61
+ return new Intl.DateTimeFormat(locale, options).format(date).replaceAll(/[\u00A0\u202F]/gu, " ");
62
62
  }
63
63
  static parse(value, locale) {
64
64
  if (value === void 0 || value === null || typeof value !== "string") {
@@ -74,7 +74,7 @@ class DateTimeDataType extends DataType {
74
74
  try {
75
75
  const date = dateFns.parseISO(sanitizedValue);
76
76
  if (dateFns.isValid(date)) {
77
- const timeRegex = /^\d{2}:\d{2}(?::\d{2}\.\d+|:\d{2})?(?:Z)?$/;
77
+ const timeRegex = /^\d{2}:\d{2}(?::\d{2}\.\d+|:\d{2})?(?:Z)?$/u;
78
78
  const time = sanitizedValue.split("T")[1];
79
79
  if (!time || !timeRegex.test(time)) {
80
80
  setHoursToMidday(date);
@@ -1 +1 @@
1
- {"version":3,"file":"dataTypes.cjs","sources":["../../src/utils/dataTypes.ts"],"sourcesContent":["// oxlint-disable max-classes-per-file\nimport { parse as dateParse, parseISO as dateParseISO, isValid as isDateValid } from 'date-fns';\n\nabstract class DataType<TValue = unknown> {\n abstract format(value: any, locale: Intl.LocalesArgument): string;\n abstract parse(value: string, locale: Intl.LocalesArgument): TValue | undefined;\n}\n\nconst localeNumberSeparators = new Map<Intl.LocalesArgument, string>();\n\nexport abstract class NumericDataType extends DataType<number> {\n static format(value: number, locale: Intl.LocalesArgument, options?: Intl.NumberFormatOptions) {\n if (value === undefined || typeof value !== 'number' || Number.isNaN(value)) {\n return '';\n }\n\n const localisedValue = new Intl.NumberFormat(locale, options).format(value);\n\n // the space character used by some locales is not a normal space, and won't match against user input unless replaced\n // replaces Non-Breaking Space (\\u00A0) and Narrow No-Break Space (\\u202F)\n return localisedValue.replaceAll(/[\\u00A0\\u202F]/g, ' ');\n }\n\n static parse(value: string, locale: Intl.LocalesArgument) {\n if (value === undefined || value === null || typeof value !== 'string') {\n return undefined;\n }\n\n if (value === 'Infinity' || value === '-Infinity') {\n return Number(value);\n }\n\n let sanitizedValue = value.replaceAll(' ', '').replaceAll(/[^0-9.,-]+/g, '');\n\n if (!sanitizedValue.length) {\n return undefined;\n }\n\n const decimalSeparator = this.getSeparator(locale);\n\n // replace decimal and group separators (we replaced space based separators above)\n if (decimalSeparator === ',') {\n sanitizedValue = sanitizedValue.replaceAll('.', '').replace(',', '.');\n } else {\n sanitizedValue = sanitizedValue.replaceAll(',', '');\n }\n\n const output = Number(sanitizedValue);\n\n if (Number.isNaN(output)) {\n return undefined;\n }\n\n return output;\n }\n\n private static getSeparator(locale: Intl.LocalesArgument) {\n if (localeNumberSeparators.has(locale)) {\n return localeNumberSeparators.get(locale);\n }\n\n const decimalSeparator =\n new Intl.NumberFormat(locale).formatToParts(1.1).find(part => part.type === 'decimal')?.value ?? '.';\n\n localeNumberSeparators.set(locale, decimalSeparator);\n\n return decimalSeparator;\n }\n}\n\nconst localeDateMasks = new Map<Intl.LocalesArgument, string>();\n\nexport abstract class DateTimeDataType extends DataType<Date> {\n static format(value: Date | string, locale: Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions) {\n let date;\n\n if (typeof value === 'string') {\n // handle json iso strings coming from rest calls\n date = new Date(value);\n } else if (value instanceof Date) {\n // handle date objects coming from js\n date = value;\n } else {\n return '';\n }\n\n if (Number.isNaN(date.getTime())) {\n return '';\n }\n // the space character used by some locales is not a normal space, and won't match against user input unless replaced\n // replaces Non-Breaking Space (\\u00A0) and Narrow No-Break Space (\\u202F)\n return new Intl.DateTimeFormat(locale, options).format(date).replaceAll(/[\\u00A0\\u202F]/g, ' ');\n }\n\n static parse(value: string, locale: Intl.LocalesArgument) {\n if (value === undefined || value === null || typeof value !== 'string') {\n return undefined;\n }\n\n const sanitizedValue = value?.trim();\n\n if (!sanitizedValue?.length) {\n return undefined;\n }\n\n // set to midday to avoid UTC offset causing dates to be mismatched server side\n const setHoursToMidday = (date: Date) => {\n date.setHours(12 - date.getTimezoneOffset() / 60);\n };\n\n try {\n const date = dateParseISO(sanitizedValue);\n\n if (isDateValid(date)) {\n const timeRegex = /^\\d{2}:\\d{2}(?::\\d{2}\\.\\d+|:\\d{2})?(?:Z)?$/;\n const time = sanitizedValue.split('T')[1];\n\n // check if the input string contains a valid time, otherwise set one\n if (!time || !timeRegex.test(time)) {\n setHoursToMidday(date);\n }\n\n return date;\n }\n } catch {\n //\n }\n\n const mask = this.getMask(locale);\n\n if (mask) {\n try {\n const date = dateParse(sanitizedValue, mask, new Date());\n\n if (isDateValid(date)) {\n setHoursToMidday(date);\n return date;\n }\n } catch {\n //\n }\n }\n\n return undefined;\n }\n\n private static getMask(locale: Intl.LocalesArgument) {\n if (localeDateMasks.has(locale)) {\n return localeDateMasks.get(locale);\n }\n\n const parts = new Intl.DateTimeFormat(locale).formatToParts(new Date());\n const mask = parts.reduce((mask, part) => {\n switch (part.type) {\n case 'literal':\n return mask + part.value;\n case 'day':\n return mask + 'dd';\n case 'month':\n return mask + 'MM';\n case 'year':\n return mask + 'yyyy';\n default:\n return mask;\n }\n }, '');\n\n localeDateMasks.set(locale, mask);\n\n return mask;\n }\n}\n"],"names":["dateParseISO","isDateValid","dateParse","mask"],"mappings":"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"}
1
+ {"version":3,"file":"dataTypes.cjs","sources":["../../src/utils/dataTypes.ts"],"sourcesContent":["// oxlint-disable max-classes-per-file\nimport { parse as dateParse, parseISO as dateParseISO, isValid as isDateValid } from 'date-fns';\n\nabstract class DataType<TValue = unknown> {\n abstract format(value: TValue, locale: Intl.LocalesArgument): string;\n abstract parse(value: string, locale: Intl.LocalesArgument): TValue | undefined;\n}\n\nconst localeNumberSeparators = new Map<Intl.LocalesArgument, string>();\n\nexport abstract class NumericDataType extends DataType<number> {\n static format(value: number, locale: Intl.LocalesArgument, options?: Intl.NumberFormatOptions) {\n if (value === undefined || typeof value !== 'number' || Number.isNaN(value)) {\n return '';\n }\n\n const localisedValue = new Intl.NumberFormat(locale, options).format(value);\n\n // the space character used by some locales is not a normal space, and won't match against user input unless replaced\n // replaces Non-Breaking Space (\\u00A0) and Narrow No-Break Space (\\u202F)\n return localisedValue.replaceAll(/[\\u00A0\\u202F]/gu, ' ');\n }\n\n static parse(value: string, locale: Intl.LocalesArgument) {\n if (value === undefined || value === null || typeof value !== 'string') {\n return undefined;\n }\n\n if (value === 'Infinity' || value === '-Infinity') {\n return Number(value);\n }\n\n let sanitizedValue = value.replaceAll(' ', '').replaceAll(/[^0-9.,-]+/gu, '');\n\n if (!sanitizedValue.length) {\n return undefined;\n }\n\n const decimalSeparator = this.getSeparator(locale);\n\n // replace decimal and group separators (we replaced space based separators above)\n if (decimalSeparator === ',') {\n sanitizedValue = sanitizedValue.replaceAll('.', '').replace(',', '.');\n } else {\n sanitizedValue = sanitizedValue.replaceAll(',', '');\n }\n\n const output = Number(sanitizedValue);\n\n if (Number.isNaN(output)) {\n return undefined;\n }\n\n return output;\n }\n\n private static getSeparator(locale: Intl.LocalesArgument) {\n if (localeNumberSeparators.has(locale)) {\n return localeNumberSeparators.get(locale);\n }\n\n const decimalSeparator =\n new Intl.NumberFormat(locale).formatToParts(1.1).find(part => part.type === 'decimal')?.value ?? '.';\n\n localeNumberSeparators.set(locale, decimalSeparator);\n\n return decimalSeparator;\n }\n}\n\nconst localeDateMasks = new Map<Intl.LocalesArgument, string>();\n\nexport abstract class DateTimeDataType extends DataType<Date> {\n static format(value: Date | string, locale: Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions) {\n let date;\n\n if (typeof value === 'string') {\n // handle json iso strings coming from rest calls\n date = new Date(value);\n } else if (value instanceof Date) {\n // handle date objects coming from js\n date = value;\n } else {\n return '';\n }\n\n if (Number.isNaN(date.getTime())) {\n return '';\n }\n // the space character used by some locales is not a normal space, and won't match against user input unless replaced\n // replaces Non-Breaking Space (\\u00A0) and Narrow No-Break Space (\\u202F)\n return new Intl.DateTimeFormat(locale, options).format(date).replaceAll(/[\\u00A0\\u202F]/gu, ' ');\n }\n\n static parse(value: string, locale: Intl.LocalesArgument) {\n if (value === undefined || value === null || typeof value !== 'string') {\n return undefined;\n }\n\n const sanitizedValue = value?.trim();\n\n if (!sanitizedValue?.length) {\n return undefined;\n }\n\n // set to midday to avoid UTC offset causing dates to be mismatched server side\n const setHoursToMidday = (date: Date) => {\n date.setHours(12 - date.getTimezoneOffset() / 60);\n };\n\n try {\n const date = dateParseISO(sanitizedValue);\n\n if (isDateValid(date)) {\n const timeRegex = /^\\d{2}:\\d{2}(?::\\d{2}\\.\\d+|:\\d{2})?(?:Z)?$/u;\n const time = sanitizedValue.split('T')[1];\n\n // check if the input string contains a valid time, otherwise set one\n if (!time || !timeRegex.test(time)) {\n setHoursToMidday(date);\n }\n\n return date;\n }\n } catch {\n //\n }\n\n const mask = this.getMask(locale);\n\n if (mask) {\n try {\n const date = dateParse(sanitizedValue, mask, new Date());\n\n if (isDateValid(date)) {\n setHoursToMidday(date);\n return date;\n }\n } catch {\n //\n }\n }\n\n return undefined;\n }\n\n private static getMask(locale: Intl.LocalesArgument) {\n if (localeDateMasks.has(locale)) {\n return localeDateMasks.get(locale);\n }\n\n const parts = new Intl.DateTimeFormat(locale).formatToParts(new Date());\n const mask = parts.reduce((mask, part) => {\n switch (part.type) {\n case 'literal':\n return mask + part.value;\n case 'day':\n return mask + 'dd';\n case 'month':\n return mask + 'MM';\n case 'year':\n return mask + 'yyyy';\n default:\n return mask;\n }\n }, '');\n\n localeDateMasks.set(locale, mask);\n\n return mask;\n }\n}\n"],"names":["dateParseISO","isDateValid","dateParse","mask"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  declare abstract class DataType<TValue = unknown> {
2
- abstract format(value: any, locale: Intl.LocalesArgument): string;
2
+ abstract format(value: TValue, locale: Intl.LocalesArgument): string;
3
3
  abstract parse(value: string, locale: Intl.LocalesArgument): TValue | undefined;
4
4
  }
5
5
  export declare abstract class NumericDataType extends DataType<number> {
@@ -8,7 +8,7 @@ class NumericDataType extends DataType {
8
8
  return "";
9
9
  }
10
10
  const localisedValue = new Intl.NumberFormat(locale, options).format(value);
11
- return localisedValue.replaceAll(/[\u00A0\u202F]/g, " ");
11
+ return localisedValue.replaceAll(/[\u00A0\u202F]/gu, " ");
12
12
  }
13
13
  static parse(value, locale) {
14
14
  if (value === void 0 || value === null || typeof value !== "string") {
@@ -17,7 +17,7 @@ class NumericDataType extends DataType {
17
17
  if (value === "Infinity" || value === "-Infinity") {
18
18
  return Number(value);
19
19
  }
20
- let sanitizedValue = value.replaceAll(" ", "").replaceAll(/[^0-9.,-]+/g, "");
20
+ let sanitizedValue = value.replaceAll(" ", "").replaceAll(/[^0-9.,-]+/gu, "");
21
21
  if (!sanitizedValue.length) {
22
22
  return void 0;
23
23
  }
@@ -56,7 +56,7 @@ class DateTimeDataType extends DataType {
56
56
  if (Number.isNaN(date.getTime())) {
57
57
  return "";
58
58
  }
59
- return new Intl.DateTimeFormat(locale, options).format(date).replaceAll(/[\u00A0\u202F]/g, " ");
59
+ return new Intl.DateTimeFormat(locale, options).format(date).replaceAll(/[\u00A0\u202F]/gu, " ");
60
60
  }
61
61
  static parse(value, locale) {
62
62
  if (value === void 0 || value === null || typeof value !== "string") {
@@ -72,7 +72,7 @@ class DateTimeDataType extends DataType {
72
72
  try {
73
73
  const date = parseISO(sanitizedValue);
74
74
  if (isValid(date)) {
75
- const timeRegex = /^\d{2}:\d{2}(?::\d{2}\.\d+|:\d{2})?(?:Z)?$/;
75
+ const timeRegex = /^\d{2}:\d{2}(?::\d{2}\.\d+|:\d{2})?(?:Z)?$/u;
76
76
  const time = sanitizedValue.split("T")[1];
77
77
  if (!time || !timeRegex.test(time)) {
78
78
  setHoursToMidday(date);
@@ -1 +1 @@
1
- {"version":3,"file":"dataTypes.js","sources":["../../src/utils/dataTypes.ts"],"sourcesContent":["// oxlint-disable max-classes-per-file\nimport { parse as dateParse, parseISO as dateParseISO, isValid as isDateValid } from 'date-fns';\n\nabstract class DataType<TValue = unknown> {\n abstract format(value: any, locale: Intl.LocalesArgument): string;\n abstract parse(value: string, locale: Intl.LocalesArgument): TValue | undefined;\n}\n\nconst localeNumberSeparators = new Map<Intl.LocalesArgument, string>();\n\nexport abstract class NumericDataType extends DataType<number> {\n static format(value: number, locale: Intl.LocalesArgument, options?: Intl.NumberFormatOptions) {\n if (value === undefined || typeof value !== 'number' || Number.isNaN(value)) {\n return '';\n }\n\n const localisedValue = new Intl.NumberFormat(locale, options).format(value);\n\n // the space character used by some locales is not a normal space, and won't match against user input unless replaced\n // replaces Non-Breaking Space (\\u00A0) and Narrow No-Break Space (\\u202F)\n return localisedValue.replaceAll(/[\\u00A0\\u202F]/g, ' ');\n }\n\n static parse(value: string, locale: Intl.LocalesArgument) {\n if (value === undefined || value === null || typeof value !== 'string') {\n return undefined;\n }\n\n if (value === 'Infinity' || value === '-Infinity') {\n return Number(value);\n }\n\n let sanitizedValue = value.replaceAll(' ', '').replaceAll(/[^0-9.,-]+/g, '');\n\n if (!sanitizedValue.length) {\n return undefined;\n }\n\n const decimalSeparator = this.getSeparator(locale);\n\n // replace decimal and group separators (we replaced space based separators above)\n if (decimalSeparator === ',') {\n sanitizedValue = sanitizedValue.replaceAll('.', '').replace(',', '.');\n } else {\n sanitizedValue = sanitizedValue.replaceAll(',', '');\n }\n\n const output = Number(sanitizedValue);\n\n if (Number.isNaN(output)) {\n return undefined;\n }\n\n return output;\n }\n\n private static getSeparator(locale: Intl.LocalesArgument) {\n if (localeNumberSeparators.has(locale)) {\n return localeNumberSeparators.get(locale);\n }\n\n const decimalSeparator =\n new Intl.NumberFormat(locale).formatToParts(1.1).find(part => part.type === 'decimal')?.value ?? '.';\n\n localeNumberSeparators.set(locale, decimalSeparator);\n\n return decimalSeparator;\n }\n}\n\nconst localeDateMasks = new Map<Intl.LocalesArgument, string>();\n\nexport abstract class DateTimeDataType extends DataType<Date> {\n static format(value: Date | string, locale: Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions) {\n let date;\n\n if (typeof value === 'string') {\n // handle json iso strings coming from rest calls\n date = new Date(value);\n } else if (value instanceof Date) {\n // handle date objects coming from js\n date = value;\n } else {\n return '';\n }\n\n if (Number.isNaN(date.getTime())) {\n return '';\n }\n // the space character used by some locales is not a normal space, and won't match against user input unless replaced\n // replaces Non-Breaking Space (\\u00A0) and Narrow No-Break Space (\\u202F)\n return new Intl.DateTimeFormat(locale, options).format(date).replaceAll(/[\\u00A0\\u202F]/g, ' ');\n }\n\n static parse(value: string, locale: Intl.LocalesArgument) {\n if (value === undefined || value === null || typeof value !== 'string') {\n return undefined;\n }\n\n const sanitizedValue = value?.trim();\n\n if (!sanitizedValue?.length) {\n return undefined;\n }\n\n // set to midday to avoid UTC offset causing dates to be mismatched server side\n const setHoursToMidday = (date: Date) => {\n date.setHours(12 - date.getTimezoneOffset() / 60);\n };\n\n try {\n const date = dateParseISO(sanitizedValue);\n\n if (isDateValid(date)) {\n const timeRegex = /^\\d{2}:\\d{2}(?::\\d{2}\\.\\d+|:\\d{2})?(?:Z)?$/;\n const time = sanitizedValue.split('T')[1];\n\n // check if the input string contains a valid time, otherwise set one\n if (!time || !timeRegex.test(time)) {\n setHoursToMidday(date);\n }\n\n return date;\n }\n } catch {\n //\n }\n\n const mask = this.getMask(locale);\n\n if (mask) {\n try {\n const date = dateParse(sanitizedValue, mask, new Date());\n\n if (isDateValid(date)) {\n setHoursToMidday(date);\n return date;\n }\n } catch {\n //\n }\n }\n\n return undefined;\n }\n\n private static getMask(locale: Intl.LocalesArgument) {\n if (localeDateMasks.has(locale)) {\n return localeDateMasks.get(locale);\n }\n\n const parts = new Intl.DateTimeFormat(locale).formatToParts(new Date());\n const mask = parts.reduce((mask, part) => {\n switch (part.type) {\n case 'literal':\n return mask + part.value;\n case 'day':\n return mask + 'dd';\n case 'month':\n return mask + 'MM';\n case 'year':\n return mask + 'yyyy';\n default:\n return mask;\n }\n }, '');\n\n localeDateMasks.set(locale, mask);\n\n return mask;\n }\n}\n"],"names":["dateParseISO","isDateValid","dateParse","mask"],"mappings":"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"}
1
+ {"version":3,"file":"dataTypes.js","sources":["../../src/utils/dataTypes.ts"],"sourcesContent":["// oxlint-disable max-classes-per-file\nimport { parse as dateParse, parseISO as dateParseISO, isValid as isDateValid } from 'date-fns';\n\nabstract class DataType<TValue = unknown> {\n abstract format(value: TValue, locale: Intl.LocalesArgument): string;\n abstract parse(value: string, locale: Intl.LocalesArgument): TValue | undefined;\n}\n\nconst localeNumberSeparators = new Map<Intl.LocalesArgument, string>();\n\nexport abstract class NumericDataType extends DataType<number> {\n static format(value: number, locale: Intl.LocalesArgument, options?: Intl.NumberFormatOptions) {\n if (value === undefined || typeof value !== 'number' || Number.isNaN(value)) {\n return '';\n }\n\n const localisedValue = new Intl.NumberFormat(locale, options).format(value);\n\n // the space character used by some locales is not a normal space, and won't match against user input unless replaced\n // replaces Non-Breaking Space (\\u00A0) and Narrow No-Break Space (\\u202F)\n return localisedValue.replaceAll(/[\\u00A0\\u202F]/gu, ' ');\n }\n\n static parse(value: string, locale: Intl.LocalesArgument) {\n if (value === undefined || value === null || typeof value !== 'string') {\n return undefined;\n }\n\n if (value === 'Infinity' || value === '-Infinity') {\n return Number(value);\n }\n\n let sanitizedValue = value.replaceAll(' ', '').replaceAll(/[^0-9.,-]+/gu, '');\n\n if (!sanitizedValue.length) {\n return undefined;\n }\n\n const decimalSeparator = this.getSeparator(locale);\n\n // replace decimal and group separators (we replaced space based separators above)\n if (decimalSeparator === ',') {\n sanitizedValue = sanitizedValue.replaceAll('.', '').replace(',', '.');\n } else {\n sanitizedValue = sanitizedValue.replaceAll(',', '');\n }\n\n const output = Number(sanitizedValue);\n\n if (Number.isNaN(output)) {\n return undefined;\n }\n\n return output;\n }\n\n private static getSeparator(locale: Intl.LocalesArgument) {\n if (localeNumberSeparators.has(locale)) {\n return localeNumberSeparators.get(locale);\n }\n\n const decimalSeparator =\n new Intl.NumberFormat(locale).formatToParts(1.1).find(part => part.type === 'decimal')?.value ?? '.';\n\n localeNumberSeparators.set(locale, decimalSeparator);\n\n return decimalSeparator;\n }\n}\n\nconst localeDateMasks = new Map<Intl.LocalesArgument, string>();\n\nexport abstract class DateTimeDataType extends DataType<Date> {\n static format(value: Date | string, locale: Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions) {\n let date;\n\n if (typeof value === 'string') {\n // handle json iso strings coming from rest calls\n date = new Date(value);\n } else if (value instanceof Date) {\n // handle date objects coming from js\n date = value;\n } else {\n return '';\n }\n\n if (Number.isNaN(date.getTime())) {\n return '';\n }\n // the space character used by some locales is not a normal space, and won't match against user input unless replaced\n // replaces Non-Breaking Space (\\u00A0) and Narrow No-Break Space (\\u202F)\n return new Intl.DateTimeFormat(locale, options).format(date).replaceAll(/[\\u00A0\\u202F]/gu, ' ');\n }\n\n static parse(value: string, locale: Intl.LocalesArgument) {\n if (value === undefined || value === null || typeof value !== 'string') {\n return undefined;\n }\n\n const sanitizedValue = value?.trim();\n\n if (!sanitizedValue?.length) {\n return undefined;\n }\n\n // set to midday to avoid UTC offset causing dates to be mismatched server side\n const setHoursToMidday = (date: Date) => {\n date.setHours(12 - date.getTimezoneOffset() / 60);\n };\n\n try {\n const date = dateParseISO(sanitizedValue);\n\n if (isDateValid(date)) {\n const timeRegex = /^\\d{2}:\\d{2}(?::\\d{2}\\.\\d+|:\\d{2})?(?:Z)?$/u;\n const time = sanitizedValue.split('T')[1];\n\n // check if the input string contains a valid time, otherwise set one\n if (!time || !timeRegex.test(time)) {\n setHoursToMidday(date);\n }\n\n return date;\n }\n } catch {\n //\n }\n\n const mask = this.getMask(locale);\n\n if (mask) {\n try {\n const date = dateParse(sanitizedValue, mask, new Date());\n\n if (isDateValid(date)) {\n setHoursToMidday(date);\n return date;\n }\n } catch {\n //\n }\n }\n\n return undefined;\n }\n\n private static getMask(locale: Intl.LocalesArgument) {\n if (localeDateMasks.has(locale)) {\n return localeDateMasks.get(locale);\n }\n\n const parts = new Intl.DateTimeFormat(locale).formatToParts(new Date());\n const mask = parts.reduce((mask, part) => {\n switch (part.type) {\n case 'literal':\n return mask + part.value;\n case 'day':\n return mask + 'dd';\n case 'month':\n return mask + 'MM';\n case 'year':\n return mask + 'yyyy';\n default:\n return mask;\n }\n }, '');\n\n localeDateMasks.set(locale, mask);\n\n return mask;\n }\n}\n"],"names":["dateParseISO","isDateValid","dateParse","mask"],"mappings":"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"}
@@ -24,14 +24,14 @@ function format(date, mask = "dd.mm.yy") {
24
24
  if (!dateFns.isValid(value) || value === void 0) {
25
25
  return void 0;
26
26
  }
27
- const pad = (v) => String(v).length === 1 ? `0${v}` : v.toString();
27
+ const pad = (v) => String(v).padStart(2, "0");
28
28
  return mask.replace("dd", pad(value.getDate())).replace("mm", pad(value.getMonth() + 1)).replace("yy", String(value.getFullYear()).slice(2));
29
29
  }
30
30
  const parseFromCustomString = (date = "", mask = "dd.mm.yy", defaultMonth = void 0, defaultYear = void 0) => {
31
31
  if (!date || !date.length) {
32
32
  return void 0;
33
33
  }
34
- const sanitizedMask = mask.split(/[^dmy]/);
34
+ const sanitizedMask = mask.split(/[^dmy]/u);
35
35
  const dd = sanitizedMask.findIndex((x) => x === "dd");
36
36
  const mm = sanitizedMask.findIndex((x) => x === "mm");
37
37
  const yy = sanitizedMask.findIndex((x) => x === "yy" || x === "yyyy");
@@ -40,15 +40,15 @@ const parseFromCustomString = (date = "", mask = "dd.mm.yy", defaultMonth = void
40
40
  let year;
41
41
  const getFullYear = (y) => {
42
42
  if (y && y.length === 2) {
43
- const z = Number.parseInt(y, 10);
43
+ const z = Math.trunc(Number(y));
44
44
  return z > 50 ? `19${y}` : `20${y}`;
45
45
  }
46
46
  return y;
47
47
  };
48
- const inputParts = date.split(/\D/);
48
+ const inputParts = date.split(/\D/u);
49
49
  if (inputParts.length === 1 && inputParts[0]) {
50
50
  const fullDate = inputParts[0];
51
- const unseparatedMask = mask.replaceAll(/[^dmy]/g, "");
51
+ const unseparatedMask = mask.replaceAll(/[^dmy]/gu, "");
52
52
  day = fullDate.slice(unseparatedMask.indexOf("d"), unseparatedMask.lastIndexOf("d") + 1);
53
53
  month = fullDate.slice(unseparatedMask.indexOf("m"), unseparatedMask.lastIndexOf("m") + 1);
54
54
  year = getFullYear(fullDate.slice(unseparatedMask.indexOf("y"), unseparatedMask.lastIndexOf("y") + 3));
@@ -57,28 +57,26 @@ const parseFromCustomString = (date = "", mask = "dd.mm.yy", defaultMonth = void
57
57
  month = inputParts[mm];
58
58
  year = getFullYear(inputParts[yy]);
59
59
  }
60
- const parsedDay = Number.parseInt(day ?? "", 10);
61
- const parsedMonth = Number.parseInt(month ?? "", 10);
62
- const parsedYear = Number.parseInt(year ?? "", 10);
60
+ const parsedDay = Math.trunc(Number(day ?? ""));
61
+ const parsedMonth = Math.trunc(Number(month ?? ""));
62
+ const parsedYear = Math.trunc(Number(year ?? ""));
63
63
  const currentDate = /* @__PURE__ */ new Date();
64
64
  return new Date(
65
- /* year */
65
+ // Year
66
66
  Object.is(parsedYear, Number.NaN) ? defaultYear ?? currentDate.getFullYear() : parsedYear,
67
- /* month */
67
+ // Month - months are zero based in javascript, so subtract a day
68
68
  Object.is(parsedMonth, Number.NaN) ? defaultMonth ?? currentDate.getMonth() : parsedMonth - 1,
69
- // months are zero based in javascript, so subtract a day
70
- /* day */
69
+ // Day
71
70
  Object.is(parsedDay, Number.NaN) ? currentDate.getDate() : parsedDay,
72
- /* hours */
71
+ // Hours
73
72
  12,
74
- /* minutes */
73
+ // Minutes - set to midday to avoid UTC offset causing dates to be mismatched server side
75
74
  0
76
- // set to midday to avoid UTC offset causing dates to be mismatched server side
77
75
  );
78
76
  };
79
77
  const parseFromISOString = (date) => {
80
78
  const tempDate = new Date(date);
81
- return dateFns.isValid(tempDate) ? parseFromCustomString(format(new Date(date))) : void 0;
79
+ return dateFns.isValid(tempDate) ? parseFromCustomString(format(tempDate)) : void 0;
82
80
  };
83
81
  exports.format = format;
84
82
  exports.isWeakEqual = isWeakEqual;
@@ -1 +1 @@
1
- {"version":3,"file":"date.cjs","sources":["../../src/utils/date.ts"],"sourcesContent":["import { isDate, isValid } from 'date-fns';\n\nexport const isWeakEqual = (leftDate: Date, rightDate: Date) => {\n return (\n leftDate.getFullYear() === rightDate.getFullYear() &&\n leftDate.getMonth() === rightDate.getMonth() &&\n leftDate.getDate() === rightDate.getDate()\n );\n};\n\nexport function parse(date: string | Date | undefined) {\n let value: Date | undefined;\n\n if (isDate(date)) {\n value = date as Date;\n } else if (typeof date === 'string') {\n value = parseFromISOString(date as string);\n }\n\n if (!isValid(value)) {\n return undefined;\n }\n\n return value;\n}\n\nexport function format(date: string | Date | undefined, mask = 'dd.mm.yy'): string | undefined {\n if (date === undefined) {\n return undefined;\n }\n\n const value = parse(date);\n\n if (!isValid(value) || value === undefined) {\n return undefined;\n }\n\n const pad = (v: number): string => (String(v).length === 1 ? `0${v}` : v.toString());\n\n return mask\n .replace('dd', pad(value.getDate()))\n .replace('mm', pad(value.getMonth() + 1))\n .replace('yy', String(value.getFullYear()).slice(2));\n}\n\nexport const parseFromCustomString = (\n date = '',\n mask = 'dd.mm.yy',\n defaultMonth: number | undefined = undefined,\n defaultYear: number | undefined = undefined\n): Date | undefined => {\n if (!date || !date.length) {\n return undefined;\n }\n\n const sanitizedMask = mask.split(/[^dmy]/);\n const dd = sanitizedMask.findIndex(x => x === 'dd');\n const mm = sanitizedMask.findIndex(x => x === 'mm');\n const yy = sanitizedMask.findIndex(x => x === 'yy' || x === 'yyyy');\n\n let day: string | undefined;\n let month: string | undefined;\n let year: string | undefined;\n\n const getFullYear = (y: string | undefined) => {\n if (y && y.length === 2) {\n const z = Number.parseInt(y, 10);\n\n return z > 50 ? `19${y}` : `20${y}`;\n }\n\n return y;\n };\n\n const inputParts = date.split(/\\D/);\n\n if (inputParts.length === 1 && inputParts[0]) {\n const fullDate = inputParts[0];\n const unseparatedMask = mask.replaceAll(/[^dmy]/g, '');\n\n day = fullDate.slice(unseparatedMask.indexOf('d'), unseparatedMask.lastIndexOf('d') + 1);\n month = fullDate.slice(unseparatedMask.indexOf('m'), unseparatedMask.lastIndexOf('m') + 1);\n year = getFullYear(fullDate.slice(unseparatedMask.indexOf('y'), unseparatedMask.lastIndexOf('y') + 3)); // account for full years\n } else {\n day = inputParts[dd];\n month = inputParts[mm];\n year = getFullYear(inputParts[yy]);\n }\n\n const parsedDay = Number.parseInt(day ?? '', 10);\n const parsedMonth = Number.parseInt(month ?? '', 10);\n const parsedYear = Number.parseInt(year ?? '', 10);\n\n const currentDate = new Date();\n\n return new Date(\n /* year */ Object.is(parsedYear, Number.NaN) ? (defaultYear ?? currentDate.getFullYear()) : parsedYear,\n /* month */ Object.is(parsedMonth, Number.NaN) ? (defaultMonth ?? currentDate.getMonth()) : parsedMonth - 1, // months are zero based in javascript, so subtract a day\n /* day */ Object.is(parsedDay, Number.NaN) ? currentDate.getDate() : parsedDay,\n /* hours */ 12,\n /* minutes */ 0 // set to midday to avoid UTC offset causing dates to be mismatched server side\n );\n};\n\nexport const parseFromISOString = (date: string): Date | undefined => {\n const tempDate = new Date(date);\n return isValid(tempDate) ? parseFromCustomString(format(new Date(date))) : undefined;\n};\n"],"names":["isDate","isValid"],"mappings":"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"}
1
+ {"version":3,"file":"date.cjs","sources":["../../src/utils/date.ts"],"sourcesContent":["import { isDate, isValid } from 'date-fns';\n\nexport const isWeakEqual = (leftDate: Date, rightDate: Date) => {\n return (\n leftDate.getFullYear() === rightDate.getFullYear() &&\n leftDate.getMonth() === rightDate.getMonth() &&\n leftDate.getDate() === rightDate.getDate()\n );\n};\n\nexport function parse(date: string | Date | undefined) {\n let value: Date | undefined;\n\n if (isDate(date)) {\n value = date as Date;\n } else if (typeof date === 'string') {\n value = parseFromISOString(date);\n }\n\n if (!isValid(value)) {\n return undefined;\n }\n\n return value;\n}\n\nexport function format(date: string | Date | undefined, mask = 'dd.mm.yy'): string | undefined {\n if (date === undefined) {\n return undefined;\n }\n\n const value = parse(date);\n\n if (!isValid(value) || value === undefined) {\n return undefined;\n }\n\n const pad = (v: number): string => String(v).padStart(2, '0');\n\n return mask\n .replace('dd', pad(value.getDate()))\n .replace('mm', pad(value.getMonth() + 1))\n .replace('yy', String(value.getFullYear()).slice(2));\n}\n\nexport const parseFromCustomString = (\n date = '',\n mask = 'dd.mm.yy',\n defaultMonth: number | undefined = undefined,\n defaultYear: number | undefined = undefined\n): Date | undefined => {\n if (!date || !date.length) {\n return undefined;\n }\n\n const sanitizedMask = mask.split(/[^dmy]/u);\n const dd = sanitizedMask.findIndex(x => x === 'dd');\n const mm = sanitizedMask.findIndex(x => x === 'mm');\n const yy = sanitizedMask.findIndex(x => x === 'yy' || x === 'yyyy');\n\n let day: string | undefined;\n let month: string | undefined;\n let year: string | undefined;\n\n const getFullYear = (y: string | undefined) => {\n if (y && y.length === 2) {\n const z = Math.trunc(Number(y));\n\n return z > 50 ? `19${y}` : `20${y}`;\n }\n\n return y;\n };\n\n const inputParts = date.split(/\\D/u);\n\n if (inputParts.length === 1 && inputParts[0]) {\n const fullDate = inputParts[0];\n const unseparatedMask = mask.replaceAll(/[^dmy]/gu, '');\n\n day = fullDate.slice(unseparatedMask.indexOf('d'), unseparatedMask.lastIndexOf('d') + 1);\n month = fullDate.slice(unseparatedMask.indexOf('m'), unseparatedMask.lastIndexOf('m') + 1);\n // account for full years\n year = getFullYear(fullDate.slice(unseparatedMask.indexOf('y'), unseparatedMask.lastIndexOf('y') + 3));\n } else {\n day = inputParts[dd];\n month = inputParts[mm];\n year = getFullYear(inputParts[yy]);\n }\n\n const parsedDay = Math.trunc(Number(day ?? ''));\n const parsedMonth = Math.trunc(Number(month ?? ''));\n const parsedYear = Math.trunc(Number(year ?? ''));\n\n const currentDate = new Date();\n\n return new Date(\n // Year\n Object.is(parsedYear, Number.NaN) ? (defaultYear ?? currentDate.getFullYear()) : parsedYear,\n // Month - months are zero based in javascript, so subtract a day\n Object.is(parsedMonth, Number.NaN) ? (defaultMonth ?? currentDate.getMonth()) : parsedMonth - 1,\n // Day\n Object.is(parsedDay, Number.NaN) ? currentDate.getDate() : parsedDay,\n // Hours\n 12,\n // Minutes - set to midday to avoid UTC offset causing dates to be mismatched server side\n 0\n );\n};\n\nexport const parseFromISOString = (date: string): Date | undefined => {\n const tempDate = new Date(date);\n return isValid(tempDate) ? parseFromCustomString(format(tempDate)) : undefined;\n};\n"],"names":["isDate","isValid"],"mappings":"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"}
@@ -22,14 +22,14 @@ function format(date, mask = "dd.mm.yy") {
22
22
  if (!isValid(value) || value === void 0) {
23
23
  return void 0;
24
24
  }
25
- const pad = (v) => String(v).length === 1 ? `0${v}` : v.toString();
25
+ const pad = (v) => String(v).padStart(2, "0");
26
26
  return mask.replace("dd", pad(value.getDate())).replace("mm", pad(value.getMonth() + 1)).replace("yy", String(value.getFullYear()).slice(2));
27
27
  }
28
28
  const parseFromCustomString = (date = "", mask = "dd.mm.yy", defaultMonth = void 0, defaultYear = void 0) => {
29
29
  if (!date || !date.length) {
30
30
  return void 0;
31
31
  }
32
- const sanitizedMask = mask.split(/[^dmy]/);
32
+ const sanitizedMask = mask.split(/[^dmy]/u);
33
33
  const dd = sanitizedMask.findIndex((x) => x === "dd");
34
34
  const mm = sanitizedMask.findIndex((x) => x === "mm");
35
35
  const yy = sanitizedMask.findIndex((x) => x === "yy" || x === "yyyy");
@@ -38,15 +38,15 @@ const parseFromCustomString = (date = "", mask = "dd.mm.yy", defaultMonth = void
38
38
  let year;
39
39
  const getFullYear = (y) => {
40
40
  if (y && y.length === 2) {
41
- const z = Number.parseInt(y, 10);
41
+ const z = Math.trunc(Number(y));
42
42
  return z > 50 ? `19${y}` : `20${y}`;
43
43
  }
44
44
  return y;
45
45
  };
46
- const inputParts = date.split(/\D/);
46
+ const inputParts = date.split(/\D/u);
47
47
  if (inputParts.length === 1 && inputParts[0]) {
48
48
  const fullDate = inputParts[0];
49
- const unseparatedMask = mask.replaceAll(/[^dmy]/g, "");
49
+ const unseparatedMask = mask.replaceAll(/[^dmy]/gu, "");
50
50
  day = fullDate.slice(unseparatedMask.indexOf("d"), unseparatedMask.lastIndexOf("d") + 1);
51
51
  month = fullDate.slice(unseparatedMask.indexOf("m"), unseparatedMask.lastIndexOf("m") + 1);
52
52
  year = getFullYear(fullDate.slice(unseparatedMask.indexOf("y"), unseparatedMask.lastIndexOf("y") + 3));
@@ -55,28 +55,26 @@ const parseFromCustomString = (date = "", mask = "dd.mm.yy", defaultMonth = void
55
55
  month = inputParts[mm];
56
56
  year = getFullYear(inputParts[yy]);
57
57
  }
58
- const parsedDay = Number.parseInt(day ?? "", 10);
59
- const parsedMonth = Number.parseInt(month ?? "", 10);
60
- const parsedYear = Number.parseInt(year ?? "", 10);
58
+ const parsedDay = Math.trunc(Number(day ?? ""));
59
+ const parsedMonth = Math.trunc(Number(month ?? ""));
60
+ const parsedYear = Math.trunc(Number(year ?? ""));
61
61
  const currentDate = /* @__PURE__ */ new Date();
62
62
  return new Date(
63
- /* year */
63
+ // Year
64
64
  Object.is(parsedYear, Number.NaN) ? defaultYear ?? currentDate.getFullYear() : parsedYear,
65
- /* month */
65
+ // Month - months are zero based in javascript, so subtract a day
66
66
  Object.is(parsedMonth, Number.NaN) ? defaultMonth ?? currentDate.getMonth() : parsedMonth - 1,
67
- // months are zero based in javascript, so subtract a day
68
- /* day */
67
+ // Day
69
68
  Object.is(parsedDay, Number.NaN) ? currentDate.getDate() : parsedDay,
70
- /* hours */
69
+ // Hours
71
70
  12,
72
- /* minutes */
71
+ // Minutes - set to midday to avoid UTC offset causing dates to be mismatched server side
73
72
  0
74
- // set to midday to avoid UTC offset causing dates to be mismatched server side
75
73
  );
76
74
  };
77
75
  const parseFromISOString = (date) => {
78
76
  const tempDate = new Date(date);
79
- return isValid(tempDate) ? parseFromCustomString(format(new Date(date))) : void 0;
77
+ return isValid(tempDate) ? parseFromCustomString(format(tempDate)) : void 0;
80
78
  };
81
79
  export {
82
80
  format,
@@ -1 +1 @@
1
- {"version":3,"file":"date.js","sources":["../../src/utils/date.ts"],"sourcesContent":["import { isDate, isValid } from 'date-fns';\n\nexport const isWeakEqual = (leftDate: Date, rightDate: Date) => {\n return (\n leftDate.getFullYear() === rightDate.getFullYear() &&\n leftDate.getMonth() === rightDate.getMonth() &&\n leftDate.getDate() === rightDate.getDate()\n );\n};\n\nexport function parse(date: string | Date | undefined) {\n let value: Date | undefined;\n\n if (isDate(date)) {\n value = date as Date;\n } else if (typeof date === 'string') {\n value = parseFromISOString(date as string);\n }\n\n if (!isValid(value)) {\n return undefined;\n }\n\n return value;\n}\n\nexport function format(date: string | Date | undefined, mask = 'dd.mm.yy'): string | undefined {\n if (date === undefined) {\n return undefined;\n }\n\n const value = parse(date);\n\n if (!isValid(value) || value === undefined) {\n return undefined;\n }\n\n const pad = (v: number): string => (String(v).length === 1 ? `0${v}` : v.toString());\n\n return mask\n .replace('dd', pad(value.getDate()))\n .replace('mm', pad(value.getMonth() + 1))\n .replace('yy', String(value.getFullYear()).slice(2));\n}\n\nexport const parseFromCustomString = (\n date = '',\n mask = 'dd.mm.yy',\n defaultMonth: number | undefined = undefined,\n defaultYear: number | undefined = undefined\n): Date | undefined => {\n if (!date || !date.length) {\n return undefined;\n }\n\n const sanitizedMask = mask.split(/[^dmy]/);\n const dd = sanitizedMask.findIndex(x => x === 'dd');\n const mm = sanitizedMask.findIndex(x => x === 'mm');\n const yy = sanitizedMask.findIndex(x => x === 'yy' || x === 'yyyy');\n\n let day: string | undefined;\n let month: string | undefined;\n let year: string | undefined;\n\n const getFullYear = (y: string | undefined) => {\n if (y && y.length === 2) {\n const z = Number.parseInt(y, 10);\n\n return z > 50 ? `19${y}` : `20${y}`;\n }\n\n return y;\n };\n\n const inputParts = date.split(/\\D/);\n\n if (inputParts.length === 1 && inputParts[0]) {\n const fullDate = inputParts[0];\n const unseparatedMask = mask.replaceAll(/[^dmy]/g, '');\n\n day = fullDate.slice(unseparatedMask.indexOf('d'), unseparatedMask.lastIndexOf('d') + 1);\n month = fullDate.slice(unseparatedMask.indexOf('m'), unseparatedMask.lastIndexOf('m') + 1);\n year = getFullYear(fullDate.slice(unseparatedMask.indexOf('y'), unseparatedMask.lastIndexOf('y') + 3)); // account for full years\n } else {\n day = inputParts[dd];\n month = inputParts[mm];\n year = getFullYear(inputParts[yy]);\n }\n\n const parsedDay = Number.parseInt(day ?? '', 10);\n const parsedMonth = Number.parseInt(month ?? '', 10);\n const parsedYear = Number.parseInt(year ?? '', 10);\n\n const currentDate = new Date();\n\n return new Date(\n /* year */ Object.is(parsedYear, Number.NaN) ? (defaultYear ?? currentDate.getFullYear()) : parsedYear,\n /* month */ Object.is(parsedMonth, Number.NaN) ? (defaultMonth ?? currentDate.getMonth()) : parsedMonth - 1, // months are zero based in javascript, so subtract a day\n /* day */ Object.is(parsedDay, Number.NaN) ? currentDate.getDate() : parsedDay,\n /* hours */ 12,\n /* minutes */ 0 // set to midday to avoid UTC offset causing dates to be mismatched server side\n );\n};\n\nexport const parseFromISOString = (date: string): Date | undefined => {\n const tempDate = new Date(date);\n return isValid(tempDate) ? parseFromCustomString(format(new Date(date))) : undefined;\n};\n"],"names":[],"mappings":";AAEO,MAAM,cAAc,CAAC,UAAgB,cAAoB;AAC5D,SACI,SAAS,YAAA,MAAkB,UAAU,YAAA,KACrC,SAAS,SAAA,MAAe,UAAU,cAClC,SAAS,QAAA,MAAc,UAAU,QAAA;AAEzC;AAEO,SAAS,MAAM,MAAiC;AACnD,MAAI;AAEJ,MAAI,OAAO,IAAI,GAAG;AACd,YAAQ;AAAA,EACZ,WAAW,OAAO,SAAS,UAAU;AACjC,YAAQ,mBAAmB,IAAc;AAAA,EAC7C;AAEA,MAAI,CAAC,QAAQ,KAAK,GAAG;AACjB,WAAO;AAAA,EACX;AAEA,SAAO;AACX;AAEO,SAAS,OAAO,MAAiC,OAAO,YAAgC;AAC3F,MAAI,SAAS,QAAW;AACpB,WAAO;AAAA,EACX;AAEA,QAAM,QAAQ,MAAM,IAAI;AAExB,MAAI,CAAC,QAAQ,KAAK,KAAK,UAAU,QAAW;AACxC,WAAO;AAAA,EACX;AAEA,QAAM,MAAM,CAAC,MAAuB,OAAO,CAAC,EAAE,WAAW,IAAI,IAAI,CAAC,KAAK,EAAE,SAAA;AAEzE,SAAO,KACF,QAAQ,MAAM,IAAI,MAAM,QAAA,CAAS,CAAC,EAClC,QAAQ,MAAM,IAAI,MAAM,SAAA,IAAa,CAAC,CAAC,EACvC,QAAQ,MAAM,OAAO,MAAM,YAAA,CAAa,EAAE,MAAM,CAAC,CAAC;AAC3D;AAEO,MAAM,wBAAwB,CACjC,OAAO,IACP,OAAO,YACP,eAAmC,QACnC,cAAkC,WACf;AACnB,MAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ;AACvB,WAAO;AAAA,EACX;AAEA,QAAM,gBAAgB,KAAK,MAAM,QAAQ;AACzC,QAAM,KAAK,cAAc,UAAU,CAAA,MAAK,MAAM,IAAI;AAClD,QAAM,KAAK,cAAc,UAAU,CAAA,MAAK,MAAM,IAAI;AAClD,QAAM,KAAK,cAAc,UAAU,OAAK,MAAM,QAAQ,MAAM,MAAM;AAElE,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,QAAM,cAAc,CAAC,MAA0B;AAC3C,QAAI,KAAK,EAAE,WAAW,GAAG;AACrB,YAAM,IAAI,OAAO,SAAS,GAAG,EAAE;AAE/B,aAAO,IAAI,KAAK,KAAK,CAAC,KAAK,KAAK,CAAC;AAAA,IACrC;AAEA,WAAO;AAAA,EACX;AAEA,QAAM,aAAa,KAAK,MAAM,IAAI;AAElC,MAAI,WAAW,WAAW,KAAK,WAAW,CAAC,GAAG;AAC1C,UAAM,WAAW,WAAW,CAAC;AAC7B,UAAM,kBAAkB,KAAK,WAAW,WAAW,EAAE;AAErD,UAAM,SAAS,MAAM,gBAAgB,QAAQ,GAAG,GAAG,gBAAgB,YAAY,GAAG,IAAI,CAAC;AACvF,YAAQ,SAAS,MAAM,gBAAgB,QAAQ,GAAG,GAAG,gBAAgB,YAAY,GAAG,IAAI,CAAC;AACzF,WAAO,YAAY,SAAS,MAAM,gBAAgB,QAAQ,GAAG,GAAG,gBAAgB,YAAY,GAAG,IAAI,CAAC,CAAC;AAAA,EACzG,OAAO;AACH,UAAM,WAAW,EAAE;AACnB,YAAQ,WAAW,EAAE;AACrB,WAAO,YAAY,WAAW,EAAE,CAAC;AAAA,EACrC;AAEA,QAAM,YAAY,OAAO,SAAS,OAAO,IAAI,EAAE;AAC/C,QAAM,cAAc,OAAO,SAAS,SAAS,IAAI,EAAE;AACnD,QAAM,aAAa,OAAO,SAAS,QAAQ,IAAI,EAAE;AAEjD,QAAM,kCAAkB,KAAA;AAExB,SAAO,IAAI;AAAA;AAAA,IACI,OAAO,GAAG,YAAY,OAAO,GAAG,IAAK,eAAe,YAAY,YAAA,IAAiB;AAAA;AAAA,IAChF,OAAO,GAAG,aAAa,OAAO,GAAG,IAAK,gBAAgB,YAAY,aAAc,cAAc;AAAA;AAAA;AAAA,IAChG,OAAO,GAAG,WAAW,OAAO,GAAG,IAAI,YAAY,YAAY;AAAA;AAAA,IACzD;AAAA;AAAA,IACE;AAAA;AAAA,EAAA;AAEtB;AAEO,MAAM,qBAAqB,CAAC,SAAmC;AAClE,QAAM,WAAW,IAAI,KAAK,IAAI;AAC9B,SAAO,QAAQ,QAAQ,IAAI,sBAAsB,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,IAAI;AAC/E;"}
1
+ {"version":3,"file":"date.js","sources":["../../src/utils/date.ts"],"sourcesContent":["import { isDate, isValid } from 'date-fns';\n\nexport const isWeakEqual = (leftDate: Date, rightDate: Date) => {\n return (\n leftDate.getFullYear() === rightDate.getFullYear() &&\n leftDate.getMonth() === rightDate.getMonth() &&\n leftDate.getDate() === rightDate.getDate()\n );\n};\n\nexport function parse(date: string | Date | undefined) {\n let value: Date | undefined;\n\n if (isDate(date)) {\n value = date as Date;\n } else if (typeof date === 'string') {\n value = parseFromISOString(date);\n }\n\n if (!isValid(value)) {\n return undefined;\n }\n\n return value;\n}\n\nexport function format(date: string | Date | undefined, mask = 'dd.mm.yy'): string | undefined {\n if (date === undefined) {\n return undefined;\n }\n\n const value = parse(date);\n\n if (!isValid(value) || value === undefined) {\n return undefined;\n }\n\n const pad = (v: number): string => String(v).padStart(2, '0');\n\n return mask\n .replace('dd', pad(value.getDate()))\n .replace('mm', pad(value.getMonth() + 1))\n .replace('yy', String(value.getFullYear()).slice(2));\n}\n\nexport const parseFromCustomString = (\n date = '',\n mask = 'dd.mm.yy',\n defaultMonth: number | undefined = undefined,\n defaultYear: number | undefined = undefined\n): Date | undefined => {\n if (!date || !date.length) {\n return undefined;\n }\n\n const sanitizedMask = mask.split(/[^dmy]/u);\n const dd = sanitizedMask.findIndex(x => x === 'dd');\n const mm = sanitizedMask.findIndex(x => x === 'mm');\n const yy = sanitizedMask.findIndex(x => x === 'yy' || x === 'yyyy');\n\n let day: string | undefined;\n let month: string | undefined;\n let year: string | undefined;\n\n const getFullYear = (y: string | undefined) => {\n if (y && y.length === 2) {\n const z = Math.trunc(Number(y));\n\n return z > 50 ? `19${y}` : `20${y}`;\n }\n\n return y;\n };\n\n const inputParts = date.split(/\\D/u);\n\n if (inputParts.length === 1 && inputParts[0]) {\n const fullDate = inputParts[0];\n const unseparatedMask = mask.replaceAll(/[^dmy]/gu, '');\n\n day = fullDate.slice(unseparatedMask.indexOf('d'), unseparatedMask.lastIndexOf('d') + 1);\n month = fullDate.slice(unseparatedMask.indexOf('m'), unseparatedMask.lastIndexOf('m') + 1);\n // account for full years\n year = getFullYear(fullDate.slice(unseparatedMask.indexOf('y'), unseparatedMask.lastIndexOf('y') + 3));\n } else {\n day = inputParts[dd];\n month = inputParts[mm];\n year = getFullYear(inputParts[yy]);\n }\n\n const parsedDay = Math.trunc(Number(day ?? ''));\n const parsedMonth = Math.trunc(Number(month ?? ''));\n const parsedYear = Math.trunc(Number(year ?? ''));\n\n const currentDate = new Date();\n\n return new Date(\n // Year\n Object.is(parsedYear, Number.NaN) ? (defaultYear ?? currentDate.getFullYear()) : parsedYear,\n // Month - months are zero based in javascript, so subtract a day\n Object.is(parsedMonth, Number.NaN) ? (defaultMonth ?? currentDate.getMonth()) : parsedMonth - 1,\n // Day\n Object.is(parsedDay, Number.NaN) ? currentDate.getDate() : parsedDay,\n // Hours\n 12,\n // Minutes - set to midday to avoid UTC offset causing dates to be mismatched server side\n 0\n );\n};\n\nexport const parseFromISOString = (date: string): Date | undefined => {\n const tempDate = new Date(date);\n return isValid(tempDate) ? parseFromCustomString(format(tempDate)) : undefined;\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"debounce.cjs","sources":["../../src/utils/debounce.ts"],"sourcesContent":["// oxlint-disable-next-line ban-types, no-unsafe-function-type\nexport const debounce = (fn: Function, delay: number) => {\n let timeoutId: ReturnType<typeof setTimeout>;\n\n return function (this: any, ...args: any[]) {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn.apply(this, args), delay);\n };\n};\n"],"names":[],"mappings":";;AACO,MAAM,WAAW,CAAC,IAAc,UAAkB;AACrD,MAAI;AAEJ,SAAO,YAAwB,MAAa;AACxC,iBAAa,SAAS;AACtB,gBAAY,WAAW,MAAM,GAAG,MAAM,MAAM,IAAI,GAAG,KAAK;AAAA,EAC5D;AACJ;;"}
1
+ {"version":3,"file":"debounce.cjs","sources":["../../src/utils/debounce.ts"],"sourcesContent":["export const debounce = <T, TArgs extends unknown[]>(fn: (this: T, ...args: TArgs) => void, delay: number) => {\n let timeoutId: ReturnType<typeof setTimeout>;\n\n return function (this: T, ...args: TArgs) {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn.apply(this, args), delay);\n };\n};\n"],"names":[],"mappings":";;AAAO,MAAM,WAAW,CAA6B,IAAuC,UAAkB;AAC1G,MAAI;AAEJ,SAAO,YAAsB,MAAa;AACtC,iBAAa,SAAS;AACtB,gBAAY,WAAW,MAAM,GAAG,MAAM,MAAM,IAAI,GAAG,KAAK;AAAA,EAC5D;AACJ;;"}
@@ -1 +1 @@
1
- export declare const debounce: (fn: Function, delay: number) => (this: any, ...args: any[]) => void;
1
+ export declare const debounce: <T, TArgs extends unknown[]>(fn: (this: T, ...args: TArgs) => void, delay: number) => (this: T, ...args: TArgs) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"debounce.js","sources":["../../src/utils/debounce.ts"],"sourcesContent":["// oxlint-disable-next-line ban-types, no-unsafe-function-type\nexport const debounce = (fn: Function, delay: number) => {\n let timeoutId: ReturnType<typeof setTimeout>;\n\n return function (this: any, ...args: any[]) {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn.apply(this, args), delay);\n };\n};\n"],"names":[],"mappings":"AACO,MAAM,WAAW,CAAC,IAAc,UAAkB;AACrD,MAAI;AAEJ,SAAO,YAAwB,MAAa;AACxC,iBAAa,SAAS;AACtB,gBAAY,WAAW,MAAM,GAAG,MAAM,MAAM,IAAI,GAAG,KAAK;AAAA,EAC5D;AACJ;"}
1
+ {"version":3,"file":"debounce.js","sources":["../../src/utils/debounce.ts"],"sourcesContent":["export const debounce = <T, TArgs extends unknown[]>(fn: (this: T, ...args: TArgs) => void, delay: number) => {\n let timeoutId: ReturnType<typeof setTimeout>;\n\n return function (this: T, ...args: TArgs) {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn.apply(this, args), delay);\n };\n};\n"],"names":[],"mappings":"AAAO,MAAM,WAAW,CAA6B,IAAuC,UAAkB;AAC1G,MAAI;AAEJ,SAAO,YAAsB,MAAa;AACtC,iBAAa,SAAS;AACtB,gBAAY,WAAW,MAAM,GAAG,MAAM,MAAM,IAAI,GAAG,KAAK;AAAA,EAC5D;AACJ;"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const mobiles = /iPhone|iPad|iPod|Android/i;
3
+ const mobiles = /iPhone|iPad|iPod|Android/iu;
4
4
  const isMobileDevice = (navigator) => !!navigator?.userAgent && mobiles.test(navigator.userAgent);
5
5
  exports.isMobileDevice = isMobileDevice;
6
6
  //# sourceMappingURL=device.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"device.cjs","sources":["../../src/utils/device.ts"],"sourcesContent":["const mobiles = /iPhone|iPad|iPod|Android/i;\n\nexport const isMobileDevice = (navigator: Navigator | undefined) => !!navigator?.userAgent && mobiles.test(navigator.userAgent);\n"],"names":[],"mappings":";;AAAA,MAAM,UAAU;AAET,MAAM,iBAAiB,CAAC,cAAqC,CAAC,CAAC,WAAW,aAAa,QAAQ,KAAK,UAAU,SAAS;;"}
1
+ {"version":3,"file":"device.cjs","sources":["../../src/utils/device.ts"],"sourcesContent":["const mobiles = /iPhone|iPad|iPod|Android/iu;\n\nexport const isMobileDevice = (navigator: Navigator | undefined) => !!navigator?.userAgent && mobiles.test(navigator.userAgent);\n"],"names":[],"mappings":";;AAAA,MAAM,UAAU;AAET,MAAM,iBAAiB,CAAC,cAAqC,CAAC,CAAC,WAAW,aAAa,QAAQ,KAAK,UAAU,SAAS;;"}
@@ -1,4 +1,4 @@
1
- const mobiles = /iPhone|iPad|iPod|Android/i;
1
+ const mobiles = /iPhone|iPad|iPod|Android/iu;
2
2
  const isMobileDevice = (navigator) => !!navigator?.userAgent && mobiles.test(navigator.userAgent);
3
3
  export {
4
4
  isMobileDevice
@@ -1 +1 @@
1
- {"version":3,"file":"device.js","sources":["../../src/utils/device.ts"],"sourcesContent":["const mobiles = /iPhone|iPad|iPod|Android/i;\n\nexport const isMobileDevice = (navigator: Navigator | undefined) => !!navigator?.userAgent && mobiles.test(navigator.userAgent);\n"],"names":[],"mappings":"AAAA,MAAM,UAAU;AAET,MAAM,iBAAiB,CAAC,cAAqC,CAAC,CAAC,WAAW,aAAa,QAAQ,KAAK,UAAU,SAAS;"}
1
+ {"version":3,"file":"device.js","sources":["../../src/utils/device.ts"],"sourcesContent":["const mobiles = /iPhone|iPad|iPod|Android/iu;\n\nexport const isMobileDevice = (navigator: Navigator | undefined) => !!navigator?.userAgent && mobiles.test(navigator.userAgent);\n"],"names":[],"mappings":"AAAA,MAAM,UAAU;AAET,MAAM,iBAAiB,CAAC,cAAqC,CAAC,CAAC,WAAW,aAAa,QAAQ,KAAK,UAAU,SAAS;"}
@@ -43,7 +43,7 @@ const getNextFocussableElement = (currentElement, direction = 1) => {
43
43
  if (!currentElement) {
44
44
  return null;
45
45
  }
46
- let focussableElements = [...document.querySelectorAll(FOCUSABLE_ELEMENTS.join(","))];
46
+ let focussableElements = Array.from(document.querySelectorAll(FOCUSABLE_ELEMENTS.join(",")));
47
47
  const currentElementIndex = focussableElements.indexOf(currentElement);
48
48
  if (currentElementIndex > -1) {
49
49
  focussableElements = focussableElements.slice(currentElementIndex + direction).filter((element) => element.getAttribute("tabindex") !== "-1").filter((element) => !element.hasAttribute("data-base-ui-focus-guard"));
@@ -1 +1 @@
1
- {"version":3,"file":"dom.cjs","sources":["../../src/utils/dom.ts"],"sourcesContent":["import type { TableRef } from '@/primitives/Table/types';\n\n// taken from react-aria\nconst FOCUSABLE_ELEMENTS = [\n '[tabindex]:not([tabindex=\"-1\"]):not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'button:not([disabled])',\n 'a[href]',\n 'area[href]',\n 'summary',\n 'iframe',\n 'object',\n 'embed',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"]):not([disabled])',\n 'details:not([disabled])',\n 'summary:not(:disabled)',\n];\n\nexport const hasFocusableElement = (element: HTMLElement | null) => {\n if (!element) {\n return null;\n }\n\n return !!element.querySelector(FOCUSABLE_ELEMENTS.join(','));\n};\n\nexport const isOverflowing = (element: HTMLElement | null) =>\n element === null ? false : element.scrollWidth > element.offsetWidth;\n\nexport const getIndexOfFirstChildOverflowingParent = (element: HTMLElement, overscan = 0) => {\n let index = 0;\n let boundaryChildIndex: number | null = null;\n const clientRect = element.getBoundingClientRect();\n\n for (const child of Array.from(element.children)) {\n const right = child.getBoundingClientRect().right - clientRect.left;\n const width = clientRect.width - overscan;\n\n if (right > width) {\n boundaryChildIndex = index;\n break;\n }\n index++;\n }\n\n return boundaryChildIndex;\n};\n\nexport const getNextFocussableElement = (currentElement: HTMLElement | null, direction = 1) => {\n if (!currentElement) {\n return null;\n }\n\n let focussableElements = [...(document.querySelectorAll<HTMLElement>(FOCUSABLE_ELEMENTS.join(',')) as any)];\n\n const currentElementIndex = focussableElements.indexOf(currentElement);\n\n if (currentElementIndex > -1) {\n focussableElements = focussableElements\n .slice(currentElementIndex + direction)\n .filter(element => element.getAttribute('tabindex') !== '-1')\n // Skip Base UI focus-guard sentinels (visually hidden helpers for portal focus trapping)\n .filter(element => !element.hasAttribute('data-base-ui-focus-guard'));\n\n if (focussableElements.length) {\n focussableElements = focussableElements.filter(element => (element as any).checkVisibility?.() ?? true);\n return focussableElements[0] ?? null;\n }\n }\n\n return null;\n};\n\nconst getOverlaySelector = (element: Element | null) => {\n switch (element?.getAttribute('role')) {\n case 'dialog':\n return `[aria-controls='${element.id}']`;\n\n case 'menu':\n return `#${element.getAttribute('aria-labelledby')}`;\n\n default:\n return undefined;\n }\n};\n\nexport function isElementTriggeredFromContainer(element: Element | null, container: Element | null): boolean {\n const selector = getOverlaySelector(element) ?? getOverlaySelector(element?.closest('[role=dialog],[role=menu]') ?? null);\n\n if (selector) {\n const escapedSelector = CSS.escape(selector);\n\n if (container?.querySelector(escapedSelector)) {\n return true;\n }\n\n const elementInDocument = document.querySelector(escapedSelector);\n\n if (elementInDocument === container) {\n return true;\n }\n\n // if the element does exist, see if it is itself connected to somethng that was triggered from the container\n if (elementInDocument) {\n return isElementTriggeredFromContainer(elementInDocument, container);\n }\n\n return false;\n }\n\n return false;\n}\n\nconst isDialogOpenedFromContainer = (element: Element | null, container: Element | null) => {\n if (!container) {\n return false;\n }\n\n let currentDialog = element?.closest('[role=\"dialog\"]');\n\n // Iteratively traverse up through nested dialogs to check if any of them were triggered from within the container\n while (currentDialog?.id) {\n const opener = document.querySelector(`[aria-controls=\"${currentDialog.id}\"]`);\n\n if (!opener) {\n return false;\n }\n\n if (container.contains(opener)) {\n return true;\n }\n\n currentDialog = opener.closest('[role=\"dialog\"]');\n }\n\n return false;\n};\n\nexport function isElementInsideOrTriggeredFromContainer(element: Element | null, container: Element | null) {\n return (\n isElementTriggeredFromContainer(element, container) ||\n !!container?.contains(element) ||\n isDialogOpenedFromContainer(element, container)\n );\n}\n\nexport function isElementInsideOverlay(element: Element | null) {\n return !!element?.closest('[role=dialog],[role=menu]');\n}\n\nexport function isSiblingElementInsideSameParentOverlay(element: Element | null, sibling: Element | null) {\n return !!element?.closest('[role=dialog],[role=menu]')?.contains(sibling);\n}\n\nexport function isElementInsideExternalRelatedOverlay(element: Element | null, tableRef: React.RefObject<TableRef>) {\n return (\n (isElementInsideOverlay(element) && !isSiblingElementInsideSameParentOverlay(element, tableRef.current)) ||\n (isElementInteractive(element) && !isElementInsideOrTriggeredFromContainer(element, tableRef.current))\n );\n}\n\nexport function isElementInteractive(element: Element | null) {\n if (!element) {\n return false;\n }\n\n const interactiveElements = new Set(['A', 'BUTTON', 'INPUT', 'TEXTAREA', 'SELECT', 'LABEL', 'OPTION']);\n\n const isInteractive =\n interactiveElements.has(element.tagName) &&\n !(element as HTMLElement).hidden &&\n !(element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | HTMLButtonElement).disabled &&\n !(element as HTMLInputElement | HTMLTextAreaElement).readOnly;\n\n // sometimes buttons contain content like an icon, and we can't rely on pointer events being disabled\n // so search for a focusable parent\n if (!isInteractive) {\n const focusableParent = element.closest(FOCUSABLE_ELEMENTS.join(','));\n return focusableParent ? interactiveElements.has(focusableParent.tagName) : false;\n }\n\n return isInteractive;\n}\n\nexport function isElementInsideTable3OrReport(element: Element | null) {\n return !!element?.closest('[data-taco^=table]');\n}\n\nexport function setDataFocusAttribute(target: Element) {\n target.setAttribute('data-focus', 'programmatic');\n\n const cleanup = () => {\n target.removeAttribute('data-focus');\n target.removeEventListener('blur', cleanup);\n };\n\n target.addEventListener('blur', cleanup);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dom.cjs","sources":["../../src/utils/dom.ts"],"sourcesContent":["import type { TableRef } from '@/primitives/Table/types';\n\n// taken from react-aria\nconst FOCUSABLE_ELEMENTS = [\n '[tabindex]:not([tabindex=\"-1\"]):not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'button:not([disabled])',\n 'a[href]',\n 'area[href]',\n 'summary',\n 'iframe',\n 'object',\n 'embed',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"]):not([disabled])',\n 'details:not([disabled])',\n 'summary:not(:disabled)',\n];\n\nexport const hasFocusableElement = (element: HTMLElement | null) => {\n if (!element) {\n return null;\n }\n\n return !!element.querySelector(FOCUSABLE_ELEMENTS.join(','));\n};\n\nexport const isOverflowing = (element: HTMLElement | null) =>\n element === null ? false : element.scrollWidth > element.offsetWidth;\n\nexport const getIndexOfFirstChildOverflowingParent = (element: HTMLElement, overscan = 0) => {\n let index = 0;\n let boundaryChildIndex: number | null = null;\n const clientRect = element.getBoundingClientRect();\n\n for (const child of Array.from(element.children)) {\n const right = child.getBoundingClientRect().right - clientRect.left;\n const width = clientRect.width - overscan;\n\n if (right > width) {\n boundaryChildIndex = index;\n break;\n }\n index++;\n }\n\n return boundaryChildIndex;\n};\n\nexport const getNextFocussableElement = (currentElement: HTMLElement | null, direction = 1) => {\n if (!currentElement) {\n return null;\n }\n\n let focussableElements = Array.from(document.querySelectorAll<HTMLElement>(FOCUSABLE_ELEMENTS.join(',')));\n\n const currentElementIndex = focussableElements.indexOf(currentElement);\n\n if (currentElementIndex > -1) {\n focussableElements = focussableElements\n .slice(currentElementIndex + direction)\n .filter(element => element.getAttribute('tabindex') !== '-1')\n // Skip Base UI focus-guard sentinels (visually hidden helpers for portal focus trapping)\n .filter(element => !element.hasAttribute('data-base-ui-focus-guard'));\n\n if (focussableElements.length) {\n // checkVisibility is missing in jsdom and older browsers — treat those as visible\n focussableElements = focussableElements.filter(element => element.checkVisibility?.() ?? true);\n return focussableElements[0] ?? null;\n }\n }\n\n return null;\n};\n\nconst getOverlaySelector = (element: Element | null) => {\n switch (element?.getAttribute('role')) {\n case 'dialog':\n return `[aria-controls='${element.id}']`;\n\n case 'menu':\n return `#${element.getAttribute('aria-labelledby')}`;\n\n default:\n return undefined;\n }\n};\n\nexport function isElementTriggeredFromContainer(element: Element | null, container: Element | null): boolean {\n const selector = getOverlaySelector(element) ?? getOverlaySelector(element?.closest('[role=dialog],[role=menu]') ?? null);\n\n if (selector) {\n const escapedSelector = CSS.escape(selector);\n\n if (container?.querySelector(escapedSelector)) {\n return true;\n }\n\n const elementInDocument = document.querySelector(escapedSelector);\n\n if (elementInDocument === container) {\n return true;\n }\n\n // if the element does exist, see if it is itself connected to somethng that was triggered from the container\n if (elementInDocument) {\n return isElementTriggeredFromContainer(elementInDocument, container);\n }\n\n return false;\n }\n\n return false;\n}\n\nconst isDialogOpenedFromContainer = (element: Element | null, container: Element | null) => {\n if (!container) {\n return false;\n }\n\n let currentDialog = element?.closest('[role=\"dialog\"]');\n\n // Iteratively traverse up through nested dialogs to check if any of them were triggered from within the container\n while (currentDialog?.id) {\n const opener = document.querySelector(`[aria-controls=\"${currentDialog.id}\"]`);\n\n if (!opener) {\n return false;\n }\n\n if (container.contains(opener)) {\n return true;\n }\n\n currentDialog = opener.closest('[role=\"dialog\"]');\n }\n\n return false;\n};\n\nexport function isElementInsideOrTriggeredFromContainer(element: Element | null, container: Element | null) {\n return (\n isElementTriggeredFromContainer(element, container) ||\n !!container?.contains(element) ||\n isDialogOpenedFromContainer(element, container)\n );\n}\n\nexport function isElementInsideOverlay(element: Element | null) {\n return !!element?.closest('[role=dialog],[role=menu]');\n}\n\nexport function isSiblingElementInsideSameParentOverlay(element: Element | null, sibling: Element | null) {\n return !!element?.closest('[role=dialog],[role=menu]')?.contains(sibling);\n}\n\nexport function isElementInsideExternalRelatedOverlay(element: Element | null, tableRef: React.RefObject<TableRef | null>) {\n return (\n (isElementInsideOverlay(element) && !isSiblingElementInsideSameParentOverlay(element, tableRef.current)) ||\n (isElementInteractive(element) && !isElementInsideOrTriggeredFromContainer(element, tableRef.current))\n );\n}\n\nexport function isElementInteractive(element: Element | null) {\n if (!element) {\n return false;\n }\n\n const interactiveElements = new Set(['A', 'BUTTON', 'INPUT', 'TEXTAREA', 'SELECT', 'LABEL', 'OPTION']);\n\n const isInteractive =\n interactiveElements.has(element.tagName) &&\n !(element as HTMLElement).hidden &&\n !(element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | HTMLButtonElement).disabled &&\n !(element as HTMLInputElement | HTMLTextAreaElement).readOnly;\n\n // sometimes buttons contain content like an icon, and we can't rely on pointer events being disabled\n // so search for a focusable parent\n if (!isInteractive) {\n const focusableParent = element.closest(FOCUSABLE_ELEMENTS.join(','));\n return focusableParent ? interactiveElements.has(focusableParent.tagName) : false;\n }\n\n return isInteractive;\n}\n\nexport function isElementInsideTable3OrReport(element: Element | null) {\n return !!element?.closest('[data-taco^=table]');\n}\n\nexport function setDataFocusAttribute(target: Element) {\n target.setAttribute('data-focus', 'programmatic');\n\n const cleanup = () => {\n target.removeAttribute('data-focus');\n target.removeEventListener('blur', cleanup);\n };\n\n target.addEventListener('blur', cleanup);\n}\n"],"names":[],"mappings":"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"}
@@ -2,12 +2,12 @@ import { TableRef } from '../primitives/Table/types';
2
2
  export declare const hasFocusableElement: (element: HTMLElement | null) => boolean | null;
3
3
  export declare const isOverflowing: (element: HTMLElement | null) => boolean;
4
4
  export declare const getIndexOfFirstChildOverflowingParent: (element: HTMLElement, overscan?: number) => number | null;
5
- export declare const getNextFocussableElement: (currentElement: HTMLElement | null, direction?: number) => any;
5
+ export declare const getNextFocussableElement: (currentElement: HTMLElement | null, direction?: number) => HTMLElement | null;
6
6
  export declare function isElementTriggeredFromContainer(element: Element | null, container: Element | null): boolean;
7
7
  export declare function isElementInsideOrTriggeredFromContainer(element: Element | null, container: Element | null): boolean;
8
8
  export declare function isElementInsideOverlay(element: Element | null): boolean;
9
9
  export declare function isSiblingElementInsideSameParentOverlay(element: Element | null, sibling: Element | null): boolean;
10
- export declare function isElementInsideExternalRelatedOverlay(element: Element | null, tableRef: React.RefObject<TableRef>): boolean;
10
+ export declare function isElementInsideExternalRelatedOverlay(element: Element | null, tableRef: React.RefObject<TableRef | null>): boolean;
11
11
  export declare function isElementInteractive(element: Element | null): boolean;
12
12
  export declare function isElementInsideTable3OrReport(element: Element | null): boolean;
13
13
  export declare function setDataFocusAttribute(target: Element): void;
package/dist/utils/dom.js CHANGED
@@ -41,7 +41,7 @@ const getNextFocussableElement = (currentElement, direction = 1) => {
41
41
  if (!currentElement) {
42
42
  return null;
43
43
  }
44
- let focussableElements = [...document.querySelectorAll(FOCUSABLE_ELEMENTS.join(","))];
44
+ let focussableElements = Array.from(document.querySelectorAll(FOCUSABLE_ELEMENTS.join(",")));
45
45
  const currentElementIndex = focussableElements.indexOf(currentElement);
46
46
  if (currentElementIndex > -1) {
47
47
  focussableElements = focussableElements.slice(currentElementIndex + direction).filter((element) => element.getAttribute("tabindex") !== "-1").filter((element) => !element.hasAttribute("data-base-ui-focus-guard"));
@@ -1 +1 @@
1
- {"version":3,"file":"dom.js","sources":["../../src/utils/dom.ts"],"sourcesContent":["import type { TableRef } from '@/primitives/Table/types';\n\n// taken from react-aria\nconst FOCUSABLE_ELEMENTS = [\n '[tabindex]:not([tabindex=\"-1\"]):not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'button:not([disabled])',\n 'a[href]',\n 'area[href]',\n 'summary',\n 'iframe',\n 'object',\n 'embed',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"]):not([disabled])',\n 'details:not([disabled])',\n 'summary:not(:disabled)',\n];\n\nexport const hasFocusableElement = (element: HTMLElement | null) => {\n if (!element) {\n return null;\n }\n\n return !!element.querySelector(FOCUSABLE_ELEMENTS.join(','));\n};\n\nexport const isOverflowing = (element: HTMLElement | null) =>\n element === null ? false : element.scrollWidth > element.offsetWidth;\n\nexport const getIndexOfFirstChildOverflowingParent = (element: HTMLElement, overscan = 0) => {\n let index = 0;\n let boundaryChildIndex: number | null = null;\n const clientRect = element.getBoundingClientRect();\n\n for (const child of Array.from(element.children)) {\n const right = child.getBoundingClientRect().right - clientRect.left;\n const width = clientRect.width - overscan;\n\n if (right > width) {\n boundaryChildIndex = index;\n break;\n }\n index++;\n }\n\n return boundaryChildIndex;\n};\n\nexport const getNextFocussableElement = (currentElement: HTMLElement | null, direction = 1) => {\n if (!currentElement) {\n return null;\n }\n\n let focussableElements = [...(document.querySelectorAll<HTMLElement>(FOCUSABLE_ELEMENTS.join(',')) as any)];\n\n const currentElementIndex = focussableElements.indexOf(currentElement);\n\n if (currentElementIndex > -1) {\n focussableElements = focussableElements\n .slice(currentElementIndex + direction)\n .filter(element => element.getAttribute('tabindex') !== '-1')\n // Skip Base UI focus-guard sentinels (visually hidden helpers for portal focus trapping)\n .filter(element => !element.hasAttribute('data-base-ui-focus-guard'));\n\n if (focussableElements.length) {\n focussableElements = focussableElements.filter(element => (element as any).checkVisibility?.() ?? true);\n return focussableElements[0] ?? null;\n }\n }\n\n return null;\n};\n\nconst getOverlaySelector = (element: Element | null) => {\n switch (element?.getAttribute('role')) {\n case 'dialog':\n return `[aria-controls='${element.id}']`;\n\n case 'menu':\n return `#${element.getAttribute('aria-labelledby')}`;\n\n default:\n return undefined;\n }\n};\n\nexport function isElementTriggeredFromContainer(element: Element | null, container: Element | null): boolean {\n const selector = getOverlaySelector(element) ?? getOverlaySelector(element?.closest('[role=dialog],[role=menu]') ?? null);\n\n if (selector) {\n const escapedSelector = CSS.escape(selector);\n\n if (container?.querySelector(escapedSelector)) {\n return true;\n }\n\n const elementInDocument = document.querySelector(escapedSelector);\n\n if (elementInDocument === container) {\n return true;\n }\n\n // if the element does exist, see if it is itself connected to somethng that was triggered from the container\n if (elementInDocument) {\n return isElementTriggeredFromContainer(elementInDocument, container);\n }\n\n return false;\n }\n\n return false;\n}\n\nconst isDialogOpenedFromContainer = (element: Element | null, container: Element | null) => {\n if (!container) {\n return false;\n }\n\n let currentDialog = element?.closest('[role=\"dialog\"]');\n\n // Iteratively traverse up through nested dialogs to check if any of them were triggered from within the container\n while (currentDialog?.id) {\n const opener = document.querySelector(`[aria-controls=\"${currentDialog.id}\"]`);\n\n if (!opener) {\n return false;\n }\n\n if (container.contains(opener)) {\n return true;\n }\n\n currentDialog = opener.closest('[role=\"dialog\"]');\n }\n\n return false;\n};\n\nexport function isElementInsideOrTriggeredFromContainer(element: Element | null, container: Element | null) {\n return (\n isElementTriggeredFromContainer(element, container) ||\n !!container?.contains(element) ||\n isDialogOpenedFromContainer(element, container)\n );\n}\n\nexport function isElementInsideOverlay(element: Element | null) {\n return !!element?.closest('[role=dialog],[role=menu]');\n}\n\nexport function isSiblingElementInsideSameParentOverlay(element: Element | null, sibling: Element | null) {\n return !!element?.closest('[role=dialog],[role=menu]')?.contains(sibling);\n}\n\nexport function isElementInsideExternalRelatedOverlay(element: Element | null, tableRef: React.RefObject<TableRef>) {\n return (\n (isElementInsideOverlay(element) && !isSiblingElementInsideSameParentOverlay(element, tableRef.current)) ||\n (isElementInteractive(element) && !isElementInsideOrTriggeredFromContainer(element, tableRef.current))\n );\n}\n\nexport function isElementInteractive(element: Element | null) {\n if (!element) {\n return false;\n }\n\n const interactiveElements = new Set(['A', 'BUTTON', 'INPUT', 'TEXTAREA', 'SELECT', 'LABEL', 'OPTION']);\n\n const isInteractive =\n interactiveElements.has(element.tagName) &&\n !(element as HTMLElement).hidden &&\n !(element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | HTMLButtonElement).disabled &&\n !(element as HTMLInputElement | HTMLTextAreaElement).readOnly;\n\n // sometimes buttons contain content like an icon, and we can't rely on pointer events being disabled\n // so search for a focusable parent\n if (!isInteractive) {\n const focusableParent = element.closest(FOCUSABLE_ELEMENTS.join(','));\n return focusableParent ? interactiveElements.has(focusableParent.tagName) : false;\n }\n\n return isInteractive;\n}\n\nexport function isElementInsideTable3OrReport(element: Element | null) {\n return !!element?.closest('[data-taco^=table]');\n}\n\nexport function setDataFocusAttribute(target: Element) {\n target.setAttribute('data-focus', 'programmatic');\n\n const cleanup = () => {\n target.removeAttribute('data-focus');\n target.removeEventListener('blur', cleanup);\n };\n\n target.addEventListener('blur', cleanup);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dom.js","sources":["../../src/utils/dom.ts"],"sourcesContent":["import type { TableRef } from '@/primitives/Table/types';\n\n// taken from react-aria\nconst FOCUSABLE_ELEMENTS = [\n '[tabindex]:not([tabindex=\"-1\"]):not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'button:not([disabled])',\n 'a[href]',\n 'area[href]',\n 'summary',\n 'iframe',\n 'object',\n 'embed',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"]):not([disabled])',\n 'details:not([disabled])',\n 'summary:not(:disabled)',\n];\n\nexport const hasFocusableElement = (element: HTMLElement | null) => {\n if (!element) {\n return null;\n }\n\n return !!element.querySelector(FOCUSABLE_ELEMENTS.join(','));\n};\n\nexport const isOverflowing = (element: HTMLElement | null) =>\n element === null ? false : element.scrollWidth > element.offsetWidth;\n\nexport const getIndexOfFirstChildOverflowingParent = (element: HTMLElement, overscan = 0) => {\n let index = 0;\n let boundaryChildIndex: number | null = null;\n const clientRect = element.getBoundingClientRect();\n\n for (const child of Array.from(element.children)) {\n const right = child.getBoundingClientRect().right - clientRect.left;\n const width = clientRect.width - overscan;\n\n if (right > width) {\n boundaryChildIndex = index;\n break;\n }\n index++;\n }\n\n return boundaryChildIndex;\n};\n\nexport const getNextFocussableElement = (currentElement: HTMLElement | null, direction = 1) => {\n if (!currentElement) {\n return null;\n }\n\n let focussableElements = Array.from(document.querySelectorAll<HTMLElement>(FOCUSABLE_ELEMENTS.join(',')));\n\n const currentElementIndex = focussableElements.indexOf(currentElement);\n\n if (currentElementIndex > -1) {\n focussableElements = focussableElements\n .slice(currentElementIndex + direction)\n .filter(element => element.getAttribute('tabindex') !== '-1')\n // Skip Base UI focus-guard sentinels (visually hidden helpers for portal focus trapping)\n .filter(element => !element.hasAttribute('data-base-ui-focus-guard'));\n\n if (focussableElements.length) {\n // checkVisibility is missing in jsdom and older browsers — treat those as visible\n focussableElements = focussableElements.filter(element => element.checkVisibility?.() ?? true);\n return focussableElements[0] ?? null;\n }\n }\n\n return null;\n};\n\nconst getOverlaySelector = (element: Element | null) => {\n switch (element?.getAttribute('role')) {\n case 'dialog':\n return `[aria-controls='${element.id}']`;\n\n case 'menu':\n return `#${element.getAttribute('aria-labelledby')}`;\n\n default:\n return undefined;\n }\n};\n\nexport function isElementTriggeredFromContainer(element: Element | null, container: Element | null): boolean {\n const selector = getOverlaySelector(element) ?? getOverlaySelector(element?.closest('[role=dialog],[role=menu]') ?? null);\n\n if (selector) {\n const escapedSelector = CSS.escape(selector);\n\n if (container?.querySelector(escapedSelector)) {\n return true;\n }\n\n const elementInDocument = document.querySelector(escapedSelector);\n\n if (elementInDocument === container) {\n return true;\n }\n\n // if the element does exist, see if it is itself connected to somethng that was triggered from the container\n if (elementInDocument) {\n return isElementTriggeredFromContainer(elementInDocument, container);\n }\n\n return false;\n }\n\n return false;\n}\n\nconst isDialogOpenedFromContainer = (element: Element | null, container: Element | null) => {\n if (!container) {\n return false;\n }\n\n let currentDialog = element?.closest('[role=\"dialog\"]');\n\n // Iteratively traverse up through nested dialogs to check if any of them were triggered from within the container\n while (currentDialog?.id) {\n const opener = document.querySelector(`[aria-controls=\"${currentDialog.id}\"]`);\n\n if (!opener) {\n return false;\n }\n\n if (container.contains(opener)) {\n return true;\n }\n\n currentDialog = opener.closest('[role=\"dialog\"]');\n }\n\n return false;\n};\n\nexport function isElementInsideOrTriggeredFromContainer(element: Element | null, container: Element | null) {\n return (\n isElementTriggeredFromContainer(element, container) ||\n !!container?.contains(element) ||\n isDialogOpenedFromContainer(element, container)\n );\n}\n\nexport function isElementInsideOverlay(element: Element | null) {\n return !!element?.closest('[role=dialog],[role=menu]');\n}\n\nexport function isSiblingElementInsideSameParentOverlay(element: Element | null, sibling: Element | null) {\n return !!element?.closest('[role=dialog],[role=menu]')?.contains(sibling);\n}\n\nexport function isElementInsideExternalRelatedOverlay(element: Element | null, tableRef: React.RefObject<TableRef | null>) {\n return (\n (isElementInsideOverlay(element) && !isSiblingElementInsideSameParentOverlay(element, tableRef.current)) ||\n (isElementInteractive(element) && !isElementInsideOrTriggeredFromContainer(element, tableRef.current))\n );\n}\n\nexport function isElementInteractive(element: Element | null) {\n if (!element) {\n return false;\n }\n\n const interactiveElements = new Set(['A', 'BUTTON', 'INPUT', 'TEXTAREA', 'SELECT', 'LABEL', 'OPTION']);\n\n const isInteractive =\n interactiveElements.has(element.tagName) &&\n !(element as HTMLElement).hidden &&\n !(element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | HTMLButtonElement).disabled &&\n !(element as HTMLInputElement | HTMLTextAreaElement).readOnly;\n\n // sometimes buttons contain content like an icon, and we can't rely on pointer events being disabled\n // so search for a focusable parent\n if (!isInteractive) {\n const focusableParent = element.closest(FOCUSABLE_ELEMENTS.join(','));\n return focusableParent ? interactiveElements.has(focusableParent.tagName) : false;\n }\n\n return isInteractive;\n}\n\nexport function isElementInsideTable3OrReport(element: Element | null) {\n return !!element?.closest('[data-taco^=table]');\n}\n\nexport function setDataFocusAttribute(target: Element) {\n target.setAttribute('data-focus', 'programmatic');\n\n const cleanup = () => {\n target.removeAttribute('data-focus');\n target.removeEventListener('blur', cleanup);\n };\n\n target.addEventListener('blur', cleanup);\n}\n"],"names":[],"mappings":"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"}