@justanarthur/modo-ui 0.5.0 → 0.6.0-canary.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/DESIGN.md +608 -0
- package/README.md +61 -39
- package/blocks/sidebar-app/examples.mdx +33 -0
- package/blocks/sidebar-app/index.tsx +218 -0
- package/blocks/sidebar-app/inset-topbar.tsx +25 -0
- package/blocks/sidebar-app/menu-grid.ts +26 -0
- package/blocks/sidebar-app/nav-data.ts +36 -0
- package/blocks/sidebar-app/search-field.tsx +48 -0
- package/blocks/sidebar-app/user-footer.tsx +67 -0
- package/blocks/sidebar-app/workspace-header.tsx +129 -0
- package/components/AI/input-message/examples.mdx +124 -0
- package/components/AI/input-message/file-thumbnail.tsx +173 -0
- package/components/AI/input-message/index.tsx +1383 -0
- package/components/AI/thinking-indicator/examples.mdx +27 -0
- package/components/AI/thinking-indicator/index.tsx +210 -0
- package/components/accordion/examples.mdx +148 -0
- package/components/accordion/index.tsx +1034 -0
- package/components/avatar/examples.mdx +95 -0
- package/components/avatar/index.tsx +129 -0
- package/components/badge/change-demo.tsx +29 -0
- package/components/badge/examples.mdx +120 -0
- package/components/badge/index.tsx +225 -0
- package/components/badge/variants.ts +73 -0
- package/components/button/examples.mdx +164 -0
- package/components/button/index.tsx +416 -0
- package/components/button/loading-demo.tsx +25 -0
- package/components/button/variants.ts +166 -0
- package/components/card/examples.mdx +212 -0
- package/components/card/index.tsx +1037 -0
- package/components/copy/examples.mdx +87 -0
- package/components/copy/index.tsx +482 -0
- package/components/inputs/checkbox/examples.mdx +83 -0
- package/components/inputs/checkbox/index.tsx +611 -0
- package/components/inputs/checkbox/select-all-demo.tsx +48 -0
- package/components/inputs/color-picker/examples.mdx +72 -0
- package/components/inputs/color-picker/index.tsx +1955 -0
- package/components/inputs/color-picker/variants.ts +401 -0
- package/components/inputs/combobox/examples.mdx +273 -0
- package/components/inputs/combobox/index.tsx +1436 -0
- package/components/inputs/combobox/remote-demo.tsx +101 -0
- package/components/inputs/date-time/calendar/examples.mdx +34 -0
- package/components/inputs/date-time/calendar/index.tsx +351 -0
- package/components/inputs/date-time/calendar/use-month-window.ts +163 -0
- package/components/inputs/date-time/date-picker/examples.mdx +166 -0
- package/components/inputs/date-time/date-picker/index.tsx +385 -0
- package/components/inputs/date-time/date-picker/masked-date-input.tsx +336 -0
- package/components/inputs/date-time/date-range-picker/examples.mdx +29 -0
- package/components/inputs/date-time/date-range-picker/index.tsx +217 -0
- package/components/inputs/date-time/duration-picker/examples.mdx +16 -0
- package/components/inputs/date-time/duration-picker/index.tsx +189 -0
- package/components/inputs/date-time/month-picker/examples.mdx +16 -0
- package/components/inputs/date-time/month-picker/index.tsx +190 -0
- package/components/inputs/date-time/picker-shell.tsx +395 -0
- package/components/inputs/date-time/time-columns.tsx +91 -0
- package/components/inputs/date-time/time-picker/examples.mdx +26 -0
- package/components/inputs/date-time/time-picker/index.tsx +166 -0
- package/components/inputs/field/examples.mdx +113 -0
- package/components/inputs/field/index.tsx +267 -0
- package/components/inputs/file-dropzone/examples.mdx +73 -0
- package/components/inputs/file-dropzone/file-row.tsx +201 -0
- package/components/inputs/file-dropzone/index.tsx +296 -0
- package/components/inputs/file-dropzone/upload-demo.tsx +67 -0
- package/components/inputs/file-dropzone/variants.ts +94 -0
- package/components/inputs/input/examples.mdx +135 -0
- package/components/inputs/input/index.tsx +494 -0
- package/components/inputs/input/password-demo.tsx +30 -0
- package/components/inputs/label/examples.mdx +67 -0
- package/components/inputs/label/index.tsx +85 -0
- package/components/inputs/number-input/examples.mdx +56 -0
- package/components/inputs/number-input/index.tsx +214 -0
- package/components/inputs/radio/examples.mdx +77 -0
- package/components/inputs/radio/index.tsx +636 -0
- package/components/inputs/search/examples.mdx +74 -0
- package/components/inputs/search/index.tsx +333 -0
- package/components/inputs/select/examples.mdx +218 -0
- package/components/inputs/select/index.tsx +862 -0
- package/components/inputs/select/variants.ts +32 -0
- package/components/inputs/slider/examples.mdx +127 -0
- package/components/inputs/slider/index.tsx +1725 -0
- package/components/inputs/switch/examples.mdx +94 -0
- package/components/inputs/switch/index.tsx +504 -0
- package/components/inputs/textarea/examples.mdx +88 -0
- package/components/inputs/textarea/index.tsx +161 -0
- package/components/navigation/navigation-menu/examples.mdx +109 -0
- package/components/navigation/navigation-menu/index.tsx +613 -0
- package/components/navigation/pagination/examples.mdx +64 -0
- package/components/navigation/pagination/index.tsx +395 -0
- package/components/navigation/sidebar/examples.mdx +319 -0
- package/components/navigation/sidebar/index.tsx +453 -0
- package/components/navigation/sidebar/sidebar-core.tsx +1408 -0
- package/components/navigation/sidebar/sidebar-menu.tsx +1495 -0
- package/components/navigation/sidebar/sidebar.css +74 -0
- package/components/navigation/sidebar/variants.ts +55 -0
- package/components/navigation/tabs/examples.mdx +89 -0
- package/components/navigation/tabs/index.tsx +494 -0
- package/components/navigation/tabs-subtle/examples.mdx +49 -0
- package/components/navigation/tabs-subtle/index.tsx +512 -0
- package/components/overlays/alert-dialog/examples.mdx +123 -0
- package/components/overlays/alert-dialog/index.tsx +258 -0
- package/components/overlays/alert-dialog/pending-demo.tsx +36 -0
- package/components/overlays/command/examples.mdx +113 -0
- package/components/overlays/command/index.tsx +416 -0
- package/components/overlays/context-menu/examples.mdx +56 -0
- package/components/overlays/context-menu/index.tsx +279 -0
- package/components/overlays/dialog/examples.mdx +144 -0
- package/components/overlays/dialog/index.tsx +366 -0
- package/components/overlays/dropdown/dropdown-search.tsx +395 -0
- package/components/overlays/dropdown/examples.mdx +294 -0
- package/components/overlays/dropdown/index.tsx +1168 -0
- package/components/overlays/dropdown/menu-item.tsx +464 -0
- package/components/overlays/dropdown/menu-parts.tsx +660 -0
- package/components/overlays/popover/anchored-demo.tsx +59 -0
- package/components/overlays/popover/examples.mdx +180 -0
- package/components/overlays/popover/index.tsx +315 -0
- package/components/overlays/preview-card/examples.mdx +61 -0
- package/components/overlays/preview-card/index.tsx +204 -0
- package/components/overlays/sheet/examples.mdx +89 -0
- package/components/overlays/sheet/index.tsx +247 -0
- package/components/overlays/toast/examples.mdx +68 -0
- package/components/overlays/toast/global-demo.tsx +72 -0
- package/components/overlays/toast/index.tsx +474 -0
- package/components/overlays/toast/manager.ts +193 -0
- package/components/overlays/tooltip/examples.mdx +106 -0
- package/components/overlays/tooltip/index.tsx +519 -0
- package/components/progress/examples.mdx +59 -0
- package/components/progress/index.tsx +174 -0
- package/components/progress/progress.css +49 -0
- package/components/progress/step-demo.tsx +27 -0
- package/components/table/examples.mdx +184 -0
- package/components/table/index.tsx +510 -0
- package/components/table/sort-demo.tsx +61 -0
- package/dist/base.css +100 -0
- package/dist/blocks/sidebar-app/index.js +39 -26
- package/dist/components/AI/input-message/index.js +22 -16
- package/dist/components/AI/thinking-indicator/index.js +9 -6
- package/dist/components/accordion/index.js +16 -13
- package/dist/components/avatar/index.d.ts +46 -0
- package/dist/components/avatar/index.js +18 -0
- package/dist/components/badge/index.d.ts +18 -11
- package/dist/components/badge/index.js +11 -7
- package/dist/components/badge/variants.d.ts +33 -0
- package/dist/components/badge/variants.js +10 -0
- package/dist/components/button/index.d.ts +53 -17
- package/dist/components/button/index.js +10 -6
- package/dist/components/button/variants.d.ts +39 -0
- package/dist/components/button/variants.js +8 -0
- package/dist/components/card/index.d.ts +16 -3
- package/dist/components/card/index.js +16 -11
- package/dist/components/copy/index.js +13 -9
- package/dist/components/inputs/checkbox/index.d.ts +28 -9
- package/dist/components/inputs/checkbox/index.js +17 -13
- package/dist/components/inputs/color-picker/index.d.ts +13 -13
- package/dist/components/inputs/color-picker/index.js +25 -18
- package/dist/components/inputs/color-picker/variants.d.ts +61 -0
- package/dist/components/inputs/color-picker/variants.js +28 -0
- package/dist/components/inputs/combobox/index.d.ts +60 -17
- package/dist/components/inputs/combobox/index.js +26 -18
- package/dist/components/inputs/date-time/calendar/index.js +14 -11
- package/dist/components/inputs/date-time/date-picker/index.d.ts +53 -11
- package/dist/components/inputs/date-time/date-picker/index.js +33 -25
- package/dist/components/inputs/date-time/date-range-picker/index.d.ts +3 -3
- package/dist/components/inputs/date-time/date-range-picker/index.js +32 -24
- package/dist/components/inputs/date-time/duration-picker/index.d.ts +3 -3
- package/dist/components/inputs/date-time/duration-picker/index.js +32 -24
- package/dist/components/inputs/date-time/month-picker/index.d.ts +3 -3
- package/dist/components/inputs/date-time/month-picker/index.js +31 -23
- package/dist/components/inputs/date-time/time-picker/index.d.ts +3 -3
- package/dist/components/inputs/date-time/time-picker/index.js +32 -24
- package/dist/components/inputs/field/index.d.ts +116 -0
- package/dist/components/inputs/field/index.js +28 -0
- package/dist/components/inputs/file-dropzone/index.d.ts +165 -0
- package/dist/components/inputs/file-dropzone/index.js +32 -0
- package/dist/components/inputs/file-dropzone/variants.d.ts +35 -0
- package/dist/components/inputs/file-dropzone/variants.js +12 -0
- package/dist/components/inputs/input/index.d.ts +95 -13
- package/dist/components/inputs/input/index.js +17 -9
- package/dist/components/inputs/label/index.d.ts +32 -0
- package/dist/components/inputs/label/index.js +11 -0
- package/dist/components/inputs/number-input/index.d.ts +84 -0
- package/dist/components/inputs/number-input/index.js +20 -0
- package/dist/components/inputs/radio/index.d.ts +20 -5
- package/dist/components/inputs/radio/index.js +15 -12
- package/dist/components/inputs/search/index.js +25 -18
- package/dist/components/inputs/select/index.d.ts +41 -11
- package/dist/components/inputs/select/index.js +27 -14
- package/dist/components/inputs/select/variants.d.ts +5 -0
- package/dist/components/inputs/select/variants.js +6 -0
- package/dist/components/inputs/slider/index.js +7 -5
- package/dist/components/inputs/switch/index.d.ts +8 -2
- package/dist/components/inputs/switch/index.js +14 -12
- package/dist/components/inputs/textarea/index.d.ts +4 -0
- package/dist/components/inputs/textarea/index.js +8 -6
- package/dist/components/navigation/navigation-menu/index.d.ts +114 -0
- package/dist/components/navigation/navigation-menu/index.js +40 -0
- package/dist/components/navigation/pagination/index.d.ts +73 -0
- package/dist/components/navigation/pagination/index.js +39 -0
- package/dist/components/navigation/sidebar/index.d.ts +44 -21
- package/dist/components/navigation/sidebar/index.js +41 -31
- package/dist/components/navigation/sidebar/variants.d.ts +25 -0
- package/dist/components/navigation/sidebar/variants.js +28 -0
- package/dist/components/navigation/tabs/index.d.ts +8 -2
- package/dist/components/navigation/tabs/index.js +14 -10
- package/dist/components/navigation/tabs-subtle/index.js +12 -10
- package/dist/components/overlays/alert-dialog/index.d.ts +121 -15
- package/dist/components/overlays/alert-dialog/index.js +22 -13
- package/dist/components/overlays/command/index.js +24 -17
- package/dist/components/overlays/context-menu/index.d.ts +33 -17
- package/dist/components/overlays/context-menu/index.js +27 -18
- package/dist/components/overlays/dialog/index.js +17 -12
- package/dist/components/overlays/dropdown/index.d.ts +257 -31
- package/dist/components/overlays/dropdown/index.js +42 -17
- package/dist/components/overlays/popover/index.d.ts +31 -9
- package/dist/components/overlays/popover/index.js +12 -9
- package/dist/components/overlays/preview-card/index.js +11 -8
- package/dist/components/overlays/sheet/index.js +18 -13
- package/dist/components/overlays/toast/index.d.ts +123 -47
- package/dist/components/overlays/toast/index.js +18 -10
- package/dist/components/overlays/tooltip/index.d.ts +113 -21
- package/dist/components/overlays/tooltip/index.js +15 -6
- package/dist/components/progress/index.d.ts +56 -0
- package/dist/components/progress/index.js +15 -0
- package/dist/components/table/index.d.ts +63 -8
- package/dist/components/table/index.js +19 -9
- package/dist/index.d.ts +2201 -736
- package/dist/index.js +223 -82
- package/dist/lib/date-locale.d.ts +14 -0
- package/dist/lib/date-locale.js +16 -0
- package/dist/lib/field-classes.d.ts +144 -0
- package/dist/lib/field-classes.js +40 -0
- package/dist/lib/field-variants.d.ts +47 -0
- package/dist/lib/field-variants.js +26 -0
- package/dist/lib/fluid-hover-highlight.d.ts +112 -0
- package/dist/lib/fluid-hover-highlight.js +17 -0
- package/dist/lib/focus-ring.d.ts +18 -0
- package/dist/lib/focus-ring.js +10 -0
- package/dist/lib/goo-indicator.d.ts +46 -0
- package/dist/lib/goo-indicator.js +14 -0
- package/dist/lib/icon-context.d.ts +30 -0
- package/dist/lib/icon-context.js +12 -0
- package/dist/lib/inert.d.ts +9 -0
- package/dist/lib/inert.js +8 -0
- package/dist/lib/morph-layers.d.ts +93 -0
- package/dist/lib/morph-layers.js +13 -0
- package/dist/lib/morph-part.d.ts +21 -0
- package/dist/lib/morph-part.js +12 -0
- package/dist/lib/popup.d.ts +20 -0
- package/dist/lib/popup.js +12 -0
- package/dist/lib/reduced-motion.d.ts +9 -0
- package/dist/lib/reduced-motion.js +6 -0
- package/dist/lib/row-index.d.ts +10 -0
- package/dist/lib/row-index.js +8 -0
- package/dist/lib/row-order.d.ts +28 -0
- package/dist/lib/row-order.js +10 -0
- package/dist/lib/scroll-column.d.ts +27 -0
- package/dist/lib/scroll-column.js +18 -0
- package/dist/lib/shape-context.d.ts +30 -0
- package/dist/lib/shape-context.js +12 -0
- package/dist/lib/size-context.d.ts +94 -0
- package/dist/lib/size-context.js +20 -0
- package/dist/lib/size-scale.d.ts +79 -0
- package/dist/lib/size-scale.js +8 -0
- package/dist/lib/slot.d.ts +12 -0
- package/dist/lib/slot.js +6 -0
- package/dist/lib/springs.d.ts +44 -0
- package/dist/lib/springs.js +8 -0
- package/dist/lib/surface-classes.d.ts +19 -0
- package/dist/lib/surface-classes.js +10 -0
- package/dist/lib/surface-context.d.ts +9 -0
- package/dist/lib/surface-context.js +8 -0
- package/dist/lib/use-controllable-state.d.ts +2 -0
- package/dist/lib/use-controllable-state.js +6 -0
- package/dist/lib/use-fluid-hover.d.ts +138 -0
- package/dist/lib/use-fluid-hover.js +14 -0
- package/dist/lib/use-is-mobile.d.ts +2 -0
- package/dist/lib/use-is-mobile.js +6 -0
- package/dist/lib/use-keyboard-nav-gate.d.ts +20 -0
- package/dist/lib/use-keyboard-nav-gate.js +7 -0
- package/dist/lib/use-merge-split.d.ts +47 -0
- package/dist/lib/use-merge-split.js +15 -0
- package/dist/lib/use-morph.d.ts +101 -0
- package/dist/lib/use-morph.js +20 -0
- package/dist/lib/use-touch-primary.d.ts +2 -0
- package/dist/lib/use-touch-primary.js +6 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.js +6 -0
- package/dist/preset.d.ts +17 -0
- package/dist/preset.js +22 -2
- package/dist/primitives/code/index.js +7 -5
- package/dist/primitives/craft/index.js +9 -6
- package/dist/primitives/fluid-hover/index.js +9 -8
- package/dist/primitives/morph/index.js +15 -10
- package/dist/primitives/motion/index.js +10 -8
- package/dist/primitives/scroll-area/index.js +4 -3
- package/dist/primitives/separator/index.d.ts +25 -0
- package/dist/primitives/separator/index.js +9 -0
- package/dist/primitives/sizes/index.js +6 -4
- package/dist/primitives/skeleton/index.d.ts +35 -0
- package/dist/primitives/skeleton/index.js +12 -0
- package/dist/primitives/surface/index.js +6 -4
- package/dist/shared/{components-3mkepka5.js → components-0jmqhx2k.js} +28 -25
- package/dist/shared/components-124epb7f.js +53 -0
- package/dist/shared/{components-gz8zf3ec.js → components-1k0wv53d.js} +15 -43
- package/dist/shared/components-26snnbs9.js +322 -0
- package/dist/shared/{components-2dxkv6zm.js → components-2c0qcfx4.js} +8 -7
- package/dist/shared/{components-473g814w.js → components-2mt9te6d.js} +243 -137
- package/dist/shared/{components-hawvy2qz.js → components-2z48g4fp.js} +9 -30
- package/dist/shared/components-34txk9rj.js +35 -0
- package/dist/shared/components-3h92d94m.js +23 -0
- package/dist/shared/{components-zfnmn5d4.js → components-3sp623ae.js} +36 -31
- package/dist/shared/{components-jwst3vtj.js → components-3wxkjgqn.js} +186 -76
- package/dist/shared/{components-s2bz1xpk.js → components-49bsynbw.js} +8 -5
- package/dist/shared/components-4bwsd46w.js +71 -0
- package/dist/shared/components-4n4f5m3e.js +297 -0
- package/dist/shared/{components-0q0sqfh4.js → components-4y816hwp.js} +27 -49
- package/dist/shared/components-52ngsgca.js +399 -0
- package/dist/shared/{components-y9y0g8er.js → components-52r5763g.js} +22 -19
- package/dist/shared/components-559tf7yb.js +28 -0
- package/dist/shared/components-5mkga9hj.js +440 -0
- package/dist/shared/{components-kwa6mrf9.js → components-5s0nfqvw.js} +14 -9
- package/dist/shared/{components-dk0gjr5a.js → components-60atskhp.js} +19 -18
- package/dist/shared/{components-rr7a6ja9.js → components-658b26nb.js} +21 -18
- package/dist/shared/{components-xxvdw7k1.js → components-65vwfjs6.js} +37 -34
- package/dist/shared/{components-frw34b65.js → components-6j2fh74k.js} +114 -123
- package/dist/shared/components-6zg1yft7.js +167 -0
- package/dist/shared/components-6zng858q.js +53 -0
- package/dist/shared/components-72w4ge68.js +64 -0
- package/dist/shared/{components-cv16mryv.js → components-78x40gee.js} +13 -7
- package/dist/shared/{components-b2wyq2cq.js → components-7d4r7hh1.js} +39 -57
- package/dist/shared/components-7ntvvegr.js +316 -0
- package/dist/shared/components-8nwsqjn8.js +34 -0
- package/dist/shared/{components-5xc2j8jz.js → components-8tt3xbb5.js} +19 -18
- package/dist/shared/{components-vc7vq5nz.js → components-9as3rf68.js} +6 -3
- package/dist/shared/components-9mys9jna.js +255 -0
- package/dist/shared/components-adkarj8n.js +35 -0
- package/dist/shared/{components-b3c5et5b.js → components-ae9fncz4.js} +32 -31
- package/dist/shared/{components-hqeq3w9q.js → components-awra5sff.js} +24 -16
- package/dist/shared/components-b1e239g3.js +28 -0
- package/dist/shared/{components-q5xj5c16.js → components-b1f2bjf1.js} +9 -8
- package/dist/shared/{components-qmmjx1qw.js → components-bn42vq6d.js} +71 -72
- package/dist/shared/components-c96g82th.js +1444 -0
- package/dist/shared/components-c9yr4ed1.js +44 -0
- package/dist/shared/components-d3shbwqq.js +95 -0
- package/dist/shared/{components-jjw69c4c.js → components-dcc02hs2.js} +7 -4
- package/dist/shared/{components-men63rwj.js → components-de99ykt7.js} +3 -2
- package/dist/shared/components-dhgk6mbt.js +16 -0
- package/dist/shared/components-drxrtnp2.js +25 -0
- package/dist/shared/{components-6p8tfcd6.js → components-ds9fqat9.js} +21 -18
- package/dist/shared/{components-mjthm1kf.js → components-egy4tyjt.js} +11 -8
- package/dist/shared/components-f0xfpkhh.js +82 -0
- package/dist/shared/components-f7h57m6t.js +59 -0
- package/dist/shared/{components-d6xtjht3.js → components-fjkpbg6n.js} +33 -30
- package/dist/shared/{components-gc5vtq2f.js → components-gh0qeey3.js} +63 -29
- package/dist/shared/{components-39jq9va1.js → components-gvbapfen.js} +29 -24
- package/dist/shared/{components-5vgpnxgy.js → components-gzesg7hy.js} +19 -16
- package/dist/shared/components-h6p86be3.js +19 -0
- package/dist/shared/components-h83az0bz.js +33 -0
- package/dist/shared/components-jjrj6ymn.js +104 -0
- package/dist/shared/{components-wvp1m52g.js → components-jp5v0m0f.js} +15 -14
- package/dist/shared/{components-zrkzcayz.js → components-jqpefjsn.js} +54 -6
- package/dist/shared/{components-1z6tdadk.js → components-k74j4hwh.js} +20 -17
- package/dist/shared/components-kswxnm3h.js +24 -0
- package/dist/shared/{components-jbbmdr74.js → components-mkkbbgb7.js} +36 -17
- package/dist/shared/{components-pbmqctfa.js → components-mpw667rb.js} +169 -65
- package/dist/shared/{components-s5ngg32c.js → components-paa08427.js} +121 -47
- package/dist/shared/{components-vfbhxf5r.js → components-pd42emw3.js} +6 -5
- package/dist/shared/{components-hw9yk32z.js → components-pmfszv7a.js} +35 -23
- package/dist/shared/{components-chacnk61.js → components-pw06rbxq.js} +19 -19
- package/dist/shared/components-q03cktx8.js +246 -0
- package/dist/shared/{components-kvr7f9hy.js → components-qdm3yh26.js} +19 -10
- package/dist/shared/{components-27nnvrwe.js → components-qs4rkqsj.js} +15 -14
- package/dist/shared/{components-s083f38z.js → components-r6gbmkew.js} +22 -21
- package/dist/shared/{components-ta7shw28.js → components-r8eqs7gz.js} +4 -4
- package/dist/shared/{components-sn1rxx1d.js → components-rm02h9nt.js} +12 -11
- package/dist/shared/{components-c6s6b43g.js → components-rrbpmfx4.js} +3 -2
- package/dist/shared/{components-n7mjr357.js → components-tz1fv35x.js} +3 -2
- package/dist/shared/components-tz4gaf1v.js +23 -0
- package/dist/shared/{components-zx6b6yby.js → components-vf45j12c.js} +4 -18
- package/dist/shared/{components-3ky44908.js → components-vfjc9jzz.js} +2 -3
- package/dist/shared/{components-39vmfq9s.js → components-vsa625vk.js} +21 -20
- package/dist/shared/components-wawnmkph.js +500 -0
- package/dist/shared/components-wktrrb4m.js +38 -0
- package/dist/shared/{components-8snj490h.js → components-wwd363me.js} +78 -32
- package/dist/shared/{components-5pnw8183.js → components-xcwvgcrd.js} +23 -22
- package/dist/shared/components-xdqmt6ed.js +20 -0
- package/dist/shared/{components-h2ajmhwn.js → components-y1w3a6wx.js} +107 -35
- package/dist/shared/{components-ar66gnt0.js → components-y6578b8h.js} +37 -34
- package/dist/shared/{components-59efxjd9.js → components-yhgq0qxx.js} +13 -12
- package/dist/shared/{components-jthe1pwb.js → components-yz84gpkq.js} +101 -404
- package/dist/shared/components-z3v0n0de.js +11 -0
- package/dist/shared/{components-7r3etddy.js → components-z9n19fyk.js} +19 -54
- package/dist/shared/components-zbvjzh1p.js +141 -0
- package/dist/styles.css +241 -16
- package/dist/tailwind.css +13 -0
- package/dist/tokens.css +34 -0
- package/index.ts +60 -0
- package/lib/date-locale.ts +50 -0
- package/lib/field-classes.ts +115 -0
- package/lib/field-variants.ts +117 -0
- package/lib/fluid-hover-highlight.tsx +139 -0
- package/lib/focus-ring.tsx +46 -0
- package/lib/goo-indicator.tsx +261 -0
- package/lib/icon-context.tsx +310 -0
- package/lib/inert.ts +22 -0
- package/lib/morph-layers.tsx +102 -0
- package/lib/morph-part.tsx +49 -0
- package/lib/popup.ts +52 -0
- package/lib/reduced-motion.ts +19 -0
- package/lib/row-index.tsx +29 -0
- package/lib/row-order.tsx +115 -0
- package/lib/scroll-column.tsx +244 -0
- package/lib/shape-context.tsx +124 -0
- package/lib/size-context.tsx +66 -0
- package/lib/size-scale.ts +115 -0
- package/lib/slot.ts +25 -0
- package/lib/springs.ts +62 -0
- package/lib/surface-classes.ts +58 -0
- package/lib/surface-context.tsx +21 -0
- package/lib/use-controllable-state.ts +44 -0
- package/lib/use-fluid-hover.ts +541 -0
- package/lib/use-is-mobile.ts +25 -0
- package/lib/use-keyboard-nav-gate.ts +45 -0
- package/lib/use-merge-split.tsx +209 -0
- package/lib/use-morph.ts +557 -0
- package/lib/use-touch-primary.tsx +43 -0
- package/lib/utils.ts +37 -0
- package/package.json +177 -4
- package/preset.ts +196 -0
- package/primitives/code/examples.mdx +27 -0
- package/primitives/code/index.tsx +80 -0
- package/primitives/craft/demos.tsx +173 -0
- package/primitives/craft/examples.mdx +138 -0
- package/primitives/craft/index.tsx +76 -0
- package/primitives/fluid-hover/examples.mdx +84 -0
- package/primitives/fluid-hover/index.tsx +316 -0
- package/primitives/morph/examples.mdx +135 -0
- package/primitives/morph/index.tsx +192 -0
- package/primitives/motion/examples.mdx +100 -0
- package/primitives/motion/index.tsx +160 -0
- package/primitives/scroll-area/examples.mdx +58 -0
- package/primitives/scroll-area/index.tsx +200 -0
- package/primitives/separator/examples.mdx +30 -0
- package/primitives/separator/index.tsx +53 -0
- package/primitives/sizes/examples.mdx +167 -0
- package/primitives/sizes/index.tsx +89 -0
- package/primitives/skeleton/examples.mdx +51 -0
- package/primitives/skeleton/index.tsx +72 -0
- package/primitives/skeleton/skeleton.css +15 -0
- package/primitives/surface/examples.mdx +173 -0
- package/primitives/surface/index.tsx +109 -0
- package/primitives/surface/surface.css +176 -0
- package/dist/shared/components-0sn7ypjw.js +0 -61
- package/dist/shared/components-1434p1mh.js +0 -123
- package/dist/shared/components-a86dytt0.js +0 -986
- package/dist/shared/components-gf5s6ap9.js +0 -42
- package/dist/shared/components-hyq23phv.js +0 -310
- package/dist/shared/components-ng72k97e.js +0 -128
- package/dist/shared/components-raknhppb.js +0 -64
- package/dist/shared/components-vynjtrk6.js +0 -19
- package/dist/shared/components-wy9jpqny.js +0 -146
- /package/dist/shared/{components-1v7rxytx.js → components-3ey0hzpb.js} +0 -0
- /package/dist/shared/{components-ezxhrmer.js → components-jcnjay5g.js} +0 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Local addition (not part of Fluid Functionalism): a context menu that grows
|
|
3
|
+
* out of the press point through `lib/use-morph.ts`, goo by default. Behavior
|
|
4
|
+
* is Base UI's ContextMenu (right click, long press, positioning at the
|
|
5
|
+
* pointer, roving highlight, typeahead, dismissal). The rows are Dropdown's:
|
|
6
|
+
* `MenuItem` from `components/overlays/dropdown/menu-item.tsx`, `Dropdown.Label` and
|
|
7
|
+
* `Dropdown.Separator`, with the fluid hover highlight gliding between them.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { ContextMenu as ContextMenuPrimitive } from '@base-ui/react/context-menu'
|
|
11
|
+
import {
|
|
12
|
+
createContext,
|
|
13
|
+
forwardRef,
|
|
14
|
+
type ReactNode,
|
|
15
|
+
type RefObject,
|
|
16
|
+
useContext,
|
|
17
|
+
useEffect,
|
|
18
|
+
useImperativeHandle,
|
|
19
|
+
useMemo,
|
|
20
|
+
useRef,
|
|
21
|
+
} from 'react'
|
|
22
|
+
import { FluidHoverHighlight } from '../../../lib/fluid-hover-highlight'
|
|
23
|
+
import { MorphSurface } from '../../../lib/morph-layers'
|
|
24
|
+
import { isDisabledRow, popupScrollAreaClass, popupViewportClass } from '../../../lib/popup'
|
|
25
|
+
import { shapeMap } from '../../../lib/shape-context'
|
|
26
|
+
import { type SizeVariant, useSize } from '../../../lib/size-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 { useFluidHover } from '../../../lib/use-fluid-hover'
|
|
31
|
+
import { type MorphOrigin, useMorph, useMorphOrigin } from '../../../lib/use-morph'
|
|
32
|
+
import { cn } from '../../../lib/utils'
|
|
33
|
+
import { ScrollArea } from '../../../primitives/scroll-area'
|
|
34
|
+
import { SizeProvider } from '../../../primitives/sizes'
|
|
35
|
+
import { DropdownLabel, DropdownSeparator } from '../dropdown'
|
|
36
|
+
import { DropdownContext, MenuItem, type MenuItemProps, type MenuItemRenderOptions } from '../dropdown/menu-item'
|
|
37
|
+
|
|
38
|
+
// The rows' radii, as in Dropdown: menus keep the "rounded" shape whatever the
|
|
39
|
+
// rest of the UI is shaped.
|
|
40
|
+
const shape = shapeMap.rounded
|
|
41
|
+
|
|
42
|
+
interface ContextMenuContextValue {
|
|
43
|
+
open: boolean
|
|
44
|
+
origin: RefObject<MorphOrigin>
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const ContextMenuContext = createContext<ContextMenuContextValue>({ open: false, origin: { current: {} } })
|
|
48
|
+
|
|
49
|
+
const ShortcutContext = createContext<string | undefined>(undefined)
|
|
50
|
+
|
|
51
|
+
function RowShortcut() {
|
|
52
|
+
const shortcut = useContext(ShortcutContext)
|
|
53
|
+
const compact = useSize().variant === 'compact'
|
|
54
|
+
if (!shortcut) return null
|
|
55
|
+
return (
|
|
56
|
+
<kbd
|
|
57
|
+
className={cn('shrink-0 pl-4 font-sans text-muted-foreground', compact ? 'text-caption-compact' : 'text-caption')}
|
|
58
|
+
>
|
|
59
|
+
{shortcut}
|
|
60
|
+
</kbd>
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// MenuItem's render hook: the styled row goes into Base UI's context-menu item.
|
|
65
|
+
function renderMenuItem({
|
|
66
|
+
radio,
|
|
67
|
+
checkbox,
|
|
68
|
+
checked,
|
|
69
|
+
disabled,
|
|
70
|
+
label,
|
|
71
|
+
closeOnClick,
|
|
72
|
+
onClick,
|
|
73
|
+
element,
|
|
74
|
+
children,
|
|
75
|
+
}: MenuItemRenderOptions) {
|
|
76
|
+
// The row's activation goes on the primitive: Base UI's Enter/Space calls
|
|
77
|
+
// only the primitive's own onClick.
|
|
78
|
+
return radio || checkbox ? (
|
|
79
|
+
<ContextMenuPrimitive.CheckboxItem
|
|
80
|
+
checked={checked}
|
|
81
|
+
disabled={disabled}
|
|
82
|
+
label={label}
|
|
83
|
+
closeOnClick={closeOnClick}
|
|
84
|
+
onClick={onClick}
|
|
85
|
+
render={element}
|
|
86
|
+
>
|
|
87
|
+
{children}
|
|
88
|
+
<RowShortcut />
|
|
89
|
+
</ContextMenuPrimitive.CheckboxItem>
|
|
90
|
+
) : (
|
|
91
|
+
<ContextMenuPrimitive.Item
|
|
92
|
+
disabled={disabled}
|
|
93
|
+
label={label}
|
|
94
|
+
closeOnClick={closeOnClick}
|
|
95
|
+
onClick={onClick}
|
|
96
|
+
render={element}
|
|
97
|
+
>
|
|
98
|
+
{children}
|
|
99
|
+
<RowShortcut />
|
|
100
|
+
</ContextMenuPrimitive.Item>
|
|
101
|
+
)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
interface ContextMenuItemProps extends MenuItemProps {
|
|
105
|
+
/** Keyboard shortcut shown at the row's end, e.g. `⌘C`. */
|
|
106
|
+
shortcut?: string
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const ContextMenuItem = forwardRef<HTMLDivElement, ContextMenuItemProps>(({ shortcut, ...props }, ref) => (
|
|
110
|
+
<ShortcutContext.Provider value={shortcut}>
|
|
111
|
+
<MenuItem ref={ref} {...props} />
|
|
112
|
+
</ShortcutContext.Provider>
|
|
113
|
+
))
|
|
114
|
+
ContextMenuItem.displayName = 'ContextMenuItem'
|
|
115
|
+
|
|
116
|
+
interface ContextMenuContentProps {
|
|
117
|
+
/** Where the menu grows from (see Morph): the press point, its own center, a viewport edge, or a ref to any element. Defaults to `'pointer'`. */
|
|
118
|
+
from?: 'pointer' | 'center' | 'top' | 'right' | 'bottom' | 'left' | RefObject<HTMLElement | null>
|
|
119
|
+
/** How it grows (see Morph): with the liquid goo neck, a plain morph, a slide or a fade. Defaults to `'goo'`. */
|
|
120
|
+
effect?: 'goo' | 'morph' | 'slide' | 'fade'
|
|
121
|
+
/** Hide the `from` element while open, so it reads as turning into the menu. Defaults to `false`. */
|
|
122
|
+
hideSource?: boolean
|
|
123
|
+
/** Spring tier of a plain morph, slide or fade; goo runs on its own `spring.goo`. Defaults to `'moderate'`. */
|
|
124
|
+
tier?: 'moderate' | 'slow'
|
|
125
|
+
/** Portal target. Defaults to the document body. */
|
|
126
|
+
container?: HTMLElement | null
|
|
127
|
+
/** Extra classes for the menu surface — it is 14rem wide by default. */
|
|
128
|
+
className?: string
|
|
129
|
+
/** `ContextMenu.Item` rows, plus `ContextMenu.Label` and `ContextMenu.Separator`. */
|
|
130
|
+
children?: ReactNode
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const ContextMenuContent = forwardRef<HTMLDivElement, ContextMenuContentProps>(
|
|
134
|
+
({ from = 'pointer', effect, hideSource, tier = 'moderate', container, className, children }, ref) => {
|
|
135
|
+
const { open, origin } = useContext(ContextMenuContext)
|
|
136
|
+
const morph = useMorph(open, origin, { from, effect, hideSource, tier })
|
|
137
|
+
useImperativeHandle(ref, () => morph.popup as HTMLDivElement, [morph.popup])
|
|
138
|
+
// Fixed shadow, like Dropdown (see Elevated).
|
|
139
|
+
const level = Math.min(useSurface() + 2, 8)
|
|
140
|
+
const containerRef = useRef<HTMLDivElement>(null)
|
|
141
|
+
const hover = useFluidHover(containerRef, { isItemDisabled: isDisabledRow })
|
|
142
|
+
const { activeIndex, setActiveIndex, handlers, registerItem, remeasure } = hover
|
|
143
|
+
|
|
144
|
+
// Rows stay registered between opens, so their rects are stale until the
|
|
145
|
+
// menu is open again; a close drops the highlight so the next open doesn't
|
|
146
|
+
// spring it over from the last row.
|
|
147
|
+
useEffect(() => {
|
|
148
|
+
if (open) remeasure()
|
|
149
|
+
else setActiveIndex(null)
|
|
150
|
+
}, [open, remeasure, setActiveIndex])
|
|
151
|
+
|
|
152
|
+
const rows = useMemo(
|
|
153
|
+
() => ({ registerItem, activeIndex, inMenu: true, renderMenuItem }),
|
|
154
|
+
[registerItem, activeIndex],
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
return (
|
|
158
|
+
<ContextMenuPrimitive.Portal container={container ?? undefined}>
|
|
159
|
+
<ContextMenuPrimitive.Positioner className="z-50 outline-none">
|
|
160
|
+
<ContextMenuPrimitive.Popup
|
|
161
|
+
ref={morph.popupRef}
|
|
162
|
+
onMouseEnter={handlers.onMouseEnter}
|
|
163
|
+
onMouseMove={handlers.onMouseMove}
|
|
164
|
+
onMouseLeave={handlers.onMouseLeave}
|
|
165
|
+
onClick={handlers.onClick}
|
|
166
|
+
// Keyboard navigation moves focus between rows; the hover background follows it.
|
|
167
|
+
onFocus={e => {
|
|
168
|
+
const index = (e.target as HTMLElement)
|
|
169
|
+
.closest('[data-fluid-hover-index]')
|
|
170
|
+
?.getAttribute('data-fluid-hover-index')
|
|
171
|
+
if (index != null) setActiveIndex(Number(index))
|
|
172
|
+
}}
|
|
173
|
+
onBlur={e => {
|
|
174
|
+
if (!e.currentTarget.contains(e.relatedTarget as Node)) setActiveIndex(null)
|
|
175
|
+
}}
|
|
176
|
+
className="relative select-none outline-none"
|
|
177
|
+
>
|
|
178
|
+
<SurfaceProvider value={level}>
|
|
179
|
+
<MorphSurface
|
|
180
|
+
morph={morph}
|
|
181
|
+
bg={SURFACE_BG[level]}
|
|
182
|
+
shadow={SURFACE_SHADOW[3]}
|
|
183
|
+
radius={shape.container}
|
|
184
|
+
className={cn(
|
|
185
|
+
'flex w-56 max-h-[min(480px,var(--available-height))] flex-col overflow-hidden',
|
|
186
|
+
shape.container,
|
|
187
|
+
className,
|
|
188
|
+
)}
|
|
189
|
+
>
|
|
190
|
+
<ScrollArea className={popupScrollAreaClass} viewportClassName={cn(popupViewportClass, 'scroll-fade')}>
|
|
191
|
+
<div ref={containerRef} className="relative flex flex-col p-1">
|
|
192
|
+
<FluidHoverHighlight hover={hover} hidden={!open} className={shape.bg} />
|
|
193
|
+
<DropdownContext.Provider value={rows}>{children}</DropdownContext.Provider>
|
|
194
|
+
</div>
|
|
195
|
+
</ScrollArea>
|
|
196
|
+
</MorphSurface>
|
|
197
|
+
</SurfaceProvider>
|
|
198
|
+
</ContextMenuPrimitive.Popup>
|
|
199
|
+
</ContextMenuPrimitive.Positioner>
|
|
200
|
+
</ContextMenuPrimitive.Portal>
|
|
201
|
+
)
|
|
202
|
+
},
|
|
203
|
+
)
|
|
204
|
+
ContextMenuContent.displayName = 'ContextMenuContent'
|
|
205
|
+
|
|
206
|
+
interface ContextMenuProps {
|
|
207
|
+
/** Controlled open state. Pair with `onOpenChange`. */
|
|
208
|
+
open?: boolean
|
|
209
|
+
/** Initial open state, for an uncontrolled menu. Defaults to `false`. */
|
|
210
|
+
defaultOpen?: boolean
|
|
211
|
+
/** Called when the menu opens or closes. */
|
|
212
|
+
onOpenChange?: (open: boolean) => void
|
|
213
|
+
/** Turns the trigger area back into a plain one: no menu on right click or long press. Defaults to `false`. */
|
|
214
|
+
disabled?: boolean
|
|
215
|
+
/** Pins the rows to one step of the size ladder (default 36px, compact 28px — see Sizes). Omitted, they follow the surrounding SizeProvider. */
|
|
216
|
+
size?: SizeVariant
|
|
217
|
+
/** The area and the menu — `ContextMenu.Trigger` plus a `ContextMenu.Content`. */
|
|
218
|
+
children?: ReactNode
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* A menu that grows out of the pointer on right click, or on a long press on
|
|
223
|
+
* touch: the surface swells from the exact point you pressed into the menu.
|
|
224
|
+
*
|
|
225
|
+
* The morph comes from the shared engine (see Morph): from the press point
|
|
226
|
+
* by default, or from its own center, a viewport edge or any element, with
|
|
227
|
+
* the goo, a plain morph, a slide or a fade. The rows are Dropdown's — the
|
|
228
|
+
* fluid hover background gliding between them, icons that firm up under it,
|
|
229
|
+
* dimmed disabled rows the pointer skips — plus a keyboard shortcut at the
|
|
230
|
+
* end of a row. The menu lifts 2 surface levels off its substrate. Built on
|
|
231
|
+
* Base UI's ContextMenu: it opens at the pointer and flips or shifts to stay
|
|
232
|
+
* on screen, arrow keys and typeahead move between rows, and picking a row,
|
|
233
|
+
* Escape or an outside press closes it.
|
|
234
|
+
*
|
|
235
|
+
* Statics:
|
|
236
|
+
* - `ContextMenu.Trigger` — the area that opens it (a `div`).
|
|
237
|
+
* - `ContextMenu.Content` — the menu: the morph options `from`, `effect`,
|
|
238
|
+
* `hideSource`, `tier`.
|
|
239
|
+
* - `ContextMenu.Item` — a row: `index`, `label`, `icon`, `shortcut`,
|
|
240
|
+
* `onSelect`, `disabled`.
|
|
241
|
+
* - `ContextMenu.Label` / `ContextMenu.Separator` — a caption over a run of
|
|
242
|
+
* rows and a rule between runs (Dropdown's).
|
|
243
|
+
*
|
|
244
|
+
* @example {@include ./examples.mdx}
|
|
245
|
+
*/
|
|
246
|
+
function ContextMenu({ open, defaultOpen = false, onOpenChange, disabled = false, size, children }: ContextMenuProps) {
|
|
247
|
+
const [current, setCurrent] = useControllableState(open, defaultOpen, onOpenChange)
|
|
248
|
+
const { origin, capture } = useMorphOrigin()
|
|
249
|
+
const ctx = useMemo(() => ({ open: current, origin }), [current, origin])
|
|
250
|
+
|
|
251
|
+
const root = (
|
|
252
|
+
<ContextMenuContext.Provider value={ctx}>
|
|
253
|
+
<ContextMenuPrimitive.Root
|
|
254
|
+
open={current}
|
|
255
|
+
disabled={disabled}
|
|
256
|
+
onOpenChange={(next, details) => {
|
|
257
|
+
if (next) capture(details)
|
|
258
|
+
setCurrent(next)
|
|
259
|
+
}}
|
|
260
|
+
>
|
|
261
|
+
{children}
|
|
262
|
+
</ContextMenuPrimitive.Root>
|
|
263
|
+
</ContextMenuContext.Provider>
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
// The portalled menu reads the size through React context.
|
|
267
|
+
return size ? <SizeProvider size={size}>{root}</SizeProvider> : root
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
ContextMenu.Trigger = ContextMenuPrimitive.Trigger
|
|
271
|
+
ContextMenu.Content = ContextMenuContent
|
|
272
|
+
ContextMenu.Item = ContextMenuItem
|
|
273
|
+
ContextMenu.Label = DropdownLabel
|
|
274
|
+
ContextMenu.Separator = DropdownSeparator
|
|
275
|
+
|
|
276
|
+
export type { ContextMenuContentProps, ContextMenuItemProps, ContextMenuProps }
|
|
277
|
+
export { ContextMenu, ContextMenuContent, ContextMenuItem }
|
|
278
|
+
|
|
279
|
+
export default ContextMenu
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import Dialog from './index'
|
|
2
|
+
import Button from '../../button'
|
|
3
|
+
import Select from '../../inputs/select'
|
|
4
|
+
import Morph from '../../../primitives/morph'
|
|
5
|
+
|
|
6
|
+
# Basic
|
|
7
|
+
|
|
8
|
+
A trigger, a header, and a footer whose Cancel is a `Dialog.Close`. The ✕
|
|
9
|
+
in the corner comes with `Dialog.Content`.
|
|
10
|
+
|
|
11
|
+
<Dialog>
|
|
12
|
+
<Dialog.Trigger render={<Button variant="tertiary">Open dialog</Button>} />
|
|
13
|
+
<Dialog.Content>
|
|
14
|
+
<Dialog.Header>
|
|
15
|
+
<Dialog.Title>Create teamspace</Dialog.Title>
|
|
16
|
+
<Dialog.Description>
|
|
17
|
+
Add a new teamspace to organize your projects and collaborate with your team.
|
|
18
|
+
</Dialog.Description>
|
|
19
|
+
</Dialog.Header>
|
|
20
|
+
<Dialog.Footer>
|
|
21
|
+
<Dialog.Close render={<Button variant="ghost">Cancel</Button>} />
|
|
22
|
+
<Button>Create</Button>
|
|
23
|
+
</Dialog.Footer>
|
|
24
|
+
</Dialog.Content>
|
|
25
|
+
</Dialog>
|
|
26
|
+
|
|
27
|
+
# Sizes
|
|
28
|
+
|
|
29
|
+
3 widths: `sm` for a confirmation, `lg` for a short form, `xl` for a
|
|
30
|
+
layout of its own. Each is one notch narrower inside a compact region.
|
|
31
|
+
|
|
32
|
+
<div className="flex flex-wrap items-center gap-2">
|
|
33
|
+
{[
|
|
34
|
+
{ size: 'sm', label: 'Small', copy: '400px: a confirmation, 1 field, a short message.' },
|
|
35
|
+
{ size: 'lg', label: 'Large', copy: '540px: a short form, or a longer confirmation.' },
|
|
36
|
+
{ size: 'xl', label: 'Extra large', copy: '880px: 2 columns, a table, or a sidebar beside a panel.' },
|
|
37
|
+
].map(({ size, label, copy }) => (
|
|
38
|
+
<Dialog key={label}>
|
|
39
|
+
<Dialog.Trigger render={<Button variant="secondary">{label}</Button>} />
|
|
40
|
+
<Dialog.Content size={size}>
|
|
41
|
+
<Dialog.Header>
|
|
42
|
+
<Dialog.Title>{label} dialog</Dialog.Title>
|
|
43
|
+
<Dialog.Description>{copy}</Dialog.Description>
|
|
44
|
+
</Dialog.Header>
|
|
45
|
+
<Dialog.Footer>
|
|
46
|
+
<Dialog.Close render={<Button variant="ghost">Close</Button>} />
|
|
47
|
+
</Dialog.Footer>
|
|
48
|
+
</Dialog.Content>
|
|
49
|
+
</Dialog>
|
|
50
|
+
))}
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
# Surfaces inside a dialog
|
|
54
|
+
|
|
55
|
+
Not an FF docs section — a modo addition standing in for FF's "With a
|
|
56
|
+
sidebar" example, which this port omits along with Sidebar. The dialog
|
|
57
|
+
settles at `substrate + 4` and re-provides that level, so the Select's
|
|
58
|
+
popover lifts 2 more from there instead of painting the dialog's own
|
|
59
|
+
background. Nothing is passed between them.
|
|
60
|
+
|
|
61
|
+
<Dialog>
|
|
62
|
+
<Dialog.Trigger render={<Button variant="secondary">Invite people</Button>} />
|
|
63
|
+
<Dialog.Content>
|
|
64
|
+
<Dialog.Header>
|
|
65
|
+
<Dialog.Title>Invite to your workspace</Dialog.Title>
|
|
66
|
+
<Dialog.Description>
|
|
67
|
+
The panel sits 4 levels above the page; the role menu lifts 2 more from there.
|
|
68
|
+
</Dialog.Description>
|
|
69
|
+
</Dialog.Header>
|
|
70
|
+
<Select defaultValue="member">
|
|
71
|
+
<Select.Trigger placeholder="Select role" />
|
|
72
|
+
<Select.Content>
|
|
73
|
+
<Select.Item index={0} value="owner">Workspace owner</Select.Item>
|
|
74
|
+
<Select.Item index={1} value="member">Member</Select.Item>
|
|
75
|
+
<Select.Item index={2} value="restricted">Restricted member</Select.Item>
|
|
76
|
+
</Select.Content>
|
|
77
|
+
</Select>
|
|
78
|
+
<Dialog.Footer>
|
|
79
|
+
<Dialog.Close render={<Button variant="ghost">Cancel</Button>} />
|
|
80
|
+
<Button>Send invites</Button>
|
|
81
|
+
</Dialog.Footer>
|
|
82
|
+
</Dialog.Content>
|
|
83
|
+
</Dialog>
|
|
84
|
+
|
|
85
|
+
# Morph sources
|
|
86
|
+
|
|
87
|
+
`from` picks where the panel grows from: the pressed trigger (the default), the press point, its own center, or a side of the window. `effect` switches the goo neck for a plain morph, a slide or a fade.
|
|
88
|
+
|
|
89
|
+
<div className="flex flex-wrap items-center justify-center gap-3">
|
|
90
|
+
<Dialog>
|
|
91
|
+
<Dialog.Trigger render={<Button variant="secondary">From the trigger</Button>} />
|
|
92
|
+
<Dialog.Content>
|
|
93
|
+
<Dialog.Header>
|
|
94
|
+
<Dialog.Title>From the trigger</Dialog.Title>
|
|
95
|
+
<Dialog.Description>The surface oozes out of the button and travels to the center.</Dialog.Description>
|
|
96
|
+
</Dialog.Header>
|
|
97
|
+
</Dialog.Content>
|
|
98
|
+
</Dialog>
|
|
99
|
+
<Dialog>
|
|
100
|
+
<Dialog.Trigger render={<Button variant="secondary">From the pointer</Button>} />
|
|
101
|
+
<Dialog.Content from="pointer" effect="morph">
|
|
102
|
+
<Dialog.Header>
|
|
103
|
+
<Dialog.Title>From the pointer</Dialog.Title>
|
|
104
|
+
<Dialog.Description>A circle grows from where you pressed.</Dialog.Description>
|
|
105
|
+
</Dialog.Header>
|
|
106
|
+
</Dialog.Content>
|
|
107
|
+
</Dialog>
|
|
108
|
+
<Dialog>
|
|
109
|
+
<Dialog.Trigger render={<Button variant="secondary">From its center</Button>} />
|
|
110
|
+
<Dialog.Content from="center" effect="morph">
|
|
111
|
+
<Dialog.Header>
|
|
112
|
+
<Dialog.Title>From its center</Dialog.Title>
|
|
113
|
+
<Dialog.Description>The panel unfolds in place toward every edge.</Dialog.Description>
|
|
114
|
+
</Dialog.Header>
|
|
115
|
+
</Dialog.Content>
|
|
116
|
+
</Dialog>
|
|
117
|
+
<Dialog>
|
|
118
|
+
<Dialog.Trigger render={<Button variant="secondary">From the bottom</Button>} />
|
|
119
|
+
<Dialog.Content from="bottom" effect="slide">
|
|
120
|
+
<Dialog.Header>
|
|
121
|
+
<Dialog.Title>From the bottom</Dialog.Title>
|
|
122
|
+
<Dialog.Description>The finished panel slides up from the edge of the window.</Dialog.Description>
|
|
123
|
+
</Dialog.Header>
|
|
124
|
+
</Dialog.Content>
|
|
125
|
+
</Dialog>
|
|
126
|
+
</div>
|
|
127
|
+
|
|
128
|
+
# From a card
|
|
129
|
+
|
|
130
|
+
The trigger can be any element. `Morph.Part` pairs the card's cover and title with their twins in the panel, so they fly into the dialog and back.
|
|
131
|
+
|
|
132
|
+
<Dialog>
|
|
133
|
+
<Dialog.Trigger className="flex w-56 flex-col gap-3 rounded-xl bg-surface-2 p-3 text-left shadow-surface-2 outline-none focus-visible:ring-1 focus-visible:ring-focus-ring">
|
|
134
|
+
<Morph.Part id="cover" className="h-28 w-full rounded-lg bg-brand/20" />
|
|
135
|
+
<Morph.Part id="title" className="text-subtitle weight-semibold text-foreground">Liquid glass</Morph.Part>
|
|
136
|
+
</Dialog.Trigger>
|
|
137
|
+
<Dialog.Content size="lg" effect="morph" hideSource>
|
|
138
|
+
<div className="flex flex-col gap-4">
|
|
139
|
+
<Morph.Part id="cover" className="h-48 w-full rounded-lg bg-brand/20" />
|
|
140
|
+
<Morph.Part id="title" className="text-title weight-bold text-foreground">Liquid glass</Morph.Part>
|
|
141
|
+
<Dialog.Description>The card grows into the dialog: its cover and title travel with it, and the rest of the panel is revealed around them.</Dialog.Description>
|
|
142
|
+
</div>
|
|
143
|
+
</Dialog.Content>
|
|
144
|
+
</Dialog>
|