@justanarthur/modo-ui 0.6.0-canary.8 → 0.6.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 (490) hide show
  1. package/README.md +66 -164
  2. package/dist/base.css +4 -141
  3. package/dist/blocks/sidebar-app/index.js +26 -40
  4. package/dist/components/AI/input-message/index.js +16 -23
  5. package/dist/components/AI/thinking-indicator/index.js +6 -9
  6. package/dist/components/accordion/index.d.ts +11 -39
  7. package/dist/components/accordion/index.js +13 -18
  8. package/dist/components/badge/index.d.ts +11 -18
  9. package/dist/components/badge/index.js +7 -12
  10. package/dist/components/button/index.d.ts +17 -53
  11. package/dist/components/button/index.js +6 -11
  12. package/dist/components/card/index.d.ts +9 -32
  13. package/dist/components/card/index.js +11 -17
  14. package/dist/components/copy/index.d.ts +8 -41
  15. package/dist/components/copy/index.js +9 -15
  16. package/dist/components/inputs/checkbox/index.d.ts +9 -28
  17. package/dist/components/inputs/checkbox/index.js +13 -18
  18. package/dist/components/inputs/color-picker/index.d.ts +14 -22
  19. package/dist/components/inputs/color-picker/index.js +18 -26
  20. package/dist/components/inputs/combobox/index.d.ts +20 -85
  21. package/dist/components/inputs/combobox/index.js +18 -27
  22. package/dist/components/inputs/date-time/calendar/index.d.ts +18 -24
  23. package/dist/components/inputs/date-time/calendar/index.js +11 -15
  24. package/dist/components/inputs/date-time/date-picker/index.d.ts +16 -105
  25. package/dist/components/inputs/date-time/date-picker/index.js +25 -35
  26. package/dist/components/inputs/date-time/date-range-picker/index.d.ts +12 -106
  27. package/dist/components/inputs/date-time/date-range-picker/index.js +24 -35
  28. package/dist/components/inputs/date-time/duration-picker/index.d.ts +13 -66
  29. package/dist/components/inputs/date-time/duration-picker/index.js +24 -33
  30. package/dist/components/inputs/date-time/month-picker/index.d.ts +10 -60
  31. package/dist/components/inputs/date-time/month-picker/index.js +23 -32
  32. package/dist/components/inputs/date-time/time-picker/index.d.ts +10 -58
  33. package/dist/components/inputs/date-time/time-picker/index.js +24 -33
  34. package/dist/components/inputs/input/index.d.ts +13 -95
  35. package/dist/components/inputs/input/index.js +9 -18
  36. package/dist/components/inputs/radio/index.d.ts +5 -20
  37. package/dist/components/inputs/radio/index.js +12 -16
  38. package/dist/components/inputs/search/index.d.ts +3 -3
  39. package/dist/components/inputs/search/index.js +18 -26
  40. package/dist/components/inputs/select/index.d.ts +23 -99
  41. package/dist/components/inputs/select/index.js +14 -29
  42. package/dist/components/inputs/slider/index.d.ts +0 -9
  43. package/dist/components/inputs/slider/index.js +5 -8
  44. package/dist/components/inputs/switch/index.d.ts +2 -8
  45. package/dist/components/inputs/switch/index.js +12 -15
  46. package/dist/components/inputs/textarea/index.d.ts +1 -20
  47. package/dist/components/inputs/textarea/index.js +6 -9
  48. package/dist/components/navigation/sidebar/index.d.ts +21 -44
  49. package/dist/components/navigation/sidebar/index.js +31 -42
  50. package/dist/components/navigation/tabs/index.d.ts +2 -8
  51. package/dist/components/navigation/tabs/index.js +10 -15
  52. package/dist/components/navigation/tabs-subtle/index.js +10 -13
  53. package/dist/components/overlays/alert-dialog/index.d.ts +16 -135
  54. package/dist/components/overlays/alert-dialog/index.js +13 -23
  55. package/dist/components/overlays/command/index.d.ts +20 -25
  56. package/dist/components/overlays/command/index.js +17 -25
  57. package/dist/components/overlays/context-menu/index.d.ts +17 -39
  58. package/dist/components/overlays/context-menu/index.js +18 -29
  59. package/dist/components/overlays/dialog/index.d.ts +16 -42
  60. package/dist/components/overlays/dialog/index.js +12 -20
  61. package/dist/components/overlays/dropdown/index.d.ts +34 -304
  62. package/dist/components/overlays/dropdown/index.js +17 -44
  63. package/dist/components/overlays/popover/index.d.ts +12 -38
  64. package/dist/components/overlays/popover/index.js +9 -13
  65. package/dist/components/overlays/preview-card/index.js +8 -12
  66. package/dist/components/overlays/sheet/index.d.ts +8 -25
  67. package/dist/components/overlays/sheet/index.js +13 -19
  68. package/dist/components/overlays/toast/index.d.ts +50 -209
  69. package/dist/components/overlays/toast/index.js +10 -23
  70. package/dist/components/overlays/tooltip/index.d.ts +21 -123
  71. package/dist/components/overlays/tooltip/index.js +6 -16
  72. package/dist/components/table/index.d.ts +8 -63
  73. package/dist/components/table/index.js +9 -20
  74. package/dist/index.d.ts +1048 -2999
  75. package/dist/index.js +82 -231
  76. package/dist/preset.d.ts +0 -22
  77. package/dist/preset.js +2 -24
  78. package/dist/primitives/code/index.js +5 -8
  79. package/dist/primitives/craft/index.js +6 -10
  80. package/dist/primitives/fluid-hover/index.js +8 -10
  81. package/dist/primitives/morph/index.js +10 -16
  82. package/dist/primitives/motion/index.js +8 -11
  83. package/dist/primitives/scroll-area/index.js +3 -5
  84. package/dist/primitives/sizes/index.js +4 -6
  85. package/dist/primitives/surface/index.js +4 -6
  86. package/dist/shared/{components-4y816hwp.js → components-0q0sqfh4.js} +49 -27
  87. package/dist/shared/components-0sn7ypjw.js +61 -0
  88. package/dist/shared/{components-vc864c51.js → components-11da9ajg.js} +5 -8
  89. package/dist/shared/components-1434p1mh.js +123 -0
  90. package/dist/shared/{components-t2a3qmy9.js → components-1z6tdadk.js} +24 -40
  91. package/dist/shared/{components-qs4rkqsj.js → components-27nnvrwe.js} +14 -15
  92. package/dist/shared/{components-av5t26rc.js → components-2dxkv6zm.js} +7 -8
  93. package/dist/shared/{components-wqrvqq5p.js → components-2ecg8svx.js} +152 -234
  94. package/dist/shared/{components-3ydr2fqe.js → components-2ph6t61s.js} +34 -37
  95. package/dist/shared/{components-6gk118w3.js → components-39jq9va1.js} +24 -29
  96. package/dist/shared/components-3ky44908.js +9 -0
  97. package/dist/shared/{components-y1qvbawa.js → components-3mkepka5.js} +25 -28
  98. package/dist/shared/{components-xqszvkj4.js → components-4700p9kz.js} +22 -24
  99. package/dist/shared/{components-yhgq0qxx.js → components-59efxjd9.js} +12 -13
  100. package/dist/shared/{components-9j9abkct.js → components-5vgpnxgy.js} +27 -51
  101. package/dist/shared/{components-8tt3xbb5.js → components-5xc2j8jz.js} +18 -19
  102. package/dist/shared/{components-jymmaevv.js → components-6p8tfcd6.js} +29 -57
  103. package/dist/shared/{components-4nck8acq.js → components-7r3etddy.js} +54 -19
  104. package/dist/shared/{components-skfd7kff.js → components-8snj490h.js} +32 -78
  105. package/dist/shared/{components-ctqmge8t.js → components-b0eac83j.js} +30 -9
  106. package/dist/shared/{components-9sttq78t.js → components-b2wyq2cq.js} +59 -41
  107. package/dist/shared/{components-vkwq2k96.js → components-b3c5et5b.js} +38 -49
  108. package/dist/shared/{components-rrbpmfx4.js → components-c6s6b43g.js} +2 -3
  109. package/dist/shared/{components-pw06rbxq.js → components-chacnk61.js} +19 -19
  110. package/dist/shared/{components-71nbt03m.js → components-cv16mryv.js} +7 -26
  111. package/dist/shared/{components-eqze3y30.js → components-d6xtjht3.js} +30 -35
  112. package/dist/shared/{components-5y5shqfd.js → components-dk0gjr5a.js} +18 -19
  113. package/dist/shared/{components-khspp26b.js → components-fzrq6tr3.js} +34 -37
  114. package/dist/shared/{components-km7fhgbk.js → components-gc5vtq2f.js} +30 -66
  115. package/dist/shared/components-gf5s6ap9.js +42 -0
  116. package/dist/shared/{components-qqcmtrbv.js → components-gz8zf3ec.js} +55 -56
  117. package/dist/shared/{components-mattt5jp.js → components-h2ajmhwn.js} +35 -107
  118. package/dist/shared/{components-awra5sff.js → components-hqeq3w9q.js} +16 -24
  119. package/dist/shared/{components-5tzhqbcw.js → components-hw9yk32z.js} +24 -36
  120. package/dist/shared/components-hyq23phv.js +310 -0
  121. package/dist/shared/{components-8mt5bsv6.js → components-jbbmdr74.js} +22 -41
  122. package/dist/shared/{components-dcc02hs2.js → components-jjw69c4c.js} +4 -7
  123. package/dist/shared/{components-2syq4mwc.js → components-jthe1pwb.js} +420 -139
  124. package/dist/shared/{components-r7q1zm7r.js → components-jwst3vtj.js} +76 -224
  125. package/dist/shared/{components-qdm3yh26.js → components-kvr7f9hy.js} +10 -19
  126. package/dist/shared/{components-s8yqk2dc.js → components-kwa6mrf9.js} +11 -46
  127. package/dist/shared/{components-de99ykt7.js → components-men63rwj.js} +2 -3
  128. package/dist/shared/{components-6b0zb8z3.js → components-mjthm1kf.js} +9 -13
  129. package/dist/shared/{components-2c64r8c9.js → components-n42c79bz.js} +22 -23
  130. package/dist/shared/{components-tz1fv35x.js → components-n7mjr357.js} +2 -3
  131. package/dist/shared/components-ng72k97e.js +128 -0
  132. package/dist/shared/{components-dyae0y7h.js → components-pbmqctfa.js} +65 -169
  133. package/dist/shared/{components-px2zm7dc.js → components-q5xj5c16.js} +8 -9
  134. package/dist/shared/components-raknhppb.js +64 -0
  135. package/dist/shared/{components-8rb25gbe.js → components-rr7a6ja9.js} +27 -59
  136. package/dist/shared/{components-5012r6gr.js → components-s083f38z.js} +34 -164
  137. package/dist/shared/components-s5ngg32c.js +267 -0
  138. package/dist/shared/components-sn1rxx1d.js +143 -0
  139. package/dist/shared/{components-r8eqs7gz.js → components-ta7shw28.js} +4 -4
  140. package/dist/shared/{components-9as3rf68.js → components-vc7vq5nz.js} +3 -6
  141. package/dist/shared/{components-ft3zdc79.js → components-vfbhxf5r.js} +5 -6
  142. package/dist/shared/components-vynjtrk6.js +19 -0
  143. package/dist/shared/{components-w0xq6q9k.js → components-w1r67ag9.js} +149 -294
  144. package/dist/shared/{components-z0bqtvcp.js → components-w90endve.js} +72 -71
  145. package/dist/shared/{components-t5pk5nmc.js → components-wvp1m52g.js} +102 -149
  146. package/dist/shared/components-wy9jpqny.js +146 -0
  147. package/dist/shared/{components-5sxjeh6h.js → components-y9y0g8er.js} +28 -52
  148. package/dist/shared/components-ypp01w3p.js +986 -0
  149. package/dist/shared/{components-t50hrswb.js → components-zfnmn5d4.js} +36 -82
  150. package/dist/shared/{components-jqpefjsn.js → components-zrkzcayz.js} +6 -54
  151. package/dist/shared/{components-vf45j12c.js → components-zx6b6yby.js} +18 -4
  152. package/dist/styles.css +32 -320
  153. package/dist/tailwind.css +0 -16
  154. package/dist/tokens.css +0 -67
  155. package/package.json +4 -227
  156. package/DESIGN.md +0 -623
  157. package/blocks/sidebar-app/examples.mdx +0 -33
  158. package/blocks/sidebar-app/index.tsx +0 -218
  159. package/blocks/sidebar-app/inset-topbar.tsx +0 -25
  160. package/blocks/sidebar-app/menu-grid.ts +0 -26
  161. package/blocks/sidebar-app/nav-data.ts +0 -36
  162. package/blocks/sidebar-app/search-field.tsx +0 -48
  163. package/blocks/sidebar-app/user-footer.tsx +0 -67
  164. package/blocks/sidebar-app/workspace-header.tsx +0 -129
  165. package/components/AI/input-message/examples.mdx +0 -130
  166. package/components/AI/input-message/file-thumbnail.tsx +0 -173
  167. package/components/AI/input-message/index.tsx +0 -1385
  168. package/components/AI/thinking-indicator/examples.mdx +0 -27
  169. package/components/AI/thinking-indicator/index.tsx +0 -210
  170. package/components/accordion/examples.mdx +0 -233
  171. package/components/accordion/index.tsx +0 -1071
  172. package/components/avatar/examples.mdx +0 -95
  173. package/components/avatar/index.tsx +0 -129
  174. package/components/badge/change-demo.tsx +0 -29
  175. package/components/badge/examples.mdx +0 -124
  176. package/components/badge/index.tsx +0 -225
  177. package/components/badge/variants.ts +0 -73
  178. package/components/button/examples.mdx +0 -168
  179. package/components/button/index.tsx +0 -424
  180. package/components/button/loading-demo.tsx +0 -25
  181. package/components/button/variants.ts +0 -168
  182. package/components/card/examples.mdx +0 -251
  183. package/components/card/index.tsx +0 -1070
  184. package/components/copy/examples.mdx +0 -125
  185. package/components/copy/index.tsx +0 -662
  186. package/components/inputs/checkbox/examples.mdx +0 -87
  187. package/components/inputs/checkbox/index.tsx +0 -611
  188. package/components/inputs/checkbox/select-all-demo.tsx +0 -48
  189. package/components/inputs/color-picker/examples.mdx +0 -111
  190. package/components/inputs/color-picker/index.tsx +0 -1981
  191. package/components/inputs/color-picker/variants.ts +0 -401
  192. package/components/inputs/combobox/examples.mdx +0 -366
  193. package/components/inputs/combobox/index.tsx +0 -1527
  194. package/components/inputs/combobox/remote-demo.tsx +0 -105
  195. package/components/inputs/date-time/calendar/examples.mdx +0 -45
  196. package/components/inputs/date-time/calendar/index.tsx +0 -370
  197. package/components/inputs/date-time/calendar/use-month-window.ts +0 -173
  198. package/components/inputs/date-time/date-picker/examples.mdx +0 -243
  199. package/components/inputs/date-time/date-picker/index.tsx +0 -476
  200. package/components/inputs/date-time/date-picker/masked-date-input.tsx +0 -348
  201. package/components/inputs/date-time/date-range-picker/examples.mdx +0 -93
  202. package/components/inputs/date-time/date-range-picker/index.tsx +0 -525
  203. package/components/inputs/date-time/duration-picker/examples.mdx +0 -40
  204. package/components/inputs/date-time/duration-picker/index.tsx +0 -253
  205. package/components/inputs/date-time/month-picker/examples.mdx +0 -45
  206. package/components/inputs/date-time/month-picker/index.tsx +0 -254
  207. package/components/inputs/date-time/picker-shell.tsx +0 -581
  208. package/components/inputs/date-time/time-columns.tsx +0 -94
  209. package/components/inputs/date-time/time-picker/examples.mdx +0 -57
  210. package/components/inputs/date-time/time-picker/index.tsx +0 -227
  211. package/components/inputs/field/examples.mdx +0 -117
  212. package/components/inputs/field/index.tsx +0 -268
  213. package/components/inputs/file-dropzone/examples.mdx +0 -83
  214. package/components/inputs/file-dropzone/file-row.tsx +0 -201
  215. package/components/inputs/file-dropzone/index.tsx +0 -316
  216. package/components/inputs/file-dropzone/upload-demo.tsx +0 -67
  217. package/components/inputs/file-dropzone/variants.ts +0 -94
  218. package/components/inputs/input/examples.mdx +0 -166
  219. package/components/inputs/input/index.tsx +0 -494
  220. package/components/inputs/input/password-demo.tsx +0 -30
  221. package/components/inputs/label/examples.mdx +0 -67
  222. package/components/inputs/label/index.tsx +0 -85
  223. package/components/inputs/number-input/examples.mdx +0 -69
  224. package/components/inputs/number-input/index.tsx +0 -221
  225. package/components/inputs/radio/examples.mdx +0 -77
  226. package/components/inputs/radio/index.tsx +0 -636
  227. package/components/inputs/search/examples.mdx +0 -74
  228. package/components/inputs/search/index.tsx +0 -333
  229. package/components/inputs/select/examples.mdx +0 -296
  230. package/components/inputs/select/index.tsx +0 -1044
  231. package/components/inputs/select/variants.ts +0 -32
  232. package/components/inputs/slider/examples.mdx +0 -153
  233. package/components/inputs/slider/index.tsx +0 -1867
  234. package/components/inputs/switch/examples.mdx +0 -96
  235. package/components/inputs/switch/index.tsx +0 -504
  236. package/components/inputs/textarea/examples.mdx +0 -126
  237. package/components/inputs/textarea/index.tsx +0 -207
  238. package/components/navigation/navigation-menu/examples.mdx +0 -136
  239. package/components/navigation/navigation-menu/index.tsx +0 -704
  240. package/components/navigation/pagination/examples.mdx +0 -74
  241. package/components/navigation/pagination/index.tsx +0 -401
  242. package/components/navigation/sidebar/examples.mdx +0 -325
  243. package/components/navigation/sidebar/index.tsx +0 -453
  244. package/components/navigation/sidebar/sidebar-core.tsx +0 -1408
  245. package/components/navigation/sidebar/sidebar-menu.tsx +0 -1495
  246. package/components/navigation/sidebar/sidebar.css +0 -74
  247. package/components/navigation/sidebar/variants.ts +0 -55
  248. package/components/navigation/tabs/examples.mdx +0 -89
  249. package/components/navigation/tabs/index.tsx +0 -494
  250. package/components/navigation/tabs-subtle/examples.mdx +0 -49
  251. package/components/navigation/tabs-subtle/index.tsx +0 -512
  252. package/components/overlays/alert-dialog/examples.mdx +0 -123
  253. package/components/overlays/alert-dialog/index.tsx +0 -276
  254. package/components/overlays/alert-dialog/pending-demo.tsx +0 -36
  255. package/components/overlays/command/examples.mdx +0 -113
  256. package/components/overlays/command/index.tsx +0 -425
  257. package/components/overlays/context-menu/examples.mdx +0 -56
  258. package/components/overlays/context-menu/index.tsx +0 -279
  259. package/components/overlays/dialog/examples.mdx +0 -165
  260. package/components/overlays/dialog/index.tsx +0 -451
  261. package/components/overlays/dropdown/dropdown-search.tsx +0 -395
  262. package/components/overlays/dropdown/examples.mdx +0 -444
  263. package/components/overlays/dropdown/index.tsx +0 -1241
  264. package/components/overlays/dropdown/menu-item.tsx +0 -510
  265. package/components/overlays/dropdown/menu-parts.tsx +0 -725
  266. package/components/overlays/popover/anchored-demo.tsx +0 -59
  267. package/components/overlays/popover/examples.mdx +0 -203
  268. package/components/overlays/popover/index.tsx +0 -317
  269. package/components/overlays/preview-card/examples.mdx +0 -61
  270. package/components/overlays/preview-card/index.tsx +0 -204
  271. package/components/overlays/sheet/examples.mdx +0 -101
  272. package/components/overlays/sheet/index.tsx +0 -307
  273. package/components/overlays/toast/examples.mdx +0 -85
  274. package/components/overlays/toast/global-demo.tsx +0 -72
  275. package/components/overlays/toast/index.tsx +0 -544
  276. package/components/overlays/toast/manager.ts +0 -193
  277. package/components/overlays/tooltip/examples.mdx +0 -106
  278. package/components/overlays/tooltip/index.tsx +0 -539
  279. package/components/progress/examples.mdx +0 -59
  280. package/components/progress/index.tsx +0 -174
  281. package/components/progress/progress.css +0 -49
  282. package/components/progress/step-demo.tsx +0 -27
  283. package/components/table/examples.mdx +0 -188
  284. package/components/table/index.tsx +0 -535
  285. package/components/table/sort-demo.tsx +0 -61
  286. package/dist/components/avatar/index.d.ts +0 -46
  287. package/dist/components/avatar/index.js +0 -19
  288. package/dist/components/badge/variants.d.ts +0 -33
  289. package/dist/components/badge/variants.js +0 -10
  290. package/dist/components/button/variants.d.ts +0 -39
  291. package/dist/components/button/variants.js +0 -8
  292. package/dist/components/inputs/color-picker/variants.d.ts +0 -61
  293. package/dist/components/inputs/color-picker/variants.js +0 -28
  294. package/dist/components/inputs/field/index.d.ts +0 -116
  295. package/dist/components/inputs/field/index.js +0 -29
  296. package/dist/components/inputs/file-dropzone/index.d.ts +0 -167
  297. package/dist/components/inputs/file-dropzone/index.js +0 -33
  298. package/dist/components/inputs/file-dropzone/variants.d.ts +0 -35
  299. package/dist/components/inputs/file-dropzone/variants.js +0 -12
  300. package/dist/components/inputs/label/index.d.ts +0 -32
  301. package/dist/components/inputs/label/index.js +0 -11
  302. package/dist/components/inputs/number-input/index.d.ts +0 -87
  303. package/dist/components/inputs/number-input/index.js +0 -21
  304. package/dist/components/inputs/select/variants.d.ts +0 -5
  305. package/dist/components/inputs/select/variants.js +0 -6
  306. package/dist/components/navigation/navigation-menu/index.d.ts +0 -126
  307. package/dist/components/navigation/navigation-menu/index.js +0 -41
  308. package/dist/components/navigation/pagination/index.d.ts +0 -75
  309. package/dist/components/navigation/pagination/index.js +0 -41
  310. package/dist/components/navigation/sidebar/variants.d.ts +0 -25
  311. package/dist/components/navigation/sidebar/variants.js +0 -28
  312. package/dist/components/progress/index.d.ts +0 -56
  313. package/dist/components/progress/index.js +0 -15
  314. package/dist/docs/index.d.ts +0 -83
  315. package/dist/docs/index.js +0 -288
  316. package/dist/docs/vite.d.ts +0 -31
  317. package/dist/docs/vite.js +0 -45
  318. package/dist/lib/date-locale.d.ts +0 -26
  319. package/dist/lib/date-locale.js +0 -24
  320. package/dist/lib/field-classes.d.ts +0 -149
  321. package/dist/lib/field-classes.js +0 -41
  322. package/dist/lib/field-variants.d.ts +0 -47
  323. package/dist/lib/field-variants.js +0 -26
  324. package/dist/lib/fluid-hover-highlight.d.ts +0 -112
  325. package/dist/lib/fluid-hover-highlight.js +0 -17
  326. package/dist/lib/focus-ring.d.ts +0 -18
  327. package/dist/lib/focus-ring.js +0 -11
  328. package/dist/lib/goo-indicator.d.ts +0 -46
  329. package/dist/lib/goo-indicator.js +0 -14
  330. package/dist/lib/icon-context.d.ts +0 -30
  331. package/dist/lib/icon-context.js +0 -12
  332. package/dist/lib/inert.d.ts +0 -9
  333. package/dist/lib/inert.js +0 -8
  334. package/dist/lib/morph-layers.d.ts +0 -93
  335. package/dist/lib/morph-layers.js +0 -13
  336. package/dist/lib/morph-part.d.ts +0 -21
  337. package/dist/lib/morph-part.js +0 -12
  338. package/dist/lib/popup.d.ts +0 -20
  339. package/dist/lib/popup.js +0 -12
  340. package/dist/lib/reduced-motion.d.ts +0 -9
  341. package/dist/lib/reduced-motion.js +0 -6
  342. package/dist/lib/row-index.d.ts +0 -10
  343. package/dist/lib/row-index.js +0 -8
  344. package/dist/lib/row-order.d.ts +0 -28
  345. package/dist/lib/row-order.js +0 -10
  346. package/dist/lib/scroll-column.d.ts +0 -31
  347. package/dist/lib/scroll-column.js +0 -19
  348. package/dist/lib/shape-context.d.ts +0 -30
  349. package/dist/lib/shape-context.js +0 -13
  350. package/dist/lib/shape-radius.d.ts +0 -19
  351. package/dist/lib/shape-radius.js +0 -6
  352. package/dist/lib/size-context.d.ts +0 -94
  353. package/dist/lib/size-context.js +0 -20
  354. package/dist/lib/size-scale.d.ts +0 -79
  355. package/dist/lib/size-scale.js +0 -8
  356. package/dist/lib/slot.d.ts +0 -39
  357. package/dist/lib/slot.js +0 -14
  358. package/dist/lib/springs.d.ts +0 -44
  359. package/dist/lib/springs.js +0 -8
  360. package/dist/lib/surface-classes.d.ts +0 -19
  361. package/dist/lib/surface-classes.js +0 -10
  362. package/dist/lib/surface-context.d.ts +0 -9
  363. package/dist/lib/surface-context.js +0 -8
  364. package/dist/lib/use-controllable-state.d.ts +0 -2
  365. package/dist/lib/use-controllable-state.js +0 -6
  366. package/dist/lib/use-fluid-hover.d.ts +0 -138
  367. package/dist/lib/use-fluid-hover.js +0 -14
  368. package/dist/lib/use-is-mobile.d.ts +0 -2
  369. package/dist/lib/use-is-mobile.js +0 -6
  370. package/dist/lib/use-keyboard-nav-gate.d.ts +0 -20
  371. package/dist/lib/use-keyboard-nav-gate.js +0 -7
  372. package/dist/lib/use-merge-split.d.ts +0 -47
  373. package/dist/lib/use-merge-split.js +0 -15
  374. package/dist/lib/use-morph.d.ts +0 -101
  375. package/dist/lib/use-morph.js +0 -20
  376. package/dist/lib/use-touch-primary.d.ts +0 -2
  377. package/dist/lib/use-touch-primary.js +0 -6
  378. package/dist/lib/utils.d.ts +0 -3
  379. package/dist/lib/utils.js +0 -6
  380. package/dist/primitives/separator/index.d.ts +0 -25
  381. package/dist/primitives/separator/index.js +0 -9
  382. package/dist/primitives/skeleton/index.d.ts +0 -35
  383. package/dist/primitives/skeleton/index.js +0 -13
  384. package/dist/shared/components-124epb7f.js +0 -53
  385. package/dist/shared/components-1kab3j44.js +0 -337
  386. package/dist/shared/components-26snnbs9.js +0 -322
  387. package/dist/shared/components-34txk9rj.js +0 -35
  388. package/dist/shared/components-3h92d94m.js +0 -23
  389. package/dist/shared/components-4vfm04wq.js +0 -82
  390. package/dist/shared/components-54nq988h.js +0 -123
  391. package/dist/shared/components-7s7pykk5.js +0 -281
  392. package/dist/shared/components-7zkhz3r8.js +0 -399
  393. package/dist/shared/components-8v644a0s.js +0 -298
  394. package/dist/shared/components-a4evvq8h.js +0 -271
  395. package/dist/shared/components-adkarj8n.js +0 -35
  396. package/dist/shared/components-b1e239g3.js +0 -28
  397. package/dist/shared/components-b94t6qtj.js +0 -143
  398. package/dist/shared/components-c9yr4ed1.js +0 -44
  399. package/dist/shared/components-cwg1d0w6.js +0 -254
  400. package/dist/shared/components-d3shbwqq.js +0 -95
  401. package/dist/shared/components-dhgk6mbt.js +0 -16
  402. package/dist/shared/components-drxrtnp2.js +0 -25
  403. package/dist/shared/components-ej4r7wmj.js +0 -482
  404. package/dist/shared/components-f7h57m6t.js +0 -59
  405. package/dist/shared/components-fejdzvqc.js +0 -448
  406. package/dist/shared/components-gx4h5rbb.js +0 -40
  407. package/dist/shared/components-gyt7my41.js +0 -328
  408. package/dist/shared/components-h6p86be3.js +0 -19
  409. package/dist/shared/components-h83az0bz.js +0 -33
  410. package/dist/shared/components-hdzrqqpx.js +0 -55
  411. package/dist/shared/components-krtx3m5b.js +0 -84
  412. package/dist/shared/components-kswxnm3h.js +0 -24
  413. package/dist/shared/components-mpa2y6x8.js +0 -277
  414. package/dist/shared/components-mrbaxt8q.js +0 -62
  415. package/dist/shared/components-pt5ftm4p.js +0 -38
  416. package/dist/shared/components-rpw4md2b.js +0 -179
  417. package/dist/shared/components-rtadhd9j.js +0 -64
  418. package/dist/shared/components-tz4gaf1v.js +0 -23
  419. package/dist/shared/components-wbbckbw8.js +0 -34
  420. package/dist/shared/components-xdqmt6ed.js +0 -20
  421. package/dist/shared/components-xjkdvnbg.js +0 -107
  422. package/dist/shared/components-z3v0n0de.js +0 -11
  423. package/dist/shared/components-z6dfqtyt.js +0 -1545
  424. package/dist/tokens/colors.css +0 -230
  425. package/dist/tokens/motion.css +0 -40
  426. package/dist/tokens/radius.css +0 -10
  427. package/dist/tokens/spacing.css +0 -9
  428. package/dist/tokens/typography.css +0 -119
  429. package/docs/chrome.css +0 -120
  430. package/docs/chrome.tsx +0 -283
  431. package/docs/index.ts +0 -9
  432. package/docs/vite.ts +0 -85
  433. package/index.ts +0 -60
  434. package/lib/date-locale.ts +0 -195
  435. package/lib/field-classes.ts +0 -121
  436. package/lib/field-variants.ts +0 -117
  437. package/lib/fluid-hover-highlight.tsx +0 -139
  438. package/lib/focus-ring.tsx +0 -46
  439. package/lib/goo-indicator.tsx +0 -261
  440. package/lib/icon-context.tsx +0 -310
  441. package/lib/inert.ts +0 -22
  442. package/lib/morph-layers.tsx +0 -102
  443. package/lib/morph-part.tsx +0 -49
  444. package/lib/popup.ts +0 -52
  445. package/lib/reduced-motion.ts +0 -19
  446. package/lib/row-index.tsx +0 -29
  447. package/lib/row-order.tsx +0 -126
  448. package/lib/scroll-column.tsx +0 -273
  449. package/lib/shape-context.tsx +0 -138
  450. package/lib/shape-radius.ts +0 -67
  451. package/lib/size-context.tsx +0 -66
  452. package/lib/size-scale.ts +0 -115
  453. package/lib/slot.ts +0 -115
  454. package/lib/springs.ts +0 -62
  455. package/lib/surface-classes.ts +0 -58
  456. package/lib/surface-context.tsx +0 -21
  457. package/lib/use-controllable-state.ts +0 -44
  458. package/lib/use-fluid-hover.ts +0 -541
  459. package/lib/use-is-mobile.ts +0 -25
  460. package/lib/use-keyboard-nav-gate.ts +0 -45
  461. package/lib/use-merge-split.tsx +0 -209
  462. package/lib/use-morph.ts +0 -557
  463. package/lib/use-touch-primary.tsx +0 -43
  464. package/lib/utils.ts +0 -37
  465. package/preset.ts +0 -199
  466. package/primitives/code/examples.mdx +0 -27
  467. package/primitives/code/index.tsx +0 -80
  468. package/primitives/craft/demos.tsx +0 -173
  469. package/primitives/craft/examples.mdx +0 -142
  470. package/primitives/craft/index.tsx +0 -76
  471. package/primitives/fluid-hover/examples.mdx +0 -84
  472. package/primitives/fluid-hover/index.tsx +0 -316
  473. package/primitives/morph/examples.mdx +0 -139
  474. package/primitives/morph/index.tsx +0 -192
  475. package/primitives/motion/examples.mdx +0 -100
  476. package/primitives/motion/index.tsx +0 -160
  477. package/primitives/scroll-area/examples.mdx +0 -58
  478. package/primitives/scroll-area/index.tsx +0 -204
  479. package/primitives/separator/examples.mdx +0 -30
  480. package/primitives/separator/index.tsx +0 -53
  481. package/primitives/sizes/examples.mdx +0 -167
  482. package/primitives/sizes/index.tsx +0 -89
  483. package/primitives/skeleton/examples.mdx +0 -51
  484. package/primitives/skeleton/index.tsx +0 -72
  485. package/primitives/skeleton/skeleton.css +0 -15
  486. package/primitives/surface/examples.mdx +0 -173
  487. package/primitives/surface/index.tsx +0 -109
  488. package/primitives/surface/surface.css +0 -176
  489. /package/dist/shared/{components-3ey0hzpb.js → components-1v7rxytx.js} +0 -0
  490. /package/dist/shared/{components-jcnjay5g.js → components-ezxhrmer.js} +0 -0
