bits-ui 1.0.0-next.8 → 1.0.0-next.81

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 (837) hide show
  1. package/dist/app.d.ts +14 -0
  2. package/dist/bits/accordion/accordion.svelte.d.ts +15 -16
  3. package/dist/bits/accordion/accordion.svelte.js +40 -41
  4. package/dist/bits/accordion/components/accordion-content.svelte +3 -4
  5. package/dist/bits/accordion/components/accordion-content.svelte.d.ts +2 -17
  6. package/dist/bits/accordion/components/accordion-header.svelte +2 -3
  7. package/dist/bits/accordion/components/accordion-header.svelte.d.ts +2 -17
  8. package/dist/bits/accordion/components/accordion-item.svelte +2 -3
  9. package/dist/bits/accordion/components/accordion-item.svelte.d.ts +2 -17
  10. package/dist/bits/accordion/components/accordion-trigger.svelte +2 -3
  11. package/dist/bits/accordion/components/accordion-trigger.svelte.d.ts +2 -17
  12. package/dist/bits/accordion/components/accordion.svelte +8 -13
  13. package/dist/bits/accordion/components/accordion.svelte.d.ts +3 -18
  14. package/dist/bits/accordion/exports.d.ts +6 -0
  15. package/dist/bits/accordion/exports.js +5 -0
  16. package/dist/bits/accordion/index.d.ts +1 -6
  17. package/dist/bits/accordion/index.js +1 -5
  18. package/dist/bits/accordion/types.d.ts +9 -18
  19. package/dist/bits/alert-dialog/components/alert-dialog-action.svelte +4 -5
  20. package/dist/bits/alert-dialog/components/alert-dialog-action.svelte.d.ts +2 -17
  21. package/dist/bits/alert-dialog/components/alert-dialog-cancel.svelte +6 -5
  22. package/dist/bits/alert-dialog/components/alert-dialog-cancel.svelte.d.ts +2 -17
  23. package/dist/bits/alert-dialog/components/alert-dialog-content.svelte +20 -17
  24. package/dist/bits/alert-dialog/components/alert-dialog-content.svelte.d.ts +2 -17
  25. package/dist/bits/alert-dialog/components/alert-dialog.svelte +5 -14
  26. package/dist/bits/alert-dialog/components/alert-dialog.svelte.d.ts +2 -17
  27. package/dist/bits/alert-dialog/exports.d.ts +10 -0
  28. package/dist/bits/alert-dialog/exports.js +9 -0
  29. package/dist/bits/alert-dialog/index.d.ts +1 -10
  30. package/dist/bits/alert-dialog/index.js +1 -9
  31. package/dist/bits/alert-dialog/types.d.ts +1 -1
  32. package/dist/bits/aspect-ratio/aspect-ratio.svelte.js +1 -1
  33. package/dist/bits/aspect-ratio/components/aspect-ratio.svelte +4 -5
  34. package/dist/bits/aspect-ratio/components/aspect-ratio.svelte.d.ts +3 -18
  35. package/dist/bits/aspect-ratio/exports.d.ts +2 -0
  36. package/dist/bits/aspect-ratio/exports.js +1 -0
  37. package/dist/bits/aspect-ratio/index.d.ts +1 -2
  38. package/dist/bits/aspect-ratio/index.js +1 -1
  39. package/dist/bits/aspect-ratio/types.d.ts +3 -3
  40. package/dist/bits/avatar/avatar.svelte.d.ts +1 -3
  41. package/dist/bits/avatar/avatar.svelte.js +11 -17
  42. package/dist/bits/avatar/components/avatar-fallback.svelte +4 -5
  43. package/dist/bits/avatar/components/avatar-fallback.svelte.d.ts +3 -18
  44. package/dist/bits/avatar/components/avatar-image.svelte +4 -5
  45. package/dist/bits/avatar/components/avatar-image.svelte.d.ts +3 -18
  46. package/dist/bits/avatar/components/avatar.svelte +4 -5
  47. package/dist/bits/avatar/components/avatar.svelte.d.ts +3 -18
  48. package/dist/bits/avatar/exports.d.ts +4 -0
  49. package/dist/bits/avatar/exports.js +3 -0
  50. package/dist/bits/avatar/index.d.ts +1 -4
  51. package/dist/bits/avatar/index.js +1 -3
  52. package/dist/bits/avatar/types.d.ts +4 -4
  53. package/dist/bits/button/components/button.svelte +14 -4
  54. package/dist/bits/button/components/button.svelte.d.ts +3 -18
  55. package/dist/bits/button/exports.d.ts +2 -0
  56. package/dist/bits/button/exports.js +1 -0
  57. package/dist/bits/button/index.d.ts +1 -2
  58. package/dist/bits/button/index.js +1 -1
  59. package/dist/bits/button/types.d.ts +6 -4
  60. package/dist/bits/calendar/calendar.svelte.d.ts +36 -76
  61. package/dist/bits/calendar/calendar.svelte.js +77 -89
  62. package/dist/bits/calendar/components/calendar-cell.svelte +4 -5
  63. package/dist/bits/calendar/components/calendar-cell.svelte.d.ts +3 -18
  64. package/dist/bits/calendar/components/calendar-day.svelte +10 -5
  65. package/dist/bits/calendar/components/calendar-day.svelte.d.ts +3 -18
  66. package/dist/bits/calendar/components/calendar-grid-body.svelte +4 -5
  67. package/dist/bits/calendar/components/calendar-grid-body.svelte.d.ts +3 -18
  68. package/dist/bits/calendar/components/calendar-grid-head.svelte +4 -5
  69. package/dist/bits/calendar/components/calendar-grid-head.svelte.d.ts +3 -18
  70. package/dist/bits/calendar/components/calendar-grid-row.svelte +4 -5
  71. package/dist/bits/calendar/components/calendar-grid-row.svelte.d.ts +3 -18
  72. package/dist/bits/calendar/components/calendar-grid.svelte +4 -5
  73. package/dist/bits/calendar/components/calendar-grid.svelte.d.ts +3 -18
  74. package/dist/bits/calendar/components/calendar-head-cell.svelte +4 -5
  75. package/dist/bits/calendar/components/calendar-head-cell.svelte.d.ts +3 -18
  76. package/dist/bits/calendar/components/calendar-header.svelte +4 -5
  77. package/dist/bits/calendar/components/calendar-header.svelte.d.ts +3 -18
  78. package/dist/bits/calendar/components/calendar-heading.svelte +4 -5
  79. package/dist/bits/calendar/components/calendar-heading.svelte.d.ts +3 -18
  80. package/dist/bits/calendar/components/calendar-next-button.svelte +4 -5
  81. package/dist/bits/calendar/components/calendar-next-button.svelte.d.ts +3 -18
  82. package/dist/bits/calendar/components/calendar-prev-button.svelte +4 -5
  83. package/dist/bits/calendar/components/calendar-prev-button.svelte.d.ts +3 -18
  84. package/dist/bits/calendar/components/calendar.svelte +18 -23
  85. package/dist/bits/calendar/components/calendar.svelte.d.ts +3 -18
  86. package/dist/bits/calendar/exports.d.ts +13 -0
  87. package/dist/bits/calendar/exports.js +12 -0
  88. package/dist/bits/calendar/index.d.ts +1 -13
  89. package/dist/bits/calendar/index.js +1 -12
  90. package/dist/bits/calendar/types.d.ts +15 -33
  91. package/dist/bits/checkbox/checkbox.svelte.d.ts +63 -12
  92. package/dist/bits/checkbox/checkbox.svelte.js +180 -44
  93. package/dist/bits/checkbox/components/checkbox-group-label.svelte +32 -0
  94. package/dist/bits/checkbox/components/checkbox-group-label.svelte.d.ts +4 -0
  95. package/dist/bits/checkbox/components/checkbox-group.svelte +45 -0
  96. package/dist/bits/checkbox/components/checkbox-group.svelte.d.ts +4 -0
  97. package/dist/bits/checkbox/components/checkbox.svelte +22 -16
  98. package/dist/bits/checkbox/components/checkbox.svelte.d.ts +3 -18
  99. package/dist/bits/checkbox/exports.d.ts +4 -0
  100. package/dist/bits/checkbox/exports.js +3 -0
  101. package/dist/bits/checkbox/index.d.ts +1 -2
  102. package/dist/bits/checkbox/index.js +1 -1
  103. package/dist/bits/checkbox/types.d.ts +54 -12
  104. package/dist/bits/collapsible/collapsible.svelte.d.ts +6 -5
  105. package/dist/bits/collapsible/collapsible.svelte.js +29 -23
  106. package/dist/bits/collapsible/components/collapsible-content.svelte +3 -4
  107. package/dist/bits/collapsible/components/collapsible-content.svelte.d.ts +5 -27
  108. package/dist/bits/collapsible/components/collapsible-trigger.svelte +4 -5
  109. package/dist/bits/collapsible/components/collapsible-trigger.svelte.d.ts +3 -18
  110. package/dist/bits/collapsible/components/collapsible.svelte +7 -13
  111. package/dist/bits/collapsible/components/collapsible.svelte.d.ts +3 -18
  112. package/dist/bits/collapsible/exports.d.ts +4 -0
  113. package/dist/bits/collapsible/exports.js +3 -0
  114. package/dist/bits/collapsible/index.d.ts +1 -4
  115. package/dist/bits/collapsible/index.js +1 -3
  116. package/dist/bits/collapsible/types.d.ts +6 -14
  117. package/dist/bits/combobox/components/combobox-input.svelte +6 -7
  118. package/dist/bits/combobox/components/combobox-input.svelte.d.ts +3 -18
  119. package/dist/bits/combobox/components/combobox-trigger.svelte +8 -8
  120. package/dist/bits/combobox/components/combobox-trigger.svelte.d.ts +3 -18
  121. package/dist/bits/combobox/components/combobox.svelte +23 -34
  122. package/dist/bits/combobox/components/combobox.svelte.d.ts +2 -17
  123. package/dist/bits/combobox/exports.d.ts +15 -0
  124. package/dist/bits/combobox/exports.js +14 -0
  125. package/dist/bits/combobox/index.d.ts +1 -8
  126. package/dist/bits/combobox/index.js +1 -7
  127. package/dist/bits/combobox/types.d.ts +3 -3
  128. package/dist/bits/command/command-score.js +1 -2
  129. package/dist/bits/command/command.svelte.d.ts +21 -27
  130. package/dist/bits/command/command.svelte.js +108 -122
  131. package/dist/bits/command/components/_command-label.svelte +2 -2
  132. package/dist/bits/command/components/_command-label.svelte.d.ts +3 -18
  133. package/dist/bits/command/components/command-empty.svelte +4 -5
  134. package/dist/bits/command/components/command-empty.svelte.d.ts +3 -18
  135. package/dist/bits/command/components/command-group-heading.svelte +4 -5
  136. package/dist/bits/command/components/command-group-heading.svelte.d.ts +3 -18
  137. package/dist/bits/command/components/command-group-items.svelte +4 -5
  138. package/dist/bits/command/components/command-group-items.svelte.d.ts +3 -18
  139. package/dist/bits/command/components/command-group.svelte +2 -3
  140. package/dist/bits/command/components/command-group.svelte.d.ts +2 -17
  141. package/dist/bits/command/components/command-input.svelte +4 -5
  142. package/dist/bits/command/components/command-input.svelte.d.ts +3 -18
  143. package/dist/bits/command/components/command-item.svelte +7 -8
  144. package/dist/bits/command/components/command-item.svelte.d.ts +3 -18
  145. package/dist/bits/command/components/command-link-item.svelte +7 -8
  146. package/dist/bits/command/components/command-link-item.svelte.d.ts +3 -18
  147. package/dist/bits/command/components/command-list.svelte +4 -5
  148. package/dist/bits/command/components/command-list.svelte.d.ts +3 -18
  149. package/dist/bits/command/components/command-loading.svelte +4 -5
  150. package/dist/bits/command/components/command-loading.svelte.d.ts +3 -18
  151. package/dist/bits/command/components/command-separator.svelte +4 -5
  152. package/dist/bits/command/components/command-separator.svelte.d.ts +3 -18
  153. package/dist/bits/command/components/command-viewport.svelte +3 -3
  154. package/dist/bits/command/components/command-viewport.svelte.d.ts +3 -18
  155. package/dist/bits/command/components/command.svelte +9 -13
  156. package/dist/bits/command/components/command.svelte.d.ts +3 -18
  157. package/dist/bits/command/exports.d.ts +13 -0
  158. package/dist/bits/command/exports.js +12 -0
  159. package/dist/bits/command/index.d.ts +1 -13
  160. package/dist/bits/command/index.js +1 -12
  161. package/dist/bits/command/types.d.ts +17 -21
  162. package/dist/bits/context-menu/components/context-menu-content-static.svelte +80 -45
  163. package/dist/bits/context-menu/components/context-menu-content-static.svelte.d.ts +3 -18
  164. package/dist/bits/context-menu/components/context-menu-content.svelte +79 -51
  165. package/dist/bits/context-menu/components/context-menu-content.svelte.d.ts +3 -18
  166. package/dist/bits/context-menu/components/context-menu-trigger.svelte +4 -5
  167. package/dist/bits/context-menu/components/context-menu-trigger.svelte.d.ts +3 -18
  168. package/dist/bits/context-menu/components/context-menu.svelte +10 -19
  169. package/dist/bits/context-menu/components/context-menu.svelte.d.ts +2 -18
  170. package/dist/bits/context-menu/exports.d.ts +18 -0
  171. package/dist/bits/context-menu/exports.js +17 -0
  172. package/dist/bits/context-menu/index.d.ts +1 -18
  173. package/dist/bits/context-menu/index.js +1 -17
  174. package/dist/bits/context-menu/types.d.ts +3 -3
  175. package/dist/bits/date-field/components/date-field-input.svelte +4 -5
  176. package/dist/bits/date-field/components/date-field-input.svelte.d.ts +3 -18
  177. package/dist/bits/date-field/components/date-field-label.svelte +4 -5
  178. package/dist/bits/date-field/components/date-field-label.svelte.d.ts +3 -18
  179. package/dist/bits/date-field/components/date-field-segment.svelte +4 -5
  180. package/dist/bits/date-field/components/date-field-segment.svelte.d.ts +3 -18
  181. package/dist/bits/date-field/components/date-field.svelte +9 -23
  182. package/dist/bits/date-field/components/date-field.svelte.d.ts +2 -17
  183. package/dist/bits/date-field/date-field.svelte.d.ts +83 -77
  184. package/dist/bits/date-field/date-field.svelte.js +167 -150
  185. package/dist/bits/date-field/exports.d.ts +5 -0
  186. package/dist/bits/date-field/exports.js +4 -0
  187. package/dist/bits/date-field/index.d.ts +1 -5
  188. package/dist/bits/date-field/index.js +1 -4
  189. package/dist/bits/date-field/types.d.ts +8 -26
  190. package/dist/bits/date-picker/components/date-picker-calendar.svelte +6 -7
  191. package/dist/bits/date-picker/components/date-picker-calendar.svelte.d.ts +3 -18
  192. package/dist/bits/date-picker/components/date-picker-content-static.svelte +8 -4
  193. package/dist/bits/date-picker/components/date-picker-content-static.svelte.d.ts +3 -18
  194. package/dist/bits/date-picker/components/date-picker-content.svelte +5 -5
  195. package/dist/bits/date-picker/components/date-picker-content.svelte.d.ts +3 -18
  196. package/dist/bits/date-picker/components/date-picker-trigger.svelte +8 -5
  197. package/dist/bits/date-picker/components/date-picker-trigger.svelte.d.ts +3 -18
  198. package/dist/bits/date-picker/components/date-picker.svelte +13 -36
  199. package/dist/bits/date-picker/components/date-picker.svelte.d.ts +2 -17
  200. package/dist/bits/date-picker/date-picker.svelte.d.ts +4 -3
  201. package/dist/bits/date-picker/date-picker.svelte.js +3 -3
  202. package/dist/bits/date-picker/exports.d.ts +22 -0
  203. package/dist/bits/date-picker/exports.js +21 -0
  204. package/dist/bits/date-picker/index.d.ts +1 -22
  205. package/dist/bits/date-picker/index.js +1 -21
  206. package/dist/bits/date-picker/types.d.ts +4 -30
  207. package/dist/bits/date-range-field/components/date-range-field-input.svelte +4 -5
  208. package/dist/bits/date-range-field/components/date-range-field-input.svelte.d.ts +3 -18
  209. package/dist/bits/date-range-field/components/date-range-field-label.svelte +4 -5
  210. package/dist/bits/date-range-field/components/date-range-field-label.svelte.d.ts +3 -18
  211. package/dist/bits/date-range-field/components/date-range-field.svelte +13 -31
  212. package/dist/bits/date-range-field/components/date-range-field.svelte.d.ts +3 -18
  213. package/dist/bits/date-range-field/date-range-field.svelte.d.ts +9 -29
  214. package/dist/bits/date-range-field/date-range-field.svelte.js +37 -60
  215. package/dist/bits/date-range-field/exports.d.ts +5 -0
  216. package/dist/bits/date-range-field/exports.js +4 -0
  217. package/dist/bits/date-range-field/index.d.ts +1 -5
  218. package/dist/bits/date-range-field/index.js +1 -4
  219. package/dist/bits/date-range-field/types.d.ts +9 -26
  220. package/dist/bits/date-range-picker/components/date-range-picker-calendar.svelte +6 -7
  221. package/dist/bits/date-range-picker/components/date-range-picker-calendar.svelte.d.ts +3 -18
  222. package/dist/bits/date-range-picker/components/date-range-picker-trigger.svelte +8 -5
  223. package/dist/bits/date-range-picker/components/date-range-picker-trigger.svelte.d.ts +3 -18
  224. package/dist/bits/date-range-picker/components/date-range-picker.svelte +20 -47
  225. package/dist/bits/date-range-picker/components/date-range-picker.svelte.d.ts +3 -18
  226. package/dist/bits/date-range-picker/date-range-picker.svelte.d.ts +4 -3
  227. package/dist/bits/date-range-picker/date-range-picker.svelte.js +3 -3
  228. package/dist/bits/date-range-picker/exports.d.ts +21 -0
  229. package/dist/bits/date-range-picker/exports.js +20 -0
  230. package/dist/bits/date-range-picker/index.d.ts +1 -21
  231. package/dist/bits/date-range-picker/index.js +1 -20
  232. package/dist/bits/date-range-picker/types.d.ts +5 -32
  233. package/dist/bits/dialog/components/dialog-close.svelte +6 -5
  234. package/dist/bits/dialog/components/dialog-close.svelte.d.ts +2 -17
  235. package/dist/bits/dialog/components/dialog-content.svelte +20 -17
  236. package/dist/bits/dialog/components/dialog-content.svelte.d.ts +3 -18
  237. package/dist/bits/dialog/components/dialog-description.svelte +4 -5
  238. package/dist/bits/dialog/components/dialog-description.svelte.d.ts +3 -18
  239. package/dist/bits/dialog/components/dialog-overlay.svelte +4 -5
  240. package/dist/bits/dialog/components/dialog-overlay.svelte.d.ts +3 -18
  241. package/dist/bits/dialog/components/dialog-title.svelte +4 -5
  242. package/dist/bits/dialog/components/dialog-title.svelte.d.ts +3 -18
  243. package/dist/bits/dialog/components/dialog-trigger.svelte +6 -5
  244. package/dist/bits/dialog/components/dialog-trigger.svelte.d.ts +3 -18
  245. package/dist/bits/dialog/components/dialog.svelte +5 -14
  246. package/dist/bits/dialog/components/dialog.svelte.d.ts +2 -17
  247. package/dist/bits/dialog/dialog.svelte.d.ts +34 -18
  248. package/dist/bits/dialog/dialog.svelte.js +106 -54
  249. package/dist/bits/dialog/exports.d.ts +9 -0
  250. package/dist/bits/dialog/exports.js +8 -0
  251. package/dist/bits/dialog/index.d.ts +1 -9
  252. package/dist/bits/dialog/index.js +1 -8
  253. package/dist/bits/dialog/types.d.ts +9 -18
  254. package/dist/bits/dropdown-menu/components/dropdown-menu-content-static.svelte +67 -33
  255. package/dist/bits/dropdown-menu/components/dropdown-menu-content-static.svelte.d.ts +3 -18
  256. package/dist/bits/dropdown-menu/components/dropdown-menu-content.svelte +68 -34
  257. package/dist/bits/dropdown-menu/components/dropdown-menu-content.svelte.d.ts +3 -18
  258. package/dist/bits/dropdown-menu/exports.d.ts +18 -0
  259. package/dist/bits/dropdown-menu/exports.js +17 -0
  260. package/dist/bits/dropdown-menu/index.d.ts +1 -18
  261. package/dist/bits/dropdown-menu/index.js +1 -17
  262. package/dist/bits/dropdown-menu/types.d.ts +1 -1
  263. package/dist/bits/index.d.ts +38 -38
  264. package/dist/bits/index.js +38 -38
  265. package/dist/bits/label/components/label.svelte +4 -5
  266. package/dist/bits/label/components/label.svelte.d.ts +3 -18
  267. package/dist/bits/label/exports.d.ts +2 -0
  268. package/dist/bits/label/exports.js +1 -0
  269. package/dist/bits/label/index.d.ts +1 -2
  270. package/dist/bits/label/index.js +1 -1
  271. package/dist/bits/label/label.svelte.d.ts +4 -3
  272. package/dist/bits/label/label.svelte.js +5 -4
  273. package/dist/bits/label/types.d.ts +2 -2
  274. package/dist/bits/link-preview/components/link-preview-content-static.svelte +72 -33
  275. package/dist/bits/link-preview/components/link-preview-content-static.svelte.d.ts +3 -18
  276. package/dist/bits/link-preview/components/link-preview-content.svelte +75 -35
  277. package/dist/bits/link-preview/components/link-preview-content.svelte.d.ts +3 -18
  278. package/dist/bits/link-preview/components/link-preview-trigger.svelte +4 -5
  279. package/dist/bits/link-preview/components/link-preview-trigger.svelte.d.ts +3 -18
  280. package/dist/bits/link-preview/components/link-preview.svelte +5 -10
  281. package/dist/bits/link-preview/components/link-preview.svelte.d.ts +2 -17
  282. package/dist/bits/link-preview/exports.d.ts +7 -0
  283. package/dist/bits/link-preview/exports.js +6 -0
  284. package/dist/bits/link-preview/index.d.ts +1 -7
  285. package/dist/bits/link-preview/index.js +1 -6
  286. package/dist/bits/link-preview/link-preview.svelte.d.ts +22 -19
  287. package/dist/bits/link-preview/link-preview.svelte.js +67 -57
  288. package/dist/bits/link-preview/types.d.ts +10 -24
  289. package/dist/bits/menu/components/menu-arrow.svelte +5 -5
  290. package/dist/bits/menu/components/menu-arrow.svelte.d.ts +2 -17
  291. package/dist/bits/menu/components/menu-checkbox-item.svelte +20 -15
  292. package/dist/bits/menu/components/menu-checkbox-item.svelte.d.ts +3 -18
  293. package/dist/bits/menu/components/menu-content-static.svelte +73 -48
  294. package/dist/bits/menu/components/menu-content-static.svelte.d.ts +3 -18
  295. package/dist/bits/menu/components/menu-content.svelte +74 -48
  296. package/dist/bits/menu/components/menu-content.svelte.d.ts +3 -18
  297. package/dist/bits/menu/components/menu-group-heading.svelte +4 -5
  298. package/dist/bits/menu/components/menu-group-heading.svelte.d.ts +3 -18
  299. package/dist/bits/menu/components/menu-group.svelte +4 -5
  300. package/dist/bits/menu/components/menu-group.svelte.d.ts +3 -18
  301. package/dist/bits/menu/components/menu-item.svelte +7 -6
  302. package/dist/bits/menu/components/menu-item.svelte.d.ts +3 -18
  303. package/dist/bits/menu/components/menu-radio-group.svelte +7 -13
  304. package/dist/bits/menu/components/menu-radio-group.svelte.d.ts +3 -18
  305. package/dist/bits/menu/components/menu-radio-item.svelte +7 -6
  306. package/dist/bits/menu/components/menu-radio-item.svelte.d.ts +3 -18
  307. package/dist/bits/menu/components/menu-separator.svelte +4 -5
  308. package/dist/bits/menu/components/menu-separator.svelte.d.ts +3 -18
  309. package/dist/bits/menu/components/menu-sub-content-static.svelte +89 -56
  310. package/dist/bits/menu/components/menu-sub-content-static.svelte.d.ts +3 -18
  311. package/dist/bits/menu/components/menu-sub-content.svelte +102 -59
  312. package/dist/bits/menu/components/menu-sub-content.svelte.d.ts +3 -18
  313. package/dist/bits/menu/components/menu-sub-trigger.svelte +7 -8
  314. package/dist/bits/menu/components/menu-sub-trigger.svelte.d.ts +3 -18
  315. package/dist/bits/menu/components/menu-sub.svelte +8 -17
  316. package/dist/bits/menu/components/menu-sub.svelte.d.ts +2 -18
  317. package/dist/bits/menu/components/menu-trigger.svelte +9 -9
  318. package/dist/bits/menu/components/menu-trigger.svelte.d.ts +3 -18
  319. package/dist/bits/menu/components/menu.svelte +10 -19
  320. package/dist/bits/menu/components/menu.svelte.d.ts +5 -25
  321. package/dist/bits/menu/menu.svelte.d.ts +115 -111
  322. package/dist/bits/menu/menu.svelte.js +258 -296
  323. package/dist/bits/menu/types.d.ts +50 -59
  324. package/dist/bits/menubar/components/menubar-content-static.svelte +4 -5
  325. package/dist/bits/menubar/components/menubar-content-static.svelte.d.ts +3 -18
  326. package/dist/bits/menubar/components/menubar-content.svelte +4 -5
  327. package/dist/bits/menubar/components/menubar-content.svelte.d.ts +3 -18
  328. package/dist/bits/menubar/components/menubar-menu.svelte +3 -3
  329. package/dist/bits/menubar/components/menubar-menu.svelte.d.ts +2 -17
  330. package/dist/bits/menubar/components/menubar-trigger.svelte +4 -5
  331. package/dist/bits/menubar/components/menubar-trigger.svelte.d.ts +3 -18
  332. package/dist/bits/menubar/components/menubar.svelte +7 -13
  333. package/dist/bits/menubar/components/menubar.svelte.d.ts +3 -18
  334. package/dist/bits/menubar/exports.d.ts +20 -0
  335. package/dist/bits/menubar/exports.js +18 -0
  336. package/dist/bits/menubar/index.d.ts +1 -19
  337. package/dist/bits/menubar/index.js +1 -17
  338. package/dist/bits/menubar/menubar.svelte.d.ts +35 -33
  339. package/dist/bits/menubar/menubar.svelte.js +78 -85
  340. package/dist/bits/menubar/types.d.ts +5 -13
  341. package/dist/bits/navigation-menu/components/navigation-menu-content.svelte +5 -6
  342. package/dist/bits/navigation-menu/components/navigation-menu-content.svelte.d.ts +3 -18
  343. package/dist/bits/navigation-menu/components/navigation-menu-indicator.svelte +4 -5
  344. package/dist/bits/navigation-menu/components/navigation-menu-indicator.svelte.d.ts +3 -18
  345. package/dist/bits/navigation-menu/components/navigation-menu-item.svelte +4 -5
  346. package/dist/bits/navigation-menu/components/navigation-menu-item.svelte.d.ts +3 -18
  347. package/dist/bits/navigation-menu/components/navigation-menu-link.svelte +5 -6
  348. package/dist/bits/navigation-menu/components/navigation-menu-link.svelte.d.ts +3 -18
  349. package/dist/bits/navigation-menu/components/navigation-menu-list.svelte +4 -5
  350. package/dist/bits/navigation-menu/components/navigation-menu-list.svelte.d.ts +3 -18
  351. package/dist/bits/navigation-menu/components/navigation-menu-trigger.svelte +4 -5
  352. package/dist/bits/navigation-menu/components/navigation-menu-trigger.svelte.d.ts +3 -18
  353. package/dist/bits/navigation-menu/components/navigation-menu-viewport.svelte +4 -5
  354. package/dist/bits/navigation-menu/components/navigation-menu-viewport.svelte.d.ts +3 -18
  355. package/dist/bits/navigation-menu/components/navigation-menu.svelte +7 -13
  356. package/dist/bits/navigation-menu/components/navigation-menu.svelte.d.ts +3 -18
  357. package/dist/bits/navigation-menu/exports.d.ts +9 -0
  358. package/dist/bits/navigation-menu/exports.js +8 -0
  359. package/dist/bits/navigation-menu/index.d.ts +1 -9
  360. package/dist/bits/navigation-menu/index.js +1 -8
  361. package/dist/bits/navigation-menu/navigation-menu.svelte.d.ts +53 -61
  362. package/dist/bits/navigation-menu/navigation-menu.svelte.js +138 -170
  363. package/dist/bits/navigation-menu/types.d.ts +11 -18
  364. package/dist/bits/pagination/components/pagination-next-button.svelte +6 -5
  365. package/dist/bits/pagination/components/pagination-next-button.svelte.d.ts +3 -18
  366. package/dist/bits/pagination/components/pagination-page.svelte +6 -5
  367. package/dist/bits/pagination/components/pagination-page.svelte.d.ts +3 -18
  368. package/dist/bits/pagination/components/pagination-prev-button.svelte +6 -5
  369. package/dist/bits/pagination/components/pagination-prev-button.svelte.d.ts +3 -18
  370. package/dist/bits/pagination/components/pagination.svelte +7 -13
  371. package/dist/bits/pagination/components/pagination.svelte.d.ts +3 -18
  372. package/dist/bits/pagination/exports.d.ts +5 -0
  373. package/dist/bits/pagination/exports.js +4 -0
  374. package/dist/bits/pagination/index.d.ts +1 -5
  375. package/dist/bits/pagination/index.js +1 -4
  376. package/dist/bits/pagination/pagination.svelte.d.ts +24 -15
  377. package/dist/bits/pagination/pagination.svelte.js +82 -43
  378. package/dist/bits/pagination/types.d.ts +6 -13
  379. package/dist/bits/pin-input/components/pin-input-cell.svelte +4 -5
  380. package/dist/bits/pin-input/components/pin-input-cell.svelte.d.ts +3 -18
  381. package/dist/bits/pin-input/components/pin-input.svelte +9 -15
  382. package/dist/bits/pin-input/components/pin-input.svelte.d.ts +3 -18
  383. package/dist/bits/pin-input/exports.d.ts +3 -0
  384. package/dist/bits/pin-input/exports.js +2 -0
  385. package/dist/bits/pin-input/index.d.ts +1 -3
  386. package/dist/bits/pin-input/index.js +1 -2
  387. package/dist/bits/pin-input/pin-input.svelte.d.ts +19 -17
  388. package/dist/bits/pin-input/pin-input.svelte.js +82 -27
  389. package/dist/bits/pin-input/types.d.ts +3 -12
  390. package/dist/bits/pin-input/usePasswordManager.svelte.js +6 -6
  391. package/dist/bits/popover/components/popover-arrow.svelte +4 -4
  392. package/dist/bits/popover/components/popover-arrow.svelte.d.ts +2 -17
  393. package/dist/bits/popover/components/popover-close.svelte +4 -5
  394. package/dist/bits/popover/components/popover-close.svelte.d.ts +3 -18
  395. package/dist/bits/popover/components/popover-content-static.svelte +67 -44
  396. package/dist/bits/popover/components/popover-content-static.svelte.d.ts +3 -18
  397. package/dist/bits/popover/components/popover-content.svelte +66 -44
  398. package/dist/bits/popover/components/popover-content.svelte.d.ts +3 -18
  399. package/dist/bits/popover/components/popover-trigger.svelte +9 -8
  400. package/dist/bits/popover/components/popover-trigger.svelte.d.ts +3 -18
  401. package/dist/bits/popover/components/popover.svelte +8 -17
  402. package/dist/bits/popover/components/popover.svelte.d.ts +2 -17
  403. package/dist/bits/popover/exports.d.ts +9 -0
  404. package/dist/bits/popover/exports.js +7 -0
  405. package/dist/bits/popover/index.d.ts +1 -9
  406. package/dist/bits/popover/index.js +1 -7
  407. package/dist/bits/popover/popover.svelte.d.ts +34 -18
  408. package/dist/bits/popover/popover.svelte.js +92 -42
  409. package/dist/bits/popover/types.d.ts +9 -23
  410. package/dist/bits/progress/components/progress.svelte +4 -5
  411. package/dist/bits/progress/components/progress.svelte.d.ts +3 -18
  412. package/dist/bits/progress/exports.d.ts +2 -0
  413. package/dist/bits/progress/exports.js +1 -0
  414. package/dist/bits/progress/index.d.ts +1 -2
  415. package/dist/bits/progress/index.js +1 -1
  416. package/dist/bits/progress/progress.svelte.js +1 -7
  417. package/dist/bits/progress/types.d.ts +2 -2
  418. package/dist/bits/radio-group/components/radio-group-item.svelte +4 -5
  419. package/dist/bits/radio-group/components/radio-group-item.svelte.d.ts +3 -18
  420. package/dist/bits/radio-group/components/radio-group.svelte +8 -13
  421. package/dist/bits/radio-group/components/radio-group.svelte.d.ts +3 -18
  422. package/dist/bits/radio-group/exports.d.ts +3 -0
  423. package/dist/bits/radio-group/exports.js +2 -0
  424. package/dist/bits/radio-group/index.d.ts +1 -3
  425. package/dist/bits/radio-group/index.js +1 -2
  426. package/dist/bits/radio-group/radio-group.svelte.d.ts +13 -11
  427. package/dist/bits/radio-group/radio-group.svelte.js +42 -33
  428. package/dist/bits/radio-group/types.d.ts +3 -11
  429. package/dist/bits/range-calendar/components/range-calendar-cell.svelte +4 -5
  430. package/dist/bits/range-calendar/components/range-calendar-cell.svelte.d.ts +3 -18
  431. package/dist/bits/range-calendar/components/range-calendar-day.svelte +10 -5
  432. package/dist/bits/range-calendar/components/range-calendar-day.svelte.d.ts +3 -18
  433. package/dist/bits/range-calendar/components/range-calendar.svelte +12 -34
  434. package/dist/bits/range-calendar/components/range-calendar.svelte.d.ts +3 -18
  435. package/dist/bits/range-calendar/exports.d.ts +13 -0
  436. package/dist/bits/range-calendar/exports.js +12 -0
  437. package/dist/bits/range-calendar/index.d.ts +1 -13
  438. package/dist/bits/range-calendar/index.js +1 -12
  439. package/dist/bits/range-calendar/range-calendar.svelte.d.ts +33 -41
  440. package/dist/bits/range-calendar/range-calendar.svelte.js +158 -162
  441. package/dist/bits/range-calendar/types.d.ts +3 -21
  442. package/dist/bits/scroll-area/components/scroll-area-corner-impl.svelte +3 -4
  443. package/dist/bits/scroll-area/components/scroll-area-corner-impl.svelte.d.ts +5 -19
  444. package/dist/bits/scroll-area/components/scroll-area-corner.svelte +5 -5
  445. package/dist/bits/scroll-area/components/scroll-area-corner.svelte.d.ts +3 -18
  446. package/dist/bits/scroll-area/components/scroll-area-scrollbar-auto.svelte +2 -2
  447. package/dist/bits/scroll-area/components/scroll-area-scrollbar-auto.svelte.d.ts +2 -17
  448. package/dist/bits/scroll-area/components/scroll-area-scrollbar-hover.svelte +2 -2
  449. package/dist/bits/scroll-area/components/scroll-area-scrollbar-hover.svelte.d.ts +2 -17
  450. package/dist/bits/scroll-area/components/scroll-area-scrollbar-scroll.svelte +2 -2
  451. package/dist/bits/scroll-area/components/scroll-area-scrollbar-scroll.svelte.d.ts +2 -17
  452. package/dist/bits/scroll-area/components/scroll-area-scrollbar-shared.svelte +1 -1
  453. package/dist/bits/scroll-area/components/scroll-area-scrollbar-shared.svelte.d.ts +2 -17
  454. package/dist/bits/scroll-area/components/scroll-area-scrollbar-visible.svelte.d.ts +2 -17
  455. package/dist/bits/scroll-area/components/scroll-area-scrollbar-x.svelte +3 -3
  456. package/dist/bits/scroll-area/components/scroll-area-scrollbar-x.svelte.d.ts +2 -17
  457. package/dist/bits/scroll-area/components/scroll-area-scrollbar-y.svelte +3 -3
  458. package/dist/bits/scroll-area/components/scroll-area-scrollbar-y.svelte.d.ts +2 -17
  459. package/dist/bits/scroll-area/components/scroll-area-scrollbar.svelte +3 -3
  460. package/dist/bits/scroll-area/components/scroll-area-scrollbar.svelte.d.ts +3 -18
  461. package/dist/bits/scroll-area/components/scroll-area-thumb-impl.svelte +3 -4
  462. package/dist/bits/scroll-area/components/scroll-area-thumb-impl.svelte.d.ts +5 -19
  463. package/dist/bits/scroll-area/components/scroll-area-thumb.svelte +6 -6
  464. package/dist/bits/scroll-area/components/scroll-area-thumb.svelte.d.ts +3 -18
  465. package/dist/bits/scroll-area/components/scroll-area-viewport.svelte +18 -5
  466. package/dist/bits/scroll-area/components/scroll-area-viewport.svelte.d.ts +3 -18
  467. package/dist/bits/scroll-area/components/scroll-area.svelte +4 -5
  468. package/dist/bits/scroll-area/components/scroll-area.svelte.d.ts +3 -18
  469. package/dist/bits/scroll-area/exports.d.ts +6 -0
  470. package/dist/bits/scroll-area/exports.js +5 -0
  471. package/dist/bits/scroll-area/index.d.ts +1 -6
  472. package/dist/bits/scroll-area/index.js +1 -5
  473. package/dist/bits/scroll-area/scroll-area.svelte.d.ts +51 -51
  474. package/dist/bits/scroll-area/scroll-area.svelte.js +113 -129
  475. package/dist/bits/scroll-area/types.d.ts +6 -6
  476. package/dist/bits/select/components/select-content-static.svelte +100 -0
  477. package/dist/bits/select/components/select-content-static.svelte.d.ts +4 -0
  478. package/dist/bits/select/components/select-content.svelte +87 -36
  479. package/dist/bits/select/components/select-content.svelte.d.ts +3 -18
  480. package/dist/bits/select/components/select-group-heading.svelte +7 -8
  481. package/dist/bits/select/components/select-group-heading.svelte.d.ts +3 -18
  482. package/dist/bits/select/components/select-group.svelte +7 -7
  483. package/dist/bits/select/components/select-group.svelte.d.ts +3 -18
  484. package/dist/bits/{listbox/components/listbox-hidden-input.svelte → select/components/select-hidden-input.svelte} +4 -4
  485. package/dist/bits/select/components/select-hidden-input.svelte.d.ts +6 -0
  486. package/dist/bits/select/components/select-item.svelte +24 -13
  487. package/dist/bits/select/components/select-item.svelte.d.ts +3 -18
  488. package/dist/bits/select/components/select-scroll-down-button.svelte +22 -12
  489. package/dist/bits/select/components/select-scroll-down-button.svelte.d.ts +3 -18
  490. package/dist/bits/select/components/select-scroll-up-button.svelte +24 -14
  491. package/dist/bits/select/components/select-scroll-up-button.svelte.d.ts +3 -18
  492. package/dist/bits/select/components/select-trigger.svelte +7 -9
  493. package/dist/bits/select/components/select-trigger.svelte.d.ts +3 -18
  494. package/dist/bits/select/components/select-viewport.svelte +14 -5
  495. package/dist/bits/select/components/select-viewport.svelte.d.ts +3 -18
  496. package/dist/bits/select/components/select.svelte +52 -66
  497. package/dist/bits/select/components/select.svelte.d.ts +2 -17
  498. package/dist/bits/select/exports.d.ts +12 -0
  499. package/dist/bits/select/exports.js +11 -0
  500. package/dist/bits/select/index.d.ts +1 -15
  501. package/dist/bits/select/index.js +1 -14
  502. package/dist/bits/select/select.svelte.d.ts +320 -286
  503. package/dist/bits/select/select.svelte.js +830 -918
  504. package/dist/bits/select/types.d.ts +123 -91
  505. package/dist/bits/separator/components/separator.svelte +4 -5
  506. package/dist/bits/separator/components/separator.svelte.d.ts +3 -18
  507. package/dist/bits/separator/exports.d.ts +2 -0
  508. package/dist/bits/separator/exports.js +1 -0
  509. package/dist/bits/separator/index.d.ts +1 -2
  510. package/dist/bits/separator/index.js +1 -1
  511. package/dist/bits/separator/separator.svelte.js +1 -1
  512. package/dist/bits/separator/types.d.ts +2 -2
  513. package/dist/bits/slider/components/slider-range.svelte +4 -5
  514. package/dist/bits/slider/components/slider-range.svelte.d.ts +3 -18
  515. package/dist/bits/slider/components/slider-thumb.svelte +4 -5
  516. package/dist/bits/slider/components/slider-thumb.svelte.d.ts +3 -18
  517. package/dist/bits/slider/components/slider-tick.svelte +4 -5
  518. package/dist/bits/slider/components/slider-tick.svelte.d.ts +3 -18
  519. package/dist/bits/slider/components/slider.svelte +19 -17
  520. package/dist/bits/slider/components/slider.svelte.d.ts +3 -18
  521. package/dist/bits/slider/exports.d.ts +5 -0
  522. package/dist/bits/slider/exports.js +4 -0
  523. package/dist/bits/slider/index.d.ts +1 -5
  524. package/dist/bits/slider/index.js +1 -4
  525. package/dist/bits/slider/slider.svelte.d.ts +119 -48
  526. package/dist/bits/slider/slider.svelte.js +281 -95
  527. package/dist/bits/slider/types.d.ts +54 -28
  528. package/dist/bits/switch/components/switch-thumb.svelte +4 -5
  529. package/dist/bits/switch/components/switch-thumb.svelte.d.ts +3 -18
  530. package/dist/bits/switch/components/switch.svelte +7 -13
  531. package/dist/bits/switch/components/switch.svelte.d.ts +3 -18
  532. package/dist/bits/switch/exports.d.ts +3 -0
  533. package/dist/bits/switch/exports.js +2 -0
  534. package/dist/bits/switch/index.d.ts +1 -3
  535. package/dist/bits/switch/index.js +1 -2
  536. package/dist/bits/switch/switch.svelte.d.ts +7 -7
  537. package/dist/bits/switch/switch.svelte.js +16 -24
  538. package/dist/bits/switch/types.d.ts +3 -12
  539. package/dist/bits/tabs/components/tabs-content.svelte +4 -5
  540. package/dist/bits/tabs/components/tabs-content.svelte.d.ts +3 -18
  541. package/dist/bits/tabs/components/tabs-list.svelte +4 -5
  542. package/dist/bits/tabs/components/tabs-list.svelte.d.ts +3 -18
  543. package/dist/bits/tabs/components/tabs-trigger.svelte +4 -5
  544. package/dist/bits/tabs/components/tabs-trigger.svelte.d.ts +3 -18
  545. package/dist/bits/tabs/components/tabs.svelte +7 -13
  546. package/dist/bits/tabs/components/tabs.svelte.d.ts +3 -18
  547. package/dist/bits/tabs/exports.d.ts +5 -0
  548. package/dist/bits/tabs/exports.js +4 -0
  549. package/dist/bits/tabs/index.d.ts +1 -5
  550. package/dist/bits/tabs/index.js +1 -4
  551. package/dist/bits/tabs/tabs.svelte.d.ts +12 -13
  552. package/dist/bits/tabs/tabs.svelte.js +44 -71
  553. package/dist/bits/tabs/types.d.ts +5 -13
  554. package/dist/bits/toggle/components/toggle.svelte +7 -13
  555. package/dist/bits/toggle/components/toggle.svelte.d.ts +3 -18
  556. package/dist/bits/toggle/exports.d.ts +2 -0
  557. package/dist/bits/toggle/exports.js +1 -0
  558. package/dist/bits/toggle/index.d.ts +1 -2
  559. package/dist/bits/toggle/index.js +1 -1
  560. package/dist/bits/toggle/toggle.svelte.d.ts +6 -5
  561. package/dist/bits/toggle/toggle.svelte.js +9 -19
  562. package/dist/bits/toggle/types.d.ts +2 -11
  563. package/dist/bits/toggle-group/components/toggle-group-item.svelte +4 -5
  564. package/dist/bits/toggle-group/components/toggle-group-item.svelte.d.ts +3 -18
  565. package/dist/bits/toggle-group/components/toggle-group.svelte +10 -17
  566. package/dist/bits/toggle-group/components/toggle-group.svelte.d.ts +3 -18
  567. package/dist/bits/toggle-group/exports.d.ts +3 -0
  568. package/dist/bits/toggle-group/exports.js +2 -0
  569. package/dist/bits/toggle-group/index.d.ts +1 -3
  570. package/dist/bits/toggle-group/index.js +1 -2
  571. package/dist/bits/toggle-group/toggle-group.svelte.d.ts +14 -13
  572. package/dist/bits/toggle-group/toggle-group.svelte.js +38 -32
  573. package/dist/bits/toggle-group/types.d.ts +5 -13
  574. package/dist/bits/toolbar/components/toolbar-button.svelte +4 -5
  575. package/dist/bits/toolbar/components/toolbar-button.svelte.d.ts +3 -18
  576. package/dist/bits/toolbar/components/toolbar-group-item.svelte +4 -5
  577. package/dist/bits/toolbar/components/toolbar-group-item.svelte.d.ts +2 -17
  578. package/dist/bits/toolbar/components/toolbar-group.svelte +9 -17
  579. package/dist/bits/toolbar/components/toolbar-group.svelte.d.ts +3 -18
  580. package/dist/bits/toolbar/components/toolbar-link.svelte +4 -5
  581. package/dist/bits/toolbar/components/toolbar-link.svelte.d.ts +3 -18
  582. package/dist/bits/toolbar/components/toolbar.svelte +4 -5
  583. package/dist/bits/toolbar/components/toolbar.svelte.d.ts +3 -18
  584. package/dist/bits/toolbar/exports.d.ts +6 -0
  585. package/dist/bits/toolbar/exports.js +5 -0
  586. package/dist/bits/toolbar/index.d.ts +1 -6
  587. package/dist/bits/toolbar/index.js +1 -5
  588. package/dist/bits/toolbar/toolbar.svelte.d.ts +17 -19
  589. package/dist/bits/toolbar/toolbar.svelte.js +57 -59
  590. package/dist/bits/toolbar/types.d.ts +5 -5
  591. package/dist/bits/tooltip/components/tooltip-arrow.svelte +4 -4
  592. package/dist/bits/tooltip/components/tooltip-arrow.svelte.d.ts +2 -17
  593. package/dist/bits/tooltip/components/tooltip-content-static.svelte +71 -32
  594. package/dist/bits/tooltip/components/tooltip-content-static.svelte.d.ts +3 -18
  595. package/dist/bits/tooltip/components/tooltip-content.svelte +71 -33
  596. package/dist/bits/tooltip/components/tooltip-content.svelte.d.ts +3 -18
  597. package/dist/bits/tooltip/components/tooltip-provider.svelte +2 -2
  598. package/dist/bits/tooltip/components/tooltip-provider.svelte.d.ts +2 -18
  599. package/dist/bits/tooltip/components/tooltip-trigger.svelte +7 -8
  600. package/dist/bits/tooltip/components/tooltip-trigger.svelte.d.ts +3 -18
  601. package/dist/bits/tooltip/components/tooltip.svelte +11 -16
  602. package/dist/bits/tooltip/components/tooltip.svelte.d.ts +2 -18
  603. package/dist/bits/tooltip/exports.d.ts +9 -0
  604. package/dist/bits/tooltip/exports.js +7 -0
  605. package/dist/bits/tooltip/index.d.ts +1 -9
  606. package/dist/bits/tooltip/index.js +1 -7
  607. package/dist/bits/tooltip/tooltip.svelte.d.ts +14 -10
  608. package/dist/bits/tooltip/tooltip.svelte.js +42 -52
  609. package/dist/bits/tooltip/types.d.ts +10 -24
  610. package/dist/bits/utilities/arrow/arrow.svelte +3 -3
  611. package/dist/bits/utilities/arrow/arrow.svelte.d.ts +2 -17
  612. package/dist/bits/utilities/arrow/types.d.ts +2 -2
  613. package/dist/bits/utilities/dismissible-layer/dismissible-layer.svelte +1 -3
  614. package/dist/bits/utilities/dismissible-layer/dismissible-layer.svelte.d.ts +2 -17
  615. package/dist/bits/utilities/dismissible-layer/types.d.ts +3 -14
  616. package/dist/bits/utilities/dismissible-layer/{useDismissibleLayer.svelte.js → use-dismissable-layer.svelte.js} +95 -78
  617. package/dist/bits/utilities/escape-layer/escape-layer.svelte +1 -1
  618. package/dist/bits/utilities/escape-layer/escape-layer.svelte.d.ts +2 -17
  619. package/dist/bits/utilities/escape-layer/{useEscapeLayer.svelte.js → use-escape-layer.svelte.js} +10 -10
  620. package/dist/bits/utilities/floating-layer/components/floating-layer-anchor.svelte +1 -1
  621. package/dist/bits/utilities/floating-layer/components/floating-layer-anchor.svelte.d.ts +2 -17
  622. package/dist/bits/utilities/floating-layer/components/floating-layer-arrow.svelte +4 -6
  623. package/dist/bits/utilities/floating-layer/components/floating-layer-arrow.svelte.d.ts +2 -17
  624. package/dist/bits/utilities/floating-layer/components/floating-layer-content-static.svelte +4 -2
  625. package/dist/bits/utilities/floating-layer/components/floating-layer-content-static.svelte.d.ts +10 -21
  626. package/dist/bits/utilities/floating-layer/components/floating-layer-content.svelte +4 -7
  627. package/dist/bits/utilities/floating-layer/components/floating-layer-content.svelte.d.ts +2 -17
  628. package/dist/bits/utilities/floating-layer/components/floating-layer.svelte +1 -1
  629. package/dist/bits/utilities/floating-layer/components/floating-layer.svelte.d.ts +4 -18
  630. package/dist/bits/utilities/floating-layer/types.d.ts +9 -1
  631. package/dist/bits/utilities/floating-layer/{useFloatingLayer.svelte.d.ts → use-floating-layer.svelte.d.ts} +10 -13
  632. package/dist/bits/utilities/floating-layer/{useFloatingLayer.svelte.js → use-floating-layer.svelte.js} +19 -42
  633. package/dist/bits/utilities/focus-scope/focus-scope-stack.svelte.js +2 -2
  634. package/dist/bits/utilities/focus-scope/focus-scope.svelte +4 -2
  635. package/dist/bits/utilities/focus-scope/focus-scope.svelte.d.ts +2 -17
  636. package/dist/bits/utilities/focus-scope/types.d.ts +5 -1
  637. package/dist/bits/utilities/focus-scope/{useFocusScope.svelte.d.ts → use-focus-scope.svelte.d.ts} +5 -1
  638. package/dist/bits/utilities/focus-scope/{useFocusScope.svelte.js → use-focus-scope.svelte.js} +74 -65
  639. package/dist/bits/utilities/is-using-keyboard/is-using-keyboard.svelte.d.ts +13 -0
  640. package/dist/bits/utilities/is-using-keyboard/is-using-keyboard.svelte.js +51 -0
  641. package/dist/bits/utilities/mounted.svelte +5 -7
  642. package/dist/bits/utilities/mounted.svelte.d.ts +4 -18
  643. package/dist/bits/utilities/popper-layer/popper-content.svelte.d.ts +5 -23
  644. package/dist/bits/utilities/popper-layer/popper-layer-force-mount.svelte +85 -0
  645. package/dist/bits/utilities/popper-layer/popper-layer-force-mount.svelte.d.ts +7 -0
  646. package/dist/bits/utilities/popper-layer/popper-layer-inner.svelte +127 -0
  647. package/dist/bits/utilities/popper-layer/popper-layer-inner.svelte.d.ts +7 -0
  648. package/dist/bits/utilities/popper-layer/popper-layer.svelte +23 -67
  649. package/dist/bits/utilities/popper-layer/popper-layer.svelte.d.ts +2 -17
  650. package/dist/bits/utilities/popper-layer/types.d.ts +8 -5
  651. package/dist/bits/utilities/portal/portal-consumer.svelte.d.ts +4 -18
  652. package/dist/bits/utilities/portal/portal.svelte +19 -18
  653. package/dist/bits/utilities/portal/portal.svelte.d.ts +2 -17
  654. package/dist/bits/utilities/presence-layer/presence-layer.svelte +1 -1
  655. package/dist/bits/utilities/presence-layer/presence-layer.svelte.d.ts +2 -17
  656. package/dist/bits/utilities/presence-layer/{usePresence.svelte.d.ts → use-presence.svelte.d.ts} +1 -1
  657. package/dist/bits/utilities/presence-layer/{usePresence.svelte.js → use-presence.svelte.js} +16 -26
  658. package/dist/bits/utilities/scroll-lock/index.d.ts +10 -0
  659. package/dist/bits/utilities/scroll-lock/scroll-lock.svelte +3 -3
  660. package/dist/bits/utilities/scroll-lock/scroll-lock.svelte.d.ts +2 -17
  661. package/dist/bits/utilities/text-selection-layer/text-selection-layer.svelte +1 -1
  662. package/dist/bits/utilities/text-selection-layer/text-selection-layer.svelte.d.ts +2 -17
  663. package/dist/bits/utilities/text-selection-layer/{useTextSelectionLayer.svelte.js → use-text-selection-layer.svelte.js} +13 -15
  664. package/dist/bits/utilities/visually-hidden/types.d.ts +2 -2
  665. package/dist/bits/utilities/visually-hidden/visually-hidden.svelte +1 -1
  666. package/dist/bits/utilities/visually-hidden/visually-hidden.svelte.d.ts +2 -17
  667. package/dist/index.d.ts +1 -2
  668. package/dist/index.js +1 -1
  669. package/dist/internal/arrays.d.ts +23 -0
  670. package/dist/internal/arrays.js +35 -0
  671. package/dist/internal/attrs.d.ts +1 -1
  672. package/dist/internal/attrs.js +3 -3
  673. package/dist/internal/{createEventHook.svelte.js → create-event-hook.svelte.js} +1 -1
  674. package/dist/{shared/date → internal/date-time}/announcer.js +3 -14
  675. package/dist/{shared/date → internal/date-time}/calendar-helpers.svelte.d.ts +3 -6
  676. package/dist/{shared/date → internal/date-time}/calendar-helpers.svelte.js +15 -15
  677. package/dist/{shared/date → internal/date-time}/field/helpers.d.ts +2 -1
  678. package/dist/{shared/date → internal/date-time}/field/helpers.js +15 -15
  679. package/dist/{shared/date/field.js → internal/date-time/field/segments.js} +4 -5
  680. package/dist/{shared/date → internal/date-time}/formatter.d.ts +2 -1
  681. package/dist/{shared/date → internal/date-time}/formatter.js +3 -2
  682. package/dist/{shared/date → internal/date-time}/utils.d.ts +1 -1
  683. package/dist/{shared/date → internal/date-time}/utils.js +0 -12
  684. package/dist/internal/debounce.js +1 -1
  685. package/dist/internal/events.d.ts +14 -0
  686. package/dist/internal/events.js +32 -0
  687. package/dist/internal/focus.js +1 -1
  688. package/dist/internal/is.js +0 -1
  689. package/dist/internal/kbd-constants.d.ts +40 -0
  690. package/dist/internal/kbd-constants.js +40 -0
  691. package/dist/internal/kbd.d.ts +1 -77
  692. package/dist/internal/kbd.js +1 -79
  693. package/dist/internal/should-trap-focus.d.ts +6 -0
  694. package/dist/internal/should-trap-focus.js +6 -0
  695. package/dist/internal/types.d.ts +35 -0
  696. package/dist/internal/{useBodyScrollLock.svelte.d.ts → use-body-scroll-lock.svelte.d.ts} +2 -1
  697. package/dist/internal/use-body-scroll-lock.svelte.js +110 -0
  698. package/dist/internal/use-data-typeahead.svelte.d.ts +12 -0
  699. package/dist/internal/use-data-typeahead.svelte.js +30 -0
  700. package/dist/internal/use-dom-typeahead.svelte.d.ts +11 -0
  701. package/dist/internal/use-dom-typeahead.svelte.js +30 -0
  702. package/dist/internal/use-grace-area.svelte.d.ts +5 -0
  703. package/dist/internal/{useGraceArea.svelte.js → use-grace-area.svelte.js} +18 -22
  704. package/dist/internal/use-id.js +8 -0
  705. package/dist/internal/{useRovingFocus.svelte.d.ts → use-roving-focus.svelte.d.ts} +1 -1
  706. package/dist/internal/{useRovingFocus.svelte.js → use-roving-focus.svelte.js} +8 -2
  707. package/dist/internal/{useSize.svelte.d.ts → use-size.svelte.d.ts} +1 -1
  708. package/dist/internal/{useSize.svelte.js → use-size.svelte.js} +1 -1
  709. package/dist/internal/{useStateMachine.svelte.js → use-state-machine.svelte.js} +1 -0
  710. package/dist/internal/{useTimeoutFn.svelte.js → use-timeout-fn.svelte.js} +1 -2
  711. package/dist/shared/attributes.d.ts +28 -28
  712. package/dist/shared/css.d.ts +2 -1
  713. package/dist/shared/date/types.d.ts +25 -0
  714. package/dist/shared/index.d.ts +6 -9
  715. package/dist/shared/index.js +4 -2
  716. package/dist/shared/types.d.ts +13 -0
  717. package/dist/types.d.ts +1 -1
  718. package/package.json +19 -28
  719. package/dist/bits/listbox/components/listbox-content-static.svelte +0 -69
  720. package/dist/bits/listbox/components/listbox-content-static.svelte.d.ts +0 -19
  721. package/dist/bits/listbox/components/listbox-content.svelte +0 -77
  722. package/dist/bits/listbox/components/listbox-content.svelte.d.ts +0 -19
  723. package/dist/bits/listbox/components/listbox-group-label.svelte +0 -33
  724. package/dist/bits/listbox/components/listbox-group-label.svelte.d.ts +0 -19
  725. package/dist/bits/listbox/components/listbox-group.svelte +0 -33
  726. package/dist/bits/listbox/components/listbox-group.svelte.d.ts +0 -19
  727. package/dist/bits/listbox/components/listbox-hidden-input.svelte.d.ts +0 -20
  728. package/dist/bits/listbox/components/listbox-item.svelte +0 -44
  729. package/dist/bits/listbox/components/listbox-item.svelte.d.ts +0 -19
  730. package/dist/bits/listbox/components/listbox-label.svelte +0 -33
  731. package/dist/bits/listbox/components/listbox-label.svelte.d.ts +0 -18
  732. package/dist/bits/listbox/components/listbox-scroll-down-button.svelte +0 -40
  733. package/dist/bits/listbox/components/listbox-scroll-down-button.svelte.d.ts +0 -19
  734. package/dist/bits/listbox/components/listbox-scroll-up-button.svelte +0 -40
  735. package/dist/bits/listbox/components/listbox-scroll-up-button.svelte.d.ts +0 -19
  736. package/dist/bits/listbox/components/listbox-trigger.svelte +0 -36
  737. package/dist/bits/listbox/components/listbox-trigger.svelte.d.ts +0 -19
  738. package/dist/bits/listbox/components/listbox-viewport.svelte +0 -55
  739. package/dist/bits/listbox/components/listbox-viewport.svelte.d.ts +0 -19
  740. package/dist/bits/listbox/components/listbox.svelte +0 -81
  741. package/dist/bits/listbox/components/listbox.svelte.d.ts +0 -18
  742. package/dist/bits/listbox/index.d.ts +0 -13
  743. package/dist/bits/listbox/index.js +0 -12
  744. package/dist/bits/listbox/listbox.svelte.d.ts +0 -414
  745. package/dist/bits/listbox/listbox.svelte.js +0 -1023
  746. package/dist/bits/listbox/types.d.ts +0 -177
  747. package/dist/bits/navigation-menu/components/navigation-menu-sub.svelte +0 -48
  748. package/dist/bits/navigation-menu/components/navigation-menu-sub.svelte.d.ts +0 -18
  749. package/dist/bits/select/components/select-arrow.svelte +0 -22
  750. package/dist/bits/select/components/select-arrow.svelte.d.ts +0 -18
  751. package/dist/bits/select/components/select-content-floating.svelte +0 -73
  752. package/dist/bits/select/components/select-content-floating.svelte.d.ts +0 -34
  753. package/dist/bits/select/components/select-content-impl.svelte +0 -90
  754. package/dist/bits/select/components/select-content-impl.svelte.d.ts +0 -90
  755. package/dist/bits/select/components/select-content-item-aligned.svelte +0 -38
  756. package/dist/bits/select/components/select-content-item-aligned.svelte.d.ts +0 -29
  757. package/dist/bits/select/components/select-icon.svelte +0 -37
  758. package/dist/bits/select/components/select-icon.svelte.d.ts +0 -19
  759. package/dist/bits/select/components/select-item-text.svelte +0 -40
  760. package/dist/bits/select/components/select-item-text.svelte.d.ts +0 -19
  761. package/dist/bits/select/components/select-native.svelte +0 -36
  762. package/dist/bits/select/components/select-native.svelte.d.ts +0 -30
  763. package/dist/bits/select/components/select-provider.svelte +0 -10
  764. package/dist/bits/select/components/select-provider.svelte.d.ts +0 -23
  765. package/dist/bits/select/components/select-scroll-down-button-mounted.svelte +0 -33
  766. package/dist/bits/select/components/select-scroll-down-button-mounted.svelte.d.ts +0 -29
  767. package/dist/bits/select/components/select-scroll-up-button-mounted.svelte +0 -33
  768. package/dist/bits/select/components/select-scroll-up-button-mounted.svelte.d.ts +0 -29
  769. package/dist/bits/select/components/select-separator.svelte +0 -33
  770. package/dist/bits/select/components/select-separator.svelte.d.ts +0 -19
  771. package/dist/bits/select/components/select-value.svelte +0 -35
  772. package/dist/bits/select/components/select-value.svelte.d.ts +0 -19
  773. package/dist/internal/afterSleep.d.ts +0 -4
  774. package/dist/internal/afterSleep.js +0 -6
  775. package/dist/internal/afterTick.d.ts +0 -5
  776. package/dist/internal/afterTick.js +0 -7
  777. package/dist/internal/callbacks.d.ts +0 -11
  778. package/dist/internal/callbacks.js +0 -21
  779. package/dist/internal/composeHandlers.d.ts +0 -8
  780. package/dist/internal/composeHandlers.js +0 -21
  781. package/dist/internal/createContext.d.ts +0 -1
  782. package/dist/internal/createContext.js +0 -56
  783. package/dist/internal/cssToStyleObj.d.ts +0 -2
  784. package/dist/internal/cssToStyleObj.js +0 -23
  785. package/dist/internal/executeCallbacks.d.ts +0 -7
  786. package/dist/internal/executeCallbacks.js +0 -15
  787. package/dist/internal/mergeProps.d.ts +0 -22
  788. package/dist/internal/mergeProps.js +0 -98
  789. package/dist/internal/onDestroyEffect.svelte.d.ts +0 -1
  790. package/dist/internal/onDestroyEffect.svelte.js +0 -7
  791. package/dist/internal/strings.d.ts +0 -3
  792. package/dist/internal/strings.js +0 -70
  793. package/dist/internal/style.d.ts +0 -3
  794. package/dist/internal/style.js +0 -16
  795. package/dist/internal/styleToCSS.d.ts +0 -1
  796. package/dist/internal/styleToCSS.js +0 -23
  797. package/dist/internal/useBodyScrollLock.svelte.js +0 -88
  798. package/dist/internal/useGraceArea.svelte.d.ts +0 -5
  799. package/dist/internal/useId.js +0 -8
  800. package/dist/internal/useRefById.svelte.d.ts +0 -28
  801. package/dist/internal/useRefById.svelte.js +0 -27
  802. package/dist/internal/useTypeahead.svelte.d.ts +0 -34
  803. package/dist/internal/useTypeahead.svelte.js +0 -64
  804. package/dist/shared/date/index.d.ts +0 -7
  805. package/dist/shared/date/index.js +0 -7
  806. /package/dist/bits/menu/{index.d.ts → exports.d.ts} +0 -0
  807. /package/dist/bits/menu/{index.js → exports.js} +0 -0
  808. /package/dist/bits/utilities/dismissible-layer/{useDismissibleLayer.svelte.d.ts → use-dismissable-layer.svelte.d.ts} +0 -0
  809. /package/dist/bits/utilities/escape-layer/{useEscapeLayer.svelte.d.ts → use-escape-layer.svelte.d.ts} +0 -0
  810. /package/dist/bits/utilities/text-selection-layer/{useTextSelectionLayer.svelte.d.ts → use-text-selection-layer.svelte.d.ts} +0 -0
  811. /package/dist/internal/{boxAutoReset.svelte.d.ts → box-auto-reset.svelte.d.ts} +0 -0
  812. /package/dist/internal/{boxAutoReset.svelte.js → box-auto-reset.svelte.js} +0 -0
  813. /package/dist/internal/{createEventHook.svelte.d.ts → create-event-hook.svelte.d.ts} +0 -0
  814. /package/dist/internal/{createSharedHook.svelte.d.ts → create-shared-hook.svelte.d.ts} +0 -0
  815. /package/dist/internal/{createSharedHook.svelte.js → create-shared-hook.svelte.js} +0 -0
  816. /package/dist/{shared/date → internal/date-time}/announcer.d.ts +0 -0
  817. /package/dist/{shared/date → internal/date-time}/field/parts.d.ts +0 -0
  818. /package/dist/{shared/date → internal/date-time}/field/parts.js +0 -0
  819. /package/dist/{shared/date/field.d.ts → internal/date-time/field/segments.d.ts} +0 -0
  820. /package/dist/{shared/date → internal/date-time}/field/types.d.ts +0 -0
  821. /package/dist/{bits/listbox → internal/date-time/field}/types.js +0 -0
  822. /package/dist/{shared/date → internal/date-time}/placeholders.d.ts +0 -0
  823. /package/dist/{shared/date → internal/date-time}/placeholders.js +0 -0
  824. /package/dist/internal/floating-svelte/{useFloating.svelte.d.ts → use-floating.svelte.d.ts} +0 -0
  825. /package/dist/internal/floating-svelte/{useFloating.svelte.js → use-floating.svelte.js} +0 -0
  826. /package/dist/internal/{getDirectionalKeys.d.ts → get-directional-keys.d.ts} +0 -0
  827. /package/dist/internal/{getDirectionalKeys.js → get-directional-keys.js} +0 -0
  828. /package/dist/internal/{useArrowNavigation.d.ts → use-arrow-navigation.d.ts} +0 -0
  829. /package/dist/internal/{useArrowNavigation.js → use-arrow-navigation.js} +0 -0
  830. /package/dist/internal/{useFormControl.svelte.d.ts → use-form-control.svelte.d.ts} +0 -0
  831. /package/dist/internal/{useFormControl.svelte.js → use-form-control.svelte.js} +0 -0
  832. /package/dist/internal/{useId.d.ts → use-id.d.ts} +0 -0
  833. /package/dist/internal/{useResizeObserver.svelte.d.ts → use-resize-observer.svelte.d.ts} +0 -0
  834. /package/dist/internal/{useResizeObserver.svelte.js → use-resize-observer.svelte.js} +0 -0
  835. /package/dist/internal/{useStateMachine.svelte.d.ts → use-state-machine.svelte.d.ts} +0 -0
  836. /package/dist/internal/{useTimeoutFn.svelte.d.ts → use-timeout-fn.svelte.d.ts} +0 -0
  837. /package/dist/shared/{date/field/types.js → types.js} +0 -0
