@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.
- package/README.md +66 -164
- package/dist/base.css +4 -141
- package/dist/blocks/sidebar-app/index.js +26 -40
- package/dist/components/AI/input-message/index.js +16 -23
- package/dist/components/AI/thinking-indicator/index.js +6 -9
- package/dist/components/accordion/index.d.ts +11 -39
- package/dist/components/accordion/index.js +13 -18
- package/dist/components/badge/index.d.ts +11 -18
- package/dist/components/badge/index.js +7 -12
- package/dist/components/button/index.d.ts +17 -53
- package/dist/components/button/index.js +6 -11
- package/dist/components/card/index.d.ts +9 -32
- package/dist/components/card/index.js +11 -17
- package/dist/components/copy/index.d.ts +8 -41
- package/dist/components/copy/index.js +9 -15
- package/dist/components/inputs/checkbox/index.d.ts +9 -28
- package/dist/components/inputs/checkbox/index.js +13 -18
- package/dist/components/inputs/color-picker/index.d.ts +14 -22
- package/dist/components/inputs/color-picker/index.js +18 -26
- package/dist/components/inputs/combobox/index.d.ts +20 -85
- package/dist/components/inputs/combobox/index.js +18 -27
- package/dist/components/inputs/date-time/calendar/index.d.ts +18 -24
- package/dist/components/inputs/date-time/calendar/index.js +11 -15
- package/dist/components/inputs/date-time/date-picker/index.d.ts +16 -105
- package/dist/components/inputs/date-time/date-picker/index.js +25 -35
- package/dist/components/inputs/date-time/date-range-picker/index.d.ts +12 -106
- package/dist/components/inputs/date-time/date-range-picker/index.js +24 -35
- package/dist/components/inputs/date-time/duration-picker/index.d.ts +13 -66
- package/dist/components/inputs/date-time/duration-picker/index.js +24 -33
- package/dist/components/inputs/date-time/month-picker/index.d.ts +10 -60
- package/dist/components/inputs/date-time/month-picker/index.js +23 -32
- package/dist/components/inputs/date-time/time-picker/index.d.ts +10 -58
- package/dist/components/inputs/date-time/time-picker/index.js +24 -33
- package/dist/components/inputs/input/index.d.ts +13 -95
- package/dist/components/inputs/input/index.js +9 -18
- package/dist/components/inputs/radio/index.d.ts +5 -20
- package/dist/components/inputs/radio/index.js +12 -16
- package/dist/components/inputs/search/index.d.ts +3 -3
- package/dist/components/inputs/search/index.js +18 -26
- package/dist/components/inputs/select/index.d.ts +23 -99
- package/dist/components/inputs/select/index.js +14 -29
- package/dist/components/inputs/slider/index.d.ts +0 -9
- package/dist/components/inputs/slider/index.js +5 -8
- package/dist/components/inputs/switch/index.d.ts +2 -8
- package/dist/components/inputs/switch/index.js +12 -15
- package/dist/components/inputs/textarea/index.d.ts +1 -20
- package/dist/components/inputs/textarea/index.js +6 -9
- package/dist/components/navigation/sidebar/index.d.ts +21 -44
- package/dist/components/navigation/sidebar/index.js +31 -42
- package/dist/components/navigation/tabs/index.d.ts +2 -8
- package/dist/components/navigation/tabs/index.js +10 -15
- package/dist/components/navigation/tabs-subtle/index.js +10 -13
- package/dist/components/overlays/alert-dialog/index.d.ts +16 -135
- package/dist/components/overlays/alert-dialog/index.js +13 -23
- package/dist/components/overlays/command/index.d.ts +20 -25
- package/dist/components/overlays/command/index.js +17 -25
- package/dist/components/overlays/context-menu/index.d.ts +17 -39
- package/dist/components/overlays/context-menu/index.js +18 -29
- package/dist/components/overlays/dialog/index.d.ts +16 -42
- package/dist/components/overlays/dialog/index.js +12 -20
- package/dist/components/overlays/dropdown/index.d.ts +34 -304
- package/dist/components/overlays/dropdown/index.js +17 -44
- package/dist/components/overlays/popover/index.d.ts +12 -38
- package/dist/components/overlays/popover/index.js +9 -13
- package/dist/components/overlays/preview-card/index.js +8 -12
- package/dist/components/overlays/sheet/index.d.ts +8 -25
- package/dist/components/overlays/sheet/index.js +13 -19
- package/dist/components/overlays/toast/index.d.ts +50 -209
- package/dist/components/overlays/toast/index.js +10 -23
- package/dist/components/overlays/tooltip/index.d.ts +21 -123
- package/dist/components/overlays/tooltip/index.js +6 -16
- package/dist/components/table/index.d.ts +8 -63
- package/dist/components/table/index.js +9 -20
- package/dist/index.d.ts +1048 -2999
- package/dist/index.js +82 -231
- package/dist/preset.d.ts +0 -22
- package/dist/preset.js +2 -24
- package/dist/primitives/code/index.js +5 -8
- package/dist/primitives/craft/index.js +6 -10
- package/dist/primitives/fluid-hover/index.js +8 -10
- package/dist/primitives/morph/index.js +10 -16
- package/dist/primitives/motion/index.js +8 -11
- package/dist/primitives/scroll-area/index.js +3 -5
- package/dist/primitives/sizes/index.js +4 -6
- package/dist/primitives/surface/index.js +4 -6
- package/dist/shared/{components-4y816hwp.js → components-0q0sqfh4.js} +49 -27
- package/dist/shared/components-0sn7ypjw.js +61 -0
- package/dist/shared/{components-vc864c51.js → components-11da9ajg.js} +5 -8
- package/dist/shared/components-1434p1mh.js +123 -0
- package/dist/shared/{components-t2a3qmy9.js → components-1z6tdadk.js} +24 -40
- package/dist/shared/{components-qs4rkqsj.js → components-27nnvrwe.js} +14 -15
- package/dist/shared/{components-av5t26rc.js → components-2dxkv6zm.js} +7 -8
- package/dist/shared/{components-wqrvqq5p.js → components-2ecg8svx.js} +152 -234
- package/dist/shared/{components-3ydr2fqe.js → components-2ph6t61s.js} +34 -37
- package/dist/shared/{components-6gk118w3.js → components-39jq9va1.js} +24 -29
- package/dist/shared/components-3ky44908.js +9 -0
- package/dist/shared/{components-y1qvbawa.js → components-3mkepka5.js} +25 -28
- package/dist/shared/{components-xqszvkj4.js → components-4700p9kz.js} +22 -24
- package/dist/shared/{components-yhgq0qxx.js → components-59efxjd9.js} +12 -13
- package/dist/shared/{components-9j9abkct.js → components-5vgpnxgy.js} +27 -51
- package/dist/shared/{components-8tt3xbb5.js → components-5xc2j8jz.js} +18 -19
- package/dist/shared/{components-jymmaevv.js → components-6p8tfcd6.js} +29 -57
- package/dist/shared/{components-4nck8acq.js → components-7r3etddy.js} +54 -19
- package/dist/shared/{components-skfd7kff.js → components-8snj490h.js} +32 -78
- package/dist/shared/{components-ctqmge8t.js → components-b0eac83j.js} +30 -9
- package/dist/shared/{components-9sttq78t.js → components-b2wyq2cq.js} +59 -41
- package/dist/shared/{components-vkwq2k96.js → components-b3c5et5b.js} +38 -49
- package/dist/shared/{components-rrbpmfx4.js → components-c6s6b43g.js} +2 -3
- package/dist/shared/{components-pw06rbxq.js → components-chacnk61.js} +19 -19
- package/dist/shared/{components-71nbt03m.js → components-cv16mryv.js} +7 -26
- package/dist/shared/{components-eqze3y30.js → components-d6xtjht3.js} +30 -35
- package/dist/shared/{components-5y5shqfd.js → components-dk0gjr5a.js} +18 -19
- package/dist/shared/{components-khspp26b.js → components-fzrq6tr3.js} +34 -37
- package/dist/shared/{components-km7fhgbk.js → components-gc5vtq2f.js} +30 -66
- package/dist/shared/components-gf5s6ap9.js +42 -0
- package/dist/shared/{components-qqcmtrbv.js → components-gz8zf3ec.js} +55 -56
- package/dist/shared/{components-mattt5jp.js → components-h2ajmhwn.js} +35 -107
- package/dist/shared/{components-awra5sff.js → components-hqeq3w9q.js} +16 -24
- package/dist/shared/{components-5tzhqbcw.js → components-hw9yk32z.js} +24 -36
- package/dist/shared/components-hyq23phv.js +310 -0
- package/dist/shared/{components-8mt5bsv6.js → components-jbbmdr74.js} +22 -41
- package/dist/shared/{components-dcc02hs2.js → components-jjw69c4c.js} +4 -7
- package/dist/shared/{components-2syq4mwc.js → components-jthe1pwb.js} +420 -139
- package/dist/shared/{components-r7q1zm7r.js → components-jwst3vtj.js} +76 -224
- package/dist/shared/{components-qdm3yh26.js → components-kvr7f9hy.js} +10 -19
- package/dist/shared/{components-s8yqk2dc.js → components-kwa6mrf9.js} +11 -46
- package/dist/shared/{components-de99ykt7.js → components-men63rwj.js} +2 -3
- package/dist/shared/{components-6b0zb8z3.js → components-mjthm1kf.js} +9 -13
- package/dist/shared/{components-2c64r8c9.js → components-n42c79bz.js} +22 -23
- package/dist/shared/{components-tz1fv35x.js → components-n7mjr357.js} +2 -3
- package/dist/shared/components-ng72k97e.js +128 -0
- package/dist/shared/{components-dyae0y7h.js → components-pbmqctfa.js} +65 -169
- package/dist/shared/{components-px2zm7dc.js → components-q5xj5c16.js} +8 -9
- package/dist/shared/components-raknhppb.js +64 -0
- package/dist/shared/{components-8rb25gbe.js → components-rr7a6ja9.js} +27 -59
- package/dist/shared/{components-5012r6gr.js → components-s083f38z.js} +34 -164
- package/dist/shared/components-s5ngg32c.js +267 -0
- package/dist/shared/components-sn1rxx1d.js +143 -0
- package/dist/shared/{components-r8eqs7gz.js → components-ta7shw28.js} +4 -4
- package/dist/shared/{components-9as3rf68.js → components-vc7vq5nz.js} +3 -6
- package/dist/shared/{components-ft3zdc79.js → components-vfbhxf5r.js} +5 -6
- package/dist/shared/components-vynjtrk6.js +19 -0
- package/dist/shared/{components-w0xq6q9k.js → components-w1r67ag9.js} +149 -294
- package/dist/shared/{components-z0bqtvcp.js → components-w90endve.js} +72 -71
- package/dist/shared/{components-t5pk5nmc.js → components-wvp1m52g.js} +102 -149
- package/dist/shared/components-wy9jpqny.js +146 -0
- package/dist/shared/{components-5sxjeh6h.js → components-y9y0g8er.js} +28 -52
- package/dist/shared/components-ypp01w3p.js +986 -0
- package/dist/shared/{components-t50hrswb.js → components-zfnmn5d4.js} +36 -82
- package/dist/shared/{components-jqpefjsn.js → components-zrkzcayz.js} +6 -54
- package/dist/shared/{components-vf45j12c.js → components-zx6b6yby.js} +18 -4
- package/dist/styles.css +32 -320
- package/dist/tailwind.css +0 -16
- package/dist/tokens.css +0 -67
- package/package.json +4 -227
- package/DESIGN.md +0 -623
- package/blocks/sidebar-app/examples.mdx +0 -33
- package/blocks/sidebar-app/index.tsx +0 -218
- package/blocks/sidebar-app/inset-topbar.tsx +0 -25
- package/blocks/sidebar-app/menu-grid.ts +0 -26
- package/blocks/sidebar-app/nav-data.ts +0 -36
- package/blocks/sidebar-app/search-field.tsx +0 -48
- package/blocks/sidebar-app/user-footer.tsx +0 -67
- package/blocks/sidebar-app/workspace-header.tsx +0 -129
- package/components/AI/input-message/examples.mdx +0 -130
- package/components/AI/input-message/file-thumbnail.tsx +0 -173
- package/components/AI/input-message/index.tsx +0 -1385
- package/components/AI/thinking-indicator/examples.mdx +0 -27
- package/components/AI/thinking-indicator/index.tsx +0 -210
- package/components/accordion/examples.mdx +0 -233
- package/components/accordion/index.tsx +0 -1071
- package/components/avatar/examples.mdx +0 -95
- package/components/avatar/index.tsx +0 -129
- package/components/badge/change-demo.tsx +0 -29
- package/components/badge/examples.mdx +0 -124
- package/components/badge/index.tsx +0 -225
- package/components/badge/variants.ts +0 -73
- package/components/button/examples.mdx +0 -168
- package/components/button/index.tsx +0 -424
- package/components/button/loading-demo.tsx +0 -25
- package/components/button/variants.ts +0 -168
- package/components/card/examples.mdx +0 -251
- package/components/card/index.tsx +0 -1070
- package/components/copy/examples.mdx +0 -125
- package/components/copy/index.tsx +0 -662
- package/components/inputs/checkbox/examples.mdx +0 -87
- package/components/inputs/checkbox/index.tsx +0 -611
- package/components/inputs/checkbox/select-all-demo.tsx +0 -48
- package/components/inputs/color-picker/examples.mdx +0 -111
- package/components/inputs/color-picker/index.tsx +0 -1981
- package/components/inputs/color-picker/variants.ts +0 -401
- package/components/inputs/combobox/examples.mdx +0 -366
- package/components/inputs/combobox/index.tsx +0 -1527
- package/components/inputs/combobox/remote-demo.tsx +0 -105
- package/components/inputs/date-time/calendar/examples.mdx +0 -45
- package/components/inputs/date-time/calendar/index.tsx +0 -370
- package/components/inputs/date-time/calendar/use-month-window.ts +0 -173
- package/components/inputs/date-time/date-picker/examples.mdx +0 -243
- package/components/inputs/date-time/date-picker/index.tsx +0 -476
- package/components/inputs/date-time/date-picker/masked-date-input.tsx +0 -348
- package/components/inputs/date-time/date-range-picker/examples.mdx +0 -93
- package/components/inputs/date-time/date-range-picker/index.tsx +0 -525
- package/components/inputs/date-time/duration-picker/examples.mdx +0 -40
- package/components/inputs/date-time/duration-picker/index.tsx +0 -253
- package/components/inputs/date-time/month-picker/examples.mdx +0 -45
- package/components/inputs/date-time/month-picker/index.tsx +0 -254
- package/components/inputs/date-time/picker-shell.tsx +0 -581
- package/components/inputs/date-time/time-columns.tsx +0 -94
- package/components/inputs/date-time/time-picker/examples.mdx +0 -57
- package/components/inputs/date-time/time-picker/index.tsx +0 -227
- package/components/inputs/field/examples.mdx +0 -117
- package/components/inputs/field/index.tsx +0 -268
- package/components/inputs/file-dropzone/examples.mdx +0 -83
- package/components/inputs/file-dropzone/file-row.tsx +0 -201
- package/components/inputs/file-dropzone/index.tsx +0 -316
- package/components/inputs/file-dropzone/upload-demo.tsx +0 -67
- package/components/inputs/file-dropzone/variants.ts +0 -94
- package/components/inputs/input/examples.mdx +0 -166
- package/components/inputs/input/index.tsx +0 -494
- package/components/inputs/input/password-demo.tsx +0 -30
- package/components/inputs/label/examples.mdx +0 -67
- package/components/inputs/label/index.tsx +0 -85
- package/components/inputs/number-input/examples.mdx +0 -69
- package/components/inputs/number-input/index.tsx +0 -221
- package/components/inputs/radio/examples.mdx +0 -77
- package/components/inputs/radio/index.tsx +0 -636
- package/components/inputs/search/examples.mdx +0 -74
- package/components/inputs/search/index.tsx +0 -333
- package/components/inputs/select/examples.mdx +0 -296
- package/components/inputs/select/index.tsx +0 -1044
- package/components/inputs/select/variants.ts +0 -32
- package/components/inputs/slider/examples.mdx +0 -153
- package/components/inputs/slider/index.tsx +0 -1867
- package/components/inputs/switch/examples.mdx +0 -96
- package/components/inputs/switch/index.tsx +0 -504
- package/components/inputs/textarea/examples.mdx +0 -126
- package/components/inputs/textarea/index.tsx +0 -207
- package/components/navigation/navigation-menu/examples.mdx +0 -136
- package/components/navigation/navigation-menu/index.tsx +0 -704
- package/components/navigation/pagination/examples.mdx +0 -74
- package/components/navigation/pagination/index.tsx +0 -401
- package/components/navigation/sidebar/examples.mdx +0 -325
- package/components/navigation/sidebar/index.tsx +0 -453
- package/components/navigation/sidebar/sidebar-core.tsx +0 -1408
- package/components/navigation/sidebar/sidebar-menu.tsx +0 -1495
- package/components/navigation/sidebar/sidebar.css +0 -74
- package/components/navigation/sidebar/variants.ts +0 -55
- package/components/navigation/tabs/examples.mdx +0 -89
- package/components/navigation/tabs/index.tsx +0 -494
- package/components/navigation/tabs-subtle/examples.mdx +0 -49
- package/components/navigation/tabs-subtle/index.tsx +0 -512
- package/components/overlays/alert-dialog/examples.mdx +0 -123
- package/components/overlays/alert-dialog/index.tsx +0 -276
- package/components/overlays/alert-dialog/pending-demo.tsx +0 -36
- package/components/overlays/command/examples.mdx +0 -113
- package/components/overlays/command/index.tsx +0 -425
- package/components/overlays/context-menu/examples.mdx +0 -56
- package/components/overlays/context-menu/index.tsx +0 -279
- package/components/overlays/dialog/examples.mdx +0 -165
- package/components/overlays/dialog/index.tsx +0 -451
- package/components/overlays/dropdown/dropdown-search.tsx +0 -395
- package/components/overlays/dropdown/examples.mdx +0 -444
- package/components/overlays/dropdown/index.tsx +0 -1241
- package/components/overlays/dropdown/menu-item.tsx +0 -510
- package/components/overlays/dropdown/menu-parts.tsx +0 -725
- package/components/overlays/popover/anchored-demo.tsx +0 -59
- package/components/overlays/popover/examples.mdx +0 -203
- package/components/overlays/popover/index.tsx +0 -317
- package/components/overlays/preview-card/examples.mdx +0 -61
- package/components/overlays/preview-card/index.tsx +0 -204
- package/components/overlays/sheet/examples.mdx +0 -101
- package/components/overlays/sheet/index.tsx +0 -307
- package/components/overlays/toast/examples.mdx +0 -85
- package/components/overlays/toast/global-demo.tsx +0 -72
- package/components/overlays/toast/index.tsx +0 -544
- package/components/overlays/toast/manager.ts +0 -193
- package/components/overlays/tooltip/examples.mdx +0 -106
- package/components/overlays/tooltip/index.tsx +0 -539
- package/components/progress/examples.mdx +0 -59
- package/components/progress/index.tsx +0 -174
- package/components/progress/progress.css +0 -49
- package/components/progress/step-demo.tsx +0 -27
- package/components/table/examples.mdx +0 -188
- package/components/table/index.tsx +0 -535
- package/components/table/sort-demo.tsx +0 -61
- package/dist/components/avatar/index.d.ts +0 -46
- package/dist/components/avatar/index.js +0 -19
- package/dist/components/badge/variants.d.ts +0 -33
- package/dist/components/badge/variants.js +0 -10
- package/dist/components/button/variants.d.ts +0 -39
- package/dist/components/button/variants.js +0 -8
- package/dist/components/inputs/color-picker/variants.d.ts +0 -61
- package/dist/components/inputs/color-picker/variants.js +0 -28
- package/dist/components/inputs/field/index.d.ts +0 -116
- package/dist/components/inputs/field/index.js +0 -29
- package/dist/components/inputs/file-dropzone/index.d.ts +0 -167
- package/dist/components/inputs/file-dropzone/index.js +0 -33
- package/dist/components/inputs/file-dropzone/variants.d.ts +0 -35
- package/dist/components/inputs/file-dropzone/variants.js +0 -12
- package/dist/components/inputs/label/index.d.ts +0 -32
- package/dist/components/inputs/label/index.js +0 -11
- package/dist/components/inputs/number-input/index.d.ts +0 -87
- package/dist/components/inputs/number-input/index.js +0 -21
- package/dist/components/inputs/select/variants.d.ts +0 -5
- package/dist/components/inputs/select/variants.js +0 -6
- package/dist/components/navigation/navigation-menu/index.d.ts +0 -126
- package/dist/components/navigation/navigation-menu/index.js +0 -41
- package/dist/components/navigation/pagination/index.d.ts +0 -75
- package/dist/components/navigation/pagination/index.js +0 -41
- package/dist/components/navigation/sidebar/variants.d.ts +0 -25
- package/dist/components/navigation/sidebar/variants.js +0 -28
- package/dist/components/progress/index.d.ts +0 -56
- package/dist/components/progress/index.js +0 -15
- package/dist/docs/index.d.ts +0 -83
- package/dist/docs/index.js +0 -288
- package/dist/docs/vite.d.ts +0 -31
- package/dist/docs/vite.js +0 -45
- package/dist/lib/date-locale.d.ts +0 -26
- package/dist/lib/date-locale.js +0 -24
- package/dist/lib/field-classes.d.ts +0 -149
- package/dist/lib/field-classes.js +0 -41
- package/dist/lib/field-variants.d.ts +0 -47
- package/dist/lib/field-variants.js +0 -26
- package/dist/lib/fluid-hover-highlight.d.ts +0 -112
- package/dist/lib/fluid-hover-highlight.js +0 -17
- package/dist/lib/focus-ring.d.ts +0 -18
- package/dist/lib/focus-ring.js +0 -11
- package/dist/lib/goo-indicator.d.ts +0 -46
- package/dist/lib/goo-indicator.js +0 -14
- package/dist/lib/icon-context.d.ts +0 -30
- package/dist/lib/icon-context.js +0 -12
- package/dist/lib/inert.d.ts +0 -9
- package/dist/lib/inert.js +0 -8
- package/dist/lib/morph-layers.d.ts +0 -93
- package/dist/lib/morph-layers.js +0 -13
- package/dist/lib/morph-part.d.ts +0 -21
- package/dist/lib/morph-part.js +0 -12
- package/dist/lib/popup.d.ts +0 -20
- package/dist/lib/popup.js +0 -12
- package/dist/lib/reduced-motion.d.ts +0 -9
- package/dist/lib/reduced-motion.js +0 -6
- package/dist/lib/row-index.d.ts +0 -10
- package/dist/lib/row-index.js +0 -8
- package/dist/lib/row-order.d.ts +0 -28
- package/dist/lib/row-order.js +0 -10
- package/dist/lib/scroll-column.d.ts +0 -31
- package/dist/lib/scroll-column.js +0 -19
- package/dist/lib/shape-context.d.ts +0 -30
- package/dist/lib/shape-context.js +0 -13
- package/dist/lib/shape-radius.d.ts +0 -19
- package/dist/lib/shape-radius.js +0 -6
- package/dist/lib/size-context.d.ts +0 -94
- package/dist/lib/size-context.js +0 -20
- package/dist/lib/size-scale.d.ts +0 -79
- package/dist/lib/size-scale.js +0 -8
- package/dist/lib/slot.d.ts +0 -39
- package/dist/lib/slot.js +0 -14
- package/dist/lib/springs.d.ts +0 -44
- package/dist/lib/springs.js +0 -8
- package/dist/lib/surface-classes.d.ts +0 -19
- package/dist/lib/surface-classes.js +0 -10
- package/dist/lib/surface-context.d.ts +0 -9
- package/dist/lib/surface-context.js +0 -8
- package/dist/lib/use-controllable-state.d.ts +0 -2
- package/dist/lib/use-controllable-state.js +0 -6
- package/dist/lib/use-fluid-hover.d.ts +0 -138
- package/dist/lib/use-fluid-hover.js +0 -14
- package/dist/lib/use-is-mobile.d.ts +0 -2
- package/dist/lib/use-is-mobile.js +0 -6
- package/dist/lib/use-keyboard-nav-gate.d.ts +0 -20
- package/dist/lib/use-keyboard-nav-gate.js +0 -7
- package/dist/lib/use-merge-split.d.ts +0 -47
- package/dist/lib/use-merge-split.js +0 -15
- package/dist/lib/use-morph.d.ts +0 -101
- package/dist/lib/use-morph.js +0 -20
- package/dist/lib/use-touch-primary.d.ts +0 -2
- package/dist/lib/use-touch-primary.js +0 -6
- package/dist/lib/utils.d.ts +0 -3
- package/dist/lib/utils.js +0 -6
- package/dist/primitives/separator/index.d.ts +0 -25
- package/dist/primitives/separator/index.js +0 -9
- package/dist/primitives/skeleton/index.d.ts +0 -35
- package/dist/primitives/skeleton/index.js +0 -13
- package/dist/shared/components-124epb7f.js +0 -53
- package/dist/shared/components-1kab3j44.js +0 -337
- package/dist/shared/components-26snnbs9.js +0 -322
- package/dist/shared/components-34txk9rj.js +0 -35
- package/dist/shared/components-3h92d94m.js +0 -23
- package/dist/shared/components-4vfm04wq.js +0 -82
- package/dist/shared/components-54nq988h.js +0 -123
- package/dist/shared/components-7s7pykk5.js +0 -281
- package/dist/shared/components-7zkhz3r8.js +0 -399
- package/dist/shared/components-8v644a0s.js +0 -298
- package/dist/shared/components-a4evvq8h.js +0 -271
- package/dist/shared/components-adkarj8n.js +0 -35
- package/dist/shared/components-b1e239g3.js +0 -28
- package/dist/shared/components-b94t6qtj.js +0 -143
- package/dist/shared/components-c9yr4ed1.js +0 -44
- package/dist/shared/components-cwg1d0w6.js +0 -254
- package/dist/shared/components-d3shbwqq.js +0 -95
- package/dist/shared/components-dhgk6mbt.js +0 -16
- package/dist/shared/components-drxrtnp2.js +0 -25
- package/dist/shared/components-ej4r7wmj.js +0 -482
- package/dist/shared/components-f7h57m6t.js +0 -59
- package/dist/shared/components-fejdzvqc.js +0 -448
- package/dist/shared/components-gx4h5rbb.js +0 -40
- package/dist/shared/components-gyt7my41.js +0 -328
- package/dist/shared/components-h6p86be3.js +0 -19
- package/dist/shared/components-h83az0bz.js +0 -33
- package/dist/shared/components-hdzrqqpx.js +0 -55
- package/dist/shared/components-krtx3m5b.js +0 -84
- package/dist/shared/components-kswxnm3h.js +0 -24
- package/dist/shared/components-mpa2y6x8.js +0 -277
- package/dist/shared/components-mrbaxt8q.js +0 -62
- package/dist/shared/components-pt5ftm4p.js +0 -38
- package/dist/shared/components-rpw4md2b.js +0 -179
- package/dist/shared/components-rtadhd9j.js +0 -64
- package/dist/shared/components-tz4gaf1v.js +0 -23
- package/dist/shared/components-wbbckbw8.js +0 -34
- package/dist/shared/components-xdqmt6ed.js +0 -20
- package/dist/shared/components-xjkdvnbg.js +0 -107
- package/dist/shared/components-z3v0n0de.js +0 -11
- package/dist/shared/components-z6dfqtyt.js +0 -1545
- package/dist/tokens/colors.css +0 -230
- package/dist/tokens/motion.css +0 -40
- package/dist/tokens/radius.css +0 -10
- package/dist/tokens/spacing.css +0 -9
- package/dist/tokens/typography.css +0 -119
- package/docs/chrome.css +0 -120
- package/docs/chrome.tsx +0 -283
- package/docs/index.ts +0 -9
- package/docs/vite.ts +0 -85
- package/index.ts +0 -60
- package/lib/date-locale.ts +0 -195
- package/lib/field-classes.ts +0 -121
- package/lib/field-variants.ts +0 -117
- package/lib/fluid-hover-highlight.tsx +0 -139
- package/lib/focus-ring.tsx +0 -46
- package/lib/goo-indicator.tsx +0 -261
- package/lib/icon-context.tsx +0 -310
- package/lib/inert.ts +0 -22
- package/lib/morph-layers.tsx +0 -102
- package/lib/morph-part.tsx +0 -49
- package/lib/popup.ts +0 -52
- package/lib/reduced-motion.ts +0 -19
- package/lib/row-index.tsx +0 -29
- package/lib/row-order.tsx +0 -126
- package/lib/scroll-column.tsx +0 -273
- package/lib/shape-context.tsx +0 -138
- package/lib/shape-radius.ts +0 -67
- package/lib/size-context.tsx +0 -66
- package/lib/size-scale.ts +0 -115
- package/lib/slot.ts +0 -115
- package/lib/springs.ts +0 -62
- package/lib/surface-classes.ts +0 -58
- package/lib/surface-context.tsx +0 -21
- package/lib/use-controllable-state.ts +0 -44
- package/lib/use-fluid-hover.ts +0 -541
- package/lib/use-is-mobile.ts +0 -25
- package/lib/use-keyboard-nav-gate.ts +0 -45
- package/lib/use-merge-split.tsx +0 -209
- package/lib/use-morph.ts +0 -557
- package/lib/use-touch-primary.tsx +0 -43
- package/lib/utils.ts +0 -37
- package/preset.ts +0 -199
- package/primitives/code/examples.mdx +0 -27
- package/primitives/code/index.tsx +0 -80
- package/primitives/craft/demos.tsx +0 -173
- package/primitives/craft/examples.mdx +0 -142
- package/primitives/craft/index.tsx +0 -76
- package/primitives/fluid-hover/examples.mdx +0 -84
- package/primitives/fluid-hover/index.tsx +0 -316
- package/primitives/morph/examples.mdx +0 -139
- package/primitives/morph/index.tsx +0 -192
- package/primitives/motion/examples.mdx +0 -100
- package/primitives/motion/index.tsx +0 -160
- package/primitives/scroll-area/examples.mdx +0 -58
- package/primitives/scroll-area/index.tsx +0 -204
- package/primitives/separator/examples.mdx +0 -30
- package/primitives/separator/index.tsx +0 -53
- package/primitives/sizes/examples.mdx +0 -167
- package/primitives/sizes/index.tsx +0 -89
- package/primitives/skeleton/examples.mdx +0 -51
- package/primitives/skeleton/index.tsx +0 -72
- package/primitives/skeleton/skeleton.css +0 -15
- package/primitives/surface/examples.mdx +0 -173
- package/primitives/surface/index.tsx +0 -109
- package/primitives/surface/surface.css +0 -176
- /package/dist/shared/{components-3ey0hzpb.js → components-1v7rxytx.js} +0 -0
- /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
|
-
/>
|