package/DESIGN.md DELETED
@@ -1,623 +0,0 @@
1
- ---
2
- version: alpha
3
- name: UI — Fluid Functionalism for modo
4
- description: >-
5
- A quiet, neutral, dense interface where motion carries the meaning: springs instead of durations,
6
- one hover highlight that glides between rows, labels that get heavier without moving, eight nesting
7
- surface levels, and overlays that melt out of whatever opened them through a liquid neck. Light values
8
- are the plain token names; `-dark` twins are the dark scheme (every color is one light-dark() token in
9
- tokens/colors.css and primitives/surface/surface.css).
10
- colors:
11
- primary: "oklch(0.205 0 0)"
12
- on-primary: "oklch(0.985 0 0)"
13
- background: "oklch(0.985 0 0)"
14
- background-dark: "oklch(0.205 0 0)"
15
- foreground: "oklch(0.205 0 0)"
16
- foreground-dark: "oklch(0.97 0 0)"
17
- card: "oklch(1 0 0)"
18
- card-dark: "oklch(0.264 0 0)"
19
- muted: "oklch(0.967 0.001 286.375)"
20
- muted-dark: "oklch(0.235 0 0)"
21
- muted-foreground: "oklch(0.556 0 0)"
22
- muted-foreground-dark: "oklch(0.7155 0 0)"
23
- accent: "oklch(0.922 0 0)"
24
- accent-dark: "oklch(0.439 0 0)"
25
- selected: "oklch(0.87 0 0)"
26
- selected-dark: "oklch(0.439 0 0)"
27
- border: "color-mix(in srgb, oklch(0.205 0 0) 12%, transparent)"
28
- border-dark: "color-mix(in srgb, oklch(0.97 0 0) 12%, transparent)"
29
- input: "oklch(0.922 0 0)"
30
- input-dark: "oklch(0.371 0 0)"
31
- control-border: "oklch(0.708 0 0)"
32
- control-border-dark: "oklch(0.556 0 0)"
33
- hover: "rgb(0 0 0 / 0.04)"
34
- hover-dark: "rgb(255 255 255 / 0.06)"
35
- active: "rgb(0 0 0 / 0.07)"
36
- active-dark: "rgb(255 255 255 / 0.1)"
37
- scrim: "oklch(0 0 0 / 0.4)"
38
- scrim-dark: "oklch(0 0 0 / 0.8)"
39
- brand: "oklch(0.693 0.16 265)"
40
- brand-hover: "oklch(0.649 0.164 264.76)"
41
- focus-ring: "oklch(0.693 0.16 265)"
42
- thumb: "oklch(1 0 0)"
43
- destructive: "oklch(0.6368 0.2078 25.33)"
44
- destructive-dark: "oklch(0.7106 0.1661 22.22)"
45
- destructive-light: "oklch(0.971 0.013 17.38)"
46
- destructive-light-dark: "oklch(0.2575 0.0886 26.04)"
47
- destructive-strong: "oklch(0.47 0.175 27)"
48
- destructive-strong-dark: "oklch(0.81 0.105 22)"
49
- destructive-wash: "color-mix(in oklab, oklch(0.6368 0.2078 25.33) 16%, transparent)"
50
- destructive-wash-dark: "color-mix(in oklab, oklch(0.7106 0.1661 22.22) 16%, transparent)"
51
- destructive-wash-hover: "color-mix(in oklab, oklch(0.6368 0.2078 25.33) 20%, transparent)"
52
- destructive-wash-hover-dark: "color-mix(in oklab, oklch(0.7106 0.1661 22.22) 20%, transparent)"
53
- destructive-wash-active: "color-mix(in oklab, oklch(0.6368 0.2078 25.33) 24%, transparent)"
54
- destructive-wash-active-dark: "color-mix(in oklab, oklch(0.7106 0.1661 22.22) 24%, transparent)"
55
- success-strong: "oklch(0.46 0.12 151)"
56
- success-strong-dark: "oklch(0.83 0.15 152)"
57
- success-wash: "color-mix(in oklab, oklch(0.723 0.192 149.58) 16%, transparent)"
58
- success-wash-hover: "color-mix(in oklab, oklch(0.723 0.192 149.58) 20%, transparent)"
59
- success-wash-active: "color-mix(in oklab, oklch(0.723 0.192 149.58) 24%, transparent)"
60
- status-success: "oklch(0.723 0.192 149.58)"
61
- status-loading: "oklch(0.715 0 0)"
62
- status-warning: "oklch(0.7686 0.1647 70.08)"
63
- status-info: "oklch(0.623 0.188 259.81)"
64
- skeleton: "color-mix(in oklab, oklch(0.205 0 0) 8%, transparent)"
65
- skeleton-dark: "color-mix(in oklab, oklch(0.97 0 0) 8%, transparent)"
66
- image-edge: "rgb(0 0 0 / 0.1)"
67
- image-edge-dark: "rgb(255 255 255 / 0.1)"
68
- progress-track: "color-mix(in oklab, oklch(0.205 0 0) 10%, transparent)"
69
- progress-track-dark: "color-mix(in oklab, oklch(0.97 0 0) 10%, transparent)"
70
- well: "oklch(0.967 0.001 286.375)"
71
- well-dark: "oklch(0 0 0 / 0.25)"
72
- surface-1: "oklch(0.985 0 0)"
73
- surface-2: "oklch(0.991 0 0)"
74
- surface-3: "oklch(1 0 0)"
75
- surface-4: "oklch(1 0 0)"
76
- surface-5: "oklch(1 0 0)"
77
- surface-6: "oklch(1 0 0)"
78
- surface-7: "oklch(1 0 0)"
79
- surface-8: "oklch(1 0 0)"
80
- surface-1-dark: "oklch(0.205 0 0)"
81
- surface-2-dark: "oklch(0.235 0 0)"
82
- surface-3-dark: "oklch(0.264 0 0)"
83
- surface-4-dark: "oklch(0.293 0 0)"
84
- surface-5-dark: "oklch(0.321 0 0)"
85
- surface-6-dark: "oklch(0.349 0 0)"
86
- surface-7-dark: "oklch(0.375 0 0)"
87
- surface-8-dark: "oklch(0.402 0 0)"
88
- typography:
89
- display:
90
- fontFamily: Inter Variable
91
- fontSize: 28px
92
- fontWeight: 700
93
- lineHeight: 34px
94
- fontVariation: "'wght' 700, 'opsz' 25"
95
- title:
96
- fontFamily: Inter Variable
97
- fontSize: 16px
98
- fontWeight: 550
99
- lineHeight: 22px
100
- fontVariation: "'wght' 550, 'opsz' 18"
101
- subtitle:
102
- fontFamily: Inter Variable
103
- fontSize: 14px
104
- fontWeight: 550
105
- lineHeight: 20px
106
- fontVariation: "'wght' 550, 'opsz' 18"
107
- body:
108
- fontFamily: Inter Variable
109
- fontSize: 13px
110
- fontWeight: 400
111
- lineHeight: 20px
112
- fontVariation: "'wght' 400, 'opsz' 14"
113
- body-selected:
114
- fontFamily: Inter Variable
115
- fontSize: 13px
116
- fontWeight: 550
117
- lineHeight: 20px
118
- fontVariation: "'wght' 550, 'opsz' 18"
119
- caption:
120
- fontFamily: Inter Variable
121
- fontSize: 12px
122
- fontWeight: 400
123
- lineHeight: 16px
124
- fontVariation: "'wght' 400, 'opsz' 14"
125
- caption-medium:
126
- fontFamily: Inter Variable
127
- fontSize: 12px
128
- fontWeight: 450
129
- lineHeight: 16px
130
- fontVariation: "'wght' 450, 'opsz' 15"
131
- micro:
132
- fontFamily: Inter Variable
133
- fontSize: 11px
134
- fontWeight: 400
135
- lineHeight: 14px
136
- fontVariation: "'wght' 400, 'opsz' 14"
137
- display-compact:
138
- fontFamily: Inter Variable
139
- fontSize: 24px
140
- fontWeight: 700
141
- lineHeight: 34px
142
- fontVariation: "'wght' 700, 'opsz' 25"
143
- title-compact:
144
- fontFamily: Inter Variable
145
- fontSize: 15px
146
- fontWeight: 550
147
- lineHeight: 22px
148
- fontVariation: "'wght' 550, 'opsz' 18"
149
- subtitle-compact:
150
- fontFamily: Inter Variable
151
- fontSize: 13px
152
- fontWeight: 550
153
- lineHeight: 20px
154
- fontVariation: "'wght' 550, 'opsz' 18"
155
- body-compact:
156
- fontFamily: Inter Variable
157
- fontSize: 12px
158
- fontWeight: 400
159
- lineHeight: 20px
160
- fontVariation: "'wght' 400, 'opsz' 14"
161
- caption-compact:
162
- fontFamily: Inter Variable
163
- fontSize: 11px
164
- fontWeight: 400
165
- lineHeight: 16px
166
- fontVariation: "'wght' 400, 'opsz' 14"
167
- micro-compact:
168
- fontFamily: Inter Variable
169
- fontSize: 10px
170
- fontWeight: 400
171
- lineHeight: 14px
172
- fontVariation: "'wght' 400, 'opsz' 14"
173
- code:
174
- fontFamily: ui-monospace
175
- fontSize: 12px
176
- fontWeight: 400
177
- lineHeight: 16px
178
- rounded:
179
- glyph: 3px
180
- box: 5px
181
- md: 6px
182
- lg: 8px
183
- focus-ring: 10px
184
- xl: 12px
185
- 2xl: 16px
186
- pill: 20px
187
- pill-focus-ring: 22px
188
- 3xl: 24px
189
- full: 9999px
190
- spacing:
191
- space-1: 4px
192
- space-2: 8px
193
- space-3: 12px
194
- space-4: 16px
195
- space-5: 24px
196
- space-6: 32px
197
- control: 36px
198
- control-compact: 28px
199
- segment-item: 28px
200
- segment-item-compact: 24px
201
- control-px: 12px
202
- control-px-compact: 10px
203
- row-px: 8px
204
- row-px-compact: 6px
205
- gap: 8px
206
- gap-compact: 4px
207
- icon: 16px
208
- icon-compact: 14px
209
- goo-neck: 12px
210
- measure: 45rem
211
- motion:
212
- fast: 80ms
213
- fast-exit: 60ms
214
- moderate: 160ms
215
- moderate-exit: 120ms
216
- slow: 240ms
217
- slow-exit: 160ms
218
- goo: 250ms
219
- goo-exit: 200ms
220
- loop: 2s
221
- components:
222
- button-primary:
223
- backgroundColor: "{colors.foreground}"
224
- textColor: "{colors.background}"
225
- typography: "{typography.body}"
226
- rounded: "{rounded.lg}"
227
- height: "{spacing.control}"
228
- padding: 0 16px
229
- button-primary-hover:
230
- backgroundColor: "color-mix(in srgb, oklch(0.205 0 0) 90%, oklch(0.985 0 0))"
231
- button-primary-active:
232
- backgroundColor: "color-mix(in srgb, oklch(0.205 0 0) 80%, oklch(0.985 0 0))"
233
- button-secondary:
234
- backgroundColor: "{colors.accent}"
235
- textColor: "{colors.foreground}"
236
- typography: "{typography.body}"
237
- rounded: "{rounded.lg}"
238
- height: "{spacing.control}"
239
- padding: 0 16px
240
- button-secondary-hover:
241
- backgroundColor: "color-mix(in srgb, oklch(0.922 0 0) 80%, oklch(0.985 0 0))"
242
- button-tertiary:
243
- textColor: "{colors.foreground}"
244
- rounded: "{rounded.lg}"
245
- height: "{spacing.control}"
246
- padding: 0 16px
247
- button-tertiary-hover:
248
- backgroundColor: "{colors.hover}"
249
- button-ghost:
250
- textColor: "{colors.muted-foreground}"
251
- rounded: "{rounded.lg}"
252
- height: "{spacing.control}"
253
- button-ghost-hover:
254
- backgroundColor: "{colors.hover}"
255
- button-compact:
256
- typography: "{typography.body-compact}"
257
- height: "{spacing.control-compact}"
258
- padding: 0 12px
259
- input-field:
260
- textColor: "{colors.foreground}"
261
- typography: "{typography.body}"
262
- rounded: "{rounded.lg}"
263
- height: "{spacing.control}"
264
- padding: 0 10px
265
- input-field-focus:
266
- backgroundColor: "{colors.card}"
267
- menu-popup:
268
- backgroundColor: "{colors.surface-3}"
269
- rounded: "{rounded.xl}"
270
- menu-row:
271
- textColor: "{colors.foreground}"
272
- typography: "{typography.body}"
273
- rounded: "{rounded.lg}"
274
- height: "{spacing.control}"
275
- padding: 0 8px
276
- hover-highlight:
277
- backgroundColor: "{colors.hover}"
278
- rounded: "{rounded.lg}"
279
- popover:
280
- backgroundColor: "{colors.surface-3}"
281
- rounded: "{rounded.xl}"
282
- padding: 16px
283
- dialog:
284
- backgroundColor: "{colors.surface-5}"
285
- rounded: "{rounded.xl}"
286
- padding: 24px
287
- width: 400px
288
- tabs-list:
289
- backgroundColor: "{colors.well}"
290
- rounded: "{rounded.xl}"
291
- height: "{spacing.control}"
292
- padding: 4px
293
- tabs-indicator:
294
- backgroundColor: "{colors.surface-4}"
295
- rounded: "{rounded.lg}"
296
- height: "{spacing.segment-item}"
297
- tooltip:
298
- backgroundColor: "{colors.foreground}"
299
- textColor: "{colors.background}"
300
- typography: "{typography.caption-medium}"
301
- rounded: "{rounded.lg}"
302
- padding: 4px 8px
303
- badge:
304
- typography: "{typography.caption-medium}"
305
- rounded: "{rounded.lg}"
306
- height: 24px
307
- padding: 0 10px
308
- switch-track-on:
309
- backgroundColor: "{colors.brand}"
310
- switch-thumb:
311
- backgroundColor: "{colors.thumb}"
312
- rounded: "{rounded.full}"
313
- code-block:
314
- backgroundColor: "{colors.surface-2}"
315
- textColor: "{colors.foreground}"
316
- typography: "{typography.code}"
317
- rounded: "{rounded.xl}"
318
- padding: 16px
319
- ---
320
-
321
- # UI — Fluid Functionalism for modo
322
-
323
- The `ui` design system: Fluid Functionalism (Base UI flavor, MIT © 2026 Micka Touillaud) on UnoCSS and
324
- `cn`, plus a local morph layer that makes overlays and indicators liquid. The front matter holds the
325
- normative values; the CSS custom properties in `tokens/*.css` and `primitives/surface/surface.css` are
326
- the source they are copied from, and they win if the two ever disagree. Component code never writes
327
- these values: it reads the utility that maps to each token (the class in backticks below).
328
-
329
- ## Overview
330
-
331
- Functional first, then fluid. The interface is neutral, compact and quiet at rest, and almost every
332
- pixel of personality is spent on *how things change*: a state change is always legible, never abrupt,
333
- and never decorative.
334
-
335
- - **Neutral, ink on paper.** Greyscale everywhere. The one chromatic accent, a cool blue (`brand`), is
336
- reserved for focus, "on" (switch track), drop targets and the selected swatch. Status hues appear only
337
- in toasts, badges and errors.
338
- - **Dense, desktop-grade.** 13px body text, 36px controls, a 28px compact step for toolbars, tables and
339
- sidebars. Density is chosen per region (`SizeProvider`), never per control.
340
- - **Hierarchy from size, weight and elevation**, not from color, borders, capitals or letter-spacing.
341
- - **Motion is the signature.** Springs, not durations. One hover highlight per list that glides to the
342
- nearest row. Selection backgrounds that melt from item to item like a drop of liquid. Overlays that
343
- grow out of the control that opened them through a goo neck, then let go.
344
- - **Calm under reduced motion.** Every effect degrades to a fade: fewer and gentler, never none.
345
-
346
- The feeling to aim for: a precise instrument that happens to be made of liquid. Nothing bounces for
347
- fun; the only overshoot in the system is the slow tier's 0.12 and the goo's 0.15.
348
-
349
- ## Colors
350
-
351
- Two text colors, a greyscale ground, one blue.
352
-
353
- - **Foreground (`text-foreground`)** — near-black ink in light, near-white in dark. Headings, labels,
354
- values, selected items, the primary button's fill (until `--primary` is re-pointed).
355
- - **Muted foreground (`text-muted-foreground`)** — the only secondary text color: descriptions, captions,
356
- placeholders, idle icons, idle tab labels. Never an opacity step of foreground (`text-foreground/60`
357
- is wrong); a third text tone does not exist.
358
- - **Background (`bg-background`)** — the page, equal to surface 1. Also the text color on the primary
359
- button (until `--primary-foreground` is re-pointed) and the tooltip (`text-background`).
360
- - **Surfaces (`bg-surface-1` … `bg-surface-8`)** — the elevation ladder (see Elevation & Depth). Prefer a
361
- surface level over `card`/`background` for anything that floats or nests.
362
- - **Muted (`bg-muted`)** — a sunken fill: a field's hover wash, a queued row. In dark it is surface 2, so
363
- it never carries a track: it would vanish on a card or the inset.
364
- - **Well (`bg-well`)** — the recessed track under a segmented control's indicator (the tabs list). Light is
365
- muted; dark is black at 25%, which darkens whatever it sits on, so the track reads on the page, a card
366
- and the inset alike.
367
- - **Accent (`bg-accent`)** — the secondary button and the switch's off track. `selected` is a firmer
368
- grey for persistent selection fills.
369
- - **Hover / Active (`bg-hover`, `bg-active`)** — translucent overlays (black 4% / 7% in light, white 6% /
370
- 10% in dark) so they read on any surface level. Every hover and press fill uses them; never an ad-hoc
371
- grey. The raw tint direction is `--overlay` (`bg-overlay/8` → `rgb(var(--overlay) / 0.08)`).
372
- - **Border (`border-border`, `ring-border`)** — 12% of foreground, so it tracks the scheme and nested
373
- forced scopes. Hairlines only, 1px.
374
- - **Brand (`bg-brand`, `ring-focus-ring`)** — `focus-ring` is `brand`: every keyboard ring is a 1px blue
375
- ring 2px outside the element. The single theming point for focus.
376
- - **Primary (`bg-primary`, `text-primary-foreground`)** — the primary Button's theme hooks, so a host can
377
- recolour it without forking the component: `--primary` (the fill, default `foreground`), `--primary-hover`
378
- and `--primary-active` (default: `--primary` mixed 10% / 20% toward `background`), `--primary-foreground`
379
- (the label, default `background`) and `--shadow-button-primary` (an extra shadow list drawn on the fill
380
- layer, after its press ring: a lit edge, an outline, a drop; default the invisible `0 0 #0000`). All
381
- five default to the ink look, so nothing moves until one is overridden. Re-point them on
382
- `:root, .light, .dark` (zero-specificity defaults, so any stylesheet order wins), and set the hover and
383
- active steps with the fill, since their defaults mix from the `--primary` they are declared with.
384
- Other ink fills (checkbox, switch, progress, …) still read `foreground`.
385
- - **Destructive (`text-destructive`, `bg-destructive-light`)** — errors and destructive confirms only.
386
- - **Tinted actions (`text-destructive-strong` on `bg-destructive-wash`, `text-success-strong` on
387
- `bg-success-wash`)** — the destructive and success buttons: the hue as text, dark enough for AA on its
388
- wash, over a translucent wash of it that deepens on hover and press (`-hover`, `-active`). Never a
389
- solid fill.
390
- - **Skeleton (`bg-skeleton`)** — 8% of foreground: the loading placeholder, quieter than any border.
391
- - **Image edge (`outline-image-edge`)** — a 1px inset edge (black or white at 10%) on images and
392
- avatars, so a picture keeps its outline on any substrate.
393
- - **Progress track (`bg-progress-track`)** — 10% of foreground under the ink (`bg-foreground`) fill of
394
- a progress bar.
395
- - **Status (`text-status-*`, `bg-status-*/16`)** — success, loading, error, warning, info, action. A
396
- status shows as tinted text on a 16% wash of itself, never as a solid fill behind text.
397
- - **Scrim (`bg-scrim`)** — behind a modal dialog; it fades with the morph's progress.
398
- - **Syntax (`text-syntax-*`)** — low-chroma hues for code, so code reads as text first.
399
-
400
- Every color is one `light-dark(light, dark)` token; the scheme comes from `color-scheme` on `<html>`
401
- (`.light` / `.dark` pin it, also on any subtree). Shadows cannot ride `light-dark()`, so `--shadow-N` is
402
- re-pointed per scheme in `surface.css`.
403
-
404
- ## Typography
405
-
406
- **Inter Variable** with its optical-size axis (`@fontsource-variable/inter/opsz.css`). The opsz axis is
407
- not optional: every weight is paired with an optical size so a label keeps its width when it gets
408
- heavier.
409
-
410
- Six roles, each a size and a whole-pixel line height, as utilities `text-<role>` (and
411
- `text-<role>-compact` for the compact step, which keeps the role's leading):
412
-
413
- | Role | Default | Compact | Use |
414
- |---|---|---|---|
415
- | `text-display` | 28/34 | 24 | The page title. The only bold text. |
416
- | `text-title` | 16/22 | 15 | Section headings, dialog titles. |
417
- | `text-subtitle` | 14/20 | 13 | Card and popover titles, emphasized rows. |
418
- | `text-body` | 13/20 | 12 | Control labels, rows, body copy. The default. |
419
- | `text-caption` | 12/16 | 11 | Descriptions, meta, errors, group labels, tooltips, badges. |
420
- | `text-micro` | 11/14 | 10 | Keycaps, counters, tiny chips. Single line only. |
421
-
422
- Body's 20px leading is what puts a padded row on the ladder: 8 + 20 + 8 = 36px.
423
-
424
- Weights come from `font-variation-settings`, through the `weight-*` utilities, never `font-*`:
425
-
426
- - `weight-normal` (400, opsz 14) — all running text and idle labels.
427
- - `weight-medium` (450, opsz 15) — small labels that need to hold on a fill: tooltips, badges, errors.
428
- - `weight-semibold` (550, opsz 18) — headings and anything selected, active or open.
429
- - `weight-bold` (700, opsz 25) — the display role only.
430
-
431
- A label that changes weight with state (a tab, a selected card title, an open accordion row) renders
432
- twice in one grid cell: an invisible `weight-semibold` copy reserves the width, the visible copy tweens
433
- `transition-[color,font-variation-settings] duration-fast`. Neighbours never move.
434
-
435
- No uppercase, no letter-spacing, no eyebrows above titles in new UI (`Card.Eyebrow` is the one vendored
436
- exception). Sentence case everywhere; the docs chrome capitalizes in content, not with CSS. Fixed-height
437
- labels trim their box (`[text-box:trim-both_cap_alphabetic]`) so the cap height sits optically centered.
438
- `h1–h3` balance, `p` wraps pretty. Code is `font-mono` at caption size.
439
-
440
- ## Layout
441
-
442
- A 4px grid. Spacing tokens `--space-1…6` = 4, 8, 12, 16, 24, 32px (the docs chrome reads them);
443
- component code uses the matching utilities (`gap-1`, `p-4`, …), which sit on the same 4px grid.
444
-
445
- **The size ladder** is the layout system. Two steps only, and everything steps down together:
446
-
447
- | Token (`useSize()`) | Default | Compact |
448
- |---|---|---|
449
- | `control` (buttons, inputs, select triggers, **and** list/menu rows) | 36px `h-9` | 28px `h-7` |
450
- | `segmentItem` + `segmentPad` (segmented tabs) | 28 + 4 | 24 + 2 |
451
- | `text` | `text-body` | `text-body-compact` |
452
- | `px` (bounded controls) | 12px | 10px |
453
- | `itemPx` (rows inside a padded popup) | 8px | 6px |
454
- | `gap` (icon ↔ label, control ↔ control) | 8px | 4px |
455
- | `icon` (glyphs, checkbox squares) | 16px | 14px |
456
-
457
- A popup row is exactly as tall as the trigger that opened it. Density is a region decision: wrap the
458
- region in one `SizeProvider size="compact"` and every control in it (menus it opens included) follows.
459
- A component's own `size` prop wins over the provider.
460
-
461
- Other fixed measures: popovers cap at `min(92vw, 20rem)`; dialogs are 400 / 540 / 880px wide (`sm`,
462
- `lg`, `xl`), one notch narrower in compact regions; popup lists cap at `min(300px,
463
- var(--available-height))` and scroll inside `ScrollArea` with a scroll-aware `scroll-fade`; reading
464
- columns cap at `--modo-measure` (45rem). Native scrollbars are thin and low-contrast (overlay 8% → 12% on
465
- hover → 16% while dragging), matching the `ScrollArea` thumb.
466
-
467
- ## Elevation & Depth
468
-
469
- Eight surface levels that nest. Each `bg-surface-N` pairs 1:1 with a `shadow-surface-N`.
470
-
471
- - **Light:** only two color steps (floor 0.985, sunken 0.991), then flat white from surface 3 up.
472
- Elevation is carried by shadow alone: a 1px `--shadow-color` hairline (black 6%) plus stacked drops
473
- whose offsets double per level (1, 3, 6, 12, 24, 48, 96px).
474
- - **Dark:** an additive ladder from 0.205 to 0.402 in even steps, each with an inset top highlight, an
475
- inset ring and black drops.
476
-
477
- Substrate flows through React context (`useSurface()`, 1 = the page). A floating surface computes
478
- `min(substrate + offset, 8)`, paints that level and re-provides it, so a popover inside a dialog lands
479
- above the dialog without any prop:
480
-
481
- | Surface | Offset | Shadow |
482
- |---|---|---|
483
- | Code block | +1 | none |
484
- | Popover, dropdown, select, combobox, context menu, preview card, toast, search suggestions | +2 | fixed `shadow-surface-3` |
485
- | Tabs' active indicator | +3 | matches level |
486
- | Dialog, alert dialog, sheet | +4 | matches level |
487
- | Tooltip | inverted: `bg-foreground`, no shadow | — |
488
-
489
- Menus keep a fixed `shadow-surface-3` whatever their depth, so a menu still reads as a menu three layers
490
- down. Hover and pressed states are overlays (`bg-hover`, `bg-active`), not levels, so they work at any
491
- elevation. Use `Elevated offset={n}` (or `surfaceClasses(level)` / `SURFACE_BG[level]`) for anything new
492
- that floats; never hard-code a surface.
493
-
494
- ## Shapes
495
-
496
- Rounded, concentric, never mixed. Two shape modes from `useShape()`; **rounded** is the default and what
497
- everything renders without a provider:
498
-
499
- | Slot | Rounded | Pill |
500
- |---|---|---|
501
- | `item`, `bg`, `button`, `input` | 8px `rounded-lg` | 20px |
502
- | `focusRing` (2px outside the element) | 10px | 22px |
503
- | `container` (popups, cards, dialogs, segmented tracks) | 12px `rounded-xl` | 24px |
504
- | `mergedBg` (merged selection runs) | 8px | 16px |
505
-
506
- A rounded surface nested close inside another uses concentric corners: inner = outer − inset − border.
507
- The shipped pair (12 → 8) assumes a 4px inset. Small boxes use `rounded-box` (5px: checkbox squares,
508
- keycaps) and `rounded-glyph` (3px). Thumbs, dots and the loading button are circles (`rounded-full`).
509
- Never write a radius: read `shape.*` so the pill mode follows.
510
-
511
- ## Motion
512
-
513
- Springs, tiered by the size of what moves. The bigger the thing, the slower the spring. Never a
514
- hand-written duration; never a fourth speed.
515
-
516
- | Tier | Enter | Exit (tween, one tier quicker) | Use |
517
- |---|---|---|---|
518
- | `spring.fast` | 80ms spring, bounce 0 | 60ms | Hover highlight, focus ring, fades, icon stroke, weight changes |
519
- | `spring.moderate` | 160ms spring, bounce 0 | 120ms | Indicators, thumbs, small panels, width changes, the loading fold |
520
- | `spring.slow` | 240ms spring, bounce 0.12 | 160ms | Large surfaces: plain morphs, the search field's growth, shared parts |
521
- | `spring.goo` | 250ms visual, bounce 0.15 | 200ms spring back | Every goo morph, so the liquid neck is on screen long enough to read |
522
-
523
- CSS consumers use `duration-fast|moderate|slow[-exit]` and `delay-*`. `--duration-loop` (2s) is the
524
- period of pending-state loops (the indeterminate progress sweep, the spinner, the skeleton pulse); it is
525
- not a spring tier, and under reduced motion a loop pulses opacity in place. Animate `transform` and `opacity`;
526
- a measured geometry engine (the morph layer, `GooIndicator`) is the only thing that writes boxes.
527
-
528
- The signature behaviors:
529
-
530
- - **Fluid hover.** One `bg-hover` highlight per list, on the item nearest the cursor (inside wins, else
531
- nearest center), so it never blinks off in a gap. It travels on `spring.fast` and melts between rows.
532
- A fresh pointer entry fades in where it is instead of sliding across. A click in a gap goes to the lit
533
- row: what is lit is what a click hits.
534
- - **Liquid indicators.** Anything that travels between items (the active tab, a switch thumb, selection
535
- runs, the hover pill) leaves a blob behind that lingers a third of the spring and follows, melted
536
- through a goo filter. At rest nothing is filtered.
537
- - **Morphing overlays.** Popover, dropdown, select, combobox, context menu, tooltip, preview card,
538
- dialog, sheet, command, search suggestions and toasts grow from their source (`from`: the trigger,
539
- the press point, the center, a window edge, or any element) with an `effect`: `goo` (default, a
540
- liquid neck that pinches off), `morph` (the box grows), `slide` or `fade`. They close back into where
541
- they came from. With `hideSource` the trigger *becomes* the panel.
542
- - **Press geometry.** A pressed button's fill shrinks exactly 1px per side at any width (spread shadow
543
- collapse, not a scale), releasing slower than it presses.
544
- - **Icons thicken, labels don't move.** Hovered/active icons step stroke 1.5 → 2 on the fast tier.
545
- - **Loading folds.** A loading button folds its surface into a circle around the spinner while its box
546
- stays put.
547
- - **Exits are crisp.** A dismissal never replays the entrance backwards.
548
- - **Reduced motion.** Every morph becomes a fade; travel snaps; opacity and color fades stay.
549
-
550
- ## Components
551
-
552
- Each item lives at `<tier>/[<group>/]<name>/index.tsx` and composes from Base UI (behavior) plus the
553
- shared systems above (look and motion). Ready-made patterns to reach for before writing anything:
554
-
555
- - **Buttons** — `primary` (ink fill by default, the `--primary` theme hooks), `secondary` (accent fill), `tertiary` (transparent, a 1px
556
- `border` ring that moves inward on press), `ghost` (transparent, muted text that turns foreground over
557
- the hover overlay). A component token with no `backgroundColor` is transparent over its substrate.
558
- Sizes `default` 36 / `compact` 28 / `icon` / `icon-compact`. Icons sit 4px closer to their edge than
559
- text. `active` holds the pressed look while a menu it opened is showing. One primary per view.
560
- `outline` is `tertiary` under its shadcn name. `destructive` and `success` are their hue as text on a
561
- wash of it (Tinted actions), never a solid fill; `link` is underlined foreground text on the control
562
- height, no padding. `xs` and `sm` resolve to `compact`: the ladder has two steps.
563
- - **Inputs** — transparent and ringless at rest, a `bg-muted/50` wash plus a `ring-border` ring on
564
- hover, `bg-card` plus the ring on focus; read-only keeps the ring but never lifts the fill. The label
565
- sits above in muted body text (an asterisk when required), help text below in muted caption, both
566
- inset to the text. Errors: destructive caption at `weight-medium`, a `destructive-light` wash.
567
- Adornments are muted and light with the field; field actions are 4px inside the ring. File
568
- dropzones: a dashed hairline on the container radius, a muted fill while files hover over it,
569
- destructive for files it won't take; a drag it can partly take keeps the neutral fill and says that
570
- some will be skipped.
571
- - **Lists and menus** — rows on the control height, `itemPx` inset, one fluid hover highlight, rows
572
- without their own `:hover` fill. Disabled rows stay registered but are skipped. Keyboard focus earns a
573
- 1px brand ring that springs between rows; pointer focus never shows it.
574
- - **Selection** — checkbox and radio rows melt their selected backgrounds into one run; tabs and
575
- subtle tabs carry an elevated (+3) or translucent indicator that melts between items; the selected
576
- label goes `weight-semibold`. Checkbox, radio and switch also come bare (no label): just the box,
577
- circle or track, with a 1px focus ring offset 2px, for tables and hand-laid forms. An indeterminate
578
- checkbox shows a dash that blurs into the check. A loading control keeps its box: the combobox
579
- chevron blurs into a spinner in the same slot.
580
- - **Overlays** — popup surfaces at +2 with `shadow-surface-3`, dialogs at +4, `rounded-xl` containers,
581
- 12px goo neck between trigger and panel, content padding 16px (popover) or 24px (dialog). A confirm
582
- that runs a task folds its button into the loading circle and holds the dialog until it settles.
583
- - **Tooltips** — inverted (`bg-foreground` / `text-background`), caption at `weight-medium`, morph from
584
- the trigger, a hand-off between grouped tooltips is instant; the same label whether written flat or
585
- as Trigger + Content parts.
586
- - **Badges** — 24px (20px compact), caption medium, a 15% wash of the color into the background with
587
- foreground text; dot variant keeps a neutral outline; `outline` is that frame without the dot, and
588
- no color.
589
- - **Toasts** — a status pill that melts into a body; status color as text on a 16% wash. Shown from
590
- anywhere through the global `toast()`; a custom icon sits in the same status disc.
591
- - **Cards** — transparent and borderless, inheriting the substrate; hairline dividers and the fluid
592
- hover do the framing; only clickable cards join the hover. `border="outlined"` gives a standalone
593
- card the outlined group's hairline frame; `Card.Divider` is a full-bleed hairline between its parts.
594
- - **Pagination** — the current page is a liquid `bg-accent` indicator on the fluid-hover strip; dense
595
- tables use the jump-to-page field.
596
- - **Avatar** — one control tall (36px, 28px compact), a circle, or a square on the item radius,
597
- with the image edge; initials or an icon on `bg-accent` until the image loads, which then fades in.
598
- - **Progress** — a 4px pill: the ink fill slides to its value on `spring.moderate`; with no value a
599
- segment sweeps the track on the loop period. The spinner is the loading button's figure-eight.
600
- - **Skeleton** — `bg-skeleton` blocks on the item radius pulsing in opacity, rows on the control
601
- height; hidden from assistive tech (mark the loading region busy instead).
602
- - **Separator** — the one 1px `border` hairline, horizontal or vertical; no ornament.
603
-
604
- ## Do's and Don'ts
605
-
606
- - Do compose from an existing item before writing a new one; wrap rather than fork vendored code.
607
- - Do read every visual from a token utility: `text-<role>`, `weight-*`, `bg-surface-N`,
608
- `shadow-surface-N`, `bg-hover`, `shape.*`, `duration-<tier>`, `spring.*`.
609
- - Do lift floating surfaces relative to the substrate (`useSurface()` + offset) and re-provide the level.
610
- - Do size controls from `useSize()` and let regions choose density with `SizeProvider`.
611
- - Do give every list exactly one fluid hover highlight, and every traveling indicator a `GooIndicator`.
612
- - Do grow every new overlay out of its source through `useMorph` + `MorphSurface`.
613
- - Do test light, dark, compact, keyboard and reduced motion.
614
- - Don't write an arbitrary value for color, type, radius, shadow or motion (`text-[13px]`, `bg-[#…]`,
615
- `rounded-[10px]`, `duration-[200ms]`); add the token instead. Layout geometry may be arbitrary.
616
- - Don't use a third text color, an opacity step of a text color, uppercase, letter-spacing, or `font-*`
617
- weights.
618
- - Don't add a per-row `:hover` background next to a fluid hover list.
619
- - Don't hand-write a `duration`, an easing curve or a fourth spring; don't animate `top`/`left`/`width`/
620
- `height` outside the morph engine.
621
- - Don't use the brand blue for anything but focus, "on", drop targets and selected swatches.
622
- - Don't hard-code a surface background or a radius: a menu inside a dialog must still lift.
623
- - Don't stack two measured-height animations: the outer one snaps when a child changed its size.
@@ -1,33 +0,0 @@
1
- import SidebarApp from './index'
2
-
3
- # Preset
4
-
5
- The preset as it ships: collapsed. Press the trigger (or `[`) and the sidebar slides in; pick a thread and the active row melts over to it.
6
-
7
- <div className="h-[560px] w-full overflow-hidden rounded-xl border border-border bg-background">
8
- <SidebarApp contained />
9
- </div>
10
-
11
- # Open
12
-
13
- `defaultOpen` starts it expanded. Open the workspace switcher, a thread's "More options" or the user row: each menu grows out of its row.
14
-
15
- <div className="h-[560px] w-full overflow-hidden rounded-xl border border-border bg-background">
16
- <SidebarApp contained defaultOpen />
17
- </div>
18
-
19
- # Open on hover
20
-
21
- `openOnHover`: move to the left edge or onto the topbar's trigger and the collapsed sidebar opens; leave it and it closes. Press the trigger to keep it open, again to go back to on hover.
22
-
23
- <div className="h-[560px] w-full overflow-hidden rounded-xl border border-border bg-background">
24
- <SidebarApp contained openOnHover />
25
- </div>
26
-
27
- # Floating on the right
28
-
29
- The same shell with `variant="floating"` and `side="right"`; the shortcut becomes `]`.
30
-
31
- <div className="h-[560px] w-full overflow-hidden rounded-xl border border-border bg-background">
32
- <SidebarApp contained defaultOpen variant="floating" side="right" />
33
- </div>