@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
@@ -0,0 +1,144 @@
1
+ import { MouseEvent, RefObject } from "react";
2
+ type ShapeVariant = "pill" | "rounded";
3
+ type SizeVariant = "default" | "compact";
4
+ interface SizeClasses {
5
+ /** The variant these classes belong to — handy for conditionals. */
6
+ variant: SizeVariant;
7
+ /** Bounded control height — buttons, inputs, select triggers, subtle tabs —
8
+ * AND list/menu rows (select options, dropdown, checkbox and radio rows).
9
+ * One token by design: a popup row lines up with the trigger that opened
10
+ * it because they share this height. */
11
+ control: string;
12
+ /** `control` as a number, for consumers that need raw pixels. */
13
+ controlHeight: number;
14
+ /** Tab trigger height inside a padded segmented list. Sized so
15
+ * `segmentPad` + `segmentItem` adds back up to the control height —
16
+ * the segmented control's outer box stays on the same ladder. */
17
+ segmentItem: string;
18
+ /** Padding of the segmented list around its tabs. */
19
+ segmentPad: string;
20
+ /** Body text inside controls. */
21
+ text: string;
22
+ /** Horizontal padding of bounded controls (select trigger, inputs). */
23
+ px: string;
24
+ /** Horizontal padding of list/menu rows, which sit inside a padded popup
25
+ * or group and need less inset than a bounded control. */
26
+ itemPx: string;
27
+ /** Gap between an icon / control glyph and its label, and between
28
+ * neighbouring controls in a row (toolbars, filter bars, button
29
+ * clusters). Density is spacing as much as control height, so the
30
+ * compact step halves it. */
31
+ gap: string;
32
+ /** Glyph size in px: leading/trailing icons inside controls, and the
33
+ * checkbox square / radio circle. */
34
+ icon: number;
35
+ }
36
+ import { ClassProp as ClassProp_wz9o0r } from "class-variance-authority/types";
37
+ /**
38
+ * The ringed box of a text field. It steps from rest to a muted fill when lit
39
+ * (hovered, or `data-active` from a group's fluid hover) to the card fill
40
+ * when focused. `data-invalid` keeps a destructive ring in every state and
41
+ * tints the lit fill; `data-disabled` frames and dims it; `data-readonly`
42
+ * shows the ring when lit or focused but never lifts the fill. Put it on the
43
+ * element around the control and stamp the data attributes; Base UI parts
44
+ * stamp `data-invalid` / `data-disabled` themselves.
45
+ */
46
+ declare const fieldVariants: (props?: ({
47
+ variant?: "borderless" | "bordered" | null | undefined;
48
+ } & ClassProp_wz9o0r) | undefined) => string;
49
+ /** A leading icon inside a `fieldVariants` box: muted at rest, it darkens and thickens with the field. Pass `strokeWidth={1.5}`. */
50
+ declare const fieldIconClasses = "shrink-0 text-muted-foreground transition-[color,stroke-width] duration-fast group-hover/field:text-foreground group-hover/field:stroke-[2] group-data-[active]/field:text-foreground group-data-[active]/field:stroke-[2] group-focus-within/field:text-foreground group-focus-within/field:stroke-[2]";
51
+ /**
52
+ * Content beside a field's text (an adornment): muted, held to the ladder's
53
+ * glyph size, and lit with the field like a leading icon. Strings read as a
54
+ * prefix or a unit.
55
+ */
56
+ declare const fieldAdornmentClasses = "flex shrink-0 items-center whitespace-nowrap text-muted-foreground transition-[color] duration-fast group-hover/field:text-foreground group-data-[active]/field:text-foreground group-focus-within/field:text-foreground";
57
+ /** Glyph size for an adornment's icons, per ladder step (16px default, 14px compact). */
58
+ declare const FIELD_ADORNMENT_ICON: Record<SizeVariant, string>;
59
+ /**
60
+ * A small icon button inside a field box (a password reveal, a clear, a
61
+ * stepper): 4px inside the ring on every side (28px in a 36px field, 20px in
62
+ * a 28px one), its negative margin taking back the box's inset so the gap to
63
+ * the edge matches the gap above and below.
64
+ */
65
+ declare const FIELD_ACTION: Record<SizeVariant, string>;
66
+ /** A field action's box alone, without `FIELD_ACTION`'s margins, for actions set side by side (a stepper pair). */
67
+ declare const FIELD_ACTION_BOX: Record<SizeVariant, string>;
68
+ /** The margin that pulls the last of several side-by-side actions to 4px inside the ring. */
69
+ declare const FIELD_ACTION_END: Record<SizeVariant, string>;
70
+ /** A field action's corners, concentric with the box's (8px box, 4px gap) or round in pill mode. */
71
+ declare const FIELD_ACTION_RADIUS: Record<ShapeVariant, string>;
72
+ /** The classes every field action shares, beside its `FIELD_ACTION` size and radius. */
73
+ declare const fieldActionClasses = "relative inline-flex shrink-0 cursor-pointer items-center justify-center text-muted-foreground outline-none transition-[color,background-color,opacity] duration-fast hover:bg-hover hover:text-foreground active:bg-active focus-visible:ring-1 focus-visible:ring-focus-ring disabled:pointer-events-none disabled:opacity-50 data-[disabled]:pointer-events-none data-[disabled]:opacity-50";
74
+ /** Horizontal inset of a field box. */
75
+ declare const FIELD_PX: Record<SizeVariant, string>;
76
+ /** Left inset of the text around a field (label, description, error), so it lines up with the text inside the box. */
77
+ declare const FIELD_TEXT_INSET: Record<SizeVariant, string>;
78
+ /** Framed at rest (`bordered`), or invisible until hovered or focused (`borderless`). */
79
+ type FieldVariant = "bordered" | "borderless";
80
+ import { Context as Context_rri5bl2 } from "react";
81
+ /**
82
+ * What every text field's box takes. Items re-declare these members in their
83
+ * own props interface (the docs read only same-file members), with this prose.
84
+ */
85
+ interface FieldBoxOptions {
86
+ /** Framed at rest, or invisible until hovered or focused. */
87
+ variant: FieldVariant;
88
+ /** Turns the field destructive. */
89
+ invalid?: boolean;
90
+ /** Frames and dims the field. */
91
+ disabled?: boolean;
92
+ /** Lit from outside, e.g. a group's fluid hover. */
93
+ active?: boolean;
94
+ /** Shows the value without letting it change: the ring answers, the fill never lifts. */
95
+ readOnly?: boolean;
96
+ /** Marks the control required (`required` on the control). */
97
+ required?: boolean;
98
+ /** Pins the field to one step of the size ladder. Defaults to the surrounding SizeProvider. */
99
+ size?: SizeVariant;
100
+ }
101
+ /** What a field wrapper hands to the control it holds. */
102
+ interface FieldState {
103
+ /** Lit by a group's fluid hover. */
104
+ active: boolean;
105
+ invalid: boolean;
106
+ disabled: boolean;
107
+ readOnly?: boolean;
108
+ required?: boolean;
109
+ }
110
+ /**
111
+ * State a field wrapper (Field, InputGroup.Field) hands to whatever control
112
+ * it holds: lit by the group's fluid hover, its error, its disabled,
113
+ * read-only and required state. `useFieldBox` reads it, so any field built on
114
+ * the box joins in; the control's own props win.
115
+ */
116
+ declare const FieldStateContext: Context_rri5bl2<FieldState | null>;
117
+ /** The surrounding field's state, or `null` outside one. */
118
+ declare function useFieldState(): FieldState | null;
119
+ /**
120
+ * The box around a text field's control: the field ladder in the chosen
121
+ * variant, the state attributes it reads, the shape's input radius and the
122
+ * horizontal inset. Spread `props` on the element around the control (or the
123
+ * control itself, for a button field); the height stays with the item, from
124
+ * the returned `size`. Inside a Field or InputGroup.Field, unset `active` / `invalid` /
125
+ * `disabled` / `readOnly` / `required` come from the field (`FieldStateContext`).
126
+ */
127
+ declare function useFieldBox({ variant, invalid, disabled, active, readOnly, required, size }: FieldBoxOptions): {
128
+ size: SizeClasses;
129
+ /** Resolved with the field's state, for the control's `aria-invalid` / `disabled` / `readOnly` / `required`. */
130
+ invalid: boolean;
131
+ disabled: boolean;
132
+ readOnly: boolean;
133
+ required: boolean | undefined;
134
+ props: {
135
+ "data-active": true | undefined;
136
+ "data-invalid": true | undefined;
137
+ "data-disabled": true | undefined;
138
+ "data-readonly": true | undefined;
139
+ className: string;
140
+ };
141
+ };
142
+ /** A press anywhere in the box (icon, padding) focuses the control, without disturbing the control's own caret placement. */
143
+ declare function focusControlOnPress(control: RefObject<HTMLElement | null>): (e: MouseEvent) => void;
144
+ export { FIELD_ACTION, FIELD_ACTION_BOX, FIELD_ACTION_END, FIELD_ACTION_RADIUS, FIELD_ADORNMENT_ICON, FIELD_PX, FIELD_TEXT_INSET, FieldBoxOptions, FieldState, FieldStateContext, FieldVariant, fieldActionClasses, fieldAdornmentClasses, fieldIconClasses, fieldVariants, focusControlOnPress, useFieldBox, useFieldState };
@@ -0,0 +1,40 @@
1
+ import {
2
+ FieldStateContext2,
3
+ useFieldState2,
4
+ useFieldBox2,
5
+ focusControlOnPress2
6
+ } from "../shared/components-6zng858q.js";
7
+ import {
8
+ fieldVariants2,
9
+ fieldIconClasses2,
10
+ fieldAdornmentClasses2,
11
+ FIELD_ADORNMENT_ICON2,
12
+ FIELD_ACTION2,
13
+ FIELD_ACTION_BOX2,
14
+ FIELD_ACTION_END2,
15
+ FIELD_ACTION_RADIUS2,
16
+ fieldActionClasses2,
17
+ FIELD_PX2,
18
+ FIELD_TEXT_INSET2
19
+ } from "../shared/components-124epb7f.js";
20
+ import"../shared/components-h83az0bz.js";
21
+ import"../shared/components-34txk9rj.js";
22
+ import"../shared/components-78x40gee.js";
23
+ import"../shared/components-jcnjay5g.js";
24
+ export {
25
+ FIELD_ACTION2 as FIELD_ACTION,
26
+ FIELD_ACTION_BOX2 as FIELD_ACTION_BOX,
27
+ FIELD_ACTION_END2 as FIELD_ACTION_END,
28
+ FIELD_ACTION_RADIUS2 as FIELD_ACTION_RADIUS,
29
+ FIELD_ADORNMENT_ICON2 as FIELD_ADORNMENT_ICON,
30
+ FIELD_PX2 as FIELD_PX,
31
+ FIELD_TEXT_INSET2 as FIELD_TEXT_INSET,
32
+ FieldStateContext2 as FieldStateContext,
33
+ fieldActionClasses2 as fieldActionClasses,
34
+ fieldAdornmentClasses2 as fieldAdornmentClasses,
35
+ fieldIconClasses2 as fieldIconClasses,
36
+ fieldVariants2 as fieldVariants,
37
+ focusControlOnPress2 as focusControlOnPress,
38
+ useFieldBox2 as useFieldBox,
39
+ useFieldState2 as useFieldState
40
+ };
@@ -0,0 +1,47 @@
1
+ type ShapeVariant = "pill" | "rounded";
2
+ type SizeVariant = "default" | "compact";
3
+ import { ClassProp as ClassProp_wz9o0r } from "class-variance-authority/types";
4
+ /**
5
+ * The ringed box of a text field. It steps from rest to a muted fill when lit
6
+ * (hovered, or `data-active` from a group's fluid hover) to the card fill
7
+ * when focused. `data-invalid` keeps a destructive ring in every state and
8
+ * tints the lit fill; `data-disabled` frames and dims it; `data-readonly`
9
+ * shows the ring when lit or focused but never lifts the fill. Put it on the
10
+ * element around the control and stamp the data attributes; Base UI parts
11
+ * stamp `data-invalid` / `data-disabled` themselves.
12
+ */
13
+ declare const fieldVariants: (props?: ({
14
+ variant?: "borderless" | "bordered" | null | undefined;
15
+ } & ClassProp_wz9o0r) | undefined) => string;
16
+ /** A leading icon inside a `fieldVariants` box: muted at rest, it darkens and thickens with the field. Pass `strokeWidth={1.5}`. */
17
+ declare const fieldIconClasses = "shrink-0 text-muted-foreground transition-[color,stroke-width] duration-fast group-hover/field:text-foreground group-hover/field:stroke-[2] group-data-[active]/field:text-foreground group-data-[active]/field:stroke-[2] group-focus-within/field:text-foreground group-focus-within/field:stroke-[2]";
18
+ /**
19
+ * Content beside a field's text (an adornment): muted, held to the ladder's
20
+ * glyph size, and lit with the field like a leading icon. Strings read as a
21
+ * prefix or a unit.
22
+ */
23
+ declare const fieldAdornmentClasses = "flex shrink-0 items-center whitespace-nowrap text-muted-foreground transition-[color] duration-fast group-hover/field:text-foreground group-data-[active]/field:text-foreground group-focus-within/field:text-foreground";
24
+ /** Glyph size for an adornment's icons, per ladder step (16px default, 14px compact). */
25
+ declare const FIELD_ADORNMENT_ICON: Record<SizeVariant, string>;
26
+ /**
27
+ * A small icon button inside a field box (a password reveal, a clear, a
28
+ * stepper): 4px inside the ring on every side (28px in a 36px field, 20px in
29
+ * a 28px one), its negative margin taking back the box's inset so the gap to
30
+ * the edge matches the gap above and below.
31
+ */
32
+ declare const FIELD_ACTION: Record<SizeVariant, string>;
33
+ /** A field action's box alone, without `FIELD_ACTION`'s margins, for actions set side by side (a stepper pair). */
34
+ declare const FIELD_ACTION_BOX: Record<SizeVariant, string>;
35
+ /** The margin that pulls the last of several side-by-side actions to 4px inside the ring. */
36
+ declare const FIELD_ACTION_END: Record<SizeVariant, string>;
37
+ /** A field action's corners, concentric with the box's (8px box, 4px gap) or round in pill mode. */
38
+ declare const FIELD_ACTION_RADIUS: Record<ShapeVariant, string>;
39
+ /** The classes every field action shares, beside its `FIELD_ACTION` size and radius. */
40
+ declare const fieldActionClasses = "relative inline-flex shrink-0 cursor-pointer items-center justify-center text-muted-foreground outline-none transition-[color,background-color,opacity] duration-fast hover:bg-hover hover:text-foreground active:bg-active focus-visible:ring-1 focus-visible:ring-focus-ring disabled:pointer-events-none disabled:opacity-50 data-[disabled]:pointer-events-none data-[disabled]:opacity-50";
41
+ /** Horizontal inset of a field box. */
42
+ declare const FIELD_PX: Record<SizeVariant, string>;
43
+ /** Left inset of the text around a field (label, description, error), so it lines up with the text inside the box. */
44
+ declare const FIELD_TEXT_INSET: Record<SizeVariant, string>;
45
+ /** Framed at rest (`bordered`), or invisible until hovered or focused (`borderless`). */
46
+ type FieldVariant = "bordered" | "borderless";
47
+ export { FIELD_ACTION, FIELD_ACTION_BOX, FIELD_ACTION_END, FIELD_ACTION_RADIUS, FIELD_ADORNMENT_ICON, FIELD_PX, FIELD_TEXT_INSET, FieldVariant, fieldActionClasses, fieldAdornmentClasses, fieldIconClasses, fieldVariants };
@@ -0,0 +1,26 @@
1
+ import {
2
+ fieldVariants2,
3
+ fieldIconClasses2,
4
+ fieldAdornmentClasses2,
5
+ FIELD_ADORNMENT_ICON2,
6
+ FIELD_ACTION2,
7
+ FIELD_ACTION_BOX2,
8
+ FIELD_ACTION_END2,
9
+ FIELD_ACTION_RADIUS2,
10
+ fieldActionClasses2,
11
+ FIELD_PX2,
12
+ FIELD_TEXT_INSET2
13
+ } from "../shared/components-124epb7f.js";
14
+ export {
15
+ FIELD_ACTION2 as FIELD_ACTION,
16
+ FIELD_ACTION_BOX2 as FIELD_ACTION_BOX,
17
+ FIELD_ACTION_END2 as FIELD_ACTION_END,
18
+ FIELD_ACTION_RADIUS2 as FIELD_ACTION_RADIUS,
19
+ FIELD_ADORNMENT_ICON2 as FIELD_ADORNMENT_ICON,
20
+ FIELD_PX2 as FIELD_PX,
21
+ FIELD_TEXT_INSET2 as FIELD_TEXT_INSET,
22
+ fieldActionClasses2 as fieldActionClasses,
23
+ fieldAdornmentClasses2 as fieldAdornmentClasses,
24
+ fieldIconClasses2 as fieldIconClasses,
25
+ fieldVariants2 as fieldVariants
26
+ };
@@ -0,0 +1,112 @@
1
+ import { Transition } from "motion/react";
2
+ import { Dispatch, MutableRefObject, SetStateAction } from "react";
3
+ interface ItemRect {
4
+ top: number;
5
+ height: number;
6
+ left: number;
7
+ width: number;
8
+ }
9
+ interface UseFluidHoverReturn {
10
+ activeIndex: number | null;
11
+ setActiveIndex: Dispatch<SetStateAction<number | null>>;
12
+ itemRects: ItemRect[];
13
+ /**
14
+ * True once every registered item has been measured and no remeasure is
15
+ * pending, i.e. `itemRects` describes the current item set. Gate absolutely
16
+ * positioned overlays on it: an overlay that mounts against a rect a later
17
+ * pass still corrects animates from the wrong place to the right one, which
18
+ * reads as the highlight sliding in from another row.
19
+ */
20
+ isMeasured: boolean;
21
+ sessionRef: MutableRefObject<number>;
22
+ handlers: {
23
+ onMouseMove: (e: React.MouseEvent) => void;
24
+ onMouseEnter: () => void;
25
+ onMouseLeave: () => void;
26
+ /**
27
+ * Routes a click that lands between items (a gap, the padding, past the
28
+ * last row) to the highlighted item, so the highlight and the click agree:
29
+ * what is lit is what a click hits. A click inside an item is left to the
30
+ * item. Disabled items (`isItemDisabled`) are never activated.
31
+ */
32
+ onClick: (e: React.MouseEvent) => void;
33
+ };
34
+ registerItem: (index: number, element: HTMLElement | null) => void;
35
+ /**
36
+ * Invalidates the published rects and runs the hook's coalesced measurement
37
+ * pass again, holding `isMeasured` false until it settles. Reach for it when
38
+ * the rects may be wrong and showing an overlay against them would misplace
39
+ * it: a popup that stays mounted between opens keeps its items registered,
40
+ * so nothing else would notice that its rects were taken while it was
41
+ * hidden. Registration, item resize, and container resize already trigger
42
+ * a pass; do not call this on `children` changes.
43
+ */
44
+ remeasure: () => void;
45
+ /**
46
+ * Re-reads the rects synchronously, keeping `isMeasured` as it is. Only for
47
+ * layout that moves the rows under a visible overlay frame by frame (the
48
+ * accordion re-measures inside its height animation). Everything else
49
+ * wants `remeasure`, or nothing.
50
+ */
51
+ measureItems: () => void;
52
+ }
53
+ import { JSX as JSX_1kxb } from "react";
54
+ /** What the highlight reads off the hook: the highlighted index, the
55
+ * measured rects, whether they are current, and the pointer session. */
56
+ type FluidHoverSource = Pick<UseFluidHoverReturn, "activeIndex" | "itemRects" | "isMeasured" | "sessionRef">;
57
+ interface HighlightFromHook {
58
+ /** The hook's return value. The highlight sits on
59
+ * `itemRects[activeIndex]` once `isMeasured`, and re-keys on the session. */
60
+ hover: FluidHoverSource;
61
+ /** Keep the list's state but show nothing (a closed popup, hover switched
62
+ * off). Runs the exit fade. */
63
+ hidden?: boolean;
64
+ rect?: never;
65
+ session?: never;
66
+ }
67
+ interface HighlightFromRect {
68
+ /** For lists that resolve their own rect (the sidebar's unified scope):
69
+ * the rect to sit on, in the container's coordinate space. `null` hides
70
+ * the highlight (it fades out on `spring.fast.exit`). */
71
+ rect: ItemRect | null;
72
+ /** `sessionRef.current` from `useFluidHover`. It increments when the
73
+ * cursor enters the container, which re-keys the highlight so it fades in
74
+ * at `from ?? rect` instead of sliding over from wherever it was last. */
75
+ session: number;
76
+ hover?: never;
77
+ hidden?: never;
78
+ }
79
+ type FluidHoverHighlightProps = (HighlightFromHook | HighlightFromRect) & {
80
+ /** Where a fresh session fades in from. A dropdown passes its checked row,
81
+ * a nav menu its active route. Defaults to the rect itself. */
82
+ from?: ItemRect | null;
83
+ /** Radius, z-index, anything else. Merged onto
84
+ * `absolute bg-hover pointer-events-none`. */
85
+ className?: string;
86
+ /** The positional spring. Defaults to `spring.fast`. Pass `false` to snap
87
+ * to the new rect with no travel (a layout reflow that moved the rows
88
+ * underneath, not a hover change). The opacity fade is always 0.08s. */
89
+ transition?: Transition | false;
90
+ };
91
+ /** A measured rect as animation targets: position as a transform, size as
92
+ * layout. Exported for the unit test. */
93
+ declare function toTarget(rect: ItemRect): {
94
+ x: number;
95
+ y: number;
96
+ width: number;
97
+ height: number;
98
+ };
99
+ /**
100
+ * Resolves the positional transition. Reduced motion keeps the opacity fade
101
+ * and drops the travel, per the motion guidelines: fewer and gentler, not
102
+ * none. Exported for the unit test.
103
+ */
104
+ declare function resolveHighlightTransition(transition: Transition | false | undefined, reduceMotion: boolean): Transition;
105
+ /** The rect and session a set of props resolves to. Exported for the test. */
106
+ declare function resolveHighlightSource(props: FluidHoverHighlightProps): {
107
+ rect: ItemRect | null;
108
+ session: number;
109
+ };
110
+ type Element_12xgc = JSX_1kxb["Element"];
111
+ declare function FluidHoverHighlight(props: FluidHoverHighlightProps): Element_12xgc;
112
+ export { FluidHoverHighlight, FluidHoverHighlightProps, FluidHoverSource, resolveHighlightSource, resolveHighlightTransition, toTarget };
@@ -0,0 +1,17 @@
1
+ import {
2
+ toTarget2,
3
+ resolveHighlightTransition2,
4
+ resolveHighlightSource2,
5
+ FluidHoverHighlight2
6
+ } from "../shared/components-qdm3yh26.js";
7
+ import"../shared/components-pw06rbxq.js";
8
+ import"../shared/components-awra5sff.js";
9
+ import"../shared/components-de99ykt7.js";
10
+ import"../shared/components-3ey0hzpb.js";
11
+ import"../shared/components-jcnjay5g.js";
12
+ export {
13
+ FluidHoverHighlight2 as FluidHoverHighlight,
14
+ resolveHighlightSource2 as resolveHighlightSource,
15
+ resolveHighlightTransition2 as resolveHighlightTransition,
16
+ toTarget2 as toTarget
17
+ };
@@ -0,0 +1,18 @@
1
+ type ShapeVariant = "pill" | "rounded";
2
+ interface ItemRect {
3
+ top: number;
4
+ height: number;
5
+ left: number;
6
+ width: number;
7
+ }
8
+ import { JSX as JSX_1kxb2 } from "react";
9
+ interface FocusRingProps {
10
+ /** The focused row's rect in the panel's coordinates; nothing while none has keyboard focus. */
11
+ rect: ItemRect | null | undefined;
12
+ /** Pins the radius to one shape (popups stay `rounded`); defaults to the surrounding ShapeProvider. */
13
+ shape?: ShapeVariant;
14
+ }
15
+ type Element_12xgc2 = JSX_1kxb2["Element"];
16
+ /** The keyboard ring: 2px outside the focused row, springing between rows. */
17
+ declare function FocusRing({ rect, shape }: FocusRingProps): Element_12xgc2;
18
+ export { FocusRing, FocusRingProps };
@@ -0,0 +1,10 @@
1
+ import {
2
+ FocusRing2
3
+ } from "../shared/components-8nwsqjn8.js";
4
+ import"../shared/components-de99ykt7.js";
5
+ import"../shared/components-3ey0hzpb.js";
6
+ import"../shared/components-78x40gee.js";
7
+ import"../shared/components-jcnjay5g.js";
8
+ export {
9
+ FocusRing2 as FocusRing
10
+ };
@@ -0,0 +1,46 @@
1
+ import { Transition } from "motion/react";
2
+ import { ReactNode } from "react";
3
+ interface ItemRect {
4
+ top: number;
5
+ height: number;
6
+ left: number;
7
+ width: number;
8
+ }
9
+ import { JSX as JSX_1kxb } from "react";
10
+ declare function union(a: ItemRect | null, b: ItemRect): ItemRect;
11
+ interface GooLayerProps {
12
+ /** Filter on: the shapes melt into one. Off at rest. */
13
+ active: boolean;
14
+ /** Blur in px: the shapes' radius times `GOO_BLUR_RATIO`. */
15
+ blur: number;
16
+ /** The layer's box in the container's coordinates, covering every shape; padded for the blur here. */
17
+ box: ItemRect | null;
18
+ /** The shapes' classes (a bg token, a radius): the melted result is filled with their background. */
19
+ fill: string;
20
+ /** The shapes, positioned in the container's coordinates. */
21
+ children?: ReactNode;
22
+ }
23
+ type Element_12xgc = JSX_1kxb["Element"];
24
+ /** A box of shapes that melt into one while `active`. The filter's region follows the box, so keep it tight. */
25
+ declare function GooLayer({ active, blur, box, fill, children }: GooLayerProps): Element_12xgc;
26
+ interface GooIndicatorProps {
27
+ /** The rect to sit on, in the container's coordinates (as `useFluidHover` measures them). */
28
+ rect: ItemRect;
29
+ /** Where it first appears; it then travels to `rect`. Defaults to `rect`. */
30
+ from?: ItemRect | null;
31
+ /** Fill and radius classes: a bg token and the shape's radius. */
32
+ className?: string;
33
+ /** Shadow class. While it melts, the shapes are drawn again beneath the goo with it, since the filter flattens shadows. */
34
+ shadow?: string;
35
+ /** The travel: a spring tier. `false` snaps (a reflow, reduced motion). Defaults to `spring.moderate`. */
36
+ transition?: Transition | false;
37
+ /** Opacity of the whole indicator, faded on `spring.fast`. Defaults to `1`. */
38
+ opacity?: number;
39
+ }
40
+ /**
41
+ * An indicator that travels between items with a liquid neck. Render it in the
42
+ * items' `relative` container, beneath them: the items' text stays above it,
43
+ * unfiltered.
44
+ */
45
+ declare function GooIndicator({ rect, from, className, shadow, transition, opacity }: GooIndicatorProps): Element_12xgc;
46
+ export { GooIndicator, GooIndicatorProps, GooLayer, GooLayerProps, union };
@@ -0,0 +1,14 @@
1
+ import {
2
+ union2,
3
+ GooLayer2,
4
+ GooIndicator2
5
+ } from "../shared/components-pw06rbxq.js";
6
+ import"../shared/components-awra5sff.js";
7
+ import"../shared/components-de99ykt7.js";
8
+ import"../shared/components-3ey0hzpb.js";
9
+ import"../shared/components-jcnjay5g.js";
10
+ export {
11
+ GooIndicator2 as GooIndicator,
12
+ GooLayer2 as GooLayer,
13
+ union2 as union
14
+ };
@@ -0,0 +1,30 @@
1
+ import { ComponentType, ReactNode } from "react";
2
+ import { JSX as JSX_1kxb } from "react";
3
+ interface IconComponentProps {
4
+ size?: number | string;
5
+ strokeWidth?: number | string;
6
+ className?: string;
7
+ }
8
+ type IconComponent = ComponentType<IconComponentProps>;
9
+ type IconName = "chevron-right" | "chevron-down" | "x" | "copy" | "menu" | "dot" | "monitor" | "sun" | "moon" | "rectangle-horizontal" | "circle" | "square-library" | "clock" | "star" | "settings" | "plus" | "arrow-left" | "arrow-right" | "arrow-up" | "arrow-down" | "search" | "loader" | "users" | "lock" | "mail" | "bell" | "shield" | "palette" | "lightbulb" | "rocket" | "heart" | "paintbrush" | "brain" | "globe" | "user" | "image" | "link" | "check" | "rotate-ccw" | "play" | "pause" | "pipette" | "home" | "message-circle" | "inbox" | "pencil" | "scaling" | "skip-forward" | "corner-down-right" | "corner-down-left" | "panel-left" | "panel-left-dashed" | "panel-right" | "panel-right-dashed" | "chevrons-up-down" | "more-horizontal" | "more-vertical" | "calendar" | "folder" | "sliders-horizontal" | "chevron-left" | "chevron-up" | "chevrons-left" | "chevrons-right" | "arrow-up-down" | "circle-alert" | "triangle-alert" | "circle-check" | "info" | "circle-question-mark" | "trash" | "eye" | "eye-off" | "timer" | "arrow-right-from-line" | "arrow-right-to-line" | "funnel-x" | "flag" | "loader-circle" | "minus" | "upload" | "file";
10
+ declare const defaultIcons: Record<IconName, IconComponent>;
11
+ /**
12
+ * Returns a single icon component for the given name.
13
+ * Falls back to the default (Lucide) set if no provider is present.
14
+ */
15
+ declare function useIcon(name: IconName): IconComponent;
16
+ /**
17
+ * Returns the full icon map.
18
+ * Falls back to the default (Lucide) set if no provider is present.
19
+ */
20
+ declare function useIcons(): Record<IconName, IconComponent>;
21
+ type Element_12xgc = JSX_1kxb["Element"];
22
+ /**
23
+ * Swap some or all icons for components from another library.
24
+ * Names left out of `icons` keep their default (Lucide) component.
25
+ */
26
+ declare function IconProvider({ children, icons }: {
27
+ children: ReactNode;
28
+ icons?: Partial<Record<IconName, IconComponent>>;
29
+ }): Element_12xgc;
30
+ export { IconComponent, IconComponentProps, IconName, IconProvider, defaultIcons, useIcon, useIcons };
@@ -0,0 +1,12 @@
1
+ import {
2
+ defaultIcons2,
3
+ useIcon2,
4
+ useIcons2,
5
+ IconProvider2
6
+ } from "../shared/components-jqpefjsn.js";
7
+ export {
8
+ IconProvider2 as IconProvider,
9
+ defaultIcons2 as defaultIcons,
10
+ useIcon2 as useIcon,
11
+ useIcons2 as useIcons
12
+ };
@@ -0,0 +1,9 @@
1
+ /** Spread onto an element to make it inert while `on`. */
2
+ declare function inertProps(on: boolean): {
3
+ inert: boolean;
4
+ } | {
5
+ inert?: undefined;
6
+ };
7
+ /** A ref callback that makes its element inert for good. */
8
+ declare function markInert(el: HTMLElement | null): void;
9
+ export { inertProps, markInert };
@@ -0,0 +1,8 @@
1
+ import {
2
+ inertProps2,
3
+ markInert2
4
+ } from "../shared/components-z3v0n0de.js";
5
+ export {
6
+ inertProps2 as inertProps,
7
+ markInert2 as markInert
8
+ };
@@ -0,0 +1,93 @@
1
+ import { ReactNode, Ref } from "react";
2
+ import { RefObject } from "react";
3
+ import { MutableRefObject as MutableRefObject_8z5kms } from "react";
4
+ import { MotionValue as MotionValue_d5wxmj } from "motion/react";
5
+ type MorphSide = "top" | "right" | "bottom" | "left";
6
+ type MorphFrom = "trigger" | "pointer" | "center" | MorphSide | RefObject<HTMLElement | null>;
7
+ type MorphEffect = "goo" | "morph" | "slide" | "fade";
8
+ type MorphTier = "moderate" | "slow";
9
+ interface MorphOptions {
10
+ /** Where the surface grows from. */
11
+ from?: MorphFrom;
12
+ /** How it gets there. */
13
+ effect?: MorphEffect;
14
+ /** Hide the source while open, so it reads as becoming the overlay. */
15
+ hideSource?: boolean;
16
+ /** Spring tier. */
17
+ tier?: MorphTier;
18
+ /** Overrides `effect` (and `from`) for the close only, read as it starts: a swiped sheet slides on off its edge. */
19
+ exit?: {
20
+ effect: "slide" | "fade";
21
+ from?: MorphFrom;
22
+ };
23
+ /**
24
+ * Shows or hides at once while this returns true for the popup (Base UI's
25
+ * `data-instant` hand-off between grouped tooltips). Checked as a run
26
+ * starts and on every frame.
27
+ */
28
+ instant?: (popup: HTMLElement) => boolean;
29
+ /** Puts focus back on the trigger once a closed popup that held it has gone (see `returnFocus`). Off when the owner places focus itself (Base UI's `finalFocus`). Defaults to `true`. */
30
+ returnFocus?: boolean;
31
+ }
32
+ /** What opened the overlay: the pressed trigger and the press point. */
33
+ interface MorphOrigin {
34
+ trigger?: HTMLElement;
35
+ point?: {
36
+ x: number;
37
+ y: number;
38
+ };
39
+ }
40
+ /**
41
+ * Drives one overlay's morph. `open` is the overlay's open state, `origin` what
42
+ * opened it (`useMorphOrigin`). Spread the returned refs through
43
+ * `MorphSurface`; `popupRef` goes on the Base UI popup, which keeps its final
44
+ * size the whole time, so positioning and collision flipping never see the
45
+ * animation. `onExited` runs once a close has finished.
46
+ */
47
+ declare function useMorph(open: boolean, origin: RefObject<MorphOrigin>, { from, effect, hideSource, tier, exit, instant, returnFocus: refocus }?: MorphOptions, onExited?: () => void): {
48
+ refs: {
49
+ popup: MutableRefObject_8z5kms<HTMLDivElement | null>;
50
+ shapes: RefObject<HTMLDivElement>;
51
+ blur: RefObject<SVGFEGaussianBlurElement>;
52
+ outline: RefObject<SVGFEFloodElement>;
53
+ copy: RefObject<HTMLDivElement>;
54
+ shape: RefObject<HTMLDivElement>;
55
+ bg: RefObject<HTMLDivElement>;
56
+ shadow: RefObject<HTMLDivElement>;
57
+ content: RefObject<HTMLDivElement>;
58
+ };
59
+ popupRef: (node: HTMLDivElement | null) => void;
60
+ popup: HTMLDivElement | null;
61
+ gooId: string;
62
+ effect: MorphEffect;
63
+ progress: MotionValue_d5wxmj<number>;
64
+ };
65
+ type Morph = ReturnType<typeof useMorph>;
66
+ import { JSX as JSX_1kxb } from "react";
67
+ interface MorphSurfaceProps {
68
+ /** The engine, from `useMorph`. */
69
+ morph: Morph;
70
+ /** Background class of the surface: `SURFACE_BG[level]`, or `bg-foreground` for an inverted tooltip. */
71
+ bg?: string;
72
+ /** Shadow class (`SURFACE_SHADOW[level]`); leave out for a flat surface. */
73
+ shadow?: string;
74
+ /** Radius class the surface rests at (the shape context's `container`, `bg`, …). */
75
+ radius: string;
76
+ /** Classes for the content wrapper: padding, width. */
77
+ className?: string;
78
+ /** The overlay's content. */
79
+ children?: ReactNode;
80
+ }
81
+ interface GooFilterProps {
82
+ id: string;
83
+ /** Blur radius; leave out when `blurRef` sets it per morph. */
84
+ blur?: number;
85
+ blurRef?: Ref<SVGFEGaussianBlurElement>;
86
+ /** Outlines the melted shape with the surface shadow's 1px ring (`--shadow-color`), so a surface the color of the page still shows its neck; the ref's `flood-opacity` fades it. */
87
+ outlineRef?: Ref<SVGFEFloodElement>;
88
+ }
89
+ type Element_12xgc = JSX_1kxb["Element"];
90
+ /** The goo filter: blur, threshold the alpha back into solid shapes, then lay the crisp original on top. */
91
+ declare function GooFilter({ id, blur, blurRef, outlineRef }: GooFilterProps): Element_12xgc;
92
+ declare function MorphSurface({ morph, bg, shadow, radius, className, children }: MorphSurfaceProps): Element_12xgc;
93
+ export { GooFilter, MorphSurface };
@@ -0,0 +1,13 @@
1
+ import {
2
+ GooFilter2,
3
+ MorphSurface2
4
+ } from "../shared/components-4y816hwp.js";
5
+ import"../shared/components-b1e239g3.js";
6
+ import"../shared/components-awra5sff.js";
7
+ import"../shared/components-de99ykt7.js";
8
+ import"../shared/components-3ey0hzpb.js";
9
+ import"../shared/components-jcnjay5g.js";
10
+ export {
11
+ GooFilter2 as GooFilter,
12
+ MorphSurface2 as MorphSurface
13
+ };