@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,161 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Local addition (not part of Fluid Functionalism): the multi-line twin of
|
|
3
|
+
* Input, on the same field box (`useFieldBox` in `lib/field-classes.ts`); the box grows with its text from `minRows` to `maxRows`, the way
|
|
4
|
+
* InputMessage's composer does.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { Field } from '@base-ui/react/field'
|
|
8
|
+
import { forwardRef, type TextareaHTMLAttributes, useCallback, useEffect, useLayoutEffect, useRef } from 'react'
|
|
9
|
+
import { type FieldVariant, focusControlOnPress, useFieldBox } from '../../../lib/field-classes'
|
|
10
|
+
import type { SizeVariant } from '../../../lib/size-context'
|
|
11
|
+
import { useControllableState } from '../../../lib/use-controllable-state'
|
|
12
|
+
import { cn } from '../../../lib/utils'
|
|
13
|
+
|
|
14
|
+
interface TextareaProps
|
|
15
|
+
extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'onChange' | 'value' | 'defaultValue' | 'rows'> {
|
|
16
|
+
/** Placeholder text. */
|
|
17
|
+
placeholder?: string
|
|
18
|
+
/** Controlled value. Pair with `onChange`. */
|
|
19
|
+
value?: string
|
|
20
|
+
/** Initial value when uncontrolled. Defaults to `''`. */
|
|
21
|
+
defaultValue?: string
|
|
22
|
+
/** Called with the new value on every change. */
|
|
23
|
+
onChange?: (value: string) => void
|
|
24
|
+
/** Rows shown when empty; the box never gets shorter. Defaults to `3`. */
|
|
25
|
+
minRows?: number
|
|
26
|
+
/** Rows the box grows to before it scrolls. Set it to `minRows` for a fixed height. Defaults to `8`. */
|
|
27
|
+
maxRows?: number
|
|
28
|
+
/** Framed at rest, or invisible until hovered or focused. Defaults to `"borderless"`. */
|
|
29
|
+
variant?: FieldVariant
|
|
30
|
+
/** Marks the value invalid: the field turns destructive and sets `aria-invalid`. Defaults to `false`. */
|
|
31
|
+
invalid?: boolean
|
|
32
|
+
/** Disables the textarea. Defaults to `false`. */
|
|
33
|
+
disabled?: boolean
|
|
34
|
+
/** Keeps the value selectable but not editable, with the field's read-only look. Defaults to the surrounding Field's `readOnly`. */
|
|
35
|
+
readOnly?: boolean
|
|
36
|
+
/** Marks the textarea required. Defaults to the surrounding Field's `required`. */
|
|
37
|
+
required?: boolean
|
|
38
|
+
/** Pins the textarea to one step of the size ladder (36px default, 28px compact): its text and padding follow, so one row matches an Input. Defaults to the surrounding SizeProvider. */
|
|
39
|
+
size?: SizeVariant
|
|
40
|
+
/** Classes for the ringed box around the textarea. */
|
|
41
|
+
className?: string
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Literal table: one row plus this padding lands on the ladder's control
|
|
45
|
+
// height (20px leading + 8px × 2 = 36px, + 4px × 2 = 28px).
|
|
46
|
+
const PADDING_Y: Record<SizeVariant, string> = {
|
|
47
|
+
default: 'py-2',
|
|
48
|
+
compact: 'py-1',
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Multi-line text field that grows with what you type.
|
|
53
|
+
*
|
|
54
|
+
* It sits on the same ground as Input: bare text at rest (or framed, with
|
|
55
|
+
* `variant="bordered"`), a muted fill with a hairline ring on hover, the
|
|
56
|
+
* card ground on focus, a destructive ring when `invalid`. The box starts at `minRows`, grows line by line as text wraps,
|
|
57
|
+
* and scrolls once it reaches `maxRows`. One row lines up with an Input of
|
|
58
|
+
* the same size, so the two stack in a form without a seam. It is
|
|
59
|
+
* uncontrolled with `defaultValue`, or controlled with `value` + `onChange`,
|
|
60
|
+
* fills the width of its container, and joins a Base UI `Field` when placed
|
|
61
|
+
* inside one. Pair it with a `Label` (see Input) through `htmlFor` / `id`,
|
|
62
|
+
* or put it in an `InputGroup.Field` to label it, join the group's hover and
|
|
63
|
+
* take the field's error.
|
|
64
|
+
*
|
|
65
|
+
* @example {@include ./examples.mdx}
|
|
66
|
+
*/
|
|
67
|
+
const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(
|
|
68
|
+
(
|
|
69
|
+
{
|
|
70
|
+
value: valueProp,
|
|
71
|
+
defaultValue = '',
|
|
72
|
+
onChange: onChangeProp,
|
|
73
|
+
minRows = 3,
|
|
74
|
+
maxRows = 8,
|
|
75
|
+
variant = 'borderless',
|
|
76
|
+
invalid,
|
|
77
|
+
disabled,
|
|
78
|
+
readOnly,
|
|
79
|
+
required,
|
|
80
|
+
size,
|
|
81
|
+
className,
|
|
82
|
+
...props
|
|
83
|
+
},
|
|
84
|
+
ref,
|
|
85
|
+
) => {
|
|
86
|
+
const [value, onChange] = useControllableState(valueProp, defaultValue, onChangeProp)
|
|
87
|
+
|
|
88
|
+
const textareaRef = useRef<HTMLTextAreaElement | null>(null)
|
|
89
|
+
const box = useFieldBox({ variant, invalid, disabled, readOnly, required, size })
|
|
90
|
+
|
|
91
|
+
const resize = useCallback(() => {
|
|
92
|
+
const el = textareaRef.current
|
|
93
|
+
if (!el) return
|
|
94
|
+
el.style.height = 'auto'
|
|
95
|
+
const lineHeight = Number.parseFloat(getComputedStyle(el).lineHeight)
|
|
96
|
+
const max = lineHeight * Math.max(maxRows, minRows)
|
|
97
|
+
el.style.height = `${Math.min(Math.max(el.scrollHeight, lineHeight * minRows), max)}px`
|
|
98
|
+
el.style.overflowY = el.scrollHeight > max ? 'auto' : 'hidden'
|
|
99
|
+
}, [minRows, maxRows])
|
|
100
|
+
|
|
101
|
+
// Layout effect: the new height lands before paint, so a wrapped line
|
|
102
|
+
// never flashes a scrollbar. `value` and the size step aren't read here,
|
|
103
|
+
// but they change the content height `resize` measures.
|
|
104
|
+
useLayoutEffect(resize, [resize, value, box.size.variant])
|
|
105
|
+
|
|
106
|
+
// The first measure can run while an ancestor is still at (near-)zero
|
|
107
|
+
// width. Width-gated, so the observer never loops on its own height writes.
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
const el = textareaRef.current
|
|
110
|
+
if (!el) return
|
|
111
|
+
let lastWidth = el.offsetWidth
|
|
112
|
+
const observer = new ResizeObserver(() => {
|
|
113
|
+
if (el.offsetWidth === lastWidth) return
|
|
114
|
+
lastWidth = el.offsetWidth
|
|
115
|
+
resize()
|
|
116
|
+
})
|
|
117
|
+
observer.observe(el)
|
|
118
|
+
return () => observer.disconnect()
|
|
119
|
+
}, [resize])
|
|
120
|
+
|
|
121
|
+
return (
|
|
122
|
+
// biome-ignore lint/a11y/noStaticElementInteractions: the textarea is the focusable control; the box only forwards pointer focus from its padding.
|
|
123
|
+
<div
|
|
124
|
+
onMouseDown={focusControlOnPress(textareaRef)}
|
|
125
|
+
{...box.props}
|
|
126
|
+
className={cn(box.props.className, 'flex', PADDING_Y[box.size.variant], className)}
|
|
127
|
+
>
|
|
128
|
+
{/* Field.Control rendered as a <textarea>: on its own a plain
|
|
129
|
+
textarea, inside a Field.Root it joins the field's wiring. The
|
|
130
|
+
rest props ride on the render element, since Field.Control types
|
|
131
|
+
its own as an <input>'s; Base UI merges the two. */}
|
|
132
|
+
<Field.Control
|
|
133
|
+
ref={(node: HTMLElement | null) => {
|
|
134
|
+
const textarea = node as HTMLTextAreaElement | null
|
|
135
|
+
textareaRef.current = textarea
|
|
136
|
+
if (typeof ref === 'function') ref(textarea)
|
|
137
|
+
else if (ref) ref.current = textarea
|
|
138
|
+
}}
|
|
139
|
+
render={<textarea rows={minRows} {...props} />}
|
|
140
|
+
value={value}
|
|
141
|
+
onChange={e => onChange(e.target.value)}
|
|
142
|
+
disabled={box.disabled}
|
|
143
|
+
readOnly={box.readOnly}
|
|
144
|
+
required={box.required}
|
|
145
|
+
aria-invalid={box.invalid || undefined}
|
|
146
|
+
className={cn(
|
|
147
|
+
'block w-full resize-none rounded-none bg-transparent text-foreground placeholder:text-muted-foreground outline-none font-[inherit]',
|
|
148
|
+
box.size.text,
|
|
149
|
+
'weight-normal',
|
|
150
|
+
)}
|
|
151
|
+
/>
|
|
152
|
+
</div>
|
|
153
|
+
)
|
|
154
|
+
},
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
Textarea.displayName = 'Textarea'
|
|
158
|
+
|
|
159
|
+
export type { TextareaProps }
|
|
160
|
+
export { Textarea }
|
|
161
|
+
export default Textarea
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import NavigationMenu from './index'
|
|
2
|
+
import { BookOpen, Boxes, Code, LifeBuoy, Newspaper, Palette, Rocket, Users } from 'lucide-react'
|
|
3
|
+
|
|
4
|
+
# Basic
|
|
5
|
+
|
|
6
|
+
Hover or press a trigger: the panel melts out of it. Move to the next trigger and the one panel springs to the new content, which slides in from that side.
|
|
7
|
+
|
|
8
|
+
<div className="flex min-h-[320px] w-full justify-center">
|
|
9
|
+
<NavigationMenu>
|
|
10
|
+
<NavigationMenu.List>
|
|
11
|
+
<NavigationMenu.Indicator />
|
|
12
|
+
<NavigationMenu.Item value="product">
|
|
13
|
+
<NavigationMenu.Trigger>Product</NavigationMenu.Trigger>
|
|
14
|
+
<NavigationMenu.Content className="grid w-[26rem] grid-cols-2 gap-1">
|
|
15
|
+
<NavigationMenu.Link href="#components" icon={Boxes} description="Every control, on one size ladder.">Components</NavigationMenu.Link>
|
|
16
|
+
<NavigationMenu.Link href="#themes" icon={Palette} description="Tokens for light, dark and your brand.">Themes</NavigationMenu.Link>
|
|
17
|
+
<NavigationMenu.Link href="#motion" icon={Rocket} description="Springs, goo and fluid hover.">Motion</NavigationMenu.Link>
|
|
18
|
+
<NavigationMenu.Link href="#code" icon={Code} description="Typed, documented, tree-shaken.">For developers</NavigationMenu.Link>
|
|
19
|
+
</NavigationMenu.Content>
|
|
20
|
+
</NavigationMenu.Item>
|
|
21
|
+
<NavigationMenu.Item value="resources">
|
|
22
|
+
<NavigationMenu.Trigger>Resources</NavigationMenu.Trigger>
|
|
23
|
+
<NavigationMenu.Content className="flex w-64 flex-col">
|
|
24
|
+
<NavigationMenu.Link href="#docs" icon={BookOpen}>Documentation</NavigationMenu.Link>
|
|
25
|
+
<NavigationMenu.Link href="#blog" icon={Newspaper}>Blog</NavigationMenu.Link>
|
|
26
|
+
<NavigationMenu.Link href="#community" icon={Users}>Community</NavigationMenu.Link>
|
|
27
|
+
<NavigationMenu.Link href="#support" icon={LifeBuoy}>Support</NavigationMenu.Link>
|
|
28
|
+
</NavigationMenu.Content>
|
|
29
|
+
</NavigationMenu.Item>
|
|
30
|
+
<NavigationMenu.Item>
|
|
31
|
+
<NavigationMenu.Link href="#pricing">Pricing</NavigationMenu.Link>
|
|
32
|
+
</NavigationMenu.Item>
|
|
33
|
+
</NavigationMenu.List>
|
|
34
|
+
</NavigationMenu>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
# Current page
|
|
38
|
+
|
|
39
|
+
`active` on a link marks the current page: the indicator rests under it while no panel is open, and travels to whichever item opens.
|
|
40
|
+
|
|
41
|
+
<div className="flex min-h-[240px] w-full justify-center">
|
|
42
|
+
<NavigationMenu>
|
|
43
|
+
<NavigationMenu.List>
|
|
44
|
+
<NavigationMenu.Indicator />
|
|
45
|
+
<NavigationMenu.Item>
|
|
46
|
+
<NavigationMenu.Link href="#home">Home</NavigationMenu.Link>
|
|
47
|
+
</NavigationMenu.Item>
|
|
48
|
+
<NavigationMenu.Item>
|
|
49
|
+
<NavigationMenu.Link href="#projects" active>Projects</NavigationMenu.Link>
|
|
50
|
+
</NavigationMenu.Item>
|
|
51
|
+
<NavigationMenu.Item value="team">
|
|
52
|
+
<NavigationMenu.Trigger>Team</NavigationMenu.Trigger>
|
|
53
|
+
<NavigationMenu.Content className="flex w-56 flex-col">
|
|
54
|
+
<NavigationMenu.Link href="#members">Members</NavigationMenu.Link>
|
|
55
|
+
<NavigationMenu.Link href="#roles">Roles</NavigationMenu.Link>
|
|
56
|
+
<NavigationMenu.Link href="#invites">Invites</NavigationMenu.Link>
|
|
57
|
+
</NavigationMenu.Content>
|
|
58
|
+
</NavigationMenu.Item>
|
|
59
|
+
</NavigationMenu.List>
|
|
60
|
+
</NavigationMenu>
|
|
61
|
+
</div>
|
|
62
|
+
|
|
63
|
+
# Effects
|
|
64
|
+
|
|
65
|
+
The morph options of every overlay: here the panel grows as a plain morph on the moderate tier.
|
|
66
|
+
|
|
67
|
+
<div className="flex min-h-[240px] w-full justify-center">
|
|
68
|
+
<NavigationMenu effect="morph" tier="moderate">
|
|
69
|
+
<NavigationMenu.List>
|
|
70
|
+
<NavigationMenu.Item value="docs">
|
|
71
|
+
<NavigationMenu.Trigger>Docs</NavigationMenu.Trigger>
|
|
72
|
+
<NavigationMenu.Content className="flex w-56 flex-col">
|
|
73
|
+
<NavigationMenu.Link href="#start">Getting started</NavigationMenu.Link>
|
|
74
|
+
<NavigationMenu.Link href="#guides">Guides</NavigationMenu.Link>
|
|
75
|
+
<NavigationMenu.Link href="#api">API reference</NavigationMenu.Link>
|
|
76
|
+
</NavigationMenu.Content>
|
|
77
|
+
</NavigationMenu.Item>
|
|
78
|
+
<NavigationMenu.Item value="company">
|
|
79
|
+
<NavigationMenu.Trigger>Company</NavigationMenu.Trigger>
|
|
80
|
+
<NavigationMenu.Content className="flex w-48 flex-col">
|
|
81
|
+
<NavigationMenu.Link href="#about">About</NavigationMenu.Link>
|
|
82
|
+
<NavigationMenu.Link href="#careers">Careers</NavigationMenu.Link>
|
|
83
|
+
</NavigationMenu.Content>
|
|
84
|
+
</NavigationMenu.Item>
|
|
85
|
+
</NavigationMenu.List>
|
|
86
|
+
</NavigationMenu>
|
|
87
|
+
</div>
|
|
88
|
+
|
|
89
|
+
# Compact
|
|
90
|
+
|
|
91
|
+
`size="compact"` steps the strip and its panels down the size ladder.
|
|
92
|
+
|
|
93
|
+
<div className="flex min-h-[240px] w-full justify-center">
|
|
94
|
+
<NavigationMenu size="compact">
|
|
95
|
+
<NavigationMenu.List>
|
|
96
|
+
<NavigationMenu.Indicator />
|
|
97
|
+
<NavigationMenu.Item value="product">
|
|
98
|
+
<NavigationMenu.Trigger>Product</NavigationMenu.Trigger>
|
|
99
|
+
<NavigationMenu.Content className="flex w-56 flex-col">
|
|
100
|
+
<NavigationMenu.Link href="#components" icon={Boxes} description="Every control.">Components</NavigationMenu.Link>
|
|
101
|
+
<NavigationMenu.Link href="#themes" icon={Palette} description="Tokens and modes.">Themes</NavigationMenu.Link>
|
|
102
|
+
</NavigationMenu.Content>
|
|
103
|
+
</NavigationMenu.Item>
|
|
104
|
+
<NavigationMenu.Item>
|
|
105
|
+
<NavigationMenu.Link href="#pricing">Pricing</NavigationMenu.Link>
|
|
106
|
+
</NavigationMenu.Item>
|
|
107
|
+
</NavigationMenu.List>
|
|
108
|
+
</NavigationMenu>
|
|
109
|
+
</div>
|