@proyecto-viviana/solidaria-components 0.5.0 → 0.7.0-rc.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 (561) hide show
  1. package/LICENSE-APACHE-2.0 +201 -0
  2. package/NOTICE +91 -0
  3. package/README.md +4 -7
  4. package/dist/ActionBar.d.ts +2 -10
  5. package/dist/ActionBar.d.ts.map +1 -1
  6. package/dist/ActionBar.js +95 -59
  7. package/dist/ActionBar.js.map +1 -1
  8. package/dist/ActionBar.jsx +42 -15
  9. package/dist/ActionBar.jsx.map +1 -1
  10. package/dist/ActionGroup.d.ts +1 -12
  11. package/dist/ActionGroup.d.ts.map +1 -1
  12. package/dist/ActionGroup.js +66 -44
  13. package/dist/ActionGroup.js.map +1 -1
  14. package/dist/ActionGroup.jsx +25 -10
  15. package/dist/ActionGroup.jsx.map +1 -1
  16. package/dist/Alert.d.ts +4 -1
  17. package/dist/Alert.d.ts.map +1 -1
  18. package/dist/Alert.js +25 -17
  19. package/dist/Alert.js.map +1 -1
  20. package/dist/Alert.jsx +9 -5
  21. package/dist/Alert.jsx.map +1 -1
  22. package/dist/Autocomplete.d.ts +2 -9
  23. package/dist/Autocomplete.d.ts.map +1 -1
  24. package/dist/Autocomplete.js +18 -5
  25. package/dist/Autocomplete.js.map +1 -1
  26. package/dist/Autocomplete.jsx +20 -7
  27. package/dist/Autocomplete.jsx.map +1 -1
  28. package/dist/Breadcrumbs.d.ts +2 -7
  29. package/dist/Breadcrumbs.d.ts.map +1 -1
  30. package/dist/Breadcrumbs.js +71 -51
  31. package/dist/Breadcrumbs.js.map +1 -1
  32. package/dist/Breadcrumbs.jsx +25 -12
  33. package/dist/Breadcrumbs.jsx.map +1 -1
  34. package/dist/Button.d.ts +1 -7
  35. package/dist/Button.d.ts.map +1 -1
  36. package/dist/Button.js +125 -72
  37. package/dist/Button.js.map +1 -1
  38. package/dist/Button.jsx +105 -43
  39. package/dist/Button.jsx.map +1 -1
  40. package/dist/Calendar.d.ts +1 -7
  41. package/dist/Calendar.d.ts.map +1 -1
  42. package/dist/Calendar.js +297 -221
  43. package/dist/Calendar.js.map +1 -1
  44. package/dist/Calendar.jsx +52 -32
  45. package/dist/Calendar.jsx.map +1 -1
  46. package/dist/CalendarPicker.d.ts +1 -10
  47. package/dist/CalendarPicker.d.ts.map +1 -1
  48. package/dist/CalendarPicker.js +12 -0
  49. package/dist/CalendarPicker.js.map +1 -1
  50. package/dist/CalendarPicker.jsx +12 -0
  51. package/dist/CalendarPicker.jsx.map +1 -1
  52. package/dist/Checkbox.d.ts +2 -7
  53. package/dist/Checkbox.d.ts.map +1 -1
  54. package/dist/Checkbox.js +332 -270
  55. package/dist/Checkbox.js.map +1 -1
  56. package/dist/Checkbox.jsx +70 -77
  57. package/dist/Checkbox.jsx.map +1 -1
  58. package/dist/Collection.d.ts +33 -7
  59. package/dist/Collection.d.ts.map +1 -1
  60. package/dist/Collection.js +128 -74
  61. package/dist/Collection.js.map +1 -1
  62. package/dist/Collection.jsx +46 -7
  63. package/dist/Collection.jsx.map +1 -1
  64. package/dist/Color.d.ts +15 -20
  65. package/dist/Color.d.ts.map +1 -1
  66. package/dist/Color.js +572 -334
  67. package/dist/Color.js.map +1 -1
  68. package/dist/Color.jsx +205 -85
  69. package/dist/Color.jsx.map +1 -1
  70. package/dist/ColorEditor.d.ts +3 -1
  71. package/dist/ColorEditor.d.ts.map +1 -1
  72. package/dist/ColorEditor.js +147 -124
  73. package/dist/ColorEditor.js.map +1 -1
  74. package/dist/ColorEditor.jsx +4 -1
  75. package/dist/ColorEditor.jsx.map +1 -1
  76. package/dist/ComboBox.d.ts +31 -10
  77. package/dist/ComboBox.d.ts.map +1 -1
  78. package/dist/ComboBox.js +539 -274
  79. package/dist/ComboBox.js.map +1 -1
  80. package/dist/ComboBox.jsx +213 -70
  81. package/dist/ComboBox.jsx.map +1 -1
  82. package/dist/ContextualHelpTrigger.d.ts +1 -7
  83. package/dist/ContextualHelpTrigger.d.ts.map +1 -1
  84. package/dist/ContextualHelpTrigger.js +102 -72
  85. package/dist/ContextualHelpTrigger.js.map +1 -1
  86. package/dist/ContextualHelpTrigger.jsx +36 -16
  87. package/dist/ContextualHelpTrigger.jsx.map +1 -1
  88. package/dist/DateField.d.ts +2 -7
  89. package/dist/DateField.d.ts.map +1 -1
  90. package/dist/DateField.js +0 -2
  91. package/dist/DateField.jsx +0 -2
  92. package/dist/DateField2.js +194 -179
  93. package/dist/DateField2.js.map +1 -1
  94. package/dist/DateField2.jsx +58 -55
  95. package/dist/DateField2.jsx.map +1 -1
  96. package/dist/DatePicker.d.ts +7 -7
  97. package/dist/DatePicker.d.ts.map +1 -1
  98. package/dist/DatePicker.js +2 -2
  99. package/dist/DatePicker.jsx +2 -2
  100. package/dist/DatePicker2.js +357 -435
  101. package/dist/DatePicker2.js.map +1 -1
  102. package/dist/DatePicker2.jsx +109 -178
  103. package/dist/DatePicker2.jsx.map +1 -1
  104. package/dist/DateRangePickerContext.d.ts +7 -0
  105. package/dist/DateRangePickerContext.d.ts.map +1 -1
  106. package/dist/Dialog.d.ts +4 -9
  107. package/dist/Dialog.d.ts.map +1 -1
  108. package/dist/Dialog.js +168 -101
  109. package/dist/Dialog.js.map +1 -1
  110. package/dist/Dialog.jsx +75 -27
  111. package/dist/Dialog.jsx.map +1 -1
  112. package/dist/Disclosure.d.ts +1 -9
  113. package/dist/Disclosure.d.ts.map +1 -1
  114. package/dist/Disclosure.js +121 -79
  115. package/dist/Disclosure.js.map +1 -1
  116. package/dist/Disclosure.jsx +32 -19
  117. package/dist/Disclosure.jsx.map +1 -1
  118. package/dist/DragAndDrop.d.ts +9 -6
  119. package/dist/DragAndDrop.d.ts.map +1 -1
  120. package/dist/DragAndDrop.js +37 -22
  121. package/dist/DragAndDrop.js.map +1 -1
  122. package/dist/DragAndDrop.jsx +20 -4
  123. package/dist/DragAndDrop.jsx.map +1 -1
  124. package/dist/DragPreview.d.ts +1 -1
  125. package/dist/DragPreview.d.ts.map +1 -1
  126. package/dist/DropZone.d.ts +1 -7
  127. package/dist/DropZone.d.ts.map +1 -1
  128. package/dist/DropZone.js +74 -40
  129. package/dist/DropZone.js.map +1 -1
  130. package/dist/DropZone.jsx +24 -8
  131. package/dist/DropZone.jsx.map +1 -1
  132. package/dist/ElementTag.d.ts +9 -20
  133. package/dist/ElementTag.d.ts.map +1 -1
  134. package/dist/ElementTag.js +8 -210
  135. package/dist/ElementTag.js.map +1 -1
  136. package/dist/ElementTag.jsx +8 -57
  137. package/dist/ElementTag.jsx.map +1 -1
  138. package/dist/FieldError.d.ts +8 -7
  139. package/dist/FieldError.d.ts.map +1 -1
  140. package/dist/FieldError.js +33 -13
  141. package/dist/FieldError.js.map +1 -1
  142. package/dist/FieldError.jsx +20 -5
  143. package/dist/FieldError.jsx.map +1 -1
  144. package/dist/FileTrigger.d.ts +1 -7
  145. package/dist/FileTrigger.d.ts.map +1 -1
  146. package/dist/FileTrigger.js +30 -12
  147. package/dist/FileTrigger.js.map +1 -1
  148. package/dist/FileTrigger.jsx +15 -2
  149. package/dist/FileTrigger.jsx.map +1 -1
  150. package/dist/Focusable.d.ts +2 -8
  151. package/dist/Focusable.d.ts.map +1 -1
  152. package/dist/Focusable.js +23 -6
  153. package/dist/Focusable.js.map +1 -1
  154. package/dist/Focusable.jsx +22 -5
  155. package/dist/Focusable.jsx.map +1 -1
  156. package/dist/Form.d.ts +9 -8
  157. package/dist/Form.d.ts.map +1 -1
  158. package/dist/Form.js +66 -43
  159. package/dist/Form.js.map +1 -1
  160. package/dist/Form.jsx +36 -16
  161. package/dist/Form.jsx.map +1 -1
  162. package/dist/GridList.d.ts +5 -10
  163. package/dist/GridList.d.ts.map +1 -1
  164. package/dist/GridList.js +372 -243
  165. package/dist/GridList.js.map +1 -1
  166. package/dist/GridList.jsx +177 -99
  167. package/dist/GridList.jsx.map +1 -1
  168. package/dist/HiddenDateInput.d.ts +1 -7
  169. package/dist/HiddenDateInput.d.ts.map +1 -1
  170. package/dist/Icon.d.ts +4 -1
  171. package/dist/Icon.d.ts.map +1 -1
  172. package/dist/Icon.js +41 -37
  173. package/dist/Icon.js.map +1 -1
  174. package/dist/Icon.jsx +7 -3
  175. package/dist/Icon.jsx.map +1 -1
  176. package/dist/Keyboard.d.ts +1 -7
  177. package/dist/Keyboard.d.ts.map +1 -1
  178. package/dist/Keyboard.js +24 -11
  179. package/dist/Keyboard.js.map +1 -1
  180. package/dist/Keyboard.jsx +15 -2
  181. package/dist/Keyboard.jsx.map +1 -1
  182. package/dist/Label.d.ts +20 -0
  183. package/dist/Label.d.ts.map +1 -0
  184. package/dist/Label.js +60 -0
  185. package/dist/Label.js.map +1 -0
  186. package/dist/Label.jsx +47 -0
  187. package/dist/Label.jsx.map +1 -0
  188. package/dist/Landmark.d.ts +4 -1
  189. package/dist/Landmark.d.ts.map +1 -1
  190. package/dist/Landmark.js +10 -4
  191. package/dist/Landmark.js.map +1 -1
  192. package/dist/Landmark.jsx +5 -1
  193. package/dist/Landmark.jsx.map +1 -1
  194. package/dist/Link.d.ts +2 -7
  195. package/dist/Link.d.ts.map +1 -1
  196. package/dist/Link.js +56 -36
  197. package/dist/Link.js.map +1 -1
  198. package/dist/Link.jsx +52 -10
  199. package/dist/Link.jsx.map +1 -1
  200. package/dist/ListBox.d.ts +17 -13
  201. package/dist/ListBox.d.ts.map +1 -1
  202. package/dist/ListBox.js +647 -348
  203. package/dist/ListBox.js.map +1 -1
  204. package/dist/ListBox.jsx +339 -236
  205. package/dist/ListBox.jsx.map +1 -1
  206. package/dist/ListDropTargetDelegate.d.ts +3 -0
  207. package/dist/ListDropTargetDelegate.d.ts.map +1 -1
  208. package/dist/Menu.d.ts +39 -30
  209. package/dist/Menu.d.ts.map +1 -1
  210. package/dist/Menu.js +547 -368
  211. package/dist/Menu.js.map +1 -1
  212. package/dist/Menu.jsx +328 -230
  213. package/dist/Menu.jsx.map +1 -1
  214. package/dist/Meter.d.ts +6 -13
  215. package/dist/Meter.d.ts.map +1 -1
  216. package/dist/Meter.js +55 -18
  217. package/dist/Meter.js.map +1 -1
  218. package/dist/Meter.jsx +33 -8
  219. package/dist/Meter.jsx.map +1 -1
  220. package/dist/Modal.d.ts +1 -7
  221. package/dist/Modal.d.ts.map +1 -1
  222. package/dist/Modal.js +104 -56
  223. package/dist/Modal.js.map +1 -1
  224. package/dist/Modal.jsx +68 -38
  225. package/dist/Modal.jsx.map +1 -1
  226. package/dist/NumberField.d.ts +4 -7
  227. package/dist/NumberField.d.ts.map +1 -1
  228. package/dist/NumberField.js +243 -124
  229. package/dist/NumberField.js.map +1 -1
  230. package/dist/NumberField.jsx +115 -26
  231. package/dist/NumberField.jsx.map +1 -1
  232. package/dist/Popover.d.ts +15 -7
  233. package/dist/Popover.d.ts.map +1 -1
  234. package/dist/Popover.js +370 -181
  235. package/dist/Popover.js.map +1 -1
  236. package/dist/Popover.jsx +215 -82
  237. package/dist/Popover.jsx.map +1 -1
  238. package/dist/Pressable.d.ts +2 -8
  239. package/dist/Pressable.d.ts.map +1 -1
  240. package/dist/Pressable.js +23 -6
  241. package/dist/Pressable.js.map +1 -1
  242. package/dist/Pressable.jsx +22 -5
  243. package/dist/Pressable.jsx.map +1 -1
  244. package/dist/PreviewTrigger.d.ts +24 -0
  245. package/dist/PreviewTrigger.d.ts.map +1 -0
  246. package/dist/PreviewTrigger.js +128 -0
  247. package/dist/PreviewTrigger.js.map +1 -0
  248. package/dist/PreviewTrigger.jsx +117 -0
  249. package/dist/PreviewTrigger.jsx.map +1 -0
  250. package/dist/ProgressBar.d.ts +1 -7
  251. package/dist/ProgressBar.d.ts.map +1 -1
  252. package/dist/ProgressBar.js +34 -14
  253. package/dist/ProgressBar.js.map +1 -1
  254. package/dist/ProgressBar.jsx +17 -3
  255. package/dist/ProgressBar.jsx.map +1 -1
  256. package/dist/RadioGroup.d.ts +2 -7
  257. package/dist/RadioGroup.d.ts.map +1 -1
  258. package/dist/RadioGroup.js +388 -269
  259. package/dist/RadioGroup.js.map +1 -1
  260. package/dist/RadioGroup.jsx +110 -99
  261. package/dist/RadioGroup.jsx.map +1 -1
  262. package/dist/RangeCalendar.d.ts +3 -7
  263. package/dist/RangeCalendar.d.ts.map +1 -1
  264. package/dist/RangeCalendar.js +271 -202
  265. package/dist/RangeCalendar.js.map +1 -1
  266. package/dist/RangeCalendar.jsx +56 -37
  267. package/dist/RangeCalendar.jsx.map +1 -1
  268. package/dist/RouterProvider.d.ts +3 -9
  269. package/dist/RouterProvider.d.ts.map +1 -1
  270. package/dist/RouterProvider.js +15 -14
  271. package/dist/RouterProvider.js.map +1 -1
  272. package/dist/RouterProvider.jsx +14 -13
  273. package/dist/RouterProvider.jsx.map +1 -1
  274. package/dist/SearchField.d.ts +4 -7
  275. package/dist/SearchField.d.ts.map +1 -1
  276. package/dist/SearchField.js +191 -164
  277. package/dist/SearchField.js.map +1 -1
  278. package/dist/SearchField.jsx +69 -62
  279. package/dist/SearchField.jsx.map +1 -1
  280. package/dist/Select.d.ts +5 -10
  281. package/dist/Select.d.ts.map +1 -1
  282. package/dist/Select.js +565 -359
  283. package/dist/Select.js.map +1 -1
  284. package/dist/Select.jsx +281 -161
  285. package/dist/Select.jsx.map +1 -1
  286. package/dist/SelectionIndicator.d.ts +1 -4
  287. package/dist/SelectionIndicator.d.ts.map +1 -1
  288. package/dist/SelectionIndicator.js +29 -13
  289. package/dist/SelectionIndicator.js.map +1 -1
  290. package/dist/SelectionIndicator.jsx +18 -4
  291. package/dist/SelectionIndicator.jsx.map +1 -1
  292. package/dist/Separator.d.ts +1 -7
  293. package/dist/Separator.d.ts.map +1 -1
  294. package/dist/Separator.js +22 -6
  295. package/dist/Separator.js.map +1 -1
  296. package/dist/Separator.jsx +16 -3
  297. package/dist/Separator.jsx.map +1 -1
  298. package/dist/SharedElementTransition.d.ts +1 -10
  299. package/dist/SharedElementTransition.d.ts.map +1 -1
  300. package/dist/SharedElementTransition.js +68 -40
  301. package/dist/SharedElementTransition.js.map +1 -1
  302. package/dist/SharedElementTransition.jsx +49 -25
  303. package/dist/SharedElementTransition.jsx.map +1 -1
  304. package/dist/Slider.d.ts +2 -8
  305. package/dist/Slider.d.ts.map +1 -1
  306. package/dist/Slider.js +155 -97
  307. package/dist/Slider.js.map +1 -1
  308. package/dist/Slider.jsx +25 -12
  309. package/dist/Slider.jsx.map +1 -1
  310. package/dist/StepList.d.ts +1 -7
  311. package/dist/StepList.d.ts.map +1 -1
  312. package/dist/StepList.js +112 -68
  313. package/dist/StepList.js.map +1 -1
  314. package/dist/StepList.jsx +58 -20
  315. package/dist/StepList.jsx.map +1 -1
  316. package/dist/Switch.d.ts +2 -9
  317. package/dist/Switch.d.ts.map +1 -1
  318. package/dist/Switch.js +164 -114
  319. package/dist/Switch.js.map +1 -1
  320. package/dist/Switch.jsx +26 -13
  321. package/dist/Switch.jsx.map +1 -1
  322. package/dist/Table.d.ts +2 -1
  323. package/dist/Table.d.ts.map +1 -1
  324. package/dist/Table.js +689 -592
  325. package/dist/Table.js.map +1 -1
  326. package/dist/Table.jsx +317 -237
  327. package/dist/Table.jsx.map +1 -1
  328. package/dist/Tabs.d.ts +2 -7
  329. package/dist/Tabs.d.ts.map +1 -1
  330. package/dist/Tabs.js +278 -293
  331. package/dist/Tabs.js.map +1 -1
  332. package/dist/Tabs.jsx +68 -66
  333. package/dist/Tabs.jsx.map +1 -1
  334. package/dist/TagGroup.d.ts +4 -11
  335. package/dist/TagGroup.d.ts.map +1 -1
  336. package/dist/TagGroup.js +153 -115
  337. package/dist/TagGroup.js.map +1 -1
  338. package/dist/TagGroup.jsx +37 -24
  339. package/dist/TagGroup.jsx.map +1 -1
  340. package/dist/Text.d.ts +3 -3
  341. package/dist/Text.d.ts.map +1 -1
  342. package/dist/Text.js +24 -7
  343. package/dist/Text.js.map +1 -1
  344. package/dist/Text.jsx +17 -5
  345. package/dist/Text.jsx.map +1 -1
  346. package/dist/TextField.d.ts +3 -16
  347. package/dist/TextField.d.ts.map +1 -1
  348. package/dist/TextField.js +104 -129
  349. package/dist/TextField.js.map +1 -1
  350. package/dist/TextField.jsx +76 -102
  351. package/dist/TextField.jsx.map +1 -1
  352. package/dist/TimeField.d.ts +2 -15
  353. package/dist/TimeField.d.ts.map +1 -1
  354. package/dist/TimeField.js +86 -102
  355. package/dist/TimeField.js.map +1 -1
  356. package/dist/TimeField.jsx +32 -49
  357. package/dist/TimeField.jsx.map +1 -1
  358. package/dist/Toast.d.ts +10 -13
  359. package/dist/Toast.d.ts.map +1 -1
  360. package/dist/Toast.js +209 -108
  361. package/dist/Toast.js.map +1 -1
  362. package/dist/Toast.jsx +127 -22
  363. package/dist/Toast.jsx.map +1 -1
  364. package/dist/ToggleButton.d.ts +1 -7
  365. package/dist/ToggleButton.d.ts.map +1 -1
  366. package/dist/ToggleButton.js +57 -35
  367. package/dist/ToggleButton.js.map +1 -1
  368. package/dist/ToggleButton.jsx +26 -12
  369. package/dist/ToggleButton.jsx.map +1 -1
  370. package/dist/ToggleButtonGroup.d.ts +1 -7
  371. package/dist/ToggleButtonGroup.d.ts.map +1 -1
  372. package/dist/ToggleButtonGroup.js +59 -44
  373. package/dist/ToggleButtonGroup.js.map +1 -1
  374. package/dist/ToggleButtonGroup.jsx +25 -12
  375. package/dist/ToggleButtonGroup.jsx.map +1 -1
  376. package/dist/TokenField.d.ts +52 -0
  377. package/dist/TokenField.d.ts.map +1 -0
  378. package/dist/TokenField.js +301 -0
  379. package/dist/TokenField.js.map +1 -0
  380. package/dist/TokenField.jsx +197 -0
  381. package/dist/TokenField.jsx.map +1 -0
  382. package/dist/Toolbar.d.ts +2 -7
  383. package/dist/Toolbar.d.ts.map +1 -1
  384. package/dist/Toolbar.js +35 -16
  385. package/dist/Toolbar.js.map +1 -1
  386. package/dist/Toolbar.jsx +15 -2
  387. package/dist/Toolbar.jsx.map +1 -1
  388. package/dist/Tooltip.d.ts +2 -7
  389. package/dist/Tooltip.d.ts.map +1 -1
  390. package/dist/Tooltip.js +105 -68
  391. package/dist/Tooltip.js.map +1 -1
  392. package/dist/Tooltip.jsx +60 -36
  393. package/dist/Tooltip.jsx.map +1 -1
  394. package/dist/Tree.d.ts +8 -11
  395. package/dist/Tree.d.ts.map +1 -1
  396. package/dist/Tree.js +486 -339
  397. package/dist/Tree.js.map +1 -1
  398. package/dist/Tree.jsx +155 -107
  399. package/dist/Tree.jsx.map +1 -1
  400. package/dist/Virtualizer.d.ts +39 -9
  401. package/dist/Virtualizer.d.ts.map +1 -1
  402. package/dist/Virtualizer.js +2 -2
  403. package/dist/Virtualizer.jsx +2 -2
  404. package/dist/Virtualizer2.js +491 -136
  405. package/dist/Virtualizer2.js.map +1 -1
  406. package/dist/Virtualizer2.jsx +455 -122
  407. package/dist/Virtualizer2.jsx.map +1 -1
  408. package/dist/VirtualizerLayouts.d.ts +55 -2
  409. package/dist/VirtualizerLayouts.d.ts.map +1 -1
  410. package/dist/VisuallyHidden.d.ts +4 -3
  411. package/dist/VisuallyHidden.d.ts.map +1 -1
  412. package/dist/VisuallyHidden.js +18 -11
  413. package/dist/VisuallyHidden.js.map +1 -1
  414. package/dist/VisuallyHidden.jsx +15 -9
  415. package/dist/VisuallyHidden.jsx.map +1 -1
  416. package/dist/contexts.d.ts +25 -0
  417. package/dist/contexts.d.ts.map +1 -1
  418. package/dist/contexts.js +3 -0
  419. package/dist/contexts.js.map +1 -1
  420. package/dist/contexts.jsx +3 -0
  421. package/dist/contexts.jsx.map +1 -1
  422. package/dist/index.d.ts +11 -9
  423. package/dist/index.d.ts.map +1 -1
  424. package/dist/index.js +14 -11
  425. package/dist/index.jsx +14 -11
  426. package/dist/intl/index.d.ts +16 -0
  427. package/dist/intl/index.d.ts.map +1 -0
  428. package/dist/intl.js +212 -0
  429. package/dist/intl.js.map +1 -0
  430. package/dist/intl.jsx +212 -0
  431. package/dist/intl.jsx.map +1 -0
  432. package/dist/useDragAndDrop.d.ts +4 -2
  433. package/dist/useDragAndDrop.d.ts.map +1 -1
  434. package/dist/useDragAndDrop2.js +39 -21
  435. package/dist/useDragAndDrop2.js.map +1 -1
  436. package/dist/useDragAndDrop2.jsx +39 -21
  437. package/dist/useDragAndDrop2.jsx.map +1 -1
  438. package/dist/utils.d.ts +28 -9
  439. package/dist/utils.d.ts.map +1 -1
  440. package/dist/utils.js +96 -24
  441. package/dist/utils.js.map +1 -1
  442. package/dist/utils.jsx +81 -24
  443. package/dist/utils.jsx.map +1 -1
  444. package/dist/virtualizer/Layout.d.ts +9 -0
  445. package/dist/virtualizer/Layout.d.ts.map +1 -1
  446. package/dist/virtualizer/Layout.js +23 -2
  447. package/dist/virtualizer/Layout.js.map +1 -1
  448. package/dist/virtualizer/Layout.jsx +23 -2
  449. package/dist/virtualizer/Layout.jsx.map +1 -1
  450. package/package.json +29 -10
  451. package/src/ActionBar.tsx +50 -24
  452. package/src/ActionGroup.tsx +31 -19
  453. package/src/Alert.tsx +10 -4
  454. package/src/Autocomplete.tsx +24 -15
  455. package/src/Breadcrumbs.tsx +32 -16
  456. package/src/Button.tsx +182 -67
  457. package/src/Calendar.tsx +65 -47
  458. package/src/CalendarPicker.tsx +16 -1
  459. package/src/Checkbox.tsx +84 -116
  460. package/src/Collection.tsx +84 -3
  461. package/src/Color.tsx +282 -104
  462. package/src/ColorEditor.tsx +5 -1
  463. package/src/ComboBox.tsx +384 -109
  464. package/src/ContextualHelpTrigger.tsx +47 -41
  465. package/src/DateField.tsx +74 -106
  466. package/src/DatePicker.tsx +156 -352
  467. package/src/DateRangePickerContext.tsx +8 -0
  468. package/src/Dialog.tsx +105 -38
  469. package/src/Disclosure.tsx +29 -19
  470. package/src/DragAndDrop.tsx +43 -8
  471. package/src/DragPreview.tsx +20 -1
  472. package/src/DropZone.tsx +32 -18
  473. package/src/ElementTag.tsx +14 -104
  474. package/src/FieldError.tsx +39 -7
  475. package/src/FileTrigger.tsx +18 -3
  476. package/src/Focusable.tsx +27 -6
  477. package/src/Form.tsx +57 -11
  478. package/src/GridList.tsx +233 -141
  479. package/src/HiddenDateInput.tsx +19 -3
  480. package/src/Icon.tsx +8 -2
  481. package/src/Keyboard.tsx +18 -2
  482. package/src/Label.tsx +77 -0
  483. package/src/Landmark.tsx +6 -1
  484. package/src/Link.tsx +65 -19
  485. package/src/ListBox.tsx +645 -468
  486. package/src/ListDropTargetDelegate.ts +4 -0
  487. package/src/Menu.tsx +512 -349
  488. package/src/Meter.tsx +42 -8
  489. package/src/Modal.tsx +85 -42
  490. package/src/NumberField.tsx +161 -48
  491. package/src/Popover.tsx +424 -148
  492. package/src/Pressable.tsx +27 -6
  493. package/src/PreviewTrigger.tsx +171 -0
  494. package/src/ProgressBar.tsx +25 -3
  495. package/src/RadioGroup.tsx +230 -161
  496. package/src/RangeCalendar.tsx +75 -63
  497. package/src/RouterProvider.tsx +24 -14
  498. package/src/SearchField.tsx +118 -121
  499. package/src/Select.tsx +454 -274
  500. package/src/SelectionIndicator.tsx +21 -3
  501. package/src/Separator.tsx +17 -1
  502. package/src/SharedElementTransition.tsx +115 -97
  503. package/src/Slider.tsx +35 -17
  504. package/src/StepList.tsx +71 -32
  505. package/src/Switch.tsx +45 -29
  506. package/src/Table.tsx +446 -380
  507. package/src/Tabs.tsx +132 -155
  508. package/src/TagGroup.tsx +53 -40
  509. package/src/Text.tsx +23 -6
  510. package/src/TextField.tsx +118 -159
  511. package/src/TimeField.tsx +34 -95
  512. package/src/Toast.tsx +141 -67
  513. package/src/ToggleButton.tsx +33 -15
  514. package/src/ToggleButtonGroup.tsx +27 -9
  515. package/src/TokenField.tsx +379 -0
  516. package/src/Toolbar.tsx +19 -9
  517. package/src/Tooltip.tsx +126 -84
  518. package/src/Tree.tsx +233 -173
  519. package/src/Virtualizer.tsx +400 -138
  520. package/src/VirtualizerLayouts.ts +211 -26
  521. package/src/VisuallyHidden.tsx +22 -8
  522. package/src/contexts.ts +13 -0
  523. package/src/index.ts +32 -11
  524. package/src/intl/ar-AE.json +6 -0
  525. package/src/intl/bg-BG.json +6 -0
  526. package/src/intl/cs-CZ.json +6 -0
  527. package/src/intl/da-DK.json +6 -0
  528. package/src/intl/de-DE.json +6 -0
  529. package/src/intl/el-GR.json +6 -0
  530. package/src/intl/en-US.json +6 -0
  531. package/src/intl/es-ES.json +6 -0
  532. package/src/intl/et-EE.json +6 -0
  533. package/src/intl/fi-FI.json +6 -0
  534. package/src/intl/fr-FR.json +6 -0
  535. package/src/intl/he-IL.json +6 -0
  536. package/src/intl/hr-HR.json +6 -0
  537. package/src/intl/hu-HU.json +6 -0
  538. package/src/intl/index.ts +125 -0
  539. package/src/intl/it-IT.json +6 -0
  540. package/src/intl/ja-JP.json +6 -0
  541. package/src/intl/ko-KR.json +6 -0
  542. package/src/intl/lt-LT.json +6 -0
  543. package/src/intl/lv-LV.json +6 -0
  544. package/src/intl/nb-NO.json +6 -0
  545. package/src/intl/nl-NL.json +6 -0
  546. package/src/intl/pl-PL.json +6 -0
  547. package/src/intl/pt-BR.json +6 -0
  548. package/src/intl/pt-PT.json +6 -0
  549. package/src/intl/ro-RO.json +6 -0
  550. package/src/intl/ru-RU.json +6 -0
  551. package/src/intl/sk-SK.json +6 -0
  552. package/src/intl/sl-SI.json +6 -0
  553. package/src/intl/sr-SP.json +6 -0
  554. package/src/intl/sv-SE.json +6 -0
  555. package/src/intl/tr-TR.json +6 -0
  556. package/src/intl/uk-UA.json +6 -0
  557. package/src/intl/zh-CN.json +6 -0
  558. package/src/intl/zh-TW.json +6 -0
  559. package/src/useDragAndDrop.ts +30 -32
  560. package/src/utils.tsx +124 -68
  561. package/src/virtualizer/Layout.ts +29 -0
