@proyecto-viviana/solidaria-components 0.3.1 → 0.4.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 (398) hide show
  1. package/dist/ActionBar.js +184 -0
  2. package/dist/ActionBar.js.map +1 -0
  3. package/dist/ActionBar.jsx +128 -0
  4. package/dist/ActionBar.jsx.map +1 -0
  5. package/dist/ActionGroup.js +179 -0
  6. package/dist/ActionGroup.js.map +1 -0
  7. package/dist/ActionGroup.jsx +129 -0
  8. package/dist/ActionGroup.jsx.map +1 -0
  9. package/dist/Alert.js +111 -0
  10. package/dist/Alert.js.map +1 -0
  11. package/dist/Alert.jsx +82 -0
  12. package/dist/Alert.jsx.map +1 -0
  13. package/dist/Autocomplete.js +130 -0
  14. package/dist/Autocomplete.js.map +1 -0
  15. package/dist/Autocomplete.jsx +116 -0
  16. package/dist/Autocomplete.jsx.map +1 -0
  17. package/dist/Breadcrumbs.d.ts.map +1 -1
  18. package/dist/Breadcrumbs.js +334 -0
  19. package/dist/Breadcrumbs.js.map +1 -0
  20. package/dist/Breadcrumbs.jsx +266 -0
  21. package/dist/Breadcrumbs.jsx.map +1 -0
  22. package/dist/Button.d.ts.map +1 -1
  23. package/dist/Button.js +348 -0
  24. package/dist/Button.js.map +1 -0
  25. package/dist/Button.jsx +314 -0
  26. package/dist/Button.jsx.map +1 -0
  27. package/dist/Calendar.d.ts +4 -4
  28. package/dist/Calendar.d.ts.map +1 -1
  29. package/dist/Calendar.js +538 -0
  30. package/dist/Calendar.js.map +1 -0
  31. package/dist/Calendar.jsx +333 -0
  32. package/dist/Calendar.jsx.map +1 -0
  33. package/dist/CalendarPicker.d.ts +33 -0
  34. package/dist/CalendarPicker.d.ts.map +1 -0
  35. package/dist/CalendarPicker.js +44 -0
  36. package/dist/CalendarPicker.js.map +1 -0
  37. package/dist/CalendarPicker.jsx +44 -0
  38. package/dist/CalendarPicker.jsx.map +1 -0
  39. package/dist/Checkbox.d.ts +83 -4
  40. package/dist/Checkbox.d.ts.map +1 -1
  41. package/dist/Checkbox.js +923 -0
  42. package/dist/Checkbox.js.map +1 -0
  43. package/dist/Checkbox.jsx +707 -0
  44. package/dist/Checkbox.jsx.map +1 -0
  45. package/dist/Collection.d.ts.map +1 -1
  46. package/dist/Collection.js +202 -0
  47. package/dist/Collection.js.map +1 -0
  48. package/dist/Collection.jsx +152 -0
  49. package/dist/Collection.jsx.map +1 -0
  50. package/dist/Color.d.ts.map +1 -1
  51. package/dist/Color.js +1720 -0
  52. package/dist/Color.js.map +1 -0
  53. package/dist/Color.jsx +1344 -0
  54. package/dist/Color.jsx.map +1 -0
  55. package/dist/ColorEditor.js +208 -0
  56. package/dist/ColorEditor.js.map +1 -0
  57. package/dist/ColorEditor.jsx +120 -0
  58. package/dist/ColorEditor.jsx.map +1 -0
  59. package/dist/ComboBox.d.ts +8 -5
  60. package/dist/ComboBox.d.ts.map +1 -1
  61. package/dist/ComboBox.js +992 -0
  62. package/dist/ComboBox.js.map +1 -0
  63. package/dist/ComboBox.jsx +714 -0
  64. package/dist/ComboBox.jsx.map +1 -0
  65. package/dist/ContextualHelpTrigger.js +146 -0
  66. package/dist/ContextualHelpTrigger.js.map +1 -0
  67. package/dist/ContextualHelpTrigger.jsx +109 -0
  68. package/dist/ContextualHelpTrigger.jsx.map +1 -0
  69. package/dist/DateField.d.ts +3 -3
  70. package/dist/DateField.d.ts.map +1 -1
  71. package/dist/DateField.js +4 -0
  72. package/dist/DateField.jsx +4 -0
  73. package/dist/DateField2.js +499 -0
  74. package/dist/DateField2.js.map +1 -0
  75. package/dist/DateField2.jsx +317 -0
  76. package/dist/DateField2.jsx.map +1 -0
  77. package/dist/DatePicker.d.ts +4 -4
  78. package/dist/DatePicker.d.ts.map +1 -1
  79. package/dist/DatePicker.js +991 -0
  80. package/dist/DatePicker.js.map +1 -0
  81. package/dist/DatePicker.jsx +682 -0
  82. package/dist/DatePicker.jsx.map +1 -0
  83. package/dist/Dialog.d.ts.map +1 -1
  84. package/dist/Dialog.js +337 -0
  85. package/dist/Dialog.js.map +1 -0
  86. package/dist/Dialog.jsx +192 -0
  87. package/dist/Dialog.jsx.map +1 -0
  88. package/dist/Disclosure.d.ts.map +1 -1
  89. package/dist/Disclosure.js +328 -0
  90. package/dist/Disclosure.js.map +1 -0
  91. package/dist/Disclosure.jsx +230 -0
  92. package/dist/Disclosure.jsx.map +1 -0
  93. package/dist/DragAndDrop.d.ts.map +1 -1
  94. package/dist/DragAndDrop.js +176 -0
  95. package/dist/DragAndDrop.js.map +1 -0
  96. package/dist/DragAndDrop.jsx +160 -0
  97. package/dist/DragAndDrop.jsx.map +1 -0
  98. package/dist/DropZone.d.ts.map +1 -1
  99. package/dist/DropZone.js +189 -0
  100. package/dist/DropZone.js.map +1 -0
  101. package/dist/DropZone.jsx +144 -0
  102. package/dist/DropZone.jsx.map +1 -0
  103. package/dist/FieldError.js +66 -0
  104. package/dist/FieldError.js.map +1 -0
  105. package/dist/FieldError.jsx +47 -0
  106. package/dist/FieldError.jsx.map +1 -0
  107. package/dist/FileTrigger.js +79 -0
  108. package/dist/FileTrigger.js.map +1 -0
  109. package/dist/FileTrigger.jsx +49 -0
  110. package/dist/FileTrigger.jsx.map +1 -0
  111. package/dist/Focusable.js +70 -0
  112. package/dist/Focusable.js.map +1 -0
  113. package/dist/Focusable.jsx +69 -0
  114. package/dist/Focusable.jsx.map +1 -0
  115. package/dist/Form.js +99 -0
  116. package/dist/Form.js.map +1 -0
  117. package/dist/Form.jsx +73 -0
  118. package/dist/Form.jsx.map +1 -0
  119. package/dist/GridList.d.ts +34 -2
  120. package/dist/GridList.d.ts.map +1 -1
  121. package/dist/GridList.js +723 -0
  122. package/dist/GridList.js.map +1 -0
  123. package/dist/GridList.jsx +552 -0
  124. package/dist/GridList.jsx.map +1 -0
  125. package/dist/HiddenTimeInput.js +104 -0
  126. package/dist/HiddenTimeInput.js.map +1 -0
  127. package/dist/HiddenTimeInput.jsx +69 -0
  128. package/dist/HiddenTimeInput.jsx.map +1 -0
  129. package/dist/Icon.d.ts.map +1 -1
  130. package/dist/Icon.js +127 -0
  131. package/dist/Icon.js.map +1 -0
  132. package/dist/Icon.jsx +72 -0
  133. package/dist/Icon.jsx.map +1 -0
  134. package/dist/Keyboard.js +30 -0
  135. package/dist/Keyboard.js.map +1 -0
  136. package/dist/Keyboard.jsx +24 -0
  137. package/dist/Keyboard.jsx.map +1 -0
  138. package/dist/Landmark.js +134 -0
  139. package/dist/Landmark.js.map +1 -0
  140. package/dist/Landmark.jsx +118 -0
  141. package/dist/Landmark.jsx.map +1 -0
  142. package/dist/Link.d.ts.map +1 -1
  143. package/dist/Link.js +219 -0
  144. package/dist/Link.js.map +1 -0
  145. package/dist/Link.jsx +189 -0
  146. package/dist/Link.jsx.map +1 -0
  147. package/dist/ListBox.d.ts.map +1 -1
  148. package/dist/ListBox.js +670 -0
  149. package/dist/ListBox.js.map +1 -0
  150. package/dist/ListBox.jsx +508 -0
  151. package/dist/ListBox.jsx.map +1 -0
  152. package/dist/Menu.d.ts +27 -9
  153. package/dist/Menu.d.ts.map +1 -1
  154. package/dist/Menu.js +1254 -0
  155. package/dist/Menu.js.map +1 -0
  156. package/dist/Menu.jsx +1042 -0
  157. package/dist/Menu.jsx.map +1 -0
  158. package/dist/Meter.d.ts.map +1 -1
  159. package/dist/Meter.js +123 -0
  160. package/dist/Meter.js.map +1 -0
  161. package/dist/Meter.jsx +107 -0
  162. package/dist/Meter.jsx.map +1 -0
  163. package/dist/Modal.d.ts.map +1 -1
  164. package/dist/Modal.js +380 -0
  165. package/dist/Modal.js.map +1 -0
  166. package/dist/Modal.jsx +314 -0
  167. package/dist/Modal.jsx.map +1 -0
  168. package/dist/NumberField.d.ts +3 -3
  169. package/dist/NumberField.d.ts.map +1 -1
  170. package/dist/NumberField.js +573 -0
  171. package/dist/NumberField.js.map +1 -0
  172. package/dist/NumberField.jsx +443 -0
  173. package/dist/NumberField.jsx.map +1 -0
  174. package/dist/Popover.d.ts +10 -2
  175. package/dist/Popover.d.ts.map +1 -1
  176. package/dist/Popover.js +464 -0
  177. package/dist/Popover.js.map +1 -0
  178. package/dist/Popover.jsx +333 -0
  179. package/dist/Popover.jsx.map +1 -0
  180. package/dist/Pressable.js +69 -0
  181. package/dist/Pressable.js.map +1 -0
  182. package/dist/Pressable.jsx +68 -0
  183. package/dist/Pressable.jsx.map +1 -0
  184. package/dist/ProgressBar.d.ts.map +1 -1
  185. package/dist/ProgressBar.js +130 -0
  186. package/dist/ProgressBar.js.map +1 -0
  187. package/dist/ProgressBar.jsx +114 -0
  188. package/dist/ProgressBar.jsx.map +1 -0
  189. package/dist/RadioGroup.d.ts +82 -4
  190. package/dist/RadioGroup.d.ts.map +1 -1
  191. package/dist/RadioGroup.js +931 -0
  192. package/dist/RadioGroup.js.map +1 -0
  193. package/dist/RadioGroup.jsx +681 -0
  194. package/dist/RadioGroup.jsx.map +1 -0
  195. package/dist/RangeCalendar.d.ts.map +1 -1
  196. package/dist/RangeCalendar.js +410 -0
  197. package/dist/RangeCalendar.js.map +1 -0
  198. package/dist/RangeCalendar.jsx +253 -0
  199. package/dist/RangeCalendar.jsx.map +1 -0
  200. package/dist/RouterProvider.js +118 -0
  201. package/dist/RouterProvider.js.map +1 -0
  202. package/dist/RouterProvider.jsx +112 -0
  203. package/dist/RouterProvider.jsx.map +1 -0
  204. package/dist/SearchField.d.ts +2 -2
  205. package/dist/SearchField.d.ts.map +1 -1
  206. package/dist/SearchField.js +643 -0
  207. package/dist/SearchField.js.map +1 -0
  208. package/dist/SearchField.jsx +526 -0
  209. package/dist/SearchField.jsx.map +1 -0
  210. package/dist/Select.d.ts.map +1 -1
  211. package/dist/Select.js +1031 -0
  212. package/dist/Select.js.map +1 -0
  213. package/dist/Select.jsx +744 -0
  214. package/dist/Select.jsx.map +1 -0
  215. package/dist/SelectionIndicator.d.ts.map +1 -1
  216. package/dist/SelectionIndicator.js +86 -0
  217. package/dist/SelectionIndicator.js.map +1 -0
  218. package/dist/SelectionIndicator.jsx +50 -0
  219. package/dist/SelectionIndicator.jsx.map +1 -0
  220. package/dist/Separator.js +97 -0
  221. package/dist/Separator.js.map +1 -0
  222. package/dist/Separator.jsx +85 -0
  223. package/dist/Separator.jsx.map +1 -0
  224. package/dist/SharedElementTransition.d.ts.map +1 -1
  225. package/dist/SharedElementTransition.js +165 -0
  226. package/dist/SharedElementTransition.js.map +1 -0
  227. package/dist/SharedElementTransition.jsx +138 -0
  228. package/dist/SharedElementTransition.jsx.map +1 -0
  229. package/dist/Slider.d.ts +33 -1
  230. package/dist/Slider.d.ts.map +1 -1
  231. package/dist/Slider.js +515 -0
  232. package/dist/Slider.js.map +1 -0
  233. package/dist/Slider.jsx +403 -0
  234. package/dist/Slider.jsx.map +1 -0
  235. package/dist/StepList.js +198 -0
  236. package/dist/StepList.js.map +1 -0
  237. package/dist/StepList.jsx +141 -0
  238. package/dist/StepList.jsx.map +1 -0
  239. package/dist/Switch.d.ts +65 -2
  240. package/dist/Switch.d.ts.map +1 -1
  241. package/dist/Switch.js +534 -0
  242. package/dist/Switch.js.map +1 -0
  243. package/dist/Switch.jsx +393 -0
  244. package/dist/Switch.jsx.map +1 -0
  245. package/dist/Table.d.ts +48 -0
  246. package/dist/Table.d.ts.map +1 -1
  247. package/dist/Table.js +1759 -0
  248. package/dist/Table.js.map +1 -0
  249. package/dist/Table.jsx +1348 -0
  250. package/dist/Table.jsx.map +1 -0
  251. package/dist/Tabs.d.ts +0 -4
  252. package/dist/Tabs.d.ts.map +1 -1
  253. package/dist/Tabs.js +595 -0
  254. package/dist/Tabs.js.map +1 -0
  255. package/dist/Tabs.jsx +367 -0
  256. package/dist/Tabs.jsx.map +1 -0
  257. package/dist/TagGroup.d.ts.map +1 -1
  258. package/dist/TagGroup.js +378 -0
  259. package/dist/TagGroup.js.map +1 -0
  260. package/dist/TagGroup.jsx +270 -0
  261. package/dist/TagGroup.jsx.map +1 -0
  262. package/dist/Text.d.ts +18 -6
  263. package/dist/Text.d.ts.map +1 -1
  264. package/dist/Text.js +42 -0
  265. package/dist/Text.js.map +1 -0
  266. package/dist/Text.jsx +35 -0
  267. package/dist/Text.jsx.map +1 -0
  268. package/dist/TextField.d.ts +7 -6
  269. package/dist/TextField.d.ts.map +1 -1
  270. package/dist/TextField.js +436 -0
  271. package/dist/TextField.js.map +1 -0
  272. package/dist/TextField.jsx +403 -0
  273. package/dist/TextField.jsx.map +1 -0
  274. package/dist/TimeField.d.ts +3 -3
  275. package/dist/TimeField.d.ts.map +1 -1
  276. package/dist/TimeField.js +372 -0
  277. package/dist/TimeField.js.map +1 -0
  278. package/dist/TimeField.jsx +224 -0
  279. package/dist/TimeField.jsx.map +1 -0
  280. package/dist/Toast.d.ts +14 -0
  281. package/dist/Toast.d.ts.map +1 -1
  282. package/dist/Toast.js +551 -0
  283. package/dist/Toast.js.map +1 -0
  284. package/dist/Toast.jsx +361 -0
  285. package/dist/Toast.jsx.map +1 -0
  286. package/dist/ToggleButton.d.ts.map +1 -1
  287. package/dist/ToggleButton.js +123 -0
  288. package/dist/ToggleButton.js.map +1 -0
  289. package/dist/ToggleButton.jsx +88 -0
  290. package/dist/ToggleButton.jsx.map +1 -0
  291. package/dist/ToggleButtonGroup.d.ts.map +1 -1
  292. package/dist/ToggleButtonGroup.js +114 -0
  293. package/dist/ToggleButtonGroup.js.map +1 -0
  294. package/dist/ToggleButtonGroup.jsx +85 -0
  295. package/dist/ToggleButtonGroup.jsx.map +1 -0
  296. package/dist/Toolbar.js +112 -0
  297. package/dist/Toolbar.js.map +1 -0
  298. package/dist/Toolbar.jsx +92 -0
  299. package/dist/Toolbar.jsx.map +1 -0
  300. package/dist/Tooltip.d.ts.map +1 -1
  301. package/dist/Tooltip.js +539 -0
  302. package/dist/Tooltip.js.map +1 -0
  303. package/dist/Tooltip.jsx +465 -0
  304. package/dist/Tooltip.jsx.map +1 -0
  305. package/dist/Tree.d.ts +14 -2
  306. package/dist/Tree.d.ts.map +1 -1
  307. package/dist/Tree.js +1424 -0
  308. package/dist/Tree.js.map +1 -0
  309. package/dist/Tree.jsx +1172 -0
  310. package/dist/Tree.jsx.map +1 -0
  311. package/dist/Virtualizer.d.ts +16 -2
  312. package/dist/Virtualizer.d.ts.map +1 -1
  313. package/dist/Virtualizer.js +2 -0
  314. package/dist/Virtualizer.jsx +2 -0
  315. package/dist/Virtualizer2.js +751 -0
  316. package/dist/Virtualizer2.js.map +1 -0
  317. package/dist/Virtualizer2.jsx +730 -0
  318. package/dist/Virtualizer2.jsx.map +1 -0
  319. package/dist/VirtualizerLayouts.d.ts +18 -0
  320. package/dist/VirtualizerLayouts.d.ts.map +1 -1
  321. package/dist/VisuallyHidden.js +42 -0
  322. package/dist/VisuallyHidden.js.map +1 -0
  323. package/dist/VisuallyHidden.jsx +35 -0
  324. package/dist/VisuallyHidden.jsx.map +1 -0
  325. package/dist/contexts.js +33 -0
  326. package/dist/contexts.js.map +1 -0
  327. package/dist/contexts.jsx +33 -0
  328. package/dist/contexts.jsx.map +1 -0
  329. package/dist/index.d.ts +7 -6
  330. package/dist/index.d.ts.map +1 -1
  331. package/dist/index.js +70 -23711
  332. package/dist/index.jsx +70 -18116
  333. package/dist/useDragAndDrop.js +2 -0
  334. package/dist/useDragAndDrop.jsx +2 -0
  335. package/dist/useDragAndDrop2.js +395 -0
  336. package/dist/useDragAndDrop2.js.map +1 -0
  337. package/dist/useDragAndDrop2.jsx +395 -0
  338. package/dist/useDragAndDrop2.jsx.map +1 -0
  339. package/dist/utils.d.ts +83 -11
  340. package/dist/utils.d.ts.map +1 -1
  341. package/dist/utils.js +285 -0
  342. package/dist/utils.js.map +1 -0
  343. package/dist/utils.jsx +277 -0
  344. package/dist/utils.jsx.map +1 -0
  345. package/dist/virtualizer/Layout.js +144 -0
  346. package/dist/virtualizer/Layout.js.map +1 -0
  347. package/dist/virtualizer/Layout.jsx +144 -0
  348. package/dist/virtualizer/Layout.jsx.map +1 -0
  349. package/package.json +401 -4
  350. package/src/Breadcrumbs.tsx +3 -1
  351. package/src/Button.tsx +90 -23
  352. package/src/Calendar.tsx +27 -10
  353. package/src/CalendarPicker.tsx +73 -0
  354. package/src/Checkbox.tsx +539 -3
  355. package/src/Collection.tsx +9 -3
  356. package/src/Color.tsx +42 -14
  357. package/src/ComboBox.tsx +126 -14
  358. package/src/DateField.tsx +20 -2
  359. package/src/DatePicker.tsx +117 -10
  360. package/src/Dialog.tsx +13 -5
  361. package/src/Disclosure.tsx +3 -1
  362. package/src/DragAndDrop.tsx +3 -1
  363. package/src/DropZone.tsx +3 -1
  364. package/src/GridList.tsx +125 -24
  365. package/src/Icon.tsx +3 -1
  366. package/src/Link.tsx +3 -1
  367. package/src/ListBox.tsx +31 -4
  368. package/src/Menu.tsx +298 -131
  369. package/src/Meter.tsx +3 -1
  370. package/src/Modal.tsx +100 -52
  371. package/src/NumberField.tsx +73 -10
  372. package/src/Popover.tsx +49 -11
  373. package/src/ProgressBar.tsx +3 -1
  374. package/src/RadioGroup.tsx +468 -4
  375. package/src/RangeCalendar.tsx +3 -1
  376. package/src/SearchField.tsx +27 -3
  377. package/src/Select.tsx +22 -7
  378. package/src/SelectionIndicator.tsx +3 -1
  379. package/src/SharedElementTransition.tsx +3 -1
  380. package/src/Slider.tsx +159 -13
  381. package/src/Switch.tsx +395 -2
  382. package/src/Table.tsx +409 -95
  383. package/src/Tabs.tsx +16 -45
  384. package/src/TagGroup.tsx +4 -1
  385. package/src/Text.tsx +31 -10
  386. package/src/TextField.tsx +73 -10
  387. package/src/TimeField.tsx +20 -2
  388. package/src/Toast.tsx +79 -14
  389. package/src/ToggleButton.tsx +3 -1
  390. package/src/ToggleButtonGroup.tsx +3 -1
  391. package/src/Tooltip.tsx +55 -8
  392. package/src/Tree.tsx +77 -9
  393. package/src/Virtualizer.tsx +180 -31
  394. package/src/VirtualizerLayouts.ts +45 -10
  395. package/src/index.ts +50 -0
  396. package/src/utils.tsx +243 -27
  397. package/dist/index.js.map +0 -1
  398. package/dist/index.jsx.map +0 -1
