@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
@@ -20,20 +20,19 @@ function _interopNamespaceDefault(e) {
20
20
  const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
21
21
  function useControlled(props) {
22
22
  const [uncontrolledValue, setUncontrolledValue, onChangeRef] = useUncontrolledState(props.defaultValue, props.onChange);
23
- const isControlled = props.value !== void 0;
24
- const returnValue = isControlled ? props.value : uncontrolledValue;
23
+ const returnValue = props.value === void 0 ? uncontrolledValue : props.value;
25
24
  const onChange = React__namespace.useCallback(
26
25
  (nextValue) => {
27
- if (isControlled) {
28
- const newValue = isFunction(nextValue) ? nextValue(props.value) : nextValue;
26
+ if (props.value === void 0) {
27
+ setUncontrolledValue(nextValue);
28
+ } else {
29
+ const newValue = typeof nextValue === "function" ? nextValue(props.value) : nextValue;
29
30
  if (newValue !== props.value) {
30
31
  onChangeRef.current?.(newValue);
31
32
  }
32
- } else {
33
- setUncontrolledValue(nextValue);
34
33
  }
35
34
  },
36
- [props.value, onChangeRef, isControlled, setUncontrolledValue]
35
+ [props.value, onChangeRef, setUncontrolledValue]
37
36
  );
38
37
  return [returnValue, onChange];
39
38
  }
@@ -52,8 +51,5 @@ function useUncontrolledState(defaultValue, onChange) {
52
51
  }, [value, prevValueRef]);
53
52
  return [value, setValue, onChangeRef];
54
53
  }
55
- function isFunction(value) {
56
- return typeof value === "function";
57
- }
58
54
  exports.useControlled = useControlled;
59
55
  //# sourceMappingURL=useControlled.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useControlled.cjs","sources":["../../src/hooks/useControlled.ts"],"sourcesContent":["import * as React from 'react';\n\ntype SetStateFn<T> = React.Dispatch<React.SetStateAction<T>>;\n\nexport type UseControlledProps<T> = {\n // Controlled\n value?: T | undefined;\n onChange?: (value: T) => void;\n\n // Uncontrolled value.\n defaultValue?: T | undefined;\n};\n\nexport function useControlled<T = unknown>(props: UseControlledProps<T>): [T, SetStateFn<T>] {\n const [uncontrolledValue, setUncontrolledValue, onChangeRef] = useUncontrolledState(props.defaultValue, props.onChange);\n\n const isControlled = props.value !== undefined;\n\n const returnValue = isControlled ? props.value : uncontrolledValue;\n\n const onChange = React.useCallback<SetStateFn<T>>(\n nextValue => {\n if (isControlled) {\n const newValue = isFunction(nextValue) ? nextValue(props.value as T) : nextValue;\n if (newValue !== props.value) {\n onChangeRef.current?.(newValue);\n }\n } else {\n setUncontrolledValue(nextValue as T);\n }\n },\n [props.value, onChangeRef, isControlled, setUncontrolledValue]\n );\n\n return [returnValue as T, onChange];\n}\n\ntype ChangeHandler<T> = (state: T) => void;\n\nfunction useUncontrolledState<T>(\n defaultValue: UseControlledProps<T>['defaultValue'],\n onChange: UseControlledProps<T>['onChange']\n): [value: T, setValue: React.Dispatch<React.SetStateAction<T>>, OnChangeRef: React.RefObject<ChangeHandler<T> | undefined>] {\n const [value, setValue] = React.useState(defaultValue);\n const prevValueRef = React.useRef(value);\n\n const onChangeRef = React.useRef(onChange);\n\n React.useLayoutEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n React.useEffect(() => {\n if (prevValueRef.current !== value) {\n onChangeRef.current?.(value as T);\n prevValueRef.current = value;\n }\n }, [value, prevValueRef]);\n\n return [value as T, setValue as React.Dispatch<React.SetStateAction<T>>, onChangeRef];\n}\n\nfunction isFunction(value: unknown): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n"],"names":["React"],"mappings":";;;;;;;;;;;;;;;;;;;;AAaO,SAAS,cAA2B,OAAkD;AACzF,QAAM,CAAC,mBAAmB,sBAAsB,WAAW,IAAI,qBAAqB,MAAM,cAAc,MAAM,QAAQ;AAEtH,QAAM,eAAe,MAAM,UAAU;AAErC,QAAM,cAAc,eAAe,MAAM,QAAQ;AAEjD,QAAM,WAAWA,iBAAM;AAAA,IACnB,CAAA,cAAa;AACT,UAAI,cAAc;AACd,cAAM,WAAW,WAAW,SAAS,IAAI,UAAU,MAAM,KAAU,IAAI;AACvE,YAAI,aAAa,MAAM,OAAO;AAC1B,sBAAY,UAAU,QAAQ;AAAA,QAClC;AAAA,MACJ,OAAO;AACH,6BAAqB,SAAc;AAAA,MACvC;AAAA,IACJ;AAAA,IACA,CAAC,MAAM,OAAO,aAAa,cAAc,oBAAoB;AAAA,EAAA;AAGjE,SAAO,CAAC,aAAkB,QAAQ;AACtC;AAIA,SAAS,qBACL,cACA,UACyH;AACzH,QAAM,CAAC,OAAO,QAAQ,IAAIA,iBAAM,SAAS,YAAY;AACrD,QAAM,eAAeA,iBAAM,OAAO,KAAK;AAEvC,QAAM,cAAcA,iBAAM,OAAO,QAAQ;AAEzCA,mBAAM,gBAAgB,MAAM;AACxB,gBAAY,UAAU;AAAA,EAC1B,GAAG,CAAC,QAAQ,CAAC;AAEbA,mBAAM,UAAU,MAAM;AAClB,QAAI,aAAa,YAAY,OAAO;AAChC,kBAAY,UAAU,KAAU;AAChC,mBAAa,UAAU;AAAA,IAC3B;AAAA,EACJ,GAAG,CAAC,OAAO,YAAY,CAAC;AAExB,SAAO,CAAC,OAAY,UAAqD,WAAW;AACxF;AAEA,SAAS,WAAW,OAAkD;AAClE,SAAO,OAAO,UAAU;AAC5B;;"}
1
+ {"version":3,"file":"useControlled.cjs","sources":["../../src/hooks/useControlled.ts"],"sourcesContent":["import * as React from 'react';\n\ntype SetStateFn<T> = React.Dispatch<React.SetStateAction<T>>;\n\nexport type UseControlledProps<T> = {\n // Controlled\n value?: T | undefined;\n onChange?: (value: T) => void;\n\n // Uncontrolled value.\n defaultValue?: T | undefined;\n};\n\nexport function useControlled<T = unknown>(props: UseControlledProps<T>): [T, SetStateFn<T>] {\n const [uncontrolledValue, setUncontrolledValue, onChangeRef] = useUncontrolledState(props.defaultValue, props.onChange);\n\n const returnValue = props.value === undefined ? uncontrolledValue : props.value;\n\n const onChange = React.useCallback<SetStateFn<T>>(\n nextValue => {\n if (props.value === undefined) {\n setUncontrolledValue(nextValue);\n } else {\n // TS cannot narrow SetStateAction<T> with `typeof` when `T` is unconstrained\n const newValue = typeof nextValue === 'function' ? (nextValue as (prev: T) => T)(props.value) : nextValue;\n if (newValue !== props.value) {\n onChangeRef.current?.(newValue);\n }\n }\n },\n [props.value, onChangeRef, setUncontrolledValue]\n );\n\n return [returnValue, onChange];\n}\n\ntype ChangeHandler<T> = (state: T) => void;\n\nfunction useUncontrolledState<T>(\n defaultValue: UseControlledProps<T>['defaultValue'],\n onChange: UseControlledProps<T>['onChange']\n): [value: T, setValue: React.Dispatch<React.SetStateAction<T>>, OnChangeRef: React.RefObject<ChangeHandler<T> | undefined>] {\n // with no defaultValue the initial state is genuinely undefined; asserting `T` here\n // (the same lie as React's own `useState<T>()` overload) keeps every downstream type honest\n const [value, setValue] = React.useState(defaultValue as T);\n const prevValueRef = React.useRef(value);\n\n const onChangeRef = React.useRef(onChange);\n\n React.useLayoutEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n React.useEffect(() => {\n if (prevValueRef.current !== value) {\n onChangeRef.current?.(value);\n prevValueRef.current = value;\n }\n }, [value, prevValueRef]);\n\n return [value, setValue, onChangeRef];\n}\n"],"names":["React"],"mappings":";;;;;;;;;;;;;;;;;;;;AAaO,SAAS,cAA2B,OAAkD;AACzF,QAAM,CAAC,mBAAmB,sBAAsB,WAAW,IAAI,qBAAqB,MAAM,cAAc,MAAM,QAAQ;AAEtH,QAAM,cAAc,MAAM,UAAU,SAAY,oBAAoB,MAAM;AAE1E,QAAM,WAAWA,iBAAM;AAAA,IACnB,CAAA,cAAa;AACT,UAAI,MAAM,UAAU,QAAW;AAC3B,6BAAqB,SAAS;AAAA,MAClC,OAAO;AAEH,cAAM,WAAW,OAAO,cAAc,aAAc,UAA6B,MAAM,KAAK,IAAI;AAChG,YAAI,aAAa,MAAM,OAAO;AAC1B,sBAAY,UAAU,QAAQ;AAAA,QAClC;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,CAAC,MAAM,OAAO,aAAa,oBAAoB;AAAA,EAAA;AAGnD,SAAO,CAAC,aAAa,QAAQ;AACjC;AAIA,SAAS,qBACL,cACA,UACyH;AAGzH,QAAM,CAAC,OAAO,QAAQ,IAAIA,iBAAM,SAAS,YAAiB;AAC1D,QAAM,eAAeA,iBAAM,OAAO,KAAK;AAEvC,QAAM,cAAcA,iBAAM,OAAO,QAAQ;AAEzCA,mBAAM,gBAAgB,MAAM;AACxB,gBAAY,UAAU;AAAA,EAC1B,GAAG,CAAC,QAAQ,CAAC;AAEbA,mBAAM,UAAU,MAAM;AAClB,QAAI,aAAa,YAAY,OAAO;AAChC,kBAAY,UAAU,KAAK;AAC3B,mBAAa,UAAU;AAAA,IAC3B;AAAA,EACJ,GAAG,CAAC,OAAO,YAAY,CAAC;AAExB,SAAO,CAAC,OAAO,UAAU,WAAW;AACxC;;"}
@@ -1,20 +1,19 @@
1
1
  import * as React from "react";
2
2
  function useControlled(props) {
3
3
  const [uncontrolledValue, setUncontrolledValue, onChangeRef] = useUncontrolledState(props.defaultValue, props.onChange);
4
- const isControlled = props.value !== void 0;
5
- const returnValue = isControlled ? props.value : uncontrolledValue;
4
+ const returnValue = props.value === void 0 ? uncontrolledValue : props.value;
6
5
  const onChange = React.useCallback(
7
6
  (nextValue) => {
8
- if (isControlled) {
9
- const newValue = isFunction(nextValue) ? nextValue(props.value) : nextValue;
7
+ if (props.value === void 0) {
8
+ setUncontrolledValue(nextValue);
9
+ } else {
10
+ const newValue = typeof nextValue === "function" ? nextValue(props.value) : nextValue;
10
11
  if (newValue !== props.value) {
11
12
  onChangeRef.current?.(newValue);
12
13
  }
13
- } else {
14
- setUncontrolledValue(nextValue);
15
14
  }
16
15
  },
17
- [props.value, onChangeRef, isControlled, setUncontrolledValue]
16
+ [props.value, onChangeRef, setUncontrolledValue]
18
17
  );
19
18
  return [returnValue, onChange];
20
19
  }
@@ -33,9 +32,6 @@ function useUncontrolledState(defaultValue, onChange) {
33
32
  }, [value, prevValueRef]);
34
33
  return [value, setValue, onChangeRef];
35
34
  }