@@ -1,34 +1,73 @@
1
+ /*
2
+ * Copyright 2024 Adobe. All rights reserved.
3
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License. You may obtain a copy
5
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software distributed under
8
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ * OF ANY KIND, either express or implied. See the License for the specific language
10
+ * governing permissions and limitations under the License.
11
+ */
12
+
13
+ /*
14
+ * Copyright 2020 Adobe. All rights reserved.
15
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
16
+ * you may not use this file except in compliance with the License. You may obtain a copy
17
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
18
+ *
19
+ * Unless required by applicable law or agreed to in writing, software distributed under
20
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
21
+ * OF ANY KIND, either express or implied. See the License for the specific language
22
+ * governing permissions and limitations under the License.
23
+ */
24
+
25
+ // Ported to SolidJS for Proyecto Viviana; based on packages/react-aria-components/src/Virtualizer.tsx
26
+ // Ported to SolidJS for Proyecto Viviana; based on packages/react-aria/src/virtualizer/ScrollView.tsx
27
+
1
28
  /**
2
29
  * Virtualizer primitive for solidaria-components.
3
30
  *
4
- * Phase 1 parity: provides RAC-like API and context contract with
5
- * a safe non-virtualized fallback render path.
31
+ * Provides the React Aria Components API and the React Aria scroll-view
32
+ * behavior. Based on:
33
+ * - packages/react-aria-components/src/Virtualizer.tsx
34
+ * - packages/react-aria/src/virtualizer/ScrollView.tsx
6
35
  */
