@burtson-labs/ui 0.13.1 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (460) hide show
  1. package/LICENSES/DEPENDENCIES.txt +2745 -0
  2. package/LICENSES/Radix-MIT.txt +21 -0
  3. package/LICENSES/cmdk-MIT.txt +21 -0
  4. package/LICENSES/overrides/react-remove-scroll-bar.txt +26 -0
  5. package/LICENSES/shadcn-MIT.txt +21 -0
  6. package/README.md +20 -12
  7. package/THIRD_PARTY_NOTICES.md +15 -3
  8. package/dist/components/accordion.d.ts +4 -4
  9. package/dist/components/accordion.js +22 -18
  10. package/dist/components/accordion.js.map +1 -1
  11. package/dist/components/alert-dialog.d.ts +13 -11
  12. package/dist/components/alert-dialog.js +41 -31
  13. package/dist/components/alert-dialog.js.map +1 -1
  14. package/dist/components/alert.d.ts +5 -3
  15. package/dist/components/alert.js +12 -7
  16. package/dist/components/alert.js.map +1 -1
  17. package/dist/components/app-shell.d.ts +7 -6
  18. package/dist/components/app-shell.js +22 -14
  19. package/dist/components/app-shell.js.map +1 -1
  20. package/dist/components/attachment.d.ts +3 -3
  21. package/dist/components/attachment.js +11 -7
  22. package/dist/components/attachment.js.map +1 -1
  23. package/dist/components/audio-player.d.ts +2 -2
  24. package/dist/components/audio-player.js +9 -6
  25. package/dist/components/audio-player.js.map +1 -1
  26. package/dist/components/avatar.d.ts +4 -4
  27. package/dist/components/avatar.js +16 -12
  28. package/dist/components/avatar.js.map +1 -1
  29. package/dist/components/badge.d.ts +1 -1
  30. package/dist/components/badge.js +15 -13
  31. package/dist/components/badge.js.map +1 -1
  32. package/dist/components/breadcrumb.d.ts +8 -8
  33. package/dist/components/breadcrumb.js +27 -20
  34. package/dist/components/breadcrumb.js.map +1 -1
  35. package/dist/components/button.d.ts +9 -2
  36. package/dist/components/button.js +15 -6
  37. package/dist/components/button.js.map +1 -1
  38. package/dist/components/card.d.ts +9 -9
  39. package/dist/components/card.js +33 -23
  40. package/dist/components/card.js.map +1 -1
  41. package/dist/components/chat-history.d.ts +1 -1
  42. package/dist/components/chat-history.js +11 -9
  43. package/dist/components/chat-history.js.map +1 -1
  44. package/dist/components/chat-layout.d.ts +1 -1
  45. package/dist/components/chat-layout.js +8 -3
  46. package/dist/components/chat-layout.js.map +1 -1
  47. package/dist/components/checkbox-card.d.ts +3 -3
  48. package/dist/components/checkbox-card.js +12 -10
  49. package/dist/components/checkbox-card.js.map +1 -1
  50. package/dist/components/checkbox.d.ts +24 -3
  51. package/dist/components/checkbox.js +52 -9
  52. package/dist/components/checkbox.js.map +1 -1
  53. package/dist/components/collapsible.d.ts +3 -3
  54. package/dist/components/collapsible.js +14 -11
  55. package/dist/components/collapsible.js.map +1 -1
  56. package/dist/components/combobox.d.ts +14 -4
  57. package/dist/components/combobox.js +19 -8
  58. package/dist/components/combobox.js.map +1 -1
  59. package/dist/components/command.d.ts +68 -12
  60. package/dist/components/command.js +48 -34
  61. package/dist/components/command.js.map +1 -1
  62. package/dist/components/composer.d.ts +2 -2
  63. package/dist/components/composer.js +10 -7
  64. package/dist/components/composer.js.map +1 -1
  65. package/dist/components/connection-status.d.ts +3 -3
  66. package/dist/components/connection-status.js +19 -14
  67. package/dist/components/connection-status.js.map +1 -1
  68. package/dist/components/context-menu.d.ts +15 -14
  69. package/dist/components/context-menu.js +52 -41
  70. package/dist/components/context-menu.js.map +1 -1
  71. package/dist/components/conversation.d.ts +1 -1
  72. package/dist/components/conversation.js +7 -5
  73. package/dist/components/conversation.js.map +1 -1
  74. package/dist/components/copy-button.d.ts +1 -1
  75. package/dist/components/copy-button.js +4 -2
  76. package/dist/components/copy-button.js.map +1 -1
  77. package/dist/components/data-table.d.ts +7 -2
  78. package/dist/components/data-table.js +17 -42
  79. package/dist/components/data-table.js.map +1 -1
  80. package/dist/components/dialog.d.ts +19 -10
  81. package/dist/components/dialog.js +50 -33
  82. package/dist/components/dialog.js.map +1 -1
  83. package/dist/components/dropdown-menu.d.ts +15 -14
  84. package/dist/components/dropdown-menu.js +52 -41
  85. package/dist/components/dropdown-menu.js.map +1 -1
  86. package/dist/components/editor-tabs.d.ts +1 -1
  87. package/dist/components/editor-tabs.js +7 -5
  88. package/dist/components/editor-tabs.js.map +1 -1
  89. package/dist/components/empty-state.d.ts +5 -5
  90. package/dist/components/empty-state.js +17 -11
  91. package/dist/components/empty-state.js.map +1 -1
  92. package/dist/components/error-summary.d.ts +21 -0
  93. package/dist/components/error-summary.js +62 -0
  94. package/dist/components/error-summary.js.map +1 -0
  95. package/dist/components/field.d.ts +66 -7
  96. package/dist/components/field.js +152 -20
  97. package/dist/components/field.js.map +1 -1
  98. package/dist/components/form-actions.d.ts +18 -0
  99. package/dist/components/form-actions.js +30 -0
  100. package/dist/components/form-actions.js.map +1 -0
  101. package/dist/components/icon-button.d.ts +3 -1
  102. package/dist/components/icon-button.js +6 -3
  103. package/dist/components/icon-button.js.map +1 -1
  104. package/dist/components/input.d.ts +42 -7
  105. package/dist/components/input.js +54 -10
  106. package/dist/components/input.js.map +1 -1
  107. package/dist/components/kbd.d.ts +2 -2
  108. package/dist/components/kbd.js +8 -5
  109. package/dist/components/kbd.js.map +1 -1
  110. package/dist/components/label.d.ts +7 -2
  111. package/dist/components/label.js +14 -7
  112. package/dist/components/label.js.map +1 -1
  113. package/dist/components/markdown.d.ts +4 -3
  114. package/dist/components/markdown.js +8 -6
  115. package/dist/components/markdown.js.map +1 -1
  116. package/dist/components/menubar.d.ts +17 -15
  117. package/dist/components/menubar.js +58 -45
  118. package/dist/components/menubar.js.map +1 -1
  119. package/dist/components/message-actions.d.ts +3 -3
  120. package/dist/components/message-actions.js +16 -12
  121. package/dist/components/message-actions.js.map +1 -1
  122. package/dist/components/message.d.ts +1 -1
  123. package/dist/components/message.js +6 -3
  124. package/dist/components/message.js.map +1 -1
  125. package/dist/components/mobile-nav.d.ts +1 -1
  126. package/dist/components/mobile-nav.js +7 -5
  127. package/dist/components/mobile-nav.js.map +1 -1
  128. package/dist/components/native-select.d.ts +16 -0
  129. package/dist/components/native-select.js +33 -0
  130. package/dist/components/native-select.js.map +1 -0
  131. package/dist/components/navigation-menu.d.ts +13 -12
  132. package/dist/components/navigation-menu.js +43 -33
  133. package/dist/components/navigation-menu.js.map +1 -1
  134. package/dist/components/number-input.d.ts +23 -0
  135. package/dist/components/number-input.js +45 -0
  136. package/dist/components/number-input.js.map +1 -0
  137. package/dist/components/onboarding-checklist.d.ts +1 -1
  138. package/dist/components/onboarding-checklist.js +5 -3
  139. package/dist/components/onboarding-checklist.js.map +1 -1
  140. package/dist/components/page-header.d.ts +7 -6
  141. package/dist/components/page-header.js +23 -15
  142. package/dist/components/page-header.js.map +1 -1
  143. package/dist/components/pagination.d.ts +1 -1
  144. package/dist/components/pagination.js +4 -2
  145. package/dist/components/pagination.js.map +1 -1
  146. package/dist/components/popover.d.ts +14 -11
  147. package/dist/components/popover.js +30 -23
  148. package/dist/components/popover.js.map +1 -1
  149. package/dist/components/progress.d.ts +2 -2
  150. package/dist/components/progress.js +11 -9
  151. package/dist/components/progress.js.map +1 -1
  152. package/dist/components/radio-group.d.ts +23 -4
  153. package/dist/components/radio-group.js +56 -14
  154. package/dist/components/radio-group.js.map +1 -1
  155. package/dist/components/reasoning.d.ts +3 -3
  156. package/dist/components/reasoning.js +14 -11
  157. package/dist/components/reasoning.js.map +1 -1
  158. package/dist/components/resizable.js +1 -0
  159. package/dist/components/resizable.js.map +1 -1
  160. package/dist/components/scroll-area.d.ts +4 -3
  161. package/dist/components/scroll-area.js +18 -14
  162. package/dist/components/scroll-area.js.map +1 -1
  163. package/dist/components/secret-input.d.ts +3 -2
  164. package/dist/components/secret-input.js +7 -4
  165. package/dist/components/secret-input.js.map +1 -1
  166. package/dist/components/select.d.ts +12 -7
  167. package/dist/components/select.js +42 -35
  168. package/dist/components/select.js.map +1 -1
  169. package/dist/components/separator.d.ts +2 -2
  170. package/dist/components/separator.js +8 -6
  171. package/dist/components/separator.js.map +1 -1
  172. package/dist/components/sheet.d.ts +11 -9
  173. package/dist/components/sheet.js +41 -29
  174. package/dist/components/sheet.js.map +1 -1
  175. package/dist/components/skeleton.d.ts +2 -1
  176. package/dist/components/skeleton.js +7 -4
  177. package/dist/components/skeleton.js.map +1 -1
  178. package/dist/components/slider.d.ts +10 -6
  179. package/dist/components/slider.js +16 -7
  180. package/dist/components/slider.js.map +1 -1
  181. package/dist/components/source.d.ts +2 -2
  182. package/dist/components/source.js +10 -7
  183. package/dist/components/source.js.map +1 -1
  184. package/dist/components/spinner.d.ts +4 -2
  185. package/dist/components/spinner.js +5 -3
  186. package/dist/components/spinner.js.map +1 -1
  187. package/dist/components/stat-card.d.ts +27 -2
  188. package/dist/components/stat-card.js +70 -9
  189. package/dist/components/stat-card.js.map +1 -1
  190. package/dist/components/status.d.ts +7 -6
  191. package/dist/components/status.js +12 -5
  192. package/dist/components/status.js.map +1 -1
  193. package/dist/components/steps.d.ts +1 -1
  194. package/dist/components/steps.js +5 -3
  195. package/dist/components/steps.js.map +1 -1
  196. package/dist/components/switch.d.ts +47 -3
  197. package/dist/components/switch.js +89 -11
  198. package/dist/components/switch.js.map +1 -1
  199. package/dist/components/table.d.ts +29 -12
  200. package/dist/components/table.js +80 -34
  201. package/dist/components/table.js.map +1 -1
  202. package/dist/components/tabs.d.ts +10 -5
  203. package/dist/components/tabs.js +29 -19
  204. package/dist/components/tabs.js.map +1 -1
  205. package/dist/components/textarea.d.ts +6 -1
  206. package/dist/components/textarea.js +4 -3
  207. package/dist/components/textarea.js.map +1 -1
  208. package/dist/components/toast.d.ts +11 -7
  209. package/dist/components/toast.js +37 -27
  210. package/dist/components/toast.js.map +1 -1
  211. package/dist/components/toaster.d.ts +4 -2
  212. package/dist/components/toaster.js +7 -2
  213. package/dist/components/toaster.js.map +1 -1
  214. package/dist/components/tool-call.d.ts +2 -2
  215. package/dist/components/tool-call.js +15 -12
  216. package/dist/components/tool-call.js.map +1 -1
  217. package/dist/components/toolbar.d.ts +9 -4
  218. package/dist/components/toolbar.js +15 -9
  219. package/dist/components/toolbar.js.map +1 -1
  220. package/dist/components/tooltip.d.ts +4 -3
  221. package/dist/components/tooltip.js +17 -13
  222. package/dist/components/tooltip.js.map +1 -1
  223. package/dist/components/tour.js +10 -8
  224. package/dist/components/tour.js.map +1 -1
  225. package/dist/components/tree-view.d.ts +1 -1
  226. package/dist/components/tree-view.js +10 -5
  227. package/dist/components/tree-view.js.map +1 -1
  228. package/dist/components/voice-recorder.d.ts +1 -1
  229. package/dist/components/voice-recorder.js +5 -2
  230. package/dist/components/voice-recorder.js.map +1 -1
  231. package/dist/index.d.ts +6 -1
  232. package/dist/index.js +17 -12
  233. package/dist/lib/media.d.ts +18 -0
  234. package/dist/lib/media.js +34 -0
  235. package/dist/lib/media.js.map +1 -0
  236. package/dist/lib/utils.d.ts +32 -0
  237. package/dist/lib/utils.js +33 -1
  238. package/dist/lib/utils.js.map +1 -1
  239. package/dist/mui/index.js +20 -8
  240. package/dist/mui/index.js.map +1 -1
  241. package/dist/primitives/vendor/cmdk/command-score.d.ts +1 -0
  242. package/dist/primitives/vendor/cmdk/command-score.js +64 -0
  243. package/dist/primitives/vendor/cmdk/command-score.js.map +1 -0
  244. package/dist/primitives/vendor/cmdk/index.d.ts +384 -0
  245. package/dist/primitives/vendor/cmdk/index.js +687 -0
  246. package/dist/primitives/vendor/cmdk/index.js.map +1 -0
  247. package/dist/primitives/vendor/radix/number/index.d.ts +1 -0
  248. package/dist/primitives/vendor/radix/number/number.d.ts +2 -0
  249. package/dist/primitives/vendor/radix/number/number.js +9 -0
  250. package/dist/primitives/vendor/radix/number/number.js.map +1 -0
  251. package/dist/primitives/vendor/radix/primitive/index.d.ts +2 -0
  252. package/dist/primitives/vendor/radix/primitive/is-development.d.ts +1 -0
  253. package/dist/primitives/vendor/radix/primitive/is-development.js +7 -0
  254. package/dist/primitives/vendor/radix/primitive/is-development.js.map +1 -0
  255. package/dist/primitives/vendor/radix/primitive/primitive.d.ts +14 -0
  256. package/dist/primitives/vendor/radix/primitive/primitive.js +12 -0
  257. package/dist/primitives/vendor/radix/primitive/primitive.js.map +1 -0
  258. package/dist/primitives/vendor/radix/primitive/types.d.ts +5 -0
  259. package/dist/primitives/vendor/radix/react-accordion/accordion.d.ts +112 -0
  260. package/dist/primitives/vendor/radix/react-accordion/accordion.js +266 -0
  261. package/dist/primitives/vendor/radix/react-accordion/accordion.js.map +1 -0
  262. package/dist/primitives/vendor/radix/react-accordion/index.d.ts +2 -0
  263. package/dist/primitives/vendor/radix/react-alert-dialog/alert-dialog.d.ts +49 -0
  264. package/dist/primitives/vendor/radix/react-alert-dialog/alert-dialog.js +122 -0
  265. package/dist/primitives/vendor/radix/react-alert-dialog/alert-dialog.js.map +1 -0
  266. package/dist/primitives/vendor/radix/react-alert-dialog/index.d.ts +2 -0
  267. package/dist/primitives/vendor/radix/react-arrow/arrow.d.ts +9 -0
  268. package/dist/primitives/vendor/radix/react-arrow/arrow.js +22 -0
  269. package/dist/primitives/vendor/radix/react-arrow/arrow.js.map +1 -0
  270. package/dist/primitives/vendor/radix/react-arrow/index.d.ts +2 -0
  271. package/dist/primitives/vendor/radix/react-avatar/avatar.d.ts +19 -0
  272. package/dist/primitives/vendor/radix/react-avatar/avatar.js +132 -0
  273. package/dist/primitives/vendor/radix/react-avatar/avatar.js.map +1 -0
  274. package/dist/primitives/vendor/radix/react-avatar/index.d.ts +2 -0
  275. package/dist/primitives/vendor/radix/react-checkbox/checkbox.d.ts +47 -0
  276. package/dist/primitives/vendor/radix/react-checkbox/checkbox.js +197 -0
  277. package/dist/primitives/vendor/radix/react-checkbox/checkbox.js.map +1 -0
  278. package/dist/primitives/vendor/radix/react-checkbox/index.d.ts +2 -0
  279. package/dist/primitives/vendor/radix/react-collapsible/collapsible.d.ts +31 -0
  280. package/dist/primitives/vendor/radix/react-collapsible/collapsible.js +133 -0
  281. package/dist/primitives/vendor/radix/react-collapsible/collapsible.js.map +1 -0
  282. package/dist/primitives/vendor/radix/react-collapsible/index.d.ts +2 -0
  283. package/dist/primitives/vendor/radix/react-collection/collection-legacy.d.ts +21 -0
  284. package/dist/primitives/vendor/radix/react-collection/collection-legacy.js +84 -0
  285. package/dist/primitives/vendor/radix/react-collection/collection-legacy.js.map +1 -0
  286. package/dist/primitives/vendor/radix/react-collection/collection.d.ts +32 -0
  287. package/dist/primitives/vendor/radix/react-collection/index.d.ts +4 -0
  288. package/dist/primitives/vendor/radix/react-collection/ordered-dictionary.d.ts +51 -0
  289. package/dist/primitives/vendor/radix/react-compose-refs/compose-refs.d.ts +13 -0
  290. package/dist/primitives/vendor/radix/react-compose-refs/compose-refs.js +43 -0
  291. package/dist/primitives/vendor/radix/react-compose-refs/compose-refs.js.map +1 -0
  292. package/dist/primitives/vendor/radix/react-compose-refs/index.d.ts +1 -0
  293. package/dist/primitives/vendor/radix/react-context/create-context.d.ts +45 -0
  294. package/dist/primitives/vendor/radix/react-context/create-context.js +74 -0
  295. package/dist/primitives/vendor/radix/react-context/create-context.js.map +1 -0
  296. package/dist/primitives/vendor/radix/react-context/index.d.ts +2 -0
  297. package/dist/primitives/vendor/radix/react-context-menu/context-menu.d.ts +95 -0
  298. package/dist/primitives/vendor/radix/react-context-menu/context-menu.js +279 -0
  299. package/dist/primitives/vendor/radix/react-context-menu/context-menu.js.map +1 -0
  300. package/dist/primitives/vendor/radix/react-context-menu/index.d.ts +2 -0
  301. package/dist/primitives/vendor/radix/react-dialog/dialog.d.ts +97 -0
  302. package/dist/primitives/vendor/radix/react-dialog/dialog.js +262 -0
  303. package/dist/primitives/vendor/radix/react-dialog/dialog.js.map +1 -0
  304. package/dist/primitives/vendor/radix/react-dialog/index.d.ts +4 -0
  305. package/dist/primitives/vendor/radix/react-direction/direction.d.ts +10 -0
  306. package/dist/primitives/vendor/radix/react-direction/direction.js +13 -0
  307. package/dist/primitives/vendor/radix/react-direction/direction.js.map +1 -0
  308. package/dist/primitives/vendor/radix/react-direction/index.d.ts +1 -0
  309. package/dist/primitives/vendor/radix/react-dismissable-layer/dismissable-layer.d.ts +61 -0
  310. package/dist/primitives/vendor/radix/react-dismissable-layer/dismissable-layer.js +336 -0
  311. package/dist/primitives/vendor/radix/react-dismissable-layer/dismissable-layer.js.map +1 -0
  312. package/dist/primitives/vendor/radix/react-dismissable-layer/index.d.ts +4 -0
  313. package/dist/primitives/vendor/radix/react-dropdown-menu/dropdown-menu.d.ts +95 -0
  314. package/dist/primitives/vendor/radix/react-dropdown-menu/dropdown-menu.js +257 -0
  315. package/dist/primitives/vendor/radix/react-dropdown-menu/dropdown-menu.js.map +1 -0
  316. package/dist/primitives/vendor/radix/react-dropdown-menu/index.d.ts +2 -0
  317. package/dist/primitives/vendor/radix/react-focus-guards/focus-guards.d.ts +11 -0
  318. package/dist/primitives/vendor/radix/react-focus-guards/focus-guards.js +49 -0
  319. package/dist/primitives/vendor/radix/react-focus-guards/focus-guards.js.map +1 -0
  320. package/dist/primitives/vendor/radix/react-focus-guards/index.d.ts +1 -0
  321. package/dist/primitives/vendor/radix/react-focus-scope/focus-scope.d.ts +31 -0
  322. package/dist/primitives/vendor/radix/react-focus-scope/focus-scope.js +221 -0
  323. package/dist/primitives/vendor/radix/react-focus-scope/focus-scope.js.map +1 -0
  324. package/dist/primitives/vendor/radix/react-focus-scope/index.d.ts +1 -0
  325. package/dist/primitives/vendor/radix/react-id/id.d.ts +2 -0
  326. package/dist/primitives/vendor/radix/react-id/id.js +17 -0
  327. package/dist/primitives/vendor/radix/react-id/id.js.map +1 -0
  328. package/dist/primitives/vendor/radix/react-id/index.d.ts +1 -0
  329. package/dist/primitives/vendor/radix/react-label/index.d.ts +2 -0
  330. package/dist/primitives/vendor/radix/react-label/label.d.ts +9 -0
  331. package/dist/primitives/vendor/radix/react-label/label.js +21 -0
  332. package/dist/primitives/vendor/radix/react-label/label.js.map +1 -0
  333. package/dist/primitives/vendor/radix/react-menu/index.d.ts +2 -0
  334. package/dist/primitives/vendor/radix/react-menu/menu.d.ts +173 -0
  335. package/dist/primitives/vendor/radix/react-menu/menu.js +806 -0
  336. package/dist/primitives/vendor/radix/react-menu/menu.js.map +1 -0
  337. package/dist/primitives/vendor/radix/react-menubar/index.d.ts +2 -0
  338. package/dist/primitives/vendor/radix/react-menubar/menubar.d.ts +106 -0
  339. package/dist/primitives/vendor/radix/react-menubar/menubar.js +377 -0
  340. package/dist/primitives/vendor/radix/react-menubar/menubar.js.map +1 -0
  341. package/dist/primitives/vendor/radix/react-navigation-menu/index.d.ts +2 -0
  342. package/dist/primitives/vendor/radix/react-navigation-menu/navigation-menu.d.ts +124 -0
  343. package/dist/primitives/vendor/radix/react-navigation-menu/navigation-menu.js +743 -0
  344. package/dist/primitives/vendor/radix/react-navigation-menu/navigation-menu.js.map +1 -0
  345. package/dist/primitives/vendor/radix/react-popover/index.d.ts +1 -0
  346. package/dist/primitives/vendor/radix/react-popover/popover.d.ts +83 -0
  347. package/dist/primitives/vendor/radix/react-popover/popover.js +236 -0
  348. package/dist/primitives/vendor/radix/react-popover/popover.js.map +1 -0
  349. package/dist/primitives/vendor/radix/react-popper/index.d.ts +2 -0
  350. package/dist/primitives/vendor/radix/react-popper/popper.d.ts +44 -0
  351. package/dist/primitives/vendor/radix/react-popper/popper.js +276 -0
  352. package/dist/primitives/vendor/radix/react-popper/popper.js.map +1 -0
  353. package/dist/primitives/vendor/radix/react-portal/index.d.ts +2 -0
  354. package/dist/primitives/vendor/radix/react-portal/portal.d.ts +13 -0
  355. package/dist/primitives/vendor/radix/react-portal/portal.js +21 -0
  356. package/dist/primitives/vendor/radix/react-portal/portal.js.map +1 -0
  357. package/dist/primitives/vendor/radix/react-presence/index.d.ts +2 -0
  358. package/dist/primitives/vendor/radix/react-presence/presence.d.ts +11 -0
  359. package/dist/primitives/vendor/radix/react-presence/presence.js +152 -0
  360. package/dist/primitives/vendor/radix/react-presence/presence.js.map +1 -0
  361. package/dist/primitives/vendor/radix/react-presence/use-state-machine.d.ts +10 -0
  362. package/dist/primitives/vendor/radix/react-presence/use-state-machine.js +12 -0
  363. package/dist/primitives/vendor/radix/react-presence/use-state-machine.js.map +1 -0
  364. package/dist/primitives/vendor/radix/react-primitive/index.d.ts +2 -0
  365. package/dist/primitives/vendor/radix/react-primitive/primitive.d.ts +56 -0
  366. package/dist/primitives/vendor/radix/react-primitive/primitive.js +84 -0
  367. package/dist/primitives/vendor/radix/react-primitive/primitive.js.map +1 -0
  368. package/dist/primitives/vendor/radix/react-progress/index.d.ts +2 -0
  369. package/dist/primitives/vendor/radix/react-progress/progress.d.ts +17 -0
  370. package/dist/primitives/vendor/radix/react-progress/progress.js +79 -0
  371. package/dist/primitives/vendor/radix/react-progress/progress.js.map +1 -0
  372. package/dist/primitives/vendor/radix/react-radio-group/index.d.ts +2 -0
  373. package/dist/primitives/vendor/radix/react-radio-group/radio-group.d.ts +55 -0
  374. package/dist/primitives/vendor/radix/react-radio-group/radio-group.js +173 -0
  375. package/dist/primitives/vendor/radix/react-radio-group/radio-group.js.map +1 -0
  376. package/dist/primitives/vendor/radix/react-radio-group/radio.d.ts +62 -0
  377. package/dist/primitives/vendor/radix/react-radio-group/radio.js +150 -0
  378. package/dist/primitives/vendor/radix/react-radio-group/radio.js.map +1 -0
  379. package/dist/primitives/vendor/radix/react-roving-focus/index.d.ts +2 -0
  380. package/dist/primitives/vendor/radix/react-roving-focus/roving-focus-group.d.ts +47 -0
  381. package/dist/primitives/vendor/radix/react-roving-focus/roving-focus-group.js +218 -0
  382. package/dist/primitives/vendor/radix/react-roving-focus/roving-focus-group.js.map +1 -0
  383. package/dist/primitives/vendor/radix/react-scroll-area/index.d.ts +2 -0
  384. package/dist/primitives/vendor/radix/react-scroll-area/scroll-area.d.ts +121 -0
  385. package/dist/primitives/vendor/radix/react-scroll-area/scroll-area.js +713 -0
  386. package/dist/primitives/vendor/radix/react-scroll-area/scroll-area.js.map +1 -0
  387. package/dist/primitives/vendor/radix/react-scroll-area/use-state-machine.d.ts +10 -0
  388. package/dist/primitives/vendor/radix/react-scroll-area/use-state-machine.js +12 -0
  389. package/dist/primitives/vendor/radix/react-scroll-area/use-state-machine.js.map +1 -0
  390. package/dist/primitives/vendor/radix/react-select/index.d.ts +2 -0
  391. package/dist/primitives/vendor/radix/react-select/select.d.ts +163 -0
  392. package/dist/primitives/vendor/radix/react-select/select.js +1040 -0
  393. package/dist/primitives/vendor/radix/react-select/select.js.map +1 -0
  394. package/dist/primitives/vendor/radix/react-separator/index.d.ts +2 -0
  395. package/dist/primitives/vendor/radix/react-separator/separator.d.ts +20 -0
  396. package/dist/primitives/vendor/radix/react-separator/separator.js +29 -0
  397. package/dist/primitives/vendor/radix/react-separator/separator.js.map +1 -0
  398. package/dist/primitives/vendor/radix/react-slot/index.d.ts +1 -0
  399. package/dist/primitives/vendor/radix/react-slot/slot.d.ts +29 -0
  400. package/dist/primitives/vendor/radix/react-slot/slot.js +107 -0
  401. package/dist/primitives/vendor/radix/react-slot/slot.js.map +1 -0
  402. package/dist/primitives/vendor/radix/react-switch/index.d.ts +2 -0
  403. package/dist/primitives/vendor/radix/react-switch/switch.d.ts +41 -0
  404. package/dist/primitives/vendor/radix/react-switch/switch.js +185 -0
  405. package/dist/primitives/vendor/radix/react-switch/switch.js.map +1 -0
  406. package/dist/primitives/vendor/radix/react-tabs/index.d.ts +2 -0
  407. package/dist/primitives/vendor/radix/react-tabs/tabs.d.ts +54 -0
  408. package/dist/primitives/vendor/radix/react-tabs/tabs.js +145 -0
  409. package/dist/primitives/vendor/radix/react-tabs/tabs.js.map +1 -0
  410. package/dist/primitives/vendor/radix/react-toast/index.d.ts +2 -0
  411. package/dist/primitives/vendor/radix/react-toast/toast.d.ts +125 -0
  412. package/dist/primitives/vendor/radix/react-toast/toast.js +557 -0
  413. package/dist/primitives/vendor/radix/react-toast/toast.js.map +1 -0
  414. package/dist/primitives/vendor/radix/react-tooltip/index.d.ts +2 -0
  415. package/dist/primitives/vendor/radix/react-tooltip/tooltip.d.ts +99 -0
  416. package/dist/primitives/vendor/radix/react-tooltip/tooltip.js +503 -0
  417. package/dist/primitives/vendor/radix/react-tooltip/tooltip.js.map +1 -0
  418. package/dist/primitives/vendor/radix/react-use-callback-ref/index.d.ts +1 -0
  419. package/dist/primitives/vendor/radix/react-use-callback-ref/use-callback-ref.d.ts +6 -0
  420. package/dist/primitives/vendor/radix/react-use-callback-ref/use-callback-ref.js +18 -0
  421. package/dist/primitives/vendor/radix/react-use-callback-ref/use-callback-ref.js.map +1 -0
  422. package/dist/primitives/vendor/radix/react-use-controllable-state/index.d.ts +2 -0
  423. package/dist/primitives/vendor/radix/react-use-controllable-state/use-controllable-state-reducer.d.ts +28 -0
  424. package/dist/primitives/vendor/radix/react-use-controllable-state/use-controllable-state.d.ts +11 -0
  425. package/dist/primitives/vendor/radix/react-use-controllable-state/use-controllable-state.js +59 -0
  426. package/dist/primitives/vendor/radix/react-use-controllable-state/use-controllable-state.js.map +1 -0
  427. package/dist/primitives/vendor/radix/react-use-effect-event/index.d.ts +1 -0
  428. package/dist/primitives/vendor/radix/react-use-effect-event/use-effect-event.d.ts +7 -0
  429. package/dist/primitives/vendor/radix/react-use-is-hydrated/index.d.ts +1 -0
  430. package/dist/primitives/vendor/radix/react-use-is-hydrated/use-is-hydrated-legacy.d.ts +1 -0
  431. package/dist/primitives/vendor/radix/react-use-is-hydrated/use-is-hydrated-legacy.js +18 -0
  432. package/dist/primitives/vendor/radix/react-use-is-hydrated/use-is-hydrated-legacy.js.map +1 -0
  433. package/dist/primitives/vendor/radix/react-use-is-hydrated/use-is-hydrated.d.ts +6 -0
  434. package/dist/primitives/vendor/radix/react-use-is-hydrated/use-is-hydrated.js +19 -0
  435. package/dist/primitives/vendor/radix/react-use-is-hydrated/use-is-hydrated.js.map +1 -0
  436. package/dist/primitives/vendor/radix/react-use-layout-effect/index.d.ts +1 -0
  437. package/dist/primitives/vendor/radix/react-use-layout-effect/use-layout-effect.d.ts +10 -0
  438. package/dist/primitives/vendor/radix/react-use-layout-effect/use-layout-effect.js +15 -0
  439. package/dist/primitives/vendor/radix/react-use-layout-effect/use-layout-effect.js.map +1 -0
  440. package/dist/primitives/vendor/radix/react-use-previous/index.d.ts +1 -0
  441. package/dist/primitives/vendor/radix/react-use-previous/use-previous.d.ts +2 -0
  442. package/dist/primitives/vendor/radix/react-use-previous/use-previous.js +20 -0
  443. package/dist/primitives/vendor/radix/react-use-previous/use-previous.js.map +1 -0
  444. package/dist/primitives/vendor/radix/react-use-size/index.d.ts +1 -0
  445. package/dist/primitives/vendor/radix/react-use-size/use-size.d.ts +5 -0
  446. package/dist/primitives/vendor/radix/react-use-size/use-size.js +42 -0
  447. package/dist/primitives/vendor/radix/react-use-size/use-size.js.map +1 -0
  448. package/dist/primitives/vendor/radix/react-visually-hidden/index.d.ts +2 -0
  449. package/dist/primitives/vendor/radix/react-visually-hidden/visually-hidden.d.ts +21 -0
  450. package/dist/primitives/vendor/radix/react-visually-hidden/visually-hidden.js +32 -0
  451. package/dist/primitives/vendor/radix/react-visually-hidden/visually-hidden.js.map +1 -0
  452. package/dist/primitives/vendor/radix/rect/index.d.ts +2 -0
  453. package/dist/primitives/vendor/radix/rect/observe-element-rect.d.ts +16 -0
  454. package/dist/styles.css +1 -1
  455. package/dist/theme.css +36 -17
  456. package/dist/tokens.d.ts +78 -36
  457. package/dist/tokens.js +63 -32
  458. package/dist/tokens.js.map +1 -1
  459. package/package.json +25 -13
  460. package/vendor-manifest.json +1101 -0
