@proyecto-viviana/solidaria-components 0.3.2 → 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 +4 -4
  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 +6 -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 -23932
  332. package/dist/index.jsx +70 -18337
  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 +22 -2
  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 +50 -6
  358. package/src/DateField.tsx +20 -2
  359. package/src/DatePicker.tsx +57 -5
  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 +252 -128
  369. package/src/Meter.tsx +3 -1
  370. package/src/Modal.tsx +100 -52
  371. package/src/NumberField.tsx +51 -8
  372. package/src/Popover.tsx +40 -10
  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 +3 -1
  385. package/src/Text.tsx +31 -10
  386. package/src/TextField.tsx +43 -5
  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 +3 -1
  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,744 @@
1
+ import { filterDOMProps, useRenderProps } from "./utils.jsx";
2
+ import { FieldErrorContext } from "./FieldError.jsx";
3
+ import { SelectionIndicatorContext } from "./SelectionIndicator.jsx";
4
+ import { ListBoxLoadMoreItem } from "./ListBox.jsx";
5
+ import { For, Show, createContext, createEffect, createMemo, createSignal, createUniqueId, splitProps, untrack, useContext } from "solid-js";
6
+ import { FocusScope, createHiddenSelect, createHover, createInteractOutside, createListBox, createOption, createSelect, focusSafely, mergeProps as mergeProps$1 } from "@proyecto-viviana/solidaria";
7
+ import { DEFAULT_VALIDATION_RESULT, createSelectState } from "@proyecto-viviana/solid-stately";
8
+ //#region src/Select.tsx
9
+ /**
10
+ * Select component for solidaria-components
11
+ *
12
+ * A pre-wired headless select that combines state + aria hooks.
13
+ * Port of react-aria-components/src/Select.tsx
14
+ */
15
+ function assignRef(ref, el) {
16
+ if (!ref) return;
17
+ if (typeof ref === "function") ref(el);
18
+ else ref.current = el;
19
+ }
20
+ function getNativeSelectValidation(select) {
21
+ return {
22
+ isInvalid: !select.validity.valid,
23
+ validationDetails: {
24
+ badInput: select.validity.badInput,
25
+ customError: select.validity.customError,
26
+ patternMismatch: select.validity.patternMismatch,
27
+ rangeOverflow: select.validity.rangeOverflow,
28
+ rangeUnderflow: select.validity.rangeUnderflow,
29
+ stepMismatch: select.validity.stepMismatch,
30
+ tooLong: select.validity.tooLong,
31
+ tooShort: select.validity.tooShort,
32
+ typeMismatch: select.validity.typeMismatch,
33
+ valueMissing: select.validity.valueMissing,
34
+ valid: select.validity.valid
35
+ },
36
+ validationErrors: select.validationMessage ? [select.validationMessage] : []
37
+ };
38
+ }
39
+ const SelectContext = createContext(null);
40
+ const SelectStateContext = createContext(null);
41
+ const SelectValueContext = SelectContext;
42
+ const selectRootLabelProps = new Set([
43
+ "aria-label",
44
+ "aria-labelledby",
45
+ "aria-describedby",
46
+ "aria-details"
47
+ ]);
48
+ /**
49
+ * A select displays a collapsible list of options and allows a user to select one of them.
50
+ */
51
+ function Select(props) {
52
+ const contextSlotProps = useContext(SelectContext)?.slots?.[props.slot ?? "default"];
53
+ const [local, stateProps, ariaProps] = splitProps(contextSlotProps ? mergeProps$1(contextSlotProps, props) : props, [
54
+ "class",
55
+ "style",
56
+ "render",
57
+ "ref",
58
+ "slot",
59
+ "children"
60
+ ], [
61
+ "items",
62
+ "getKey",
63
+ "getTextValue",
64
+ "getDisabled",
65
+ "disabledKeys",
66
+ "selectionMode",
67
+ "selectedKey",
68
+ "defaultSelectedKey",
69
+ "selectedKeys",
70
+ "defaultSelectedKeys",
71
+ "onSelectionChange",
72
+ "onSelectionChangeKeys",
73
+ "isOpen",
74
+ "defaultOpen",
75
+ "onOpenChange",
76
+ "name"
77
+ ]);
78
+ let rootRef;
79
+ const [selectValidation, setSelectValidation] = createSignal(DEFAULT_VALIDATION_RESULT);
80
+ const errorMessageId = createUniqueId();
81
+ const resolveDisabled = () => {
82
+ const disabled = ariaProps.isDisabled;
83
+ if (typeof disabled === "function") return disabled();
84
+ return !!disabled;
85
+ };
86
+ const state = createSelectState({
87
+ get items() {
88
+ return stateProps.items;
89
+ },
90
+ get getKey() {
91
+ return stateProps.getKey;
92
+ },
93
+ get getTextValue() {
94
+ return stateProps.getTextValue;
95
+ },
96
+ get getDisabled() {
97
+ return stateProps.getDisabled;
98
+ },
99
+ get disabledKeys() {
100
+ return stateProps.disabledKeys;
101
+ },
102
+ get selectionMode() {
103
+ return stateProps.selectionMode;
104
+ },
105
+ get selectedKey() {
106
+ return stateProps.selectedKey;
107
+ },
108
+ get defaultSelectedKey() {
109
+ return stateProps.defaultSelectedKey;
110
+ },
111
+ get selectedKeys() {
112
+ return stateProps.selectedKeys;
113
+ },
114
+ get defaultSelectedKeys() {
115
+ return stateProps.defaultSelectedKeys;
116
+ },
117
+ get onSelectionChange() {
118
+ return stateProps.onSelectionChange;
119
+ },
120
+ get onSelectionChangeKeys() {
121
+ return stateProps.onSelectionChangeKeys;
122
+ },
123
+ get isOpen() {
124
+ return stateProps.isOpen;
125
+ },
126
+ get defaultOpen() {
127
+ return stateProps.defaultOpen;
128
+ },
129
+ get onOpenChange() {
130
+ return stateProps.onOpenChange;
131
+ },
132
+ get isDisabled() {
133
+ return resolveDisabled();
134
+ },
135
+ get isRequired() {
136
+ return ariaProps.isRequired;
137
+ }
138
+ });
139
+ const { labelProps, triggerProps, valueProps, menuProps, isFocused, isFocusVisible, isOpen } = createSelect(createMemo(() => {
140
+ const clean = {};
141
+ for (const key in ariaProps) if (!key.startsWith("data-")) clean[key] = ariaProps[key];
142
+ return clean;
143
+ }), state);
144
+ const { isHovered, hoverProps } = createHover({ get isDisabled() {
145
+ return resolveDisabled();
146
+ } });
147
+ const renderValues = createMemo(() => ({
148
+ isOpen: isOpen(),
149
+ isFocused: isFocused(),
150
+ isFocusVisible: isFocusVisible(),
151
+ isDisabled: resolveDisabled(),
152
+ isRequired: !!ariaProps.isRequired,
153
+ isSelected: state.selectionMode() === "multiple" ? state.selectedKeys() === "all" || state.selectedKeys().size > 0 : state.selectedKey() != null
154
+ }));
155
+ const childRenderValues = {
156
+ get isOpen() {
157
+ return isOpen();
158
+ },
159
+ get isFocused() {
160
+ return isFocused();
161
+ },
162
+ get isFocusVisible() {
163
+ return isFocusVisible();
164
+ },
165
+ get isDisabled() {
166
+ return resolveDisabled();
167
+ },
168
+ get isRequired() {
169
+ return !!ariaProps.isRequired;
170
+ },
171
+ get isSelected() {
172
+ return hasSelection();
173
+ }
174
+ };
175
+ const renderProps = useRenderProps({
176
+ class: local.class,
177
+ style: local.style,
178
+ defaultClassName: "solidaria-Select"
179
+ }, renderValues);
180
+ const domProps = createMemo(() => {
181
+ const filtered = filterDOMProps(ariaProps, { global: true });
182
+ for (const key of selectRootLabelProps) delete filtered[key];
183
+ return filtered;
184
+ });
185
+ const cleanHoverProps = () => {
186
+ const { ref: _ref, ...rest } = hoverProps;
187
+ return rest;
188
+ };
189
+ const cleanLabelProps = () => {
190
+ const { ref: _ref, ...rest } = labelProps;
191
+ return rest;
192
+ };
193
+ const setRootRef = (el) => {
194
+ rootRef = el;
195
+ assignRef(local.ref, el);
196
+ };
197
+ const validation = createMemo(() => {
198
+ const current = selectValidation();
199
+ if (current.isInvalid || !ariaProps.isInvalid) return current;
200
+ return {
201
+ ...DEFAULT_VALIDATION_RESULT,
202
+ isInvalid: true
203
+ };
204
+ });
205
+ const isInvalid = createMemo(() => validation().isInvalid);
206
+ const triggerDescribedBy = () => {
207
+ const ids = [triggerProps["aria-describedby"], isInvalid() ? errorMessageId : void 0].filter(Boolean).join(" ").split(" ").filter(Boolean);
208
+ return ids.length ? Array.from(new Set(ids)).join(" ") : void 0;
209
+ };
210
+ const triggerPropsWithValidation = () => ({
211
+ ...triggerProps,
212
+ "aria-describedby": triggerDescribedBy()
213
+ });
214
+ const fieldErrorContext = {
215
+ get validation() {
216
+ return validation();
217
+ },
218
+ get errorMessageProps() {
219
+ return { id: errorMessageId };
220
+ }
221
+ };
222
+ const focusTrigger = () => {
223
+ triggerRef?.focus();
224
+ };
225
+ const hasSelection = () => state.selectionMode() === "multiple" ? state.selectedKeys() === "all" || state.selectedKeys().size > 0 : state.selectedKey() != null;
226
+ const hasNativeValidation = () => (ariaProps.validationBehavior ?? "native") === "native";
227
+ const getSelectValidation = (select) => {
228
+ if (ariaProps.isRequired && !hasSelection()) return {
229
+ isInvalid: true,
230
+ validationDetails: {
231
+ badInput: false,
232
+ customError: false,
233
+ patternMismatch: false,
234
+ rangeOverflow: false,
235
+ rangeUnderflow: false,
236
+ stepMismatch: false,
237
+ tooLong: false,
238
+ tooShort: false,
239
+ typeMismatch: false,
240
+ valueMissing: true,
241
+ valid: false
242
+ },
243
+ validationErrors: [select.validationMessage || "Constraints not satisfied"]
244
+ };
245
+ return getNativeSelectValidation(select);
246
+ };
247
+ const { containerProps, selectProps: hiddenSelectProps } = createHiddenSelect({
248
+ state,
249
+ name: stateProps.name,
250
+ form: ariaProps.form,
251
+ isRequired: ariaProps.isRequired,
252
+ validationBehavior: ariaProps.validationBehavior ?? "native",
253
+ get isDisabled() {
254
+ return resolveDisabled();
255
+ }
256
+ });
257
+ const handleHiddenSelectInvalid = (event) => {
258
+ setSelectValidation(getSelectValidation(event.currentTarget));
259
+ focusTrigger();
260
+ event.preventDefault();
261
+ };
262
+ const handleHiddenSelectChange = (event) => {
263
+ hiddenSelectProps.onChange?.(event);
264
+ setSelectValidation(hasSelection() && event.currentTarget.validity.valid ? DEFAULT_VALIDATION_RESULT : getSelectValidation(event.currentTarget));
265
+ };
266
+ createEffect(() => {
267
+ if (hasSelection() && selectValidation().isInvalid) setSelectValidation(DEFAULT_VALIDATION_RESULT);
268
+ });
269
+ let triggerRef = null;
270
+ const setTriggerRef = (el) => {
271
+ triggerRef = el;
272
+ };
273
+ const RootChildren = () => {
274
+ const selectChildren = untrack(() => typeof local.children === "function" ? local.children(childRenderValues) : local.children);
275
+ return <>
276
+ <div {...containerProps}>
277
+ <select {...hiddenSelectProps} name={hasSelection() ? void 0 : stateProps.name} required={hasNativeValidation() && ariaProps.isRequired && !hasSelection() || void 0} onInvalid={handleHiddenSelectInvalid} onChange={handleHiddenSelectChange}>
278
+ <Show when={state.selectionMode() !== "multiple"}>
279
+ <option selected={state.selectedKey() == null} />
280
+ </Show>
281
+ <For each={stateProps.items}>
282
+ {(item) => {
283
+ const itemRecord = isObjectRecord(item) ? item : null;
284
+ const fallbackKey = itemRecord != null ? toKey(itemRecord.key) ?? toKey(itemRecord.id) : void 0;
285
+ const key = stateProps.getKey?.(item) ?? fallbackKey ?? String(item);
286
+ const fallbackTextValue = itemRecord != null ? toTextValue(itemRecord.textValue) ?? toTextValue(itemRecord.label) : void 0;
287
+ const textValue = stateProps.getTextValue?.(item) ?? fallbackTextValue ?? String(item);
288
+ const selectedKeys = state.selectedKeys();
289
+ const isSelected = state.selectionMode() === "multiple" ? selectedKeys === "all" ? true : selectedKeys.has(key) : key === state.selectedKey();
290
+ return <option value={String(key)} selected={isSelected}>
291
+ {textValue}
292
+ </option>;
293
+ }}
294
+ </For>
295
+ </select>
296
+ <Show when={state.selectionMode() === "multiple" && stateProps.name}>
297
+ <For each={state.selectedKeys() === "all" ? Array.from(state.collection()).map((item) => item.key) : Array.from(state.selectedKeys())}>
298
+ {(key) => <input type="hidden" name={stateProps.name} form={ariaProps.form} value={String(key)} disabled={resolveDisabled()} />}
299
+ </For>
300
+ </Show>
301
+ <Show when={state.selectionMode() !== "multiple" && stateProps.name && state.selectedKey() != null}>
302
+ <input type="hidden" name={stateProps.name} form={ariaProps.form} value={String(state.selectedKey())} disabled={resolveDisabled()} />
303
+ </Show>
304
+ </div>
305
+ <Show when={ariaProps.label}>
306
+ <span {...cleanLabelProps()}>{ariaProps.label}</span>
307
+ </Show>
308
+ {selectChildren}
309
+ </>;
310
+ };
311
+ const baseRootProps = () => ({
312
+ ...domProps(),
313
+ ...cleanHoverProps(),
314
+ ref: setRootRef,
315
+ class: renderProps.class(),
316
+ style: renderProps.style(),
317
+ slot: local.slot,
318
+ "data-open": isOpen() || void 0,
319
+ "data-disabled": resolveDisabled() || void 0,
320
+ "data-required": ariaProps.isRequired || void 0,
321
+ "data-invalid": isInvalid() || void 0,
322
+ "data-hovered": isHovered() || void 0
323
+ });
324
+ const RootContent = () => {
325
+ const renderedRootChildren = <RootChildren />;
326
+ const rootProps = () => ({
327
+ ...baseRootProps(),
328
+ children: renderedRootChildren
329
+ });
330
+ return local.render ? local.render(rootProps(), renderValues()) : <div {...baseRootProps()}>{renderedRootChildren}</div>;
331
+ };
332
+ return <SelectContext.Provider value={{
333
+ state,
334
+ rootRef: () => rootRef ?? null,
335
+ triggerRef: () => triggerRef,
336
+ setTriggerRef,
337
+ get triggerProps() {
338
+ return triggerPropsWithValidation();
339
+ },
340
+ valueProps,
341
+ labelProps,
342
+ menuProps,
343
+ get errorMessageProps() {
344
+ return { id: errorMessageId };
345
+ },
346
+ get validation() {
347
+ return validation();
348
+ },
349
+ isOpen,
350
+ isFocused,
351
+ isFocusVisible,
352
+ isDisabled: resolveDisabled,
353
+ placeholder: ariaProps.placeholder,
354
+ items: stateProps.items,
355
+ autoFocus: !!ariaProps.autoFocus
356
+ }}>
357
+ <SelectStateContext.Provider value={state}>
358
+ <FieldErrorContext.Provider value={fieldErrorContext}>
359
+ <RootContent />
360
+ </FieldErrorContext.Provider>
361
+ </SelectStateContext.Provider>
362
+ </SelectContext.Provider>;
363
+ }
364
+ /**
365
+ * The trigger button for a select.
366
+ */
367
+ function SelectTrigger(props) {
368
+ const [local, domProps] = splitProps(props, [
369
+ "class",
370
+ "style",
371
+ "slot",
372
+ "children"
373
+ ]);
374
+ const context = useContext(SelectContext);
375
+ if (!context) throw new Error("SelectTrigger must be used within a Select");
376
+ const { isOpen, isFocused, isFocusVisible, state } = context;
377
+ let triggerRef;
378
+ const setTriggerRef = (el) => {
379
+ triggerRef = el;
380
+ context.setTriggerRef(el);
381
+ };
382
+ createEffect(() => {
383
+ if (context.autoFocus) triggerRef?.focus();
384
+ });
385
+ const { isHovered, hoverProps } = createHover({ get isDisabled() {
386
+ return state.isDisabled;
387
+ } });
388
+ const renderValues = createMemo(() => ({
389
+ isOpen: isOpen(),
390
+ isFocused: isFocused(),
391
+ isFocusVisible: isFocusVisible(),
392
+ isHovered: isHovered(),
393
+ isDisabled: state.isDisabled
394
+ }));
395
+ const renderProps = useRenderProps({
396
+ get children() {
397
+ return props.children;
398
+ },
399
+ class: local.class,
400
+ style: local.style,
401
+ defaultClassName: "solidaria-Select-trigger"
402
+ }, renderValues);
403
+ const cleanTriggerProps = () => {
404
+ const { ref: _ref1, ...rest } = context.triggerProps;
405
+ return rest;
406
+ };
407
+ const cleanHoverProps = () => {
408
+ const { ref: _ref2, ...rest } = hoverProps;
409
+ return rest;
410
+ };
411
+ const triggerAriaProps = () => context.triggerProps;
412
+ const menuAriaProps = () => context.menuProps;
413
+ return <button ref={setTriggerRef} {...domProps} {...cleanTriggerProps()} {...cleanHoverProps()} type="button" id={triggerAriaProps().id} tabIndex={state.isDisabled ? void 0 : 0} aria-label={triggerAriaProps()["aria-label"]} aria-labelledby={triggerAriaProps()["aria-labelledby"]} aria-haspopup="listbox" aria-expanded={isOpen()} aria-controls={isOpen() ? menuAriaProps().id : void 0} aria-disabled={state.isDisabled || void 0} aria-required={triggerAriaProps()["aria-required"]} aria-describedby={triggerAriaProps()["aria-describedby"]} class={renderProps.class()} style={renderProps.style()} data-open={isOpen() || void 0} data-focused={isFocused() || void 0} data-focus-visible={isFocusVisible() || void 0} data-hovered={isHovered() || void 0} data-disabled={state.isDisabled || void 0}>
414
+ {renderProps.renderChildren()}
415
+ </button>;
416
+ }
417
+ function defaultSelectValueChildren(values) {
418
+ return values.selectedText ?? values.placeholder ?? "";
419
+ }
420
+ /**
421
+ * Displays the selected value in a select.
422
+ */
423
+ function SelectValue(props) {
424
+ const [local, domProps] = splitProps(props, [
425
+ "class",
426
+ "style",
427
+ "slot",
428
+ "placeholder",
429
+ "children"
430
+ ]);
431
+ const context = useContext(SelectContext);
432
+ if (!context) throw new Error("SelectValue must be used within a Select");
433
+ const { valueProps, placeholder: contextPlaceholder } = context;
434
+ const state = context.state;
435
+ const placeholder = () => local.placeholder ?? contextPlaceholder;
436
+ const renderValues = createMemo(() => {
437
+ const collection = state.collection();
438
+ const selectedItem = state.selectedKey() == null ? null : collection.getItem(state.selectedKey());
439
+ const selectedKeys = state.selectedKeys();
440
+ const selectedItems = selectedKeys === "all" ? Array.from(collection) : Array.from(selectedKeys).map((key) => collection.getItem(key)).filter((item) => item != null);
441
+ return {
442
+ selectedItem,
443
+ selectedItems,
444
+ selectedText: state.selectionMode() === "multiple" ? selectedItems.length > 0 ? new Intl.ListFormat(void 0, {
445
+ style: "long",
446
+ type: "conjunction"
447
+ }).format(selectedItems.map((item) => item.textValue)) : null : selectedItem?.textValue ?? null,
448
+ isSelected: state.selectionMode() === "multiple" ? selectedItems.length > 0 : selectedItem != null,
449
+ placeholder: placeholder()
450
+ };
451
+ });
452
+ const renderProps = useRenderProps({
453
+ get children() {
454
+ return props.children ?? defaultSelectValueChildren;
455
+ },
456
+ class: local.class,
457
+ style: local.style,
458
+ defaultClassName: "solidaria-Select-value"
459
+ }, renderValues);
460
+ return <span {...domProps} {...valueProps} class={renderProps.class()} style={renderProps.style()} data-placeholder={!renderValues().isSelected || void 0}>
461
+ {props.children == null ? renderValues().selectedText ?? renderValues().placeholder ?? "" : renderProps.renderChildren()}
462
+ </span>;
463
+ }
464
+ /**
465
+ * The listbox popup for a select.
466
+ */
467
+ function SelectListBox(props) {
468
+ const [local, domProps] = splitProps(props, [
469
+ "class",
470
+ "style",
471
+ "slot",
472
+ "children",
473
+ "renderEmptyState",
474
+ "onLoadMore",
475
+ "isLoading",
476
+ "renderLoadMore",
477
+ "loadMoreClass",
478
+ "isInPopover"
479
+ ]);
480
+ const context = useContext(SelectContext);
481
+ if (!context) throw new Error("SelectListBox must be used within a Select");
482
+ const { menuProps, rootRef, state: selectState, isOpen } = context;
483
+ const state = selectState;
484
+ createEffect(() => {
485
+ if (!isOpen()) return;
486
+ if (state.focusedKey() != null) return;
487
+ const selectedKey = state.selectedKey();
488
+ if (selectedKey != null && !state.collection().getItem(selectedKey)?.isDisabled) state.setFocusedKey(selectedKey);
489
+ });
490
+ let listBoxRef;
491
+ createInteractOutside({
492
+ ref: () => rootRef() ?? listBoxRef ?? null,
493
+ onInteractOutside: () => {
494
+ if (isOpen()) state.close();
495
+ },
496
+ get isDisabled() {
497
+ return !isOpen() || local.isInPopover === true;
498
+ }
499
+ });
500
+ const { listBoxProps } = createListBox({
501
+ ...menuProps,
502
+ shouldSelectOnPressUp: true,
503
+ shouldFocusOnHover: true,
504
+ shouldSelectOnFocus: local.isInPopover === true ? false : void 0,
505
+ get isDisabled() {
506
+ return state.isDisabled;
507
+ }
508
+ }, createSelectListStateAdapter(state));
509
+ const renderValues = createMemo(() => ({ isFocused: state.selectionManager.isFocused }));
510
+ const renderProps = useRenderProps({
511
+ class: local.class,
512
+ style: local.style,
513
+ defaultClassName: "solidaria-Select-listbox"
514
+ }, renderValues);
515
+ const cleanMenuProps = () => {
516
+ const { ref: _ref1, ...rest } = menuProps;
517
+ return rest;
518
+ };
519
+ const cleanListBoxProps = () => {
520
+ const { ref: _ref2, ...rest } = listBoxProps;
521
+ return rest;
522
+ };
523
+ const items = () => Array.from(state.collection());
524
+ createEffect(() => {
525
+ if (!isOpen()) return;
526
+ const focusedKey = state.focusedKey();
527
+ if (focusedKey == null) return;
528
+ queueMicrotask(() => {
529
+ const option = Array.from(listBoxRef?.querySelectorAll("[role='option']") ?? []).find((element) => element.id === String(focusedKey));
530
+ if (option && document.activeElement !== option) focusSafely(option);
531
+ });
532
+ });
533
+ const listBox = () => <ul ref={(el) => listBoxRef = el} {...domProps} {...cleanMenuProps()} {...cleanListBoxProps()} class={renderProps.class()} style={renderProps.style()} data-focused={state.selectionManager.isFocused || void 0} data-empty={state.collection().size === 0 || void 0}>
534
+ {state.collection().size === 0 && local.renderEmptyState ? <li role="option" style={{ display: "contents" }} data-empty-state>
535
+ {local.renderEmptyState()}
536
+ </li> : <Show when={local.children} fallback={<For each={items()}>
537
+ {(node) => <SelectOption id={node.key}>{node.textValue}</SelectOption>}
538
+ </For>}>
539
+ <For each={items()}>
540
+ {(node) => node.value != null ? local.children(node.value) : null}
541
+ </For>
542
+ </Show>}
543
+ <Show when={local.onLoadMore}>
544
+ <ListBoxLoadMoreItem onLoadMore={local.onLoadMore} isLoading={local.isLoading} class={local.loadMoreClass}>
545
+ {local.renderLoadMore?.()}
546
+ </ListBoxLoadMoreItem>
547
+ </Show>
548
+ </ul>;
549
+ return <Show when={isOpen()}>
550
+ <Show when={local.isInPopover} fallback={<FocusScope restoreFocus autoFocus>
551
+ {listBox()}
552
+ </FocusScope>}>
553
+ {listBox()}
554
+ </Show>
555
+ </Show>;
556
+ }
557
+ /**
558
+ * An option in a select listbox.
559
+ */
560
+ function SelectOption(props) {
561
+ const [local, ariaProps] = splitProps(props, [
562
+ "class",
563
+ "style",
564
+ "slot",
565
+ "id",
566
+ "item",
567
+ "textValue"
568
+ ]);
569
+ const context = useContext(SelectStateContext);
570
+ if (!context) throw new Error("SelectOption must be used within a Select");
571
+ const state = context;
572
+ const selectContext = useContext(SelectContext);
573
+ const [ref, setRef] = createSignal(null);
574
+ const optionAria = createOption({
575
+ key: local.id,
576
+ get isDisabled() {
577
+ return Boolean(ariaProps.isDisabled || selectContext?.isDisabled());
578
+ },
579
+ get "aria-label"() {
580
+ return ariaProps["aria-label"] ?? local.textValue;
581
+ },
582
+ shouldSelectOnPressUp: true,
583
+ shouldFocusOnHover: true,
584
+ get onHoverStart() {
585
+ return ariaProps.onHoverStart;
586
+ },
587
+ get onHoverEnd() {
588
+ return ariaProps.onHoverEnd;
589
+ },
590
+ get onHoverChange() {
591
+ return ariaProps.onHoverChange;
592
+ }
593
+ }, {
594
+ ...createSelectListStateAdapter(state),
595
+ select: (key) => {
596
+ if (state.selectionMode() === "multiple") {
597
+ const keys = state.selectedKeys();
598
+ if (keys === "all") return;
599
+ state.setSelectedKeys(new Set([...keys, key]));
600
+ return;
601
+ }
602
+ state.setSelectedKey(key);
603
+ state.close();
604
+ },
605
+ toggleSelection: (key) => {
606
+ if (state.selectionMode() === "multiple") {
607
+ const keys = state.selectedKeys();
608
+ if (keys === "all") return;
609
+ const next = new Set(keys);
610
+ if (next.has(key)) next.delete(key);
611
+ else next.add(key);
612
+ state.setSelectedKeys(next);
613
+ return;
614
+ }
615
+ state.setSelectedKey(key);
616
+ state.close();
617
+ },
618
+ replaceSelection: (key) => {
619
+ state.setSelectedKey(key);
620
+ if (state.selectionMode() !== "multiple") state.close();
621
+ }
622
+ }, () => ref());
623
+ const isOptionFocusVisible = () => optionAria.isFocused() && (selectContext?.isFocusVisible() ?? optionAria.isFocusVisible());
624
+ const renderValues = createMemo(() => ({
625
+ isSelected: optionAria.isSelected(),
626
+ isFocused: optionAria.isFocused(),
627
+ isFocusVisible: isOptionFocusVisible(),
628
+ isPressed: optionAria.isPressed(),
629
+ isHovered: optionAria.isHovered(),
630
+ isDisabled: optionAria.isDisabled()
631
+ }));
632
+ const renderProps = useRenderProps({
633
+ get children() {
634
+ return props.children;
635
+ },
636
+ class: local.class,
637
+ style: local.style,
638
+ defaultClassName: "solidaria-Select-option"
639
+ }, renderValues);
640
+ const hasPrimitiveLabel = () => {
641
+ return typeof props.children === "string" || typeof props.children === "number";
642
+ };
643
+ const selectionIndicatorContext = createMemo(() => ({ isSelected: optionAria.isSelected }));
644
+ const cleanOptionProps = () => {
645
+ const { ref: _ref1, "aria-describedby": _ariaDescribedby, ...rest } = optionAria.optionProps;
646
+ if (!hasPrimitiveLabel() && rest["aria-label"] == null) delete rest["aria-labelledby"];
647
+ const onClick = rest.onClick;
648
+ rest.onClick = ((event) => {
649
+ const wasSelected = optionAria.isSelected();
650
+ onClick?.(event);
651
+ if (typeof PointerEvent === "undefined") return;
652
+ queueMicrotask(() => {
653
+ if (state.selectionMode() !== "multiple" || optionAria.isSelected() === wasSelected) selectOption();
654
+ });
655
+ });
656
+ return rest;
657
+ };
658
+ const selectOption = () => {
659
+ if (optionAria.isDisabled()) return;
660
+ if (state.selectionMode() === "multiple") {
661
+ const keys = state.selectedKeys();
662
+ if (keys === "all") return;
663
+ const next = new Set(keys);
664
+ if (next.has(local.id)) next.delete(local.id);
665
+ else next.add(local.id);
666
+ state.setSelectedKeys(next);
667
+ return;
668
+ }
669
+ state.setSelectedKey(local.id);
670
+ state.close();
671
+ };
672
+ return <SelectionIndicatorContext.Provider value={selectionIndicatorContext()}>
673
+ <li ref={setRef} {...cleanOptionProps()} class={renderProps.class()} style={renderProps.style()} data-selected={optionAria.isSelected() || void 0} data-focused={optionAria.isFocused() || void 0} data-focus-visible={isOptionFocusVisible() || void 0} data-pressed={optionAria.isPressed() || void 0} data-hovered={optionAria.isHovered() || void 0} data-disabled={optionAria.isDisabled() || void 0}>
674
+ {hasPrimitiveLabel() ? <span {...optionAria.labelProps}>{renderProps.renderChildren()}</span> : renderProps.renderChildren()}
675
+ </li>
676
+ </SelectionIndicatorContext.Provider>;
677
+ }
678
+ function isObjectRecord(value) {
679
+ return typeof value === "object" && value !== null;
680
+ }
681
+ function toKey(value) {
682
+ if (typeof value === "string" || typeof value === "number") return value;
683
+ }
684
+ function toTextValue(value) {
685
+ if (typeof value === "string" || typeof value === "number") return String(value);
686
+ }
687
+ function createSelectListStateAdapter(state) {
688
+ const selectedKeys = createMemo(() => {
689
+ const keys = state.selectedKeys();
690
+ return keys === "all" ? new Set(Array.from(state.collection()).map((item) => item.key)) : keys;
691
+ });
692
+ const disabledKeys = createMemo(() => {
693
+ const keys = /* @__PURE__ */ new Set();
694
+ for (const node of state.collection()) if (node.isDisabled) keys.add(node.key);
695
+ return keys;
696
+ });
697
+ return {
698
+ collection: state.collection,
699
+ selectionManager: state.selectionManager,
700
+ isFocused: () => state.selectionManager.isFocused,
701
+ setFocused: (isFocused) => state.selectionManager.setFocused(isFocused),
702
+ focusedKey: state.focusedKey,
703
+ setFocusedKey: (key) => state.setFocusedKey(key ?? null),
704
+ childFocusStrategy: () => null,
705
+ selectionMode: () => state.selectionMode(),
706
+ selectionBehavior: () => "replace",
707
+ disallowEmptySelection: () => true,
708
+ selectedKeys,
709
+ disabledKeys,
710
+ disabledBehavior: () => "all",
711
+ isEmpty: () => selectedKeys().size === 0,
712
+ isSelectAll: () => state.selectedKeys() === "all",
713
+ isSelected: (key) => selectedKeys().has(key),
714
+ isDisabled: state.isKeyDisabled,
715
+ setSelectionBehavior: () => {},
716
+ toggleSelection: (key) => {
717
+ if (state.selectionMode() !== "multiple") {
718
+ state.setSelectedKey(key);
719
+ return;
720
+ }
721
+ const keys = state.selectedKeys();
722
+ if (keys === "all") return;
723
+ const next = new Set(keys);
724
+ if (next.has(key)) next.delete(key);
725
+ else next.add(key);
726
+ state.setSelectedKeys(next);
727
+ },
728
+ replaceSelection: (key) => state.setSelectedKey(key),
729
+ setSelectedKeys: (keys) => state.setSelectedKeys(keys),
730
+ selectAll: () => {},
731
+ clearSelection: () => state.selectionMode() === "multiple" ? state.setSelectedKeys([]) : state.setSelectedKey(null),
732
+ toggleSelectAll: () => {},
733
+ extendSelection: (toKey) => state.setSelectedKey(toKey),
734
+ select: (key) => state.selectionMode() === "multiple" ? state.setSelectedKeys([...state.selectedKeys() === "all" ? [] : state.selectedKeys(), key]) : state.setSelectedKey(key)
735
+ };
736
+ }
737
+ Select.Trigger = SelectTrigger;
738
+ Select.Value = SelectValue;
739
+ Select.ListBox = SelectListBox;
740
+ Select.Option = SelectOption;
741
+ //#endregion
742
+ export { Select, SelectContext, SelectListBox, SelectOption, SelectStateContext, SelectTrigger, SelectValue, SelectValueContext };
743
+
744
+ //# sourceMappingURL=Select.jsx.map