@@ -1,158 +1,571 @@
1
- /**
2
- * This logic is adapted from Radix UI's Select component.
3
- * https://github.com/radix-ui/primitives/blob/main/packages/react/select/src/Select.tsx
4
- * Credit to the Radix UI team for the original implementation.
5
- */
6
- import { box } from "svelte-toolbelt";
7
- import { SvelteMap } from "svelte/reactivity";
8
- import { untrack } from "svelte";
9
- import { useId } from "../../internal/useId.js";
10
- import { createContext } from "../../internal/createContext.js";
11
- import { useFormControl } from "../../internal/useFormControl.svelte.js";
12
- import { useRefById } from "../../internal/useRefById.svelte.js";
13
- import { useTypeahead } from "../../internal/useTypeahead.svelte.js";
14
- import { getAriaDisabled, getAriaExpanded, getAriaHidden, getAriaRequired, getAriaSelected, getDataChecked, getDataDisabled, getDataOpenClosed, } from "../../internal/attrs.js";
1
+ import { Context, Previous, watch } from "runed";
2
+ import { afterTick, onDestroyEffect, srOnlyStyles, styleToString, useRefById, } from "svelte-toolbelt";
3
+ import { on } from "svelte/events";
4
+ import { backward, forward, next, prev } from "../../internal/arrays.js";
5
+ import { getAriaExpanded, getAriaHidden, getDataDisabled, getDataOpenClosed, getDisabled, getRequired, } from "../../internal/attrs.js";
15
6
  import { kbd } from "../../internal/kbd.js";
