@proyecto-viviana/solidaria-components 0.3.2 → 0.4.1

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 (417) hide show
  1. package/dist/ActionBar.d.ts.map +1 -1
  2. package/dist/ActionBar.js +175 -0
  3. package/dist/ActionBar.js.map +1 -0
  4. package/dist/ActionBar.jsx +119 -0
  5. package/dist/ActionBar.jsx.map +1 -0
  6. package/dist/ActionGroup.d.ts.map +1 -1
  7. package/dist/ActionGroup.js +179 -0
  8. package/dist/ActionGroup.js.map +1 -0
  9. package/dist/ActionGroup.jsx +129 -0
  10. package/dist/ActionGroup.jsx.map +1 -0
  11. package/dist/Alert.js +111 -0
  12. package/dist/Alert.js.map +1 -0
  13. package/dist/Alert.jsx +82 -0
  14. package/dist/Alert.jsx.map +1 -0
  15. package/dist/Autocomplete.d.ts +2 -2
  16. package/dist/Autocomplete.d.ts.map +1 -1
  17. package/dist/Autocomplete.js +130 -0
  18. package/dist/Autocomplete.js.map +1 -0
  19. package/dist/Autocomplete.jsx +116 -0
  20. package/dist/Autocomplete.jsx.map +1 -0
  21. package/dist/Breadcrumbs.d.ts.map +1 -1
  22. package/dist/Breadcrumbs.js +333 -0
  23. package/dist/Breadcrumbs.js.map +1 -0
  24. package/dist/Breadcrumbs.jsx +261 -0
  25. package/dist/Breadcrumbs.jsx.map +1 -0
  26. package/dist/Button.d.ts.map +1 -1
  27. package/dist/Button.js +348 -0
  28. package/dist/Button.js.map +1 -0
  29. package/dist/Button.jsx +314 -0
  30. package/dist/Button.jsx.map +1 -0
  31. package/dist/Calendar.d.ts +4 -4
  32. package/dist/Calendar.d.ts.map +1 -1
  33. package/dist/Calendar.js +573 -0
  34. package/dist/Calendar.js.map +1 -0
  35. package/dist/Calendar.jsx +342 -0
  36. package/dist/Calendar.jsx.map +1 -0
  37. package/dist/CalendarPicker.d.ts +33 -0
  38. package/dist/CalendarPicker.d.ts.map +1 -0
  39. package/dist/CalendarPicker.js +44 -0
  40. package/dist/CalendarPicker.js.map +1 -0
  41. package/dist/CalendarPicker.jsx +44 -0
  42. package/dist/CalendarPicker.jsx.map +1 -0
  43. package/dist/Checkbox.d.ts +83 -4
  44. package/dist/Checkbox.d.ts.map +1 -1
  45. package/dist/Checkbox.js +923 -0
  46. package/dist/Checkbox.js.map +1 -0
  47. package/dist/Checkbox.jsx +707 -0
  48. package/dist/Checkbox.jsx.map +1 -0
  49. package/dist/Collection.d.ts.map +1 -1
  50. package/dist/Collection.js +202 -0
  51. package/dist/Collection.js.map +1 -0
  52. package/dist/Collection.jsx +152 -0
  53. package/dist/Collection.jsx.map +1 -0
  54. package/dist/Color.d.ts.map +1 -1
  55. package/dist/Color.js +1717 -0
  56. package/dist/Color.js.map +1 -0
  57. package/dist/Color.jsx +1340 -0
  58. package/dist/Color.jsx.map +1 -0
  59. package/dist/ColorEditor.js +208 -0
  60. package/dist/ColorEditor.js.map +1 -0
  61. package/dist/ColorEditor.jsx +120 -0
  62. package/dist/ColorEditor.jsx.map +1 -0
  63. package/dist/ComboBox.d.ts +8 -4
  64. package/dist/ComboBox.d.ts.map +1 -1
  65. package/dist/ComboBox.js +1000 -0
  66. package/dist/ComboBox.js.map +1 -0
  67. package/dist/ComboBox.jsx +724 -0
  68. package/dist/ComboBox.jsx.map +1 -0
  69. package/dist/ContextualHelpTrigger.js +146 -0
  70. package/dist/ContextualHelpTrigger.js.map +1 -0
  71. package/dist/ContextualHelpTrigger.jsx +109 -0
  72. package/dist/ContextualHelpTrigger.jsx.map +1 -0
  73. package/dist/DateField.d.ts +14 -5
  74. package/dist/DateField.d.ts.map +1 -1
  75. package/dist/DateField.js +4 -0
  76. package/dist/DateField.jsx +4 -0
  77. package/dist/DateField2.js +502 -0
  78. package/dist/DateField2.js.map +1 -0
  79. package/dist/DateField2.jsx +354 -0
  80. package/dist/DateField2.jsx.map +1 -0
  81. package/dist/DatePicker.d.ts +46 -7
  82. package/dist/DatePicker.d.ts.map +1 -1
  83. package/dist/DatePicker.js +7 -0
  84. package/dist/DatePicker.jsx +7 -0
  85. package/dist/DatePicker2.js +1171 -0
  86. package/dist/DatePicker2.js.map +1 -0
  87. package/dist/DatePicker2.jsx +820 -0
  88. package/dist/DatePicker2.jsx.map +1 -0
  89. package/dist/DateRangePickerContext.d.ts +2 -0
  90. package/dist/DateRangePickerContext.d.ts.map +1 -1
  91. package/dist/Dialog.d.ts.map +1 -1
  92. package/dist/Dialog.js +337 -0
  93. package/dist/Dialog.js.map +1 -0
  94. package/dist/Dialog.jsx +192 -0
  95. package/dist/Dialog.jsx.map +1 -0
  96. package/dist/Disclosure.d.ts.map +1 -1
  97. package/dist/Disclosure.js +331 -0
  98. package/dist/Disclosure.js.map +1 -0
  99. package/dist/Disclosure.jsx +230 -0
  100. package/dist/Disclosure.jsx.map +1 -0
  101. package/dist/DragAndDrop.d.ts.map +1 -1
  102. package/dist/DragAndDrop.js +176 -0
  103. package/dist/DragAndDrop.js.map +1 -0
  104. package/dist/DragAndDrop.jsx +160 -0
  105. package/dist/DragAndDrop.jsx.map +1 -0
  106. package/dist/DropZone.d.ts.map +1 -1
  107. package/dist/DropZone.js +189 -0
  108. package/dist/DropZone.js.map +1 -0
  109. package/dist/DropZone.jsx +144 -0
  110. package/dist/DropZone.jsx.map +1 -0
  111. package/dist/FieldError.js +66 -0
  112. package/dist/FieldError.js.map +1 -0
  113. package/dist/FieldError.jsx +47 -0
  114. package/dist/FieldError.jsx.map +1 -0
  115. package/dist/FileTrigger.js +79 -0
  116. package/dist/FileTrigger.js.map +1 -0
  117. package/dist/FileTrigger.jsx +49 -0
  118. package/dist/FileTrigger.jsx.map +1 -0
  119. package/dist/Focusable.js +70 -0
  120. package/dist/Focusable.js.map +1 -0
  121. package/dist/Focusable.jsx +69 -0
  122. package/dist/Focusable.jsx.map +1 -0
  123. package/dist/Form.js +99 -0
  124. package/dist/Form.js.map +1 -0
  125. package/dist/Form.jsx +73 -0
  126. package/dist/Form.jsx.map +1 -0
  127. package/dist/GridList.d.ts +34 -2
  128. package/dist/GridList.d.ts.map +1 -1
  129. package/dist/GridList.js +723 -0
  130. package/dist/GridList.js.map +1 -0
  131. package/dist/GridList.jsx +552 -0
  132. package/dist/GridList.jsx.map +1 -0
  133. package/dist/Icon.d.ts.map +1 -1
  134. package/dist/Icon.js +127 -0
  135. package/dist/Icon.js.map +1 -0
  136. package/dist/Icon.jsx +72 -0
  137. package/dist/Icon.jsx.map +1 -0
  138. package/dist/Keyboard.js +30 -0
  139. package/dist/Keyboard.js.map +1 -0
  140. package/dist/Keyboard.jsx +24 -0
  141. package/dist/Keyboard.jsx.map +1 -0
  142. package/dist/Landmark.js +134 -0
  143. package/dist/Landmark.js.map +1 -0
  144. package/dist/Landmark.jsx +118 -0
  145. package/dist/Landmark.jsx.map +1 -0
  146. package/dist/Link.d.ts.map +1 -1
  147. package/dist/Link.js +219 -0
  148. package/dist/Link.js.map +1 -0
  149. package/dist/Link.jsx +189 -0
  150. package/dist/Link.jsx.map +1 -0
  151. package/dist/ListBox.d.ts +2 -2
  152. package/dist/ListBox.d.ts.map +1 -1
  153. package/dist/ListBox.js +831 -0
  154. package/dist/ListBox.js.map +1 -0
  155. package/dist/ListBox.jsx +644 -0
  156. package/dist/ListBox.jsx.map +1 -0
  157. package/dist/Menu.d.ts +27 -9
  158. package/dist/Menu.d.ts.map +1 -1
  159. package/dist/Menu.js +1254 -0
  160. package/dist/Menu.js.map +1 -0
  161. package/dist/Menu.jsx +1042 -0
  162. package/dist/Menu.jsx.map +1 -0
  163. package/dist/Meter.d.ts.map +1 -1
  164. package/dist/Meter.js +123 -0
  165. package/dist/Meter.js.map +1 -0
  166. package/dist/Meter.jsx +107 -0
  167. package/dist/Meter.jsx.map +1 -0
  168. package/dist/Modal.d.ts.map +1 -1
  169. package/dist/Modal.js +382 -0
  170. package/dist/Modal.js.map +1 -0
  171. package/dist/Modal.jsx +314 -0
  172. package/dist/Modal.jsx.map +1 -0
  173. package/dist/NumberField.d.ts +3 -3
  174. package/dist/NumberField.d.ts.map +1 -1
  175. package/dist/NumberField.js +573 -0
  176. package/dist/NumberField.js.map +1 -0
  177. package/dist/NumberField.jsx +443 -0
  178. package/dist/NumberField.jsx.map +1 -0
  179. package/dist/Popover.d.ts +10 -2
  180. package/dist/Popover.d.ts.map +1 -1
  181. package/dist/Popover.js +471 -0
  182. package/dist/Popover.js.map +1 -0
  183. package/dist/Popover.jsx +354 -0
  184. package/dist/Popover.jsx.map +1 -0
  185. package/dist/Pressable.js +69 -0
  186. package/dist/Pressable.js.map +1 -0
  187. package/dist/Pressable.jsx +68 -0
  188. package/dist/Pressable.jsx.map +1 -0
  189. package/dist/ProgressBar.d.ts.map +1 -1
  190. package/dist/ProgressBar.js +130 -0
  191. package/dist/ProgressBar.js.map +1 -0
  192. package/dist/ProgressBar.jsx +114 -0
  193. package/dist/ProgressBar.jsx.map +1 -0
  194. package/dist/RadioGroup.d.ts +82 -4
  195. package/dist/RadioGroup.d.ts.map +1 -1
  196. package/dist/RadioGroup.js +931 -0
  197. package/dist/RadioGroup.js.map +1 -0
  198. package/dist/RadioGroup.jsx +681 -0
  199. package/dist/RadioGroup.jsx.map +1 -0
  200. package/dist/RangeCalendar.d.ts.map +1 -1
  201. package/dist/RangeCalendar.js +546 -0
  202. package/dist/RangeCalendar.js.map +1 -0
  203. package/dist/RangeCalendar.jsx +323 -0
  204. package/dist/RangeCalendar.jsx.map +1 -0
  205. package/dist/RouterProvider.js +118 -0
  206. package/dist/RouterProvider.js.map +1 -0
  207. package/dist/RouterProvider.jsx +112 -0
  208. package/dist/RouterProvider.jsx.map +1 -0
  209. package/dist/SearchField.d.ts +2 -2
  210. package/dist/SearchField.d.ts.map +1 -1
  211. package/dist/SearchField.js +667 -0
  212. package/dist/SearchField.js.map +1 -0
  213. package/dist/SearchField.jsx +550 -0
  214. package/dist/SearchField.jsx.map +1 -0
  215. package/dist/Select.d.ts +7 -0
  216. package/dist/Select.d.ts.map +1 -1
  217. package/dist/Select.js +1044 -0
  218. package/dist/Select.js.map +1 -0
  219. package/dist/Select.jsx +759 -0
  220. package/dist/Select.jsx.map +1 -0
  221. package/dist/SelectionIndicator.d.ts.map +1 -1
  222. package/dist/SelectionIndicator.js +86 -0
  223. package/dist/SelectionIndicator.js.map +1 -0
  224. package/dist/SelectionIndicator.jsx +50 -0
  225. package/dist/SelectionIndicator.jsx.map +1 -0
  226. package/dist/Separator.js +97 -0
  227. package/dist/Separator.js.map +1 -0
  228. package/dist/Separator.jsx +85 -0
  229. package/dist/Separator.jsx.map +1 -0
  230. package/dist/SharedElementTransition.d.ts.map +1 -1
  231. package/dist/SharedElementTransition.js +167 -0
  232. package/dist/SharedElementTransition.js.map +1 -0
  233. package/dist/SharedElementTransition.jsx +140 -0
  234. package/dist/SharedElementTransition.jsx.map +1 -0
  235. package/dist/Slider.d.ts +33 -1
  236. package/dist/Slider.d.ts.map +1 -1
  237. package/dist/Slider.js +515 -0
  238. package/dist/Slider.js.map +1 -0
  239. package/dist/Slider.jsx +403 -0
  240. package/dist/Slider.jsx.map +1 -0
  241. package/dist/StepList.d.ts.map +1 -1
  242. package/dist/StepList.js +191 -0
  243. package/dist/StepList.js.map +1 -0
  244. package/dist/StepList.jsx +136 -0
  245. package/dist/StepList.jsx.map +1 -0
  246. package/dist/Switch.d.ts +65 -2
  247. package/dist/Switch.d.ts.map +1 -1
  248. package/dist/Switch.js +534 -0
  249. package/dist/Switch.js.map +1 -0
  250. package/dist/Switch.jsx +393 -0
  251. package/dist/Switch.jsx.map +1 -0
  252. package/dist/Table.d.ts +50 -0
  253. package/dist/Table.d.ts.map +1 -1
  254. package/dist/Table.js +1766 -0
  255. package/dist/Table.js.map +1 -0
  256. package/dist/Table.jsx +1355 -0
  257. package/dist/Table.jsx.map +1 -0
  258. package/dist/Tabs.d.ts +0 -4
  259. package/dist/Tabs.d.ts.map +1 -1
  260. package/dist/Tabs.js +598 -0
  261. package/dist/Tabs.js.map +1 -0
  262. package/dist/Tabs.jsx +367 -0
  263. package/dist/Tabs.jsx.map +1 -0
  264. package/dist/TagGroup.d.ts +3 -1
  265. package/dist/TagGroup.d.ts.map +1 -1
  266. package/dist/TagGroup.js +382 -0
  267. package/dist/TagGroup.js.map +1 -0
  268. package/dist/TagGroup.jsx +273 -0
  269. package/dist/TagGroup.jsx.map +1 -0
  270. package/dist/Text.d.ts +18 -6
  271. package/dist/Text.d.ts.map +1 -1
  272. package/dist/Text.js +42 -0
  273. package/dist/Text.js.map +1 -0
  274. package/dist/Text.jsx +35 -0
  275. package/dist/Text.jsx.map +1 -0
  276. package/dist/TextField.d.ts +6 -6
  277. package/dist/TextField.d.ts.map +1 -1
  278. package/dist/TextField.js +439 -0
  279. package/dist/TextField.js.map +1 -0
  280. package/dist/TextField.jsx +406 -0
  281. package/dist/TextField.jsx.map +1 -0
  282. package/dist/TimeField.d.ts +17 -53
  283. package/dist/TimeField.d.ts.map +1 -1
  284. package/dist/TimeField.js +278 -0
  285. package/dist/TimeField.js.map +1 -0
  286. package/dist/TimeField.jsx +218 -0
  287. package/dist/TimeField.jsx.map +1 -0
  288. package/dist/Toast.d.ts +14 -0
  289. package/dist/Toast.d.ts.map +1 -1
  290. package/dist/Toast.js +551 -0
  291. package/dist/Toast.js.map +1 -0
  292. package/dist/Toast.jsx +361 -0
  293. package/dist/Toast.jsx.map +1 -0
  294. package/dist/ToggleButton.d.ts.map +1 -1
  295. package/dist/ToggleButton.js +123 -0
  296. package/dist/ToggleButton.js.map +1 -0
  297. package/dist/ToggleButton.jsx +88 -0
  298. package/dist/ToggleButton.jsx.map +1 -0
  299. package/dist/ToggleButtonGroup.d.ts.map +1 -1
  300. package/dist/ToggleButtonGroup.js +114 -0
  301. package/dist/ToggleButtonGroup.js.map +1 -0
  302. package/dist/ToggleButtonGroup.jsx +85 -0
  303. package/dist/ToggleButtonGroup.jsx.map +1 -0
  304. package/dist/Toolbar.js +112 -0
  305. package/dist/Toolbar.js.map +1 -0
  306. package/dist/Toolbar.jsx +92 -0
  307. package/dist/Toolbar.jsx.map +1 -0
  308. package/dist/Tooltip.d.ts.map +1 -1
  309. package/dist/Tooltip.js +539 -0
  310. package/dist/Tooltip.js.map +1 -0
  311. package/dist/Tooltip.jsx +465 -0
  312. package/dist/Tooltip.jsx.map +1 -0
  313. package/dist/Tree.d.ts +14 -2
  314. package/dist/Tree.d.ts.map +1 -1
  315. package/dist/Tree.js +1424 -0
  316. package/dist/Tree.js.map +1 -0
  317. package/dist/Tree.jsx +1172 -0
  318. package/dist/Tree.jsx.map +1 -0
  319. package/dist/Virtualizer.d.ts +16 -2
  320. package/dist/Virtualizer.d.ts.map +1 -1
  321. package/dist/Virtualizer.js +2 -0
  322. package/dist/Virtualizer.jsx +2 -0
  323. package/dist/Virtualizer2.js +751 -0
  324. package/dist/Virtualizer2.js.map +1 -0
  325. package/dist/Virtualizer2.jsx +730 -0
  326. package/dist/Virtualizer2.jsx.map +1 -0
  327. package/dist/VirtualizerLayouts.d.ts +18 -0
  328. package/dist/VirtualizerLayouts.d.ts.map +1 -1
  329. package/dist/VisuallyHidden.js +42 -0
  330. package/dist/VisuallyHidden.js.map +1 -0
  331. package/dist/VisuallyHidden.jsx +35 -0
  332. package/dist/VisuallyHidden.jsx.map +1 -0
  333. package/dist/contexts.js +33 -0
  334. package/dist/contexts.js.map +1 -0
  335. package/dist/contexts.jsx +33 -0
  336. package/dist/contexts.jsx.map +1 -0
  337. package/dist/index.d.ts +9 -9
  338. package/dist/index.d.ts.map +1 -1
  339. package/dist/index.js +69 -23932
  340. package/dist/index.jsx +69 -18337
  341. package/dist/useDragAndDrop.d.ts +0 -8
  342. package/dist/useDragAndDrop.d.ts.map +1 -1
  343. package/dist/useDragAndDrop.js +2 -0
  344. package/dist/useDragAndDrop.jsx +2 -0
  345. package/dist/useDragAndDrop2.js +399 -0
  346. package/dist/useDragAndDrop2.js.map +1 -0
  347. package/dist/useDragAndDrop2.jsx +399 -0
  348. package/dist/useDragAndDrop2.jsx.map +1 -0
  349. package/dist/utils.d.ts +84 -11
  350. package/dist/utils.d.ts.map +1 -1
  351. package/dist/utils.js +285 -0
  352. package/dist/utils.js.map +1 -0
  353. package/dist/utils.jsx +277 -0
  354. package/dist/utils.jsx.map +1 -0
  355. package/dist/virtualizer/Layout.js +144 -0
  356. package/dist/virtualizer/Layout.js.map +1 -0
  357. package/dist/virtualizer/Layout.jsx +144 -0
  358. package/dist/virtualizer/Layout.jsx.map +1 -0
  359. package/package.json +395 -4
  360. package/src/ActionBar.tsx +10 -12
  361. package/src/ActionGroup.tsx +5 -3
  362. package/src/Autocomplete.tsx +14 -9
  363. package/src/Breadcrumbs.tsx +58 -39
  364. package/src/Button.tsx +22 -2
  365. package/src/Calendar.tsx +57 -11
  366. package/src/CalendarPicker.tsx +73 -0
  367. package/src/Checkbox.tsx +539 -3
  368. package/src/Collection.tsx +9 -3
  369. package/src/Color.tsx +84 -41
  370. package/src/ComboBox.tsx +97 -21
  371. package/src/DateField.tsx +304 -53
  372. package/src/DatePicker.tsx +402 -62
  373. package/src/DateRangePickerContext.tsx +2 -0
  374. package/src/Dialog.tsx +13 -5
  375. package/src/Disclosure.tsx +7 -1
  376. package/src/DragAndDrop.tsx +3 -1
  377. package/src/DropZone.tsx +3 -1
  378. package/src/GridList.tsx +133 -26
  379. package/src/Icon.tsx +3 -1
  380. package/src/Link.tsx +3 -1
  381. package/src/ListBox.tsx +354 -25
  382. package/src/Menu.tsx +252 -128
  383. package/src/Meter.tsx +3 -1
  384. package/src/Modal.tsx +120 -56
  385. package/src/NumberField.tsx +51 -8
  386. package/src/Popover.tsx +68 -17
  387. package/src/ProgressBar.tsx +3 -1
  388. package/src/RadioGroup.tsx +468 -4
  389. package/src/RangeCalendar.tsx +123 -2
  390. package/src/SearchField.tsx +80 -4
  391. package/src/Select.tsx +122 -26
  392. package/src/SelectionIndicator.tsx +3 -1
  393. package/src/SharedElementTransition.tsx +95 -37
  394. package/src/Slider.tsx +159 -13
  395. package/src/StepList.tsx +0 -7
  396. package/src/Switch.tsx +395 -2
  397. package/src/Table.tsx +428 -99
  398. package/src/Tabs.tsx +17 -45
  399. package/src/TagGroup.tsx +29 -7
  400. package/src/Text.tsx +31 -10
  401. package/src/TextField.tsx +44 -6
  402. package/src/TimeField.tsx +127 -192
  403. package/src/Toast.tsx +79 -14
  404. package/src/ToggleButton.tsx +3 -1
  405. package/src/ToggleButtonGroup.tsx +3 -1
  406. package/src/Tooltip.tsx +3 -1
  407. package/src/Tree.tsx +91 -13
  408. package/src/Virtualizer.tsx +180 -31
  409. package/src/VirtualizerLayouts.ts +45 -10
  410. package/src/index.ts +51 -8
  411. package/src/useDragAndDrop.ts +8 -10
  412. package/src/utils.tsx +246 -30
  413. package/dist/HiddenTimeInput.d.ts +0 -25
  414. package/dist/HiddenTimeInput.d.ts.map +0 -1
  415. package/dist/index.js.map +0 -1
  416. package/dist/index.jsx.map +0 -1
  417. package/src/HiddenTimeInput.tsx +0 -133
