@justanarthur/modo-ui 0.6.0-canary.8 → 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-4y816hwp.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-t2a3qmy9.js → components-1z6tdadk.js} +24 -40
- package/dist/shared/{components-qs4rkqsj.js → components-27nnvrwe.js} +14 -15
- package/dist/shared/{components-av5t26rc.js → components-2dxkv6zm.js} +7 -8
- package/dist/shared/{components-wqrvqq5p.js → components-2ecg8svx.js} +152 -234
- package/dist/shared/{components-3ydr2fqe.js → components-2ph6t61s.js} +34 -37
- package/dist/shared/{components-6gk118w3.js → components-39jq9va1.js} +24 -29
- package/dist/shared/components-3ky44908.js +9 -0
- package/dist/shared/{components-y1qvbawa.js → components-3mkepka5.js} +25 -28
- package/dist/shared/{components-xqszvkj4.js → components-4700p9kz.js} +22 -24
- package/dist/shared/{components-yhgq0qxx.js → components-59efxjd9.js} +12 -13
- package/dist/shared/{components-9j9abkct.js → components-5vgpnxgy.js} +27 -51
- package/dist/shared/{components-8tt3xbb5.js → components-5xc2j8jz.js} +18 -19
- package/dist/shared/{components-jymmaevv.js → components-6p8tfcd6.js} +29 -57
- package/dist/shared/{components-4nck8acq.js → components-7r3etddy.js} +54 -19
- package/dist/shared/{components-skfd7kff.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-vkwq2k96.js → components-b3c5et5b.js} +38 -49
- package/dist/shared/{components-rrbpmfx4.js → components-c6s6b43g.js} +2 -3
- package/dist/shared/{components-pw06rbxq.js → components-chacnk61.js} +19 -19
- package/dist/shared/{components-71nbt03m.js → components-cv16mryv.js} +7 -26
- package/dist/shared/{components-eqze3y30.js → components-d6xtjht3.js} +30 -35
- package/dist/shared/{components-5y5shqfd.js → components-dk0gjr5a.js} +18 -19
- package/dist/shared/{components-khspp26b.js → components-fzrq6tr3.js} +34 -37
- package/dist/shared/{components-km7fhgbk.js → components-gc5vtq2f.js} +30 -66
- package/dist/shared/components-gf5s6ap9.js +42 -0
- package/dist/shared/{components-qqcmtrbv.js → components-gz8zf3ec.js} +55 -56
- package/dist/shared/{components-mattt5jp.js → components-h2ajmhwn.js} +35 -107
- package/dist/shared/{components-awra5sff.js → components-hqeq3w9q.js} +16 -24
- package/dist/shared/{components-5tzhqbcw.js → components-hw9yk32z.js} +24 -36
- package/dist/shared/components-hyq23phv.js +310 -0
- package/dist/shared/{components-8mt5bsv6.js → components-jbbmdr74.js} +22 -41
- package/dist/shared/{components-dcc02hs2.js → components-jjw69c4c.js} +4 -7
- package/dist/shared/{components-2syq4mwc.js → components-jthe1pwb.js} +420 -139
- package/dist/shared/{components-r7q1zm7r.js → components-jwst3vtj.js} +76 -224
- package/dist/shared/{components-qdm3yh26.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-6b0zb8z3.js → components-mjthm1kf.js} +9 -13
- package/dist/shared/{components-2c64r8c9.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-dyae0y7h.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-8rb25gbe.js → components-rr7a6ja9.js} +27 -59
- package/dist/shared/{components-5012r6gr.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-w0xq6q9k.js → components-w1r67ag9.js} +149 -294
- package/dist/shared/{components-z0bqtvcp.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-5sxjeh6h.js → components-y9y0g8er.js} +28 -52
- package/dist/shared/components-ypp01w3p.js +986 -0
- package/dist/shared/{components-t50hrswb.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-124epb7f.js +0 -53
- package/dist/shared/components-1kab3j44.js +0 -337
- package/dist/shared/components-26snnbs9.js +0 -322
- 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-7zkhz3r8.js +0 -399
- package/dist/shared/components-8v644a0s.js +0 -298
- package/dist/shared/components-a4evvq8h.js +0 -271
- 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-c9yr4ed1.js +0 -44
- package/dist/shared/components-cwg1d0w6.js +0 -254
- 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-ej4r7wmj.js +0 -482
- package/dist/shared/components-f7h57m6t.js +0 -59
- package/dist/shared/components-fejdzvqc.js +0 -448
- 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-mpa2y6x8.js +0 -277
- package/dist/shared/components-mrbaxt8q.js +0 -62
- package/dist/shared/components-pt5ftm4p.js +0 -38
- package/dist/shared/components-rpw4md2b.js +0 -179
- package/dist/shared/components-rtadhd9j.js +0 -64
- package/dist/shared/components-tz4gaf1v.js +0 -23
- package/dist/shared/components-wbbckbw8.js +0 -34
- 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/shared/components-z6dfqtyt.js +0 -1545
- 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 -557
- 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,59 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Local addition (not part of Fluid Functionalism): the docs stage of the
|
|
3
|
-
* Popover page's anchored example. A field whose icon opens a panel anchored
|
|
4
|
-
* to the whole field, focus moving into the list and back to the text, so
|
|
5
|
-
* the example can hold its refs and the picked value.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { History } from 'lucide-react'
|
|
9
|
-
import { useRef, useState } from 'react'
|
|
10
|
-
import Button from '../../button'
|
|
11
|
-
import Input, { InputAction } from '../../inputs/input'
|
|
12
|
-
import Popover from './index'
|
|
13
|
-
|
|
14
|
-
const RECENT = ['Quarterly report', 'Invoices from March', 'Design review notes']
|
|
15
|
-
|
|
16
|
-
export default function AnchoredDemo() {
|
|
17
|
-
const field = useRef<HTMLDivElement | null>(null)
|
|
18
|
-
const input = useRef<HTMLInputElement | null>(null)
|
|
19
|
-
const first = useRef<HTMLButtonElement | null>(null)
|
|
20
|
-
const [value, setValue] = useState('')
|
|
21
|
-
|
|
22
|
-
return (
|
|
23
|
-
<div ref={field} className="w-80 max-w-full">
|
|
24
|
-
<Popover>
|
|
25
|
-
<Input
|
|
26
|
-
ref={input}
|
|
27
|
-
variant="bordered"
|
|
28
|
-
placeholder="Search documents"
|
|
29
|
-
value={value}
|
|
30
|
-
onChange={setValue}
|
|
31
|
-
endAdornment={<Popover.Trigger render={<InputAction label="Recent searches" icon={History} />} />}
|
|
32
|
-
/>
|
|
33
|
-
<Popover.Content
|
|
34
|
-
anchor={field}
|
|
35
|
-
align="start"
|
|
36
|
-
sideOffset={8}
|
|
37
|
-
// From the keyboard, straight onto the first result; a click leaves the caret in the field.
|
|
38
|
-
initialFocus={type => (type === 'keyboard' ? first.current : false)}
|
|
39
|
-
finalFocus={input}
|
|
40
|
-
className="w-[var(--anchor-width)] max-w-none gap-0 p-1"
|
|
41
|
-
>
|
|
42
|
-
<Popover.Title className="sr-only">Recent searches</Popover.Title>
|
|
43
|
-
{RECENT.map((item, i) => (
|
|
44
|
-
<Popover.Close
|
|
45
|
-
key={item}
|
|
46
|
-
ref={i === 0 ? first : undefined}
|
|
47
|
-
render={
|
|
48
|
-
<Button variant="ghost" className="w-full justify-start">
|
|
49
|
-
{item}
|
|
50
|
-
</Button>
|
|
51
|
-
}
|
|
52
|
-
onClick={() => setValue(item)}
|
|
53
|
-
/>
|
|
54
|
-
))}
|
|
55
|
-
</Popover.Content>
|
|
56
|
-
</Popover>
|
|
57
|
-
</div>
|
|
58
|
-
)
|
|
59
|
-
}
|
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
import Popover from './index'
|
|
2
|
-
import Button from '../../button'
|
|
3
|
-
import { InputGroup } from '../../inputs/input'
|
|
4
|
-
import AnchoredDemo from './anchored-demo'
|
|
5
|
-
|
|
6
|
-
# Basics
|
|
7
|
-
|
|
8
|
-
## Edit profile
|
|
9
|
-
|
|
10
|
-
The panel oozes out of the trigger through a liquid neck, then lets go. Escape or a press outside closes it back into the button.
|
|
11
|
-
|
|
12
|
-
<Popover>
|
|
13
|
-
<Popover.Trigger render={<Button variant="secondary">Edit profile</Button>} />
|
|
14
|
-
<Popover.Content className="w-72 gap-3">
|
|
15
|
-
<div className="flex flex-col gap-1">
|
|
16
|
-
<Popover.Title>Edit profile</Popover.Title>
|
|
17
|
-
<Popover.Description>Update how others see you.</Popover.Description>
|
|
18
|
-
</div>
|
|
19
|
-
<InputGroup>
|
|
20
|
-
<InputGroup.Field index={0} label="Name" placeholder="Ada Lovelace" />
|
|
21
|
-
<InputGroup.Field index={1} label="Username" placeholder="@ada" />
|
|
22
|
-
</InputGroup>
|
|
23
|
-
<div className="flex justify-end">
|
|
24
|
-
<Popover.Close render={<Button size="compact">Save</Button>} />
|
|
25
|
-
</div>
|
|
26
|
-
</Popover.Content>
|
|
27
|
-
</Popover>
|
|
28
|
-
|
|
29
|
-
## Hover
|
|
30
|
-
|
|
31
|
-
With `openOnHover` the trigger opens it on hover too; a tap still toggles it on touch.
|
|
32
|
-
|
|
33
|
-
<Popover>
|
|
34
|
-
<Popover.Trigger openOnHover delay={100} closeDelay={120} render={<Button variant="tertiary">Hover me</Button>} />
|
|
35
|
-
<Popover.Content>
|
|
36
|
-
<Popover.Title>Liquid preview</Popover.Title>
|
|
37
|
-
<Popover.Description>Move away and it melts back into the button.</Popover.Description>
|
|
38
|
-
</Popover.Content>
|
|
39
|
-
</Popover>
|
|
40
|
-
|
|
41
|
-
## Any element as the trigger
|
|
42
|
-
|
|
43
|
-
`render` takes any element, and the trigger's children fill it when it has none of its own. Pass `nativeButton={false}` when it isn't a `<button>`: Base UI adds the role and the keyboard handling.
|
|
44
|
-
|
|
45
|
-
<Popover>
|
|
46
|
-
<Popover.Trigger
|
|
47
|
-
nativeButton={false}
|
|
48
|
-
render={<span className="cursor-pointer weight-medium text-foreground underline decoration-border underline-offset-4" />}
|
|
49
|
-
>
|
|
50
|
-
Ada Lovelace
|
|
51
|
-
</Popover.Trigger>
|
|
52
|
-
<Popover.Content>
|
|
53
|
-
<Popover.Title>Ada Lovelace</Popover.Title>
|
|
54
|
-
<Popover.Description>Wrote the first published program.</Popover.Description>
|
|
55
|
-
</Popover.Content>
|
|
56
|
-
</Popover>
|
|
57
|
-
|
|
58
|
-
# Placement
|
|
59
|
-
|
|
60
|
-
## Sides
|
|
61
|
-
|
|
62
|
-
Each side keeps the neck between trigger and panel; near a viewport edge the panel flips.
|
|
63
|
-
|
|
64
|
-
<div className="flex flex-wrap items-center justify-center gap-3">
|
|
65
|
-
<Popover>
|
|
66
|
-
<Popover.Trigger render={<Button variant="secondary">Top</Button>} />
|
|
67
|
-
<Popover.Content side="top">
|
|
68
|
-
<Popover.Description>Above the trigger.</Popover.Description>
|
|
69
|
-
</Popover.Content>
|
|
70
|
-
</Popover>
|
|
71
|
-
<Popover>
|
|
72
|
-
<Popover.Trigger render={<Button variant="secondary">Right</Button>} />
|
|
73
|
-
<Popover.Content side="right">
|
|
74
|
-
<Popover.Description>To the right.</Popover.Description>
|
|
75
|
-
</Popover.Content>
|
|
76
|
-
</Popover>
|
|
77
|
-
<Popover>
|
|
78
|
-
<Popover.Trigger render={<Button variant="secondary">Bottom</Button>} />
|
|
79
|
-
<Popover.Content side="bottom">
|
|
80
|
-
<Popover.Description>Below the trigger.</Popover.Description>
|
|
81
|
-
</Popover.Content>
|
|
82
|
-
</Popover>
|
|
83
|
-
<Popover>
|
|
84
|
-
<Popover.Trigger render={<Button variant="secondary">Left</Button>} />
|
|
85
|
-
<Popover.Content side="left">
|
|
86
|
-
<Popover.Description>To the left.</Popover.Description>
|
|
87
|
-
</Popover.Content>
|
|
88
|
-
</Popover>
|
|
89
|
-
</div>
|
|
90
|
-
|
|
91
|
-
## Align
|
|
92
|
-
|
|
93
|
-
`align` lines the panel up with the trigger's start edge, its center (the default) or its end edge; the neck stays between them.
|
|
94
|
-
|
|
95
|
-
<div className="flex flex-wrap items-center justify-center gap-3">
|
|
96
|
-
<Popover>
|
|
97
|
-
<Popover.Trigger render={<Button variant="secondary">Start</Button>} />
|
|
98
|
-
<Popover.Content align="start">
|
|
99
|
-
<Popover.Description>Lined up with the trigger's start edge.</Popover.Description>
|
|
100
|
-
</Popover.Content>
|
|
101
|
-
</Popover>
|
|
102
|
-
<Popover>
|
|
103
|
-
<Popover.Trigger render={<Button variant="secondary">Center</Button>} />
|
|
104
|
-
<Popover.Content align="center">
|
|
105
|
-
<Popover.Description>Centered on the trigger.</Popover.Description>
|
|
106
|
-
</Popover.Content>
|
|
107
|
-
</Popover>
|
|
108
|
-
<Popover>
|
|
109
|
-
<Popover.Trigger render={<Button variant="secondary">End</Button>} />
|
|
110
|
-
<Popover.Content align="end">
|
|
111
|
-
<Popover.Description>Lined up with the trigger's end edge.</Popover.Description>
|
|
112
|
-
</Popover.Content>
|
|
113
|
-
</Popover>
|
|
114
|
-
</div>
|
|
115
|
-
|
|
116
|
-
## Anchored to a field
|
|
117
|
-
|
|
118
|
-
`anchor` positions the panel against another element than its trigger, here
|
|
119
|
-
the whole field around the icon, and the panel grows out of that box.
|
|
120
|
-
`--anchor-width` sizes it to the field. `initialFocus` moves focus to the
|
|
121
|
-
first result when it opens from the keyboard and leaves the caret in the field
|
|
122
|
-
on a click; `finalFocus` hands focus back to the text, so typing goes on.
|
|
123
|
-
`AnchoredDemo` is a docs stage that holds the refs and the picked value:
|
|
124
|
-
|
|
125
|
-
```tsx
|
|
126
|
-
const field = useRef(null)
|
|
127
|
-
const input = useRef(null)
|
|
128
|
-
const first = useRef(null)
|
|
129
|
-
|
|
130
|
-
<div ref={field}>
|
|
131
|
-
<Popover>
|
|
132
|
-
<Input ref={input} endAdornment={<Popover.Trigger render={<InputAction label="Recent searches" icon={History} />} />} />
|
|
133
|
-
<Popover.Content
|
|
134
|
-
anchor={field}
|
|
135
|
-
align="start"
|
|
136
|
-
initialFocus={type => (type === 'keyboard' ? first.current : false)}
|
|
137
|
-
finalFocus={input}
|
|
138
|
-
className="w-[var(--anchor-width)] max-w-none"
|
|
139
|
-
>
|
|
140
|
-
…
|
|
141
|
-
</Popover.Content>
|
|
142
|
-
</Popover>
|
|
143
|
-
</div>
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
<AnchoredDemo />
|
|
147
|
-
|
|
148
|
-
# Behavior
|
|
149
|
-
|
|
150
|
-
## Morph
|
|
151
|
-
|
|
152
|
-
`effect="morph"` with `hideSource`: the trigger itself grows into the panel and shrinks back, one continuous surface.
|
|
153
|
-
|
|
154
|
-
<Popover>
|
|
155
|
-
<Popover.Trigger render={<Button variant="secondary">Add note</Button>} />
|
|
156
|
-
<Popover.Content effect="morph" hideSource className="w-72 gap-3">
|
|
157
|
-
<Popover.Title>Add note</Popover.Title>
|
|
158
|
-
<InputGroup>
|
|
159
|
-
<InputGroup.Field index={0} label="Note" placeholder="Write something…" />
|
|
160
|
-
</InputGroup>
|
|
161
|
-
<div className="flex justify-end">
|
|
162
|
-
<Popover.Close render={<Button size="compact">Done</Button>} />
|
|
163
|
-
</div>
|
|
164
|
-
</Popover.Content>
|
|
165
|
-
</Popover>
|
|
166
|
-
|
|
167
|
-
## Sources
|
|
168
|
-
|
|
169
|
-
`from` changes where the surface starts: the press point grows a circle under the cursor, `center` unfolds the panel in place.
|
|
170
|
-
|
|
171
|
-
<div className="flex flex-wrap items-center justify-center gap-3">
|
|
172
|
-
<Popover>
|
|
173
|
-
<Popover.Trigger render={<Button variant="secondary">From the pointer</Button>} />
|
|
174
|
-
<Popover.Content from="pointer">
|
|
175
|
-
<Popover.Description>A circle from where you pressed.</Popover.Description>
|
|
176
|
-
</Popover.Content>
|
|
177
|
-
</Popover>
|
|
178
|
-
<Popover>
|
|
179
|
-
<Popover.Trigger render={<Button variant="secondary">From its center</Button>} />
|
|
180
|
-
<Popover.Content from="center" effect="morph">
|
|
181
|
-
<Popover.Description>Unfolds from its own center.</Popover.Description>
|
|
182
|
-
</Popover.Content>
|
|
183
|
-
</Popover>
|
|
184
|
-
</div>
|
|
185
|
-
|
|
186
|
-
## Dismissal
|
|
187
|
-
|
|
188
|
-
`onOpenChange` gets Base UI's change details with the open state: `details.reason` says what asked (`'escape-key'`, `'outside-press'`, `'trigger-press'`, `'close-press'`, …) and `details.cancel()` keeps the popover as it is. This one ignores a press outside; Escape or Done close it.
|
|
189
|
-
|
|
190
|
-
<Popover
|
|
191
|
-
onOpenChange={(open, details) => {
|
|
192
|
-
if (!open && details.reason === 'outside-press') details.cancel()
|
|
193
|
-
}}
|
|
194
|
-
>
|
|
195
|
-
<Popover.Trigger render={<Button variant="secondary">Pin a note</Button>} />
|
|
196
|
-
<Popover.Content className="w-72 gap-3">
|
|
197
|
-
<Popover.Title>Pinned note</Popover.Title>
|
|
198
|
-
<Popover.Description>Click around the page: it stays until you close it.</Popover.Description>
|
|
199
|
-
<div className="flex justify-end">
|
|
200
|
-
<Popover.Close render={<Button size="compact">Done</Button>} />
|
|
201
|
-
</div>
|
|
202
|
-
</Popover.Content>
|
|
203
|
-
</Popover>
|
|
@@ -1,317 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Local addition (not part of Fluid Functionalism): a morphing popover. The
|
|
3
|
-
* panel grows out of its trigger through `lib/use-morph.ts`, with the goo neck
|
|
4
|
-
* by default. After beUI's gooey popover (github.com/starc007/ui-components
|
|
5
|
-
* `components/motion/popover.tsx` @ de52f337e520e7ee37749b36eb1c32df86137bcb —
|
|
6
|
-
* MIT © 2026 Saurabh Chauhan, notice: LICENSE.beui) and motion-primitives'
|
|
7
|
-
* morphing popover (github.com/ibelick/motion-primitives
|
|
8
|
-
* `components/core/morphing-popover.tsx` @ 120f64f6ca60348e251f929e9c81f11ccbe45eda
|
|
9
|
-
* — MIT © 2024 ibelick, notice: LICENSE.motion-primitives). Behavior is Base
|
|
10
|
-
* UI's Popover; neither project's own dismissal, gesture or positioning code
|
|
11
|
-
* is ported.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { Popover as PopoverPrimitive } from '@base-ui/react/popover'
|
|
15
|
-
import {
|
|
16
|
-
type ComponentProps,
|
|
17
|
-
createContext,
|
|
18
|
-
forwardRef,
|
|
19
|
-
type HTMLAttributes,
|
|
20
|
-
type ReactNode,
|
|
21
|
-
type RefObject,
|
|
22
|
-
useContext,
|
|
23
|
-
useImperativeHandle,
|
|
24
|
-
useMemo,
|
|
25
|
-
} from 'react'
|
|
26
|
-
import { MorphSurface } from '../../../lib/morph-layers'
|
|
27
|
-
import { useShape } from '../../../lib/shape-context'
|
|
28
|
-
import { type SlotProps, slotId, slotRender } from '../../../lib/slot'
|
|
29
|
-
import { SURFACE_BG, SURFACE_SHADOW } from '../../../lib/surface-classes'
|
|
30
|
-
import { SurfaceProvider, useSurface } from '../../../lib/surface-context'
|
|
31
|
-
import { useControllableState } from '../../../lib/use-controllable-state'
|
|
32
|
-
import { inPlaceOffset, type MorphOrigin, opensInPlace, useMorph, useMorphOrigin } from '../../../lib/use-morph'
|
|
33
|
-
import { cn } from '../../../lib/utils'
|
|
34
|
-
|
|
35
|
-
interface PopoverContextValue {
|
|
36
|
-
open: boolean
|
|
37
|
-
origin: RefObject<MorphOrigin>
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const PopoverContext = createContext<PopoverContextValue>({ open: false, origin: { current: {} } })
|
|
41
|
-
|
|
42
|
-
interface PopoverTriggerProps extends SlotProps {
|
|
43
|
-
/** Open on hover as well as on press (a tap still toggles it on touch). Defaults to `false`. */
|
|
44
|
-
openOnHover?: boolean
|
|
45
|
-
/** Hover delay before opening, in ms. Needs `openOnHover`. Defaults to `300`. */
|
|
46
|
-
delay?: number
|
|
47
|
-
/** Delay before closing once the pointer leaves, in ms. Needs `openOnHover`. Defaults to `0`. */
|
|
48
|
-
closeDelay?: number
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const PopoverTrigger = forwardRef<HTMLButtonElement, PopoverTriggerProps>(
|
|
52
|
-
({ render, asChild, children, ...props }, ref) => {
|
|
53
|
-
const el = slotRender(render, asChild, children)
|
|
54
|
-
return el ? (
|
|
55
|
-
<PopoverPrimitive.Trigger ref={ref} render={el} {...props} id={slotId(el, props.id)} />
|
|
56
|
-
) : (
|
|
57
|
-
<PopoverPrimitive.Trigger ref={ref} {...props}>
|
|
58
|
-
{children}
|
|
59
|
-
</PopoverPrimitive.Trigger>
|
|
60
|
-
)
|
|
61
|
-
},
|
|
62
|
-
)
|
|
63
|
-
PopoverTrigger.displayName = 'PopoverTrigger'
|
|
64
|
-
|
|
65
|
-
const PopoverClose = forwardRef<HTMLButtonElement, SlotProps>(({ render, asChild, children, ...props }, ref) => {
|
|
66
|
-
const el = slotRender(render, asChild, children)
|
|
67
|
-
return el ? (
|
|
68
|
-
<PopoverPrimitive.Close ref={ref} render={el} {...props} />
|
|
69
|
-
) : (
|
|
70
|
-
<PopoverPrimitive.Close ref={ref} {...props}>
|
|
71
|
-
{children}
|
|
72
|
-
</PopoverPrimitive.Close>
|
|
73
|
-
)
|
|
74
|
-
})
|
|
75
|
-
PopoverClose.displayName = 'PopoverClose'
|
|
76
|
-
|
|
77
|
-
type PositionerProps = ComponentProps<typeof PopoverPrimitive.Positioner>
|
|
78
|
-
type PopupProps = ComponentProps<typeof PopoverPrimitive.Popup>
|
|
79
|
-
|
|
80
|
-
/** What the panel is positioned against: an element, a ref to one, a virtual element (`{ getBoundingClientRect }`), or a function returning either. */
|
|
81
|
-
type PopoverAnchor = PositionerProps['anchor']
|
|
82
|
-
|
|
83
|
-
/** Resolves an `anchor` to the element the panel grows from; a virtual or missing anchor gives `null`. */
|
|
84
|
-
function anchorElement(anchor: PopoverAnchor): HTMLElement | null {
|
|
85
|
-
const resolved = typeof anchor === 'function' ? anchor() : anchor
|
|
86
|
-
const el = resolved && 'current' in resolved ? resolved.current : resolved
|
|
87
|
-
return el instanceof HTMLElement ? el : null
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
interface PopoverContentProps extends HTMLAttributes<HTMLDivElement> {
|
|
91
|
-
/** Side of the anchor the panel opens on; it flips when there is no room. Defaults to `'bottom'`. */
|
|
92
|
-
side?: 'top' | 'right' | 'bottom' | 'left'
|
|
93
|
-
/** Alignment along that side. Defaults to `'center'`, or `'start'` when the panel opens in place (`effect="morph"` with `hideSource`). */
|
|
94
|
-
align?: 'start' | 'center' | 'end'
|
|
95
|
-
/** Gap between anchor and panel in px — the length of the goo neck. Ignored when the panel opens in place over its trigger (`effect="morph"` with `hideSource`). Defaults to `12`. */
|
|
96
|
-
sideOffset?: number
|
|
97
|
-
/** Shift along the aligned edge in px, after `align` (a number, or Base UI's function of side, align and sizes). Defaults to `0`. */
|
|
98
|
-
alignOffset?: PositionerProps['alignOffset']
|
|
99
|
-
/** What the panel is positioned against instead of the trigger: an element, a ref to one, a virtual element (`{ getBoundingClientRect }`) or a function returning either. An element anchor is also where the panel grows from, and sets `--anchor-width` / `--anchor-height` for sizing the panel to it. Defaults to the trigger. */
|
|
100
|
-
anchor?: PopoverAnchor
|
|
101
|
-
/** Space kept between the panel and the edge of its collision boundary, in px or per side. Defaults to `5`. */
|
|
102
|
-
collisionPadding?: PositionerProps['collisionPadding']
|
|
103
|
-
/** The area the panel must stay inside: an element, several, or a rect. Defaults to `'clipping-ancestors'`. */
|
|
104
|
-
collisionBoundary?: PositionerProps['collisionBoundary']
|
|
105
|
-
/** Where focus goes when the panel opens: a ref, `false` to leave it, `true` for the default, or a function of how it opened (`'mouse'`, `'touch'`, `'pen'`, `'keyboard'`). Defaults to the panel itself. */
|
|
106
|
-
initialFocus?: PopupProps['initialFocus']
|
|
107
|
-
/** Where focus goes when the panel closes: a ref, `false` to leave it, `true` for the default, or a function of how it closed. Defaults to the trigger. */
|
|
108
|
-
finalFocus?: PopupProps['finalFocus']
|
|
109
|
-
/** Where the panel grows from (see Morph): the pressed trigger, the press point, its own center, a viewport edge, or a ref to any element. Defaults to the `anchor` when it is an element, otherwise `'trigger'`. */
|
|
110
|
-
from?: 'trigger' | 'pointer' | 'center' | 'top' | 'right' | 'bottom' | 'left' | RefObject<HTMLElement | null>
|
|
111
|
-
/** How it grows (see Morph): with the liquid goo neck, a plain morph, a slide or a fade. Defaults to `'goo'`. */
|
|
112
|
-
effect?: 'goo' | 'morph' | 'slide' | 'fade'
|
|
113
|
-
/** Hide the trigger while open, so it reads as turning into the panel. Defaults to `false`. */
|
|
114
|
-
hideSource?: boolean
|
|
115
|
-
/** Spring tier of a plain morph, slide or fade; goo runs on its own `spring.goo`. Defaults to `'slow'`. */
|
|
116
|
-
tier?: 'moderate' | 'slow'
|
|
117
|
-
/** Portal target. Defaults to the document body. */
|
|
118
|
-
container?: HTMLElement | null
|
|
119
|
-
/** Classes for the panel's content box: padding, width, layout. */
|
|
120
|
-
className?: string
|
|
121
|
-
/** The panel's content. Everything inside reads the popover's surface level as its substrate. */
|
|
122
|
-
children?: ReactNode
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
const PopoverContent = forwardRef<HTMLDivElement, PopoverContentProps>(
|
|
126
|
-
(
|
|
127
|
-
{
|
|
128
|
-
side = 'bottom',
|
|
129
|
-
align,
|
|
130
|
-
sideOffset = 12,
|
|
131
|
-
alignOffset,
|
|
132
|
-
anchor,
|
|
133
|
-
collisionPadding,
|
|
134
|
-
collisionBoundary,
|
|
135
|
-
initialFocus,
|
|
136
|
-
finalFocus,
|
|
137
|
-
from,
|
|
138
|
-
effect,
|
|
139
|
-
hideSource,
|
|
140
|
-
tier,
|
|
141
|
-
container,
|
|
142
|
-
className,
|
|
143
|
-
children,
|
|
144
|
-
...props
|
|
145
|
-
},
|
|
146
|
-
ref,
|
|
147
|
-
) => {
|
|
148
|
-
const { open, origin } = useContext(PopoverContext)
|
|
149
|
-
// An element anchor is the morph's source, read as the morph starts (a
|
|
150
|
-
// ref fills after this render). A virtual anchor has no box to grow
|
|
151
|
-
// from, so the panel grows from the trigger.
|
|
152
|
-
const anchorSource = useMemo<RefObject<HTMLElement | null> | undefined>(
|
|
153
|
-
() =>
|
|
154
|
-
anchor
|
|
155
|
-
? {
|
|
156
|
-
get current() {
|
|
157
|
-
return anchorElement(anchor) ?? origin.current?.trigger ?? null
|
|
158
|
-
},
|
|
159
|
-
}
|
|
160
|
-
: undefined,
|
|
161
|
-
[anchor, origin],
|
|
162
|
-
)
|
|
163
|
-
const morph = useMorph(open, origin, {
|
|
164
|
-
from: from ?? anchorSource,
|
|
165
|
-
effect,
|
|
166
|
-
hideSource,
|
|
167
|
-
tier,
|
|
168
|
-
// A custom `finalFocus` places focus itself; the morph's own return
|
|
169
|
-
// to the trigger would undo it.
|
|
170
|
-
returnFocus: typeof finalFocus === 'boolean' ? finalFocus : finalFocus === undefined,
|
|
171
|
-
})
|
|
172
|
-
const inPlace = opensInPlace({ effect, hideSource })
|
|
173
|
-
useImperativeHandle(ref, () => morph.popup as HTMLDivElement, [morph.popup])
|
|
174
|
-
const shape = useShape()
|
|
175
|
-
// Fixed shadow, like the dropdown and select menus (see Elevated).
|
|
176
|
-
const level = Math.min(useSurface() + 2, 8)
|
|
177
|
-
|
|
178
|
-
return (
|
|
179
|
-
<PopoverPrimitive.Portal container={container ?? undefined}>
|
|
180
|
-
<PopoverPrimitive.Positioner
|
|
181
|
-
side={side}
|
|
182
|
-
align={align ?? (inPlace ? 'start' : 'center')}
|
|
183
|
-
sideOffset={inPlace ? inPlaceOffset : sideOffset}
|
|
184
|
-
alignOffset={alignOffset}
|
|
185
|
-
anchor={anchor}
|
|
186
|
-
collisionPadding={collisionPadding}
|
|
187
|
-
collisionBoundary={collisionBoundary}
|
|
188
|
-
className="z-50 outline-none"
|
|
189
|
-
>
|
|
190
|
-
<PopoverPrimitive.Popup
|
|
191
|
-
ref={morph.popupRef}
|
|
192
|
-
initialFocus={initialFocus}
|
|
193
|
-
finalFocus={finalFocus}
|
|
194
|
-
className="relative outline-none"
|
|
195
|
-
{...props}
|
|
196
|
-
>
|
|
197
|
-
<SurfaceProvider value={level}>
|
|
198
|
-
<MorphSurface
|
|
199
|
-
morph={morph}
|
|
200
|
-
bg={SURFACE_BG[level]}
|
|
201
|
-
shadow={SURFACE_SHADOW[3]}
|
|
202
|
-
radius={shape.container}
|
|
203
|
-
className={cn('flex w-max max-w-[min(92vw,20rem)] flex-col gap-1 p-4', className)}
|
|
204
|
-
>
|
|
205
|
-
{children}
|
|
206
|
-
</MorphSurface>
|
|
207
|
-
</SurfaceProvider>
|
|
208
|
-
</PopoverPrimitive.Popup>
|
|
209
|
-
</PopoverPrimitive.Positioner>
|
|
210
|
-
</PopoverPrimitive.Portal>
|
|
211
|
-
)
|
|
212
|
-
},
|
|
213
|
-
)
|
|
214
|
-
PopoverContent.displayName = 'PopoverContent'
|
|
215
|
-
|
|
216
|
-
const PopoverTitle = forwardRef<HTMLHeadingElement, HTMLAttributes<HTMLHeadingElement>>(
|
|
217
|
-
({ className, ...props }, ref) => (
|
|
218
|
-
<PopoverPrimitive.Title
|
|
219
|
-
ref={ref}
|
|
220
|
-
className={cn('text-subtitle weight-semibold text-foreground', className)}
|
|
221
|
-
{...props}
|
|
222
|
-
/>
|
|
223
|
-
),
|
|
224
|
-
)
|
|
225
|
-
PopoverTitle.displayName = 'PopoverTitle'
|
|
226
|
-
|
|
227
|
-
const PopoverDescription = forwardRef<HTMLParagraphElement, HTMLAttributes<HTMLParagraphElement>>(
|
|
228
|
-
({ className, ...props }, ref) => (
|
|
229
|
-
<PopoverPrimitive.Description
|
|
230
|
-
ref={ref}
|
|
231
|
-
className={cn('text-caption text-muted-foreground', className)}
|
|
232
|
-
{...props}
|
|
233
|
-
/>
|
|
234
|
-
),
|
|
235
|
-
)
|
|
236
|
-
PopoverDescription.displayName = 'PopoverDescription'
|
|
237
|
-
|
|
238
|
-
/** What `onOpenChange` receives besides the open state: Base UI's Popover change details. */
|
|
239
|
-
type PopoverOpenChangeDetails = PopoverPrimitive.Root.ChangeEventDetails
|
|
240
|
-
|
|
241
|
-
interface PopoverProps {
|
|
242
|
-
/** Controlled open state. Pair with `onOpenChange`. */
|
|
243
|
-
open?: boolean
|
|
244
|
-
/** Initial open state, for an uncontrolled popover. Defaults to `false`. */
|
|
245
|
-
defaultOpen?: boolean
|
|
246
|
-
/** Called when the popover opens or closes, with Base UI's change details: `reason` (`'escape-key'`, `'outside-press'`, `'trigger-press'`, …), the `event`, and `cancel()` to keep it as it is. */
|
|
247
|
-
onOpenChange?: (open: boolean, details: PopoverOpenChangeDetails) => void
|
|
248
|
-
/** Trap focus and block page interaction while open. Defaults to `false`. */
|
|
249
|
-
modal?: boolean
|
|
250
|
-
/** The trigger and the panel — `Popover.Trigger` plus a `Popover.Content`. */
|
|
251
|
-
children?: ReactNode
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
/**
|
|
255
|
-
* A panel that oozes out of its trigger: the surface melts out of the button
|
|
256
|
-
* through a liquid neck, then lets go and settles beside it.
|
|
257
|
-
*
|
|
258
|
-
* The morph comes from the shared engine (see Morph), so the panel can grow
|
|
259
|
-
* from the trigger (the default), the press point, its own center, a viewport
|
|
260
|
-
* edge or any element, with the goo neck, a plain morph, a slide or a fade.
|
|
261
|
-
* It closes back into wherever it came from. The panel lifts 2 surface levels
|
|
262
|
-
* off its substrate and re-provides that level. Built on Base UI's Popover:
|
|
263
|
-
* it opens on press, or on hover too with `openOnHover`; it flips to the
|
|
264
|
-
* other side when there is no room; Escape and an outside press close it.
|
|
265
|
-
* `onOpenChange` hears why (`details.reason`) and can `details.cancel()` it.
|
|
266
|
-
*
|
|
267
|
-
* Statics:
|
|
268
|
-
* - `Popover.Trigger` — the control that opens it: `render={<Button/>}` or
|
|
269
|
-
* `asChild`; `openOnHover`, `delay`, `closeDelay`. Children fill a render
|
|
270
|
-
* element that has none of its own (`render={<span/>}` + children), and
|
|
271
|
-
* `nativeButton={false}` tells Base UI it isn't a `<button>`.
|
|
272
|
-
* - `Popover.Content` — the panel: `side`, `align` (the trigger's `start`,
|
|
273
|
-
* `center` or `end`), `sideOffset`, `alignOffset`, `anchor` (position it
|
|
274
|
-
* against another element than the trigger, which it then grows from),
|
|
275
|
-
* `collisionPadding`, `collisionBoundary`, `initialFocus`, `finalFocus`
|
|
276
|
-
* and the morph options `from`, `effect`, `hideSource`, `tier`.
|
|
277
|
-
* - `Popover.Title` / `Popover.Description` — its labelled heading and
|
|
278
|
-
* supporting line, wired for screen readers.
|
|
279
|
-
* - `Popover.Close` — closes it; same `render` / `asChild` shape.
|
|
280
|
-
*
|
|
281
|
-
* @example {@include ./examples.mdx}
|
|
282
|
-
*/
|
|
283
|
-
function Popover({ open, defaultOpen = false, onOpenChange, modal = false, children }: PopoverProps) {
|
|
284
|
-
// The change is reported here, not through the state hook, so the
|
|
285
|
-
// handler gets Base UI's details and can cancel it.
|
|
286
|
-
const [current, setCurrent] = useControllableState(open, defaultOpen)
|
|
287
|
-
const { origin, capture } = useMorphOrigin()
|
|
288
|
-
const ctx = useMemo(() => ({ open: current, origin }), [current, origin])
|
|
289
|
-
|
|
290
|
-
return (
|
|
291
|
-
<PopoverContext.Provider value={ctx}>
|
|
292
|
-
<PopoverPrimitive.Root
|
|
293
|
-
open={current}
|
|
294
|
-
modal={modal}
|
|
295
|
-
onOpenChange={(next, details) => {
|
|
296
|
-
onOpenChange?.(next, details)
|
|
297
|
-
if (details.isCanceled) return
|
|
298
|
-
if (next) capture(details)
|
|
299
|
-
setCurrent(next)
|
|
300
|
-
}}
|
|
301
|
-
>
|
|
302
|
-
{children}
|
|
303
|
-
</PopoverPrimitive.Root>
|
|
304
|
-
</PopoverContext.Provider>
|
|
305
|
-
)
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
Popover.Trigger = PopoverTrigger
|
|
309
|
-
Popover.Content = PopoverContent
|
|
310
|
-
Popover.Title = PopoverTitle
|
|
311
|
-
Popover.Description = PopoverDescription
|
|
312
|
-
Popover.Close = PopoverClose
|
|
313
|
-
|
|
314
|
-
export type { PopoverContentProps, PopoverOpenChangeDetails, PopoverProps, PopoverTriggerProps }
|
|
315
|
-
export { Popover, PopoverClose, PopoverContent, PopoverDescription, PopoverTitle, PopoverTrigger }
|
|
316
|
-
|
|
317
|
-
export default Popover
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import PreviewCard from './index'
|
|
2
|
-
|
|
3
|
-
# Link preview
|
|
4
|
-
|
|
5
|
-
Hover the link: after a short delay the card oozes out of it, and the pointer can travel into the card without closing it.
|
|
6
|
-
|
|
7
|
-
<p className="max-w-md text-body text-muted-foreground">
|
|
8
|
-
This port takes its looks from{' '}
|
|
9
|
-
<PreviewCard>
|
|
10
|
-
<PreviewCard.Trigger href="https://www.fluidfunctionalism.com">Fluid Functionalism</PreviewCard.Trigger>
|
|
11
|
-
<PreviewCard.Content className="w-72">
|
|
12
|
-
<div className="flex items-center gap-3">
|
|
13
|
-
<span className="flex size-10 shrink-0 items-center justify-center rounded-full bg-accent text-subtitle weight-semibold text-accent-foreground">FF</span>
|
|
14
|
-
<div className="flex min-w-0 flex-col gap-0.5">
|
|
15
|
-
<span className="text-subtitle weight-semibold text-foreground">Fluid Functionalism</span>
|
|
16
|
-
<span className="text-caption text-muted-foreground">fluidfunctionalism.com</span>
|
|
17
|
-
</div>
|
|
18
|
-
</div>
|
|
19
|
-
<p className="text-caption text-muted-foreground">A component registry layering springs, a fluid hover, a size ladder and elevated surfaces over Radix or Base UI.</p>
|
|
20
|
-
</PreviewCard.Content>
|
|
21
|
-
</PreviewCard>{' '}
|
|
22
|
-
and its behavior from Base UI.
|
|
23
|
-
</p>
|
|
24
|
-
|
|
25
|
-
# Profile
|
|
26
|
-
|
|
27
|
-
A mention that previews the person behind it. `delay` shortens the wait before it opens.
|
|
28
|
-
|
|
29
|
-
<p className="max-w-md text-body text-muted-foreground">
|
|
30
|
-
The first notes on the engine came from{' '}
|
|
31
|
-
<PreviewCard>
|
|
32
|
-
<PreviewCard.Trigger href="#" delay={200}>@ada</PreviewCard.Trigger>
|
|
33
|
-
<PreviewCard.Content side="top" className="w-64">
|
|
34
|
-
<div className="flex items-center gap-3">
|
|
35
|
-
<span className="flex size-10 shrink-0 items-center justify-center rounded-full bg-brand/15 text-subtitle weight-semibold text-brand">AL</span>
|
|
36
|
-
<div className="flex min-w-0 flex-col gap-0.5">
|
|
37
|
-
<span className="text-subtitle weight-semibold text-foreground">Ada Lovelace</span>
|
|
38
|
-
<span className="text-caption text-muted-foreground">@ada</span>
|
|
39
|
-
</div>
|
|
40
|
-
</div>
|
|
41
|
-
<p className="text-caption text-muted-foreground">Writes programs for engines that do not exist yet.</p>
|
|
42
|
-
</PreviewCard.Content>
|
|
43
|
-
</PreviewCard>{' '}
|
|
44
|
-
before the first commit.
|
|
45
|
-
</p>
|
|
46
|
-
|
|
47
|
-
# Morph
|
|
48
|
-
|
|
49
|
-
`effect="morph"` grows the card out of the link without the liquid neck.
|
|
50
|
-
|
|
51
|
-
<p className="max-w-md text-body text-muted-foreground">
|
|
52
|
-
Read the{' '}
|
|
53
|
-
<PreviewCard>
|
|
54
|
-
<PreviewCard.Trigger href="#">morph engine</PreviewCard.Trigger>
|
|
55
|
-
<PreviewCard.Content effect="morph" className="w-64">
|
|
56
|
-
<span className="text-subtitle weight-semibold text-foreground">Morph</span>
|
|
57
|
-
<p className="text-caption text-muted-foreground">One progress value on a spring tier carries the surface from its source to its own box.</p>
|
|
58
|
-
</PreviewCard.Content>
|
|
59
|
-
</PreviewCard>{' '}
|
|
60
|
-
docs for every source and effect.
|
|
61
|
-
</p>
|