@justanarthur/modo-ui 0.6.0-canary.9 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -164
- package/dist/base.css +4 -141
- package/dist/blocks/sidebar-app/index.js +26 -40
- package/dist/components/AI/input-message/index.js +16 -23
- package/dist/components/AI/thinking-indicator/index.js +6 -9
- package/dist/components/accordion/index.d.ts +11 -39
- package/dist/components/accordion/index.js +13 -18
- package/dist/components/badge/index.d.ts +11 -18
- package/dist/components/badge/index.js +7 -12
- package/dist/components/button/index.d.ts +17 -53
- package/dist/components/button/index.js +6 -11
- package/dist/components/card/index.d.ts +9 -32
- package/dist/components/card/index.js +11 -17
- package/dist/components/copy/index.d.ts +8 -41
- package/dist/components/copy/index.js +9 -15
- package/dist/components/inputs/checkbox/index.d.ts +9 -28
- package/dist/components/inputs/checkbox/index.js +13 -18
- package/dist/components/inputs/color-picker/index.d.ts +14 -22
- package/dist/components/inputs/color-picker/index.js +18 -26
- package/dist/components/inputs/combobox/index.d.ts +20 -85
- package/dist/components/inputs/combobox/index.js +18 -27
- package/dist/components/inputs/date-time/calendar/index.d.ts +18 -24
- package/dist/components/inputs/date-time/calendar/index.js +11 -15
- package/dist/components/inputs/date-time/date-picker/index.d.ts +16 -105
- package/dist/components/inputs/date-time/date-picker/index.js +25 -35
- package/dist/components/inputs/date-time/date-range-picker/index.d.ts +12 -106
- package/dist/components/inputs/date-time/date-range-picker/index.js +24 -35
- package/dist/components/inputs/date-time/duration-picker/index.d.ts +13 -66
- package/dist/components/inputs/date-time/duration-picker/index.js +24 -33
- package/dist/components/inputs/date-time/month-picker/index.d.ts +10 -60
- package/dist/components/inputs/date-time/month-picker/index.js +23 -32
- package/dist/components/inputs/date-time/time-picker/index.d.ts +10 -58
- package/dist/components/inputs/date-time/time-picker/index.js +24 -33
- package/dist/components/inputs/input/index.d.ts +13 -95
- package/dist/components/inputs/input/index.js +9 -18
- package/dist/components/inputs/radio/index.d.ts +5 -20
- package/dist/components/inputs/radio/index.js +12 -16
- package/dist/components/inputs/search/index.d.ts +3 -3
- package/dist/components/inputs/search/index.js +18 -26
- package/dist/components/inputs/select/index.d.ts +23 -99
- package/dist/components/inputs/select/index.js +14 -29
- package/dist/components/inputs/slider/index.d.ts +0 -9
- package/dist/components/inputs/slider/index.js +5 -8
- package/dist/components/inputs/switch/index.d.ts +2 -8
- package/dist/components/inputs/switch/index.js +12 -15
- package/dist/components/inputs/textarea/index.d.ts +1 -20
- package/dist/components/inputs/textarea/index.js +6 -9
- package/dist/components/navigation/sidebar/index.d.ts +21 -44
- package/dist/components/navigation/sidebar/index.js +31 -42
- package/dist/components/navigation/tabs/index.d.ts +2 -8
- package/dist/components/navigation/tabs/index.js +10 -15
- package/dist/components/navigation/tabs-subtle/index.js +10 -13
- package/dist/components/overlays/alert-dialog/index.d.ts +16 -135
- package/dist/components/overlays/alert-dialog/index.js +13 -23
- package/dist/components/overlays/command/index.d.ts +20 -25
- package/dist/components/overlays/command/index.js +17 -25
- package/dist/components/overlays/context-menu/index.d.ts +17 -39
- package/dist/components/overlays/context-menu/index.js +18 -29
- package/dist/components/overlays/dialog/index.d.ts +16 -42
- package/dist/components/overlays/dialog/index.js +12 -20
- package/dist/components/overlays/dropdown/index.d.ts +34 -304
- package/dist/components/overlays/dropdown/index.js +17 -44
- package/dist/components/overlays/popover/index.d.ts +12 -38
- package/dist/components/overlays/popover/index.js +9 -13
- package/dist/components/overlays/preview-card/index.js +8 -12
- package/dist/components/overlays/sheet/index.d.ts +8 -25
- package/dist/components/overlays/sheet/index.js +13 -19
- package/dist/components/overlays/toast/index.d.ts +50 -209
- package/dist/components/overlays/toast/index.js +10 -23
- package/dist/components/overlays/tooltip/index.d.ts +21 -123
- package/dist/components/overlays/tooltip/index.js +6 -16
- package/dist/components/table/index.d.ts +8 -63
- package/dist/components/table/index.js +9 -20
- package/dist/index.d.ts +1048 -2999
- package/dist/index.js +82 -231
- package/dist/preset.d.ts +0 -22
- package/dist/preset.js +2 -24
- package/dist/primitives/code/index.js +5 -8
- package/dist/primitives/craft/index.js +6 -10
- package/dist/primitives/fluid-hover/index.js +8 -10
- package/dist/primitives/morph/index.js +10 -16
- package/dist/primitives/motion/index.js +8 -11
- package/dist/primitives/scroll-area/index.js +3 -5
- package/dist/primitives/sizes/index.js +4 -6
- package/dist/primitives/surface/index.js +4 -6
- package/dist/shared/{components-c7rwx0ap.js → components-0q0sqfh4.js} +49 -27
- package/dist/shared/components-0sn7ypjw.js +61 -0
- package/dist/shared/{components-vc864c51.js → components-11da9ajg.js} +5 -8
- package/dist/shared/components-1434p1mh.js +123 -0
- package/dist/shared/{components-c74gf16d.js → components-1z6tdadk.js} +24 -40
- package/dist/shared/{components-bae8sbjx.js → components-27nnvrwe.js} +14 -15
- package/dist/shared/{components-qh1cvj6p.js → components-2dxkv6zm.js} +7 -8
- package/dist/shared/{components-y0kfy2g4.js → components-2ecg8svx.js} +152 -234
- package/dist/shared/{components-c5w5zk0s.js → components-2ph6t61s.js} +34 -37
- package/dist/shared/{components-4j3t39dd.js → components-39jq9va1.js} +24 -29
- package/dist/shared/components-3ky44908.js +9 -0
- package/dist/shared/{components-syynwm1r.js → components-3mkepka5.js} +25 -28
- package/dist/shared/{components-wgtjt2af.js → components-4700p9kz.js} +22 -24
- package/dist/shared/{components-yhgq0qxx.js → components-59efxjd9.js} +12 -13
- package/dist/shared/{components-91zw3d9f.js → components-5vgpnxgy.js} +27 -51
- package/dist/shared/{components-kz5q11pp.js → components-5xc2j8jz.js} +18 -19
- package/dist/shared/{components-zkk3fmw8.js → components-6p8tfcd6.js} +29 -57
- package/dist/shared/{components-4nck8acq.js → components-7r3etddy.js} +54 -19
- package/dist/shared/{components-svkt577j.js → components-8snj490h.js} +32 -78
- package/dist/shared/{components-ctqmge8t.js → components-b0eac83j.js} +30 -9
- package/dist/shared/{components-9sttq78t.js → components-b2wyq2cq.js} +59 -41
- package/dist/shared/{components-pv1dyrtn.js → components-b3c5et5b.js} +38 -49
- package/dist/shared/{components-rrbpmfx4.js → components-c6s6b43g.js} +2 -3
- package/dist/shared/{components-pwayrkw9.js → components-chacnk61.js} +19 -19
- package/dist/shared/{components-71nbt03m.js → components-cv16mryv.js} +7 -26
- package/dist/shared/{components-hgv6tygd.js → components-d6xtjht3.js} +30 -35
- package/dist/shared/{components-z8fedth5.js → components-dk0gjr5a.js} +18 -19
- package/dist/shared/{components-cet3jpa0.js → components-fzrq6tr3.js} +34 -37
- package/dist/shared/{components-cnead5qm.js → components-gc5vtq2f.js} +30 -66
- package/dist/shared/components-gf5s6ap9.js +42 -0
- package/dist/shared/{components-0h78g3b5.js → components-gz8zf3ec.js} +55 -56
- package/dist/shared/{components-mattt5jp.js → components-h2ajmhwn.js} +35 -107
- package/dist/shared/{components-m06yq8wk.js → components-hqeq3w9q.js} +23 -38
- package/dist/shared/{components-7qx17na9.js → components-hw9yk32z.js} +24 -36
- package/dist/shared/components-hyq23phv.js +310 -0
- package/dist/shared/{components-9jmjnkqd.js → components-jbbmdr74.js} +22 -41
- package/dist/shared/{components-dcc02hs2.js → components-jjw69c4c.js} +4 -7
- package/dist/shared/{components-303jf96s.js → components-jthe1pwb.js} +420 -139
- package/dist/shared/{components-dtca4s6b.js → components-jwst3vtj.js} +76 -224
- package/dist/shared/{components-dc5q749x.js → components-kvr7f9hy.js} +10 -19
- package/dist/shared/{components-s8yqk2dc.js → components-kwa6mrf9.js} +11 -46
- package/dist/shared/{components-de99ykt7.js → components-men63rwj.js} +2 -3
- package/dist/shared/{components-qx27excf.js → components-mjthm1kf.js} +9 -13
- package/dist/shared/{components-1e64t8aj.js → components-n42c79bz.js} +22 -23
- package/dist/shared/{components-tz1fv35x.js → components-n7mjr357.js} +2 -3
- package/dist/shared/components-ng72k97e.js +128 -0
- package/dist/shared/{components-w2jqa6hx.js → components-pbmqctfa.js} +65 -169
- package/dist/shared/{components-px2zm7dc.js → components-q5xj5c16.js} +8 -9
- package/dist/shared/components-raknhppb.js +64 -0
- package/dist/shared/{components-2a7hcand.js → components-rr7a6ja9.js} +27 -59
- package/dist/shared/{components-005jt2nz.js → components-s083f38z.js} +34 -164
- package/dist/shared/components-s5ngg32c.js +267 -0
- package/dist/shared/components-sn1rxx1d.js +143 -0
- package/dist/shared/{components-r8eqs7gz.js → components-ta7shw28.js} +4 -4
- package/dist/shared/{components-9as3rf68.js → components-vc7vq5nz.js} +3 -6
- package/dist/shared/{components-ft3zdc79.js → components-vfbhxf5r.js} +5 -6
- package/dist/shared/components-vynjtrk6.js +19 -0
- package/dist/shared/{components-p0fm0bab.js → components-w1r67ag9.js} +149 -294
- package/dist/shared/{components-xd3emmy4.js → components-w90endve.js} +72 -71
- package/dist/shared/{components-t5pk5nmc.js → components-wvp1m52g.js} +102 -149
- package/dist/shared/components-wy9jpqny.js +146 -0
- package/dist/shared/{components-yxmxn2jp.js → components-y9y0g8er.js} +28 -52
- package/dist/shared/components-ypp01w3p.js +986 -0
- package/dist/shared/{components-czdvj1a8.js → components-zfnmn5d4.js} +36 -82
- package/dist/shared/{components-jqpefjsn.js → components-zrkzcayz.js} +6 -54
- package/dist/shared/{components-vf45j12c.js → components-zx6b6yby.js} +18 -4
- package/dist/styles.css +32 -320
- package/dist/tailwind.css +0 -16
- package/dist/tokens.css +0 -67
- package/package.json +4 -227
- package/DESIGN.md +0 -623
- package/blocks/sidebar-app/examples.mdx +0 -33
- package/blocks/sidebar-app/index.tsx +0 -218
- package/blocks/sidebar-app/inset-topbar.tsx +0 -25
- package/blocks/sidebar-app/menu-grid.ts +0 -26
- package/blocks/sidebar-app/nav-data.ts +0 -36
- package/blocks/sidebar-app/search-field.tsx +0 -48
- package/blocks/sidebar-app/user-footer.tsx +0 -67
- package/blocks/sidebar-app/workspace-header.tsx +0 -129
- package/components/AI/input-message/examples.mdx +0 -130
- package/components/AI/input-message/file-thumbnail.tsx +0 -173
- package/components/AI/input-message/index.tsx +0 -1385
- package/components/AI/thinking-indicator/examples.mdx +0 -27
- package/components/AI/thinking-indicator/index.tsx +0 -210
- package/components/accordion/examples.mdx +0 -233
- package/components/accordion/index.tsx +0 -1071
- package/components/avatar/examples.mdx +0 -95
- package/components/avatar/index.tsx +0 -129
- package/components/badge/change-demo.tsx +0 -29
- package/components/badge/examples.mdx +0 -124
- package/components/badge/index.tsx +0 -225
- package/components/badge/variants.ts +0 -73
- package/components/button/examples.mdx +0 -168
- package/components/button/index.tsx +0 -424
- package/components/button/loading-demo.tsx +0 -25
- package/components/button/variants.ts +0 -168
- package/components/card/examples.mdx +0 -251
- package/components/card/index.tsx +0 -1070
- package/components/copy/examples.mdx +0 -125
- package/components/copy/index.tsx +0 -662
- package/components/inputs/checkbox/examples.mdx +0 -87
- package/components/inputs/checkbox/index.tsx +0 -611
- package/components/inputs/checkbox/select-all-demo.tsx +0 -48
- package/components/inputs/color-picker/examples.mdx +0 -111
- package/components/inputs/color-picker/index.tsx +0 -1981
- package/components/inputs/color-picker/variants.ts +0 -401
- package/components/inputs/combobox/examples.mdx +0 -366
- package/components/inputs/combobox/index.tsx +0 -1527
- package/components/inputs/combobox/remote-demo.tsx +0 -105
- package/components/inputs/date-time/calendar/examples.mdx +0 -45
- package/components/inputs/date-time/calendar/index.tsx +0 -370
- package/components/inputs/date-time/calendar/use-month-window.ts +0 -173
- package/components/inputs/date-time/date-picker/examples.mdx +0 -243
- package/components/inputs/date-time/date-picker/index.tsx +0 -476
- package/components/inputs/date-time/date-picker/masked-date-input.tsx +0 -348
- package/components/inputs/date-time/date-range-picker/examples.mdx +0 -93
- package/components/inputs/date-time/date-range-picker/index.tsx +0 -525
- package/components/inputs/date-time/duration-picker/examples.mdx +0 -40
- package/components/inputs/date-time/duration-picker/index.tsx +0 -253
- package/components/inputs/date-time/month-picker/examples.mdx +0 -45
- package/components/inputs/date-time/month-picker/index.tsx +0 -254
- package/components/inputs/date-time/picker-shell.tsx +0 -581
- package/components/inputs/date-time/time-columns.tsx +0 -94
- package/components/inputs/date-time/time-picker/examples.mdx +0 -57
- package/components/inputs/date-time/time-picker/index.tsx +0 -227
- package/components/inputs/field/examples.mdx +0 -117
- package/components/inputs/field/index.tsx +0 -268
- package/components/inputs/file-dropzone/examples.mdx +0 -83
- package/components/inputs/file-dropzone/file-row.tsx +0 -201
- package/components/inputs/file-dropzone/index.tsx +0 -316
- package/components/inputs/file-dropzone/upload-demo.tsx +0 -67
- package/components/inputs/file-dropzone/variants.ts +0 -94
- package/components/inputs/input/examples.mdx +0 -166
- package/components/inputs/input/index.tsx +0 -494
- package/components/inputs/input/password-demo.tsx +0 -30
- package/components/inputs/label/examples.mdx +0 -67
- package/components/inputs/label/index.tsx +0 -85
- package/components/inputs/number-input/examples.mdx +0 -69
- package/components/inputs/number-input/index.tsx +0 -221
- package/components/inputs/radio/examples.mdx +0 -77
- package/components/inputs/radio/index.tsx +0 -636
- package/components/inputs/search/examples.mdx +0 -74
- package/components/inputs/search/index.tsx +0 -333
- package/components/inputs/select/examples.mdx +0 -296
- package/components/inputs/select/index.tsx +0 -1044
- package/components/inputs/select/variants.ts +0 -32
- package/components/inputs/slider/examples.mdx +0 -153
- package/components/inputs/slider/index.tsx +0 -1867
- package/components/inputs/switch/examples.mdx +0 -96
- package/components/inputs/switch/index.tsx +0 -504
- package/components/inputs/textarea/examples.mdx +0 -126
- package/components/inputs/textarea/index.tsx +0 -207
- package/components/navigation/navigation-menu/examples.mdx +0 -136
- package/components/navigation/navigation-menu/index.tsx +0 -704
- package/components/navigation/pagination/examples.mdx +0 -74
- package/components/navigation/pagination/index.tsx +0 -401
- package/components/navigation/sidebar/examples.mdx +0 -325
- package/components/navigation/sidebar/index.tsx +0 -453
- package/components/navigation/sidebar/sidebar-core.tsx +0 -1408
- package/components/navigation/sidebar/sidebar-menu.tsx +0 -1495
- package/components/navigation/sidebar/sidebar.css +0 -74
- package/components/navigation/sidebar/variants.ts +0 -55
- package/components/navigation/tabs/examples.mdx +0 -89
- package/components/navigation/tabs/index.tsx +0 -494
- package/components/navigation/tabs-subtle/examples.mdx +0 -49
- package/components/navigation/tabs-subtle/index.tsx +0 -512
- package/components/overlays/alert-dialog/examples.mdx +0 -123
- package/components/overlays/alert-dialog/index.tsx +0 -276
- package/components/overlays/alert-dialog/pending-demo.tsx +0 -36
- package/components/overlays/command/examples.mdx +0 -113
- package/components/overlays/command/index.tsx +0 -425
- package/components/overlays/context-menu/examples.mdx +0 -56
- package/components/overlays/context-menu/index.tsx +0 -279
- package/components/overlays/dialog/examples.mdx +0 -165
- package/components/overlays/dialog/index.tsx +0 -451
- package/components/overlays/dropdown/dropdown-search.tsx +0 -395
- package/components/overlays/dropdown/examples.mdx +0 -444
- package/components/overlays/dropdown/index.tsx +0 -1241
- package/components/overlays/dropdown/menu-item.tsx +0 -510
- package/components/overlays/dropdown/menu-parts.tsx +0 -725
- package/components/overlays/popover/anchored-demo.tsx +0 -59
- package/components/overlays/popover/examples.mdx +0 -203
- package/components/overlays/popover/index.tsx +0 -317
- package/components/overlays/preview-card/examples.mdx +0 -61
- package/components/overlays/preview-card/index.tsx +0 -204
- package/components/overlays/sheet/examples.mdx +0 -101
- package/components/overlays/sheet/index.tsx +0 -307
- package/components/overlays/toast/examples.mdx +0 -85
- package/components/overlays/toast/global-demo.tsx +0 -72
- package/components/overlays/toast/index.tsx +0 -544
- package/components/overlays/toast/manager.ts +0 -193
- package/components/overlays/tooltip/examples.mdx +0 -106
- package/components/overlays/tooltip/index.tsx +0 -539
- package/components/progress/examples.mdx +0 -59
- package/components/progress/index.tsx +0 -174
- package/components/progress/progress.css +0 -49
- package/components/progress/step-demo.tsx +0 -27
- package/components/table/examples.mdx +0 -188
- package/components/table/index.tsx +0 -535
- package/components/table/sort-demo.tsx +0 -61
- package/dist/components/avatar/index.d.ts +0 -46
- package/dist/components/avatar/index.js +0 -19
- package/dist/components/badge/variants.d.ts +0 -33
- package/dist/components/badge/variants.js +0 -10
- package/dist/components/button/variants.d.ts +0 -39
- package/dist/components/button/variants.js +0 -8
- package/dist/components/inputs/color-picker/variants.d.ts +0 -61
- package/dist/components/inputs/color-picker/variants.js +0 -28
- package/dist/components/inputs/field/index.d.ts +0 -116
- package/dist/components/inputs/field/index.js +0 -29
- package/dist/components/inputs/file-dropzone/index.d.ts +0 -167
- package/dist/components/inputs/file-dropzone/index.js +0 -33
- package/dist/components/inputs/file-dropzone/variants.d.ts +0 -35
- package/dist/components/inputs/file-dropzone/variants.js +0 -12
- package/dist/components/inputs/label/index.d.ts +0 -32
- package/dist/components/inputs/label/index.js +0 -11
- package/dist/components/inputs/number-input/index.d.ts +0 -87
- package/dist/components/inputs/number-input/index.js +0 -21
- package/dist/components/inputs/select/variants.d.ts +0 -5
- package/dist/components/inputs/select/variants.js +0 -6
- package/dist/components/navigation/navigation-menu/index.d.ts +0 -126
- package/dist/components/navigation/navigation-menu/index.js +0 -41
- package/dist/components/navigation/pagination/index.d.ts +0 -75
- package/dist/components/navigation/pagination/index.js +0 -41
- package/dist/components/navigation/sidebar/variants.d.ts +0 -25
- package/dist/components/navigation/sidebar/variants.js +0 -28
- package/dist/components/progress/index.d.ts +0 -56
- package/dist/components/progress/index.js +0 -15
- package/dist/docs/index.d.ts +0 -83
- package/dist/docs/index.js +0 -288
- package/dist/docs/vite.d.ts +0 -31
- package/dist/docs/vite.js +0 -45
- package/dist/lib/date-locale.d.ts +0 -26
- package/dist/lib/date-locale.js +0 -24
- package/dist/lib/field-classes.d.ts +0 -149
- package/dist/lib/field-classes.js +0 -41
- package/dist/lib/field-variants.d.ts +0 -47
- package/dist/lib/field-variants.js +0 -26
- package/dist/lib/fluid-hover-highlight.d.ts +0 -112
- package/dist/lib/fluid-hover-highlight.js +0 -17
- package/dist/lib/focus-ring.d.ts +0 -18
- package/dist/lib/focus-ring.js +0 -11
- package/dist/lib/goo-indicator.d.ts +0 -46
- package/dist/lib/goo-indicator.js +0 -14
- package/dist/lib/icon-context.d.ts +0 -30
- package/dist/lib/icon-context.js +0 -12
- package/dist/lib/inert.d.ts +0 -9
- package/dist/lib/inert.js +0 -8
- package/dist/lib/morph-layers.d.ts +0 -93
- package/dist/lib/morph-layers.js +0 -13
- package/dist/lib/morph-part.d.ts +0 -21
- package/dist/lib/morph-part.js +0 -12
- package/dist/lib/popup.d.ts +0 -20
- package/dist/lib/popup.js +0 -12
- package/dist/lib/reduced-motion.d.ts +0 -9
- package/dist/lib/reduced-motion.js +0 -6
- package/dist/lib/row-index.d.ts +0 -10
- package/dist/lib/row-index.js +0 -8
- package/dist/lib/row-order.d.ts +0 -28
- package/dist/lib/row-order.js +0 -10
- package/dist/lib/scroll-column.d.ts +0 -31
- package/dist/lib/scroll-column.js +0 -19
- package/dist/lib/shape-context.d.ts +0 -30
- package/dist/lib/shape-context.js +0 -13
- package/dist/lib/shape-radius.d.ts +0 -19
- package/dist/lib/shape-radius.js +0 -6
- package/dist/lib/size-context.d.ts +0 -94
- package/dist/lib/size-context.js +0 -20
- package/dist/lib/size-scale.d.ts +0 -79
- package/dist/lib/size-scale.js +0 -8
- package/dist/lib/slot.d.ts +0 -39
- package/dist/lib/slot.js +0 -14
- package/dist/lib/springs.d.ts +0 -44
- package/dist/lib/springs.js +0 -8
- package/dist/lib/surface-classes.d.ts +0 -19
- package/dist/lib/surface-classes.js +0 -10
- package/dist/lib/surface-context.d.ts +0 -9
- package/dist/lib/surface-context.js +0 -8
- package/dist/lib/use-controllable-state.d.ts +0 -2
- package/dist/lib/use-controllable-state.js +0 -6
- package/dist/lib/use-fluid-hover.d.ts +0 -138
- package/dist/lib/use-fluid-hover.js +0 -14
- package/dist/lib/use-is-mobile.d.ts +0 -2
- package/dist/lib/use-is-mobile.js +0 -6
- package/dist/lib/use-keyboard-nav-gate.d.ts +0 -20
- package/dist/lib/use-keyboard-nav-gate.js +0 -7
- package/dist/lib/use-merge-split.d.ts +0 -47
- package/dist/lib/use-merge-split.js +0 -15
- package/dist/lib/use-morph.d.ts +0 -101
- package/dist/lib/use-morph.js +0 -20
- package/dist/lib/use-touch-primary.d.ts +0 -2
- package/dist/lib/use-touch-primary.js +0 -6
- package/dist/lib/utils.d.ts +0 -3
- package/dist/lib/utils.js +0 -6
- package/dist/primitives/separator/index.d.ts +0 -25
- package/dist/primitives/separator/index.js +0 -9
- package/dist/primitives/skeleton/index.d.ts +0 -35
- package/dist/primitives/skeleton/index.js +0 -13
- package/dist/shared/components-01w9qcfa.js +0 -277
- package/dist/shared/components-124epb7f.js +0 -53
- package/dist/shared/components-26snnbs9.js +0 -322
- package/dist/shared/components-2krsc300.js +0 -254
- package/dist/shared/components-2qbqqpgq.js +0 -1545
- package/dist/shared/components-34txk9rj.js +0 -35
- package/dist/shared/components-3h92d94m.js +0 -23
- package/dist/shared/components-4vfm04wq.js +0 -82
- package/dist/shared/components-54nq988h.js +0 -123
- package/dist/shared/components-7s7pykk5.js +0 -281
- package/dist/shared/components-868v7scv.js +0 -399
- package/dist/shared/components-8jrk5eye.js +0 -448
- package/dist/shared/components-adkarj8n.js +0 -35
- package/dist/shared/components-b1e239g3.js +0 -28
- package/dist/shared/components-b94t6qtj.js +0 -143
- package/dist/shared/components-bsqynhaj.js +0 -179
- package/dist/shared/components-c9yr4ed1.js +0 -44
- package/dist/shared/components-d3shbwqq.js +0 -95
- package/dist/shared/components-dhgk6mbt.js +0 -16
- package/dist/shared/components-drxrtnp2.js +0 -25
- package/dist/shared/components-f7h57m6t.js +0 -59
- package/dist/shared/components-g3eafs70.js +0 -337
- package/dist/shared/components-gx4h5rbb.js +0 -40
- package/dist/shared/components-gyt7my41.js +0 -328
- package/dist/shared/components-h6p86be3.js +0 -19
- package/dist/shared/components-h83az0bz.js +0 -33
- package/dist/shared/components-hdzrqqpx.js +0 -55
- package/dist/shared/components-krtx3m5b.js +0 -84
- package/dist/shared/components-kswxnm3h.js +0 -24
- package/dist/shared/components-mhza2wdn.js +0 -482
- package/dist/shared/components-mrbaxt8q.js +0 -62
- package/dist/shared/components-pt5ftm4p.js +0 -38
- package/dist/shared/components-rtadhd9j.js +0 -64
- package/dist/shared/components-tv7b8tet.js +0 -271
- package/dist/shared/components-tz4gaf1v.js +0 -23
- package/dist/shared/components-wbbckbw8.js +0 -34
- package/dist/shared/components-wknae3m4.js +0 -298
- package/dist/shared/components-xdqmt6ed.js +0 -20
- package/dist/shared/components-xjkdvnbg.js +0 -107
- package/dist/shared/components-z3v0n0de.js +0 -11
- package/dist/tokens/colors.css +0 -230
- package/dist/tokens/motion.css +0 -40
- package/dist/tokens/radius.css +0 -10
- package/dist/tokens/spacing.css +0 -9
- package/dist/tokens/typography.css +0 -119
- package/docs/chrome.css +0 -120
- package/docs/chrome.tsx +0 -283
- package/docs/index.ts +0 -9
- package/docs/vite.ts +0 -85
- package/index.ts +0 -60
- package/lib/date-locale.ts +0 -195
- package/lib/field-classes.ts +0 -121
- package/lib/field-variants.ts +0 -117
- package/lib/fluid-hover-highlight.tsx +0 -139
- package/lib/focus-ring.tsx +0 -46
- package/lib/goo-indicator.tsx +0 -261
- package/lib/icon-context.tsx +0 -310
- package/lib/inert.ts +0 -22
- package/lib/morph-layers.tsx +0 -102
- package/lib/morph-part.tsx +0 -49
- package/lib/popup.ts +0 -52
- package/lib/reduced-motion.ts +0 -19
- package/lib/row-index.tsx +0 -29
- package/lib/row-order.tsx +0 -126
- package/lib/scroll-column.tsx +0 -273
- package/lib/shape-context.tsx +0 -138
- package/lib/shape-radius.ts +0 -67
- package/lib/size-context.tsx +0 -66
- package/lib/size-scale.ts +0 -115
- package/lib/slot.ts +0 -115
- package/lib/springs.ts +0 -62
- package/lib/surface-classes.ts +0 -58
- package/lib/surface-context.tsx +0 -21
- package/lib/use-controllable-state.ts +0 -44
- package/lib/use-fluid-hover.ts +0 -541
- package/lib/use-is-mobile.ts +0 -25
- package/lib/use-keyboard-nav-gate.ts +0 -45
- package/lib/use-merge-split.tsx +0 -209
- package/lib/use-morph.ts +0 -575
- package/lib/use-touch-primary.tsx +0 -43
- package/lib/utils.ts +0 -37
- package/preset.ts +0 -199
- package/primitives/code/examples.mdx +0 -27
- package/primitives/code/index.tsx +0 -80
- package/primitives/craft/demos.tsx +0 -173
- package/primitives/craft/examples.mdx +0 -142
- package/primitives/craft/index.tsx +0 -76
- package/primitives/fluid-hover/examples.mdx +0 -84
- package/primitives/fluid-hover/index.tsx +0 -316
- package/primitives/morph/examples.mdx +0 -139
- package/primitives/morph/index.tsx +0 -192
- package/primitives/motion/examples.mdx +0 -100
- package/primitives/motion/index.tsx +0 -160
- package/primitives/scroll-area/examples.mdx +0 -58
- package/primitives/scroll-area/index.tsx +0 -204
- package/primitives/separator/examples.mdx +0 -30
- package/primitives/separator/index.tsx +0 -53
- package/primitives/sizes/examples.mdx +0 -167
- package/primitives/sizes/index.tsx +0 -89
- package/primitives/skeleton/examples.mdx +0 -51
- package/primitives/skeleton/index.tsx +0 -72
- package/primitives/skeleton/skeleton.css +0 -15
- package/primitives/surface/examples.mdx +0 -173
- package/primitives/surface/index.tsx +0 -109
- package/primitives/surface/surface.css +0 -176
- /package/dist/shared/{components-3ey0hzpb.js → components-1v7rxytx.js} +0 -0
- /package/dist/shared/{components-jcnjay5g.js → components-ezxhrmer.js} +0 -0
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import Pagination from './index'
|
|
2
|
-
|
|
3
|
-
# Basics
|
|
4
|
-
|
|
5
|
-
## Pages
|
|
6
|
-
|
|
7
|
-
The current page melts from page to page, and the hover glides along the strip. A click between two pages lands on the lit one.
|
|
8
|
-
|
|
9
|
-
<Pagination pageCount={12} defaultPage={5} />
|
|
10
|
-
|
|
11
|
-
## Few pages
|
|
12
|
-
|
|
13
|
-
With nothing to skip, every page shows.
|
|
14
|
-
|
|
15
|
-
<Pagination pageCount={5} defaultPage={2} />
|
|
16
|
-
|
|
17
|
-
## First and last
|
|
18
|
-
|
|
19
|
-
`edges` adds buttons to the ends, for long runs of pages.
|
|
20
|
-
|
|
21
|
-
<Pagination pageCount={40} defaultPage={18} edges />
|
|
22
|
-
|
|
23
|
-
# Controls
|
|
24
|
-
|
|
25
|
-
## Jump to a page
|
|
26
|
-
|
|
27
|
-
`variant="input"` swaps the strip for a field: type a page and press Enter. First and last come with it.
|
|
28
|
-
|
|
29
|
-
<Pagination pageCount={24} defaultPage={3} variant="input" />
|
|
30
|
-
|
|
31
|
-
## Page size
|
|
32
|
-
|
|
33
|
-
Setting `defaultPageSize` (or `pageSize`) adds a Select of `pageSizes`, the layout a data table footer uses.
|
|
34
|
-
|
|
35
|
-
<Pagination pageCount={8} variant="input" defaultPageSize={20} />
|
|
36
|
-
|
|
37
|
-
With `pageSizeLabel=""` the caption goes and `pageSizeAriaLabel` still names the Select.
|
|
38
|
-
|
|
39
|
-
<Pagination pageCount={8} variant="input" defaultPageSize={20} pageSizeLabel="" pageSizeAriaLabel="Rows per page" />
|
|
40
|
-
|
|
41
|
-
# Options
|
|
42
|
-
|
|
43
|
-
## Compact
|
|
44
|
-
|
|
45
|
-
The strip steps down the size ladder with everything around it, the page-size menu included.
|
|
46
|
-
|
|
47
|
-
<div className="flex flex-col gap-4">
|
|
48
|
-
<Pagination pageCount={20} defaultPage={10} size="compact" />
|
|
49
|
-
<Pagination pageCount={20} defaultPage={10} variant="input" defaultPageSize={10} size="compact" />
|
|
50
|
-
</div>
|
|
51
|
-
|
|
52
|
-
## Translated labels
|
|
53
|
-
|
|
54
|
-
Every label is a prop: the buttons' names, the field's name and the page-size caption.
|
|
55
|
-
|
|
56
|
-
<Pagination
|
|
57
|
-
pageCount={8}
|
|
58
|
-
defaultPage={2}
|
|
59
|
-
variant="input"
|
|
60
|
-
defaultPageSize={10}
|
|
61
|
-
label="Stránkovanie"
|
|
62
|
-
firstLabel="Prvá strana"
|
|
63
|
-
previousLabel="Predchádzajúca strana"
|
|
64
|
-
nextLabel="Ďalšia strana"
|
|
65
|
-
lastLabel="Posledná strana"
|
|
66
|
-
pageLabel="Strana"
|
|
67
|
-
pageSizeLabel="Riadkov na stranu"
|
|
68
|
-
/>
|
|
69
|
-
|
|
70
|
-
## Disabled
|
|
71
|
-
|
|
72
|
-
`disabled` holds every control, e.g. while the next page loads.
|
|
73
|
-
|
|
74
|
-
<Pagination pageCount={12} defaultPage={4} disabled />
|
|
@@ -1,401 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Local addition (not part of Fluid Functionalism): page navigation in the
|
|
3
|
-
* system's motion language, from the Pagination template in the modo-ui skill
|
|
4
|
-
* (`references/authoring.md`). The current page is a liquid indicator
|
|
5
|
-
* (`lib/goo-indicator.tsx`) that melts from page to page and one fluid hover
|
|
6
|
-
* highlight runs along the strip. Extended for data tables: first / last
|
|
7
|
-
* buttons, a jump-to-page field (`variant="input"`), a page-size Select and
|
|
8
|
-
* every label as a prop.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { type KeyboardEvent, useEffect, useRef, useState } from 'react'
|
|
12
|
-
import { FluidHoverHighlight } from '../../../lib/fluid-hover-highlight'
|
|
13
|
-
import { GooIndicator } from '../../../lib/goo-indicator'
|
|
14
|
-
import { type IconName, useIcon } from '../../../lib/icon-context'
|
|
15
|
-
import { useShape } from '../../../lib/shape-context'
|
|
16
|
-
import { type SizeVariant, useSize } from '../../../lib/size-context'
|
|
17
|
-
import { useControllableState } from '../../../lib/use-controllable-state'
|
|
18
|
-
import {
|
|
19
|
-
type ItemRect,
|
|
20
|
-
type UseFluidHoverReturn,
|
|
21
|
-
useFluidHover,
|
|
22
|
-
useRegisterFluidHoverItem,
|
|
23
|
-
} from '../../../lib/use-fluid-hover'
|
|
24
|
-
import { cn } from '../../../lib/utils'
|
|
25
|
-
import { SizeProvider } from '../../../primitives/sizes'
|
|
26
|
-
import Button from '../../button'
|
|
27
|
-
import { Input } from '../../inputs/input'
|
|
28
|
-
import Select from '../../inputs/select'
|
|
29
|
-
|
|
30
|
-
// Literal tables: UnoCSS only generates the classes it can read whole.
|
|
31
|
-
const SQUARE = { default: 'min-w-9', compact: 'min-w-7' }
|
|
32
|
-
const FIELD = { default: 'w-14', compact: 'w-12' }
|
|
33
|
-
|
|
34
|
-
type Slot = number | 'gap'
|
|
35
|
-
|
|
36
|
-
type PaginationVariant = 'pages' | 'input'
|
|
37
|
-
|
|
38
|
-
/** The ends, the current page and its siblings, and a gap wherever pages are skipped. */
|
|
39
|
-
function slots(page: number, total: number, siblings: number): Slot[] {
|
|
40
|
-
const shown = new Set([1, total])
|
|
41
|
-
for (let p = page - siblings; p <= page + siblings; p++) if (p >= 1 && p <= total) shown.add(p)
|
|
42
|
-
|
|
43
|
-
const result: Slot[] = []
|
|
44
|
-
let previous = 0
|
|
45
|
-
for (const p of [...shown].sort((a, b) => a - b)) {
|
|
46
|
-
// A gap of one page shows that page: an ellipsis would be no shorter.
|
|
47
|
-
if (p - previous === 2) result.push(p - 1)
|
|
48
|
-
else if (p - previous > 2) result.push('gap')
|
|
49
|
-
result.push(p)
|
|
50
|
-
previous = p
|
|
51
|
-
}
|
|
52
|
-
return result
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
interface PageButtonProps {
|
|
56
|
-
page: number
|
|
57
|
-
index: number
|
|
58
|
-
current: boolean
|
|
59
|
-
lit: boolean
|
|
60
|
-
disabled: boolean
|
|
61
|
-
register: UseFluidHoverReturn['registerItem']
|
|
62
|
-
onSelect: (page: number) => void
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
function PageButton({ page, index, current, lit, disabled, register, onSelect }: PageButtonProps) {
|
|
66
|
-
const ref = useRef<HTMLButtonElement>(null)
|
|
67
|
-
const size = useSize()
|
|
68
|
-
const shape = useShape()
|
|
69
|
-
useRegisterFluidHoverItem(register, index, ref)
|
|
70
|
-
|
|
71
|
-
return (
|
|
72
|
-
<button
|
|
73
|
-
ref={ref}
|
|
74
|
-
type="button"
|
|
75
|
-
aria-current={current ? 'page' : undefined}
|
|
76
|
-
disabled={disabled}
|
|
77
|
-
onClick={() => onSelect(page)}
|
|
78
|
-
className={cn(
|
|
79
|
-
'relative z-10 flex cursor-pointer items-center justify-center px-2 tabular-nums outline-none transition-[opacity] duration-fast focus-visible:ring-1 focus-visible:ring-focus-ring disabled:pointer-events-none disabled:opacity-50',
|
|
80
|
-
size.control,
|
|
81
|
-
SQUARE[size.variant],
|
|
82
|
-
shape.button,
|
|
83
|
-
)}
|
|
84
|
-
>
|
|
85
|
-
{/* The invisible semibold copy holds the width, so the current page turns semibold without moving its neighbours. */}
|
|
86
|
-
<span className={cn('inline-grid', size.text)}>
|
|
87
|
-
<span aria-hidden="true" className="invisible col-start-1 row-start-1 weight-semibold">
|
|
88
|
-
{page}
|
|
89
|
-
</span>
|
|
90
|
-
<span
|
|
91
|
-
className={cn(
|
|
92
|
-
'col-start-1 row-start-1 transition-[color,font-variation-settings] duration-fast',
|
|
93
|
-
current || lit ? 'text-foreground' : 'text-muted-foreground',
|
|
94
|
-
current ? 'weight-semibold' : 'weight-normal',
|
|
95
|
-
)}
|
|
96
|
-
>
|
|
97
|
-
{page}
|
|
98
|
-
</span>
|
|
99
|
-
</span>
|
|
100
|
-
</button>
|
|
101
|
-
)
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
interface PageStripProps {
|
|
105
|
-
current: number
|
|
106
|
-
total: number
|
|
107
|
-
siblings: number
|
|
108
|
-
disabled: boolean
|
|
109
|
-
onSelect: (page: number) => void
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/** The page buttons: one fluid hover, a liquid current-page indicator. */
|
|
113
|
-
function PageStrip({ current, total, siblings, disabled, onSelect }: PageStripProps) {
|
|
114
|
-
const size = useSize()
|
|
115
|
-
const shape = useShape()
|
|
116
|
-
const containerRef = useRef<HTMLDivElement>(null)
|
|
117
|
-
const hover = useFluidHover(containerRef, { axis: 'x' })
|
|
118
|
-
|
|
119
|
-
const list = slots(current, total, siblings)
|
|
120
|
-
const pages = list.filter((slot): slot is number => slot !== 'gap')
|
|
121
|
-
// A page change can re-key the strip; hold the last measured rect so the
|
|
122
|
-
// indicator travels from where it was instead of blinking out mid-measure.
|
|
123
|
-
const measured = hover.isMeasured ? hover.itemRects[pages.indexOf(current)] : undefined
|
|
124
|
-
const lastRect = useRef<ItemRect | undefined>(measured)
|
|
125
|
-
if (measured) lastRect.current = measured
|
|
126
|
-
|
|
127
|
-
return (
|
|
128
|
-
<div ref={containerRef} {...hover.handlers} className="relative flex items-center gap-1">
|
|
129
|
-
{lastRect.current && (
|
|
130
|
-
<GooIndicator rect={lastRect.current} className={cn('bg-accent', shape.bg)} opacity={disabled ? 0.5 : 1} />
|
|
131
|
-
)}
|
|
132
|
-
<FluidHoverHighlight hover={hover} hidden={disabled} className={shape.bg} />
|
|
133
|
-
{list.map((slot, i) =>
|
|
134
|
-
slot === 'gap' ? (
|
|
135
|
-
<span
|
|
136
|
-
key={`gap-${i}`}
|
|
137
|
-
aria-hidden="true"
|
|
138
|
-
className={cn(
|
|
139
|
-
'flex items-center justify-center text-muted-foreground',
|
|
140
|
-
size.control,
|
|
141
|
-
SQUARE[size.variant],
|
|
142
|
-
size.text,
|
|
143
|
-
)}
|
|
144
|
-
>
|
|
145
|
-
…
|
|
146
|
-
</span>
|
|
147
|
-
) : (
|
|
148
|
-
<PageButton
|
|
149
|
-
key={slot}
|
|
150
|
-
page={slot}
|
|
151
|
-
index={pages.indexOf(slot)}
|
|
152
|
-
current={slot === current}
|
|
153
|
-
lit={hover.activeIndex === pages.indexOf(slot)}
|
|
154
|
-
disabled={disabled}
|
|
155
|
-
register={hover.registerItem}
|
|
156
|
-
onSelect={onSelect}
|
|
157
|
-
/>
|
|
158
|
-
),
|
|
159
|
-
)}
|
|
160
|
-
</div>
|
|
161
|
-
)
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
interface PageFieldProps {
|
|
165
|
-
current: number
|
|
166
|
-
total: number
|
|
167
|
-
disabled: boolean
|
|
168
|
-
label: string
|
|
169
|
-
onSelect: (page: number) => void
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/** Jump to a page: type a number, Enter or leaving the field goes there, Escape puts the current page back. */
|
|
173
|
-
function PageField({ current, total, disabled, label, onSelect }: PageFieldProps) {
|
|
174
|
-
const size = useSize()
|
|
175
|
-
const [draft, setDraft] = useState(String(current))
|
|
176
|
-
|
|
177
|
-
useEffect(() => setDraft(String(current)), [current])
|
|
178
|
-
|
|
179
|
-
const commit = () => {
|
|
180
|
-
const page = Number(draft)
|
|
181
|
-
if (Number.isInteger(page) && page >= 1 && page <= total) onSelect(page)
|
|
182
|
-
else setDraft(String(current))
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {
|
|
186
|
-
if (event.key === 'Enter') commit()
|
|
187
|
-
if (event.key === 'Escape') setDraft(String(current))
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
return (
|
|
191
|
-
<div className={cn('flex items-center', size.gap)}>
|
|
192
|
-
<Input
|
|
193
|
-
variant="bordered"
|
|
194
|
-
inputMode="numeric"
|
|
195
|
-
aria-label={label}
|
|
196
|
-
value={draft}
|
|
197
|
-
onChange={value => setDraft(value.replace(/\D/g, ''))}
|
|
198
|
-
onKeyDown={onKeyDown}
|
|
199
|
-
onBlur={commit}
|
|
200
|
-
disabled={disabled || total <= 1}
|
|
201
|
-
className={cn('tabular-nums', FIELD[size.variant])}
|
|
202
|
-
/>
|
|
203
|
-
<span className={cn('whitespace-nowrap tabular-nums text-muted-foreground', size.text)}>/ {total}</span>
|
|
204
|
-
</div>
|
|
205
|
-
)
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
interface PaginationProps {
|
|
209
|
-
/** Number of pages. Below 1 it counts as 1. */
|
|
210
|
-
pageCount: number
|
|
211
|
-
/** Controlled current page, counted from 1. Pair with `onPageChange`. */
|
|
212
|
-
page?: number
|
|
213
|
-
/** Initial page, for an uncontrolled pagination. Defaults to `1`. */
|
|
214
|
-
defaultPage?: number
|
|
215
|
-
/** Called with the new page whenever it changes. */
|
|
216
|
-
onPageChange?: (page: number) => void
|
|
217
|
-
/** Page buttons along a strip, or a field to type the page into (the dense layout data tables use). Defaults to `'pages'`. */
|
|
218
|
-
variant?: PaginationVariant
|
|
219
|
-
/** Pages shown on each side of the current one before a gap, with `variant="pages"`. Defaults to `1`. */
|
|
220
|
-
siblings?: number
|
|
221
|
-
/** Show the first and last page buttons. Defaults to on with `variant="input"` and off with `variant="pages"`. */
|
|
222
|
-
edges?: boolean
|
|
223
|
-
/** Controlled page size: shows the page-size Select. Pair with `onPageSizeChange`. */
|
|
224
|
-
pageSize?: number
|
|
225
|
-
/** Initial page size, for an uncontrolled page-size Select; setting it shows the Select. */
|
|
226
|
-
defaultPageSize?: number
|
|
227
|
-
/** The page sizes the Select offers. Defaults to `[10, 20, 30, 40, 50]`. */
|
|
228
|
-
pageSizes?: number[]
|
|
229
|
-
/** Called with the new page size whenever it changes. */
|
|
230
|
-
onPageSizeChange?: (pageSize: number) => void
|
|
231
|
-
/** Disables every control, e.g. while a page loads. Defaults to `false`. */
|
|
232
|
-
disabled?: boolean
|
|
233
|
-
/** Accessible name of the `nav`. Defaults to `'Pagination'`. */
|
|
234
|
-
label?: string
|
|
235
|
-
/** Accessible name of the first page button. Defaults to `'First page'`. */
|
|
236
|
-
firstLabel?: string
|
|
237
|
-
/** Accessible name of the previous page button. Defaults to `'Previous page'`. */
|
|
238
|
-
previousLabel?: string
|
|
239
|
-
/** Accessible name of the next page button. Defaults to `'Next page'`. */
|
|
240
|
-
nextLabel?: string
|
|
241
|
-
/** Accessible name of the last page button. Defaults to `'Last page'`. */
|
|
242
|
-
lastLabel?: string
|
|
243
|
-
/** Accessible name of the page field, with `variant="input"`. Defaults to `'Page'`. */
|
|
244
|
-
pageLabel?: string
|
|
245
|
-
/** Text before the page-size Select, also its accessible name unless `pageSizeAriaLabel` is set; an empty string shows none. Defaults to `'Rows per page'`. */
|
|
246
|
-
pageSizeLabel?: string
|
|
247
|
-
/** Accessible name of the page-size Select, for when it should differ from the visible `pageSizeLabel` (or that is empty). Defaults to `pageSizeLabel`, else `'Rows per page'`. */
|
|
248
|
-
pageSizeAriaLabel?: string
|
|
249
|
-
/** Pins the strip to one step of the size ladder (36px default, 28px compact). Defaults to the surrounding SizeProvider. */
|
|
250
|
-
size?: SizeVariant
|
|
251
|
-
/** Classes for the `nav` root. */
|
|
252
|
-
className?: string
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
interface StepProps {
|
|
256
|
-
icon: IconName
|
|
257
|
-
label: string
|
|
258
|
-
disabled: boolean
|
|
259
|
-
onClick: () => void
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
function Step({ icon, label, disabled, onClick }: StepProps) {
|
|
263
|
-
const size = useSize()
|
|
264
|
-
const Icon = useIcon(icon)
|
|
265
|
-
return (
|
|
266
|
-
<Button
|
|
267
|
-
variant="ghost"
|
|
268
|
-
size={size.variant === 'compact' ? 'icon-compact' : 'icon'}
|
|
269
|
-
aria-label={label}
|
|
270
|
-
disabled={disabled}
|
|
271
|
-
onClick={onClick}
|
|
272
|
-
>
|
|
273
|
-
<Icon />
|
|
274
|
-
</Button>
|
|
275
|
-
)
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
/**
|
|
279
|
-
* Page navigation: first, previous, the pages or a field to jump to one,
|
|
280
|
-
* next and last, with an optional page-size Select for data tables.
|
|
281
|
-
*
|
|
282
|
-
* With the default `variant="pages"` the strip shows the first and last
|
|
283
|
-
* pages and the current page's neighbours, with a gap wherever pages are
|
|
284
|
-
* skipped. The current page is a liquid indicator: picking another page melts
|
|
285
|
-
* it across the strip (see the liquid indicators in Morph), and its number
|
|
286
|
-
* turns semibold without moving the others. One fluid hover highlight runs
|
|
287
|
-
* along the page buttons, so a click between two pages lands on the lit one.
|
|
288
|
-
*
|
|
289
|
-
* `variant="input"` swaps the strip for a field showing the current page and
|
|
290
|
-
* the page count (`3 / 12`): type a page and press Enter, or leave the field,
|
|
291
|
-
* to go there; Escape puts the current page back. It brings first and last
|
|
292
|
-
* buttons with it (`edges`).
|
|
293
|
-
*
|
|
294
|
-
* Setting `pageSize` or `defaultPageSize` adds a Select of `pageSizes`. Every
|
|
295
|
-
* label is a prop, so a translated app passes its own strings. Works
|
|
296
|
-
* controlled (`page` + `onPageChange`, `pageSize` + `onPageSizeChange`) or
|
|
297
|
-
* uncontrolled (`defaultPage`, `defaultPageSize`).
|
|
298
|
-
*
|
|
299
|
-
* @example {@include ./examples.mdx}
|
|
300
|
-
*/
|
|
301
|
-
function Pagination({
|
|
302
|
-
pageCount,
|
|
303
|
-
page,
|
|
304
|
-
defaultPage = 1,
|
|
305
|
-
onPageChange,
|
|
306
|
-
variant = 'pages',
|
|
307
|
-
siblings = 1,
|
|
308
|
-
edges: edgesProp,
|
|
309
|
-
pageSize,
|
|
310
|
-
defaultPageSize,
|
|
311
|
-
pageSizes = [10, 20, 30, 40, 50],
|
|
312
|
-
onPageSizeChange,
|
|
313
|
-
disabled = false,
|
|
314
|
-
label = 'Pagination',
|
|
315
|
-
firstLabel = 'First page',
|
|
316
|
-
previousLabel = 'Previous page',
|
|
317
|
-
nextLabel = 'Next page',
|
|
318
|
-
lastLabel = 'Last page',
|
|
319
|
-
pageLabel = 'Page',
|
|
320
|
-
pageSizeLabel = 'Rows per page',
|
|
321
|
-
pageSizeAriaLabel,
|
|
322
|
-
size: sizeProp,
|
|
323
|
-
className,
|
|
324
|
-
}: PaginationProps) {
|
|
325
|
-
const [requested, setCurrent] = useControllableState(page, defaultPage, onPageChange)
|
|
326
|
-
const [rows, setRows] = useControllableState(pageSize, defaultPageSize ?? pageSizes[0] ?? 10, onPageSizeChange)
|
|
327
|
-
const size = useSize(sizeProp)
|
|
328
|
-
const total = Math.max(1, pageCount)
|
|
329
|
-
const current = Math.min(Math.max(1, requested), total)
|
|
330
|
-
const edges = edgesProp ?? variant === 'input'
|
|
331
|
-
const withPageSize = pageSize !== undefined || defaultPageSize !== undefined
|
|
332
|
-
|
|
333
|
-
const nav = (
|
|
334
|
-
<nav aria-label={label} className={cn('flex flex-wrap items-center', size.gap, className)}>
|
|
335
|
-
<div className={cn('flex items-center', size.gap)}>
|
|
336
|
-
{edges && (
|
|
337
|
-
<Step
|
|
338
|
-
icon="chevrons-left"
|
|
339
|
-
label={firstLabel}
|
|
340
|
-
disabled={disabled || current <= 1}
|
|
341
|
-
onClick={() => setCurrent(1)}
|
|
342
|
-
/>
|
|
343
|
-
)}
|
|
344
|
-
<Step
|
|
345
|
-
icon="chevron-left"
|
|
346
|
-
label={previousLabel}
|
|
347
|
-
disabled={disabled || current <= 1}
|
|
348
|
-
onClick={() => setCurrent(current - 1)}
|
|
349
|
-
/>
|
|
350
|
-
{variant === 'input' ? (
|
|
351
|
-
<PageField current={current} total={total} disabled={disabled} label={pageLabel} onSelect={setCurrent} />
|
|
352
|
-
) : (
|
|
353
|
-
<PageStrip current={current} total={total} siblings={siblings} disabled={disabled} onSelect={setCurrent} />
|
|
354
|
-
)}
|
|
355
|
-
<Step
|
|
356
|
-
icon="chevron-right"
|
|
357
|
-
label={nextLabel}
|
|
358
|
-
disabled={disabled || current >= total}
|
|
359
|
-
onClick={() => setCurrent(current + 1)}
|
|
360
|
-
/>
|
|
361
|
-
{edges && (
|
|
362
|
-
<Step
|
|
363
|
-
icon="chevrons-right"
|
|
364
|
-
label={lastLabel}
|
|
365
|
-
disabled={disabled || current >= total}
|
|
366
|
-
onClick={() => setCurrent(total)}
|
|
367
|
-
/>
|
|
368
|
-
)}
|
|
369
|
-
</div>
|
|
370
|
-
|
|
371
|
-
{withPageSize && (
|
|
372
|
-
<div className={cn('flex items-center', size.gap)}>
|
|
373
|
-
{pageSizeLabel && (
|
|
374
|
-
<span className={cn('whitespace-nowrap text-muted-foreground', size.text)}>{pageSizeLabel}</span>
|
|
375
|
-
)}
|
|
376
|
-
<Select value={String(rows)} onValueChange={value => setRows(Number(value))} disabled={disabled}>
|
|
377
|
-
<Select.Trigger
|
|
378
|
-
aria-label={pageSizeAriaLabel || pageSizeLabel || 'Rows per page'}
|
|
379
|
-
className="min-w-0 tabular-nums"
|
|
380
|
-
/>
|
|
381
|
-
<Select.Content>
|
|
382
|
-
{pageSizes.map((option, i) => (
|
|
383
|
-
<Select.Item key={option} index={i} value={String(option)}>
|
|
384
|
-
{option}
|
|
385
|
-
</Select.Item>
|
|
386
|
-
))}
|
|
387
|
-
</Select.Content>
|
|
388
|
-
</Select>
|
|
389
|
-
</div>
|
|
390
|
-
)}
|
|
391
|
-
</nav>
|
|
392
|
-
)
|
|
393
|
-
|
|
394
|
-
// A size prop pins the whole strip, the page buttons and the Select's menu included.
|
|
395
|
-
return sizeProp ? <SizeProvider size={sizeProp}>{nav}</SizeProvider> : nav
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
export type { PaginationProps, PaginationVariant }
|
|
399
|
-
export { Pagination }
|
|
400
|
-
|
|
401
|
-
export default Pagination
|