@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,74 +0,0 @@
|
|
|
1
|
-
import Search from './index'
|
|
2
|
-
import Button from '../../button'
|
|
3
|
-
import { AlignLeft, Bell, Bold, FileText, Hash, Heading, Italic, Link, Settings, Underline } from 'lucide-react'
|
|
4
|
-
|
|
5
|
-
# Pill
|
|
6
|
-
|
|
7
|
-
Press it, or press `/` anywhere on the page: the pill grows into the field in place, over the buttons beside it. Type and the suggestions ooze out below; Escape clears the query, then collapses it.
|
|
8
|
-
|
|
9
|
-
<div className="flex w-full max-w-md items-center gap-1">
|
|
10
|
-
<Search
|
|
11
|
-
placeholder="Search components"
|
|
12
|
-
shortcut="/"
|
|
13
|
-
items={['Accordion', 'Badge', 'Button', 'Card', 'Checkbox group', 'Combobox', 'Command', 'Dialog', 'Dropdown', 'Popover', 'Radio group', 'Select', 'Sheet', 'Slider', 'Switch', 'Tabs', 'Toast', 'Tooltip']}
|
|
14
|
-
/>
|
|
15
|
-
<Button variant="ghost" size="icon" aria-label="Notifications">
|
|
16
|
-
<Bell />
|
|
17
|
-
</Button>
|
|
18
|
-
<Button variant="ghost" size="icon" aria-label="Settings">
|
|
19
|
-
<Settings />
|
|
20
|
-
</Button>
|
|
21
|
-
</div>
|
|
22
|
-
|
|
23
|
-
# Icon
|
|
24
|
-
|
|
25
|
-
`variant="icon"` rests as a lone search icon. At the end of a toolbar, `align="end"` grows it leftward over the other tools.
|
|
26
|
-
|
|
27
|
-
<div className="flex items-center gap-1">
|
|
28
|
-
<Button variant="ghost" size="icon" aria-label="Bold">
|
|
29
|
-
<Bold />
|
|
30
|
-
</Button>
|
|
31
|
-
<Button variant="ghost" size="icon" aria-label="Italic">
|
|
32
|
-
<Italic />
|
|
33
|
-
</Button>
|
|
34
|
-
<Button variant="ghost" size="icon" aria-label="Underline">
|
|
35
|
-
<Underline />
|
|
36
|
-
</Button>
|
|
37
|
-
<Button variant="ghost" size="icon" aria-label="Link">
|
|
38
|
-
<Link />
|
|
39
|
-
</Button>
|
|
40
|
-
<Search
|
|
41
|
-
variant="icon"
|
|
42
|
-
align="end"
|
|
43
|
-
width={240}
|
|
44
|
-
placeholder="Find in document"
|
|
45
|
-
items={[
|
|
46
|
-
{ label: 'Introduction', icon: Heading },
|
|
47
|
-
{ label: 'Getting started', icon: Heading },
|
|
48
|
-
{ label: 'Installation', icon: Hash, keywords: ['setup', 'npm'] },
|
|
49
|
-
{ label: 'Usage', icon: AlignLeft },
|
|
50
|
-
{ label: 'Changelog', icon: FileText, keywords: ['releases'] },
|
|
51
|
-
]}
|
|
52
|
-
/>
|
|
53
|
-
</div>
|
|
54
|
-
|
|
55
|
-
# Without suggestions
|
|
56
|
-
|
|
57
|
-
Leave out `items` for a plain search field: the same growth, no panel. Enter reports the query to `onSubmit`.
|
|
58
|
-
|
|
59
|
-
<Search placeholder="Search the archive" />
|
|
60
|
-
|
|
61
|
-
# Expanded
|
|
62
|
-
|
|
63
|
-
`defaultExpanded` starts it open; leaving it empty still collapses it.
|
|
64
|
-
|
|
65
|
-
<Search defaultExpanded placeholder="Filter" items={['Open', 'In progress', 'In review', 'Done', 'Cancelled']} />
|
|
66
|
-
|
|
67
|
-
# Morph effects
|
|
68
|
-
|
|
69
|
-
`effect` picks how the suggestions leave the field: a plain morph without the neck, or a fade.
|
|
70
|
-
|
|
71
|
-
<div className="flex flex-col items-start gap-3">
|
|
72
|
-
<Search effect="morph" defaultExpanded width={220} placeholder="Morph" items={['Apple', 'Apricot', 'Avocado', 'Banana', 'Blueberry']} />
|
|
73
|
-
<Search effect="fade" defaultExpanded width={220} placeholder="Fade" items={['Apple', 'Apricot', 'Avocado', 'Banana', 'Blueberry']} />
|
|
74
|
-
</div>
|
|
@@ -1,333 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Local addition (not part of Fluid Functionalism): a search that grows out
|
|
3
|
-
* of its own button. The idea is beUI's morphing search
|
|
4
|
-
* (github.com/starc007/ui-components `components/motion/morphing-search.tsx`
|
|
5
|
-
* @ de52f337e520e7ee37749b36eb1c32df86137bcb — MIT © 2026 Saurabh Chauhan,
|
|
6
|
-
* notice: LICENSE.beui); none of its code is ported. Where beUI flies a
|
|
7
|
-
* shared layout box into a fixed overlay, the field here springs its own
|
|
8
|
-
* width in place, over its neighbors, from the box the button keeps in the
|
|
9
|
-
* layout. The suggestions are Base UI's Autocomplete popup with Command's
|
|
10
|
-
* rows, oozing out of the field through the shared morph (`lib/use-morph.ts`,
|
|
11
|
-
* goo by default).
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { Autocomplete } from '@base-ui/react/autocomplete'
|
|
15
|
-
import { motion } from 'motion/react'
|
|
16
|
-
import { type KeyboardEvent, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'
|
|
17
|
-
import { flushSync } from 'react-dom'
|
|
18
|
-
import { useIcon } from '../../../lib/icon-context'
|
|
19
|
-
import { MorphSurface } from '../../../lib/morph-layers'
|
|
20
|
-
import { useReduceMotion } from '../../../lib/reduced-motion'
|
|
21
|
-
import { shapeMap, useShape } from '../../../lib/shape-context'
|
|
22
|
-
import { useSize } from '../../../lib/size-context'
|
|
23
|
-
import { spring } from '../../../lib/springs'
|
|
24
|
-
import { SURFACE_BG, SURFACE_SHADOW } from '../../../lib/surface-classes'
|
|
25
|
-
import { SurfaceProvider, useSurface } from '../../../lib/surface-context'
|
|
26
|
-
import { useControllableState } from '../../../lib/use-controllable-state'
|
|
27
|
-
import { type MorphOrigin, useMorph } from '../../../lib/use-morph'
|
|
28
|
-
import { cn } from '../../../lib/utils'
|
|
29
|
-
import { type CommandItem, CommandList, CommandListRoot, CommandShortcut } from '../../overlays/command'
|
|
30
|
-
|
|
31
|
-
// The icon sits where the square button centers it, in both states and both
|
|
32
|
-
// variants, so it stays put while the field grows around it.
|
|
33
|
-
const INSET = { default: 'pl-2.5', compact: 'pl-[7px]' }
|
|
34
|
-
const SQUARE = { default: 'w-9', compact: 'w-7' }
|
|
35
|
-
const PILL = { default: 'min-w-[160px]', compact: 'min-w-[128px]' }
|
|
36
|
-
|
|
37
|
-
const isEditable = (target: EventTarget | null) =>
|
|
38
|
-
target instanceof HTMLElement && (target.isContentEditable || target.closest('input, textarea, select') !== null)
|
|
39
|
-
|
|
40
|
-
interface SearchProps {
|
|
41
|
-
/** How it rests: a pill showing the placeholder (and the shortcut), or a lone search icon. Defaults to `'pill'`. */
|
|
42
|
-
variant?: 'pill' | 'icon'
|
|
43
|
-
/** The field's placeholder, the pill's label and the accessible name of both. Defaults to `'Search'`. */
|
|
44
|
-
placeholder?: string
|
|
45
|
-
/** Suggestions offered below the field and filtered as you type: strings, or Command items (`{ label, icon, keywords }`). Leave out for a plain search field. */
|
|
46
|
-
items?: (string | CommandItem)[]
|
|
47
|
-
/** Controlled query. */
|
|
48
|
-
value?: string
|
|
49
|
-
/** Initial query, for an uncontrolled field. Defaults to `''`. */
|
|
50
|
-
defaultValue?: string
|
|
51
|
-
/** Called on every change of the query. */
|
|
52
|
-
onValueChange?: (value: string) => void
|
|
53
|
-
/** Called with the query on Enter, and with a suggestion's label when one is picked. */
|
|
54
|
-
onSubmit?: (query: string) => void
|
|
55
|
-
/** Controlled expanded state. */
|
|
56
|
-
expanded?: boolean
|
|
57
|
-
/** Initial expanded state, for an uncontrolled field. Defaults to `false`. */
|
|
58
|
-
defaultExpanded?: boolean
|
|
59
|
-
/** Called when the field expands or collapses. */
|
|
60
|
-
onExpandedChange?: (expanded: boolean) => void
|
|
61
|
-
/** Width of the expanded field, in px. Defaults to `288`. */
|
|
62
|
-
width?: number
|
|
63
|
-
/** The edge that stays put: the field grows from it toward the other one, over its neighbors. Defaults to `'start'`. */
|
|
64
|
-
align?: 'start' | 'end'
|
|
65
|
-
/** A key that expands the field from anywhere on the page outside another field, shown on the pill. */
|
|
66
|
-
shortcut?: string
|
|
67
|
-
/** Shown in the suggestions when none matches. Defaults to `'No results found.'`. */
|
|
68
|
-
emptyMessage?: string
|
|
69
|
-
/** How the suggestions grow out of the field (see Morph): with the liquid goo neck, a plain morph, a slide or a fade. Defaults to `'goo'`. */
|
|
70
|
-
effect?: 'goo' | 'morph' | 'slide' | 'fade'
|
|
71
|
-
/** Spring tier of the suggestions' plain morph, slide or fade; goo runs on its own `spring.goo`. Defaults to `'moderate'`. */
|
|
72
|
-
tier?: 'moderate' | 'slow'
|
|
73
|
-
/** Classes for the root, the box the resting button keeps in the layout. */
|
|
74
|
-
className?: string
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* A search button that grows into the field in place, with suggestions that
|
|
79
|
-
* ooze out below it.
|
|
80
|
-
*
|
|
81
|
-
* At rest it is a pill showing the placeholder, or a lone search icon. A
|
|
82
|
-
* press (or its `shortcut` key) springs it to `width` and focuses the
|
|
83
|
-
* field. It grows over its neighbors rather than pushing them: the resting
|
|
84
|
-
* box stays in the layout, so nothing around it moves, and `align="end"`
|
|
85
|
-
* grows it leftward, for a toolbar's far end. The search icon never moves.
|
|
86
|
-
* Typing opens the suggestions, which melt out of the field through the
|
|
87
|
-
* goo neck (see Morph) once it has finished growing; the arrows move one
|
|
88
|
-
* fluid highlight through them, and Enter or a press picks one. Escape
|
|
89
|
-
* closes the suggestions, then clears the query, then collapses the field
|
|
90
|
-
* and hands focus back to the button; leaving an empty field collapses it
|
|
91
|
-
* too. The field lifts 2 surface levels while open, the same level as its
|
|
92
|
-
* suggestions, so the two read as one liquid.
|
|
93
|
-
*
|
|
94
|
-
* With `items` the field is a combobox over a listbox of suggestions,
|
|
95
|
-
* built on Base UI's Autocomplete (filtering by label and keywords, the
|
|
96
|
-
* input keeps focus while the highlight moves); without, it is a plain
|
|
97
|
-
* search box. Either way it sits in a `<search>` landmark around a form,
|
|
98
|
-
* and Enter reports the query to `onSubmit`.
|
|
99
|
-
*
|
|
100
|
-
* @example {@include ./examples.mdx}
|
|
101
|
-
*/
|
|
102
|
-
function Search({
|
|
103
|
-
variant = 'pill',
|
|
104
|
-
placeholder = 'Search',
|
|
105
|
-
items,
|
|
106
|
-
value,
|
|
107
|
-
defaultValue = '',
|
|
108
|
-
onValueChange,
|
|
109
|
-
onSubmit,
|
|
110
|
-
expanded,
|
|
111
|
-
defaultExpanded = false,
|
|
112
|
-
onExpandedChange,
|
|
113
|
-
width = 288,
|
|
114
|
-
align = 'start',
|
|
115
|
-
shortcut,
|
|
116
|
-
emptyMessage = 'No results found.',
|
|
117
|
-
effect,
|
|
118
|
-
tier = 'moderate',
|
|
119
|
-
className,
|
|
120
|
-
}: SearchProps) {
|
|
121
|
-
const [query, setQuery] = useControllableState(value, defaultValue, onValueChange)
|
|
122
|
-
const [isExpanded, setExpanded] = useControllableState(expanded, defaultExpanded, onExpandedChange)
|
|
123
|
-
const [suggesting, setSuggesting] = useState(false)
|
|
124
|
-
// The state the field last finished springing to: the suggestions wait for
|
|
125
|
-
// it, so the goo neck grows from the field's final box.
|
|
126
|
-
const [settled, setSettled] = useState(isExpanded)
|
|
127
|
-
const [rest, setRest] = useState(0)
|
|
128
|
-
const reduced = useReduceMotion()
|
|
129
|
-
const shape = useShape()
|
|
130
|
-
const size = useSize()
|
|
131
|
-
const level = Math.min(useSurface() + 2, 8)
|
|
132
|
-
const SearchIcon = useIcon('search')
|
|
133
|
-
const XIcon = useIcon('x')
|
|
134
|
-
const button = useRef<HTMLButtonElement>(null)
|
|
135
|
-
const field = useRef<HTMLDivElement>(null)
|
|
136
|
-
const input = useRef<HTMLInputElement>(null)
|
|
137
|
-
const origin = useRef<MorphOrigin>({})
|
|
138
|
-
const suggestions = useMemo(() => items?.map(item => (typeof item === 'string' ? { label: item } : item)), [items])
|
|
139
|
-
const open = suggesting && isExpanded && settled
|
|
140
|
-
// Lifted from the moment it starts growing until it has shrunk back, so
|
|
141
|
-
// its neighbors never show through and its contents stay on top.
|
|
142
|
-
const lifted = isExpanded || settled
|
|
143
|
-
const morph = useMorph(open, origin, { from: field, effect, tier })
|
|
144
|
-
|
|
145
|
-
// The field springs from and back to the button's own width.
|
|
146
|
-
useLayoutEffect(() => {
|
|
147
|
-
const el = button.current
|
|
148
|
-
if (!el) return
|
|
149
|
-
const observer = new ResizeObserver(() => setRest(el.offsetWidth))
|
|
150
|
-
observer.observe(el)
|
|
151
|
-
return () => observer.disconnect()
|
|
152
|
-
}, [])
|
|
153
|
-
|
|
154
|
-
// Both commit synchronously so focus moves straight between the button and
|
|
155
|
-
// the field: a focused button that hides would blur to nothing, which reads
|
|
156
|
-
// as leaving the field.
|
|
157
|
-
const expand = () => {
|
|
158
|
-
flushSync(() => setExpanded(true))
|
|
159
|
-
// No scroll: the field's box is still narrower than its contents.
|
|
160
|
-
input.current?.focus({ preventScroll: true })
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
const collapse = (refocus: boolean) => {
|
|
164
|
-
flushSync(() => {
|
|
165
|
-
setQuery('')
|
|
166
|
-
setSuggesting(false)
|
|
167
|
-
setExpanded(false)
|
|
168
|
-
})
|
|
169
|
-
if (refocus) button.current?.focus()
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
useEffect(() => {
|
|
173
|
-
if (!shortcut || isExpanded) return
|
|
174
|
-
const onKey = (event: globalThis.KeyboardEvent) => {
|
|
175
|
-
if (event.defaultPrevented || event.key !== shortcut || event.metaKey || event.ctrlKey || event.altKey) return
|
|
176
|
-
if (isEditable(event.target)) return
|
|
177
|
-
event.preventDefault()
|
|
178
|
-
expand()
|
|
179
|
-
}
|
|
180
|
-
window.addEventListener('keydown', onKey)
|
|
181
|
-
return () => window.removeEventListener('keydown', onKey)
|
|
182
|
-
}, [shortcut, isExpanded])
|
|
183
|
-
|
|
184
|
-
// Base UI's own Escape closes open suggestions; the next ones clear, then collapse.
|
|
185
|
-
const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {
|
|
186
|
-
if (event.key !== 'Escape' || open) return
|
|
187
|
-
event.stopPropagation()
|
|
188
|
-
if (query) setQuery('')
|
|
189
|
-
else collapse(true)
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
const inputProps = {
|
|
193
|
-
ref: input,
|
|
194
|
-
placeholder,
|
|
195
|
-
'aria-label': placeholder,
|
|
196
|
-
onKeyDown,
|
|
197
|
-
className: cn(
|
|
198
|
-
'h-full min-w-0 flex-1 bg-transparent text-foreground outline-none placeholder:text-muted-foreground [&::-webkit-search-cancel-button]:hidden',
|
|
199
|
-
size.text,
|
|
200
|
-
),
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
const root = (
|
|
204
|
-
<search
|
|
205
|
-
onBlur={event => {
|
|
206
|
-
if (!isExpanded || query || event.currentTarget.contains(event.relatedTarget as Node | null)) return
|
|
207
|
-
collapse(false)
|
|
208
|
-
}}
|
|
209
|
-
className={cn('group/search relative inline-flex shrink-0 align-middle', className)}
|
|
210
|
-
>
|
|
211
|
-
<form
|
|
212
|
-
className="contents"
|
|
213
|
-
onSubmit={event => {
|
|
214
|
-
event.preventDefault()
|
|
215
|
-
onSubmit?.(query)
|
|
216
|
-
}}
|
|
217
|
-
>
|
|
218
|
-
<button
|
|
219
|
-
ref={button}
|
|
220
|
-
type="button"
|
|
221
|
-
aria-label={placeholder}
|
|
222
|
-
onClick={expand}
|
|
223
|
-
className={cn(
|
|
224
|
-
'relative z-[1] flex items-center outline-none focus-visible:ring-1 focus-visible:ring-focus-ring',
|
|
225
|
-
size.control,
|
|
226
|
-
size.gap,
|
|
227
|
-
size.text,
|
|
228
|
-
shape.input,
|
|
229
|
-
variant === 'icon'
|
|
230
|
-
? cn('cursor-pointer justify-center', SQUARE[size.variant])
|
|
231
|
-
: cn('cursor-text pr-2.5', INSET[size.variant], PILL[size.variant]),
|
|
232
|
-
isExpanded && 'invisible',
|
|
233
|
-
)}
|
|
234
|
-
>
|
|
235
|
-
<SearchIcon
|
|
236
|
-
size={size.icon}
|
|
237
|
-
strokeWidth={1.5}
|
|
238
|
-
className="shrink-0 text-muted-foreground transition-colors duration-fast group-hover/search:text-foreground"
|
|
239
|
-
/>
|
|
240
|
-
{variant === 'pill' && <span className="text-muted-foreground">{placeholder}</span>}
|
|
241
|
-
{variant === 'pill' && shortcut && <CommandShortcut className="pl-4">{shortcut}</CommandShortcut>}
|
|
242
|
-
</button>
|
|
243
|
-
{rest > 0 && (
|
|
244
|
-
<motion.div
|
|
245
|
-
ref={field}
|
|
246
|
-
className={cn(
|
|
247
|
-
'absolute top-0 h-full overflow-hidden ring-1 transition-[box-shadow] duration-moderate',
|
|
248
|
-
align === 'end' ? 'right-0' : 'left-0',
|
|
249
|
-
shape.input,
|
|
250
|
-
lifted
|
|
251
|
-
? cn('z-10 ring-transparent', SURFACE_BG[level], SURFACE_SHADOW[3])
|
|
252
|
-
: 'ring-border group-hover/search:bg-muted/50',
|
|
253
|
-
)}
|
|
254
|
-
initial={false}
|
|
255
|
-
animate={{ width: isExpanded ? width : rest }}
|
|
256
|
-
transition={reduced ? { duration: 0 } : isExpanded ? spring.slow : spring.slow.exit}
|
|
257
|
-
onAnimationComplete={() => setSettled(isExpanded)}
|
|
258
|
-
>
|
|
259
|
-
{lifted && (
|
|
260
|
-
// A fixed width (structural): the field's contents keep their
|
|
261
|
-
// place while the box grows over them, and while it shrinks back
|
|
262
|
-
// over the button's identical icon and placeholder.
|
|
263
|
-
<div className={cn('flex h-full items-center pr-1.5', size.gap, INSET[size.variant])} style={{ width }}>
|
|
264
|
-
<SearchIcon size={size.icon} strokeWidth={1.5} className="shrink-0 text-muted-foreground" />
|
|
265
|
-
{suggestions ? (
|
|
266
|
-
<Autocomplete.Input {...inputProps} />
|
|
267
|
-
) : (
|
|
268
|
-
<input {...inputProps} type="search" value={query} onChange={event => setQuery(event.target.value)} />
|
|
269
|
-
)}
|
|
270
|
-
{query && (
|
|
271
|
-
<button
|
|
272
|
-
type="button"
|
|
273
|
-
aria-label="Clear"
|
|
274
|
-
onMouseDown={event => event.preventDefault()}
|
|
275
|
-
onClick={() => {
|
|
276
|
-
setQuery('')
|
|
277
|
-
input.current?.focus()
|
|
278
|
-
}}
|
|
279
|
-
className="flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground outline-none transition-[color,background-color] duration-fast hover:bg-hover hover:text-foreground active:bg-active focus-visible:ring-1 focus-visible:ring-focus-ring"
|
|
280
|
-
>
|
|
281
|
-
<XIcon size={size.icon - 2} strokeWidth={1.5} />
|
|
282
|
-
</button>
|
|
283
|
-
)}
|
|
284
|
-
</div>
|
|
285
|
-
)}
|
|
286
|
-
</motion.div>
|
|
287
|
-
)}
|
|
288
|
-
</form>
|
|
289
|
-
</search>
|
|
290
|
-
)
|
|
291
|
-
|
|
292
|
-
if (!suggestions) return root
|
|
293
|
-
|
|
294
|
-
return (
|
|
295
|
-
<CommandListRoot
|
|
296
|
-
items={suggestions}
|
|
297
|
-
value={query}
|
|
298
|
-
onValueChange={setQuery}
|
|
299
|
-
open={open}
|
|
300
|
-
onOpenChange={setSuggesting}
|
|
301
|
-
>
|
|
302
|
-
{root}
|
|
303
|
-
<Autocomplete.Portal>
|
|
304
|
-
<Autocomplete.Positioner
|
|
305
|
-
anchor={field}
|
|
306
|
-
side="bottom"
|
|
307
|
-
align={align}
|
|
308
|
-
sideOffset={8}
|
|
309
|
-
className="z-50 outline-none"
|
|
310
|
-
>
|
|
311
|
-
<Autocomplete.Popup ref={morph.popupRef} className="relative outline-none">
|
|
312
|
-
<SurfaceProvider value={level}>
|
|
313
|
-
<MorphSurface
|
|
314
|
-
morph={morph}
|
|
315
|
-
bg={SURFACE_BG[level]}
|
|
316
|
-
shadow={SURFACE_SHADOW[3]}
|
|
317
|
-
radius={shapeMap.rounded.container}
|
|
318
|
-
className="flex max-h-[min(300px,var(--available-height))] w-[var(--anchor-width)] flex-col overflow-hidden"
|
|
319
|
-
>
|
|
320
|
-
<CommandList emptyMessage={emptyMessage} onPick={item => onSubmit?.(item.label)} />
|
|
321
|
-
</MorphSurface>
|
|
322
|
-
</SurfaceProvider>
|
|
323
|
-
</Autocomplete.Popup>
|
|
324
|
-
</Autocomplete.Positioner>
|
|
325
|
-
</Autocomplete.Portal>
|
|
326
|
-
</CommandListRoot>
|
|
327
|
-
)
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
export type { SearchProps }
|
|
331
|
-
export { Search }
|
|
332
|
-
|
|
333
|
-
export default Search
|