36
- function isFunction(value) {
37
- return typeof value === "function";
38
- }
39
35
  export {
40
36
  useControlled
41
37
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useControlled.js","sources":["../../src/hooks/useControlled.ts"],"sourcesContent":["import * as React from 'react';\n\ntype SetStateFn<T> = React.Dispatch<React.SetStateAction<T>>;\n\nexport type UseControlledProps<T> = {\n // Controlled\n value?: T | undefined;\n onChange?: (value: T) => void;\n\n // Uncontrolled value.\n defaultValue?: T | undefined;\n};\n\nexport function useControlled<T = unknown>(props: UseControlledProps<T>): [T, SetStateFn<T>] {\n const [uncontrolledValue, setUncontrolledValue, onChangeRef] = useUncontrolledState(props.defaultValue, props.onChange);\n\n const isControlled = props.value !== undefined;\n\n const returnValue = isControlled ? props.value : uncontrolledValue;\n\n const onChange = React.useCallback<SetStateFn<T>>(\n nextValue => {\n if (isControlled) {\n const newValue = isFunction(nextValue) ? nextValue(props.value as T) : nextValue;\n if (newValue !== props.value) {\n onChangeRef.current?.(newValue);\n }\n } else {\n setUncontrolledValue(nextValue as T);\n }\n },\n [props.value, onChangeRef, isControlled, setUncontrolledValue]\n );\n\n return [returnValue as T, onChange];\n}\n\ntype ChangeHandler<T> = (state: T) => void;\n\nfunction useUncontrolledState<T>(\n defaultValue: UseControlledProps<T>['defaultValue'],\n onChange: UseControlledProps<T>['onChange']\n): [value: T, setValue: React.Dispatch<React.SetStateAction<T>>, OnChangeRef: React.RefObject<ChangeHandler<T> | undefined>] {\n const [value, setValue] = React.useState(defaultValue);\n const prevValueRef = React.useRef(value);\n\n const onChangeRef = React.useRef(onChange);\n\n React.useLayoutEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n React.useEffect(() => {\n if (prevValueRef.current !== value) {\n onChangeRef.current?.(value as T);\n prevValueRef.current = value;\n }\n }, [value, prevValueRef]);\n\n return [value as T, setValue as React.Dispatch<React.SetStateAction<T>>, onChangeRef];\n}\n\nfunction isFunction(value: unknown): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n"],"names":[],"mappings":";AAaO,SAAS,cAA2B,OAAkD;AACzF,QAAM,CAAC,mBAAmB,sBAAsB,WAAW,IAAI,qBAAqB,MAAM,cAAc,MAAM,QAAQ;AAEtH,QAAM,eAAe,MAAM,UAAU;AAErC,QAAM,cAAc,eAAe,MAAM,QAAQ;AAEjD,QAAM,WAAW,MAAM;AAAA,IACnB,CAAA,cAAa;AACT,UAAI,cAAc;AACd,cAAM,WAAW,WAAW,SAAS,IAAI,UAAU,MAAM,KAAU,IAAI;AACvE,YAAI,aAAa,MAAM,OAAO;AAC1B,sBAAY,UAAU,QAAQ;AAAA,QAClC;AAAA,MACJ,OAAO;AACH,6BAAqB,SAAc;AAAA,MACvC;AAAA,IACJ;AAAA,IACA,CAAC,MAAM,OAAO,aAAa,cAAc,oBAAoB;AAAA,EAAA;AAGjE,SAAO,CAAC,aAAkB,QAAQ;AACtC;AAIA,SAAS,qBACL,cACA,UACyH;AACzH,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,YAAY;AACrD,QAAM,eAAe,MAAM,OAAO,KAAK;AAEvC,QAAM,cAAc,MAAM,OAAO,QAAQ;AAEzC,QAAM,gBAAgB,MAAM;AACxB,gBAAY,UAAU;AAAA,EAC1B,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,UAAU,MAAM;AAClB,QAAI,aAAa,YAAY,OAAO;AAChC,kBAAY,UAAU,KAAU;AAChC,mBAAa,UAAU;AAAA,IAC3B;AAAA,EACJ,GAAG,CAAC,OAAO,YAAY,CAAC;AAExB,SAAO,CAAC,OAAY,UAAqD,WAAW;AACxF;AAEA,SAAS,WAAW,OAAkD;AAClE,SAAO,OAAO,UAAU;AAC5B;"}
1
+ {"version":3,"file":"useControlled.js","sources":["../../src/hooks/useControlled.ts"],"sourcesContent":["import * as React from 'react';\n\ntype SetStateFn<T> = React.Dispatch<React.SetStateAction<T>>;\n\nexport type UseControlledProps<T> = {\n // Controlled\n value?: T | undefined;\n onChange?: (value: T) => void;\n\n // Uncontrolled value.\n defaultValue?: T | undefined;\n};\n\nexport function useControlled<T = unknown>(props: UseControlledProps<T>): [T, SetStateFn<T>] {\n const [uncontrolledValue, setUncontrolledValue, onChangeRef] = useUncontrolledState(props.defaultValue, props.onChange);\n\n const returnValue = props.value === undefined ? uncontrolledValue : props.value;\n\n const onChange = React.useCallback<SetStateFn<T>>(\n nextValue => {\n if (props.value === undefined) {\n setUncontrolledValue(nextValue);\n } else {\n // TS cannot narrow SetStateAction<T> with `typeof` when `T` is unconstrained\n const newValue = typeof nextValue === 'function' ? (nextValue as (prev: T) => T)(props.value) : nextValue;\n if (newValue !== props.value) {\n onChangeRef.current?.(newValue);\n }\n }\n },\n [props.value, onChangeRef, setUncontrolledValue]\n );\n\n return [returnValue, onChange];\n}\n\ntype ChangeHandler<T> = (state: T) => void;\n\nfunction useUncontrolledState<T>(\n defaultValue: UseControlledProps<T>['defaultValue'],\n onChange: UseControlledProps<T>['onChange']\n): [value: T, setValue: React.Dispatch<React.SetStateAction<T>>, OnChangeRef: React.RefObject<ChangeHandler<T> | undefined>] {\n // with no defaultValue the initial state is genuinely undefined; asserting `T` here\n // (the same lie as React's own `useState<T>()` overload) keeps every downstream type honest\n const [value, setValue] = React.useState(defaultValue as T);\n const prevValueRef = React.useRef(value);\n\n const onChangeRef = React.useRef(onChange);\n\n React.useLayoutEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n React.useEffect(() => {\n if (prevValueRef.current !== value) {\n onChangeRef.current?.(value);\n prevValueRef.current = value;\n }\n }, [value, prevValueRef]);\n\n return [value, setValue, onChangeRef];\n}\n"],"names":[],"mappings":";AAaO,SAAS,cAA2B,OAAkD;AACzF,QAAM,CAAC,mBAAmB,sBAAsB,WAAW,IAAI,qBAAqB,MAAM,cAAc,MAAM,QAAQ;AAEtH,QAAM,cAAc,MAAM,UAAU,SAAY,oBAAoB,MAAM;AAE1E,QAAM,WAAW,MAAM;AAAA,IACnB,CAAA,cAAa;AACT,UAAI,MAAM,UAAU,QAAW;AAC3B,6BAAqB,SAAS;AAAA,MAClC,OAAO;AAEH,cAAM,WAAW,OAAO,cAAc,aAAc,UAA6B,MAAM,KAAK,IAAI;AAChG,YAAI,aAAa,MAAM,OAAO;AAC1B,sBAAY,UAAU,QAAQ;AAAA,QAClC;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,CAAC,MAAM,OAAO,aAAa,oBAAoB;AAAA,EAAA;AAGnD,SAAO,CAAC,aAAa,QAAQ;AACjC;AAIA,SAAS,qBACL,cACA,UACyH;AAGzH,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,YAAiB;AAC1D,QAAM,eAAe,MAAM,OAAO,KAAK;AAEvC,QAAM,cAAc,MAAM,OAAO,QAAQ;AAEzC,QAAM,gBAAgB,MAAM;AACxB,gBAAY,UAAU;AAAA,EAC1B,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,UAAU,MAAM;AAClB,QAAI,aAAa,YAAY,OAAO;AAChC,kBAAY,UAAU,KAAK;AAC3B,mBAAa,UAAU;AAAA,IAC3B;AAAA,EACJ,GAAG,CAAC,OAAO,YAAY,CAAC;AAExB,SAAO,CAAC,OAAO,UAAU,WAAW;AACxC;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useIsFormControl.cjs","sources":["../../src/hooks/useIsFormControl.ts"],"sourcesContent":["import * as React from 'react';\n\n// taken from radix\n// determines whether a given ref is a descendant of a form element\nexport const useIsFormControl = (ref: React.RefObject<HTMLElement>, reset: () => void) => {\n const [isFormControl, setIsFormControl] = React.useState(false);\n\n React.useEffect(() => {\n let formElement: HTMLFormElement | null;\n\n if (ref.current) {\n formElement = ref.current.closest('form');\n setIsFormControl(!!formElement);\n\n if (reset && formElement) {\n formElement.addEventListener('reset', reset);\n }\n\n ref.current.closest('form')?.addEventListener('reset', reset);\n }\n\n return () => {\n if (formElement) {\n formElement.removeEventListener('reset', reset);\n }\n };\n }, [ref.current]);\n\n return isFormControl;\n};\n"],"names":["React"],"mappings":";;;;;;;;;;;;;;;;;;;;AAIO,MAAM,mBAAmB,CAAC,KAAmC,UAAsB;AACtF,QAAM,CAAC,eAAe,gBAAgB,IAAIA,iBAAM,SAAS,KAAK;AAE9DA,mBAAM,UAAU,MAAM;AAClB,QAAI;AAEJ,QAAI,IAAI,SAAS;AACb,oBAAc,IAAI,QAAQ,QAAQ,MAAM;AACxC,uBAAiB,CAAC,CAAC,WAAW;AAE9B,UAAI,SAAS,aAAa;AACtB,oBAAY,iBAAiB,SAAS,KAAK;AAAA,MAC/C;AAEA,UAAI,QAAQ,QAAQ,MAAM,GAAG,iBAAiB,SAAS,KAAK;AAAA,IAChE;AAEA,WAAO,MAAM;AACT,UAAI,aAAa;AACb,oBAAY,oBAAoB,SAAS,KAAK;AAAA,MAClD;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,IAAI,OAAO,CAAC;AAEhB,SAAO;AACX;;"}
1
+ {"version":3,"file":"useIsFormControl.cjs","sources":["../../src/hooks/useIsFormControl.ts"],"sourcesContent":["import * as React from 'react';\n\n// taken from radix\n// determines whether a given ref is a descendant of a form element\nexport const useIsFormControl = (ref: React.RefObject<HTMLElement | null>, reset: () => void) => {\n const [isFormControl, setIsFormControl] = React.useState(false);\n\n React.useEffect(() => {\n let formElement: HTMLFormElement | null;\n\n if (ref.current) {\n formElement = ref.current.closest('form');\n setIsFormControl(!!formElement);\n\n if (reset && formElement) {\n formElement.addEventListener('reset', reset);\n }\n\n ref.current.closest('form')?.addEventListener('reset', reset);\n }\n\n return () => {\n if (formElement) {\n formElement.removeEventListener('reset', reset);\n }\n };\n }, [ref.current]);\n\n return isFormControl;\n};\n"],"names":["React"],"mappings":";;;;;;;;;;;;;;;;;;;;AAIO,MAAM,mBAAmB,CAAC,KAA0C,UAAsB;AAC7F,QAAM,CAAC,eAAe,gBAAgB,IAAIA,iBAAM,SAAS,KAAK;AAE9DA,mBAAM,UAAU,MAAM;AAClB,QAAI;AAEJ,QAAI,IAAI,SAAS;AACb,oBAAc,IAAI,QAAQ,QAAQ,MAAM;AACxC,uBAAiB,CAAC,CAAC,WAAW;AAE9B,UAAI,SAAS,aAAa;AACtB,oBAAY,iBAAiB,SAAS,KAAK;AAAA,MAC/C;AAEA,UAAI,QAAQ,QAAQ,MAAM,GAAG,iBAAiB,SAAS,KAAK;AAAA,IAChE;AAEA,WAAO,MAAM;AACT,UAAI,aAAa;AACb,oBAAY,oBAAoB,SAAS,KAAK;AAAA,MAClD;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,IAAI,OAAO,CAAC;AAEhB,SAAO;AACX;;"}
@@ -1,2 +1,2 @@
1
1
  import * as React from 'react';
2
- export declare const useIsFormControl: (ref: React.RefObject<HTMLElement>, reset: () => void) => boolean;
2
+ export declare const useIsFormControl: (ref: React.RefObject<HTMLElement | null>, reset: () => void) => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"useIsFormControl.js","sources":["../../src/hooks/useIsFormControl.ts"],"sourcesContent":["import * as React from 'react';\n\n// taken from radix\n// determines whether a given ref is a descendant of a form element\nexport const useIsFormControl = (ref: React.RefObject<HTMLElement>, reset: () => void) => {\n const [isFormControl, setIsFormControl] = React.useState(false);\n\n React.useEffect(() => {\n let formElement: HTMLFormElement | null;\n\n if (ref.current) {\n formElement = ref.current.closest('form');\n setIsFormControl(!!formElement);\n\n if (reset && formElement) {\n formElement.addEventListener('reset', reset);\n }\n\n ref.current.closest('form')?.addEventListener('reset', reset);\n }\n\n return () => {\n if (formElement) {\n formElement.removeEventListener('reset', reset);\n }\n };\n }, [ref.current]);\n\n return isFormControl;\n};\n"],"names":[],"mappings":";AAIO,MAAM,mBAAmB,CAAC,KAAmC,UAAsB;AACtF,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAS,KAAK;AAE9D,QAAM,UAAU,MAAM;AAClB,QAAI;AAEJ,QAAI,IAAI,SAAS;AACb,oBAAc,IAAI,QAAQ,QAAQ,MAAM;AACxC,uBAAiB,CAAC,CAAC,WAAW;AAE9B,UAAI,SAAS,aAAa;AACtB,oBAAY,iBAAiB,SAAS,KAAK;AAAA,MAC/C;AAEA,UAAI,QAAQ,QAAQ,MAAM,GAAG,iBAAiB,SAAS,KAAK;AAAA,IAChE;AAEA,WAAO,MAAM;AACT,UAAI,aAAa;AACb,oBAAY,oBAAoB,SAAS,KAAK;AAAA,MAClD;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,IAAI,OAAO,CAAC;AAEhB,SAAO;AACX;"}
1
+ {"version":3,"file":"useIsFormControl.js","sources":["../../src/hooks/useIsFormControl.ts"],"sourcesContent":["import * as React from 'react';\n\n// taken from radix\n// determines whether a given ref is a descendant of a form element\nexport const useIsFormControl = (ref: React.RefObject<HTMLElement | null>, reset: () => void) => {\n const [isFormControl, setIsFormControl] = React.useState(false);\n\n React.useEffect(() => {\n let formElement: HTMLFormElement | null;\n\n if (ref.current) {\n formElement = ref.current.closest('form');\n setIsFormControl(!!formElement);\n\n if (reset && formElement) {\n formElement.addEventListener('reset', reset);\n }\n\n ref.current.closest('form')?.addEventListener('reset', reset);\n }\n\n return () => {\n if (formElement) {\n formElement.removeEventListener('reset', reset);\n }\n };\n }, [ref.current]);\n\n return isFormControl;\n};\n"],"names":[],"mappings":";AAIO,MAAM,mBAAmB,CAAC,KAA0C,UAAsB;AAC7F,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAS,KAAK;AAE9D,QAAM,UAAU,MAAM;AAClB,QAAI;AAEJ,QAAI,IAAI,SAAS;AACb,oBAAc,IAAI,QAAQ,QAAQ,MAAM;AACxC,uBAAiB,CAAC,CAAC,WAAW;AAE9B,UAAI,SAAS,aAAa;AACtB,oBAAY,iBAAiB,SAAS,KAAK;AAAA,MAC/C;AAEA,UAAI,QAAQ,QAAQ,MAAM,GAAG,iBAAiB,SAAS,KAAK;AAAA,IAChE;AAEA,WAAO,MAAM;AACT,UAAI,aAAa;AACb,oBAAY,oBAAoB,SAAS,KAAK;AAAA,MAClD;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,IAAI,OAAO,CAAC;AAEhB,SAAO;AACX;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useMergedRef.cjs","sources":["../../src/hooks/useMergedRef.ts"],"sourcesContent":["import React from 'react';\n\n// merges an external ref (optional) with an internal ref (required)\nexport const useMergedRef = <T extends HTMLElement>(ref: React.Ref<HTMLElement>): React.RefObject<T> => {\n const internalRef = React.useRef<T>(null);\n\n React.useEffect(() => {\n if (ref) {\n if (typeof ref === 'function') {\n ref(internalRef.current);\n } else {\n (ref as React.MutableRefObject<HTMLElement | null>).current = internalRef.current;\n }\n }\n }, [ref]);\n\n // React 19 types useRef<T>(null) as RefObject<T | null>, but this hook hands back a ref that is\n // always attached to an element, so keep the narrower contract rather than leak null to callers.\n return internalRef as React.RefObject<T>;\n};\n"],"names":[],"mappings":";;;AAGO,MAAM,eAAe,CAAwB,QAAoD;AACpG,QAAM,cAAc,MAAM,OAAU,IAAI;AAExC,QAAM,UAAU,MAAM;AAClB,QAAI,KAAK;AACL,UAAI,OAAO,QAAQ,YAAY;AAC3B,YAAI,YAAY,OAAO;AAAA,MAC3B,OAAO;AACF,YAAmD,UAAU,YAAY;AAAA,MAC9E;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,GAAG,CAAC;AAIR,SAAO;AACX;;"}
1
+ {"version":3,"file":"useMergedRef.cjs","sources":["../../src/hooks/useMergedRef.ts"],"sourcesContent":["import React from 'react';\n\n// merges an external ref (optional) with an internal ref (required)\nexport const useMergedRef = <T extends HTMLElement>(ref: React.Ref<HTMLElement>): React.RefObject<T> => {\n const internalRef = React.useRef<T>(null);\n\n React.useEffect(() => {\n if (ref) {\n if (typeof ref === 'function') {\n ref(internalRef.current);\n } else {\n (ref as React.RefObject<HTMLElement | null>).current = internalRef.current;\n }\n }\n }, [ref]);\n\n // React 19 types useRef<T>(null) as RefObject<T | null>, but this hook hands back a ref that is\n // always attached to an element, so keep the narrower contract rather than leak null to callers.\n return internalRef as React.RefObject<T>;\n};\n"],"names":[],"mappings":";;;AAGO,MAAM,eAAe,CAAwB,QAAoD;AACpG,QAAM,cAAc,MAAM,OAAU,IAAI;AAExC,QAAM,UAAU,MAAM;AAClB,QAAI,KAAK;AACL,UAAI,OAAO,QAAQ,YAAY;AAC3B,YAAI,YAAY,OAAO;AAAA,MAC3B,OAAO;AACF,YAA4C,UAAU,YAAY;AAAA,MACvE;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,GAAG,CAAC;AAIR,SAAO;AACX;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useMergedRef.js","sources":["../../src/hooks/useMergedRef.ts"],"sourcesContent":["import React from 'react';\n\n// merges an external ref (optional) with an internal ref (required)\nexport const useMergedRef = <T extends HTMLElement>(ref: React.Ref<HTMLElement>): React.RefObject<T> => {\n const internalRef = React.useRef<T>(null);\n\n React.useEffect(() => {\n if (ref) {\n if (typeof ref === 'function') {\n ref(internalRef.current);\n } else {\n (ref as React.MutableRefObject<HTMLElement | null>).current = internalRef.current;\n }\n }\n }, [ref]);\n\n // React 19 types useRef<T>(null) as RefObject<T | null>, but this hook hands back a ref that is\n // always attached to an element, so keep the narrower contract rather than leak null to callers.\n return internalRef as React.RefObject<T>;\n};\n"],"names":["React"],"mappings":";AAGO,MAAM,eAAe,CAAwB,QAAoD;AACpG,QAAM,cAAcA,eAAM,OAAU,IAAI;AAExCA,iBAAM,UAAU,MAAM;AAClB,QAAI,KAAK;AACL,UAAI,OAAO,QAAQ,YAAY;AAC3B,YAAI,YAAY,OAAO;AAAA,MAC3B,OAAO;AACF,YAAmD,UAAU,YAAY;AAAA,MAC9E;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,GAAG,CAAC;AAIR,SAAO;AACX;"}
1
+ {"version":3,"file":"useMergedRef.js","sources":["../../src/hooks/useMergedRef.ts"],"sourcesContent":["import React from 'react';\n\n// merges an external ref (optional) with an internal ref (required)\nexport const useMergedRef = <T extends HTMLElement>(ref: React.Ref<HTMLElement>): React.RefObject<T> => {\n const internalRef = React.useRef<T>(null);\n\n React.useEffect(() => {\n if (ref) {\n if (typeof ref === 'function') {\n ref(internalRef.current);\n } else {\n (ref as React.RefObject<HTMLElement | null>).current = internalRef.current;\n }\n }\n }, [ref]);\n\n // React 19 types useRef<T>(null) as RefObject<T | null>, but this hook hands back a ref that is\n // always attached to an element, so keep the narrower contract rather than leak null to callers.\n return internalRef as React.RefObject<T>;\n};\n"],"names":["React"],"mappings":";AAGO,MAAM,eAAe,CAAwB,QAAoD;AACpG,QAAM,cAAcA,eAAM,OAAU,IAAI;AAExCA,iBAAM,UAAU,MAAM;AAClB,QAAI,KAAK;AACL,UAAI,OAAO,QAAQ,YAAY;AAC3B,YAAI,YAAY,OAAO;AAAA,MAC3B,OAAO;AACF,YAA4C,UAAU,YAAY;AAAA,MACvE;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,GAAG,CAAC;AAIR,SAAO;AACX;"}
@@ -1 +1 @@
1
- {"version":3,"file":"usePrevious.cjs","sources":["../../src/hooks/usePrevious.ts"],"sourcesContent":["import React from 'react';\n\n// taken from radix\nfunction usePreviousValue<T>(value: T) {\n // The ref object is a generic container whose current property is mutable ...\n // ... and can hold any value, similar to an instance property on a class\n const ref = React.useRef<T>(value);\n\n // Store current value in ref\n React.useEffect(() => {\n ref.current = value;\n }, [value]); // Only re-run if value changes\n\n // Return previous value (happens before update in useEffect above)\n return ref.current;\n}\n\nexport { usePreviousValue };\n"],"names":[],"mappings":";;;AAGA,SAAS,iBAAoB,OAAU;AAGnC,QAAM,MAAM,MAAM,OAAU,KAAK;AAGjC,QAAM,UAAU,MAAM;AAClB,QAAI,UAAU;AAAA,EAClB,GAAG,CAAC,KAAK,CAAC;AAGV,SAAO,IAAI;AACf;;"}
1
+ {"version":3,"file":"usePrevious.cjs","sources":["../../src/hooks/usePrevious.ts"],"sourcesContent":["import React from 'react';\n\n// taken from radix\nfunction usePreviousValue<T>(value: T) {\n // The ref object is a generic container whose current property is mutable ...\n // ... and can hold any value, similar to an instance property on a class\n const ref = React.useRef<T>(value);\n\n // Store current value in ref\n React.useEffect(() => {\n ref.current = value;\n // Only re-run if value changes\n }, [value]);\n\n // Return previous value (happens before update in useEffect above)\n return ref.current;\n}\n\nexport { usePreviousValue };\n"],"names":[],"mappings":";;;AAGA,SAAS,iBAAoB,OAAU;AAGnC,QAAM,MAAM,MAAM,OAAU,KAAK;AAGjC,QAAM,UAAU,MAAM;AAClB,QAAI,UAAU;AAAA,EAElB,GAAG,CAAC,KAAK,CAAC;AAGV,SAAO,IAAI;AACf;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"usePrevious.js","sources":["../../src/hooks/usePrevious.ts"],"sourcesContent":["import React from 'react';\n\n// taken from radix\nfunction usePreviousValue<T>(value: T) {\n // The ref object is a generic container whose current property is mutable ...\n // ... and can hold any value, similar to an instance property on a class\n const ref = React.useRef<T>(value);\n\n // Store current value in ref\n React.useEffect(() => {\n ref.current = value;\n }, [value]); // Only re-run if value changes\n\n // Return previous value (happens before update in useEffect above)\n return ref.current;\n}\n\nexport { usePreviousValue };\n"],"names":["React"],"mappings":";AAGA,SAAS,iBAAoB,OAAU;AAGnC,QAAM,MAAMA,eAAM,OAAU,KAAK;AAGjCA,iBAAM,UAAU,MAAM;AAClB,QAAI,UAAU;AAAA,EAClB,GAAG,CAAC,KAAK,CAAC;AAGV,SAAO,IAAI;AACf;"}
1
+ {"version":3,"file":"usePrevious.js","sources":["../../src/hooks/usePrevious.ts"],"sourcesContent":["import React from 'react';\n\n// taken from radix\nfunction usePreviousValue<T>(value: T) {\n // The ref object is a generic container whose current property is mutable ...\n // ... and can hold any value, similar to an instance property on a class\n const ref = React.useRef<T>(value);\n\n // Store current value in ref\n React.useEffect(() => {\n ref.current = value;\n // Only re-run if value changes\n }, [value]);\n\n // Return previous value (happens before update in useEffect above)\n return ref.current;\n}\n\nexport { usePreviousValue };\n"],"names":["React"],"mappings":";AAGA,SAAS,iBAAoB,OAAU;AAGnC,QAAM,MAAMA,eAAM,OAAU,KAAK;AAGjCA,iBAAM,UAAU,MAAM;AAClB,QAAI,UAAU;AAAA,EAElB,GAAG,CAAC,KAAK,CAAC;AAGV,SAAO,IAAI;AACf;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Button.cjs","sources":["../../src/primitives/Button.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useGlobalKeyDown } from '@/hooks/useGlobalKeyDown';\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport type { KeyDownHandlerOptions } from '@/utils/keyboard';\n\n// React 19 added the native `popover` attribute to HTML props. Consumers of this primitive use\n// `popover` as a render prop for an associated Popover, so the native one is dropped to keep that.\ntype ButtonProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement | HTMLAnchorElement>, 'popover'> & {\n /** Content should be a text */\n children: React.ReactNode;\n /** Provides url for buttons being used as a link */\n href?: string;\n shortcut?: string | KeyDownHandlerOptions;\n /** Provides target for buttons being used as a link */\n target?: '_self' | '_blank' | '_parent' | '_top';\n};\n\nconst Button = React.forwardRef(function Button(props: ButtonProps, ref: React.Ref<HTMLButtonElement | HTMLAnchorElement>) {\n const { disabled, shortcut, target, type = 'button', ...otherProps } = props;\n const internalRef = useMergedRef<HTMLButtonElement | HTMLAnchorElement>(ref);\n\n useGlobalKeyDown(shortcut, event => {\n event?.preventDefault();\n const dialog = document.querySelector('[role=\"dialog\"]');\n\n // Don't trigger the click on the button if it is outside of the dialog\n if (dialog && !dialog?.contains(internalRef.current)) {\n return;\n }\n\n internalRef.current?.click();\n });\n\n const Tag = props.href ? 'a' : 'button';\n\n return (\n <Tag\n {...otherProps}\n href={disabled ? undefined : props.href}\n aria-disabled={disabled ? 'true' : undefined}\n disabled={disabled}\n target={Tag === 'a' ? target : undefined}\n type={Tag === 'a' ? undefined : type}\n ref={internalRef as any}>\n {React.Children.count(props.children) > 1\n ? React.Children.map(props.children, child => (typeof child === 'string' ? <span>{child}</span> : child))\n : props.children}\n </Tag>\n );\n});\n\nexport { Button };\nexport type { ButtonProps };\n"],"names":["React","Button","useMergedRef","useGlobalKeyDown"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAkBA,MAAM,SAASA,iBAAM,WAAW,SAASC,QAAO,OAAoB,KAAuD;AACvH,QAAM,EAAE,UAAU,UAAU,QAAQ,OAAO,UAAU,GAAG,eAAe;AACvE,QAAM,cAAcC,aAAAA,aAAoD,GAAG;AAE3EC,oCAAiB,UAAU,CAAA,UAAS;AAChC,WAAO,eAAA;AACP,UAAM,SAAS,SAAS,cAAc,iBAAiB;AAGvD,QAAI,UAAU,CAAC,QAAQ,SAAS,YAAY,OAAO,GAAG;AAClD;AAAA,IACJ;AAEA,gBAAY,SAAS,MAAA;AAAA,EACzB,CAAC;AAED,QAAM,MAAM,MAAM,OAAO,MAAM;AAE/B,SACIH,iCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,MAAM,WAAW,SAAY,MAAM;AAAA,MACnC,iBAAe,WAAW,SAAS;AAAA,MACnC;AAAA,MACA,QAAQ,QAAQ,MAAM,SAAS;AAAA,MAC/B,MAAM,QAAQ,MAAM,SAAY;AAAA,MAChC,KAAK;AAAA,IAAA;AAAA,IACJA,iBAAM,SAAS,MAAM,MAAM,QAAQ,IAAI,IAClCA,iBAAM,SAAS,IAAI,MAAM,UAAU,CAAA,UAAU,OAAO,UAAU,WAAWA,iCAAA,cAAC,cAAM,KAAM,IAAU,KAAM,IACtG,MAAM;AAAA,EAAA;AAGxB,CAAC;;"}
1
+ {"version":3,"file":"Button.cjs","sources":["../../src/primitives/Button.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useGlobalKeyDown } from '@/hooks/useGlobalKeyDown';\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport type { KeyDownHandlerOptions } from '@/utils/keyboard';\n\n// React 19 added the native `popover` attribute to HTML props. Consumers of this primitive use\n// `popover` as a render prop for an associated Popover, so the native one is dropped to keep that.\ntype ButtonProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement | HTMLAnchorElement>, 'popover'> & {\n /** Content should be a text */\n children: React.ReactNode;\n /** Provides url for buttons being used as a link */\n href?: string;\n shortcut?: string | KeyDownHandlerOptions;\n /** Provides target for buttons being used as a link */\n target?: '_self' | '_blank' | '_parent' | '_top';\n};\n\nconst Button = React.forwardRef(function Button(props: ButtonProps, ref: React.Ref<HTMLButtonElement | HTMLAnchorElement>) {\n const { disabled, shortcut, target, type = 'button', ...otherProps } = props;\n const internalRef = useMergedRef<HTMLButtonElement | HTMLAnchorElement>(ref);\n\n useGlobalKeyDown(shortcut, event => {\n event?.preventDefault();\n const dialog = document.querySelector('[role=\"dialog\"]');\n\n // Don't trigger the click on the button if it is outside of the dialog\n if (dialog && !dialog?.contains(internalRef.current)) {\n return;\n }\n\n internalRef.current?.click();\n });\n\n const Tag = props.href ? 'a' : 'button';\n\n return (\n <Tag\n {...otherProps}\n href={disabled ? undefined : props.href}\n aria-disabled={disabled ? 'true' : undefined}\n disabled={disabled}\n target={Tag === 'a' ? target : undefined}\n type={Tag === 'a' ? undefined : type}\n ref={internalRef as React.RefObject<HTMLButtonElement & HTMLAnchorElement>}>\n {React.Children.count(props.children) > 1\n ? React.Children.map(props.children, child => (typeof child === 'string' ? <span>{child}</span> : child))\n : props.children}\n </Tag>\n );\n});\n\nexport { Button };\nexport type { ButtonProps };\n"],"names":["React","Button","useMergedRef","useGlobalKeyDown"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAkBA,MAAM,SAASA,iBAAM,WAAW,SAASC,QAAO,OAAoB,KAAuD;AACvH,QAAM,EAAE,UAAU,UAAU,QAAQ,OAAO,UAAU,GAAG,eAAe;AACvE,QAAM,cAAcC,aAAAA,aAAoD,GAAG;AAE3EC,oCAAiB,UAAU,CAAA,UAAS;AAChC,WAAO,eAAA;AACP,UAAM,SAAS,SAAS,cAAc,iBAAiB;AAGvD,QAAI,UAAU,CAAC,QAAQ,SAAS,YAAY,OAAO,GAAG;AAClD;AAAA,IACJ;AAEA,gBAAY,SAAS,MAAA;AAAA,EACzB,CAAC;AAED,QAAM,MAAM,MAAM,OAAO,MAAM;AAE/B,SACIH,iCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,MAAM,WAAW,SAAY,MAAM;AAAA,MACnC,iBAAe,WAAW,SAAS;AAAA,MACnC;AAAA,MACA,QAAQ,QAAQ,MAAM,SAAS;AAAA,MAC/B,MAAM,QAAQ,MAAM,SAAY;AAAA,MAChC,KAAK;AAAA,IAAA;AAAA,IACJA,iBAAM,SAAS,MAAM,MAAM,QAAQ,IAAI,IAClCA,iBAAM,SAAS,IAAI,MAAM,UAAU,CAAA,UAAU,OAAO,UAAU,WAAWA,iCAAA,cAAC,cAAM,KAAM,IAAU,KAAM,IACtG,MAAM;AAAA,EAAA;AAGxB,CAAC;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Button.js","sources":["../../src/primitives/Button.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useGlobalKeyDown } from '@/hooks/useGlobalKeyDown';\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport type { KeyDownHandlerOptions } from '@/utils/keyboard';\n\n// React 19 added the native `popover` attribute to HTML props. Consumers of this primitive use\n// `popover` as a render prop for an associated Popover, so the native one is dropped to keep that.\ntype ButtonProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement | HTMLAnchorElement>, 'popover'> & {\n /** Content should be a text */\n children: React.ReactNode;\n /** Provides url for buttons being used as a link */\n href?: string;\n shortcut?: string | KeyDownHandlerOptions;\n /** Provides target for buttons being used as a link */\n target?: '_self' | '_blank' | '_parent' | '_top';\n};\n\nconst Button = React.forwardRef(function Button(props: ButtonProps, ref: React.Ref<HTMLButtonElement | HTMLAnchorElement>) {\n const { disabled, shortcut, target, type = 'button', ...otherProps } = props;\n const internalRef = useMergedRef<HTMLButtonElement | HTMLAnchorElement>(ref);\n\n useGlobalKeyDown(shortcut, event => {\n event?.preventDefault();\n const dialog = document.querySelector('[role=\"dialog\"]');\n\n // Don't trigger the click on the button if it is outside of the dialog\n if (dialog && !dialog?.contains(internalRef.current)) {\n return;\n }\n\n internalRef.current?.click();\n });\n\n const Tag = props.href ? 'a' : 'button';\n\n return (\n <Tag\n {...otherProps}\n href={disabled ? undefined : props.href}\n aria-disabled={disabled ? 'true' : undefined}\n disabled={disabled}\n target={Tag === 'a' ? target : undefined}\n type={Tag === 'a' ? undefined : type}\n ref={internalRef as any}>\n {React.Children.count(props.children) > 1\n ? React.Children.map(props.children, child => (typeof child === 'string' ? <span>{child}</span> : child))\n : props.children}\n </Tag>\n );\n});\n\nexport { Button };\nexport type { ButtonProps };\n"],"names":["Button"],"mappings":";;;AAkBA,MAAM,SAAS,MAAM,WAAW,SAASA,QAAO,OAAoB,KAAuD;AACvH,QAAM,EAAE,UAAU,UAAU,QAAQ,OAAO,UAAU,GAAG,eAAe;AACvE,QAAM,cAAc,aAAoD,GAAG;AAE3E,mBAAiB,UAAU,CAAA,UAAS;AAChC,WAAO,eAAA;AACP,UAAM,SAAS,SAAS,cAAc,iBAAiB;AAGvD,QAAI,UAAU,CAAC,QAAQ,SAAS,YAAY,OAAO,GAAG;AAClD;AAAA,IACJ;AAEA,gBAAY,SAAS,MAAA;AAAA,EACzB,CAAC;AAED,QAAM,MAAM,MAAM,OAAO,MAAM;AAE/B,SACI,sBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,MAAM,WAAW,SAAY,MAAM;AAAA,MACnC,iBAAe,WAAW,SAAS;AAAA,MACnC;AAAA,MACA,QAAQ,QAAQ,MAAM,SAAS;AAAA,MAC/B,MAAM,QAAQ,MAAM,SAAY;AAAA,MAChC,KAAK;AAAA,IAAA;AAAA,IACJ,MAAM,SAAS,MAAM,MAAM,QAAQ,IAAI,IAClC,MAAM,SAAS,IAAI,MAAM,UAAU,CAAA,UAAU,OAAO,UAAU,WAAW,sBAAA,cAAC,cAAM,KAAM,IAAU,KAAM,IACtG,MAAM;AAAA,EAAA;AAGxB,CAAC;"}
1
+ {"version":3,"file":"Button.js","sources":["../../src/primitives/Button.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useGlobalKeyDown } from '@/hooks/useGlobalKeyDown';\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport type { KeyDownHandlerOptions } from '@/utils/keyboard';\n\n// React 19 added the native `popover` attribute to HTML props. Consumers of this primitive use\n// `popover` as a render prop for an associated Popover, so the native one is dropped to keep that.\ntype ButtonProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement | HTMLAnchorElement>, 'popover'> & {\n /** Content should be a text */\n children: React.ReactNode;\n /** Provides url for buttons being used as a link */\n href?: string;\n shortcut?: string | KeyDownHandlerOptions;\n /** Provides target for buttons being used as a link */\n target?: '_self' | '_blank' | '_parent' | '_top';\n};\n\nconst Button = React.forwardRef(function Button(props: ButtonProps, ref: React.Ref<HTMLButtonElement | HTMLAnchorElement>) {\n const { disabled, shortcut, target, type = 'button', ...otherProps } = props;\n const internalRef = useMergedRef<HTMLButtonElement | HTMLAnchorElement>(ref);\n\n useGlobalKeyDown(shortcut, event => {\n event?.preventDefault();\n const dialog = document.querySelector('[role=\"dialog\"]');\n\n // Don't trigger the click on the button if it is outside of the dialog\n if (dialog && !dialog?.contains(internalRef.current)) {\n return;\n }\n\n internalRef.current?.click();\n });\n\n const Tag = props.href ? 'a' : 'button';\n\n return (\n <Tag\n {...otherProps}\n href={disabled ? undefined : props.href}\n aria-disabled={disabled ? 'true' : undefined}\n disabled={disabled}\n target={Tag === 'a' ? target : undefined}\n type={Tag === 'a' ? undefined : type}\n ref={internalRef as React.RefObject<HTMLButtonElement & HTMLAnchorElement>}>\n {React.Children.count(props.children) > 1\n ? React.Children.map(props.children, child => (typeof child === 'string' ? <span>{child}</span> : child))\n : props.children}\n </Tag>\n );\n});\n\nexport { Button };\nexport type { ButtonProps };\n"],"names":["Button"],"mappings":";;;AAkBA,MAAM,SAAS,MAAM,WAAW,SAASA,QAAO,OAAoB,KAAuD;AACvH,QAAM,EAAE,UAAU,UAAU,QAAQ,OAAO,UAAU,GAAG,eAAe;AACvE,QAAM,cAAc,aAAoD,GAAG;AAE3E,mBAAiB,UAAU,CAAA,UAAS;AAChC,WAAO,eAAA;AACP,UAAM,SAAS,SAAS,cAAc,iBAAiB;AAGvD,QAAI,UAAU,CAAC,QAAQ,SAAS,YAAY,OAAO,GAAG;AAClD;AAAA,IACJ;AAEA,gBAAY,SAAS,MAAA;AAAA,EACzB,CAAC;AAED,QAAM,MAAM,MAAM,OAAO,MAAM;AAE/B,SACI,sBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,MAAM,WAAW,SAAY,MAAM;AAAA,MACnC,iBAAe,WAAW,SAAS;AAAA,MACnC;AAAA,MACA,QAAQ,QAAQ,MAAM,SAAS;AAAA,MAC/B,MAAM,QAAQ,MAAM,SAAY;AAAA,MAChC,KAAK;AAAA,IAAA;AAAA,IACJ,MAAM,SAAS,MAAM,MAAM,QAAQ,IAAI,IAClC,MAAM,SAAS,IAAI,MAAM,UAAU,CAAA,UAAU,OAAO,UAAU,WAAW,sBAAA,cAAC,cAAM,KAAM,IAAU,KAAM,IACtG,MAAM;AAAA,EAAA;AAGxB,CAAC;"}
@@ -37,7 +37,7 @@ const Root = React.forwardRef(function CollectionRoot(props, ref) {
37
37
  if (internalRef.current) {
38
38
  const options = getOptionsFromCollection(internalRef.current, querySelector);
39
39
  if (options.length && !isMultiselectable) {
40
- const firstSelected = internalRef.current.querySelector("[aria-selected]");
40
+ const firstSelected = internalRef.current.querySelector('[aria-selected="true"]');
41
41
  if (firstSelected) {
42
42
  const selectedIndex = Array.from(options).indexOf(firstSelected);
43
43
  if (selectedIndex > -1 && selectedIndex !== activeIndex) {
@@ -53,7 +53,7 @@ const Root = React.forwardRef(function CollectionRoot(props, ref) {
53
53
  if (options.length) {
54
54
  let selected = internalRef.current.querySelectorAll('[aria-current="true"]');
55
55
  if (selected.length === 0) {
56
- selected = internalRef.current.querySelectorAll("[aria-selected]");
56
+ selected = internalRef.current.querySelectorAll('[aria-selected="true"]');
57
57
  }
58
58
  if (selected.length === 1) {
59
59
  if (options) {
@@ -71,6 +71,9 @@ const Root = React.forwardRef(function CollectionRoot(props, ref) {
71
71
  }, [props.children]);
72
72
  const handleClick = (event) => {
73
73
  const target = event.target;
74
+ if (!(target instanceof Element)) {
75
+ return;
76
+ }
74
77
  const option = target.matches(querySelector) ? target : target.closest(querySelector);
75
78
  if (option) {
76
79
  const options = getOptionsFromCollection(event.currentTarget, querySelector);
@@ -117,7 +120,7 @@ const getNextIndexFromKeycode = (event, length, activeIndex) => {
117
120
  case "End":
118
121
  return length - 1;
119
122
  default:
120
- return;
123
+ return void 0;
121
124
  }
122
125
  };
123
126
  const getNextEnabledItem = (event, options, activeIndex, recurse = true) => {
@@ -128,20 +131,10 @@ const getNextEnabledItem = (event, options, activeIndex, recurse = true) => {
128
131
  }
129
132
  if (options.item(nextIndex) && isSkippableItem(options.item(nextIndex))) {
130
133
  if (recurse && nextIndex === 0) {
131
- return getNextEnabledItem(
132
- new KeyboardEvent(event.type, { ...event, key: "ArrowDown" }),
133
- options,
134
- nextIndex,
135
- false
136
- );
134
+ return getNextEnabledItem({ ...event, key: "ArrowDown" }, options, nextIndex, false);
137
135
  }
138
136
  if (recurse && nextIndex === options.length - 1) {
139
- return getNextEnabledItem(
140
- new KeyboardEvent(event.type, { ...event, key: "ArrowUp" }),
141
- options,
142
- nextIndex,
143
- false
144
- );
137
+ return getNextEnabledItem({ ...event, key: "ArrowUp" }, options, nextIndex, false);
145
138
  }
146
139
  return getNextEnabledItem(event, options, nextIndex, recurse);
147
140
  }
@@ -149,7 +142,7 @@ const getNextEnabledItem = (event, options, activeIndex, recurse = true) => {
149
142
  return nextIndex;
150
143
  };
151
144
  const isSkippableItem = (element) => {
152
- return element.getAttribute("role") === "presentation" || !!element.hasAttribute("disabled") || !!element.getAttribute("aria-disabled") || !!element.getAttribute("aria-hidden");
145
+ return element.getAttribute("role") === "presentation" || element.hasAttribute("disabled") || !!element.getAttribute("aria-disabled") || !!element.getAttribute("aria-hidden");
153
146
  };
154
147
  exports.Root = Root;
155
148
  exports.getNextEnabledItem = getNextEnabledItem;
@@ -1 +1 @@
1
- {"version":3,"file":"Root.cjs","sources":["../../../../src/primitives/Collection/components/Root.tsx"],"sourcesContent":["import React from 'react';\n\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport { isAriaDirectionKey } from '@/utils/aria';\nimport { createCustomKeyboardEvent } from '@/utils/input';\n\n/* This component provides a keyboard navigable collection primitive for use in lists\n * It is unlikely you need to edit this component\n */\n\nexport type CollectionProps = React.HTMLAttributes<HTMLDivElement> & {\n querySelector: string;\n resetOnChange?: unknown;\n};\n\nexport type CollectionRef = HTMLDivElement & {\n setActiveIndexByElement: (option: HTMLDivElement) => void;\n};\n\nconst getOptionsFromCollection = (collection: HTMLDivElement, selector: string): NodeListOf<Element> =>\n collection.querySelectorAll(selector);\n\n// we use javascript to set attributes (rather than cloning children and adding them)\n// so that we can support nesting (e.g. groups) - child elements that aren't options.\n// without doing this we would have to unwrap and flatten all groups\nexport const Root = React.forwardRef<CollectionRef, CollectionProps>(function CollectionRoot(props, ref) {\n const { querySelector, resetOnChange, tabIndex = 0, ...otherProps } = props;\n const internalRef = useMergedRef<CollectionRef>(ref);\n const [activeIndex, setActiveIndex] = React.useState<number | undefined>();\n const isMultiselectable = props['aria-multiselectable'];\n\n const setActiveOption = (index: number, collection: HTMLDivElement, option: Element) => {\n collection.querySelector('[aria-current]')?.removeAttribute('aria-current');\n option.setAttribute('aria-current', 'true');\n\n option.scrollIntoView({ block: 'nearest' });\n setActiveIndex(index);\n };\n\n const setActiveIndexByElement = React.useCallback(\n (option: HTMLDivElement) => {\n if (internalRef.current && option.matches(querySelector)) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n const nextActiveIndex = Array.from(options).indexOf(option);\n\n if (nextActiveIndex > -1) {\n setActiveOption(nextActiveIndex, internalRef.current, option);\n }\n }\n },\n [internalRef.current, querySelector]\n );\n\n React.useEffect(() => {\n if (internalRef.current) {\n internalRef.current.setActiveIndexByElement = setActiveIndexByElement;\n }\n }, [internalRef.current]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n\n if (options.length && !isMultiselectable) {\n const firstSelected = internalRef.current.querySelector('[aria-selected]');\n\n if (firstSelected) {\n const selectedIndex = Array.from(options).indexOf(firstSelected);\n\n if (selectedIndex > -1 && selectedIndex !== activeIndex) {\n setActiveOption(selectedIndex, internalRef.current, firstSelected);\n }\n }\n }\n }\n }, [resetOnChange, isMultiselectable]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n\n if (options.length) {\n let selected = internalRef.current.querySelectorAll('[aria-current=\"true\"]');\n\n // if nothing is current (keyboard visible), look for selected items\n if (selected.length === 0) {\n selected = internalRef.current.querySelectorAll('[aria-selected]');\n }\n\n // if one item is selected, make sure it's current\n if (selected.length === 1) {\n if (options) {\n const firstSelected = selected.item(0);\n const selectedIndex = Array.from(options).indexOf(firstSelected);\n\n if (selectedIndex > -1) {\n setActiveOption(selectedIndex, internalRef.current, firstSelected);\n }\n }\n } else {\n // multiple selected or none selected should go to 0\n setActiveOption(0, internalRef.current, options.item(0));\n }\n }\n }\n }, [props.children]);\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n const target = event.target as HTMLElement;\n // after we allowed complex content in options (like prefix/postfix in Select2), the click target can be a child of the option\n // so in this case we need to find the closest option\n const option = target.matches(querySelector) ? target : target.closest(querySelector);\n\n if (option) {\n const options = getOptionsFromCollection(event.currentTarget, querySelector);\n const nextActiveIndex = Array.from(options).indexOf(option);\n\n if (nextActiveIndex > -1) {\n setActiveOption(nextActiveIndex, event.currentTarget, option);\n }\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n // this stops the event dispatched to the option rebounding back and starting an infinite loop\n if (event.target !== event.currentTarget) {\n return;\n }\n\n if (otherProps.onKeyDown) {\n otherProps.onKeyDown(event);\n }\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n const options = getOptionsFromCollection(event.currentTarget, querySelector);\n\n if (options) {\n if (isAriaDirectionKey(event)) {\n event.preventDefault();\n event.stopPropagation();\n const nextActiveIndex = getNextEnabledItem(event, options, activeIndex);\n\n if (nextActiveIndex !== undefined && nextActiveIndex !== activeIndex) {\n setActiveOption(nextActiveIndex, event.currentTarget, options.item(nextActiveIndex));\n }\n } else if (activeIndex !== undefined && !!options.item(activeIndex)) {\n // forward events onto the underlying option - this lets consumers place onKeyDown handlers on their own components\n options.item(activeIndex)?.dispatchEvent(createCustomKeyboardEvent(event));\n }\n }\n };\n\n return <div {...otherProps} onClick={handleClick} onKeyDown={handleKeyDown} ref={internalRef} tabIndex={tabIndex} />;\n});\n\nexport const getNextIndexFromKeycode = (\n event: React.KeyboardEvent,\n length: number,\n activeIndex: number | undefined\n): number | undefined => {\n switch (event.key) {\n case 'ArrowUp':\n return activeIndex === undefined ? length - 1 : activeIndex > 0 ? activeIndex - 1 : activeIndex;\n\n case 'ArrowDown':\n return activeIndex === undefined ? 0 : activeIndex < length - 1 ? activeIndex + 1 : activeIndex;\n\n case 'Home':\n return 0;\n\n case 'End':\n return length - 1;\n\n default:\n return;\n }\n};\n\nexport const getNextEnabledItem = (\n event: React.KeyboardEvent<HTMLElement>,\n options: NodeListOf<Element>,\n activeIndex: number | undefined,\n recurse = true\n): number | undefined => {\n const nextIndex = getNextIndexFromKeycode(event, options.length, activeIndex);\n\n if (nextIndex !== undefined) {\n if (nextIndex === activeIndex) {\n return activeIndex;\n }\n if (options.item(nextIndex) && isSkippableItem(options.item(nextIndex))) {\n // check in the other direction if the first or last item is disabled,\n // but prevent infinite loops if all elements are disabled by disabling recursion\n if (recurse && nextIndex === 0) {\n return getNextEnabledItem(\n new KeyboardEvent(event.type, { ...(event as any), key: 'ArrowDown' }) as any,\n options,\n nextIndex,\n false\n );\n }\n\n if (recurse && nextIndex === options.length - 1) {\n return getNextEnabledItem(\n new KeyboardEvent(event.type, { ...(event as any), key: 'ArrowUp' }) as any,\n options,\n nextIndex,\n false\n );\n }\n\n return getNextEnabledItem(event, options, nextIndex, recurse);\n }\n }\n\n return nextIndex;\n};\n\nconst isSkippableItem = (element: Element) => {\n return (\n element.getAttribute('role') === 'presentation' ||\n !!element.hasAttribute('disabled') ||\n !!element.getAttribute('aria-disabled') ||\n !!element.getAttribute('aria-hidden')\n );\n};\n"],"names":["useMergedRef","isAriaDirectionKey","createCustomKeyboardEvent"],"mappings":"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"}
1
+ {"version":3,"file":"Root.cjs","sources":["../../../../src/primitives/Collection/components/Root.tsx"],"sourcesContent":["import React from 'react';\n\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport { isAriaDirectionKey } from '@/utils/aria';\nimport { createCustomKeyboardEvent } from '@/utils/input';\n\n/* This component provides a keyboard navigable collection primitive for use in lists\n * It is unlikely you need to edit this component\n */\n\nexport type CollectionProps = React.HTMLAttributes<HTMLDivElement> & {\n querySelector: string;\n resetOnChange?: unknown;\n};\n\nexport type CollectionRef = HTMLDivElement & {\n setActiveIndexByElement: (option: HTMLDivElement) => void;\n};\n\nconst getOptionsFromCollection = (collection: HTMLDivElement, selector: string): NodeListOf<Element> =>\n collection.querySelectorAll(selector);\n\n// we use javascript to set attributes (rather than cloning children and adding them)\n// so that we can support nesting (e.g. groups) - child elements that aren't options.\n// without doing this we would have to unwrap and flatten all groups\nexport const Root = React.forwardRef<CollectionRef, CollectionProps>(function CollectionRoot(props, ref) {\n const { querySelector, resetOnChange, tabIndex = 0, ...otherProps } = props;\n const internalRef = useMergedRef<CollectionRef>(ref);\n const [activeIndex, setActiveIndex] = React.useState<number | undefined>();\n const isMultiselectable = props['aria-multiselectable'];\n\n const setActiveOption = (index: number, collection: HTMLDivElement, option: Element) => {\n collection.querySelector('[aria-current]')?.removeAttribute('aria-current');\n option.setAttribute('aria-current', 'true');\n\n option.scrollIntoView({ block: 'nearest' });\n setActiveIndex(index);\n };\n\n const setActiveIndexByElement = React.useCallback(\n (option: HTMLDivElement) => {\n if (internalRef.current && option.matches(querySelector)) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n const nextActiveIndex = Array.from(options).indexOf(option);\n\n if (nextActiveIndex > -1) {\n setActiveOption(nextActiveIndex, internalRef.current, option);\n }\n }\n },\n [internalRef.current, querySelector]\n );\n\n React.useEffect(() => {\n if (internalRef.current) {\n internalRef.current.setActiveIndexByElement = setActiveIndexByElement;\n }\n }, [internalRef.current]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n\n if (options.length && !isMultiselectable) {\n const firstSelected = internalRef.current.querySelector('[aria-selected=\"true\"]');\n\n if (firstSelected) {\n const selectedIndex = Array.from(options).indexOf(firstSelected);\n\n if (selectedIndex > -1 && selectedIndex !== activeIndex) {\n setActiveOption(selectedIndex, internalRef.current, firstSelected);\n }\n }\n }\n }\n }, [resetOnChange, isMultiselectable]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n\n if (options.length) {\n let selected = internalRef.current.querySelectorAll('[aria-current=\"true\"]');\n\n // if nothing is current (keyboard visible), look for selected items\n if (selected.length === 0) {\n selected = internalRef.current.querySelectorAll('[aria-selected=\"true\"]');\n }\n\n // if one item is selected, make sure it's current\n if (selected.length === 1) {\n if (options) {\n const firstSelected = selected.item(0);\n const selectedIndex = Array.from(options).indexOf(firstSelected);\n\n if (selectedIndex > -1) {\n setActiveOption(selectedIndex, internalRef.current, firstSelected);\n }\n }\n } else {\n // multiple selected or none selected should go to 0\n setActiveOption(0, internalRef.current, options.item(0));\n }\n }\n }\n }, [props.children]);\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n const target = event.target;\n\n if (!(target instanceof Element)) {\n return;\n }\n\n // after we allowed complex content in options (like prefix/postfix in Select2), the click target can be a child of the option\n // so in this case we need to find the closest option\n const option = target.matches(querySelector) ? target : target.closest(querySelector);\n\n if (option) {\n const options = getOptionsFromCollection(event.currentTarget, querySelector);\n const nextActiveIndex = Array.from(options).indexOf(option);\n\n if (nextActiveIndex > -1) {\n setActiveOption(nextActiveIndex, event.currentTarget, option);\n }\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n // this stops the event dispatched to the option rebounding back and starting an infinite loop\n if (event.target !== event.currentTarget) {\n return;\n }\n\n if (otherProps.onKeyDown) {\n otherProps.onKeyDown(event);\n }\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n const options = getOptionsFromCollection(event.currentTarget, querySelector);\n\n if (options) {\n if (isAriaDirectionKey(event)) {\n event.preventDefault();\n event.stopPropagation();\n const nextActiveIndex = getNextEnabledItem(event, options, activeIndex);\n\n if (nextActiveIndex !== undefined && nextActiveIndex !== activeIndex) {\n setActiveOption(nextActiveIndex, event.currentTarget, options.item(nextActiveIndex));\n }\n } else if (activeIndex !== undefined && !!options.item(activeIndex)) {\n // forward events onto the underlying option - this lets consumers place onKeyDown handlers on their own components\n options.item(activeIndex)?.dispatchEvent(createCustomKeyboardEvent(event));\n }\n }\n };\n\n // TODO: Replace with an interactive element or leave a comment explaining why not\n return <div {...otherProps} onClick={handleClick} onKeyDown={handleKeyDown} ref={internalRef} tabIndex={tabIndex} />;\n});\n\nexport const getNextIndexFromKeycode = (\n event: React.KeyboardEvent,\n length: number,\n activeIndex: number | undefined\n): number | undefined => {\n switch (event.key) {\n case 'ArrowUp':\n return activeIndex === undefined ? length - 1 : activeIndex > 0 ? activeIndex - 1 : activeIndex;\n\n case 'ArrowDown':\n return activeIndex === undefined ? 0 : activeIndex < length - 1 ? activeIndex + 1 : activeIndex;\n\n case 'Home':\n return 0;\n\n case 'End':\n return length - 1;\n\n default:\n return undefined;\n }\n};\n\nexport const getNextEnabledItem = (\n event: React.KeyboardEvent<HTMLElement>,\n options: NodeListOf<Element>,\n activeIndex: number | undefined,\n recurse = true\n): number | undefined => {\n const nextIndex = getNextIndexFromKeycode(event, options.length, activeIndex);\n\n if (nextIndex !== undefined) {\n if (nextIndex === activeIndex) {\n return activeIndex;\n }\n if (options.item(nextIndex) && isSkippableItem(options.item(nextIndex))) {\n // check in the other direction if the first or last item is disabled,\n // but prevent infinite loops if all elements are disabled by disabling recursion\n if (recurse && nextIndex === 0) {\n return getNextEnabledItem({ ...event, key: 'ArrowDown' }, options, nextIndex, false);\n }\n\n if (recurse && nextIndex === options.length - 1) {\n return getNextEnabledItem({ ...event, key: 'ArrowUp' }, options, nextIndex, false);\n }\n\n return getNextEnabledItem(event, options, nextIndex, recurse);\n }\n }\n\n return nextIndex;\n};\n\nconst isSkippableItem = (element: Element) => {\n return (\n element.getAttribute('role') === 'presentation' ||\n element.hasAttribute('disabled') ||\n !!element.getAttribute('aria-disabled') ||\n !!element.getAttribute('aria-hidden')\n );\n};\n"],"names":["useMergedRef","isAriaDirectionKey","createCustomKeyboardEvent"],"mappings":";;;;;;AAmBA,MAAM,2BAA2B,CAAC,YAA4B,aAC1D,WAAW,iBAAiB,QAAQ;AAKjC,MAAM,OAAO,MAAM,WAA2C,SAAS,eAAe,OAAO,KAAK;AACrG,QAAM,EAAE,eAAe,eAAe,WAAW,GAAG,GAAG,eAAe;AACtE,QAAM,cAAcA,aAAAA,aAA4B,GAAG;AACnD,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAA;AAC5C,QAAM,oBAAoB,MAAM,sBAAsB;AAEtD,QAAM,kBAAkB,CAAC,OAAe,YAA4B,WAAoB;AACpF,eAAW,cAAc,gBAAgB,GAAG,gBAAgB,cAAc;AAC1E,WAAO,aAAa,gBAAgB,MAAM;AAE1C,WAAO,eAAe,EAAE,OAAO,UAAA,CAAW;AAC1C,mBAAe,KAAK;AAAA,EACxB;AAEA,QAAM,0BAA0B,MAAM;AAAA,IAClC,CAAC,WAA2B;AACxB,UAAI,YAAY,WAAW,OAAO,QAAQ,aAAa,GAAG;AACtD,cAAM,UAAU,yBAAyB,YAAY,SAAS,aAAa;AAC3E,cAAM,kBAAkB,MAAM,KAAK,OAAO,EAAE,QAAQ,MAAM;AAE1D,YAAI,kBAAkB,IAAI;AACtB,0BAAgB,iBAAiB,YAAY,SAAS,MAAM;AAAA,QAChE;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,CAAC,YAAY,SAAS,aAAa;AAAA,EAAA;AAGvC,QAAM,UAAU,MAAM;AAClB,QAAI,YAAY,SAAS;AACrB,kBAAY,QAAQ,0BAA0B;AAAA,IAClD;AAAA,EACJ,GAAG,CAAC,YAAY,OAAO,CAAC;AAExB,QAAM,UAAU,MAAM;AAClB,QAAI,YAAY,SAAS;AACrB,YAAM,UAAU,yBAAyB,YAAY,SAAS,aAAa;AAE3E,UAAI,QAAQ,UAAU,CAAC,mBAAmB;AACtC,cAAM,gBAAgB,YAAY,QAAQ,cAAc,wBAAwB;AAEhF,YAAI,eAAe;AACf,gBAAM,gBAAgB,MAAM,KAAK,OAAO,EAAE,QAAQ,aAAa;AAE/D,cAAI,gBAAgB,MAAM,kBAAkB,aAAa;AACrD,4BAAgB,eAAe,YAAY,SAAS,aAAa;AAAA,UACrE;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,eAAe,iBAAiB,CAAC;AAErC,QAAM,UAAU,MAAM;AAClB,QAAI,YAAY,SAAS;AACrB,YAAM,UAAU,yBAAyB,YAAY,SAAS,aAAa;AAE3E,UAAI,QAAQ,QAAQ;AAChB,YAAI,WAAW,YAAY,QAAQ,iBAAiB,uBAAuB;AAG3E,YAAI,SAAS,WAAW,GAAG;AACvB,qBAAW,YAAY,QAAQ,iBAAiB,wBAAwB;AAAA,QAC5E;AAGA,YAAI,SAAS,WAAW,GAAG;AACvB,cAAI,SAAS;AACT,kBAAM,gBAAgB,SAAS,KAAK,CAAC;AACrC,kBAAM,gBAAgB,MAAM,KAAK,OAAO,EAAE,QAAQ,aAAa;AAE/D,gBAAI,gBAAgB,IAAI;AACpB,8BAAgB,eAAe,YAAY,SAAS,aAAa;AAAA,YACrE;AAAA,UACJ;AAAA,QACJ,OAAO;AAEH,0BAAgB,GAAG,YAAY,SAAS,QAAQ,KAAK,CAAC,CAAC;AAAA,QAC3D;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,MAAM,QAAQ,CAAC;AAEnB,QAAM,cAAc,CAAC,UAA4C;AAC7D,UAAM,SAAS,MAAM;AAErB,QAAI,EAAE,kBAAkB,UAAU;AAC9B;AAAA,IACJ;AAIA,UAAM,SAAS,OAAO,QAAQ,aAAa,IAAI,SAAS,OAAO,QAAQ,aAAa;AAEpF,QAAI,QAAQ;AACR,YAAM,UAAU,yBAAyB,MAAM,eAAe,aAAa;AAC3E,YAAM,kBAAkB,MAAM,KAAK,OAAO,EAAE,QAAQ,MAAM;AAE1D,UAAI,kBAAkB,IAAI;AACtB,wBAAgB,iBAAiB,MAAM,eAAe,MAAM;AAAA,MAChE;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,gBAAgB,CAAC,UAA+C;AAElE,QAAI,MAAM,WAAW,MAAM,eAAe;AACtC;AAAA,IACJ;AAEA,QAAI,WAAW,WAAW;AACtB,iBAAW,UAAU,KAAK;AAAA,IAC9B;AAEA,QAAI,MAAM,sBAAsB;AAC5B;AAAA,IACJ;AAEA,UAAM,UAAU,yBAAyB,MAAM,eAAe,aAAa;AAE3E,QAAI,SAAS;AACT,UAAIC,KAAAA,mBAAmB,KAAK,GAAG;AAC3B,cAAM,eAAA;AACN,cAAM,gBAAA;AACN,cAAM,kBAAkB,mBAAmB,OAAO,SAAS,WAAW;AAEtE,YAAI,oBAAoB,UAAa,oBAAoB,aAAa;AAClE,0BAAgB,iBAAiB,MAAM,eAAe,QAAQ,KAAK,eAAe,CAAC;AAAA,QACvF;AAAA,MACJ,WAAW,gBAAgB,UAAa,CAAC,CAAC,QAAQ,KAAK,WAAW,GAAG;AAEjE,gBAAQ,KAAK,WAAW,GAAG,cAAcC,MAAAA,0BAA0B,KAAK,CAAC;AAAA,MAC7E;AAAA,IACJ;AAAA,EACJ;AAGA,SAAO,sBAAA,cAAC,OAAA,EAAK,GAAG,YAAY,SAAS,aAAa,WAAW,eAAe,KAAK,aAAa,SAAA,CAAoB;AACtH,CAAC;AAEM,MAAM,0BAA0B,CACnC,OACA,QACA,gBACqB;AACrB,UAAQ,MAAM,KAAA;AAAA,IACV,KAAK;AACD,aAAO,gBAAgB,SAAY,SAAS,IAAI,cAAc,IAAI,cAAc,IAAI;AAAA,IAExF,KAAK;AACD,aAAO,gBAAgB,SAAY,IAAI,cAAc,SAAS,IAAI,cAAc,IAAI;AAAA,IAExF,KAAK;AACD,aAAO;AAAA,IAEX,KAAK;AACD,aAAO,SAAS;AAAA,IAEpB;AACI,aAAO;AAAA,EAAA;AAEnB;AAEO,MAAM,qBAAqB,CAC9B,OACA,SACA,aACA,UAAU,SACW;AACrB,QAAM,YAAY,wBAAwB,OAAO,QAAQ,QAAQ,WAAW;AAE5E,MAAI,cAAc,QAAW;AACzB,QAAI,cAAc,aAAa;AAC3B,aAAO;AAAA,IACX;AACA,QAAI,QAAQ,KAAK,SAAS,KAAK,gBAAgB,QAAQ,KAAK,SAAS,CAAC,GAAG;AAGrE,UAAI,WAAW,cAAc,GAAG;AAC5B,eAAO,mBAAmB,EAAE,GAAG,OAAO,KAAK,eAAe,SAAS,WAAW,KAAK;AAAA,MACvF;AAEA,UAAI,WAAW,cAAc,QAAQ,SAAS,GAAG;AAC7C,eAAO,mBAAmB,EAAE,GAAG,OAAO,KAAK,aAAa,SAAS,WAAW,KAAK;AAAA,MACrF;AAEA,aAAO,mBAAmB,OAAO,SAAS,WAAW,OAAO;AAAA,IAChE;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,MAAM,kBAAkB,CAAC,YAAqB;AAC1C,SACI,QAAQ,aAAa,MAAM,MAAM,kBACjC,QAAQ,aAAa,UAAU,KAC/B,CAAC,CAAC,QAAQ,aAAa,eAAe,KACtC,CAAC,CAAC,QAAQ,aAAa,aAAa;AAE5C;;;;"}
@@ -35,7 +35,7 @@ const Root = React__default.forwardRef(function CollectionRoot(props, ref) {
35
35
  if (internalRef.current) {
36
36
  const options = getOptionsFromCollection(internalRef.current, querySelector);
37
37
  if (options.length && !isMultiselectable) {
38
- const firstSelected = internalRef.current.querySelector("[aria-selected]");
38
+ const firstSelected = internalRef.current.querySelector('[aria-selected="true"]');
39
39
  if (firstSelected) {
40
40
  const selectedIndex = Array.from(options).indexOf(firstSelected);
41
41
  if (selectedIndex > -1 && selectedIndex !== activeIndex) {
@@ -51,7 +51,7 @@ const Root = React__default.forwardRef(function CollectionRoot(props, ref) {
51
51
  if (options.length) {
52
52
  let selected = internalRef.current.querySelectorAll('[aria-current="true"]');
53
53
  if (selected.length === 0) {
54
- selected = internalRef.current.querySelectorAll("[aria-selected]");
54
+ selected = internalRef.current.querySelectorAll('[aria-selected="true"]');
55
55
  }
56
56
  if (selected.length === 1) {
57
57
  if (options) {
@@ -69,6 +69,9 @@ const Root = React__default.forwardRef(function CollectionRoot(props, ref) {
69
69
  }, [props.children]);
70
70
  const handleClick = (event) => {
71
71
  const target = event.target;
72
+ if (!(target instanceof Element)) {
73
+ return;
74
+ }
72
75
  const option = target.matches(querySelector) ? target : target.closest(querySelector);
73
76
  if (option) {
74
77
  const options = getOptionsFromCollection(event.currentTarget, querySelector);
@@ -115,7 +118,7 @@ const getNextIndexFromKeycode = (event, length, activeIndex) => {
115
118
  case "End":
116
119
  return length - 1;
117
120
  default:
118
- return;
121
+ return void 0;
119
122
  }
120
123
  };
121
124
  const getNextEnabledItem = (event, options, activeIndex, recurse = true) => {
@@ -126,20 +129,10 @@ const getNextEnabledItem = (event, options, activeIndex, recurse = true) => {
126
129
  }
127
130
  if (options.item(nextIndex) && isSkippableItem(options.item(nextIndex))) {
128
131
  if (recurse && nextIndex === 0) {
129
- return getNextEnabledItem(
130
- new KeyboardEvent(event.type, { ...event, key: "ArrowDown" }),
131
- options,
132
- nextIndex,
133
- false
134
- );
132
+ return getNextEnabledItem({ ...event, key: "ArrowDown" }, options, nextIndex, false);
135
133
  }
136
134
  if (recurse && nextIndex === options.length - 1) {
137
- return getNextEnabledItem(
138
- new KeyboardEvent(event.type, { ...event, key: "ArrowUp" }),
139
- options,
140
- nextIndex,
141
- false
142
- );
135
+ return getNextEnabledItem({ ...event, key: "ArrowUp" }, options, nextIndex, false);
143
136
  }
144
137
  return getNextEnabledItem(event, options, nextIndex, recurse);
145
138
  }
@@ -147,7 +140,7 @@ const getNextEnabledItem = (event, options, activeIndex, recurse = true) => {
147
140
  return nextIndex;
148
141
  };
149
142
  const isSkippableItem = (element) => {
150
- return element.getAttribute("role") === "presentation" || !!element.hasAttribute("disabled") || !!element.getAttribute("aria-disabled") || !!element.getAttribute("aria-hidden");
143
+ return element.getAttribute("role") === "presentation" || element.hasAttribute("disabled") || !!element.getAttribute("aria-disabled") || !!element.getAttribute("aria-hidden");
151
144
  };
152
145
  export {
153
146
  Root,
@@ -1 +1 @@
1
- {"version":3,"file":"Root.js","sources":["../../../../src/primitives/Collection/components/Root.tsx"],"sourcesContent":["import React from 'react';\n\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport { isAriaDirectionKey } from '@/utils/aria';\nimport { createCustomKeyboardEvent } from '@/utils/input';\n\n/* This component provides a keyboard navigable collection primitive for use in lists\n * It is unlikely you need to edit this component\n */\n\nexport type CollectionProps = React.HTMLAttributes<HTMLDivElement> & {\n querySelector: string;\n resetOnChange?: unknown;\n};\n\nexport type CollectionRef = HTMLDivElement & {\n setActiveIndexByElement: (option: HTMLDivElement) => void;\n};\n\nconst getOptionsFromCollection = (collection: HTMLDivElement, selector: string): NodeListOf<Element> =>\n collection.querySelectorAll(selector);\n\n// we use javascript to set attributes (rather than cloning children and adding them)\n// so that we can support nesting (e.g. groups) - child elements that aren't options.\n// without doing this we would have to unwrap and flatten all groups\nexport const Root = React.forwardRef<CollectionRef, CollectionProps>(function CollectionRoot(props, ref) {\n const { querySelector, resetOnChange, tabIndex = 0, ...otherProps } = props;\n const internalRef = useMergedRef<CollectionRef>(ref);\n const [activeIndex, setActiveIndex] = React.useState<number | undefined>();\n const isMultiselectable = props['aria-multiselectable'];\n\n const setActiveOption = (index: number, collection: HTMLDivElement, option: Element) => {\n collection.querySelector('[aria-current]')?.removeAttribute('aria-current');\n option.setAttribute('aria-current', 'true');\n\n option.scrollIntoView({ block: 'nearest' });\n setActiveIndex(index);\n };\n\n const setActiveIndexByElement = React.useCallback(\n (option: HTMLDivElement) => {\n if (internalRef.current && option.matches(querySelector)) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n const nextActiveIndex = Array.from(options).indexOf(option);\n\n if (nextActiveIndex > -1) {\n setActiveOption(nextActiveIndex, internalRef.current, option);\n }\n }\n },\n [internalRef.current, querySelector]\n );\n\n React.useEffect(() => {\n if (internalRef.current) {\n internalRef.current.setActiveIndexByElement = setActiveIndexByElement;\n }\n }, [internalRef.current]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n\n if (options.length && !isMultiselectable) {\n const firstSelected = internalRef.current.querySelector('[aria-selected]');\n\n if (firstSelected) {\n const selectedIndex = Array.from(options).indexOf(firstSelected);\n\n if (selectedIndex > -1 && selectedIndex !== activeIndex) {\n setActiveOption(selectedIndex, internalRef.current, firstSelected);\n }\n }\n }\n }\n }, [resetOnChange, isMultiselectable]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n\n if (options.length) {\n let selected = internalRef.current.querySelectorAll('[aria-current=\"true\"]');\n\n // if nothing is current (keyboard visible), look for selected items\n if (selected.length === 0) {\n selected = internalRef.current.querySelectorAll('[aria-selected]');\n }\n\n // if one item is selected, make sure it's current\n if (selected.length === 1) {\n if (options) {\n const firstSelected = selected.item(0);\n const selectedIndex = Array.from(options).indexOf(firstSelected);\n\n if (selectedIndex > -1) {\n setActiveOption(selectedIndex, internalRef.current, firstSelected);\n }\n }\n } else {\n // multiple selected or none selected should go to 0\n setActiveOption(0, internalRef.current, options.item(0));\n }\n }\n }\n }, [props.children]);\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n const target = event.target as HTMLElement;\n // after we allowed complex content in options (like prefix/postfix in Select2), the click target can be a child of the option\n // so in this case we need to find the closest option\n const option = target.matches(querySelector) ? target : target.closest(querySelector);\n\n if (option) {\n const options = getOptionsFromCollection(event.currentTarget, querySelector);\n const nextActiveIndex = Array.from(options).indexOf(option);\n\n if (nextActiveIndex > -1) {\n setActiveOption(nextActiveIndex, event.currentTarget, option);\n }\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n // this stops the event dispatched to the option rebounding back and starting an infinite loop\n if (event.target !== event.currentTarget) {\n return;\n }\n\n if (otherProps.onKeyDown) {\n otherProps.onKeyDown(event);\n }\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n const options = getOptionsFromCollection(event.currentTarget, querySelector);\n\n if (options) {\n if (isAriaDirectionKey(event)) {\n event.preventDefault();\n event.stopPropagation();\n const nextActiveIndex = getNextEnabledItem(event, options, activeIndex);\n\n if (nextActiveIndex !== undefined && nextActiveIndex !== activeIndex) {\n setActiveOption(nextActiveIndex, event.currentTarget, options.item(nextActiveIndex));\n }\n } else if (activeIndex !== undefined && !!options.item(activeIndex)) {\n // forward events onto the underlying option - this lets consumers place onKeyDown handlers on their own components\n options.item(activeIndex)?.dispatchEvent(createCustomKeyboardEvent(event));\n }\n }\n };\n\n return <div {...otherProps} onClick={handleClick} onKeyDown={handleKeyDown} ref={internalRef} tabIndex={tabIndex} />;\n});\n\nexport const getNextIndexFromKeycode = (\n event: React.KeyboardEvent,\n length: number,\n activeIndex: number | undefined\n): number | undefined => {\n switch (event.key) {\n case 'ArrowUp':\n return activeIndex === undefined ? length - 1 : activeIndex > 0 ? activeIndex - 1 : activeIndex;\n\n case 'ArrowDown':\n return activeIndex === undefined ? 0 : activeIndex < length - 1 ? activeIndex + 1 : activeIndex;\n\n case 'Home':\n return 0;\n\n case 'End':\n return length - 1;\n\n default:\n return;\n }\n};\n\nexport const getNextEnabledItem = (\n event: React.KeyboardEvent<HTMLElement>,\n options: NodeListOf<Element>,\n activeIndex: number | undefined,\n recurse = true\n): number | undefined => {\n const nextIndex = getNextIndexFromKeycode(event, options.length, activeIndex);\n\n if (nextIndex !== undefined) {\n if (nextIndex === activeIndex) {\n return activeIndex;\n }\n if (options.item(nextIndex) && isSkippableItem(options.item(nextIndex))) {\n // check in the other direction if the first or last item is disabled,\n // but prevent infinite loops if all elements are disabled by disabling recursion\n if (recurse && nextIndex === 0) {\n return getNextEnabledItem(\n new KeyboardEvent(event.type, { ...(event as any), key: 'ArrowDown' }) as any,\n options,\n nextIndex,\n false\n );\n }\n\n if (recurse && nextIndex === options.length - 1) {\n return getNextEnabledItem(\n new KeyboardEvent(event.type, { ...(event as any), key: 'ArrowUp' }) as any,\n options,\n nextIndex,\n false\n );\n }\n\n return getNextEnabledItem(event, options, nextIndex, recurse);\n }\n }\n\n return nextIndex;\n};\n\nconst isSkippableItem = (element: Element) => {\n return (\n element.getAttribute('role') === 'presentation' ||\n !!element.hasAttribute('disabled') ||\n !!element.getAttribute('aria-disabled') ||\n !!element.getAttribute('aria-hidden')\n );\n};\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"Root.js","sources":["../../../../src/primitives/Collection/components/Root.tsx"],"sourcesContent":["import React from 'react';\n\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport { isAriaDirectionKey } from '@/utils/aria';\nimport { createCustomKeyboardEvent } from '@/utils/input';\n\n/* This component provides a keyboard navigable collection primitive for use in lists\n * It is unlikely you need to edit this component\n */\n\nexport type CollectionProps = React.HTMLAttributes<HTMLDivElement> & {\n querySelector: string;\n resetOnChange?: unknown;\n};\n\nexport type CollectionRef = HTMLDivElement & {\n setActiveIndexByElement: (option: HTMLDivElement) => void;\n};\n\nconst getOptionsFromCollection = (collection: HTMLDivElement, selector: string): NodeListOf<Element> =>\n collection.querySelectorAll(selector);\n\n// we use javascript to set attributes (rather than cloning children and adding them)\n// so that we can support nesting (e.g. groups) - child elements that aren't options.\n// without doing this we would have to unwrap and flatten all groups\nexport const Root = React.forwardRef<CollectionRef, CollectionProps>(function CollectionRoot(props, ref) {\n const { querySelector, resetOnChange, tabIndex = 0, ...otherProps } = props;\n const internalRef = useMergedRef<CollectionRef>(ref);\n const [activeIndex, setActiveIndex] = React.useState<number | undefined>();\n const isMultiselectable = props['aria-multiselectable'];\n\n const setActiveOption = (index: number, collection: HTMLDivElement, option: Element) => {\n collection.querySelector('[aria-current]')?.removeAttribute('aria-current');\n option.setAttribute('aria-current', 'true');\n\n option.scrollIntoView({ block: 'nearest' });\n setActiveIndex(index);\n };\n\n const setActiveIndexByElement = React.useCallback(\n (option: HTMLDivElement) => {\n if (internalRef.current && option.matches(querySelector)) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n const nextActiveIndex = Array.from(options).indexOf(option);\n\n if (nextActiveIndex > -1) {\n setActiveOption(nextActiveIndex, internalRef.current, option);\n }\n }\n },\n [internalRef.current, querySelector]\n );\n\n React.useEffect(() => {\n if (internalRef.current) {\n internalRef.current.setActiveIndexByElement = setActiveIndexByElement;\n }\n }, [internalRef.current]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n\n if (options.length && !isMultiselectable) {\n const firstSelected = internalRef.current.querySelector('[aria-selected=\"true\"]');\n\n if (firstSelected) {\n const selectedIndex = Array.from(options).indexOf(firstSelected);\n\n if (selectedIndex > -1 && selectedIndex !== activeIndex) {\n setActiveOption(selectedIndex, internalRef.current, firstSelected);\n }\n }\n }\n }\n }, [resetOnChange, isMultiselectable]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n\n if (options.length) {\n let selected = internalRef.current.querySelectorAll('[aria-current=\"true\"]');\n\n // if nothing is current (keyboard visible), look for selected items\n if (selected.length === 0) {\n selected = internalRef.current.querySelectorAll('[aria-selected=\"true\"]');\n }\n\n // if one item is selected, make sure it's current\n if (selected.length === 1) {\n if (options) {\n const firstSelected = selected.item(0);\n const selectedIndex = Array.from(options).indexOf(firstSelected);\n\n if (selectedIndex > -1) {\n setActiveOption(selectedIndex, internalRef.current, firstSelected);\n }\n }\n } else {\n // multiple selected or none selected should go to 0\n setActiveOption(0, internalRef.current, options.item(0));\n }\n }\n }\n }, [props.children]);\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n const target = event.target;\n\n if (!(target instanceof Element)) {\n return;\n }\n\n // after we allowed complex content in options (like prefix/postfix in Select2), the click target can be a child of the option\n // so in this case we need to find the closest option\n const option = target.matches(querySelector) ? target : target.closest(querySelector);\n\n if (option) {\n const options = getOptionsFromCollection(event.currentTarget, querySelector);\n const nextActiveIndex = Array.from(options).indexOf(option);\n\n if (nextActiveIndex > -1) {\n setActiveOption(nextActiveIndex, event.currentTarget, option);\n }\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n // this stops the event dispatched to the option rebounding back and starting an infinite loop\n if (event.target !== event.currentTarget) {\n return;\n }\n\n if (otherProps.onKeyDown) {\n otherProps.onKeyDown(event);\n }\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n const options = getOptionsFromCollection(event.currentTarget, querySelector);\n\n if (options) {\n if (isAriaDirectionKey(event)) {\n event.preventDefault();\n event.stopPropagation();\n const nextActiveIndex = getNextEnabledItem(event, options, activeIndex);\n\n if (nextActiveIndex !== undefined && nextActiveIndex !== activeIndex) {\n setActiveOption(nextActiveIndex, event.currentTarget, options.item(nextActiveIndex));\n }\n } else if (activeIndex !== undefined && !!options.item(activeIndex)) {\n // forward events onto the underlying option - this lets consumers place onKeyDown handlers on their own components\n options.item(activeIndex)?.dispatchEvent(createCustomKeyboardEvent(event));\n }\n }\n };\n\n // TODO: Replace with an interactive element or leave a comment explaining why not\n return <div {...otherProps} onClick={handleClick} onKeyDown={handleKeyDown} ref={internalRef} tabIndex={tabIndex} />;\n});\n\nexport const getNextIndexFromKeycode = (\n event: React.KeyboardEvent,\n length: number,\n activeIndex: number | undefined\n): number | undefined => {\n switch (event.key) {\n case 'ArrowUp':\n return activeIndex === undefined ? length - 1 : activeIndex > 0 ? activeIndex - 1 : activeIndex;\n\n case 'ArrowDown':\n return activeIndex === undefined ? 0 : activeIndex < length - 1 ? activeIndex + 1 : activeIndex;\n\n case 'Home':\n return 0;\n\n case 'End':\n return length - 1;\n\n default:\n return undefined;\n }\n};\n\nexport const getNextEnabledItem = (\n event: React.KeyboardEvent<HTMLElement>,\n options: NodeListOf<Element>,\n activeIndex: number | undefined,\n recurse = true\n): number | undefined => {\n const nextIndex = getNextIndexFromKeycode(event, options.length, activeIndex);\n\n if (nextIndex !== undefined) {\n if (nextIndex === activeIndex) {\n return activeIndex;\n }\n if (options.item(nextIndex) && isSkippableItem(options.item(nextIndex))) {\n // check in the other direction if the first or last item is disabled,\n // but prevent infinite loops if all elements are disabled by disabling recursion\n if (recurse && nextIndex === 0) {\n return getNextEnabledItem({ ...event, key: 'ArrowDown' }, options, nextIndex, false);\n }\n\n if (recurse && nextIndex === options.length - 1) {\n return getNextEnabledItem({ ...event, key: 'ArrowUp' }, options, nextIndex, false);\n }\n\n return getNextEnabledItem(event, options, nextIndex, recurse);\n }\n }\n\n return nextIndex;\n};\n\nconst isSkippableItem = (element: Element) => {\n return (\n element.getAttribute('role') === 'presentation' ||\n element.hasAttribute('disabled') ||\n !!element.getAttribute('aria-disabled') ||\n !!element.getAttribute('aria-hidden')\n );\n};\n"],"names":["React"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Context.cjs","sources":["../../../../src/primitives/Listbox2/components/Context.tsx"],"sourcesContent":["import React from 'react';\n\nimport type { Listbox2Value } from '../types';\n\nexport type Listbox2ContextProps = {\n disabled: boolean;\n readOnly: boolean;\n setValue: (value: Listbox2Value) => void;\n value?: Listbox2Value;\n};\n\nexport const Listbox2Context = React.createContext({} as Listbox2ContextProps);\nexport const useListbox2Context = () => React.useContext(Listbox2Context);\n"],"names":[],"mappings":";;;AAWO,MAAM,kBAAkB,MAAM,cAAc,CAAA,CAA0B;AACtE,MAAM,qBAAqB,MAAM,MAAM,WAAW,eAAe;;;"}
1
+ {"version":3,"file":"Context.cjs","sources":["../../../../src/primitives/Listbox2/components/Context.tsx"],"sourcesContent":["import React from 'react';\n\nimport type { Listbox2Value } from '../types';\n\nexport type Listbox2ContextProps = {\n disabled: boolean;\n multiple: boolean;\n readOnly: boolean;\n setValue: (value: Listbox2Value) => void;\n value?: Listbox2Value;\n};\n\nexport const Listbox2Context = React.createContext({} as Listbox2ContextProps);\nexport const useListbox2Context = () => React.useContext(Listbox2Context);\n"],"names":[],"mappings":";;;AAYO,MAAM,kBAAkB,MAAM,cAAc,CAAA,CAA0B;AACtE,MAAM,qBAAqB,MAAM,MAAM,WAAW,eAAe;;;"}
@@ -2,6 +2,7 @@ import { default as React } from 'react';
2
2
  import { Listbox2Value } from '../types';
3
3
  export type Listbox2ContextProps = {
4
4
  disabled: boolean;
5
+ multiple: boolean;
5
6
  readOnly: boolean;
6
7
  setValue: (value: Listbox2Value) => void;
7
8
  value?: Listbox2Value;
@@ -1 +1 @@
1
- {"version":3,"file":"Context.js","sources":["../../../../src/primitives/Listbox2/components/Context.tsx"],"sourcesContent":["import React from 'react';\n\nimport type { Listbox2Value } from '../types';\n\nexport type Listbox2ContextProps = {\n disabled: boolean;\n readOnly: boolean;\n setValue: (value: Listbox2Value) => void;\n value?: Listbox2Value;\n};\n\nexport const Listbox2Context = React.createContext({} as Listbox2ContextProps);\nexport const useListbox2Context = () => React.useContext(Listbox2Context);\n"],"names":["React"],"mappings":";AAWO,MAAM,kBAAkBA,eAAM,cAAc,CAAA,CAA0B;AACtE,MAAM,qBAAqB,MAAMA,eAAM,WAAW,eAAe;"}
1
+ {"version":3,"file":"Context.js","sources":["../../../../src/primitives/Listbox2/components/Context.tsx"],"sourcesContent":["import React from 'react';\n\nimport type { Listbox2Value } from '../types';\n\nexport type Listbox2ContextProps = {\n disabled: boolean;\n multiple: boolean;\n readOnly: boolean;\n setValue: (value: Listbox2Value) => void;\n value?: Listbox2Value;\n};\n\nexport const Listbox2Context = React.createContext({} as Listbox2ContextProps);\nexport const useListbox2Context = () => React.useContext(Listbox2Context);\n"],"names":["React"],"mappings":";AAYO,MAAM,kBAAkBA,eAAM,cAAc,CAAA,CAA0B;AACtE,MAAM,qBAAqB,MAAMA,eAAM,WAAW,eAAe;"}
@@ -7,7 +7,13 @@ const aria = require("../../../utils/aria.cjs");
7
7
  const Context = require("./Context.cjs");
8
8
  const Option = types.fixedForwardRef(function Listbox2Option(props, ref) {
9
9
  const { disabled, id: nativeId, title: _1, value, ...otherProps } = props;
10
- const { disabled: listboxDisabled, readOnly: listboxReadOnly, setValue, value: currentValue } = Context.useListbox2Context();
10
+ const {
11
+ disabled: listboxDisabled,
12
+ multiple,
13
+ readOnly: listboxReadOnly,
14
+ setValue,
15
+ value: currentValue
16
+ } = Context.useListbox2Context();
11
17
  const id = "option-" + useId.useId(nativeId);
12
18
  const selected = Array.isArray(currentValue) ? currentValue.includes(value) : currentValue === value;
13
19
  const handleClick = (event) => {
@@ -37,7 +43,7 @@ const Option = types.fixedForwardRef(function Listbox2Option(props, ref) {
37
43
  {
38
44
  ...otherProps,
39
45
  "aria-disabled": listboxDisabled || disabled ? "true" : void 0,
40
- "aria-selected": selected ? "true" : void 0,
46
+ "aria-selected": selected ? "true" : multiple ? "false" : void 0,
41
47
  id,
42
48
  onClick: handleClick,
43
49
  onKeyDown: handleKeyDown,
@@ -1 +1 @@
1
- {"version":3,"file":"Option.cjs","sources":["../../../../src/primitives/Listbox2/components/Option.tsx"],"sourcesContent":["import React from 'react';\n\nimport { useId } from '@/hooks/useId';\nimport { fixedForwardRef } from '@/types';\nimport { isAriaSelectionKey } from '@/utils/aria';\n\nimport type { Listbox2OptionValue } from '../types';\n\nimport { useListbox2Context } from './Context';\n\nexport type Listbox2OptionProps<T extends Listbox2OptionValue = Listbox2OptionValue> = React.HTMLAttributes<HTMLDivElement> & {\n disabled?: boolean;\n value: T;\n};\n\nexport const Option = fixedForwardRef(function Listbox2Option<T extends Listbox2OptionValue>(\n props: Listbox2OptionProps<T>,\n ref: React.Ref<HTMLDivElement>\n) {\n const { disabled, id: nativeId, title: _1, value, ...otherProps } = props;\n const { disabled: listboxDisabled, readOnly: listboxReadOnly, setValue, value: currentValue } = useListbox2Context();\n // The id name cannot start with a number, otherwise unit tests will fail when trying to querry element with such id.\n // That's why adding prefix.\n const id = 'option-' + useId(nativeId);\n const selected = Array.isArray(currentValue) ? currentValue.includes(value) : currentValue === value;\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n if (disabled || listboxDisabled || listboxReadOnly) {\n event.stopPropagation();\n return;\n }\n setValue(value);\n\n if (typeof props.onClick === 'function') {\n props.onClick(event);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled || listboxDisabled || listboxReadOnly) {\n event.stopPropagation();\n return;\n }\n if (isAriaSelectionKey(event)) {\n setValue(value);\n }\n\n if (typeof props.onKeyDown === 'function') {\n props.onKeyDown(event);\n }\n };\n\n return (\n <div\n {...otherProps}\n aria-disabled={listboxDisabled || disabled ? 'true' : undefined}\n aria-selected={selected ? 'true' : undefined}\n id={id}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n ref={ref}\n role=\"option\"\n />\n );\n});\n"],"names":["fixedForwardRef","useListbox2Context","useId","isAriaSelectionKey"],"mappings":";;;;;;;AAeO,MAAM,SAASA,MAAAA,gBAAgB,SAAS,eAC3C,OACA,KACF;AACE,QAAM,EAAE,UAAU,IAAI,UAAU,OAAO,IAAI,OAAO,GAAG,WAAA,IAAe;AACpE,QAAM,EAAE,UAAU,iBAAiB,UAAU,iBAAiB,UAAU,OAAO,aAAA,IAAiBC,2BAAA;AAGhG,QAAM,KAAK,YAAYC,MAAAA,MAAM,QAAQ;AACrC,QAAM,WAAW,MAAM,QAAQ,YAAY,IAAI,aAAa,SAAS,KAAK,IAAI,iBAAiB;AAE/F,QAAM,cAAc,CAAC,UAA4C;AAC7D,QAAI,YAAY,mBAAmB,iBAAiB;AAChD,YAAM,gBAAA;AACN;AAAA,IACJ;AACA,aAAS,KAAK;AAEd,QAAI,OAAO,MAAM,YAAY,YAAY;AACrC,YAAM,QAAQ,KAAK;AAAA,IACvB;AAAA,EACJ;AAEA,QAAM,gBAAgB,CAAC,UAA+C;AAClE,QAAI,YAAY,mBAAmB,iBAAiB;AAChD,YAAM,gBAAA;AACN;AAAA,IACJ;AACA,QAAIC,KAAAA,mBAAmB,KAAK,GAAG;AAC3B,eAAS,KAAK;AAAA,IAClB;AAEA,QAAI,OAAO,MAAM,cAAc,YAAY;AACvC,YAAM,UAAU,KAAK;AAAA,IACzB;AAAA,EACJ;AAEA,SACI,sBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,iBAAe,mBAAmB,WAAW,SAAS;AAAA,MACtD,iBAAe,WAAW,SAAS;AAAA,MACnC;AAAA,MACA,SAAS;AAAA,MACT,WAAW;AAAA,MACX;AAAA,MACA,MAAK;AAAA,IAAA;AAAA,EAAA;AAGjB,CAAC;;"}
1
+ {"version":3,"file":"Option.cjs","sources":["../../../../src/primitives/Listbox2/components/Option.tsx"],"sourcesContent":["import React from 'react';\n\nimport { useId } from '@/hooks/useId';\nimport { fixedForwardRef } from '@/types';\nimport { isAriaSelectionKey } from '@/utils/aria';\n\nimport type { Listbox2OptionValue } from '../types';\n\nimport { useListbox2Context } from './Context';\n\nexport type Listbox2OptionProps<T extends Listbox2OptionValue = Listbox2OptionValue> = React.HTMLAttributes<HTMLDivElement> & {\n disabled?: boolean;\n value: T;\n};\n\nexport const Option = fixedForwardRef(function Listbox2Option<T extends Listbox2OptionValue>(\n props: Listbox2OptionProps<T>,\n ref: React.Ref<HTMLDivElement>\n) {\n const { disabled, id: nativeId, title: _1, value, ...otherProps } = props;\n const {\n disabled: listboxDisabled,\n multiple,\n readOnly: listboxReadOnly,\n setValue,\n value: currentValue,\n } = useListbox2Context();\n // The id name cannot start with a number, otherwise unit tests will fail when trying to querry element with such id.\n // That's why adding prefix.\n const id = 'option-' + useId(nativeId);\n const selected = Array.isArray(currentValue) ? currentValue.includes(value) : currentValue === value;\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n if (disabled || listboxDisabled || listboxReadOnly) {\n event.stopPropagation();\n return;\n }\n setValue(value);\n\n if (typeof props.onClick === 'function') {\n props.onClick(event);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled || listboxDisabled || listboxReadOnly) {\n event.stopPropagation();\n return;\n }\n if (isAriaSelectionKey(event)) {\n setValue(value);\n }\n\n if (typeof props.onKeyDown === 'function') {\n props.onKeyDown(event);\n }\n };\n\n return (\n <div\n {...otherProps}\n aria-disabled={listboxDisabled || disabled ? 'true' : undefined}\n aria-selected={selected ? 'true' : multiple ? 'false' : undefined}\n id={id}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n ref={ref}\n role=\"option\"\n />\n );\n});\n"],"names":["fixedForwardRef","useListbox2Context","useId","isAriaSelectionKey"],"mappings":";;;;;;;AAeO,MAAM,SAASA,MAAAA,gBAAgB,SAAS,eAC3C,OACA,KACF;AACE,QAAM,EAAE,UAAU,IAAI,UAAU,OAAO,IAAI,OAAO,GAAG,WAAA,IAAe;AACpE,QAAM;AAAA,IACF,UAAU;AAAA,IACV;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,OAAO;AAAA,EAAA,IACPC,2BAAA;AAGJ,QAAM,KAAK,YAAYC,MAAAA,MAAM,QAAQ;AACrC,QAAM,WAAW,MAAM,QAAQ,YAAY,IAAI,aAAa,SAAS,KAAK,IAAI,iBAAiB;AAE/F,QAAM,cAAc,CAAC,UAA4C;AAC7D,QAAI,YAAY,mBAAmB,iBAAiB;AAChD,YAAM,gBAAA;AACN;AAAA,IACJ;AACA,aAAS,KAAK;AAEd,QAAI,OAAO,MAAM,YAAY,YAAY;AACrC,YAAM,QAAQ,KAAK;AAAA,IACvB;AAAA,EACJ;AAEA,QAAM,gBAAgB,CAAC,UAA+C;AAClE,QAAI,YAAY,mBAAmB,iBAAiB;AAChD,YAAM,gBAAA;AACN;AAAA,IACJ;AACA,QAAIC,KAAAA,mBAAmB,KAAK,GAAG;AAC3B,eAAS,KAAK;AAAA,IAClB;AAEA,QAAI,OAAO,MAAM,cAAc,YAAY;AACvC,YAAM,UAAU,KAAK;AAAA,IACzB;AAAA,EACJ;AAEA,SACI,sBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,iBAAe,mBAAmB,WAAW,SAAS;AAAA,MACtD,iBAAe,WAAW,SAAS,WAAW,UAAU;AAAA,MACxD;AAAA,MACA,SAAS;AAAA,MACT,WAAW;AAAA,MACX;AAAA,MACA,MAAK;AAAA,IAAA;AAAA,EAAA;AAGjB,CAAC;;"}
@@ -5,7 +5,13 @@ import { isAriaSelectionKey } from "../../../utils/aria.js";
5
5
  import { useListbox2Context } from "./Context.js";
6
6
  const Option = fixedForwardRef(function Listbox2Option(props, ref) {
7
7
  const { disabled, id: nativeId, title: _1, value, ...otherProps } = props;
8
- const { disabled: listboxDisabled, readOnly: listboxReadOnly, setValue, value: currentValue } = useListbox2Context();
8
+ const {
9
+ disabled: listboxDisabled,
10
+ multiple,
11
+ readOnly: listboxReadOnly,
12
+ setValue,
13
+ value: currentValue
14
+ } = useListbox2Context();
9
15
  const id = "option-" + useId(nativeId);
10
16
  const selected = Array.isArray(currentValue) ? currentValue.includes(value) : currentValue === value;
11
17
  const handleClick = (event) => {
@@ -35,7 +41,7 @@ const Option = fixedForwardRef(function Listbox2Option(props, ref) {
35
41
  {
36
42
  ...otherProps,
37
43
  "aria-disabled": listboxDisabled || disabled ? "true" : void 0,
38
- "aria-selected": selected ? "true" : void 0,
44
+ "aria-selected": selected ? "true" : multiple ? "false" : void 0,
39
45
  id,
40
46
  onClick: handleClick,
41
47
  onKeyDown: handleKeyDown,
@@ -1 +1 @@
1
- {"version":3,"file":"Option.js","sources":["../../../../src/primitives/Listbox2/components/Option.tsx"],"sourcesContent":["import React from 'react';\n\nimport { useId } from '@/hooks/useId';\nimport { fixedForwardRef } from '@/types';\nimport { isAriaSelectionKey } from '@/utils/aria';\n\nimport type { Listbox2OptionValue } from '../types';\n\nimport { useListbox2Context } from './Context';\n\nexport type Listbox2OptionProps<T extends Listbox2OptionValue = Listbox2OptionValue> = React.HTMLAttributes<HTMLDivElement> & {\n disabled?: boolean;\n value: T;\n};\n\nexport const Option = fixedForwardRef(function Listbox2Option<T extends Listbox2OptionValue>(\n props: Listbox2OptionProps<T>,\n ref: React.Ref<HTMLDivElement>\n) {\n const { disabled, id: nativeId, title: _1, value, ...otherProps } = props;\n const { disabled: listboxDisabled, readOnly: listboxReadOnly, setValue, value: currentValue } = useListbox2Context();\n // The id name cannot start with a number, otherwise unit tests will fail when trying to querry element with such id.\n // That's why adding prefix.\n const id = 'option-' + useId(nativeId);\n const selected = Array.isArray(currentValue) ? currentValue.includes(value) : currentValue === value;\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n if (disabled || listboxDisabled || listboxReadOnly) {\n event.stopPropagation();\n return;\n }\n setValue(value);\n\n if (typeof props.onClick === 'function') {\n props.onClick(event);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled || listboxDisabled || listboxReadOnly) {\n event.stopPropagation();\n return;\n }\n if (isAriaSelectionKey(event)) {\n setValue(value);\n }\n\n if (typeof props.onKeyDown === 'function') {\n props.onKeyDown(event);\n }\n };\n\n return (\n <div\n {...otherProps}\n aria-disabled={listboxDisabled || disabled ? 'true' : undefined}\n aria-selected={selected ? 'true' : undefined}\n id={id}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n ref={ref}\n role=\"option\"\n />\n );\n});\n"],"names":["React"],"mappings":";;;;;AAeO,MAAM,SAAS,gBAAgB,SAAS,eAC3C,OACA,KACF;AACE,QAAM,EAAE,UAAU,IAAI,UAAU,OAAO,IAAI,OAAO,GAAG,WAAA,IAAe;AACpE,QAAM,EAAE,UAAU,iBAAiB,UAAU,iBAAiB,UAAU,OAAO,aAAA,IAAiB,mBAAA;AAGhG,QAAM,KAAK,YAAY,MAAM,QAAQ;AACrC,QAAM,WAAW,MAAM,QAAQ,YAAY,IAAI,aAAa,SAAS,KAAK,IAAI,iBAAiB;AAE/F,QAAM,cAAc,CAAC,UAA4C;AAC7D,QAAI,YAAY,mBAAmB,iBAAiB;AAChD,YAAM,gBAAA;AACN;AAAA,IACJ;AACA,aAAS,KAAK;AAEd,QAAI,OAAO,MAAM,YAAY,YAAY;AACrC,YAAM,QAAQ,KAAK;AAAA,IACvB;AAAA,EACJ;AAEA,QAAM,gBAAgB,CAAC,UAA+C;AAClE,QAAI,YAAY,mBAAmB,iBAAiB;AAChD,YAAM,gBAAA;AACN;AAAA,IACJ;AACA,QAAI,mBAAmB,KAAK,GAAG;AAC3B,eAAS,KAAK;AAAA,IAClB;AAEA,QAAI,OAAO,MAAM,cAAc,YAAY;AACvC,YAAM,UAAU,KAAK;AAAA,IACzB;AAAA,EACJ;AAEA,SACIA,+BAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,iBAAe,mBAAmB,WAAW,SAAS;AAAA,MACtD,iBAAe,WAAW,SAAS;AAAA,MACnC;AAAA,MACA,SAAS;AAAA,MACT,WAAW;AAAA,MACX;AAAA,MACA,MAAK;AAAA,IAAA;AAAA,EAAA;AAGjB,CAAC;"}
1
+ {"version":3,"file":"Option.js","sources":["../../../../src/primitives/Listbox2/components/Option.tsx"],"sourcesContent":["import React from 'react';\n\nimport { useId } from '@/hooks/useId';\nimport { fixedForwardRef } from '@/types';\nimport { isAriaSelectionKey } from '@/utils/aria';\n\nimport type { Listbox2OptionValue } from '../types';\n\nimport { useListbox2Context } from './Context';\n\nexport type Listbox2OptionProps<T extends Listbox2OptionValue = Listbox2OptionValue> = React.HTMLAttributes<HTMLDivElement> & {\n disabled?: boolean;\n value: T;\n};\n\nexport const Option = fixedForwardRef(function Listbox2Option<T extends Listbox2OptionValue>(\n props: Listbox2OptionProps<T>,\n ref: React.Ref<HTMLDivElement>\n) {\n const { disabled, id: nativeId, title: _1, value, ...otherProps } = props;\n const {\n disabled: listboxDisabled,\n multiple,\n readOnly: listboxReadOnly,\n setValue,\n value: currentValue,\n } = useListbox2Context();\n // The id name cannot start with a number, otherwise unit tests will fail when trying to querry element with such id.\n // That's why adding prefix.\n const id = 'option-' + useId(nativeId);\n const selected = Array.isArray(currentValue) ? currentValue.includes(value) : currentValue === value;\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n if (disabled || listboxDisabled || listboxReadOnly) {\n event.stopPropagation();\n return;\n }\n setValue(value);\n\n if (typeof props.onClick === 'function') {\n props.onClick(event);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled || listboxDisabled || listboxReadOnly) {\n event.stopPropagation();\n return;\n }\n if (isAriaSelectionKey(event)) {\n setValue(value);\n }\n\n if (typeof props.onKeyDown === 'function') {\n props.onKeyDown(event);\n }\n };\n\n return (\n <div\n {...otherProps}\n aria-disabled={listboxDisabled || disabled ? 'true' : undefined}\n aria-selected={selected ? 'true' : multiple ? 'false' : undefined}\n id={id}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n ref={ref}\n role=\"option\"\n />\n );\n});\n"],"names":["React"],"mappings":";;;;;AAeO,MAAM,SAAS,gBAAgB,SAAS,eAC3C,OACA,KACF;AACE,QAAM,EAAE,UAAU,IAAI,UAAU,OAAO,IAAI,OAAO,GAAG,WAAA,IAAe;AACpE,QAAM;AAAA,IACF,UAAU;AAAA,IACV;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,OAAO;AAAA,EAAA,IACP,mBAAA;AAGJ,QAAM,KAAK,YAAY,MAAM,QAAQ;AACrC,QAAM,WAAW,MAAM,QAAQ,YAAY,IAAI,aAAa,SAAS,KAAK,IAAI,iBAAiB;AAE/F,QAAM,cAAc,CAAC,UAA4C;AAC7D,QAAI,YAAY,mBAAmB,iBAAiB;AAChD,YAAM,gBAAA;AACN;AAAA,IACJ;AACA,aAAS,KAAK;AAEd,QAAI,OAAO,MAAM,YAAY,YAAY;AACrC,YAAM,QAAQ,KAAK;AAAA,IACvB;AAAA,EACJ;AAEA,QAAM,gBAAgB,CAAC,UAA+C;AAClE,QAAI,YAAY,mBAAmB,iBAAiB;AAChD,YAAM,gBAAA;AACN;AAAA,IACJ;AACA,QAAI,mBAAmB,KAAK,GAAG;AAC3B,eAAS,KAAK;AAAA,IAClB;AAEA,QAAI,OAAO,MAAM,cAAc,YAAY;AACvC,YAAM,UAAU,KAAK;AAAA,IACzB;AAAA,EACJ;AAEA,SACIA,+BAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,iBAAe,mBAAmB,WAAW,SAAS;AAAA,MACtD,iBAAe,WAAW,SAAS,WAAW,UAAU;AAAA,MACxD;AAAA,MACA,SAAS;AAAA,MACT,WAAW;AAAA,MACX;AAAA,MACA,MAAK;AAAA,IAAA;AAAA,EAAA;AAGjB,CAAC;"}