@@ -196,7 +196,20 @@ export function Breadcrumbs<T>(props: BreadcrumbsProps<T>): JSX.Element {
196
196
  setStaticItemCount,
197
197
  }}
198
198
  >
199
- <nav
199
+ {/*
200
+ Faithful to react-aria-components Breadcrumbs: the accessible name (navProps'
201
+ aria-label) sits directly on the <ol> (role="list"), with NO wrapping <nav>
202
+ landmark (react-spectrum/packages/react-aria-components/src/Breadcrumbs.tsx
203
+ renders `<dom.ol {...mergeProps(DOMProps, navProps)} style={props.style}>`).
204
+ The <ol> carries ONLY the consumer's class/style — no hard-coded inline
205
+ layout reset. An inline reset would beat the styled layer's class (inline
206
+ wins over class), which is exactly what broke S2 parity: the solid-spectrum
207
+ `wrapperStyles` class supplies display:flex / list-style:none / padding:0 /
208
+ marginStart and deliberately leaves align-items at its `normal` default, so
209
+ a hard-coded inline `align-items:center` + `margin:0` clobbered the
210
+ wrapper's margin and diverged from S2 (whose <ol> has neither).
211
+ */}
212
+ <ol
200
213
  {...navProps}
201
214
  {...domProps()}