@@ -0,0 +1,1040 @@
1
+ "use client";
2
+ import { createContextScope } from "../react-context/create-context.js";
3
+ import { useComposedRefs } from "../react-compose-refs/compose-refs.js";
4
+ import { createSlot } from "../react-slot/slot.js";
5
+ import { createCollection } from "../react-collection/collection-legacy.js";
6
+ import { composeEventHandlers } from "../primitive/primitive.js";
7
+ import { useLayoutEffect } from "../react-use-layout-effect/use-layout-effect.js";
8
+ import { useControllableState } from "../react-use-controllable-state/use-controllable-state.js";
9
+ import { Primitive } from "../react-primitive/primitive.js";
10
+ import { Presence } from "../react-presence/presence.js";
11
+ import { useId } from "../react-id/id.js";
12
+ import { useDirection } from "../react-direction/direction.js";
13
+ import { useCallbackRef } from "../react-use-callback-ref/use-callback-ref.js";
14
+ import { DismissableLayer } from "../react-dismissable-layer/dismissable-layer.js";
15
+ import { FocusScope } from "../react-focus-scope/focus-scope.js";
16
+ import { Portal } from "../react-portal/portal.js";
17
+ import { useFocusGuards } from "../react-focus-guards/focus-guards.js";
18
+ import { Anchor, Content, Root, createPopperScope } from "../react-popper/popper.js";
19
+ import { VISUALLY_HIDDEN_STYLES } from "../react-visually-hidden/visually-hidden.js";
20
+ import { clamp } from "../number/number.js";
21
+ import { usePrevious } from "../react-use-previous/use-previous.js";
22
+ import * as React from "react";
23
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
24
+ import * as ReactDOM from "react-dom";
25
+ import { RemoveScroll } from "react-remove-scroll";
26
+ import { hideOthers } from "aria-hidden";
27
+ //#region src/primitives/vendor/radix/react-select/select.tsx
28
+ var OPEN_KEYS = [
29
+ " ",
30
+ "Enter",
31
+ "ArrowUp",
32
+ "ArrowDown"
33
+ ];
34
+ var SELECTION_KEYS = [" ", "Enter"];
35
+ var SELECT_NAME = "Select";
36
+ var [Collection, useCollection, createCollectionScope] = createCollection(SELECT_NAME);
37
+ var [createSelectContext, createSelectScope] = createContextScope(SELECT_NAME, [createCollectionScope, createPopperScope]);
38
+ var usePopperScope = createPopperScope();
39
+ var [SelectProviderImpl, useSelectContext] = createSelectContext(SELECT_NAME);
40
+ var [SelectNativeOptionsProvider, useSelectNativeOptionsContext] = createSelectContext(SELECT_NAME);
41
+ function SelectProvider(props) {
42
+ const { __scopeSelect, children, open: openProp, defaultOpen, onOpenChange, value: valueProp, defaultValue, onValueChange, dir, name, autoComplete, disabled, required, form, internal_do_not_use_render } = props;
43
+ const popperScope = usePopperScope(__scopeSelect);
44
+ const [trigger, setTrigger] = React.useState(null);
45
+ const [valueNode, setValueNode] = React.useState(null);
46
+ const [valueNodeHasChildren, setValueNodeHasChildren] = React.useState(false);
47
+ const direction = useDirection(dir);
48
+ const [open, setOpen] = useControllableState({
49
+ prop: openProp,
50
+ defaultProp: defaultOpen ?? false,
51
+ onChange: onOpenChange,
52
+ caller: SELECT_NAME
53
+ });
54
+ const [value, setValue] = useControllableState({
55
+ prop: valueProp,
56
+ defaultProp: defaultValue,
57
+ onChange: onValueChange,
58
+ caller: SELECT_NAME
59
+ });
60
+ const triggerPointerDownPosRef = React.useRef(null);
61
+ const initialValueRef = React.useRef(value);
62
+ React.useEffect(() => {
63
+ const associatedForm = form ? trigger?.ownerDocument.getElementById(form) : trigger?.form;
64
+ if (associatedForm instanceof HTMLFormElement) {
65
+ const reset = () => setValue(initialValueRef.current);
66
+ associatedForm.addEventListener("reset", reset);
67
+ return () => associatedForm.removeEventListener("reset", reset);
68
+ }
69
+ }, [
70
+ form,
71
+ trigger,
72
+ setValue
73
+ ]);
74
+ const isFormControl = trigger ? !!form || !!trigger.closest("form") : true;
75
+ const [nativeOptionsSet, setNativeOptionsSet] = React.useState(/* @__PURE__ */ new Set());
76
+ const contentId = useId();
77
+ const nativeSelectKey = Array.from(nativeOptionsSet).map((option) => option.props.value).join(";");
78
+ const handleNativeOptionAdd = React.useCallback((option) => {
79
+ setNativeOptionsSet((prev) => new Set(prev).add(option));
80
+ }, []);
81
+ const handleNativeOptionRemove = React.useCallback((option) => {
82
+ setNativeOptionsSet((prev) => {
83
+ const optionsSet = new Set(prev);
84
+ optionsSet.delete(option);
85
+ return optionsSet;
86
+ });
87
+ }, []);
88
+ const context = {
89
+ required,
90
+ trigger,
91
+ onTriggerChange: setTrigger,
92
+ valueNode,
93
+ onValueNodeChange: setValueNode,
94
+ valueNodeHasChildren,
95
+ onValueNodeHasChildrenChange: setValueNodeHasChildren,
96
+ contentId,
97
+ value,
98
+ onValueChange: setValue,
99
+ open,
100
+ onOpenChange: setOpen,
101
+ dir: direction,
102
+ triggerPointerDownPosRef,
103
+ disabled,
104
+ name,
105
+ autoComplete,
106
+ form,
107
+ nativeOptions: nativeOptionsSet,
108
+ nativeSelectKey,
109
+ isFormControl
110
+ };
111
+ return /* @__PURE__ */ jsx(Root, {
112
+ ...popperScope,
113
+ children: /* @__PURE__ */ jsx(SelectProviderImpl, {
114
+ scope: __scopeSelect,
115
+ ...context,
116
+ children: /* @__PURE__ */ jsx(Collection.Provider, {
117
+ scope: __scopeSelect,
118
+ children: /* @__PURE__ */ jsx(SelectNativeOptionsProvider, {
119
+ scope: __scopeSelect,
120
+ onNativeOptionAdd: handleNativeOptionAdd,
121
+ onNativeOptionRemove: handleNativeOptionRemove,
122
+ children: isFunction(internal_do_not_use_render) ? internal_do_not_use_render(context) : children
123
+ })
124
+ })
125
+ })
126
+ });
127
+ }
128
+ var Select = (props) => {
129
+ const { __scopeSelect, children, ...providerProps } = props;
130
+ return /* @__PURE__ */ jsx(SelectProvider, {
131
+ __scopeSelect,
132
+ ...providerProps,
133
+ internal_do_not_use_render: ({ isFormControl }) => /* @__PURE__ */ jsxs(Fragment, { children: [children, isFormControl ? /* @__PURE__ */ jsx(SelectBubbleInput, { __scopeSelect }) : null] })
134
+ });
135
+ };
136
+ var TRIGGER_NAME = "SelectTrigger";
137
+ var SelectTrigger = /* @__PURE__ */ React.forwardRef(function SelectTrigger(props, forwardedRef) {
138
+ const { __scopeSelect, disabled = false, ...triggerProps } = props;
139
+ const popperScope = usePopperScope(__scopeSelect);
140
+ const context = useSelectContext(TRIGGER_NAME, __scopeSelect);
141
+ const isDisabled = context.disabled || disabled;
142
+ const composedRefs = useComposedRefs(forwardedRef, context.onTriggerChange);
143
+ const getItems = useCollection(__scopeSelect);
144
+ const pointerTypeRef = React.useRef("touch");
145
+ const [searchRef, handleTypeaheadSearch, resetTypeahead] = useTypeaheadSearch((search) => {
146
+ const enabledItems = getItems().filter((item) => !item.disabled);
147
+ const nextItem = findNextItem(enabledItems, search, enabledItems.find((item) => item.value === context.value));
148
+ if (nextItem !== void 0) context.onValueChange(nextItem.value);
149
+ });
150
+ const handleOpen = (pointerEvent) => {
151
+ if (!isDisabled) {
152
+ context.onOpenChange(true);
153
+ resetTypeahead();
154
+ }
155
+ if (pointerEvent) context.triggerPointerDownPosRef.current = {
156
+ x: Math.round(pointerEvent.pageX),
157
+ y: Math.round(pointerEvent.pageY)
158
+ };
159
+ };
160
+ return /* @__PURE__ */ jsx(Anchor, {
161
+ asChild: true,
162
+ ...popperScope,
163
+ children: /* @__PURE__ */ jsx(Primitive.button, {
164
+ type: "button",
165
+ role: "combobox",
166
+ "aria-controls": context.open ? context.contentId : void 0,
167
+ "aria-expanded": context.open,
168
+ "aria-required": context.required,
169
+ "aria-autocomplete": "none",
170
+ dir: context.dir,
171
+ "data-state": context.open ? "open" : "closed",
172
+ disabled: isDisabled,
173
+ "data-disabled": isDisabled ? "" : void 0,
174
+ "data-placeholder": shouldShowPlaceholder(context.value) ? "" : void 0,
175
+ ...triggerProps,
176
+ ref: composedRefs,
177
+ onClick: composeEventHandlers(triggerProps.onClick, (event) => {
178
+ event.currentTarget.focus();
179
+ if (pointerTypeRef.current !== "mouse") handleOpen(event);
180
+ }),
181
+ onPointerDown: composeEventHandlers(triggerProps.onPointerDown, (event) => {
182
+ pointerTypeRef.current = event.pointerType;
183
+ const target = event.target;
184
+ if (target.hasPointerCapture(event.pointerId)) target.releasePointerCapture(event.pointerId);
185
+ if (event.button === 0 && event.ctrlKey === false && event.pointerType === "mouse") {
186
+ handleOpen(event);
187
+ event.preventDefault();
188
+ }
189
+ }),
190
+ onKeyDown: composeEventHandlers(triggerProps.onKeyDown, (event) => {
191
+ const isTypingAhead = searchRef.current !== "";
192
+ if (!(event.ctrlKey || event.altKey || event.metaKey) && event.key.length === 1) handleTypeaheadSearch(event.key);
193
+ if (isTypingAhead && event.key === " ") return;
194
+ if (OPEN_KEYS.includes(event.key)) {
195
+ handleOpen();
196
+ event.preventDefault();
197
+ }
198
+ })
199
+ })
200
+ });
201
+ });
202
+ var VALUE_NAME = "SelectValue";
203
+ var SelectValue = /* @__PURE__ */ React.forwardRef(function SelectValue(props, forwardedRef) {
204
+ const { __scopeSelect, className, style, children, placeholder = "", ...valueProps } = props;
205
+ const context = useSelectContext(VALUE_NAME, __scopeSelect);
206
+ const { onValueNodeHasChildrenChange } = context;
207
+ const hasChildren = children !== void 0;
208
+ const composedRefs = useComposedRefs(forwardedRef, context.onValueNodeChange);
209
+ useLayoutEffect(() => {
210
+ onValueNodeHasChildrenChange(hasChildren);
211
+ }, [onValueNodeHasChildrenChange, hasChildren]);
212
+ const showPlaceholder = shouldShowPlaceholder(context.value);
213
+ return /* @__PURE__ */ jsx(Primitive.span, {
214
+ ...valueProps,
215
+ asChild: showPlaceholder ? false : valueProps.asChild,
216
+ ref: composedRefs,
217
+ style: { pointerEvents: "none" },
218
+ children: /* @__PURE__ */ jsx(React.Fragment, { children: showPlaceholder ? placeholder : children }, showPlaceholder ? "placeholder" : "value")
219
+ });
220
+ });
221
+ var SelectIcon = /* @__PURE__ */ React.forwardRef(function SelectIcon(props, forwardedRef) {
222
+ const { __scopeSelect, children, ...iconProps } = props;
223
+ return /* @__PURE__ */ jsx(Primitive.span, {
224
+ "aria-hidden": true,
225
+ ...iconProps,
226
+ ref: forwardedRef,
227
+ children: children || "▼"
228
+ });
229
+ });
230
+ var [PortalProvider, usePortalContext] = createSelectContext("SelectPortal", { forceMount: void 0 });
231
+ var SelectPortal = (props) => {
232
+ const { __scopeSelect, forceMount, ...portalProps } = props;
233
+ return /* @__PURE__ */ jsx(PortalProvider, {
234
+ scope: props.__scopeSelect,
235
+ forceMount,
236
+ children: /* @__PURE__ */ jsx(Portal, {
237
+ asChild: true,
238
+ ...portalProps
239
+ })
240
+ });
241
+ };
242
+ var CONTENT_NAME = "SelectContent";
243
+ var SelectContent = /* @__PURE__ */ React.forwardRef(function SelectContent(props, forwardedRef) {
244
+ const portalContext = usePortalContext(CONTENT_NAME, props.__scopeSelect);
245
+ const { forceMount = portalContext.forceMount, ...contentProps } = props;
246
+ const context = useSelectContext(CONTENT_NAME, props.__scopeSelect);
247
+ const [fragment, setFragment] = React.useState();
248
+ useLayoutEffect(() => {
249
+ setFragment(new DocumentFragment());
250
+ }, []);
251
+ return /* @__PURE__ */ jsx(Presence, {
252
+ present: forceMount || context.open,
253
+ children: ({ present }) => present ? /* @__PURE__ */ jsx(SelectContentImpl, {
254
+ ...contentProps,
255
+ ref: forwardedRef
256
+ }) : /* @__PURE__ */ jsx(SelectContentFragment, {
257
+ ...contentProps,
258
+ fragment
259
+ })
260
+ });
261
+ });
262
+ var SelectContentFragment = /* @__PURE__ */ React.forwardRef(function SelectContentFragment(props, forwardedRef) {
263
+ const { __scopeSelect, children, fragment } = props;
264
+ if (!fragment) return null;
265
+ return ReactDOM.createPortal(/* @__PURE__ */ jsx(SelectContentProvider, {
266
+ scope: __scopeSelect,
267
+ children: /* @__PURE__ */ jsx(Collection.Slot, {
268
+ scope: __scopeSelect,
269
+ children: /* @__PURE__ */ jsx("div", {
270
+ ref: forwardedRef,
271
+ children
272
+ })
273
+ })
274
+ }), fragment);
275
+ });
276
+ var CONTENT_MARGIN = 10;
277
+ var [SelectContentProvider, useSelectContentContext] = createSelectContext(CONTENT_NAME);
278
+ var Slot = /* @__PURE__ */ createSlot("SelectContent.RemoveScroll");
279
+ var SelectContentImpl = /* @__PURE__ */ React.forwardRef(function SelectContentImpl(props, forwardedRef) {
280
+ const { __scopeSelect } = props;
281
+ const { position = "item-aligned", onCloseAutoFocus, onEscapeKeyDown, onPointerDownOutside, side, sideOffset, align, alignOffset, arrowPadding, collisionBoundary, collisionPadding, sticky, hideWhenDetached, avoidCollisions, ...contentProps } = props;
282
+ const context = useSelectContext(CONTENT_NAME, __scopeSelect);
283
+ const [content, setContent] = React.useState(null);
284
+ const [viewport, setViewport] = React.useState(null);
285
+ const composedRefs = useComposedRefs(forwardedRef, setContent);
286
+ const [selectedItem, setSelectedItem] = React.useState(null);
287
+ const [selectedItemText, setSelectedItemText] = React.useState(null);
288
+ const getItems = useCollection(__scopeSelect);
289
+ const [isPositioned, setIsPositioned] = React.useState(false);
290
+ const firstValidItemFoundRef = React.useRef(false);
291
+ React.useEffect(() => {
292
+ if (content) return hideOthers(content);
293
+ }, [content]);
294
+ useFocusGuards();
295
+ const focusFirst = React.useCallback((candidates) => {
296
+ const [firstItem, ...restItems] = getItems().map((item) => item.ref.current);
297
+ const [lastItem] = restItems.slice(-1);
298
+ const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;
299
+ for (const candidate of candidates) {
300
+ if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;
301
+ candidate?.scrollIntoView({ block: "nearest" });
302
+ if (candidate === firstItem && viewport) viewport.scrollTop = 0;
303
+ if (candidate === lastItem && viewport) viewport.scrollTop = viewport.scrollHeight;
304
+ candidate?.focus();
305
+ if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;
306
+ }
307
+ }, [getItems, viewport]);
308
+ const focusSelectedItem = React.useCallback(() => focusFirst([selectedItem, content]), [
309
+ focusFirst,
310
+ selectedItem,
311
+ content
312
+ ]);
313
+ React.useEffect(() => {
314
+ if (isPositioned) focusSelectedItem();
315
+ }, [isPositioned, focusSelectedItem]);
316
+ const { onOpenChange, triggerPointerDownPosRef } = context;
317
+ React.useEffect(() => {
318
+ if (content) {
319
+ let pointerMoveDelta = {
320
+ x: 0,
321
+ y: 0
322
+ };
323
+ const handlePointerMove = (event) => {
324
+ pointerMoveDelta = {
325
+ x: Math.abs(Math.round(event.pageX) - (triggerPointerDownPosRef.current?.x ?? 0)),
326
+ y: Math.abs(Math.round(event.pageY) - (triggerPointerDownPosRef.current?.y ?? 0))
327
+ };
328
+ };
329
+ const handlePointerUp = (event) => {
330
+ if (pointerMoveDelta.x <= 10 && pointerMoveDelta.y <= 10) event.preventDefault();
331
+ else if (!event.composedPath().includes(content)) onOpenChange(false);
332
+ document.removeEventListener("pointermove", handlePointerMove);
333
+ triggerPointerDownPosRef.current = null;
334
+ };
335
+ if (triggerPointerDownPosRef.current !== null) {
336
+ document.addEventListener("pointermove", handlePointerMove);
337
+ document.addEventListener("pointerup", handlePointerUp, {
338
+ capture: true,
339
+ once: true
340
+ });
341
+ }
342
+ return () => {
343
+ document.removeEventListener("pointermove", handlePointerMove);
344
+ document.removeEventListener("pointerup", handlePointerUp, { capture: true });
345
+ };
346
+ }
347
+ }, [
348
+ content,
349
+ onOpenChange,
350
+ triggerPointerDownPosRef
351
+ ]);
352
+ React.useEffect(() => {
353
+ const close = () => onOpenChange(false);
354
+ window.addEventListener("blur", close);
355
+ window.addEventListener("resize", close);
356
+ return () => {
357
+ window.removeEventListener("blur", close);
358
+ window.removeEventListener("resize", close);
359
+ };
360
+ }, [onOpenChange]);
361
+ const [searchRef, handleTypeaheadSearch] = useTypeaheadSearch((search) => {
362
+ const enabledItems = getItems().filter((item) => !item.disabled);
363
+ const nextItem = findNextItem(enabledItems, search, enabledItems.find((item) => item.ref.current === document.activeElement));
364
+ if (nextItem)
365
+ /**
366
+ * Imperative focus during keydown is risky so we prevent React's batching updates
367
+ * to avoid potential bugs. See: https://github.com/facebook/react/issues/20332
368
+ */
369
+ setTimeout(() => nextItem.ref.current?.focus());
370
+ });
371
+ const itemRefCallback = React.useCallback((node, value, disabled) => {
372
+ const isFirstValidItem = !firstValidItemFoundRef.current && !disabled;
373
+ if (context.value !== void 0 && context.value === value || isFirstValidItem) {
374
+ setSelectedItem(node);
375
+ if (isFirstValidItem) firstValidItemFoundRef.current = true;
376
+ }
377
+ }, [context.value]);
378
+ const handleItemLeave = React.useCallback(() => content?.focus(), [content]);
379
+ const itemTextRefCallback = React.useCallback((node, value, disabled) => {
380
+ const isFirstValidItem = !firstValidItemFoundRef.current && !disabled;
381
+ if (context.value !== void 0 && context.value === value || isFirstValidItem) setSelectedItemText(node);
382
+ }, [context.value]);
383
+ const SelectPosition = position === "popper" ? SelectPopperPosition : SelectItemAlignedPosition;
384
+ const popperContentProps = SelectPosition === SelectPopperPosition ? {
385
+ side,
386
+ sideOffset,
387
+ align,
388
+ alignOffset,
389
+ arrowPadding,
390
+ collisionBoundary,
391
+ collisionPadding,
392
+ sticky,
393
+ hideWhenDetached,
394
+ avoidCollisions
395
+ } : {};
396
+ return /* @__PURE__ */ jsx(SelectContentProvider, {
397
+ scope: __scopeSelect,
398
+ content,
399
+ viewport,
400
+ onViewportChange: setViewport,
401
+ itemRefCallback,
402
+ selectedItem,
403
+ onItemLeave: handleItemLeave,
404
+ itemTextRefCallback,
405
+ focusSelectedItem,
406
+ selectedItemText,
407
+ position,
408
+ isPositioned,
409
+ searchRef,
410
+ children: /* @__PURE__ */ jsx(RemoveScroll, {
411
+ as: Slot,
412
+ allowPinchZoom: true,
413
+ children: /* @__PURE__ */ jsx(FocusScope, {
414
+ asChild: true,
415
+ trapped: context.open,
416
+ onMountAutoFocus: (event) => {
417
+ event.preventDefault();
418
+ },
419
+ onUnmountAutoFocus: composeEventHandlers(onCloseAutoFocus, (event) => {
420
+ context.trigger?.focus({ preventScroll: true });
421
+ event.preventDefault();
422
+ }),
423
+ children: /* @__PURE__ */ jsx(DismissableLayer, {
424
+ asChild: true,
425
+ disableOutsidePointerEvents: true,
426
+ onEscapeKeyDown,
427
+ onPointerDownOutside,
428
+ onFocusOutside: (event) => event.preventDefault(),
429
+ onDismiss: () => context.onOpenChange(false),
430
+ children: /* @__PURE__ */ jsx(SelectPosition, {
431
+ role: "listbox",
432
+ id: context.contentId,
433
+ "data-state": context.open ? "open" : "closed",
434
+ dir: context.dir,
435
+ onContextMenu: (event) => event.preventDefault(),
436
+ ...contentProps,
437
+ ...popperContentProps,
438
+ onPlaced: () => setIsPositioned(true),
439
+ ref: composedRefs,
440
+ style: {
441
+ display: "flex",
442
+ flexDirection: "column",
443
+ outline: "none",
444
+ ...contentProps.style
445
+ },
446
+ onKeyDown: composeEventHandlers(contentProps.onKeyDown, (event) => {
447
+ const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;
448
+ if (event.key === "Tab") event.preventDefault();
449
+ if (!isModifierKey && event.key.length === 1) handleTypeaheadSearch(event.key);
450
+ if ([
451
+ "ArrowUp",
452
+ "ArrowDown",
453
+ "Home",
454
+ "End"
455
+ ].includes(event.key)) {
456
+ let candidateNodes = getItems().filter((item) => !item.disabled).map((item) => item.ref.current);
457
+ if (["ArrowUp", "End"].includes(event.key)) candidateNodes = candidateNodes.slice().reverse();
458
+ if (["ArrowUp", "ArrowDown"].includes(event.key)) {
459
+ const currentElement = event.target;
460
+ const currentIndex = candidateNodes.indexOf(currentElement);
461
+ candidateNodes = candidateNodes.slice(currentIndex + 1);
462
+ }
463
+ /**
464
+ * Imperative focus during keydown is risky so we prevent React's batching updates
465
+ * to avoid potential bugs. See: https://github.com/facebook/react/issues/20332
466
+ */
467
+ setTimeout(() => focusFirst(candidateNodes));
468
+ event.preventDefault();
469
+ }
470
+ })
471
+ })
472
+ })
473
+ })
474
+ })
475
+ });
476
+ });
477
+ var SelectItemAlignedPosition = /* @__PURE__ */ React.forwardRef(function SelectItemAlignedPosition(props, forwardedRef) {
478
+ const { __scopeSelect, onPlaced, ...popperProps } = props;
479
+ const context = useSelectContext(CONTENT_NAME, __scopeSelect);
480
+ const contentContext = useSelectContentContext(CONTENT_NAME, __scopeSelect);
481
+ const [contentWrapper, setContentWrapper] = React.useState(null);
482
+ const [content, setContent] = React.useState(null);
483
+ const composedRefs = useComposedRefs(forwardedRef, setContent);
484
+ const getItems = useCollection(__scopeSelect);
485
+ const shouldExpandOnScrollRef = React.useRef(false);
486
+ const shouldRepositionRef = React.useRef(true);
487
+ const { viewport, selectedItem, selectedItemText, focusSelectedItem } = contentContext;
488
+ const position = React.useCallback(() => {
489
+ if (context.trigger && context.valueNode && contentWrapper && content && viewport && selectedItem && selectedItemText) {
490
+ const triggerRect = context.trigger.getBoundingClientRect();
491
+ const contentRect = content.getBoundingClientRect();
492
+ const valueNodeRect = context.valueNode.getBoundingClientRect();
493
+ const itemTextRect = selectedItemText.getBoundingClientRect();
494
+ if (context.dir !== "rtl") {
495
+ const itemTextOffset = itemTextRect.left - contentRect.left;
496
+ const left = valueNodeRect.left - itemTextOffset;
497
+ const leftDelta = triggerRect.left - left;
498
+ const minContentWidth = triggerRect.width + leftDelta;
499
+ const contentWidth = Math.max(minContentWidth, contentRect.width);
500
+ const rightEdge = window.innerWidth - CONTENT_MARGIN;
501
+ const clampedLeft = clamp(left, [CONTENT_MARGIN, Math.max(CONTENT_MARGIN, rightEdge - contentWidth)]);
502
+ contentWrapper.style.minWidth = minContentWidth + "px";
503
+ contentWrapper.style.left = clampedLeft + "px";
504
+ } else {
505
+ const itemTextOffset = contentRect.right - itemTextRect.right;
506
+ const right = window.innerWidth - valueNodeRect.right - itemTextOffset;
507
+ const rightDelta = window.innerWidth - triggerRect.right - right;
508
+ const minContentWidth = triggerRect.width + rightDelta;
509
+ const contentWidth = Math.max(minContentWidth, contentRect.width);
510
+ const leftEdge = window.innerWidth - CONTENT_MARGIN;
511
+ const clampedRight = clamp(right, [CONTENT_MARGIN, Math.max(CONTENT_MARGIN, leftEdge - contentWidth)]);
512
+ contentWrapper.style.minWidth = minContentWidth + "px";
513
+ contentWrapper.style.right = clampedRight + "px";
514
+ }
515
+ const items = getItems();
516
+ const availableHeight = window.innerHeight - 20;
517
+ const itemsHeight = viewport.scrollHeight;
518
+ const contentStyles = window.getComputedStyle(content);
519
+ const contentBorderTopWidth = parseInt(contentStyles.borderTopWidth, 10);
520
+ const contentPaddingTop = parseInt(contentStyles.paddingTop, 10);
521
+ const contentBorderBottomWidth = parseInt(contentStyles.borderBottomWidth, 10);
522
+ const contentPaddingBottom = parseInt(contentStyles.paddingBottom, 10);
523
+ const fullContentHeight = contentBorderTopWidth + contentPaddingTop + itemsHeight + contentPaddingBottom + contentBorderBottomWidth;
524
+ const minContentHeight = Math.min(selectedItem.offsetHeight * 5, fullContentHeight);
525
+ const viewportStyles = window.getComputedStyle(viewport);
526
+ const viewportPaddingTop = parseInt(viewportStyles.paddingTop, 10);
527
+ const viewportPaddingBottom = parseInt(viewportStyles.paddingBottom, 10);
528
+ const topEdgeToTriggerMiddle = triggerRect.top + triggerRect.height / 2 - CONTENT_MARGIN;
529
+ const triggerMiddleToBottomEdge = availableHeight - topEdgeToTriggerMiddle;
530
+ const selectedItemHalfHeight = selectedItem.offsetHeight / 2;
531
+ const itemOffsetMiddle = selectedItem.offsetTop + selectedItemHalfHeight;
532
+ const contentTopToItemMiddle = contentBorderTopWidth + contentPaddingTop + itemOffsetMiddle;
533
+ const itemMiddleToContentBottom = fullContentHeight - contentTopToItemMiddle;
534
+ if (contentTopToItemMiddle <= topEdgeToTriggerMiddle) {
535
+ const isLastItem = items.length > 0 && selectedItem === items[items.length - 1].ref.current;
536
+ contentWrapper.style.bottom = "0px";
537
+ const viewportOffsetBottom = content.clientHeight - viewport.offsetTop - viewport.offsetHeight;
538
+ const height = contentTopToItemMiddle + Math.max(triggerMiddleToBottomEdge, selectedItemHalfHeight + (isLastItem ? viewportPaddingBottom : 0) + viewportOffsetBottom + contentBorderBottomWidth);
539
+ contentWrapper.style.height = height + "px";
540
+ } else {
541
+ const isFirstItem = items.length > 0 && selectedItem === items[0].ref.current;
542
+ contentWrapper.style.top = "0px";
543
+ const height = Math.max(topEdgeToTriggerMiddle, contentBorderTopWidth + viewport.offsetTop + (isFirstItem ? viewportPaddingTop : 0) + selectedItemHalfHeight) + itemMiddleToContentBottom;
544
+ contentWrapper.style.height = height + "px";
545
+ viewport.scrollTop = contentTopToItemMiddle - topEdgeToTriggerMiddle + viewport.offsetTop;
546
+ }
547
+ contentWrapper.style.margin = `${CONTENT_MARGIN}px 0`;
548
+ contentWrapper.style.minHeight = minContentHeight + "px";
549
+ contentWrapper.style.maxHeight = availableHeight + "px";
550
+ onPlaced?.();
551
+ requestAnimationFrame(() => shouldExpandOnScrollRef.current = true);
552
+ }
553
+ }, [
554
+ getItems,
555
+ context.trigger,
556
+ context.valueNode,
557
+ contentWrapper,
558
+ content,
559
+ viewport,
560
+ selectedItem,
561
+ selectedItemText,
562
+ context.dir,
563
+ onPlaced
564
+ ]);
565
+ useLayoutEffect(() => position(), [position]);
566
+ const [contentZIndex, setContentZIndex] = React.useState();
567
+ useLayoutEffect(() => {
568
+ if (content) setContentZIndex(window.getComputedStyle(content).zIndex);
569
+ }, [content]);
570
+ const handleScrollButtonChange = React.useCallback((node) => {
571
+ if (node && shouldRepositionRef.current === true) {
572
+ position();
573
+ focusSelectedItem?.();
574
+ shouldRepositionRef.current = false;
575
+ }
576
+ }, [position, focusSelectedItem]);
577
+ return /* @__PURE__ */ jsx(SelectViewportProvider, {
578
+ scope: __scopeSelect,
579
+ contentWrapper,
580
+ shouldExpandOnScrollRef,
581
+ onScrollButtonChange: handleScrollButtonChange,
582
+ children: /* @__PURE__ */ jsx("div", {
583
+ ref: setContentWrapper,
584
+ style: {
585
+ display: "flex",
586
+ flexDirection: "column",
587
+ position: "fixed",
588
+ zIndex: contentZIndex
589
+ },
590
+ children: /* @__PURE__ */ jsx(Primitive.div, {
591
+ ...popperProps,
592
+ ref: composedRefs,
593
+ style: {
594
+ boxSizing: "border-box",
595
+ maxHeight: "100%",
596
+ ...popperProps.style
597
+ }
598
+ })
599
+ })
600
+ });
601
+ });
602
+ var SelectPopperPosition = /* @__PURE__ */ React.forwardRef(function SelectPopperPosition(props, forwardedRef) {
603
+ const { __scopeSelect, align = "start", collisionPadding = CONTENT_MARGIN, ...popperProps } = props;
604
+ const popperScope = usePopperScope(__scopeSelect);
605
+ return /* @__PURE__ */ jsx(Content, {
606
+ ...popperScope,
607
+ ...popperProps,
608
+ ref: forwardedRef,
609
+ align,
610
+ collisionPadding,
611
+ style: {
612
+ boxSizing: "border-box",
613
+ ...popperProps.style,
614
+ "--radix-select-content-transform-origin": "var(--radix-popper-transform-origin)",
615
+ "--radix-select-content-available-width": "var(--radix-popper-available-width)",
616
+ "--radix-select-content-available-height": "var(--radix-popper-available-height)",
617
+ "--radix-select-trigger-width": "var(--radix-popper-anchor-width)",
618
+ "--radix-select-trigger-height": "var(--radix-popper-anchor-height)"
619
+ }
620
+ });
621
+ });
622
+ var [SelectViewportProvider, useSelectViewportContext] = createSelectContext(CONTENT_NAME, {});
623
+ var VIEWPORT_NAME = "SelectViewport";
624
+ var SelectViewport = /* @__PURE__ */ React.forwardRef(function SelectViewport(props, forwardedRef) {
625
+ const { __scopeSelect, nonce, ...viewportProps } = props;
626
+ const contentContext = useSelectContentContext(VIEWPORT_NAME, __scopeSelect);
627
+ const viewportContext = useSelectViewportContext(VIEWPORT_NAME, __scopeSelect);
628
+ const composedRefs = useComposedRefs(forwardedRef, contentContext.onViewportChange);
629
+ const prevScrollTopRef = React.useRef(0);
630
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("style", {
631
+ dangerouslySetInnerHTML: { __html: `[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}` },
632
+ nonce
633
+ }), /* @__PURE__ */ jsx(Collection.Slot, {
634
+ scope: __scopeSelect,
635
+ children: /* @__PURE__ */ jsx(Primitive.div, {
636
+ "data-radix-select-viewport": "",
637
+ role: "presentation",
638
+ ...viewportProps,
639
+ ref: composedRefs,
640
+ style: {
641
+ position: "relative",
642
+ flex: 1,
643
+ overflow: "hidden auto",
644
+ ...viewportProps.style
645
+ },
646
+ onScroll: composeEventHandlers(viewportProps.onScroll, (event) => {
647
+ const viewport = event.currentTarget;
648
+ const { contentWrapper, shouldExpandOnScrollRef } = viewportContext;
649
+ if (shouldExpandOnScrollRef?.current && contentWrapper) {
650
+ const scrolledBy = Math.abs(prevScrollTopRef.current - viewport.scrollTop);
651
+ if (scrolledBy > 0) {
652
+ const availableHeight = window.innerHeight - 20;
653
+ const cssMinHeight = parseFloat(contentWrapper.style.minHeight);
654
+ const cssHeight = parseFloat(contentWrapper.style.height);
655
+ const prevHeight = Math.max(cssMinHeight, cssHeight);
656
+ if (prevHeight < availableHeight) {
657
+ const nextHeight = prevHeight + scrolledBy;
658
+ const clampedNextHeight = Math.min(availableHeight, nextHeight);
659
+ const heightDiff = nextHeight - clampedNextHeight;
660
+ contentWrapper.style.height = clampedNextHeight + "px";
661
+ if (contentWrapper.style.bottom === "0px") {
662
+ viewport.scrollTop = heightDiff > 0 ? heightDiff : 0;
663
+ contentWrapper.style.justifyContent = "flex-end";
664
+ }
665
+ }
666
+ }
667
+ }
668
+ prevScrollTopRef.current = viewport.scrollTop;
669
+ })
670
+ })
671
+ })] });
672
+ });
673
+ var [SelectGroupContextProvider, useSelectGroupContext] = createSelectContext("SelectGroup");
674
+ var SelectGroup = /* @__PURE__ */ React.forwardRef(function SelectGroup(props, forwardedRef) {
675
+ const { __scopeSelect, ...groupProps } = props;
676
+ const groupId = useId();
677
+ return /* @__PURE__ */ jsx(SelectGroupContextProvider, {
678
+ scope: __scopeSelect,
679
+ id: groupId,
680
+ children: /* @__PURE__ */ jsx(Primitive.div, {
681
+ role: "group",
682
+ "aria-labelledby": groupId,
683
+ ...groupProps,
684
+ ref: forwardedRef
685
+ })
686
+ });
687
+ });
688
+ var LABEL_NAME = "SelectLabel";
689
+ var SelectLabel = /* @__PURE__ */ React.forwardRef(function SelectLabel(props, forwardedRef) {
690
+ const { __scopeSelect, ...labelProps } = props;
691
+ const groupContext = useSelectGroupContext(LABEL_NAME, __scopeSelect);
692
+ return /* @__PURE__ */ jsx(Primitive.div, {
693
+ id: groupContext.id,
694
+ ...labelProps,
695
+ ref: forwardedRef
696
+ });
697
+ });
698
+ var ITEM_NAME = "SelectItem";
699
+ var [SelectItemContextProvider, useSelectItemContext] = createSelectContext(ITEM_NAME);
700
+ var SelectItem = /* @__PURE__ */ React.forwardRef(function SelectItem(props, forwardedRef) {
701
+ const { __scopeSelect, value, disabled = false, textValue: textValueProp, ...itemProps } = props;
702
+ const context = useSelectContext(ITEM_NAME, __scopeSelect);
703
+ const contentContext = useSelectContentContext(ITEM_NAME, __scopeSelect);
704
+ const isSelected = context.value === value;
705
+ const [textValue, setTextValue] = React.useState(textValueProp ?? "");
706
+ const [isFocused, setIsFocused] = React.useState(false);
707
+ const handleItemRefCallback = useCallbackRef((node) => contentContext.itemRefCallback?.(node, value, disabled));
708
+ const composedRefs = useComposedRefs(forwardedRef, handleItemRefCallback);
709
+ const textId = useId();
710
+ const pointerTypeRef = React.useRef("touch");
711
+ const handleSelect = () => {
712
+ if (!disabled) {
713
+ context.onValueChange(value);
714
+ context.onOpenChange(false);
715
+ }
716
+ };
717
+ return /* @__PURE__ */ jsx(SelectItemContextProvider, {
718
+ scope: __scopeSelect,
719
+ value,
720
+ disabled,
721
+ textId,
722
+ isSelected,
723
+ onItemTextChange: React.useCallback((node) => {
724
+ setTextValue((prevTextValue) => prevTextValue || (node?.textContent ?? "").trim());
725
+ }, []),
726
+ children: /* @__PURE__ */ jsx(Collection.ItemSlot, {
727
+ scope: __scopeSelect,
728
+ value,
729
+ disabled,
730
+ textValue,
731
+ children: /* @__PURE__ */ jsx(Primitive.div, {
732
+ role: "option",
733
+ "aria-labelledby": textId,
734
+ "data-highlighted": isFocused ? "" : void 0,
735
+ "aria-selected": isSelected && isFocused,
736
+ "data-state": isSelected ? "checked" : "unchecked",
737
+ "aria-disabled": disabled || void 0,
738
+ "data-disabled": disabled ? "" : void 0,
739
+ tabIndex: disabled ? void 0 : -1,
740
+ ...itemProps,
741
+ ref: composedRefs,
742
+ onFocus: composeEventHandlers(itemProps.onFocus, () => setIsFocused(true)),
743
+ onBlur: composeEventHandlers(itemProps.onBlur, () => setIsFocused(false)),
744
+ onClick: composeEventHandlers(itemProps.onClick, () => {
745
+ if (pointerTypeRef.current !== "mouse") handleSelect();
746
+ }),
747
+ onPointerUp: composeEventHandlers(itemProps.onPointerUp, () => {
748
+ if (pointerTypeRef.current === "mouse") handleSelect();
749
+ }),
750
+ onPointerDown: composeEventHandlers(itemProps.onPointerDown, (event) => {
751
+ pointerTypeRef.current = event.pointerType;
752
+ }),
753
+ onPointerMove: composeEventHandlers(itemProps.onPointerMove, (event) => {
754
+ pointerTypeRef.current = event.pointerType;
755
+ if (disabled) contentContext.onItemLeave?.();
756
+ else if (pointerTypeRef.current === "mouse") event.currentTarget.focus({ preventScroll: true });
757
+ }),
758
+ onPointerLeave: composeEventHandlers(itemProps.onPointerLeave, (event) => {
759
+ if (event.currentTarget === document.activeElement) contentContext.onItemLeave?.();
760
+ }),
761
+ onKeyDown: composeEventHandlers(itemProps.onKeyDown, (event) => {
762
+ if (disabled || event.target !== event.currentTarget) return;
763
+ if (contentContext.searchRef?.current !== "" && event.key === " ") return;
764
+ if (SELECTION_KEYS.includes(event.key)) handleSelect();
765
+ if (event.key === " ") event.preventDefault();
766
+ })
767
+ })
768
+ })
769
+ });
770
+ });
771
+ var ITEM_TEXT_NAME = "SelectItemText";
772
+ var SelectItemText = /* @__PURE__ */ React.forwardRef(function SelectItemText(props, forwardedRef) {
773
+ const { __scopeSelect, className, style, ...itemTextProps } = props;
774
+ const context = useSelectContext(ITEM_TEXT_NAME, __scopeSelect);
775
+ const contentContext = useSelectContentContext(ITEM_TEXT_NAME, __scopeSelect);
776
+ const itemContext = useSelectItemContext(ITEM_TEXT_NAME, __scopeSelect);
777
+ const nativeOptionsContext = useSelectNativeOptionsContext(ITEM_TEXT_NAME, __scopeSelect);
778
+ const [itemTextNode, setItemTextNode] = React.useState(null);
779
+ const handleItemTextRefCallback = useCallbackRef((node) => contentContext.itemTextRefCallback?.(node, itemContext.value, itemContext.disabled));
780
+ const composedRefs = useComposedRefs(forwardedRef, setItemTextNode, itemContext.onItemTextChange, handleItemTextRefCallback);
781
+ const textContent = itemTextNode?.textContent;
782
+ const nativeOption = React.useMemo(() => /* @__PURE__ */ jsx("option", {
783
+ value: itemContext.value,
784
+ disabled: itemContext.disabled,
785
+ children: textContent
786
+ }, itemContext.value), [
787
+ itemContext.disabled,
788
+ itemContext.value,
789
+ textContent
790
+ ]);
791
+ const { onNativeOptionAdd, onNativeOptionRemove } = nativeOptionsContext;
792
+ useLayoutEffect(() => {
793
+ onNativeOptionAdd(nativeOption);
794
+ return () => onNativeOptionRemove(nativeOption);
795
+ }, [
796
+ onNativeOptionAdd,
797
+ onNativeOptionRemove,
798
+ nativeOption
799
+ ]);
800
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Primitive.span, {
801
+ id: itemContext.textId,
802
+ ...itemTextProps,
803
+ ref: composedRefs
804
+ }), itemContext.isSelected && context.valueNode && !context.valueNodeHasChildren && !shouldShowPlaceholder(context.value) ? ReactDOM.createPortal(itemTextProps.children, context.valueNode) : null] });
805
+ });
806
+ var ITEM_INDICATOR_NAME = "SelectItemIndicator";
807
+ var SelectItemIndicator = /* @__PURE__ */ React.forwardRef(function SelectItemIndicator(props, forwardedRef) {
808
+ const { __scopeSelect, ...itemIndicatorProps } = props;
809
+ return useSelectItemContext(ITEM_INDICATOR_NAME, __scopeSelect).isSelected ? /* @__PURE__ */ jsx(Primitive.span, {
810
+ "aria-hidden": true,
811
+ ...itemIndicatorProps,
812
+ ref: forwardedRef
813
+ }) : null;
814
+ });
815
+ var SCROLL_UP_BUTTON_NAME = "SelectScrollUpButton";
816
+ var SelectScrollUpButton = /* @__PURE__ */ React.forwardRef(function SelectScrollUpButton(props, forwardedRef) {
817
+ const contentContext = useSelectContentContext(SCROLL_UP_BUTTON_NAME, props.__scopeSelect);
818
+ const viewportContext = useSelectViewportContext(SCROLL_UP_BUTTON_NAME, props.__scopeSelect);
819
+ const [canScrollUp, setCanScrollUp] = React.useState(false);
820
+ const composedRefs = useComposedRefs(forwardedRef, viewportContext.onScrollButtonChange);
821
+ useLayoutEffect(() => {
822
+ if (contentContext.viewport && contentContext.isPositioned) {
823
+ const viewport = contentContext.viewport;
824
+ function handleScroll() {
825
+ const canScrollUp = viewport.scrollTop > 0;
826
+ setCanScrollUp(canScrollUp);
827
+ }
828
+ handleScroll();
829
+ viewport.addEventListener("scroll", handleScroll);
830
+ return () => viewport.removeEventListener("scroll", handleScroll);
831
+ }
832
+ }, [contentContext.viewport, contentContext.isPositioned]);
833
+ return canScrollUp ? /* @__PURE__ */ jsx(SelectScrollButtonImpl, {
834
+ ...props,
835
+ ref: composedRefs,
836
+ onAutoScroll: () => {
837
+ const { viewport, selectedItem } = contentContext;
838
+ if (viewport && selectedItem) viewport.scrollTop = viewport.scrollTop - selectedItem.offsetHeight;
839
+ }
840
+ }) : null;
841
+ });
842
+ var SCROLL_DOWN_BUTTON_NAME = "SelectScrollDownButton";
843
+ var SelectScrollDownButton = /* @__PURE__ */ React.forwardRef(function SelectScrollDownButton(props, forwardedRef) {
844
+ const contentContext = useSelectContentContext(SCROLL_DOWN_BUTTON_NAME, props.__scopeSelect);
845
+ const viewportContext = useSelectViewportContext(SCROLL_DOWN_BUTTON_NAME, props.__scopeSelect);
846
+ const [canScrollDown, setCanScrollDown] = React.useState(false);
847
+ const composedRefs = useComposedRefs(forwardedRef, viewportContext.onScrollButtonChange);
848
+ useLayoutEffect(() => {
849
+ if (contentContext.viewport && contentContext.isPositioned) {
850
+ const viewport = contentContext.viewport;
851
+ function handleScroll() {
852
+ const maxScroll = viewport.scrollHeight - viewport.clientHeight;
853
+ const canScrollDown = Math.ceil(viewport.scrollTop) < maxScroll;
854
+ setCanScrollDown(canScrollDown);
855
+ }
856
+ handleScroll();
857
+ viewport.addEventListener("scroll", handleScroll);
858
+ return () => viewport.removeEventListener("scroll", handleScroll);
859
+ }
860
+ }, [contentContext.viewport, contentContext.isPositioned]);
861
+ return canScrollDown ? /* @__PURE__ */ jsx(SelectScrollButtonImpl, {
862
+ ...props,
863
+ ref: composedRefs,
864
+ onAutoScroll: () => {
865
+ const { viewport, selectedItem } = contentContext;
866
+ if (viewport && selectedItem) viewport.scrollTop = viewport.scrollTop + selectedItem.offsetHeight;
867
+ }
868
+ }) : null;
869
+ });
870
+ var SelectScrollButtonImpl = /* @__PURE__ */ React.forwardRef(function SelectScrollButtonImpl(props, forwardedRef) {
871
+ const { __scopeSelect, onAutoScroll, ...scrollIndicatorProps } = props;
872
+ const contentContext = useSelectContentContext("SelectScrollButton", __scopeSelect);
873
+ const autoScrollTimerRef = React.useRef(null);
874
+ const getItems = useCollection(__scopeSelect);
875
+ const clearAutoScrollTimer = React.useCallback(() => {
876
+ if (autoScrollTimerRef.current !== null) {
877
+ window.clearInterval(autoScrollTimerRef.current);
878
+ autoScrollTimerRef.current = null;
879
+ }
880
+ }, []);
881
+ React.useEffect(() => {
882
+ return () => clearAutoScrollTimer();
883
+ }, [clearAutoScrollTimer]);
884
+ useLayoutEffect(() => {
885
+ getItems().find((item) => item.ref.current === document.activeElement)?.ref.current?.scrollIntoView({ block: "nearest" });
886
+ }, [getItems]);
887
+ return /* @__PURE__ */ jsx(Primitive.div, {
888
+ "aria-hidden": true,
889
+ ...scrollIndicatorProps,
890
+ ref: forwardedRef,
891
+ style: {
892
+ flexShrink: 0,
893
+ ...scrollIndicatorProps.style
894
+ },
895
+ onPointerDown: composeEventHandlers(scrollIndicatorProps.onPointerDown, () => {
896
+ if (autoScrollTimerRef.current === null) autoScrollTimerRef.current = window.setInterval(onAutoScroll, 50);
897
+ }),
898
+ onPointerMove: composeEventHandlers(scrollIndicatorProps.onPointerMove, () => {
899
+ contentContext.onItemLeave?.();
900
+ if (autoScrollTimerRef.current === null) autoScrollTimerRef.current = window.setInterval(onAutoScroll, 50);
901
+ }),
902
+ onPointerLeave: composeEventHandlers(scrollIndicatorProps.onPointerLeave, () => {
903
+ clearAutoScrollTimer();
904
+ })
905
+ });
906
+ });
907
+ var SelectSeparator = /* @__PURE__ */ React.forwardRef(function SelectSeparator(props, forwardedRef) {
908
+ const { __scopeSelect, ...separatorProps } = props;
909
+ return /* @__PURE__ */ jsx(Primitive.div, {
910
+ "aria-hidden": true,
911
+ ...separatorProps,
912
+ ref: forwardedRef
913
+ });
914
+ });
915
+ var BUBBLE_INPUT_NAME = "SelectBubbleInput";
916
+ var SelectBubbleInput = /* @__PURE__ */ React.forwardRef(function SelectBubbleInput({ __scopeSelect, ...props }, forwardedRef) {
917
+ const context = useSelectContext(BUBBLE_INPUT_NAME, __scopeSelect);
918
+ const { value, onValueChange, required, disabled, name, autoComplete, form } = context;
919
+ const { nativeOptions, nativeSelectKey } = context;
920
+ const ref = React.useRef(null);
921
+ const composedRefs = useComposedRefs(forwardedRef, ref);
922
+ const selectValue = value ?? "";
923
+ const prevValue = usePrevious(selectValue);
924
+ const hasEmptyValueOption = Array.from(nativeOptions).some((option) => (option.props.value ?? "") === "");
925
+ React.useEffect(() => {
926
+ const select = ref.current;
927
+ if (!select) return;
928
+ const selectProto = window.HTMLSelectElement.prototype;
929
+ const setValue = Object.getOwnPropertyDescriptor(selectProto, "value").set;
930
+ if (prevValue !== selectValue && setValue) {
931
+ const event = new Event("change", { bubbles: true });
932
+ setValue.call(select, selectValue);
933
+ select.dispatchEvent(event);
934
+ }
935
+ }, [prevValue, selectValue]);
936
+ /**
937
+ * We purposefully use a `select` here to support form autofill as much as
938
+ * possible.
939
+ *
940
+ * We purposefully do not add the `value` attribute here to allow the value
941
+ * to be set programmatically and bubble to any parent form `onChange`
942
+ * event. Adding the `value` will cause React to consider the programmatic
943
+ * dispatch a duplicate and it will get swallowed.
944
+ *
945
+ * We use visually hidden styles rather than `display: "none"` because
946
+ * Safari autofill won't work otherwise.
947
+ *
948
+ * The native `select` only associates the correct default value if the
949
+ * corresponding `option` is rendered as a child **at the same time** as
950
+ * itself. Because it might take a few renders for our items to gather the
951
+ * information to build the native `option`(s), we key the `select` to make
952
+ * sure React re-builds it each time the options change.
953
+ */
954
+ return /* @__PURE__ */ jsxs(Primitive.select, {
955
+ "aria-hidden": true,
956
+ required,
957
+ tabIndex: -1,
958
+ name,
959
+ autoComplete,
960
+ disabled,
961
+ form,
962
+ onChange: (event) => onValueChange(event.target.value),
963
+ ...props,
964
+ style: {
965
+ ...VISUALLY_HIDDEN_STYLES,
966
+ ...props.style
967
+ },
968
+ ref: composedRefs,
969
+ defaultValue: selectValue,
970
+ children: [shouldShowPlaceholder(value) && !hasEmptyValueOption ? /* @__PURE__ */ jsx("option", { value: "" }) : null, Array.from(nativeOptions)]
971
+ }, nativeSelectKey);
972
+ });
973
+ function isFunction(value) {
974
+ return typeof value === "function";
975
+ }
976
+ function shouldShowPlaceholder(value) {
977
+ return value === "" || value === void 0;
978
+ }
979
+ function useTypeaheadSearch(onSearchChange) {
980
+ const handleSearchChange = useCallbackRef(onSearchChange);
981
+ const searchRef = React.useRef("");
982
+ const timerRef = React.useRef(0);
983
+ const handleTypeaheadSearch = React.useCallback((key) => {
984
+ const search = searchRef.current + key;
985
+ handleSearchChange(search);
986
+ (function updateSearch(value) {
987
+ searchRef.current = value;
988
+ window.clearTimeout(timerRef.current);
989
+ if (value !== "") timerRef.current = window.setTimeout(() => updateSearch(""), 1e3);
990
+ })(search);
991
+ }, [handleSearchChange]);
992
+ const resetTypeahead = React.useCallback(() => {
993
+ searchRef.current = "";
994
+ window.clearTimeout(timerRef.current);
995
+ }, []);
996
+ React.useEffect(() => {
997
+ return () => window.clearTimeout(timerRef.current);
998
+ }, []);
999
+ return [
1000
+ searchRef,
1001
+ handleTypeaheadSearch,
1002
+ resetTypeahead
1003
+ ];
1004
+ }
1005
+ /**
1006
+ * This is the "meat" of the typeahead matching logic. It takes in a list of items,
1007
+ * the search and the current item, and returns the next item (or `undefined`).
1008
+ *
1009
+ * We normalize the search because if a user has repeatedly pressed a character,
1010
+ * we want the exact same behavior as if we only had that one character
1011
+ * (ie. cycle through items starting with that character)
1012
+ *
1013
+ * We also reorder the items by wrapping the array around the current item.
1014
+ * This is so we always look forward from the current item, and picking the first
1015
+ * item will always be the correct one.
1016
+ *
1017
+ * Finally, if the normalized search is exactly one character, we exclude the
1018
+ * current item from the values because otherwise it would be the first to match always
1019
+ * and focus would never move. This is as opposed to the regular case, where we
1020
+ * don't want focus to move if the current item still matches.
1021
+ */
1022
+ function findNextItem(items, search, currentItem) {
1023
+ const normalizedSearch = search.length > 1 && Array.from(search).every((char) => char === search[0]) ? search[0] : search;
1024
+ const currentItemIndex = currentItem ? items.indexOf(currentItem) : -1;
1025
+ let wrappedItems = wrapArray(items, Math.max(currentItemIndex, 0));
1026
+ if (normalizedSearch.length === 1) wrappedItems = wrappedItems.filter((v) => v !== currentItem);
1027
+ const nextItem = wrappedItems.find((item) => item.textValue.toLowerCase().startsWith(normalizedSearch.toLowerCase()));
1028
+ return nextItem !== currentItem ? nextItem : void 0;
1029
+ }
1030
+ /**
1031
+ * Wraps an array around itself at a given start index
1032
+ * Example: `wrapArray(['a', 'b', 'c', 'd'], 2) === ['c', 'd', 'a', 'b']`
1033
+ */
1034
+ function wrapArray(array, startIndex) {
1035
+ return array.map((_, index) => array[(startIndex + index) % array.length]);
1036
+ }
1037
+ //#endregion
1038
+ export { SelectBubbleInput as BubbleInput, SelectBubbleInput, SelectContent as Content, SelectContent, SelectGroup as Group, SelectGroup, SelectIcon as Icon, SelectIcon, SelectItem as Item, SelectItem, SelectItemIndicator as ItemIndicator, SelectItemIndicator, SelectItemText as ItemText, SelectItemText, SelectLabel as Label, SelectLabel, SelectPortal as Portal, SelectPortal, SelectProvider as Provider, SelectProvider, Select as Root, Select, SelectScrollDownButton as ScrollDownButton, SelectScrollDownButton, SelectScrollUpButton as ScrollUpButton, SelectScrollUpButton, SelectSeparator, SelectSeparator as Separator, SelectTrigger, SelectTrigger as Trigger, SelectValue, SelectValue as Value, SelectViewport, SelectViewport as Viewport };
1039
+
1040
+ //# sourceMappingURL=select.js.map