@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,535 +0,0 @@
|
|
|
1
|
-
// biome-ignore-all lint: vendored upstream code keeps its own patterns (see the header)
|
|
2
|
-
/*
|
|
3
|
-
* Ported from Fluid Functionalism — github.com/mickadesign/fluid-functionalism
|
|
4
|
-
* `registry/default/table.tsx` @ b3587bdbd83fc66c2a6aae3817ffb856cb09260b
|
|
5
|
-
* MIT License © 2026 Micka Touillaud — fluidfunctionalism.com (notice: LICENSE.fluid-functionalism)
|
|
6
|
-
* Local modifications:
|
|
7
|
-
* - `"use client"` directive dropped (no RSC here).
|
|
8
|
-
* - `@/lib/*`, `@/hooks/*` and `@/components/ui/fluid-hover-highlight`
|
|
9
|
-
* imports rewritten to relative `../../lib/*` paths, except `SizeProvider`
|
|
10
|
-
* → `../../primitives/sizes`.
|
|
11
|
-
* - Compound API: the parts hang off the root as statics (`Table.Header`,
|
|
12
|
-
* `Table.Body`, `Table.Row`, `Table.Head`, `Table.Cell`) via
|
|
13
|
-
* `Object.assign`; the root is cast to `TableComponent` so TS consumers see
|
|
14
|
-
* the statics. The upstream named exports are kept.
|
|
15
|
-
* - `TableProps` members carry the FF docs API-table descriptions, so modo's
|
|
16
|
-
* parser lists them.
|
|
17
|
-
* - `TableProps` / `TableRowProps` type exports added.
|
|
18
|
-
* - TSDoc with the FF docs page's examples added above the root;
|
|
19
|
-
* `export default Table` added.
|
|
20
|
-
* - Styling reads DS tokens (AGENTS.md styling): inline
|
|
21
|
-
* `fontVariationSettings` → `weight-*`; `duration-80|120|160` and
|
|
22
|
-
* tier-length JS durations → `duration-<tier>` / `spring.*`.
|
|
23
|
-
* - Local additions (additive; existing props unchanged):
|
|
24
|
-
* - `Table.Footer` (`<tfoot>`, its rows stay out of the hover and keep their
|
|
25
|
-
* border), `Table.Caption` (`<caption>` below the table) and `Table.Empty`
|
|
26
|
-
* (one row across every column for an empty or loading state).
|
|
27
|
-
* - Footer rows keep their border when the first body row is lit (an
|
|
28
|
-
* unindexed row elsewhere still hides it, as upstream).
|
|
29
|
-
* - Sortable heads: `Table.Head` `sortDirection` / `defaultSortDirection` /
|
|
30
|
-
* `onSort` renders a button with `aria-sort` whose arrow crossfades
|
|
31
|
-
* between up-down, up and down (the icon swap recipe in the skill's
|
|
32
|
-
* motion.md); the arrows come from the icon context.
|
|
33
|
-
* - `stacked` on `Table`: below the `md` breakpoint the header hides and
|
|
34
|
-
* every row becomes a two-column grid of its cells, each led by its
|
|
35
|
-
* `Table.Cell` `label`; `stacked={false}` on a `Table.Header` or
|
|
36
|
-
* `Table.Row` keeps that part tabular.
|
|
37
|
-
* - `containerClassName` for the hover container around the `<table>`
|
|
38
|
-
* (e.g. `overflow-x-auto`).
|
|
39
|
-
* - Body rows without an `index` are numbered in document order
|
|
40
|
-
* (`lib/row-order`, as in Dropdown): the table numbers them across its
|
|
41
|
-
* bodies, `Table.Header` / `Table.Footer` rows stay out, and an explicit
|
|
42
|
-
* `index` still wins. So a wrapper rendering rows needs no counter.
|
|
43
|
-
* - Stacked cells align their content to the start (`items-start`), so a
|
|
44
|
-
* value keeps its own width instead of stretching across the card.
|
|
45
|
-
* - A row's weight follows its section (body rows regular, header and footer
|
|
46
|
-
* rows semibold), not whether it has an index yet: unindexed rows get theirs
|
|
47
|
-
* in the server HTML, so nothing changes weight on hydration.
|
|
48
|
-
* - Only header rows give up their border to a lit first row; any other row
|
|
49
|
-
* without an index keeps it.
|
|
50
|
-
* - Stacked values read in the primary text colour (labels stay muted); the
|
|
51
|
-
* tabular layout from `md` up is unchanged.
|
|
52
|
-
*/
|
|
53
|
-
|
|
54
|
-
import { motion } from 'motion/react'
|
|
55
|
-
import {
|
|
56
|
-
createContext,
|
|
57
|
-
type ForwardRefExoticComponent,
|
|
58
|
-
forwardRef,
|
|
59
|
-
type HTMLAttributes,
|
|
60
|
-
type ReactNode,
|
|
61
|
-
type RefAttributes,
|
|
62
|
-
type TdHTMLAttributes,
|
|
63
|
-
type ThHTMLAttributes,
|
|
64
|
-
useContext,
|
|
65
|
-
useMemo,
|
|
66
|
-
useRef,
|
|
67
|
-
} from 'react'
|
|
68
|
-
import { FluidHoverHighlight } from '../../lib/fluid-hover-highlight'
|
|
69
|
-
import { type IconName, useIcon } from '../../lib/icon-context'
|
|
70
|
-
import { useReduceMotion } from '../../lib/reduced-motion'
|
|
71
|
-
import { RowOrderContext, useRowOrder, useRowSlot } from '../../lib/row-order'
|
|
72
|
-
import { type SizeVariant, useSize } from '../../lib/size-context'
|
|
73
|
-
import { spring } from '../../lib/springs'
|
|
74
|
-
import { useControllableState } from '../../lib/use-controllable-state'
|
|
75
|
-
import { useFluidHover, useRegisterFluidHoverItem } from '../../lib/use-fluid-hover'
|
|
76
|
-
import { cn } from '../../lib/utils'
|
|
77
|
-
import { SizeProvider } from '../../primitives/sizes'
|
|
78
|
-
|
|
79
|
-
// ── Context ──────────────────────────────────────────────
|
|
80
|
-
|
|
81
|
-
interface TableContextValue {
|
|
82
|
-
registerItem: (index: number, element: HTMLElement | null) => void
|
|
83
|
-
activeIndex: number | null
|
|
84
|
-
stacked: boolean
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const TableContext = createContext<TableContextValue | null>(null)
|
|
88
|
-
|
|
89
|
-
// Local: which section a row sits in, so footer rows stay out of the hover's border logic.
|
|
90
|
-
type TableSection = 'header' | 'body' | 'footer'
|
|
91
|
-
|
|
92
|
-
const TableSectionContext = createContext<TableSection>('body')
|
|
93
|
-
|
|
94
|
-
// Local: whether the surrounding part stacks on small screens (`stacked={false}` opts a part out).
|
|
95
|
-
const StackedContext = createContext<boolean | null>(null)
|
|
96
|
-
|
|
97
|
-
function useStacked(own?: boolean) {
|
|
98
|
-
const table = useContext(TableContext)?.stacked ?? false
|
|
99
|
-
const part = useContext(StackedContext)
|
|
100
|
-
return table && (own ?? part ?? true)
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// ── Table ────────────────────────────────────────────────
|
|
104
|
-
|
|
105
|
-
interface TableProps extends HTMLAttributes<HTMLTableElement> {
|
|
106
|
-
/** `Table.Header` and `Table.Body` children. */
|
|
107
|
-
children: ReactNode
|
|
108
|
-
/** Pins the table's rows to one step of the size ladder (default 36px, compact 28px — see Sizes). Defaults to the surrounding SizeProvider, else `"default"`. */
|
|
109
|
-
size?: SizeVariant
|
|
110
|
-
/** Below the `md` breakpoint, hide the header and lay each row out as a two-column grid of its cells, each led by its `label`. `stacked={false}` on a `Table.Header` or `Table.Row` keeps that part tabular. Defaults to `false`. */
|
|
111
|
-
stacked?: boolean
|
|
112
|
-
/** Classes for the hover container around the `<table>`, e.g. `overflow-x-auto` for wide tables. */
|
|
113
|
-
containerClassName?: string
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/** The root plus its compound parts, typed so `<Table.Row>` type-checks. */
|
|
117
|
-
type TableComponent = ForwardRefExoticComponent<TableProps & RefAttributes<HTMLTableElement>> & {
|
|
118
|
-
Header: typeof TableHeader
|
|
119
|
-
Body: typeof TableBody
|
|
120
|
-
Row: typeof TableRow
|
|
121
|
-
Head: typeof TableHead
|
|
122
|
-
Cell: typeof TableCell
|
|
123
|
-
Footer: typeof TableFooter
|
|
124
|
-
Caption: typeof TableCaption
|
|
125
|
-
Empty: typeof TableEmpty
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Data table with row hover effects and semantic markup.
|
|
130
|
-
*
|
|
131
|
-
* A plain `<table>` whose body rows share one fluid hover highlight: the
|
|
132
|
-
* background glides from row to row under the pointer, the row borders next
|
|
133
|
-
* to the lit row fade out so it reads as one pill, and the lit row's cells
|
|
134
|
-
* brighten from muted to foreground. Header cells render semibold, body
|
|
135
|
-
* cells regular, with the weight change width-compensated. `size` pins every
|
|
136
|
-
* row to one step of the size ladder; otherwise the table follows the
|
|
137
|
-
* surrounding SizeProvider.
|
|
138
|
-
*
|
|
139
|
-
* A head with `sortDirection` (or `defaultSortDirection`, or `onSort`)
|
|
140
|
-
* becomes a sort button: a press cycles ascending, descending and unsorted,
|
|
141
|
-
* reporting the next direction through `onSort`, and its arrow crossfades
|
|
142
|
-
* into the new one. `stacked` turns rows into two-column cards on small
|
|
143
|
-
* screens, each cell led by its `label`.
|
|
144
|
-
*
|
|
145
|
-
* Statics:
|
|
146
|
-
* - `Table.Header` — `<thead>`; `stacked={false}` keeps it visible on small
|
|
147
|
-
* screens.
|
|
148
|
-
* - `Table.Body` — `<tbody>`.
|
|
149
|
-
* - `Table.Footer` — `<tfoot>`, for totals: its rows render semibold and stay
|
|
150
|
-
* out of the hover.
|
|
151
|
-
* - `Table.Row` — `<tr>`: body rows join the hover highlight, numbered in
|
|
152
|
-
* document order (an explicit `index`, from 0, still wins); header and
|
|
153
|
-
* footer rows stay out. `stacked={false}` keeps the row tabular.
|
|
154
|
-
* - `Table.Head` — `<th>`: `sortDirection` (`'asc'`, `'desc'` or `false`),
|
|
155
|
-
* `defaultSortDirection`, `onSort`.
|
|
156
|
-
* - `Table.Cell` — `<td>`: `label`, shown above the value while stacked.
|
|
157
|
-
* - `Table.Caption` — `<caption>`, a muted line below the table.
|
|
158
|
-
* - `Table.Empty` — one row across `colSpan` columns, for an empty or loading
|
|
159
|
-
* state.
|
|
160
|
-
*
|
|
161
|
-
* Each forwards its ref and native attributes.
|
|
162
|
-
*
|
|
163
|
-
* @example {@include ./examples.mdx}
|
|
164
|
-
*/
|
|
165
|
-
const Table = forwardRef<HTMLTableElement, TableProps>(
|
|
166
|
-
({ children, size, stacked = false, containerClassName, className, ...props }, ref) => {
|
|
167
|
-
const containerRef = useRef<HTMLDivElement>(null)
|
|
168
|
-
const sizeClasses = useSize(size)
|
|
169
|
-
|
|
170
|
-
const hover = useFluidHover(containerRef)
|
|
171
|
-
const { activeIndex, handlers, registerItem } = hover
|
|
172
|
-
// Local: body rows without an `index` take their place in document order.
|
|
173
|
-
const rowOrder = useRowOrder()
|
|
174
|
-
|
|
175
|
-
const contextValue = useMemo(() => ({ registerItem, activeIndex, stacked }), [registerItem, activeIndex, stacked])
|
|
176
|
-
|
|
177
|
-
const table = (
|
|
178
|
-
<TableContext.Provider value={contextValue}>
|
|
179
|
-
<div
|
|
180
|
-
ref={containerRef}
|
|
181
|
-
className={cn('relative', containerClassName)}
|
|
182
|
-
onMouseEnter={handlers.onMouseEnter}
|
|
183
|
-
onMouseMove={handlers.onMouseMove}
|
|
184
|
-
onMouseLeave={handlers.onMouseLeave}
|
|
185
|
-
onClick={handlers.onClick}
|
|
186
|
-
>
|
|
187
|
-
{/* Hover background */}
|
|
188
|
-
<FluidHoverHighlight hover={hover} />
|
|
189
|
-
|
|
190
|
-
<table ref={ref} className={cn('w-full border-collapse', sizeClasses.text, className)} {...props}>
|
|
191
|
-
<RowOrderContext.Provider value={rowOrder}>{children}</RowOrderContext.Provider>
|
|
192
|
-
</table>
|
|
193
|
-
</div>
|
|
194
|
-
</TableContext.Provider>
|
|
195
|
-
)
|
|
196
|
-
|
|
197
|
-
// A size prop pins every cell to one ladder step (cells read the context).
|
|
198
|
-
return size ? <SizeProvider size={size}>{table}</SizeProvider> : table
|
|
199
|
-
},
|
|
200
|
-
) as TableComponent
|
|
201
|
-
|
|
202
|
-
Table.displayName = 'Table'
|
|
203
|
-
|
|
204
|
-
// ── TableHeader ──────────────────────────────────────────
|
|
205
|
-
|
|
206
|
-
interface TableHeaderProps extends HTMLAttributes<HTMLTableSectionElement> {
|
|
207
|
-
/** `false` keeps the header showing on small screens in a `stacked` table. Defaults to the table's `stacked`. */
|
|
208
|
-
stacked?: boolean
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
const TableHeader = forwardRef<HTMLTableSectionElement, TableHeaderProps>(
|
|
212
|
-
({ stacked: own, className, ...props }, ref) => {
|
|
213
|
-
const stacked = useStacked(own)
|
|
214
|
-
return (
|
|
215
|
-
<TableSectionContext.Provider value="header">
|
|
216
|
-
<RowOrderContext.Provider value={null}>
|
|
217
|
-
<StackedContext.Provider value={own ?? null}>
|
|
218
|
-
<thead ref={ref} className={cn(stacked && 'hidden md:table-header-group', className)} {...props} />
|
|
219
|
-
</StackedContext.Provider>
|
|
220
|
-
</RowOrderContext.Provider>
|
|
221
|
-
</TableSectionContext.Provider>
|
|
222
|
-
)
|
|
223
|
-
},
|
|
224
|
-
)
|
|
225
|
-
|
|
226
|
-
TableHeader.displayName = 'TableHeader'
|
|
227
|
-
|
|
228
|
-
// ── TableBody ────────────────────────────────────────────
|
|
229
|
-
|
|
230
|
-
const TableBody = forwardRef<HTMLTableSectionElement, HTMLAttributes<HTMLTableSectionElement>>(
|
|
231
|
-
({ className, ...props }, ref) => <tbody ref={ref} className={cn('', className)} {...props} />,
|
|
232
|
-
)
|
|
233
|
-
|
|
234
|
-
TableBody.displayName = 'TableBody'
|
|
235
|
-
|
|
236
|
-
// ── TableFooter (local) ──────────────────────────────────
|
|
237
|
-
|
|
238
|
-
const TableFooter = forwardRef<HTMLTableSectionElement, HTMLAttributes<HTMLTableSectionElement>>(
|
|
239
|
-
({ className, ...props }, ref) => (
|
|
240
|
-
<TableSectionContext.Provider value="footer">
|
|
241
|
-
<RowOrderContext.Provider value={null}>
|
|
242
|
-
<tfoot ref={ref} className={cn('[&_td]:text-foreground', className)} {...props} />
|
|
243
|
-
</RowOrderContext.Provider>
|
|
244
|
-
</TableSectionContext.Provider>
|
|
245
|
-
),
|
|
246
|
-
)
|
|
247
|
-
|
|
248
|
-
TableFooter.displayName = 'TableFooter'
|
|
249
|
-
|
|
250
|
-
// ── TableCaption (local) ─────────────────────────────────
|
|
251
|
-
|
|
252
|
-
const TableCaption = forwardRef<HTMLTableCaptionElement, HTMLAttributes<HTMLTableCaptionElement>>(
|
|
253
|
-
({ className, ...props }, ref) => {
|
|
254
|
-
const sizeClasses = useSize()
|
|
255
|
-
return (
|
|
256
|
-
<caption
|
|
257
|
-
ref={ref}
|
|
258
|
-
className={cn(
|
|
259
|
-
'caption-bottom pt-3 text-left text-muted-foreground',
|
|
260
|
-
sizeClasses.variant === 'compact' ? 'text-caption-compact px-2.5' : 'text-caption px-3',
|
|
261
|
-
className,
|
|
262
|
-
)}
|
|
263
|
-
{...props}
|
|
264
|
-
/>
|
|
265
|
-
)
|
|
266
|
-
},
|
|
267
|
-
)
|
|
268
|
-
|
|
269
|
-
TableCaption.displayName = 'TableCaption'
|
|
270
|
-
|
|
271
|
-
// ── TableRow ─────────────────────────────────────────────
|
|
272
|
-
|
|
273
|
-
interface TableRowProps extends HTMLAttributes<HTMLTableRowElement> {
|
|
274
|
-
/** Position among the body rows, from 0. Body rows are numbered in document order without it; set it only to pin a row's place. Header and footer rows never join the hover. */
|
|
275
|
-
index?: number
|
|
276
|
-
/** `false` keeps this row tabular on small screens in a `stacked` table. Defaults to the table's `stacked`. */
|
|
277
|
-
stacked?: boolean
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
const TableRow = forwardRef<HTMLTableRowElement, TableRowProps>(
|
|
281
|
-
({ index: indexProp, stacked: own, className, style, ...props }, ref) => {
|
|
282
|
-
const internalRef = useRef<HTMLTableRowElement>(null)
|
|
283
|
-
const ctx = useContext(TableContext)
|
|
284
|
-
const section = useContext(TableSectionContext)
|
|
285
|
-
const stacked = useStacked(own)
|
|
286
|
-
// Local: an unindexed body row takes its document-order place; header and footer reset the order to none.
|
|
287
|
-
const { index } = useRowSlot(internalRef, indexProp)
|
|
288
|
-
|
|
289
|
-
useRegisterFluidHoverItem(ctx?.registerItem, index, internalRef)
|
|
290
|
-
|
|
291
|
-
const isBodyRow = index !== undefined
|
|
292
|
-
const activeIdx = ctx?.activeIndex ?? null
|
|
293
|
-
// The header's last border runs along row 0, so it melts into the lit pill; no other unindexed row does.
|
|
294
|
-
const hideBorder =
|
|
295
|
-
activeIdx !== null &&
|
|
296
|
-
((isBodyRow && (index === activeIdx || index === activeIdx - 1)) ||
|
|
297
|
-
(!isBodyRow && section === 'header' && activeIdx === 0))
|
|
298
|
-
|
|
299
|
-
const row = (
|
|
300
|
-
<tr
|
|
301
|
-
ref={node => {
|
|
302
|
-
;(internalRef as React.MutableRefObject<HTMLTableRowElement | null>).current = node
|
|
303
|
-
if (typeof ref === 'function') ref(node)
|
|
304
|
-
else if (ref) (ref as React.MutableRefObject<HTMLTableRowElement | null>).current = node
|
|
305
|
-
}}
|
|
306
|
-
data-fluid-hover-index={index}
|
|
307
|
-
className={cn(
|
|
308
|
-
'group/row relative z-10 border-b transition-[border-color] duration-fast',
|
|
309
|
-
hideBorder ? 'border-transparent' : 'border-accent/40',
|
|
310
|
-
isBodyRow && activeIdx === index && 'is-active',
|
|
311
|
-
// By section: an unindexed body row has no index until the first layout pass, after the server HTML.
|
|
312
|
-
section === 'body' || isBodyRow ? 'weight-normal' : 'weight-semibold',
|
|
313
|
-
stacked && 'grid grid-cols-2 md:table-row',
|
|
314
|
-
className,
|
|
315
|
-
)}
|
|
316
|
-
style={style}
|
|
317
|
-
{...props}
|
|
318
|
-
/>
|
|
319
|
-
)
|
|
320
|
-
|
|
321
|
-
// A row's own `stacked` reaches its cells.
|
|
322
|
-
return own === undefined ? row : <StackedContext.Provider value={own}>{row}</StackedContext.Provider>
|
|
323
|
-
},
|
|
324
|
-
)
|
|
325
|
-
|
|
326
|
-
TableRow.displayName = 'TableRow'
|
|
327
|
-
|
|
328
|
-
// ── TableHead ────────────────────────────────────────────
|
|
329
|
-
|
|
330
|
-
// Local: the sortable head's arrow, one glyph per direction crossfading in one icon cell.
|
|
331
|
-
type SortDirection = 'asc' | 'desc' | false
|
|
332
|
-
|
|
333
|
-
const SORT_ICONS: [SortDirection, IconName][] = [
|
|
334
|
-
[false, 'arrow-up-down'],
|
|
335
|
-
['asc', 'arrow-up'],
|
|
336
|
-
['desc', 'arrow-down'],
|
|
337
|
-
]
|
|
338
|
-
|
|
339
|
-
const NEXT_SORT: Record<'asc' | 'desc' | 'none', SortDirection> = { none: 'asc', asc: 'desc', desc: false }
|
|
340
|
-
|
|
341
|
-
const ARIA_SORT = { asc: 'ascending', desc: 'descending', none: 'none' } as const
|
|
342
|
-
|
|
343
|
-
const SHOWN = { opacity: 1, scale: 1, filter: 'blur(0px)' }
|
|
344
|
-
const HIDDEN = { opacity: 0, scale: 0.6, filter: 'blur(4px)' }
|
|
345
|
-
const enter = { type: 'tween' as const, duration: spring.fast.duration, ease: 'easeOut' as const }
|
|
346
|
-
const leave = { type: 'tween' as const, ...spring.fast.exit, ease: 'easeIn' as const }
|
|
347
|
-
|
|
348
|
-
function SortGlyph({
|
|
349
|
-
direction,
|
|
350
|
-
glyph,
|
|
351
|
-
current,
|
|
352
|
-
size,
|
|
353
|
-
}: {
|
|
354
|
-
direction: SortDirection
|
|
355
|
-
glyph: IconName
|
|
356
|
-
current: SortDirection
|
|
357
|
-
size: number
|
|
358
|
-
}) {
|
|
359
|
-
const Icon = useIcon(glyph)
|
|
360
|
-
const reduced = useReduceMotion()
|
|
361
|
-
const shown = direction === current
|
|
362
|
-
return (
|
|
363
|
-
<motion.span
|
|
364
|
-
className="col-start-1 row-start-1 flex"
|
|
365
|
-
initial={false}
|
|
366
|
-
animate={shown ? SHOWN : reduced ? { opacity: 0 } : HIDDEN}
|
|
367
|
-
transition={shown ? enter : leave}
|
|
368
|
-
>
|
|
369
|
-
<Icon
|
|
370
|
-
size={size}
|
|
371
|
-
strokeWidth={1.5}
|
|
372
|
-
className={cn('transition-[stroke-width] duration-fast group-hover/sort:stroke-2', current && 'stroke-2')}
|
|
373
|
-
/>
|
|
374
|
-
</motion.span>
|
|
375
|
-
)
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
interface TableHeadProps extends ThHTMLAttributes<HTMLTableCellElement> {
|
|
379
|
-
/** Controlled sort direction of this column: `'asc'`, `'desc'` or `false` (unsorted). Setting it makes the head a sort button. Pair with `onSort`. */
|
|
380
|
-
sortDirection?: SortDirection
|
|
381
|
-
/** Initial sort direction, for a head that keeps its own; setting it makes the head a sort button. */
|
|
382
|
-
defaultSortDirection?: SortDirection
|
|
383
|
-
/** Called with the next direction when the head is pressed: unsorted → `'asc'` → `'desc'` → `false`. Setting it makes the head a sort button. */
|
|
384
|
-
onSort?: (direction: SortDirection) => void
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
const TableHead = forwardRef<HTMLTableCellElement, TableHeadProps>(
|
|
388
|
-
({ sortDirection, defaultSortDirection, onSort, className, children, ...props }, ref) => {
|
|
389
|
-
const sizeClasses = useSize()
|
|
390
|
-
const [direction, setDirection] = useControllableState(sortDirection, defaultSortDirection ?? false, onSort)
|
|
391
|
-
const sortable = sortDirection !== undefined || defaultSortDirection !== undefined || onSort !== undefined
|
|
392
|
-
|
|
393
|
-
return (
|
|
394
|
-
<th
|
|
395
|
-
ref={ref}
|
|
396
|
-
aria-sort={sortable ? ARIA_SORT[direction || 'none'] : undefined}
|
|
397
|
-
className={cn(
|
|
398
|
-
'text-left text-foreground',
|
|
399
|
-
// py + line box lands the row on the ladder (36px / 28px).
|
|
400
|
-
sizeClasses.variant === 'compact' ? 'px-2.5 py-[5px]' : 'px-3 py-2',
|
|
401
|
-
className,
|
|
402
|
-
)}
|
|
403
|
-
{...props}
|
|
404
|
-
>
|
|
405
|
-
{sortable ? (
|
|
406
|
-
<button
|
|
407
|
-
type="button"
|
|
408
|
-
onClick={() => setDirection(NEXT_SORT[direction || 'none'])}
|
|
409
|
-
className={cn(
|
|
410
|
-
'group/sort -mx-1 inline-flex cursor-pointer items-center rounded-glyph px-1 text-inherit outline-none focus-visible:ring-1 focus-visible:ring-focus-ring',
|
|
411
|
-
sizeClasses.gap,
|
|
412
|
-
)}
|
|
413
|
-
>
|
|
414
|
-
{children}
|
|
415
|
-
<span
|
|
416
|
-
aria-hidden="true"
|
|
417
|
-
className={cn(
|
|
418
|
-
'grid shrink-0 transition-[color] duration-fast group-hover/sort:text-foreground',
|
|
419
|
-
direction ? 'text-foreground' : 'text-muted-foreground',
|
|
420
|
-
)}
|
|
421
|
-
>
|
|
422
|
-
{SORT_ICONS.map(([glyphDirection, glyph]) => (
|
|
423
|
-
<SortGlyph
|
|
424
|
-
key={glyph}
|
|
425
|
-
direction={glyphDirection}
|
|
426
|
-
glyph={glyph}
|
|
427
|
-
current={direction}
|
|
428
|
-
size={sizeClasses.icon}
|
|
429
|
-
/>
|
|
430
|
-
))}
|
|
431
|
-
</span>
|
|
432
|
-
</button>
|
|
433
|
-
) : (
|
|
434
|
-
children
|
|
435
|
-
)}
|
|
436
|
-
</th>
|
|
437
|
-
)
|
|
438
|
-
},
|
|
439
|
-
)
|
|
440
|
-
|
|
441
|
-
TableHead.displayName = 'TableHead'
|
|
442
|
-
|
|
443
|
-
// ── TableCell ────────────────────────────────────────────
|
|
444
|
-
|
|
445
|
-
interface TableCellProps extends TdHTMLAttributes<HTMLTableCellElement> {
|
|
446
|
-
/** The column's name, shown above the value while a `stacked` table lays its rows out as cards. */
|
|
447
|
-
label?: ReactNode
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
const TableCell = forwardRef<HTMLTableCellElement, TableCellProps>(({ label, className, children, ...props }, ref) => {
|
|
451
|
-
const sizeClasses = useSize()
|
|
452
|
-
const stacked = useStacked()
|
|
453
|
-
return (
|
|
454
|
-
<td
|
|
455
|
-
ref={ref}
|
|
456
|
-
className={cn(
|
|
457
|
-
'text-muted-foreground transition-colors duration-fast group-[.is-active]/row:text-foreground',
|
|
458
|
-
sizeClasses.variant === 'compact' ? 'px-2.5 py-[5px]' : 'px-3 py-2',
|
|
459
|
-
// Stacked, the label is the muted line and the value leads; from md the row is tabular again.
|
|
460
|
-
stacked && 'flex flex-col items-start text-foreground md:table-cell md:text-muted-foreground',
|
|
461
|
-
className,
|
|
462
|
-
)}
|
|
463
|
-
{...props}
|
|
464
|
-
>
|
|
465
|
-
{stacked && label != null && (
|
|
466
|
-
<span
|
|
467
|
-
className={cn(
|
|
468
|
-
'text-muted-foreground weight-normal md:hidden',
|
|
469
|
-
sizeClasses.variant === 'compact' ? 'text-caption-compact' : 'text-caption',
|
|
470
|
-
)}
|
|
471
|
-
>
|
|
472
|
-
{label}
|
|
473
|
-
</span>
|
|
474
|
-
)}
|
|
475
|
-
{children}
|
|
476
|
-
</td>
|
|
477
|
-
)
|
|
478
|
-
})
|
|
479
|
-
|
|
480
|
-
TableCell.displayName = 'TableCell'
|
|
481
|
-
|
|
482
|
-
// ── TableEmpty (local) ───────────────────────────────────
|
|
483
|
-
|
|
484
|
-
interface TableEmptyProps extends HTMLAttributes<HTMLTableRowElement> {
|
|
485
|
-
/** Number of columns the row spans: the table's column count. */
|
|
486
|
-
colSpan: number
|
|
487
|
-
/** What to say, or a loading indicator. */
|
|
488
|
-
children?: ReactNode
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
const TableEmpty = forwardRef<HTMLTableRowElement, TableEmptyProps>(
|
|
492
|
-
({ colSpan, className, children, ...props }, ref) => {
|
|
493
|
-
const sizeClasses = useSize()
|
|
494
|
-
return (
|
|
495
|
-
<tr ref={ref} className={cn('relative z-10', className)} {...props}>
|
|
496
|
-
<td
|
|
497
|
-
colSpan={colSpan}
|
|
498
|
-
className={cn('h-24 px-3 text-center align-middle text-muted-foreground', sizeClasses.text)}
|
|
499
|
-
>
|
|
500
|
-
{children}
|
|
501
|
-
</td>
|
|
502
|
-
</tr>
|
|
503
|
-
)
|
|
504
|
-
},
|
|
505
|
-
)
|
|
506
|
-
|
|
507
|
-
TableEmpty.displayName = 'TableEmpty'
|
|
508
|
-
|
|
509
|
-
// ── Compound parts ───────────────────────────────────────
|
|
510
|
-
|
|
511
|
-
Object.assign(Table, {
|
|
512
|
-
Header: TableHeader,
|
|
513
|
-
Body: TableBody,
|
|
514
|
-
Row: TableRow,
|
|
515
|
-
Head: TableHead,
|
|
516
|
-
Cell: TableCell,
|
|
517
|
-
Footer: TableFooter,
|
|
518
|
-
Caption: TableCaption,
|
|
519
|
-
Empty: TableEmpty,
|
|
520
|
-
})
|
|
521
|
-
|
|
522
|
-
// ── Exports ──────────────────────────────────────────────
|
|
523
|
-
|
|
524
|
-
export type {
|
|
525
|
-
SortDirection,
|
|
526
|
-
TableCellProps,
|
|
527
|
-
TableEmptyProps,
|
|
528
|
-
TableHeaderProps,
|
|
529
|
-
TableHeadProps,
|
|
530
|
-
TableProps,
|
|
531
|
-
TableRowProps,
|
|
532
|
-
}
|
|
533
|
-
export { Table, TableBody, TableCaption, TableCell, TableEmpty, TableFooter, TableHead, TableHeader, TableRow }
|
|
534
|
-
|
|
535
|
-
export default Table
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Local addition (not part of Fluid Functionalism): a docs stage for the
|
|
3
|
-
* sortable heads. Examples run no hooks, so the sorting lives here; a real
|
|
4
|
-
* table sorts its data the same way (or hands the direction to TanStack).
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { useState } from 'react'
|
|
8
|
-
import Table, { type SortDirection } from './index'
|
|
9
|
-
|
|
10
|
-
const PEOPLE = [
|
|
11
|
-
{ name: 'Alice', role: 'Engineer', joined: 2019 },
|
|
12
|
-
{ name: 'Bob', role: 'Designer', joined: 2022 },
|
|
13
|
-
{ name: 'Carol', role: 'Manager', joined: 2017 },
|
|
14
|
-
{ name: 'Dan', role: 'Researcher', joined: 2021 },
|
|
15
|
-
]
|
|
16
|
-
|
|
17
|
-
type Column = 'name' | 'role' | 'joined'
|
|
18
|
-
|
|
19
|
-
const COLUMNS: { key: Column; label: string }[] = [
|
|
20
|
-
{ key: 'name', label: 'Name' },
|
|
21
|
-
{ key: 'role', label: 'Role' },
|
|
22
|
-
{ key: 'joined', label: 'Joined' },
|
|
23
|
-
]
|
|
24
|
-
|
|
25
|
-
/** A table whose heads sort its rows: one column at a time, unsorted → ascending → descending → unsorted. */
|
|
26
|
-
export default function SortDemo() {
|
|
27
|
-
const [sort, setSort] = useState<{ column: Column; direction: SortDirection }>({ column: 'name', direction: 'asc' })
|
|
28
|
-
|
|
29
|
-
const rows = [...PEOPLE]
|
|
30
|
-
if (sort.direction) {
|
|
31
|
-
const sign = sort.direction === 'asc' ? 1 : -1
|
|
32
|
-
rows.sort((a, b) => (a[sort.column] > b[sort.column] ? sign : -sign))
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return (
|
|
36
|
-
<Table>
|
|
37
|
-
<Table.Header>
|
|
38
|
-
<Table.Row>
|
|
39
|
-
{COLUMNS.map(({ key, label }) => (
|
|
40
|
-
<Table.Head
|
|
41
|
-
key={key}
|
|
42
|
-
sortDirection={sort.column === key ? sort.direction : false}
|
|
43
|
-
onSort={direction => setSort({ column: key, direction })}
|
|
44
|
-
>
|
|
45
|
-
{label}
|
|
46
|
-
</Table.Head>
|
|
47
|
-
))}
|
|
48
|
-
</Table.Row>
|
|
49
|
-
</Table.Header>
|
|
50
|
-
<Table.Body>
|
|
51
|
-
{rows.map((person, i) => (
|
|
52
|
-
<Table.Row key={person.name} index={i}>
|
|
53
|
-
<Table.Cell>{person.name}</Table.Cell>
|
|
54
|
-
<Table.Cell>{person.role}</Table.Cell>
|
|
55
|
-
<Table.Cell>{person.joined}</Table.Cell>
|
|
56
|
-
</Table.Row>
|
|
57
|
-
))}
|
|
58
|
-
</Table.Body>
|
|
59
|
-
</Table>
|
|
60
|
-
)
|
|
61
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { Avatar as AvatarPrimitive } from "@base-ui/react/avatar";
|
|
2
|
-
import { ComponentPropsWithoutRef, ForwardRefExoticComponent, ReactNode, RefAttributes } from "react";
|
|
3
|
-
type SizeVariant = "default" | "compact";
|
|
4
|
-
import { AvatarImageProps as AvatarImageProps_lpttqq } from "@base-ui/react";
|
|
5
|
-
import { AvatarFallbackProps as AvatarFallbackProps_weg9cb } from "@base-ui/react";
|
|
6
|
-
type AvatarImageProps = ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>;
|
|
7
|
-
/** The picture. It fades in once loaded; until then, or if it fails, the fallback shows. */
|
|
8
|
-
declare const AvatarImage: ForwardRefExoticComponent<Omit<Omit<AvatarImageProps_lpttqq, "ref"> & RefAttributes<HTMLImageElement>, "ref"> & RefAttributes<HTMLImageElement>>;
|
|
9
|
-
type AvatarFallbackProps = ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>;
|
|
10
|
-
/** Initials or an icon, shown while the image loads or when there is none. Empty, it shows a person glyph. */
|
|
11
|
-
declare const AvatarFallback: ForwardRefExoticComponent<Omit<Omit<AvatarFallbackProps_weg9cb, "ref"> & RefAttributes<HTMLSpanElement>, "ref"> & RefAttributes<HTMLSpanElement>>;
|
|
12
|
-
interface AvatarProps extends ComponentPropsWithoutRef<"span"> {
|
|
13
|
-
/** Pins the avatar to one step of the size ladder (36px default, 28px compact). Defaults to the surrounding SizeProvider. */
|
|
14
|
-
size?: SizeVariant;
|
|
15
|
-
/** A circle for people; a square for teams, organizations and things, which takes the shape's item radius (rounded or pill). Defaults to `"circle"`. */
|
|
16
|
-
shape?: "circle" | "square";
|
|
17
|
-
/** Classes for the root: a size off the ladder (`size-5` in a dense row), a ground. */
|
|
18
|
-
className?: string;
|
|
19
|
-
/** `Avatar.Image` and `Avatar.Fallback`. */
|
|
20
|
-
children?: ReactNode;
|
|
21
|
-
}
|
|
22
|
-
type AvatarComponent = ForwardRefExoticComponent<AvatarProps & RefAttributes<HTMLSpanElement>> & {
|
|
23
|
-
Image: typeof AvatarImage;
|
|
24
|
-
Fallback: typeof AvatarFallback;
|
|
25
|
-
};
|
|
26
|
-
/**
|
|
27
|
-
* A picture of a person or a team, with initials or an icon when there is
|
|
28
|
-
* none.
|
|
29
|
-
*
|
|
30
|
-
* The avatar is one control tall (36px, 28px compact), so it lines up with
|
|
31
|
-
* the rows and buttons beside it, and follows the surrounding SizeProvider.
|
|
32
|
-
* Base UI's Avatar tracks the image: until it has loaded, or when it fails,
|
|
33
|
-
* the fallback shows on a neutral ground (the gray badge's accent); once it
|
|
34
|
-
* lands it fades in over the fallback. A 1px inset edge keeps a pale picture from dissolving into the
|
|
35
|
-
* surface. People are circles; `shape="square"` takes the shape context's
|
|
36
|
-
* item radius for teams and things.
|
|
37
|
-
*
|
|
38
|
-
* Statics:
|
|
39
|
-
* - `Avatar.Image` — the picture: `src`, `alt`, `onLoadingStatusChange`.
|
|
40
|
-
* - `Avatar.Fallback` — initials or an icon; empty, a person glyph. `delay`
|
|
41
|
-
* (ms) holds it back so a fast image never flashes it.
|
|
42
|
-
*
|
|
43
|
-
* @example {@include ./examples.mdx}
|
|
44
|
-
*/
|
|
45
|
-
declare const Avatar: AvatarComponent;
|
|
46
|
-
export { Avatar, AvatarFallback, AvatarFallbackProps, AvatarImage, AvatarImageProps, AvatarProps, Avatar as default };
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AvatarImage2,
|
|
3
|
-
AvatarFallback2,
|
|
4
|
-
Avatar2,
|
|
5
|
-
avatar_default
|
|
6
|
-
} from "../../shared/components-rtadhd9j.js";
|
|
7
|
-
import"../../shared/components-jqpefjsn.js";
|
|
8
|
-
import"../../shared/components-dcc02hs2.js";
|
|
9
|
-
import"../../shared/components-h83az0bz.js";
|
|
10
|
-
import"../../shared/components-34txk9rj.js";
|
|
11
|
-
import"../../shared/components-71nbt03m.js";
|
|
12
|
-
import"../../shared/components-gx4h5rbb.js";
|
|
13
|
-
import"../../shared/components-jcnjay5g.js";
|
|
14
|
-
export {
|
|
15
|
-
Avatar2 as Avatar,
|
|
16
|
-
AvatarFallback2 as AvatarFallback,
|
|
17
|
-
AvatarImage2 as AvatarImage,
|
|
18
|
-
avatar_default as default
|
|
19
|
-
};
|