202
215
  ref={(element) => assignRef(local.ref, element)}
@@ -204,39 +217,29 @@ export function Breadcrumbs<T>(props: BreadcrumbsProps<T>): JSX.Element {
204
217
  style={renderProps.style()}
205
218
  data-disabled={isDisabled() || undefined}
206
219
  >
207
- <ol
208
- style={{
209
- display: "flex",
210
- "align-items": "center",
211
- "list-style": "none",
212
- margin: 0,
213
- padding: 0,
214
- }}
220
+ <Show
221
+ when={hasCollectionItems()}
222
+ fallback={
223
+ <StaticBreadcrumbItems>{local.children as JSX.Element}</StaticBreadcrumbItems>
224
+ }
215
225
  >
216
- <Show
217
- when={hasCollectionItems()}
218
- fallback={
219
- <StaticBreadcrumbItems>{local.children as JSX.Element}</StaticBreadcrumbItems>
220
- }
221
- >
222
- <For each={items()}>
223
- {(item, index) => {
224
- const itemKey = getItemKey(item, index());
225
- const isLast = () => index() === items().length - 1;
226
- const renderItem = local.children as ((item: T) => JSX.Element) | undefined;
227
-
228
- return (
229
- <li style={{ display: "flex", "align-items": "center" }}>
230
- <BreadcrumbItemContext.Provider value={{ itemKey, isLast }}>
231
- {renderItem?.(item)}
232
- </BreadcrumbItemContext.Provider>
233
- </li>
234
- );
235
- }}
236
- </For>
237
- </Show>
238
- </ol>
239
- </nav>
226
+ <For each={items()}>
227
+ {(item, index) => {
228
+ const itemKey = getItemKey(item, index());
229
+ const isLast = () => index() === items().length - 1;
230
+ const renderItem = local.children as ((item: T) => JSX.Element) | undefined;
231
+
232
+ return (
233
+ <li style={{ display: "flex", "align-items": "center" }}>
234
+ <BreadcrumbItemContext.Provider value={{ itemKey, isLast }}>
235
+ {renderItem?.(item)}
236
+ </BreadcrumbItemContext.Provider>
237
+ </li>
238
+ );
239
+ }}
240
+ </For>
241
+ </Show>
242
+ </ol>
240
243
  </BreadcrumbsContext.Provider>
241
244
  );
