@justanarthur/modo-ui 0.5.0 → 0.6.0-canary.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 (461) hide show
  1. package/DESIGN.md +608 -0
  2. package/README.md +61 -39
  3. package/blocks/sidebar-app/examples.mdx +33 -0
  4. package/blocks/sidebar-app/index.tsx +218 -0
  5. package/blocks/sidebar-app/inset-topbar.tsx +25 -0
  6. package/blocks/sidebar-app/menu-grid.ts +26 -0
  7. package/blocks/sidebar-app/nav-data.ts +36 -0
  8. package/blocks/sidebar-app/search-field.tsx +48 -0
  9. package/blocks/sidebar-app/user-footer.tsx +67 -0
  10. package/blocks/sidebar-app/workspace-header.tsx +129 -0
  11. package/components/AI/input-message/examples.mdx +124 -0
  12. package/components/AI/input-message/file-thumbnail.tsx +173 -0
  13. package/components/AI/input-message/index.tsx +1383 -0
  14. package/components/AI/thinking-indicator/examples.mdx +27 -0
  15. package/components/AI/thinking-indicator/index.tsx +210 -0
  16. package/components/accordion/examples.mdx +148 -0
  17. package/components/accordion/index.tsx +1034 -0
  18. package/components/avatar/examples.mdx +95 -0
  19. package/components/avatar/index.tsx +129 -0
  20. package/components/badge/change-demo.tsx +29 -0
  21. package/components/badge/examples.mdx +120 -0
  22. package/components/badge/index.tsx +225 -0
  23. package/components/badge/variants.ts +73 -0
  24. package/components/button/examples.mdx +164 -0
  25. package/components/button/index.tsx +416 -0
  26. package/components/button/loading-demo.tsx +25 -0
  27. package/components/button/variants.ts +166 -0
  28. package/components/card/examples.mdx +212 -0
  29. package/components/card/index.tsx +1037 -0
  30. package/components/copy/examples.mdx +87 -0
  31. package/components/copy/index.tsx +482 -0
  32. package/components/inputs/checkbox/examples.mdx +83 -0
  33. package/components/inputs/checkbox/index.tsx +611 -0
  34. package/components/inputs/checkbox/select-all-demo.tsx +48 -0
  35. package/components/inputs/color-picker/examples.mdx +72 -0
  36. package/components/inputs/color-picker/index.tsx +1955 -0
  37. package/components/inputs/color-picker/variants.ts +401 -0
  38. package/components/inputs/combobox/examples.mdx +273 -0
  39. package/components/inputs/combobox/index.tsx +1436 -0
  40. package/components/inputs/combobox/remote-demo.tsx +101 -0
  41. package/components/inputs/date-time/calendar/examples.mdx +34 -0
  42. package/components/inputs/date-time/calendar/index.tsx +351 -0
  43. package/components/inputs/date-time/calendar/use-month-window.ts +163 -0
  44. package/components/inputs/date-time/date-picker/examples.mdx +166 -0
  45. package/components/inputs/date-time/date-picker/index.tsx +385 -0
  46. package/components/inputs/date-time/date-picker/masked-date-input.tsx +336 -0
  47. package/components/inputs/date-time/date-range-picker/examples.mdx +29 -0
  48. package/components/inputs/date-time/date-range-picker/index.tsx +217 -0
  49. package/components/inputs/date-time/duration-picker/examples.mdx +16 -0
  50. package/components/inputs/date-time/duration-picker/index.tsx +189 -0
  51. package/components/inputs/date-time/month-picker/examples.mdx +16 -0
  52. package/components/inputs/date-time/month-picker/index.tsx +190 -0
  53. package/components/inputs/date-time/picker-shell.tsx +395 -0
  54. package/components/inputs/date-time/time-columns.tsx +91 -0
  55. package/components/inputs/date-time/time-picker/examples.mdx +26 -0
  56. package/components/inputs/date-time/time-picker/index.tsx +166 -0
  57. package/components/inputs/field/examples.mdx +113 -0
  58. package/components/inputs/field/index.tsx +267 -0
  59. package/components/inputs/file-dropzone/examples.mdx +73 -0
  60. package/components/inputs/file-dropzone/file-row.tsx +201 -0
  61. package/components/inputs/file-dropzone/index.tsx +296 -0
  62. package/components/inputs/file-dropzone/upload-demo.tsx +67 -0
  63. package/components/inputs/file-dropzone/variants.ts +94 -0
  64. package/components/inputs/input/examples.mdx +135 -0
  65. package/components/inputs/input/index.tsx +494 -0
  66. package/components/inputs/input/password-demo.tsx +30 -0
  67. package/components/inputs/label/examples.mdx +67 -0
  68. package/components/inputs/label/index.tsx +85 -0
  69. package/components/inputs/number-input/examples.mdx +56 -0
  70. package/components/inputs/number-input/index.tsx +214 -0
  71. package/components/inputs/radio/examples.mdx +77 -0
  72. package/components/inputs/radio/index.tsx +636 -0
  73. package/components/inputs/search/examples.mdx +74 -0
  74. package/components/inputs/search/index.tsx +333 -0
  75. package/components/inputs/select/examples.mdx +218 -0
  76. package/components/inputs/select/index.tsx +862 -0
  77. package/components/inputs/select/variants.ts +32 -0
  78. package/components/inputs/slider/examples.mdx +127 -0
  79. package/components/inputs/slider/index.tsx +1725 -0
  80. package/components/inputs/switch/examples.mdx +94 -0
  81. package/components/inputs/switch/index.tsx +504 -0
  82. package/components/inputs/textarea/examples.mdx +88 -0
  83. package/components/inputs/textarea/index.tsx +161 -0
  84. package/components/navigation/navigation-menu/examples.mdx +109 -0
  85. package/components/navigation/navigation-menu/index.tsx +613 -0
  86. package/components/navigation/pagination/examples.mdx +64 -0
  87. package/components/navigation/pagination/index.tsx +395 -0
  88. package/components/navigation/sidebar/examples.mdx +319 -0
  89. package/components/navigation/sidebar/index.tsx +453 -0
  90. package/components/navigation/sidebar/sidebar-core.tsx +1408 -0
  91. package/components/navigation/sidebar/sidebar-menu.tsx +1495 -0
  92. package/components/navigation/sidebar/sidebar.css +74 -0
  93. package/components/navigation/sidebar/variants.ts +55 -0
  94. package/components/navigation/tabs/examples.mdx +89 -0
  95. package/components/navigation/tabs/index.tsx +494 -0
  96. package/components/navigation/tabs-subtle/examples.mdx +49 -0
  97. package/components/navigation/tabs-subtle/index.tsx +512 -0
  98. package/components/overlays/alert-dialog/examples.mdx +123 -0
  99. package/components/overlays/alert-dialog/index.tsx +258 -0
  100. package/components/overlays/alert-dialog/pending-demo.tsx +36 -0
  101. package/components/overlays/command/examples.mdx +113 -0
  102. package/components/overlays/command/index.tsx +416 -0
  103. package/components/overlays/context-menu/examples.mdx +56 -0
  104. package/components/overlays/context-menu/index.tsx +279 -0
  105. package/components/overlays/dialog/examples.mdx +144 -0
  106. package/components/overlays/dialog/index.tsx +366 -0
  107. package/components/overlays/dropdown/dropdown-search.tsx +395 -0
  108. package/components/overlays/dropdown/examples.mdx +294 -0
  109. package/components/overlays/dropdown/index.tsx +1168 -0
  110. package/components/overlays/dropdown/menu-item.tsx +464 -0
  111. package/components/overlays/dropdown/menu-parts.tsx +660 -0
  112. package/components/overlays/popover/anchored-demo.tsx +59 -0
  113. package/components/overlays/popover/examples.mdx +180 -0
  114. package/components/overlays/popover/index.tsx +315 -0
  115. package/components/overlays/preview-card/examples.mdx +61 -0
  116. package/components/overlays/preview-card/index.tsx +204 -0
  117. package/components/overlays/sheet/examples.mdx +89 -0
  118. package/components/overlays/sheet/index.tsx +247 -0
  119. package/components/overlays/toast/examples.mdx +68 -0
  120. package/components/overlays/toast/global-demo.tsx +72 -0
  121. package/components/overlays/toast/index.tsx +474 -0
  122. package/components/overlays/toast/manager.ts +193 -0
  123. package/components/overlays/tooltip/examples.mdx +106 -0
  124. package/components/overlays/tooltip/index.tsx +519 -0
  125. package/components/progress/examples.mdx +59 -0
  126. package/components/progress/index.tsx +174 -0
  127. package/components/progress/progress.css +49 -0
  128. package/components/progress/step-demo.tsx +27 -0
  129. package/components/table/examples.mdx +184 -0
  130. package/components/table/index.tsx +510 -0
  131. package/components/table/sort-demo.tsx +61 -0
  132. package/dist/base.css +100 -0
  133. package/dist/blocks/sidebar-app/index.js +39 -26
  134. package/dist/components/AI/input-message/index.js +22 -16
  135. package/dist/components/AI/thinking-indicator/index.js +9 -6
  136. package/dist/components/accordion/index.js +16 -13
  137. package/dist/components/avatar/index.d.ts +46 -0
  138. package/dist/components/avatar/index.js +18 -0
  139. package/dist/components/badge/index.d.ts +18 -11
  140. package/dist/components/badge/index.js +11 -7
  141. package/dist/components/badge/variants.d.ts +33 -0
  142. package/dist/components/badge/variants.js +10 -0
  143. package/dist/components/button/index.d.ts +53 -17
  144. package/dist/components/button/index.js +10 -6
  145. package/dist/components/button/variants.d.ts +39 -0
  146. package/dist/components/button/variants.js +8 -0
  147. package/dist/components/card/index.d.ts +16 -3
  148. package/dist/components/card/index.js +16 -11
  149. package/dist/components/copy/index.js +13 -9
  150. package/dist/components/inputs/checkbox/index.d.ts +28 -9
  151. package/dist/components/inputs/checkbox/index.js +17 -13
  152. package/dist/components/inputs/color-picker/index.d.ts +13 -13
  153. package/dist/components/inputs/color-picker/index.js +25 -18
  154. package/dist/components/inputs/color-picker/variants.d.ts +61 -0
  155. package/dist/components/inputs/color-picker/variants.js +28 -0
  156. package/dist/components/inputs/combobox/index.d.ts +60 -17
  157. package/dist/components/inputs/combobox/index.js +26 -18
  158. package/dist/components/inputs/date-time/calendar/index.js +14 -11
  159. package/dist/components/inputs/date-time/date-picker/index.d.ts +53 -11
  160. package/dist/components/inputs/date-time/date-picker/index.js +33 -25
  161. package/dist/components/inputs/date-time/date-range-picker/index.d.ts +3 -3
  162. package/dist/components/inputs/date-time/date-range-picker/index.js +32 -24
  163. package/dist/components/inputs/date-time/duration-picker/index.d.ts +3 -3
  164. package/dist/components/inputs/date-time/duration-picker/index.js +32 -24
  165. package/dist/components/inputs/date-time/month-picker/index.d.ts +3 -3
  166. package/dist/components/inputs/date-time/month-picker/index.js +31 -23
  167. package/dist/components/inputs/date-time/time-picker/index.d.ts +3 -3
  168. package/dist/components/inputs/date-time/time-picker/index.js +32 -24
  169. package/dist/components/inputs/field/index.d.ts +116 -0
  170. package/dist/components/inputs/field/index.js +28 -0
  171. package/dist/components/inputs/file-dropzone/index.d.ts +165 -0
  172. package/dist/components/inputs/file-dropzone/index.js +32 -0
  173. package/dist/components/inputs/file-dropzone/variants.d.ts +35 -0
  174. package/dist/components/inputs/file-dropzone/variants.js +12 -0
  175. package/dist/components/inputs/input/index.d.ts +95 -13
  176. package/dist/components/inputs/input/index.js +17 -9
  177. package/dist/components/inputs/label/index.d.ts +32 -0
  178. package/dist/components/inputs/label/index.js +11 -0
  179. package/dist/components/inputs/number-input/index.d.ts +84 -0
  180. package/dist/components/inputs/number-input/index.js +20 -0
  181. package/dist/components/inputs/radio/index.d.ts +20 -5
  182. package/dist/components/inputs/radio/index.js +15 -12
  183. package/dist/components/inputs/search/index.js +25 -18
  184. package/dist/components/inputs/select/index.d.ts +41 -11
  185. package/dist/components/inputs/select/index.js +27 -14
  186. package/dist/components/inputs/select/variants.d.ts +5 -0
  187. package/dist/components/inputs/select/variants.js +6 -0
  188. package/dist/components/inputs/slider/index.js +7 -5
  189. package/dist/components/inputs/switch/index.d.ts +8 -2
  190. package/dist/components/inputs/switch/index.js +14 -12
  191. package/dist/components/inputs/textarea/index.d.ts +4 -0
  192. package/dist/components/inputs/textarea/index.js +8 -6
  193. package/dist/components/navigation/navigation-menu/index.d.ts +114 -0
  194. package/dist/components/navigation/navigation-menu/index.js +40 -0
  195. package/dist/components/navigation/pagination/index.d.ts +73 -0
  196. package/dist/components/navigation/pagination/index.js +39 -0
  197. package/dist/components/navigation/sidebar/index.d.ts +44 -21
  198. package/dist/components/navigation/sidebar/index.js +41 -31
  199. package/dist/components/navigation/sidebar/variants.d.ts +25 -0
  200. package/dist/components/navigation/sidebar/variants.js +28 -0
  201. package/dist/components/navigation/tabs/index.d.ts +8 -2
  202. package/dist/components/navigation/tabs/index.js +14 -10
  203. package/dist/components/navigation/tabs-subtle/index.js +12 -10
  204. package/dist/components/overlays/alert-dialog/index.d.ts +121 -15
  205. package/dist/components/overlays/alert-dialog/index.js +22 -13
  206. package/dist/components/overlays/command/index.js +24 -17
  207. package/dist/components/overlays/context-menu/index.d.ts +33 -17
  208. package/dist/components/overlays/context-menu/index.js +27 -18
  209. package/dist/components/overlays/dialog/index.js +17 -12
  210. package/dist/components/overlays/dropdown/index.d.ts +257 -31
  211. package/dist/components/overlays/dropdown/index.js +42 -17
  212. package/dist/components/overlays/popover/index.d.ts +31 -9
  213. package/dist/components/overlays/popover/index.js +12 -9
  214. package/dist/components/overlays/preview-card/index.js +11 -8
  215. package/dist/components/overlays/sheet/index.js +18 -13
  216. package/dist/components/overlays/toast/index.d.ts +123 -47
  217. package/dist/components/overlays/toast/index.js +18 -10
  218. package/dist/components/overlays/tooltip/index.d.ts +113 -21
  219. package/dist/components/overlays/tooltip/index.js +15 -6
  220. package/dist/components/progress/index.d.ts +56 -0
  221. package/dist/components/progress/index.js +15 -0
  222. package/dist/components/table/index.d.ts +63 -8
  223. package/dist/components/table/index.js +19 -9
  224. package/dist/index.d.ts +2201 -736
  225. package/dist/index.js +223 -82
  226. package/dist/lib/date-locale.d.ts +14 -0
  227. package/dist/lib/date-locale.js +16 -0
  228. package/dist/lib/field-classes.d.ts +144 -0
  229. package/dist/lib/field-classes.js +40 -0
  230. package/dist/lib/field-variants.d.ts +47 -0
  231. package/dist/lib/field-variants.js +26 -0
  232. package/dist/lib/fluid-hover-highlight.d.ts +112 -0
  233. package/dist/lib/fluid-hover-highlight.js +17 -0
  234. package/dist/lib/focus-ring.d.ts +18 -0
  235. package/dist/lib/focus-ring.js +10 -0
  236. package/dist/lib/goo-indicator.d.ts +46 -0
  237. package/dist/lib/goo-indicator.js +14 -0
  238. package/dist/lib/icon-context.d.ts +30 -0
  239. package/dist/lib/icon-context.js +12 -0
  240. package/dist/lib/inert.d.ts +9 -0
  241. package/dist/lib/inert.js +8 -0
  242. package/dist/lib/morph-layers.d.ts +93 -0
  243. package/dist/lib/morph-layers.js +13 -0
  244. package/dist/lib/morph-part.d.ts +21 -0
  245. package/dist/lib/morph-part.js +12 -0
  246. package/dist/lib/popup.d.ts +20 -0
  247. package/dist/lib/popup.js +12 -0
  248. package/dist/lib/reduced-motion.d.ts +9 -0
  249. package/dist/lib/reduced-motion.js +6 -0
  250. package/dist/lib/row-index.d.ts +10 -0
  251. package/dist/lib/row-index.js +8 -0
  252. package/dist/lib/row-order.d.ts +28 -0
  253. package/dist/lib/row-order.js +10 -0
  254. package/dist/lib/scroll-column.d.ts +27 -0
  255. package/dist/lib/scroll-column.js +18 -0
  256. package/dist/lib/shape-context.d.ts +30 -0
  257. package/dist/lib/shape-context.js +12 -0
  258. package/dist/lib/size-context.d.ts +94 -0
  259. package/dist/lib/size-context.js +20 -0
  260. package/dist/lib/size-scale.d.ts +79 -0
  261. package/dist/lib/size-scale.js +8 -0
  262. package/dist/lib/slot.d.ts +12 -0
  263. package/dist/lib/slot.js +6 -0
  264. package/dist/lib/springs.d.ts +44 -0
  265. package/dist/lib/springs.js +8 -0
  266. package/dist/lib/surface-classes.d.ts +19 -0
  267. package/dist/lib/surface-classes.js +10 -0
  268. package/dist/lib/surface-context.d.ts +9 -0
  269. package/dist/lib/surface-context.js +8 -0
  270. package/dist/lib/use-controllable-state.d.ts +2 -0
  271. package/dist/lib/use-controllable-state.js +6 -0
  272. package/dist/lib/use-fluid-hover.d.ts +138 -0
  273. package/dist/lib/use-fluid-hover.js +14 -0
  274. package/dist/lib/use-is-mobile.d.ts +2 -0
  275. package/dist/lib/use-is-mobile.js +6 -0
  276. package/dist/lib/use-keyboard-nav-gate.d.ts +20 -0
  277. package/dist/lib/use-keyboard-nav-gate.js +7 -0
  278. package/dist/lib/use-merge-split.d.ts +47 -0
  279. package/dist/lib/use-merge-split.js +15 -0
  280. package/dist/lib/use-morph.d.ts +101 -0
  281. package/dist/lib/use-morph.js +20 -0
  282. package/dist/lib/use-touch-primary.d.ts +2 -0
  283. package/dist/lib/use-touch-primary.js +6 -0
  284. package/dist/lib/utils.d.ts +3 -0
  285. package/dist/lib/utils.js +6 -0
  286. package/dist/preset.d.ts +17 -0
  287. package/dist/preset.js +22 -2
  288. package/dist/primitives/code/index.js +7 -5
  289. package/dist/primitives/craft/index.js +9 -6
  290. package/dist/primitives/fluid-hover/index.js +9 -8
  291. package/dist/primitives/morph/index.js +15 -10
  292. package/dist/primitives/motion/index.js +10 -8
  293. package/dist/primitives/scroll-area/index.js +4 -3
  294. package/dist/primitives/separator/index.d.ts +25 -0
  295. package/dist/primitives/separator/index.js +9 -0
  296. package/dist/primitives/sizes/index.js +6 -4
  297. package/dist/primitives/skeleton/index.d.ts +35 -0
  298. package/dist/primitives/skeleton/index.js +12 -0
  299. package/dist/primitives/surface/index.js +6 -4
  300. package/dist/shared/{components-3mkepka5.js → components-0jmqhx2k.js} +28 -25
  301. package/dist/shared/components-124epb7f.js +53 -0
  302. package/dist/shared/{components-gz8zf3ec.js → components-1k0wv53d.js} +15 -43
  303. package/dist/shared/components-26snnbs9.js +322 -0
  304. package/dist/shared/{components-2dxkv6zm.js → components-2c0qcfx4.js} +8 -7
  305. package/dist/shared/{components-473g814w.js → components-2mt9te6d.js} +243 -137
  306. package/dist/shared/{components-hawvy2qz.js → components-2z48g4fp.js} +9 -30
  307. package/dist/shared/components-34txk9rj.js +35 -0
  308. package/dist/shared/components-3h92d94m.js +23 -0
  309. package/dist/shared/{components-zfnmn5d4.js → components-3sp623ae.js} +36 -31
  310. package/dist/shared/{components-jwst3vtj.js → components-3wxkjgqn.js} +186 -76
  311. package/dist/shared/{components-s2bz1xpk.js → components-49bsynbw.js} +8 -5
  312. package/dist/shared/components-4bwsd46w.js +71 -0
  313. package/dist/shared/components-4n4f5m3e.js +297 -0
  314. package/dist/shared/{components-0q0sqfh4.js → components-4y816hwp.js} +27 -49
  315. package/dist/shared/components-52ngsgca.js +399 -0
  316. package/dist/shared/{components-y9y0g8er.js → components-52r5763g.js} +22 -19
  317. package/dist/shared/components-559tf7yb.js +28 -0
  318. package/dist/shared/components-5mkga9hj.js +440 -0
  319. package/dist/shared/{components-kwa6mrf9.js → components-5s0nfqvw.js} +14 -9
  320. package/dist/shared/{components-dk0gjr5a.js → components-60atskhp.js} +19 -18
  321. package/dist/shared/{components-rr7a6ja9.js → components-658b26nb.js} +21 -18
  322. package/dist/shared/{components-xxvdw7k1.js → components-65vwfjs6.js} +37 -34
  323. package/dist/shared/{components-frw34b65.js → components-6j2fh74k.js} +114 -123
  324. package/dist/shared/components-6zg1yft7.js +167 -0
  325. package/dist/shared/components-6zng858q.js +53 -0
  326. package/dist/shared/components-72w4ge68.js +64 -0
  327. package/dist/shared/{components-cv16mryv.js → components-78x40gee.js} +13 -7
  328. package/dist/shared/{components-b2wyq2cq.js → components-7d4r7hh1.js} +39 -57
  329. package/dist/shared/components-7ntvvegr.js +316 -0
  330. package/dist/shared/components-8nwsqjn8.js +34 -0
  331. package/dist/shared/{components-5xc2j8jz.js → components-8tt3xbb5.js} +19 -18
  332. package/dist/shared/{components-vc7vq5nz.js → components-9as3rf68.js} +6 -3
  333. package/dist/shared/components-9mys9jna.js +255 -0
  334. package/dist/shared/components-adkarj8n.js +35 -0
  335. package/dist/shared/{components-b3c5et5b.js → components-ae9fncz4.js} +32 -31
  336. package/dist/shared/{components-hqeq3w9q.js → components-awra5sff.js} +24 -16
  337. package/dist/shared/components-b1e239g3.js +28 -0
  338. package/dist/shared/{components-q5xj5c16.js → components-b1f2bjf1.js} +9 -8
  339. package/dist/shared/{components-qmmjx1qw.js → components-bn42vq6d.js} +71 -72
  340. package/dist/shared/components-c96g82th.js +1444 -0
  341. package/dist/shared/components-c9yr4ed1.js +44 -0
  342. package/dist/shared/components-d3shbwqq.js +95 -0
  343. package/dist/shared/{components-jjw69c4c.js → components-dcc02hs2.js} +7 -4
  344. package/dist/shared/{components-men63rwj.js → components-de99ykt7.js} +3 -2
  345. package/dist/shared/components-dhgk6mbt.js +16 -0
  346. package/dist/shared/components-drxrtnp2.js +25 -0
  347. package/dist/shared/{components-6p8tfcd6.js → components-ds9fqat9.js} +21 -18
  348. package/dist/shared/{components-mjthm1kf.js → components-egy4tyjt.js} +11 -8
  349. package/dist/shared/components-f0xfpkhh.js +82 -0
  350. package/dist/shared/components-f7h57m6t.js +59 -0
  351. package/dist/shared/{components-d6xtjht3.js → components-fjkpbg6n.js} +33 -30
  352. package/dist/shared/{components-gc5vtq2f.js → components-gh0qeey3.js} +63 -29
  353. package/dist/shared/{components-39jq9va1.js → components-gvbapfen.js} +29 -24
  354. package/dist/shared/{components-5vgpnxgy.js → components-gzesg7hy.js} +19 -16
  355. package/dist/shared/components-h6p86be3.js +19 -0
  356. package/dist/shared/components-h83az0bz.js +33 -0
  357. package/dist/shared/components-jjrj6ymn.js +104 -0
  358. package/dist/shared/{components-wvp1m52g.js → components-jp5v0m0f.js} +15 -14
  359. package/dist/shared/{components-zrkzcayz.js → components-jqpefjsn.js} +54 -6
  360. package/dist/shared/{components-1z6tdadk.js → components-k74j4hwh.js} +20 -17
  361. package/dist/shared/components-kswxnm3h.js +24 -0
  362. package/dist/shared/{components-jbbmdr74.js → components-mkkbbgb7.js} +36 -17
  363. package/dist/shared/{components-pbmqctfa.js → components-mpw667rb.js} +169 -65
  364. package/dist/shared/{components-s5ngg32c.js → components-paa08427.js} +121 -47
  365. package/dist/shared/{components-vfbhxf5r.js → components-pd42emw3.js} +6 -5
  366. package/dist/shared/{components-hw9yk32z.js → components-pmfszv7a.js} +35 -23
  367. package/dist/shared/{components-chacnk61.js → components-pw06rbxq.js} +19 -19
  368. package/dist/shared/components-q03cktx8.js +246 -0
  369. package/dist/shared/{components-kvr7f9hy.js → components-qdm3yh26.js} +19 -10
  370. package/dist/shared/{components-27nnvrwe.js → components-qs4rkqsj.js} +15 -14
  371. package/dist/shared/{components-s083f38z.js → components-r6gbmkew.js} +22 -21
  372. package/dist/shared/{components-ta7shw28.js → components-r8eqs7gz.js} +4 -4
  373. package/dist/shared/{components-sn1rxx1d.js → components-rm02h9nt.js} +12 -11
  374. package/dist/shared/{components-c6s6b43g.js → components-rrbpmfx4.js} +3 -2
  375. package/dist/shared/{components-n7mjr357.js → components-tz1fv35x.js} +3 -2
  376. package/dist/shared/components-tz4gaf1v.js +23 -0
  377. package/dist/shared/{components-zx6b6yby.js → components-vf45j12c.js} +4 -18
  378. package/dist/shared/{components-3ky44908.js → components-vfjc9jzz.js} +2 -3
  379. package/dist/shared/{components-39vmfq9s.js → components-vsa625vk.js} +21 -20
  380. package/dist/shared/components-wawnmkph.js +500 -0
  381. package/dist/shared/components-wktrrb4m.js +38 -0
  382. package/dist/shared/{components-8snj490h.js → components-wwd363me.js} +78 -32
  383. package/dist/shared/{components-5pnw8183.js → components-xcwvgcrd.js} +23 -22
  384. package/dist/shared/components-xdqmt6ed.js +20 -0
  385. package/dist/shared/{components-h2ajmhwn.js → components-y1w3a6wx.js} +107 -35
  386. package/dist/shared/{components-ar66gnt0.js → components-y6578b8h.js} +37 -34
  387. package/dist/shared/{components-59efxjd9.js → components-yhgq0qxx.js} +13 -12
  388. package/dist/shared/{components-jthe1pwb.js → components-yz84gpkq.js} +101 -404
  389. package/dist/shared/components-z3v0n0de.js +11 -0
  390. package/dist/shared/{components-7r3etddy.js → components-z9n19fyk.js} +19 -54
  391. package/dist/shared/components-zbvjzh1p.js +141 -0
  392. package/dist/styles.css +241 -16
  393. package/dist/tailwind.css +13 -0
  394. package/dist/tokens.css +34 -0
  395. package/index.ts +60 -0
  396. package/lib/date-locale.ts +50 -0
  397. package/lib/field-classes.ts +115 -0
  398. package/lib/field-variants.ts +117 -0
  399. package/lib/fluid-hover-highlight.tsx +139 -0
  400. package/lib/focus-ring.tsx +46 -0
  401. package/lib/goo-indicator.tsx +261 -0
  402. package/lib/icon-context.tsx +310 -0
  403. package/lib/inert.ts +22 -0
  404. package/lib/morph-layers.tsx +102 -0
  405. package/lib/morph-part.tsx +49 -0
  406. package/lib/popup.ts +52 -0
  407. package/lib/reduced-motion.ts +19 -0
  408. package/lib/row-index.tsx +29 -0
  409. package/lib/row-order.tsx +115 -0
  410. package/lib/scroll-column.tsx +244 -0
  411. package/lib/shape-context.tsx +124 -0
  412. package/lib/size-context.tsx +66 -0
  413. package/lib/size-scale.ts +115 -0
  414. package/lib/slot.ts +25 -0
  415. package/lib/springs.ts +62 -0
  416. package/lib/surface-classes.ts +58 -0
  417. package/lib/surface-context.tsx +21 -0
  418. package/lib/use-controllable-state.ts +44 -0
  419. package/lib/use-fluid-hover.ts +541 -0
  420. package/lib/use-is-mobile.ts +25 -0
  421. package/lib/use-keyboard-nav-gate.ts +45 -0
  422. package/lib/use-merge-split.tsx +209 -0
  423. package/lib/use-morph.ts +557 -0
  424. package/lib/use-touch-primary.tsx +43 -0
  425. package/lib/utils.ts +37 -0
  426. package/package.json +177 -4
  427. package/preset.ts +196 -0
  428. package/primitives/code/examples.mdx +27 -0
  429. package/primitives/code/index.tsx +80 -0
  430. package/primitives/craft/demos.tsx +173 -0
  431. package/primitives/craft/examples.mdx +138 -0
  432. package/primitives/craft/index.tsx +76 -0
  433. package/primitives/fluid-hover/examples.mdx +84 -0
  434. package/primitives/fluid-hover/index.tsx +316 -0
  435. package/primitives/morph/examples.mdx +135 -0
  436. package/primitives/morph/index.tsx +192 -0
  437. package/primitives/motion/examples.mdx +100 -0
  438. package/primitives/motion/index.tsx +160 -0
  439. package/primitives/scroll-area/examples.mdx +58 -0
  440. package/primitives/scroll-area/index.tsx +200 -0
  441. package/primitives/separator/examples.mdx +30 -0
  442. package/primitives/separator/index.tsx +53 -0
  443. package/primitives/sizes/examples.mdx +167 -0
  444. package/primitives/sizes/index.tsx +89 -0
  445. package/primitives/skeleton/examples.mdx +51 -0
  446. package/primitives/skeleton/index.tsx +72 -0
  447. package/primitives/skeleton/skeleton.css +15 -0
  448. package/primitives/surface/examples.mdx +173 -0
  449. package/primitives/surface/index.tsx +109 -0
  450. package/primitives/surface/surface.css +176 -0
  451. package/dist/shared/components-0sn7ypjw.js +0 -61
  452. package/dist/shared/components-1434p1mh.js +0 -123
  453. package/dist/shared/components-a86dytt0.js +0 -986
  454. package/dist/shared/components-gf5s6ap9.js +0 -42
  455. package/dist/shared/components-hyq23phv.js +0 -310
  456. package/dist/shared/components-ng72k97e.js +0 -128
  457. package/dist/shared/components-raknhppb.js +0 -64
  458. package/dist/shared/components-vynjtrk6.js +0 -19
  459. package/dist/shared/components-wy9jpqny.js +0 -146
  460. /package/dist/shared/{components-1v7rxytx.js → components-3ey0hzpb.js} +0 -0
  461. /package/dist/shared/{components-ezxhrmer.js → components-jcnjay5g.js} +0 -0