7
36
 
8
37
  import {
9
- type JSX,
10
38
  createContext,
39
+ createEffect,
11
40
  createMemo,
12
41
  createSignal,
13
42
  onCleanup,
14
- onMount,
15
- splitProps,
16
43
  useContext,
44
+ createTrackedEffect,
17
45
  } from "solid-js";
46
+ import type { Accessor } from "solid-js";
47
+ import type { JSX } from "@solidjs/web";
18
48
  import type {
19
49
  DragTypes,
20
50
  DropOperation,
21
51
  DropTarget,
22
52
  ItemDropTarget,
23
53
  } from "@proyecto-viviana/solid-stately";
24
- import { CollectionRendererContext, type CollectionRendererContextValue } from "./Collection";
25
- import { filterDOMProps } from "./utils";
54
+ import { createScrollView, useLocale } from "@proyecto-viviana/solidaria";
55
+ import { isElementVisible } from "@proyecto-viviana/solidaria/utils";
56
+ import {
57
+ CollectionRendererContext,
58
+ DefaultCollectionRenderer,
59
+ type CollectionRendererContextValue,
60
+ type CollectionRootProps,
61
+ type CollectionBranchProps,
62
+ } from "./Collection";
63
+ import { splitProps } from "@proyecto-viviana/solidaria/utils";
26
64
  import {
27
65
  GridLayout,
28
66
  ListLayout,
29
67
  TableLayout,
30
68
  WaterfallLayout,
31
69
  calculateLinearVisibleRange,
70
+ resolveListRowSize,
32
71
  type DefaultVirtualizerLayoutOptions,
33
72
  type GridLayoutOptions,
34
73
  type LayoutInfo,
@@ -50,6 +89,8 @@ export interface LayoutOptionsDelegate<O> {
50
89
  export interface VirtualizerLayout<O = unknown> extends LayoutOptionsDelegate<O> {
51
90
  getVisibleRange?(context: VirtualizerRangeContext, options?: O): VirtualizerVisibleRange;
52
91
  getLayoutInfo?(index: number, context: VirtualizerLayoutInfoContext, options?: O): LayoutInfo;
92
+ getContentSize?(itemCount: number, context: VirtualizerLayoutInfoContext, options?: O): Size;
93
+ updateItemSize?(index: number, mainSize: number): boolean;
53
94
  getDropTargetFromPoint?(
54
95
  point: Point,
55
96
  itemCount: number,
@@ -80,6 +121,8 @@ export interface VirtualizerContextValue<O = unknown> {
80
121
  orientation: Orientation;
81
122
  getVisibleRange: (itemCount: number) => VirtualizerVisibleRange;
82
123
  getLayoutInfo: (index: number) => LayoutInfo;
124
+ getContentSize: (itemCount: number) => Size;
125
+ updateItemSize: (index: number, mainSize: number) => boolean;
83
126
  getDropTargetFromPoint: (point: Point, itemCount: number) => VirtualizerDropTarget | null;
84
127
  setDropTargetResolver: (resolver: VirtualizerDropTargetResolver | undefined) => void;
85
128
  setDropTargetItemCountResolver: (resolver: (() => number) | undefined) => void;
@@ -104,6 +147,27 @@ export type VirtualizerDropOperationResolver = (
104
147
 
105
148
  export const VirtualizerContext = createContext<VirtualizerContextValue<unknown> | null>(null);
106
149
 
150
+ interface VirtualizerOptionsContextValue {
151
+ layout: VirtualizerLayout<unknown>;
152
+ layoutOptions?: unknown;
153
+ shouldObserveItemSize?: boolean;
154
+ allowsWindowScrolling: boolean;
155
+ }
156
+
157
+ const VirtualizerOptionsContext = createContext<VirtualizerOptionsContextValue | null>(null);
158
+
159
+ interface VirtualizerScrollRuntime {
160
+ setScrollOffset: (value: number) => void;
161
+ setScrollOffsetX: (value: number) => void;
162
+ setViewportOffset: (value: number) => void;
163
+ setWindowViewportSize: (value: number) => void;
164
+ setMeasuredViewportSize: (value: number) => void;
165
+ setMeasuredViewportWidth: (value: number) => void;
166
+ allowsWindowScrolling: () => boolean;
167
+ }
168
+
169
+ const VirtualizerScrollRuntimeContext = createContext<VirtualizerScrollRuntime | null>(null);
170
+
107
171
  export function useVirtualizerContext<O>(): VirtualizerContextValue<O> | null {
108
172
  return useContext(VirtualizerContext) as VirtualizerContextValue<O> | null;
109
173
  }
@@ -118,6 +182,12 @@ export interface VirtualizerProps<O> extends Omit<
118
182
  layout: VirtualizerLayoutClass<O> | VirtualizerLayout<O>;
119
183
  /** Layout options consumed by the layout implementation. */
120
184
  layoutOptions?: O;
185
+ /**
186
+ * Whether to observe each item's size with a ResizeObserver and re-measure
187
+ * when it changes. RAC `VirtualizerProps.shouldObserveItemSize`. Estimated
188
+ * rows still measure once even when this is false.
189
+ */
190
+ shouldObserveItemSize?: boolean;
121
191
  /** Optional renderer for collection drop indicators in virtualized flows. */
122
192
  renderDropIndicator?: (
123
193
  index: number,
@@ -132,8 +202,6 @@ export interface VirtualizerProps<O> extends Omit<
132
202
  * so a virtualizer with unbounded height still virtualizes as the page scrolls.
133
203
  */
134
204
  allowsWindowScrolling?: boolean;
135
- class?: string;
136
- style?: string | JSX.CSSProperties;
137
205
  }
138
206
 
139
207
  function getObjectValue<T extends object, K extends keyof T>(
@@ -159,7 +227,8 @@ function isSameLayoutInfo(a: LayoutInfo, b: LayoutInfo): boolean {
159
227
  a.rect.x === b.rect.x &&
160
228
  a.rect.y === b.rect.y &&
161
229
  a.rect.width === b.rect.width &&
162
- a.rect.height === b.rect.height
230
+ a.rect.height === b.rect.height &&
231
+ a.estimatedSize === b.estimatedSize
163
232
  );
164
233
  }
165
234
 
@@ -172,50 +241,44 @@ export function Virtualizer<O>(props: VirtualizerProps<O>): JSX.Element {
172
241
  "children",
173
242
  "layout",
174
243
  "layoutOptions",
244
+ "shouldObserveItemSize",
175
245
  "renderDropIndicator",
176
246
  "getDropOperation",
177
247
  "allowsWindowScrolling",
178
- "class",
179
- "style",
180
248
  ]);
181
249
  // The scroll view's own scroll position (its scrollTop).
182
- const [scrollOffset, setScrollOffset] = createSignal(0);
250
+ const [scrollOffset, setScrollOffset] = createSignal(0, { ownedWrite: true });
183
251
  // The scroll view's horizontal scroll position (its scrollLeft), used as the
184
252
  // primary scroll axis when the layout's orientation is horizontal.
185
- const [scrollOffsetX, setScrollOffsetX] = createSignal(0);
253
+ const [scrollOffsetX, setScrollOffsetX] = createSignal(0, { ownedWrite: true });
186
254
  // How far the scroll view's top edge is above the window viewport, due to the
187
255
  // page (or an ancestor) being scrolled. Mirrors upstream ScrollView.viewportOffset.
188
- const [viewportOffset, setViewportOffset] = createSignal(0);
256
+ const [viewportOffset, setViewportOffset] = createSignal(0, { ownedWrite: true });
189
257
  // The window viewport height, used as the visible height cap when window scrolling.
190
- const [windowViewportSize, setWindowViewportSize] = createSignal(0);
258
+ const [windowViewportSize, setWindowViewportSize] = createSignal(0, { ownedWrite: true });
191
259
  // The scroll view's own measured size (clientHeight/clientWidth).
192
- const [measuredViewportSize, setMeasuredViewportSize] = createSignal(0);
193
- const [measuredViewportWidth, setMeasuredViewportWidth] = createSignal(0);
260
+ const [measuredViewportSize, setMeasuredViewportSize] = createSignal(0, { ownedWrite: true });
261
+ const [measuredViewportWidth, setMeasuredViewportWidth] = createSignal(0, { ownedWrite: true });
194
262
  const allowsWindowScrolling = createMemo(() => local.allowsWindowScrolling ?? true);
195
- // Whether the scroll view is actively scrolling. Mirrors upstream ScrollView's
196
- // `isScrolling`: while scrolling, the content gets `pointer-events: none` so pointer
197
- // events don't hit rows recycling under a stationary cursor (avoiding hover-state
198
- // flicker and needless hit-testing). It flips back 300ms after the last scroll.
199
- const [isScrolling, setIsScrolling] = createSignal(false);
200
263
  const [dropTargetResolver, setDropTargetResolver] = createSignal<
201
264
  VirtualizerDropTargetResolver | undefined
202
- >(undefined);
265
+ >(undefined, { ownedWrite: true });
203
266
  const [dropTargetItemCountResolver, setDropTargetItemCountResolver] = createSignal<
204
267
  (() => number) | undefined
205
- >(undefined);
268
+ >(undefined, { ownedWrite: true });
206
269
  const [dropTargetIndexResolver, setDropTargetIndexResolver] = createSignal<
207
270
  ((key: string | number) => number | null) | undefined
208
- >(undefined);
271
+ >(undefined, { ownedWrite: true });
209
272
  const [dropOperationResolver, setDropOperationResolver] = createSignal<
210
273
  VirtualizerDropOperationResolver | undefined
211
- >(undefined);
274
+ >(undefined, { ownedWrite: true });
212
275
  const [keyboardNavigationOverride, setKeyboardNavigationOverride] = createSignal<
213
276
  VirtualizerKeyboardNavigationOverride | undefined
214
- >(undefined);
215
- let containerRef: HTMLDivElement | undefined;
277
+ >(undefined, { ownedWrite: true });
216
278
  const fallbackLayout = new ListLayout();
217
279
  const visibleRangeCache = new Map<number, VirtualizerVisibleRange>();
218
280
  const layoutInfoCache = new Map<number, LayoutInfo>();
281
+ const [layoutEpoch, setLayoutEpoch] = createSignal(0);
219
282
 
220
283
  const layout = createMemo<VirtualizerLayout<O>>(() => {
221
284
  if (typeof local.layout === "function") {
@@ -248,7 +311,7 @@ export function Virtualizer<O>(props: VirtualizerProps<O>): JSX.Element {
248
311
  }
249
312
  return { viewportWidth: measuredViewportWidth() } as O;
250
313
  });
251
- const itemSize = createMemo(() => getObjectValue(virtualOptions(), "itemSize") ?? 40);
314
+ const itemSize = createMemo(() => resolveListRowSize(virtualOptions()));
252
315
  const overscan = createMemo(() => getObjectValue(virtualOptions(), "overscan") ?? 2);
253
316
  const orientation = createMemo<Orientation>(
254
317
  () => getObjectValue(virtualOptions(), "orientation") ?? "vertical",
@@ -309,6 +372,7 @@ export function Virtualizer<O>(props: VirtualizerProps<O>): JSX.Element {
309
372
  return nextRange;
310
373
  };
311
374
  const getLayoutInfo = (index: number): LayoutInfo => {
375
+ layoutEpoch();
312
376
  const ctx: VirtualizerLayoutInfoContext = {
313
377
  viewportWidth: measuredViewportWidth(),
314
378
  viewportHeight: measuredViewportSize(),
@@ -344,6 +408,35 @@ export function Virtualizer<O>(props: VirtualizerProps<O>): JSX.Element {
344
408
  layoutInfoCache.set(index, nextInfo);
345
409
  return nextInfo;
346
410
  };
411
+ const getContentSize = (itemCount: number): Size => {
412
+ layoutEpoch();
413
+ const ctx: VirtualizerLayoutInfoContext = {
414
+ viewportWidth: measuredViewportWidth(),
415
+ viewportHeight: measuredViewportSize(),
416
+ };
417
+ const fromLayout = resolvedLayout().getContentSize?.(
418
+ itemCount,
419
+ ctx,
420
+ layoutOptionsWithViewport(),
421
+ );
422
+ if (fromLayout) return fromLayout;
423
+ const range = getVisibleRange(itemCount);
424
+ const visible = Math.max(0, range.end - range.start);
425
+ const main = range.offsetTop + visible * itemSize() + range.offsetBottom;
426
+ if (orientation() === "horizontal") {
427
+ return { width: main, height: Math.max(0, measuredViewportSize()) };
428
+ }
429
+ return { width: Math.max(0, measuredViewportWidth()), height: main };
430
+ };
431
+ const updateItemSize = (index: number, mainSize: number): boolean => {
432
+ const changed = resolvedLayout().updateItemSize?.(index, mainSize) ?? false;
433
+ if (changed) {
434
+ layoutInfoCache.clear();
435
+ visibleRangeCache.clear();
436
+ setLayoutEpoch((epoch) => epoch + 1);
437
+ }
438
+ return changed;
439
+ };
347
440
  const getDropTargetFromPoint = (
348
441
  point: Point,
349
442
  itemCount: number,
@@ -711,6 +804,8 @@ export function Virtualizer<O>(props: VirtualizerProps<O>): JSX.Element {
711
804
  orientation: orientation(),
712
805
  getVisibleRange,
713
806
  getLayoutInfo,
807
+ getContentSize,
808
+ updateItemSize,
714
809
  getDropTargetFromPoint,
715
810
  setDropTargetResolver: assignDropTargetResolver,
716
811
  setDropTargetItemCountResolver: assignDropTargetItemCountResolver,
@@ -730,135 +825,302 @@ export function Virtualizer<O>(props: VirtualizerProps<O>): JSX.Element {
730
825
  getKeyboardPageNavigationTarget,
731
826
  },
732
827
  renderDropIndicator: local.renderDropIndicator,
828
+ CollectionRoot,
829
+ CollectionBranch,
733
830
  }));
734
831
 
735
- const filteredDomProps = createMemo(() => filterDOMProps(domProps, { global: true }));
832
+ const scrollRuntime: VirtualizerScrollRuntime = {
833
+ setScrollOffset,
834
+ setScrollOffsetX,
835
+ setViewportOffset,
836
+ setWindowViewportSize,
837
+ setMeasuredViewportSize,
838
+ setMeasuredViewportWidth,
839
+ allowsWindowScrolling,
840
+ };
841
+
842
+ // RAC `Virtualizer.tsx:71-96`: context-only — no DOM. The collection element
843
+ // is the scroller; CollectionRoot owns useScrollView against that ref.
844
+ return (
845
+ <CollectionRendererContext value={collectionRenderer()}>
846
+ <VirtualizerContext value={contextValue()}>
847
+ <VirtualizerOptionsContext
848
+ value={{
849
+ layout: resolvedLayout() as VirtualizerLayout<unknown>,
850
+ layoutOptions: resolvedLayoutOptions(),
851
+ shouldObserveItemSize: local.shouldObserveItemSize,
852
+ allowsWindowScrolling: allowsWindowScrolling(),
853
+ }}
854
+ >
855
+ <VirtualizerScrollRuntimeContext value={scrollRuntime}>
856
+ {local.children}
857
+ </VirtualizerScrollRuntimeContext>
858
+ </VirtualizerOptionsContext>
859
+ </VirtualizerContext>
860
+ </CollectionRendererContext>
861
+ );
862
+ }
863
+
864
+ function resolveScrollRef(
865
+ scrollRef: CollectionRootProps<unknown>["scrollRef"],
866
+ ): HTMLElement | null {
867
+ if (!scrollRef) return null;
868
+ return scrollRef() ?? null;
869
+ }
870
+
871
+ /**
872
+ * RAC `Virtualizer.tsx:99-151` CollectionRoot: owns virtualizer scroll against
873
+ * `scrollRef` (the collection element) and renders the single content div.
874
+ */
875
+ function CollectionRoot<T>(props: CollectionRootProps<T>): JSX.Element {
876
+ const virtualizer = useVirtualizerContext();
877
+ const runtime = useContext(VirtualizerScrollRuntimeContext);
878
+
879
+ const scrollView = createScrollView({
880
+ getScrollElement: () => resolveScrollRef(props.scrollRef),
881
+ allowsWindowScrolling: () => runtime?.allowsWindowScrolling() ?? true,
882
+ onScrollPositionChange: (position) => {
883
+ runtime?.setScrollOffset(position.y);
884
+ runtime?.setScrollOffsetX(position.x);
885
+ },
886
+ onViewportOffsetChange: (offset) => runtime?.setViewportOffset(offset),
887
+ onSizeChange: (size) => {
888
+ runtime?.setMeasuredViewportSize(size.height);
889
+ runtime?.setMeasuredViewportWidth(size.width);
890
+ },
891
+ onWindowViewportChange: (height) => runtime?.setWindowViewportSize(height),
892
+ });
736
893
 
737
- const updateViewportSize = () => {
738
- if (!containerRef) return;
739
- const nextHeight = containerRef.clientHeight;
740
- const nextWidth = containerRef.clientWidth;
741
- if (nextHeight !== measuredViewportSize()) setMeasuredViewportSize(nextHeight);
742
- if (nextWidth !== measuredViewportWidth()) setMeasuredViewportWidth(nextWidth);
894
+ const itemCount = () => {
895
+ try {
896
+ return Array.from(props.collection ?? []).length;
897
+ } catch {
898
+ return 0;
899
+ }
743
900
  };
744
901
 
745
- const updateWindowViewport = () => {
746
- if (typeof window === "undefined") return;
747
- const next = window.innerHeight;
748
- if (next !== windowViewportSize()) setWindowViewportSize(next);
902
+ const range = createMemo(() => {
903
+ if (!virtualizer) return null;
904
+ const count = itemCount();
905
+ if (count <= 0) return null;
906
+ // Geometry window only. Persisted focused keys render as absolutely
907
+ // positioned extras (PersistedVirtualItem) so scrollHeight stays the
908
+ // content extent. RAC VirtualizerItem does the same with layoutInfo.
909
+ return virtualizer.getVisibleRange(count);
910
+ });
911
+
912
+ // Keep collection getter allocations in a stable owner, independent of the
913
+ // wrapper's hydration-key order.
914
+ const contentProps = createMemo<JSX.HTMLAttributes<HTMLDivElement>>(() => {
915
+ const base = scrollView.contentProps();
916
+ const nextRange = range();
917
+ const count = itemCount();
918
+ const size = virtualizer && count > 0 ? virtualizer.getContentSize(count) : null;
919
+ const horizontal = virtualizer?.orientation === "horizontal";
920
+ const padStart = nextRange?.offsetTop ?? 0;
921
+ const padEnd = nextRange?.offsetBottom ?? 0;
922
+ // RAC `useScrollView` sizes the content div from `contentSize`. Windowing
923
+ // spacers stay so in-flow collections (GridList) still skip scrolled-off
924
+ // rows; `box-sizing: border-box` keeps that padding inside contentSize so
925
+ // absolute VirtualizerItem coordinates and the scroll extent agree.
926
+ return {
927
+ ...base,
928
+ style: {
929
+ ...(base.style as JSX.CSSProperties | undefined),
930
+ position: "relative",
931
+ "box-sizing": "border-box",
932
+ ...(size && size.width > 0 ? { width: `${size.width}px` } : null),
933
+ ...(size && size.height > 0 ? { height: `${size.height}px` } : null),
934
+ ...(horizontal
935
+ ? { "padding-left": `${padStart}px`, "padding-right": `${padEnd}px` }
936
+ : { "padding-top": `${padStart}px`, "padding-bottom": `${padEnd}px` }),
937
+ },
938
+ };
939
+ });
940
+
941
+ return (
942
+ <div {...contentProps()}>
943
+ {props.children ??
944
+ DefaultCollectionRenderer.CollectionRoot({
945
+ collection: props.collection,
946
+ renderDropIndicator: props.renderDropIndicator,
947
+ })}
948
+ </div>
949
+ );
950
+ }
951
+
952
+ function CollectionBranch<T>(props: CollectionBranchProps<T>): JSX.Element {
953
+ return DefaultCollectionRenderer.CollectionBranch(props);
954
+ }
955
+
956
+ /**
957
+ * RAC `layoutInfoToStyle` (`react-aria/src/virtualizer/VirtualizerItem.tsx`).
958
+ * ListLayout sets `allowOverflow`, so overflow stays visible.
959
+ */
960
+ export function layoutInfoToStyle(layoutInfo: LayoutInfo, dir: "ltr" | "rtl"): JSX.CSSProperties {
961
+ const xProperty = dir === "rtl" ? "right" : "left";
962
+ return {
963
+ position: "absolute",
964
+ overflow: "visible",
965
+ contain: "size layout style",
966
+ "z-index": 0,
967
+ top: `${layoutInfo.rect.y}px`,
968
+ [xProperty]: `${layoutInfo.rect.x}px`,
969
+ width: `${layoutInfo.rect.width}px`,
970
+ height: `${layoutInfo.rect.height}px`,
749
971
  };
972
+ }
750
973
 
751
- // Recompute how far the scroll view's top edge sits above the window viewport.
752
- // A negative bounding-rect top means the scroll view has been pushed up by page
753
- // (or ancestor) scrolling; the offset is the amount scrolled past its top.
754
- const updateViewportOffset = () => {
755
- if (!containerRef || !allowsWindowScrolling()) return;
756
- const rect = containerRef.getBoundingClientRect();
757
- const next = rect.y < 0 ? -rect.y : 0;
758
- if (next !== viewportOffset()) setViewportOffset(next);
974
+ /**
975
+ * RAC VirtualizerItem (`react-aria/src/virtualizer/VirtualizerItem.tsx` +
976
+ * `layoutInfoToStyle`) wraps every visible view in `role="presentation"` with
977
+ * `contain: size layout style` and a definite width/height from layoutInfo.
978
+ * Pass `index` so the item is absolutely positioned; without it the wrapper
979
+ * stays in-flow (GridList still windows with CollectionRoot padding spacers).
980
+ * jsdom reports 0 for unstyled offsetHeight; skip containment then so
981
+ * collection tests keep seeing the children.
982
+ */
983
+ export function VirtualizerItem(props: {
984
+ children: JSX.Element;
985
+ index?: number | Accessor<number>;
986
+ }): JSX.Element {
987
+ const virtualizer = useVirtualizerContext();
988
+ const options = useContext(VirtualizerOptionsContext);
989
+ const locale = useLocale();
990
+ const [box, setBox] = createSignal<{ width: number; height: number } | null>(null);
991
+ const [el, setEl] = createSignal<HTMLDivElement | null>(null);
992
+ const resolvedIndex = (): number | null => {
993
+ const value = props.index;
994
+ if (value == null) return null;
995
+ return typeof value === "function" ? value() : value;
996
+ };
997
+ const layout = (): LayoutInfo | null => {
998
+ const index = resolvedIndex();
999
+ if (index == null || !virtualizer) return null;
1000
+ return virtualizer.getLayoutInfo(index);
759
1001
  };
760
1002
 
761
- let scrollFrame: number | undefined;
762
- // Debounce handle that resets `isScrolling` after scrolling stops.
763
- let scrollEndTimeout: ReturnType<typeof setTimeout> | undefined;
764
- onCleanup(() => {
765
- if (scrollFrame != null) cancelAnimationFrame(scrollFrame);
766
- if (scrollEndTimeout != null) clearTimeout(scrollEndTimeout);
767
- });
1003
+ createTrackedEffect(() => {
1004
+ const _s2Cleanups: Array<() => void> = [];
768
1005
 
769
- onMount(() => {
770
- updateViewportSize();
771
- updateWindowViewport();
772
- updateViewportOffset();
1006
+ const node = el();
1007
+ if (!node) return;
1008
+ const info = layout();
1009
+ const index = resolvedIndex();
773
1010
 
774
- const handleResize = () => {
775
- updateViewportSize();
776
- updateWindowViewport();
777
- updateViewportOffset();
1011
+ const measureIndexed = () => {
1012
+ if (info == null || index == null || !virtualizer) return;
1013
+ // RAC useVirtualizerItem.ts:37-42 — a hidden collection reports 0 and
1014
+ // then never recovers when shown. Skip the write.
1015
+ if (!isElementVisible(node)) return;
1016
+ if (!info.estimatedSize && !options?.shouldObserveItemSize) return;
1017
+ const prevHeight = node.style.height;
1018
+ const prevWidth = node.style.width;
1019
+ const prevContain = node.style.contain;
1020
+ node.style.contain = "";
1021
+ node.style.height = "";
1022
+ node.style.width = "";
1023
+ const width = node.scrollWidth;
1024
+ const height = node.scrollHeight;
1025
+ node.style.height = prevHeight;
1026
+ node.style.width = prevWidth;
1027
+ node.style.contain = prevContain;
1028
+ if (height <= 0 || width <= 0) return;
1029
+ const main = virtualizer.orientation === "horizontal" ? width : height;
1030
+ virtualizer.updateItemSize(index, main);
778
1031
  };
779
- window.addEventListener("resize", handleResize);
780
1032
 
781
- const resizeObserver =
782
- typeof ResizeObserver !== "undefined" ? new ResizeObserver(() => updateViewportSize()) : null;
783
- if (containerRef && resizeObserver) {
784
- resizeObserver.observe(containerRef);
1033
+ if (info != null && index != null && virtualizer) {
1034
+ // RAC layout effect: estimated rows measure once even when observation
1035
+ // is off. Two rAFs cover jsdom's first 0-height layout.
1036
+ if (info.estimatedSize) {
1037
+ measureIndexed();
1038
+ const frame = requestAnimationFrame(() => {
1039
+ measureIndexed();
1040
+ requestAnimationFrame(measureIndexed);
1041
+ });
1042
+ _s2Cleanups.push(() => cancelAnimationFrame(frame));
1043
+ }
1044
+ // RAC ResizeObserver on the wrapper's direct children, not the wrapper
1045
+ // (`useVirtualizerItem.ts:63-87`). The wrapper height is layout-fixed.
1046
+ if (options?.shouldObserveItemSize && typeof ResizeObserver !== "undefined") {
1047
+ const resizeObserver = new ResizeObserver(() => measureIndexed());
1048
+ for (const child of node.children) {
1049
+ resizeObserver.observe(child);
1050
+ }
1051
+ _s2Cleanups.push(() => resizeObserver.disconnect());
1052
+ }
1053
+ // A tracked effect's cleanup is its return value; a bare return here
1054
+ // would strand the frame and the observer registered above.
1055
+ return () => {
1056
+ for (const c of _s2Cleanups) c();
1057
+ };
785
1058
  }
786
1059
 
787
- // A capturing listener on the document sees scroll events on the scroll view
788
- // itself as well as on any ancestor (including the page), so a single handler
789
- // can update the local scroll position or the window offset as appropriate.
790
- const handleDocumentScroll = (e: Event) => {
791
- if (!containerRef) return;
792
- const target = e.target as Node | null;
793
- const isContainer = target === containerRef;
794
- const isAncestor =
795
- target === document ||
796
- target === (window as unknown as Node) ||
797
- (target instanceof Node && target.contains(containerRef));
798
- if (!isContainer && !isAncestor) return;
799
- // An ancestor/page scroll only matters when the collection scrolls with the page.
800
- if (!isContainer && !allowsWindowScrolling()) return;
801
-
802
- // Flag active scrolling and (re)arm the reset for 300ms after the last scroll.
803
- // Our handler is already rAF-throttled, so a plain clear/reset debounce matches
804
- // upstream's scrollEndTime bookkeeping without the extra accounting.
805
- if (!isScrolling()) setIsScrolling(true);
806
- if (scrollEndTimeout != null) clearTimeout(scrollEndTimeout);
807
- scrollEndTimeout = setTimeout(() => {
808
- scrollEndTimeout = undefined;
809
- setIsScrolling(false);
810
- }, 300);
811
-
812
- if (scrollFrame != null) cancelAnimationFrame(scrollFrame);
813
- scrollFrame = requestAnimationFrame(() => {
814
- scrollFrame = undefined;
815
- if (isContainer) {
816
- const next = Math.max(0, containerRef!.scrollTop);
817
- if (next !== scrollOffset()) setScrollOffset(next);
818
- const nextX = Math.max(0, containerRef!.scrollLeft);
819
- if (nextX !== scrollOffsetX()) setScrollOffsetX(nextX);
820
- } else {
821
- updateViewportOffset();
822
- }
823
- updateViewportSize();
1060
+ const readBox = () => {
1061
+ const child = node.firstElementChild as HTMLElement | null;
1062
+ const height = child?.offsetHeight ?? 0;
1063
+ const width = node.clientWidth;
1064
+ if (height <= 0 || width <= 0) return;
1065
+ setBox((current) => {
1066
+ if (current?.width === width && current.height === height) return current;
1067
+ return { width, height };
824
1068
  });
825
1069
  };
826
- document.addEventListener("scroll", handleDocumentScroll, true);
827
-
828
- onCleanup(() => {
829
- window.removeEventListener("resize", handleResize);
830
- resizeObserver?.disconnect();
831
- document.removeEventListener("scroll", handleDocumentScroll, true);
1070
+ readBox();
1071
+ const frame = requestAnimationFrame(() => {
1072
+ readBox();
1073
+ requestAnimationFrame(readBox);
832
1074
  });
1075
+ _s2Cleanups.push(() => cancelAnimationFrame(frame));
1076
+
1077
+ return () => {
1078
+ for (const c of _s2Cleanups) c();
1079
+ };
833
1080
  });
834
1081
 
1082
+ const style = (): JSX.CSSProperties => {
1083
+ const info = layout();
1084
+ if (info) return layoutInfoToStyle(info, locale().direction);
1085
+ return {
1086
+ position: "relative",
1087
+ "z-index": 0,
1088
+ overflow: "visible",
1089
+ contain: box() ? "size layout style" : undefined,
1090
+ width: "100%",
1091
+ height: box() ? `${box()!.height}px` : undefined,
1092
+ };
1093
+ };
1094
+
835
1095
  return (
836
- <CollectionRendererContext.Provider value={collectionRenderer()}>
837
- <VirtualizerContext.Provider value={contextValue()}>
838
- <div
839
- {...filteredDomProps()}
840
- ref={(el) => {
841
- containerRef = el;
842
- }}
843
- class={local.class}
844
- style={local.style}
845
- data-virtualizer
846
- >
847
- {/*
848
- Content wrapper mirroring upstream ScrollView's inner content div. It
849
- carries the `pointer-events: none` while-scrolling optimization and is
850
- otherwise a layout-transparent passthrough (the outer div remains the
851
- scroll container we measure and read scroll offsets from).
852
- */}
853
- <div
854
- data-virtualizer-content
855
- style={{ "pointer-events": isScrolling() ? "none" : undefined }}
856
- >
857
- {local.children}
858
- </div>
859
- </div>
860
- </VirtualizerContext.Provider>
861
- </CollectionRendererContext.Provider>
1096
+ <div role="presentation" ref={setEl} style={style()}>
1097
+ {props.children}
1098
+ </div>
1099
+ );
1100
+ }
1101
+
1102
+ /**
1103
+ * RAC VirtualizerItem lays persisted (focused / drop-target) views with
1104
+ * layoutInfo absolute coordinates so they stay mounted off-screen without
1105
+ * expanding the in-flow window or the content extent.
1106
+ */
1107
+ export function PersistedVirtualItem(props: { index: number; children: JSX.Element }): JSX.Element {
1108
+ const virtualizer = useVirtualizerContext();
1109
+ const layout = () => virtualizer?.getLayoutInfo(props.index);
1110
+ const horizontal = () => virtualizer?.orientation === "horizontal";
1111
+ return (
1112
+ <div
1113
+ data-persisted-virtual-item=""
1114
+ style={{
1115
+ position: "absolute",
1116
+ top: horizontal() ? 0 : `${layout()?.rect.y ?? 0}px`,
1117
+ left: horizontal() ? `${layout()?.rect.x ?? 0}px` : 0,
1118
+ width: layout()?.rect.width ? `${layout()?.rect.width}px` : undefined,
1119
+ height: layout()?.rect.height ? `${layout()?.rect.height}px` : undefined,
1120
+ }}
1121
+ >
1122
+ {props.children}
1123
+ </div>
862
1124
  );
863
1125
  }
864
1126