242
245
  }
@@ -277,6 +280,18 @@ export function BreadcrumbItem(props: BreadcrumbItemProps): JSX.Element {
277
280
  staticIndex === context.staticItemCount() - 1);
278
281
  const itemKey = () => itemContext?.itemKey ?? ariaProps.id ?? null;
279
282
 
283
+ // Mirror react-aria-components' Link: render an <a> only when there is an
284
+ // href on an enabled, non-current item; otherwise fall back to a <span
285
+ // role="link"> (via createLink). A styled layer may force the element type
286
+ // (S2 renders the current item as a plain <div>), which takes precedence.
287
+ const elementType = () =>
288
+ ariaProps.elementType ?? (ariaProps.href && !isDisabled() && !isCurrent() ? "a" : "span");
289
+ // The current breadcrumb is the current page and is non-interactive: S2
290
+ // renders it as a plain element with no link role. createLink only omits
291
+ // role="link" for an <a>, so treat the current item as an "a" purely for the
292
+ // role decision while still rendering the resolved element type above.
293
+ const linkElementType = () => (isCurrent() ? "a" : elementType());
294
+
280
295
  const handlePress = (e: PressEvent) => {
281
296
  ariaProps.onPress?.(e);
282
297
  const key = itemKey();
@@ -285,7 +300,7 @@ export function BreadcrumbItem(props: BreadcrumbItemProps): JSX.Element {
285
300
  }
286
301
  };
