@justanarthur/modo-ui 0.6.0-canary.9 → 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-c7rwx0ap.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-c74gf16d.js → components-1z6tdadk.js} +24 -40
- package/dist/shared/{components-bae8sbjx.js → components-27nnvrwe.js} +14 -15
- package/dist/shared/{components-qh1cvj6p.js → components-2dxkv6zm.js} +7 -8
- package/dist/shared/{components-y0kfy2g4.js → components-2ecg8svx.js} +152 -234
- package/dist/shared/{components-c5w5zk0s.js → components-2ph6t61s.js} +34 -37
- package/dist/shared/{components-4j3t39dd.js → components-39jq9va1.js} +24 -29
- package/dist/shared/components-3ky44908.js +9 -0
- package/dist/shared/{components-syynwm1r.js → components-3mkepka5.js} +25 -28
- package/dist/shared/{components-wgtjt2af.js → components-4700p9kz.js} +22 -24
- package/dist/shared/{components-yhgq0qxx.js → components-59efxjd9.js} +12 -13
- package/dist/shared/{components-91zw3d9f.js → components-5vgpnxgy.js} +27 -51
- package/dist/shared/{components-kz5q11pp.js → components-5xc2j8jz.js} +18 -19
- package/dist/shared/{components-zkk3fmw8.js → components-6p8tfcd6.js} +29 -57
- package/dist/shared/{components-4nck8acq.js → components-7r3etddy.js} +54 -19
- package/dist/shared/{components-svkt577j.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-pv1dyrtn.js → components-b3c5et5b.js} +38 -49
- package/dist/shared/{components-rrbpmfx4.js → components-c6s6b43g.js} +2 -3
- package/dist/shared/{components-pwayrkw9.js → components-chacnk61.js} +19 -19
- package/dist/shared/{components-71nbt03m.js → components-cv16mryv.js} +7 -26
- package/dist/shared/{components-hgv6tygd.js → components-d6xtjht3.js} +30 -35
- package/dist/shared/{components-z8fedth5.js → components-dk0gjr5a.js} +18 -19
- package/dist/shared/{components-cet3jpa0.js → components-fzrq6tr3.js} +34 -37
- package/dist/shared/{components-cnead5qm.js → components-gc5vtq2f.js} +30 -66
- package/dist/shared/components-gf5s6ap9.js +42 -0
- package/dist/shared/{components-0h78g3b5.js → components-gz8zf3ec.js} +55 -56
- package/dist/shared/{components-mattt5jp.js → components-h2ajmhwn.js} +35 -107
- package/dist/shared/{components-m06yq8wk.js → components-hqeq3w9q.js} +23 -38
- package/dist/shared/{components-7qx17na9.js → components-hw9yk32z.js} +24 -36
- package/dist/shared/components-hyq23phv.js +310 -0
- package/dist/shared/{components-9jmjnkqd.js → components-jbbmdr74.js} +22 -41
- package/dist/shared/{components-dcc02hs2.js → components-jjw69c4c.js} +4 -7
- package/dist/shared/{components-303jf96s.js → components-jthe1pwb.js} +420 -139
- package/dist/shared/{components-dtca4s6b.js → components-jwst3vtj.js} +76 -224
- package/dist/shared/{components-dc5q749x.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-qx27excf.js → components-mjthm1kf.js} +9 -13
- package/dist/shared/{components-1e64t8aj.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-w2jqa6hx.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-2a7hcand.js → components-rr7a6ja9.js} +27 -59
- package/dist/shared/{components-005jt2nz.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-p0fm0bab.js → components-w1r67ag9.js} +149 -294
- package/dist/shared/{components-xd3emmy4.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-yxmxn2jp.js → components-y9y0g8er.js} +28 -52
- package/dist/shared/components-ypp01w3p.js +986 -0
- package/dist/shared/{components-czdvj1a8.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-01w9qcfa.js +0 -277
- package/dist/shared/components-124epb7f.js +0 -53
- package/dist/shared/components-26snnbs9.js +0 -322
- package/dist/shared/components-2krsc300.js +0 -254
- package/dist/shared/components-2qbqqpgq.js +0 -1545
- 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-868v7scv.js +0 -399
- package/dist/shared/components-8jrk5eye.js +0 -448
- 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-bsqynhaj.js +0 -179
- package/dist/shared/components-c9yr4ed1.js +0 -44
- 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-f7h57m6t.js +0 -59
- package/dist/shared/components-g3eafs70.js +0 -337
- 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-mhza2wdn.js +0 -482
- package/dist/shared/components-mrbaxt8q.js +0 -62
- package/dist/shared/components-pt5ftm4p.js +0 -38
- package/dist/shared/components-rtadhd9j.js +0 -64
- package/dist/shared/components-tv7b8tet.js +0 -271
- package/dist/shared/components-tz4gaf1v.js +0 -23
- package/dist/shared/components-wbbckbw8.js +0 -34
- package/dist/shared/components-wknae3m4.js +0 -298
- 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/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 -575
- 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
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Local addition (not part of Fluid Functionalism): a hover card that oozes
|
|
3
|
-
* out of its link. The card grows out of the trigger through
|
|
4
|
-
* `lib/use-morph.ts`, with the goo neck by default, like Popover — after
|
|
5
|
-
* beUI's gooey popover (github.com/starc007/ui-components
|
|
6
|
-
* `components/motion/popover.tsx` @ de52f337e520e7ee37749b36eb1c32df86137bcb —
|
|
7
|
-
* MIT © 2026 Saurabh Chauhan, notice: LICENSE.beui). Behavior is Base UI's
|
|
8
|
-
* PreviewCard: hover and focus delays, the safe path into the card, dismissal
|
|
9
|
-
* and positioning.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { PreviewCard as PreviewCardPrimitive } from '@base-ui/react/preview-card'
|
|
13
|
-
import {
|
|
14
|
-
type AnchorHTMLAttributes,
|
|
15
|
-
createContext,
|
|
16
|
-
forwardRef,
|
|
17
|
-
type HTMLAttributes,
|
|
18
|
-
type ReactElement,
|
|
19
|
-
type ReactNode,
|
|
20
|
-
type RefObject,
|
|
21
|
-
useContext,
|
|
22
|
-
useImperativeHandle,
|
|
23
|
-
useMemo,
|
|
24
|
-
} from 'react'
|
|
25
|
-
import { MorphSurface } from '../../../lib/morph-layers'
|
|
26
|
-
import { useShape } from '../../../lib/shape-context'
|
|
27
|
-
import { SURFACE_BG, SURFACE_SHADOW } from '../../../lib/surface-classes'
|
|
28
|
-
import { SurfaceProvider, useSurface } from '../../../lib/surface-context'
|
|
29
|
-
import { useControllableState } from '../../../lib/use-controllable-state'
|
|
30
|
-
import { inPlaceOffset, type MorphOrigin, opensInPlace, useMorph, useMorphOrigin } from '../../../lib/use-morph'
|
|
31
|
-
import { cn } from '../../../lib/utils'
|
|
32
|
-
|
|
33
|
-
interface PreviewCardContextValue {
|
|
34
|
-
open: boolean
|
|
35
|
-
origin: RefObject<MorphOrigin>
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const PreviewCardContext = createContext<PreviewCardContextValue>({ open: false, origin: { current: {} } })
|
|
39
|
-
|
|
40
|
-
interface PreviewCardTriggerProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
|
|
41
|
-
/** Hover delay before the card opens, in ms. Defaults to `600`. */
|
|
42
|
-
delay?: number
|
|
43
|
-
/** Delay before the card closes once the pointer leaves, in ms. Defaults to `300`. */
|
|
44
|
-
closeDelay?: number
|
|
45
|
-
/** The element that becomes the trigger instead of the default link, e.g. an avatar; it brings its own styling. */
|
|
46
|
-
render?: ReactElement
|
|
47
|
-
/** Extra classes for the link. */
|
|
48
|
-
className?: string
|
|
49
|
-
/** The link's content. */
|
|
50
|
-
children?: ReactNode
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const PreviewCardTrigger = forwardRef<HTMLAnchorElement, PreviewCardTriggerProps>(
|
|
54
|
-
({ render, className, ...props }, ref) => (
|
|
55
|
-
<PreviewCardPrimitive.Trigger
|
|
56
|
-
ref={ref}
|
|
57
|
-
render={render}
|
|
58
|
-
className={cn(
|
|
59
|
-
!render &&
|
|
60
|
-
'weight-medium text-foreground underline decoration-border underline-offset-4 transition-colors duration-fast hover:decoration-foreground',
|
|
61
|
-
className,
|
|
62
|
-
)}
|
|
63
|
-
{...props}
|
|
64
|
-
/>
|
|
65
|
-
),
|
|
66
|
-
)
|
|
67
|
-
PreviewCardTrigger.displayName = 'PreviewCardTrigger'
|
|
68
|
-
|
|
69
|
-
interface PreviewCardContentProps extends HTMLAttributes<HTMLDivElement> {
|
|
70
|
-
/** Side of the link the card opens on; it flips when there is no room. Defaults to `'bottom'`. */
|
|
71
|
-
side?: 'top' | 'right' | 'bottom' | 'left'
|
|
72
|
-
/** Alignment along that side. Defaults to `'center'`, or `'start'` when the card opens in place (`effect="morph"` with `hideSource`). */
|
|
73
|
-
align?: 'start' | 'center' | 'end'
|
|
74
|
-
/** Gap between link and card in px — the length of the goo neck. Ignored when the card opens in place over its link (`effect="morph"` with `hideSource`). Defaults to `12`. */
|
|
75
|
-
sideOffset?: number
|
|
76
|
-
/** Where the card grows from (see Morph): the hovered link, its own center, a viewport edge, or a ref to any element. Defaults to `'trigger'`. */
|
|
77
|
-
from?: 'trigger' | 'center' | 'top' | 'right' | 'bottom' | 'left' | RefObject<HTMLElement | null>
|
|
78
|
-
/** How it grows (see Morph): with the liquid goo neck, a plain morph, a slide or a fade. Defaults to `'goo'`. */
|
|
79
|
-
effect?: 'goo' | 'morph' | 'slide' | 'fade'
|
|
80
|
-
/** Hide the link while open, so it reads as turning into the card. Defaults to `false`. */
|
|
81
|
-
hideSource?: boolean
|
|
82
|
-
/** Spring tier of a plain morph, slide or fade; goo runs on its own `spring.goo`. Defaults to `'slow'`. */
|
|
83
|
-
tier?: 'moderate' | 'slow'
|
|
84
|
-
/** Portal target. Defaults to the document body. */
|
|
85
|
-
container?: HTMLElement | null
|
|
86
|
-
/** Classes for the card's content box: padding, width, layout. */
|
|
87
|
-
className?: string
|
|
88
|
-
/** The card's content. Everything inside reads the card's surface level as its substrate. */
|
|
89
|
-
children?: ReactNode
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
const PreviewCardContent = forwardRef<HTMLDivElement, PreviewCardContentProps>(
|
|
93
|
-
(
|
|
94
|
-
{
|
|
95
|
-
side = 'bottom',
|
|
96
|
-
align,
|
|
97
|
-
sideOffset = 12,
|
|
98
|
-
from,
|
|
99
|
-
effect,
|
|
100
|
-
hideSource,
|
|
101
|
-
tier,
|
|
102
|
-
container,
|
|
103
|
-
className,
|
|
104
|
-
children,
|
|
105
|
-
...props
|
|
106
|
-
},
|
|
107
|
-
ref,
|
|
108
|
-
) => {
|
|
109
|
-
const { open, origin } = useContext(PreviewCardContext)
|
|
110
|
-
const morph = useMorph(open, origin, { from, effect, hideSource, tier })
|
|
111
|
-
const inPlace = opensInPlace({ effect, hideSource })
|
|
112
|
-
useImperativeHandle(ref, () => morph.popup as HTMLDivElement, [morph.popup])
|
|
113
|
-
const shape = useShape()
|
|
114
|
-
// Fixed shadow, like Popover (see Elevated).
|
|
115
|
-
const level = Math.min(useSurface() + 2, 8)
|
|
116
|
-
|
|
117
|
-
return (
|
|
118
|
-
<PreviewCardPrimitive.Portal container={container ?? undefined}>
|
|
119
|
-
<PreviewCardPrimitive.Positioner
|
|
120
|
-
side={side}
|
|
121
|
-
align={align ?? (inPlace ? 'start' : 'center')}
|
|
122
|
-
sideOffset={inPlace ? inPlaceOffset : sideOffset}
|
|
123
|
-
className="z-50 outline-none"
|
|
124
|
-
>
|
|
125
|
-
<PreviewCardPrimitive.Popup ref={morph.popupRef} className="relative outline-none" {...props}>
|
|
126
|
-
<SurfaceProvider value={level}>
|
|
127
|
-
<MorphSurface
|
|
128
|
-
morph={morph}
|
|
129
|
-
bg={SURFACE_BG[level]}
|
|
130
|
-
shadow={SURFACE_SHADOW[3]}
|
|
131
|
-
radius={shape.container}
|
|
132
|
-
className={cn('flex w-max max-w-[min(92vw,20rem)] flex-col gap-3 p-4', className)}
|
|
133
|
-
>
|
|
134
|
-
{children}
|
|
135
|
-
</MorphSurface>
|
|
136
|
-
</SurfaceProvider>
|
|
137
|
-
</PreviewCardPrimitive.Popup>
|
|
138
|
-
</PreviewCardPrimitive.Positioner>
|
|
139
|
-
</PreviewCardPrimitive.Portal>
|
|
140
|
-
)
|
|
141
|
-
},
|
|
142
|
-
)
|
|
143
|
-
PreviewCardContent.displayName = 'PreviewCardContent'
|
|
144
|
-
|
|
145
|
-
interface PreviewCardProps {
|
|
146
|
-
/** Controlled open state. Pair with `onOpenChange`. */
|
|
147
|
-
open?: boolean
|
|
148
|
-
/** Initial open state, for an uncontrolled card. Defaults to `false`. */
|
|
149
|
-
defaultOpen?: boolean
|
|
150
|
-
/** Called when the card opens or closes. */
|
|
151
|
-
onOpenChange?: (open: boolean) => void
|
|
152
|
-
/** The link and the card — `PreviewCard.Trigger` plus a `PreviewCard.Content`. */
|
|
153
|
-
children?: ReactNode
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* A card that oozes out of a link on hover: a preview of what is behind it,
|
|
158
|
-
* melting out of the link through a liquid neck.
|
|
159
|
-
*
|
|
160
|
-
* The morph comes from the shared engine (see Morph), so the card can grow
|
|
161
|
-
* from the link (the default), its own center, a viewport edge or any
|
|
162
|
-
* element, with the goo neck, a plain morph, a slide or a fade, and closes
|
|
163
|
-
* back into wherever it came from. The card lifts 2 surface levels off its
|
|
164
|
-
* substrate and re-provides that level. Built on Base UI's PreviewCard: it
|
|
165
|
-
* opens after a hover or focus delay, stays open while the pointer travels
|
|
166
|
-
* into it, flips to the other side when there is no room, and closes on
|
|
167
|
-
* leave, Escape or an outside press. The card is a visual extra that touch
|
|
168
|
-
* and screen-reader users never get, so the link must make sense on its own.
|
|
169
|
-
*
|
|
170
|
-
* Statics:
|
|
171
|
-
* - `PreviewCard.Trigger` — the link: `href`, `delay`, `closeDelay`, or
|
|
172
|
-
* `render` for another element.
|
|
173
|
-
* - `PreviewCard.Content` — the card: `side`, `align`, `sideOffset` and the
|
|
174
|
-
* morph options `from`, `effect`, `hideSource`, `tier`.
|
|
175
|
-
*
|
|
176
|
-
* @example {@include ./examples.mdx}
|
|
177
|
-
*/
|
|
178
|
-
function PreviewCard({ open, defaultOpen = false, onOpenChange, children }: PreviewCardProps) {
|
|
179
|
-
const [current, setCurrent] = useControllableState(open, defaultOpen, onOpenChange)
|
|
180
|
-
const { origin, capture } = useMorphOrigin()
|
|
181
|
-
const ctx = useMemo(() => ({ open: current, origin }), [current, origin])
|
|
182
|
-
|
|
183
|
-
return (
|
|
184
|
-
<PreviewCardContext.Provider value={ctx}>
|
|
185
|
-
<PreviewCardPrimitive.Root
|
|
186
|
-
open={current}
|
|
187
|
-
onOpenChange={(next, details) => {
|
|
188
|
-
if (next) capture(details)
|
|
189
|
-
setCurrent(next)
|
|
190
|
-
}}
|
|
191
|
-
>
|
|
192
|
-
{children}
|
|
193
|
-
</PreviewCardPrimitive.Root>
|
|
194
|
-
</PreviewCardContext.Provider>
|
|
195
|
-
)
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
PreviewCard.Trigger = PreviewCardTrigger
|
|
199
|
-
PreviewCard.Content = PreviewCardContent
|
|
200
|
-
|
|
201
|
-
export type { PreviewCardContentProps, PreviewCardProps, PreviewCardTriggerProps }
|
|
202
|
-
export { PreviewCard, PreviewCardContent, PreviewCardTrigger }
|
|
203
|
-
|
|
204
|
-
export default PreviewCard
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import Sheet from './index'
|
|
2
|
-
import Button from '../../button'
|
|
3
|
-
|
|
4
|
-
# Bottom sheet
|
|
5
|
-
|
|
6
|
-
The sheet oozes up out of the bottom edge. Swipe it back down, press outside or hit Escape to send it back.
|
|
7
|
-
|
|
8
|
-
<Sheet>
|
|
9
|
-
<Sheet.Trigger render={<Button variant="secondary">Open sheet</Button>} />
|
|
10
|
-
<Sheet.Content>
|
|
11
|
-
<Sheet.Header>
|
|
12
|
-
<Sheet.Title>Share project</Sheet.Title>
|
|
13
|
-
<Sheet.Description>Anyone with the link can view it.</Sheet.Description>
|
|
14
|
-
</Sheet.Header>
|
|
15
|
-
<Sheet.Footer>
|
|
16
|
-
<Sheet.Close render={<Button variant="ghost">Cancel</Button>} />
|
|
17
|
-
<Sheet.Close render={<Button>Copy link</Button>} />
|
|
18
|
-
</Sheet.Footer>
|
|
19
|
-
</Sheet.Content>
|
|
20
|
-
</Sheet>
|
|
21
|
-
|
|
22
|
-
# Sides
|
|
23
|
-
|
|
24
|
-
`side` attaches the sheet to any edge; it grows from that edge and is swiped back toward it.
|
|
25
|
-
|
|
26
|
-
<div className="flex flex-wrap items-center justify-center gap-3">
|
|
27
|
-
<Sheet side="right">
|
|
28
|
-
<Sheet.Trigger render={<Button variant="secondary">Right</Button>} />
|
|
29
|
-
<Sheet.Content>
|
|
30
|
-
<Sheet.Title>Filters</Sheet.Title>
|
|
31
|
-
<Sheet.Description>A side sheet takes the full height and caps its width.</Sheet.Description>
|
|
32
|
-
</Sheet.Content>
|
|
33
|
-
</Sheet>
|
|
34
|
-
<Sheet side="left">
|
|
35
|
-
<Sheet.Trigger render={<Button variant="secondary">Left</Button>} />
|
|
36
|
-
<Sheet.Content>
|
|
37
|
-
<Sheet.Title>Navigation</Sheet.Title>
|
|
38
|
-
<Sheet.Description>Swipe left to dismiss.</Sheet.Description>
|
|
39
|
-
</Sheet.Content>
|
|
40
|
-
</Sheet>
|
|
41
|
-
<Sheet side="top">
|
|
42
|
-
<Sheet.Trigger render={<Button variant="secondary">Top</Button>} />
|
|
43
|
-
<Sheet.Content>
|
|
44
|
-
<Sheet.Title>Announcement</Sheet.Title>
|
|
45
|
-
<Sheet.Description>Swipe up to dismiss.</Sheet.Description>
|
|
46
|
-
</Sheet.Content>
|
|
47
|
-
</Sheet>
|
|
48
|
-
</div>
|
|
49
|
-
|
|
50
|
-
# Side and width on the content
|
|
51
|
-
|
|
52
|
-
The Radix shape works too: `side` on `Sheet.Content` overrides the root's, and the swipe follows it. `popupClassName` sizes the sheet's box past its default width.
|
|
53
|
-
|
|
54
|
-
<Sheet>
|
|
55
|
-
<Sheet.Trigger render={<Button variant="secondary">Wide left sheet</Button>} />
|
|
56
|
-
<Sheet.Content side="left" popupClassName="w-[min(32rem,calc(100%-1rem))]">
|
|
57
|
-
<Sheet.Title>Activity</Sheet.Title>
|
|
58
|
-
<Sheet.Description>A wider panel for a longer read.</Sheet.Description>
|
|
59
|
-
</Sheet.Content>
|
|
60
|
-
</Sheet>
|
|
61
|
-
|
|
62
|
-
# From the trigger
|
|
63
|
-
|
|
64
|
-
`from="trigger"` grows the sheet out of the button instead of the edge; once open it behaves like any sheet.
|
|
65
|
-
|
|
66
|
-
<Sheet>
|
|
67
|
-
<Sheet.Trigger render={<Button variant="secondary">From the button</Button>} />
|
|
68
|
-
<Sheet.Content from="trigger">
|
|
69
|
-
<Sheet.Title>From the button</Sheet.Title>
|
|
70
|
-
<Sheet.Description>The surface melts out of the trigger and settles at the bottom edge.</Sheet.Description>
|
|
71
|
-
</Sheet.Content>
|
|
72
|
-
</Sheet>
|
|
73
|
-
|
|
74
|
-
# Snap points
|
|
75
|
-
|
|
76
|
-
A top or bottom sheet can rest at `snapPoints`: here 40% of the window, then nearly all of it. Drag the handle between them.
|
|
77
|
-
|
|
78
|
-
<Sheet snapPoints={[0.4, 0.9]}>
|
|
79
|
-
<Sheet.Trigger render={<Button variant="secondary">Open with snap points</Button>} />
|
|
80
|
-
<Sheet.Content className="min-h-[90dvh]">
|
|
81
|
-
<Sheet.Title>Two heights</Sheet.Title>
|
|
82
|
-
<Sheet.Description>Swipe up to expand, down to fold back or dismiss.</Sheet.Description>
|
|
83
|
-
</Sheet.Content>
|
|
84
|
-
</Sheet>
|
|
85
|
-
|
|
86
|
-
# Indent
|
|
87
|
-
|
|
88
|
-
Wrap the page in `Sheet.Indent` under a `Sheet.Provider` and it eases back while a sheet is open.
|
|
89
|
-
|
|
90
|
-
<Sheet.Provider>
|
|
91
|
-
<Sheet.Indent className="flex w-full flex-col items-center gap-3 rounded-xl bg-surface-2 p-8">
|
|
92
|
-
<span className="text-caption text-muted-foreground">The page behind the sheet</span>
|
|
93
|
-
<Sheet>
|
|
94
|
-
<Sheet.Trigger render={<Button variant="secondary">Open sheet</Button>} />
|
|
95
|
-
<Sheet.Content>
|
|
96
|
-
<Sheet.Title>On top of the page</Sheet.Title>
|
|
97
|
-
<Sheet.Description>The page scales back a little while this is open.</Sheet.Description>
|
|
98
|
-
</Sheet.Content>
|
|
99
|
-
</Sheet>
|
|
100
|
-
</Sheet.Indent>
|
|
101
|
-
</Sheet.Provider>
|
|
@@ -1,307 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Local addition (not part of Fluid Functionalism): a sheet attached to an edge
|
|
3
|
-
* of the window. Base UI's Drawer owns the behavior (swipe to dismiss, snap
|
|
4
|
-
* points, focus, scroll lock); the panel grows through the shared morph layer
|
|
5
|
-
* (`lib/use-morph.ts`), from its own edge with the goo neck by default, and a
|
|
6
|
-
* swipe that dismisses it slides it on off its edge (the morph's `exit`). Its
|
|
7
|
-
* title, description, close and trigger are Dialog's parts, which Base UI
|
|
8
|
-
* shares with the Drawer. Replaces beUI's bottom sheet and drawer
|
|
9
|
-
* (github.com/starc007/ui-components @ de52f337e520e7ee37749b36eb1c32df86137bcb
|
|
10
|
-
* — MIT © 2026 Saurabh Chauhan, notice: LICENSE.beui) without porting their
|
|
11
|
-
* drag, snap or focus code.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { Drawer as DrawerPrimitive } from '@base-ui/react/drawer'
|
|
15
|
-
import { motion } from 'motion/react'
|
|
16
|
-
import {
|
|
17
|
-
type ComponentProps,
|
|
18
|
-
createContext,
|
|
19
|
-
forwardRef,
|
|
20
|
-
type HTMLAttributes,
|
|
21
|
-
type ReactNode,
|
|
22
|
-
type RefObject,
|
|
23
|
-
useContext,
|
|
24
|
-
useImperativeHandle,
|
|
25
|
-
useLayoutEffect,
|
|
26
|
-
useState,
|
|
27
|
-
} from 'react'
|
|
28
|
-
import { MorphSurface } from '../../../lib/morph-layers'
|
|
29
|
-
import { useShape } from '../../../lib/shape-context'
|
|
30
|
-
import { SURFACE_BG, SURFACE_SHADOW } from '../../../lib/surface-classes'
|
|
31
|
-
import { SurfaceProvider, useSurface } from '../../../lib/surface-context'
|
|
32
|
-
import { useMorph } from '../../../lib/use-morph'
|
|
33
|
-
import { cn } from '../../../lib/utils'
|
|
34
|
-
import {
|
|
35
|
-
DialogClose,
|
|
36
|
-
DialogDescription,
|
|
37
|
-
DialogFooter,
|
|
38
|
-
DialogHeader,
|
|
39
|
-
DialogState,
|
|
40
|
-
DialogTitle,
|
|
41
|
-
DialogTrigger,
|
|
42
|
-
useDialogState,
|
|
43
|
-
} from '../dialog'
|
|
44
|
-
|
|
45
|
-
type SheetSide = 'top' | 'right' | 'bottom' | 'left'
|
|
46
|
-
|
|
47
|
-
interface SheetContextValue {
|
|
48
|
-
side: SheetSide
|
|
49
|
-
swiped: boolean
|
|
50
|
-
/** A `Sheet.Content` `side` overriding the root's, so the swipe follows it. */
|
|
51
|
-
setContentSide: (side: SheetSide | undefined) => void
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/** The sheet's edge, and whether its last close was a swipe. */
|
|
55
|
-
const SheetContext = createContext<SheetContextValue>({ side: 'bottom', swiped: false, setContentSide: () => {} })
|
|
56
|
-
|
|
57
|
-
const SWIPE: Record<SheetSide, 'up' | 'right' | 'down' | 'left'> = {
|
|
58
|
-
top: 'up',
|
|
59
|
-
right: 'right',
|
|
60
|
-
bottom: 'down',
|
|
61
|
-
left: 'left',
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const PLACEMENT: Record<SheetSide, string> = {
|
|
65
|
-
top: 'inset-x-2 top-2 mx-auto max-w-[36rem] max-h-[calc(100dvh-4rem)]',
|
|
66
|
-
bottom: 'inset-x-2 bottom-2 mx-auto max-w-[36rem] max-h-[calc(100dvh-4rem)]',
|
|
67
|
-
left: 'inset-y-2 left-2 w-[min(24rem,calc(100%-1rem))]',
|
|
68
|
-
right: 'inset-y-2 right-2 w-[min(24rem,calc(100%-1rem))]',
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const DRAWER_OFFSET = 4
|
|
72
|
-
|
|
73
|
-
// Literal per shape so the class extractor sees each one.
|
|
74
|
-
const INDENT_RADIUS = { pill: 'data-[active]:rounded-3xl', rounded: 'data-[active]:rounded-xl' }
|
|
75
|
-
|
|
76
|
-
interface SheetContentProps extends HTMLAttributes<HTMLDivElement> {
|
|
77
|
-
/** Where the sheet grows from (see Morph): its own edge, the pressed trigger, the press point, its center, another edge, or a ref to any element. Defaults to the sheet's `side`. */
|
|
78
|
-
from?: 'trigger' | 'pointer' | 'center' | 'top' | 'right' | 'bottom' | 'left' | RefObject<HTMLElement | null>
|
|
79
|
-
/** How it grows (see Morph): with the liquid goo neck, a plain morph, a slide or a fade. Defaults to `'goo'`. */
|
|
80
|
-
effect?: 'goo' | 'morph' | 'slide' | 'fade'
|
|
81
|
-
/** Hide the trigger while open, so it reads as turning into the sheet. Defaults to `false`. */
|
|
82
|
-
hideSource?: boolean
|
|
83
|
-
/** Spring tier of a plain morph, slide or fade; goo runs on its own `spring.goo`. Defaults to `'slow'`. */
|
|
84
|
-
tier?: 'moderate' | 'slow'
|
|
85
|
-
/** Portal target. Defaults to the document body. */
|
|
86
|
-
container?: HTMLElement | null
|
|
87
|
-
/** The edge the sheet is attached to, overriding the root's `side` (the Radix shape); the swipe follows it. Defaults to the `Sheet`'s `side`. */
|
|
88
|
-
side?: SheetSide
|
|
89
|
-
/** Where focus goes when the sheet opens: a ref, `false` to leave it, `true` for the default, or a function of how it opened (`'mouse'`, `'touch'`, `'pen'`, `'keyboard'`). Defaults to the first tabbable element in the panel. */
|
|
90
|
-
initialFocus?: DrawerPopupProps['initialFocus']
|
|
91
|
-
/** Where focus goes when the sheet closes: a ref, `false` to leave it, `true` for the default, or a function of how it closed. Defaults to the trigger. */
|
|
92
|
-
finalFocus?: DrawerPopupProps['finalFocus']
|
|
93
|
-
/** Classes for the positioned popup box, merged after its placement (`max-w-[36rem]` on top and bottom, `w-[min(24rem,calc(100%-1rem))]` on the sides), so a width class resizes the sheet. */
|
|
94
|
-
popupClassName?: string
|
|
95
|
-
/** Classes for the sheet's content box: padding, layout. */
|
|
96
|
-
className?: string
|
|
97
|
-
/** The sheet's content. Everything inside reads the sheet's surface level as its substrate. */
|
|
98
|
-
children?: ReactNode
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
type DrawerPopupProps = ComponentProps<typeof DrawerPrimitive.Popup>
|
|
102
|
-
|
|
103
|
-
const SheetContent = forwardRef<HTMLDivElement, SheetContentProps>(
|
|
104
|
-
(
|
|
105
|
-
{
|
|
106
|
-
from,
|
|
107
|
-
effect,
|
|
108
|
-
hideSource,
|
|
109
|
-
tier,
|
|
110
|
-
container,
|
|
111
|
-
side: sideProp,
|
|
112
|
-
initialFocus,
|
|
113
|
-
finalFocus,
|
|
114
|
-
popupClassName,
|
|
115
|
-
className,
|
|
116
|
-
children,
|
|
117
|
-
...props
|
|
118
|
-
},
|
|
119
|
-
ref,
|
|
120
|
-
) => {
|
|
121
|
-
const { side: rootSide, swiped, setContentSide } = useContext(SheetContext)
|
|
122
|
-
const side = sideProp ?? rootSide
|
|
123
|
-
// Hand the root the content's edge so the swipe direction follows it.
|
|
124
|
-
useLayoutEffect(() => {
|
|
125
|
-
if (!sideProp) return
|
|
126
|
-
setContentSide(sideProp)
|
|
127
|
-
return () => setContentSide(undefined)
|
|
128
|
-
}, [sideProp, setContentSide])
|
|
129
|
-
const { open, origin } = useDialogState()
|
|
130
|
-
const morph = useMorph(open, origin, {
|
|
131
|
-
from: from ?? side,
|
|
132
|
-
effect,
|
|
133
|
-
hideSource,
|
|
134
|
-
tier,
|
|
135
|
-
exit: swiped ? { effect: 'slide', from: side } : undefined,
|
|
136
|
-
// A custom `finalFocus` places focus itself; the morph's own return
|
|
137
|
-
// to the trigger would undo it.
|
|
138
|
-
returnFocus: typeof finalFocus === 'boolean' ? finalFocus : finalFocus === undefined,
|
|
139
|
-
})
|
|
140
|
-
useImperativeHandle(ref, () => morph.popup as HTMLDivElement, [morph.popup])
|
|
141
|
-
const shape = useShape()
|
|
142
|
-
const level = Math.min(useSurface() + DRAWER_OFFSET, 8)
|
|
143
|
-
const edge = side === 'top' || side === 'bottom'
|
|
144
|
-
|
|
145
|
-
return (
|
|
146
|
-
<DrawerPrimitive.Portal container={container ?? undefined}>
|
|
147
|
-
<DrawerPrimitive.Backdrop
|
|
148
|
-
render={<motion.div style={{ opacity: morph.progress }} />}
|
|
149
|
-
className={cn(container ? 'absolute' : 'fixed', 'inset-0 z-50 bg-scrim')}
|
|
150
|
-
/>
|
|
151
|
-
{/* The viewport carries Base UI's swipe handling; the popup sits in it. */}
|
|
152
|
-
<DrawerPrimitive.Viewport className={cn(container ? 'absolute' : 'fixed', 'inset-0 z-50')}>
|
|
153
|
-
<DrawerPrimitive.Popup
|
|
154
|
-
ref={morph.popupRef}
|
|
155
|
-
{...props}
|
|
156
|
-
initialFocus={initialFocus}
|
|
157
|
-
finalFocus={finalFocus}
|
|
158
|
-
className={cn(
|
|
159
|
-
'absolute flex flex-col focus:outline-none',
|
|
160
|
-
PLACEMENT[side],
|
|
161
|
-
// Follows the finger through Base UI's swipe variables (the snap
|
|
162
|
-
// offset only moves top and bottom sheets) and springs back on
|
|
163
|
-
// release; Base UI drops the transition while a swipe is live.
|
|
164
|
-
'[transform:translate(var(--drawer-swipe-movement-x),calc(var(--drawer-snap-point-offset)_+_var(--drawer-swipe-movement-y)))]',
|
|
165
|
-
'transition-[transform] duration-slow',
|
|
166
|
-
popupClassName,
|
|
167
|
-
)}
|
|
168
|
-
>
|
|
169
|
-
<SurfaceProvider value={level}>
|
|
170
|
-
<MorphSurface
|
|
171
|
-
morph={morph}
|
|
172
|
-
bg={SURFACE_BG[level]}
|
|
173
|
-
shadow={SURFACE_SHADOW[level]}
|
|
174
|
-
radius={shape.container}
|
|
175
|
-
className={cn('flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto p-6', edge && 'pt-3', className)}
|
|
176
|
-
>
|
|
177
|
-
{edge && <div aria-hidden className="mx-auto h-1 w-10 shrink-0 rounded-full bg-overlay/16" />}
|
|
178
|
-
{children}
|
|
179
|
-
</MorphSurface>
|
|
180
|
-
</SurfaceProvider>
|
|
181
|
-
</DrawerPrimitive.Popup>
|
|
182
|
-
</DrawerPrimitive.Viewport>
|
|
183
|
-
</DrawerPrimitive.Portal>
|
|
184
|
-
)
|
|
185
|
-
},
|
|
186
|
-
)
|
|
187
|
-
SheetContent.displayName = 'SheetContent'
|
|
188
|
-
|
|
189
|
-
const SheetIndent = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => {
|
|
190
|
-
const shape = useShape()
|
|
191
|
-
return (
|
|
192
|
-
<DrawerPrimitive.Indent
|
|
193
|
-
ref={ref}
|
|
194
|
-
className={cn(
|
|
195
|
-
'origin-top transition-[transform] duration-slow data-[active]:scale-[0.96] data-[active]:overflow-hidden',
|
|
196
|
-
INDENT_RADIUS[shape.variant],
|
|
197
|
-
className,
|
|
198
|
-
)}
|
|
199
|
-
{...props}
|
|
200
|
-
/>
|
|
201
|
-
)
|
|
202
|
-
})
|
|
203
|
-
SheetIndent.displayName = 'SheetIndent'
|
|
204
|
-
|
|
205
|
-
/** What `onOpenChange` receives besides the open state: Base UI's Drawer change details. */
|
|
206
|
-
type SheetOpenChangeDetails = DrawerPrimitive.Root.ChangeEventDetails
|
|
207
|
-
|
|
208
|
-
interface SheetProps {
|
|
209
|
-
/** Controlled open state. */
|
|
210
|
-
open?: boolean
|
|
211
|
-
/** Initial open state, for an uncontrolled sheet. Defaults to `false`. */
|
|
212
|
-
defaultOpen?: boolean
|
|
213
|
-
/** Called when the sheet opens or closes, including by a swipe, with Base UI's change details: `reason` (`'swipe'`, `'escape-key'`, `'outside-press'`, …), the `event`, and `cancel()` to keep it as it is. */
|
|
214
|
-
onOpenChange?: (open: boolean, details: SheetOpenChangeDetails) => void
|
|
215
|
-
/** The edge the sheet is attached to; a swipe back toward it dismisses it. A `Sheet.Content` `side` overrides it. Defaults to `'bottom'`. */
|
|
216
|
-
side?: 'top' | 'right' | 'bottom' | 'left'
|
|
217
|
-
/** Snap points for a top or bottom sheet: fractions of the viewport height (0–1), pixels, or `px` / `rem` strings. */
|
|
218
|
-
snapPoints?: (number | string)[]
|
|
219
|
-
/** The snap point an uncontrolled sheet opens at. Defaults to the first one. */
|
|
220
|
-
defaultSnapPoint?: number | string
|
|
221
|
-
/** Traps focus and locks page scroll while open. Defaults to `true`. */
|
|
222
|
-
modal?: boolean
|
|
223
|
-
/** Ignore presses outside the sheet: only Escape, a swipe and its own closes dismiss it. Defaults to `false`. */
|
|
224
|
-
disablePointerDismissal?: boolean
|
|
225
|
-
/** The trigger and the content — `Sheet.Trigger` plus a `Sheet.Content`. */
|
|
226
|
-
children?: ReactNode
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* A panel attached to an edge of the window, swiped away to dismiss.
|
|
231
|
-
*
|
|
232
|
-
* The sheet grows out of its own edge with the goo neck by default (see
|
|
233
|
-
* Morph), or from its trigger, the press point or any element, and closes
|
|
234
|
-
* back the same way. Base UI's Drawer does the rest: a swipe back toward the
|
|
235
|
-
* edge dismisses it (it slides on off the edge from where the finger let
|
|
236
|
-
* go), top and bottom sheets can rest at `snapPoints`, and
|
|
237
|
-
* focus and scroll are held while it is open. It floats a spacing step off
|
|
238
|
-
* its edge and lifts 4 surface levels off its substrate, like a dialog; top
|
|
239
|
-
* and bottom sheets show a handle. `onOpenChange` hears why
|
|
240
|
-
* (`details.reason`, `'swipe'` included) and can `details.cancel()` it.
|
|
241
|
-
*
|
|
242
|
-
* Statics:
|
|
243
|
-
* - `Sheet.Trigger`, `Sheet.Header`, `Sheet.Footer`, `Sheet.Title`,
|
|
244
|
-
* `Sheet.Description`, `Sheet.Close` — Dialog's parts, which work the same
|
|
245
|
-
* here.
|
|
246
|
-
* - `Sheet.Content` — the panel: `side` (overrides the root's),
|
|
247
|
-
* `initialFocus`, `finalFocus`, `popupClassName` (sizes the popup box),
|
|
248
|
-
* and the morph options `from`, `effect`,
|
|
249
|
-
* `hideSource`, `tier`.
|
|
250
|
-
* - `Sheet.Provider` / `Sheet.Indent` — wrap the page in an `Indent` under a
|
|
251
|
-
* `Provider` and it eases back while any sheet inside is open.
|
|
252
|
-
*
|
|
253
|
-
* @example {@include ./examples.mdx}
|
|
254
|
-
*/
|
|
255
|
-
function Sheet({
|
|
256
|
-
children,
|
|
257
|
-
open,
|
|
258
|
-
defaultOpen,
|
|
259
|
-
onOpenChange,
|
|
260
|
-
side = 'bottom',
|
|
261
|
-
snapPoints,
|
|
262
|
-
defaultSnapPoint,
|
|
263
|
-
modal = true,
|
|
264
|
-
disablePointerDismissal,
|
|
265
|
-
}: SheetProps) {
|
|
266
|
-
const [swiped, setSwiped] = useState(false)
|
|
267
|
-
const [contentSide, setContentSide] = useState<SheetSide>()
|
|
268
|
-
const edge = contentSide ?? side
|
|
269
|
-
|
|
270
|
-
return (
|
|
271
|
-
<SheetContext.Provider value={{ side: edge, swiped, setContentSide }}>
|
|
272
|
-
<DialogState open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange}>
|
|
273
|
-
{root => (
|
|
274
|
-
<DrawerPrimitive.Root
|
|
275
|
-
open={root.open}
|
|
276
|
-
onOpenChange={(next, details) => {
|
|
277
|
-
root.onOpenChange(next, details)
|
|
278
|
-
if (!details.isCanceled) setSwiped(!next && details.reason === 'swipe')
|
|
279
|
-
}}
|
|
280
|
-
swipeDirection={SWIPE[edge]}
|
|
281
|
-
snapPoints={snapPoints}
|
|
282
|
-
defaultSnapPoint={defaultSnapPoint}
|
|
283
|
-
modal={modal}
|
|
284
|
-
disablePointerDismissal={disablePointerDismissal}
|
|
285
|
-
>
|
|
286
|
-
{children}
|
|
287
|
-
</DrawerPrimitive.Root>
|
|
288
|
-
)}
|
|
289
|
-
</DialogState>
|
|
290
|
-
</SheetContext.Provider>
|
|
291
|
-
)
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
Sheet.Trigger = DialogTrigger
|
|
295
|
-
Sheet.Content = SheetContent
|
|
296
|
-
Sheet.Header = DialogHeader
|
|
297
|
-
Sheet.Footer = DialogFooter
|
|
298
|
-
Sheet.Title = DialogTitle
|
|
299
|
-
Sheet.Description = DialogDescription
|
|
300
|
-
Sheet.Close = DialogClose
|
|
301
|
-
Sheet.Provider = DrawerPrimitive.Provider
|
|
302
|
-
Sheet.Indent = SheetIndent
|
|
303
|
-
|
|
304
|
-
export type { SheetContentProps, SheetOpenChangeDetails, SheetProps, SheetSide }
|
|
305
|
-
export { Sheet, SheetContent, SheetIndent }
|
|
306
|
-
|
|
307
|
-
export default Sheet
|