@kismet-ux/constellation 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (668) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +170 -0
  3. package/dist/brand/Logo/index.d.ts +2 -0
  4. package/dist/brand/Logo/index.d.ts.map +1 -0
  5. package/dist/brand/Logo/logo.d.ts +23 -0
  6. package/dist/brand/Logo/logo.d.ts.map +1 -0
  7. package/dist/brand/Logo/logo.js +28 -0
  8. package/dist/brand/Logo/logo.js.map +1 -0
  9. package/dist/brand/Logo/logo.module.scss.js +4 -0
  10. package/dist/brand/Logo/logo.module.scss.js.map +1 -0
  11. package/dist/brand/index.d.ts +2 -0
  12. package/dist/brand/index.d.ts.map +1 -0
  13. package/dist/brand.d.ts +25 -0
  14. package/dist/brand.js +2 -0
  15. package/dist/brand.js.map +1 -0
  16. package/dist/form/Checkbox/checkbox.d.ts +20 -0
  17. package/dist/form/Checkbox/checkbox.d.ts.map +1 -0
  18. package/dist/form/Checkbox/checkbox.js +57 -0
  19. package/dist/form/Checkbox/checkbox.js.map +1 -0
  20. package/dist/form/Checkbox/checkbox.module.scss.js +4 -0
  21. package/dist/form/Checkbox/checkbox.module.scss.js.map +1 -0
  22. package/dist/form/Checkbox/index.d.ts +2 -0
  23. package/dist/form/Checkbox/index.d.ts.map +1 -0
  24. package/dist/form/DatePicker/date-picker.d.ts +5 -0
  25. package/dist/form/DatePicker/date-picker.d.ts.map +1 -0
  26. package/dist/form/DatePicker/date-picker.js +251 -0
  27. package/dist/form/DatePicker/date-picker.js.map +1 -0
  28. package/dist/form/DatePicker/date-picker.module.scss.js +4 -0
  29. package/dist/form/DatePicker/date-picker.module.scss.js.map +1 -0
  30. package/dist/form/DatePicker/index.d.ts +2 -0
  31. package/dist/form/DatePicker/index.d.ts.map +1 -0
  32. package/dist/form/DatePicker/use-calendar.d.ts +40 -0
  33. package/dist/form/DatePicker/use-calendar.d.ts.map +1 -0
  34. package/dist/form/DatePicker/use-calendar.js +202 -0
  35. package/dist/form/DatePicker/use-calendar.js.map +1 -0
  36. package/dist/form/Input/index.d.ts +2 -0
  37. package/dist/form/Input/index.d.ts.map +1 -0
  38. package/dist/form/Input/input.d.ts +23 -0
  39. package/dist/form/Input/input.d.ts.map +1 -0
  40. package/dist/form/Input/input.js +24 -0
  41. package/dist/form/Input/input.js.map +1 -0
  42. package/dist/form/Input/input.module.scss.js +4 -0
  43. package/dist/form/Input/input.module.scss.js.map +1 -0
  44. package/dist/form/Label/index.d.ts +2 -0
  45. package/dist/form/Label/index.d.ts.map +1 -0
  46. package/dist/form/Label/label-variants.d.ts +5 -0
  47. package/dist/form/Label/label-variants.d.ts.map +1 -0
  48. package/dist/form/Label/label-variants.js +29 -0
  49. package/dist/form/Label/label-variants.js.map +1 -0
  50. package/dist/form/Label/label.d.ts +10 -0
  51. package/dist/form/Label/label.d.ts.map +1 -0
  52. package/dist/form/Label/label.js +13 -0
  53. package/dist/form/Label/label.js.map +1 -0
  54. package/dist/form/Label/label.module.scss.js +4 -0
  55. package/dist/form/Label/label.module.scss.js.map +1 -0
  56. package/dist/form/Select/index.d.ts +2 -0
  57. package/dist/form/Select/index.d.ts.map +1 -0
  58. package/dist/form/Select/select.d.ts +16 -0
  59. package/dist/form/Select/select.d.ts.map +1 -0
  60. package/dist/form/Select/select.js +857 -0
  61. package/dist/form/Select/select.js.map +1 -0
  62. package/dist/form/Select/select.module.scss.js +4 -0
  63. package/dist/form/Select/select.module.scss.js.map +1 -0
  64. package/dist/form/index.d.ts +6 -0
  65. package/dist/form/index.d.ts.map +1 -0
  66. package/dist/form.d.ts +5 -0
  67. package/dist/form.js +6 -0
  68. package/dist/form.js.map +1 -0
  69. package/dist/hooks/index.d.ts +6 -0
  70. package/dist/hooks/index.d.ts.map +1 -0
  71. package/dist/hooks/layout/index.d.ts +2 -0
  72. package/dist/hooks/layout/index.d.ts.map +1 -0
  73. package/dist/hooks/layout/use-sidebar.d.ts +3 -0
  74. package/dist/hooks/layout/use-sidebar.d.ts.map +1 -0
  75. package/dist/hooks/layout/use-sidebar.js +13 -0
  76. package/dist/hooks/layout/use-sidebar.js.map +1 -0
  77. package/dist/hooks/ui/index.d.ts +3 -0
  78. package/dist/hooks/ui/index.d.ts.map +1 -0
  79. package/dist/hooks/ui/use-alerts.d.ts +3 -0
  80. package/dist/hooks/ui/use-alerts.d.ts.map +1 -0
  81. package/dist/hooks/ui/use-alerts.js +13 -0
  82. package/dist/hooks/ui/use-alerts.js.map +1 -0
  83. package/dist/hooks/ui/use-table-sorting.d.ts +6 -0
  84. package/dist/hooks/ui/use-table-sorting.d.ts.map +1 -0
  85. package/dist/hooks/ui/use-table-sorting.js +37 -0
  86. package/dist/hooks/ui/use-table-sorting.js.map +1 -0
  87. package/dist/hooks/use-appearance.d.ts +10 -0
  88. package/dist/hooks/use-appearance.d.ts.map +1 -0
  89. package/dist/hooks/use-appearance.js +123 -0
  90. package/dist/hooks/use-appearance.js.map +1 -0
  91. package/dist/hooks/use-initials.d.ts +2 -0
  92. package/dist/hooks/use-initials.d.ts.map +1 -0
  93. package/dist/hooks/use-initials.js +17 -0
  94. package/dist/hooks/use-initials.js.map +1 -0
  95. package/dist/hooks/use-mobile-navigation.d.ts +2 -0
  96. package/dist/hooks/use-mobile-navigation.d.ts.map +1 -0
  97. package/dist/hooks/use-mobile-navigation.js +11 -0
  98. package/dist/hooks/use-mobile-navigation.js.map +1 -0
  99. package/dist/hooks/use-mobile.d.ts +6 -0
  100. package/dist/hooks/use-mobile.d.ts.map +1 -0
  101. package/dist/hooks/use-mobile.js +73 -0
  102. package/dist/hooks/use-mobile.js.map +1 -0
  103. package/dist/index-Bzf20Rpc.d.ts +120 -0
  104. package/dist/index-DECPicJT.d.ts +450 -0
  105. package/dist/index-qbk6vH0X.d.ts +186 -0
  106. package/dist/index.css +7611 -0
  107. package/dist/index.css.map +1 -0
  108. package/dist/index.d.ts +55 -0
  109. package/dist/index.d.ts.map +1 -0
  110. package/dist/index.js +63 -0
  111. package/dist/index.js.map +1 -0
  112. package/dist/input-CWHXOpeH.d.ts +25 -0
  113. package/dist/internal/create-ripple.d.ts +8 -0
  114. package/dist/internal/create-ripple.d.ts.map +1 -0
  115. package/dist/internal/create-ripple.js +24 -0
  116. package/dist/internal/create-ripple.js.map +1 -0
  117. package/dist/internal/merge-refs.d.ts +3 -0
  118. package/dist/internal/merge-refs.d.ts.map +1 -0
  119. package/dist/internal/merge-refs.js +15 -0
  120. package/dist/internal/merge-refs.js.map +1 -0
  121. package/dist/internal/slot.d.ts +7 -0
  122. package/dist/internal/slot.d.ts.map +1 -0
  123. package/dist/internal/slot.js +42 -0
  124. package/dist/internal/slot.js.map +1 -0
  125. package/dist/internal/use-animation-state.d.ts +12 -0
  126. package/dist/internal/use-animation-state.d.ts.map +1 -0
  127. package/dist/internal/use-animation-state.js +36 -0
  128. package/dist/internal/use-animation-state.js.map +1 -0
  129. package/dist/internal/use-focus-trap.d.ts +3 -0
  130. package/dist/internal/use-focus-trap.d.ts.map +1 -0
  131. package/dist/internal/use-focus-trap.js +55 -0
  132. package/dist/internal/use-focus-trap.js.map +1 -0
  133. package/dist/internal/use-scroll-lock.d.ts +2 -0
  134. package/dist/internal/use-scroll-lock.d.ts.map +1 -0
  135. package/dist/internal/use-scroll-lock.js +22 -0
  136. package/dist/internal/use-scroll-lock.js.map +1 -0
  137. package/dist/internal/with-aria-hidden-children.d.ts +16 -0
  138. package/dist/internal/with-aria-hidden-children.d.ts.map +1 -0
  139. package/dist/internal/with-aria-hidden-children.js +29 -0
  140. package/dist/internal/with-aria-hidden-children.js.map +1 -0
  141. package/dist/layout/AppContent/app-content.d.ts +3 -0
  142. package/dist/layout/AppContent/app-content.d.ts.map +1 -0
  143. package/dist/layout/AppContent/app-content.js +11 -0
  144. package/dist/layout/AppContent/app-content.js.map +1 -0
  145. package/dist/layout/AppContent/app-content.module.scss.js +4 -0
  146. package/dist/layout/AppContent/app-content.module.scss.js.map +1 -0
  147. package/dist/layout/AppContent/index.d.ts +2 -0
  148. package/dist/layout/AppContent/index.d.ts.map +1 -0
  149. package/dist/layout/AppFooter/app-footer.d.ts +10 -0
  150. package/dist/layout/AppFooter/app-footer.d.ts.map +1 -0
  151. package/dist/layout/AppFooter/app-footer.js +19 -0
  152. package/dist/layout/AppFooter/app-footer.js.map +1 -0
  153. package/dist/layout/AppFooter/app-footer.module.scss.js +4 -0
  154. package/dist/layout/AppFooter/app-footer.module.scss.js.map +1 -0
  155. package/dist/layout/AppFooter/index.d.ts +2 -0
  156. package/dist/layout/AppFooter/index.d.ts.map +1 -0
  157. package/dist/layout/AppShell/app-shell.d.ts +11 -0
  158. package/dist/layout/AppShell/app-shell.d.ts.map +1 -0
  159. package/dist/layout/AppShell/app-shell.js +9 -0
  160. package/dist/layout/AppShell/app-shell.js.map +1 -0
  161. package/dist/layout/AppShell/index.d.ts +2 -0
  162. package/dist/layout/AppShell/index.d.ts.map +1 -0
  163. package/dist/layout/AppSidebar/app-sidebar.d.ts +14 -0
  164. package/dist/layout/AppSidebar/app-sidebar.d.ts.map +1 -0
  165. package/dist/layout/AppSidebar/app-sidebar.js +71 -0
  166. package/dist/layout/AppSidebar/app-sidebar.js.map +1 -0
  167. package/dist/layout/AppSidebar/index.d.ts +2 -0
  168. package/dist/layout/AppSidebar/index.d.ts.map +1 -0
  169. package/dist/layout/AppSidebarHeader/app-sidebar-header.d.ts +13 -0
  170. package/dist/layout/AppSidebarHeader/app-sidebar-header.d.ts.map +1 -0
  171. package/dist/layout/AppSidebarHeader/app-sidebar-header.js +20 -0
  172. package/dist/layout/AppSidebarHeader/app-sidebar-header.js.map +1 -0
  173. package/dist/layout/AppSidebarHeader/app-sidebar-header.module.scss.js +4 -0
  174. package/dist/layout/AppSidebarHeader/app-sidebar-header.module.scss.js.map +1 -0
  175. package/dist/layout/AppSidebarHeader/index.d.ts +2 -0
  176. package/dist/layout/AppSidebarHeader/index.d.ts.map +1 -0
  177. package/dist/layout/Collapse/collapse.d.ts +8 -0
  178. package/dist/layout/Collapse/collapse.d.ts.map +1 -0
  179. package/dist/layout/Collapse/collapse.js +14 -0
  180. package/dist/layout/Collapse/collapse.js.map +1 -0
  181. package/dist/layout/Collapse/collapse.module.scss.js +4 -0
  182. package/dist/layout/Collapse/collapse.module.scss.js.map +1 -0
  183. package/dist/layout/Collapse/index.d.ts +2 -0
  184. package/dist/layout/Collapse/index.d.ts.map +1 -0
  185. package/dist/layout/Column/column.d.ts +4 -0
  186. package/dist/layout/Column/column.d.ts.map +1 -0
  187. package/dist/layout/Column/column.js +14 -0
  188. package/dist/layout/Column/column.js.map +1 -0
  189. package/dist/layout/Column/column.module.scss.js +4 -0
  190. package/dist/layout/Column/column.module.scss.js.map +1 -0
  191. package/dist/layout/Column/index.d.ts +3 -0
  192. package/dist/layout/Column/index.d.ts.map +1 -0
  193. package/dist/layout/Container/container.d.ts +4 -0
  194. package/dist/layout/Container/container.d.ts.map +1 -0
  195. package/dist/layout/Container/container.js +35 -0
  196. package/dist/layout/Container/container.js.map +1 -0
  197. package/dist/layout/Container/container.module.scss.js +4 -0
  198. package/dist/layout/Container/container.module.scss.js.map +1 -0
  199. package/dist/layout/Container/index.d.ts +2 -0
  200. package/dist/layout/Container/index.d.ts.map +1 -0
  201. package/dist/layout/Grid/grid.d.ts +5 -0
  202. package/dist/layout/Grid/grid.d.ts.map +1 -0
  203. package/dist/layout/Grid/grid.js +15 -0
  204. package/dist/layout/Grid/grid.js.map +1 -0
  205. package/dist/layout/Grid/grid.module.scss.js +4 -0
  206. package/dist/layout/Grid/grid.module.scss.js.map +1 -0
  207. package/dist/layout/Grid/index.d.ts +2 -0
  208. package/dist/layout/Grid/index.d.ts.map +1 -0
  209. package/dist/layout/Row/index.d.ts +3 -0
  210. package/dist/layout/Row/index.d.ts.map +1 -0
  211. package/dist/layout/Row/row.d.ts +4 -0
  212. package/dist/layout/Row/row.d.ts.map +1 -0
  213. package/dist/layout/Row/row.js +19 -0
  214. package/dist/layout/Row/row.js.map +1 -0
  215. package/dist/layout/Row/row.module.scss.js +4 -0
  216. package/dist/layout/Row/row.module.scss.js.map +1 -0
  217. package/dist/layout/Sidebar/index.d.ts +2 -0
  218. package/dist/layout/Sidebar/index.d.ts.map +1 -0
  219. package/dist/layout/Sidebar/sidebar-context.d.ts +4 -0
  220. package/dist/layout/Sidebar/sidebar-context.d.ts.map +1 -0
  221. package/dist/layout/Sidebar/sidebar-context.js +6 -0
  222. package/dist/layout/Sidebar/sidebar-context.js.map +1 -0
  223. package/dist/layout/Sidebar/sidebar-variants.d.ts +5 -0
  224. package/dist/layout/Sidebar/sidebar-variants.d.ts.map +1 -0
  225. package/dist/layout/Sidebar/sidebar-variants.js +23 -0
  226. package/dist/layout/Sidebar/sidebar-variants.js.map +1 -0
  227. package/dist/layout/Sidebar/sidebar.d.ts +57 -0
  228. package/dist/layout/Sidebar/sidebar.d.ts.map +1 -0
  229. package/dist/layout/Sidebar/sidebar.js +200 -0
  230. package/dist/layout/Sidebar/sidebar.js.map +1 -0
  231. package/dist/layout/Sidebar/sidebar.module.scss.js +4 -0
  232. package/dist/layout/Sidebar/sidebar.module.scss.js.map +1 -0
  233. package/dist/layout/Skeleton/index.d.ts +2 -0
  234. package/dist/layout/Skeleton/index.d.ts.map +1 -0
  235. package/dist/layout/Skeleton/skeleton.d.ts +3 -0
  236. package/dist/layout/Skeleton/skeleton.d.ts.map +1 -0
  237. package/dist/layout/Skeleton/skeleton.js +10 -0
  238. package/dist/layout/Skeleton/skeleton.js.map +1 -0
  239. package/dist/layout/Skeleton/skeleton.module.scss.js +4 -0
  240. package/dist/layout/Skeleton/skeleton.module.scss.js.map +1 -0
  241. package/dist/layout/index.d.ts +13 -0
  242. package/dist/layout/index.d.ts.map +1 -0
  243. package/dist/layout.d.ts +10 -0
  244. package/dist/layout.js +13 -0
  245. package/dist/layout.js.map +1 -0
  246. package/dist/nav-user-CJIcWKyY.d.ts +41 -0
  247. package/dist/navigation/Breadcrumbs/breadcrumbs.d.ts +7 -0
  248. package/dist/navigation/Breadcrumbs/breadcrumbs.d.ts.map +1 -0
  249. package/dist/navigation/Breadcrumbs/breadcrumbs.js +19 -0
  250. package/dist/navigation/Breadcrumbs/breadcrumbs.js.map +1 -0
  251. package/dist/navigation/Breadcrumbs/breadcrumbs.module.scss.js +4 -0
  252. package/dist/navigation/Breadcrumbs/breadcrumbs.module.scss.js.map +1 -0
  253. package/dist/navigation/Breadcrumbs/index.d.ts +2 -0
  254. package/dist/navigation/Breadcrumbs/index.d.ts.map +1 -0
  255. package/dist/navigation/DropdownMenu/dropdown-menu.d.ts +50 -0
  256. package/dist/navigation/DropdownMenu/dropdown-menu.d.ts.map +1 -0
  257. package/dist/navigation/DropdownMenu/dropdown-menu.js +193 -0
  258. package/dist/navigation/DropdownMenu/dropdown-menu.js.map +1 -0
  259. package/dist/navigation/DropdownMenu/dropdown-menu.module.scss.js +4 -0
  260. package/dist/navigation/DropdownMenu/dropdown-menu.module.scss.js.map +1 -0
  261. package/dist/navigation/DropdownMenu/index.d.ts +2 -0
  262. package/dist/navigation/DropdownMenu/index.d.ts.map +1 -0
  263. package/dist/navigation/Link/index.d.ts +2 -0
  264. package/dist/navigation/Link/index.d.ts.map +1 -0
  265. package/dist/navigation/Link/link-variants.d.ts +6 -0
  266. package/dist/navigation/Link/link-variants.d.ts.map +1 -0
  267. package/dist/navigation/Link/link-variants.js +33 -0
  268. package/dist/navigation/Link/link-variants.js.map +1 -0
  269. package/dist/navigation/Link/link.d.ts +24 -0
  270. package/dist/navigation/Link/link.d.ts.map +1 -0
  271. package/dist/navigation/Link/link.js +49 -0
  272. package/dist/navigation/Link/link.js.map +1 -0
  273. package/dist/navigation/Link/link.module.scss.js +4 -0
  274. package/dist/navigation/Link/link.module.scss.js.map +1 -0
  275. package/dist/navigation/NavUser/index.d.ts +2 -0
  276. package/dist/navigation/NavUser/index.d.ts.map +1 -0
  277. package/dist/navigation/NavUser/nav-user.d.ts +8 -0
  278. package/dist/navigation/NavUser/nav-user.d.ts.map +1 -0
  279. package/dist/navigation/NavUser/nav-user.js +15 -0
  280. package/dist/navigation/NavUser/nav-user.js.map +1 -0
  281. package/dist/navigation/NavUser/nav-user.module.scss.js +4 -0
  282. package/dist/navigation/NavUser/nav-user.module.scss.js.map +1 -0
  283. package/dist/navigation/Router/index.d.ts +2 -0
  284. package/dist/navigation/Router/index.d.ts.map +1 -0
  285. package/dist/navigation/Router/router-context.d.ts +38 -0
  286. package/dist/navigation/Router/router-context.d.ts.map +1 -0
  287. package/dist/navigation/Router/router-context.js +49 -0
  288. package/dist/navigation/Router/router-context.js.map +1 -0
  289. package/dist/navigation/Sheet/index.d.ts +2 -0
  290. package/dist/navigation/Sheet/index.d.ts.map +1 -0
  291. package/dist/navigation/Sheet/sheet.d.ts +36 -0
  292. package/dist/navigation/Sheet/sheet.d.ts.map +1 -0
  293. package/dist/navigation/Sheet/sheet.js +104 -0
  294. package/dist/navigation/Sheet/sheet.js.map +1 -0
  295. package/dist/navigation/Sheet/sheet.module.scss.js +4 -0
  296. package/dist/navigation/Sheet/sheet.module.scss.js.map +1 -0
  297. package/dist/navigation/index.d.ts +7 -0
  298. package/dist/navigation/index.d.ts.map +1 -0
  299. package/dist/navigation.d.ts +160 -0
  300. package/dist/navigation.js +7 -0
  301. package/dist/navigation.js.map +1 -0
  302. package/dist/row-CS9-talZ.d.ts +14 -0
  303. package/dist/settings/AppearanceDropdown/appearance-dropdown.d.ts +3 -0
  304. package/dist/settings/AppearanceDropdown/appearance-dropdown.d.ts.map +1 -0
  305. package/dist/settings/AppearanceDropdown/appearance-dropdown.js +27 -0
  306. package/dist/settings/AppearanceDropdown/appearance-dropdown.js.map +1 -0
  307. package/dist/settings/AppearanceDropdown/index.d.ts +2 -0
  308. package/dist/settings/AppearanceDropdown/index.d.ts.map +1 -0
  309. package/dist/settings/AppearanceTabs/appearance-tabs.d.ts +7 -0
  310. package/dist/settings/AppearanceTabs/appearance-tabs.d.ts.map +1 -0
  311. package/dist/settings/AppearanceTabs/appearance-tabs.js +23 -0
  312. package/dist/settings/AppearanceTabs/appearance-tabs.js.map +1 -0
  313. package/dist/settings/AppearanceTabs/appearance-tabs.module.scss.js +4 -0
  314. package/dist/settings/AppearanceTabs/appearance-tabs.module.scss.js.map +1 -0
  315. package/dist/settings/AppearanceTabs/index.d.ts +2 -0
  316. package/dist/settings/AppearanceTabs/index.d.ts.map +1 -0
  317. package/dist/settings/index.d.ts +3 -0
  318. package/dist/settings/index.d.ts.map +1 -0
  319. package/dist/settings.d.ts +10 -0
  320. package/dist/settings.js +3 -0
  321. package/dist/settings.js.map +1 -0
  322. package/dist/styles/index.d.ts +2 -0
  323. package/dist/styles/index.d.ts.map +1 -0
  324. package/dist/tooltip-XagXjWLB.d.ts +41 -0
  325. package/dist/types/app.d.ts +7 -0
  326. package/dist/types/app.d.ts.map +1 -0
  327. package/dist/types/form/date-picker.d.ts +19 -0
  328. package/dist/types/form/date-picker.d.ts.map +1 -0
  329. package/dist/types/form/select.d.ts +52 -0
  330. package/dist/types/form/select.d.ts.map +1 -0
  331. package/dist/types/form/theme.d.ts +2 -0
  332. package/dist/types/form/theme.d.ts.map +1 -0
  333. package/dist/types/form/upload.d.ts +4 -0
  334. package/dist/types/form/upload.d.ts.map +1 -0
  335. package/dist/types/index.d.ts +15 -0
  336. package/dist/types/index.d.ts.map +1 -0
  337. package/dist/types/layout/column.d.ts +11 -0
  338. package/dist/types/layout/column.d.ts.map +1 -0
  339. package/dist/types/layout/container.d.ts +18 -0
  340. package/dist/types/layout/container.d.ts.map +1 -0
  341. package/dist/types/layout/grid.d.ts +23 -0
  342. package/dist/types/layout/grid.d.ts.map +1 -0
  343. package/dist/types/layout/row.d.ts +12 -0
  344. package/dist/types/layout/row.d.ts.map +1 -0
  345. package/dist/types/layout/sidebar.d.ts +14 -0
  346. package/dist/types/layout/sidebar.d.ts.map +1 -0
  347. package/dist/types/navigation.d.ts +30 -0
  348. package/dist/types/navigation.d.ts.map +1 -0
  349. package/dist/types/ui/alerts.d.ts +20 -0
  350. package/dist/types/ui/alerts.d.ts.map +1 -0
  351. package/dist/types/ui/pagination.d.ts +10 -0
  352. package/dist/types/ui/pagination.d.ts.map +1 -0
  353. package/dist/types/ui/table.d.ts +11 -0
  354. package/dist/types/ui/table.d.ts.map +1 -0
  355. package/dist/typography/Heading/heading.d.ts +21 -0
  356. package/dist/typography/Heading/heading.d.ts.map +1 -0
  357. package/dist/typography/Heading/heading.js +21 -0
  358. package/dist/typography/Heading/heading.js.map +1 -0
  359. package/dist/typography/Heading/heading.module.scss.js +4 -0
  360. package/dist/typography/Heading/heading.module.scss.js.map +1 -0
  361. package/dist/typography/Heading/index.d.ts +2 -0
  362. package/dist/typography/Heading/index.d.ts.map +1 -0
  363. package/dist/typography/TruncatedText/index.d.ts +2 -0
  364. package/dist/typography/TruncatedText/index.d.ts.map +1 -0
  365. package/dist/typography/TruncatedText/truncated-text.d.ts +15 -0
  366. package/dist/typography/TruncatedText/truncated-text.d.ts.map +1 -0
  367. package/dist/typography/TruncatedText/truncated-text.js +61 -0
  368. package/dist/typography/TruncatedText/truncated-text.js.map +1 -0
  369. package/dist/typography/TruncatedText/truncated-text.module.scss.js +4 -0
  370. package/dist/typography/TruncatedText/truncated-text.module.scss.js.map +1 -0
  371. package/dist/typography/Typography/index.d.ts +2 -0
  372. package/dist/typography/Typography/index.d.ts.map +1 -0
  373. package/dist/typography/Typography/typography-variants.d.ts +9 -0
  374. package/dist/typography/Typography/typography-variants.d.ts.map +1 -0
  375. package/dist/typography/Typography/typography-variants.js +75 -0
  376. package/dist/typography/Typography/typography-variants.js.map +1 -0
  377. package/dist/typography/Typography/typography.d.ts +19 -0
  378. package/dist/typography/Typography/typography.d.ts.map +1 -0
  379. package/dist/typography/Typography/typography.js +43 -0
  380. package/dist/typography/Typography/typography.js.map +1 -0
  381. package/dist/typography/Typography/typography.module.scss.js +4 -0
  382. package/dist/typography/Typography/typography.module.scss.js.map +1 -0
  383. package/dist/typography/index.d.ts +4 -0
  384. package/dist/typography/index.d.ts.map +1 -0
  385. package/dist/typography-DOZHFR5A.d.ts +21 -0
  386. package/dist/typography.d.ts +37 -0
  387. package/dist/typography.js +4 -0
  388. package/dist/typography.js.map +1 -0
  389. package/dist/ui/Alert/alert-context.d.ts +3 -0
  390. package/dist/ui/Alert/alert-context.d.ts.map +1 -0
  391. package/dist/ui/Alert/alert-context.js +6 -0
  392. package/dist/ui/Alert/alert-context.js.map +1 -0
  393. package/dist/ui/Alert/alert-persist.d.ts +4 -0
  394. package/dist/ui/Alert/alert-persist.d.ts.map +1 -0
  395. package/dist/ui/Alert/alert-persist.js +27 -0
  396. package/dist/ui/Alert/alert-persist.js.map +1 -0
  397. package/dist/ui/Alert/alert-provider.d.ts +6 -0
  398. package/dist/ui/Alert/alert-provider.d.ts.map +1 -0
  399. package/dist/ui/Alert/alert-provider.js +57 -0
  400. package/dist/ui/Alert/alert-provider.js.map +1 -0
  401. package/dist/ui/Alert/alert-variants.d.ts +4 -0
  402. package/dist/ui/Alert/alert-variants.d.ts.map +1 -0
  403. package/dist/ui/Alert/alert-variants.js +23 -0
  404. package/dist/ui/Alert/alert-variants.js.map +1 -0
  405. package/dist/ui/Alert/alert.d.ts +24 -0
  406. package/dist/ui/Alert/alert.d.ts.map +1 -0
  407. package/dist/ui/Alert/alert.js +37 -0
  408. package/dist/ui/Alert/alert.js.map +1 -0
  409. package/dist/ui/Alert/alert.module.scss.js +4 -0
  410. package/dist/ui/Alert/alert.module.scss.js.map +1 -0
  411. package/dist/ui/Alert/index.d.ts +4 -0
  412. package/dist/ui/Alert/index.d.ts.map +1 -0
  413. package/dist/ui/Avatar/avatar.d.ts +9 -0
  414. package/dist/ui/Avatar/avatar.d.ts.map +1 -0
  415. package/dist/ui/Avatar/avatar.js +29 -0
  416. package/dist/ui/Avatar/avatar.js.map +1 -0
  417. package/dist/ui/Avatar/avatar.module.scss.js +4 -0
  418. package/dist/ui/Avatar/avatar.module.scss.js.map +1 -0
  419. package/dist/ui/Avatar/index.d.ts +2 -0
  420. package/dist/ui/Avatar/index.d.ts.map +1 -0
  421. package/dist/ui/Button/button-variants.d.ts +8 -0
  422. package/dist/ui/Button/button-variants.d.ts.map +1 -0
  423. package/dist/ui/Button/button-variants.js +45 -0
  424. package/dist/ui/Button/button-variants.js.map +1 -0
  425. package/dist/ui/Button/button.d.ts +9 -0
  426. package/dist/ui/Button/button.d.ts.map +1 -0
  427. package/dist/ui/Button/button.js +65 -0
  428. package/dist/ui/Button/button.js.map +1 -0
  429. package/dist/ui/Button/button.module.scss.js +4 -0
  430. package/dist/ui/Button/button.module.scss.js.map +1 -0
  431. package/dist/ui/Button/index.d.ts +2 -0
  432. package/dist/ui/Button/index.d.ts.map +1 -0
  433. package/dist/ui/Chip/chip-variants.d.ts +6 -0
  434. package/dist/ui/Chip/chip-variants.d.ts.map +1 -0
  435. package/dist/ui/Chip/chip-variants.js +32 -0
  436. package/dist/ui/Chip/chip-variants.js.map +1 -0
  437. package/dist/ui/Chip/chip.d.ts +8 -0
  438. package/dist/ui/Chip/chip.d.ts.map +1 -0
  439. package/dist/ui/Chip/chip.js +13 -0
  440. package/dist/ui/Chip/chip.js.map +1 -0
  441. package/dist/ui/Chip/chip.module.scss.js +4 -0
  442. package/dist/ui/Chip/chip.module.scss.js.map +1 -0
  443. package/dist/ui/Chip/index.d.ts +2 -0
  444. package/dist/ui/Chip/index.d.ts.map +1 -0
  445. package/dist/ui/CodeBlock/code-block-variants.d.ts +5 -0
  446. package/dist/ui/CodeBlock/code-block-variants.d.ts.map +1 -0
  447. package/dist/ui/CodeBlock/code-block-variants.js +29 -0
  448. package/dist/ui/CodeBlock/code-block-variants.js.map +1 -0
  449. package/dist/ui/CodeBlock/code-block.d.ts +20 -0
  450. package/dist/ui/CodeBlock/code-block.d.ts.map +1 -0
  451. package/dist/ui/CodeBlock/code-block.js +70 -0
  452. package/dist/ui/CodeBlock/code-block.js.map +1 -0
  453. package/dist/ui/CodeBlock/code-block.module.scss.js +4 -0
  454. package/dist/ui/CodeBlock/code-block.module.scss.js.map +1 -0
  455. package/dist/ui/CodeBlock/index.d.ts +2 -0
  456. package/dist/ui/CodeBlock/index.d.ts.map +1 -0
  457. package/dist/ui/DevIndicator/dev-indicator.d.ts +5 -0
  458. package/dist/ui/DevIndicator/dev-indicator.d.ts.map +1 -0
  459. package/dist/ui/DevIndicator/dev-indicator.js +20 -0
  460. package/dist/ui/DevIndicator/dev-indicator.js.map +1 -0
  461. package/dist/ui/DevIndicator/dev-indicator.module.scss.js +4 -0
  462. package/dist/ui/DevIndicator/dev-indicator.module.scss.js.map +1 -0
  463. package/dist/ui/DevIndicator/index.d.ts +2 -0
  464. package/dist/ui/DevIndicator/index.d.ts.map +1 -0
  465. package/dist/ui/Dialog/dialog.d.ts +50 -0
  466. package/dist/ui/Dialog/dialog.d.ts.map +1 -0
  467. package/dist/ui/Dialog/dialog.js +133 -0
  468. package/dist/ui/Dialog/dialog.js.map +1 -0
  469. package/dist/ui/Dialog/dialog.module.scss.js +4 -0
  470. package/dist/ui/Dialog/dialog.module.scss.js.map +1 -0
  471. package/dist/ui/Dialog/index.d.ts +2 -0
  472. package/dist/ui/Dialog/index.d.ts.map +1 -0
  473. package/dist/ui/EmptyState/empty-state-variants.d.ts +5 -0
  474. package/dist/ui/EmptyState/empty-state-variants.d.ts.map +1 -0
  475. package/dist/ui/EmptyState/empty-state-variants.js +29 -0
  476. package/dist/ui/EmptyState/empty-state-variants.js.map +1 -0
  477. package/dist/ui/EmptyState/empty-state.d.ts +16 -0
  478. package/dist/ui/EmptyState/empty-state.d.ts.map +1 -0
  479. package/dist/ui/EmptyState/empty-state.js +13 -0
  480. package/dist/ui/EmptyState/empty-state.js.map +1 -0
  481. package/dist/ui/EmptyState/empty-state.module.scss.js +4 -0
  482. package/dist/ui/EmptyState/empty-state.module.scss.js.map +1 -0
  483. package/dist/ui/EmptyState/index.d.ts +2 -0
  484. package/dist/ui/EmptyState/index.d.ts.map +1 -0
  485. package/dist/ui/Icon/icon-variants.d.ts +7 -0
  486. package/dist/ui/Icon/icon-variants.d.ts.map +1 -0
  487. package/dist/ui/Icon/icon-variants.js +43 -0
  488. package/dist/ui/Icon/icon-variants.js.map +1 -0
  489. package/dist/ui/Icon/icon.d.ts +44 -0
  490. package/dist/ui/Icon/icon.d.ts.map +1 -0
  491. package/dist/ui/Icon/icon.js +41 -0
  492. package/dist/ui/Icon/icon.js.map +1 -0
  493. package/dist/ui/Icon/icon.module.scss.js +4 -0
  494. package/dist/ui/Icon/icon.module.scss.js.map +1 -0
  495. package/dist/ui/Icon/index.d.ts +2 -0
  496. package/dist/ui/Icon/index.d.ts.map +1 -0
  497. package/dist/ui/List/index.d.ts +2 -0
  498. package/dist/ui/List/index.d.ts.map +1 -0
  499. package/dist/ui/List/list.d.ts +14 -0
  500. package/dist/ui/List/list.d.ts.map +1 -0
  501. package/dist/ui/List/list.js +20 -0
  502. package/dist/ui/List/list.js.map +1 -0
  503. package/dist/ui/List/list.module.scss.js +4 -0
  504. package/dist/ui/List/list.module.scss.js.map +1 -0
  505. package/dist/ui/Pagination/index.d.ts +2 -0
  506. package/dist/ui/Pagination/index.d.ts.map +1 -0
  507. package/dist/ui/Pagination/pagination.d.ts +5 -0
  508. package/dist/ui/Pagination/pagination.d.ts.map +1 -0
  509. package/dist/ui/Pagination/pagination.js +37 -0
  510. package/dist/ui/Pagination/pagination.js.map +1 -0
  511. package/dist/ui/Pagination/pagination.module.scss.js +4 -0
  512. package/dist/ui/Pagination/pagination.module.scss.js.map +1 -0
  513. package/dist/ui/ProgressBar/index.d.ts +2 -0
  514. package/dist/ui/ProgressBar/index.d.ts.map +1 -0
  515. package/dist/ui/ProgressBar/progress-bar-variants.d.ts +9 -0
  516. package/dist/ui/ProgressBar/progress-bar-variants.d.ts.map +1 -0
  517. package/dist/ui/ProgressBar/progress-bar-variants.js +46 -0
  518. package/dist/ui/ProgressBar/progress-bar-variants.js.map +1 -0
  519. package/dist/ui/ProgressBar/progress-bar.d.ts +12 -0
  520. package/dist/ui/ProgressBar/progress-bar.d.ts.map +1 -0
  521. package/dist/ui/ProgressBar/progress-bar.js +14 -0
  522. package/dist/ui/ProgressBar/progress-bar.js.map +1 -0
  523. package/dist/ui/ProgressBar/progress-bar.module.scss.js +4 -0
  524. package/dist/ui/ProgressBar/progress-bar.module.scss.js.map +1 -0
  525. package/dist/ui/Separator/index.d.ts +2 -0
  526. package/dist/ui/Separator/index.d.ts.map +1 -0
  527. package/dist/ui/Separator/separator.d.ts +8 -0
  528. package/dist/ui/Separator/separator.d.ts.map +1 -0
  529. package/dist/ui/Separator/separator.js +10 -0
  530. package/dist/ui/Separator/separator.js.map +1 -0
  531. package/dist/ui/Separator/separator.module.scss.js +4 -0
  532. package/dist/ui/Separator/separator.module.scss.js.map +1 -0
  533. package/dist/ui/StatCard/index.d.ts +2 -0
  534. package/dist/ui/StatCard/index.d.ts.map +1 -0
  535. package/dist/ui/StatCard/stat-card-variants.d.ts +6 -0
  536. package/dist/ui/StatCard/stat-card-variants.d.ts.map +1 -0
  537. package/dist/ui/StatCard/stat-card-variants.js +35 -0
  538. package/dist/ui/StatCard/stat-card-variants.js.map +1 -0
  539. package/dist/ui/StatCard/stat-card.d.ts +31 -0
  540. package/dist/ui/StatCard/stat-card.d.ts.map +1 -0
  541. package/dist/ui/StatCard/stat-card.js +56 -0
  542. package/dist/ui/StatCard/stat-card.js.map +1 -0
  543. package/dist/ui/StatCard/stat-card.module.scss.js +4 -0
  544. package/dist/ui/StatCard/stat-card.module.scss.js.map +1 -0
  545. package/dist/ui/StepProgress/index.d.ts +2 -0
  546. package/dist/ui/StepProgress/index.d.ts.map +1 -0
  547. package/dist/ui/StepProgress/step-progress-variants.d.ts +7 -0
  548. package/dist/ui/StepProgress/step-progress-variants.d.ts.map +1 -0
  549. package/dist/ui/StepProgress/step-progress-variants.js +39 -0
  550. package/dist/ui/StepProgress/step-progress-variants.js.map +1 -0
  551. package/dist/ui/StepProgress/step-progress.d.ts +20 -0
  552. package/dist/ui/StepProgress/step-progress.d.ts.map +1 -0
  553. package/dist/ui/StepProgress/step-progress.js +40 -0
  554. package/dist/ui/StepProgress/step-progress.js.map +1 -0
  555. package/dist/ui/StepProgress/step-progress.module.scss.js +4 -0
  556. package/dist/ui/StepProgress/step-progress.module.scss.js.map +1 -0
  557. package/dist/ui/Switch/index.d.ts +2 -0
  558. package/dist/ui/Switch/index.d.ts.map +1 -0
  559. package/dist/ui/Switch/switch-variants.d.ts +5 -0
  560. package/dist/ui/Switch/switch-variants.d.ts.map +1 -0
  561. package/dist/ui/Switch/switch-variants.js +29 -0
  562. package/dist/ui/Switch/switch-variants.js.map +1 -0
  563. package/dist/ui/Switch/switch.d.ts +10 -0
  564. package/dist/ui/Switch/switch.d.ts.map +1 -0
  565. package/dist/ui/Switch/switch.js +18 -0
  566. package/dist/ui/Switch/switch.js.map +1 -0
  567. package/dist/ui/Switch/switch.module.scss.js +4 -0
  568. package/dist/ui/Switch/switch.module.scss.js.map +1 -0
  569. package/dist/ui/Table/index.d.ts +2 -0
  570. package/dist/ui/Table/index.d.ts.map +1 -0
  571. package/dist/ui/Table/table-sort-context.d.ts +4 -0
  572. package/dist/ui/Table/table-sort-context.d.ts.map +1 -0
  573. package/dist/ui/Table/table-sort-context.js +6 -0
  574. package/dist/ui/Table/table-sort-context.js.map +1 -0
  575. package/dist/ui/Table/table.d.ts +32 -0
  576. package/dist/ui/Table/table.d.ts.map +1 -0
  577. package/dist/ui/Table/table.js +59 -0
  578. package/dist/ui/Table/table.js.map +1 -0
  579. package/dist/ui/Table/table.module.scss.js +4 -0
  580. package/dist/ui/Table/table.module.scss.js.map +1 -0
  581. package/dist/ui/TableActionCell/index.d.ts +2 -0
  582. package/dist/ui/TableActionCell/index.d.ts.map +1 -0
  583. package/dist/ui/TableActionCell/table-action-cell.d.ts +28 -0
  584. package/dist/ui/TableActionCell/table-action-cell.d.ts.map +1 -0
  585. package/dist/ui/TableActionCell/table-action-cell.js +27 -0
  586. package/dist/ui/TableActionCell/table-action-cell.js.map +1 -0
  587. package/dist/ui/TableActionCell/table-action-cell.module.scss.js +4 -0
  588. package/dist/ui/TableActionCell/table-action-cell.module.scss.js.map +1 -0
  589. package/dist/ui/TableToolbar/index.d.ts +2 -0
  590. package/dist/ui/TableToolbar/index.d.ts.map +1 -0
  591. package/dist/ui/TableToolbar/table-toolbar.d.ts +29 -0
  592. package/dist/ui/TableToolbar/table-toolbar.d.ts.map +1 -0
  593. package/dist/ui/TableToolbar/table-toolbar.js +18 -0
  594. package/dist/ui/TableToolbar/table-toolbar.js.map +1 -0
  595. package/dist/ui/TableToolbar/table-toolbar.module.scss.js +4 -0
  596. package/dist/ui/TableToolbar/table-toolbar.module.scss.js.map +1 -0
  597. package/dist/ui/Toggle/index.d.ts +2 -0
  598. package/dist/ui/Toggle/index.d.ts.map +1 -0
  599. package/dist/ui/Toggle/toggle-group-context.d.ts +9 -0
  600. package/dist/ui/Toggle/toggle-group-context.d.ts.map +1 -0
  601. package/dist/ui/Toggle/toggle-group-context.js +6 -0
  602. package/dist/ui/Toggle/toggle-group-context.js.map +1 -0
  603. package/dist/ui/Toggle/toggle-variants.d.ts +8 -0
  604. package/dist/ui/Toggle/toggle-variants.d.ts.map +1 -0
  605. package/dist/ui/Toggle/toggle-variants.js +45 -0
  606. package/dist/ui/Toggle/toggle-variants.js.map +1 -0
  607. package/dist/ui/Toggle/toggle.d.ts +12 -0
  608. package/dist/ui/Toggle/toggle.d.ts.map +1 -0
  609. package/dist/ui/Toggle/toggle.js +49 -0
  610. package/dist/ui/Toggle/toggle.js.map +1 -0
  611. package/dist/ui/Toggle/toggle.module.scss.js +4 -0
  612. package/dist/ui/Toggle/toggle.module.scss.js.map +1 -0
  613. package/dist/ui/ToggleGroup/index.d.ts +2 -0
  614. package/dist/ui/ToggleGroup/index.d.ts.map +1 -0
  615. package/dist/ui/ToggleGroup/toggle-group.d.ts +24 -0
  616. package/dist/ui/ToggleGroup/toggle-group.d.ts.map +1 -0
  617. package/dist/ui/ToggleGroup/toggle-group.js +80 -0
  618. package/dist/ui/ToggleGroup/toggle-group.js.map +1 -0
  619. package/dist/ui/ToggleGroup/toggle-group.module.scss.js +4 -0
  620. package/dist/ui/ToggleGroup/toggle-group.module.scss.js.map +1 -0
  621. package/dist/ui/Tooltip/index.d.ts +2 -0
  622. package/dist/ui/Tooltip/index.d.ts.map +1 -0
  623. package/dist/ui/Tooltip/tooltip.d.ts +24 -0
  624. package/dist/ui/Tooltip/tooltip.d.ts.map +1 -0
  625. package/dist/ui/Tooltip/tooltip.js +192 -0
  626. package/dist/ui/Tooltip/tooltip.js.map +1 -0
  627. package/dist/ui/Tooltip/tooltip.module.scss.js +4 -0
  628. package/dist/ui/Tooltip/tooltip.module.scss.js.map +1 -0
  629. package/dist/ui/index.d.ts +23 -0
  630. package/dist/ui/index.d.ts.map +1 -0
  631. package/dist/ui.d.ts +6 -0
  632. package/dist/ui.js +25 -0
  633. package/dist/ui.js.map +1 -0
  634. package/dist/user/UserInfo/index.d.ts +2 -0
  635. package/dist/user/UserInfo/index.d.ts.map +1 -0
  636. package/dist/user/UserInfo/user-info.d.ts +6 -0
  637. package/dist/user/UserInfo/user-info.d.ts.map +1 -0
  638. package/dist/user/UserInfo/user-info.js +17 -0
  639. package/dist/user/UserInfo/user-info.js.map +1 -0
  640. package/dist/user/UserInfo/user-info.module.scss.js +4 -0
  641. package/dist/user/UserInfo/user-info.module.scss.js.map +1 -0
  642. package/dist/user/UserMenuContent/index.d.ts +2 -0
  643. package/dist/user/UserMenuContent/index.d.ts.map +1 -0
  644. package/dist/user/UserMenuContent/user-menu-content.d.ts +25 -0
  645. package/dist/user/UserMenuContent/user-menu-content.d.ts.map +1 -0
  646. package/dist/user/UserMenuContent/user-menu-content.js +23 -0
  647. package/dist/user/UserMenuContent/user-menu-content.js.map +1 -0
  648. package/dist/user/index.d.ts +3 -0
  649. package/dist/user/index.d.ts.map +1 -0
  650. package/dist/user-menu-content-D0Ldzigm.d.ts +34 -0
  651. package/dist/user.d.ts +10 -0
  652. package/dist/user.js +3 -0
  653. package/dist/user.js.map +1 -0
  654. package/dist/utils/csrf.d.ts +2 -0
  655. package/dist/utils/csrf.d.ts.map +1 -0
  656. package/dist/utils/csrf.js +13 -0
  657. package/dist/utils/csrf.js.map +1 -0
  658. package/dist/utils/index.d.ts +2 -0
  659. package/dist/utils/index.d.ts.map +1 -0
  660. package/dist/utils.d.ts +3 -0
  661. package/dist/utils.js +2 -0
  662. package/dist/utils.js.map +1 -0
  663. package/package.json +208 -0
  664. package/src/styles/_mixins.scss +105 -0
  665. package/src/styles/_theme-context.scss +12 -0
  666. package/src/styles/mixins.scss +1 -0
  667. package/vite-plugin.d.ts +26 -0
  668. package/vite-plugin.mjs +95 -0
