@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,544 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Local addition (not part of Fluid Functionalism): gooey toasts after Sileo
|
|
3
|
-
* (github.com/hiaaryan/sileo `src/sileo.tsx` + `src/styles.css` @
|
|
4
|
-
* 9793f844349983e140cf33cebbb8f51626d41407 — MIT, notice: LICENSE.sileo). A
|
|
5
|
-
* pill with the state's icon and title melts into a body with the description
|
|
6
|
-
* and an action, through the shared goo filter; the body opens a beat after
|
|
7
|
-
* the toast lands and folds back before it leaves (Sileo's autopilot), or
|
|
8
|
-
* whenever it is hovered. Base UI's Toast owns the queue, timers, swipe to
|
|
9
|
-
* dismiss and announcements; Sileo's own store, timers and swipe are not
|
|
10
|
-
* ported. The toast is drawn like every other morph surface: the Elevated
|
|
11
|
-
* level's background shapes melted by the shared goo filter, their shadows
|
|
12
|
-
* beneath, the content on top. Colors are the status tokens, the sizes the
|
|
13
|
-
* control ladder's, and the motion the spring tiers; reduced motion keeps the
|
|
14
|
-
* fades and snaps the shapes. The global `toast()` (`manager.ts`) feeds a
|
|
15
|
-
* `Toast` mounted with `manager={toast}` from anywhere, React or not; titles
|
|
16
|
-
* and descriptions take any node, `icon` replaces the state's glyph and
|
|
17
|
-
* `action` takes a button's `{ label, onClick }` or any node. The state
|
|
18
|
-
* glyphs come from the icon set (`useIcons`), so an `IconProvider` swaps them.
|
|
19
|
-
* `Toast.Action` / `Toast.Close` wrap Base UI's parts as compact Buttons
|
|
20
|
-
* (`render` / `asChild` as the slot shape), so a custom action node needs no
|
|
21
|
-
* `@base-ui/react/toast` import.
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
import { type ToastManager, Toast as ToastPrimitive } from '@base-ui/react/toast'
|
|
25
|
-
import { AnimatePresence, motion } from 'motion/react'
|
|
26
|
-
import {
|
|
27
|
-
cloneElement,
|
|
28
|
-
createContext,
|
|
29
|
-
forwardRef,
|
|
30
|
-
isValidElement,
|
|
31
|
-
type ReactNode,
|
|
32
|
-
type Ref,
|
|
33
|
-
useContext,
|
|
34
|
-
useEffect,
|
|
35
|
-
useId,
|
|
36
|
-
useLayoutEffect,
|
|
37
|
-
useMemo,
|
|
38
|
-
useRef,
|
|
39
|
-
useState,
|
|
40
|
-
} from 'react'
|
|
41
|
-
import { type IconComponent, type IconName, useIcon, useIcons } from '../../../lib/icon-context'
|
|
42
|
-
import { GooFilter } from '../../../lib/morph-layers'
|
|
43
|
-
import { useReduceMotion } from '../../../lib/reduced-motion'
|
|
44
|
-
import { useShape } from '../../../lib/shape-context'
|
|
45
|
-
import { sizeMap } from '../../../lib/size-context'
|
|
46
|
-
import { type SlotProps, slotRender } from '../../../lib/slot'
|
|
47
|
-
import { spring } from '../../../lib/springs'
|
|
48
|
-
import { SURFACE_BG, SURFACE_SHADOW } from '../../../lib/surface-classes'
|
|
49
|
-
import { SurfaceProvider, useSurface } from '../../../lib/surface-context'
|
|
50
|
-
import { GOO_BLUR_RATIO, holdExit } from '../../../lib/use-morph'
|
|
51
|
-
import { cn } from '../../../lib/utils'
|
|
52
|
-
import Button, { type ButtonProps } from '../../button'
|
|
53
|
-
import {
|
|
54
|
-
type ToastActionOptions,
|
|
55
|
-
type ToastData,
|
|
56
|
-
type ToastHandle,
|
|
57
|
-
type ToastInput,
|
|
58
|
-
type ToastOptions,
|
|
59
|
-
type ToastPromiseOptions,
|
|
60
|
-
type ToastSource,
|
|
61
|
-
type ToastType,
|
|
62
|
-
toast,
|
|
63
|
-
toManagerOptions,
|
|
64
|
-
} from './manager'
|
|
65
|
-
|
|
66
|
-
type ToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right'
|
|
67
|
-
|
|
68
|
-
const ICONS: Record<ToastType, IconName> = {
|
|
69
|
-
success: 'check',
|
|
70
|
-
loading: 'loader-circle',
|
|
71
|
-
error: 'x',
|
|
72
|
-
warning: 'circle-alert',
|
|
73
|
-
info: 'info',
|
|
74
|
-
action: 'arrow-right',
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Literal per state so the class extractor sees each one.
|
|
78
|
-
const TONES: Record<ToastType, string> = {
|
|
79
|
-
success: 'text-status-success bg-status-success/16',
|
|
80
|
-
loading: 'text-status-loading bg-status-loading/16',
|
|
81
|
-
error: 'text-status-error bg-status-error/16',
|
|
82
|
-
warning: 'text-status-warning bg-status-warning/16',
|
|
83
|
-
info: 'text-status-info bg-status-info/16',
|
|
84
|
-
action: 'text-status-action bg-status-action/16',
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const VIEWPORT: Record<ToastPosition, string> = {
|
|
88
|
-
'top-left': 'top-4 left-4 items-start',
|
|
89
|
-
'top-center': 'top-4 left-1/2 -translate-x-1/2 items-center',
|
|
90
|
-
'top-right': 'top-4 right-4 items-end',
|
|
91
|
-
'bottom-left': 'bottom-4 left-4 flex-col-reverse items-start',
|
|
92
|
-
'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2 flex-col-reverse items-center',
|
|
93
|
-
'bottom-right': 'bottom-4 right-4 flex-col-reverse items-end',
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// The pill is one control tall, and the goo melts as much as its radius allows.
|
|
97
|
-
const PILL = sizeMap.default.controlHeight
|
|
98
|
-
const BLUR = (PILL / 2) * GOO_BLUR_RATIO
|
|
99
|
-
const SNAP = { duration: 0 }
|
|
100
|
-
const AUTO_EXPAND_MS = 150
|
|
101
|
-
const AUTO_COLLAPSE_BEFORE_MS = 2000
|
|
102
|
-
|
|
103
|
-
const ToastSettings = createContext<{ position: ToastPosition; timeout: number }>({
|
|
104
|
-
position: 'top-right',
|
|
105
|
-
timeout: 6000,
|
|
106
|
-
})
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Shows toasts from inside a `Toast`: `show`, the per-state shortcuts,
|
|
110
|
-
* `promise`, `update` and `close` (alias `dismiss`), plus the `toasts` showing.
|
|
111
|
-
* Under a `Toast` with `manager={toast}` it works on the same stack as the
|
|
112
|
-
* global `toast()`.
|
|
113
|
-
*/
|
|
114
|
-
function useToast() {
|
|
115
|
-
const manager = ToastPrimitive.useToastManager<ToastData>()
|
|
116
|
-
|
|
117
|
-
return useMemo(() => {
|
|
118
|
-
const show = (o: ToastInput) => manager.add({ type: 'info', ...toManagerOptions(o) })
|
|
119
|
-
const typed = (type: ToastType) => (o: ToastInput) =>
|
|
120
|
-
show(typeof o === 'string' ? { title: o, type } : { ...o, type })
|
|
121
|
-
const result = <T,>(r: ToastPromiseOptions<T>['success']) =>
|
|
122
|
-
typeof r === 'function' ? (value: T) => toManagerOptions(r(value)) : toManagerOptions(r)
|
|
123
|
-
|
|
124
|
-
return {
|
|
125
|
-
toasts: manager.toasts,
|
|
126
|
-
show,
|
|
127
|
-
success: typed('success'),
|
|
128
|
-
error: typed('error'),
|
|
129
|
-
warning: typed('warning'),
|
|
130
|
-
info: typed('info'),
|
|
131
|
-
promise: <T,>(promise: Promise<T>, o: ToastPromiseOptions<T>) =>
|
|
132
|
-
manager.promise(promise, {
|
|
133
|
-
loading: toManagerOptions(o.loading),
|
|
134
|
-
success: result(o.success),
|
|
135
|
-
error: result(o.error),
|
|
136
|
-
}),
|
|
137
|
-
update: (id: string, o: ToastInput) => manager.update(id, toManagerOptions(o)),
|
|
138
|
-
close: manager.close,
|
|
139
|
-
dismiss: manager.close,
|
|
140
|
-
}
|
|
141
|
-
}, [manager])
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
interface Box {
|
|
145
|
-
x: number
|
|
146
|
-
y: number
|
|
147
|
-
width: number
|
|
148
|
-
height: number
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
function Shape({ box, className, shapeRef }: { box: Box; className: string; shapeRef?: Ref<HTMLDivElement> }) {
|
|
152
|
-
const reduced = useReduceMotion()
|
|
153
|
-
return (
|
|
154
|
-
<motion.div
|
|
155
|
-
ref={shapeRef}
|
|
156
|
-
aria-hidden
|
|
157
|
-
className={cn('pointer-events-none absolute top-0 left-0', className)}
|
|
158
|
-
initial={false}
|
|
159
|
-
animate={{ ...box }}
|
|
160
|
-
transition={reduced ? SNAP : spring.slow}
|
|
161
|
-
/>
|
|
162
|
-
)
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/** The pill's glyph: the state's icon, or the toast's own `icon` (a component, or any node). */
|
|
166
|
-
function StatusIcon({ type, icon }: { type: ToastType; icon: ToastData['icon'] }) {
|
|
167
|
-
const icons = useIcons()
|
|
168
|
-
// A component is a function or a forwardRef / memo object; an element is a node.
|
|
169
|
-
const component =
|
|
170
|
-
typeof icon === 'function' ||
|
|
171
|
-
(typeof icon === 'object' && icon !== null && '$$typeof' in icon && !isValidElement(icon))
|
|
172
|
-
if (icon != null && icon !== false && !component) return <>{icon}</>
|
|
173
|
-
const Icon = component ? (icon as IconComponent) : icons[ICONS[type]]
|
|
174
|
-
return <Icon size={14} strokeWidth={2.5} className={type === 'loading' && !component ? 'animate-spin' : undefined} />
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
function ToastItem({ toast }: { toast: ToastPrimitive.Root.ToastObject<ToastData> }) {
|
|
178
|
-
const { position, timeout } = useContext(ToastSettings)
|
|
179
|
-
const shape = useShape()
|
|
180
|
-
// Lifts 2 levels off its substrate with a fixed shadow, like a popover.
|
|
181
|
-
const level = Math.min(useSurface() + 2, 8)
|
|
182
|
-
const gooId = `toast-goo-${useId().replace(/:/g, '')}`
|
|
183
|
-
const type = (toast.type ?? 'info') as ToastType
|
|
184
|
-
const customAction = toast.data?.action
|
|
185
|
-
const top = position.startsWith('top')
|
|
186
|
-
const ending = toast.transitionStatus === 'ending'
|
|
187
|
-
const hasBody = Boolean(toast.description || toast.actionProps || customAction)
|
|
188
|
-
const [hovered, setHovered] = useState(false)
|
|
189
|
-
const [auto, setAuto] = useState(false)
|
|
190
|
-
const expanded = hasBody && type !== 'loading' && !ending && (hovered || auto)
|
|
191
|
-
const root = useRef<HTMLDivElement>(null)
|
|
192
|
-
const header = useRef<HTMLDivElement>(null)
|
|
193
|
-
const body = useRef<HTMLDivElement>(null)
|
|
194
|
-
const bodyShape = useRef<HTMLDivElement>(null)
|
|
195
|
-
const [size, setSize] = useState({ width: 0, pill: PILL, body: 0, radius: 0 })
|
|
196
|
-
|
|
197
|
-
useEffect(() => {
|
|
198
|
-
if (!hasBody || type === 'loading') return
|
|
199
|
-
const life = toast.timeout ?? timeout
|
|
200
|
-
const open = setTimeout(() => setAuto(true), AUTO_EXPAND_MS)
|
|
201
|
-
const close =
|
|
202
|
-
life > 0 ? setTimeout(() => setAuto(false), Math.max(AUTO_EXPAND_MS, life - AUTO_COLLAPSE_BEFORE_MS)) : undefined
|
|
203
|
-
return () => {
|
|
204
|
-
clearTimeout(open)
|
|
205
|
-
clearTimeout(close)
|
|
206
|
-
}
|
|
207
|
-
}, [hasBody, type, toast.timeout, timeout])
|
|
208
|
-
|
|
209
|
-
// The header and the body content keep their natural size (the header is
|
|
210
|
-
// `w-max`, outside the pill), so measuring them never feeds back the
|
|
211
|
-
// animated shapes. A body that appears later (a promise's result) is
|
|
212
|
-
// observed from then on.
|
|
213
|
-
useLayoutEffect(() => {
|
|
214
|
-
const measure = () =>
|
|
215
|
-
setSize({
|
|
216
|
-
width: root.current?.offsetWidth ?? 0,
|
|
217
|
-
pill: Math.max(PILL, header.current?.offsetWidth ?? 0),
|
|
218
|
-
body: body.current?.offsetHeight ?? 0,
|
|
219
|
-
radius: bodyShape.current ? Number.parseFloat(getComputedStyle(bodyShape.current).borderTopLeftRadius) || 0 : 0,
|
|
220
|
-
})
|
|
221
|
-
const observer = new ResizeObserver(measure)
|
|
222
|
-
for (const el of [header.current, body.current]) if (el) observer.observe(el)
|
|
223
|
-
measure()
|
|
224
|
-
return () => observer.disconnect()
|
|
225
|
-
}, [hasBody])
|
|
226
|
-
|
|
227
|
-
useLayoutEffect(() => {
|
|
228
|
-
if (!ending || !root.current) return
|
|
229
|
-
const hold = holdExit(root.current, 'moderate')
|
|
230
|
-
return () => hold.cancel()
|
|
231
|
-
}, [ending])
|
|
232
|
-
|
|
233
|
-
// The pill sits on the toast's side of the screen; the body opens away from
|
|
234
|
-
// the edge. While open, the pill reaches into the body by the body's corner
|
|
235
|
-
// radius, covering that corner, so the outer edge runs straight and the goo
|
|
236
|
-
// only rounds the inner corner (Sileo's open pill). The body's padding on
|
|
237
|
-
// the pill side clears that reach. The header and the body content ride the
|
|
238
|
-
// same values as their shapes, so they never drift apart mid-spring.
|
|
239
|
-
const bodyHeight = expanded ? size.body : 0
|
|
240
|
-
const height = PILL + bodyHeight
|
|
241
|
-
const pillX = position.endsWith('left')
|
|
242
|
-
? 0
|
|
243
|
-
: position.endsWith('right')
|
|
244
|
-
? size.width - size.pill
|
|
245
|
-
: (size.width - size.pill) / 2
|
|
246
|
-
const pillHeight = PILL + Math.min(bodyHeight, size.radius)
|
|
247
|
-
const pill = { x: pillX, y: top ? 0 : height - pillHeight, width: size.pill, height: pillHeight }
|
|
248
|
-
const bodyBox = { x: 0, y: top ? PILL : 0, width: size.width, height: bodyHeight }
|
|
249
|
-
const reduced = useReduceMotion()
|
|
250
|
-
// Reduced motion keeps the fades and drops the travel.
|
|
251
|
-
const away = reduced ? { opacity: 0 } : { opacity: 0, y: top ? -6 : 6, scale: 0.95 }
|
|
252
|
-
const move = reduced ? SNAP : spring.slow
|
|
253
|
-
|
|
254
|
-
return (
|
|
255
|
-
<ToastPrimitive.Root
|
|
256
|
-
ref={root}
|
|
257
|
-
toast={toast}
|
|
258
|
-
swipeDirection={[top ? 'up' : 'down', position.endsWith('left') ? 'left' : 'right']}
|
|
259
|
-
onMouseEnter={() => setHovered(true)}
|
|
260
|
-
onMouseLeave={() => setHovered(false)}
|
|
261
|
-
render={
|
|
262
|
-
<motion.div
|
|
263
|
-
initial={{ ...away, height: PILL }}
|
|
264
|
-
animate={ending ? { ...away, height } : { opacity: 1, y: 0, scale: 1, height }}
|
|
265
|
-
transition={ending ? spring.moderate.exit : { ...spring.moderate, height: move }}
|
|
266
|
-
/>
|
|
267
|
-
}
|
|
268
|
-
className="relative w-[min(22rem,calc(100vw-2rem))] select-none outline-none [translate:var(--toast-swipe-movement-x)_var(--toast-swipe-movement-y)]"
|
|
269
|
-
>
|
|
270
|
-
<GooFilter id={gooId} blur={BLUR} />
|
|
271
|
-
<Shape box={pill} className={cn('rounded-full', SURFACE_SHADOW[3])} />
|
|
272
|
-
{hasBody && <Shape box={bodyBox} className={cn(shape.container, SURFACE_SHADOW[3])} />}
|
|
273
|
-
{/* The filter is the effect itself: it melts the two token-filled shapes into one. */}
|
|
274
|
-
<div aria-hidden className="pointer-events-none absolute inset-0" style={{ filter: `url(#${gooId})` }}>
|
|
275
|
-
<Shape box={pill} className={cn('rounded-full', SURFACE_BG[level])} />
|
|
276
|
-
{hasBody && <Shape box={bodyBox} shapeRef={bodyShape} className={cn(shape.container, SURFACE_BG[level])} />}
|
|
277
|
-
</div>
|
|
278
|
-
|
|
279
|
-
<SurfaceProvider value={level}>
|
|
280
|
-
<motion.div
|
|
281
|
-
ref={header}
|
|
282
|
-
className="absolute top-0 left-0 flex h-9 w-max items-center py-1.5 pr-4 pl-1.5"
|
|
283
|
-
initial={false}
|
|
284
|
-
animate={{ x: pillX, y: top ? 0 : height - PILL }}
|
|
285
|
-
transition={move}
|
|
286
|
-
>
|
|
287
|
-
<ToastPrimitive.Title className="relative inline-flex items-center whitespace-nowrap">
|
|
288
|
-
<AnimatePresence mode="popLayout" initial={false}>
|
|
289
|
-
<motion.span
|
|
290
|
-
// A string title keys itself; a node title crossfades on each update.
|
|
291
|
-
key={`${type}-${typeof toast.title === 'string' ? toast.title : toast.updateKey}`}
|
|
292
|
-
className="inline-flex items-center gap-2"
|
|
293
|
-
initial={{ opacity: 0, filter: 'blur(4px)' }}
|
|
294
|
-
animate={{ opacity: 1, filter: 'blur(0px)' }}
|
|
295
|
-
exit={{ opacity: 0, filter: 'blur(4px)', transition: spring.moderate.exit }}
|
|
296
|
-
transition={spring.moderate}
|
|
297
|
-
>
|
|
298
|
-
<span className={cn('flex size-6 items-center justify-center rounded-full', TONES[type])}>
|
|
299
|
-
<StatusIcon type={type} icon={toast.data?.icon} />
|
|
300
|
-
</span>
|
|
301
|
-
<span className="text-body weight-medium text-foreground">{toast.title}</span>
|
|
302
|
-
</motion.span>
|
|
303
|
-
</AnimatePresence>
|
|
304
|
-
</ToastPrimitive.Title>
|
|
305
|
-
</motion.div>
|
|
306
|
-
{hasBody && (
|
|
307
|
-
<motion.div
|
|
308
|
-
className="absolute top-0 left-0 w-full overflow-hidden"
|
|
309
|
-
initial={false}
|
|
310
|
-
animate={{ y: bodyBox.y, height: bodyHeight, opacity: expanded ? 1 : 0 }}
|
|
311
|
-
transition={{ ...move, opacity: expanded ? spring.slow : spring.slow.exit }}
|
|
312
|
-
>
|
|
313
|
-
<div ref={body} className={cn('flex flex-col items-start gap-3 p-4', top ? 'pt-6' : 'pb-6')}>
|
|
314
|
-
<ToastPrimitive.Description className="text-caption text-muted-foreground" />
|
|
315
|
-
{toast.actionProps && <ToastPrimitive.Action render={<Button size="compact" variant="secondary" />} />}
|
|
316
|
-
{customAction}
|
|
317
|
-
</div>
|
|
318
|
-
</motion.div>
|
|
319
|
-
)}
|
|
320
|
-
</SurfaceProvider>
|
|
321
|
-
</ToastPrimitive.Root>
|
|
322
|
-
)
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
function ToastList() {
|
|
326
|
-
const { toasts } = ToastPrimitive.useToastManager<ToastData>()
|
|
327
|
-
return toasts.map(toast => <ToastItem key={toast.id} toast={toast} />)
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
interface ToastTriggerProps extends Omit<SlotProps, 'type' | 'title'> {
|
|
331
|
-
/** The toast's title, in the pill. */
|
|
332
|
-
title?: ReactNode
|
|
333
|
-
/** Text for the body the pill melts into. */
|
|
334
|
-
description?: ReactNode
|
|
335
|
-
/** State: sets the icon and its color. Defaults to `'info'`. */
|
|
336
|
-
type?: 'success' | 'loading' | 'error' | 'warning' | 'info' | 'action'
|
|
337
|
-
/** Ms before it leaves; 0 keeps it until dismissed. Defaults to the `Toast`'s `timeout`. */
|
|
338
|
-
timeout?: number
|
|
339
|
-
/** Replaces the state's icon in the pill: an icon component, or any node. */
|
|
340
|
-
icon?: IconComponent | ReactNode
|
|
341
|
-
/** A button in the body (`{ label, onClick }`), or any node. */
|
|
342
|
-
action?: ToastActionOptions | ReactNode
|
|
343
|
-
/** Runs a task: the toast shows `title` while it is pending, then `success` or `error`. */
|
|
344
|
-
promise?: () => Promise<unknown>
|
|
345
|
-
/** The toast once `promise` resolves. */
|
|
346
|
-
success?: ToastOptions
|
|
347
|
-
/** The toast if `promise` rejects. */
|
|
348
|
-
error?: ToastOptions
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
const ToastTrigger = forwardRef<HTMLButtonElement, ToastTriggerProps>(
|
|
352
|
-
(
|
|
353
|
-
{
|
|
354
|
-
title,
|
|
355
|
-
description,
|
|
356
|
-
type,
|
|
357
|
-
timeout,
|
|
358
|
-
icon,
|
|
359
|
-
action,
|
|
360
|
-
promise,
|
|
361
|
-
success,
|
|
362
|
-
error,
|
|
363
|
-
render,
|
|
364
|
-
asChild,
|
|
365
|
-
children,
|
|
366
|
-
onClick,
|
|
367
|
-
// The element is the control itself (cloned, no Base UI button), so there is nothing to tell.
|
|
368
|
-
nativeButton: _nativeButton,
|
|
369
|
-
...props
|
|
370
|
-
},
|
|
371
|
-
ref,
|
|
372
|
-
) => {
|
|
373
|
-
const toasts = useToast()
|
|
374
|
-
const el = slotRender(render, asChild, children)
|
|
375
|
-
const press = (event: React.MouseEvent<HTMLButtonElement>) => {
|
|
376
|
-
onClick?.(event)
|
|
377
|
-
if (promise) {
|
|
378
|
-
// The error toast is the report; the rejection Base UI hands back would only surface unhandled.
|
|
379
|
-
toasts
|
|
380
|
-
.promise(promise(), { loading: { title, description, icon }, success: success ?? {}, error: error ?? {} })
|
|
381
|
-
.catch(() => {})
|
|
382
|
-
return
|
|
383
|
-
}
|
|
384
|
-
toasts.show({ title, description, type, timeout, icon, action })
|
|
385
|
-
}
|
|
386
|
-
return el ? (
|
|
387
|
-
cloneElement(el, { ...props, ref, onClick: press })
|
|
388
|
-
) : (
|
|
389
|
-
<button ref={ref} type="button" {...props} onClick={press}>
|
|
390
|
-
{children}
|
|
391
|
-
</button>
|
|
392
|
-
)
|
|
393
|
-
},
|
|
394
|
-
)
|
|
395
|
-
ToastTrigger.displayName = 'ToastTrigger'
|
|
396
|
-
|
|
397
|
-
type ToastButtonVariant = NonNullable<ButtonProps['variant']>
|
|
398
|
-
|
|
399
|
-
interface ToastActionProps extends SlotProps {
|
|
400
|
-
/** The Button's variant when there is no `render` element. Defaults to `'secondary'`. */
|
|
401
|
-
variant?: ToastButtonVariant
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
/**
|
|
405
|
-
* A button inside a toast (a custom `action` node or `description`), on Base UI's
|
|
406
|
-
* `Toast.Action`: a compact Button by default, or `render` / `asChild`. A toast shown with
|
|
407
|
-
* `action: { label, onClick }` already renders one.
|
|
408
|
-
*/
|
|
409
|
-
const ToastAction = forwardRef<HTMLButtonElement, ToastActionProps>(
|
|
410
|
-
({ render, asChild, children, variant = 'secondary', ...props }, ref) => {
|
|
411
|
-
const child = asChild && isValidElement(children) ? children : undefined
|
|
412
|
-
const el = render ?? child ?? <Button size="compact" variant={variant} />
|
|
413
|
-
// Base UI renders the action only when it has children, so they go to the part, not the element.
|
|
414
|
-
const label = child
|
|
415
|
-
? (child.props as { children?: ReactNode }).children
|
|
416
|
-
: (children ?? (el.props as { children?: ReactNode }).children)
|
|
417
|
-
return (
|
|
418
|
-
<ToastPrimitive.Action ref={ref} render={el} {...props}>
|
|
419
|
-
{label}
|
|
420
|
-
</ToastPrimitive.Action>
|
|
421
|
-
)
|
|
422
|
-
},
|
|
423
|
-
)
|
|
424
|
-
ToastAction.displayName = 'ToastAction'
|
|
425
|
-
|
|
426
|
-
interface ToastCloseProps extends SlotProps {
|
|
427
|
-
/** The Button's variant when there is no `render` element. Defaults to `'ghost'`. */
|
|
428
|
-
variant?: ToastButtonVariant
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
/**
|
|
432
|
-
* Dismisses the toast it sits in (a custom `action` node or `description`), on Base UI's
|
|
433
|
-
* `Toast.Close`: a compact Button around `children`, an ✕ labelled `Close` without them, or
|
|
434
|
-
* `render` / `asChild`.
|
|
435
|
-
*/
|
|
436
|
-
const ToastClose = forwardRef<HTMLButtonElement, ToastCloseProps>(
|
|
437
|
-
({ render, asChild, children, variant = 'ghost', ...props }, ref) => {
|
|
438
|
-
const XIcon = useIcon('x')
|
|
439
|
-
const el =
|
|
440
|
-
slotRender(render, asChild, children) ??
|
|
441
|
-
(children === undefined ? (
|
|
442
|
-
<Button size="icon-compact" variant={variant} aria-label="Close">
|
|
443
|
-
<XIcon />
|
|
444
|
-
</Button>
|
|
445
|
-
) : (
|
|
446
|
-
<Button size="compact" variant={variant}>
|
|
447
|
-
{children}
|
|
448
|
-
</Button>
|
|
449
|
-
))
|
|
450
|
-
return <ToastPrimitive.Close ref={ref} render={el} {...props} />
|
|
451
|
-
},
|
|
452
|
-
)
|
|
453
|
-
ToastClose.displayName = 'ToastClose'
|
|
454
|
-
|
|
455
|
-
interface ToastProps {
|
|
456
|
-
/** Where toasts stack; the pill sits on that side and the body opens away from the edge. Defaults to `'top-right'`. */
|
|
457
|
-
position?: 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right'
|
|
458
|
-
/** How many toasts show at once; older ones wait. Defaults to `3`. */
|
|
459
|
-
limit?: number
|
|
460
|
-
/** Ms a toast stays; hovering pauses it. Defaults to `6000`. */
|
|
461
|
-
timeout?: number
|
|
462
|
-
/** Also renders the toasts this manager shows: pass the global `toast` so `toast()` calls from anywhere land here (mount one such `Toast` per app), or a manager from Base UI's `Toast.createToastManager()`. */
|
|
463
|
-
manager?: ToastSource
|
|
464
|
-
/** The part of the app that can show toasts, with `Toast.Trigger`s or `useToast()`. Optional: a `Toast` with a `manager` can stand alone. */
|
|
465
|
-
children?: ReactNode
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
/**
|
|
469
|
-
* Gooey toasts: a pill with the state's icon and title that melts into a body
|
|
470
|
-
* with the details.
|
|
471
|
-
*
|
|
472
|
-
* Each toast lands as a pill one control tall; when it has a description or
|
|
473
|
-
* an action, the pill melts into a body a beat later through the shared goo
|
|
474
|
-
* filter (see Morph), and folds back before it leaves, or stays open while
|
|
475
|
-
* hovered. Six states (`success`, `loading`, `error`, `warning`, `info`,
|
|
476
|
-
* `action`) set the icon and its status color; a promise toast spins as
|
|
477
|
-
* `loading` and crossfades into its result. Built on Base UI's Toast:
|
|
478
|
-
* timers pause on hover, a swipe toward the edge dismisses, and screen
|
|
479
|
-
* readers hear every toast.
|
|
480
|
-
*
|
|
481
|
-
* `Toast` wraps the part of the app that shows toasts and renders them at
|
|
482
|
-
* its `position`. Show one with `Toast.Trigger`, or call `useToast()`
|
|
483
|
-
* inside it: `show`, `success`, `error`, `warning`, `info`, `promise`,
|
|
484
|
-
* `update` and `close`.
|
|
485
|
-
*
|
|
486
|
-
* Or mount one `<Toast manager={toast} />` near the root and call the global
|
|
487
|
-
* `toast()` from anywhere, inside React or not: `toast({ title, description,
|
|
488
|
-
* type, timeout, icon, action, onClose })`, `toast.success`, `.error`,
|
|
489
|
-
* `.warning`, `.info`, `.loading`, `.promise`, `.update(id, …)` and
|
|
490
|
-
* `.dismiss(id?)`. Each call returns a handle with the toast's `id`,
|
|
491
|
-
* `update` and `dismiss`; calls made before the `Toast` mounts wait for it.
|
|
492
|
-
* Titles and descriptions take any node, `icon` replaces the state's glyph,
|
|
493
|
-
* and `action` is a button (`{ label, onClick }`) or any node.
|
|
494
|
-
*
|
|
495
|
-
* Statics:
|
|
496
|
-
* - `Toast.Action` / `Toast.Close` — a button and a dismiss for a custom
|
|
497
|
-
* `action` node (or a description): compact Buttons by default (the close
|
|
498
|
-
* an ✕ without children), or `render` / `asChild`.
|
|
499
|
-
* - `Toast.Trigger` — a control that shows a toast when pressed:
|
|
500
|
-
* `render={<Button/>}` or `asChild`, with the toast's `title`,
|
|
501
|
-
* `description`, `type`, `timeout`, `action`, or a `promise` with its
|
|
502
|
-
* `success` / `error` toasts.
|
|
503
|
-
*
|
|
504
|
-
* @example {@include ./examples.mdx}
|
|
505
|
-
*/
|
|
506
|
-
function Toast({ position = 'top-right', limit = 3, timeout = 6000, manager, children }: ToastProps) {
|
|
507
|
-
const settings = useMemo(() => ({ position, timeout }), [position, timeout])
|
|
508
|
-
|
|
509
|
-
return (
|
|
510
|
-
// The provider only ever subscribes to the manager, which is all a `ToastSource` promises.
|
|
511
|
-
<ToastPrimitive.Provider limit={limit} timeout={timeout} toastManager={manager as ToastManager | undefined}>
|
|
512
|
-
<ToastSettings.Provider value={settings}>
|
|
513
|
-
{children}
|
|
514
|
-
<ToastPrimitive.Portal>
|
|
515
|
-
<ToastPrimitive.Viewport className={cn('fixed z-[60] flex flex-col gap-2 outline-none', VIEWPORT[position])}>
|
|
516
|
-
<ToastList />
|
|
517
|
-
</ToastPrimitive.Viewport>
|
|
518
|
-
</ToastPrimitive.Portal>
|
|
519
|
-
</ToastSettings.Provider>
|
|
520
|
-
</ToastPrimitive.Provider>
|
|
521
|
-
)
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
Toast.Trigger = ToastTrigger
|
|
525
|
-
Toast.Action = ToastAction
|
|
526
|
-
Toast.Close = ToastClose
|
|
527
|
-
|
|
528
|
-
export type {
|
|
529
|
-
ToastActionOptions,
|
|
530
|
-
ToastActionProps,
|
|
531
|
-
ToastCloseProps,
|
|
532
|
-
ToastHandle,
|
|
533
|
-
ToastInput,
|
|
534
|
-
ToastOptions,
|
|
535
|
-
ToastPosition,
|
|
536
|
-
ToastPromiseOptions,
|
|
537
|
-
ToastProps,
|
|
538
|
-
ToastSource,
|
|
539
|
-
ToastTriggerProps,
|
|
540
|
-
ToastType,
|
|
541
|
-
}
|
|
542
|
-
export { Toast, ToastAction, ToastClose, ToastTrigger, toast, useToast }
|
|
543
|
-
|
|
544
|
-
export default Toast
|