@@ -0,0 +1,160 @@
1
+ import { dataAttr, useRenderProps } from "./utils.jsx";
2
+ import { createContext, createMemo, useContext } from "solid-js";
3
+ //#region src/DragAndDrop.tsx
4
+ /**
5
+ * Drag and drop composition helpers for solidaria-components.
6
+ *
7
+ * Compatibility target: react-aria-components DragAndDrop exports.
8
+ */
9
+ const DragAndDropContext = createContext({});
10
+ const DropIndicatorContext = createContext(null);
11
+ function DefaultDropIndicator(props) {
12
+ const dnd = useContext(DragAndDropContext);
13
+ const isDropTarget = createMemo(() => {
14
+ const target = props.target;
15
+ return dnd.dropState?.isDropTarget?.(target) ?? false;
16
+ });
17
+ const renderProps = useRenderProps({
18
+ get children() {
19
+ return props.children;
20
+ },
21
+ class: props.class,
22
+ style: props.style,
23
+ defaultClassName: "solidaria-DropIndicator"
24
+ }, () => ({ isDropTarget: isDropTarget() }));
25
+ return <div role="option" aria-disabled={true} class={renderProps.class()} style={renderProps.style()} data-drop-target={dataAttr(isDropTarget())}>
26
+ {renderProps.renderChildren()}
27
+ </div>;
28
+ }
29
+ function DropIndicator(props) {
30
+ const context = useContext(DropIndicatorContext);
31
+ if (context) return context.render(props);
32
+ return <DefaultDropIndicator {...props} />;
33
+ }
34
+ function useRenderDropIndicator(hooksOrDropState, maybeDropState) {
35
+ const looksLikeDropState = (value) => {
36
+ return Boolean(value && typeof value === "object" && ("isDropTarget" in value || "target" in value));
37
+ };
38
+ const dragAndDropHooks = looksLikeDropState(hooksOrDropState) ? void 0 : hooksOrDropState;
39
+ const dropState = looksLikeDropState(hooksOrDropState) ? hooksOrDropState : maybeDropState;
40
+ if (dragAndDropHooks && !dragAndDropHooks.useDropIndicator) return void 0;
41
+ if (!dropState && !dragAndDropHooks?.renderDropIndicator) return void 0;
42
+ const targetsEqual = (a, b) => {
43
+ if (!a) return false;
44
+ if (a.type !== b.type) return false;
45
+ if (a.type === "root" && b.type === "root") return true;
46
+ if (a.type !== "item" || b.type !== "item") return false;
47
+ return a.key === b.key && a.dropPosition === b.dropPosition;
48
+ };
49
+ return (target) => {
50
+ const stateIsDropTarget = dropState?.isDropTarget;
51
+ const isTarget = typeof stateIsDropTarget === "function" ? stateIsDropTarget(target) : stateIsDropTarget === true ? targetsEqual(dropState?.target, target) : false;
52
+ const isVirtualDragging = dragAndDropHooks?.isVirtualDragging?.() ?? false;
53
+ if (!isTarget && !isVirtualDragging) return void 0;
54
+ return dragAndDropHooks?.renderDropIndicator ? dragAndDropHooks.renderDropIndicator(target) : <DropIndicator target={target} />;
55
+ };
56
+ }
57
+ function resolveKey(value) {
58
+ if (typeof value === "function") return value();
59
+ return value;
60
+ }
61
+ function getAfterDropNormalizedKey(target, collection) {
62
+ if (target.dropPosition !== "after" || !collection) return target.key;
63
+ let nextKey = collection.getKeyAfter(target.key);
64
+ let lastDescendantKey = null;
65
+ if (nextKey != null) {
66
+ const targetLevel = collection.getItem(target.key)?.level ?? 0;
67
+ while (nextKey != null) {
68
+ const node = collection.getItem(nextKey);
69
+ if (!node) break;
70
+ if (node.type && node.type !== "item") {
71
+ nextKey = collection.getKeyAfter(nextKey);
72
+ continue;
73
+ }
74
+ if ((node.level ?? 0) <= targetLevel) break;
75
+ lastDescendantKey = nextKey;
76
+ nextKey = collection.getKeyAfter(nextKey);
77
+ }
78
+ }
79
+ return nextKey ?? lastDescendantKey ?? target.key;
80
+ }
81
+ function getNormalizedDropTargetKey(target, collection) {
82
+ if (!target || target.type !== "item") return null;
83
+ return getAfterDropNormalizedKey(target, collection);
84
+ }
85
+ function useDndPersistedKeys(selectionManager, dragAndDropHooks, dropState, collection) {
86
+ return createMemo(() => {
87
+ const focusedKey = resolveKey(selectionManager?.focusedKey);
88
+ let dropTargetKey;
89
+ if (dragAndDropHooks?.isVirtualDragging?.() && dropState?.target?.type === "item") dropTargetKey = getNormalizedDropTargetKey(dropState.target, collection) ?? void 0;
90
+ const keys = /* @__PURE__ */ new Set();
91
+ if (focusedKey != null) keys.add(focusedKey);
92
+ if (dropTargetKey != null) keys.add(dropTargetKey);
93
+ return keys;
94
+ });
95
+ }
96
+ function mergePersistedKeysIntoVirtualRange(baseRange, persistedIndexes, itemCount, layoutInfoProvider, maxExtraItems = 60, options) {
97
+ const validPersistedIndexes = Array.from(new Set(persistedIndexes.filter((index) => index >= 0 && index < itemCount))).sort((a, b) => a - b);
98
+ const forceIndexes = Array.from(new Set((options?.forceIncludeIndexes ?? []).filter((index) => index >= 0 && index < itemCount)));
99
+ if (itemCount <= 0) return baseRange;
100
+ if (validPersistedIndexes.length === 0 && forceIndexes.length === 0) return baseRange;
101
+ const baseSpan = Math.max(1, baseRange.end - baseRange.start);
102
+ const maxSpan = Math.max(baseSpan, baseSpan + maxExtraItems);
103
+ let start = baseRange.start;
104
+ let end = baseRange.end;
105
+ const distanceToBaseRange = (index) => {
106
+ if (index < baseRange.start) return baseRange.start - index;
107
+ if (index >= baseRange.end) return index - (baseRange.end - 1);
108
+ return 0;
109
+ };
110
+ for (const index of validPersistedIndexes.sort((a, b) => distanceToBaseRange(a) - distanceToBaseRange(b))) {
111
+ const nextStart = Math.min(start, index);
112
+ const nextEnd = Math.max(end, index + 1);
113
+ if (nextEnd - nextStart <= maxSpan) {
114
+ start = nextStart;
115
+ end = nextEnd;
116
+ }
117
+ }
118
+ if (forceIndexes.length > 0) {
119
+ const forceMaxSpan = Math.max(maxSpan, options?.forceIncludeMaxSpan ?? Math.max(maxSpan, 300));
120
+ for (const index of forceIndexes) {
121
+ const nextStart = Math.min(start, index);
122
+ const nextEnd = Math.max(end, index + 1);
123
+ if (nextEnd - nextStart <= forceMaxSpan) {
124
+ start = nextStart;
125
+ end = nextEnd;
126
+ }
127
+ }
128
+ if (options?.fallbackToForcedWindow !== false) {
129
+ const missingForced = forceIndexes.filter((index) => index < start || index >= end);
130
+ if (missingForced.length > 0) {
131
+ const nearestForced = missingForced[0];
132
+ const forceMaxSpan = Math.max(maxSpan, options?.forceIncludeMaxSpan ?? Math.max(maxSpan, 300));
133
+ const windowSpan = Math.min(itemCount, Math.max(baseSpan, forceMaxSpan));
134
+ const centeredStart = Math.max(0, Math.min(itemCount - windowSpan, nearestForced - Math.floor(windowSpan / 2)));
135
+ start = centeredStart;
136
+ end = Math.min(itemCount, centeredStart + windowSpan);
137
+ }
138
+ }
139
+ }
140
+ if (start === baseRange.start && end === baseRange.end) return baseRange;
141
+ const startRect = start > 0 ? layoutInfoProvider.getLayoutInfo(start).rect : {
142
+ y: 0,
143
+ height: 0
144
+ };
145
+ const lastRect = layoutInfoProvider.getLayoutInfo(itemCount - 1).rect;
146
+ const endRect = end > 0 ? layoutInfoProvider.getLayoutInfo(end - 1).rect : {
147
+ y: 0,
148
+ height: 0
149
+ };
150
+ return {
151
+ start,
152
+ end,
153
+ offsetTop: Math.max(0, startRect.y),
154
+ offsetBottom: Math.max(0, lastRect.y + lastRect.height - (endRect.y + endRect.height))
155
+ };
156
+ }
157
+ //#endregion
158
+ export { DragAndDropContext, DropIndicator, DropIndicatorContext, getNormalizedDropTargetKey, mergePersistedKeysIntoVirtualRange, useDndPersistedKeys, useRenderDropIndicator };
159
+
160
+ //# sourceMappingURL=DragAndDrop.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DragAndDrop.jsx","names":[],"sources":["../src/DragAndDrop.tsx"],"sourcesContent":["/**\n * Drag and drop composition helpers for solidaria-components.\n *\n * Compatibility target: react-aria-components DragAndDrop exports.\n */\n\nimport { type JSX, type Accessor, createContext, createMemo, useContext } from \"solid-js\";\nimport type {\n DragTypes,\n DropOperation,\n DropTarget,\n ItemDropTarget,\n Key,\n} from \"@proyecto-viviana/solid-stately\";\nimport type { DragAndDropHooks } from \"./useDragAndDrop\";\nimport {\n type ClassNameOrFunction,\n type StyleOrFunction,\n type SlotProps,\n useRenderProps,\n dataAttr,\n} from \"./utils\";\n\nexport interface DragAndDropContextValue {\n dragAndDropHooks?: DragAndDropHooks<unknown>;\n dragState?: unknown;\n dropState?: {\n target?: DropTarget | null;\n isDropTarget?: (target: DropTarget) => boolean;\n };\n}\n\nexport const DragAndDropContext = createContext<DragAndDropContextValue>({});\n\nexport interface DropIndicatorRenderProps {\n isDropTarget: boolean;\n}\n\nexport interface DropIndicatorProps extends SlotProps {\n target: ItemDropTarget;\n children?: JSX.Element | ((props: DropIndicatorRenderProps) => JSX.Element);\n class?: ClassNameOrFunction<DropIndicatorRenderProps>;\n style?: StyleOrFunction<DropIndicatorRenderProps>;\n}\n\ninterface DropIndicatorContextValue {\n render: (props: DropIndicatorProps) => JSX.Element;\n}\n\nexport const DropIndicatorContext = createContext<DropIndicatorContextValue | null>(null);\n\nfunction DefaultDropIndicator(props: DropIndicatorProps): JSX.Element {\n const dnd = useContext(DragAndDropContext);\n const isDropTarget = createMemo(() => {\n const target = props.target;\n return dnd.dropState?.isDropTarget?.(target) ?? false;\n });\n\n const renderProps = useRenderProps(\n {\n get children() {\n return props.children;\n },\n class: props.class,\n style: props.style,\n defaultClassName: \"solidaria-DropIndicator\",\n },\n () => ({\n isDropTarget: isDropTarget(),\n }),\n );\n\n return (\n <div\n role=\"option\"\n aria-disabled={true}\n class={renderProps.class()}\n style={renderProps.style()}\n data-drop-target={dataAttr(isDropTarget())}\n >\n {renderProps.renderChildren()}\n </div>\n );\n}\n\nexport function DropIndicator(props: DropIndicatorProps): JSX.Element {\n const context = useContext(DropIndicatorContext);\n if (context) return context.render(props);\n return <DefaultDropIndicator {...props} />;\n}\n\nexport function useRenderDropIndicator(\n hooksOrDropState?:\n | Pick<\n DragAndDropHooks<unknown>,\n \"renderDropIndicator\" | \"isVirtualDragging\" | \"useDropIndicator\"\n >\n | {\n target?: DropTarget | null;\n isDropTarget?: ((target: DropTarget) => boolean) | boolean;\n },\n maybeDropState?: {\n target?: DropTarget | null;\n isDropTarget?: ((target: DropTarget) => boolean) | boolean;\n },\n): ((target: ItemDropTarget) => JSX.Element | undefined) | undefined {\n const looksLikeDropState = (\n value: unknown,\n ): value is {\n target?: DropTarget | null;\n isDropTarget?: ((target: DropTarget) => boolean) | boolean;\n } => {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (\"isDropTarget\" in (value as Record<string, unknown>) ||\n \"target\" in (value as Record<string, unknown>)),\n );\n };\n\n const dragAndDropHooks = looksLikeDropState(hooksOrDropState) ? undefined : hooksOrDropState;\n const dropState = looksLikeDropState(hooksOrDropState) ? hooksOrDropState : maybeDropState;\n\n // RAC only renders collection indicators when drop hooks are present.\n if (dragAndDropHooks && !dragAndDropHooks.useDropIndicator) return undefined;\n if (!dropState && !dragAndDropHooks?.renderDropIndicator) return undefined;\n\n const targetsEqual = (a: DropTarget | null | undefined, b: DropTarget): boolean => {\n if (!a) return false;\n if (a.type !== b.type) return false;\n if (a.type === \"root\" && b.type === \"root\") return true;\n if (a.type !== \"item\" || b.type !== \"item\") return false;\n return a.key === b.key && a.dropPosition === b.dropPosition;\n };\n\n return (target: ItemDropTarget) => {\n const stateIsDropTarget = dropState?.isDropTarget;\n const isTarget =\n typeof stateIsDropTarget === \"function\"\n ? stateIsDropTarget(target)\n : stateIsDropTarget === true\n ? targetsEqual(dropState?.target, target)\n : false;\n const isVirtualDragging = dragAndDropHooks?.isVirtualDragging?.() ?? false;\n if (!isTarget && !isVirtualDragging) return undefined;\n return dragAndDropHooks?.renderDropIndicator ? (\n dragAndDropHooks.renderDropIndicator(target)\n ) : (\n <DropIndicator target={target} />\n );\n };\n}\n\ntype KeyAccessor = Key | null | undefined | Accessor<Key | null | undefined>;\n\ninterface SelectionManagerLike {\n focusedKey?: KeyAccessor;\n}\n\ninterface CollectionLike {\n getKeyAfter: (key: Key) => Key | null;\n getItem: (key: Key) => { level?: number; type?: string } | null | undefined;\n}\n\ninterface DroppableCollectionStateLike {\n target?: DropTarget | null;\n}\n\nexport interface VirtualRangeLike {\n start: number;\n end: number;\n offsetTop: number;\n offsetBottom: number;\n}\n\nexport interface LayoutInfoProviderLike {\n getLayoutInfo: (index: number) => { rect: { y: number; height: number } };\n}\n\nfunction resolveKey(value: KeyAccessor): Key | null | undefined {\n if (typeof value === \"function\") {\n return (value as Accessor<Key | null | undefined>)();\n }\n return value;\n}\n\nfunction getAfterDropNormalizedKey(target: ItemDropTarget, collection?: CollectionLike): Key {\n if (target.dropPosition !== \"after\" || !collection) return target.key;\n\n let nextKey = collection.getKeyAfter(target.key);\n let lastDescendantKey: Key | null = null;\n\n if (nextKey != null) {\n const targetLevel = collection.getItem(target.key)?.level ?? 0;\n while (nextKey != null) {\n const node = collection.getItem(nextKey);\n if (!node) break;\n if (node.type && node.type !== \"item\") {\n nextKey = collection.getKeyAfter(nextKey);\n continue;\n }\n if ((node.level ?? 0) <= targetLevel) break;\n lastDescendantKey = nextKey;\n nextKey = collection.getKeyAfter(nextKey);\n }\n }\n\n return nextKey ?? lastDescendantKey ?? target.key;\n}\n\nexport function getNormalizedDropTargetKey(\n target: DropTarget | null | undefined,\n collection?: CollectionLike,\n): Key | null {\n if (!target || target.type !== \"item\") return null;\n return getAfterDropNormalizedKey(target, collection);\n}\n\nexport function useDndPersistedKeys(\n selectionManager: SelectionManagerLike | null | undefined,\n dragAndDropHooks?: Pick<DragAndDropHooks<unknown>, \"isVirtualDragging\">,\n dropState?: DroppableCollectionStateLike,\n collection?: CollectionLike,\n): Accessor<Set<Key>> {\n return createMemo(() => {\n const focusedKey = resolveKey(selectionManager?.focusedKey);\n let dropTargetKey: Key | null | undefined;\n\n if (dragAndDropHooks?.isVirtualDragging?.() && dropState?.target?.type === \"item\") {\n dropTargetKey = getNormalizedDropTargetKey(dropState.target, collection) ?? undefined;\n }\n\n const keys = new Set<Key>();\n if (focusedKey != null) keys.add(focusedKey);\n if (dropTargetKey != null) keys.add(dropTargetKey);\n return keys;\n });\n}\n\nexport function mergePersistedKeysIntoVirtualRange(\n baseRange: VirtualRangeLike,\n persistedIndexes: number[],\n itemCount: number,\n layoutInfoProvider: LayoutInfoProviderLike,\n maxExtraItems = 60,\n options?: {\n forceIncludeIndexes?: number[];\n forceIncludeMaxSpan?: number;\n fallbackToForcedWindow?: boolean;\n },\n): VirtualRangeLike {\n const validPersistedIndexes = Array.from(\n new Set(persistedIndexes.filter((index) => index >= 0 && index < itemCount)),\n ).sort((a, b) => a - b);\n const forceIndexes = Array.from(\n new Set(\n (options?.forceIncludeIndexes ?? []).filter((index) => index >= 0 && index < itemCount),\n ),\n );\n\n if (itemCount <= 0) return baseRange;\n if (validPersistedIndexes.length === 0 && forceIndexes.length === 0) return baseRange;\n\n const baseSpan = Math.max(1, baseRange.end - baseRange.start);\n const maxSpan = Math.max(baseSpan, baseSpan + maxExtraItems);\n\n let start = baseRange.start;\n let end = baseRange.end;\n\n const distanceToBaseRange = (index: number): number => {\n if (index < baseRange.start) return baseRange.start - index;\n if (index >= baseRange.end) return index - (baseRange.end - 1);\n return 0;\n };\n\n for (const index of validPersistedIndexes.sort(\n (a, b) => distanceToBaseRange(a) - distanceToBaseRange(b),\n )) {\n const nextStart = Math.min(start, index);\n const nextEnd = Math.max(end, index + 1);\n if (nextEnd - nextStart <= maxSpan) {\n start = nextStart;\n end = nextEnd;\n }\n }\n\n if (forceIndexes.length > 0) {\n const forceMaxSpan = Math.max(maxSpan, options?.forceIncludeMaxSpan ?? Math.max(maxSpan, 300));\n for (const index of forceIndexes) {\n const nextStart = Math.min(start, index);\n const nextEnd = Math.max(end, index + 1);\n if (nextEnd - nextStart <= forceMaxSpan) {\n start = nextStart;\n end = nextEnd;\n }\n }\n\n if (options?.fallbackToForcedWindow !== false) {\n const missingForced = forceIndexes.filter((index) => index < start || index >= end);\n if (missingForced.length > 0) {\n const nearestForced = missingForced[0];\n const forceMaxSpan = Math.max(\n maxSpan,\n options?.forceIncludeMaxSpan ?? Math.max(maxSpan, 300),\n );\n const windowSpan = Math.min(itemCount, Math.max(baseSpan, forceMaxSpan));\n const centeredStart = Math.max(\n 0,\n Math.min(itemCount - windowSpan, nearestForced - Math.floor(windowSpan / 2)),\n );\n start = centeredStart;\n end = Math.min(itemCount, centeredStart + windowSpan);\n }\n }\n }\n\n if (start === baseRange.start && end === baseRange.end) return baseRange;\n\n const startRect = start > 0 ? layoutInfoProvider.getLayoutInfo(start).rect : { y: 0, height: 0 };\n const lastRect = layoutInfoProvider.getLayoutInfo(itemCount - 1).rect;\n const endRect = end > 0 ? layoutInfoProvider.getLayoutInfo(end - 1).rect : { y: 0, height: 0 };\n\n return {\n start,\n end,\n offsetTop: Math.max(0, startRect.y),\n offsetBottom: Math.max(0, lastRect.y + lastRect.height - (endRect.y + endRect.height)),\n };\n}\n\nexport type DropTargetDelegate = {\n getDropTargetFromPoint: (\n x: number,\n y: number,\n isValidDropTarget: (target: DropTarget) => boolean,\n ) => DropTarget | null;\n getDropOperation: (\n target: DropTarget,\n types: DragTypes,\n allowedOperations: DropOperation[],\n ) => DropOperation;\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DropZone.d.ts","sourceRoot":"","sources":["../src/DropZone.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,GAAG,EAOT,MAAM,UAAU,CAAC;AAClB,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,EAGf,MAAM,SAAS,CAAC;AAGjB,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,aACf,SACE,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC,EACnF,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,EACtC,WAAW,EACX,SAAS;IACX,QAAQ,CAAC,EAAE,cAAc,CAAC,mBAAmB,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;IACjD,KAAK,CAAC,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC;CAC9C;AAED,eAAO,MAAM,eAAe,kDAA4C,CAAC;AAgBzE;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,GAAG,CAAC,OAAO,CAgK1D"}
1
+ {"version":3,"file":"DropZone.d.ts","sourceRoot":"","sources":["../src/DropZone.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,GAAG,EAOT,MAAM,UAAU,CAAC;AAClB,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,EAGf,MAAM,SAAS,CAAC;AAGjB,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,aACf,SACE,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC,EACnF,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,EACtC,WAAW,EACX,SAAS;IACX,QAAQ,CAAC,EAAE,cAAc,CAAC,mBAAmB,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;IACjD,KAAK,CAAC,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC;CAC9C;AAED,eAAO,MAAM,eAAe,kDAA4C,CAAC;AAgBzE;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,GAAG,CAAC,OAAO,CAkK1D"}
@@ -0,0 +1,189 @@
1
+ import { filterDOMProps, useRenderProps } from "./utils.js";
2
+ import { VisuallyHidden } from "./VisuallyHidden.js";
3
+ import { createComponent, getNextElement, getNextMarker, insert, mergeProps, runHydrationEvents, spread, template, use } from "solid-js/web";
4
+ import { createContext, createMemo, createSignal, mergeProps as mergeProps$1, splitProps, useContext } from "solid-js";
5
+ import { createDrop, createFocusRing, createHover, readFromDataTransfer } from "@proyecto-viviana/solidaria";
6
+ //#region src/DropZone.tsx
7
+ /**
8
+ * DropZone primitive for solidaria-components.
9
+ *
10
+ * A drop target area for drag and drop operations.
11
+ * Parity target: react-aria-components/src/DropZone.tsx
12
+ */
13
+ var _tmpl$ = /*#__PURE__*/ template(`<button>`), _tmpl$2 = /*#__PURE__*/ template(`<div><!$><!/><!$><!/>`);
14
+ const DropZoneContext = createContext(null);
15
+ const DEFAULT_DROPZONE_LABEL = "Drop files";
16
+ const FOCUSABLE_SELECTOR = [
17
+ "a[href]",
18
+ "button:not([disabled])",
19
+ "input:not([disabled]):not([type=\"hidden\"])",
20
+ "select:not([disabled])",
21
+ "textarea:not([disabled])",
22
+ "[tabindex]:not([tabindex=\"-1\"])",
23
+ "[contenteditable=\"true\"]"
24
+ ].join(",");
25
+ function isFocusableElement(target) {
26
+ return target instanceof HTMLElement && target.matches(FOCUSABLE_SELECTOR);
27
+ }
28
+ /**
29
+ * A drop zone is an area into which one or multiple objects can be dropped.
30
+ */
31
+ function DropZone(props) {
32
+ const [local, dropProps, hoverEventProps, domProps] = splitProps(mergeProps$1(useContext(DropZoneContext) ?? {}, props), [
33
+ "children",
34
+ "class",
35
+ "style",
36
+ "slot",
37
+ "aria-label",
38
+ "aria-labelledby"
39
+ ], [
40
+ "getDropOperation",
41
+ "getDropOperationForPoint",
42
+ "onDropEnter",
43
+ "onDropMove",
44
+ "onDropActivate",
45
+ "onDropExit",
46
+ "onDrop",
47
+ "isDisabled"
48
+ ], [
49
+ "onHoverStart",
50
+ "onHoverEnd",
51
+ "onHoverChange"
52
+ ]);
53
+ const [dropZoneRef, setDropZoneRef] = createSignal(null);
54
+ const [dropButtonRef, setDropButtonRef] = createSignal(null);
55
+ const dropAria = createDrop(() => ({
56
+ getDropOperation: dropProps.getDropOperation,
57
+ getDropOperationForPoint: dropProps.getDropOperationForPoint,
58
+ onDropEnter: dropProps.onDropEnter,
59
+ onDropMove: dropProps.onDropMove,
60
+ onDropActivate: dropProps.onDropActivate,
61
+ onDropExit: dropProps.onDropExit,
62
+ onDrop: dropProps.onDrop,
63
+ hasDropButton: true,
64
+ isDisabled: dropProps.isDisabled
65
+ }));
66
+ const { isHovered, hoverProps } = createHover(() => ({
67
+ isDisabled: dropProps.isDisabled,
68
+ onHoverStart: hoverEventProps.onHoverStart,
69
+ onHoverEnd: hoverEventProps.onHoverEnd,
70
+ onHoverChange: hoverEventProps.onHoverChange
71
+ }));
72
+ const { isFocused, isFocusVisible, focusProps } = createFocusRing();
73
+ const renderValues = createMemo(() => ({
74
+ isHovered: isHovered(),
75
+ isFocused: isFocused(),
76
+ isFocusVisible: isFocusVisible(),
77
+ isDropTarget: dropAria.isDropTarget,
78
+ isDisabled: !!dropProps.isDisabled
79
+ }));
80
+ const renderProps = useRenderProps({
81
+ get children() {
82
+ return local.children;
83
+ },
84
+ class: local.class,
85
+ style: local.style,
86
+ defaultClassName: "solidaria-DropZone"
87
+ }, renderValues);
88
+ const filteredDomProps = createMemo(() => filterDOMProps(domProps, { global: true }));
89
+ const cleanDropProps = () => {
90
+ const { ref: _ref, ...rest } = dropAria.dropProps;
91
+ return rest;
92
+ };
93
+ const cleanHoverProps = () => {
94
+ const { ref: _ref, ...rest } = hoverProps;
95
+ return rest;
96
+ };
97
+ const cleanFocusProps = () => {
98
+ const { ref: _ref, ...rest } = focusProps;
99
+ return rest;
100
+ };
101
+ const cleanDropButtonProps = () => {
102
+ const { ref: _ref, ...rest } = dropAria.dropButtonProps;
103
+ return rest;
104
+ };
105
+ const onRootClick = (e) => {
106
+ const onClick = filteredDomProps().onClick;
107
+ onClick?.(e);
108
+ if (e.defaultPrevented || dropProps.isDisabled) return;
109
+ const root = dropZoneRef();
110
+ const hiddenButton = dropButtonRef();
111
+ if (!root || !hiddenButton) return;
112
+ let target = e.target instanceof Element ? e.target : root;
113
+ while (target && root.contains(target)) {
114
+ if (isFocusableElement(target)) return;
115
+ if (target === root) {
116
+ hiddenButton.focus();
117
+ return;
118
+ }
119
+ target = target.parentElement;
120
+ }
121
+ };
122
+ const onHiddenButtonPaste = (e) => {
123
+ if (dropProps.isDisabled || !e.clipboardData) return;
124
+ const items = readFromDataTransfer(e.clipboardData);
125
+ if (items.length === 0) return;
126
+ e.preventDefault();
127
+ dropProps.onDrop?.({
128
+ type: "drop",
129
+ x: 0,
130
+ y: 0,
131
+ items,
132
+ dropOperation: "copy"
133
+ });
134
+ };
135
+ const dropButtonAriaLabel = createMemo(() => local["aria-label"] ?? (!local["aria-labelledby"] ? DEFAULT_DROPZONE_LABEL : void 0));
136
+ return (() => {
137
+ var _el$ = getNextElement(_tmpl$2), _el$3 = _el$.firstChild, [_el$4, _co$] = getNextMarker(_el$3.nextSibling), _el$5 = _el$4.nextSibling, [_el$6, _co$2] = getNextMarker(_el$5.nextSibling);
138
+ use(setDropZoneRef, _el$);
139
+ spread(_el$, mergeProps(filteredDomProps, cleanDropProps, cleanHoverProps, {
140
+ "onClick": onRootClick,
141
+ get ["class"]() {
142
+ return renderProps.class();
143
+ },
144
+ get style() {
145
+ return renderProps.style();
146
+ },
147
+ get slot() {
148
+ return local.slot;
149
+ },
150
+ get ["data-hovered"]() {
151
+ return isHovered() || void 0;
152
+ },
153
+ get ["data-focused"]() {
154
+ return isFocused() || void 0;
155
+ },
156
+ get ["data-focus-visible"]() {
157
+ return isFocusVisible() || void 0;
158
+ },
159
+ get ["data-drop-target"]() {
160
+ return dropAria.isDropTarget || void 0;
161
+ },
162
+ get ["data-disabled"]() {
163
+ return dropProps.isDisabled || void 0;
164
+ }
165
+ }), false, true);
166
+ insert(_el$, createComponent(VisuallyHidden, { get children() {
167
+ var _el$2 = getNextElement(_tmpl$);
168
+ use(setDropButtonRef, _el$2);
169
+ spread(_el$2, mergeProps(cleanDropButtonProps, cleanFocusProps, {
170
+ get ["aria-label"]() {
171
+ return dropButtonAriaLabel();
172
+ },
173
+ get ["aria-labelledby"]() {
174
+ return local["aria-labelledby"];
175
+ },
176
+ "onPaste": onHiddenButtonPaste
177
+ }), false, false);
178
+ runHydrationEvents();
179
+ return _el$2;
180
+ } }), _el$4, _co$);
181
+ insert(_el$, () => renderProps.renderChildren(), _el$6, _co$2);
182
+ runHydrationEvents();
183
+ return _el$;
184
+ })();
185
+ }
186
+ //#endregion
187
+ export { DropZone, DropZoneContext };
188
+
189
+ //# sourceMappingURL=DropZone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropZone.js","names":["JSX","createContext","createMemo","createSignal","mergeProps","splitProps","useContext","createDrop","createFocusRing","createHover","readFromDataTransfer","HoverEvents","AriaDropOptions","ClassNameOrFunction","StyleOrFunction","RenderChildren","SlotProps","useRenderProps","filterDOMProps","VisuallyHidden","DropZoneRenderProps","isHovered","isFocused","isFocusVisible","isDropTarget","isDisabled","DropZoneProps","Omit","HTMLAttributes","HTMLDivElement","children","class","style","DropZoneContext","DEFAULT_DROPZONE_LABEL","FOCUSABLE_SELECTOR","join","isFocusableElement","target","Element","HTMLElement","matches","DropZone","props","contextProps","mergedProps","local","dropProps","hoverEventProps","domProps","dropZoneRef","setDropZoneRef","dropButtonRef","setDropButtonRef","HTMLButtonElement","dropAria","getDropOperation","getDropOperationForPoint","onDropEnter","onDropMove","onDropActivate","onDropExit","onDrop","hasDropButton","hoverProps","onHoverStart","onHoverEnd","onHoverChange","focusProps","renderValues","renderProps","defaultClassName","filteredDomProps","global","cleanDropProps","ref","_ref","rest","Record","cleanHoverProps","cleanFocusProps","cleanDropButtonProps","dropButtonProps","onRootClick","EventHandler","MouseEvent","e","onClick","defaultPrevented","root","hiddenButton","contains","focus","parentElement","onHiddenButtonPaste","ClipboardEvent","clipboardData","items","length","preventDefault","type","x","y","dropOperation","dropButtonAriaLabel","undefined","_el$","_$getNextElement","_tmpl$2","_el$3","firstChild","_el$4","_co$","_$getNextMarker","nextSibling","_el$5","_el$6","_co$2","_$use","_$spread","_$mergeProps","slot","data-hovered","data-focused","data-focus-visible","data-drop-target","data-disabled","_$insert","_$createComponent","_el$2","_tmpl$","aria-label","aria-labelledby","_$runHydrationEvents","renderChildren"],"sources":["../src/DropZone.tsx"],"sourcesContent":["/**\n * DropZone primitive for solidaria-components.\n *\n * A drop target area for drag and drop operations.\n * Parity target: react-aria-components/src/DropZone.tsx\n */\n\nimport {\n type JSX,\n createContext,\n createMemo,\n createSignal,\n mergeProps,\n splitProps,\n useContext,\n} from \"solid-js\";\nimport {\n createDrop,\n createFocusRing,\n createHover,\n readFromDataTransfer,\n type HoverEvents,\n type AriaDropOptions,\n} from \"@proyecto-viviana/solidaria\";\nimport {\n type ClassNameOrFunction,\n type StyleOrFunction,\n type RenderChildren,\n type SlotProps,\n useRenderProps,\n filterDOMProps,\n} from \"./utils\";\nimport { VisuallyHidden } from \"./VisuallyHidden\";\n\nexport interface DropZoneRenderProps {\n isHovered: boolean;\n isFocused: boolean;\n isFocusVisible: boolean;\n isDropTarget: boolean;\n isDisabled: boolean;\n}\n\nexport interface DropZoneProps\n extends\n Omit<JSX.HTMLAttributes<HTMLDivElement>, \"children\" | \"class\" | \"style\" | \"onDrop\">,\n Omit<AriaDropOptions, \"hasDropButton\">,\n HoverEvents,\n SlotProps {\n children?: RenderChildren<DropZoneRenderProps>;\n class?: ClassNameOrFunction<DropZoneRenderProps>;\n style?: StyleOrFunction<DropZoneRenderProps>;\n}\n\nexport const DropZoneContext = createContext<DropZoneProps | null>(null);\nconst DEFAULT_DROPZONE_LABEL = \"Drop files\";\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n 'input:not([disabled]):not([type=\"hidden\"])',\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n].join(\",\");\n\nfunction isFocusableElement(target: Element): boolean {\n return target instanceof HTMLElement && target.matches(FOCUSABLE_SELECTOR);\n}\n\n/**\n * A drop zone is an area into which one or multiple objects can be dropped.\n */\nexport function DropZone(props: DropZoneProps): JSX.Element {\n const contextProps = useContext(DropZoneContext);\n const mergedProps = mergeProps(contextProps ?? {}, props);\n const [local, dropProps, hoverEventProps, domProps] = splitProps(\n mergedProps,\n [\"children\", \"class\", \"style\", \"slot\", \"aria-label\", \"aria-labelledby\"],\n [\n \"getDropOperation\",\n \"getDropOperationForPoint\",\n \"onDropEnter\",\n \"onDropMove\",\n \"onDropActivate\",\n \"onDropExit\",\n \"onDrop\",\n \"isDisabled\",\n ],\n [\"onHoverStart\", \"onHoverEnd\", \"onHoverChange\"],\n );\n\n const [dropZoneRef, setDropZoneRef] = createSignal<HTMLDivElement | null>(null);\n const [dropButtonRef, setDropButtonRef] = createSignal<HTMLButtonElement | null>(null);\n\n const dropAria = createDrop(() => ({\n getDropOperation: dropProps.getDropOperation,\n getDropOperationForPoint: dropProps.getDropOperationForPoint,\n onDropEnter: dropProps.onDropEnter,\n onDropMove: dropProps.onDropMove,\n onDropActivate: dropProps.onDropActivate,\n onDropExit: dropProps.onDropExit,\n onDrop: dropProps.onDrop,\n hasDropButton: true,\n isDisabled: dropProps.isDisabled,\n }));\n\n const { isHovered, hoverProps } = createHover(() => ({\n isDisabled: dropProps.isDisabled,\n onHoverStart: hoverEventProps.onHoverStart,\n onHoverEnd: hoverEventProps.onHoverEnd,\n onHoverChange: hoverEventProps.onHoverChange,\n }));\n const { isFocused, isFocusVisible, focusProps } = createFocusRing();\n\n const renderValues = createMemo<DropZoneRenderProps>(() => ({\n isHovered: isHovered(),\n isFocused: isFocused(),\n isFocusVisible: isFocusVisible(),\n isDropTarget: dropAria.isDropTarget,\n isDisabled: !!dropProps.isDisabled,\n }));\n\n const renderProps = useRenderProps(\n {\n get children() {\n return local.children;\n },\n class: local.class,\n style: local.style,\n defaultClassName: \"solidaria-DropZone\",\n },\n renderValues,\n );\n\n const filteredDomProps = createMemo(() => filterDOMProps(domProps, { global: true }));\n\n const cleanDropProps = () => {\n const { ref: _ref, ...rest } = dropAria.dropProps as Record<string, unknown>;\n return rest;\n };\n const cleanHoverProps = () => {\n const { ref: _ref, ...rest } = hoverProps as Record<string, unknown>;\n return rest;\n };\n const cleanFocusProps = () => {\n const { ref: _ref, ...rest } = focusProps as Record<string, unknown>;\n return rest;\n };\n const cleanDropButtonProps = () => {\n const { ref: _ref, ...rest } = dropAria.dropButtonProps as Record<string, unknown>;\n return rest;\n };\n\n const onRootClick: JSX.EventHandler<HTMLDivElement, MouseEvent> = (e) => {\n const onClick = (filteredDomProps() as JSX.HTMLAttributes<HTMLDivElement>).onClick as\n | JSX.EventHandler<HTMLDivElement, MouseEvent>\n | undefined;\n onClick?.(e);\n if (e.defaultPrevented || dropProps.isDisabled) {\n return;\n }\n\n const root = dropZoneRef();\n const hiddenButton = dropButtonRef();\n if (!root || !hiddenButton) {\n return;\n }\n\n let target: Element | null = e.target instanceof Element ? e.target : root;\n while (target && root.contains(target)) {\n if (isFocusableElement(target)) {\n return;\n }\n if (target === root) {\n hiddenButton.focus();\n return;\n }\n target = target.parentElement;\n }\n };\n\n const onHiddenButtonPaste: JSX.EventHandler<HTMLButtonElement, ClipboardEvent> = (e) => {\n if (dropProps.isDisabled || !e.clipboardData) {\n return;\n }\n\n const items = readFromDataTransfer(e.clipboardData);\n if (items.length === 0) {\n return;\n }\n\n e.preventDefault();\n dropProps.onDrop?.({\n type: \"drop\",\n x: 0,\n y: 0,\n items,\n dropOperation: \"copy\",\n });\n };\n\n const dropButtonAriaLabel = createMemo(\n () => local[\"aria-label\"] ?? (!local[\"aria-labelledby\"] ? DEFAULT_DROPZONE_LABEL : undefined),\n );\n\n return (\n <div\n ref={setDropZoneRef}\n {...filteredDomProps()}\n {...cleanDropProps()}\n {...cleanHoverProps()}\n onClick={onRootClick}\n class={renderProps.class()}\n style={renderProps.style()}\n slot={local.slot}\n data-hovered={isHovered() || undefined}\n data-focused={isFocused() || undefined}\n data-focus-visible={isFocusVisible() || undefined}\n data-drop-target={dropAria.isDropTarget || undefined}\n data-disabled={dropProps.isDisabled || undefined}\n >\n <VisuallyHidden>\n <button\n ref={setDropButtonRef}\n {...cleanDropButtonProps()}\n {...cleanFocusProps()}\n aria-label={dropButtonAriaLabel()}\n aria-labelledby={local[\"aria-labelledby\"]}\n onPaste={onHiddenButtonPaste}\n />\n </VisuallyHidden>\n {renderProps.renderChildren()}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ import { filterDOMProps, useRenderProps } from "./utils.jsx";
2
+ import { VisuallyHidden } from "./VisuallyHidden.jsx";
3
+ import { createContext, createMemo, createSignal, mergeProps, splitProps, useContext } from "solid-js";
4
+ import { createDrop, createFocusRing, createHover, readFromDataTransfer } from "@proyecto-viviana/solidaria";
5
+ //#region src/DropZone.tsx
6
+ /**
7
+ * DropZone primitive for solidaria-components.
8
+ *
9
+ * A drop target area for drag and drop operations.
10
+ * Parity target: react-aria-components/src/DropZone.tsx
11
+ */
12
+ const DropZoneContext = createContext(null);
13
+ const DEFAULT_DROPZONE_LABEL = "Drop files";
14
+ const FOCUSABLE_SELECTOR = [
15
+ "a[href]",
16
+ "button:not([disabled])",
17
+ "input:not([disabled]):not([type=\"hidden\"])",
18
+ "select:not([disabled])",
19
+ "textarea:not([disabled])",
20
+ "[tabindex]:not([tabindex=\"-1\"])",
21
+ "[contenteditable=\"true\"]"
22
+ ].join(",");
23
+ function isFocusableElement(target) {
24
+ return target instanceof HTMLElement && target.matches(FOCUSABLE_SELECTOR);
25
+ }
26
+ /**
27
+ * A drop zone is an area into which one or multiple objects can be dropped.
28
+ */
29
+ function DropZone(props) {
30
+ const [local, dropProps, hoverEventProps, domProps] = splitProps(mergeProps(useContext(DropZoneContext) ?? {}, props), [
31
+ "children",
32
+ "class",
33
+ "style",
34
+ "slot",
35
+ "aria-label",
36
+ "aria-labelledby"
37
+ ], [
38
+ "getDropOperation",
39
+ "getDropOperationForPoint",
40
+ "onDropEnter",
41
+ "onDropMove",
42
+ "onDropActivate",
43
+ "onDropExit",
44
+ "onDrop",
45
+ "isDisabled"
46
+ ], [
47
+ "onHoverStart",
48
+ "onHoverEnd",
49
+ "onHoverChange"
50
+ ]);
51
+ const [dropZoneRef, setDropZoneRef] = createSignal(null);
52
+ const [dropButtonRef, setDropButtonRef] = createSignal(null);
53
+ const dropAria = createDrop(() => ({
54
+ getDropOperation: dropProps.getDropOperation,
55
+ getDropOperationForPoint: dropProps.getDropOperationForPoint,
56
+ onDropEnter: dropProps.onDropEnter,
57
+ onDropMove: dropProps.onDropMove,
58
+ onDropActivate: dropProps.onDropActivate,
59
+ onDropExit: dropProps.onDropExit,
60
+ onDrop: dropProps.onDrop,
61
+ hasDropButton: true,
62
+ isDisabled: dropProps.isDisabled
63
+ }));
64
+ const { isHovered, hoverProps } = createHover(() => ({
65
+ isDisabled: dropProps.isDisabled,
66
+ onHoverStart: hoverEventProps.onHoverStart,
67
+ onHoverEnd: hoverEventProps.onHoverEnd,
68
+ onHoverChange: hoverEventProps.onHoverChange
69
+ }));
70
+ const { isFocused, isFocusVisible, focusProps } = createFocusRing();
71
+ const renderValues = createMemo(() => ({
72
+ isHovered: isHovered(),
73
+ isFocused: isFocused(),
74
+ isFocusVisible: isFocusVisible(),
75
+ isDropTarget: dropAria.isDropTarget,
76
+ isDisabled: !!dropProps.isDisabled
77
+ }));
78
+ const renderProps = useRenderProps({
79
+ get children() {
80
+ return local.children;
81
+ },
82
+ class: local.class,
83
+ style: local.style,
84
+ defaultClassName: "solidaria-DropZone"
85
+ }, renderValues);
86
+ const filteredDomProps = createMemo(() => filterDOMProps(domProps, { global: true }));
87
+ const cleanDropProps = () => {
88
+ const { ref: _ref, ...rest } = dropAria.dropProps;
89
+ return rest;
90
+ };
91
+ const cleanHoverProps = () => {
92
+ const { ref: _ref, ...rest } = hoverProps;
93
+ return rest;
94
+ };
95
+ const cleanFocusProps = () => {
96
+ const { ref: _ref, ...rest } = focusProps;
97
+ return rest;
98
+ };
99
+ const cleanDropButtonProps = () => {
100
+ const { ref: _ref, ...rest } = dropAria.dropButtonProps;
101
+ return rest;
102
+ };
103
+ const onRootClick = (e) => {
104
+ const onClick = filteredDomProps().onClick;
105
+ onClick?.(e);
106
+ if (e.defaultPrevented || dropProps.isDisabled) return;
107
+ const root = dropZoneRef();
108
+ const hiddenButton = dropButtonRef();
109
+ if (!root || !hiddenButton) return;
110
+ let target = e.target instanceof Element ? e.target : root;
111
+ while (target && root.contains(target)) {
112
+ if (isFocusableElement(target)) return;
113
+ if (target === root) {
114
+ hiddenButton.focus();
115
+ return;
116
+ }
117
+ target = target.parentElement;
118
+ }
119
+ };
120
+ const onHiddenButtonPaste = (e) => {
121
+ if (dropProps.isDisabled || !e.clipboardData) return;
122
+ const items = readFromDataTransfer(e.clipboardData);
123
+ if (items.length === 0) return;
124
+ e.preventDefault();
125
+ dropProps.onDrop?.({
126
+ type: "drop",
127
+ x: 0,
128
+ y: 0,
129
+ items,
130
+ dropOperation: "copy"
131
+ });
132
+ };
133
+ const dropButtonAriaLabel = createMemo(() => local["aria-label"] ?? (!local["aria-labelledby"] ? DEFAULT_DROPZONE_LABEL : void 0));
134
+ return <div ref={setDropZoneRef} {...filteredDomProps()} {...cleanDropProps()} {...cleanHoverProps()} onClick={onRootClick} class={renderProps.class()} style={renderProps.style()} slot={local.slot} data-hovered={isHovered() || void 0} data-focused={isFocused() || void 0} data-focus-visible={isFocusVisible() || void 0} data-drop-target={dropAria.isDropTarget || void 0} data-disabled={dropProps.isDisabled || void 0}>
135
+ <VisuallyHidden>
136
+ <button ref={setDropButtonRef} {...cleanDropButtonProps()} {...cleanFocusProps()} aria-label={dropButtonAriaLabel()} aria-labelledby={local["aria-labelledby"]} onPaste={onHiddenButtonPaste} />
137
+ </VisuallyHidden>
138
+ {renderProps.renderChildren()}
139
+ </div>;
140
+ }
141
+ //#endregion
142
+ export { DropZone, DropZoneContext };
143
+
144
+ //# sourceMappingURL=DropZone.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropZone.jsx","names":[],"sources":["../src/DropZone.tsx"],"sourcesContent":["/**\n * DropZone primitive for solidaria-components.\n *\n * A drop target area for drag and drop operations.\n * Parity target: react-aria-components/src/DropZone.tsx\n */\n\nimport {\n type JSX,\n createContext,\n createMemo,\n createSignal,\n mergeProps,\n splitProps,\n useContext,\n} from \"solid-js\";\nimport {\n createDrop,\n createFocusRing,\n createHover,\n readFromDataTransfer,\n type HoverEvents,\n type AriaDropOptions,\n} from \"@proyecto-viviana/solidaria\";\nimport {\n type ClassNameOrFunction,\n type StyleOrFunction,\n type RenderChildren,\n type SlotProps,\n useRenderProps,\n filterDOMProps,\n} from \"./utils\";\nimport { VisuallyHidden } from \"./VisuallyHidden\";\n\nexport interface DropZoneRenderProps {\n isHovered: boolean;\n isFocused: boolean;\n isFocusVisible: boolean;\n isDropTarget: boolean;\n isDisabled: boolean;\n}\n\nexport interface DropZoneProps\n extends\n Omit<JSX.HTMLAttributes<HTMLDivElement>, \"children\" | \"class\" | \"style\" | \"onDrop\">,\n Omit<AriaDropOptions, \"hasDropButton\">,\n HoverEvents,\n SlotProps {\n children?: RenderChildren<DropZoneRenderProps>;\n class?: ClassNameOrFunction<DropZoneRenderProps>;\n style?: StyleOrFunction<DropZoneRenderProps>;\n}\n\nexport const DropZoneContext = createContext<DropZoneProps | null>(null);\nconst DEFAULT_DROPZONE_LABEL = \"Drop files\";\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n 'input:not([disabled]):not([type=\"hidden\"])',\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n].join(\",\");\n\nfunction isFocusableElement(target: Element): boolean {\n return target instanceof HTMLElement && target.matches(FOCUSABLE_SELECTOR);\n}\n\n/**\n * A drop zone is an area into which one or multiple objects can be dropped.\n */\nexport function DropZone(props: DropZoneProps): JSX.Element {\n const contextProps = useContext(DropZoneContext);\n const mergedProps = mergeProps(contextProps ?? {}, props);\n const [local, dropProps, hoverEventProps, domProps] = splitProps(\n mergedProps,\n [\"children\", \"class\", \"style\", \"slot\", \"aria-label\", \"aria-labelledby\"],\n [\n \"getDropOperation\",\n \"getDropOperationForPoint\",\n \"onDropEnter\",\n \"onDropMove\",\n \"onDropActivate\",\n \"onDropExit\",\n \"onDrop\",\n \"isDisabled\",\n ],\n [\"onHoverStart\", \"onHoverEnd\", \"onHoverChange\"],\n );\n\n const [dropZoneRef, setDropZoneRef] = createSignal<HTMLDivElement | null>(null);\n const [dropButtonRef, setDropButtonRef] = createSignal<HTMLButtonElement | null>(null);\n\n const dropAria = createDrop(() => ({\n getDropOperation: dropProps.getDropOperation,\n getDropOperationForPoint: dropProps.getDropOperationForPoint,\n onDropEnter: dropProps.onDropEnter,\n onDropMove: dropProps.onDropMove,\n onDropActivate: dropProps.onDropActivate,\n onDropExit: dropProps.onDropExit,\n onDrop: dropProps.onDrop,\n hasDropButton: true,\n isDisabled: dropProps.isDisabled,\n }));\n\n const { isHovered, hoverProps } = createHover(() => ({\n isDisabled: dropProps.isDisabled,\n onHoverStart: hoverEventProps.onHoverStart,\n onHoverEnd: hoverEventProps.onHoverEnd,\n onHoverChange: hoverEventProps.onHoverChange,\n }));\n const { isFocused, isFocusVisible, focusProps } = createFocusRing();\n\n const renderValues = createMemo<DropZoneRenderProps>(() => ({\n isHovered: isHovered(),\n isFocused: isFocused(),\n isFocusVisible: isFocusVisible(),\n isDropTarget: dropAria.isDropTarget,\n isDisabled: !!dropProps.isDisabled,\n }));\n\n const renderProps = useRenderProps(\n {\n get children() {\n return local.children;\n },\n class: local.class,\n style: local.style,\n defaultClassName: \"solidaria-DropZone\",\n },\n renderValues,\n );\n\n const filteredDomProps = createMemo(() => filterDOMProps(domProps, { global: true }));\n\n const cleanDropProps = () => {\n const { ref: _ref, ...rest } = dropAria.dropProps as Record<string, unknown>;\n return rest;\n };\n const cleanHoverProps = () => {\n const { ref: _ref, ...rest } = hoverProps as Record<string, unknown>;\n return rest;\n };\n const cleanFocusProps = () => {\n const { ref: _ref, ...rest } = focusProps as Record<string, unknown>;\n return rest;\n };\n const cleanDropButtonProps = () => {\n const { ref: _ref, ...rest } = dropAria.dropButtonProps as Record<string, unknown>;\n return rest;\n };\n\n const onRootClick: JSX.EventHandler<HTMLDivElement, MouseEvent> = (e) => {\n const onClick = (filteredDomProps() as JSX.HTMLAttributes<HTMLDivElement>).onClick as\n | JSX.EventHandler<HTMLDivElement, MouseEvent>\n | undefined;\n onClick?.(e);\n if (e.defaultPrevented || dropProps.isDisabled) {\n return;\n }\n\n const root = dropZoneRef();\n const hiddenButton = dropButtonRef();\n if (!root || !hiddenButton) {\n return;\n }\n\n let target: Element | null = e.target instanceof Element ? e.target : root;\n while (target && root.contains(target)) {\n if (isFocusableElement(target)) {\n return;\n }\n if (target === root) {\n hiddenButton.focus();\n return;\n }\n target = target.parentElement;\n }\n };\n\n const onHiddenButtonPaste: JSX.EventHandler<HTMLButtonElement, ClipboardEvent> = (e) => {\n if (dropProps.isDisabled || !e.clipboardData) {\n return;\n }\n\n const items = readFromDataTransfer(e.clipboardData);\n if (items.length === 0) {\n return;\n }\n\n e.preventDefault();\n dropProps.onDrop?.({\n type: \"drop\",\n x: 0,\n y: 0,\n items,\n dropOperation: \"copy\",\n });\n };\n\n const dropButtonAriaLabel = createMemo(\n () => local[\"aria-label\"] ?? (!local[\"aria-labelledby\"] ? DEFAULT_DROPZONE_LABEL : undefined),\n );\n\n return (\n <div\n ref={setDropZoneRef}\n {...filteredDomProps()}\n {...cleanDropProps()}\n {...cleanHoverProps()}\n onClick={onRootClick}\n class={renderProps.class()}\n style={renderProps.style()}\n slot={local.slot}\n data-hovered={isHovered() || undefined}\n data-focused={isFocused() || undefined}\n data-focus-visible={isFocusVisible() || undefined}\n data-drop-target={dropAria.isDropTarget || undefined}\n data-disabled={dropProps.isDisabled || undefined}\n >\n <VisuallyHidden>\n <button\n ref={setDropButtonRef}\n {...cleanDropButtonProps()}\n {...cleanFocusProps()}\n aria-label={dropButtonAriaLabel()}\n aria-labelledby={local[\"aria-labelledby\"]}\n onPaste={onHiddenButtonPaste}\n />\n </VisuallyHidden>\n {renderProps.renderChildren()}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { filterDOMProps, useRenderProps } from "./utils.js";
2
+ import { createComponent, getNextElement, insert, memo, mergeProps, runHydrationEvents, spread, template } from "solid-js/web";
3
+ import { Show, createContext, createMemo, splitProps, useContext } from "solid-js";
4
+ import { DEFAULT_VALIDATION_RESULT } from "@proyecto-viviana/solid-stately";
5
+ //#region src/FieldError.tsx
6
+ /**
7
+ * FieldError primitive for solidaria-components.
8
+ *
9
+ * Displays validation errors for a field from context or explicit validation prop.
10
+ * Port direction: react-aria-components/src/FieldError.tsx
11
+ */
12
+ var _tmpl$ = /*#__PURE__*/ template(`<div>`);
13
+ const FieldErrorContext = createContext(null);
14
+ function FieldError(props) {
15
+ const contextValue = useContext(FieldErrorContext);
16
+ const contextValidation = () => {
17
+ if (contextValue && "validation" in contextValue) return contextValue.validation;
18
+ return contextValue;
19
+ };
20
+ const contextErrorMessageProps = () => {
21
+ if (contextValue && "validation" in contextValue) return contextValue.errorMessageProps ?? {};
22
+ return {};
23
+ };
24
+ const [local, domProps] = splitProps(props, [
25
+ "validation",
26
+ "children",
27
+ "class",
28
+ "style",
29
+ "slot"
30
+ ]);
31
+ const validation = createMemo(() => local.validation ?? contextValidation());
32
+ const renderProps = useRenderProps({
33
+ children: local.children ?? ((currentValidation) => currentValidation.validationErrors.join(" ")),
34
+ class: local.class,
35
+ style: local.style,
36
+ defaultClassName: "solidaria-FieldError"
37
+ }, () => validation() ?? DEFAULT_VALIDATION_RESULT);
38
+ const filteredDomProps = filterDOMProps(domProps, { global: true });
39
+ const children = () => renderProps.renderChildren();
40
+ return createComponent(Show, {
41
+ get when() {
42
+ return memo(() => !!validation()?.isInvalid)() && children();
43
+ },
44
+ get children() {
45
+ var _el$ = getNextElement(_tmpl$);
46
+ spread(_el$, mergeProps(() => contextErrorMessageProps(), filteredDomProps, {
47
+ get slot() {
48
+ return local.slot ?? "errorMessage";
49
+ },
50
+ get ["class"]() {
51
+ return renderProps.class();
52
+ },
53
+ get style() {
54
+ return renderProps.style();
55
+ }
56
+ }), false, true);
57
+ insert(_el$, children);
58
+ runHydrationEvents();
59
+ return _el$;
60
+ }
61
+ });
62
+ }
63
+ //#endregion
64
+ export { FieldError, FieldErrorContext };
65
+
66
+ //# sourceMappingURL=FieldError.js.map