@proyecto-viviana/solidaria 0.2.5 → 0.3.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 (555) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +31 -236
  3. package/dist/actiongroup/createActionGroup.d.ts +29 -0
  4. package/dist/actiongroup/createActionGroup.d.ts.map +1 -0
  5. package/dist/actiongroup/index.d.ts +2 -0
  6. package/dist/actiongroup/index.d.ts.map +1 -0
  7. package/dist/autocomplete/createAutocomplete.d.ts +16 -12
  8. package/dist/autocomplete/createAutocomplete.d.ts.map +1 -1
  9. package/dist/autocomplete/index.d.ts +1 -1
  10. package/dist/autocomplete/index.d.ts.map +1 -1
  11. package/dist/breadcrumbs/createBreadcrumbs.d.ts +11 -7
  12. package/dist/breadcrumbs/createBreadcrumbs.d.ts.map +1 -1
  13. package/dist/breadcrumbs/index.d.ts +1 -1
  14. package/dist/button/createButton.d.ts +1 -1
  15. package/dist/button/createButton.d.ts.map +1 -1
  16. package/dist/button/createToggleButton.d.ts +3 -3
  17. package/dist/button/createToggleButtonGroup.d.ts +32 -0
  18. package/dist/button/createToggleButtonGroup.d.ts.map +1 -0
  19. package/dist/button/index.d.ts +6 -4
  20. package/dist/button/index.d.ts.map +1 -1
  21. package/dist/button/types.d.ts +18 -12
  22. package/dist/button/types.d.ts.map +1 -1
  23. package/dist/calendar/createCalendar.d.ts +15 -5
  24. package/dist/calendar/createCalendar.d.ts.map +1 -1
  25. package/dist/calendar/createCalendarCell.d.ts +8 -2
  26. package/dist/calendar/createCalendarCell.d.ts.map +1 -1
  27. package/dist/calendar/createCalendarGrid.d.ts +4 -4
  28. package/dist/calendar/createCalendarGrid.d.ts.map +1 -1
  29. package/dist/calendar/createRangeCalendar.d.ts +15 -5
  30. package/dist/calendar/createRangeCalendar.d.ts.map +1 -1
  31. package/dist/calendar/createRangeCalendarCell.d.ts +7 -3
  32. package/dist/calendar/createRangeCalendarCell.d.ts.map +1 -1
  33. package/dist/calendar/index.d.ts +5 -5
  34. package/dist/calendar/index.d.ts.map +1 -1
  35. package/dist/calendar/intl/index.d.ts +12 -0
  36. package/dist/calendar/intl/index.d.ts.map +1 -0
  37. package/dist/calendar/utils.d.ts +12 -0
  38. package/dist/calendar/utils.d.ts.map +1 -0
  39. package/dist/checkbox/createCheckbox.d.ts +6 -6
  40. package/dist/checkbox/createCheckbox.d.ts.map +1 -1
  41. package/dist/checkbox/createCheckboxGroup.d.ts +11 -7
  42. package/dist/checkbox/createCheckboxGroup.d.ts.map +1 -1
  43. package/dist/checkbox/createCheckboxGroupItem.d.ts +4 -4
  44. package/dist/checkbox/createCheckboxGroupItem.d.ts.map +1 -1
  45. package/dist/checkbox/createCheckboxGroupState.d.ts +2 -2
  46. package/dist/checkbox/createCheckboxGroupState.d.ts.map +1 -1
  47. package/dist/checkbox/index.d.ts +8 -8
  48. package/dist/checkbox/index.d.ts.map +1 -1
  49. package/dist/collections/index.d.ts +56 -0
  50. package/dist/collections/index.d.ts.map +1 -0
  51. package/dist/color/createColorArea.d.ts +3 -3
  52. package/dist/color/createColorArea.d.ts.map +1 -1
  53. package/dist/color/createColorField.d.ts +4 -4
  54. package/dist/color/createColorField.d.ts.map +1 -1
  55. package/dist/color/createColorSlider.d.ts +4 -4
  56. package/dist/color/createColorSlider.d.ts.map +1 -1
  57. package/dist/color/createColorSwatch.d.ts +2 -2
  58. package/dist/color/createColorSwatch.d.ts.map +1 -1
  59. package/dist/color/createColorWheel.d.ts +3 -3
  60. package/dist/color/createColorWheel.d.ts.map +1 -1
  61. package/dist/color/index.d.ts +6 -6
  62. package/dist/color/types.d.ts +98 -16
  63. package/dist/color/types.d.ts.map +1 -1
  64. package/dist/combobox/createComboBox.d.ts +16 -7
  65. package/dist/combobox/createComboBox.d.ts.map +1 -1
  66. package/dist/combobox/index.d.ts +1 -1
  67. package/dist/combobox/intl/index.d.ts +1 -1
  68. package/dist/datepicker/createDateField.d.ts +18 -6
  69. package/dist/datepicker/createDateField.d.ts.map +1 -1
  70. package/dist/datepicker/createDatePicker.d.ts +57 -5
  71. package/dist/datepicker/createDatePicker.d.ts.map +1 -1
  72. package/dist/datepicker/createDatePickerGroup.d.ts +19 -0
  73. package/dist/datepicker/createDatePickerGroup.d.ts.map +1 -0
  74. package/dist/datepicker/createDateRangePicker.d.ts +42 -0
  75. package/dist/datepicker/createDateRangePicker.d.ts.map +1 -0
  76. package/dist/datepicker/createDateSegment.d.ts +11 -3
  77. package/dist/datepicker/createDateSegment.d.ts.map +1 -1
  78. package/dist/datepicker/createTimeField.d.ts +11 -5
  79. package/dist/datepicker/createTimeField.d.ts.map +1 -1
  80. package/dist/datepicker/createTimeSegment.d.ts +29 -0
  81. package/dist/datepicker/createTimeSegment.d.ts.map +1 -0
  82. package/dist/datepicker/index.d.ts +7 -4
  83. package/dist/datepicker/index.d.ts.map +1 -1
  84. package/dist/dialog/createDialog.d.ts +5 -5
  85. package/dist/dialog/createDialog.d.ts.map +1 -1
  86. package/dist/dialog/index.d.ts +2 -2
  87. package/dist/dialog/index.d.ts.map +1 -1
  88. package/dist/dialog/types.d.ts +4 -4
  89. package/dist/disclosure/createDisclosure.d.ts +5 -2
  90. package/dist/disclosure/createDisclosure.d.ts.map +1 -1
  91. package/dist/disclosure/createDisclosureGroup.d.ts +4 -3
  92. package/dist/disclosure/createDisclosureGroup.d.ts.map +1 -1
  93. package/dist/disclosure/index.d.ts +2 -2
  94. package/dist/dnd/createDrag.d.ts +2 -2
  95. package/dist/dnd/createDrag.d.ts.map +1 -1
  96. package/dist/dnd/createDraggableCollection.d.ts +6 -2
  97. package/dist/dnd/createDraggableCollection.d.ts.map +1 -1
  98. package/dist/dnd/createDraggableItem.d.ts +3 -3
  99. package/dist/dnd/createDraggableItem.d.ts.map +1 -1
  100. package/dist/dnd/createDrop.d.ts +2 -2
  101. package/dist/dnd/createDrop.d.ts.map +1 -1
  102. package/dist/dnd/createDroppableCollection.d.ts +55 -4
  103. package/dist/dnd/createDroppableCollection.d.ts.map +1 -1
  104. package/dist/dnd/createDroppableItem.d.ts +3 -3
  105. package/dist/dnd/createDroppableItem.d.ts.map +1 -1
  106. package/dist/dnd/index.d.ts +12 -12
  107. package/dist/dnd/index.d.ts.map +1 -1
  108. package/dist/dnd/types.d.ts +2 -2
  109. package/dist/dnd/types.d.ts.map +1 -1
  110. package/dist/dnd/utils.d.ts +1 -1
  111. package/dist/dnd/utils.d.ts.map +1 -1
  112. package/dist/focus/FocusScope.d.ts +1 -1
  113. package/dist/focus/FocusScope.d.ts.map +1 -1
  114. package/dist/focus/createAutoFocus.d.ts.map +1 -1
  115. package/dist/focus/createFocusRestore.d.ts.map +1 -1
  116. package/dist/focus/createVirtualFocus.d.ts +4 -4
  117. package/dist/focus/createVirtualFocus.d.ts.map +1 -1
  118. package/dist/focus/index.d.ts +4 -4
  119. package/dist/focus/index.d.ts.map +1 -1
  120. package/dist/form/createFormReset.d.ts +1 -1
  121. package/dist/form/createFormValidation.d.ts +3 -3
  122. package/dist/form/createFormValidation.d.ts.map +1 -1
  123. package/dist/form/index.d.ts +2 -2
  124. package/dist/form/index.d.ts.map +1 -1
  125. package/dist/grid/GridKeyboardDelegate.d.ts +5 -5
  126. package/dist/grid/createGrid.d.ts +3 -3
  127. package/dist/grid/createGrid.d.ts.map +1 -1
  128. package/dist/grid/createGridCell.d.ts +3 -3
  129. package/dist/grid/createGridRow.d.ts +3 -3
  130. package/dist/grid/index.d.ts +5 -5
  131. package/dist/grid/types.d.ts +8 -8
  132. package/dist/gridlist/createGridList.d.ts +6 -4
  133. package/dist/gridlist/createGridList.d.ts.map +1 -1
  134. package/dist/gridlist/createGridListItem.d.ts +4 -4
  135. package/dist/gridlist/createGridListItem.d.ts.map +1 -1
  136. package/dist/gridlist/createGridListSelectionCheckbox.d.ts +3 -3
  137. package/dist/gridlist/createGridListSelectionCheckbox.d.ts.map +1 -1
  138. package/dist/gridlist/index.d.ts +4 -4
  139. package/dist/gridlist/types.d.ts +11 -7
  140. package/dist/gridlist/types.d.ts.map +1 -1
  141. package/dist/i18n/createCollator.d.ts.map +1 -1
  142. package/dist/i18n/createDateFormatter.d.ts.map +1 -1
  143. package/dist/i18n/createFilter.d.ts.map +1 -1
  144. package/dist/i18n/createNumberFormatter.d.ts +1 -1
  145. package/dist/i18n/createNumberFormatter.d.ts.map +1 -1
  146. package/dist/i18n/createStringFormatter.d.ts +2 -2
  147. package/dist/i18n/createStringFormatter.d.ts.map +1 -1
  148. package/dist/i18n/index.d.ts +8 -8
  149. package/dist/i18n/index.d.ts.map +1 -1
  150. package/dist/i18n/locale.d.ts +2 -2
  151. package/dist/i18n/locale.d.ts.map +1 -1
  152. package/dist/i18n/utils.d.ts.map +1 -1
  153. package/dist/index.d.ts +52 -49
  154. package/dist/index.d.ts.map +1 -1
  155. package/dist/index.js +18089 -15690
  156. package/dist/index.js.map +1 -7
  157. package/dist/index.jsx +18242 -0
  158. package/dist/index.jsx.map +1 -0
  159. package/dist/interactions/FocusableProvider.d.ts +2 -2
  160. package/dist/interactions/FocusableProvider.d.ts.map +1 -1
  161. package/dist/interactions/PressEvent.d.ts +2 -2
  162. package/dist/interactions/createFocus.d.ts +1 -1
  163. package/dist/interactions/createFocus.d.ts.map +1 -1
  164. package/dist/interactions/createFocusRing.d.ts +1 -1
  165. package/dist/interactions/createFocusRing.d.ts.map +1 -1
  166. package/dist/interactions/createFocusWithin.d.ts +1 -1
  167. package/dist/interactions/createFocusWithin.d.ts.map +1 -1
  168. package/dist/interactions/createFocusable.d.ts +3 -3
  169. package/dist/interactions/createFocusable.d.ts.map +1 -1
  170. package/dist/interactions/createHover.d.ts +5 -5
  171. package/dist/interactions/createHover.d.ts.map +1 -1
  172. package/dist/interactions/createInteractionModality.d.ts +3 -3
  173. package/dist/interactions/createInteractionModality.d.ts.map +1 -1
  174. package/dist/interactions/createKeyboard.d.ts +1 -1
  175. package/dist/interactions/createLongPress.d.ts +5 -5
  176. package/dist/interactions/createMove.d.ts +5 -5
  177. package/dist/interactions/createMove.d.ts.map +1 -1
  178. package/dist/interactions/createPress.d.ts +4 -4
  179. package/dist/interactions/createPress.d.ts.map +1 -1
  180. package/dist/interactions/index.d.ts +12 -12
  181. package/dist/interactions/index.d.ts.map +1 -1
  182. package/dist/label/createField.d.ts +4 -4
  183. package/dist/label/createField.d.ts.map +1 -1
  184. package/dist/label/createLabel.d.ts +7 -7
  185. package/dist/label/createLabel.d.ts.map +1 -1
  186. package/dist/label/createLabels.d.ts +1 -1
  187. package/dist/label/createLabels.d.ts.map +1 -1
  188. package/dist/label/index.d.ts +5 -5
  189. package/dist/landmark/createLandmark.d.ts +5 -5
  190. package/dist/landmark/createLandmark.d.ts.map +1 -1
  191. package/dist/landmark/index.d.ts +1 -1
  192. package/dist/link/createLink.d.ts +23 -7
  193. package/dist/link/createLink.d.ts.map +1 -1
  194. package/dist/link/index.d.ts +1 -1
  195. package/dist/listbox/createListBox.d.ts +12 -6
  196. package/dist/listbox/createListBox.d.ts.map +1 -1
  197. package/dist/listbox/createOption.d.ts +21 -4
  198. package/dist/listbox/createOption.d.ts.map +1 -1
  199. package/dist/listbox/index.d.ts +2 -2
  200. package/dist/listbox/index.d.ts.map +1 -1
  201. package/dist/live-announcer/announce.d.ts +2 -2
  202. package/dist/live-announcer/announce.d.ts.map +1 -1
  203. package/dist/live-announcer/index.d.ts +1 -1
  204. package/dist/menu/createMenu.d.ts +8 -7
  205. package/dist/menu/createMenu.d.ts.map +1 -1
  206. package/dist/menu/createMenuItem.d.ts +16 -4
  207. package/dist/menu/createMenuItem.d.ts.map +1 -1
  208. package/dist/menu/createMenuTrigger.d.ts +4 -4
  209. package/dist/menu/index.d.ts +3 -3
  210. package/dist/menu/index.d.ts.map +1 -1
  211. package/dist/meter/createMeter.d.ts +6 -6
  212. package/dist/meter/createMeter.d.ts.map +1 -1
  213. package/dist/meter/index.d.ts +1 -1
  214. package/dist/numberfield/createNumberField.d.ts +27 -8
  215. package/dist/numberfield/createNumberField.d.ts.map +1 -1
  216. package/dist/numberfield/index.d.ts +1 -1
  217. package/dist/overlays/ariaHideOutside.d.ts.map +1 -1
  218. package/dist/overlays/createModal.d.ts +19 -3
  219. package/dist/overlays/createModal.d.ts.map +1 -1
  220. package/dist/overlays/createOverlay.d.ts +1 -1
  221. package/dist/overlays/createOverlay.d.ts.map +1 -1
  222. package/dist/overlays/createOverlayTrigger.d.ts +6 -6
  223. package/dist/overlays/index.d.ts +6 -6
  224. package/dist/overlays/index.d.ts.map +1 -1
  225. package/dist/popover/calculatePosition.d.ts +4 -4
  226. package/dist/popover/calculatePosition.d.ts.map +1 -1
  227. package/dist/popover/createOverlayPosition.d.ts +3 -3
  228. package/dist/popover/createOverlayPosition.d.ts.map +1 -1
  229. package/dist/popover/createPopover.d.ts +4 -4
  230. package/dist/popover/createPopover.d.ts.map +1 -1
  231. package/dist/popover/index.d.ts +3 -3
  232. package/dist/progress/createProgressBar.d.ts +7 -5
  233. package/dist/progress/createProgressBar.d.ts.map +1 -1
  234. package/dist/progress/index.d.ts +1 -1
  235. package/dist/radio/createRadio.d.ts +7 -7
  236. package/dist/radio/createRadio.d.ts.map +1 -1
  237. package/dist/radio/createRadioGroup.d.ts +11 -11
  238. package/dist/radio/createRadioGroup.d.ts.map +1 -1
  239. package/dist/radio/createRadioGroupState.d.ts +3 -3
  240. package/dist/radio/createRadioGroupState.d.ts.map +1 -1
  241. package/dist/radio/index.d.ts +3 -3
  242. package/dist/radio/index.d.ts.map +1 -1
  243. package/dist/searchfield/createSearchField.d.ts +7 -7
  244. package/dist/searchfield/createSearchField.d.ts.map +1 -1
  245. package/dist/searchfield/index.d.ts +2 -2
  246. package/dist/select/createHiddenSelect.d.ts +4 -4
  247. package/dist/select/createHiddenSelect.d.ts.map +1 -1
  248. package/dist/select/createSelect.d.ts +14 -6
  249. package/dist/select/createSelect.d.ts.map +1 -1
  250. package/dist/select/index.d.ts +2 -2
  251. package/dist/select/index.d.ts.map +1 -1
  252. package/dist/selection/createTypeSelect.d.ts +2 -2
  253. package/dist/selection/index.d.ts +1 -1
  254. package/dist/separator/createSeparator.d.ts +9 -5
  255. package/dist/separator/createSeparator.d.ts.map +1 -1
  256. package/dist/separator/index.d.ts +1 -1
  257. package/dist/slider/createSlider.d.ts +11 -7
  258. package/dist/slider/createSlider.d.ts.map +1 -1
  259. package/dist/slider/index.d.ts +2 -2
  260. package/dist/ssr/index.d.ts +1 -1
  261. package/dist/ssr/index.d.ts.map +1 -1
  262. package/dist/steplist/createStepList.d.ts +36 -0
  263. package/dist/steplist/createStepList.d.ts.map +1 -0
  264. package/dist/steplist/index.d.ts +2 -0
  265. package/dist/steplist/index.d.ts.map +1 -0
  266. package/dist/switch/createSwitch.d.ts +6 -4
  267. package/dist/switch/createSwitch.d.ts.map +1 -1
  268. package/dist/switch/index.d.ts +1 -1
  269. package/dist/table/createTable.d.ts +3 -3
  270. package/dist/table/createTable.d.ts.map +1 -1
  271. package/dist/table/createTableCell.d.ts +3 -3
  272. package/dist/table/createTableCell.d.ts.map +1 -1
  273. package/dist/table/createTableColumnHeader.d.ts +3 -3
  274. package/dist/table/createTableColumnHeader.d.ts.map +1 -1
  275. package/dist/table/createTableColumnResize.d.ts +41 -0
  276. package/dist/table/createTableColumnResize.d.ts.map +1 -0
  277. package/dist/table/createTableHeaderRow.d.ts +3 -3
  278. package/dist/table/createTableRow.d.ts +3 -3
  279. package/dist/table/createTableRow.d.ts.map +1 -1
  280. package/dist/table/createTableRowGroup.d.ts +2 -2
  281. package/dist/table/createTableRowGroup.d.ts.map +1 -1
  282. package/dist/table/createTableSelectAllCheckbox.d.ts +3 -3
  283. package/dist/table/createTableSelectAllCheckbox.d.ts.map +1 -1
  284. package/dist/table/createTableSelectionCheckbox.d.ts +3 -3
  285. package/dist/table/index.d.ts +11 -9
  286. package/dist/table/index.d.ts.map +1 -1
  287. package/dist/table/types.d.ts +15 -7
  288. package/dist/table/types.d.ts.map +1 -1
  289. package/dist/tabs/createTabs.d.ts +28 -25
  290. package/dist/tabs/createTabs.d.ts.map +1 -1
  291. package/dist/tabs/index.d.ts +1 -1
  292. package/dist/tag/createTag.d.ts +2 -2
  293. package/dist/tag/createTag.d.ts.map +1 -1
  294. package/dist/tag/createTagGroup.d.ts +5 -5
  295. package/dist/tag/createTagGroup.d.ts.map +1 -1
  296. package/dist/tag/index.d.ts +2 -2
  297. package/dist/tag/index.d.ts.map +1 -1
  298. package/dist/textfield/createTextField.d.ts +17 -11
  299. package/dist/textfield/createTextField.d.ts.map +1 -1
  300. package/dist/textfield/index.d.ts +1 -1
  301. package/dist/textfield/index.d.ts.map +1 -1
  302. package/dist/toast/createToast.d.ts +6 -2
  303. package/dist/toast/createToast.d.ts.map +1 -1
  304. package/dist/toast/createToastRegion.d.ts +5 -3
  305. package/dist/toast/createToastRegion.d.ts.map +1 -1
  306. package/dist/toast/index.d.ts +2 -2
  307. package/dist/toast/index.d.ts.map +1 -1
  308. package/dist/toggle/createToggle.d.ts +9 -9
  309. package/dist/toggle/createToggle.d.ts.map +1 -1
  310. package/dist/toggle/createToggleState.d.ts +2 -2
  311. package/dist/toggle/createToggleState.d.ts.map +1 -1
  312. package/dist/toggle/index.d.ts +4 -4
  313. package/dist/toggle/index.d.ts.map +1 -1
  314. package/dist/toolbar/createToolbar.d.ts +9 -9
  315. package/dist/toolbar/createToolbar.d.ts.map +1 -1
  316. package/dist/toolbar/index.d.ts +1 -1
  317. package/dist/toolbar/index.d.ts.map +1 -1
  318. package/dist/tooltip/createTooltip.d.ts +5 -5
  319. package/dist/tooltip/createTooltip.d.ts.map +1 -1
  320. package/dist/tooltip/createTooltipTrigger.d.ts +10 -5
  321. package/dist/tooltip/createTooltipTrigger.d.ts.map +1 -1
  322. package/dist/tooltip/index.d.ts +2 -2
  323. package/dist/tree/createTree.d.ts +3 -3
  324. package/dist/tree/createTree.d.ts.map +1 -1
  325. package/dist/tree/createTreeItem.d.ts +4 -4
  326. package/dist/tree/createTreeItem.d.ts.map +1 -1
  327. package/dist/tree/createTreeSelectionCheckbox.d.ts +3 -3
  328. package/dist/tree/createTreeSelectionCheckbox.d.ts.map +1 -1
  329. package/dist/tree/index.d.ts +4 -4
  330. package/dist/tree/types.d.ts +13 -5
  331. package/dist/tree/types.d.ts.map +1 -1
  332. package/dist/utils/createDescription.d.ts +2 -2
  333. package/dist/utils/createDescription.d.ts.map +1 -1
  334. package/dist/utils/dom.d.ts.map +1 -1
  335. package/dist/utils/env.d.ts +1 -1
  336. package/dist/utils/env.d.ts.map +1 -1
  337. package/dist/utils/focus.d.ts +1 -1
  338. package/dist/utils/focus.d.ts.map +1 -1
  339. package/dist/utils/geometry.d.ts.map +1 -1
  340. package/dist/utils/index.d.ts +12 -12
  341. package/dist/utils/index.d.ts.map +1 -1
  342. package/dist/utils/mergeProps.d.ts.map +1 -1
  343. package/dist/utils/platform.d.ts.map +1 -1
  344. package/dist/utils/reactivity.d.ts +1 -1
  345. package/dist/visually-hidden/createVisuallyHidden.d.ts +2 -2
  346. package/dist/visually-hidden/createVisuallyHidden.d.ts.map +1 -1
  347. package/dist/visually-hidden/index.d.ts +1 -1
  348. package/package.json +34 -32
  349. package/src/actiongroup/createActionGroup.ts +334 -0
  350. package/src/actiongroup/index.ts +8 -0
  351. package/src/autocomplete/createAutocomplete.ts +137 -131
  352. package/src/autocomplete/index.ts +1 -1
  353. package/src/breadcrumbs/createBreadcrumbs.ts +37 -51
  354. package/src/breadcrumbs/index.ts +1 -1
  355. package/src/button/createButton.ts +102 -73
  356. package/src/button/createToggleButton.ts +10 -10
  357. package/src/button/createToggleButtonGroup.ts +121 -0
  358. package/src/button/index.ts +10 -4
  359. package/src/button/types.ts +18 -12
  360. package/src/calendar/createCalendar.ts +62 -29
  361. package/src/calendar/createCalendarCell.ts +102 -48
  362. package/src/calendar/createCalendarGrid.ts +78 -47
  363. package/src/calendar/createRangeCalendar.ts +66 -31
  364. package/src/calendar/createRangeCalendarCell.ts +115 -37
  365. package/src/calendar/index.ts +5 -9
  366. package/src/calendar/intl/index.ts +210 -0
  367. package/src/calendar/utils.ts +227 -0
  368. package/src/checkbox/createCheckbox.ts +13 -21
  369. package/src/checkbox/createCheckboxGroup.ts +86 -45
  370. package/src/checkbox/createCheckboxGroupItem.ts +16 -27
  371. package/src/checkbox/createCheckboxGroupState.ts +3 -22
  372. package/src/checkbox/index.ts +8 -10
  373. package/src/collections/index.ts +246 -0
  374. package/src/color/createColorArea.ts +458 -314
  375. package/src/color/createColorField.ts +186 -137
  376. package/src/color/createColorSlider.ts +444 -197
  377. package/src/color/createColorSwatch.ts +65 -40
  378. package/src/color/createColorWheel.ts +343 -208
  379. package/src/color/index.ts +24 -24
  380. package/src/color/types.ts +198 -116
  381. package/src/combobox/createComboBox.ts +727 -647
  382. package/src/combobox/index.ts +6 -6
  383. package/src/combobox/intl/index.ts +5 -5
  384. package/src/datepicker/createDateField.ts +192 -39
  385. package/src/datepicker/createDatePicker.ts +294 -63
  386. package/src/datepicker/createDatePickerGroup.ts +149 -0
  387. package/src/datepicker/createDateRangePicker.ts +294 -0
  388. package/src/datepicker/createDateSegment.ts +316 -75
  389. package/src/datepicker/createTimeField.ts +38 -34
  390. package/src/datepicker/createTimeSegment.ts +352 -0
  391. package/src/datepicker/index.ts +24 -11
  392. package/src/dialog/createDialog.ts +127 -120
  393. package/src/dialog/index.ts +2 -2
  394. package/src/dialog/types.ts +19 -19
  395. package/src/disclosure/createDisclosure.ts +138 -33
  396. package/src/disclosure/createDisclosureGroup.ts +8 -18
  397. package/src/disclosure/index.ts +2 -2
  398. package/src/dnd/createDrag.ts +218 -209
  399. package/src/dnd/createDraggableCollection.ts +96 -63
  400. package/src/dnd/createDraggableItem.ts +260 -243
  401. package/src/dnd/createDrop.ts +313 -321
  402. package/src/dnd/createDroppableCollection.ts +799 -293
  403. package/src/dnd/createDroppableItem.ts +215 -213
  404. package/src/dnd/index.ts +66 -47
  405. package/src/dnd/types.ts +86 -89
  406. package/src/dnd/utils.ts +281 -294
  407. package/src/focus/FocusScope.tsx +155 -164
  408. package/src/focus/createAutoFocus.ts +305 -321
  409. package/src/focus/createFocusRestore.ts +300 -313
  410. package/src/focus/createVirtualFocus.ts +380 -396
  411. package/src/focus/index.ts +4 -8
  412. package/src/form/createFormReset.ts +4 -4
  413. package/src/form/createFormValidation.ts +201 -224
  414. package/src/form/index.ts +8 -11
  415. package/src/grid/GridKeyboardDelegate.ts +30 -30
  416. package/src/grid/createGrid.ts +38 -36
  417. package/src/grid/createGridCell.ts +18 -18
  418. package/src/grid/createGridRow.ts +14 -14
  419. package/src/grid/index.ts +5 -5
  420. package/src/grid/types.ts +8 -8
  421. package/src/gridlist/createGridList.ts +45 -24
  422. package/src/gridlist/createGridListItem.ts +68 -23
  423. package/src/gridlist/createGridListSelectionCheckbox.ts +12 -9
  424. package/src/gridlist/index.ts +4 -4
  425. package/src/gridlist/types.ts +11 -7
  426. package/src/i18n/createCollator.ts +66 -79
  427. package/src/i18n/createDateFormatter.ts +75 -83
  428. package/src/i18n/createFilter.ts +118 -131
  429. package/src/i18n/createNumberFormatter.ts +50 -52
  430. package/src/i18n/createStringFormatter.ts +19 -15
  431. package/src/i18n/index.ts +37 -40
  432. package/src/i18n/locale.tsx +163 -188
  433. package/src/i18n/utils.ts +95 -99
  434. package/src/index.ts +114 -164
  435. package/src/interactions/FocusableProvider.tsx +3 -7
  436. package/src/interactions/PressEvent.ts +4 -4
  437. package/src/interactions/createFocus.ts +16 -11
  438. package/src/interactions/createFocusRing.ts +21 -19
  439. package/src/interactions/createFocusWithin.ts +24 -16
  440. package/src/interactions/createFocusable.ts +15 -16
  441. package/src/interactions/createHover.ts +70 -55
  442. package/src/interactions/createInteractionModality.ts +75 -82
  443. package/src/interactions/createKeyboard.ts +2 -2
  444. package/src/interactions/createLongPress.ts +174 -174
  445. package/src/interactions/createMove.ts +299 -289
  446. package/src/interactions/createPress.ts +168 -91
  447. package/src/interactions/index.ts +24 -16
  448. package/src/label/createField.ts +18 -19
  449. package/src/label/createLabel.ts +18 -30
  450. package/src/label/createLabels.ts +8 -12
  451. package/src/label/index.ts +5 -5
  452. package/src/landmark/createLandmark.ts +356 -377
  453. package/src/landmark/index.ts +8 -8
  454. package/src/link/createLink.ts +96 -54
  455. package/src/link/index.ts +1 -1
  456. package/src/listbox/createListBox.ts +319 -269
  457. package/src/listbox/createOption.ts +208 -151
  458. package/src/listbox/index.ts +8 -12
  459. package/src/live-announcer/announce.ts +295 -322
  460. package/src/live-announcer/index.ts +9 -9
  461. package/src/menu/createMenu.ts +434 -396
  462. package/src/menu/createMenuItem.ts +201 -149
  463. package/src/menu/createMenuTrigger.ts +88 -88
  464. package/src/menu/index.ts +9 -18
  465. package/src/meter/createMeter.ts +7 -20
  466. package/src/meter/index.ts +1 -1
  467. package/src/numberfield/createNumberField.ts +368 -268
  468. package/src/numberfield/index.ts +5 -5
  469. package/src/overlays/ariaHideOutside.ts +223 -219
  470. package/src/overlays/createInteractOutside.ts +152 -149
  471. package/src/overlays/createModal.tsx +238 -202
  472. package/src/overlays/createOverlay.ts +195 -155
  473. package/src/overlays/createOverlayTrigger.ts +85 -85
  474. package/src/overlays/createPreventScroll.ts +288 -266
  475. package/src/overlays/index.ts +37 -44
  476. package/src/popover/calculatePosition.ts +117 -119
  477. package/src/popover/createOverlayPosition.ts +52 -43
  478. package/src/popover/createPopover.ts +63 -24
  479. package/src/popover/index.ts +3 -3
  480. package/src/progress/createProgressBar.ts +36 -32
  481. package/src/progress/index.ts +1 -1
  482. package/src/radio/createRadio.ts +95 -73
  483. package/src/radio/createRadioGroup.ts +142 -62
  484. package/src/radio/createRadioGroupState.ts +7 -31
  485. package/src/radio/index.ts +3 -8
  486. package/src/searchfield/createSearchField.ts +269 -186
  487. package/src/searchfield/index.ts +2 -2
  488. package/src/select/createHiddenSelect.tsx +276 -236
  489. package/src/select/createSelect.ts +430 -395
  490. package/src/select/index.ts +9 -14
  491. package/src/selection/createTypeSelect.ts +11 -11
  492. package/src/selection/index.ts +1 -1
  493. package/src/separator/createSeparator.ts +20 -25
  494. package/src/separator/index.ts +1 -1
  495. package/src/slider/createSlider.ts +333 -349
  496. package/src/slider/index.ts +2 -2
  497. package/src/ssr/index.tsx +331 -370
  498. package/src/steplist/createStepList.ts +106 -0
  499. package/src/steplist/index.ts +8 -0
  500. package/src/switch/createSwitch.ts +9 -14
  501. package/src/switch/index.ts +1 -1
  502. package/src/table/createTable.ts +155 -86
  503. package/src/table/createTableCell.ts +17 -16
  504. package/src/table/createTableColumnHeader.ts +67 -20
  505. package/src/table/createTableColumnResize.ts +256 -0
  506. package/src/table/createTableHeaderRow.ts +7 -7
  507. package/src/table/createTableRow.ts +149 -29
  508. package/src/table/createTableRowGroup.ts +5 -7
  509. package/src/table/createTableSelectAllCheckbox.ts +12 -11
  510. package/src/table/createTableSelectionCheckbox.ts +8 -8
  511. package/src/table/index.ts +14 -9
  512. package/src/table/types.ts +15 -7
  513. package/src/tabs/createTabs.ts +138 -127
  514. package/src/tabs/index.ts +1 -1
  515. package/src/tag/createTag.ts +171 -40
  516. package/src/tag/createTagGroup.ts +50 -39
  517. package/src/tag/index.ts +2 -6
  518. package/src/textfield/createTextField.ts +67 -35
  519. package/src/textfield/index.ts +1 -5
  520. package/src/toast/createToast.ts +34 -26
  521. package/src/toast/createToastRegion.ts +169 -27
  522. package/src/toast/index.ts +2 -6
  523. package/src/toggle/createToggle.ts +95 -53
  524. package/src/toggle/createToggleState.ts +2 -10
  525. package/src/toggle/index.ts +4 -5
  526. package/src/toolbar/createToolbar.ts +226 -169
  527. package/src/toolbar/index.ts +1 -1
  528. package/src/tooltip/createTooltip.ts +66 -79
  529. package/src/tooltip/createTooltipTrigger.ts +238 -222
  530. package/src/tooltip/index.ts +6 -6
  531. package/src/tree/createTree.ts +259 -246
  532. package/src/tree/createTreeItem.ts +282 -233
  533. package/src/tree/createTreeSelectionCheckbox.ts +71 -68
  534. package/src/tree/index.ts +16 -16
  535. package/src/tree/types.ts +95 -87
  536. package/src/utils/createDescription.ts +6 -23
  537. package/src/utils/dom.ts +61 -54
  538. package/src/utils/env.ts +53 -54
  539. package/src/utils/events.ts +7 -7
  540. package/src/utils/filterDOMProps.ts +49 -49
  541. package/src/utils/focus.ts +60 -68
  542. package/src/utils/geometry.ts +1 -4
  543. package/src/utils/globalListeners.ts +9 -9
  544. package/src/utils/index.ts +12 -22
  545. package/src/utils/mergeProps.ts +42 -15
  546. package/src/utils/platform.ts +16 -6
  547. package/src/utils/reactivity.ts +3 -3
  548. package/src/utils/textSelection.ts +16 -16
  549. package/src/visually-hidden/createVisuallyHidden.ts +127 -124
  550. package/src/visually-hidden/index.ts +6 -6
  551. package/dist/i18n/NumberFormatter.d.ts +0 -43
  552. package/dist/i18n/NumberFormatter.d.ts.map +0 -1
  553. package/dist/index.ssr.js +0 -15875
  554. package/dist/index.ssr.js.map +0 -7
  555. package/src/i18n/NumberFormatter.ts +0 -266
