@automa8e/ui 0.2.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 (451) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -0
  3. package/dist/_virtual/index.js +6 -0
  4. package/dist/_virtual/index.js.map +1 -0
  5. package/dist/_virtual/index2.js +5 -0
  6. package/dist/_virtual/index2.js.map +1 -0
  7. package/dist/_virtual/use-sync-external-store-shim.development.js +5 -0
  8. package/dist/_virtual/use-sync-external-store-shim.development.js.map +1 -0
  9. package/dist/_virtual/use-sync-external-store-shim.production.js +5 -0
  10. package/dist/_virtual/use-sync-external-store-shim.production.js.map +1 -0
  11. package/dist/automa8e-ui.css +226 -0
  12. package/dist/components/automation/metric-card.d.ts +19 -0
  13. package/dist/components/automation/metric-card.d.ts.map +1 -0
  14. package/dist/components/automation/metric-card.js +59 -0
  15. package/dist/components/automation/metric-card.js.map +1 -0
  16. package/dist/components/automation/status-badge.d.ts +27 -0
  17. package/dist/components/automation/status-badge.d.ts.map +1 -0
  18. package/dist/components/automation/status-badge.js +112 -0
  19. package/dist/components/automation/status-badge.js.map +1 -0
  20. package/dist/components/automation/task-card.d.ts +14 -0
  21. package/dist/components/automation/task-card.d.ts.map +1 -0
  22. package/dist/components/automation/task-card.js +114 -0
  23. package/dist/components/automation/task-card.js.map +1 -0
  24. package/dist/components/automation/workflow-node.d.ts +20 -0
  25. package/dist/components/automation/workflow-node.d.ts.map +1 -0
  26. package/dist/components/automation/workflow-node.js +132 -0
  27. package/dist/components/automation/workflow-node.js.map +1 -0
  28. package/dist/components/layout/app-shell.d.ts +21 -0
  29. package/dist/components/layout/app-shell.d.ts.map +1 -0
  30. package/dist/components/layout/app-shell.js +35 -0
  31. package/dist/components/layout/app-shell.js.map +1 -0
  32. package/dist/components/layout/header.d.ts +16 -0
  33. package/dist/components/layout/header.d.ts.map +1 -0
  34. package/dist/components/layout/header.js +30 -0
  35. package/dist/components/layout/header.js.map +1 -0
  36. package/dist/components/layout/page-header.d.ts +16 -0
  37. package/dist/components/layout/page-header.d.ts.map +1 -0
  38. package/dist/components/layout/page-header.js +29 -0
  39. package/dist/components/layout/page-header.js.map +1 -0
  40. package/dist/components/layout/sidebar.d.ts +35 -0
  41. package/dist/components/layout/sidebar.d.ts.map +1 -0
  42. package/dist/components/layout/sidebar.js +103 -0
  43. package/dist/components/layout/sidebar.js.map +1 -0
  44. package/dist/components/ui/accordion.d.ts +8 -0
  45. package/dist/components/ui/accordion.d.ts.map +1 -0
  46. package/dist/components/ui/accordion.js +51 -0
  47. package/dist/components/ui/accordion.js.map +1 -0
  48. package/dist/components/ui/alert.d.ts +18 -0
  49. package/dist/components/ui/alert.d.ts.map +1 -0
  50. package/dist/components/ui/alert.js +89 -0
  51. package/dist/components/ui/alert.js.map +1 -0
  52. package/dist/components/ui/avatar.d.ts +20 -0
  53. package/dist/components/ui/avatar.d.ts.map +1 -0
  54. package/dist/components/ui/avatar.js +72 -0
  55. package/dist/components/ui/avatar.js.map +1 -0
  56. package/dist/components/ui/badge.d.ts +13 -0
  57. package/dist/components/ui/badge.d.ts.map +1 -0
  58. package/dist/components/ui/badge.js +54 -0
  59. package/dist/components/ui/badge.js.map +1 -0
  60. package/dist/components/ui/button.d.ts +15 -0
  61. package/dist/components/ui/button.d.ts.map +1 -0
  62. package/dist/components/ui/button.js +96 -0
  63. package/dist/components/ui/button.js.map +1 -0
  64. package/dist/components/ui/card.d.ts +16 -0
  65. package/dist/components/ui/card.d.ts.map +1 -0
  66. package/dist/components/ui/card.js +96 -0
  67. package/dist/components/ui/card.js.map +1 -0
  68. package/dist/components/ui/checkbox.d.ts +9 -0
  69. package/dist/components/ui/checkbox.d.ts.map +1 -0
  70. package/dist/components/ui/checkbox.js +29 -0
  71. package/dist/components/ui/checkbox.js.map +1 -0
  72. package/dist/components/ui/dialog.d.ts +28 -0
  73. package/dist/components/ui/dialog.d.ts.map +1 -0
  74. package/dist/components/ui/dialog.js +105 -0
  75. package/dist/components/ui/dialog.js.map +1 -0
  76. package/dist/components/ui/dropdown-menu.d.ts +29 -0
  77. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  78. package/dist/components/ui/dropdown-menu.js +160 -0
  79. package/dist/components/ui/dropdown-menu.js.map +1 -0
  80. package/dist/components/ui/input.d.ts +14 -0
  81. package/dist/components/ui/input.d.ts.map +1 -0
  82. package/dist/components/ui/input.js +60 -0
  83. package/dist/components/ui/input.js.map +1 -0
  84. package/dist/components/ui/label.d.ts +13 -0
  85. package/dist/components/ui/label.d.ts.map +1 -0
  86. package/dist/components/ui/label.js +26 -0
  87. package/dist/components/ui/label.js.map +1 -0
  88. package/dist/components/ui/popover.d.ts +8 -0
  89. package/dist/components/ui/popover.d.ts.map +1 -0
  90. package/dist/components/ui/popover.js +29 -0
  91. package/dist/components/ui/popover.js.map +1 -0
  92. package/dist/components/ui/progress.d.ts +17 -0
  93. package/dist/components/ui/progress.d.ts.map +1 -0
  94. package/dist/components/ui/progress.js +80 -0
  95. package/dist/components/ui/progress.js.map +1 -0
  96. package/dist/components/ui/scroll-area.d.ts +6 -0
  97. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  98. package/dist/components/ui/scroll-area.js +39 -0
  99. package/dist/components/ui/scroll-area.js.map +1 -0
  100. package/dist/components/ui/select.d.ts +16 -0
  101. package/dist/components/ui/select.d.ts.map +1 -0
  102. package/dist/components/ui/select.js +131 -0
  103. package/dist/components/ui/select.js.map +1 -0
  104. package/dist/components/ui/separator.d.ts +9 -0
  105. package/dist/components/ui/separator.d.ts.map +1 -0
  106. package/dist/components/ui/separator.js +50 -0
  107. package/dist/components/ui/separator.js.map +1 -0
  108. package/dist/components/ui/skeleton.d.ts +10 -0
  109. package/dist/components/ui/skeleton.d.ts.map +1 -0
  110. package/dist/components/ui/skeleton.js +30 -0
  111. package/dist/components/ui/skeleton.js.map +1 -0
  112. package/dist/components/ui/spinner.d.ts +14 -0
  113. package/dist/components/ui/spinner.d.ts.map +1 -0
  114. package/dist/components/ui/spinner.js +44 -0
  115. package/dist/components/ui/spinner.js.map +1 -0
  116. package/dist/components/ui/switch.d.ts +8 -0
  117. package/dist/components/ui/switch.d.ts.map +1 -0
  118. package/dist/components/ui/switch.js +43 -0
  119. package/dist/components/ui/switch.js.map +1 -0
  120. package/dist/components/ui/table.d.ts +11 -0
  121. package/dist/components/ui/table.d.ts.map +1 -0
  122. package/dist/components/ui/table.js +95 -0
  123. package/dist/components/ui/table.js.map +1 -0
  124. package/dist/components/ui/tabs.d.ts +20 -0
  125. package/dist/components/ui/tabs.d.ts.map +1 -0
  126. package/dist/components/ui/tabs.js +92 -0
  127. package/dist/components/ui/tabs.js.map +1 -0
  128. package/dist/components/ui/textarea.d.ts +12 -0
  129. package/dist/components/ui/textarea.d.ts.map +1 -0
  130. package/dist/components/ui/textarea.js +41 -0
  131. package/dist/components/ui/textarea.js.map +1 -0
  132. package/dist/components/ui/toast.d.ts +16 -0
  133. package/dist/components/ui/toast.d.ts.map +1 -0
  134. package/dist/components/ui/toast.js +113 -0
  135. package/dist/components/ui/toast.js.map +1 -0
  136. package/dist/components/ui/tooltip.d.ts +8 -0
  137. package/dist/components/ui/tooltip.d.ts.map +1 -0
  138. package/dist/components/ui/tooltip.js +28 -0
  139. package/dist/components/ui/tooltip.js.map +1 -0
  140. package/dist/hooks/use-debounce.d.ts +15 -0
  141. package/dist/hooks/use-debounce.d.ts.map +1 -0
  142. package/dist/hooks/use-debounce.js +15 -0
  143. package/dist/hooks/use-debounce.js.map +1 -0
  144. package/dist/hooks/use-local-storage.d.ts +9 -0
  145. package/dist/hooks/use-local-storage.d.ts.map +1 -0
  146. package/dist/hooks/use-local-storage.js +49 -0
  147. package/dist/hooks/use-local-storage.js.map +1 -0
  148. package/dist/hooks/use-media-query.d.ts +9 -0
  149. package/dist/hooks/use-media-query.d.ts.map +1 -0
  150. package/dist/hooks/use-media-query.js +20 -0
  151. package/dist/hooks/use-media-query.js.map +1 -0
  152. package/dist/index.d.ts +66 -0
  153. package/dist/index.d.ts.map +1 -0
  154. package/dist/index.js +153 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/lib/colors.d.ts +73 -0
  157. package/dist/lib/colors.d.ts.map +1 -0
  158. package/dist/lib/colors.js +64 -0
  159. package/dist/lib/colors.js.map +1 -0
  160. package/dist/lib/utils.d.ts +7 -0
  161. package/dist/lib/utils.d.ts.map +1 -0
  162. package/dist/lib/utils.js +9 -0
  163. package/dist/lib/utils.js.map +1 -0
  164. package/dist/node_modules/@floating-ui/core/dist/floating-ui.core.js +729 -0
  165. package/dist/node_modules/@floating-ui/core/dist/floating-ui.core.js.map +1 -0
  166. package/dist/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +630 -0
  167. package/dist/node_modules/@floating-ui/dom/dist/floating-ui.dom.js.map +1 -0
  168. package/dist/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.js +325 -0
  169. package/dist/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.js.map +1 -0
  170. package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js +177 -0
  171. package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js.map +1 -0
  172. package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +152 -0
  173. package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.js.map +1 -0
  174. package/dist/node_modules/@radix-ui/number/dist/index.js +7 -0
  175. package/dist/node_modules/@radix-ui/number/dist/index.js.map +1 -0
  176. package/dist/node_modules/@radix-ui/primitive/dist/index.js +12 -0
  177. package/dist/node_modules/@radix-ui/primitive/dist/index.js.map +1 -0
  178. package/dist/node_modules/@radix-ui/react-accordion/dist/index.js +319 -0
  179. package/dist/node_modules/@radix-ui/react-accordion/dist/index.js.map +1 -0
  180. package/dist/node_modules/@radix-ui/react-arrow/dist/index.js +26 -0
  181. package/dist/node_modules/@radix-ui/react-arrow/dist/index.js.map +1 -0
  182. package/dist/node_modules/@radix-ui/react-avatar/dist/index.js +124 -0
  183. package/dist/node_modules/@radix-ui/react-avatar/dist/index.js.map +1 -0
  184. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context/dist/index.js +66 -0
  185. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context/dist/index.js.map +1 -0
  186. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive/dist/index.js +40 -0
  187. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive/dist/index.js.map +1 -0
  188. package/dist/node_modules/@radix-ui/react-checkbox/dist/index.js +280 -0
  189. package/dist/node_modules/@radix-ui/react-checkbox/dist/index.js.map +1 -0
  190. package/dist/node_modules/@radix-ui/react-collapsible/dist/index.js +152 -0
  191. package/dist/node_modules/@radix-ui/react-collapsible/dist/index.js.map +1 -0
  192. package/dist/node_modules/@radix-ui/react-collection/dist/index.js +71 -0
  193. package/dist/node_modules/@radix-ui/react-collection/dist/index.js.map +1 -0
  194. package/dist/node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot/dist/index.js +90 -0
  195. package/dist/node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot/dist/index.js.map +1 -0
  196. package/dist/node_modules/@radix-ui/react-compose-refs/dist/index.js +40 -0
  197. package/dist/node_modules/@radix-ui/react-compose-refs/dist/index.js.map +1 -0
  198. package/dist/node_modules/@radix-ui/react-context/dist/index.js +82 -0
  199. package/dist/node_modules/@radix-ui/react-context/dist/index.js.map +1 -0
  200. package/dist/node_modules/@radix-ui/react-dialog/dist/index.js +342 -0
  201. package/dist/node_modules/@radix-ui/react-dialog/dist/index.js.map +1 -0
  202. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot/dist/index.js +90 -0
  203. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot/dist/index.js.map +1 -0
  204. package/dist/node_modules/@radix-ui/react-direction/dist/index.js +11 -0
  205. package/dist/node_modules/@radix-ui/react-direction/dist/index.js.map +1 -0
  206. package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.js +217 -0
  207. package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.js.map +1 -0
  208. package/dist/node_modules/@radix-ui/react-dropdown-menu/dist/index.js +299 -0
  209. package/dist/node_modules/@radix-ui/react-dropdown-menu/dist/index.js.map +1 -0
  210. package/dist/node_modules/@radix-ui/react-focus-guards/dist/index.js +30 -0
  211. package/dist/node_modules/@radix-ui/react-focus-guards/dist/index.js.map +1 -0
  212. package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.js +209 -0
  213. package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.js.map +1 -0
  214. package/dist/node_modules/@radix-ui/react-id/dist/index.js +15 -0
  215. package/dist/node_modules/@radix-ui/react-id/dist/index.js.map +1 -0
  216. package/dist/node_modules/@radix-ui/react-label/dist/index.js +27 -0
  217. package/dist/node_modules/@radix-ui/react-label/dist/index.js.map +1 -0
  218. package/dist/node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive/dist/index.js +40 -0
  219. package/dist/node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive/dist/index.js.map +1 -0
  220. package/dist/node_modules/@radix-ui/react-menu/dist/index.js +881 -0
  221. package/dist/node_modules/@radix-ui/react-menu/dist/index.js.map +1 -0
  222. package/dist/node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot/dist/index.js +90 -0
  223. package/dist/node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot/dist/index.js.map +1 -0
  224. package/dist/node_modules/@radix-ui/react-popover/dist/index.js +314 -0
  225. package/dist/node_modules/@radix-ui/react-popover/dist/index.js.map +1 -0
  226. package/dist/node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot/dist/index.js +90 -0
  227. package/dist/node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot/dist/index.js.map +1 -0
  228. package/dist/node_modules/@radix-ui/react-popper/dist/index.js +294 -0
  229. package/dist/node_modules/@radix-ui/react-popper/dist/index.js.map +1 -0
  230. package/dist/node_modules/@radix-ui/react-portal/dist/index.js +19 -0
  231. package/dist/node_modules/@radix-ui/react-portal/dist/index.js.map +1 -0
  232. package/dist/node_modules/@radix-ui/react-presence/dist/index.js +130 -0
  233. package/dist/node_modules/@radix-ui/react-presence/dist/index.js.map +1 -0
  234. package/dist/node_modules/@radix-ui/react-primitive/dist/index.js +44 -0
  235. package/dist/node_modules/@radix-ui/react-primitive/dist/index.js.map +1 -0
  236. package/dist/node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.js +90 -0
  237. package/dist/node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.js.map +1 -0
  238. package/dist/node_modules/@radix-ui/react-progress/dist/index.js +97 -0
  239. package/dist/node_modules/@radix-ui/react-progress/dist/index.js.map +1 -0
  240. package/dist/node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-context/dist/index.js +66 -0
  241. package/dist/node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-context/dist/index.js.map +1 -0
  242. package/dist/node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-primitive/dist/index.js +40 -0
  243. package/dist/node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-primitive/dist/index.js.map +1 -0
  244. package/dist/node_modules/@radix-ui/react-roving-focus/dist/index.js +228 -0
  245. package/dist/node_modules/@radix-ui/react-roving-focus/dist/index.js.map +1 -0
  246. package/dist/node_modules/@radix-ui/react-scroll-area/dist/index.js +728 -0
  247. package/dist/node_modules/@radix-ui/react-scroll-area/dist/index.js.map +1 -0
  248. package/dist/node_modules/@radix-ui/react-select/dist/index.js +1200 -0
  249. package/dist/node_modules/@radix-ui/react-select/dist/index.js.map +1 -0
  250. package/dist/node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot/dist/index.js +90 -0
  251. package/dist/node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot/dist/index.js.map +1 -0
  252. package/dist/node_modules/@radix-ui/react-separator/dist/index.js +31 -0
  253. package/dist/node_modules/@radix-ui/react-separator/dist/index.js.map +1 -0
  254. package/dist/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.js +40 -0
  255. package/dist/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.js.map +1 -0
  256. package/dist/node_modules/@radix-ui/react-slot/dist/index.js +107 -0
  257. package/dist/node_modules/@radix-ui/react-slot/dist/index.js.map +1 -0
  258. package/dist/node_modules/@radix-ui/react-switch/dist/index.js +156 -0
  259. package/dist/node_modules/@radix-ui/react-switch/dist/index.js.map +1 -0
  260. package/dist/node_modules/@radix-ui/react-tabs/dist/index.js +195 -0
  261. package/dist/node_modules/@radix-ui/react-tabs/dist/index.js.map +1 -0
  262. package/dist/node_modules/@radix-ui/react-toast/dist/index.js +645 -0
  263. package/dist/node_modules/@radix-ui/react-toast/dist/index.js.map +1 -0
  264. package/dist/node_modules/@radix-ui/react-tooltip/dist/index.js +501 -0
  265. package/dist/node_modules/@radix-ui/react-tooltip/dist/index.js.map +1 -0
  266. package/dist/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot/dist/index.js +16 -0
  267. package/dist/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot/dist/index.js.map +1 -0
  268. package/dist/node_modules/@radix-ui/react-use-callback-ref/dist/index.js +15 -0
  269. package/dist/node_modules/@radix-ui/react-use-callback-ref/dist/index.js.map +1 -0
  270. package/dist/node_modules/@radix-ui/react-use-controllable-state/dist/index.js +72 -0
  271. package/dist/node_modules/@radix-ui/react-use-controllable-state/dist/index.js.map +1 -0
  272. package/dist/node_modules/@radix-ui/react-use-escape-keydown/dist/index.js +18 -0
  273. package/dist/node_modules/@radix-ui/react-use-escape-keydown/dist/index.js.map +1 -0
  274. package/dist/node_modules/@radix-ui/react-use-is-hydrated/dist/index.js +16 -0
  275. package/dist/node_modules/@radix-ui/react-use-is-hydrated/dist/index.js.map +1 -0
  276. package/dist/node_modules/@radix-ui/react-use-layout-effect/dist/index.js +7 -0
  277. package/dist/node_modules/@radix-ui/react-use-layout-effect/dist/index.js.map +1 -0
  278. package/dist/node_modules/@radix-ui/react-use-previous/dist/index.js +15 -0
  279. package/dist/node_modules/@radix-ui/react-use-previous/dist/index.js.map +1 -0
  280. package/dist/node_modules/@radix-ui/react-use-size/dist/index.js +40 -0
  281. package/dist/node_modules/@radix-ui/react-use-size/dist/index.js.map +1 -0
  282. package/dist/node_modules/@radix-ui/react-visually-hidden/dist/index.js +37 -0
  283. package/dist/node_modules/@radix-ui/react-visually-hidden/dist/index.js.map +1 -0
  284. package/dist/node_modules/aria-hidden/dist/es2015/index.js +123 -0
  285. package/dist/node_modules/aria-hidden/dist/es2015/index.js.map +1 -0
  286. package/dist/node_modules/class-variance-authority/dist/index.js +46 -0
  287. package/dist/node_modules/class-variance-authority/dist/index.js.map +1 -0
  288. package/dist/node_modules/clsx/dist/clsx.js +17 -0
  289. package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
  290. package/dist/node_modules/get-nonce/dist/es2015/index.js +10 -0
  291. package/dist/node_modules/get-nonce/dist/es2015/index.js.map +1 -0
  292. package/dist/node_modules/lucide-react/dist/esm/Icon.js +43 -0
  293. package/dist/node_modules/lucide-react/dist/esm/Icon.js.map +1 -0
  294. package/dist/node_modules/lucide-react/dist/esm/createLucideIcon.js +25 -0
  295. package/dist/node_modules/lucide-react/dist/esm/createLucideIcon.js.map +1 -0
  296. package/dist/node_modules/lucide-react/dist/esm/defaultAttributes.js +21 -0
  297. package/dist/node_modules/lucide-react/dist/esm/defaultAttributes.js.map +1 -0
  298. package/dist/node_modules/lucide-react/dist/esm/icons/ban.js +15 -0
  299. package/dist/node_modules/lucide-react/dist/esm/icons/ban.js.map +1 -0
  300. package/dist/node_modules/lucide-react/dist/esm/icons/calendar.js +17 -0
  301. package/dist/node_modules/lucide-react/dist/esm/icons/calendar.js.map +1 -0
  302. package/dist/node_modules/lucide-react/dist/esm/icons/check.js +12 -0
  303. package/dist/node_modules/lucide-react/dist/esm/icons/check.js.map +1 -0
  304. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.js +14 -0
  305. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.js.map +1 -0
  306. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-left.js +14 -0
  307. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-left.js.map +1 -0
  308. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-right.js +14 -0
  309. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-right.js.map +1 -0
  310. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js +12 -0
  311. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js.map +1 -0
  312. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.js +16 -0
  313. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.js.map +1 -0
  314. package/dist/node_modules/lucide-react/dist/esm/icons/circle-check.js +15 -0
  315. package/dist/node_modules/lucide-react/dist/esm/icons/circle-check.js.map +1 -0
  316. package/dist/node_modules/lucide-react/dist/esm/icons/circle-minus.js +15 -0
  317. package/dist/node_modules/lucide-react/dist/esm/icons/circle-minus.js.map +1 -0
  318. package/dist/node_modules/lucide-react/dist/esm/icons/circle-x.js +16 -0
  319. package/dist/node_modules/lucide-react/dist/esm/icons/circle-x.js.map +1 -0
  320. package/dist/node_modules/lucide-react/dist/esm/icons/circle.js +14 -0
  321. package/dist/node_modules/lucide-react/dist/esm/icons/circle.js.map +1 -0
  322. package/dist/node_modules/lucide-react/dist/esm/icons/clock.js +15 -0
  323. package/dist/node_modules/lucide-react/dist/esm/icons/clock.js.map +1 -0
  324. package/dist/node_modules/lucide-react/dist/esm/icons/flag.js +15 -0
  325. package/dist/node_modules/lucide-react/dist/esm/icons/flag.js.map +1 -0
  326. package/dist/node_modules/lucide-react/dist/esm/icons/git-branch.js +17 -0
  327. package/dist/node_modules/lucide-react/dist/esm/icons/git-branch.js.map +1 -0
  328. package/dist/node_modules/lucide-react/dist/esm/icons/info.js +16 -0
  329. package/dist/node_modules/lucide-react/dist/esm/icons/info.js.map +1 -0
  330. package/dist/node_modules/lucide-react/dist/esm/icons/loader-circle.js +14 -0
  331. package/dist/node_modules/lucide-react/dist/esm/icons/loader-circle.js.map +1 -0
  332. package/dist/node_modules/lucide-react/dist/esm/icons/minus.js +12 -0
  333. package/dist/node_modules/lucide-react/dist/esm/icons/minus.js.map +1 -0
  334. package/dist/node_modules/lucide-react/dist/esm/icons/pause.js +15 -0
  335. package/dist/node_modules/lucide-react/dist/esm/icons/pause.js.map +1 -0
  336. package/dist/node_modules/lucide-react/dist/esm/icons/play.js +14 -0
  337. package/dist/node_modules/lucide-react/dist/esm/icons/play.js.map +1 -0
  338. package/dist/node_modules/lucide-react/dist/esm/icons/send.js +21 -0
  339. package/dist/node_modules/lucide-react/dist/esm/icons/send.js.map +1 -0
  340. package/dist/node_modules/lucide-react/dist/esm/icons/tag.js +21 -0
  341. package/dist/node_modules/lucide-react/dist/esm/icons/tag.js.map +1 -0
  342. package/dist/node_modules/lucide-react/dist/esm/icons/timer.js +16 -0
  343. package/dist/node_modules/lucide-react/dist/esm/icons/timer.js.map +1 -0
  344. package/dist/node_modules/lucide-react/dist/esm/icons/trending-down.js +15 -0
  345. package/dist/node_modules/lucide-react/dist/esm/icons/trending-down.js.map +1 -0
  346. package/dist/node_modules/lucide-react/dist/esm/icons/trending-up.js +15 -0
  347. package/dist/node_modules/lucide-react/dist/esm/icons/trending-up.js.map +1 -0
  348. package/dist/node_modules/lucide-react/dist/esm/icons/triangle-alert.js +22 -0
  349. package/dist/node_modules/lucide-react/dist/esm/icons/triangle-alert.js.map +1 -0
  350. package/dist/node_modules/lucide-react/dist/esm/icons/x.js +15 -0
  351. package/dist/node_modules/lucide-react/dist/esm/icons/x.js.map +1 -0
  352. package/dist/node_modules/lucide-react/dist/esm/icons/zap.js +20 -0
  353. package/dist/node_modules/lucide-react/dist/esm/icons/zap.js.map +1 -0
  354. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils.js +15 -0
  355. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils.js.map +1 -0
  356. package/dist/node_modules/react-remove-scroll/dist/es2015/Combination.js +12 -0
  357. package/dist/node_modules/react-remove-scroll/dist/es2015/Combination.js.map +1 -0
  358. package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.js +181 -0
  359. package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.js.map +1 -0
  360. package/dist/node_modules/react-remove-scroll/dist/es2015/UI.js +39 -0
  361. package/dist/node_modules/react-remove-scroll/dist/es2015/UI.js.map +1 -0
  362. package/dist/node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.js +20 -0
  363. package/dist/node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.js.map +1 -0
  364. package/dist/node_modules/react-remove-scroll/dist/es2015/handleScroll.js +103 -0
  365. package/dist/node_modules/react-remove-scroll/dist/es2015/handleScroll.js.map +1 -0
  366. package/dist/node_modules/react-remove-scroll/dist/es2015/medium.js +6 -0
  367. package/dist/node_modules/react-remove-scroll/dist/es2015/medium.js.map +1 -0
  368. package/dist/node_modules/react-remove-scroll/dist/es2015/sidecar.js +8 -0
  369. package/dist/node_modules/react-remove-scroll/dist/es2015/sidecar.js.map +1 -0
  370. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/component.js +48 -0
  371. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/component.js.map +1 -0
  372. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/constants.js +11 -0
  373. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/constants.js.map +1 -0
  374. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/utils.js +38 -0
  375. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/utils.js.map +1 -0
  376. package/dist/node_modules/react-style-singleton/dist/es2015/component.js +14 -0
  377. package/dist/node_modules/react-style-singleton/dist/es2015/component.js.map +1 -0
  378. package/dist/node_modules/react-style-singleton/dist/es2015/hook.js +17 -0
  379. package/dist/node_modules/react-style-singleton/dist/es2015/hook.js.map +1 -0
  380. package/dist/node_modules/react-style-singleton/dist/es2015/singleton.js +49 -0
  381. package/dist/node_modules/react-style-singleton/dist/es2015/singleton.js.map +1 -0
  382. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +2467 -0
  383. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  384. package/dist/node_modules/tslib/tslib.es6.js +40 -0
  385. package/dist/node_modules/tslib/tslib.es6.js.map +1 -0
  386. package/dist/node_modules/use-callback-ref/dist/es2015/assignRef.js +12 -0
  387. package/dist/node_modules/use-callback-ref/dist/es2015/assignRef.js.map +1 -0
  388. package/dist/node_modules/use-callback-ref/dist/es2015/useMergeRef.js +36 -0
  389. package/dist/node_modules/use-callback-ref/dist/es2015/useMergeRef.js.map +1 -0
  390. package/dist/node_modules/use-callback-ref/dist/es2015/useRef.js +30 -0
  391. package/dist/node_modules/use-callback-ref/dist/es2015/useRef.js.map +1 -0
  392. package/dist/node_modules/use-sidecar/dist/es2015/exports.js +22 -0
  393. package/dist/node_modules/use-sidecar/dist/es2015/exports.js.map +1 -0
  394. package/dist/node_modules/use-sidecar/dist/es2015/medium.js +89 -0
  395. package/dist/node_modules/use-sidecar/dist/es2015/medium.js.map +1 -0
  396. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +78 -0
  397. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +1 -0
  398. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js +63 -0
  399. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js.map +1 -0
  400. package/dist/node_modules/use-sync-external-store/shim/index.js +18 -0
  401. package/dist/node_modules/use-sync-external-store/shim/index.js.map +1 -0
  402. package/dist/types/automation.d.ts +59 -0
  403. package/dist/types/automation.d.ts.map +1 -0
  404. package/dist/types/common.d.ts +38 -0
  405. package/dist/types/common.d.ts.map +1 -0
  406. package/package.json +119 -0
  407. package/registry/registry.json +218 -0
  408. package/src/components/automation/metric-card.tsx +113 -0
  409. package/src/components/automation/status-badge.tsx +136 -0
  410. package/src/components/automation/task-card.tsx +164 -0
  411. package/src/components/automation/workflow-node.tsx +186 -0
  412. package/src/components/layout/app-shell.tsx +58 -0
  413. package/src/components/layout/header.tsx +39 -0
  414. package/src/components/layout/page-header.tsx +42 -0
  415. package/src/components/layout/sidebar.tsx +190 -0
  416. package/src/components/ui/accordion.tsx +57 -0
  417. package/src/components/ui/alert.tsx +93 -0
  418. package/src/components/ui/avatar.tsx +94 -0
  419. package/src/components/ui/badge.tsx +69 -0
  420. package/src/components/ui/button.tsx +106 -0
  421. package/src/components/ui/card.tsx +96 -0
  422. package/src/components/ui/checkbox.tsx +40 -0
  423. package/src/components/ui/dialog.tsx +129 -0
  424. package/src/components/ui/dropdown-menu.tsx +194 -0
  425. package/src/components/ui/input.tsx +80 -0
  426. package/src/components/ui/label.tsx +37 -0
  427. package/src/components/ui/popover.tsx +29 -0
  428. package/src/components/ui/progress.tsx +92 -0
  429. package/src/components/ui/scroll-area.tsx +43 -0
  430. package/src/components/ui/select.tsx +157 -0
  431. package/src/components/ui/separator.tsx +56 -0
  432. package/src/components/ui/skeleton.tsx +41 -0
  433. package/src/components/ui/spinner.tsx +50 -0
  434. package/src/components/ui/switch.tsx +46 -0
  435. package/src/components/ui/table.tsx +117 -0
  436. package/src/components/ui/tabs.tsx +107 -0
  437. package/src/components/ui/textarea.tsx +50 -0
  438. package/src/components/ui/toast.tsx +139 -0
  439. package/src/components/ui/tooltip.tsx +28 -0
  440. package/src/hooks/use-debounce.ts +28 -0
  441. package/src/hooks/use-local-storage.ts +63 -0
  442. package/src/hooks/use-media-query.ts +29 -0
  443. package/src/index.ts +197 -0
  444. package/src/lib/colors.ts +102 -0
  445. package/src/lib/utils.ts +10 -0
  446. package/src/styles/globals.css +230 -0
  447. package/src/types/automation.ts +74 -0
  448. package/src/types/common.ts +48 -0
  449. package/tailwind/preset.cjs +98 -0
  450. package/tailwind/preset.css +5 -0
  451. package/tailwind/preset.ts +159 -0
