@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,730 @@
1
+ import { filterDOMProps } from "./utils.jsx";
2
+ import { CollectionRendererContext } from "./Collection.jsx";
3
+ import { createContext, createMemo, createSignal, onCleanup, onMount, splitProps, useContext } from "solid-js";
4
+ //#region src/VirtualizerLayouts.ts
5
+ function clampRange(itemCount, start, end, itemSize) {
6
+ const safeStart = Math.max(0, Math.min(start, itemCount));
7
+ const safeEnd = Math.max(safeStart, Math.min(end, itemCount));
8
+ return {
9
+ start: safeStart,
10
+ end: safeEnd,
11
+ offsetTop: safeStart * itemSize,
12
+ offsetBottom: Math.max(0, (itemCount - safeEnd) * itemSize)
13
+ };
14
+ }
15
+ function calculateLinearVisibleRange(itemCount, scrollOffset, viewportSize, itemSize, overscan) {
16
+ if (itemCount <= 0) return {
17
+ start: 0,
18
+ end: 0,
19
+ offsetTop: 0,
20
+ offsetBottom: 0
21
+ };
22
+ const safeItemSize = Math.max(1, itemSize);
23
+ const safeViewport = Math.max(1, viewportSize);
24
+ const safeOverscan = Math.max(0, overscan);
25
+ const start = Math.floor(scrollOffset / safeItemSize) - safeOverscan;
26
+ return clampRange(itemCount, start, start + (Math.ceil(safeViewport / safeItemSize) + safeOverscan * 2), safeItemSize);
27
+ }
28
+ var ListLayout = class {
29
+ getVisibleRange(ctx, options) {
30
+ return calculateLinearVisibleRange(ctx.itemCount, ctx.scrollOffset, ctx.viewportSize, options?.itemSize ?? 40, options?.overscan ?? ctx.overscan);
31
+ }
32
+ getLayoutInfo(index, context, options) {
33
+ const itemSize = Math.max(1, options?.itemSize ?? 40);
34
+ if ((options?.orientation ?? "vertical") === "horizontal") return {
35
+ key: String(index),
36
+ index,
37
+ rect: {
38
+ x: index * itemSize,
39
+ y: 0,
40
+ width: itemSize,
41
+ height: Math.max(0, context.viewportHeight ?? 0)
42
+ }
43
+ };
44
+ return {
45
+ key: String(index),
46
+ index,
47
+ rect: {
48
+ x: 0,
49
+ y: index * itemSize,
50
+ width: Math.max(0, context.viewportWidth),
51
+ height: itemSize
52
+ }
53
+ };
54
+ }
55
+ getDropTargetFromPoint(point, itemCount, options) {
56
+ if (itemCount <= 0) return {
57
+ type: "root",
58
+ index: -1,
59
+ position: "on"
60
+ };
61
+ const itemSize = Math.max(1, options?.itemSize ?? 40);
62
+ const offset = (options?.orientation ?? "vertical") === "horizontal" ? point.x : point.y;
63
+ if (offset < 0) return {
64
+ type: "item",
65
+ index: 0,
66
+ position: "before"
67
+ };
68
+ if (offset >= itemCount * itemSize) return {
69
+ type: "item",
70
+ index: itemCount - 1,
71
+ position: "after"
72
+ };
73
+ const rawIndex = Math.floor(offset / itemSize);
74
+ const index = Math.max(0, Math.min(rawIndex, itemCount - 1));
75
+ const offsetWithinItem = Math.max(0, offset - index * itemSize);
76
+ const threshold = itemSize / 3;
77
+ return {
78
+ type: "item",
79
+ index,
80
+ position: offsetWithinItem < threshold ? "before" : offsetWithinItem > threshold * 2 ? "after" : "on"
81
+ };
82
+ }
83
+ };
84
+ var TableLayout = class extends ListLayout {};
85
+ var GridLayout = class {
86
+ getVisibleRange(ctx, options) {
87
+ if (ctx.itemCount <= 0) return {
88
+ start: 0,
89
+ end: 0,
90
+ offsetTop: 0,
91
+ offsetBottom: 0
92
+ };
93
+ const rowHeight = Math.max(1, options?.rowHeight ?? options?.itemSize ?? 40);
94
+ const columns = Math.max(1, options?.columnCount ?? 1);
95
+ const safeViewport = Math.max(1, ctx.viewportSize);
96
+ const safeOverscan = Math.max(0, options?.overscan ?? ctx.overscan);
97
+ const startRow = Math.max(0, Math.floor(ctx.scrollOffset / rowHeight) - safeOverscan);
98
+ const endRow = startRow + (Math.ceil(safeViewport / rowHeight) + safeOverscan * 2);
99
+ const start = startRow * columns;
100
+ const end = Math.min(ctx.itemCount, endRow * columns);
101
+ const totalRows = Math.ceil(ctx.itemCount / columns);
102
+ const clampedStartRow = Math.floor(start / columns);
103
+ const renderedRows = Math.ceil((end - start) / columns);
104
+ return {
105
+ start,
106
+ end,
107
+ offsetTop: clampedStartRow * rowHeight,
108
+ offsetBottom: Math.max(0, (totalRows - clampedStartRow - renderedRows) * rowHeight)
109
+ };
110
+ }
111
+ getLayoutInfo(index, context, options) {
112
+ const rowHeight = Math.max(1, options?.rowHeight ?? options?.itemSize ?? 40);
113
+ const columns = Math.max(1, options?.columnCount ?? 1);
114
+ const row = Math.floor(index / columns);
115
+ const col = index % columns;
116
+ const width = Math.max(1, context.viewportWidth);
117
+ const cellWidth = Math.floor(width / columns);
118
+ return {
119
+ key: String(index),
120
+ index,
121
+ rect: {
122
+ x: col * cellWidth,
123
+ y: row * rowHeight,
124
+ width: cellWidth,
125
+ height: rowHeight
126
+ }
127
+ };
128
+ }
129
+ getDropTargetFromPoint(point, itemCount, options) {
130
+ if (itemCount <= 0) return {
131
+ type: "root",
132
+ index: -1,
133
+ position: "on"
134
+ };
135
+ const rowHeight = Math.max(1, options?.rowHeight ?? options?.itemSize ?? 40);
136
+ const columns = Math.max(1, options?.columnCount ?? 1);
137
+ const totalHeight = Math.ceil(itemCount / columns) * rowHeight;
138
+ if (point.y < 0) return {
139
+ type: "item",
140
+ index: 0,
141
+ position: "before"
142
+ };
143
+ if (point.y >= totalHeight) return {
144
+ type: "item",
145
+ index: itemCount - 1,
146
+ position: "after"
147
+ };
148
+ const cellWidth = Math.max(1, options?.viewportWidth ?? 320) / columns;
149
+ const row = Math.max(0, Math.floor(point.y / rowHeight));
150
+ const col = Math.max(0, Math.min(columns - 1, Math.floor(Math.max(0, point.x) / cellWidth)));
151
+ const index = Math.max(0, Math.min(itemCount - 1, row * columns + col));
152
+ const withinRow = Math.max(0, point.y - row * rowHeight);
153
+ const threshold = rowHeight / 3;
154
+ return {
155
+ type: "item",
156
+ index,
157
+ position: withinRow < threshold ? "before" : withinRow > threshold * 2 ? "after" : "on"
158
+ };
159
+ }
160
+ };
161
+ var WaterfallLayout = class extends GridLayout {
162
+ getVisibleRange(ctx, options) {
163
+ const width = Math.max(1, options?.viewportWidth ?? 320);
164
+ const minColumnWidth = Math.max(1, options?.minColumnWidth ?? 200);
165
+ const gap = Math.max(0, options?.gap ?? 0);
166
+ const columnCount = Math.max(1, Math.floor((width + gap) / (minColumnWidth + gap)));
167
+ return super.getVisibleRange(ctx, {
168
+ ...options,
169
+ columnCount
170
+ });
171
+ }
172
+ getLayoutInfo(index, context, options) {
173
+ const width = Math.max(1, options?.viewportWidth ?? context.viewportWidth);
174
+ const minColumnWidth = Math.max(1, options?.minColumnWidth ?? 200);
175
+ const gap = Math.max(0, options?.gap ?? 0);
176
+ const columnCount = Math.max(1, Math.floor((width + gap) / (minColumnWidth + gap)));
177
+ return super.getLayoutInfo(index, context, {
178
+ ...options,
179
+ columnCount
180
+ });
181
+ }
182
+ getDropTargetFromPoint(point, itemCount, options) {
183
+ const width = Math.max(1, options?.viewportWidth ?? 320);
184
+ const minColumnWidth = Math.max(1, options?.minColumnWidth ?? 200);
185
+ const gap = Math.max(0, options?.gap ?? 0);
186
+ const columnCount = Math.max(1, Math.floor((width + gap) / (minColumnWidth + gap)));
187
+ return super.getDropTargetFromPoint(point, itemCount, {
188
+ ...options,
189
+ columnCount
190
+ });
191
+ }
192
+ };
193
+ //#endregion
194
+ //#region src/Virtualizer.tsx
195
+ /**
196
+ * Virtualizer primitive for solidaria-components.
197
+ *
198
+ * Phase 1 parity: provides RAC-like API and context contract with
199
+ * a safe non-virtualized fallback render path.
200
+ */
201
+ const VirtualizerContext = createContext(null);
202
+ function useVirtualizerContext() {
203
+ return useContext(VirtualizerContext);
204
+ }
205
+ function getObjectValue(value, key) {
206
+ return value?.[key];
207
+ }
208
+ function isSameRange(a, b) {
209
+ return a.start === b.start && a.end === b.end && a.offsetTop === b.offsetTop && a.offsetBottom === b.offsetBottom;
210
+ }
211
+ function isSameLayoutInfo(a, b) {
212
+ return a.key === b.key && a.index === b.index && a.rect.x === b.rect.x && a.rect.y === b.rect.y && a.rect.width === b.rect.width && a.rect.height === b.rect.height;
213
+ }
214
+ /**
215
+ * A Virtualizer renders collection content under a virtualized layout contract.
216
+ * Current implementation supports fixed-size visible range virtualization.
217
+ */
218
+ function Virtualizer(props) {
219
+ const [local, domProps] = splitProps(props, [
220
+ "children",
221
+ "layout",
222
+ "layoutOptions",
223
+ "renderDropIndicator",
224
+ "getDropOperation",
225
+ "allowsWindowScrolling",
226
+ "class",
227
+ "style"
228
+ ]);
229
+ const [scrollOffset, setScrollOffset] = createSignal(0);
230
+ const [scrollOffsetX, setScrollOffsetX] = createSignal(0);
231
+ const [viewportOffset, setViewportOffset] = createSignal(0);
232
+ const [windowViewportSize, setWindowViewportSize] = createSignal(0);
233
+ const [measuredViewportSize, setMeasuredViewportSize] = createSignal(0);
234
+ const [measuredViewportWidth, setMeasuredViewportWidth] = createSignal(0);
235
+ const allowsWindowScrolling = createMemo(() => local.allowsWindowScrolling ?? true);
236
+ const [isScrolling, setIsScrolling] = createSignal(false);
237
+ const [dropTargetResolver, setDropTargetResolver] = createSignal(void 0);
238
+ const [dropTargetItemCountResolver, setDropTargetItemCountResolver] = createSignal(void 0);
239
+ const [dropTargetIndexResolver, setDropTargetIndexResolver] = createSignal(void 0);
240
+ const [dropOperationResolver, setDropOperationResolver] = createSignal(void 0);
241
+ const [keyboardNavigationOverride, setKeyboardNavigationOverride] = createSignal(void 0);
242
+ let containerRef;
243
+ const fallbackLayout = new ListLayout();
244
+ const visibleRangeCache = /* @__PURE__ */ new Map();
245
+ const layoutInfoCache = /* @__PURE__ */ new Map();
246
+ const layout = createMemo(() => {
247
+ if (typeof local.layout === "function") return new local.layout();
248
+ return local.layout;
249
+ });
250
+ const resolvedLayout = createMemo(() => {
251
+ return layout() ?? new ListLayout();
252
+ });
253
+ const resolvedLayoutOptions = createMemo(() => {
254
+ const fromLayout = resolvedLayout().useLayoutOptions?.();
255
+ if (local.layoutOptions && fromLayout) return {
256
+ ...local.layoutOptions,
257
+ ...fromLayout
258
+ };
259
+ return local.layoutOptions ?? fromLayout;
260
+ });
261
+ const virtualOptions = createMemo(() => resolvedLayoutOptions());
262
+ const layoutOptionsWithViewport = createMemo(() => {
263
+ const options = resolvedLayoutOptions();
264
+ if (options && typeof options === "object") return {
265
+ ...options,
266
+ viewportWidth: measuredViewportWidth()
267
+ };
268
+ return { viewportWidth: measuredViewportWidth() };
269
+ });
270
+ const itemSize = createMemo(() => getObjectValue(virtualOptions(), "itemSize") ?? 40);
271
+ const overscan = createMemo(() => getObjectValue(virtualOptions(), "overscan") ?? 2);
272
+ const orientation = createMemo(() => getObjectValue(virtualOptions(), "orientation") ?? "vertical");
273
+ const viewportSize = createMemo(() => {
274
+ const explicit = getObjectValue(virtualOptions(), "viewportSize");
275
+ if (explicit != null) return explicit;
276
+ const elementSize = measuredViewportSize() ?? 0;
277
+ if (allowsWindowScrolling()) return Math.max(0, Math.min(elementSize - viewportOffset(), windowViewportSize()));
278
+ return elementSize;
279
+ });
280
+ const effectiveScrollOffset = createMemo(() => allowsWindowScrolling() ? scrollOffset() + viewportOffset() : scrollOffset());
281
+ const mainScrollOffset = createMemo(() => orientation() === "horizontal" ? scrollOffsetX() : effectiveScrollOffset());
282
+ const mainViewportSize = createMemo(() => {
283
+ if (orientation() !== "horizontal") return viewportSize();
284
+ const explicit = getObjectValue(virtualOptions(), "viewportSize");
285
+ return explicit != null ? explicit : measuredViewportWidth();
286
+ });
287
+ const getVisibleRange = (itemCount) => {
288
+ const ctx = {
289
+ itemCount,
290
+ scrollOffset: mainScrollOffset(),
291
+ viewportSize: mainViewportSize(),
292
+ overscan: overscan(),
293
+ viewportWidth: measuredViewportWidth()
294
+ };
295
+ const nextRange = resolvedLayout().getVisibleRange?.(ctx, layoutOptionsWithViewport()) ?? calculateLinearVisibleRange(itemCount, ctx.scrollOffset, ctx.viewportSize, itemSize(), ctx.overscan);
296
+ const cachedRange = visibleRangeCache.get(itemCount);
297
+ if (cachedRange && isSameRange(cachedRange, nextRange)) return cachedRange;
298
+ visibleRangeCache.set(itemCount, nextRange);
299
+ return nextRange;
300
+ };
301
+ const getLayoutInfo = (index) => {
302
+ const ctx = {
303
+ viewportWidth: measuredViewportWidth(),
304
+ viewportHeight: measuredViewportSize()
305
+ };
306
+ const nextInfo = resolvedLayout().getLayoutInfo?.(index, ctx, layoutOptionsWithViewport()) ?? (orientation() === "horizontal" ? {
307
+ key: String(index),
308
+ index,
309
+ rect: {
310
+ x: index * itemSize(),
311
+ y: 0,
312
+ width: itemSize(),
313
+ height: Math.max(0, measuredViewportSize())
314
+ }
315
+ } : {
316
+ key: String(index),
317
+ index,
318
+ rect: {
319
+ x: 0,
320
+ y: index * itemSize(),
321
+ width: Math.max(0, measuredViewportWidth()),
322
+ height: itemSize()
323
+ }
324
+ });
325
+ const cachedInfo = layoutInfoCache.get(index);
326
+ if (cachedInfo && isSameLayoutInfo(cachedInfo, nextInfo)) return cachedInfo;
327
+ layoutInfoCache.set(index, nextInfo);
328
+ return nextInfo;
329
+ };
330
+ const getDropTargetFromPoint = (point, itemCount) => {
331
+ const target = resolvedLayout().getDropTargetFromPoint?.(point, itemCount, layoutOptionsWithViewport()) ?? fallbackLayout.getDropTargetFromPoint(point, itemCount, virtualOptions());
332
+ if (!target) return null;
333
+ const resolver = dropTargetResolver();
334
+ return resolver ? resolver(target) : target;
335
+ };
336
+ const assignDropTargetResolver = (resolver) => {
337
+ setDropTargetResolver(() => resolver);
338
+ };
339
+ const assignDropTargetItemCountResolver = (resolver) => {
340
+ setDropTargetItemCountResolver(() => resolver);
341
+ };
342
+ const assignDropTargetIndexResolver = (resolver) => {
343
+ setDropTargetIndexResolver(() => resolver);
344
+ };
345
+ const assignDropOperationResolver = (resolver) => {
346
+ setDropOperationResolver(() => resolver);
347
+ };
348
+ const assignKeyboardNavigationOverride = (override) => {
349
+ setKeyboardNavigationOverride(() => override);
350
+ };
351
+ const toCollectionDropTarget = (target) => {
352
+ if (target.type === "root") return { type: "root" };
353
+ return {
354
+ type: "item",
355
+ key: target.key ?? target.index,
356
+ dropPosition: target.position
357
+ };
358
+ };
359
+ const getCollectionDropTargetFromPoint = (x, y, isValidDropTarget) => {
360
+ const itemCount = dropTargetItemCountResolver()?.() ?? 0;
361
+ const virtualTarget = getDropTargetFromPoint({
362
+ x,
363
+ y
364
+ }, itemCount);
365
+ if (!virtualTarget) return null;
366
+ const mappedTarget = toCollectionDropTarget(virtualTarget);
367
+ if (isValidDropTarget(mappedTarget)) return mappedTarget;
368
+ if (mappedTarget.type === "item") {
369
+ const alternatePositions = mappedTarget.dropPosition === "on" ? ["before", "after"] : mappedTarget.dropPosition === "before" ? ["on", "after"] : ["on", "before"];
370
+ for (const position of alternatePositions) {
371
+ const alternateTarget = {
372
+ ...mappedTarget,
373
+ dropPosition: position
374
+ };
375
+ if (isValidDropTarget(alternateTarget)) return alternateTarget;
376
+ }
377
+ const rootTarget = { type: "root" };
378
+ if (isValidDropTarget(rootTarget)) return rootTarget;
379
+ }
380
+ return null;
381
+ };
382
+ const getCollectionDropOperation = (target, types, allowedOperations) => {
383
+ const resolver = dropOperationResolver() ?? local.getDropOperation;
384
+ if (resolver) return resolver(target, types, allowedOperations);
385
+ if (allowedOperations.length === 0) return "cancel";
386
+ if (target.type === "root") {
387
+ if (allowedOperations.includes("copy")) return "copy";
388
+ if (allowedOperations.includes("move")) return "move";
389
+ } else if (target.dropPosition === "on") {
390
+ if (allowedOperations.includes("copy")) return "copy";
391
+ if (allowedOperations.includes("move")) return "move";
392
+ } else {
393
+ if (allowedOperations.includes("move")) return "move";
394
+ if (allowedOperations.includes("copy")) return "copy";
395
+ }
396
+ if (allowedOperations.includes("link")) return "link";
397
+ return allowedOperations.find((operation) => operation !== "cancel") ?? "cancel";
398
+ };
399
+ const getBaseKeyboardNavigationTarget = (target, direction, isValidDropTarget) => {
400
+ const itemCount = dropTargetItemCountResolver()?.() ?? 0;
401
+ if (itemCount <= 0) {
402
+ const rootTarget = { type: "root" };
403
+ return isValidDropTarget(rootTarget) ? rootTarget : null;
404
+ }
405
+ const resolveCurrentIndex = (currentTarget) => {
406
+ if (!currentTarget || currentTarget.type === "root") return null;
407
+ const resolver = dropTargetIndexResolver();
408
+ if (resolver) {
409
+ const fromResolver = resolver(currentTarget.key);
410
+ if (fromResolver != null && fromResolver >= 0 && fromResolver < itemCount) return fromResolver;
411
+ return null;
412
+ }
413
+ if (typeof currentTarget.key === "number" && currentTarget.key >= 0 && currentTarget.key < itemCount) return currentTarget.key;
414
+ return null;
415
+ };
416
+ const getCurrentIndex = (currentTarget) => {
417
+ if (!currentTarget || currentTarget.type === "root") return direction === "next" ? -1 : itemCount;
418
+ const resolvedIndex = resolveCurrentIndex(currentTarget);
419
+ if (resolvedIndex != null) return resolvedIndex;
420
+ return direction === "next" ? -1 : itemCount;
421
+ };
422
+ const tryCurrentItemTransition = (currentTarget) => {
423
+ if (!currentTarget || currentTarget.type !== "item") return null;
424
+ const tryPosition = (position) => {
425
+ if (currentTarget.dropPosition === position) return null;
426
+ const nextTarget = {
427
+ type: "item",
428
+ key: currentTarget.key,
429
+ dropPosition: position
430
+ };
431
+ return isValidDropTarget(nextTarget) ? nextTarget : null;
432
+ };
433
+ if (direction === "next") {
434
+ if (currentTarget.dropPosition === "before") return tryPosition("on") ?? tryPosition("after");
435
+ if (currentTarget.dropPosition === "on") return tryPosition("after");
436
+ } else {
437
+ if (currentTarget.dropPosition === "after") return tryPosition("on") ?? tryPosition("before");
438
+ if (currentTarget.dropPosition === "on") return tryPosition("before");
439
+ }
440
+ return null;
441
+ };
442
+ const scanFromIndex = (startIndex, step, directionForInsertion) => {
443
+ for (let index = startIndex; index >= 0 && index < itemCount; index += step) {
444
+ const onTarget = tryTarget(index, "on");
445
+ if (onTarget) return onTarget;
446
+ const insertionOrder = directionForInsertion === "next" ? ["before", "after"] : ["after", "before"];
447
+ for (const position of insertionOrder) {
448
+ const insertionTarget = tryTarget(index, position);
449
+ if (insertionTarget) return insertionTarget;
450
+ }
451
+ }
452
+ return null;
453
+ };
454
+ const findNavigationTarget = (currentIndex, step = 1) => {
455
+ const delta = direction === "next" ? 1 : -1;
456
+ const nextStart = currentIndex + delta * Math.max(1, step);
457
+ const clampedStart = Math.max(0, Math.min(itemCount - 1, nextStart));
458
+ if (nextStart < 0 || nextStart >= itemCount) {
459
+ const rootTarget = { type: "root" };
460
+ return isValidDropTarget(rootTarget) ? rootTarget : null;
461
+ }
462
+ const primaryTarget = scanFromIndex(clampedStart, delta, direction);
463
+ if (primaryTarget) return primaryTarget;
464
+ const oppositeDirection = direction === "next" ? "previous" : "next";
465
+ const oppositeTarget = scanFromIndex(clampedStart - delta, -delta, oppositeDirection);
466
+ if (oppositeTarget) return oppositeTarget;
467
+ const rootTarget = { type: "root" };
468
+ return isValidDropTarget(rootTarget) ? rootTarget : null;
469
+ };
470
+ const tryTarget = (index, position) => {
471
+ const layoutInfo = getLayoutInfo(index);
472
+ const virtualTarget = getDropTargetFromPoint({
473
+ x: layoutInfo.rect.x + 1,
474
+ y: layoutInfo.rect.y + layoutInfo.rect.height / 2
475
+ }, itemCount);
476
+ if (!virtualTarget || virtualTarget.type === "root") return null;
477
+ const nextTarget = toCollectionDropTarget({
478
+ ...virtualTarget,
479
+ position
480
+ });
481
+ return isValidDropTarget(nextTarget) ? nextTarget : null;
482
+ };
483
+ const tryBoundaryTarget = (boundaryDirection) => {
484
+ const boundaryIndex = boundaryDirection === "next" ? 0 : itemCount - 1;
485
+ const boundaryOrder = boundaryDirection === "next" ? [
486
+ "before",
487
+ "on",
488
+ "after"
489
+ ] : [
490
+ "after",
491
+ "on",
492
+ "before"
493
+ ];
494
+ for (const position of boundaryOrder) {
495
+ const candidate = tryTarget(boundaryIndex, position);
496
+ if (candidate) return candidate;
497
+ }
498
+ return null;
499
+ };
500
+ const directTransition = resolveCurrentIndex(target) != null ? tryCurrentItemTransition(target) : null;
501
+ if (directTransition) return directTransition;
502
+ if (!target || target.type === "root") {
503
+ const boundaryTarget = tryBoundaryTarget(direction);
504
+ if (boundaryTarget) return boundaryTarget;
505
+ const rootTarget = { type: "root" };
506
+ return isValidDropTarget(rootTarget) ? rootTarget : null;
507
+ }
508
+ const currentIndex = getCurrentIndex(target);
509
+ const nextStart = currentIndex + (direction === "next" ? 1 : -1);
510
+ if (nextStart < 0 || nextStart >= itemCount) {
511
+ const rootTarget = { type: "root" };
512
+ if (isValidDropTarget(rootTarget)) return rootTarget;
513
+ const wrappedBoundary = tryBoundaryTarget(direction);
514
+ if (wrappedBoundary) return wrappedBoundary;
515
+ return null;
516
+ }
517
+ return findNavigationTarget(currentIndex, 1);
518
+ };
519
+ const getKeyboardNavigationTarget = (target, direction, isValidDropTarget) => {
520
+ const override = keyboardNavigationOverride();
521
+ if (override) return override(target, direction, isValidDropTarget);
522
+ return getBaseKeyboardNavigationTarget(target, direction, isValidDropTarget);
523
+ };
524
+ const getKeyboardPageNavigationTarget = (target, direction, isValidDropTarget) => {
525
+ const itemCount = dropTargetItemCountResolver()?.() ?? 0;
526
+ if (itemCount <= 0) {
527
+ const rootTarget = { type: "root" };
528
+ return isValidDropTarget(rootTarget) ? rootTarget : null;
529
+ }
530
+ if (!target || target.type === "root") {
531
+ const startIndex = direction === "next" ? 0 : itemCount - 1;
532
+ const delta = direction === "next" ? 1 : -1;
533
+ const boundaryOrder = direction === "next" ? [
534
+ "before",
535
+ "on",
536
+ "after"
537
+ ] : [
538
+ "after",
539
+ "on",
540
+ "before"
541
+ ];
542
+ for (let index = startIndex; index >= 0 && index < itemCount; index += delta) {
543
+ const layoutInfo = getLayoutInfo(index);
544
+ const virtualTarget = getDropTargetFromPoint({
545
+ x: layoutInfo.rect.x + 1,
546
+ y: layoutInfo.rect.y + layoutInfo.rect.height / 2
547
+ }, itemCount);
548
+ if (!virtualTarget || virtualTarget.type === "root") continue;
549
+ for (const position of boundaryOrder) {
550
+ const candidate = toCollectionDropTarget({
551
+ ...virtualTarget,
552
+ position
553
+ });
554
+ if (isValidDropTarget(candidate)) return candidate;
555
+ }
556
+ }
557
+ const rootTarget = { type: "root" };
558
+ return isValidDropTarget(rootTarget) ? rootTarget : null;
559
+ }
560
+ const resolver = dropTargetIndexResolver();
561
+ const resolvedIndex = resolver?.(target.key);
562
+ const currentIndex = resolvedIndex != null ? resolvedIndex : resolver ? direction === "next" ? -1 : itemCount : typeof target.key === "number" ? target.key : direction === "next" ? -1 : itemCount;
563
+ const pageSize = Math.max(1, Math.floor(mainViewportSize() / Math.max(1, itemSize())));
564
+ const delta = direction === "next" ? 1 : -1;
565
+ const nextStart = currentIndex + delta * pageSize;
566
+ const clampedStart = Math.max(0, Math.min(itemCount - 1, nextStart));
567
+ const tryTarget = (index, position) => {
568
+ const layoutInfo = getLayoutInfo(index);
569
+ const virtualTarget = getDropTargetFromPoint({
570
+ x: layoutInfo.rect.x + 1,
571
+ y: layoutInfo.rect.y + layoutInfo.rect.height / 2
572
+ }, itemCount);
573
+ if (!virtualTarget || virtualTarget.type === "root") return null;
574
+ const nextTarget = toCollectionDropTarget({
575
+ ...virtualTarget,
576
+ position
577
+ });
578
+ return isValidDropTarget(nextTarget) ? nextTarget : null;
579
+ };
580
+ const scanFromIndex = (startIndex, step) => {
581
+ const insertionOrder = step > 0 ? ["before", "after"] : ["after", "before"];
582
+ for (let index = startIndex; index >= 0 && index < itemCount; index += step) {
583
+ const onTarget = tryTarget(index, "on");
584
+ if (onTarget) return onTarget;
585
+ for (const position of insertionOrder) {
586
+ const insertionTarget = tryTarget(index, position);
587
+ if (insertionTarget) return insertionTarget;
588
+ }
589
+ }
590
+ return null;
591
+ };
592
+ if (nextStart < 0 || nextStart >= itemCount) {
593
+ if (direction === "next") {
594
+ const endBoundaryTarget = tryTarget(itemCount - 1, "after") ?? tryTarget(itemCount - 1, "on") ?? tryTarget(itemCount - 1, "before");
595
+ if (endBoundaryTarget) return endBoundaryTarget;
596
+ const backwardFallback = scanFromIndex(itemCount - 1, -1);
597
+ if (backwardFallback) return backwardFallback;
598
+ } else {
599
+ if (currentIndex <= 0) {
600
+ const rootTarget = { type: "root" };
601
+ if (isValidDropTarget(rootTarget)) return rootTarget;
602
+ }
603
+ const startBoundaryTarget = tryTarget(0, "before") ?? tryTarget(0, "on") ?? tryTarget(0, "after");
604
+ if (startBoundaryTarget) return startBoundaryTarget;
605
+ const forwardFallback = scanFromIndex(0, 1);
606
+ if (forwardFallback) return forwardFallback;
607
+ }
608
+ const rootTarget = { type: "root" };
609
+ return isValidDropTarget(rootTarget) ? rootTarget : null;
610
+ }
611
+ const primaryTarget = scanFromIndex(clampedStart, delta);
612
+ if (primaryTarget) return primaryTarget;
613
+ const oppositeTarget = scanFromIndex(clampedStart - delta, -delta);
614
+ if (oppositeTarget) return oppositeTarget;
615
+ const rootTarget = { type: "root" };
616
+ return isValidDropTarget(rootTarget) ? rootTarget : null;
617
+ };
618
+ const contextValue = createMemo(() => ({
619
+ layout: resolvedLayout(),
620
+ layoutOptions: resolvedLayoutOptions(),
621
+ isVirtualized: true,
622
+ orientation: orientation(),
623
+ getVisibleRange,
624
+ getLayoutInfo,
625
+ getDropTargetFromPoint,
626
+ setDropTargetResolver: assignDropTargetResolver,
627
+ setDropTargetItemCountResolver: assignDropTargetItemCountResolver,
628
+ setDropTargetIndexResolver: assignDropTargetIndexResolver,
629
+ setDropOperationResolver: assignDropOperationResolver,
630
+ setKeyboardNavigationOverride: assignKeyboardNavigationOverride,
631
+ getBaseKeyboardNavigationTarget
632
+ }));
633
+ const collectionRenderer = createMemo(() => ({
634
+ renderItem: (item) => item,
635
+ isVirtualized: true,
636
+ layoutDelegate: resolvedLayout(),
637
+ dropTargetDelegate: {
638
+ getDropTargetFromPoint: getCollectionDropTargetFromPoint,
639
+ getDropOperation: getCollectionDropOperation,
640
+ getKeyboardNavigationTarget,
641
+ getKeyboardPageNavigationTarget
642
+ },
643
+ renderDropIndicator: local.renderDropIndicator
644
+ }));
645
+ const filteredDomProps = createMemo(() => filterDOMProps(domProps, { global: true }));
646
+ const updateViewportSize = () => {
647
+ if (!containerRef) return;
648
+ const nextHeight = containerRef.clientHeight;
649
+ const nextWidth = containerRef.clientWidth;
650
+ if (nextHeight !== measuredViewportSize()) setMeasuredViewportSize(nextHeight);
651
+ if (nextWidth !== measuredViewportWidth()) setMeasuredViewportWidth(nextWidth);
652
+ };
653
+ const updateWindowViewport = () => {
654
+ if (typeof window === "undefined") return;
655
+ const next = window.innerHeight;
656
+ if (next !== windowViewportSize()) setWindowViewportSize(next);
657
+ };
658
+ const updateViewportOffset = () => {
659
+ if (!containerRef || !allowsWindowScrolling()) return;
660
+ const rect = containerRef.getBoundingClientRect();
661
+ const next = rect.y < 0 ? -rect.y : 0;
662
+ if (next !== viewportOffset()) setViewportOffset(next);
663
+ };
664
+ let scrollFrame;
665
+ let scrollEndTimeout;
666
+ onCleanup(() => {
667
+ if (scrollFrame != null) cancelAnimationFrame(scrollFrame);
668
+ if (scrollEndTimeout != null) clearTimeout(scrollEndTimeout);
669
+ });
670
+ onMount(() => {
671
+ updateViewportSize();
672
+ updateWindowViewport();
673
+ updateViewportOffset();
674
+ const handleResize = () => {
675
+ updateViewportSize();
676
+ updateWindowViewport();
677
+ updateViewportOffset();
678
+ };
679
+ window.addEventListener("resize", handleResize);
680
+ const resizeObserver = typeof ResizeObserver !== "undefined" ? new ResizeObserver(() => updateViewportSize()) : null;
681
+ if (containerRef && resizeObserver) resizeObserver.observe(containerRef);
682
+ const handleDocumentScroll = (e) => {
683
+ if (!containerRef) return;
684
+ const target = e.target;
685
+ const isContainer = target === containerRef;
686
+ const isAncestor = target === document || target === window || target instanceof Node && target.contains(containerRef);
687
+ if (!isContainer && !isAncestor) return;
688
+ if (!isContainer && !allowsWindowScrolling()) return;
689
+ if (!isScrolling()) setIsScrolling(true);
690
+ if (scrollEndTimeout != null) clearTimeout(scrollEndTimeout);
691
+ scrollEndTimeout = setTimeout(() => {
692
+ scrollEndTimeout = void 0;
693
+ setIsScrolling(false);
694
+ }, 300);
695
+ if (scrollFrame != null) cancelAnimationFrame(scrollFrame);
696
+ scrollFrame = requestAnimationFrame(() => {
697
+ scrollFrame = void 0;
698
+ if (isContainer) {
699
+ const next = Math.max(0, containerRef.scrollTop);
700
+ if (next !== scrollOffset()) setScrollOffset(next);
701
+ const nextX = Math.max(0, containerRef.scrollLeft);
702
+ if (nextX !== scrollOffsetX()) setScrollOffsetX(nextX);
703
+ } else updateViewportOffset();
704
+ updateViewportSize();
705
+ });
706
+ };
707
+ document.addEventListener("scroll", handleDocumentScroll, true);
708
+ onCleanup(() => {
709
+ window.removeEventListener("resize", handleResize);
710
+ resizeObserver?.disconnect();
711
+ document.removeEventListener("scroll", handleDocumentScroll, true);
712
+ });
713
+ });
714
+ return <CollectionRendererContext.Provider value={collectionRenderer()}>
715
+ <VirtualizerContext.Provider value={contextValue()}>
716
+ <div {...filteredDomProps()} ref={(el) => {
717
+ containerRef = el;
718
+ }} class={local.class} style={local.style} data-virtualizer>
719
+ {}
720
+ <div data-virtualizer-content style={{ "pointer-events": isScrolling() ? "none" : void 0 }}>
721
+ {local.children}
722
+ </div>
723
+ </div>
724
+ </VirtualizerContext.Provider>
725
+ </CollectionRendererContext.Provider>;
726
+ }
727
+ //#endregion
728
+ export { ListLayout as a, GridLayout as i, VirtualizerContext as n, TableLayout as o, useVirtualizerContext as r, WaterfallLayout as s, Virtualizer as t };
729
+
730
+ //# sourceMappingURL=Virtualizer2.jsx.map