@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
package/dist/Select.js ADDED
@@ -0,0 +1,1031 @@
1
+ import { filterDOMProps, useRenderProps } from "./utils.js";
2
+ import { FieldErrorContext } from "./FieldError.js";
3
+ import { SelectionIndicatorContext } from "./SelectionIndicator.js";
4
+ import { ListBoxLoadMoreItem } from "./ListBox.js";
5
+ import { createComponent, effect, getNextElement, getNextMarker, insert, memo, mergeProps, runHydrationEvents, setAttribute, setProperty, spread, template, use } from "solid-js/web";
6
+ import { For, Show, createContext, createEffect, createMemo, createSignal, createUniqueId, splitProps, untrack, useContext } from "solid-js";
7
+ import { FocusScope, createHiddenSelect, createHover, createInteractOutside, createListBox, createOption, createSelect, focusSafely, mergeProps as mergeProps$2 } from "@proyecto-viviana/solidaria";
8
+ import { DEFAULT_VALIDATION_RESULT, createSelectState } from "@proyecto-viviana/solid-stately";
9
+ //#region src/Select.tsx
10
+ /**
11
+ * Select component for solidaria-components
12
+ *
13
+ * A pre-wired headless select that combines state + aria hooks.
14
+ * Port of react-aria-components/src/Select.tsx
15
+ */
16
+ var _tmpl$ = /*#__PURE__*/ template(`<option>`), _tmpl$2 = /*#__PURE__*/ template(`<input type=hidden>`), _tmpl$3 = /*#__PURE__*/ template(`<div><select><!$><!/><!$><!/></select><!$><!/><!$><!/>`), _tmpl$4 = /*#__PURE__*/ template(`<span>`), _tmpl$5 = /*#__PURE__*/ template(`<div>`), _tmpl$6 = /*#__PURE__*/ template(`<button>`), _tmpl$7 = /*#__PURE__*/ template(`<ul><!$><!/><!$><!/>`), _tmpl$8 = /*#__PURE__*/ template(`<li role=option data-empty-state style=display:contents>`), _tmpl$9 = /*#__PURE__*/ template(`<li>`);
17
+ function assignRef(ref, el) {
18
+ if (!ref) return;
19
+ if (typeof ref === "function") ref(el);
20
+ else ref.current = el;
21
+ }
22
+ function getNativeSelectValidation(select) {
23
+ return {
24
+ isInvalid: !select.validity.valid,
25
+ validationDetails: {
26
+ badInput: select.validity.badInput,
27
+ customError: select.validity.customError,
28
+ patternMismatch: select.validity.patternMismatch,
29
+ rangeOverflow: select.validity.rangeOverflow,
30
+ rangeUnderflow: select.validity.rangeUnderflow,
31
+ stepMismatch: select.validity.stepMismatch,
32
+ tooLong: select.validity.tooLong,
33
+ tooShort: select.validity.tooShort,
34
+ typeMismatch: select.validity.typeMismatch,
35
+ valueMissing: select.validity.valueMissing,
36
+ valid: select.validity.valid
37
+ },
38
+ validationErrors: select.validationMessage ? [select.validationMessage] : []
39
+ };
40
+ }
41
+ const SelectContext = createContext(null);
42
+ const SelectStateContext = createContext(null);
43
+ const SelectValueContext = SelectContext;
44
+ const selectRootLabelProps = new Set([
45
+ "aria-label",
46
+ "aria-labelledby",
47
+ "aria-describedby",
48
+ "aria-details"
49
+ ]);
50
+ /**
51
+ * A select displays a collapsible list of options and allows a user to select one of them.
52
+ */
53
+ function Select(props) {
54
+ const contextSlotProps = useContext(SelectContext)?.slots?.[props.slot ?? "default"];
55
+ const [local, stateProps, ariaProps] = splitProps(contextSlotProps ? mergeProps$2(contextSlotProps, props) : props, [
56
+ "class",
57
+ "style",
58
+ "render",
59
+ "ref",
60
+ "slot",
61
+ "children"
62
+ ], [
63
+ "items",
64
+ "getKey",
65
+ "getTextValue",
66
+ "getDisabled",
67
+ "disabledKeys",
68
+ "selectionMode",
69
+ "selectedKey",
70
+ "defaultSelectedKey",
71
+ "selectedKeys",
72
+ "defaultSelectedKeys",
73
+ "onSelectionChange",
74
+ "onSelectionChangeKeys",
75
+ "isOpen",
76
+ "defaultOpen",
77
+ "onOpenChange",
78
+ "name"
79
+ ]);
80
+ let rootRef;
81
+ const [selectValidation, setSelectValidation] = createSignal(DEFAULT_VALIDATION_RESULT);
82
+ const errorMessageId = createUniqueId();
83
+ const resolveDisabled = () => {
84
+ const disabled = ariaProps.isDisabled;
85
+ if (typeof disabled === "function") return disabled();
86
+ return !!disabled;
87
+ };
88
+ const state = createSelectState({
89
+ get items() {
90
+ return stateProps.items;
91
+ },
92
+ get getKey() {
93
+ return stateProps.getKey;
94
+ },
95
+ get getTextValue() {
96
+ return stateProps.getTextValue;
97
+ },
98
+ get getDisabled() {
99
+ return stateProps.getDisabled;
100
+ },
101
+ get disabledKeys() {
102
+ return stateProps.disabledKeys;
103
+ },
104
+ get selectionMode() {
105
+ return stateProps.selectionMode;
106
+ },
107
+ get selectedKey() {
108
+ return stateProps.selectedKey;
109
+ },
110
+ get defaultSelectedKey() {
111
+ return stateProps.defaultSelectedKey;
112
+ },
113
+ get selectedKeys() {
114
+ return stateProps.selectedKeys;
115
+ },
116
+ get defaultSelectedKeys() {
117
+ return stateProps.defaultSelectedKeys;
118
+ },
119
+ get onSelectionChange() {
120
+ return stateProps.onSelectionChange;
121
+ },
122
+ get onSelectionChangeKeys() {
123
+ return stateProps.onSelectionChangeKeys;
124
+ },
125
+ get isOpen() {
126
+ return stateProps.isOpen;
127
+ },
128
+ get defaultOpen() {
129
+ return stateProps.defaultOpen;
130
+ },
131
+ get onOpenChange() {
132
+ return stateProps.onOpenChange;
133
+ },
134
+ get isDisabled() {
135
+ return resolveDisabled();
136
+ },
137
+ get isRequired() {
138
+ return ariaProps.isRequired;
139
+ }
140
+ });
141
+ const { labelProps, triggerProps, valueProps, menuProps, isFocused, isFocusVisible, isOpen } = createSelect(createMemo(() => {
142
+ const clean = {};
143
+ for (const key in ariaProps) if (!key.startsWith("data-")) clean[key] = ariaProps[key];
144
+ return clean;
145
+ }), state);
146
+ const { isHovered, hoverProps } = createHover({ get isDisabled() {
147
+ return resolveDisabled();
148
+ } });
149
+ const renderValues = createMemo(() => ({
150
+ isOpen: isOpen(),
151
+ isFocused: isFocused(),
152
+ isFocusVisible: isFocusVisible(),
153
+ isDisabled: resolveDisabled(),
154
+ isRequired: !!ariaProps.isRequired,
155
+ isSelected: state.selectionMode() === "multiple" ? state.selectedKeys() === "all" || state.selectedKeys().size > 0 : state.selectedKey() != null
156
+ }));
157
+ const childRenderValues = {
158
+ get isOpen() {
159
+ return isOpen();
160
+ },
161
+ get isFocused() {
162
+ return isFocused();
163
+ },
164
+ get isFocusVisible() {
165
+ return isFocusVisible();
166
+ },
167
+ get isDisabled() {
168
+ return resolveDisabled();
169
+ },
170
+ get isRequired() {
171
+ return !!ariaProps.isRequired;
172
+ },
173
+ get isSelected() {
174
+ return hasSelection();
175
+ }
176
+ };
177
+ const renderProps = useRenderProps({
178
+ class: local.class,
179
+ style: local.style,
180
+ defaultClassName: "solidaria-Select"
181
+ }, renderValues);
182
+ const domProps = createMemo(() => {
183
+ const filtered = filterDOMProps(ariaProps, { global: true });
184
+ for (const key of selectRootLabelProps) delete filtered[key];
185
+ return filtered;
186
+ });
187
+ const cleanHoverProps = () => {
188
+ const { ref: _ref, ...rest } = hoverProps;
189
+ return rest;
190
+ };
191
+ const cleanLabelProps = () => {
192
+ const { ref: _ref, ...rest } = labelProps;
193
+ return rest;
194
+ };
195
+ const setRootRef = (el) => {
196
+ rootRef = el;
197
+ assignRef(local.ref, el);
198
+ };
199
+ const validation = createMemo(() => {
200
+ const current = selectValidation();
201
+ if (current.isInvalid || !ariaProps.isInvalid) return current;
202
+ return {
203
+ ...DEFAULT_VALIDATION_RESULT,
204
+ isInvalid: true
205
+ };
206
+ });
207
+ const isInvalid = createMemo(() => validation().isInvalid);
208
+ const triggerDescribedBy = () => {
209
+ const ids = [triggerProps["aria-describedby"], isInvalid() ? errorMessageId : void 0].filter(Boolean).join(" ").split(" ").filter(Boolean);
210
+ return ids.length ? Array.from(new Set(ids)).join(" ") : void 0;
211
+ };
212
+ const triggerPropsWithValidation = () => ({
213
+ ...triggerProps,
214
+ "aria-describedby": triggerDescribedBy()
215
+ });
216
+ const fieldErrorContext = {
217
+ get validation() {
218
+ return validation();
219
+ },
220
+ get errorMessageProps() {
221
+ return { id: errorMessageId };
222
+ }
223
+ };
224
+ const focusTrigger = () => {
225
+ triggerRef?.focus();
226
+ };
227
+ const hasSelection = () => state.selectionMode() === "multiple" ? state.selectedKeys() === "all" || state.selectedKeys().size > 0 : state.selectedKey() != null;
228
+ const hasNativeValidation = () => (ariaProps.validationBehavior ?? "native") === "native";
229
+ const getSelectValidation = (select) => {
230
+ if (ariaProps.isRequired && !hasSelection()) return {
231
+ isInvalid: true,
232
+ validationDetails: {
233
+ badInput: false,
234
+ customError: false,
235
+ patternMismatch: false,
236
+ rangeOverflow: false,
237
+ rangeUnderflow: false,
238
+ stepMismatch: false,
239
+ tooLong: false,
240
+ tooShort: false,
241
+ typeMismatch: false,
242
+ valueMissing: true,
243
+ valid: false
244
+ },
245
+ validationErrors: [select.validationMessage || "Constraints not satisfied"]
246
+ };
247
+ return getNativeSelectValidation(select);
248
+ };
249
+ const { containerProps, selectProps: hiddenSelectProps } = createHiddenSelect({
250
+ state,
251
+ name: stateProps.name,
252
+ form: ariaProps.form,
253
+ isRequired: ariaProps.isRequired,
254
+ validationBehavior: ariaProps.validationBehavior ?? "native",
255
+ get isDisabled() {
256
+ return resolveDisabled();
257
+ }
258
+ });
259
+ const handleHiddenSelectInvalid = (event) => {
260
+ setSelectValidation(getSelectValidation(event.currentTarget));
261
+ focusTrigger();
262
+ event.preventDefault();
263
+ };
264
+ const handleHiddenSelectChange = (event) => {
265
+ hiddenSelectProps.onChange?.(event);
266
+ setSelectValidation(hasSelection() && event.currentTarget.validity.valid ? DEFAULT_VALIDATION_RESULT : getSelectValidation(event.currentTarget));
267
+ };
268
+ createEffect(() => {
269
+ if (hasSelection() && selectValidation().isInvalid) setSelectValidation(DEFAULT_VALIDATION_RESULT);
270
+ });
271
+ let triggerRef = null;
272
+ const setTriggerRef = (el) => {
273
+ triggerRef = el;
274
+ };
275
+ const RootChildren = () => {
276
+ const selectChildren = untrack(() => typeof local.children === "function" ? local.children(childRenderValues) : local.children);
277
+ return [
278
+ (() => {
279
+ var _el$ = getNextElement(_tmpl$3), _el$2 = _el$.firstChild, _el$4 = _el$2.firstChild, [_el$5, _co$] = getNextMarker(_el$4.nextSibling), _el$6 = _el$5.nextSibling, [_el$7, _co$2] = getNextMarker(_el$6.nextSibling), _el$9 = _el$2.nextSibling, [_el$0, _co$3] = getNextMarker(_el$9.nextSibling), _el$1 = _el$0.nextSibling, [_el$10, _co$4] = getNextMarker(_el$1.nextSibling);
280
+ spread(_el$, containerProps, false, true);
281
+ spread(_el$2, mergeProps(hiddenSelectProps, {
282
+ get name() {
283
+ return memo(() => !!hasSelection())() ? void 0 : stateProps.name;
284
+ },
285
+ get required() {
286
+ return memo(() => !!(hasNativeValidation() && ariaProps.isRequired))() && !hasSelection() || void 0;
287
+ },
288
+ "onInvalid": handleHiddenSelectInvalid,
289
+ "onChange": handleHiddenSelectChange
290
+ }), false, true);
291
+ insert(_el$2, createComponent(Show, {
292
+ get when() {
293
+ return state.selectionMode() !== "multiple";
294
+ },
295
+ get children() {
296
+ var _el$3 = getNextElement(_tmpl$);
297
+ effect(() => setProperty(_el$3, "selected", state.selectedKey() == null));
298
+ return _el$3;
299
+ }
300
+ }), _el$5, _co$);
301
+ insert(_el$2, createComponent(For, {
302
+ get each() {
303
+ return stateProps.items;
304
+ },
305
+ children: (item) => {
306
+ const itemRecord = isObjectRecord(item) ? item : null;
307
+ const fallbackKey = itemRecord != null ? toKey(itemRecord.key) ?? toKey(itemRecord.id) : void 0;
308
+ const key = stateProps.getKey?.(item) ?? fallbackKey ?? String(item);
309
+ const fallbackTextValue = itemRecord != null ? toTextValue(itemRecord.textValue) ?? toTextValue(itemRecord.label) : void 0;
310
+ const textValue = stateProps.getTextValue?.(item) ?? fallbackTextValue ?? String(item);
311
+ const selectedKeys = state.selectedKeys();
312
+ const isSelected = state.selectionMode() === "multiple" ? selectedKeys === "all" ? true : selectedKeys.has(key) : key === state.selectedKey();
313
+ return (() => {
314
+ var _el$12 = getNextElement(_tmpl$);
315
+ setProperty(_el$12, "selected", isSelected);
316
+ insert(_el$12, textValue);
317
+ effect(() => setProperty(_el$12, "value", String(key)));
318
+ return _el$12;
319
+ })();
320
+ }
321
+ }), _el$7, _co$2);
322
+ insert(_el$, createComponent(Show, {
323
+ get when() {
324
+ return memo(() => state.selectionMode() === "multiple")() && stateProps.name;
325
+ },
326
+ get children() {
327
+ return createComponent(For, {
328
+ get each() {
329
+ return memo(() => state.selectedKeys() === "all")() ? Array.from(state.collection()).map((item) => item.key) : Array.from(state.selectedKeys());
330
+ },
331
+ children: (key) => (() => {
332
+ var _el$13 = getNextElement(_tmpl$2);
333
+ effect((_p$) => {
334
+ var _v$4 = stateProps.name, _v$5 = ariaProps.form, _v$6 = resolveDisabled();
335
+ _v$4 !== _p$.e && setAttribute(_el$13, "name", _p$.e = _v$4);
336
+ _v$5 !== _p$.t && setAttribute(_el$13, "form", _p$.t = _v$5);
337
+ _v$6 !== _p$.a && setProperty(_el$13, "disabled", _p$.a = _v$6);
338
+ return _p$;
339
+ }, {
340
+ e: void 0,
341
+ t: void 0,
342
+ a: void 0
343
+ });
344
+ effect(() => setProperty(_el$13, "value", String(key)));
345
+ return _el$13;
346
+ })()
347
+ });
348
+ }
349
+ }), _el$0, _co$3);
350
+ insert(_el$, createComponent(Show, {
351
+ get when() {
352
+ return memo(() => !!(state.selectionMode() !== "multiple" && stateProps.name))() && state.selectedKey() != null;
353
+ },
354
+ get children() {
355
+ var _el$8 = getNextElement(_tmpl$2);
356
+ effect((_p$) => {
357
+ var _v$ = stateProps.name, _v$2 = ariaProps.form, _v$3 = resolveDisabled();
358
+ _v$ !== _p$.e && setAttribute(_el$8, "name", _p$.e = _v$);
359
+ _v$2 !== _p$.t && setAttribute(_el$8, "form", _p$.t = _v$2);
360
+ _v$3 !== _p$.a && setProperty(_el$8, "disabled", _p$.a = _v$3);
361
+ return _p$;
362
+ }, {
363
+ e: void 0,
364
+ t: void 0,
365
+ a: void 0
366
+ });
367
+ effect(() => setProperty(_el$8, "value", String(state.selectedKey())));
368
+ return _el$8;
369
+ }
370
+ }), _el$10, _co$4);
371
+ runHydrationEvents();
372
+ return _el$;
373
+ })(),
374
+ createComponent(Show, {
375
+ get when() {
376
+ return ariaProps.label;
377
+ },
378
+ get children() {
379
+ var _el$11 = getNextElement(_tmpl$4);
380
+ spread(_el$11, mergeProps(cleanLabelProps), false, true);
381
+ insert(_el$11, () => ariaProps.label);
382
+ runHydrationEvents();
383
+ return _el$11;
384
+ }
385
+ }),
386
+ selectChildren
387
+ ];
388
+ };
389
+ const baseRootProps = () => ({
390
+ ...domProps(),
391
+ ...cleanHoverProps(),
392
+ ref: setRootRef,
393
+ class: renderProps.class(),
394
+ style: renderProps.style(),
395
+ slot: local.slot,
396
+ "data-open": isOpen() || void 0,
397
+ "data-disabled": resolveDisabled() || void 0,
398
+ "data-required": ariaProps.isRequired || void 0,
399
+ "data-invalid": isInvalid() || void 0,
400
+ "data-hovered": isHovered() || void 0
401
+ });
402
+ const RootContent = () => {
403
+ const renderedRootChildren = createComponent(RootChildren, {});
404
+ const rootProps = () => ({
405
+ ...baseRootProps(),
406
+ children: renderedRootChildren
407
+ });
408
+ return local.render ? local.render(rootProps(), renderValues()) : (() => {
409
+ var _el$14 = getNextElement(_tmpl$5);
410
+ spread(_el$14, mergeProps(baseRootProps), false, true);
411
+ insert(_el$14, renderedRootChildren);
412
+ runHydrationEvents();
413
+ return _el$14;
414
+ })();
415
+ };
416
+ return createComponent(SelectContext.Provider, {
417
+ get value() {
418
+ return {
419
+ state,
420
+ rootRef: () => rootRef ?? null,
421
+ triggerRef: () => triggerRef,
422
+ setTriggerRef,
423
+ get triggerProps() {
424
+ return triggerPropsWithValidation();
425
+ },
426
+ valueProps,
427
+ labelProps,
428
+ menuProps,
429
+ get errorMessageProps() {
430
+ return { id: errorMessageId };
431
+ },
432
+ get validation() {
433
+ return validation();
434
+ },
435
+ isOpen,
436
+ isFocused,
437
+ isFocusVisible,
438
+ isDisabled: resolveDisabled,
439
+ placeholder: ariaProps.placeholder,
440
+ items: stateProps.items,
441
+ autoFocus: !!ariaProps.autoFocus
442
+ };
443
+ },
444
+ get children() {
445
+ return createComponent(SelectStateContext.Provider, {
446
+ value: state,
447
+ get children() {
448
+ return createComponent(FieldErrorContext.Provider, {
449
+ value: fieldErrorContext,
450
+ get children() {
451
+ return createComponent(RootContent, {});
452
+ }
453
+ });
454
+ }
455
+ });
456
+ }
457
+ });
458
+ }
459
+ /**
460
+ * The trigger button for a select.
461
+ */
462
+ function SelectTrigger(props) {
463
+ const [local, domProps] = splitProps(props, [
464
+ "class",
465
+ "style",
466
+ "slot",
467
+ "children"
468
+ ]);
469
+ const context = useContext(SelectContext);
470
+ if (!context) throw new Error("SelectTrigger must be used within a Select");
471
+ const { isOpen, isFocused, isFocusVisible, state } = context;
472
+ let triggerRef;
473
+ const setTriggerRef = (el) => {
474
+ triggerRef = el;
475
+ context.setTriggerRef(el);
476
+ };
477
+ createEffect(() => {
478
+ if (context.autoFocus) triggerRef?.focus();
479
+ });
480
+ const { isHovered, hoverProps } = createHover({ get isDisabled() {
481
+ return state.isDisabled;
482
+ } });
483
+ const renderValues = createMemo(() => ({
484
+ isOpen: isOpen(),
485
+ isFocused: isFocused(),
486
+ isFocusVisible: isFocusVisible(),
487
+ isHovered: isHovered(),
488
+ isDisabled: state.isDisabled
489
+ }));
490
+ const renderProps = useRenderProps({
491
+ get children() {
492
+ return props.children;
493
+ },
494
+ class: local.class,
495
+ style: local.style,
496
+ defaultClassName: "solidaria-Select-trigger"
497
+ }, renderValues);
498
+ const cleanTriggerProps = () => {
499
+ const { ref: _ref1, ...rest } = context.triggerProps;
500
+ return rest;
501
+ };
502
+ const cleanHoverProps = () => {
503
+ const { ref: _ref2, ...rest } = hoverProps;
504
+ return rest;
505
+ };
506
+ const triggerAriaProps = () => context.triggerProps;
507
+ const menuAriaProps = () => context.menuProps;
508
+ return (() => {
509
+ var _el$15 = getNextElement(_tmpl$6);
510
+ use(setTriggerRef, _el$15);
511
+ spread(_el$15, mergeProps(domProps, cleanTriggerProps, cleanHoverProps, {
512
+ "type": "button",
513
+ get id() {
514
+ return triggerAriaProps().id;
515
+ },
516
+ get tabIndex() {
517
+ return state.isDisabled ? void 0 : 0;
518
+ },
519
+ get ["aria-label"]() {
520
+ return triggerAriaProps()["aria-label"];
521
+ },
522
+ get ["aria-labelledby"]() {
523
+ return triggerAriaProps()["aria-labelledby"];
524
+ },
525
+ "aria-haspopup": "listbox",
526
+ get ["aria-expanded"]() {
527
+ return isOpen();
528
+ },
529
+ get ["aria-controls"]() {
530
+ return memo(() => !!isOpen())() ? menuAriaProps().id : void 0;
531
+ },
532
+ get ["aria-disabled"]() {
533
+ return state.isDisabled || void 0;
534
+ },
535
+ get ["aria-required"]() {
536
+ return triggerAriaProps()["aria-required"];
537
+ },
538
+ get ["aria-describedby"]() {
539
+ return triggerAriaProps()["aria-describedby"];
540
+ },
541
+ get ["class"]() {
542
+ return renderProps.class();
543
+ },
544
+ get style() {
545
+ return renderProps.style();
546
+ },
547
+ get ["data-open"]() {
548
+ return isOpen() || void 0;
549
+ },
550
+ get ["data-focused"]() {
551
+ return isFocused() || void 0;
552
+ },
553
+ get ["data-focus-visible"]() {
554
+ return isFocusVisible() || void 0;
555
+ },
556
+ get ["data-hovered"]() {
557
+ return isHovered() || void 0;
558
+ },
559
+ get ["data-disabled"]() {
560
+ return state.isDisabled || void 0;
561
+ }
562
+ }), false, true);
563
+ insert(_el$15, () => renderProps.renderChildren());
564
+ runHydrationEvents();
565
+ return _el$15;
566
+ })();
567
+ }
568
+ function defaultSelectValueChildren(values) {
569
+ return values.selectedText ?? values.placeholder ?? "";
570
+ }
571
+ /**
572
+ * Displays the selected value in a select.
573
+ */
574
+ function SelectValue(props) {
575
+ const [local, domProps] = splitProps(props, [
576
+ "class",
577
+ "style",
578
+ "slot",
579
+ "placeholder",
580
+ "children"
581
+ ]);
582
+ const context = useContext(SelectContext);
583
+ if (!context) throw new Error("SelectValue must be used within a Select");
584
+ const { valueProps, placeholder: contextPlaceholder } = context;
585
+ const state = context.state;
586
+ const placeholder = () => local.placeholder ?? contextPlaceholder;
587
+ const renderValues = createMemo(() => {
588
+ const collection = state.collection();
589
+ const selectedItem = state.selectedKey() == null ? null : collection.getItem(state.selectedKey());
590
+ const selectedKeys = state.selectedKeys();
591
+ const selectedItems = selectedKeys === "all" ? Array.from(collection) : Array.from(selectedKeys).map((key) => collection.getItem(key)).filter((item) => item != null);
592
+ return {
593
+ selectedItem,
594
+ selectedItems,
595
+ selectedText: state.selectionMode() === "multiple" ? selectedItems.length > 0 ? new Intl.ListFormat(void 0, {
596
+ style: "long",
597
+ type: "conjunction"
598
+ }).format(selectedItems.map((item) => item.textValue)) : null : selectedItem?.textValue ?? null,
599
+ isSelected: state.selectionMode() === "multiple" ? selectedItems.length > 0 : selectedItem != null,
600
+ placeholder: placeholder()
601
+ };
602
+ });
603
+ const renderProps = useRenderProps({
604
+ get children() {
605
+ return props.children ?? defaultSelectValueChildren;
606
+ },
607
+ class: local.class,
608
+ style: local.style,
609
+ defaultClassName: "solidaria-Select-value"
610
+ }, renderValues);
611
+ return (() => {
612
+ var _el$16 = getNextElement(_tmpl$4);
613
+ spread(_el$16, mergeProps(domProps, valueProps, {
614
+ get ["class"]() {
615
+ return renderProps.class();
616
+ },
617
+ get style() {
618
+ return renderProps.style();
619
+ },
620
+ get ["data-placeholder"]() {
621
+ return !renderValues().isSelected || void 0;
622
+ }
623
+ }), false, true);
624
+ insert(_el$16, (() => {
625
+ var _c$ = memo(() => props.children == null);
626
+ return () => _c$() ? renderValues().selectedText ?? renderValues().placeholder ?? "" : renderProps.renderChildren();
627
+ })());
628
+ runHydrationEvents();
629
+ return _el$16;
630
+ })();
631
+ }
632
+ /**
633
+ * The listbox popup for a select.
634
+ */
635
+ function SelectListBox(props) {
636
+ const [local, domProps] = splitProps(props, [
637
+ "class",
638
+ "style",
639
+ "slot",
640
+ "children",
641
+ "renderEmptyState",
642
+ "onLoadMore",
643
+ "isLoading",
644
+ "renderLoadMore",
645
+ "loadMoreClass",
646
+ "isInPopover"
647
+ ]);
648
+ const context = useContext(SelectContext);
649
+ if (!context) throw new Error("SelectListBox must be used within a Select");
650
+ const { menuProps, rootRef, state: selectState, isOpen } = context;
651
+ const state = selectState;
652
+ createEffect(() => {
653
+ if (!isOpen()) return;
654
+ if (state.focusedKey() != null) return;
655
+ const selectedKey = state.selectedKey();
656
+ if (selectedKey != null && !state.collection().getItem(selectedKey)?.isDisabled) state.setFocusedKey(selectedKey);
657
+ });
658
+ let listBoxRef;
659
+ createInteractOutside({
660
+ ref: () => rootRef() ?? listBoxRef ?? null,
661
+ onInteractOutside: () => {
662
+ if (isOpen()) state.close();
663
+ },
664
+ get isDisabled() {
665
+ return !isOpen() || local.isInPopover === true;
666
+ }
667
+ });
668
+ const { listBoxProps } = createListBox({
669
+ ...menuProps,
670
+ shouldSelectOnPressUp: true,
671
+ shouldFocusOnHover: true,
672
+ shouldSelectOnFocus: local.isInPopover === true ? false : void 0,
673
+ get isDisabled() {
674
+ return state.isDisabled;
675
+ }
676
+ }, createSelectListStateAdapter(state));
677
+ const renderValues = createMemo(() => ({ isFocused: state.selectionManager.isFocused }));
678
+ const renderProps = useRenderProps({
679
+ class: local.class,
680
+ style: local.style,
681
+ defaultClassName: "solidaria-Select-listbox"
682
+ }, renderValues);
683
+ const cleanMenuProps = () => {
684
+ const { ref: _ref1, ...rest } = menuProps;
685
+ return rest;
686
+ };
687
+ const cleanListBoxProps = () => {
688
+ const { ref: _ref2, ...rest } = listBoxProps;
689
+ return rest;
690
+ };
691
+ const items = () => Array.from(state.collection());
692
+ createEffect(() => {
693
+ if (!isOpen()) return;
694
+ const focusedKey = state.focusedKey();
695
+ if (focusedKey == null) return;
696
+ queueMicrotask(() => {
697
+ const option = Array.from(listBoxRef?.querySelectorAll("[role='option']") ?? []).find((element) => element.id === String(focusedKey));
698
+ if (option && document.activeElement !== option) focusSafely(option);
699
+ });
700
+ });
701
+ const listBox = () => (() => {
702
+ var _el$17 = getNextElement(_tmpl$7), _el$18 = _el$17.firstChild, [_el$19, _co$5] = getNextMarker(_el$18.nextSibling), _el$20 = _el$19.nextSibling, [_el$21, _co$6] = getNextMarker(_el$20.nextSibling);
703
+ use((el) => listBoxRef = el, _el$17);
704
+ spread(_el$17, mergeProps(domProps, cleanMenuProps, cleanListBoxProps, {
705
+ get ["class"]() {
706
+ return renderProps.class();
707
+ },
708
+ get style() {
709
+ return renderProps.style();
710
+ },
711
+ get ["data-focused"]() {
712
+ return state.selectionManager.isFocused || void 0;
713
+ },
714
+ get ["data-empty"]() {
715
+ return state.collection().size === 0 || void 0;
716
+ }
717
+ }), false, true);
718
+ insert(_el$17, (() => {
719
+ var _c$2 = memo(() => !!(state.collection().size === 0 && local.renderEmptyState));
720
+ return () => _c$2() ? (() => {
721
+ var _el$22 = getNextElement(_tmpl$8);
722
+ insert(_el$22, () => local.renderEmptyState());
723
+ return _el$22;
724
+ })() : createComponent(Show, {
725
+ get when() {
726
+ return local.children;
727
+ },
728
+ get fallback() {
729
+ return createComponent(For, {
730
+ get each() {
731
+ return items();
732
+ },
733
+ children: (node) => createComponent(SelectOption, {
734
+ get id() {
735
+ return node.key;
736
+ },
737
+ get children() {
738
+ return node.textValue;
739
+ }
740
+ })
741
+ });
742
+ },
743
+ get children() {
744
+ return createComponent(For, {
745
+ get each() {
746
+ return items();
747
+ },
748
+ children: (node) => node.value != null ? local.children(node.value) : null
749
+ });
750
+ }
751
+ });
752
+ })(), _el$19, _co$5);
753
+ insert(_el$17, createComponent(Show, {
754
+ get when() {
755
+ return local.onLoadMore;
756
+ },
757
+ get children() {
758
+ return createComponent(ListBoxLoadMoreItem, {
759
+ get onLoadMore() {
760
+ return local.onLoadMore;
761
+ },
762
+ get isLoading() {
763
+ return local.isLoading;
764
+ },
765
+ get ["class"]() {
766
+ return local.loadMoreClass;
767
+ },
768
+ get children() {
769
+ return local.renderLoadMore?.();
770
+ }
771
+ });
772
+ }
773
+ }), _el$21, _co$6);
774
+ runHydrationEvents();
775
+ return _el$17;
776
+ })();
777
+ return createComponent(Show, {
778
+ get when() {
779
+ return isOpen();
780
+ },
781
+ get children() {
782
+ return createComponent(Show, {
783
+ get when() {
784
+ return local.isInPopover;
785
+ },
786
+ get fallback() {
787
+ return createComponent(FocusScope, {
788
+ restoreFocus: true,
789
+ autoFocus: true,
790
+ get children() {
791
+ return listBox();
792
+ }
793
+ });
794
+ },
795
+ get children() {
796
+ return listBox();
797
+ }
798
+ });
799
+ }
800
+ });
801
+ }
802
+ /**
803
+ * An option in a select listbox.
804
+ */
805
+ function SelectOption(props) {
806
+ const [local, ariaProps] = splitProps(props, [
807
+ "class",
808
+ "style",
809
+ "slot",
810
+ "id",
811
+ "item",
812
+ "textValue"
813
+ ]);
814
+ const context = useContext(SelectStateContext);
815
+ if (!context) throw new Error("SelectOption must be used within a Select");
816
+ const state = context;
817
+ const selectContext = useContext(SelectContext);
818
+ const [ref, setRef] = createSignal(null);
819
+ const optionAria = createOption({
820
+ key: local.id,
821
+ get isDisabled() {
822
+ return Boolean(ariaProps.isDisabled || selectContext?.isDisabled());
823
+ },
824
+ get "aria-label"() {
825
+ return ariaProps["aria-label"] ?? local.textValue;
826
+ },
827
+ shouldSelectOnPressUp: true,
828
+ shouldFocusOnHover: true,
829
+ get onHoverStart() {
830
+ return ariaProps.onHoverStart;
831
+ },
832
+ get onHoverEnd() {
833
+ return ariaProps.onHoverEnd;
834
+ },
835
+ get onHoverChange() {
836
+ return ariaProps.onHoverChange;
837
+ }
838
+ }, {
839
+ ...createSelectListStateAdapter(state),
840
+ select: (key) => {
841
+ if (state.selectionMode() === "multiple") {
842
+ const keys = state.selectedKeys();
843
+ if (keys === "all") return;
844
+ state.setSelectedKeys(new Set([...keys, key]));
845
+ return;
846
+ }
847
+ state.setSelectedKey(key);
848
+ state.close();
849
+ },
850
+ toggleSelection: (key) => {
851
+ if (state.selectionMode() === "multiple") {
852
+ const keys = state.selectedKeys();
853
+ if (keys === "all") return;
854
+ const next = new Set(keys);
855
+ if (next.has(key)) next.delete(key);
856
+ else next.add(key);
857
+ state.setSelectedKeys(next);
858
+ return;
859
+ }
860
+ state.setSelectedKey(key);
861
+ state.close();
862
+ },
863
+ replaceSelection: (key) => {
864
+ state.setSelectedKey(key);
865
+ if (state.selectionMode() !== "multiple") state.close();
866
+ }
867
+ }, () => ref());
868
+ const isOptionFocusVisible = () => optionAria.isFocused() && (selectContext?.isFocusVisible() ?? optionAria.isFocusVisible());
869
+ const renderValues = createMemo(() => ({
870
+ isSelected: optionAria.isSelected(),
871
+ isFocused: optionAria.isFocused(),
872
+ isFocusVisible: isOptionFocusVisible(),
873
+ isPressed: optionAria.isPressed(),
874
+ isHovered: optionAria.isHovered(),
875
+ isDisabled: optionAria.isDisabled()
876
+ }));
877
+ const renderProps = useRenderProps({
878
+ get children() {
879
+ return props.children;
880
+ },
881
+ class: local.class,
882
+ style: local.style,
883
+ defaultClassName: "solidaria-Select-option"
884
+ }, renderValues);
885
+ const hasPrimitiveLabel = () => {
886
+ return typeof props.children === "string" || typeof props.children === "number";
887
+ };
888
+ const selectionIndicatorContext = createMemo(() => ({ isSelected: optionAria.isSelected }));
889
+ const cleanOptionProps = () => {
890
+ const { ref: _ref1, "aria-describedby": _ariaDescribedby, ...rest } = optionAria.optionProps;
891
+ if (!hasPrimitiveLabel() && rest["aria-label"] == null) delete rest["aria-labelledby"];
892
+ const onClick = rest.onClick;
893
+ rest.onClick = ((event) => {
894
+ const wasSelected = optionAria.isSelected();
895
+ onClick?.(event);
896
+ if (typeof PointerEvent === "undefined") return;
897
+ queueMicrotask(() => {
898
+ if (state.selectionMode() !== "multiple" || optionAria.isSelected() === wasSelected) selectOption();
899
+ });
900
+ });
901
+ return rest;
902
+ };
903
+ const selectOption = () => {
904
+ if (optionAria.isDisabled()) return;
905
+ if (state.selectionMode() === "multiple") {
906
+ const keys = state.selectedKeys();
907
+ if (keys === "all") return;
908
+ const next = new Set(keys);
909
+ if (next.has(local.id)) next.delete(local.id);
910
+ else next.add(local.id);
911
+ state.setSelectedKeys(next);
912
+ return;
913
+ }
914
+ state.setSelectedKey(local.id);
915
+ state.close();
916
+ };
917
+ return createComponent(SelectionIndicatorContext.Provider, {
918
+ get value() {
919
+ return selectionIndicatorContext();
920
+ },
921
+ get children() {
922
+ var _el$23 = getNextElement(_tmpl$9);
923
+ use(setRef, _el$23);
924
+ spread(_el$23, mergeProps(cleanOptionProps, {
925
+ get ["class"]() {
926
+ return renderProps.class();
927
+ },
928
+ get style() {
929
+ return renderProps.style();
930
+ },
931
+ get ["data-selected"]() {
932
+ return optionAria.isSelected() || void 0;
933
+ },
934
+ get ["data-focused"]() {
935
+ return optionAria.isFocused() || void 0;
936
+ },
937
+ get ["data-focus-visible"]() {
938
+ return isOptionFocusVisible() || void 0;
939
+ },
940
+ get ["data-pressed"]() {
941
+ return optionAria.isPressed() || void 0;
942
+ },
943
+ get ["data-hovered"]() {
944
+ return optionAria.isHovered() || void 0;
945
+ },
946
+ get ["data-disabled"]() {
947
+ return optionAria.isDisabled() || void 0;
948
+ }
949
+ }), false, true);
950
+ insert(_el$23, (() => {
951
+ var _c$3 = memo(() => !!hasPrimitiveLabel());
952
+ return () => _c$3() ? (() => {
953
+ var _el$24 = getNextElement(_tmpl$4);
954
+ spread(_el$24, mergeProps(() => optionAria.labelProps), false, true);
955
+ insert(_el$24, () => renderProps.renderChildren());
956
+ runHydrationEvents();
957
+ return _el$24;
958
+ })() : renderProps.renderChildren();
959
+ })());
960
+ runHydrationEvents();
961
+ return _el$23;
962
+ }
963
+ });
964
+ }
965
+ function isObjectRecord(value) {
966
+ return typeof value === "object" && value !== null;
967
+ }
968
+ function toKey(value) {
969
+ if (typeof value === "string" || typeof value === "number") return value;
970
+ }
971
+ function toTextValue(value) {
972
+ if (typeof value === "string" || typeof value === "number") return String(value);
973
+ }
974
+ function createSelectListStateAdapter(state) {
975
+ const selectedKeys = createMemo(() => {
976
+ const keys = state.selectedKeys();
977
+ return keys === "all" ? new Set(Array.from(state.collection()).map((item) => item.key)) : keys;
978
+ });
979
+ const disabledKeys = createMemo(() => {
980
+ const keys = /* @__PURE__ */ new Set();
981
+ for (const node of state.collection()) if (node.isDisabled) keys.add(node.key);
982
+ return keys;
983
+ });
984
+ return {
985
+ collection: state.collection,
986
+ selectionManager: state.selectionManager,
987
+ isFocused: () => state.selectionManager.isFocused,
988
+ setFocused: (isFocused) => state.selectionManager.setFocused(isFocused),
989
+ focusedKey: state.focusedKey,
990
+ setFocusedKey: (key) => state.setFocusedKey(key ?? null),
991
+ childFocusStrategy: () => null,
992
+ selectionMode: () => state.selectionMode(),
993
+ selectionBehavior: () => "replace",
994
+ disallowEmptySelection: () => true,
995
+ selectedKeys,
996
+ disabledKeys,
997
+ disabledBehavior: () => "all",
998
+ isEmpty: () => selectedKeys().size === 0,
999
+ isSelectAll: () => state.selectedKeys() === "all",
1000
+ isSelected: (key) => selectedKeys().has(key),
1001
+ isDisabled: state.isKeyDisabled,
1002
+ setSelectionBehavior: () => {},
1003
+ toggleSelection: (key) => {
1004
+ if (state.selectionMode() !== "multiple") {
1005
+ state.setSelectedKey(key);
1006
+ return;
1007
+ }
1008
+ const keys = state.selectedKeys();
1009
+ if (keys === "all") return;
1010
+ const next = new Set(keys);
1011
+ if (next.has(key)) next.delete(key);
1012
+ else next.add(key);
1013
+ state.setSelectedKeys(next);
1014
+ },
1015
+ replaceSelection: (key) => state.setSelectedKey(key),
1016
+ setSelectedKeys: (keys) => state.setSelectedKeys(keys),
1017
+ selectAll: () => {},
1018
+ clearSelection: () => state.selectionMode() === "multiple" ? state.setSelectedKeys([]) : state.setSelectedKey(null),
1019
+ toggleSelectAll: () => {},
1020
+ extendSelection: (toKey) => state.setSelectedKey(toKey),
1021
+ select: (key) => state.selectionMode() === "multiple" ? state.setSelectedKeys([...state.selectedKeys() === "all" ? [] : state.selectedKeys(), key]) : state.setSelectedKey(key)
1022
+ };
1023
+ }
1024
+ Select.Trigger = SelectTrigger;
1025
+ Select.Value = SelectValue;
1026
+ Select.ListBox = SelectListBox;
1027
+ Select.Option = SelectOption;
1028
+ //#endregion
1029
+ export { Select, SelectContext, SelectListBox, SelectOption, SelectStateContext, SelectTrigger, SelectValue, SelectValueContext };
1030
+
1031
+ //# sourceMappingURL=Select.js.map