@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,425 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Local addition (not part of Fluid Functionalism): a ⌘K command palette.
|
|
3
|
-
* Base UI's Autocomplete renders inline (the list is always there and filters
|
|
4
|
-
* as you type; the input keeps focus while the arrows move a highlight through
|
|
5
|
-
* the rows) inside this system's Dialog, so the panel grows out of its trigger
|
|
6
|
-
* with the goo neck and keeps its top edge still while the list filters. The
|
|
7
|
-
* rows wear Select's fluid hover: one highlight springs between them, following
|
|
8
|
-
* Base UI's own highlight (pointer and keyboard alike) over the rects
|
|
9
|
-
* `lib/use-fluid-hover.ts` measures. Search's suggestions reuse the list.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { Autocomplete } from '@base-ui/react/autocomplete'
|
|
13
|
-
import { Dialog as DialogPrimitive } from '@base-ui/react/dialog'
|
|
14
|
-
import {
|
|
15
|
-
createContext,
|
|
16
|
-
forwardRef,
|
|
17
|
-
type HTMLAttributes,
|
|
18
|
-
type ReactNode,
|
|
19
|
-
type RefObject,
|
|
20
|
-
useContext,
|
|
21
|
-
useEffect,
|
|
22
|
-
useImperativeHandle,
|
|
23
|
-
useMemo,
|
|
24
|
-
useRef,
|
|
25
|
-
useState,
|
|
26
|
-
} from 'react'
|
|
27
|
-
import { FluidHoverHighlight } from '../../../lib/fluid-hover-highlight'
|
|
28
|
-
import { type IconComponent, useIcon } from '../../../lib/icon-context'
|
|
29
|
-
import { isDisabledRow, popupScrollAreaClass, popupViewportClass } from '../../../lib/popup'
|
|
30
|
-
import { shapeMap } from '../../../lib/shape-context'
|
|
31
|
-
import { useSize } from '../../../lib/size-context'
|
|
32
|
-
import type { SlotProps } from '../../../lib/slot'
|
|
33
|
-
import { useFluidHover, useRegisterFluidHoverItem } from '../../../lib/use-fluid-hover'
|
|
34
|
-
import { cn } from '../../../lib/utils'
|
|
35
|
-
import { ScrollArea } from '../../../primitives/scroll-area'
|
|
36
|
-
import {
|
|
37
|
-
createDialogChangeDetails,
|
|
38
|
-
DialogContent,
|
|
39
|
-
type DialogOpenChangeDetails,
|
|
40
|
-
DialogState,
|
|
41
|
-
DialogTrigger,
|
|
42
|
-
} from '../dialog'
|
|
43
|
-
|
|
44
|
-
/** One command: the label the query matches, plus what the row shows and does. */
|
|
45
|
-
interface CommandItem {
|
|
46
|
-
label: string
|
|
47
|
-
icon?: IconComponent
|
|
48
|
-
/** Shown at the end of the row; display only, nothing binds it. */
|
|
49
|
-
shortcut?: string
|
|
50
|
-
/** More words the query matches. */
|
|
51
|
-
keywords?: string[]
|
|
52
|
-
disabled?: boolean
|
|
53
|
-
onSelect?: () => void
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
interface CommandGroup {
|
|
57
|
-
label: string
|
|
58
|
-
items: CommandItem[]
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
type CommandItems = CommandItem[] | CommandGroup[]
|
|
62
|
-
|
|
63
|
-
// Like Select's and Combobox's popups, the rows keep the "rounded" radii
|
|
64
|
-
// whatever the global shape, so their highlight sits concentric in the panel.
|
|
65
|
-
const listShape = shapeMap.rounded
|
|
66
|
-
|
|
67
|
-
const CommandContext = createContext<{ trigger: RefObject<HTMLButtonElement>; close: () => void; session: number }>({
|
|
68
|
-
trigger: { current: null },
|
|
69
|
-
close: () => {},
|
|
70
|
-
session: 0,
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
/** Base UI's highlighted row, as its index among the rendered rows. */
|
|
74
|
-
const CommandHighlight = createContext<number | null>(null)
|
|
75
|
-
const CommandRows = createContext<((index: number, element: HTMLElement | null) => void) | undefined>(undefined)
|
|
76
|
-
|
|
77
|
-
const isGrouped = (items: CommandItems): items is CommandGroup[] => items[0] !== undefined && 'items' in items[0]
|
|
78
|
-
|
|
79
|
-
type CommandListRootProps = Omit<
|
|
80
|
-
Autocomplete.Root.Props<CommandItem>,
|
|
81
|
-
'items' | 'filter' | 'itemToStringValue' | 'onItemHighlighted'
|
|
82
|
-
> & { items: CommandItems }
|
|
83
|
-
|
|
84
|
-
/** Base UI's Autocomplete set up for command rows: it matches labels and keywords and hands its highlight to `CommandList`. */
|
|
85
|
-
function CommandListRoot({ items, ...props }: CommandListRootProps) {
|
|
86
|
-
const [highlight, setHighlight] = useState<number | null>(null)
|
|
87
|
-
const { contains } = Autocomplete.useFilter()
|
|
88
|
-
|
|
89
|
-
return (
|
|
90
|
-
<CommandHighlight.Provider value={highlight}>
|
|
91
|
-
<Autocomplete.Root
|
|
92
|
-
{...props}
|
|
93
|
-
items={items}
|
|
94
|
-
itemToStringValue={item => item.label}
|
|
95
|
-
filter={(item, query) => contains([item.label, ...(item.keywords ?? [])].join(' '), query)}
|
|
96
|
-
onItemHighlighted={(item, details) => setHighlight(item ? details.index : null)}
|
|
97
|
-
/>
|
|
98
|
-
</CommandHighlight.Provider>
|
|
99
|
-
)
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
function CommandShortcut({ className, ...props }: HTMLAttributes<HTMLElement>) {
|
|
103
|
-
return <kbd className={cn('ml-auto shrink-0 font-sans text-caption text-muted-foreground', className)} {...props} />
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function CommandRow({
|
|
107
|
-
item,
|
|
108
|
-
index,
|
|
109
|
-
onPick,
|
|
110
|
-
}: {
|
|
111
|
-
item: CommandItem
|
|
112
|
-
index: number
|
|
113
|
-
onPick: (item: CommandItem) => void
|
|
114
|
-
}) {
|
|
115
|
-
const registerItem = useContext(CommandRows)
|
|
116
|
-
const active = useContext(CommandHighlight) === index
|
|
117
|
-
const ref = useRef<HTMLDivElement>(null)
|
|
118
|
-
const size = useSize()
|
|
119
|
-
useRegisterFluidHoverItem(registerItem, index, ref)
|
|
120
|
-
const Icon = item.icon
|
|
121
|
-
|
|
122
|
-
return (
|
|
123
|
-
<Autocomplete.Item
|
|
124
|
-
ref={ref}
|
|
125
|
-
value={item}
|
|
126
|
-
disabled={item.disabled}
|
|
127
|
-
onClick={() => onPick(item)}
|
|
128
|
-
className={cn(
|
|
129
|
-
'relative z-10 flex shrink-0 cursor-pointer select-none items-center outline-none transition-[color] duration-fast',
|
|
130
|
-
'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
|
|
131
|
-
size.control,
|
|
132
|
-
size.gap,
|
|
133
|
-
size.itemPx,
|
|
134
|
-
size.text,
|
|
135
|
-
listShape.item,
|
|
136
|
-
active ? 'text-foreground' : 'text-muted-foreground',
|
|
137
|
-
)}
|
|
138
|
-
>
|
|
139
|
-
{Icon && (
|
|
140
|
-
<Icon
|
|
141
|
-
size={size.icon}
|
|
142
|
-
strokeWidth={active ? 2 : 1.5}
|
|
143
|
-
className="shrink-0 transition-[color,stroke-width] duration-fast"
|
|
144
|
-
/>
|
|
145
|
-
)}
|
|
146
|
-
<span className="min-w-0 flex-1 truncate [text-box:trim-both_cap_alphabetic] py-1 -my-1">{item.label}</span>
|
|
147
|
-
{item.shortcut && <CommandShortcut>{item.shortcut}</CommandShortcut>}
|
|
148
|
-
</Autocomplete.Item>
|
|
149
|
-
)
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
interface CommandListProps {
|
|
153
|
-
onPick: (item: CommandItem) => void
|
|
154
|
-
emptyMessage: ReactNode
|
|
155
|
-
className?: string
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/** The filtered rows (grouped or flat) under one fluid highlight, inside a ScrollArea. Goes inside `CommandListRoot`. */
|
|
159
|
-
function CommandList({ onPick, emptyMessage, className }: CommandListProps) {
|
|
160
|
-
const filtered = Autocomplete.useFilteredItems<CommandItem | CommandGroup>() as CommandItems
|
|
161
|
-
const highlight = useContext(CommandHighlight)
|
|
162
|
-
const compact = useSize().variant === 'compact'
|
|
163
|
-
const containerRef = useRef<HTMLDivElement>(null)
|
|
164
|
-
const { itemRects, isMeasured, registerItem } = useFluidHover(containerRef, { isItemDisabled: isDisabledRow })
|
|
165
|
-
const rect = isMeasured && highlight !== null ? (itemRects[highlight] ?? null) : null
|
|
166
|
-
const rows = (items: CommandItem[], start: number) =>
|
|
167
|
-
items.map((item, i) => <CommandRow key={item.label} item={item} index={start + i} onPick={onPick} />)
|
|
168
|
-
let start = 0
|
|
169
|
-
|
|
170
|
-
return (
|
|
171
|
-
<CommandRows.Provider value={registerItem}>
|
|
172
|
-
<ScrollArea
|
|
173
|
-
className={cn(popupScrollAreaClass, className)}
|
|
174
|
-
viewportClassName={cn(popupViewportClass, 'scroll-fade')}
|
|
175
|
-
>
|
|
176
|
-
<Autocomplete.Empty className="px-4 py-6 text-center text-body text-muted-foreground empty:hidden">
|
|
177
|
-
{emptyMessage}
|
|
178
|
-
</Autocomplete.Empty>
|
|
179
|
-
<Autocomplete.List ref={containerRef} className="relative flex flex-col p-1 outline-none data-[empty]:p-0">
|
|
180
|
-
<FluidHoverHighlight rect={rect} session={0} className={listShape.bg} />
|
|
181
|
-
{isGrouped(filtered)
|
|
182
|
-
? filtered.map(group => {
|
|
183
|
-
const first = start
|
|
184
|
-
start += group.items.length
|
|
185
|
-
return (
|
|
186
|
-
<Autocomplete.Group key={group.label} className="flex flex-col">
|
|
187
|
-
<Autocomplete.GroupLabel
|
|
188
|
-
className={cn(
|
|
189
|
-
'shrink-0 px-2 pt-2 pb-1 text-muted-foreground',
|
|
190
|
-
compact ? 'text-caption-compact' : 'text-caption',
|
|
191
|
-
)}
|
|
192
|
-
>
|
|
193
|
-
{group.label}
|
|
194
|
-
</Autocomplete.GroupLabel>
|
|
195
|
-
{rows(group.items, first)}
|
|
196
|
-
</Autocomplete.Group>
|
|
197
|
-
)
|
|
198
|
-
})
|
|
199
|
-
: rows(filtered, 0)}
|
|
200
|
-
</Autocomplete.List>
|
|
201
|
-
</ScrollArea>
|
|
202
|
-
</CommandRows.Provider>
|
|
203
|
-
)
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
interface CommandPaletteProps {
|
|
207
|
-
/** The commands, flat or in labelled groups. */
|
|
208
|
-
items: CommandItems
|
|
209
|
-
/** The search field's placeholder. Defaults to `'Type a command or search…'`. */
|
|
210
|
-
placeholder?: string
|
|
211
|
-
/** Shown when nothing matches the query. Defaults to `'No results found.'`. */
|
|
212
|
-
emptyMessage?: ReactNode
|
|
213
|
-
/** Classes for the palette's box. */
|
|
214
|
-
className?: string
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
function CommandPalette({
|
|
218
|
-
items,
|
|
219
|
-
placeholder = 'Type a command or search…',
|
|
220
|
-
emptyMessage = 'No results found.',
|
|
221
|
-
className,
|
|
222
|
-
}: CommandPaletteProps) {
|
|
223
|
-
const { close } = useContext(CommandContext)
|
|
224
|
-
const SearchIcon = useIcon('search')
|
|
225
|
-
const size = useSize()
|
|
226
|
-
const [query, setQuery] = useState('')
|
|
227
|
-
|
|
228
|
-
return (
|
|
229
|
-
<CommandListRoot
|
|
230
|
-
items={items}
|
|
231
|
-
inline
|
|
232
|
-
open
|
|
233
|
-
autoHighlight="always"
|
|
234
|
-
keepHighlight
|
|
235
|
-
value={query}
|
|
236
|
-
onValueChange={(next, details) => {
|
|
237
|
-
// A pick runs the command and closes; filling the field with it would
|
|
238
|
-
// re-filter the closing panel down to one row.
|
|
239
|
-
if (details.reason === 'item-press') return
|
|
240
|
-
setQuery(next)
|
|
241
|
-
}}
|
|
242
|
-
>
|
|
243
|
-
<div className={cn('flex flex-col', className)}>
|
|
244
|
-
<div className="flex h-12 shrink-0 items-center gap-2 border-b border-border px-4">
|
|
245
|
-
<SearchIcon size={size.icon} strokeWidth={1.5} className="shrink-0 text-muted-foreground" />
|
|
246
|
-
<Autocomplete.Input
|
|
247
|
-
placeholder={placeholder}
|
|
248
|
-
className={cn(
|
|
249
|
-
'h-full min-w-0 flex-1 bg-transparent text-foreground outline-none placeholder:text-muted-foreground',
|
|
250
|
-
size.text,
|
|
251
|
-
)}
|
|
252
|
-
/>
|
|
253
|
-
</div>
|
|
254
|
-
<CommandList
|
|
255
|
-
emptyMessage={emptyMessage}
|
|
256
|
-
className="max-h-80"
|
|
257
|
-
onPick={item => {
|
|
258
|
-
item.onSelect?.()
|
|
259
|
-
close()
|
|
260
|
-
}}
|
|
261
|
-
/>
|
|
262
|
-
</div>
|
|
263
|
-
</CommandListRoot>
|
|
264
|
-
)
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
const CommandTrigger = forwardRef<HTMLButtonElement, SlotProps>((props, ref) => {
|
|
268
|
-
const { trigger } = useContext(CommandContext)
|
|
269
|
-
useImperativeHandle(ref, () => trigger.current as HTMLButtonElement)
|
|
270
|
-
return <DialogTrigger ref={trigger} {...props} />
|
|
271
|
-
})
|
|
272
|
-
CommandTrigger.displayName = 'CommandTrigger'
|
|
273
|
-
|
|
274
|
-
interface CommandContentProps extends CommandPaletteProps {
|
|
275
|
-
/** Accessible name of the panel. Defaults to `'Command menu'`. */
|
|
276
|
-
label?: string
|
|
277
|
-
/** Where the panel grows from (see Morph): the pressed trigger (its center when none), the press point, its own center, a viewport edge, or a ref to any element. Defaults to `'trigger'`. */
|
|
278
|
-
from?: 'trigger' | 'pointer' | 'center' | 'top' | 'right' | 'bottom' | 'left' | RefObject<HTMLElement | null>
|
|
279
|
-
/** How it grows (see Morph): with the liquid goo neck, a plain morph, a slide or a fade. Defaults to `'goo'`. */
|
|
280
|
-
effect?: 'goo' | 'morph' | 'slide' | 'fade'
|
|
281
|
-
/** Hide the trigger while open, so it reads as turning into the panel. Defaults to `false`. */
|
|
282
|
-
hideSource?: boolean
|
|
283
|
-
/** Spring tier of a plain morph, slide or fade; goo runs on its own `spring.goo`. Defaults to `'slow'`. */
|
|
284
|
-
tier?: 'moderate' | 'slow'
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
const CommandContent = forwardRef<HTMLDivElement, CommandContentProps>(
|
|
288
|
-
({ items, placeholder, emptyMessage, className, label = 'Command menu', ...morph }, ref) => {
|
|
289
|
-
const { session } = useContext(CommandContext)
|
|
290
|
-
return (
|
|
291
|
-
<DialogContent
|
|
292
|
-
ref={ref}
|
|
293
|
-
position="top"
|
|
294
|
-
size="lg"
|
|
295
|
-
showCloseButton={false}
|
|
296
|
-
aria-label={label}
|
|
297
|
-
className="p-0"
|
|
298
|
-
{...morph}
|
|
299
|
-
>
|
|
300
|
-
{/* Fresh per open: a palette reopened before it finished closing
|
|
301
|
-
would keep the old query and lose the first row's highlight. */}
|
|
302
|
-
<CommandPalette
|
|
303
|
-
key={session}
|
|
304
|
-
items={items}
|
|
305
|
-
placeholder={placeholder}
|
|
306
|
-
emptyMessage={emptyMessage}
|
|
307
|
-
className={className}
|
|
308
|
-
/>
|
|
309
|
-
</DialogContent>
|
|
310
|
-
)
|
|
311
|
-
},
|
|
312
|
-
)
|
|
313
|
-
CommandContent.displayName = 'CommandContent'
|
|
314
|
-
|
|
315
|
-
interface CommandScopeProps {
|
|
316
|
-
open: boolean
|
|
317
|
-
onOpenChange: (next: boolean, details: DialogOpenChangeDetails) => void
|
|
318
|
-
hotkey: string | false
|
|
319
|
-
children?: ReactNode
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
function CommandScope({ open, onOpenChange, hotkey, children }: CommandScopeProps) {
|
|
323
|
-
const trigger = useRef<HTMLButtonElement>(null)
|
|
324
|
-
const change = useRef(onOpenChange)
|
|
325
|
-
change.current = onOpenChange
|
|
326
|
-
const [session, setSession] = useState(0)
|
|
327
|
-
const [wasOpen, setWasOpen] = useState(open)
|
|
328
|
-
if (open !== wasOpen) {
|
|
329
|
-
setWasOpen(open)
|
|
330
|
-
if (open) setSession(session + 1)
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
useEffect(() => {
|
|
334
|
-
if (!hotkey) return
|
|
335
|
-
const onKey = (event: KeyboardEvent) => {
|
|
336
|
-
if (event.defaultPrevented || !(event.metaKey || event.ctrlKey) || event.key.toLowerCase() !== hotkey) return
|
|
337
|
-
event.preventDefault()
|
|
338
|
-
// Opened from the keyboard, it still grows out of its trigger.
|
|
339
|
-
change.current(!open, createDialogChangeDetails('none', event, trigger.current ?? undefined))
|
|
340
|
-
}
|
|
341
|
-
// Only one palette answers a press: an open one listens in the capture
|
|
342
|
-
// phase, so it closes before a closed one can open.
|
|
343
|
-
window.addEventListener('keydown', onKey, open)
|
|
344
|
-
return () => window.removeEventListener('keydown', onKey, open)
|
|
345
|
-
}, [hotkey, open])
|
|
346
|
-
|
|
347
|
-
const ctx = useMemo(
|
|
348
|
-
() => ({ trigger, close: () => change.current(false, createDialogChangeDetails('imperative-action')), session }),
|
|
349
|
-
[session],
|
|
350
|
-
)
|
|
351
|
-
|
|
352
|
-
return (
|
|
353
|
-
<CommandContext.Provider value={ctx}>
|
|
354
|
-
<DialogPrimitive.Root open={open} onOpenChange={onOpenChange}>
|
|
355
|
-
{children}
|
|
356
|
-
</DialogPrimitive.Root>
|
|
357
|
-
</CommandContext.Provider>
|
|
358
|
-
)
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
interface CommandProps {
|
|
362
|
-
/** Controlled open state. */
|
|
363
|
-
open?: boolean
|
|
364
|
-
/** Initial open state, for an uncontrolled palette. Defaults to `false`. */
|
|
365
|
-
defaultOpen?: boolean
|
|
366
|
-
/** Called when the palette opens or closes, with Base UI's Dialog change details (`reason`, `event`, `cancel()`); the hotkey reports `'none'` and a run command `'imperative-action'`. */
|
|
367
|
-
onOpenChange?: (open: boolean, details: DialogOpenChangeDetails) => void
|
|
368
|
-
/** The key that toggles the palette with ⌘ (Ctrl elsewhere); `false` leaves the keyboard alone. Defaults to `'k'`. */
|
|
369
|
-
hotkey?: string | false
|
|
370
|
-
/** The trigger and the panel: `Command.Trigger` plus a `Command.Content`. */
|
|
371
|
-
children?: ReactNode
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
/**
|
|
375
|
-
* A ⌘K command menu: a search field over grouped commands, grown out of
|
|
376
|
-
* whatever opened it.
|
|
377
|
-
*
|
|
378
|
-
* Type to filter by label and keywords; the arrows move one highlight
|
|
379
|
-
* through the rows, springing between them like the fluid hover, and Enter
|
|
380
|
-
* or a press runs the command and closes the panel. The first match is
|
|
381
|
-
* always highlighted, so Enter has a target, and an empty result says so.
|
|
382
|
-
* The panel is Dialog's: it grows out of its trigger with the goo neck
|
|
383
|
-
* (see Morph) and sits near the top of the window, so it keeps its top edge
|
|
384
|
-
* still as the list filters. ⌘K (Ctrl+K elsewhere) toggles it from anywhere
|
|
385
|
-
* on the page and still grows it out of the trigger; with several palettes
|
|
386
|
-
* on one page, one answers each press. Escape and a press outside close it.
|
|
387
|
-
* Built on Base UI's Autocomplete, rendered inline: the input keeps focus
|
|
388
|
-
* and screen readers follow the highlighted row.
|
|
389
|
-
*
|
|
390
|
-
* Commands are data: `{ label, icon, shortcut, keywords, disabled, onSelect }`,
|
|
391
|
-
* flat or in `{ label, items }` groups. A `shortcut` is only shown.
|
|
392
|
-
*
|
|
393
|
-
* Statics:
|
|
394
|
-
* - `Command.Trigger` — the control that opens it: `render={<Button/>}` or
|
|
395
|
-
* `asChild`.
|
|
396
|
-
* - `Command.Content` — the panel: `items`, `placeholder`, `emptyMessage`,
|
|
397
|
-
* `label`, and the morph options `from`, `effect`, `hideSource`, `tier`.
|
|
398
|
-
* - `Command.Palette` — the search field and list on their own, for a
|
|
399
|
-
* palette that lives in the page: `items`, `placeholder`, `emptyMessage`.
|
|
400
|
-
* - `Command.Shortcut` — a key hint, as the rows show it, e.g. in the
|
|
401
|
-
* trigger.
|
|
402
|
-
*
|
|
403
|
-
* @example {@include ./examples.mdx}
|
|
404
|
-
*/
|
|
405
|
-
function Command({ open, defaultOpen, onOpenChange, hotkey = 'k', children }: CommandProps) {
|
|
406
|
-
return (
|
|
407
|
-
<DialogState open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange}>
|
|
408
|
-
{root => (
|
|
409
|
-
<CommandScope {...root} hotkey={hotkey}>
|
|
410
|
-
{children}
|
|
411
|
-
</CommandScope>
|
|
412
|
-
)}
|
|
413
|
-
</DialogState>
|
|
414
|
-
)
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
Command.Trigger = CommandTrigger
|
|
418
|
-
Command.Content = CommandContent
|
|
419
|
-
Command.Palette = CommandPalette
|
|
420
|
-
Command.Shortcut = CommandShortcut
|
|
421
|
-
|
|
422
|
-
export type { CommandContentProps, CommandGroup, CommandItem, CommandItems, CommandPaletteProps, CommandProps }
|
|
423
|
-
export { Command, CommandContent, CommandList, CommandListRoot, CommandPalette, CommandShortcut, CommandTrigger }
|
|
424
|
-
|
|
425
|
-
export default Command
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import ContextMenu from './index'
|
|
2
|
-
import { ArrowLeft, ArrowRight, Code, Copy, Link, Printer, RotateCw, Save, Scissors, Clipboard, Trash2 } from 'lucide-react'
|
|
3
|
-
|
|
4
|
-
# Right click
|
|
5
|
-
|
|
6
|
-
Right-click anywhere in the area (long-press on touch): the menu swells out of the exact point you pressed. Rows are Dropdown's, with a shortcut at the end.
|
|
7
|
-
|
|
8
|
-
<ContextMenu>
|
|
9
|
-
<ContextMenu.Trigger className="flex h-56 w-full max-w-lg items-center justify-center rounded-xl border border-dashed border-border text-caption text-muted-foreground">
|
|
10
|
-
Right-click here
|
|
11
|
-
</ContextMenu.Trigger>
|
|
12
|
-
<ContextMenu.Content>
|
|
13
|
-
<ContextMenu.Item index={0} icon={ArrowLeft} label="Back" shortcut="⌘[" />
|
|
14
|
-
<ContextMenu.Item index={1} icon={ArrowRight} label="Forward" shortcut="⌘]" disabled />
|
|
15
|
-
<ContextMenu.Item index={2} icon={RotateCw} label="Reload" shortcut="⌘R" />
|
|
16
|
-
<ContextMenu.Separator />
|
|
17
|
-
<ContextMenu.Item index={3} icon={Save} label="Save as…" shortcut="⌘S" />
|
|
18
|
-
<ContextMenu.Item index={4} icon={Printer} label="Print…" shortcut="⌘P" />
|
|
19
|
-
<ContextMenu.Item index={5} icon={Link} label="Copy link" />
|
|
20
|
-
<ContextMenu.Separator />
|
|
21
|
-
<ContextMenu.Label>Developer</ContextMenu.Label>
|
|
22
|
-
<ContextMenu.Item index={6} icon={Code} label="Inspect" shortcut="⌥⌘I" />
|
|
23
|
-
</ContextMenu.Content>
|
|
24
|
-
</ContextMenu>
|
|
25
|
-
|
|
26
|
-
# Compact
|
|
27
|
-
|
|
28
|
-
`size="compact"` pins the rows to the 28px step of the size ladder, for dense surfaces.
|
|
29
|
-
|
|
30
|
-
<ContextMenu size="compact">
|
|
31
|
-
<ContextMenu.Trigger className="flex h-40 w-full max-w-lg items-center justify-center rounded-xl border border-dashed border-border text-caption text-muted-foreground">
|
|
32
|
-
Right-click a file
|
|
33
|
-
</ContextMenu.Trigger>
|
|
34
|
-
<ContextMenu.Content className="w-48">
|
|
35
|
-
<ContextMenu.Item index={0} icon={Scissors} label="Cut" shortcut="⌘X" />
|
|
36
|
-
<ContextMenu.Item index={1} icon={Copy} label="Copy" shortcut="⌘C" />
|
|
37
|
-
<ContextMenu.Item index={2} icon={Clipboard} label="Paste" shortcut="⌘V" disabled />
|
|
38
|
-
<ContextMenu.Separator />
|
|
39
|
-
<ContextMenu.Item index={3} icon={Trash2} label="Delete" shortcut="⌫" />
|
|
40
|
-
</ContextMenu.Content>
|
|
41
|
-
</ContextMenu>
|
|
42
|
-
|
|
43
|
-
# Morph
|
|
44
|
-
|
|
45
|
-
`effect="morph"` grows the menu out of the point as one clean surface, without the goo.
|
|
46
|
-
|
|
47
|
-
<ContextMenu>
|
|
48
|
-
<ContextMenu.Trigger className="flex h-40 w-full max-w-lg items-center justify-center rounded-xl border border-dashed border-border text-caption text-muted-foreground">
|
|
49
|
-
Right-click for a plain morph
|
|
50
|
-
</ContextMenu.Trigger>
|
|
51
|
-
<ContextMenu.Content effect="morph">
|
|
52
|
-
<ContextMenu.Item index={0} icon={Copy} label="Copy" shortcut="⌘C" />
|
|
53
|
-
<ContextMenu.Item index={1} icon={Link} label="Copy link" />
|
|
54
|
-
<ContextMenu.Item index={2} icon={Printer} label="Print…" shortcut="⌘P" />
|
|
55
|
-
</ContextMenu.Content>
|
|
56
|
-
</ContextMenu>
|