16
- import { afterTick } from "../../internal/afterTick.js";
17
- import { clamp } from "../../internal/clamp.js";
18
- import { noop } from "../../internal/callbacks.js";
19
- import { addEventListener } from "../../internal/events.js";
20
- import { sleep } from "../../internal/sleep.js";
21
- import { afterSleep } from "../../internal/afterSleep.js";
22
- export const OPEN_KEYS = [kbd.SPACE, kbd.ENTER, kbd.ARROW_UP, kbd.ARROW_DOWN];
23
- export const SELECTION_KEYS = [" ", kbd.ENTER];
7
+ import { noop } from "../../internal/noop.js";
8
+ import { useDOMTypeahead } from "../../internal/use-dom-typeahead.svelte.js";
9
+ import { useDataTypeahead } from "../../internal/use-data-typeahead.svelte.js";
10
+ // prettier-ignore
11
+ export const INTERACTION_KEYS = [kbd.ARROW_LEFT, kbd.ESCAPE, kbd.ARROW_RIGHT, kbd.SHIFT, kbd.CAPS_LOCK, kbd.CONTROL, kbd.ALT, kbd.META, kbd.ENTER, kbd.F1, kbd.F2, kbd.F3, kbd.F4, kbd.F5, kbd.F6, kbd.F7, kbd.F8, kbd.F9, kbd.F10, kbd.F11, kbd.F12];
12
+ export const FIRST_KEYS = [kbd.ARROW_DOWN, kbd.PAGE_UP, kbd.HOME];
13
+ export const LAST_KEYS = [kbd.ARROW_UP, kbd.PAGE_DOWN, kbd.END];
14
+ export const FIRST_LAST_KEYS = [...FIRST_KEYS, ...LAST_KEYS];
15
+ export const SELECTION_KEYS = [kbd.ENTER, kbd.SPACE];
24
16
  export const CONTENT_MARGIN = 10;