@@ -1,293 +1,799 @@
1
- /**
2
- * createDroppableCollection - ARIA hook for droppable collection targets.
3
- *
4
- * Provides accessibility support for dropping items into a collection
5
- * component like ListBox, GridList, or Table.
6
- */
7
-
8
- import { createMemo, onCleanup, type Accessor } from 'solid-js';
9
- import type { JSX } from 'solid-js';
10
- import type {
11
- DroppableCollectionState,
12
- DropTarget,
13
- DropOperation,
14
- DropItem,
15
- DragTypes,
16
- } from '@proyecto-viviana/solid-stately';
17
- import { createDrop } from './createDrop';
18
- import { getGlobalDraggingCollectionRef } from './createDraggableCollection';
19
-
20
- // Global state for tracking the drop collection
21
- let globalDropCollectionRef: HTMLElement | null = null;
22
-
23
- export function setGlobalDropCollectionRef(ref: HTMLElement | null): void {
24
- globalDropCollectionRef = ref;
25
- }
26
-
27
- export function getGlobalDropCollectionRef(): HTMLElement | null {
28
- return globalDropCollectionRef;
29
- }
30
-
31
- export interface DropTargetDelegate {
32
- /**
33
- * Returns a drop target from a point within the collection.
34
- */
35
- getDropTargetFromPoint(
36
- x: number,
37
- y: number,
38
- isValidDropTarget: (target: DropTarget) => boolean
39
- ): DropTarget | null;
40
- }
41
-
42
- export interface DroppableCollectionOptions {
43
- /** Reference to the collection element. */
44
- ref: Accessor<HTMLElement | null>;
45
- /** A delegate that provides drop targets for pointer coordinates. */
46
- dropTargetDelegate: DropTargetDelegate;
47
- /** Handler called when items are dropped to be inserted. */
48
- onInsert?: (e: {
49
- items: DropItem[];
50
- target: DropTarget;
51
- dropOperation: DropOperation;
52
- }) => void;
53
- /** Handler called when items are dropped on the root. */
54
- onRootDrop?: (e: { items: DropItem[]; dropOperation: DropOperation }) => void;
55
- /** Handler called when items are dropped on an item. */
56
- onItemDrop?: (e: {
57
- items: DropItem[];
58
- target: DropTarget;
59
- dropOperation: DropOperation;
60
- isInternal: boolean;
61
- }) => void;
62
- /** Handler called when items are reordered within the collection. */
63
- onReorder?: (e: {
64
- keys: Set<string | number>;
65
- target: DropTarget;
66
- dropOperation: DropOperation;
67
- }) => void;
68
- /** Handler called when items are moved within/between collections. */
69
- onMove?: (e: {
70
- keys: Set<string | number>;
71
- target: DropTarget;
72
- dropOperation: DropOperation;
73
- }) => void;
74
- /** Handler called when the drop target is activated (held over). */
75
- onDropActivate?: (e: { target: DropTarget; x: number; y: number }) => void;
76
- /** Whether the collection is disabled for dropping. */
77
- isDisabled?: boolean;
78
- /** Accepted drag types. 'all' accepts any type. */
79
- acceptedDragTypes?: 'all' | string[];
80
- }
81
-
82
- export interface DroppableCollectionAria {
83
- /** Props to spread on the collection element. */
84
- collectionProps: JSX.HTMLAttributes<HTMLElement>;
85
- }
86
-
87
- /**
88
- * Creates ARIA support for a droppable collection.
89
- *
90
- * @param options - Collection options accessor
91
- * @param state - Droppable collection state
92
- * @returns Droppable collection ARIA result
93
- */
94
- export function createDroppableCollection(
95
- options: Accessor<DroppableCollectionOptions>,
96
- state: DroppableCollectionState
97
- ): DroppableCollectionAria {
98
- const getOptions = createMemo(() => options());
99
-
100
- // Track the next target during drag operations
101
- let nextTarget: DropTarget | null = null;
102
- let currentDropOperation: DropOperation | null = null;
103
-
104
- const isInternalDropOperation = (): boolean => {
105
- const ref = getOptions().ref();
106
- const draggingRef = getGlobalDraggingCollectionRef();
107
- return ref !== null && draggingRef === ref;
108
- };
109
-
110
- const getDropOperationForTarget = (
111
- target: DropTarget,
112
- types: DragTypes,
113
- allowedOperations: DropOperation[]
114
- ): DropOperation => {
115
- return state.getDropOperation(target, types, allowedOperations);
116
- };
117
-
118
- // Create base drop behavior
119
- const drop = createDrop(() => ({
120
- isDisabled: getOptions().isDisabled,
121
- getDropOperationForPoint: (types, allowedOperations, x, y) => {
122
- const opts = getOptions();
123
- const isValidDropTarget = (target: DropTarget) =>
124
- getDropOperationForTarget(target, types, allowedOperations) !== 'cancel';
125
-
126
- const target = opts.dropTargetDelegate.getDropTargetFromPoint(
127
- x,
128
- y,
129
- isValidDropTarget
130
- );
131
-
132
- if (!target) {
133
- currentDropOperation = 'cancel';
134
- nextTarget = null;
135
- return 'cancel';
136
- }
137
-
138
- currentDropOperation = getDropOperationForTarget(
139
- target,
140
- types,
141
- allowedOperations
142
- );
143
-
144
- // If target doesn't accept, try root
145
- if (currentDropOperation === 'cancel') {
146
- const rootTarget: DropTarget = { type: 'root' };
147
- const rootOp = getDropOperationForTarget(
148
- rootTarget,
149
- types,
150
- allowedOperations
151
- );
152
- if (rootOp !== 'cancel') {
153
- nextTarget = rootTarget;
154
- currentDropOperation = rootOp;
155
- return currentDropOperation;
156
- }
157
- }
158
-
159
- // Update drop collection ref
160
- const ref = opts.ref();
161
- if (target && currentDropOperation !== 'cancel' && ref !== globalDropCollectionRef) {
162
- setGlobalDropCollectionRef(ref);
163
- }
164
-
165
- nextTarget = currentDropOperation === 'cancel' ? null : target;
166
- return currentDropOperation;
167
- },
168
- onDropEnter: () => {
169
- if (nextTarget) {
170
- state.setTarget(nextTarget);
171
- }
172
- },
173
- onDropMove: () => {
174
- if (nextTarget) {
175
- state.setTarget(nextTarget);
176
- }
177
- },
178
- onDropExit: () => {
179
- setGlobalDropCollectionRef(null);
180
- state.setTarget(null);
181
- },
182
- onDropActivate: (e) => {
183
- const opts = getOptions();
184
- if (state.target?.type === 'item' && typeof opts.onDropActivate === 'function') {
185
- opts.onDropActivate({
186
- target: state.target,
187
- x: e.x,
188
- y: e.y,
189
- });
190
- }
191
- },
192
- onDrop: (e) => {
193
- const opts = getOptions();
194
- setGlobalDropCollectionRef(opts.ref());
195
-
196
- if (state.target) {
197
- handleDrop(e.items, state.target, e.dropOperation);
198
- }
199
- },
200
- }));
201
-
202
- const handleDrop = async (
203
- items: DropItem[],
204
- target: DropTarget,
205
- dropOperation: DropOperation
206
- ) => {
207
- const opts = getOptions();
208
- const isInternal = isInternalDropOperation();
209
-
210
- // Filter items by accepted types
211
- let filteredItems = items;
212
- const acceptedTypes = opts.acceptedDragTypes;
213
- if (acceptedTypes && acceptedTypes !== 'all') {
214
- filteredItems = items.filter((item) => {
215
- const itemTypes =
216
- item.kind === 'file'
217
- ? new Set([item.type])
218
- : item.kind === 'text'
219
- ? item.types
220
- : new Set<string>();
221
- return acceptedTypes.some((type) => itemTypes.has(type));
222
- });
223
- }
224
-
225
- if (filteredItems.length === 0) return;
226
-
227
- // Call appropriate handlers based on target type
228
- if (target.type === 'root' && opts.onRootDrop) {
229
- await opts.onRootDrop({ items: filteredItems, dropOperation });
230
- }
231
-
232
- if (target.type === 'item') {
233
- if (target.dropPosition === 'on' && opts.onItemDrop) {
234
- await opts.onItemDrop({
235
- items: filteredItems,
236
- target,
237
- dropOperation,
238
- isInternal,
239
- });
240
- }
241
-
242
- // Handle move for internal operations
243
- if (opts.onMove && isInternal) {
244
- // Would get dragging keys from global state
245
- await opts.onMove({
246
- keys: new Set(),
247
- target,
248
- dropOperation,
249
- });
250
- }
251
-
252
- if (target.dropPosition !== 'on') {
253
- if (!isInternal && opts.onInsert) {
254
- await opts.onInsert({
255
- items: filteredItems,
256
- target,
257
- dropOperation,
258
- });
259
- }
260
-
261
- if (isInternal && opts.onReorder) {
262
- // Would get dragging keys from global state
263
- await opts.onReorder({
264
- keys: new Set(),
265
- target,
266
- dropOperation,
267
- });
268
- }
269
- }
270
- }
271
- };
272
-
273
- // Clean up on unmount
274
- onCleanup(() => {
275
- const ref = getOptions().ref();
276
- if (globalDropCollectionRef === ref) {
277
- setGlobalDropCollectionRef(null);
278
- }
279
- });
280
-
281
- const collectionProps = createMemo(() => {
282
- const baseDropProps = drop.dropProps;
283
- return {
284
- ...baseDropProps,
285
- };
286
- });
287
-
288
- return {
289
- get collectionProps() {
290
- return collectionProps() as DroppableCollectionAria['collectionProps'];
291
- },
292
- };
293
- }
1
+ /**
2
+ * createDroppableCollection - ARIA hook for droppable collection targets.
3
+ *
4
+ * Provides accessibility support for dropping items into a collection
5
+ * component like ListBox, GridList, or Table.
6
+ */
7
+
8
+ import { createMemo, onCleanup, type Accessor } from "solid-js";
9
+ import type { JSX } from "solid-js";
10
+ import type {
11
+ DroppableCollectionState,
12
+ DropTarget,
13
+ DropOperation,
14
+ DropItem,
15
+ DragTypes,
16
+ Key,
17
+ } from "@proyecto-viviana/solid-stately";
18
+ import { DIRECTORY_DRAG_TYPE } from "@proyecto-viviana/solid-stately";
19
+ import { createDrop } from "./createDrop";
20
+ import {
21
+ getGlobalDraggingCollectionRef,
22
+ getGlobalDraggingKeys,
23
+ getGlobalDraggingTypes,
24
+ } from "./createDraggableCollection";
25
+ import { getGlobalAllowedDropOperations, DROP_OPERATION } from "./utils";
26
+
27
+ // Global state for tracking the drop collection
28
+ let globalDropCollectionRef: HTMLElement | null = null;
29
+
30
+ export function setGlobalDropCollectionRef(ref: HTMLElement | null): void {
31
+ globalDropCollectionRef = ref;
32
+ }
33
+
34
+ export function getGlobalDropCollectionRef(): HTMLElement | null {
35
+ return globalDropCollectionRef;
36
+ }
37
+
38
+ export interface DropTargetDelegate {
39
+ /**
40
+ * Returns a drop target from a point within the collection.
41
+ */
42
+ getDropTargetFromPoint(
43
+ x: number,
44
+ y: number,
45
+ isValidDropTarget: (target: DropTarget) => boolean,
46
+ ): DropTarget | null;
47
+ /**
48
+ * Returns the next keyboard-navigable drop target.
49
+ */
50
+ getKeyboardNavigationTarget?(
51
+ target: DropTarget | null,
52
+ direction: "next" | "previous",
53
+ isValidDropTarget: (target: DropTarget) => boolean,
54
+ ): DropTarget | null;
55
+ /**
56
+ * Returns the next page-navigable drop target.
57
+ */
58
+ getKeyboardPageNavigationTarget?(
59
+ target: DropTarget | null,
60
+ direction: "next" | "previous",
61
+ isValidDropTarget: (target: DropTarget) => boolean,
62
+ ): DropTarget | null;
63
+ }
64
+
65
+ export interface KeyboardDelegateLike {
66
+ getFirstKey?: () => string | number | null;
67
+ getLastKey?: () => string | number | null;
68
+ getKeyBelow?: (key: string | number) => string | number | null;
69
+ getKeyAbove?: (key: string | number) => string | number | null;
70
+ getKeyRightOf?: (key: string | number) => string | number | null;
71
+ getKeyLeftOf?: (key: string | number) => string | number | null;
72
+ getKeyPageBelow?: (key: string | number) => string | number | null;
73
+ getKeyPageAbove?: (key: string | number) => string | number | null;
74
+ }
75
+
76
+ interface CollectionNodeLike {
77
+ type?: string;
78
+ key: Key;
79
+ parentKey?: Key | null;
80
+ childNodes?: CollectionNodeLike[];
81
+ isExpanded?: boolean;
82
+ }
83
+
84
+ interface CollectionLike {
85
+ getItem(key: Key): CollectionNodeLike | null;
86
+ [Symbol.iterator](): Iterator<CollectionNodeLike>;
87
+ }
88
+
89
+ export interface DroppableCollectionOptions {
90
+ /** Reference to the collection element. */
91
+ ref: Accessor<HTMLElement | null>;
92
+ /** A delegate that provides drop targets for pointer coordinates. */
93
+ dropTargetDelegate: DropTargetDelegate;
94
+ /** Handler called when items are dropped to be inserted. */
95
+ onInsert?: (e: { items: DropItem[]; target: DropTarget; dropOperation: DropOperation }) => void;
96
+ /** Handler called when items are dropped on the root. */
97
+ onRootDrop?: (e: { items: DropItem[]; dropOperation: DropOperation }) => void;
98
+ /** Handler called when items are dropped on an item. */
99
+ onItemDrop?: (e: {
100
+ items: DropItem[];
101
+ target: DropTarget;
102
+ dropOperation: DropOperation;
103
+ isInternal: boolean;
104
+ }) => void;
105
+ /** Handler called when items are reordered within the collection. */
106
+ onReorder?: (e: {
107
+ keys: Set<string | number>;
108
+ target: DropTarget;
109
+ dropOperation: DropOperation;
110
+ }) => void;
111
+ /** Handler called when items are moved within/between collections. */
112
+ onMove?: (e: {
113
+ keys: Set<string | number>;
114
+ target: DropTarget;
115
+ dropOperation: DropOperation;
116
+ }) => void;
117
+ /** Handler called when a drop occurs on any collection target. */
118
+ onDrop?: (e: {
119
+ items: DropItem[];
120
+ target: DropTarget;
121
+ dropOperation: DropOperation;
122
+ x: number;
123
+ y: number;
124
+ }) => void;
125
+ /** Handler called when the drop target is activated (held over). */
126
+ onDropActivate?: (e: { target: DropTarget; x: number; y: number }) => void;
127
+ /** Optional keyboard delegate used as fallback when drop-target delegates do not provide keyboard navigation methods. */
128
+ keyboardDelegate?: KeyboardDelegateLike;
129
+ /** Optional keyboard handler composed with internal drop target navigation keys. */
130
+ onKeyDown?: (e: KeyboardEvent) => void;
131
+ /** Collection snapshot used to restore focus and selection after a drop mutates items. */
132
+ collection?: CollectionLike;
133
+ /** Current collection selection used to avoid replacing user-updated selection after a drop. */
134
+ selectedKeys?: "all" | Iterable<Key>;
135
+ /** Sets collection selection after a drop when new rows were inserted and selection was unchanged. */
136
+ setSelectedKeys?: (keys: Set<Key>) => void;
137
+ /** Sets collection focus after a drop when new rows were inserted. */
138
+ setFocusedKey?: (key: Key | null) => void;
139
+ /** Whether the collection is disabled for dropping. */
140
+ isDisabled?: boolean;
141
+ /** Accepted drag types. 'all' accepts any type. */
142
+ acceptedDragTypes?: "all" | Array<string | symbol>;
143
+ }
144
+
145
+ export function getDropItemTypes(item: DropItem): Set<string | symbol> {
146
+ if (item.kind === "file") {
147
+ return new Set([item.type]);
148
+ }
149
+ if (item.kind === "text") {
150
+ return new Set(item.types);
151
+ }
152
+ return new Set([DIRECTORY_DRAG_TYPE]);
153
+ }
154
+
155
+ export interface DroppableCollectionAria {
156
+ /** Props to spread on the collection element. */
157
+ collectionProps: JSX.HTMLAttributes<HTMLElement>;
158
+ }
159
+
160
+ /**
161
+ * Creates ARIA support for a droppable collection.
162
+ *
163
+ * @param options - Collection options accessor
164
+ * @param state - Droppable collection state
165
+ * @returns Droppable collection ARIA result
166
+ */
167
+ export function createDroppableCollection(
168
+ options: Accessor<DroppableCollectionOptions>,
169
+ state: DroppableCollectionState,
170
+ ): DroppableCollectionAria {
171
+ const getOptions = createMemo(() => options());
172
+
173
+ // Track the next target during drag operations
174
+ let nextTarget: DropTarget | null = null;
175
+ let currentDropOperation: DropOperation | null = null;
176
+
177
+ const isInternalDropOperation = (): boolean => {
178
+ const ref = getOptions().ref();
179
+ const draggingRef = getGlobalDraggingCollectionRef();
180
+ return ref !== null && draggingRef === ref;
181
+ };
182
+
183
+ const getDropOperationForTarget = (
184
+ target: DropTarget,
185
+ types: DragTypes,
186
+ allowedOperations: DropOperation[],
187
+ ): DropOperation => {
188
+ return state.getDropOperation(target, types, allowedOperations);
189
+ };
190
+
191
+ // Create base drop behavior
192
+ const drop = createDrop(() => ({
193
+ isDisabled: getOptions().isDisabled,
194
+ getDropOperationForPoint: (types, allowedOperations, x, y) => {
195
+ const opts = getOptions();
196
+ const isValidDropTarget = (target: DropTarget) =>
197
+ getDropOperationForTarget(target, types, allowedOperations) !== "cancel";
198
+
199
+ const target = opts.dropTargetDelegate.getDropTargetFromPoint(x, y, isValidDropTarget);
200
+
201
+ if (!target) {
202
+ currentDropOperation = "cancel";
203
+ nextTarget = null;
204
+ return "cancel";
205
+ }
206
+
207
+ currentDropOperation = getDropOperationForTarget(target, types, allowedOperations);
208
+
209
+ // If target doesn't accept, try root
210
+ if (currentDropOperation === "cancel") {
211
+ const rootTarget: DropTarget = { type: "root" };
212
+ const rootOp = getDropOperationForTarget(rootTarget, types, allowedOperations);
213
+ if (rootOp !== "cancel") {
214
+ nextTarget = rootTarget;
215
+ currentDropOperation = rootOp;
216
+ return currentDropOperation;
217
+ }
218
+ }
219
+
220
+ // Update drop collection ref
221
+ const ref = opts.ref();
222
+ if (target && currentDropOperation !== "cancel" && ref !== globalDropCollectionRef) {
223
+ setGlobalDropCollectionRef(ref);
224
+ }
225
+
226
+ nextTarget = currentDropOperation === "cancel" ? null : target;
227
+ return currentDropOperation;
228
+ },
229
+ onDropEnter: () => {
230
+ if (nextTarget) {
231
+ state.setTarget(nextTarget);
232
+ }
233
+ },
234
+ onDropMove: () => {
235
+ if (nextTarget) {
236
+ state.setTarget(nextTarget);
237
+ }
238
+ },
239
+ onDropExit: () => {
240
+ setGlobalDropCollectionRef(null);
241
+ state.setTarget(null);
242
+ },
243
+ onDropActivate: (e) => {
244
+ const opts = getOptions();
245
+ if (
246
+ state.target?.type === "item" &&
247
+ state.target.dropPosition === "on" &&
248
+ typeof opts.onDropActivate === "function"
249
+ ) {
250
+ opts.onDropActivate({
251
+ target: state.target,
252
+ x: e.x,
253
+ y: e.y,
254
+ });
255
+ }
256
+ },
257
+ onDrop: (e) => {
258
+ const opts = getOptions();
259
+ setGlobalDropCollectionRef(opts.ref());
260
+
261
+ if (state.target) {
262
+ const target = state.target;
263
+ const previousCollection = opts.collection;
264
+ const previousSelectedKeys = normalizeSelection(opts.selectedKeys);
265
+ opts.onDrop?.({
266
+ items: e.items,
267
+ target,
268
+ dropOperation: e.dropOperation,
269
+ x: e.x,
270
+ y: e.y,
271
+ });
272
+ void Promise.resolve(handleDrop(e.items, target, e.dropOperation)).then(() => {
273
+ queueMicrotask(() => {
274
+ updateFocusAfterDrop(getOptions(), previousCollection, previousSelectedKeys, target);
275
+ });
276
+ });
277
+ }
278
+ },
279
+ }));
280
+
281
+ const handleDrop = async (
282
+ items: DropItem[],
283
+ target: DropTarget,
284
+ dropOperation: DropOperation,
285
+ ) => {
286
+ const opts = getOptions();
287
+ const isInternal = isInternalDropOperation();
288
+
289
+ // Filter items by accepted types
290
+ let filteredItems = items;
291
+ const acceptedTypes = opts.acceptedDragTypes;
292
+ if (acceptedTypes && acceptedTypes !== "all") {
293
+ filteredItems = items.filter((item) => {
294
+ const itemTypes = getDropItemTypes(item);
295
+ return acceptedTypes.some((type) => itemTypes.has(type));
296
+ });
297
+ }
298
+
299
+ if (filteredItems.length === 0) return;
300
+
301
+ // Call appropriate handlers based on target type
302
+ if (target.type === "root" && opts.onRootDrop) {
303
+ await opts.onRootDrop({ items: filteredItems, dropOperation });
304
+ }
305
+
306
+ if (target.type === "item") {
307
+ if (target.dropPosition === "on" && opts.onItemDrop) {
308
+ await opts.onItemDrop({
309
+ items: filteredItems,
310
+ target,
311
+ dropOperation,
312
+ isInternal,
313
+ });
314
+ }
315
+
316
+ // Handle move for internal operations
317
+ if (opts.onMove && isInternal) {
318
+ const draggingKeys = getGlobalDraggingKeys();
319
+ await opts.onMove({
320
+ keys: draggingKeys,
321
+ target,
322
+ dropOperation,
323
+ });
324
+ }
325
+
326
+ if (target.dropPosition !== "on") {
327
+ if (!isInternal && opts.onInsert) {
328
+ await opts.onInsert({
329
+ items: filteredItems,
330
+ target,
331
+ dropOperation,
332
+ });
333
+ }
334
+
335
+ if (isInternal && opts.onReorder) {
336
+ const draggingKeys = getGlobalDraggingKeys();
337
+ await opts.onReorder({
338
+ keys: draggingKeys,
339
+ target,
340
+ dropOperation,
341
+ });
342
+ }
343
+ }
344
+ }
345
+ };
346
+
347
+ // Clean up on unmount
348
+ onCleanup(() => {
349
+ const ref = getOptions().ref();
350
+ if (globalDropCollectionRef === ref) {
351
+ setGlobalDropCollectionRef(null);
352
+ }
353
+ });
354
+
355
+ const collectionProps = createMemo(() => {
356
+ const baseDropProps = drop.dropProps;
357
+ const onKeyDownBase = baseDropProps.onKeyDown as ((e: KeyboardEvent) => void) | undefined;
358
+ const onKeyDown = (e: KeyboardEvent): void => {
359
+ onKeyDownBase?.(e);
360
+ const opts = getOptions();
361
+ if (opts.isDisabled) return;
362
+ const resolveDirection = (): "ltr" | "rtl" => {
363
+ const refEl = opts.ref();
364
+ if (
365
+ refEl &&
366
+ typeof window !== "undefined" &&
367
+ typeof window.getComputedStyle === "function"
368
+ ) {
369
+ const computedDir = window.getComputedStyle(refEl).direction;
370
+ if (computedDir === "rtl") return "rtl";
371
+ }
372
+ return typeof document !== "undefined" && document.dir === "rtl" ? "rtl" : "ltr";
373
+ };
374
+ const isRtl = resolveDirection() === "rtl";
375
+ const forwardHorizontalKey = isRtl ? "ArrowLeft" : "ArrowRight";
376
+ const backwardHorizontalKey = isRtl ? "ArrowRight" : "ArrowLeft";
377
+ const callUserOnKeyDown = () => opts.onKeyDown?.(e);
378
+ const getKeyboardAllowedOperations = (): DropOperation[] => {
379
+ const allowedBits = getGlobalAllowedDropOperations();
380
+ if (!allowedBits) return ["copy", "move", "link"];
381
+ const allowed: DropOperation[] = [];
382
+ if (allowedBits & DROP_OPERATION.copy) allowed.push("copy");
383
+ if (allowedBits & DROP_OPERATION.move) allowed.push("move");
384
+ if (allowedBits & DROP_OPERATION.link) allowed.push("link");
385
+ return allowed.length > 0 ? allowed : ["copy", "move", "link"];
386
+ };
387
+ const getKeyboardDragTypes = (): DragTypes => {
388
+ const draggingTypes = getGlobalDraggingTypes();
389
+ if (draggingTypes.size === 0) {
390
+ return { has: () => true };
391
+ }
392
+ return {
393
+ has: (type: string | symbol) => typeof type === "string" && draggingTypes.has(type),
394
+ };
395
+ };
396
+ const isValidDropTarget = (target: DropTarget) =>
397
+ state.getDropOperation(target, getKeyboardDragTypes(), getKeyboardAllowedOperations()) !==
398
+ "cancel";
399
+ const targetsEqual = (a: DropTarget, b: DropTarget): boolean => {
400
+ if (a.type !== b.type) return false;
401
+ if (a.type === "root" && b.type === "root") return true;
402
+ if (a.type !== "item" || b.type !== "item") return false;
403
+ return a.key === b.key && a.dropPosition === b.dropPosition;
404
+ };
405
+ const findNextValidTarget = (
406
+ start: DropTarget | null,
407
+ getNext: (target: DropTarget | null) => DropTarget | null,
408
+ ): DropTarget | null => {
409
+ let current = start;
410
+ let seenRoot = 0;
411
+ let safety = 0;
412
+ while (safety < 256) {
413
+ safety += 1;
414
+ const next = getNext(current);
415
+ if (!next) return null;
416
+ if (current && targetsEqual(current, next)) {
417
+ return isValidDropTarget(next) ? next : null;
418
+ }
419
+ current = next;
420
+ if (next.type === "root") {
421
+ seenRoot += 1;
422
+ if (seenRoot >= 2) {
423
+ return isValidDropTarget(next) ? next : null;
424
+ }
425
+ }
426
+ if (isValidDropTarget(next)) return next;
427
+ }
428
+ return null;
429
+ };
430
+ const resolveTargetForKey = (
431
+ key: string | number | null,
432
+ direction: "next" | "previous",
433
+ ): DropTarget | null => {
434
+ if (key == null) return null;
435
+ const onTarget: DropTarget = { type: "item", key, dropPosition: "on" };
436
+ if (isValidDropTarget(onTarget)) return onTarget;
437
+ const insertionOrder: Array<"before" | "after"> =
438
+ direction === "next" ? ["before", "after"] : ["after", "before"];
439
+ for (const position of insertionOrder) {
440
+ const insertionTarget: DropTarget = { type: "item", key, dropPosition: position };
441
+ if (isValidDropTarget(insertionTarget)) return insertionTarget;
442
+ }
443
+ return null;
444
+ };
445
+ const resolveBoundaryTargetForDirection = (
446
+ key: string | number | null,
447
+ direction: "next" | "previous",
448
+ ): DropTarget | null => {
449
+ if (key == null) return null;
450
+ const boundaryOrder: Array<"before" | "on" | "after"> =
451
+ direction === "next" ? ["before", "on", "after"] : ["after", "on", "before"];
452
+ for (const position of boundaryOrder) {
453
+ const candidate: DropTarget = { type: "item", key, dropPosition: position };
454
+ if (isValidDropTarget(candidate)) return candidate;
455
+ }
456
+ return null;
457
+ };
458
+ const resolveFallbackKeyboardTarget = (
459
+ keyName: string,
460
+ currentTarget: DropTarget | null = state.target,
461
+ ): DropTarget | null => {
462
+ const keyboardDelegate = opts.keyboardDelegate;
463
+ if (!keyboardDelegate) return null;
464
+ const currentKey = currentTarget?.type === "item" ? currentTarget.key : null;
465
+ const keyForDirection = (
466
+ direction: "next" | "previous",
467
+ getter: ((key: string | number) => string | number | null) | undefined,
468
+ ): DropTarget | null => {
469
+ if (currentKey == null) {
470
+ const boundaryKey =
471
+ direction === "next"
472
+ ? keyboardDelegate.getFirstKey?.()
473
+ : keyboardDelegate.getLastKey?.();
474
+ return resolveBoundaryTargetForDirection(boundaryKey ?? null, direction);
475
+ }
476
+ if (!getter) return null;
477
+ let nextKey = getter(currentKey);
478
+ let safety = 0;
479
+ while (nextKey != null && safety < 256) {
480
+ const resolvedTarget = resolveTargetForKey(nextKey, direction);
481
+ if (resolvedTarget) return resolvedTarget;
482
+ const candidate = getter(nextKey);
483
+ if (candidate === nextKey) break;
484
+ nextKey = candidate;
485
+ safety += 1;
486
+ }
487
+ return null;
488
+ };
489
+
490
+ if (keyName === "ArrowDown") return keyForDirection("next", keyboardDelegate.getKeyBelow);
491
+ if (keyName === "ArrowUp") return keyForDirection("previous", keyboardDelegate.getKeyAbove);
492
+ if (keyName === forwardHorizontalKey) {
493
+ return keyForDirection(
494
+ "next",
495
+ isRtl ? keyboardDelegate.getKeyLeftOf : keyboardDelegate.getKeyRightOf,
496
+ );
497
+ }
498
+ if (keyName === backwardHorizontalKey) {
499
+ return keyForDirection(
500
+ "previous",
501
+ isRtl ? keyboardDelegate.getKeyRightOf : keyboardDelegate.getKeyLeftOf,
502
+ );
503
+ }
504
+ if (keyName === "Home")
505
+ return resolveBoundaryTargetForDirection(
506
+ keyboardDelegate.getFirstKey?.() ?? null,
507
+ "next",
508
+ );
509
+ if (keyName === "End")
510
+ return resolveBoundaryTargetForDirection(
511
+ keyboardDelegate.getLastKey?.() ?? null,
512
+ "previous",
513
+ );
514
+ if (keyName === "PageDown") {
515
+ if (currentKey != null && keyboardDelegate.getKeyPageBelow) {
516
+ return resolveTargetForKey(keyboardDelegate.getKeyPageBelow(currentKey), "next");
517
+ }
518
+ return keyForDirection("next", keyboardDelegate.getKeyBelow);
519
+ }
520
+ if (keyName === "PageUp") {
521
+ if (currentKey != null && keyboardDelegate.getKeyPageAbove) {
522
+ return resolveTargetForKey(keyboardDelegate.getKeyPageAbove(currentKey), "previous");
523
+ }
524
+ return keyForDirection("previous", keyboardDelegate.getKeyAbove);
525
+ }
526
+ return null;
527
+ };
528
+ const resolvePageTargetForState = (
529
+ direction: "next" | "previous",
530
+ currentTarget: DropTarget,
531
+ ): DropTarget | null => {
532
+ const keyboardDelegate = opts.keyboardDelegate;
533
+ if (!keyboardDelegate) return null;
534
+ if (direction === "next") {
535
+ let targetKey = keyboardDelegate.getFirstKey?.() ?? null;
536
+ let dropPosition: "before" | "on" | "after" = "after";
537
+ if (currentTarget.type === "item") {
538
+ targetKey = currentTarget.key;
539
+ dropPosition = currentTarget.dropPosition;
540
+ }
541
+ let nextKey =
542
+ targetKey != null ? (keyboardDelegate.getKeyPageBelow?.(targetKey) ?? null) : null;
543
+ if (
544
+ nextKey == null ||
545
+ (currentTarget.type === "item" && currentTarget.key === keyboardDelegate.getLastKey?.())
546
+ ) {
547
+ nextKey = keyboardDelegate.getLastKey?.() ?? null;
548
+ dropPosition = "after";
549
+ }
550
+ if (nextKey == null) return null;
551
+ return {
552
+ type: "item",
553
+ key: nextKey,
554
+ dropPosition,
555
+ };
556
+ }
557
+
558
+ if (currentTarget.type === "item") {
559
+ if (currentTarget.key === keyboardDelegate.getFirstKey?.()) {
560
+ return { type: "root" };
561
+ }
562
+ let nextKey = keyboardDelegate.getKeyPageAbove?.(currentTarget.key) ?? null;
563
+ let dropPosition: "before" | "on" | "after" = currentTarget.dropPosition;
564
+ if (nextKey == null) {
565
+ nextKey = keyboardDelegate.getFirstKey?.() ?? null;
566
+ dropPosition = "before";
567
+ }
568
+ if (nextKey == null) return null;
569
+ return {
570
+ type: "item",
571
+ key: nextKey,
572
+ dropPosition,
573
+ };
574
+ }
575
+
576
+ return currentTarget.type === "root" ? currentTarget : null;
577
+ };
578
+ if (e.key === "PageDown" || e.key === "PageUp") {
579
+ if (
580
+ (e.key === "PageDown" && !opts.keyboardDelegate?.getKeyPageBelow) ||
581
+ (e.key === "PageUp" && !opts.keyboardDelegate?.getKeyPageAbove)
582
+ ) {
583
+ callUserOnKeyDown();
584
+ return;
585
+ }
586
+ const direction = e.key === "PageDown" ? "next" : "previous";
587
+ const pageNavigation = opts.dropTargetDelegate.getKeyboardPageNavigationTarget;
588
+ const stepNavigation = opts.dropTargetDelegate.getKeyboardNavigationTarget;
589
+ const resolveStepTarget = (
590
+ target: DropTarget | null,
591
+ navDirection: "next" | "previous",
592
+ ): DropTarget | null =>
593
+ stepNavigation?.(target, navDirection, isValidDropTarget) ??
594
+ resolveFallbackKeyboardTarget(
595
+ navDirection === "next" ? "ArrowDown" : "ArrowUp",
596
+ target,
597
+ ) ??
598
+ resolveFallbackKeyboardTarget(navDirection === "next" ? "Home" : "End", target) ??
599
+ null;
600
+ let nextTarget: DropTarget | null = null;
601
+ if (!state.target) {
602
+ nextTarget = findNextValidTarget(null, (target) => resolveStepTarget(target, direction));
603
+ } else {
604
+ const pageTarget =
605
+ pageNavigation?.(state.target, direction, isValidDropTarget) ??
606
+ resolvePageTargetForState(direction, state.target) ??
607
+ null;
608
+ if (pageTarget && isValidDropTarget(pageTarget)) {
609
+ nextTarget = pageTarget;
610
+ } else {
611
+ const startTarget = pageTarget ?? state.target;
612
+ nextTarget =
613
+ findNextValidTarget(startTarget, (target) => resolveStepTarget(target, direction)) ??
614
+ findNextValidTarget(startTarget, (target) =>
615
+ resolveStepTarget(target, direction === "next" ? "previous" : "next"),
616
+ );
617
+ }
618
+ }
619
+ if (nextTarget) {
620
+ e.preventDefault();
621
+ state.setTarget(nextTarget);
622
+ }
623
+ callUserOnKeyDown();
624
+ return;
625
+ }
626
+ if (
627
+ (e.key === "ArrowDown" ||
628
+ e.key === "ArrowUp" ||
629
+ e.key === "ArrowRight" ||
630
+ e.key === "ArrowLeft" ||
631
+ e.key === "Home" ||
632
+ e.key === "End") &&
633
+ opts.dropTargetDelegate.getKeyboardNavigationTarget
634
+ ) {
635
+ if (
636
+ (e.key === "ArrowDown" && !opts.keyboardDelegate?.getKeyBelow) ||
637
+ (e.key === "ArrowUp" && !opts.keyboardDelegate?.getKeyAbove) ||
638
+ (e.key === "ArrowLeft" && !opts.keyboardDelegate?.getKeyLeftOf) ||
639
+ (e.key === "ArrowRight" && !opts.keyboardDelegate?.getKeyRightOf) ||
640
+ (e.key === "Home" && !opts.keyboardDelegate?.getFirstKey) ||
641
+ (e.key === "End" && !opts.keyboardDelegate?.getLastKey)
642
+ ) {
643
+ callUserOnKeyDown();
644
+ return;
645
+ }
646
+ const isForwardKey =
647
+ e.key === "ArrowDown" || e.key === forwardHorizontalKey || e.key === "Home";
648
+ const direction = isForwardKey ? "next" : "previous";
649
+ const navigationStart = e.key === "Home" || e.key === "End" ? null : state.target;
650
+ const nextTarget = findNextValidTarget(
651
+ navigationStart,
652
+ (target) =>
653
+ opts.dropTargetDelegate.getKeyboardNavigationTarget?.(
654
+ target,
655
+ direction,
656
+ isValidDropTarget,
657
+ ) ?? resolveFallbackKeyboardTarget(e.key, target),
658
+ );
659
+ if (nextTarget) {
660
+ e.preventDefault();
661
+ state.setTarget(nextTarget);
662
+ }
663
+ callUserOnKeyDown();
664
+ return;
665
+ }
666
+ if (
667
+ e.key === "ArrowDown" ||
668
+ e.key === "ArrowUp" ||
669
+ e.key === "ArrowRight" ||
670
+ e.key === "ArrowLeft" ||
671
+ e.key === "Home" ||
672
+ e.key === "End"
673
+ ) {
674
+ if (
675
+ (e.key === "ArrowDown" && !opts.keyboardDelegate?.getKeyBelow) ||
676
+ (e.key === "ArrowUp" && !opts.keyboardDelegate?.getKeyAbove) ||
677
+ (e.key === "ArrowLeft" && !opts.keyboardDelegate?.getKeyLeftOf) ||
678
+ (e.key === "ArrowRight" && !opts.keyboardDelegate?.getKeyRightOf) ||
679
+ (e.key === "Home" && !opts.keyboardDelegate?.getFirstKey) ||
680
+ (e.key === "End" && !opts.keyboardDelegate?.getLastKey)
681
+ ) {
682
+ callUserOnKeyDown();
683
+ return;
684
+ }
685
+ const navigationStart = e.key === "Home" || e.key === "End" ? null : state.target;
686
+ const nextTarget = findNextValidTarget(navigationStart, (target) =>
687
+ resolveFallbackKeyboardTarget(e.key, target),
688
+ );
689
+ if (nextTarget) {
690
+ e.preventDefault();
691
+ state.setTarget(nextTarget);
692
+ }
693
+ callUserOnKeyDown();
694
+ return;
695
+ }
696
+ if (e.key === "Enter" && state.target) {
697
+ e.preventDefault();
698
+ state.activateTarget(0, 0);
699
+ callUserOnKeyDown();
700
+ return;
701
+ }
702
+ if (e.key === "Escape" && state.target) {
703
+ e.preventDefault();
704
+ state.exitTarget(0, 0);
705
+ callUserOnKeyDown();
706
+ return;
707
+ }
708
+ callUserOnKeyDown();
709
+ };
710
+ return {
711
+ ...baseDropProps,
712
+ onKeyDown,
713
+ };
714
+ });
715
+
716
+ return {
717
+ get collectionProps() {
718
+ return collectionProps() as DroppableCollectionAria["collectionProps"];
719
+ },
720
+ };
721
+ }
722
+
723
+ function normalizeSelection(selection: "all" | Iterable<Key> | undefined): "all" | Set<Key> | null {
724
+ if (selection == null) return null;
725
+ if (selection === "all") return "all";
726
+ return new Set(selection);
727
+ }
728
+
729
+ function selectionEquals(a: "all" | Set<Key> | null, b: "all" | Set<Key> | null): boolean {
730
+ if (a === b) return true;
731
+ if (!a || !b || a === "all" || b === "all") return false;
732
+ if (a.size !== b.size) return false;
733
+ for (const key of a) {
734
+ if (!b.has(key)) return false;
735
+ }
736
+ return true;
737
+ }
738
+
739
+ function getNewItemKeys(collection: CollectionLike, previousCollection: CollectionLike): Set<Key> {
740
+ const keys = new Set<Key>();
741
+ const visit = (node: CollectionNodeLike) => {
742
+ if (node.type === "item" && !previousCollection.getItem(node.key)) {
743
+ keys.add(node.key);
744
+ }
745
+ for (const child of node.childNodes ?? []) {
746
+ visit(child);
747
+ }
748
+ };
749
+
750
+ for (const node of collection) {
751
+ visit(node);
752
+ }
753
+ return keys;
754
+ }
755
+
756
+ function updateFocusAfterDrop(
757
+ opts: DroppableCollectionOptions,
758
+ previousCollection: CollectionLike | undefined,
759
+ previousSelectedKeys: "all" | Set<Key> | null,
760
+ target: DropTarget,
761
+ ): void {
762
+ const collection = opts.collection;
763
+ if (!collection || !previousCollection) return;
764
+
765
+ const newKeys = getNewItemKeys(collection, previousCollection);
766
+ if (newKeys.size === 0) return;
767
+
768
+ const currentSelectedKeys = normalizeSelection(opts.selectedKeys);
769
+ if (
770
+ opts.setSelectedKeys &&
771
+ previousSelectedKeys &&
772
+ selectionEquals(previousSelectedKeys, currentSelectedKeys)
773
+ ) {
774
+ opts.setSelectedKeys(newKeys);
775
+ }
776
+
777
+ const first = newKeys.values().next().value;
778
+ if (first == null) return;
779
+
780
+ let focusKey: Key | null = first;
781
+ const item = collection.getItem(first);
782
+ const parent = item?.parentKey != null ? collection.getItem(item.parentKey) : null;
783
+ const isDroppedOnCollapsedParent =
784
+ target.type === "item" &&
785
+ target.dropPosition === "on" &&
786
+ item?.parentKey != null &&
787
+ parent?.isExpanded !== true;
788
+
789
+ if (item && (item.type === "cell" || item.type === "rowheader" || isDroppedOnCollapsedParent)) {
790
+ focusKey = item.parentKey ?? first;
791
+ }
792
+
793
+ opts.setFocusedKey?.(focusKey);
794
+
795
+ queueMicrotask(() => {
796
+ const row = opts.ref()?.querySelector<HTMLElement>('[role="row"][tabindex="0"]');
797
+ row?.focus();
798
+ });
799
+ }