@@ -1,16 +1,17 @@
1
+ "use client";
1
2
  import {
2
3
  cn2
3
- } from "./components-ezxhrmer.js";
4
+ } from "./components-jcnjay5g.js";
4
5
  import {
5
6
  FluidHoverHighlight2
6
- } from "./components-kvr7f9hy.js";
7
+ } from "./components-qdm3yh26.js";
7
8
  import {
8
- useShape
9
- } from "./components-cv16mryv.js";
9
+ useShape2
10
+ } from "./components-78x40gee.js";
10
11
  import {
11
12
  useFluidHover2,
12
13
  useRegisterFluidHoverItem2
13
- } from "./components-59efxjd9.js";
14
+ } from "./components-yhgq0qxx.js";
14
15
 
15
16
  // primitives/fluid-hover/index.tsx
16
17
  import {
@@ -41,7 +42,7 @@ var containerAxisClass = {
41
42
  };
42
43
  var FluidHoverItem2 = forwardRef(({ index, disabled = false, className, children, ...props }, ref) => {
43
44
  const list = useContext(FluidHoverContext);
44
- const shape = useShape();
45
+ const shape = useShape2();
45
46
  const innerRef = useRef(null);
46
47
  useRegisterFluidHoverItem2(list?.registerItem, index, innerRef);
47
48
  const axis = list?.axis ?? "y";
@@ -77,7 +78,7 @@ var FluidHover2 = forwardRef(({
77
78
  ...props
78
79
  }, ref) => {
79
80
  const containerRef = useRef(null);
80
- const shape = useShape();
81
+ const shape = useShape2();
81
82
  const resolvedAxis = axis ?? ((columns ?? 1) > 1 ? "xy" : "y");
82
83
  const resolvedColumns = resolvedAxis === "xy" ? Math.max(1, columns ?? 2) : 1;
83
84
  const hover = useFluidHover2(containerRef, {
@@ -1,61 +1,72 @@
1
+ "use client";
1
2
  import {
2
- shapeMap,
3
- useShape
4
- } from "./components-cv16mryv.js";
3
+ fieldIconClasses2
4
+ } from "./components-124epb7f.js";
5
+ import {
6
+ shapeMap2,
7
+ useShape2
8
+ } from "./components-78x40gee.js";
5
9
  import {
6
10
  useSize2
7
- } from "./components-0sn7ypjw.js";
11
+ } from "./components-h83az0bz.js";
8
12
  import {
9
13
  cn2
10
- } from "./components-ezxhrmer.js";
14
+ } from "./components-jcnjay5g.js";
15
+ import {
16
+ useFieldBox2
17
+ } from "./components-6zng858q.js";
18
+ import {
19
+ useReduceMotion2
20
+ } from "./components-de99ykt7.js";
11
21
  import {
12
- fieldIconClasses,
13
- useFieldBox
14
- } from "./components-raknhppb.js";
22
+ spring2
23
+ } from "./components-3ey0hzpb.js";
15
24
  import {
16
- opensInPlace,
17
- inPlaceOffset,
18
- useMorphOrigin,
19
- useMorph
20
- } from "./components-hqeq3w9q.js";
25
+ opensInPlace2,
26
+ inPlaceOffset2,
27
+ useMorphOrigin2,
28
+ useMorph2
29
+ } from "./components-awra5sff.js";
21
30
  import {
22
31
  FluidHoverHighlight2
23
- } from "./components-kvr7f9hy.js";
32
+ } from "./components-qdm3yh26.js";
33
+ import {
34
+ useIcon2
35
+ } from "./components-jqpefjsn.js";
36
+ import {
37
+ MorphSurface2
38
+ } from "./components-4y816hwp.js";
24
39
  import {
25
- useIcon
26
- } from "./components-zrkzcayz.js";
40
+ popupScrollAreaClass2,
41
+ popupViewportClass2,
42
+ isDisabledRow2
43
+ } from "./components-h6p86be3.js";
27
44
  import {
28
- MorphSurface
29
- } from "./components-0q0sqfh4.js";
45
+ SURFACE_BG2,
46
+ SURFACE_SHADOW2
47
+ } from "./components-vf45j12c.js";
30
48
  import {
31
- SURFACE_BG,
32
- SURFACE_SHADOW,
33
49
  useSurface2,
34
50
  SurfaceProvider2
35
- } from "./components-zx6b6yby.js";
51
+ } from "./components-dhgk6mbt.js";
52
+ import {
53
+ useControllableState2
54
+ } from "./components-tz1fv35x.js";
36
55
  import {
37
56
  useFluidHover2,
38
57
  useRegisterFluidHoverItem2
39
- } from "./components-59efxjd9.js";
58
+ } from "./components-yhgq0qxx.js";
40
59
  import {
41
- useSelectionRuns,
42
- useMergeSplitBlocks,
43
- SelectionBackgrounds
44
- } from "./components-5xc2j8jz.js";
60
+ useSelectionRuns2,
61
+ useMergeSplitBlocks2,
62
+ SelectionBackgrounds2
63
+ } from "./components-8tt3xbb5.js";
45
64
  import {
46
65
  ScrollArea2
47
- } from "./components-hawvy2qz.js";
66
+ } from "./components-2z48g4fp.js";
48
67
  import {
49
68
  SizeProvider2
50
- } from "./components-jjw69c4c.js";
51
- import {
52
- popupScrollAreaClass,
53
- popupViewportClass,
54
- isDisabledRow
55
- } from "./components-vynjtrk6.js";
56
- import {
57
- spring2
58
- } from "./components-1v7rxytx.js";
69
+ } from "./components-dcc02hs2.js";
59
70
 