@@ -0,0 +1,857 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import inputStyles from '../Input/input.module.scss.js';
3
+ import { Label } from '../Label/label.js';
4
+ import { useBreakpoint } from '../../hooks/use-mobile.js';
5
+ import { Typography } from '../../typography/Typography/typography.js';
6
+ import cn from 'clsx';
7
+ import { CheckIcon, ChevronDownIcon } from 'lucide-react';
8
+ import * as React from 'react';
9
+ import { createPortal } from 'react-dom';
10
+ import s from './select.module.scss.js';
11
+
12
+ const SELECT_ANIMATION_DURATION = 200; // keep in sync with --select-duration in select.module.scss
13
+ const DEFAULT_SEARCH_THRESHOLD = 5;
14
+ const DEFAULT_COLLISION_PADDING = 8;
15
+ const SelectContext = React.createContext(null);
16
+ function clamp(value, min, max) {
17
+ return Math.min(Math.max(value, min), max);
18
+ }
19
+ function readNodeText(node) {
20
+ if (node == null || typeof node === 'boolean') {
21
+ return '';
22
+ }
23
+ if (typeof node === 'string' || typeof node === 'number') {
24
+ return String(node);
25
+ }
26
+ if (Array.isArray(node)) {
27
+ return node.map(readNodeText).join(' ').trim();
28
+ }
29
+ if (React.isValidElement(node)) {
30
+ return readNodeText(node.props.children);
31
+ }
32
+ return '';
33
+ }
34
+ function collectSelectItems(node) {
35
+ const items = [];
36
+ const visit = (childNode) => {
37
+ React.Children.forEach(childNode, child => {
38
+ if (!React.isValidElement(child)) {
39
+ return;
40
+ }
41
+ if (child.props.value !== undefined) {
42
+ items.push({
43
+ value: String(child.props.value),
44
+ label: readNodeText(child.props.children).trim(),
45
+ disabled: Boolean(child.props.disabled),
46
+ });
47
+ return;
48
+ }
49
+ if (child.props.children) {
50
+ visit(child.props.children);
51
+ }
52
+ });
53
+ };
54
+ visit(node);
55
+ return items;
56
+ }
57
+ function getNavigableItems(viewport, slot) {
58
+ if (!viewport) {
59
+ return [];
60
+ }
61
+ return Array.from(viewport.querySelectorAll(`[data-slot='${slot}']:not([data-disabled='true'])`));
62
+ }
63
+ function focusItemByValue(viewport, slot, value) {
64
+ const items = getNavigableItems(viewport, slot);
65
+ if (!items.length) {
66
+ return;
67
+ }
68
+ const target = value ? items.find(item => item.dataset.value === value) : undefined;
69
+ (target ?? items[0])?.focus();
70
+ }
71
+ function moveItemFocus(viewport, slot, direction) {
72
+ const items = getNavigableItems(viewport, slot);
73
+ if (!items.length) {
74
+ return;
75
+ }
76
+ if (direction === 'first') {
77
+ items[0]?.focus();
78
+ return;
79
+ }
80
+ if (direction === 'last') {
81
+ items[items.length - 1]?.focus();
82
+ return;
83
+ }
84
+ const currentIndex = items.findIndex(item => item === document.activeElement);
85
+ const fallbackIndex = direction === 'next' ? 0 : items.length - 1;
86
+ if (currentIndex === -1) {
87
+ items[fallbackIndex]?.focus();
88
+ return;
89
+ }
90
+ const nextIndex = direction === 'next'
91
+ ? (currentIndex + 1) % items.length
92
+ : (currentIndex - 1 + items.length) % items.length;
93
+ items[nextIndex]?.focus();
94
+ }
95
+ function useDismissibleLayer({ contentRef, onDismiss, open, triggerRef, }) {
96
+ React.useEffect(() => {
97
+ if (!open) {
98
+ return;
99
+ }
100
+ const handlePointer = (event) => {
101
+ const target = event.target;
102
+ if (target instanceof Node &&
103
+ (triggerRef.current?.contains(target) || contentRef.current?.contains(target))) {
104
+ return;
105
+ }
106
+ onDismiss();
107
+ };
108
+ const handleFocus = (event) => {
109
+ const target = event.target;
110
+ if (target instanceof Node &&
111
+ (triggerRef.current?.contains(target) || contentRef.current?.contains(target))) {
112
+ return;
113
+ }
114
+ onDismiss();
115
+ };
116
+ document.addEventListener('mousedown', handlePointer);
117
+ document.addEventListener('touchstart', handlePointer);
118
+ document.addEventListener('focusin', handleFocus);
119
+ return () => {
120
+ document.removeEventListener('mousedown', handlePointer);
121
+ document.removeEventListener('touchstart', handlePointer);
122
+ document.removeEventListener('focusin', handleFocus);
123
+ };
124
+ }, [contentRef, onDismiss, open, triggerRef]);
125
+ }
126
+ function useSurfacePosition({ align = 'start', collisionPadding = DEFAULT_COLLISION_PADDING, contentRef, displayOpen, position = 'popper', side = 'bottom', sideOffset = 4, triggerRef, }) {
127
+ const [computedStyle, setComputedStyle] = React.useState({
128
+ position: 'fixed',
129
+ visibility: 'hidden',
130
+ });
131
+ const [resolvedSide, setResolvedSide] = React.useState(side);
132
+ React.useLayoutEffect(() => {
133
+ if (!displayOpen) {
134
+ return;
135
+ }
136
+ const triggerElement = triggerRef.current;
137
+ const contentElement = contentRef.current;
138
+ if (!triggerElement || !contentElement) {
139
+ return;
140
+ }
141
+ const updatePosition = () => {
142
+ const triggerRect = triggerElement.getBoundingClientRect();
143
+ const contentRect = {
144
+ width: contentElement.offsetWidth,
145
+ height: contentElement.offsetHeight,
146
+ };
147
+ const padding = collisionPadding;
148
+ // The surface is portaled to <body> and positioned `fixed`, so the
149
+ // collision boundary is always the viewport — never an ancestor's box.
150
+ const boundaryLeft = 0;
151
+ const boundaryTop = 0;
152
+ const boundaryWidth = window.innerWidth;
153
+ const boundaryHeight = window.innerHeight;
154
+ const boundaryRight = boundaryWidth;
155
+ const boundaryBottom = boundaryHeight;
156
+ let nextSide = side;
157
+ if (side === 'bottom' || side === 'top') {
158
+ const canFitBelow = triggerRect.bottom + sideOffset + contentRect.height <= boundaryBottom - padding;
159
+ const canFitAbove = triggerRect.top - sideOffset - contentRect.height >= boundaryTop + padding;
160
+ if (side === 'bottom' && !canFitBelow && canFitAbove) {
161
+ nextSide = 'top';
162
+ }
163
+ if (side === 'top' && !canFitAbove && canFitBelow) {
164
+ nextSide = 'bottom';
165
+ }
166
+ }
167
+ else {
168
+ const canFitRight = triggerRect.right + sideOffset + contentRect.width <= boundaryRight - padding;
169
+ const canFitLeft = triggerRect.left - sideOffset - contentRect.width >= boundaryLeft + padding;
170
+ if (side === 'right' && !canFitRight && canFitLeft) {
171
+ nextSide = 'left';
172
+ }
173
+ if (side === 'left' && !canFitLeft && canFitRight) {
174
+ nextSide = 'right';
175
+ }
176
+ }
177
+ let top = triggerRect.bottom + sideOffset;
178
+ let left = triggerRect.left;
179
+ if (nextSide === 'bottom' || nextSide === 'top') {
180
+ top =
181
+ nextSide === 'bottom'
182
+ ? triggerRect.bottom + sideOffset
183
+ : triggerRect.top - contentRect.height - sideOffset;
184
+ if (align === 'center') {
185
+ left = triggerRect.left + (triggerRect.width - contentRect.width) / 2;
186
+ }
187
+ else if (align === 'end') {
188
+ left = triggerRect.right - contentRect.width;
189
+ }
190
+ else {
191
+ left = triggerRect.left;
192
+ }
193
+ }
194
+ else {
195
+ left =
196
+ nextSide === 'right'
197
+ ? triggerRect.right + sideOffset
198
+ : triggerRect.left - contentRect.width - sideOffset;
199
+ if (align === 'center') {
200
+ top = triggerRect.top + (triggerRect.height - contentRect.height) / 2;
201
+ }
202
+ else if (align === 'end') {
203
+ top = triggerRect.bottom - contentRect.height;
204
+ }
205
+ else {
206
+ top = triggerRect.top;
207
+ }
208
+ }
209
+ left = clamp(left, padding, Math.max(padding, boundaryWidth - contentRect.width - padding));
210
+ top = clamp(top, padding, Math.max(padding, boundaryHeight - contentRect.height - padding));
211
+ setResolvedSide(nextSide);
212
+ setComputedStyle({ position: 'fixed', top, left });
213
+ };
214
+ updatePosition();
215
+ const resizeObserver = new ResizeObserver(updatePosition);
216
+ resizeObserver.observe(triggerElement);
217
+ resizeObserver.observe(contentElement);
218
+ window.addEventListener('resize', updatePosition);
219
+ window.addEventListener('scroll', updatePosition, true);
220
+ return () => {
221
+ resizeObserver.disconnect();
222
+ window.removeEventListener('resize', updatePosition);
223
+ window.removeEventListener('scroll', updatePosition, true);
224
+ };
225
+ }, [align, collisionPadding, contentRef, displayOpen, position, side, sideOffset, triggerRef]);
226
+ return { computedStyle, resolvedSide };
227
+ }
228
+ function useSelectContext(componentName) {
229
+ const context = React.useContext(SelectContext);
230
+ if (!context) {
231
+ throw new Error(`${componentName} must be used within Select.`);
232
+ }
233
+ return context;
234
+ }
235
+ function Surface({ align = 'start', children, className, collisionPadding = DEFAULT_COLLISION_PADDING, contentRef, displayOpen, isClosing = false, onKeyDown, open, position = 'popper', side = 'bottom', sideOffset = 4, triggerRef, ...props }) {
236
+ const { computedStyle, resolvedSide } = useSurfacePosition({
237
+ align,
238
+ collisionPadding,
239
+ contentRef,
240
+ displayOpen,
241
+ position,
242
+ side,
243
+ sideOffset,
244
+ triggerRef,
245
+ });
246
+ if (!displayOpen || typeof document === 'undefined') {
247
+ return null;
248
+ }
249
+ return createPortal(jsx("div", { ref: contentRef, "data-state": open ? 'open' : 'closed', "data-closing": isClosing ? 'true' : undefined, "data-side": resolvedSide, className: className, style: computedStyle, onKeyDown: onKeyDown, ...props, children: children }),
250
+ // Always <body>: a Dialog/Sheet shell scrolls its own overflow, which would
251
+ // clip a dropdown rendered inside it. The dialog dismisses via a click on
252
+ // its overlay (not a document listener) and its focus trap only intercepts
253
+ // Tab, so an out-of-tree surface stays safe on both counts.
254
+ document.body);
255
+ }
256
+ function Select({ open: openProp, defaultOpen, onOpenChange, value: valueProp, defaultValue, onValueChange, disabled = false, children, ...props }) {
257
+ const isOpenControlled = openProp !== undefined;
258
+ const isValueControlled = valueProp !== undefined;
259
+ const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen ?? false);
260
+ const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);
261
+ const [isClosing, setIsClosing] = React.useState(false);
262
+ const closeTimerRef = React.useRef(null);
263
+ const triggerRef = React.useRef(null);
264
+ const contentRef = React.useRef(null);
265
+ const viewportRef = React.useRef(null);
266
+ const contentId = React.useId();
267
+ const currentOpen = isOpenControlled ? openProp : uncontrolledOpen;
268
+ const currentValue = isValueControlled ? valueProp : uncontrolledValue;
269
+ const displayOpen = currentOpen || isClosing;
270
+ const items = React.useMemo(() => collectSelectItems(children), [children]);
271
+ const selectedLabel = items.find(item => item.value === currentValue)?.label;
272
+ const clearCloseTimer = React.useCallback(() => {
273
+ if (closeTimerRef.current) {
274
+ clearTimeout(closeTimerRef.current);
275
+ closeTimerRef.current = null;
276
+ }
277
+ }, []);
278
+ const setOpen = React.useCallback((nextOpen) => {
279
+ if (nextOpen) {
280
+ clearCloseTimer();
281
+ setIsClosing(false);
282
+ if (!isOpenControlled) {
283
+ setUncontrolledOpen(true);
284
+ }
285
+ onOpenChange?.(true);
286
+ return;
287
+ }
288
+ onOpenChange?.(false);
289
+ if (!isOpenControlled) {
290
+ setUncontrolledOpen(false);
291
+ }
292
+ setIsClosing(true);
293
+ clearCloseTimer();
294
+ closeTimerRef.current = setTimeout(() => {
295
+ setIsClosing(false);
296
+ }, SELECT_ANIMATION_DURATION);
297
+ }, [clearCloseTimer, isOpenControlled, onOpenChange]);
298
+ const setValue = React.useCallback((nextValue) => {
299
+ if (!isValueControlled) {
300
+ setUncontrolledValue(nextValue);
301
+ }
302
+ onValueChange?.(nextValue);
303
+ setOpen(false);
304
+ requestAnimationFrame(() => {
305
+ triggerRef.current?.focus();
306
+ });
307
+ }, [isValueControlled, onValueChange, setOpen]);
308
+ useDismissibleLayer({
309
+ contentRef,
310
+ onDismiss: () => setOpen(false),
311
+ open: currentOpen,
312
+ triggerRef,
313
+ });
314
+ React.useEffect(() => {
315
+ return () => clearCloseTimer();
316
+ }, [clearCloseTimer]);
317
+ const contextValue = React.useMemo(() => ({
318
+ contentId,
319
+ contentRef,
320
+ disabled,
321
+ displayOpen,
322
+ isClosing,
323
+ items,
324
+ open: currentOpen,
325
+ selectedLabel,
326
+ setOpen,
327
+ setValue,
328
+ triggerRef,
329
+ value: currentValue,
330
+ viewportRef,
331
+ }), [
332
+ contentId,
333
+ currentOpen,
334
+ currentValue,
335
+ disabled,
336
+ displayOpen,
337
+ isClosing,
338
+ items,
339
+ selectedLabel,
340
+ setOpen,
341
+ setValue,
342
+ ]);
343
+ return (jsx(SelectContext.Provider, { value: contextValue, children: jsx("div", { "data-slot": 'select', ...props, children: children }) }));
344
+ }
345
+ function SelectGroup({ ...props }) {
346
+ return jsx("div", { "data-slot": 'select-group', ...props });
347
+ }
348
+ function SelectValue({ children, placeholder, ...props }) {
349
+ const context = useSelectContext('SelectValue');
350
+ const content = children ?? context.selectedLabel ?? placeholder;
351
+ return (jsx("span", { "data-slot": 'select-value', ...props, children: content }));
352
+ }
353
+ function SelectTrigger({ className, children, onClick, onKeyDown, type, ...props }) {
354
+ const context = useSelectContext('SelectTrigger');
355
+ const handleClick = (event) => {
356
+ onClick?.(event);
357
+ if (event.defaultPrevented || context.disabled) {
358
+ return;
359
+ }
360
+ context.setOpen(!context.open);
361
+ };
362
+ const handleKeyDown = (event) => {
363
+ onKeyDown?.(event);
364
+ if (event.defaultPrevented || context.disabled) {
365
+ return;
366
+ }
367
+ if (event.key === 'Enter' ||
368
+ event.key === ' ' ||
369
+ event.key === 'ArrowDown' ||
370
+ event.key === 'ArrowUp') {
371
+ event.preventDefault();
372
+ context.setOpen(true);
373
+ }
374
+ // Only claim Escape when the surface is actually open — an unguarded
375
+ // preventDefault would swallow it from an enclosing Dialog/Sheet.
376
+ if (event.key === 'Escape' && context.open) {
377
+ event.preventDefault();
378
+ context.setOpen(false);
379
+ }
380
+ };
381
+ return (jsxs("button", { ref: context.triggerRef, "data-slot": 'select-trigger', type: type ?? 'button', "aria-controls": context.contentId, "aria-expanded": context.open, "aria-haspopup": 'listbox', disabled: context.disabled, className: cn(s.trigger, className), onClick: handleClick, onKeyDown: handleKeyDown, ...props, children: [children, jsx(ChevronDownIcon, { className: cn(s['trigger-icon']) })] }));
382
+ }
383
+ function SelectContent({ align = 'start', className, children, collisionPadding = DEFAULT_COLLISION_PADDING, onKeyDown, position = 'popper', side = 'bottom', sideOffset = 4, ...props }) {
384
+ const context = useSelectContext('SelectContent');
385
+ React.useEffect(() => {
386
+ if (!context.open) {
387
+ const content = context.contentRef.current;
388
+ if (content) {
389
+ content.style.maxWidth = '';
390
+ }
391
+ return;
392
+ }
393
+ const frame = requestAnimationFrame(() => {
394
+ const content = context.contentRef.current;
395
+ const triggerHasInput = context.triggerRef.current?.querySelector('input') != null;
396
+ if (!triggerHasInput && !content?.querySelector('input')) {
397
+ focusItemByValue(context.viewportRef.current, 'select-item', context.value);
398
+ }
399
+ });
400
+ return () => cancelAnimationFrame(frame);
401
+ }, [context.open, context.value, context.contentRef, context.viewportRef, context.triggerRef]);
402
+ const handleKeyDown = (event) => {
403
+ onKeyDown?.(event);
404
+ if (event.defaultPrevented) {
405
+ return;
406
+ }
407
+ if (event.key === 'Escape') {
408
+ event.preventDefault();
409
+ context.setOpen(false);
410
+ context.triggerRef.current?.focus();
411
+ return;
412
+ }
413
+ if (event.key === 'ArrowDown') {
414
+ event.preventDefault();
415
+ moveItemFocus(context.viewportRef.current, 'select-item', 'next');
416
+ return;
417
+ }
418
+ if (event.key === 'ArrowUp') {
419
+ event.preventDefault();
420
+ moveItemFocus(context.viewportRef.current, 'select-item', 'prev');
421
+ return;
422
+ }
423
+ if (event.key === 'Home') {
424
+ event.preventDefault();
425
+ moveItemFocus(context.viewportRef.current, 'select-item', 'first');
426
+ return;
427
+ }
428
+ if (event.key === 'End') {
429
+ event.preventDefault();
430
+ moveItemFocus(context.viewportRef.current, 'select-item', 'last');
431
+ }
432
+ };
433
+ return (jsx(Surface, { "data-slot": 'select-content', open: context.open, displayOpen: context.displayOpen, isClosing: context.isClosing, triggerRef: context.triggerRef, contentRef: context.contentRef, align: align, side: side, sideOffset: sideOffset, collisionPadding: collisionPadding, position: position, className: cn(s.content, className), onKeyDown: handleKeyDown, ...props, children: jsx("div", { ref: context.viewportRef, className: cn(s.viewport, position === 'popper' && s['viewport-popper']), id: context.contentId, role: 'listbox', children: children }) }));
434
+ }
435
+ function SelectItem({ className, children, disabled = false, onClick, onMouseMove, value, ...props }) {
436
+ const context = useSelectContext('SelectItem');
437
+ const selected = context.value === value;
438
+ const handleClick = (event) => {
439
+ onClick?.(event);
440
+ if (event.defaultPrevented || disabled) {
441
+ return;
442
+ }
443
+ context.setValue(value);
444
+ };
445
+ const handleMouseMove = (event) => {
446
+ onMouseMove?.(event);
447
+ if (disabled) {
448
+ return;
449
+ }
450
+ event.currentTarget.focus();
451
+ };
452
+ return (jsxs("button", { "data-slot": 'select-item', "data-value": value, "data-disabled": disabled ? 'true' : undefined, type: 'button', role: 'option', "aria-selected": selected, disabled: disabled, tabIndex: -1, className: cn(s.item, className), onClick: handleClick, onMouseMove: handleMouseMove, ...props, children: [jsx("span", { className: s['item-indicator'], children: selected ? jsx(CheckIcon, {}) : null }), jsx("span", { children: children })] }));
453
+ }
454
+ function SelectSeparator({ className, ...props }) {
455
+ return jsx("div", { "data-slot": 'select-separator', className: cn(s.separator, className), ...props });
456
+ }
457
+ function SelectInputTrigger({ className, id, onBlur, onFocus, placeholder, searchQuery, setSearchQuery, ...props }) {
458
+ const context = useSelectContext('SelectInputTrigger');
459
+ const inputRef = React.useRef(null);
460
+ const setWrapperRef = React.useCallback((el) => {
461
+ context.triggerRef.current = el;
462
+ }, [context.triggerRef]);
463
+ const displayValue = context.open ? searchQuery : (context.selectedLabel ?? '');
464
+ React.useEffect(() => {
465
+ if (context.open) {
466
+ requestAnimationFrame(() => {
467
+ inputRef.current?.focus();
468
+ });
469
+ }
470
+ }, [context.open]);
471
+ const handleClick = () => {
472
+ if (!context.disabled) {
473
+ context.setOpen(true);
474
+ }
475
+ };
476
+ const handleChange = (event) => {
477
+ if (!context.open) {
478
+ const nativeEvent = event.nativeEvent;
479
+ setSearchQuery(nativeEvent.data ?? '');
480
+ context.setOpen(true);
481
+ }
482
+ else {
483
+ setSearchQuery(event.target.value);
484
+ }
485
+ };
486
+ const handleKeyDown = (event) => {
487
+ if (context.disabled) {
488
+ return;
489
+ }
490
+ if ((event.key === 'Backspace' || event.key === 'Delete') && !context.open) {
491
+ event.preventDefault();
492
+ return;
493
+ }
494
+ if (event.key === ' ' && !context.open) {
495
+ event.preventDefault();
496
+ context.setOpen(true);
497
+ return;
498
+ }
499
+ if (event.key === 'Escape' && context.open) {
500
+ event.preventDefault();
501
+ context.setOpen(false);
502
+ return;
503
+ }
504
+ if (event.key === 'ArrowDown') {
505
+ event.preventDefault();
506
+ if (!context.open) {
507
+ context.setOpen(true);
508
+ }
509
+ requestAnimationFrame(() => {
510
+ moveItemFocus(context.viewportRef.current, 'select-item', 'next');
511
+ });
512
+ return;
513
+ }
514
+ if (event.key === 'ArrowUp') {
515
+ event.preventDefault();
516
+ if (!context.open) {
517
+ context.setOpen(true);
518
+ }
519
+ requestAnimationFrame(() => {
520
+ moveItemFocus(context.viewportRef.current, 'select-item', 'prev');
521
+ });
522
+ return;
523
+ }
524
+ if (event.key === 'Enter') {
525
+ event.preventDefault();
526
+ if (!context.open) {
527
+ context.setOpen(true);
528
+ }
529
+ else if (searchQuery) {
530
+ const firstItem = context.viewportRef.current?.querySelector('[data-slot="select-item"]:not([data-disabled="true"])');
531
+ firstItem?.click();
532
+ }
533
+ return;
534
+ }
535
+ if (!context.open && event.key.length === 1 && !event.ctrlKey && !event.metaKey) {
536
+ context.setOpen(true);
537
+ }
538
+ };
539
+ return (jsxs("div", { ref: setWrapperRef, tabIndex: -1, className: cn(s.trigger, s['input-trigger'], className), onClick: handleClick, onFocus: event => {
540
+ if (event.target === event.currentTarget) {
541
+ inputRef.current?.focus();
542
+ }
543
+ }, children: [jsx("input", { ref: inputRef, id: id, type: 'text', value: displayValue, placeholder: placeholder, onChange: handleChange, onKeyDown: handleKeyDown, onFocus: onFocus, onBlur: onBlur, disabled: context.disabled, "aria-controls": context.contentId, "aria-expanded": context.open, "aria-haspopup": 'listbox', className: s['search-trigger-input'], autoComplete: 'off', ...props }), jsx(ChevronDownIcon, { className: cn(s['trigger-icon']) })] }));
544
+ }
545
+ function MultiSelectField({ contentProps, defaultOpen, defaultValue, disabled = false, error, fieldClassName, filteredItems, getItemText, helperText, isFocused, isRequired, label, labelRef, minWidth, name, onOpenChange, onValueChange, open: openProp, placeholder, resolvedSize, searchable, selectableItems, searchQuery, setIsFocused, setSearchQuery, triggerId, value, }) {
546
+ const triggerRef = React.useRef(null);
547
+ const contentRef = React.useRef(null);
548
+ const viewportRef = React.useRef(null);
549
+ const closeTimerRef = React.useRef(null);
550
+ const isOpenControlled = openProp !== undefined;
551
+ const isValueControlled = value !== undefined;
552
+ const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen ?? false);
553
+ const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue ?? []);
554
+ const [isClosing, setIsClosing] = React.useState(false);
555
+ const currentOpen = isOpenControlled ? openProp : uncontrolledOpen;
556
+ const currentValue = isValueControlled ? value : uncontrolledValue;
557
+ const displayOpen = currentOpen || isClosing;
558
+ const selectedLabels = selectableItems
559
+ .filter(child => currentValue.includes(String(child.props.value)))
560
+ .map(getItemText)
561
+ .filter(Boolean);
562
+ const hasValue = currentValue.length > 0;
563
+ const clearCloseTimer = React.useCallback(() => {
564
+ if (closeTimerRef.current) {
565
+ clearTimeout(closeTimerRef.current);
566
+ closeTimerRef.current = null;
567
+ }
568
+ }, []);
569
+ const setOpen = React.useCallback((nextOpen) => {
570
+ if (nextOpen) {
571
+ clearCloseTimer();
572
+ setIsClosing(false);
573
+ if (!isOpenControlled) {
574
+ setUncontrolledOpen(true);
575
+ }
576
+ onOpenChange?.(true);
577
+ return;
578
+ }
579
+ onOpenChange?.(false);
580
+ if (!isOpenControlled) {
581
+ setUncontrolledOpen(false);
582
+ }
583
+ setIsClosing(true);
584
+ clearCloseTimer();
585
+ closeTimerRef.current = setTimeout(() => {
586
+ setIsClosing(false);
587
+ }, SELECT_ANIMATION_DURATION);
588
+ }, [clearCloseTimer, isOpenControlled, onOpenChange]);
589
+ const setValues = React.useCallback((nextValue) => {
590
+ if (!isValueControlled) {
591
+ setUncontrolledValue(nextValue);
592
+ }
593
+ onValueChange?.(nextValue);
594
+ }, [isValueControlled, onValueChange]);
595
+ useDismissibleLayer({
596
+ contentRef,
597
+ onDismiss: () => setOpen(false),
598
+ open: currentOpen,
599
+ triggerRef: triggerRef,
600
+ });
601
+ React.useEffect(() => {
602
+ if (!displayOpen) {
603
+ setSearchQuery('');
604
+ }
605
+ }, [displayOpen, setSearchQuery]);
606
+ React.useEffect(() => {
607
+ return () => clearCloseTimer();
608
+ }, [clearCloseTimer]);
609
+ React.useEffect(() => {
610
+ if (!currentOpen) {
611
+ const content = contentRef.current;
612
+ if (content) {
613
+ content.style.maxWidth = '';
614
+ }
615
+ return;
616
+ }
617
+ const frame = requestAnimationFrame(() => {
618
+ const content = contentRef.current;
619
+ const triggerHasInput = triggerRef.current?.querySelector('input') != null;
620
+ if (!triggerHasInput && !content?.querySelector('input')) {
621
+ focusItemByValue(viewportRef.current, 'select-multi-item', currentValue[0]);
622
+ }
623
+ });
624
+ return () => cancelAnimationFrame(frame);
625
+ }, [currentOpen, currentValue]);
626
+ React.useEffect(() => {
627
+ if (searchable && currentOpen) {
628
+ requestAnimationFrame(() => {
629
+ const input = triggerRef.current?.querySelector('input');
630
+ input?.focus();
631
+ });
632
+ }
633
+ }, [currentOpen, searchable]);
634
+ const containerClasses = cn(inputStyles.container, inputStyles[resolvedSize], { [inputStyles.error]: error }, { [inputStyles.disabled]: disabled }, { [inputStyles.placeholder]: placeholder }, { [inputStyles['has-value']]: hasValue }, { [inputStyles['is-focused']]: isFocused || currentOpen || isClosing }, fieldClassName);
635
+ const handleKeyDown = (event) => {
636
+ if (searchable) {
637
+ const input = triggerRef.current?.querySelector('input');
638
+ if (document.activeElement !== input) {
639
+ if (event.key === 'Backspace') {
640
+ event.preventDefault();
641
+ setSearchQuery(prev => prev.slice(0, -1));
642
+ input?.focus();
643
+ return;
644
+ }
645
+ if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {
646
+ event.preventDefault();
647
+ setSearchQuery(prev => prev + event.key);
648
+ input?.focus();
649
+ return;
650
+ }
651
+ }
652
+ }
653
+ if (event.key === 'Escape') {
654
+ event.preventDefault();
655
+ setOpen(false);
656
+ const input = triggerRef.current?.querySelector('input');
657
+ (input ?? triggerRef.current)?.focus();
658
+ return;
659
+ }
660
+ if (event.key === 'ArrowDown') {
661
+ event.preventDefault();
662
+ moveItemFocus(viewportRef.current, 'select-multi-item', 'next');
663
+ return;
664
+ }
665
+ if (event.key === 'ArrowUp') {
666
+ event.preventDefault();
667
+ moveItemFocus(viewportRef.current, 'select-multi-item', 'prev');
668
+ return;
669
+ }
670
+ if (event.key === 'Home') {
671
+ event.preventDefault();
672
+ moveItemFocus(viewportRef.current, 'select-multi-item', 'first');
673
+ return;
674
+ }
675
+ if (event.key === 'End') {
676
+ event.preventDefault();
677
+ moveItemFocus(viewportRef.current, 'select-multi-item', 'last');
678
+ }
679
+ };
680
+ return (jsxs(Fragment, { children: [jsxs("div", { "data-constellation-field": true, className: containerClasses, style: minWidth ? { minWidth: Math.max(minWidth, 140) } : undefined, children: [jsxs("div", { className: inputStyles['input-container'], children: [jsx("div", { className: inputStyles['label-container'], children: jsxs(Label, { htmlFor: triggerId, ref: labelRef, children: [label, isRequired && jsx("span", { className: inputStyles.required, children: "*" })] }) }), searchable ? (jsxs("div", { ref: triggerRef, tabIndex: -1, className: cn(s.trigger, s['input-trigger']), "data-placeholder": !hasValue ? 'true' : undefined, onClick: () => {
681
+ if (!currentOpen) {
682
+ setOpen(true);
683
+ }
684
+ }, onFocus: event => {
685
+ if (event.target === event.currentTarget) {
686
+ triggerRef.current?.querySelector('input')?.focus();
687
+ }
688
+ }, children: [jsx("input", { id: triggerId, type: 'text', value: currentOpen ? searchQuery : hasValue ? selectedLabels.join(', ') : '', placeholder: placeholder, "aria-expanded": currentOpen, "aria-haspopup": 'listbox', "aria-invalid": error ? 'true' : undefined, "aria-describedby": helperText ? `${triggerId}-helper` : undefined, disabled: disabled, className: s['search-trigger-input'], autoComplete: 'off', onChange: event => {
689
+ if (!currentOpen) {
690
+ const nativeEvent = event.nativeEvent;
691
+ setSearchQuery(nativeEvent.data ?? '');
692
+ setOpen(true);
693
+ }
694
+ else {
695
+ setSearchQuery(event.target.value);
696
+ }
697
+ }, onFocus: () => setIsFocused(true), onBlur: () => setIsFocused(false), onKeyDown: event => {
698
+ if ((event.key === 'Backspace' || event.key === 'Delete') && !currentOpen) {
699
+ event.preventDefault();
700
+ return;
701
+ }
702
+ if (event.key === ' ' && !currentOpen) {
703
+ event.preventDefault();
704
+ setOpen(true);
705
+ return;
706
+ }
707
+ if (event.key === 'Escape' && currentOpen) {
708
+ event.preventDefault();
709
+ setOpen(false);
710
+ return;
711
+ }
712
+ if (event.key === 'ArrowDown') {
713
+ event.preventDefault();
714
+ if (!currentOpen) {
715
+ setOpen(true);
716
+ }
717
+ requestAnimationFrame(() => {
718
+ moveItemFocus(viewportRef.current, 'select-multi-item', 'next');
719
+ });
720
+ return;
721
+ }
722
+ if (event.key === 'ArrowUp') {
723
+ event.preventDefault();
724
+ if (!currentOpen) {
725
+ setOpen(true);
726
+ }
727
+ requestAnimationFrame(() => {
728
+ moveItemFocus(viewportRef.current, 'select-multi-item', 'prev');
729
+ });
730
+ return;
731
+ }
732
+ if (event.key === 'Enter') {
733
+ event.preventDefault();
734
+ if (!currentOpen) {
735
+ setOpen(true);
736
+ }
737
+ return;
738
+ }
739
+ if (!currentOpen && event.key.length === 1 && !event.ctrlKey && !event.metaKey) {
740
+ setOpen(true);
741
+ }
742
+ } }), jsx(ChevronDownIcon, { className: s['trigger-icon'] })] })) : (jsxs("button", { ref: triggerRef, id: triggerId, type: 'button', "aria-expanded": currentOpen, "aria-haspopup": 'listbox', "aria-invalid": error ? 'true' : undefined, "aria-describedby": helperText ? `${triggerId}-helper` : undefined, disabled: disabled, className: cn(s.trigger, s['input-trigger']), "data-placeholder": !hasValue ? 'true' : undefined, onClick: () => setOpen(!currentOpen), onFocus: () => setIsFocused(true), onBlur: () => setIsFocused(false), onKeyDown: event => {
743
+ if (event.key === 'Enter' ||
744
+ event.key === ' ' ||
745
+ event.key === 'ArrowDown' ||
746
+ event.key === 'ArrowUp') {
747
+ event.preventDefault();
748
+ setOpen(true);
749
+ }
750
+ }, children: [jsx("span", { className: s['trigger-value'], children: hasValue ? selectedLabels.join(', ') : placeholder }), jsx(ChevronDownIcon, { className: s['trigger-icon'] })] }))] }), helperText ? (jsx(Typography, { id: `${triggerId}-helper`, variant: 'caption', className: inputStyles['helper-text'], children: helperText })) : null, name
751
+ ? currentValue.map(itemValue => (jsx("input", { type: 'hidden', name: name, value: itemValue }, itemValue)))
752
+ : null] }), jsx(Surface, { "data-slot": 'select-content', open: currentOpen, displayOpen: displayOpen, isClosing: isClosing, triggerRef: triggerRef, contentRef: contentRef, align: contentProps?.align, side: contentProps?.side, sideOffset: contentProps?.sideOffset, collisionPadding: contentProps?.collisionPadding ?? DEFAULT_COLLISION_PADDING, className: cn(s.content, s['multi-content'], contentProps?.className), onKeyDown: handleKeyDown, children: jsx("div", { ref: viewportRef, className: cn(s.viewport, s['multi-options']), role: 'listbox', children: filteredItems.map(child => {
753
+ const itemValue = String(child.props.value);
754
+ const checked = currentValue.includes(itemValue);
755
+ return (jsxs("button", { "data-slot": 'select-multi-item', "data-value": itemValue, "data-disabled": child.props.disabled ? 'true' : undefined, type: 'button', role: 'option', "aria-selected": checked, disabled: child.props.disabled, tabIndex: -1, className: cn(s.item, s['multi-item']), onClick: () => setValues(checked
756
+ ? currentValue.filter(currentItem => currentItem !== itemValue)
757
+ : [...currentValue, itemValue]), onMouseMove: event => {
758
+ if (!child.props.disabled) {
759
+ event.currentTarget.focus();
760
+ }
761
+ }, children: [jsx("span", { className: s['item-indicator'], children: checked ? jsx(CheckIcon, {}) : null }), jsx("span", { children: child.props.children })] }, itemValue));
762
+ }) }) })] }));
763
+ }
764
+ function SelectField(props) {
765
+ const { label, helperText, error = false, placeholder, children, fieldClassName, contentProps, id, sizeVariant, searchThreshold = DEFAULT_SEARCH_THRESHOLD, } = props;
766
+ const generatedId = React.useId();
767
+ const triggerId = id ?? generatedId;
768
+ const { isBelow } = useBreakpoint();
769
+ const resolvedSize = sizeVariant ?? (isBelow(900) ? 'sm' : 'md');
770
+ const [isFocused, setIsFocused] = React.useState(false);
771
+ const [isOpen, setIsOpen] = React.useState(false);
772
+ const [searchQuery, setSearchQuery] = React.useState('');
773
+ const [minWidth, setMinWidth] = React.useState(undefined);
774
+ const labelRef = React.useRef(null);
775
+ const childArray = React.useMemo(() => React.Children.toArray(children).filter((child) => React.isValidElement(child)), [children]);
776
+ const selectableItems = React.useMemo(() => childArray.filter(child => child.props.value !== undefined), [childArray]);
777
+ const searchable = selectableItems.length >= searchThreshold;
778
+ const getItemText = React.useCallback((child) => {
779
+ return readNodeText(child.props.children).trim();
780
+ }, []);
781
+ const matchesQuery = React.useCallback((child) => {
782
+ if (!searchQuery) {
783
+ return true;
784
+ }
785
+ return getItemText(child).toLowerCase().includes(searchQuery.toLowerCase());
786
+ }, [getItemText, searchQuery]);
787
+ const filteredItems = React.useMemo(() => {
788
+ if (!searchQuery) {
789
+ return selectableItems;
790
+ }
791
+ return selectableItems.filter(matchesQuery);
792
+ }, [matchesQuery, searchQuery, selectableItems]);
793
+ React.useLayoutEffect(() => {
794
+ if (!label) {
795
+ setMinWidth(undefined);
796
+ return;
797
+ }
798
+ const labelElement = labelRef.current;
799
+ if (!labelElement) {
800
+ return;
801
+ }
802
+ const updateMinWidth = () => {
803
+ const labelWidth = labelElement.getBoundingClientRect().width;
804
+ const iconWidth = 16;
805
+ const horizontalPadding = resolvedSize === 'sm' ? 20 : 24;
806
+ const computedWidth = Math.ceil(labelWidth + iconWidth + horizontalPadding);
807
+ setMinWidth(Math.max(computedWidth, 0));
808
+ };
809
+ updateMinWidth();
810
+ const resizeObserver = new ResizeObserver(updateMinWidth);
811
+ resizeObserver.observe(labelElement);
812
+ return () => resizeObserver.disconnect();
813
+ }, [label, resolvedSize]);
814
+ const ariaRequired = props['aria-required'];
815
+ const isRequired = Boolean(ariaRequired || props.required);
816
+ const baseSelectProps = {
817
+ open: props.open,
818
+ defaultOpen: props.defaultOpen,
819
+ onOpenChange: props.onOpenChange,
820
+ disabled: props.disabled,
821
+ required: props.required,
822
+ name: props.name,
823
+ };
824
+ if (props.multiple) {
825
+ return (jsx(MultiSelectField, { ...props, contentProps: contentProps, error: error, fieldClassName: fieldClassName, filteredItems: filteredItems, getItemText: getItemText, helperText: helperText, isFocused: isFocused, isRequired: isRequired, label: label, labelRef: labelRef, minWidth: minWidth, placeholder: placeholder, resolvedSize: resolvedSize, searchable: searchable, selectableItems: selectableItems, searchQuery: searchQuery, setIsFocused: setIsFocused, setSearchQuery: setSearchQuery, triggerId: triggerId }));
826
+ }
827
+ const { value, defaultValue, onValueChange } = props;
828
+ const handleContentKeyDown = searchable
829
+ ? (event) => {
830
+ const triggerInput = document.getElementById(triggerId);
831
+ if (triggerInput instanceof HTMLInputElement && document.activeElement !== triggerInput) {
832
+ if (event.key === 'Backspace') {
833
+ event.preventDefault();
834
+ setSearchQuery(prev => prev.slice(0, -1));
835
+ triggerInput.focus();
836
+ return;
837
+ }
838
+ if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {
839
+ event.preventDefault();
840
+ setSearchQuery(prev => prev + event.key);
841
+ triggerInput.focus();
842
+ return;
843
+ }
844
+ }
845
+ }
846
+ : undefined;
847
+ return (jsxs(Select, { ...baseSelectProps, onOpenChange: nextOpen => {
848
+ props.onOpenChange?.(nextOpen);
849
+ setIsOpen(nextOpen);
850
+ if (!nextOpen) {
851
+ setSearchQuery('');
852
+ }
853
+ }, value: value, defaultValue: defaultValue, onValueChange: onValueChange, children: [jsxs("div", { "data-constellation-field": true, className: cn(inputStyles.container, inputStyles[resolvedSize], { [inputStyles.error]: error }, { [inputStyles.disabled]: props.disabled }, { [inputStyles.placeholder]: placeholder }, { [inputStyles['has-value']]: Boolean(value ?? defaultValue) }, { [inputStyles['is-focused']]: isFocused || isOpen }, fieldClassName), style: minWidth ? { minWidth: Math.max(minWidth, 140) } : undefined, children: [jsxs("div", { className: inputStyles['input-container'], children: [jsx("div", { className: inputStyles['label-container'], children: jsxs(Label, { htmlFor: triggerId, ref: labelRef, children: [label, isRequired && jsx("span", { className: inputStyles.required, children: "*" })] }) }), searchable ? (jsx(SelectInputTrigger, { id: triggerId, "aria-invalid": error ? 'true' : undefined, "aria-describedby": helperText ? `${triggerId}-helper` : undefined, placeholder: placeholder, searchQuery: searchQuery, setSearchQuery: setSearchQuery, onFocus: () => setIsFocused(true), onBlur: () => setIsFocused(false) })) : (jsx(SelectTrigger, { id: triggerId, "aria-invalid": error ? 'true' : undefined, "aria-describedby": helperText ? `${triggerId}-helper` : undefined, className: s['input-trigger'], onFocus: () => setIsFocused(true), onBlur: () => setIsFocused(false), children: jsx(SelectValue, { placeholder: placeholder }) }))] }), helperText ? (jsx(Typography, { id: `${triggerId}-helper`, variant: 'caption', className: inputStyles['helper-text'], children: helperText })) : null] }), jsx(SelectContent, { ...contentProps, onKeyDown: handleContentKeyDown, children: searchQuery ? filteredItems : childArray })] }));
854
+ }
855
+
856
+ export { Select, SelectContent, SelectField, SelectGroup, SelectItem, SelectSeparator, SelectTrigger, SelectValue };
857
+ //# sourceMappingURL=select.js.map