@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,525 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Local addition (not part of Fluid Functionalism): a date range field over
|
|
3
|
-
* the scrolling Calendar (react-day-picker's range mode). Props after
|
|
4
|
-
* shadcn's range picker and utegsk/ui's DateRangePicker (`editable`,
|
|
5
|
-
* `withTime`, `hourCycle`, `hidden`, per-end input props), kept in line with
|
|
6
|
-
* the other pickers here.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { endOfMonth, format, isValid, type Locale, set } from 'date-fns'
|
|
10
|
-
import {
|
|
11
|
-
type ForwardRefExoticComponent,
|
|
12
|
-
forwardRef,
|
|
13
|
-
type InputHTMLAttributes,
|
|
14
|
-
type ReactNode,
|
|
15
|
-
type Ref,
|
|
16
|
-
type RefAttributes,
|
|
17
|
-
type RefObject,
|
|
18
|
-
useMemo,
|
|
19
|
-
useRef,
|
|
20
|
-
useState,
|
|
21
|
-
} from 'react'
|
|
22
|
-
import { type DateRange, dateMatchModifiers, type Matcher } from 'react-day-picker'
|
|
23
|
-
import {
|
|
24
|
-
defaultLocale,
|
|
25
|
-
formatTime,
|
|
26
|
-
type HourCycle,
|
|
27
|
-
hourCycleOf,
|
|
28
|
-
parseDateText,
|
|
29
|
-
parseDateTimeText,
|
|
30
|
-
resolveLocale,
|
|
31
|
-
} from '../../../../lib/date-locale'
|
|
32
|
-
import { FieldStateContext, type FieldVariant } from '../../../../lib/field-classes'
|
|
33
|
-
import { type SizeVariant, useSize } from '../../../../lib/size-context'
|
|
34
|
-
import { useControllableState } from '../../../../lib/use-controllable-state'
|
|
35
|
-
import { cn } from '../../../../lib/utils'
|
|
36
|
-
import Calendar from '../calendar'
|
|
37
|
-
import { MaskedDateInput } from '../date-picker/masked-date-input'
|
|
38
|
-
import {
|
|
39
|
-
assignRefs,
|
|
40
|
-
controlAttributes,
|
|
41
|
-
invalidOf,
|
|
42
|
-
type PickerControlProps,
|
|
43
|
-
PickerInput,
|
|
44
|
-
PickerShell,
|
|
45
|
-
} from '../picker-shell'
|
|
46
|
-
import { type Time, TimeColumns } from '../time-columns'
|
|
47
|
-
|
|
48
|
-
/** Every word the picker shows or announces, for translating it. */
|
|
49
|
-
interface DateRangePickerLabels {
|
|
50
|
-
/** Names the range's start: the panel's start input, and an `editable` field's. Defaults to `"Start date"`. */
|
|
51
|
-
start?: string
|
|
52
|
-
/** Names the range's end: the panel's end input, and an `editable` field's. Defaults to `"End date"`. */
|
|
53
|
-
end?: string
|
|
54
|
-
/** Names the calendar button of an `editable` field. Defaults to `"Open calendar"`. */
|
|
55
|
-
calendar?: string
|
|
56
|
-
/** Names the panel's close button. Defaults to `"Close"`. */
|
|
57
|
-
close?: string
|
|
58
|
-
/** Names the month column. Defaults to the locale's name for it. */
|
|
59
|
-
month?: string
|
|
60
|
-
/** Names the year column. Defaults to the locale's name for it. */
|
|
61
|
-
year?: string
|
|
62
|
-
/** Names the hour column (`withTime`). Defaults to the locale's name for it. */
|
|
63
|
-
hour?: string
|
|
64
|
-
/** Names the minute column (`withTime`). Defaults to the locale's name for it. */
|
|
65
|
-
minute?: string
|
|
66
|
-
/** Caption under an `editable` field holding an end that is no real date, rendered as the field's next sibling; `null` keeps only the destructive ring. Defaults to `"Invalid date"`. */
|
|
67
|
-
invalid?: ReactNode
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/** Attributes for one end's input of an `editable` range, its `ref` included. */
|
|
71
|
-
type DateRangeInputProps = Omit<
|
|
72
|
-
InputHTMLAttributes<HTMLInputElement>,
|
|
73
|
-
'value' | 'defaultValue' | 'onChange' | 'type'
|
|
74
|
-
> & { ref?: Ref<HTMLInputElement> } & { [data: `data-${string}`]: string | number | boolean | undefined }
|
|
75
|
-
|
|
76
|
-
interface DateRangePickerProps extends PickerControlProps {
|
|
77
|
-
/** The picked range, react-day-picker's `{ from, to }`; `null` when empty. */
|
|
78
|
-
value?: DateRange | null
|
|
79
|
-
/** Initial range, for an uncontrolled picker. Defaults to `null`. */
|
|
80
|
-
defaultValue?: DateRange | null
|
|
81
|
-
/** Called with the new range: `{ from }` alone after the first click, `null` when cleared. An `editable` end left incomplete or impossible reports an Invalid Date there (`isNaN(date.getTime())`), so a form can reject it. */
|
|
82
|
-
onValueChange?: (value: DateRange | null) => void
|
|
83
|
-
/** The field is two text inputs to type the ends into, in the locale's numeric order ("09.10.2026 – 15.10.2026"); its calendar icon opens the panel. Defaults to `false`. */
|
|
84
|
-
editable?: boolean
|
|
85
|
-
/** Adds hour and minute columns, and the times to the field. The columns set the end being picked (the start after the first click, the end after the second), or whichever end's input has focus; a new start takes 00:00 and a new end 23:59. Defaults to `false`. */
|
|
86
|
-
withTime?: boolean
|
|
87
|
-
/** The clock for the times: on `'h12'` / `'h11'` the hours read with AM/PM. Defaults to the locale's. */
|
|
88
|
-
hourCycle?: HourCycle
|
|
89
|
-
/** Steps between the minute column's options. Defaults to `1`. */
|
|
90
|
-
minuteStep?: number
|
|
91
|
-
/** The field's text for each end, in place of the locale's range format: `(date) => …`. */
|
|
92
|
-
formatDate?: (date: Date) => ReactNode
|
|
93
|
-
/** Every word the picker shows or announces (`start`, `end`, `calendar`, `close`, `month`, `year`, `hour`, `minute`, `invalid`), for translating it. Defaults to English and the locale's field names. */
|
|
94
|
-
labels?: DateRangePickerLabels
|
|
95
|
-
/** Shows the range but never opens or takes typing. Defaults to `false`. */
|
|
96
|
-
readOnly?: boolean
|
|
97
|
-
/** A react-day-picker / date-fns locale (`import { de } from 'react-day-picker/locale'`), or a BCP 47 tag (`"sk"`) read through Intl. Defaults to `enUS`. */
|
|
98
|
-
locale?: Locale | string
|
|
99
|
-
/** Shown while empty. */
|
|
100
|
-
placeholder?: string
|
|
101
|
-
/** `true` disables the field; any other react-day-picker matcher disables the days it matches. */
|
|
102
|
-
disabled?: Matcher | Matcher[]
|
|
103
|
-
/** Days to leave out of the calendar, as react-day-picker matchers: they show as gaps and can't be typed either. */
|
|
104
|
-
hidden?: Matcher | Matcher[]
|
|
105
|
-
/** Names both ends for a native form: two hidden inputs carry them, start then end, as `"yyyy-MM-dd"` (with `withTime`, `"yyyy-MM-ddTHH:mm"`). */
|
|
106
|
-
name?: string
|
|
107
|
-
/** Names the start's hidden input on its own, in place of `name`. */
|
|
108
|
-
startName?: string
|
|
109
|
-
/** Names the end's hidden input on its own, in place of `name`. */
|
|
110
|
-
endName?: string
|
|
111
|
-
/** Attributes for an `editable` field's start input (`ref`, `id`, `aria-*`, handlers…), over the picker's own. */
|
|
112
|
-
startInputProps?: DateRangeInputProps
|
|
113
|
-
/** Attributes for an `editable` field's end input, over the picker's own. */
|
|
114
|
-
endInputProps?: DateRangeInputProps
|
|
115
|
-
/** The first month the calendar reaches. Defaults to 100 years back. */
|
|
116
|
-
startMonth?: Date
|
|
117
|
-
/** The last month the calendar reaches. Defaults to 50 years ahead. */
|
|
118
|
-
endMonth?: Date
|
|
119
|
-
/** Framed at rest, or invisible until hovered or focused. Defaults to `"bordered"`. */
|
|
120
|
-
variant?: FieldVariant
|
|
121
|
-
/** Marks the field invalid. Defaults to `false`. */
|
|
122
|
-
invalid?: boolean
|
|
123
|
-
/** Pins the field and its panel to one step of the size ladder. Defaults to the surrounding SizeProvider. */
|
|
124
|
-
size?: SizeVariant
|
|
125
|
-
/** Controlled open state. */
|
|
126
|
-
open?: boolean
|
|
127
|
-
/** Initial open state, for an uncontrolled panel. Defaults to `false`. */
|
|
128
|
-
defaultOpen?: boolean
|
|
129
|
-
/** Called when the panel opens or closes. */
|
|
130
|
-
onOpenChange?: (open: boolean) => void
|
|
131
|
-
/** Text direction of the panel; `'rtl'` mirrors it. */
|
|
132
|
-
dir?: 'ltr' | 'rtl'
|
|
133
|
-
/** Which side of the days the month and year columns stand on. Defaults to `'end'`. */
|
|
134
|
-
columnsSide?: 'start' | 'end'
|
|
135
|
-
/** Which side of the days the hour and minute columns stand on, outside the month and year columns when they share it. Defaults to `'end'`. */
|
|
136
|
-
timeColumnsSide?: 'start' | 'end'
|
|
137
|
-
/** Id of the field's control (its button, or an `editable` field's start input), for a `Label`'s `htmlFor`. */
|
|
138
|
-
id?: string
|
|
139
|
-
/** Where the panel grows from (see Morph): the field, the press point, its own center, a viewport edge, or a ref to any element. Defaults to `'trigger'` (the field). */
|
|
140
|
-
from?: 'trigger' | 'pointer' | 'center' | 'top' | 'right' | 'bottom' | 'left' | RefObject<HTMLElement | null>
|
|
141
|
-
/** How the panel grows (see Morph), as Combobox's list does: with the liquid goo neck, a plain morph, a slide or a fade. `'morph'` with `hideSource` opens it in place over the field. Defaults to `'goo'`. */
|
|
142
|
-
effect?: 'goo' | 'morph' | 'slide' | 'fade'
|
|
143
|
-
/** Hide the field while open, so it reads as turning into the panel. Defaults to `false`. */
|
|
144
|
-
hideSource?: boolean
|
|
145
|
-
/** Spring tier of a plain morph, slide or fade; goo runs on its own `spring.goo`. Defaults to `'moderate'`. */
|
|
146
|
-
tier?: 'moderate' | 'slow'
|
|
147
|
-
/** Classes for the field. */
|
|
148
|
-
className?: string
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
type End = 'from' | 'to'
|
|
152
|
-
|
|
153
|
-
/** A real date, or `undefined` for none (or an Invalid Date). */
|
|
154
|
-
const real = (date: Date | undefined) => (date && isValid(date) ? date : undefined)
|
|
155
|
-
|
|
156
|
-
/** `day` at `time`'s hours and minutes. */
|
|
157
|
-
const atTime = (day: Date, { hours, minutes }: Time) => set(day, { hours, minutes, seconds: 0, milliseconds: 0 })
|
|
158
|
-
|
|
159
|
-
const timeOf = (date: Date | undefined, fallback: Time): Time =>
|
|
160
|
-
date ? { hours: date.getHours(), minutes: date.getMinutes() } : fallback
|
|
161
|
-
|
|
162
|
-
const START_TIME: Time = { hours: 0, minutes: 0 }
|
|
163
|
-
const END_TIME: Time = { hours: 23, minutes: 59 }
|
|
164
|
-
|
|
165
|
-
const ACTIVE_END = { active: true, invalid: false, disabled: false }
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* A field for a span of days, picked with two clicks on a scrolling calendar.
|
|
169
|
-
*
|
|
170
|
-
* The first click starts the range and the days under the pointer preview it;
|
|
171
|
-
* the second ends it (either way round) and closes the panel. The header
|
|
172
|
-
* holds both ends as text, each read in the locale's formats as you type, and
|
|
173
|
-
* the field shows the range the way the locale writes one ("9 – 15 Oct
|
|
174
|
-
* 2026"). Everything else — the month and year columns, the bottom sheet on a
|
|
175
|
-
* phone, the locale — works as in DatePicker.
|
|
176
|
-
*
|
|
177
|
-
* `editable` turns the field into two masked inputs, one per end, typed in
|
|
178
|
-
* the locale's numeric order as DatePicker's are; the calendar icon opens the
|
|
179
|
-
* panel. `withTime` adds the times: hour and minute columns beside the days
|
|
180
|
-
* set the end being picked (the start after the first click, the end after
|
|
181
|
-
* the second) or whichever end's header input has focus, lit in the header,
|
|
182
|
-
* and the panel stays open until closed. `formatDate` writes each end in the
|
|
183
|
-
* field and `labels` every word, `hidden` days leave gaps, and `readOnly`
|
|
184
|
-
* shows the range without opening.
|
|
185
|
-
*
|
|
186
|
-
* In a form, `name` submits both ends through hidden inputs (or
|
|
187
|
-
* `startName` / `endName` one each), and `required` stops a submit until
|
|
188
|
-
* both are set. `id`, the `aria-*` props, `onBlur`, `controlProps` and the
|
|
189
|
-
* `ref` reach the field's control: its button, or both inputs of an
|
|
190
|
-
* `editable` field (the `ref` and `id` its start), where `startInputProps`
|
|
191
|
-
* and `endInputProps` add to each.
|
|
192
|
-
*
|
|
193
|
-
* @example {@include ./examples.mdx}
|
|
194
|
-
*/
|
|
195
|
-
const DateRangePicker: ForwardRefExoticComponent<
|
|
196
|
-
DateRangePickerProps & RefAttributes<HTMLButtonElement | HTMLInputElement>
|
|
197
|
-
> = forwardRef<HTMLButtonElement | HTMLInputElement, DateRangePickerProps>(function DateRangePicker(
|
|
198
|
-
{
|
|
199
|
-
value: valueProp,
|
|
200
|
-
defaultValue = null,
|
|
201
|
-
onValueChange,
|
|
202
|
-
editable = false,
|
|
203
|
-
withTime = false,
|
|
204
|
-
hourCycle,
|
|
205
|
-
minuteStep = 1,
|
|
206
|
-
formatDate,
|
|
207
|
-
labels,
|
|
208
|
-
readOnly = false,
|
|
209
|
-
locale: localeProp = defaultLocale,
|
|
210
|
-
placeholder,
|
|
211
|
-
disabled,
|
|
212
|
-
hidden,
|
|
213
|
-
name,
|
|
214
|
-
startName,
|
|
215
|
-
endName,
|
|
216
|
-
startInputProps,
|
|
217
|
-
endInputProps,
|
|
218
|
-
startMonth,
|
|
219
|
-
endMonth,
|
|
220
|
-
variant,
|
|
221
|
-
invalid,
|
|
222
|
-
size,
|
|
223
|
-
open: openProp,
|
|
224
|
-
defaultOpen = false,
|
|
225
|
-
onOpenChange,
|
|
226
|
-
dir,
|
|
227
|
-
columnsSide,
|
|
228
|
-
timeColumnsSide,
|
|
229
|
-
id,
|
|
230
|
-
// `from` is also the range's start, below.
|
|
231
|
-
from: growFrom,
|
|
232
|
-
effect,
|
|
233
|
-
hideSource,
|
|
234
|
-
tier,
|
|
235
|
-
className,
|
|
236
|
-
...control
|
|
237
|
-
},
|
|
238
|
-
ref,
|
|
239
|
-
) {
|
|
240
|
-
const [value, setValue] = useControllableState(valueProp, defaultValue, onValueChange)
|
|
241
|
-
const [open, setOpenState] = useControllableState(openProp, defaultOpen, onOpenChange)
|
|
242
|
-
// After the first click, the next one ends the range.
|
|
243
|
-
const [picking, setPicking] = useState(false)
|
|
244
|
-
// The end the time columns set.
|
|
245
|
-
const [activeEnd, setActiveEnd] = useState<End>('from')
|
|
246
|
-
const [typedInvalid, setTypedInvalid] = useState<Record<End, boolean>>({ from: false, to: false })
|
|
247
|
-
const fromInput = useRef<HTMLInputElement>(null)
|
|
248
|
-
const sizeClasses = useSize(size)
|
|
249
|
-
const locale = resolveLocale(localeProp)
|
|
250
|
-
// `true` turns the field off; any other matcher picks out days.
|
|
251
|
-
const off = typeof disabled === 'boolean' && disabled
|
|
252
|
-
const days = off ? undefined : disabled
|
|
253
|
-
const from = real(value?.from)
|
|
254
|
-
const to = from ? real(value?.to) : undefined
|
|
255
|
-
// An end that reads as no date (an editable end left half typed).
|
|
256
|
-
const unreadable = { from: !!value?.from && !from, to: !!value?.to && !real(value.to) }
|
|
257
|
-
const showInvalid = unreadable.from || unreadable.to || typedInvalid.from || typedInvalid.to
|
|
258
|
-
const invalidCaption = labels?.invalid === undefined ? 'Invalid date' : labels.invalid
|
|
259
|
-
const startLabel = labels?.start ?? 'Start date'
|
|
260
|
-
const endLabel = labels?.end ?? 'End date'
|
|
261
|
-
|
|
262
|
-
const setOpen = (next: boolean) => {
|
|
263
|
-
setPicking(false)
|
|
264
|
-
if (next) setActiveEnd('from')
|
|
265
|
-
setOpenState(next)
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
const allowed = (date: Date) =>
|
|
269
|
-
(!startMonth || date >= startMonth) &&
|
|
270
|
-
(!endMonth || date <= endOfMonth(endMonth)) &&
|
|
271
|
-
!(days && dateMatchModifiers(date, days)) &&
|
|
272
|
-
!(hidden && dateMatchModifiers(date, hidden))
|
|
273
|
-
|
|
274
|
-
const pick = (day: Date) => {
|
|
275
|
-
if (!picking || !from) {
|
|
276
|
-
setValue({ from: withTime ? atTime(day, timeOf(from, START_TIME)) : day, to: undefined })
|
|
277
|
-
setPicking(true)
|
|
278
|
-
setActiveEnd('from')
|
|
279
|
-
return
|
|
280
|
-
}
|
|
281
|
-
if (!withTime) {
|
|
282
|
-
setValue(day < from ? { from: day, to: from } : { from, to: day })
|
|
283
|
-
setOpen(false)
|
|
284
|
-
return
|
|
285
|
-
}
|
|
286
|
-
// With times each end keeps its own: the start's, and the end's (23:59 for a new one).
|
|
287
|
-
const endTime = timeOf(to, END_TIME)
|
|
288
|
-
const startTime = timeOf(from, START_TIME)
|
|
289
|
-
const end = atTime(day, endTime)
|
|
290
|
-
setValue(end < from ? { from: atTime(day, startTime), to: atTime(from, endTime) } : { from, to: end })
|
|
291
|
-
setPicking(false)
|
|
292
|
-
setActiveEnd('to')
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/** Sets the active end's time; a missing end takes the start's day (or today's). */
|
|
296
|
-
const setTime = (time: Time) => {
|
|
297
|
-
if (activeEnd === 'from') {
|
|
298
|
-
const next = atTime(from ?? new Date(), time)
|
|
299
|
-
setValue({ from: to && next > to ? to : next, to })
|
|
300
|
-
return
|
|
301
|
-
}
|
|
302
|
-
if (!from) return
|
|
303
|
-
const next = atTime(to ?? from, time)
|
|
304
|
-
setValue({ from, to: next < from ? from : next })
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
const readEnd = (end: End) => (text: string) => {
|
|
308
|
-
if (!text.trim()) {
|
|
309
|
-
setValue(end === 'from' ? null : from ? { from, to: undefined } : null)
|
|
310
|
-
return true
|
|
311
|
-
}
|
|
312
|
-
const reference = (end === 'from' ? from : to) ?? undefined
|
|
313
|
-
const date = withTime ? parseDateTimeText(text, locale, reference) : parseDateText(text, locale, reference)
|
|
314
|
-
if (!date || !allowed(date)) return false
|
|
315
|
-
if (end === 'from') setValue({ from: date, to: to && to >= date ? to : undefined })
|
|
316
|
-
else if (!from || date < from) return false
|
|
317
|
-
else setValue({ from, to: date })
|
|
318
|
-
return true
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
/** What an editable end's input reports: a real date, `null` once emptied, or an Invalid Date. */
|
|
322
|
-
const typeEnd = (end: End) => (date: Date | null) => {
|
|
323
|
-
if (end === 'from') {
|
|
324
|
-
if (date === null) setValue(null)
|
|
325
|
-
else if (!isValid(date)) setValue({ from: date, to: value?.to })
|
|
326
|
-
else setValue({ from: date, to: to && to >= date ? to : undefined })
|
|
327
|
-
return
|
|
328
|
-
}
|
|
329
|
-
if (date === null) setValue(from ? { from, to: undefined } : null)
|
|
330
|
-
else setValue({ from: value?.from, to: date })
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
const dateText = (date: Date) =>
|
|
334
|
-
withTime
|
|
335
|
-
? `${format(date, 'PP', { locale })}, ${formatTime(date, locale, hourCycle)}`
|
|
336
|
-
: format(date, 'PP', { locale })
|
|
337
|
-
|
|
338
|
-
const displayOf = (from: Date | undefined, to: Date | undefined): ReactNode => {
|
|
339
|
-
if (!from) return ''
|
|
340
|
-
if (formatDate)
|
|
341
|
-
return (
|
|
342
|
-
<>
|
|
343
|
-
{formatDate(from)} – {to && formatDate(to)}
|
|
344
|
-
</>
|
|
345
|
-
)
|
|
346
|
-
if (!to) return `${dateText(from)} –`
|
|
347
|
-
return new Intl.DateTimeFormat(locale.code, {
|
|
348
|
-
dateStyle: 'medium',
|
|
349
|
-
...(withTime && { timeStyle: 'short', ...(hourCycle && { hourCycle }) }),
|
|
350
|
-
}).formatRange(from, to)
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
const endInput = (end: End, ariaLabel: string) => {
|
|
354
|
-
const own = end === 'from' ? fromInput : undefined
|
|
355
|
-
const formatted = end === 'from' ? from : to
|
|
356
|
-
const field = (
|
|
357
|
-
<PickerInput
|
|
358
|
-
ref={own}
|
|
359
|
-
aria-label={ariaLabel}
|
|
360
|
-
placeholder={end === 'from' ? placeholder : undefined}
|
|
361
|
-
formatted={formatted ? dateText(formatted) : ''}
|
|
362
|
-
onText={readEnd(end)}
|
|
363
|
-
onEnter={() => setOpen(false)}
|
|
364
|
-
onFocus={() => setActiveEnd(end)}
|
|
365
|
-
// With times, an end needs room for its whole text ("Oct 1, 2026, 12:00 AM"): below that the ends stack.
|
|
366
|
-
className={cn('min-w-0 flex-1', withTime && 'min-w-[10.5rem]')}
|
|
367
|
-
/>
|
|
368
|
-
)
|
|
369
|
-
// With times, the end the columns set is lit.
|
|
370
|
-
return withTime && activeEnd === end ? (
|
|
371
|
-
<FieldStateContext.Provider value={ACTIVE_END}>{field}</FieldStateContext.Provider>
|
|
372
|
-
) : (
|
|
373
|
-
field
|
|
374
|
-
)
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
const header = (
|
|
378
|
-
<div className={cn('flex min-w-0 flex-1 items-center', withTime && 'flex-wrap gap-y-1')}>
|
|
379
|
-
{endInput('from', startLabel)}
|
|
380
|
-
<span aria-hidden className="px-0.5 text-muted-foreground">
|
|
381
|
-
–
|
|
382
|
-
</span>
|
|
383
|
-
{endInput('to', endLabel)}
|
|
384
|
-
</div>
|
|
385
|
-
)
|
|
386
|
-
|
|
387
|
-
const isInvalid = invalidOf(invalid, control['aria-invalid'])
|
|
388
|
-
const attributes = controlAttributes(control)
|
|
389
|
-
const labelFor = (props: DateRangeInputProps | undefined, fallback: string) =>
|
|
390
|
-
props?.['aria-label'] ??
|
|
391
|
-
control['aria-label'] ??
|
|
392
|
-
((props?.['aria-labelledby'] ?? control['aria-labelledby']) ? undefined : fallback)
|
|
393
|
-
|
|
394
|
-
// The picker's `ref` is the start input's too.
|
|
395
|
-
const startRef = useMemo(() => assignRefs<HTMLInputElement>(ref, startInputProps?.ref), [ref, startInputProps?.ref])
|
|
396
|
-
|
|
397
|
-
const masked = (end: End, props: DateRangeInputProps | undefined) => {
|
|
398
|
-
const { ref: inputRef, ...rest } = props ?? {}
|
|
399
|
-
return (
|
|
400
|
-
<MaskedDateInput
|
|
401
|
-
ref={end === 'from' ? startRef : inputRef}
|
|
402
|
-
{...attributes}
|
|
403
|
-
id={end === 'from' ? id : undefined}
|
|
404
|
-
required={control.required}
|
|
405
|
-
{...rest}
|
|
406
|
-
aria-label={labelFor(props, end === 'from' ? startLabel : endLabel)}
|
|
407
|
-
aria-invalid={isInvalid || unreadable[end] || typedInvalid[end] || undefined}
|
|
408
|
-
value={(end === 'from' ? from : real(value?.to)) ?? null}
|
|
409
|
-
externallyInvalid={unreadable[end]}
|
|
410
|
-
onValueChange={typeEnd(end)}
|
|
411
|
-
onInvalidChange={flag => setTypedInvalid(state => ({ ...state, [end]: flag }))}
|
|
412
|
-
locale={locale}
|
|
413
|
-
withTime={withTime}
|
|
414
|
-
allowed={date => allowed(date) && (end === 'from' || !from || date >= from)}
|
|
415
|
-
disabled={off || rest.disabled}
|
|
416
|
-
readOnly={readOnly || rest.readOnly}
|
|
417
|
-
className={cn('text-center', rest.className)}
|
|
418
|
-
/>
|
|
419
|
-
)
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
const editor = editable ? (
|
|
423
|
-
<>
|
|
424
|
-
{masked('from', startInputProps)}
|
|
425
|
-
<span aria-hidden className={cn('shrink-0 text-muted-foreground', sizeClasses.text)}>
|
|
426
|
-
–
|
|
427
|
-
</span>
|
|
428
|
-
{masked('to', endInputProps)}
|
|
429
|
-
</>
|
|
430
|
-
) : undefined
|
|
431
|
-
|
|
432
|
-
const iso = (date: Date | undefined) => (date ? format(date, withTime ? "yyyy-MM-dd'T'HH:mm" : 'yyyy-MM-dd') : '')
|
|
433
|
-
|
|
434
|
-
const shell = (
|
|
435
|
-
<PickerShell
|
|
436
|
-
open={open}
|
|
437
|
-
onOpenChange={setOpen}
|
|
438
|
-
size={size}
|
|
439
|
-
variant={variant}
|
|
440
|
-
invalid={editable ? isInvalid || showInvalid : isInvalid}
|
|
441
|
-
disabled={off}
|
|
442
|
-
readOnly={readOnly}
|
|
443
|
-
icon="calendar"
|
|
444
|
-
display={displayOf(from, to)}
|
|
445
|
-
placeholder={placeholder}
|
|
446
|
-
header={header}
|
|
447
|
-
initialFocus={fromInput}
|
|
448
|
-
editor={editor}
|
|
449
|
-
triggerLabel={labels?.calendar ?? 'Open calendar'}
|
|
450
|
-
closeLabel={labels?.close}
|
|
451
|
-
controlRef={ref as Ref<HTMLButtonElement>}
|
|
452
|
-
controlProps={editable ? undefined : attributes}
|
|
453
|
-
formValues={[
|
|
454
|
-
{ slot: 'start', name: startName ?? name, value: iso(from) },
|
|
455
|
-
{ slot: 'end', name: endName ?? name, value: iso(to) },
|
|
456
|
-
]}
|
|
457
|
-
required={control.required}
|
|
458
|
-
id={id}
|
|
459
|
-
dir={dir}
|
|
460
|
-
from={growFrom}
|
|
461
|
-
effect={effect}
|
|
462
|
-
hideSource={hideSource}
|
|
463
|
-
tier={tier}
|
|
464
|
-
className={className}
|
|
465
|
-
>
|
|
466
|
-
<Calendar
|
|
467
|
-
mode="range"
|
|
468
|
-
locale={locale}
|
|
469
|
-
selected={from ? { from, to } : undefined}
|
|
470
|
-
// The range is ours to build (two clicks, then close); DayPicker's own
|
|
471
|
-
// range logic would keep extending it.
|
|
472
|
-
onSelect={(_, day) => pick(day)}
|
|
473
|
-
disabled={days}
|
|
474
|
-
hidden={hidden}
|
|
475
|
-
startMonth={startMonth}
|
|
476
|
-
endMonth={endMonth}
|
|
477
|
-
dir={dir}
|
|
478
|
-
columnsSide={columnsSide}
|
|
479
|
-
columnLabels={labels}
|
|
480
|
-
extraColumnsSide={timeColumnsSide}
|
|
481
|
-
extraColumns={
|
|
482
|
-
withTime
|
|
483
|
-
? orientation => {
|
|
484
|
-
const end = activeEnd === 'from' ? from : to
|
|
485
|
-
return (
|
|
486
|
-
<TimeColumns
|
|
487
|
-
value={end ? timeOf(end, START_TIME) : null}
|
|
488
|
-
onValueChange={setTime}
|
|
489
|
-
hourCycle={hourCycle ?? hourCycleOf(locale)}
|
|
490
|
-
minuteStep={minuteStep}
|
|
491
|
-
locale={locale}
|
|
492
|
-
orientation={orientation}
|
|
493
|
-
labels={labels}
|
|
494
|
-
/>
|
|
495
|
-
)
|
|
496
|
-
}
|
|
497
|
-
: undefined
|
|
498
|
-
}
|
|
499
|
-
/>
|
|
500
|
-
</PickerShell>
|
|
501
|
-
)
|
|
502
|
-
|
|
503
|
-
// As DatePicker's: the caption is a sibling, so the field never remounts as it comes and goes.
|
|
504
|
-
return (
|
|
505
|
-
<>
|
|
506
|
-
{shell}
|
|
507
|
-
{editable && showInvalid && invalidCaption !== null && (
|
|
508
|
-
<p
|
|
509
|
-
role="alert"
|
|
510
|
-
className={cn(
|
|
511
|
-
'mt-1 weight-medium text-destructive',
|
|
512
|
-
sizeClasses.variant === 'compact' ? 'text-caption-compact' : 'text-caption',
|
|
513
|
-
)}
|
|
514
|
-
>
|
|
515
|
-
{invalidCaption}
|
|
516
|
-
</p>
|
|
517
|
-
)}
|
|
518
|
-
</>
|
|
519
|
-
)
|
|
520
|
-
})
|
|
521
|
-
|
|
522
|
-
export type { DateRangeInputProps, DateRangePickerLabels, DateRangePickerProps }
|
|
523
|
-
export { DateRangePicker }
|
|
524
|
-
|
|
525
|
-
export default DateRangePicker
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import DurationPicker from './index'
|
|
2
|
-
import { de } from 'react-day-picker/locale'
|
|
3
|
-
|
|
4
|
-
# Basic
|
|
5
|
-
|
|
6
|
-
<div className="w-60 max-w-full">
|
|
7
|
-
<DurationPicker defaultValue={{ hours: 1, minutes: 30 }} />
|
|
8
|
-
</div>
|
|
9
|
-
|
|
10
|
-
# German, up to 8 hours
|
|
11
|
-
|
|
12
|
-
`maxHours` ends the hour column; `minuteStep` thins the minutes.
|
|
13
|
-
|
|
14
|
-
<div className="w-60 max-w-full">
|
|
15
|
-
<DurationPicker locale={de} maxHours={8} minuteStep={15} placeholder="Dauer" />
|
|
16
|
-
</div>
|
|
17
|
-
|
|
18
|
-
# Half hours, from one hour
|
|
19
|
-
|
|
20
|
-
`minHours` starts the hour column and `hourStep` thins it; `formatValue` writes the field's text.
|
|
21
|
-
|
|
22
|
-
<div className="w-60 max-w-full">
|
|
23
|
-
<DurationPicker
|
|
24
|
-
minHours={1}
|
|
25
|
-
maxHours={12}
|
|
26
|
-
hourStep={2}
|
|
27
|
-
minuteStep={30}
|
|
28
|
-
formatValue={value => value.hours + ' h ' + String(value.minutes).padStart(2, '0') + ' min'}
|
|
29
|
-
defaultValue={{ hours: 3, minutes: 30 }}
|
|
30
|
-
/>
|
|
31
|
-
</div>
|
|
32
|
-
|
|
33
|
-
# Slovak labels, read only
|
|
34
|
-
|
|
35
|
-
`labels` names the columns and the panel's input; `readOnly` shows the duration and never opens.
|
|
36
|
-
|
|
37
|
-
<div className="flex w-60 max-w-full flex-col gap-2">
|
|
38
|
-
<DurationPicker locale="sk" labels={{ duration: 'Trvanie', hour: 'Hodiny', minute: 'Minúty', close: 'Zavrieť' }} placeholder="Trvanie" />
|
|
39
|
-
<DurationPicker readOnly defaultValue={{ hours: 2, minutes: 15 }} />
|
|
40
|
-
</div>
|