@@ -0,0 +1,1200 @@
1
+ import * as React from "react";
2
+ import * as ReactDOM from "react-dom";
3
+ import { clamp } from "../../number/dist/index.js";
4
+ import { composeEventHandlers } from "../../primitive/dist/index.js";
5
+ import { createCollection } from "../../react-collection/dist/index.js";
6
+ import { useComposedRefs } from "../../react-compose-refs/dist/index.js";
7
+ import { createContextScope } from "../../react-context/dist/index.js";
8
+ import { useDirection } from "../../react-direction/dist/index.js";
9
+ import { DismissableLayer } from "../../react-dismissable-layer/dist/index.js";
10
+ import { useFocusGuards } from "../../react-focus-guards/dist/index.js";
11
+ import { FocusScope } from "../../react-focus-scope/dist/index.js";
12
+ import { useId } from "../../react-id/dist/index.js";
13
+ import { Root as Root2$1, createPopperScope, Anchor, Content, Arrow } from "../../react-popper/dist/index.js";
14
+ import { Portal as Portal$1 } from "../../react-portal/dist/index.js";
15
+ import { Primitive } from "../../react-primitive/dist/index.js";
16
+ import { createSlot } from "../node_modules/@radix-ui/react-slot/dist/index.js";
17
+ import { useCallbackRef } from "../../react-use-callback-ref/dist/index.js";
18
+ import { useControllableState } from "../../react-use-controllable-state/dist/index.js";
19
+ import { useLayoutEffect as useLayoutEffect2 } from "../../react-use-layout-effect/dist/index.js";
20
+ import { usePrevious } from "../../react-use-previous/dist/index.js";
21
+ import { VISUALLY_HIDDEN_STYLES } from "../../react-visually-hidden/dist/index.js";
22
+ import { hideOthers } from "../../../aria-hidden/dist/es2015/index.js";
23
+ import ReactRemoveScroll from "../../../react-remove-scroll/dist/es2015/Combination.js";
24
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
25
+ var OPEN_KEYS = [" ", "Enter", "ArrowUp", "ArrowDown"];
26
+ var SELECTION_KEYS = [" ", "Enter"];
27
+ var SELECT_NAME = "Select";
28
+ var [Collection, useCollection, createCollectionScope] = createCollection(SELECT_NAME);
29
+ var [createSelectContext] = createContextScope(SELECT_NAME, [
30
+ createCollectionScope,
31
+ createPopperScope
32
+ ]);
33
+ var usePopperScope = createPopperScope();
34
+ var [SelectProvider, useSelectContext] = createSelectContext(SELECT_NAME);
35
+ var [SelectNativeOptionsProvider, useSelectNativeOptionsContext] = createSelectContext(SELECT_NAME);
36
+ var Select = (props) => {
37
+ const {
38
+ __scopeSelect,
39
+ children,
40
+ open: openProp,
41
+ defaultOpen,
42
+ onOpenChange,
43
+ value: valueProp,
44
+ defaultValue,
45
+ onValueChange,
46
+ dir,
47
+ name,
48
+ autoComplete,
49
+ disabled,
50
+ required,
51
+ form
52
+ } = props;
53
+ const popperScope = usePopperScope(__scopeSelect);
54
+ const [trigger, setTrigger] = React.useState(null);
55
+ const [valueNode, setValueNode] = React.useState(null);
56
+ const [valueNodeHasChildren, setValueNodeHasChildren] = React.useState(false);
57
+ const direction = useDirection(dir);
58
+ const [open, setOpen] = useControllableState({
59
+ prop: openProp,
60
+ defaultProp: defaultOpen ?? false,
61
+ onChange: onOpenChange,
62
+ caller: SELECT_NAME
63
+ });
64
+ const [value, setValue] = useControllableState({
65
+ prop: valueProp,
66
+ defaultProp: defaultValue,
67
+ onChange: onValueChange,
68
+ caller: SELECT_NAME
69
+ });
70
+ const triggerPointerDownPosRef = React.useRef(null);
71
+ const isFormControl = trigger ? form || !!trigger.closest("form") : true;
72
+ const [nativeOptionsSet, setNativeOptionsSet] = React.useState(/* @__PURE__ */ new Set());
73
+ const nativeSelectKey = Array.from(nativeOptionsSet).map((option) => option.props.value).join(";");
74
+ return /* @__PURE__ */ jsx(Root2$1, { ...popperScope, children: /* @__PURE__ */ jsxs(
75
+ SelectProvider,
76
+ {
77
+ required,
78
+ scope: __scopeSelect,
79
+ trigger,
80
+ onTriggerChange: setTrigger,
81
+ valueNode,
82
+ onValueNodeChange: setValueNode,
83
+ valueNodeHasChildren,
84
+ onValueNodeHasChildrenChange: setValueNodeHasChildren,
85
+ contentId: useId(),
86
+ value,
87
+ onValueChange: setValue,
88
+ open,
89
+ onOpenChange: setOpen,
90
+ dir: direction,
91
+ triggerPointerDownPosRef,
92
+ disabled,
93
+ children: [
94
+ /* @__PURE__ */ jsx(Collection.Provider, { scope: __scopeSelect, children: /* @__PURE__ */ jsx(
95
+ SelectNativeOptionsProvider,
96
+ {
97
+ scope: props.__scopeSelect,
98
+ onNativeOptionAdd: React.useCallback((option) => {
99
+ setNativeOptionsSet((prev) => new Set(prev).add(option));
100
+ }, []),
101
+ onNativeOptionRemove: React.useCallback((option) => {
102
+ setNativeOptionsSet((prev) => {
103
+ const optionsSet = new Set(prev);
104
+ optionsSet.delete(option);
105
+ return optionsSet;
106
+ });
107
+ }, []),
108
+ children
109
+ }
110
+ ) }),
111
+ isFormControl ? /* @__PURE__ */ jsxs(
112
+ SelectBubbleInput,
113
+ {
114
+ "aria-hidden": true,
115
+ required,
116
+ tabIndex: -1,
117
+ name,
118
+ autoComplete,
119
+ value,
120
+ onChange: (event) => setValue(event.target.value),
121
+ disabled,
122
+ form,
123
+ children: [
124
+ value === void 0 ? /* @__PURE__ */ jsx("option", { value: "" }) : null,
125
+ Array.from(nativeOptionsSet)
126
+ ]
127
+ },
128
+ nativeSelectKey
129
+ ) : null
130
+ ]
131
+ }
132
+ ) });
133
+ };
134
+ Select.displayName = SELECT_NAME;
135
+ var TRIGGER_NAME = "SelectTrigger";
136
+ var SelectTrigger = React.forwardRef(
137
+ (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 currentItem = enabledItems.find((item) => item.value === context.value);
148
+ const nextItem = findNextItem(enabledItems, search, currentItem);
149
+ if (nextItem !== void 0) {
150
+ context.onValueChange(nextItem.value);
151
+ }
152
+ });
153
+ const handleOpen = (pointerEvent) => {
154
+ if (!isDisabled) {
155
+ context.onOpenChange(true);
156
+ resetTypeahead();
157
+ }
158
+ if (pointerEvent) {
159
+ context.triggerPointerDownPosRef.current = {
160
+ x: Math.round(pointerEvent.pageX),
161
+ y: Math.round(pointerEvent.pageY)
162
+ };
163
+ }
164
+ };
165
+ return /* @__PURE__ */ jsx(Anchor, { asChild: true, ...popperScope, children: /* @__PURE__ */ jsx(
166
+ Primitive.button,
167
+ {
168
+ type: "button",
169
+ role: "combobox",
170
+ "aria-controls": context.contentId,
171
+ "aria-expanded": context.open,
172
+ "aria-required": context.required,
173
+ "aria-autocomplete": "none",
174
+ dir: context.dir,
175
+ "data-state": context.open ? "open" : "closed",
176
+ disabled: isDisabled,
177
+ "data-disabled": isDisabled ? "" : void 0,
178
+ "data-placeholder": shouldShowPlaceholder(context.value) ? "" : void 0,
179
+ ...triggerProps,
180
+ ref: composedRefs,
181
+ onClick: composeEventHandlers(triggerProps.onClick, (event) => {
182
+ event.currentTarget.focus();
183
+ if (pointerTypeRef.current !== "mouse") {
184
+ handleOpen(event);
185
+ }
186
+ }),
187
+ onPointerDown: composeEventHandlers(triggerProps.onPointerDown, (event) => {
188
+ pointerTypeRef.current = event.pointerType;
189
+ const target = event.target;
190
+ if (target.hasPointerCapture(event.pointerId)) {
191
+ target.releasePointerCapture(event.pointerId);
192
+ }
193
+ if (event.button === 0 && event.ctrlKey === false && event.pointerType === "mouse") {
194
+ handleOpen(event);
195
+ event.preventDefault();
196
+ }
197
+ }),
198
+ onKeyDown: composeEventHandlers(triggerProps.onKeyDown, (event) => {
199
+ const isTypingAhead = searchRef.current !== "";
200
+ const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;
201
+ if (!isModifierKey && event.key.length === 1) handleTypeaheadSearch(event.key);
202
+ if (isTypingAhead && event.key === " ") return;
203
+ if (OPEN_KEYS.includes(event.key)) {
204
+ handleOpen();
205
+ event.preventDefault();
206
+ }
207
+ })
208
+ }
209
+ ) });
210
+ }
211
+ );
212
+ SelectTrigger.displayName = TRIGGER_NAME;
213
+ var VALUE_NAME = "SelectValue";
214
+ var SelectValue = React.forwardRef(
215
+ (props, forwardedRef) => {
216
+ const { __scopeSelect, className, style, children, placeholder = "", ...valueProps } = props;
217
+ const context = useSelectContext(VALUE_NAME, __scopeSelect);
218
+ const { onValueNodeHasChildrenChange } = context;
219
+ const hasChildren = children !== void 0;
220
+ const composedRefs = useComposedRefs(forwardedRef, context.onValueNodeChange);
221
+ useLayoutEffect2(() => {
222
+ onValueNodeHasChildrenChange(hasChildren);
223
+ }, [onValueNodeHasChildrenChange, hasChildren]);
224
+ return /* @__PURE__ */ jsx(
225
+ Primitive.span,
226
+ {
227
+ ...valueProps,
228
+ ref: composedRefs,
229
+ style: { pointerEvents: "none" },
230
+ children: shouldShowPlaceholder(context.value) ? /* @__PURE__ */ jsx(Fragment, { children: placeholder }) : children
231
+ }
232
+ );
233
+ }
234
+ );
235
+ SelectValue.displayName = VALUE_NAME;
236
+ var ICON_NAME = "SelectIcon";
237
+ var SelectIcon = React.forwardRef(
238
+ (props, forwardedRef) => {
239
+ const { __scopeSelect, children, ...iconProps } = props;
240
+ return /* @__PURE__ */ jsx(Primitive.span, { "aria-hidden": true, ...iconProps, ref: forwardedRef, children: children || "▼" });
241
+ }
242
+ );
243
+ SelectIcon.displayName = ICON_NAME;
244
+ var PORTAL_NAME = "SelectPortal";
245
+ var SelectPortal = (props) => {
246
+ return /* @__PURE__ */ jsx(Portal$1, { asChild: true, ...props });
247
+ };
248
+ SelectPortal.displayName = PORTAL_NAME;
249
+ var CONTENT_NAME = "SelectContent";
250
+ var SelectContent = React.forwardRef(
251
+ (props, forwardedRef) => {
252
+ const context = useSelectContext(CONTENT_NAME, props.__scopeSelect);
253
+ const [fragment, setFragment] = React.useState();
254
+ useLayoutEffect2(() => {
255
+ setFragment(new DocumentFragment());
256
+ }, []);
257
+ if (!context.open) {
258
+ const frag = fragment;
259
+ return frag ? ReactDOM.createPortal(
260
+ /* @__PURE__ */ jsx(SelectContentProvider, { scope: props.__scopeSelect, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: props.__scopeSelect, children: /* @__PURE__ */ jsx("div", { children: props.children }) }) }),
261
+ frag
262
+ ) : null;
263
+ }
264
+ return /* @__PURE__ */ jsx(SelectContentImpl, { ...props, ref: forwardedRef });
265
+ }
266
+ );
267
+ SelectContent.displayName = CONTENT_NAME;
268
+ var CONTENT_MARGIN = 10;
269
+ var [SelectContentProvider, useSelectContentContext] = createSelectContext(CONTENT_NAME);
270
+ var CONTENT_IMPL_NAME = "SelectContentImpl";
271
+ var Slot = createSlot("SelectContent.RemoveScroll");
272
+ var SelectContentImpl = React.forwardRef(
273
+ (props, forwardedRef) => {
274
+ const {
275
+ __scopeSelect,
276
+ position = "item-aligned",
277
+ onCloseAutoFocus,
278
+ onEscapeKeyDown,
279
+ onPointerDownOutside,
280
+ //
281
+ // PopperContent props
282
+ side,
283
+ sideOffset,
284
+ align,
285
+ alignOffset,
286
+ arrowPadding,
287
+ collisionBoundary,
288
+ collisionPadding,
289
+ sticky,
290
+ hideWhenDetached,
291
+ avoidCollisions,
292
+ //
293
+ ...contentProps
294
+ } = props;
295
+ const context = useSelectContext(CONTENT_NAME, __scopeSelect);
296
+ const [content, setContent] = React.useState(null);
297
+ const [viewport, setViewport] = React.useState(null);
298
+ const composedRefs = useComposedRefs(forwardedRef, (node) => setContent(node));
299
+ const [selectedItem, setSelectedItem] = React.useState(null);
300
+ const [selectedItemText, setSelectedItemText] = React.useState(
301
+ null
302
+ );
303
+ const getItems = useCollection(__scopeSelect);
304
+ const [isPositioned, setIsPositioned] = React.useState(false);
305
+ const firstValidItemFoundRef = React.useRef(false);
306
+ React.useEffect(() => {
307
+ if (content) return hideOthers(content);
308
+ }, [content]);
309
+ useFocusGuards();
310
+ const focusFirst = React.useCallback(
311
+ (candidates) => {
312
+ const [firstItem, ...restItems] = getItems().map((item) => item.ref.current);
313
+ const [lastItem] = restItems.slice(-1);
314
+ const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;
315
+ for (const candidate of candidates) {
316
+ if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;
317
+ candidate == null ? void 0 : candidate.scrollIntoView({ block: "nearest" });
318
+ if (candidate === firstItem && viewport) viewport.scrollTop = 0;
319
+ if (candidate === lastItem && viewport) viewport.scrollTop = viewport.scrollHeight;
320
+ candidate == null ? void 0 : candidate.focus();
321
+ if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;
322
+ }
323
+ },
324
+ [getItems, viewport]
325
+ );
326
+ const focusSelectedItem = React.useCallback(
327
+ () => focusFirst([selectedItem, content]),
328
+ [focusFirst, selectedItem, content]
329
+ );
330
+ React.useEffect(() => {
331
+ if (isPositioned) {
332
+ focusSelectedItem();
333
+ }
334
+ }, [isPositioned, focusSelectedItem]);
335
+ const { onOpenChange, triggerPointerDownPosRef } = context;
336
+ React.useEffect(() => {
337
+ if (content) {
338
+ let pointerMoveDelta = { x: 0, y: 0 };
339
+ const handlePointerMove = (event) => {
340
+ var _a, _b;
341
+ pointerMoveDelta = {
342
+ x: Math.abs(Math.round(event.pageX) - (((_a = triggerPointerDownPosRef.current) == null ? void 0 : _a.x) ?? 0)),
343
+ y: Math.abs(Math.round(event.pageY) - (((_b = triggerPointerDownPosRef.current) == null ? void 0 : _b.y) ?? 0))
344
+ };
345
+ };
346
+ const handlePointerUp = (event) => {
347
+ if (pointerMoveDelta.x <= 10 && pointerMoveDelta.y <= 10) {
348
+ event.preventDefault();
349
+ } else {
350
+ if (!content.contains(event.target)) {
351
+ onOpenChange(false);
352
+ }
353
+ }
354
+ document.removeEventListener("pointermove", handlePointerMove);
355
+ triggerPointerDownPosRef.current = null;
356
+ };
357
+ if (triggerPointerDownPosRef.current !== null) {
358
+ document.addEventListener("pointermove", handlePointerMove);
359
+ document.addEventListener("pointerup", handlePointerUp, { capture: true, once: true });
360
+ }
361
+ return () => {
362
+ document.removeEventListener("pointermove", handlePointerMove);
363
+ document.removeEventListener("pointerup", handlePointerUp, { capture: true });
364
+ };
365
+ }
366
+ }, [content, onOpenChange, triggerPointerDownPosRef]);
367
+ React.useEffect(() => {
368
+ const close = () => onOpenChange(false);
369
+ window.addEventListener("blur", close);
370
+ window.addEventListener("resize", close);
371
+ return () => {
372
+ window.removeEventListener("blur", close);
373
+ window.removeEventListener("resize", close);
374
+ };
375
+ }, [onOpenChange]);
376
+ const [searchRef, handleTypeaheadSearch] = useTypeaheadSearch((search) => {
377
+ const enabledItems = getItems().filter((item) => !item.disabled);
378
+ const currentItem = enabledItems.find((item) => item.ref.current === document.activeElement);
379
+ const nextItem = findNextItem(enabledItems, search, currentItem);
380
+ if (nextItem) {
381
+ setTimeout(() => nextItem.ref.current.focus());
382
+ }
383
+ });
384
+ const itemRefCallback = React.useCallback(
385
+ (node, value, disabled) => {
386
+ const isFirstValidItem = !firstValidItemFoundRef.current && !disabled;
387
+ const isSelectedItem = context.value !== void 0 && context.value === value;
388
+ if (isSelectedItem || isFirstValidItem) {
389
+ setSelectedItem(node);
390
+ if (isFirstValidItem) firstValidItemFoundRef.current = true;
391
+ }
392
+ },
393
+ [context.value]
394
+ );
395
+ const handleItemLeave = React.useCallback(() => content == null ? void 0 : content.focus(), [content]);
396
+ const itemTextRefCallback = React.useCallback(
397
+ (node, value, disabled) => {
398
+ const isFirstValidItem = !firstValidItemFoundRef.current && !disabled;
399
+ const isSelectedItem = context.value !== void 0 && context.value === value;
400
+ if (isSelectedItem || isFirstValidItem) {
401
+ setSelectedItemText(node);
402
+ }
403
+ },
404
+ [context.value]
405
+ );
406
+ const SelectPosition = position === "popper" ? SelectPopperPosition : SelectItemAlignedPosition;
407
+ const popperContentProps = SelectPosition === SelectPopperPosition ? {
408
+ side,
409
+ sideOffset,
410
+ align,
411
+ alignOffset,
412
+ arrowPadding,
413
+ collisionBoundary,
414
+ collisionPadding,
415
+ sticky,
416
+ hideWhenDetached,
417
+ avoidCollisions
418
+ } : {};
419
+ return /* @__PURE__ */ jsx(
420
+ SelectContentProvider,
421
+ {
422
+ scope: __scopeSelect,
423
+ content,
424
+ viewport,
425
+ onViewportChange: setViewport,
426
+ itemRefCallback,
427
+ selectedItem,
428
+ onItemLeave: handleItemLeave,
429
+ itemTextRefCallback,
430
+ focusSelectedItem,
431
+ selectedItemText,
432
+ position,
433
+ isPositioned,
434
+ searchRef,
435
+ children: /* @__PURE__ */ jsx(ReactRemoveScroll, { as: Slot, allowPinchZoom: true, children: /* @__PURE__ */ jsx(
436
+ FocusScope,
437
+ {
438
+ asChild: true,
439
+ trapped: context.open,
440
+ onMountAutoFocus: (event) => {
441
+ event.preventDefault();
442
+ },
443
+ onUnmountAutoFocus: composeEventHandlers(onCloseAutoFocus, (event) => {
444
+ var _a;
445
+ (_a = context.trigger) == null ? void 0 : _a.focus({ preventScroll: true });
446
+ event.preventDefault();
447
+ }),
448
+ children: /* @__PURE__ */ jsx(
449
+ DismissableLayer,
450
+ {
451
+ asChild: true,
452
+ disableOutsidePointerEvents: true,
453
+ onEscapeKeyDown,
454
+ onPointerDownOutside,
455
+ onFocusOutside: (event) => event.preventDefault(),
456
+ onDismiss: () => context.onOpenChange(false),
457
+ children: /* @__PURE__ */ jsx(
458
+ SelectPosition,
459
+ {
460
+ role: "listbox",
461
+ id: context.contentId,
462
+ "data-state": context.open ? "open" : "closed",
463
+ dir: context.dir,
464
+ onContextMenu: (event) => event.preventDefault(),
465
+ ...contentProps,
466
+ ...popperContentProps,
467
+ onPlaced: () => setIsPositioned(true),
468
+ ref: composedRefs,
469
+ style: {
470
+ // flex layout so we can place the scroll buttons properly
471
+ display: "flex",
472
+ flexDirection: "column",
473
+ // reset the outline by default as the content MAY get focused
474
+ outline: "none",
475
+ ...contentProps.style
476
+ },
477
+ onKeyDown: composeEventHandlers(contentProps.onKeyDown, (event) => {
478
+ const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;
479
+ if (event.key === "Tab") event.preventDefault();
480
+ if (!isModifierKey && event.key.length === 1) handleTypeaheadSearch(event.key);
481
+ if (["ArrowUp", "ArrowDown", "Home", "End"].includes(event.key)) {
482
+ const items = getItems().filter((item) => !item.disabled);
483
+ let candidateNodes = items.map((item) => item.ref.current);
484
+ if (["ArrowUp", "End"].includes(event.key)) {
485
+ candidateNodes = candidateNodes.slice().reverse();
486
+ }
487
+ if (["ArrowUp", "ArrowDown"].includes(event.key)) {
488
+ const currentElement = event.target;
489
+ const currentIndex = candidateNodes.indexOf(currentElement);
490
+ candidateNodes = candidateNodes.slice(currentIndex + 1);
491
+ }
492
+ setTimeout(() => focusFirst(candidateNodes));
493
+ event.preventDefault();
494
+ }
495
+ })
496
+ }
497
+ )
498
+ }
499
+ )
500
+ }
501
+ ) })
502
+ }
503
+ );
504
+ }
505
+ );
506
+ SelectContentImpl.displayName = CONTENT_IMPL_NAME;
507
+ var ITEM_ALIGNED_POSITION_NAME = "SelectItemAlignedPosition";
508
+ var SelectItemAlignedPosition = React.forwardRef((props, forwardedRef) => {
509
+ const { __scopeSelect, onPlaced, ...popperProps } = props;
510
+ const context = useSelectContext(CONTENT_NAME, __scopeSelect);
511
+ const contentContext = useSelectContentContext(CONTENT_NAME, __scopeSelect);
512
+ const [contentWrapper, setContentWrapper] = React.useState(null);
513
+ const [content, setContent] = React.useState(null);
514
+ const composedRefs = useComposedRefs(forwardedRef, (node) => setContent(node));
515
+ const getItems = useCollection(__scopeSelect);
516
+ const shouldExpandOnScrollRef = React.useRef(false);
517
+ const shouldRepositionRef = React.useRef(true);
518
+ const { viewport, selectedItem, selectedItemText, focusSelectedItem } = contentContext;
519
+ const position = React.useCallback(() => {
520
+ if (context.trigger && context.valueNode && contentWrapper && content && viewport && selectedItem && selectedItemText) {
521
+ const triggerRect = context.trigger.getBoundingClientRect();
522
+ const contentRect = content.getBoundingClientRect();
523
+ const valueNodeRect = context.valueNode.getBoundingClientRect();
524
+ const itemTextRect = selectedItemText.getBoundingClientRect();
525
+ if (context.dir !== "rtl") {
526
+ const itemTextOffset = itemTextRect.left - contentRect.left;
527
+ const left = valueNodeRect.left - itemTextOffset;
528
+ const leftDelta = triggerRect.left - left;
529
+ const minContentWidth = triggerRect.width + leftDelta;
530
+ const contentWidth = Math.max(minContentWidth, contentRect.width);
531
+ const rightEdge = window.innerWidth - CONTENT_MARGIN;
532
+ const clampedLeft = clamp(left, [
533
+ CONTENT_MARGIN,
534
+ // Prevents the content from going off the starting edge of the
535
+ // viewport. It may still go off the ending edge, but this can be
536
+ // controlled by the user since they may want to manage overflow in a
537
+ // specific way.
538
+ // https://github.com/radix-ui/primitives/issues/2049
539
+ Math.max(CONTENT_MARGIN, rightEdge - contentWidth)
540
+ ]);
541
+ contentWrapper.style.minWidth = minContentWidth + "px";
542
+ contentWrapper.style.left = clampedLeft + "px";
543
+ } else {
544
+ const itemTextOffset = contentRect.right - itemTextRect.right;
545
+ const right = window.innerWidth - valueNodeRect.right - itemTextOffset;
546
+ const rightDelta = window.innerWidth - triggerRect.right - right;
547
+ const minContentWidth = triggerRect.width + rightDelta;
548
+ const contentWidth = Math.max(minContentWidth, contentRect.width);
549
+ const leftEdge = window.innerWidth - CONTENT_MARGIN;
550
+ const clampedRight = clamp(right, [
551
+ CONTENT_MARGIN,
552
+ Math.max(CONTENT_MARGIN, leftEdge - contentWidth)
553
+ ]);
554
+ contentWrapper.style.minWidth = minContentWidth + "px";
555
+ contentWrapper.style.right = clampedRight + "px";
556
+ }
557
+ const items = getItems();
558
+ const availableHeight = window.innerHeight - CONTENT_MARGIN * 2;
559
+ const itemsHeight = viewport.scrollHeight;
560
+ const contentStyles = window.getComputedStyle(content);
561
+ const contentBorderTopWidth = parseInt(contentStyles.borderTopWidth, 10);
562
+ const contentPaddingTop = parseInt(contentStyles.paddingTop, 10);
563
+ const contentBorderBottomWidth = parseInt(contentStyles.borderBottomWidth, 10);
564
+ const contentPaddingBottom = parseInt(contentStyles.paddingBottom, 10);
565
+ const fullContentHeight = contentBorderTopWidth + contentPaddingTop + itemsHeight + contentPaddingBottom + contentBorderBottomWidth;
566
+ const minContentHeight = Math.min(selectedItem.offsetHeight * 5, fullContentHeight);
567
+ const viewportStyles = window.getComputedStyle(viewport);
568
+ const viewportPaddingTop = parseInt(viewportStyles.paddingTop, 10);
569
+ const viewportPaddingBottom = parseInt(viewportStyles.paddingBottom, 10);
570
+ const topEdgeToTriggerMiddle = triggerRect.top + triggerRect.height / 2 - CONTENT_MARGIN;
571
+ const triggerMiddleToBottomEdge = availableHeight - topEdgeToTriggerMiddle;
572
+ const selectedItemHalfHeight = selectedItem.offsetHeight / 2;
573
+ const itemOffsetMiddle = selectedItem.offsetTop + selectedItemHalfHeight;
574
+ const contentTopToItemMiddle = contentBorderTopWidth + contentPaddingTop + itemOffsetMiddle;
575
+ const itemMiddleToContentBottom = fullContentHeight - contentTopToItemMiddle;
576
+ const willAlignWithoutTopOverflow = contentTopToItemMiddle <= topEdgeToTriggerMiddle;
577
+ if (willAlignWithoutTopOverflow) {
578
+ const isLastItem = items.length > 0 && selectedItem === items[items.length - 1].ref.current;
579
+ contentWrapper.style.bottom = "0px";
580
+ const viewportOffsetBottom = content.clientHeight - viewport.offsetTop - viewport.offsetHeight;
581
+ const clampedTriggerMiddleToBottomEdge = Math.max(
582
+ triggerMiddleToBottomEdge,
583
+ selectedItemHalfHeight + // viewport might have padding bottom, include it to avoid a scrollable viewport
584
+ (isLastItem ? viewportPaddingBottom : 0) + viewportOffsetBottom + contentBorderBottomWidth
585
+ );
586
+ const height = contentTopToItemMiddle + clampedTriggerMiddleToBottomEdge;
587
+ contentWrapper.style.height = height + "px";
588
+ } else {
589
+ const isFirstItem = items.length > 0 && selectedItem === items[0].ref.current;
590
+ contentWrapper.style.top = "0px";
591
+ const clampedTopEdgeToTriggerMiddle = Math.max(
592
+ topEdgeToTriggerMiddle,
593
+ contentBorderTopWidth + viewport.offsetTop + // viewport might have padding top, include it to avoid a scrollable viewport
594
+ (isFirstItem ? viewportPaddingTop : 0) + selectedItemHalfHeight
595
+ );
596
+ const height = clampedTopEdgeToTriggerMiddle + itemMiddleToContentBottom;
597
+ contentWrapper.style.height = height + "px";
598
+ viewport.scrollTop = contentTopToItemMiddle - topEdgeToTriggerMiddle + viewport.offsetTop;
599
+ }
600
+ contentWrapper.style.margin = `${CONTENT_MARGIN}px 0`;
601
+ contentWrapper.style.minHeight = minContentHeight + "px";
602
+ contentWrapper.style.maxHeight = availableHeight + "px";
603
+ onPlaced == null ? void 0 : onPlaced();
604
+ requestAnimationFrame(() => shouldExpandOnScrollRef.current = true);
605
+ }
606
+ }, [
607
+ getItems,
608
+ context.trigger,
609
+ context.valueNode,
610
+ contentWrapper,
611
+ content,
612
+ viewport,
613
+ selectedItem,
614
+ selectedItemText,
615
+ context.dir,
616
+ onPlaced
617
+ ]);
618
+ useLayoutEffect2(() => position(), [position]);
619
+ const [contentZIndex, setContentZIndex] = React.useState();
620
+ useLayoutEffect2(() => {
621
+ if (content) setContentZIndex(window.getComputedStyle(content).zIndex);
622
+ }, [content]);
623
+ const handleScrollButtonChange = React.useCallback(
624
+ (node) => {
625
+ if (node && shouldRepositionRef.current === true) {
626
+ position();
627
+ focusSelectedItem == null ? void 0 : focusSelectedItem();
628
+ shouldRepositionRef.current = false;
629
+ }
630
+ },
631
+ [position, focusSelectedItem]
632
+ );
633
+ return /* @__PURE__ */ jsx(
634
+ SelectViewportProvider,
635
+ {
636
+ scope: __scopeSelect,
637
+ contentWrapper,
638
+ shouldExpandOnScrollRef,
639
+ onScrollButtonChange: handleScrollButtonChange,
640
+ children: /* @__PURE__ */ jsx(
641
+ "div",
642
+ {
643
+ ref: setContentWrapper,
644
+ style: {
645
+ display: "flex",
646
+ flexDirection: "column",
647
+ position: "fixed",
648
+ zIndex: contentZIndex
649
+ },
650
+ children: /* @__PURE__ */ jsx(
651
+ Primitive.div,
652
+ {
653
+ ...popperProps,
654
+ ref: composedRefs,
655
+ style: {
656
+ // When we get the height of the content, it includes borders. If we were to set
657
+ // the height without having `boxSizing: 'border-box'` it would be too big.
658
+ boxSizing: "border-box",
659
+ // We need to ensure the content doesn't get taller than the wrapper
660
+ maxHeight: "100%",
661
+ ...popperProps.style
662
+ }
663
+ }
664
+ )
665
+ }
666
+ )
667
+ }
668
+ );
669
+ });
670
+ SelectItemAlignedPosition.displayName = ITEM_ALIGNED_POSITION_NAME;
671
+ var POPPER_POSITION_NAME = "SelectPopperPosition";
672
+ var SelectPopperPosition = React.forwardRef((props, forwardedRef) => {
673
+ const {
674
+ __scopeSelect,
675
+ align = "start",
676
+ collisionPadding = CONTENT_MARGIN,
677
+ ...popperProps
678
+ } = props;
679
+ const popperScope = usePopperScope(__scopeSelect);
680
+ return /* @__PURE__ */ jsx(
681
+ Content,
682
+ {
683
+ ...popperScope,
684
+ ...popperProps,
685
+ ref: forwardedRef,
686
+ align,
687
+ collisionPadding,
688
+ style: {
689
+ // Ensure border-box for floating-ui calculations
690
+ boxSizing: "border-box",
691
+ ...popperProps.style,
692
+ // re-namespace exposed content custom properties
693
+ ...{
694
+ "--radix-select-content-transform-origin": "var(--radix-popper-transform-origin)",
695
+ "--radix-select-content-available-width": "var(--radix-popper-available-width)",
696
+ "--radix-select-content-available-height": "var(--radix-popper-available-height)",
697
+ "--radix-select-trigger-width": "var(--radix-popper-anchor-width)",
698
+ "--radix-select-trigger-height": "var(--radix-popper-anchor-height)"
699
+ }
700
+ }
701
+ }
702
+ );
703
+ });
704
+ SelectPopperPosition.displayName = POPPER_POSITION_NAME;
705
+ var [SelectViewportProvider, useSelectViewportContext] = createSelectContext(CONTENT_NAME, {});
706
+ var VIEWPORT_NAME = "SelectViewport";
707
+ var SelectViewport = React.forwardRef(
708
+ (props, forwardedRef) => {
709
+ const { __scopeSelect, nonce, ...viewportProps } = props;
710
+ const contentContext = useSelectContentContext(VIEWPORT_NAME, __scopeSelect);
711
+ const viewportContext = useSelectViewportContext(VIEWPORT_NAME, __scopeSelect);
712
+ const composedRefs = useComposedRefs(forwardedRef, contentContext.onViewportChange);
713
+ const prevScrollTopRef = React.useRef(0);
714
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
715
+ /* @__PURE__ */ jsx(
716
+ "style",
717
+ {
718
+ dangerouslySetInnerHTML: {
719
+ __html: `[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}`
720
+ },
721
+ nonce
722
+ }
723
+ ),
724
+ /* @__PURE__ */ jsx(Collection.Slot, { scope: __scopeSelect, children: /* @__PURE__ */ jsx(
725
+ Primitive.div,
726
+ {
727
+ "data-radix-select-viewport": "",
728
+ role: "presentation",
729
+ ...viewportProps,
730
+ ref: composedRefs,
731
+ style: {
732
+ // we use position: 'relative' here on the `viewport` so that when we call
733
+ // `selectedItem.offsetTop` in calculations, the offset is relative to the viewport
734
+ // (independent of the scrollUpButton).
735
+ position: "relative",
736
+ flex: 1,
737
+ // Viewport should only be scrollable in the vertical direction.
738
+ // This won't work in vertical writing modes, so we'll need to
739
+ // revisit this if/when that is supported
740
+ // https://developer.chrome.com/blog/vertical-form-controls
741
+ overflow: "hidden auto",
742
+ ...viewportProps.style
743
+ },
744
+ onScroll: composeEventHandlers(viewportProps.onScroll, (event) => {
745
+ const viewport = event.currentTarget;
746
+ const { contentWrapper, shouldExpandOnScrollRef } = viewportContext;
747
+ if ((shouldExpandOnScrollRef == null ? void 0 : shouldExpandOnScrollRef.current) && contentWrapper) {
748
+ const scrolledBy = Math.abs(prevScrollTopRef.current - viewport.scrollTop);
749
+ if (scrolledBy > 0) {
750
+ const availableHeight = window.innerHeight - CONTENT_MARGIN * 2;
751
+ const cssMinHeight = parseFloat(contentWrapper.style.minHeight);
752
+ const cssHeight = parseFloat(contentWrapper.style.height);
753
+ const prevHeight = Math.max(cssMinHeight, cssHeight);
754
+ if (prevHeight < availableHeight) {
755
+ const nextHeight = prevHeight + scrolledBy;
756
+ const clampedNextHeight = Math.min(availableHeight, nextHeight);
757
+ const heightDiff = nextHeight - clampedNextHeight;
758
+ contentWrapper.style.height = clampedNextHeight + "px";
759
+ if (contentWrapper.style.bottom === "0px") {
760
+ viewport.scrollTop = heightDiff > 0 ? heightDiff : 0;
761
+ contentWrapper.style.justifyContent = "flex-end";
762
+ }
763
+ }
764
+ }
765
+ }
766
+ prevScrollTopRef.current = viewport.scrollTop;
767
+ })
768
+ }
769
+ ) })
770
+ ] });
771
+ }
772
+ );
773
+ SelectViewport.displayName = VIEWPORT_NAME;
774
+ var GROUP_NAME = "SelectGroup";
775
+ var [SelectGroupContextProvider, useSelectGroupContext] = createSelectContext(GROUP_NAME);
776
+ var SelectGroup = React.forwardRef(
777
+ (props, forwardedRef) => {
778
+ const { __scopeSelect, ...groupProps } = props;
779
+ const groupId = useId();
780
+ return /* @__PURE__ */ jsx(SelectGroupContextProvider, { scope: __scopeSelect, id: groupId, children: /* @__PURE__ */ jsx(Primitive.div, { role: "group", "aria-labelledby": groupId, ...groupProps, ref: forwardedRef }) });
781
+ }
782
+ );
783
+ SelectGroup.displayName = GROUP_NAME;
784
+ var LABEL_NAME = "SelectLabel";
785
+ var SelectLabel = React.forwardRef(
786
+ (props, forwardedRef) => {
787
+ const { __scopeSelect, ...labelProps } = props;
788
+ const groupContext = useSelectGroupContext(LABEL_NAME, __scopeSelect);
789
+ return /* @__PURE__ */ jsx(Primitive.div, { id: groupContext.id, ...labelProps, ref: forwardedRef });
790
+ }
791
+ );
792
+ SelectLabel.displayName = LABEL_NAME;
793
+ var ITEM_NAME = "SelectItem";
794
+ var [SelectItemContextProvider, useSelectItemContext] = createSelectContext(ITEM_NAME);
795
+ var SelectItem = React.forwardRef(
796
+ (props, forwardedRef) => {
797
+ const {
798
+ __scopeSelect,
799
+ value,
800
+ disabled = false,
801
+ textValue: textValueProp,
802
+ ...itemProps
803
+ } = props;
804
+ const context = useSelectContext(ITEM_NAME, __scopeSelect);
805
+ const contentContext = useSelectContentContext(ITEM_NAME, __scopeSelect);
806
+ const isSelected = context.value === value;
807
+ const [textValue, setTextValue] = React.useState(textValueProp ?? "");
808
+ const [isFocused, setIsFocused] = React.useState(false);
809
+ const composedRefs = useComposedRefs(
810
+ forwardedRef,
811
+ (node) => {
812
+ var _a;
813
+ return (_a = contentContext.itemRefCallback) == null ? void 0 : _a.call(contentContext, node, value, disabled);
814
+ }
815
+ );
816
+ const textId = useId();
817
+ const pointerTypeRef = React.useRef("touch");
818
+ const handleSelect = () => {
819
+ if (!disabled) {
820
+ context.onValueChange(value);
821
+ context.onOpenChange(false);
822
+ }
823
+ };
824
+ if (value === "") {
825
+ throw new Error(
826
+ "A <Select.Item /> must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder."
827
+ );
828
+ }
829
+ return /* @__PURE__ */ jsx(
830
+ SelectItemContextProvider,
831
+ {
832
+ scope: __scopeSelect,
833
+ value,
834
+ disabled,
835
+ textId,
836
+ isSelected,
837
+ onItemTextChange: React.useCallback((node) => {
838
+ setTextValue((prevTextValue) => prevTextValue || ((node == null ? void 0 : node.textContent) ?? "").trim());
839
+ }, []),
840
+ children: /* @__PURE__ */ jsx(
841
+ Collection.ItemSlot,
842
+ {
843
+ scope: __scopeSelect,
844
+ value,
845
+ disabled,
846
+ textValue,
847
+ children: /* @__PURE__ */ jsx(
848
+ Primitive.div,
849
+ {
850
+ role: "option",
851
+ "aria-labelledby": textId,
852
+ "data-highlighted": isFocused ? "" : void 0,
853
+ "aria-selected": isSelected && isFocused,
854
+ "data-state": isSelected ? "checked" : "unchecked",
855
+ "aria-disabled": disabled || void 0,
856
+ "data-disabled": disabled ? "" : void 0,
857
+ tabIndex: disabled ? void 0 : -1,
858
+ ...itemProps,
859
+ ref: composedRefs,
860
+ onFocus: composeEventHandlers(itemProps.onFocus, () => setIsFocused(true)),
861
+ onBlur: composeEventHandlers(itemProps.onBlur, () => setIsFocused(false)),
862
+ onClick: composeEventHandlers(itemProps.onClick, () => {
863
+ if (pointerTypeRef.current !== "mouse") handleSelect();
864
+ }),
865
+ onPointerUp: composeEventHandlers(itemProps.onPointerUp, () => {
866
+ if (pointerTypeRef.current === "mouse") handleSelect();
867
+ }),
868
+ onPointerDown: composeEventHandlers(itemProps.onPointerDown, (event) => {
869
+ pointerTypeRef.current = event.pointerType;
870
+ }),
871
+ onPointerMove: composeEventHandlers(itemProps.onPointerMove, (event) => {
872
+ var _a;
873
+ pointerTypeRef.current = event.pointerType;
874
+ if (disabled) {
875
+ (_a = contentContext.onItemLeave) == null ? void 0 : _a.call(contentContext);
876
+ } else if (pointerTypeRef.current === "mouse") {
877
+ event.currentTarget.focus({ preventScroll: true });
878
+ }
879
+ }),
880
+ onPointerLeave: composeEventHandlers(itemProps.onPointerLeave, (event) => {
881
+ var _a;
882
+ if (event.currentTarget === document.activeElement) {
883
+ (_a = contentContext.onItemLeave) == null ? void 0 : _a.call(contentContext);
884
+ }
885
+ }),
886
+ onKeyDown: composeEventHandlers(itemProps.onKeyDown, (event) => {
887
+ var _a;
888
+ const isTypingAhead = ((_a = contentContext.searchRef) == null ? void 0 : _a.current) !== "";
889
+ if (isTypingAhead && event.key === " ") return;
890
+ if (SELECTION_KEYS.includes(event.key)) handleSelect();
891
+ if (event.key === " ") event.preventDefault();
892
+ })
893
+ }
894
+ )
895
+ }
896
+ )
897
+ }
898
+ );
899
+ }
900
+ );
901
+ SelectItem.displayName = ITEM_NAME;
902
+ var ITEM_TEXT_NAME = "SelectItemText";
903
+ var SelectItemText = React.forwardRef(
904
+ (props, forwardedRef) => {
905
+ const { __scopeSelect, className, style, ...itemTextProps } = props;
906
+ const context = useSelectContext(ITEM_TEXT_NAME, __scopeSelect);
907
+ const contentContext = useSelectContentContext(ITEM_TEXT_NAME, __scopeSelect);
908
+ const itemContext = useSelectItemContext(ITEM_TEXT_NAME, __scopeSelect);
909
+ const nativeOptionsContext = useSelectNativeOptionsContext(ITEM_TEXT_NAME, __scopeSelect);
910
+ const [itemTextNode, setItemTextNode] = React.useState(null);
911
+ const composedRefs = useComposedRefs(
912
+ forwardedRef,
913
+ (node) => setItemTextNode(node),
914
+ itemContext.onItemTextChange,
915
+ (node) => {
916
+ var _a;
917
+ return (_a = contentContext.itemTextRefCallback) == null ? void 0 : _a.call(contentContext, node, itemContext.value, itemContext.disabled);
918
+ }
919
+ );
920
+ const textContent = itemTextNode == null ? void 0 : itemTextNode.textContent;
921
+ const nativeOption = React.useMemo(
922
+ () => /* @__PURE__ */ jsx("option", { value: itemContext.value, disabled: itemContext.disabled, children: textContent }, itemContext.value),
923
+ [itemContext.disabled, itemContext.value, textContent]
924
+ );
925
+ const { onNativeOptionAdd, onNativeOptionRemove } = nativeOptionsContext;
926
+ useLayoutEffect2(() => {
927
+ onNativeOptionAdd(nativeOption);
928
+ return () => onNativeOptionRemove(nativeOption);
929
+ }, [onNativeOptionAdd, onNativeOptionRemove, nativeOption]);
930
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
931
+ /* @__PURE__ */ jsx(Primitive.span, { id: itemContext.textId, ...itemTextProps, ref: composedRefs }),
932
+ itemContext.isSelected && context.valueNode && !context.valueNodeHasChildren ? ReactDOM.createPortal(itemTextProps.children, context.valueNode) : null
933
+ ] });
934
+ }
935
+ );
936
+ SelectItemText.displayName = ITEM_TEXT_NAME;
937
+ var ITEM_INDICATOR_NAME = "SelectItemIndicator";
938
+ var SelectItemIndicator = React.forwardRef(
939
+ (props, forwardedRef) => {
940
+ const { __scopeSelect, ...itemIndicatorProps } = props;
941
+ const itemContext = useSelectItemContext(ITEM_INDICATOR_NAME, __scopeSelect);
942
+ return itemContext.isSelected ? /* @__PURE__ */ jsx(Primitive.span, { "aria-hidden": true, ...itemIndicatorProps, ref: forwardedRef }) : null;
943
+ }
944
+ );
945
+ SelectItemIndicator.displayName = ITEM_INDICATOR_NAME;
946
+ var SCROLL_UP_BUTTON_NAME = "SelectScrollUpButton";
947
+ var SelectScrollUpButton = React.forwardRef((props, forwardedRef) => {
948
+ const contentContext = useSelectContentContext(SCROLL_UP_BUTTON_NAME, props.__scopeSelect);
949
+ const viewportContext = useSelectViewportContext(SCROLL_UP_BUTTON_NAME, props.__scopeSelect);
950
+ const [canScrollUp, setCanScrollUp] = React.useState(false);
951
+ const composedRefs = useComposedRefs(forwardedRef, viewportContext.onScrollButtonChange);
952
+ useLayoutEffect2(() => {
953
+ if (contentContext.viewport && contentContext.isPositioned) {
954
+ let handleScroll2 = function() {
955
+ const canScrollUp2 = viewport.scrollTop > 0;
956
+ setCanScrollUp(canScrollUp2);
957
+ };
958
+ const viewport = contentContext.viewport;
959
+ handleScroll2();
960
+ viewport.addEventListener("scroll", handleScroll2);
961
+ return () => viewport.removeEventListener("scroll", handleScroll2);
962
+ }
963
+ }, [contentContext.viewport, contentContext.isPositioned]);
964
+ return canScrollUp ? /* @__PURE__ */ jsx(
965
+ SelectScrollButtonImpl,
966
+ {
967
+ ...props,
968
+ ref: composedRefs,
969
+ onAutoScroll: () => {
970
+ const { viewport, selectedItem } = contentContext;
971
+ if (viewport && selectedItem) {
972
+ viewport.scrollTop = viewport.scrollTop - selectedItem.offsetHeight;
973
+ }
974
+ }
975
+ }
976
+ ) : null;
977
+ });
978
+ SelectScrollUpButton.displayName = SCROLL_UP_BUTTON_NAME;
979
+ var SCROLL_DOWN_BUTTON_NAME = "SelectScrollDownButton";
980
+ var SelectScrollDownButton = React.forwardRef((props, forwardedRef) => {
981
+ const contentContext = useSelectContentContext(SCROLL_DOWN_BUTTON_NAME, props.__scopeSelect);
982
+ const viewportContext = useSelectViewportContext(SCROLL_DOWN_BUTTON_NAME, props.__scopeSelect);
983
+ const [canScrollDown, setCanScrollDown] = React.useState(false);
984
+ const composedRefs = useComposedRefs(forwardedRef, viewportContext.onScrollButtonChange);
985
+ useLayoutEffect2(() => {
986
+ if (contentContext.viewport && contentContext.isPositioned) {
987
+ let handleScroll2 = function() {
988
+ const maxScroll = viewport.scrollHeight - viewport.clientHeight;
989
+ const canScrollDown2 = Math.ceil(viewport.scrollTop) < maxScroll;
990
+ setCanScrollDown(canScrollDown2);
991
+ };
992
+ const viewport = contentContext.viewport;
993
+ handleScroll2();
994
+ viewport.addEventListener("scroll", handleScroll2);
995
+ return () => viewport.removeEventListener("scroll", handleScroll2);
996
+ }
997
+ }, [contentContext.viewport, contentContext.isPositioned]);
998
+ return canScrollDown ? /* @__PURE__ */ jsx(
999
+ SelectScrollButtonImpl,
1000
+ {
1001
+ ...props,
1002
+ ref: composedRefs,
1003
+ onAutoScroll: () => {
1004
+ const { viewport, selectedItem } = contentContext;
1005
+ if (viewport && selectedItem) {
1006
+ viewport.scrollTop = viewport.scrollTop + selectedItem.offsetHeight;
1007
+ }
1008
+ }
1009
+ }
1010
+ ) : null;
1011
+ });
1012
+ SelectScrollDownButton.displayName = SCROLL_DOWN_BUTTON_NAME;
1013
+ var SelectScrollButtonImpl = React.forwardRef((props, forwardedRef) => {
1014
+ const { __scopeSelect, onAutoScroll, ...scrollIndicatorProps } = props;
1015
+ const contentContext = useSelectContentContext("SelectScrollButton", __scopeSelect);
1016
+ const autoScrollTimerRef = React.useRef(null);
1017
+ const getItems = useCollection(__scopeSelect);
1018
+ const clearAutoScrollTimer = React.useCallback(() => {
1019
+ if (autoScrollTimerRef.current !== null) {
1020
+ window.clearInterval(autoScrollTimerRef.current);
1021
+ autoScrollTimerRef.current = null;
1022
+ }
1023
+ }, []);
1024
+ React.useEffect(() => {
1025
+ return () => clearAutoScrollTimer();
1026
+ }, [clearAutoScrollTimer]);
1027
+ useLayoutEffect2(() => {
1028
+ var _a;
1029
+ const activeItem = getItems().find((item) => item.ref.current === document.activeElement);
1030
+ (_a = activeItem == null ? void 0 : activeItem.ref.current) == null ? void 0 : _a.scrollIntoView({ block: "nearest" });
1031
+ }, [getItems]);
1032
+ return /* @__PURE__ */ jsx(
1033
+ Primitive.div,
1034
+ {
1035
+ "aria-hidden": true,
1036
+ ...scrollIndicatorProps,
1037
+ ref: forwardedRef,
1038
+ style: { flexShrink: 0, ...scrollIndicatorProps.style },
1039
+ onPointerDown: composeEventHandlers(scrollIndicatorProps.onPointerDown, () => {
1040
+ if (autoScrollTimerRef.current === null) {
1041
+ autoScrollTimerRef.current = window.setInterval(onAutoScroll, 50);
1042
+ }
1043
+ }),
1044
+ onPointerMove: composeEventHandlers(scrollIndicatorProps.onPointerMove, () => {
1045
+ var _a;
1046
+ (_a = contentContext.onItemLeave) == null ? void 0 : _a.call(contentContext);
1047
+ if (autoScrollTimerRef.current === null) {
1048
+ autoScrollTimerRef.current = window.setInterval(onAutoScroll, 50);
1049
+ }
1050
+ }),
1051
+ onPointerLeave: composeEventHandlers(scrollIndicatorProps.onPointerLeave, () => {
1052
+ clearAutoScrollTimer();
1053
+ })
1054
+ }
1055
+ );
1056
+ });
1057
+ var SEPARATOR_NAME = "SelectSeparator";
1058
+ var SelectSeparator = React.forwardRef(
1059
+ (props, forwardedRef) => {
1060
+ const { __scopeSelect, ...separatorProps } = props;
1061
+ return /* @__PURE__ */ jsx(Primitive.div, { "aria-hidden": true, ...separatorProps, ref: forwardedRef });
1062
+ }
1063
+ );
1064
+ SelectSeparator.displayName = SEPARATOR_NAME;
1065
+ var ARROW_NAME = "SelectArrow";
1066
+ var SelectArrow = React.forwardRef(
1067
+ (props, forwardedRef) => {
1068
+ const { __scopeSelect, ...arrowProps } = props;
1069
+ const popperScope = usePopperScope(__scopeSelect);
1070
+ const context = useSelectContext(ARROW_NAME, __scopeSelect);
1071
+ const contentContext = useSelectContentContext(ARROW_NAME, __scopeSelect);
1072
+ return context.open && contentContext.position === "popper" ? /* @__PURE__ */ jsx(Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef }) : null;
1073
+ }
1074
+ );
1075
+ SelectArrow.displayName = ARROW_NAME;
1076
+ var BUBBLE_INPUT_NAME = "SelectBubbleInput";
1077
+ var SelectBubbleInput = React.forwardRef(
1078
+ ({ __scopeSelect, value, ...props }, forwardedRef) => {
1079
+ const ref = React.useRef(null);
1080
+ const composedRefs = useComposedRefs(forwardedRef, ref);
1081
+ const prevValue = usePrevious(value);
1082
+ React.useEffect(() => {
1083
+ const select = ref.current;
1084
+ if (!select) return;
1085
+ const selectProto = window.HTMLSelectElement.prototype;
1086
+ const descriptor = Object.getOwnPropertyDescriptor(
1087
+ selectProto,
1088
+ "value"
1089
+ );
1090
+ const setValue = descriptor.set;
1091
+ if (prevValue !== value && setValue) {
1092
+ const event = new Event("change", { bubbles: true });
1093
+ setValue.call(select, value);
1094
+ select.dispatchEvent(event);
1095
+ }
1096
+ }, [prevValue, value]);
1097
+ return /* @__PURE__ */ jsx(
1098
+ Primitive.select,
1099
+ {
1100
+ ...props,
1101
+ style: { ...VISUALLY_HIDDEN_STYLES, ...props.style },
1102
+ ref: composedRefs,
1103
+ defaultValue: value
1104
+ }
1105
+ );
1106
+ }
1107
+ );
1108
+ SelectBubbleInput.displayName = BUBBLE_INPUT_NAME;
1109
+ function shouldShowPlaceholder(value) {
1110
+ return value === "" || value === void 0;
1111
+ }
1112
+ function useTypeaheadSearch(onSearchChange) {
1113
+ const handleSearchChange = useCallbackRef(onSearchChange);
1114
+ const searchRef = React.useRef("");
1115
+ const timerRef = React.useRef(0);
1116
+ const handleTypeaheadSearch = React.useCallback(
1117
+ (key) => {
1118
+ const search = searchRef.current + key;
1119
+ handleSearchChange(search);
1120
+ (function updateSearch(value) {
1121
+ searchRef.current = value;
1122
+ window.clearTimeout(timerRef.current);
1123
+ if (value !== "") timerRef.current = window.setTimeout(() => updateSearch(""), 1e3);
1124
+ })(search);
1125
+ },
1126
+ [handleSearchChange]
1127
+ );
1128
+ const resetTypeahead = React.useCallback(() => {
1129
+ searchRef.current = "";
1130
+ window.clearTimeout(timerRef.current);
1131
+ }, []);
1132
+ React.useEffect(() => {
1133
+ return () => window.clearTimeout(timerRef.current);
1134
+ }, []);
1135
+ return [searchRef, handleTypeaheadSearch, resetTypeahead];
1136
+ }
1137
+ function findNextItem(items, search, currentItem) {
1138
+ const isRepeated = search.length > 1 && Array.from(search).every((char) => char === search[0]);
1139
+ const normalizedSearch = isRepeated ? search[0] : search;
1140
+ const currentItemIndex = currentItem ? items.indexOf(currentItem) : -1;
1141
+ let wrappedItems = wrapArray(items, Math.max(currentItemIndex, 0));
1142
+ const excludeCurrentItem = normalizedSearch.length === 1;
1143
+ if (excludeCurrentItem) wrappedItems = wrappedItems.filter((v) => v !== currentItem);
1144
+ const nextItem = wrappedItems.find(
1145
+ (item) => item.textValue.toLowerCase().startsWith(normalizedSearch.toLowerCase())
1146
+ );
1147
+ return nextItem !== currentItem ? nextItem : void 0;
1148
+ }
1149
+ function wrapArray(array, startIndex) {
1150
+ return array.map((_, index) => array[(startIndex + index) % array.length]);
1151
+ }
1152
+ var Root2 = Select;
1153
+ var Trigger = SelectTrigger;
1154
+ var Value = SelectValue;
1155
+ var Icon = SelectIcon;
1156
+ var Portal = SelectPortal;
1157
+ var Content2 = SelectContent;
1158
+ var Viewport = SelectViewport;
1159
+ var Group = SelectGroup;
1160
+ var Label = SelectLabel;
1161
+ var Item = SelectItem;
1162
+ var ItemText = SelectItemText;
1163
+ var ItemIndicator = SelectItemIndicator;
1164
+ var ScrollUpButton = SelectScrollUpButton;
1165
+ var ScrollDownButton = SelectScrollDownButton;
1166
+ var Separator = SelectSeparator;
1167
+ export {
1168
+ Content2 as Content,
1169
+ Group,
1170
+ Icon,
1171
+ Item,
1172
+ ItemIndicator,
1173
+ ItemText,
1174
+ Label,
1175
+ Portal,
1176
+ Root2 as Root,
1177
+ ScrollDownButton,
1178
+ ScrollUpButton,
1179
+ Select,
1180
+ SelectArrow,
1181
+ SelectContent,
1182
+ SelectGroup,
1183
+ SelectIcon,
1184
+ SelectItem,
1185
+ SelectItemIndicator,
1186
+ SelectItemText,
1187
+ SelectLabel,
1188
+ SelectPortal,
1189
+ SelectScrollDownButton,
1190
+ SelectScrollUpButton,
1191
+ SelectSeparator,
1192
+ SelectTrigger,
1193
+ SelectValue,
1194
+ SelectViewport,
1195
+ Separator,
1196
+ Trigger,
1197
+ Value,
1198
+ Viewport
1199
+ };
1200
+ //# sourceMappingURL=index.js.map