287
302
 
288
- const { itemProps, isPressed } = createBreadcrumbItem({
303
+ const itemAria = createBreadcrumbItem({
289
304
  get id() {
290
305
  return ariaProps.id;
291
306
  },
@@ -305,7 +320,7 @@ export function BreadcrumbItem(props: BreadcrumbItemProps): JSX.Element {
305
320
  return ariaProps.rel;
306
321
  },
307
322
  get elementType() {
308
- return ariaProps.elementType;
323
+ return linkElementType();
309
324
  },
310
325
  get onPress() {
311
326
  return handlePress;
@@ -354,20 +369,23 @@ export function BreadcrumbItem(props: BreadcrumbItemProps): JSX.Element {
354
369
  },
355
370
  });
356
371
 
372
+ const isPressed = itemAria.isPressed;
357
373
  const { isFocused, isFocusVisible, focusProps } = createFocusRing();
358
374
  const { isHovered, hoverProps } = createHover({
359
375
  get isDisabled() {
360
376
  return isDisabled();
361
377
  },
362
378
  });
379
+ // Read itemAria.itemProps fresh inside the memo (do NOT destructure it above):
380
+ // the reactive getter re-runs createBreadcrumbItem → createLink each time this
381
+ // memo re-evaluates, so role/tabIndex track elementType once isCurrent settles.
363
382
  const mergedItemProps = createMemo(() =>
364
383
  mergeProps(
365
- itemProps as Record<string, unknown>,
384
+ itemAria.itemProps as Record<string, unknown>,
366
385
  focusProps as Record<string, unknown>,
367
386
  hoverProps as Record<string, unknown>,
368
387
  ),
369
388
  );
370
- const elementType = () => ariaProps.elementType ?? "a";
371
389
 
372
390
  const renderValues = createMemo<BreadcrumbItemRenderProps>(() => ({
373
391
  isCurrent: isCurrent(),
@@ -380,7 +398,9 @@ export function BreadcrumbItem(props: BreadcrumbItemProps): JSX.Element {
380
398
 
381
399
  const renderProps = useRenderProps(
382
400
  {
383
- children: props.children,
401
+ get children() {
402
+ return props.children;
403
+ },
384
404
  class: local.class,
385
405
  style: local.style,
386
406
  defaultClassName: "solidaria-BreadcrumbItem",
@@ -399,7 +419,6 @@ export function BreadcrumbItem(props: BreadcrumbItemProps): JSX.Element {
399
419
  component={elementType()}
400
420
  {...mergedItemProps()}
401
421
  ref={(element: HTMLElement) => assignRef(local.ref, element)}
402
- href={isCurrent() ? undefined : (mergedItemProps() as { href?: string }).href}
403
422
  aria-current={isCurrent() ? (ariaProps["aria-current"] ?? "page") : undefined}
404
423
  aria-disabled={isDisabled() || isCurrent() || undefined}
405
424
  class={renderProps.class()}
package/src/Button.tsx CHANGED
@@ -36,6 +36,12 @@ import {
36
36
  import { DialogTriggerContext, PopoverTriggerContext } from "./contexts";
37
37
  import { ProgressBarContext } from "./ProgressBar";
38
38
 
39
+ // Events preserved when `isPending` is true (for tooltips and other overlays),
40
+ // mirroring RAC Button's `PRESERVED_EVENT_PATTERN`. Every other `on*` handler
41
+ // is stripped so a pending-but-focusable button cannot be activated.
42
+ const pendingPreservedEventPattern =
43
+ /Focus|Blur|Hover|Pointer(Enter|Leave|Over|Out)|Mouse(Enter|Leave|Over|Out)/;
44
+
39
45
  type RefLike<T> = ((el: T) => void) | { current?: T | null } | undefined;
40
46
 
41
47
  function assignRef<T>(ref: RefLike<T>, el: T): void {
@@ -294,8 +300,17 @@ export function Button(props: ButtonProps): JSX.Element {
294
300
  get onClick() {
295
301
  return resolvePending() ? undefined : ariaProps.onClick;
296
302
  },
303
+ // Mirror React Aria's RAC `Button`: `useButton` is called with the base
304
+ // `isDisabled` WITHOUT `isPending`, so a pending-focusable button stays a
305
+ // non-disabled native `<button>` — keeping `useFocusable`'s always-on
306
+ // `tabIndex={0}` (the Safari focus workaround) and no native `disabled`
307
+ // attribute. The pending "disabled" semantics are layered ON TOP:
308
+ // `aria-disabled="true"` below and `disablePendingInteractions` stripping
309
+ // the press handlers post-hoc (RAC's `useDisableInteractions`). Folding
310
+ // `isPending` in here instead would make the focusable hook drop
311
+ // `tabIndex`, diverging from upstream's pending button (D4).
297
312
  get isDisabled() {
298
- return resolveDisabled() || resolvePending();
313
+ return resolveDisabled();
299
314
  },
300
315
  }),
301
316
  );
@@ -447,7 +462,12 @@ export function Button(props: ButtonProps): JSX.Element {
447
462
 
448
463
  const next = { ...props };
449
464
  for (const key of Object.keys(next)) {
450
- if (key.startsWith("on") && !key.includes("Focus") && !key.includes("Blur")) {
465
+ // Mirror RAC's `useDisableInteractions`: when pending, strip every event
466
+ // handler except the ones overlays/tooltips still need — focus/blur,
467
+ // hover, and pointer/mouse enter-leave-over-out. Press handlers
468
+ // (click/pointerdown/keydown/…) are removed so the focusable button
469
+ // cannot be activated while pending.
470
+ if (key.startsWith("on") && !pendingPreservedEventPattern.test(key)) {
451
471
  next[key] = undefined;
452
472
  }
453
473
  }
package/src/Calendar.tsx CHANGED
@@ -30,6 +30,7 @@ import {
30
30
  createCalendarState,
31
31
  type CalendarState,
32
32
  type CalendarStateProps,
33
+ type CalendarSelectionMode,
33
34
  type CalendarDate,
34
35
  type DateValue,
35
36
  endOfMonth,
@@ -69,10 +70,13 @@ export interface CalendarRenderProps {
69
70
  isInvalid: boolean;
70
71
  }
71
72
 
72
- export interface CalendarProps<T extends DateValue = DateValue>
73
+ export interface CalendarProps<
74
+ T extends DateValue = DateValue,
75
+ M extends CalendarSelectionMode = "single",
76
+ >
73
77
  extends
74
78
  Omit<AriaCalendarProps, "id" | "isDisabled" | "isReadOnly">,
75
- Omit<CalendarStateProps<T>, "locale">,
79
+ Omit<CalendarStateProps<T, M>, "locale">,
76
80
  SlotProps {
77
81
  /** The children of the component. */
78
82
  children?: JSX.Element;
@@ -207,7 +211,10 @@ export function useCalendarContext(): CalendarState<DateValue> {
207
211
  * </Calendar>
208
212
  * ```
209
213
  */
210
- export function Calendar<T extends DateValue = CalendarDate>(props: CalendarProps<T>): JSX.Element {
214
+ export function Calendar<
215
+ T extends DateValue = CalendarDate,
216
+ M extends CalendarSelectionMode = "single",
217
+ >(props: CalendarProps<T, M>): JSX.Element {
211
218
  const inheritedState = useContext(CalendarContext);
212
219
 
213
220
  // Use hydration-safe pattern for client-only rendering
@@ -227,9 +234,10 @@ export function Calendar<T extends DateValue = CalendarDate>(props: CalendarProp
227
234
  );
228
235
  }
229
236
 
230
- function CalendarWithState<T extends DateValue = CalendarDate>(
231
- props: CalendarProps<T> & { state: CalendarState<DateValue> },
232
- ): JSX.Element {
237
+ function CalendarWithState<
238
+ T extends DateValue = CalendarDate,
239
+ M extends CalendarSelectionMode = "single",
240
+ >(props: CalendarProps<T, M> & { state: CalendarState<DateValue> }): JSX.Element {
233
241
  const [local, stateProps, rest] = splitProps(
234
242
  props,
235
243
  ["children", "class", "style", "slot", "state", "ref"],
@@ -237,6 +245,7 @@ function CalendarWithState<T extends DateValue = CalendarDate>(
237
245
  "value",
238
246
  "defaultValue",
239
247
  "onChange",
248
+ "selectionMode",
240
249
  "minValue",
241
250
  "maxValue",
242
251
  "isDisabled",
@@ -296,6 +305,17 @@ function CalendarWithState<T extends DateValue = CalendarDate>(
296
305
  <h2>{String(calendarAria.calendarProps["aria-label"] ?? "")}</h2>
297
306
  </VisuallyHidden>
298
307
  {props.children}
308
+ {/* For touch screen readers, a visually hidden next button after the month
309
+ * grid so it's easy to navigate after reaching the end without going all
310
+ * the way back to the start. Mirrors react-aria-components Calendar. */}
311
+ <VisuallyHidden>
312
+ <button
313
+ aria-label={String(calendarAria.nextButtonProps["aria-label"] ?? "")}
314
+ disabled={Boolean(calendarAria.nextButtonProps.disabled)}
315
+ onClick={() => state().focusNextPage()}
316
+ tabIndex={-1}
317
+ />
318
+ </VisuallyHidden>
299
319
  </div>
300
320
  );
301
321
  }
@@ -303,7 +323,10 @@ function CalendarWithState<T extends DateValue = CalendarDate>(
303
323
  /**
304
324
  * Internal Calendar component that renders after client mount.
305
325
  */
306
- function CalendarInner<T extends DateValue = CalendarDate>(props: CalendarProps<T>): JSX.Element {
326
+ function CalendarInner<
327
+ T extends DateValue = CalendarDate,
328
+ M extends CalendarSelectionMode = "single",
329
+ >(props: CalendarProps<T, M>): JSX.Element {
307
330
  const [local, stateProps, rest] = splitProps(
308
331
  props,
309
332
  ["children", "class", "style", "slot", "ref"],
@@ -311,6 +334,7 @@ function CalendarInner<T extends DateValue = CalendarDate>(props: CalendarProps<
311
334
  "value",
312
335
  "defaultValue",
313
336
  "onChange",
337
+ "selectionMode",
314
338
  "minValue",
315
339
  "maxValue",
316
340
  "isDisabled",
@@ -333,7 +357,7 @@ function CalendarInner<T extends DateValue = CalendarDate>(props: CalendarProps<
333
357
  );
334
358
 
335
359
  // Create calendar state
336
- const state = createCalendarState(stateProps);
360
+ const state = createCalendarState<T, M>(stateProps);
337
361
 
338
362
  // Create calendar ARIA props
339
363
  const calendarAria = createCalendar(
@@ -374,6 +398,18 @@ function CalendarInner<T extends DateValue = CalendarDate>(props: CalendarProps<
374
398
  <h2>{String(calendarAria.calendarProps["aria-label"] ?? "")}</h2>
375
399
  </VisuallyHidden>
376
400
  {props.children}
401
+ {/* For touch screen readers, a visually hidden next button after the
402
+ * month grid so it's easy to navigate after reaching the end without
403
+ * going all the way back to the start. Mirrors react-aria-components
404
+ * Calendar. */}
405
+ <VisuallyHidden>
406
+ <button
407
+ aria-label={String(calendarAria.nextButtonProps["aria-label"] ?? "")}
408
+ disabled={Boolean(calendarAria.nextButtonProps.disabled)}
409
+ onClick={() => state.focusNextPage()}
410
+ tabIndex={-1}
411
+ />
412
+ </VisuallyHidden>
377
413
  </div>
378
414
  </CalendarContext.Provider>
379
415
  );
@@ -398,7 +434,9 @@ export function CalendarHeading(props: CalendarHeadingProps): JSX.Element {
398
434
  }));
399
435
  const renderProps = useRenderProps(
400
436
  {
401
- children: props.children,
437
+ get children() {
438
+ return props.children;
439
+ },
402
440
  class: props.class,
403
441
  style: props.style,
404
442
  defaultClassName: "solidaria-CalendarHeading",
@@ -440,12 +478,18 @@ export function CalendarButton(props: CalendarButtonProps): JSX.Element {
440
478
  return calendarAria.nextButtonProps;
441
479
  });
442
480
 
481
+ const isDisabled = () => props.isDisabled || state.isDisabled();
482
+
443
483
  return (
444
484
  <button
445
485
  {...buttonProps()}
446
486
  class={props.class ?? "solidaria-CalendarButton"}
447
487
  style={props.style}
448
- disabled={props.isDisabled || state.isDisabled()}
488
+ disabled={isDisabled()}
489
+ // Mirror useFocusable: always set an explicit tabIndex on an enabled
490
+ // focusable button (0), and drop it entirely when disabled — so the
491
+ // nav buttons appear in the roving tab order exactly as upstream does.
492
+ tabindex={isDisabled() ? undefined : 0}
449
493
  >
450
494
  {props.children}
451
495
  </button>
@@ -625,7 +669,9 @@ export function CalendarCell(props: CalendarCellProps): JSX.Element {
625
669
 
626
670
  const renderProps = useRenderProps(
627
671
  {
628
- children: props.children,
672
+ get children() {
673
+ return props.children;
674
+ },
629
675
  class: props.class,
630
676
  style: props.style,
631
677
  defaultClassName: "solidaria-CalendarCell",
@@ -0,0 +1,73 @@
1
+ /**
2
+ * CalendarMonthPicker / CalendarYearPicker components for solidaria-components
3
+ *
4
+ * Headless month/year "jump-to" pickers shared by Calendar and RangeCalendar.
5
+ * Each reads whichever calendar state context is present and renders through a
6
+ * child function, mirroring the single context-agnostic components upstream.
7
+ * Port of react-aria-components/src/Calendar.tsx (CalendarMonthPicker /
8
+ * CalendarYearPicker).
9
+ */
10
+
11
+ import { type JSX, useContext } from "solid-js";
12
+
13
+ import {
14
+ createCalendarMonthPicker,
15
+ createCalendarYearPicker,
16
+ type CalendarMonthPickerProps as AriaCalendarMonthPickerProps,
17
+ type CalendarMonthPickerAria,
18
+ type CalendarYearPickerProps as AriaCalendarYearPickerProps,
19
+ type CalendarYearPickerAria,
20
+ } from "@proyecto-viviana/solidaria";
21
+
22
+ import { CalendarContext } from "./Calendar";
23
+ import { RangeCalendarContext } from "./RangeCalendar";
24
+
25
+ export type {
26
+ CalendarMonthPickerAria,
27
+ CalendarMonthPickerItem,
28
+ CalendarYearPickerAria,
29
+ CalendarYearPickerItem,
30
+ CalendarYearPickerFormatOptions,
31
+ } from "@proyecto-viviana/solidaria";
32
+
33
+ export interface CalendarMonthPickerProps extends AriaCalendarMonthPickerProps {
34
+ /** A function that renders the month picker from its accessible props. */
35
+ children: (renderProps: CalendarMonthPickerAria) => JSX.Element;
36
+ }
37
+
38
+ /**
39
+ * A CalendarMonthPicker renders the list of months in the focused year so the
40
+ * user can jump the calendar's focus to a different month. It works within both
41
+ * a Calendar and a RangeCalendar.
42
+ */
43
+ export function CalendarMonthPicker(props: CalendarMonthPickerProps): JSX.Element {
44
+ const calendarState = useContext(CalendarContext);
45
+ const rangeCalendarState = useContext(RangeCalendarContext);
46
+ const state = calendarState ?? rangeCalendarState;
47
+ if (!state) {
48
+ throw new Error("CalendarMonthPicker must be used within a Calendar or RangeCalendar");
49
+ }
50
+ const aria = createCalendarMonthPicker(props, state);
51
+ return props.children(aria);
52
+ }
53
+
54
+ export interface CalendarYearPickerProps extends AriaCalendarYearPickerProps {
55
+ /** A function that renders the year picker from its accessible props. */
56
+ children: (renderProps: CalendarYearPickerAria) => JSX.Element;
57
+ }
58
+
59
+ /**
60
+ * A CalendarYearPicker renders a sliding window of years so the user can jump
61
+ * the calendar's focus to a different year. It works within both a Calendar and
62
+ * a RangeCalendar.
63
+ */
64
+ export function CalendarYearPicker(props: CalendarYearPickerProps): JSX.Element {
65
+ const calendarState = useContext(CalendarContext);
66
+ const rangeCalendarState = useContext(RangeCalendarContext);
67
+ const state = calendarState ?? rangeCalendarState;
68
+ if (!state) {
69
+ throw new Error("CalendarYearPicker must be used within a Calendar or RangeCalendar");
70
+ }
71
+ const aria = createCalendarYearPicker(props, state);
72
+ return props.children(aria);
73
+ }