@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/preset.ts DELETED
@@ -1,199 +0,0 @@
1
- import { existsSync, readdirSync, readFileSync } from 'node:fs'
2
- import { dirname, join } from 'node:path'
3
- import { fileURLToPath } from 'node:url'
4
- import type { Preset } from 'unocss'
5
-
6
- /*
7
- * The UI theme as a UnoCSS preset: the design system's own uno.config.ts
8
- * uses it, and so can a host app on UnoCSS (`@justanarthur/modo-ui/unocss`)
9
- * that generates the components' utilities itself instead of importing the
10
- * prebuilt styles.css. scripts/build-css.ts derives dist/tailwind.css from
11
- * the same `theme` and `utilities`, so the three never drift.
12
- *
13
- * Mirrors Fluid Functionalism's Tailwind v4 `@theme inline` + `@utility`
14
- * (upstream `app/globals.css` §3,
15
- * mickadesign/fluid-functionalism @ b3587bdbd83fc66c2a6aae3817ffb856cb09260b,
16
- * MIT © 2026 Micka Touillaud).
17
- *
18
- * - Requires presetWind4: the theme keys (`font`, `shadow`, `property`) are
19
- * its shape, and its default `dark: 'class'` is the `.dark` ancestor
20
- * contract the components are written against.
21
- * - Theme colors point straight at the CSS variables in tokens/colors.css and
22
- * primitives/surface/surface.css. wind4 applies an opacity modifier to a
23
- * var() color with color-mix(), so `bg-accent/12` works on the
24
- * light-dark() tokens.
25
- * - The radius scale is wind4's default on purpose: shape-context pairs
26
- * `rounded-lg` (8px) with JS pixel radii, so it must not follow `--radius`.
27
- * - `font.sans` / `font.mono` repeat the literals from tokens/typography.css
28
- * instead of `var(--font-*)`: wind4 emits theme keys as same-named
29
- * variables (`--font-sans`), and a self-reference would be a cycle.
30
- * - `utilities` bypass `theme` for the same reason (`--radius-box`).
31
- */
32
-
33
- const TYPE_ROLES = ['display', 'title', 'subtitle', 'body', 'caption', 'micro'] as const
34
- const WEIGHTS = ['normal', 'medium', 'semibold', 'bold'] as const
35
- const TIERS = ['fast', 'moderate', 'slow'] as const
36
- const RADII = ['box', 'glyph'] as const
37
-
38
- export const theme = {
39
- font: {
40
- sans: "'Inter Variable', ui-sans-serif, system-ui, sans-serif",
41
- mono: "ui-monospace, 'SF Mono', SFMono-Regular, Menlo, Consolas, monospace",
42
- },
43
- colors: {
44
- background: 'var(--background)',
45
- foreground: 'var(--foreground)',
46
- card: { DEFAULT: 'var(--card)', foreground: 'var(--card-foreground)' },
47
- muted: { DEFAULT: 'var(--muted)', foreground: 'var(--muted-foreground)' },
48
- accent: {
49
- DEFAULT: 'var(--accent)',
50
- foreground: 'var(--accent-foreground)',
51
- hover: 'var(--accent-hover)',
52
- },
53
- // The primary Button's fill and label: the ink by default, a host's brand when re-pointed.
54
- primary: { DEFAULT: 'var(--primary)', foreground: 'var(--primary-foreground)' },
55
- brand: { DEFAULT: 'var(--brand)', hover: 'var(--brand-hover)' },
56
- 'focus-ring': 'var(--focus-ring)',
57
- // The tint-direction triplet as a color, so `bg-overlay/8` is the
58
- // rgb(var(--overlay) / 0.08) ramp.
59
- overlay: 'rgb(var(--overlay))',
60
- selected: 'var(--selected)',
61
- thumb: 'var(--thumb)',
62
- picker: { edge: 'var(--picker-edge)', ring: 'var(--picker-ring)' },
63
- control: 'var(--control-border)',
64
- scrim: 'var(--scrim)',
65
- status: {
66
- success: 'var(--status-success)',
67
- loading: 'var(--status-loading)',
68
- error: 'var(--status-error)',
69
- warning: 'var(--status-warning)',
70
- info: 'var(--status-info)',
71
- action: 'var(--status-action)',
72
- },
73
- border: 'var(--border)',
74
- ring: 'var(--ring)',
75
- input: 'var(--input)',
76
- destructive: {
77
- DEFAULT: 'var(--destructive)',
78
- light: 'var(--destructive-light)',
79
- strong: 'var(--destructive-strong)',
80
- wash: {
81
- DEFAULT: 'var(--destructive-wash)',
82
- hover: 'var(--destructive-wash-hover)',
83
- active: 'var(--destructive-wash-active)',
84
- },
85
- },
86
- // Button's success variant: the status hue as text on a wash of itself.
87
- success: {
88
- strong: 'var(--success-strong)',
89
- wash: {
90
- DEFAULT: 'var(--success-wash)',
91
- hover: 'var(--success-wash-hover)',
92
- active: 'var(--success-wash-active)',
93
- },
94
- },
95
- skeleton: 'var(--skeleton)',
96
- 'image-edge': 'var(--image-edge)',
97
- 'progress-track': 'var(--progress-track)',
98
- well: 'var(--well)',
99
- hover: 'var(--hover)',
100
- active: 'var(--active)',
101
- syntax: {
102
- keyword: 'var(--syntax-keyword)',
103
- string: 'var(--syntax-string)',
104
- class: 'var(--syntax-class)',
105
- entity: 'var(--syntax-entity)',
106
- property: 'var(--syntax-property)',
107
- comment: 'var(--syntax-comment)',
108
- identifier: 'var(--syntax-identifier)',
109
- jsx: 'var(--syntax-jsx)',
110
- sign: 'var(--syntax-sign)',
111
- },
112
- surface: {
113
- 1: 'var(--surface-1)',
114
- 2: 'var(--surface-2)',
115
- 3: 'var(--surface-3)',
116
- 4: 'var(--surface-4)',
117
- 5: 'var(--surface-5)',
118
- 6: 'var(--surface-6)',
119
- 7: 'var(--surface-7)',
120
- 8: 'var(--surface-8)',
121
- },
122
- },
123
- // Arbitrary `transition-[a,b]` only accepts properties wind4 knows; FF
124
- // also tweens these two (icon stroke on hover, the Inter weight ladder).
125
- property: {
126
- 'stroke-width': 'stroke-width',
127
- 'font-variation-settings': 'font-variation-settings',
128
- },
129
- shadow: {
130
- 'surface-1': 'var(--shadow-1)',
131
- 'surface-2': 'var(--shadow-2)',
132
- 'surface-3': 'var(--shadow-3)',
133
- 'surface-4': 'var(--shadow-4)',
134
- 'surface-5': 'var(--shadow-5)',
135
- 'surface-6': 'var(--shadow-6)',
136
- 'surface-7': 'var(--shadow-7)',
137
- 'surface-8': 'var(--shadow-8)',
138
- thumb: 'var(--shadow-thumb)',
139
- 'picker-thumb': 'var(--shadow-picker-thumb)',
140
- 'picker-cursor': 'var(--shadow-picker-cursor)',
141
- swatch: 'var(--shadow-swatch)',
142
- 'swatch-hover': 'var(--shadow-swatch-hover)',
143
- 'swatch-selected': 'var(--shadow-swatch-selected)',
144
- },
145
- dropShadow: {
146
- 'picker-cursor': 'var(--drop-shadow-picker-cursor)',
147
- },
148
- }
149
-
150
- export const utilities: Record<string, Record<string, string>> = Object.fromEntries([
151
- // FF's type-scale roles (upstream `@utility text-display` …), riding the
152
- // --text-* and --leading-* tokens in tokens/typography.css; `-compact` is
153
- // the ladder's compact step.
154
- ...TYPE_ROLES.flatMap(role =>
155
- ['', '-compact'].map(step => [
156
- `text-${role}${step}`,
157
- { 'font-size': `var(--text-${role}${step})`, 'line-height': `var(--leading-${role})` },
158
- ]),
159
- ),
160
- // The Inter weight ladder (font-variation-settings, not font-weight).
161
- ...WEIGHTS.map(weight => [`weight-${weight}`, { 'font-variation-settings': `var(--weight-${weight})` }]),
162
- // The motion tiers of tokens/motion.css as CSS durations and delays.
163
- ...TIERS.flatMap(tier =>
164
- ['', '-exit'].flatMap(step => [
165
- [
166
- `duration-${tier}${step}`,
167
- { '--un-duration': `var(--duration-${tier}${step})`, 'transition-duration': `var(--duration-${tier}${step})` },
168
- ],
169
- [`delay-${tier}${step}`, { 'transition-delay': `var(--duration-${tier}${step})` }],
170
- ]),
171
- ),
172
- ...RADII.map(radius => [`rounded-${radius}`, { 'border-radius': `var(--radius-${radius})` }]),
173
- ])
174
-
175
- // In the published package this file is dist/preset.js beside the built
176
- // components. A host's UnoCSS extracts their classes through
177
- // `content: { inline: [modoUiContent] }` in its own config: the integrations
178
- // read `content` from the user config only (never a preset's), and drop
179
- // `filesystem` files their pipeline filter rejects, which has no `.js`. In the
180
- // repo these dirs hold no .js, so the docs site scans the source itself.
181
- const dist = dirname(fileURLToPath(import.meta.url))
182
- export const COMPONENT_DIRS = ['shared', 'lib', 'primitives', 'components', 'blocks']
183
-
184
- export function modoUiContent(): string {
185
- return COMPONENT_DIRS.map(dir => join(dist, dir))
186
- .filter(dir => existsSync(dir))
187
- .flatMap(dir =>
188
- readdirSync(dir, { recursive: true, encoding: 'utf8' })
189
- .filter(file => file.endsWith('.js'))
190
- .map(file => readFileSync(join(dir, file), 'utf8')),
191
- )
192
- .join('\n')
193
- }
194
-
195
- export function presetModoUi(): Preset {
196
- return { name: '@justanarthur/modo-ui', theme, rules: Object.entries(utilities) }
197
- }
198
-
199
- export default presetModoUi
@@ -1,27 +0,0 @@
1
- # TSX
2
-
3
- ```tsx
4
- import { Button } from '@/components/button'
5
-
6
- // Every token type has its own color.
7
- export function Save({ busy }: { busy: boolean }) {
8
- return <Button loading={busy}>Save changes</Button>
9
- }
10
- ```
11
-
12
- # Other languages
13
-
14
- ```css
15
- .card {
16
- background: var(--surface-3);
17
- border-radius: 12px;
18
- }
19
- ```
20
-
21
- ```sh
22
- bun add sugar-high # one dependency
23
- ```
24
-
25
- ```text
26
- Plain text keeps its own line breaks.
27
- ```
@@ -1,80 +0,0 @@
1
- import { Fragment } from 'react'
2
- import type { TokenType } from 'sugar-high'
3
- import { parse } from 'sugar-high/core'
4
- import { type Language, lang, languages } from 'sugar-high/lang'
5
- import { SURFACE_BG } from '../../lib/surface-classes'
6
- import { useSurface } from '../../lib/surface-context'
7
- import { cn } from '../../lib/utils'
8
- import ScrollArea from '../scroll-area'
9
-
10
- // Literal class names so UnoCSS's extractor sees every one (same reason as
11
- // SURFACE_BG); colors are the --syntax-* tokens in tokens/colors.css.
12
- const TOKEN_CLASS: Record<TokenType, string> = {
13
- keyword: 'text-syntax-keyword',
14
- string: 'text-syntax-string',
15
- class: 'text-syntax-class',
16
- entity: 'text-syntax-entity',
17
- property: 'text-syntax-property',
18
- comment: 'text-syntax-comment italic',
19
- identifier: 'text-syntax-identifier',
20
- jsxliterals: 'text-syntax-jsx',
21
- sign: 'text-syntax-sign',
22
- break: '',
23
- space: '',
24
- }
25
-
26
- function highlight(source: string, language: Language['id']) {
27
- const config = languages.find(l => l.id === language)?.config
28
- return parse(source, config).lines.map(line => (
29
- <Fragment key={line.index}>
30
- {line.index > 0 && '\n'}
31
- {line.tokens.map((t, i) => (
32
- <span key={i} className={TOKEN_CLASS[t.type]}>
33
- {t.value}
34
- </span>
35
- ))}
36
- </Fragment>
37
- ))
38
- }
39
-
40
- /**
41
- * Source code in the theme's syntax colors, one surface step above whatever
42
- * it sits on.
43
- *
44
- * sugar-high tokenizes; each token type takes a `--syntax-*` token from
45
- * tokens/colors.css, so code follows light and dark like everything else.
46
- * Long lines scroll sideways under a fading edge instead of wrapping. It is
47
- * also the docs chrome's Code slot: every example's source and every fenced
48
- * block on these pages renders through it.
49
- *
50
- * @example {@include ./examples.mdx}
51
- */
52
- export default function Code({
53
- children,
54
- language = 'tsx',
55
- className,
56
- }: {
57
- /** The source to show; surrounding blank lines are trimmed. */
58
- children: string
59
- /** Fence name, alias or extension (`tsx`, `css`, `sh`, …). Unknown names render as plain text. Defaults to `'tsx'`. */
60
- language?: string
61
- /** Extra classes for the frame. */
62
- className?: string
63
- }) {
64
- const level = Math.min(useSurface() + 1, 8)
65
- const source = children.trim()
66
- const id = lang(language)
67
- return (
68
- <ScrollArea
69
- orientation="horizontal"
70
- viewportClassName="scroll-fade-x"
71
- className={cn('rounded-xl', SURFACE_BG[level], className)}
72
- >
73
- <pre className="m-0 w-max min-w-full p-4 font-mono text-caption leading-relaxed text-foreground">
74
- <code>{id && id !== 'plaintext' ? highlight(source, id) : source}</code>
75
- </pre>
76
- </ScrollArea>
77
- )
78
- }
79
-
80
- export { Code }
@@ -1,173 +0,0 @@
1
- /*
2
- * Local addition (not part of Fluid Functionalism): the bad side of the Craft
3
- * page. Each demo breaks exactly one rule of the system on purpose and keeps
4
- * everything else on tokens, so the comparison shows only that rule. Never
5
- * copy these into an item.
6
- */
7
-
8
- import { Popover as PopoverPrimitive } from '@base-ui/react/popover'
9
- import { motion } from 'motion/react'
10
- import { useState } from 'react'
11
- import Button from '../../components/button'
12
- import { useIcon } from '../../lib/icon-context'
13
- import { useShape } from '../../lib/shape-context'
14
- import { useSize } from '../../lib/size-context'
15
- import { spring } from '../../lib/springs'
16
- import { SURFACE_BG, SURFACE_SHADOW } from '../../lib/surface-classes'
17
- import { useSurface } from '../../lib/surface-context'
18
- import { cn } from '../../lib/utils'
19
-
20
- /** The selected label turns bold on the bare text node, so it widens and shoves its neighbours. */
21
- export function BoldTabs({ labels }: { labels: string[] }) {
22
- const [active, setActive] = useState(0)
23
- const size = useSize()
24
- const shape = useShape()
25
-
26
- return (
27
- <div className="flex items-center gap-1">
28
- {labels.map((label, i) => (
29
- <button
30
- key={label}
31
- type="button"
32
- onClick={() => setActive(i)}
33
- className={cn(
34
- 'cursor-pointer px-3 outline-none',
35
- size.control,
36
- size.text,
37
- shape.bg,
38
- i === active ? 'bg-hover font-bold text-foreground' : 'text-muted-foreground',
39
- )}
40
- >
41
- {label}
42
- </button>
43
- ))}
44
- </div>
45
- )
46
- }
47
-
48
- /** Each row lights itself on `:hover`, so the light blinks off in every gap and jumps between rows. */
49
- export function RowHover({ items }: { items: string[] }) {
50
- const size = useSize()
51
- const shape = useShape()
52
-
53
- return (
54
- <div className="flex w-56 flex-col gap-1 p-1">
55
- {items.map(item => (
56
- <button
57
- key={item}
58
- type="button"
59
- className={cn(
60
- 'flex cursor-pointer items-center text-left text-foreground outline-none hover:bg-hover',
61
- size.control,
62
- size.itemPx,
63
- size.text,
64
- shape.bg,
65
- )}
66
- >
67
- {item}
68
- </button>
69
- ))}
70
- </div>
71
- )
72
- }
73
-
74
- /** Presses by scaling: the same 4% is 10px sideways on a wide button and under 2px vertically. */
75
- export function ScalePress() {
76
- const size = useSize()
77
- const shape = useShape()
78
- const button = cn(
79
- 'flex cursor-pointer items-center justify-center bg-foreground px-4 text-background outline-none',
80
- size.control,
81
- size.text,
82
- shape.button,
83
- )
84
-
85
- return (
86
- <div className="flex w-64 flex-col items-start gap-3">
87
- <motion.button type="button" whileTap={{ scale: 0.96 }} transition={spring.fast} className={button}>
88
- Save
89
- </motion.button>
90
- <motion.button type="button" whileTap={{ scale: 0.96 }} transition={spring.fast} className={cn(button, 'w-full')}>
91
- Continue to checkout
92
- </motion.button>
93
- </div>
94
- )
95
- }
96
-
97
- /** Only the small icon copies, and its feedback snaps from one glyph to the other. */
98
- export function IconCopy({ value }: { value: string }) {
99
- const [copied, setCopied] = useState(false)
100
- const size = useSize()
101
- const shape = useShape()
102
- const CopyIcon = useIcon('copy')
103
- const CheckIcon = useIcon('check')
104
-
105
- const copy = () => {
106
- void navigator.clipboard?.writeText(value)
107
- setCopied(true)
108
- setTimeout(() => setCopied(false), 1500)
109
- }
110
-
111
- return (
112
- <div className={cn('flex w-64 items-center gap-1 pr-1 pl-2.5 ring-1 ring-border', size.control, shape.input)}>
113
- <span className={cn('min-w-0 flex-1 truncate font-mono text-foreground', size.text)}>{value}</span>
114
- <Button variant="ghost" size="icon-compact" aria-label="Copy" onClick={copy}>
115
- {copied ? <CheckIcon /> : <CopyIcon />}
116
- </Button>
117
- </div>
118
- )
119
- }
120
-
121
- /** The thumb jumps from one end to the other: there is no travel to follow. */
122
- export function SnapSwitch({ label }: { label: string }) {
123
- const [on, setOn] = useState(false)
124
- const size = useSize()
125
-
126
- return (
127
- <button
128
- type="button"
129
- role="switch"
130
- aria-checked={on}
131
- onClick={() => setOn(!on)}
132
- className="flex cursor-pointer items-center gap-2.5 outline-none"
133
- >
134
- <span
135
- className={cn('flex h-5 w-[34px] rounded-full p-0.5', on ? 'justify-end bg-brand' : 'justify-start bg-accent')}
136
- >
137
- <span className="size-4 rounded-full bg-thumb shadow-thumb" />
138
- </span>
139
- <span className={cn(size.text, on ? 'text-foreground' : 'text-muted-foreground')}>{label}</span>
140
- </button>
141
- )
142
- }
143
-
144
- /** The panel pops in beside the trigger with no link to it, and vanishes the same way. */
145
- export function PlainPopover({ label, title, description }: { label: string; title: string; description: string }) {
146
- const shape = useShape()
147
- const level = Math.min(useSurface() + 2, 8)
148
-
149
- return (
150
- <PopoverPrimitive.Root>
151
- <PopoverPrimitive.Trigger render={<Button variant="secondary">{label}</Button>} />
152
- <PopoverPrimitive.Portal>
153
- <PopoverPrimitive.Positioner sideOffset={12} className="z-50 outline-none">
154
- <PopoverPrimitive.Popup
155
- className={cn(
156
- 'flex w-60 flex-col gap-1 p-4 outline-none',
157
- SURFACE_BG[level],
158
- SURFACE_SHADOW[3],
159
- shape.container,
160
- )}
161
- >
162
- <PopoverPrimitive.Title className="text-subtitle weight-semibold text-foreground">
163
- {title}
164
- </PopoverPrimitive.Title>
165
- <PopoverPrimitive.Description className="text-caption text-muted-foreground">
166
- {description}
167
- </PopoverPrimitive.Description>
168
- </PopoverPrimitive.Popup>
169
- </PopoverPrimitive.Positioner>
170
- </PopoverPrimitive.Portal>
171
- </PopoverPrimitive.Root>
172
- )
173
- }
@@ -1,142 +0,0 @@
1
- import Craft from './index'
2
- import { BoldTabs, IconCopy, PlainPopover, RowHover, ScalePress, SnapSwitch } from './demos'
3
- import Button from '../../components/button'
4
- import Copy from '../../components/copy'
5
- import Switch from '../../components/inputs/switch'
6
- import TabsSubtle from '../../components/navigation/tabs-subtle'
7
- import Popover from '../../components/overlays/popover'
8
- import FluidHover from '../fluid-hover'
9
- import Elevated from '../surface'
10
-
11
- # Interaction
12
-
13
- ## Weight without reflow
14
-
15
- Click through the tabs on each side and watch the labels next to the one you picked.
16
-
17
- <Craft
18
- bad={<BoldTabs labels={['Overview', 'Activity', 'Settings']} />}
19
- badNote="The selected label gets wider, so every tab after it shifts."
20
- good={
21
- <TabsSubtle defaultSelectedIndex={0}>
22
- {['Overview', 'Activity', 'Settings'].map((label, i) => (
23
- <TabsSubtle.Item key={label} index={i} label={label} />
24
- ))}
25
- </TabsSubtle>
26
- }
27
- goodNote="An invisible semibold copy holds the width, and the weight is paired with an optical size. Nothing moves."
28
- />
29
-
30
- ## Hover that never blinks
31
-
32
- Sweep the pointer slowly down each list, through the gaps between rows.
33
-
34
- <Craft
35
- bad={<RowHover items={['Profile', 'Billing', 'Team', 'Notifications']} />}
36
- badNote="Each row lights itself, so the light blinks off in every gap and jumps from row to row."
37
- good={<FluidHover className="w-56 p-1" items={['Profile', 'Billing', 'Team', 'Notifications']} />}
38
- goodNote="One highlight sits on the nearest row and melts to the next. A click in a gap lands on the lit row."
39
- />
40
-
41
- ## Press that keeps its shape
42
-
43
- Press and hold the short button and the wide one on each side.
44
-
45
- <Craft
46
- bad={<ScalePress />}
47
- badNote="A scale warps with width: the wide button loses 10px sideways and under 2px vertically."
48
- good={
49
- <div className="flex w-64 flex-col items-start gap-3">
50
- <Button>Save</Button>
51
- <Button className="w-full">Continue to checkout</Button>
52
- </div>
53
- }
54
- goodNote="The fill shrinks exactly 1px per side at any width, releasing slower than it presses."
55
- />
56
-
57
- ## Copy from anywhere
58
-
59
- Copy the value on each side.
60
-
61
- <Craft
62
- bad={<IconCopy value="npm i @justanarthur/modo" />}
63
- badNote="Only a 28px icon copies, and its feedback snaps from one glyph to the other."
64
- good={
65
- <div className="w-64">
66
- <Copy value="npm i @justanarthur/modo" />
67
- </div>
68
- }
69
- goodNote="The whole field is the target, and the glyph melts into a check on a success disc."
70
- />
71
-
72
- ## The ring is for the keyboard
73
-
74
- Click each button, then press Tab to reach it from the keyboard.
75
-
76
- <Craft
77
- bad={<Button variant="secondary" className="focus:ring-1 focus:ring-focus-ring">Save draft</Button>}
78
- badNote="The ring shows on every click and stays there, so a mouse user sees a stuck outline."
79
- good={<Button variant="secondary">Save draft</Button>}
80
- goodNote="The ring appears only when focus comes from the keyboard, where it tells you where you are."
81
- />
82
-
83
- # Motion and surfaces
84
-
85
- ## Overlays come from somewhere
86
-
87
- Open and close the panel on each side.
88
-
89
- <Craft
90
- bad={<PlainPopover label="Details" title="Shipping" description="Arrives in 2–3 working days." />}
91
- badNote="The panel pops in beside the button with nothing linking the two, and vanishes the same way."
92
- good={
93
- <Popover>
94
- <Popover.Trigger render={<Button variant="secondary">Details</Button>} />
95
- <Popover.Content className="w-60">
96
- <Popover.Title>Shipping</Popover.Title>
97
- <Popover.Description>Arrives in 2–3 working days.</Popover.Description>
98
- </Popover.Content>
99
- </Popover>
100
- }
101
- goodNote="The panel melts out of the button through a liquid neck, lets go, and closes back into it."
102
- />
103
-
104
- ## Indicators travel
105
-
106
- Toggle each switch a few times.
107
-
108
- <Craft
109
- bad={<SnapSwitch label="Notifications" />}
110
- badNote="The thumb teleports from one end to the other. There is no movement to read the change from."
111
- good={<Switch label="Notifications" />}
112
- goodNote="The thumb travels on a spring and stretches as it goes, so the change reads at a glance."
113
- />
114
-
115
- ## Surfaces lift at any depth
116
-
117
- A menu inside a dialog, on each side. Check it in both themes.
118
-
119
- <Craft
120
- bad={
121
- <div className="flex w-60 flex-col gap-3 rounded-xl bg-surface-5 p-4 shadow-surface-5">
122
- <span className="text-subtitle weight-semibold text-foreground">Move to</span>
123
- <div className="flex flex-col rounded-xl bg-surface-5 p-1">
124
- <span className="flex h-9 items-center px-2 text-body text-foreground">Inbox</span>
125
- <span className="flex h-9 items-center px-2 text-body text-foreground">Archive</span>
126
- <span className="flex h-9 items-center px-2 text-body text-foreground">Trash</span>
127
- </div>
128
- </div>
129
- }
130
- badNote="The menu paints a fixed level. Inside the dialog it lands on the dialog's own level and melts into it."
131
- good={
132
- <Elevated offset={4} className="flex w-60 flex-col gap-3 rounded-xl p-4">
133
- <span className="text-subtitle weight-semibold text-foreground">Move to</span>
134
- <Elevated offset={2} shadowLevel={3} className="flex flex-col rounded-xl p-1">
135
- <span className="flex h-9 items-center px-2 text-body text-foreground">Inbox</span>
136
- <span className="flex h-9 items-center px-2 text-body text-foreground">Archive</span>
137
- <span className="flex h-9 items-center px-2 text-body text-foreground">Trash</span>
138
- </Elevated>
139
- </Elevated>
140
- }
141
- goodNote="The menu lifts 2 levels above whatever it sits on, so it reads as a menu at any depth."
142
- />