25
- const TRIGGER_ATTR = "data-select-trigger";
26
- const CONTENT_ATTR = "data-select-content";
27
- const ITEM_ATTR = "data-select-item";
28
- const VIEWPORT_ATTR = "data-select-viewport";
29
- const VALUE_ATTR = "data-select-value";
30
- const ITEM_TEXT_ATTR = "data-select-item-text";
31
- const CONTENT_WRAPPER_ATTR = "data-select-content-wrapper";
32
- const SCROLL_UP_BUTTON_ATTR = "data-select-scroll-up-button";
33
- const SCROLL_DOWN_BUTTON_ATTR = "data-select-scroll-down-button";
34
- const GROUP_ATTR = "data-select-group";
35
- const GROUP_LABEL_ATTR = "data-select-group-label";
36
- const SEPARATOR_ATTR = "data-select-separator";
37
- const ARROW_ATTR = "data-select-arrow";
38
- const ICON_ATTR = "data-select-icon";
39
- export const [setSelectRootContext, getSelectRootContext] = createContext("Select.Root");
40
- export const [setSelectTriggerContext] = createContext("Select.Trigger");
41
- export const [setSelectContentContext, getSelectContentContext] = createContext("Select.Content");
42
- export const [setSelectItemContext, getSelectItemContext] = createContext("Select.Item");
43
- export const [setSelectContentItemAlignedContext, getSelectContentItemAlignedContext] = createContext("Select.ContentItemAligned");
44
- const [setSelectGroupContext, getSelectGroupContext] = createContext("Select.Group");
45
- export class SelectRootState {
46
- open;
47
- value;
48
- dir;
17
+ class SelectBaseRootState {
49
18
  disabled;
50
19
  required;
51
- triggerNode = $state(null);
52
- valueId = box(useId());
53
- valueNodeHasChildren = box(false);
54
- valueNode = $state(null);
20
+ name;
21
+ loop;
22
+ open;
23
+ scrollAlignment;
24
+ items;
25
+ allowDeselect;
26
+ touchedInput = $state(false);
27
+ inputValue = $state("");
28
+ inputNode = $state(null);
55
29
  contentNode = $state(null);
56
- contentId = $state(undefined);
57
- triggerPointerDownPos = box({ x: 0, y: 0 });
58
- contentFragment = $state(null);
59
- // A set of all the native options we'll use to render the native select element under the hood
60
- #nativeOptionsSet = new SvelteMap();
61
- // A key we'll use to rerender the native select when the options change to keep it in sync
62
- nativeSelectKey = $derived.by(() => {
63
- return Array.from(this.#nativeOptionsSet.values())
64
- .map((opt) => opt.current.value)
65
- .join(";");
30
+ triggerNode = $state(null);
31
+ valueId = $state("");
32
+ highlightedNode = $state(null);
33
+ highlightedValue = $derived.by(() => {
34
+ if (!this.highlightedNode)
35
+ return null;
36
+ return this.highlightedNode.getAttribute("data-value");
37
+ });
38
+ highlightedId = $derived.by(() => {
39
+ if (!this.highlightedNode)
40
+ return undefined;
41
+ return this.highlightedNode.id;
66
42
  });
67
- nativeOptionsArr = $derived.by(() => Array.from(this.#nativeOptionsSet.values()));
68
- isFormControl = useFormControl(() => this.triggerNode);
43
+ highlightedLabel = $derived.by(() => {
44
+ if (!this.highlightedNode)
45
+ return null;
46
+ return this.highlightedNode.getAttribute("data-label");
47
+ });
48
+ isUsingKeyboard = $state(false);
49
+ isCombobox = $state(false);
50
+ bitsAttrs;
51
+ triggerPointerDownPos = $state.raw({ x: 0, y: 0 });
69
52
  constructor(props) {
70
- this.open = props.open;
71
- this.value = props.value;
72
- this.dir = props.dir;
73
53
  this.disabled = props.disabled;
74
54
  this.required = props.required;
75
- }
76
- handleClose = () => {
77
- this.open.current = false;
78
- this.focusTriggerNode();
79
- };
80
- focusTriggerNode = (preventScroll = true) => {
81
- const node = this.triggerNode;
82
- if (!node)
83
- return;
84
- afterSleep(1, () => {
85
- node.focus({ preventScroll });
55
+ this.name = props.name;
56
+ this.loop = props.loop;
57
+ this.open = props.open;
58
+ this.scrollAlignment = props.scrollAlignment;
59
+ this.isCombobox = props.isCombobox;
60
+ this.items = props.items;
61
+ this.allowDeselect = props.allowDeselect;
62
+ this.bitsAttrs = getSelectBitsAttrs(this);
63
+ $effect.pre(() => {
64
+ if (!this.open.current) {
65
+ this.setHighlightedNode(null);
66
+ }
86
67
  });
87
- };
88
- onNativeOptionAdd = (option) => {
89
- this.#nativeOptionsSet.set(option.current.value, option);
90
- };
91
- onNativeOptionRemove = (option) => {
92
- this.#nativeOptionsSet.delete(option.current.value);
93
- };
94
- getTriggerTypeaheadCandidateNodes = () => {
95
- const node = this.contentFragment;
96
- if (!node)
97
- return [];
98
- return Array.from(node.querySelectorAll(`[${ITEM_ATTR}]:not([data-disabled])`));
99
- };
100
- getCandidateNodes = () => {
68
+ }
69
+ setHighlightedNode(node) {
70
+ this.highlightedNode = node;
71
+ if (node) {
72
+ if (this.isUsingKeyboard) {
73
+ node.scrollIntoView({ block: "nearest" });
74
+ }
75
+ }
76
+ }
77
+ getCandidateNodes() {
101
78
  const node = this.contentNode;
102
79
  if (!node)
103
80
  return [];
104
- return Array.from(node.querySelectorAll(`[${ITEM_ATTR}]:not([data-disabled])`));
105
- };
106
- createTrigger(props) {
107
- return new SelectTriggerState(props, this);
81
+ const nodes = Array.from(node.querySelectorAll(`[${this.bitsAttrs.item}]:not([data-disabled])`));
82
+ return nodes;
108
83
  }
109
- createValue() {
110
- return new SelectValueState(this);
84
+ setHighlightedToFirstCandidate() {
85
+ this.setHighlightedNode(null);
86
+ const candidateNodes = this.getCandidateNodes();
87
+ if (!candidateNodes.length)
88
+ return;
89
+ this.setHighlightedNode(candidateNodes[0]);
111
90
  }
112
- createContent() {
113
- return new SelectContentFragState(this);
91
+ getNodeByValue(value) {
92
+ const candidateNodes = this.getCandidateNodes();
93
+ return candidateNodes.find((node) => node.dataset.value === value) ?? null;
114
94
  }
115
- createContentImpl(props) {
116
- return new SelectContentState(props, this);
95
+ setOpen(open) {
96
+ this.open.current = open;
97
+ }
98
+ toggleOpen() {
99
+ this.open.current = !this.open.current;
100
+ }
101
+ handleOpen() {
102
+ this.setOpen(true);
103
+ }
104
+ handleClose() {
105
+ this.setHighlightedNode(null);
106
+ this.setOpen(false);
107
+ }
108
+ toggleMenu() {
109
+ this.toggleOpen();
117
110
  }
118
111
  }
119
- class SelectTriggerState {
120
- #root;
112
+ class SelectSingleRootState extends SelectBaseRootState {
113
+ value;
114
+ isMulti = false;
115
+ hasValue = $derived.by(() => this.value.current !== "");
116
+ currentLabel = $derived.by(() => {
117
+ if (!this.items.current.length)
118
+ return "";
119
+ const match = this.items.current.find((item) => item.value === this.value.current)?.label;
120
+ return match ?? "";
121
+ });
122
+ candidateLabels = $derived.by(() => {
123
+ if (!this.items.current.length)
124
+ return [];
125
+ const filteredItems = this.items.current.filter((item) => !item.disabled);
126
+ return filteredItems.map((item) => item.label);
127
+ });
128
+ dataTypeaheadEnabled = $derived.by(() => {
129
+ if (this.isMulti)
130
+ return false;
131
+ if (this.items.current.length === 0)
132
+ return false;
133
+ return true;
134
+ });
135
+ constructor(props) {
136
+ super(props);
137
+ this.value = props.value;
138
+ $effect(() => {
139
+ if (!this.open.current && this.highlightedNode) {
140
+ this.setHighlightedNode(null);
141
+ }
142
+ });
143
+ watch(() => this.open.current, (isOpen) => {
144
+ if (!isOpen)
145
+ return;
146
+ afterTick(() => {
147
+ this.setInitialHighlightedNode();
148
+ });
149
+ });
150
+ }
151
+ includesItem(itemValue) {
152
+ return this.value.current === itemValue;
153
+ }
154
+ toggleItem(itemValue, itemLabel = itemValue) {
155
+ this.value.current = this.includesItem(itemValue) ? "" : itemValue;
156
+ this.inputValue = itemLabel;
157
+ }
158
+ setInitialHighlightedNode() {
159
+ if (this.highlightedNode && document.contains(this.highlightedNode))
160
+ return;
161
+ if (this.value.current !== "") {
162
+ const node = this.getNodeByValue(this.value.current);
163
+ if (node) {
164
+ this.setHighlightedNode(node);
165
+ return;
166
+ }
167
+ }
168
+ // if no value is set, we want to highlight the first item
169
+ const firstCandidate = this.getCandidateNodes()[0];
170
+ if (!firstCandidate)
171
+ return;
172
+ this.setHighlightedNode(firstCandidate);
173
+ }
174
+ }
175
+ class SelectMultipleRootState extends SelectBaseRootState {
176
+ value;
177
+ isMulti = true;
178
+ hasValue = $derived.by(() => this.value.current.length > 0);
179
+ constructor(props) {
180
+ super(props);
181
+ this.value = props.value;
182
+ watch(() => this.open.current, (isOpen) => {
183
+ if (!isOpen)
184
+ return;
185
+ afterTick(() => {
186
+ if (!this.highlightedNode) {
187
+ this.setInitialHighlightedNode();
188
+ }
189
+ });
190
+ });
191
+ }
192
+ includesItem(itemValue) {
193
+ return this.value.current.includes(itemValue);
194
+ }
195
+ toggleItem(itemValue, itemLabel = itemValue) {
196
+ if (this.includesItem(itemValue)) {
197
+ this.value.current = this.value.current.filter((v) => v !== itemValue);
198
+ }
199
+ else {
200
+ this.value.current = [...this.value.current, itemValue];
201
+ }
202
+ this.inputValue = itemLabel;
203
+ }
204
+ setInitialHighlightedNode() {
205
+ if (this.highlightedNode)
206
+ return;
207
+ if (this.value.current.length && this.value.current[0] !== "") {
208
+ const node = this.getNodeByValue(this.value.current[0]);
209
+ if (node) {
210
+ this.setHighlightedNode(node);
211
+ return;
212
+ }
213
+ }
214
+ // if no value is set, we want to highlight the first item
215
+ const firstCandidate = this.getCandidateNodes()[0];
216
+ if (!firstCandidate)
217
+ return;
218
+ this.setHighlightedNode(firstCandidate);
219
+ }
220
+ }
221
+ class SelectInputState {
121
222
  #id;
122
223
  #ref;
123
- #disabled;
124
- #typeahead;
125
- #isDisabled = $derived.by(() => {
126
- return this.#root.disabled.current || this.#disabled.current;
127
- });
224
+ root;
128
225
  constructor(props, root) {
226
+ this.root = root;
129
227
  this.#id = props.id;
130
228
  this.#ref = props.ref;
131
- this.#root = root;
132
- this.#disabled = props.disabled;
133
229
  useRefById({
134
230
  id: this.#id,
135
231
  ref: this.#ref,
136
232
  onRefChange: (node) => {
137
- this.#root.triggerNode = node;
233
+ this.root.inputNode = node;
138
234
  },
139
235
  });
140
- this.#typeahead = useTypeahead();
236
+ this.onkeydown = this.onkeydown.bind(this);
237
+ this.oninput = this.oninput.bind(this);
141
238
  }
142
- #handleOpen = () => {
143
- if (this.#isDisabled)
239
+ onkeydown(e) {
240
+ this.root.isUsingKeyboard = true;
241
+ if (e.key === kbd.ESCAPE)
144
242
  return;
145
- this.#root.open.current = true;
146
- this.#typeahead.resetTypeahead();
147
- };
148
- #handlePointerOpen = (e) => {
243
+ const open = this.root.open.current;
244
+ const inputValue = this.root.inputValue;
245
+ // prevent arrow up/down from moving the position of the cursor in the input
246
+ if (e.key === kbd.ARROW_UP || e.key === kbd.ARROW_DOWN)
247
+ e.preventDefault();
248
+ if (!open) {
249
+ if (INTERACTION_KEYS.includes(e.key))
250
+ return;
251
+ if (e.key === kbd.TAB)
252
+ return;
253
+ if (e.key === kbd.BACKSPACE && inputValue === "")
254
+ return;
255
+ this.root.handleOpen();
256
+ // we need to wait for a tick after the menu opens to ensure the highlighted nodes are
257
+ // set correctly.
258
+ afterTick(() => {
259
+ if (this.root.hasValue)
260
+ return;
261
+ const candidateNodes = this.root.getCandidateNodes();
262
+ if (!candidateNodes.length)
263
+ return;
264
+ if (e.key === kbd.ARROW_DOWN) {
265
+ const firstCandidate = candidateNodes[0];
266
+ this.root.setHighlightedNode(firstCandidate);
267
+ }
268
+ else if (e.key === kbd.ARROW_UP) {
269
+ const lastCandidate = candidateNodes[candidateNodes.length - 1];
270
+ this.root.setHighlightedNode(lastCandidate);
271
+ }
272
+ });
273
+ return;
274
+ }
275
+ if (e.key === kbd.TAB) {
276
+ this.root.handleClose();
277
+ return;
278
+ }
279
+ if (e.key === kbd.ENTER && !e.isComposing) {
280
+ e.preventDefault();
281
+ const highlightedValue = this.root.highlightedValue;
282
+ const isCurrentSelectedValue = highlightedValue === this.root.value.current;
283
+ if (!this.root.allowDeselect.current && isCurrentSelectedValue && !this.root.isMulti) {
284
+ this.root.handleClose();
285
+ return;
286
+ }
287
+ if (highlightedValue) {
288
+ this.root.toggleItem(highlightedValue, this.root.highlightedLabel ?? undefined);
289
+ }
290
+ if (!this.root.isMulti && !isCurrentSelectedValue) {
291
+ this.root.handleClose();
292
+ }
293
+ }
294
+ if (e.key === kbd.ARROW_UP && e.altKey) {
295
+ this.root.handleClose();
296
+ }
297
+ if (FIRST_LAST_KEYS.includes(e.key)) {
298
+ e.preventDefault();
299
+ const candidateNodes = this.root.getCandidateNodes();
300
+ const currHighlightedNode = this.root.highlightedNode;
301
+ const currIndex = currHighlightedNode
302
+ ? candidateNodes.indexOf(currHighlightedNode)
303
+ : -1;
304
+ const loop = this.root.loop.current;
305
+ let nextItem;
306
+ if (e.key === kbd.ARROW_DOWN) {
307
+ nextItem = next(candidateNodes, currIndex, loop);
308
+ }
309
+ else if (e.key === kbd.ARROW_UP) {
310
+ nextItem = prev(candidateNodes, currIndex, loop);
311
+ }
312
+ else if (e.key === kbd.PAGE_DOWN) {
313
+ nextItem = forward(candidateNodes, currIndex, 10, loop);
314
+ }
315
+ else if (e.key === kbd.PAGE_UP) {
316
+ nextItem = backward(candidateNodes, currIndex, 10, loop);
317
+ }
318
+ else if (e.key === kbd.HOME) {
319
+ nextItem = candidateNodes[0];
320
+ }
321
+ else if (e.key === kbd.END) {
322
+ nextItem = candidateNodes[candidateNodes.length - 1];
323
+ }
324
+ if (!nextItem)
325
+ return;
326
+ this.root.setHighlightedNode(nextItem);
327
+ return;
328
+ }
329
+ if (INTERACTION_KEYS.includes(e.key))
330
+ return;
331
+ if (!this.root.highlightedNode) {
332
+ this.root.setHighlightedToFirstCandidate();
333
+ }
334
+ // this.root.setHighlightedToFirstCandidate();
335
+ }
336
+ oninput(e) {
337
+ this.root.inputValue = e.currentTarget.value;
338
+ afterTick(() => {
339
+ this.root.setHighlightedToFirstCandidate();
340
+ });
341
+ }
342
+ props = $derived.by(() => ({
343
+ id: this.#id.current,
344
+ role: "combobox",
345
+ disabled: this.root.disabled.current ? true : undefined,
346
+ "aria-activedescendant": this.root.highlightedId,
347
+ "aria-autocomplete": "list",
348
+ "aria-expanded": getAriaExpanded(this.root.open.current),
349
+ "data-state": getDataOpenClosed(this.root.open.current),
350
+ "data-disabled": getDataDisabled(this.root.disabled.current),
351
+ onkeydown: this.onkeydown,
352
+ oninput: this.oninput,
353
+ [this.root.bitsAttrs.input]: "",
354
+ }));
355
+ }
356
+ class SelectComboTriggerState {
357
+ #id;
358
+ #ref;
359
+ root;
360
+ constructor(props, root) {
361
+ this.root = root;
362
+ this.#id = props.id;
363
+ this.#ref = props.ref;
364
+ useRefById({
365
+ id: this.#id,
366
+ ref: this.#ref,
367
+ });
368
+ this.onkeydown = this.onkeydown.bind(this);
369
+ this.onpointerdown = this.onpointerdown.bind(this);
370
+ }
371
+ onkeydown(e) {
372
+ if (e.key === kbd.ENTER || e.key === kbd.SPACE) {
373
+ e.preventDefault();
374
+ if (document.activeElement !== this.root.inputNode) {
375
+ this.root.inputNode?.focus();
376
+ }
377
+ this.root.toggleMenu();
378
+ }
379
+ }
380
+ /**
381
+ * `pointerdown` fires before the `focus` event, so we can prevent the default
382
+ * behavior of focusing the button and keep focus on the input.
383
+ */
384
+ onpointerdown(e) {
385
+ if (this.root.disabled.current)
386
+ return;
387
+ e.preventDefault();
388
+ if (document.activeElement !== this.root.inputNode) {
389
+ this.root.inputNode?.focus();
390
+ }
391
+ this.root.toggleMenu();
392
+ }
393
+ props = $derived.by(() => ({
394
+ id: this.#id.current,
395
+ disabled: this.root.disabled.current ? true : undefined,
396
+ "aria-haspopup": "listbox",
397
+ "data-state": getDataOpenClosed(this.root.open.current),
398
+ "data-disabled": getDataDisabled(this.root.disabled.current),
399
+ [this.root.bitsAttrs.trigger]: "",
400
+ onpointerdown: this.onpointerdown,
401
+ onkeydown: this.onkeydown,
402
+ }));
403
+ }
404
+ class SelectTriggerState {
405
+ #id;
406
+ #ref;
407
+ root;
408
+ #domTypeahead;
409
+ #dataTypeahead;
410
+ constructor(props, root) {
411
+ this.root = root;
412
+ this.#id = props.id;
413
+ this.#ref = props.ref;
414
+ useRefById({
415
+ id: this.#id,
416
+ ref: this.#ref,
417
+ onRefChange: (node) => {
418
+ this.root.triggerNode = node;
419
+ },
420
+ });
421
+ this.#domTypeahead = useDOMTypeahead({
422
+ getCurrentItem: () => this.root.highlightedNode,
423
+ onMatch: (node) => {
424
+ this.root.setHighlightedNode(node);
425
+ },
426
+ });
427
+ this.#dataTypeahead = useDataTypeahead({
428
+ getCurrentItem: () => {
429
+ if (this.root.isMulti)
430
+ return "";
431
+ return this.root.currentLabel;
432
+ },
433
+ onMatch: (label) => {
434
+ if (this.root.isMulti)
435
+ return;
436
+ if (!this.root.items.current)
437
+ return;
438
+ const matchedItem = this.root.items.current.find((item) => item.label === label);
439
+ if (!matchedItem)
440
+ return;
441
+ this.root.value.current = matchedItem.value;
442
+ },
443
+ enabled: !this.root.isMulti && this.root.dataTypeaheadEnabled,
444
+ });
445
+ this.onkeydown = this.onkeydown.bind(this);
446
+ this.onpointerdown = this.onpointerdown.bind(this);
447
+ this.onpointerup = this.onpointerup.bind(this);
448
+ this.onclick = this.onclick.bind(this);
449
+ }
450
+ #handleOpen() {
451
+ this.root.open.current = true;
452
+ this.#dataTypeahead.resetTypeahead();
453
+ this.#domTypeahead.resetTypeahead();
454
+ }
455
+ #handlePointerOpen(e) {
149
456
  this.#handleOpen();
150
- this.#root.triggerPointerDownPos.current = {
457
+ this.root.triggerPointerDownPos = {
151
458
  x: Math.round(e.pageX),
152
459
  y: Math.round(e.pageY),
153
460
  };
154
- };
155
- #onclick = (e) => {
461
+ }
462
+ onkeydown(e) {
463
+ this.root.isUsingKeyboard = true;
464
+ if (e.key === kbd.ARROW_UP || e.key === kbd.ARROW_DOWN)
465
+ e.preventDefault();
466
+ if (!this.root.open.current) {
467
+ if (e.key === kbd.ENTER ||
468
+ e.key === kbd.SPACE ||
469
+ e.key === kbd.ARROW_DOWN ||
470
+ e.key === kbd.ARROW_UP) {
471
+ e.preventDefault();
472
+ this.root.handleOpen();
473
+ }
474
+ else if (!this.root.isMulti && this.root.dataTypeaheadEnabled) {
475
+ this.#dataTypeahead.handleTypeaheadSearch(e.key, this.root.candidateLabels);
476
+ return;
477
+ }
478
+ // we need to wait for a tick after the menu opens to ensure
479
+ // the highlighted nodes are set correctly
480
+ afterTick(() => {
481
+ if (this.root.hasValue)
482
+ return;
483
+ const candidateNodes = this.root.getCandidateNodes();
484
+ if (!candidateNodes.length)
485
+ return;
486
+ if (e.key === kbd.ARROW_DOWN) {
487
+ const firstCandidate = candidateNodes[0];
488
+ this.root.setHighlightedNode(firstCandidate);
489
+ }
490
+ else if (e.key === kbd.ARROW_UP) {
491
+ const lastCandidate = candidateNodes[candidateNodes.length - 1];
492
+ this.root.setHighlightedNode(lastCandidate);
493
+ }
494
+ });
495
+ return;
496
+ }
497
+ if (e.key === kbd.TAB) {
498
+ this.root.handleClose();
499
+ return;
500
+ }
501
+ if ((e.key === kbd.ENTER || e.key === kbd.SPACE) && !e.isComposing) {
502
+ e.preventDefault();
503
+ const highlightedValue = this.root.highlightedValue;
504
+ const isCurrentSelectedValue = highlightedValue === this.root.value.current;
505
+ if (!this.root.allowDeselect.current && isCurrentSelectedValue && !this.root.isMulti) {
506
+ this.root.handleClose();
507
+ return;
508
+ }
509
+ //"" is a valid value for a select item so we need to check for that
510
+ if (highlightedValue !== null) {
511
+ this.root.toggleItem(highlightedValue, this.root.highlightedLabel ?? undefined);
512
+ }
513
+ if (!this.root.isMulti && !isCurrentSelectedValue) {
514
+ this.root.handleClose();
515
+ }
516
+ }
517
+ if (e.key === kbd.ARROW_UP && e.altKey) {
518
+ this.root.handleClose();
519
+ }
520
+ if (FIRST_LAST_KEYS.includes(e.key)) {
521
+ e.preventDefault();
522
+ const candidateNodes = this.root.getCandidateNodes();
523
+ const currHighlightedNode = this.root.highlightedNode;
524
+ const currIndex = currHighlightedNode
525
+ ? candidateNodes.indexOf(currHighlightedNode)
526
+ : -1;
527
+ const loop = this.root.loop.current;
528
+ let nextItem;
529
+ if (e.key === kbd.ARROW_DOWN) {
530
+ nextItem = next(candidateNodes, currIndex, loop);
531
+ }
532
+ else if (e.key === kbd.ARROW_UP) {
533
+ nextItem = prev(candidateNodes, currIndex, loop);
534
+ }
535
+ else if (e.key === kbd.PAGE_DOWN) {
536
+ nextItem = forward(candidateNodes, currIndex, 10, loop);
537
+ }
538
+ else if (e.key === kbd.PAGE_UP) {
539
+ nextItem = backward(candidateNodes, currIndex, 10, loop);
540
+ }
541
+ else if (e.key === kbd.HOME) {
542
+ nextItem = candidateNodes[0];
543
+ }
544
+ else if (e.key === kbd.END) {
545
+ nextItem = candidateNodes[candidateNodes.length - 1];
546
+ }
547
+ if (!nextItem)
548
+ return;
549
+ this.root.setHighlightedNode(nextItem);
550
+ return;
551
+ }
552
+ const isModifierKey = e.ctrlKey || e.altKey || e.metaKey;
553
+ const isCharacterKey = e.key.length === 1;
554
+ // prevent space from being considered with typeahead
555
+ if (e.code === "Space")
556
+ return;
557
+ const candidateNodes = this.root.getCandidateNodes();
558
+ if (e.key === kbd.TAB)
559
+ return;
560
+ if (!isModifierKey && isCharacterKey) {
561
+ this.#domTypeahead.handleTypeaheadSearch(e.key, candidateNodes);
562
+ return;
563
+ }
564
+ if (!this.root.highlightedNode) {
565
+ this.root.setHighlightedToFirstCandidate();
566
+ }
567
+ }
568
+ onclick(e) {
156
569
  // While browsers generally have no issue focusing the trigger when clicking
157
570
  // on a label, Safari seems to struggle with the fact that there's no `onClick`.
158
571
  // We force `focus` in this case. Note: this doesn't create any other side-effect
@@ -160,10 +573,15 @@ class SelectTriggerState {
160
573
  // this only runs for a label 'click'
161
574
  const currTarget = e.currentTarget;
162
575
  currTarget.focus();
163
- };
164
- #onpointerdown = (e) => {
165
- // prevent opening on touch down which can be triggered
166
- // when scrolling on touch devices (unexpected)
576
+ }
577
+ /**
578
+ * `pointerdown` fires before the `focus` event, so we can prevent the default
579
+ * behavior of focusing the button and keep focus on the input.
580
+ */
581
+ onpointerdown = (e) => {
582
+ if (this.root.disabled.current)
583
+ return;
584
+ // prevent opening on touch down which can be triggered when scrolling on touch devices
167
585
  if (e.pointerType === "touch")
168
586
  return e.preventDefault();
169
587
  // prevent implicit pointer capture
@@ -174,699 +592,298 @@ class SelectTriggerState {
174
592
  // only call the handle if it's a left click, since pointerdown is triggered
175
593
  // by right clicks as well, but not when ctrl is pressed
176
594
  if (e.button === 0 && e.ctrlKey === false) {
177
- if (this.#root.open.current === false) {
595
+ if (this.root.open.current === false) {
178
596
  this.#handlePointerOpen(e);
179
597
  e.preventDefault();
180
598
  }
181
599
  else {
182
- this.#root.handleClose();
600
+ this.root.handleClose();
183
601
  }
184
602
  }
185
603
  };
186
- #onpointerup = (e) => {
604
+ onpointerup = (e) => {
187
605
  e.preventDefault();
188
606
  if (e.pointerType === "touch") {
189
607
  this.#handlePointerOpen(e);
190
608
  }
191
609
  };
192
- #onkeydown = (e) => {
193
- const isTypingAhead = this.#typeahead.search.current !== "";
194
- const isModifierKey = e.ctrlKey || e.altKey || e.metaKey;
195
- if (!isModifierKey && e.key.length === 1) {
196
- if (isTypingAhead && e.key === " ")
197
- return;
198
- }
199
- const newItem = this.#typeahead.handleTypeaheadSearch(e.key, this.#root.getTriggerTypeaheadCandidateNodes());
200
- if (newItem && newItem.dataset.value) {
201
- this.#root.value.current = newItem.dataset.value;
202
- }
203
- if (OPEN_KEYS.includes(e.key)) {
204
- this.#handleOpen();
205
- e.preventDefault();
206
- }
207
- };
208
610
  props = $derived.by(() => ({
209
611
  id: this.#id.current,
210
- disabled: this.#isDisabled,
211
- role: "combobox",
212
- type: "button",
213
- "aria-controls": this.#root.contentId,
214
- "aria-expanded": getAriaExpanded(this.#root.open.current),
215
- "aria-required": getAriaRequired(this.#root.required.current),
216
- "aria-autocomplete": "none",
217
- dir: this.#root.dir.current,
218
- "data-state": getDataOpenClosed(this.#root.open.current),
219
- "data-disabled": getDataDisabled(this.#isDisabled),
220
- "data-placeholder": shouldShowPlaceholder(this.#root.value.current)
221
- ? ""
222
- : undefined,
223
- [TRIGGER_ATTR]: "",
224
- onclick: this.#onclick,
225
- onpointerdown: this.#onpointerdown,
226
- onpointerup: this.#onpointerup,
227
- onkeydown: this.#onkeydown,
228
- }));
229
- }
230
- class SelectValueState {
231
- root;
232
- showPlaceholder = $derived.by(() => shouldShowPlaceholder(this.root.value.current));
233
- ref = box(null);
234
- constructor(root) {
235
- this.root = root;
236
- useRefById({
237
- id: this.root.valueId,
238
- ref: this.ref,
239
- onRefChange: (node) => {
240
- this.root.valueNode = node;
241
- },
242
- });
243
- }
244
- props = $derived.by(() => ({
245
- id: this.root.valueId.current,
612
+ disabled: this.root.disabled.current ? true : undefined,
613
+ "aria-haspopup": "listbox",
246
614
  "data-state": getDataOpenClosed(this.root.open.current),
247
615
  "data-disabled": getDataDisabled(this.root.disabled.current),
248
- [VALUE_ATTR]: "",
249
- style: {
250
- pointerEvents: "none",
251
- },
616
+ "data-placeholder": this.root.hasValue ? undefined : "",
617
+ [this.root.bitsAttrs.trigger]: "",
618
+ onpointerdown: this.onpointerdown,
619
+ onkeydown: this.onkeydown,
620
+ onclick: this.onclick,
621
+ onpointerup: this.onpointerup,
252
622
  }));
253
623
  }
254
- class SelectContentFragState {
255
- root;
256
- constructor(root) {
257
- this.root = root;
258
- $effect(() => {
259
- this.root.contentFragment = new DocumentFragment();
260
- });
261
- }
262
- }
263
- export class SelectContentState {
624
+ class SelectContentState {
264
625
  id;
265
626
  ref;
266
- root;
267
627
  viewportNode = $state(null);
268
- selectedItemId = box(useId());
269
- selectedItemTextId = box(useId());
270
- selectedItemText = box(null);
271
- position;
272
- isPositioned = box(false);
273
- firstValidItemFound = box(false);
274
- typeahead;
275
- alignedPositionState = null;
628
+ root;
629
+ isPositioned = $state(false);
276
630
  constructor(props, root) {
277
- this.position = props.position;
631
+ this.root = root;
278
632
  this.id = props.id;
279
633
  this.ref = props.ref;
280
- this.root = root;
281
- this.typeahead = useTypeahead();
282
634
  useRefById({
283
635
  id: this.id,
284
636
  ref: this.ref,
285
- condition: () => this.root.open.current,
286
637
  onRefChange: (node) => {
287
638
  this.root.contentNode = node;
288
- this.root.contentId = node?.id;
289
639
  },
640
+ deps: () => this.root.open.current,
290
641
  });
291
- $effect(() => {
292
- this.root.open.current;
293
- untrack(() => {
294
- let cleanup = [noop];
295
- afterTick(() => {
296
- const node = document.getElementById(this.id.current);
297
- if (!node)
298
- return;
299
- let pointerMoveDelta = { x: 0, y: 0 };
300
- const handlePointerMove = (e) => {
301
- pointerMoveDelta = {
302
- x: Math.abs(Math.round(e.pageX) -
303
- (this.root.triggerPointerDownPos.current?.x ?? 0)),
304
- y: Math.abs(Math.round(e.pageY) -
305
- (this.root.triggerPointerDownPos.current?.y ?? 0)),
306
- };
307
- };
308
- const handlePointerUp = (e) => {
309
- if (e.pointerType === "touch")
310
- return;
311
- if (pointerMoveDelta.x <= 10 && pointerMoveDelta.y <= 10) {
312
- e.preventDefault();
313
- }
314
- else {
315
- if (!this.root.contentNode?.contains(e.target)) {
316
- this.root.handleClose();
317
- }
318
- }
319
- document.removeEventListener("pointermove", handlePointerMove);
320
- this.root.triggerPointerDownPos.current = null;
321
- };
322
- if (this.root.triggerPointerDownPos.current !== null) {
323
- const pointerMove = addEventListener(document, "pointermove", handlePointerMove);
324
- const pointerUp = addEventListener(document, "pointerup", handlePointerUp, {
325
- capture: true,
326
- once: true,
327
- });
328
- for (const cleanupFn of cleanup)
329
- cleanupFn();
330
- cleanup = [pointerMove, pointerUp];
331
- }
332
- return () => {
333
- for (const cleanupFn of cleanup)
334
- cleanupFn();
335
- };
336
- });
337
- });
338
- });
339
- $effect(() => {
340
- if (this.isPositioned.current) {
341
- this.focusSelectedItem();
342
- }
343
- });
344
- $effect(() => {
345
- if (this.root.open.current === false) {
346
- this.isPositioned.current = false;
347
- }
642
+ onDestroyEffect(() => (this.root.contentNode = null));
643
+ watch(() => this.root.open.current, (isOpen) => {
644
+ if (isOpen)
645
+ return;
646
+ this.isPositioned = false;
348
647
  });
648
+ this.onpointermove = this.onpointermove.bind(this);
649
+ this.handleInteractOutside = this.handleInteractOutside.bind(this);
349
650
  }
350
- focusFirst = (candidates) => {
351
- const [firstItem, ...restItems] = this.root.getCandidateNodes();
352
- const [lastItem] = restItems.slice(-1);
353
- const PREV_FOCUSED_ELEMENT = document.activeElement;
354
- for (const candidate of candidates) {
355
- if (candidate === PREV_FOCUSED_ELEMENT)
356
- return;
357
- candidate?.scrollIntoView({ block: "nearest" });
358
- // viewport might have padding so scroll to the edge when focusing first/last
359
- const viewport = this.viewportNode;
360
- if (candidate === firstItem && viewport) {
361
- viewport.scrollTop = 0;
362
- }
363
- if (candidate === lastItem && viewport) {
364
- viewport.scrollTop = viewport.scrollHeight;
365
- }
366
- candidate?.focus();
367
- if (document.activeElement !== PREV_FOCUSED_ELEMENT)
368
- return;
369
- }
370
- };
371
- onItemLeave = () => {
372
- this.root.contentNode?.focus();
373
- };
374
- getSelectedItem = () => {
375
- const candidates = this.root.getCandidateNodes();
376
- const selectedItemNode = candidates.find((node) => node?.dataset.value === this.root.value.current) ?? null;
377
- const first = candidates[0] ?? null;
378
- if (selectedItemNode) {
379
- const selectedItemTextNode = selectedItemNode.querySelector(`[${ITEM_TEXT_ATTR}]`);
651
+ onpointermove(_) {
652
+ this.root.isUsingKeyboard = false;
653
+ }
654
+ #styles = $derived.by(() => {
655
+ if (this.root.isCombobox) {
380
656
  return {
381
- selectedItemNode,
382
- selectedItemTextNode,
657
+ "--bits-combobox-content-transform-origin": "var(--bits-floating-transform-origin)",
658
+ "--bits-combobox-content-available-width": "var(--bits-floating-available-width)",
659
+ "--bits-combobox-content-available-height": "var(--bits-floating-available-height)",
660
+ "--bits-combobox-anchor-width": "var(--bits-floating-anchor-width)",
661
+ "--bits-combobox-anchor-height": "var(--bits-floating-anchor-height)",
383
662
  };
384
663
  }
385
664
  else {
386
- if (first) {
387
- const firstItemText = first.querySelector(`[${ITEM_TEXT_ATTR}]`);
388
- return {
389
- selectedItemNode: first,
390
- selectedItemTextNode: firstItemText,
391
- };
392
- }
393
- }
394
- return {
395
- selectedItemNode: null,
396
- selectedItemTextNode: null,
397
- };
398
- };
399
- focusSelectedItem = () => {
400
- afterTick(() => {
401
- const candidates = this.root.getCandidateNodes();
402
- const selected = candidates.find((node) => node?.dataset.value === this.root.value.current) ?? null;
403
- const first = candidates[0] ?? null;
404
- this.focusFirst([selected, first]);
405
- });
406
- };
407
- itemRegister = (value, disabled) => {
408
- const isFirstValidItem = !this.firstValidItemFound.current && !disabled;
409
- const isSelectedItem = this.root.value.current !== undefined && this.root.value.current === value;
410
- if (isSelectedItem || isFirstValidItem) {
411
- if (isFirstValidItem) {
412
- this.firstValidItemFound.current = true;
413
- }
414
- }
415
- };
416
- itemTextRegister = (node, value, disabled) => {
417
- const isFirstValidItem = !this.firstValidItemFound.current && !disabled;
418
- const isSelectedItem = this.root.value.current !== undefined && this.root.value.current === value;
419
- if (isSelectedItem || isFirstValidItem) {
420
- this.selectedItemText.current = node;
421
- }
422
- };
423
- #onkeydown = (e) => {
424
- const isModifierKey = e.ctrlKey || e.altKey || e.metaKey;
425
- if (e.key === "Tab")
426
- e.preventDefault();
427
- if (!isModifierKey && e.key.length === 1) {
428
- this.typeahead.handleTypeaheadSearch(e.key, this.root.getCandidateNodes());
665
+ return {
666
+ "--bits-select-content-transform-origin": "var(--bits-floating-transform-origin)",
667
+ "--bits-select-content-available-width": "var(--bits-floating-available-width)",
668
+ "--bits-select-content-available-height": "var(--bits-floating-available-height)",
669
+ "--bits-select-anchor-width": "var(--bits-floating-anchor-width)",
670
+ "--bits-select-anchor-height": "var(--bits-floating-anchor-height)",
671
+ };
429
672
  }
430
- if ([kbd.ARROW_UP, kbd.ARROW_DOWN, kbd.HOME, kbd.END].includes(e.key)) {
431
- let candidateNodes = this.root.getCandidateNodes();
432
- if (e.key === kbd.ARROW_UP || e.key === kbd.END) {
433
- candidateNodes = candidateNodes.slice().reverse();
434
- }
435
- if (e.key === kbd.ARROW_UP || e.key === kbd.ARROW_DOWN) {
436
- const currElement = e.target;
437
- const currIndex = candidateNodes.indexOf(currElement);
438
- candidateNodes = candidateNodes.slice(currIndex + 1);
439
- }
440
- setTimeout(() => this.focusFirst(candidateNodes));
673
+ });
674
+ handleInteractOutside(e) {
675
+ if (e.target === this.root.triggerNode || e.target === this.root.inputNode) {
441
676
  e.preventDefault();
442
677
  }
443
- };
444
- #oncontextmenu = (e) => {
445
- e.preventDefault();
446
- };
678
+ }
679
+ snippetProps = $derived.by(() => ({ open: this.root.open.current }));
447
680
  props = $derived.by(() => ({
448
681
  id: this.id.current,
449
682
  role: "listbox",
450
683
  "data-state": getDataOpenClosed(this.root.open.current),
684
+ [this.root.bitsAttrs.content]: "",
451
685
  style: {
452
686
  display: "flex",
453
687
  flexDirection: "column",
454
688
  outline: "none",
689
+ boxSizing: "border-box",
690
+ pointerEvents: "auto",
691
+ ...this.#styles,
455
692
  },
456
- oncontextmenu: this.#oncontextmenu,
457
- onkeydown: this.#onkeydown,
458
- tabIndex: -1,
459
- [CONTENT_ATTR]: "",
693
+ onpointermove: this.onpointermove,
460
694
  }));
461
- createItem(props) {
462
- return new SelectItemState(props, this);
463
- }
464
- createViewport(props) {
465
- return new SelectViewportState(props, this);
466
- }
467
- createItemAlignedPosition(props) {
468
- return new SelectItemAlignedPositionState(props, this);
469
- }
470
- createFloatingPosition() {
471
- return new SelectFloatingPositionState(this);
472
- }
473
- createScrollDownButton(props) {
474
- const state = new SelectScrollButtonImplState(props, this);
475
- return new SelectScrollDownButtonState(state);
476
- }
477
- createScrollUpButton(props) {
478
- const state = new SelectScrollButtonImplState(props, this);
479
- return new SelectScrollUpButtonState(state);
480
- }
481
695
  }
482
696
  class SelectItemState {
483
697
  #id;
484
698
  #ref;
485
699
  root;
486
- content;
487
- textId = box(undefined);
488
700
  value;
701
+ label;
702
+ onHighlight;
703
+ onUnhighlight;
489
704
  disabled;
490
- textValue;
491
- isSelected = $derived.by(() => this.root.value.current === this.value.current);
492
- isFocused = box(false);
493
- node = box(null);
494
- trueTextValue = box("");
495
- constructor(props, content) {
496
- this.#id = props.id;
497
- this.#ref = props.ref;
498
- this.root = content.root;
499
- this.content = content;
705
+ isSelected = $derived.by(() => this.root.includesItem(this.value.current));
706
+ isHighlighted = $derived.by(() => this.root.highlightedValue === this.value.current);
707
+ prevHighlighted = new Previous(() => this.isHighlighted);
708
+ textId = $state("");
709
+ mounted = $state(false);
710
+ constructor(props, root) {
711
+ this.root = root;
500
712
  this.value = props.value;
501
713
  this.disabled = props.disabled;
502
- this.textValue = props.textValue;
714
+ this.label = props.label;
715
+ this.onHighlight = props.onHighlight;
716
+ this.onUnhighlight = props.onUnhighlight;
717
+ this.#id = props.id;
718
+ this.#ref = props.ref;
719
+ $effect(() => {
720
+ if (this.isHighlighted) {
721
+ this.onHighlight.current();
722
+ }
723
+ else if (this.prevHighlighted.current) {
724
+ this.onUnhighlight.current();
725
+ }
726
+ });
503
727
  useRefById({
504
728
  id: this.#id,
505
729
  ref: this.#ref,
506
730
  });
507
- $effect(() => {
508
- const node = this.#ref.current;
509
- if (!node)
731
+ watch(() => this.mounted, (isMounted) => {
732
+ if (!isMounted)
510
733
  return;
511
- this.content.itemRegister(this.value.current, this.disabled.current);
734
+ this.root.setInitialHighlightedNode();
512
735
  });
736
+ this.onpointerdown = this.onpointerdown.bind(this);
737
+ this.onpointerup = this.onpointerup.bind(this);
738
+ this.onpointermove = this.onpointermove.bind(this);
513
739
  }
514
- onItemTextChange = (node) => {
515
- this.trueTextValue.current = ((this.textValue?.current || node?.textContent) ?? "").trim();
516
- };
517
- setTextId = (id) => {
518
- this.textId.current = id;
519
- };
520
- handleSelect = async (e) => {
521
- if (e?.defaultPrevented)
522
- return;
523
- if (!this.disabled.current) {
524
- this.root.value.current = this.value.current;
525
- this.root.handleClose();
526
- }
527
- };
528
- #onpointermove = async (e) => {
529
- if (e.defaultPrevented)
530
- return;
531
- if (this.disabled.current) {
532
- this.content.onItemLeave();
533
- }
534
- else {
535
- e.currentTarget.focus({ preventScroll: true });
536
- }
537
- };
538
- #onpointerleave = async (e) => {
740
+ snippetProps = $derived.by(() => ({
741
+ selected: this.isSelected,
742
+ highlighted: this.isHighlighted,
743
+ }));
744
+ onpointerdown(e) {
745
+ // prevent focus from leaving the combobox
746
+ e.preventDefault();
747
+ }
748
+ /**
749
+ * Using `pointerup` instead of `click` allows power users to pointerdown
750
+ * the trigger, then release pointerup on an item to select it vs having to do
751
+ * multiple clicks.
752
+ */
753
+ onpointerup(e) {
539
754
  if (e.defaultPrevented)
540
755
  return;
541
- if (e.currentTarget === document.activeElement) {
542
- this.content.onItemLeave();
543
- }
544
- };
545
- #onpointerdown = (e) => {
546
- e.currentTarget.focus({ preventScroll: true });
547
- };
548
- #onpointerup = async (e) => {
549
- await this.handleSelect(e);
550
- };
551
- #onkeydown = async (e) => {
552
- if (e.defaultPrevented)
756
+ // prevent any default behavior
757
+ e.preventDefault();
758
+ if (this.disabled.current)
553
759
  return;
554
- const isTypingAhead = this.content.typeahead.search.current !== "";
555
- if (isTypingAhead && e.key === kbd.SPACE)
760
+ const isCurrentSelectedValue = this.value.current === this.root.value.current;
761
+ // if allowDeselect is false and the item is already selected and we're not in a
762
+ // multi select, do nothing and close the menu
763
+ if (!this.root.allowDeselect.current && isCurrentSelectedValue && !this.root.isMulti) {
764
+ this.root.handleClose();
556
765
  return;
557
- if (SELECTION_KEYS.includes(e.key)) {
558
- this.handleSelect();
559
766
  }
560
- // prevent page scroll on space
561
- if (e.key === kbd.SPACE)
562
- e.preventDefault();
563
- };
564
- #onfocus = () => {
565
- this.isFocused.current = true;
566
- };
567
- #onblur = () => {
568
- this.isFocused.current = false;
569
- };
570
- #ontouchend = (e) => {
571
- e.preventDefault();
572
- e.stopPropagation();
573
- };
767
+ // otherwise, toggle the item and if we're not in a multi select, close the menu
768
+ this.root.toggleItem(this.value.current, this.label.current);
769
+ if (!this.root.isMulti && !isCurrentSelectedValue) {
770
+ this.root.handleClose();
771
+ }
772
+ }
773
+ onpointermove(_) {
774
+ if (this.root.highlightedNode !== this.#ref.current) {
775
+ this.root.setHighlightedNode(this.#ref.current);
776
+ }
777
+ }
574
778
  props = $derived.by(() => ({
575
779
  id: this.#id.current,
576
780
  role: "option",
577
- "aria-labelledby": this.textId.current ?? undefined,
578
- "data-highlighted": this.isFocused.current ? "" : undefined,
579
- "aria-selected": getAriaSelected(this.isSelected),
580
- "data-state": getDataChecked(this.isSelected),
581
- "aria-disabled": getAriaDisabled(this.disabled.current),
582
- "data-disabled": getDataDisabled(this.disabled.current),
583
- "data-selected": this.isSelected ? "" : undefined,
781
+ "aria-selected": this.root.includesItem(this.value.current) ? "true" : undefined,
584
782
  "data-value": this.value.current,
585
- tabindex: this.disabled.current ? undefined : -1,
586
- [ITEM_ATTR]: "",
587
- //
588
- onfocus: this.#onfocus,
589
- onpointermove: this.#onpointermove,
590
- onpointerleave: this.#onpointerleave,
591
- onpointerdown: this.#onpointerdown,
592
- onpointerup: this.#onpointerup,
593
- onkeydown: this.#onkeydown,
594
- onblur: this.#onblur,
595
- ontouchend: this.#ontouchend,
783
+ "data-disabled": getDataDisabled(this.disabled.current),
784
+ "data-highlighted": this.root.highlightedValue === this.value.current ? "" : undefined,
785
+ "data-selected": this.root.includesItem(this.value.current) ? "" : undefined,
786
+ "data-label": this.label.current,
787
+ [this.root.bitsAttrs.item]: "",
788
+ onpointermove: this.onpointermove,
789
+ onpointerdown: this.onpointerdown,
790
+ onpointerup: this.onpointerup,
596
791
  }));
597
- createText(props) {
598
- return new SelectItemTextState(props, this);
599
- }
600
792
  }
601
- class SelectItemTextState {
602
- item;
793
+ class SelectGroupState {
603
794
  #id;
604
795
  #ref;
605
- node = box(null);
606
- nativeOption = box.with(() => ({
607
- key: this.item.value.current,
608
- value: this.item.value.current,
609
- disabled: this.item.disabled.current,
610
- innerHTML: this.node.current?.textContent,
611
- }));
612
- constructor(props, item) {
796
+ root;
797
+ labelNode = $state(null);
798
+ constructor(props, root) {
613
799
  this.#id = props.id;
614
800
  this.#ref = props.ref;
615
- this.item = item;
616
- this.item.setTextId(this.#id.current);
801
+ this.root = root;
617
802
  useRefById({
618
803
  id: this.#id,
619
804
  ref: this.#ref,
620
805
  });
621
- $effect(() => {
622
- this.item.setTextId(this.#id.current);
623
- });
624
- $effect(() => {
625
- untrack(() => {
626
- const textNode = this.item.root.contentFragment?.getElementById(this.#id.current);
627
- if (!textNode)
628
- return;
629
- this.item.onItemTextChange(textNode);
630
- this.item.content.itemTextRegister(textNode, this.item.value.current, this.item.disabled.current);
631
- this.item.root.onNativeOptionAdd(box.with(() => ({
632
- key: this.item.value.current,
633
- value: this.item.value.current,
634
- disabled: this.item.disabled.current,
635
- innerHTML: textNode?.textContent,
636
- })));
637
- });
638
- });
639
- $effect(() => {
640
- return () => {
641
- this.item.root.onNativeOptionRemove(this.nativeOption);
642
- };
643
- });
644
806
  }
645
807
  props = $derived.by(() => ({
646
808
  id: this.#id.current,
647
- [ITEM_TEXT_ATTR]: "",
809
+ role: "group",
810
+ [this.root.bitsAttrs.group]: "",
811
+ "aria-labelledby": this.labelNode?.id ?? undefined,
648
812
  }));
649
813
  }
650
- class SelectItemAlignedPositionState {
651
- root;
652
- content;
653
- shouldExpandOnScroll = $state(false);
654
- shouldReposition = $state(false);
655
- contentWrapperId = $state(useId());
656
- onPlaced;
657
- contentZIndex = $state("");
658
- constructor(props, content) {
659
- this.root = content.root;
660
- this.content = content;
661
- this.onPlaced = props.onPlaced;
662
- $effect(() => {
663
- afterTick(() => {
664
- this.position();
665
- const contentNode = document.getElementById(this.content.id.current);
666
- if (contentNode) {
667
- this.contentZIndex = window.getComputedStyle(contentNode).zIndex;
668
- }
669
- });
814
+ class SelectGroupHeadingState {
815
+ #id;
816
+ #ref;
817
+ group;
818
+ constructor(props, group) {
819
+ this.#id = props.id;
820
+ this.#ref = props.ref;
821
+ this.group = group;
822
+ useRefById({
823
+ id: this.#id,
824
+ ref: this.#ref,
825
+ onRefChange: (node) => {
826
+ group.labelNode = node;
827
+ },
670
828
  });
671
829
  }
672
- position = () => {
673
- afterTick(() => {
674
- const { selectedItemNode, selectedItemTextNode } = this.content.getSelectedItem();
675
- const contentNode = this.root.contentNode;
676
- const contentWrapperNode = document.getElementById(this.contentWrapperId);
677
- const viewportNode = this.content.viewportNode;
678
- const triggerNode = this.root.triggerNode;
679
- const valueNode = document.getElementById(this.root.valueId.current);
680
- if (!contentNode ||
681
- !contentWrapperNode ||
682
- !viewportNode ||
683
- !selectedItemNode ||
684
- !selectedItemTextNode ||
685
- !triggerNode ||
686
- !valueNode) {
687
- return;
688
- }
689
- const triggerRect = triggerNode.getBoundingClientRect();
690
- // horizontal positioning
691
- const contentRect = contentNode.getBoundingClientRect();
692
- const valueRect = valueNode.getBoundingClientRect();
693
- const itemTextRect = selectedItemTextNode.getBoundingClientRect();
694
- if (this.root.dir.current === "rtl") {
695
- const itemTextOffset = itemTextRect.left - contentRect.left;
696
- const left = valueRect.left - itemTextOffset;
697
- const leftDelta = triggerRect.left - left;
698
- const minContentWidth = triggerRect.width + leftDelta;
699
- const contentWidth = Math.max(minContentWidth, contentRect.width);
700
- const rightEdge = window.innerWidth - CONTENT_MARGIN;
701
- const clampedLeft = clamp(left, CONTENT_MARGIN, rightEdge - contentWidth);
702
- contentWrapperNode.style.minWidth = `${minContentWidth}px`;
703
- contentWrapperNode.style.left = `${clampedLeft}px`;
704
- }
705
- else {
706
- const itemTextOffset = contentRect.right - itemTextRect.right;
707
- const right = window.innerWidth - valueRect.right - itemTextOffset;
708
- const rightDelta = window.innerWidth - triggerRect.right - right;
709
- const minContentWidth = triggerRect.width + rightDelta;
710
- const contentWidth = Math.max(minContentWidth, contentRect.width);
711
- const leftEdge = window.innerWidth - CONTENT_MARGIN;
712
- const clampedRight = clamp(right, CONTENT_MARGIN, leftEdge - contentWidth);
713
- contentWrapperNode.style.minWidth = `${minContentWidth}px`;
714
- contentWrapperNode.style.right = `${clampedRight}px`;
715
- }
716
- // vertical positioning
717
- const items = this.root.getCandidateNodes();
718
- const availableHeight = window.innerHeight - CONTENT_MARGIN * 2;
719
- const itemsHeight = viewportNode.scrollHeight;
720
- const contentStyles = window.getComputedStyle(contentNode);
721
- const contentBorderTopWidth = Number.parseInt(contentStyles.borderTopWidth, 10);
722
- const contentPaddingTop = Number.parseInt(contentStyles.paddingTop, 10);
723
- const contentBorderBottomWidth = Number.parseInt(contentStyles.borderBottomWidth, 10);
724
- const contentPaddingBottom = Number.parseInt(contentStyles.paddingBottom, 10);
725
- const fullContentHeight = contentBorderTopWidth +
726
- contentPaddingTop +
727
- itemsHeight +
728
- contentPaddingBottom +
729
- contentBorderBottomWidth;
730
- const minContentHeight = Math.min(selectedItemNode.offsetHeight * 5, fullContentHeight);
731
- const viewportStyles = window.getComputedStyle(viewportNode);
732
- const viewportPaddingTop = Number.parseInt(viewportStyles.paddingTop, 10);
733
- const viewportPaddingBottom = Number.parseInt(viewportStyles.paddingBottom, 10);
734
- const topEdgeToTriggerMiddle = triggerRect.top + triggerRect.height / 2 - CONTENT_MARGIN;
735
- const triggerMiddleToBottomEdge = availableHeight - topEdgeToTriggerMiddle;
736
- const selectedItemHalfHeight = selectedItemNode.offsetHeight / 2;
737
- const itemOffsetMiddle = selectedItemNode.offsetTop + selectedItemHalfHeight;
738
- const contentTopToItemMiddle = contentBorderTopWidth + contentPaddingTop + itemOffsetMiddle;
739
- const itemMiddleToContentBottom = fullContentHeight - contentTopToItemMiddle;
740
- const willAlignWithoutTopOverflow = contentTopToItemMiddle <= topEdgeToTriggerMiddle;
741
- if (willAlignWithoutTopOverflow) {
742
- const isLastItem = selectedItemNode === items[items.length - 1];
743
- contentWrapperNode.style.bottom = `${0}px`;
744
- const viewportOffsetBottom = contentNode.clientHeight - viewportNode.offsetTop - viewportNode.offsetHeight;
745
- const clampedTriggerMiddleToBottomEdge = Math.max(triggerMiddleToBottomEdge, selectedItemHalfHeight +
746
- // viewport might have padding bottom, include it to avoid a scrollable viewport
747
- (isLastItem ? viewportPaddingBottom : 0) +
748
- viewportOffsetBottom +
749
- contentBorderBottomWidth);
750
- const height = contentTopToItemMiddle + clampedTriggerMiddleToBottomEdge;
751
- contentWrapperNode.style.height = `${height}px`;
752
- }
753
- else {
754
- const isFirstItem = selectedItemNode === items[0];
755
- contentWrapperNode.style.top = `${0}px`;
756
- const clampedTopEdgeToTriggerMiddle = Math.max(topEdgeToTriggerMiddle, contentBorderTopWidth +
757
- viewportNode.offsetTop +
758
- // viewport might have padding top, include it to avoid a scrollable viewport
759
- (isFirstItem ? viewportPaddingTop : 0) +
760
- selectedItemHalfHeight);
761
- const height = clampedTopEdgeToTriggerMiddle + itemMiddleToContentBottom;
762
- contentWrapperNode.style.height = `${height}px`;
763
- viewportNode.scrollTop =
764
- contentTopToItemMiddle - topEdgeToTriggerMiddle + viewportNode.offsetTop;
765
- }
766
- contentWrapperNode.style.margin = `${CONTENT_MARGIN}px 0`;
767
- contentWrapperNode.style.minHeight = `${minContentHeight}px`;
768
- contentWrapperNode.style.maxHeight = `${availableHeight}px`;
769
- this.onPlaced.current();
770
- });
771
- requestAnimationFrame(() => (this.shouldExpandOnScroll = true));
772
- };
773
- handleScrollButtonChange = (id) => {
774
- afterTick(() => {
775
- const node = document.getElementById(id);
776
- if (!node)
777
- return;
778
- if (!this.shouldReposition)
779
- return;
780
- this.position();
781
- this.content.focusSelectedItem();
782
- this.shouldReposition = false;
783
- });
784
- };
785
- wrapperProps = $derived.by(() => ({
786
- id: this.contentWrapperId,
787
- style: {
788
- display: "flex",
789
- flexDirection: "column",
790
- position: "fixed",
791
- zIndex: this.contentZIndex,
792
- },
793
- [CONTENT_WRAPPER_ATTR]: "",
794
- }));
795
830
  props = $derived.by(() => ({
796
- id: this.content.id.current,
797
- style: {
798
- boxSizing: "border-box",
799
- maxHeight: "100%",
800
- },
831
+ id: this.#id.current,
832
+ [this.group.root.bitsAttrs["group-label"]]: "",
801
833
  }));
802
834
  }
803
- class SelectFloatingPositionState {
835
+ class SelectHiddenInputState {
836
+ #value;
804
837
  root;
805
- content;
806
- constructor(content) {
807
- this.root = content.root;
808
- this.content = content;
838
+ shouldRender = $derived.by(() => this.root.name.current !== "");
839
+ constructor(props, root) {
840
+ this.root = root;
841
+ this.#value = props.value;
842
+ this.onfocus = this.onfocus.bind(this);
809
843
  }
810
- props = {
811
- style: {
812
- boxSizing: "border-box",
813
- "--bits-select-content-transform-origin": "var(--bits-floating-transform-origin)",
814
- "--bits-select-content-available-width": "var(--bits-floating-available-width)",
815
- "--bits-select-content-available-height": "var(--bits-floating-available-height)",
816
- "--bits-select-anchor-width": "var(--bits-floating-anchor-width)",
817
- "--bits-select-anchor-height": "var(--bits-floating-anchor-height)",
818
- },
819
- };
844
+ onfocus(e) {
845
+ e.preventDefault();
846
+ if (!this.root.isCombobox) {
847
+ this.root.triggerNode?.focus();
848
+ }
849
+ else {
850
+ this.root.inputNode?.focus();
851
+ }
852
+ }
853
+ props = $derived.by(() => ({
854
+ disabled: getDisabled(this.root.disabled.current),
855
+ required: getRequired(this.root.required.current),
856
+ name: this.root.name.current,
857
+ value: this.#value.current,
858
+ style: styleToString(srOnlyStyles),
859
+ tabindex: -1,
860
+ onfocus: this.onfocus,
861
+ }));
820
862
  }
821
863
  class SelectViewportState {
822
- id;
823
- ref;
864
+ #id;
865
+ #ref;
866
+ root;
824
867
  content;
825
868
  prevScrollTop = $state(0);
826
869
  constructor(props, content) {
827
- this.id = props.id;
870
+ this.#id = props.id;
871
+ this.#ref = props.ref;
828
872
  this.content = content;
829
- this.ref = props.ref;
873
+ this.root = content.root;
830
874
  useRefById({
831
- id: this.id,
832
- ref: this.ref,
875
+ id: this.#id,
876
+ ref: this.#ref,
833
877
  onRefChange: (node) => {
834
878
  this.content.viewportNode = node;
835
879
  },
836
- condition: () => this.content.root.open.current,
880
+ deps: () => this.root.open.current,
837
881
  });
838
882
  }
839
- #onscroll = (e) => {
840
- afterTick(() => {
841
- const viewport = e.currentTarget;
842
- const shouldExpandOnScroll = this.content.alignedPositionState?.shouldExpandOnScroll ?? undefined;
843
- const contentWrapper = document.getElementById(this.content.alignedPositionState?.contentWrapperId ?? "");
844
- if (shouldExpandOnScroll && contentWrapper) {
845
- const scrolledBy = Math.abs(this.prevScrollTop - viewport.scrollTop);
846
- if (scrolledBy > 0) {
847
- const availableHeight = window.innerHeight - CONTENT_MARGIN * 2;
848
- const cssMinHeight = Number.parseFloat(contentWrapper.style.minHeight);
849
- const cssHeight = Number.parseFloat(contentWrapper.style.height);
850
- const prevHeight = Math.max(cssMinHeight, cssHeight);
851
- if (prevHeight < availableHeight) {
852
- const nextHeight = prevHeight + scrolledBy;
853
- const clampedNextHeight = Math.min(availableHeight, nextHeight);
854
- const heightDiff = nextHeight - clampedNextHeight;
855
- contentWrapper.style.height = `${clampedNextHeight}px`;
856
- if (contentWrapper.style.bottom === "0px") {
857
- viewport.scrollTop = heightDiff > 0 ? heightDiff : 0;
858
- contentWrapper.style.justifyContent = "flex-end";
859
- }
860
- }
861
- }
862
- }
863
- this.prevScrollTop = viewport.scrollTop;
864
- });
865
- };
866
883
  props = $derived.by(() => ({
867
- id: this.id.current,
884
+ id: this.#id.current,
868
885
  role: "presentation",
869
- [VIEWPORT_ATTR]: "",
886
+ [this.root.bitsAttrs.viewport]: "",
870
887
  style: {
871
888
  // we use position: 'relative' here on the `viewport` so that when we call
872
889
  // `selectedItem.offsetTop` in calculations, the offset is relative to the viewport
@@ -875,321 +892,216 @@ class SelectViewportState {
875
892
  flex: 1,
876
893
  overflow: "auto",
877
894
  },
878
- onscroll: this.#onscroll,
879
895
  }));
880
896
  }
881
897
  class SelectScrollButtonImplState {
882
898
  id;
883
899
  ref;
884
900
  content;
885
- alignedPositionState;
901
+ root;
886
902
  autoScrollTimer = $state(null);
887
903
  onAutoScroll = noop;
888
904
  mounted;
889
905
  constructor(props, content) {
890
- this.content = content;
891
906
  this.ref = props.ref;
892
- this.alignedPositionState = content.alignedPositionState;
893
907
  this.id = props.id;
894
908
  this.mounted = props.mounted;
909
+ this.content = content;
910
+ this.root = content.root;
895
911
  useRefById({
896
912
  id: this.id,
897
913
  ref: this.ref,
898
- condition: () => this.mounted.current,
899
- });
900
- $effect(() => {
901
- if (this.mounted.current) {
902
- const activeItem = this.content.root
903
- .getCandidateNodes()
904
- .find((node) => node === document.activeElement);
905
- activeItem?.scrollIntoView({ block: "nearest" });
906
- }
914
+ deps: () => this.mounted.current,
907
915
  });
908
- $effect(() => {
909
- return () => {
910
- this.clearAutoScrollTimer();
911
- };
916
+ watch(() => this.mounted.current, (isMounted) => {
917
+ if (!isMounted)
918
+ return;
919
+ const activeItem = this.root.highlightedNode;
920
+ activeItem?.scrollIntoView({ block: "nearest" });
912
921
  });
922
+ this.onpointerdown = this.onpointerdown.bind(this);
923
+ this.onpointermove = this.onpointermove.bind(this);
924
+ this.onpointerleave = this.onpointerleave.bind(this);
913
925
  }
914
- clearAutoScrollTimer = () => {
915
- if (this.autoScrollTimer !== null) {
916
- window.clearInterval(this.autoScrollTimer);
917
- this.autoScrollTimer = null;
918
- }
919
- };
920
- #onpointerdown = () => {
926
+ clearAutoScrollTimer() {
927
+ if (this.autoScrollTimer === null)
928
+ return;
929
+ window.clearInterval(this.autoScrollTimer);
930
+ this.autoScrollTimer = null;
931
+ }
932
+ onpointerdown(_) {
921
933
  if (this.autoScrollTimer !== null)
922
934
  return;
923
935
  this.autoScrollTimer = window.setInterval(() => {
924
936
  this.onAutoScroll();
925
937
  }, 50);
926
- };
927
- #onpointermove = () => {
928
- this.content.onItemLeave?.();
938
+ }
939
+ onpointermove(_) {
929
940
  if (this.autoScrollTimer !== null)
930
941
  return;
931
942
  this.autoScrollTimer = window.setInterval(() => {
932
943
  this.onAutoScroll();
933
944
  }, 50);
934
- };
935
- #onpointerleave = () => {
945
+ }
946
+ onpointerleave(_) {
936
947
  this.clearAutoScrollTimer();
937
- };
948
+ }
938
949
  props = $derived.by(() => ({
939
950
  id: this.id.current,
940
- "aria-hidden": "true",
951
+ "aria-hidden": getAriaHidden(true),
941
952
  style: {
942
953
  flexShrink: 0,
943
954
  },
944
- onpointerdown: this.#onpointerdown,
945
- onpointermove: this.#onpointermove,
946
- onpointerleave: this.#onpointerleave,
955
+ onpointerdown: this.onpointerdown,
956
+ onpointermove: this.onpointermove,
957
+ onpointerleave: this.onpointerleave,
947
958
  }));
948
959
  }
949
960
  class SelectScrollDownButtonState {
950
961
  state;
951
962
  content;
963
+ root;
952
964
  canScrollDown = $state(false);
953
965
  constructor(state) {
954
966
  this.state = state;
955
967
  this.content = state.content;
968
+ this.root = state.root;
956
969
  this.state.onAutoScroll = this.handleAutoScroll;
957
- $effect(() => {
958
- const viewport = this.content.viewportNode;
959
- const isPositioned = this.content.isPositioned.current;
960
- if (!viewport || !isPositioned)
970
+ watch([() => this.content.viewportNode, () => this.content.isPositioned], ([viewportNode, isPositioned]) => {
971
+ if (!viewportNode || !isPositioned)
961
972
  return;
962
- let cleanup = noop;
963
- untrack(() => {
964
- const handleScroll = () => {
965
- const maxScroll = viewport.scrollHeight - viewport.clientHeight;
966
- this.canScrollDown = Math.ceil(viewport.scrollTop) < maxScroll;
967
- };
968
- handleScroll();
969
- cleanup = addEventListener(viewport, "scroll", handleScroll);
970
- });
971
- return () => {
972
- cleanup();
973
+ const handleScroll = () => {
974
+ afterTick(() => {
975
+ const maxScroll = viewportNode.scrollHeight - viewportNode.clientHeight;
976
+ const paddingTop = Number.parseInt(getComputedStyle(viewportNode).paddingTop, 10);
977
+ this.canScrollDown =
978
+ Math.ceil(viewportNode.scrollTop) < maxScroll - paddingTop;
979
+ });
973
980
  };
981
+ handleScroll();
982
+ return on(viewportNode, "scroll", handleScroll);
974
983
  });
975
984
  $effect(() => {
976
- if (this.state.mounted.current) {
977
- this.state.alignedPositionState?.handleScrollButtonChange(this.state.id.current);
978
- }
979
- });
980
- $effect(() => {
981
- if (!this.state.mounted.current) {
982
- this.state.clearAutoScrollTimer();
983
- }
985
+ if (this.state.mounted.current)
986
+ return;
987
+ this.state.clearAutoScrollTimer();
984
988
  });
985
989
  }
986
990
  handleAutoScroll = () => {
987
991
  afterTick(() => {
988
992
  const viewport = this.content.viewportNode;
989
- const selectedItem = this.content.getSelectedItem().selectedItemNode;
990
- if (!viewport || !selectedItem) {
993
+ const selectedItem = this.root.highlightedNode;
994
+ if (!viewport || !selectedItem)
991
995
  return;
992
- }
993
996
  viewport.scrollTop = viewport.scrollTop + selectedItem.offsetHeight;
994
997
  });
995
998
  };
996
- props = $derived.by(() => ({ ...this.state.props, [SCROLL_DOWN_BUTTON_ATTR]: "" }));
999
+ props = $derived.by(() => ({ ...this.state.props, [this.root.bitsAttrs["scroll-down-button"]]: "" }));
997
1000
  }
998
1001
  class SelectScrollUpButtonState {
999
1002
  state;
1000
1003
  content;
1004
+ root;
1001
1005
  canScrollUp = $state(false);
1002
1006
  constructor(state) {
1003
1007
  this.state = state;
1004
1008
  this.content = state.content;
1009
+ this.root = state.root;
1005
1010
  this.state.onAutoScroll = this.handleAutoScroll;
1006
- $effect(() => {
1007
- let cleanup = noop;
1008
- cleanup();
1009
- const viewport = this.content.viewportNode;
1010
- const isPositioned = this.content.isPositioned.current;
1011
- if (!viewport || !isPositioned)
1011
+ watch([() => this.content.viewportNode, () => this.content.isPositioned], ([viewportNode, isPositioned]) => {
1012
+ if (!viewportNode || !isPositioned)
1012
1013
  return;
1013
1014
  const handleScroll = () => {
1014
- this.canScrollUp = viewport.scrollTop > 0;
1015
+ const paddingTop = Number.parseInt(getComputedStyle(viewportNode).paddingTop, 10);
1016
+ this.canScrollUp = viewportNode.scrollTop - paddingTop > 0;
1015
1017
  };
1016
1018
  handleScroll();
1017
- cleanup = addEventListener(viewport, "scroll", handleScroll);
1018
- return () => {
1019
- cleanup();
1020
- };
1021
- });
1022
- $effect(() => {
1023
- if (this.state.mounted.current) {
1024
- this.state.alignedPositionState?.handleScrollButtonChange(this.state.id.current);
1025
- }
1019
+ return on(viewportNode, "scroll", handleScroll);
1026
1020
  });
1027
1021
  $effect(() => {
1028
- if (!this.state.mounted.current) {
1029
- this.state.clearAutoScrollTimer();
1030
- }
1022
+ if (this.state.mounted.current)
1023
+ return;
1024
+ this.state.clearAutoScrollTimer();
1031
1025
  });
1032
1026
  }
1033
1027
  handleAutoScroll = () => {
1034
1028
  afterTick(() => {
1035
1029
  const viewport = this.content.viewportNode;
1036
- const selectedItem = this.content.getSelectedItem().selectedItemNode;
1030
+ const selectedItem = this.root.highlightedNode;
1037
1031
  if (!viewport || !selectedItem)
1038
1032
  return;
1039
1033
  viewport.scrollTop = viewport.scrollTop - selectedItem.offsetHeight;
1040
1034
  });
1041
1035
  };
1042
- props = $derived.by(() => ({ ...this.state.props, [SCROLL_UP_BUTTON_ATTR]: "" }));
1043
- }
1044
- class SelectGroupState {
1045
- #id;
1046
- #ref;
1047
- labelNode = $state(null);
1048
- constructor(props) {
1049
- this.#id = props.id;
1050
- this.#ref = props.ref;
1051
- useRefById({
1052
- id: this.#id,
1053
- ref: this.#ref,
1054
- });
1055
- }
1056
- props = $derived.by(() => ({
1057
- id: this.#id.current,
1058
- role: "group",
1059
- "aria-labelledby": this.labelNode?.id ?? undefined,
1060
- [GROUP_ATTR]: "",
1061
- }));
1062
- createGroupHeading(props) {
1063
- return new SelectGroupHeading(props, this);
1064
- }
1065
- }
1066
- class SelectGroupHeading {
1067
- #id;
1068
- #ref;
1069
- group;
1070
- constructor(props, group) {
1071
- this.#ref = props.ref;
1072
- this.#id = props.id;
1073
- this.group = group;
1074
- useRefById({
1075
- id: this.#id,
1076
- ref: this.#ref,
1077
- onRefChange: (node) => {
1078
- this.group.labelNode = node;
1079
- },
1080
- });
1081
- }
1082
- props = $derived.by(() => ({
1083
- id: this.#id.current,
1084
- [GROUP_LABEL_ATTR]: "",
1085
- }));
1086
- }
1087
- class SelectSeparatorState {
1088
- #id;
1089
- #ref;
1090
- constructor(props) {
1091
- this.#id = props.id;
1092
- this.#ref = props.ref;
1093
- useRefById({
1094
- id: this.#id,
1095
- ref: this.#ref,
1096
- });
1097
- }
1098
- props = $derived.by(() => ({
1099
- id: this.#id.current,
1100
- [SEPARATOR_ATTR]: "",
1101
- "aria-hidden": getAriaHidden(true),
1102
- }));
1103
- }
1104
- class SelectArrowState {
1105
- #id;
1106
- #ref;
1107
- constructor(props) {
1108
- this.#id = props.id;
1109
- this.#ref = props.ref;
1110
- useRefById({
1111
- id: this.#id,
1112
- ref: this.#ref,
1113
- });
1114
- }
1115
- props = $derived.by(() => ({
1116
- id: this.#id.current,
1117
- [ARROW_ATTR]: "",
1118
- "aria-hidden": getAriaHidden(true),
1119
- }));
1120
- }
1121
- class SelectIconState {
1122
- #id;
1123
- #ref;
1124
- constructor(props) {
1125
- this.#id = props.id;
1126
- this.#ref = props.ref;
1127
- useRefById({
1128
- id: this.#id,
1129
- ref: this.#ref,
1130
- });
1131
- }
1132
- props = $derived.by(() => ({
1133
- id: this.#id.current,
1134
- [ICON_ATTR]: "",
1135
- "aria-hidden": getAriaHidden(true),
1136
- }));
1036
+ props = $derived.by(() => ({ ...this.state.props, [this.root.bitsAttrs["scroll-up-button"]]: "" }));
1137
1037
  }
1038
+ const SelectRootContext = new Context("Select.Root | Combobox.Root");
1039
+ const SelectGroupContext = new Context("Select.Group | Combobox.Group");
1040
+ const SelectContentContext = new Context("Select.Content | Combobox.Content");
1138
1041
  export function useSelectRoot(props) {
1139
- return setSelectRootContext(new SelectRootState(props));
1042
+ const { type, ...rest } = props;
1043
+ const rootState = type === "single"
1044
+ ? new SelectSingleRootState(rest)
1045
+ : new SelectMultipleRootState(rest);
1046
+ return SelectRootContext.set(rootState);
1140
1047
  }
1141
- export function useSelectContentFrag() {
1142
- return getSelectRootContext().createContent();
1048
+ export function useSelectInput(props) {
1049
+ return new SelectInputState(props, SelectRootContext.get());
1143
1050
  }
1144
1051
  export function useSelectContent(props) {
1145
- return setSelectContentContext(getSelectRootContext().createContentImpl(props));
1146
- }
1147
- export function useSelectItemAlignedPosition(props) {
1148
- const contentContext = getSelectContentContext();
1149
- const alignedPositionState = contentContext.createItemAlignedPosition(props);
1150
- contentContext.alignedPositionState = alignedPositionState;
1151
- return setSelectContentItemAlignedContext(alignedPositionState);
1152
- }
1153
- export function useSelectFloatingPosition() {
1154
- return getSelectContentContext().createFloatingPosition();
1052
+ return SelectContentContext.set(new SelectContentState(props, SelectRootContext.get()));
1155
1053
  }
1156
1054
  export function useSelectTrigger(props) {
1157
- return getSelectRootContext().createTrigger(props);
1055
+ return new SelectTriggerState(props, SelectRootContext.get());
1158
1056
  }
1159
- export function useSelectValue() {
1160
- return getSelectRootContext().createValue();
1057
+ export function useSelectComboTrigger(props) {
1058
+ return new SelectComboTriggerState(props, SelectRootContext.get());
1161
1059
  }
1162
1060
  export function useSelectItem(props) {
1163
- return setSelectItemContext(getSelectContentContext().createItem(props));
1164
- }
1165
- export function useSelectItemText(props) {
1166
- return getSelectItemContext().createText(props);
1061
+ return new SelectItemState(props, SelectRootContext.get());
1167
1062
  }
1168
1063
  export function useSelectViewport(props) {
1169
- return getSelectContentContext().createViewport(props);
1064
+ return new SelectViewportState(props, SelectContentContext.get());
1170
1065
  }
1171
1066
  export function useSelectScrollUpButton(props) {
1172
- return getSelectContentContext().createScrollUpButton(props);
1067
+ return new SelectScrollUpButtonState(new SelectScrollButtonImplState(props, SelectContentContext.get()));
1173
1068
  }
1174
1069
  export function useSelectScrollDownButton(props) {
1175
- return getSelectContentContext().createScrollDownButton(props);
1070
+ return new SelectScrollDownButtonState(new SelectScrollButtonImplState(props, SelectContentContext.get()));
1176
1071
  }
1177
1072
  export function useSelectGroup(props) {
1178
- return setSelectGroupContext(new SelectGroupState(props));
1073
+ return SelectGroupContext.set(new SelectGroupState(props, SelectRootContext.get()));
1179
1074
  }
1180
1075
  export function useSelectGroupHeading(props) {
1181
- return getSelectGroupContext().createGroupHeading(props);
1182
- }
1183
- export function useSelectArrow(props) {
1184
- return new SelectArrowState(props);
1076
+ return new SelectGroupHeadingState(props, SelectGroupContext.get());
1185
1077
  }
1186
- export function useSelectSeparator(props) {
1187
- return new SelectSeparatorState(props);
1078
+ export function useSelectHiddenInput(props) {
1079
+ return new SelectHiddenInputState(props, SelectRootContext.get());
1188
1080
  }
1189
- export function useSelectIcon(props) {
1190
- return new SelectIconState(props);
1191
- }
1192
- //
1193
- export function shouldShowPlaceholder(value) {
1194
- return value === "" || value === undefined;
1081
+ ////////////////////////////////////
1082
+ // Helpers
1083
+ ////////////////////////////////////
1084
+ const selectParts = [
1085
+ "trigger",
1086
+ "content",
1087
+ "item",
1088
+ "viewport",
1089
+ "scroll-up-button",
1090
+ "scroll-down-button",
1091
+ "group",
1092
+ "group-label",
1093
+ "separator",
1094
+ "arrow",
1095
+ "input",
1096
+ "content-wrapper",
1097
+ "item-text",
1098
+ "value",
1099
+ ];
1100
+ export function getSelectBitsAttrs(root) {
1101
+ const isCombobox = root.isCombobox;
1102
+ const attrObj = {};
1103
+ for (const part of selectParts) {
1104
+ attrObj[part] = isCombobox ? `data-combobox-${part}` : `data-select-${part}`;
1105
+ }
1106
+ return attrObj;
1195
1107
  }