60
71
  // components/inputs/combobox/index.tsx
61
72
  import { Combobox as ComboboxPrimitive } from "@base-ui/react/combobox";
@@ -76,6 +87,11 @@ function itemValue(item) {
76
87
  return typeof item === "string" ? item : item.value;
77
88
  }
78
89
  function itemLabel(item) {
90
+ if (typeof item === "string")
91
+ return item;
92
+ return item.textValue ?? (typeof item.label === "string" ? item.label : item.value);
93
+ }
94
+ function itemNode(item) {
79
95
  return typeof item === "string" ? item : item.label;
80
96
  }
81
97
  var CREATE_VALUE = "\x00create";
@@ -117,15 +133,24 @@ function Combobox2({
117
133
  disabled = false,
118
134
  name,
119
135
  required,
136
+ inputValue: inputValueProp,
137
+ defaultInputValue,
138
+ onInputValueChange,
139
+ loading = false,
140
+ loadingLabel = "Loading…",
141
+ readOnly = false,
142
+ open: openProp,
143
+ defaultOpen = false,
144
+ onOpenChange,
120
145
  size
121
146
  }) {
122
147
  const isMultiple = !!multiple;
123
148
  const [internalValues, setInternalValues] = useState(() => toValues(defaultValue));
124
- const [inputValue, setInputValue] = useState("");
125
- const [open, setOpen] = useState(false);
149
+ const [inputValue, setInputValue] = useControllableState2(inputValueProp, defaultInputValue ?? "", onInputValueChange);
150
+ const [open, setOpen] = useControllableState2(openProp, defaultOpen, onOpenChange);
126
151
  const [highlight, setHighlight] = useState(null);
127
152
  const [createdItems, setCreatedItems] = useState([]);
128
- const { origin, capture } = useMorphOrigin();
153
+ const { origin, capture } = useMorphOrigin2();
129
154
  const anchorRef = useRef(null);
130
155
  const controlledValues = useMemo(() => toValues(value), [value]);
131
156
  const values = value !== undefined ? controlledValues : internalValues;
@@ -182,6 +207,8 @@ function Combobox2({
182
207
  }, [value, onValueChange, isMultiple, creatable]);
183
208
  const { contains } = ComboboxPrimitive.useFilter();
184
209
  const filterFn = useMemo(() => {
210
+ if (filter === null)
211
+ return null;
185
212
  if (!filter && !createItem)
186
213
  return;
187
214
  const match = filter ? (item, q) => filter(item, q) : (item, q) => contains(item, q, itemLabel);
@@ -198,8 +225,26 @@ function Combobox2({
198
225
  disabled,
199
226
  itemsByValue,
200
227
  createRow,
201
- allSelected
202
- }), [values, isMultiple, inputValue, open, origin, disabled, itemsByValue, createRow, allSelected]);
228
+ allSelected,
229
+ loading,
230
+ loadingLabel,
231
+ readOnly,
232
+ setOpen
233
+ }), [
234
+ values,
235
+ isMultiple,
236
+ inputValue,
237
+ open,
238
+ origin,
239
+ disabled,
240
+ itemsByValue,
241
+ createRow,
242
+ allSelected,
243
+ loading,
244
+ loadingLabel,
245
+ readOnly,
246
+ setOpen
247
+ ]);
203
248
  const root = /* @__PURE__ */ jsx(ComboboxContext.Provider, {
204
249
  value: ctx,
205
250
  children: /* @__PURE__ */ jsx(ComboboxHighlightContext.Provider, {
@@ -219,10 +264,13 @@ function Combobox2({
219
264
  capture({ event: details.event, trigger: anchorRef.current ?? undefined });
220
265
  setOpen(next);
221
266
  },
267
+ inputValue: inputValueProp,
268
+ defaultInputValue,
222
269
  onInputValueChange: (next) => setInputValue(next),
223
270
  autoHighlight: ALWAYS_HIGHLIGHT,
224
271
  onItemHighlighted: (item, details) => setHighlight(item === undefined ? null : { index: details.index, keyboard: details.reason !== "pointer" }),
225
272
  disabled,
273
+ readOnly,
226
274
  name,
227
275
  required,
228
276
  modal: false,
@@ -236,17 +284,25 @@ function Combobox2({
236
284
  }) : root;
237
285
  }
238
286
  Combobox2.displayName = "Combobox";
239
- var popupShape = shapeMap.rounded;
287
+ var popupShape = shapeMap2.rounded;
240
288
  var ALWAYS_HIGHLIGHT = "always";
241
289
  var fieldButtonClass = "flex shrink-0 items-center justify-center rounded-md text-muted-foreground outline-none transition-colors duration-fast hover:text-foreground focus-visible:ring-1 focus-visible:ring-focus-ring data-[disabled]:pointer-events-none";
242
290
  var clearButtonClass = cn2(fieldButtonClass, "hover:bg-hover active:bg-active transition-[color,background-color]");
243
291
  var chipRemoveClass = cn2(fieldButtonClass, "rounded hover:bg-active");
292
+ var SHOWN = { opacity: 1, scale: 1, filter: "blur(0px)" };
293
+ var HIDDEN = { opacity: 0, scale: 0.6, filter: "blur(4px)" };
294
+ var swapEnter = { type: "tween", duration: spring2.fast.duration, ease: "easeOut" };
295
+ var swapLeave = { type: "tween", ...spring2.fast.exit, ease: "easeIn" };
244
296
  function FieldControls({ clearable, compact, iconSize }) {
245
- const XIcon = useIcon("x");
246
- const pill = useShape().variant === "pill";
297
+ const XIcon = useIcon2("x");
298
+ const Loader = useIcon2("loader-circle");
299
+ const pill = useShape2().variant === "pill";
300
+ const { loading, readOnly } = useComboboxContext();
301
+ const reduced = useReduceMotion2();
302
+ const swap = (shown) => reduced ? { opacity: shown ? 1 : 0 } : shown ? SHOWN : HIDDEN;
247
303
  return /* @__PURE__ */ jsxs(Fragment, {
248
304
  children: [
249
- clearable && /* @__PURE__ */ jsx("span", {
305
+ clearable && !readOnly && /* @__PURE__ */ jsx("span", {
250
306
  className: cn2("flex shrink-0 items-center justify-center", compact ? "size-5" : "size-6"),
251
307
  children: /* @__PURE__ */ jsx(ComboboxPrimitive.Clear, {
252
308
  "aria-label": "Clear",
@@ -261,28 +317,52 @@ function FieldControls({ clearable, compact, iconSize }) {
261
317
  "aria-label": "Open",
262
318
  tabIndex: -1,
263
319
  className: cn2(fieldButtonClass, compact ? "size-5" : "size-6"),
264
- children: /* @__PURE__ */ jsx("svg", {
265
- width: iconSize,
266
- height: iconSize,
267
- viewBox: "0 0 24 24",
268
- fill: "none",
269
- stroke: "currentColor",
270
- strokeWidth: 2,
271
- strokeLinecap: "round",
272
- strokeLinejoin: "round",
273
- className: "transition-colors duration-fast",
274
- children: /* @__PURE__ */ jsx("path", {
275
- d: "M6 9l6 6 6-6"
276
- })
320
+ children: /* @__PURE__ */ jsxs("span", {
321
+ className: "grid",
322
+ style: { width: iconSize, height: iconSize },
323
+ children: [
324
+ /* @__PURE__ */ jsx(motion.span, {
325
+ className: "col-start-1 row-start-1 flex",
326
+ initial: false,
327
+ animate: swap(!loading),
328
+ transition: loading ? swapLeave : swapEnter,
329
+ children: /* @__PURE__ */ jsx("svg", {
330
+ width: iconSize,
331
+ height: iconSize,
332
+ viewBox: "0 0 24 24",
333
+ fill: "none",
334
+ stroke: "currentColor",
335
+ strokeWidth: 2,
336
+ strokeLinecap: "round",
337
+ strokeLinejoin: "round",
338
+ className: cn2("transition-colors duration-fast", readOnly && "invisible"),
339
+ children: /* @__PURE__ */ jsx("path", {
340
+ d: "M6 9l6 6 6-6"
341
+ })
342
+ })
343
+ }),
344
+ /* @__PURE__ */ jsx(motion.span, {
345
+ "aria-hidden": true,
346
+ className: "col-start-1 row-start-1 flex",
347
+ initial: false,
348
+ animate: swap(loading),
349
+ transition: loading ? swapEnter : swapLeave,
350
+ children: /* @__PURE__ */ jsx(Loader, {
351
+ size: iconSize,
352
+ strokeWidth: 1.5,
353
+ className: "animate-spin motion-reduce:animate-none"
354
+ })
355
+ })
356
+ ]
277
357
  })
278
358
  })
279
359
  ]
280
360
  });
281
361
  }
282
362
  var ComboboxInput2 = forwardRef(({ className, variant = "bordered", icon: Icon, placeholder = "Search…", error, clearable = false, size, ...props }, ref) => {
283
- const { size: sizeClasses, props: boxProps } = useFieldBox({ variant, invalid: !!error, size });
363
+ const { anchorRef, readOnly } = useComboboxContext();
364
+ const { size: sizeClasses, props: boxProps } = useFieldBox2({ variant, invalid: !!error, readOnly, size });
284
365
  const compact = sizeClasses.variant === "compact";
285
- const { anchorRef } = useComboboxContext();
286
366
  return /* @__PURE__ */ jsxs("div", {
287
367
  className: "flex flex-col gap-1",
288
368
  children: [
@@ -294,7 +374,7 @@ var ComboboxInput2 = forwardRef(({ className, variant = "bordered", icon: Icon,
294
374
  Icon && /* @__PURE__ */ jsx(Icon, {
295
375
  size: sizeClasses.icon,
296
376
  strokeWidth: 1.5,
297
- className: fieldIconClasses
377
+ className: fieldIconClasses2
298
378
  }),
299
379
  /* @__PURE__ */ jsx(ComboboxPrimitive.Input, {
300
380
  ref,
@@ -345,10 +425,10 @@ function useChipRowHeight(padY) {
345
425
  return { ref, height };
346
426
  }
347
427
  var ComboboxChips2 = forwardRef(({ className, variant = "bordered", icon: Icon, placeholder = "Search…", error, clearable = false, size, ...props }, ref) => {
348
- const XIcon = useIcon("x");
349
- const shape = useShape();
350
- const { anchorRef, open, disabled, inputValue, values } = useComboboxContext();
351
- const { size: sizeClasses, props: boxProps } = useFieldBox({ variant, invalid: !!error, disabled, size });
428
+ const XIcon = useIcon2("x");
429
+ const shape = useShape2();
430
+ const { anchorRef, open, disabled, inputValue, values, readOnly } = useComboboxContext();
431
+ const { size: sizeClasses, props: boxProps } = useFieldBox2({ variant, invalid: !!error, disabled, readOnly, size });
352
432
  const compact = sizeClasses.variant === "compact";
353
433
  const rowHeight = useChipRowHeight(compact ? 8 : 12);
354
434
  return /* @__PURE__ */ jsxs("div", {
@@ -368,7 +448,7 @@ var ComboboxChips2 = forwardRef(({ className, variant = "bordered", icon: Icon,
368
448
  children: /* @__PURE__ */ jsx(Icon, {
369
449
  size: sizeClasses.icon,
370
450
  strokeWidth: 1.5,
371
- className: fieldIconClasses
451
+ className: fieldIconClasses2
372
452
  })
373
453
  }),
374
454
  /* @__PURE__ */ jsx("div", {
@@ -400,10 +480,10 @@ var ComboboxChips2 = forwardRef(({ className, variant = "bordered", icon: Icon,
400
480
  className: cn2("inline-flex max-w-full shrink-0 items-center gap-0.5 bg-hover pl-2 pr-0.5 text-foreground outline-none", shape.variant === "pill" ? "rounded-full" : "rounded-md", "focus-visible:ring-1 focus-visible:ring-focus-ring", compact ? "h-5 text-caption-compact" : "h-6 text-caption"),
401
481
  children: [
402
482
  /* @__PURE__ */ jsx("span", {
403
- className: "truncate",
404
- children: label
483
+ className: cn2(typeof itemNode(item) === "string" ? "truncate" : "flex min-w-0 items-center", readOnly && "pr-1.5"),
484
+ children: itemNode(item)
405
485
  }),
406
- /* @__PURE__ */ jsx(ComboboxPrimitive.ChipRemove, {
486
+ !readOnly && /* @__PURE__ */ jsx(ComboboxPrimitive.ChipRemove, {
407
487
  "aria-label": `Remove ${label}`,
408
488
  className: cn2(chipRemoveClass, shape.variant === "pill" && "rounded-full", compact ? "size-4" : "size-5"),
409
489
  children: /* @__PURE__ */ jsx(XIcon, {
@@ -455,10 +535,11 @@ var ComboboxContent2 = forwardRef(({
455
535
  from,
456
536
  effect,
457
537
  hideSource,
458
- tier = "moderate"
538
+ tier = "moderate",
539
+ footer
459
540
  }, ref) => {
460
- const { open, origin, anchorRef } = useComboboxContext();
461
- const morph = useMorph(open, origin, { from, effect, hideSource, tier });
541
+ const { open, origin, anchorRef, setOpen, inputValue } = useComboboxContext();
542
+ const morph = useMorph2(open, origin, { from, effect, hideSource, tier });
462
543
  useImperativeHandle(ref, () => morph.popup, [morph.popup]);
463
544
  const level = Math.min(useSurface2() + 2, 8);
464
545
  const shape = popupShape;
@@ -467,20 +548,26 @@ var ComboboxContent2 = forwardRef(({
467
548
  anchor: anchorRef,
468
549
  side,
469
550
  align,
470
- sideOffset: opensInPlace({ effect, hideSource }) ? inPlaceOffset : sideOffset,
551
+ sideOffset: opensInPlace2({ effect, hideSource }) ? inPlaceOffset2 : sideOffset,
471
552
  className: "z-50 outline-none",
472
553
  children: /* @__PURE__ */ jsx(ComboboxPrimitive.Popup, {
473
554
  ref: morph.popupRef,
474
555
  className: "relative select-none outline-none",
475
556
  children: /* @__PURE__ */ jsx(SurfaceProvider2, {
476
557
  value: level,
477
- children: /* @__PURE__ */ jsx(MorphSurface, {
558
+ children: /* @__PURE__ */ jsxs(MorphSurface2, {
478
559
  morph,
479
- bg: SURFACE_BG[level],
480
- shadow: SURFACE_SHADOW[3],
560
+ bg: SURFACE_BG2[level],
561
+ shadow: SURFACE_SHADOW2[3],
481
562
  radius: shape.container,
482
563
  className: cn2(`flex flex-col min-w-[var(--anchor-width)] max-h-[min(300px,var(--available-height))] overflow-hidden ${shape.container}`, className),
483
- children
564
+ children: [
565
+ children,
566
+ footer !== undefined && /* @__PURE__ */ jsx("div", {
567
+ className: "shrink-0 border-t border-border p-1",
568
+ children: typeof footer === "function" ? footer({ close: () => setOpen(false), query: inputValue.trim() }) : footer
569
+ })
570
+ ]
484
571
  })
485
572
  })
486
573
  })
@@ -489,12 +576,14 @@ var ComboboxContent2 = forwardRef(({
489
576
  });
490
577
  ComboboxContent2.displayName = "ComboboxContent";
491
578
  var ComboboxList2 = forwardRef(({ className, children }, ref) => {
492
- const { open, values, multiple, inputValue, createRow } = useComboboxContext();
579
+ const { open, values, multiple, inputValue, createRow, loading, loadingLabel } = useComboboxContext();
580
+ const Loader = useIcon2("loader-circle");
581
+ const sizeClasses = useSize2();
493
582
  const highlight = useContext(ComboboxHighlightContext);
494
- const PlusIcon = useIcon("plus");
583
+ const PlusIcon = useIcon2("plus");
495
584
  const shape = popupShape;
496
585
  const containerRef = useRef(null);
497
- const hover = useFluidHover2(containerRef, { isItemDisabled: isDisabledRow });
586
+ const hover = useFluidHover2(containerRef, { isItemDisabled: isDisabledRow2 });
498
587
  const { activeIndex, setActiveIndex, itemRects, isMeasured, handlers, registerItem, remeasure } = hover;
499
588
  const [checkedIndices, setCheckedIndices] = useState([]);
500
589
  useEffect(() => {
@@ -552,64 +641,81 @@ var ComboboxList2 = forwardRef(({ className, children }, ref) => {
552
641
  }, [open, setActiveIndex]);
553
642
  const firstChecked = checkedIndices[0];
554
643
  const checkedRect = isMeasured && !multiple && firstChecked !== undefined ? itemRects[firstChecked] ?? null : null;
555
- const runs = useSelectionRuns(multiple ? checkedIndices : []);
556
- const blocks = useMergeSplitBlocks(runs, isMeasured && open ? itemRects : [], shape.bgRadius);
644
+ const runs = useSelectionRuns2(multiple ? checkedIndices : []);
645
+ const blocks = useMergeSplitBlocks2(runs, isMeasured && open ? itemRects : [], shape.bgRadius);
557
646
  const contentCtx = useMemo(() => ({ registerItem, activeIndex }), [registerItem, activeIndex]);
558
647
  return /* @__PURE__ */ jsx(ComboboxContentContext.Provider, {
559
648
  value: contentCtx,
560
- children: /* @__PURE__ */ jsx(ScrollArea2, {
561
- className: popupScrollAreaClass,
562
- viewportClassName: cn2(popupViewportClass, "scroll-fade"),
563
- children: /* @__PURE__ */ jsxs(ComboboxPrimitive.List, {
564
- ref: (node) => {
565
- containerRef.current = node;
566
- if (typeof ref === "function")
567
- ref(node);
568
- else if (ref)
569
- ref.current = node;
570
- },
571
- onMouseEnter: handlers.onMouseEnter,
572
- onMouseMove: handlers.onMouseMove,
573
- onMouseLeave: handlers.onMouseLeave,
574
- onClick: handlers.onClick,
575
- className: cn2("relative flex flex-col p-1 outline-none data-[empty]:p-0", className),
576
- children: [
577
- open && multiple && /* @__PURE__ */ jsx(SelectionBackgrounds, {
578
- blocks: reflowSnap ? blocks.map((b) => ({ ...b, instant: true })) : blocks
579
- }),
580
- open && !multiple && /* @__PURE__ */ jsx(AnimatePresence, {
581
- children: checkedRect && /* @__PURE__ */ jsx(motion.div, {
582
- "aria-hidden": true,
583
- className: `absolute ${shape.bg} bg-active pointer-events-none`,
584
- initial: false,
585
- animate: {
586
- top: checkedRect.top,
587
- left: checkedRect.left,
588
- width: checkedRect.width,
589
- height: checkedRect.height,
590
- opacity: 1
591
- },
592
- exit: { opacity: 0, transition: spring2.moderate.exit },
593
- transition: reflowSnap ? { duration: 0 } : { ...spring2.moderate, opacity: { duration: spring2.fast.duration } }
594
- }, "checked")
595
- }),
596
- open && /* @__PURE__ */ jsx(FluidHoverHighlight2, {
597
- hover,
598
- className: shape.bg,
599
- transition: reflowSnap ? false : undefined
600
- }),
601
- /* @__PURE__ */ jsx(ComboboxPrimitive.Collection, {
602
- children: (item, index) => /* @__PURE__ */ jsx(ComboboxItemIndexContext.Provider, {
603
- value: index,
604
- children: isCreateItem(item) ? /* @__PURE__ */ jsx(ComboboxItem2, {
605
- value: CREATE_VALUE,
606
- icon: PlusIcon,
607
- children: createRow
608
- }) : children(item, index)
609
- }, itemValue(item))
610
- })
611
- ]
612
- })
649
+ children: /* @__PURE__ */ jsxs(ScrollArea2, {
650
+ className: popupScrollAreaClass2,
651
+ viewportClassName: cn2(popupViewportClass2, "scroll-fade"),
652
+ children: [
653
+ /* @__PURE__ */ jsxs(ComboboxPrimitive.List, {
654
+ ref: (node) => {
655
+ containerRef.current = node;
656
+ if (typeof ref === "function")
657
+ ref(node);
658
+ else if (ref)
659
+ ref.current = node;
660
+ },
661
+ onMouseEnter: handlers.onMouseEnter,
662
+ onMouseMove: handlers.onMouseMove,
663
+ onMouseLeave: handlers.onMouseLeave,
664
+ onClick: handlers.onClick,
665
+ className: cn2("relative flex flex-col p-1 outline-none data-[empty]:p-0", className),
666
+ children: [
667
+ open && multiple && /* @__PURE__ */ jsx(SelectionBackgrounds2, {
668
+ blocks: reflowSnap ? blocks.map((b) => ({ ...b, instant: true })) : blocks
669
+ }),
670
+ open && !multiple && /* @__PURE__ */ jsx(AnimatePresence, {
671
+ children: checkedRect && /* @__PURE__ */ jsx(motion.div, {
672
+ "aria-hidden": true,
673
+ className: `absolute ${shape.bg} bg-active pointer-events-none`,
674
+ initial: false,
675
+ animate: {
676
+ top: checkedRect.top,
677
+ left: checkedRect.left,
678
+ width: checkedRect.width,
679
+ height: checkedRect.height,
680
+ opacity: 1
681
+ },
682
+ exit: { opacity: 0, transition: spring2.moderate.exit },
683
+ transition: reflowSnap ? { duration: 0 } : { ...spring2.moderate, opacity: { duration: spring2.fast.duration } }
684
+ }, "checked")
685
+ }),
686
+ open && /* @__PURE__ */ jsx(FluidHoverHighlight2, {
687
+ hover,
688
+ className: shape.bg,
689
+ transition: reflowSnap ? false : undefined
690
+ }),
691
+ /* @__PURE__ */ jsx(ComboboxPrimitive.Collection, {
692
+ children: (item, index) => /* @__PURE__ */ jsx(ComboboxItemIndexContext.Provider, {
693
+ value: index,
694
+ children: isCreateItem(item) ? /* @__PURE__ */ jsx(ComboboxItem2, {
695
+ value: CREATE_VALUE,
696
+ icon: PlusIcon,
697
+ children: createRow
698
+ }) : children(item, index)
699
+ }, itemValue(item))
700
+ })
701
+ ]
702
+ }),
703
+ loading && /* @__PURE__ */ jsxs("div", {
704
+ role: "status",
705
+ className: cn2("flex shrink-0 items-center justify-center text-muted-foreground", sizeClasses.control, sizeClasses.itemPx, sizeClasses.gap, sizeClasses.text),
706
+ children: [
707
+ /* @__PURE__ */ jsx(Loader, {
708
+ size: sizeClasses.icon,
709
+ strokeWidth: 1.5,
710
+ className: "shrink-0 animate-spin motion-reduce:animate-none"
711
+ }),
712
+ /* @__PURE__ */ jsx("span", {
713
+ className: "truncate [text-box:trim-both_cap_alphabetic]",
714
+ children: loadingLabel
715
+ })
716
+ ]
717
+ })
718
+ ]
613
719
  })
614
720
  });
615
721
  });
@@ -656,7 +762,7 @@ var ComboboxItem2 = forwardRef(({ className, children, icon: Icon, value, disabl
656
762
  className: "shrink-0 transition-[color,stroke-width] duration-fast"
657
763
  }),
658
764
  /* @__PURE__ */ jsx("span", {
659
- className: "flex-1 min-w-0 truncate [text-box:trim-both_cap_alphabetic] py-1 -my-1",
765
+ className: cn2("flex-1 min-w-0", typeof children === "string" || typeof children === "number" ? "truncate [text-box:trim-both_cap_alphabetic] py-1 -my-1" : "flex items-center"),
660
766
  children
661
767
  }),
662
768
  /* @__PURE__ */ jsx("span", {
@@ -702,7 +808,7 @@ var ComboboxEmpty2 = forwardRef(({ className, children, allSelected, ...props },
702
808
  ref,
703
809
  className: cn2("px-3 text-center text-muted-foreground [&:not(:empty)]:py-6", sizeClasses.text, className),
704
810
  ...props,
705
- children: ctx.allSelected && allSelected !== undefined ? allSelected : children
811
+ children: ctx.loading ? null : ctx.allSelected && allSelected !== undefined ? allSelected : children
706
812
  });
707
813
  });
708
814
  ComboboxEmpty2.displayName = "ComboboxEmpty";
@@ -1,9 +1,13 @@
1
+ "use client";
1
2
  import {
2
- useShape
3
- } from "./components-cv16mryv.js";
3
+ useShape2
4
+ } from "./components-78x40gee.js";
5
+ import {
6
+ useTouchPrimary2
7
+ } from "./components-drxrtnp2.js";
4
8
  import {
5
9
  cn2
6
- } from "./components-ezxhrmer.js";
10
+ } from "./components-jcnjay5g.js";
7
11
 
8
12
  // primitives/scroll-area/index.tsx
9
13
  import { ScrollArea as ScrollAreaPrimitive } from "@base-ui/react/scroll-area";
@@ -12,35 +16,10 @@ import {
12
16
  forwardRef,
13
17
  useContext
14
18
  } from "react";
15
-
16
- // lib/use-touch-primary.tsx
17
- import { useEffect, useState } from "react";
18
- function useTouchPrimary() {
19
- const [isTouchPrimary, setIsTouchPrimary] = useState(false);
20
- useEffect(() => {
21
- if (typeof window === "undefined")
22
- return;
23
- const controller = new AbortController;
24
- const { signal } = controller;
25
- const handleTouch = () => {
26
- const hasTouch = "ontouchstart" in window || navigator.maxTouchPoints > 0;
27
- const prefersTouch = window.matchMedia("(pointer: coarse)").matches;
28
- setIsTouchPrimary(hasTouch && prefersTouch);
29
- };
30
- const mq = window.matchMedia("(pointer: coarse)");
31
- mq.addEventListener("change", handleTouch, { signal });
32
- window.addEventListener("pointerdown", handleTouch, { signal });
33
- handleTouch();
34
- return () => controller.abort();
35
- }, []);
36
- return isTouchPrimary;
37
- }
38
-
39
- // primitives/scroll-area/index.tsx
40
19
  import { jsx, jsxs } from "react/jsx-runtime";
41
20
  var ScrollAreaContext = createContext(false);
42
21
  var ScrollArea2 = forwardRef(({ className, children, viewportClassName, orientation = "vertical", ...props }, ref) => {
43
- const isTouch = useTouchPrimary();
22
+ const isTouch = useTouchPrimary2();
44
23
  return /* @__PURE__ */ jsx(ScrollAreaContext.Provider, {
45
24
  value: isTouch,
46
25
  children: isTouch ? /* @__PURE__ */ jsx("div", {
@@ -83,7 +62,7 @@ var ScrollArea2 = forwardRef(({ className, children, viewportClassName, orientat
83
62
  ScrollArea2.displayName = "ScrollArea";
84
63
  var ScrollBar2 = forwardRef(({ className, orientation = "vertical", ...props }, ref) => {
85
64
  const isTouch = useContext(ScrollAreaContext);
86
- const shape = useShape();
65
+ const shape = useShape2();
87
66
  if (isTouch)
88
67
  return null;
89
68
  return /* @__PURE__ */ jsx(ScrollAreaPrimitive.Scrollbar, {