@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,476 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Local addition (not part of Fluid Functionalism): a date field over the
|
|
3
|
-
* scrolling Calendar (react-day-picker). Props after shadcn's date picker
|
|
4
|
-
* and utegsk/ui's DatePicker (`withTime`, `hourCycle`), kept in line with the
|
|
5
|
-
* other pickers here.
|
|
6
|
-
*
|
|
7
|
-
* `editable` (after utegsk/ui's): the field is a numeric text input over the
|
|
8
|
-
* locale's date mask (`masked-date-input.tsx`), and its calendar icon is the
|
|
9
|
-
* button that opens the panel. `value` also takes a string; one that reads as
|
|
10
|
-
* no date, like an Invalid Date, shows the invalid state and its caption.
|
|
11
|
-
* Every label is a prop (`labels`), the field's text a `formatDate`, and an
|
|
12
|
-
* optional row under the calendar (`actions`) picks today or clears.
|
|
13
|
-
* `hidden` days, `required` / `unselectable`, the form props and a string
|
|
14
|
-
* `locale` follow utegsk/ui's 0.14 DatePicker.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { endOfMonth, format, isValid, type Locale, parseISO, set, startOfDay } from 'date-fns'
|
|
18
|
-
import {
|
|
19
|
-
type ForwardRefExoticComponent,
|
|
20
|
-
forwardRef,
|
|
21
|
-
type ReactNode,
|
|
22
|
-
type Ref,
|
|
23
|
-
type RefAttributes,
|
|
24
|
-
type RefObject,
|
|
25
|
-
useRef,
|
|
26
|
-
useState,
|
|
27
|
-
} from 'react'
|
|
28
|
-
import { dateMatchModifiers, type Matcher } from 'react-day-picker'
|
|
29
|
-
import {
|
|
30
|
-
defaultLocale,
|
|
31
|
-
formatTime,
|
|
32
|
-
type HourCycle,
|
|
33
|
-
hourCycleOf,
|
|
34
|
-
parseDateText,
|
|
35
|
-
parseTimeText,
|
|
36
|
-
resolveLocale,
|
|
37
|
-
} from '../../../../lib/date-locale'
|
|
38
|
-
import type { FieldVariant } from '../../../../lib/field-classes'
|
|
39
|
-
import { type SizeVariant, useSize } from '../../../../lib/size-context'
|
|
40
|
-
import { useControllableState } from '../../../../lib/use-controllable-state'
|
|
41
|
-
import { cn } from '../../../../lib/utils'
|
|
42
|
-
import Button from '../../../button'
|
|
43
|
-
import Calendar from '../calendar'
|
|
44
|
-
import { controlAttributes, invalidOf, type PickerControlProps, PickerInput, PickerShell } from '../picker-shell'
|
|
45
|
-
import { TimeColumns } from '../time-columns'
|
|
46
|
-
import { MaskedDateInput } from './masked-date-input'
|
|
47
|
-
|
|
48
|
-
/** Every word the picker shows or announces, for translating it. */
|
|
49
|
-
interface DatePickerLabels {
|
|
50
|
-
/** Names the date field (and the panel's date input). Defaults to the `placeholder`, else `"Date"`. */
|
|
51
|
-
date?: string
|
|
52
|
-
/** Names the panel's time input. Defaults to `"Time"`. */
|
|
53
|
-
time?: 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
|
-
/** The `actions` row's button that picks today. Defaults to `"Today"`. */
|
|
67
|
-
today?: string
|
|
68
|
-
/** The `actions` row's button that empties the field. Defaults to `"Clear"`. */
|
|
69
|
-
clear?: string
|
|
70
|
-
/** Caption under a field holding no real date, rendered as the field's next sibling; `null` keeps only the destructive ring. Defaults to `"Invalid date"`. */
|
|
71
|
-
invalid?: ReactNode
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
interface DatePickerProps extends PickerControlProps {
|
|
75
|
-
/** The picked date (and time, with `withTime`); `null` when empty. A string is read as a date: a bare `"2026-10-09"` as that day at local midnight, a full timestamp as written; one that reads as none shows the invalid state. */
|
|
76
|
-
value?: Date | string | null
|
|
77
|
-
/** Initial date, for an uncontrolled picker; a string reads as `value`'s does. Defaults to `null`. */
|
|
78
|
-
defaultValue?: Date | string | null
|
|
79
|
-
/** Called with the new date, or `null` when the field is cleared. An `editable` field left with an incomplete or impossible date reports an Invalid Date (`isNaN(date.getTime())`), so a form can reject it. */
|
|
80
|
-
onValueChange?: (value: Date | null) => void
|
|
81
|
-
/** The field is a text input to type the date into, in the locale's numeric order ("09.10.2026", "10/09/2026"); its calendar icon opens the panel. Defaults to `false`. */
|
|
82
|
-
editable?: boolean
|
|
83
|
-
/** The field's text for a date, in place of the locale's medium format: `(date) => …`. */
|
|
84
|
-
formatDate?: (date: Date) => ReactNode
|
|
85
|
-
/** Every word the picker shows or announces (`date`, `time`, `calendar`, `close`, `month`, `year`, `hour`, `minute`, `today`, `clear`, `invalid`), for translating it. Defaults to English and the locale's field names. */
|
|
86
|
-
labels?: DatePickerLabels
|
|
87
|
-
/** Adds a row under the calendar with Today and Clear. Defaults to `false`. */
|
|
88
|
-
actions?: boolean
|
|
89
|
-
/** Shows the value but never opens or takes typing. Defaults to `false`. */
|
|
90
|
-
readOnly?: boolean
|
|
91
|
-
/** Adds hour and minute columns, and the time to the field. Defaults to `false`. */
|
|
92
|
-
withTime?: boolean
|
|
93
|
-
/** The clock for the time: on `'h12'` / `'h11'` the hours read with AM/PM. Defaults to the locale's. */
|
|
94
|
-
hourCycle?: HourCycle
|
|
95
|
-
/** Steps between the minute column's options. Defaults to `1`. */
|
|
96
|
-
minuteStep?: number
|
|
97
|
-
/** A react-day-picker / date-fns locale (`import { de } from 'react-day-picker/locale'`), or a BCP 47 tag (`"sk"`) read through Intl: names, formats, the week's first day and what typing reads (a tag reads numeric dates and English names). 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 (a date, `{ before }`, `{ dayOfWeek }`, a function…) 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
|
-
/** Marks the value required: a native form won't submit while it is empty, an editable field's input carries `required`, and pressing the picked day again keeps it. Defaults to the surrounding Field's `required`. */
|
|
106
|
-
required?: boolean
|
|
107
|
-
/** A picked date can't be cleared: pressing its day again, emptying the text or Clear (hidden) all keep it. Defaults to `false`. */
|
|
108
|
-
unselectable?: boolean
|
|
109
|
-
/** Names the value for a native form: a hidden input carries it as `"yyyy-MM-dd"` (with `withTime`, `"yyyy-MM-ddTHH:mm"`), an `<input type="date">`'s value; empty while there is no real date. */
|
|
110
|
-
name?: string
|
|
111
|
-
/** The first month the calendar reaches. Defaults to 100 years back. */
|
|
112
|
-
startMonth?: Date
|
|
113
|
-
/** The last month the calendar reaches. Defaults to 50 years ahead. */
|
|
114
|
-
endMonth?: Date
|
|
115
|
-
/** Framed at rest, or invisible until hovered or focused. Defaults to `"bordered"`. */
|
|
116
|
-
variant?: FieldVariant
|
|
117
|
-
/** Marks the field invalid. Defaults to `false`. */
|
|
118
|
-
invalid?: boolean
|
|
119
|
-
/** Pins the field and its panel to one step of the size ladder. Defaults to the surrounding SizeProvider. */
|
|
120
|
-
size?: SizeVariant
|
|
121
|
-
/** Controlled open state. */
|
|
122
|
-
open?: boolean
|
|
123
|
-
/** Initial open state, for an uncontrolled panel. Defaults to `false`. */
|
|
124
|
-
defaultOpen?: boolean
|
|
125
|
-
/** Called when the panel opens or closes. */
|
|
126
|
-
onOpenChange?: (open: boolean) => void
|
|
127
|
-
/** Text direction of the panel; `'rtl'` mirrors it. */
|
|
128
|
-
dir?: 'ltr' | 'rtl'
|
|
129
|
-
/** Which side of the days the month and year columns stand on. Defaults to `'end'`. */
|
|
130
|
-
columnsSide?: 'start' | 'end'
|
|
131
|
-
/** 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'`. */
|
|
132
|
-
timeColumnsSide?: 'start' | 'end'
|
|
133
|
-
/** Id of the field's control (its button, or an `editable` field's input), for a `Label`'s `htmlFor`. */
|
|
134
|
-
id?: string
|
|
135
|
-
/** 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). */
|
|
136
|
-
from?: 'trigger' | 'pointer' | 'center' | 'top' | 'right' | 'bottom' | 'left' | RefObject<HTMLElement | null>
|
|
137
|
-
/** 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'`. */
|
|
138
|
-
effect?: 'goo' | 'morph' | 'slide' | 'fade'
|
|
139
|
-
/** Hide the field while open, so it reads as turning into the panel. Defaults to `false`. */
|
|
140
|
-
hideSource?: boolean
|
|
141
|
-
/** Spring tier of a plain morph, slide or fade; goo runs on its own `spring.goo`. Defaults to `'moderate'`. */
|
|
142
|
-
tier?: 'moderate' | 'slow'
|
|
143
|
-
/** Classes for the field. */
|
|
144
|
-
className?: string
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* A value as a date: `null` when empty, an Invalid Date when it reads as
|
|
149
|
-
* none. A bare `yyyy-MM-dd` is that day at local midnight (`new Date` would
|
|
150
|
-
* read it as UTC midnight: the day before, west of UTC).
|
|
151
|
-
*/
|
|
152
|
-
function toDate(value: Date | string | null) {
|
|
153
|
-
if (value === null || value === '') return null
|
|
154
|
-
if (value instanceof Date) return value
|
|
155
|
-
return /^\d{4}-\d{2}-\d{2}$/.test(value) ? parseISO(value) : new Date(value)
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/** Keeps `from`'s time of day on a newly picked day. */
|
|
159
|
-
const keepTime = (day: Date, from: Date | null) =>
|
|
160
|
-
set(day, { hours: from?.getHours() ?? 0, minutes: from?.getMinutes() ?? 0, seconds: 0, milliseconds: 0 })
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* A date field that opens a scrolling calendar, with an optional time.
|
|
164
|
-
*
|
|
165
|
-
* Pressing the field opens its panel the way Combobox opens its list (goo out
|
|
166
|
-
* of the field; `effect="morph"` with `hideSource` turns the field into it in
|
|
167
|
-
* place): the date as text, selected and ready to type over, above a Calendar
|
|
168
|
-
* whose months scroll past with month and year columns beside them. Typing
|
|
169
|
-
* reads the date in the locale's own formats ("9.10.2026", "9 Oct 2026",
|
|
170
|
-
* "October 9, 2026") and scrolls the calendar to it; picking a day commits it
|
|
171
|
-
* and closes the panel. `withTime` adds the time beside the date and hour and
|
|
172
|
-
* minute columns (the hours read with AM/PM on a 12-hour clock), and keeps the
|
|
173
|
-
* panel open while you set both. `columnsSide` and `timeColumnsSide` stand
|
|
174
|
-
* either set of columns before or after the days. On a phone the panel is a
|
|
175
|
-
* bottom sheet, its columns turned into strips above the days.
|
|
176
|
-
*
|
|
177
|
-
* `editable` turns the field into a text input: type the digits and the
|
|
178
|
-
* locale's separators fall into place ("09.10.2026" in German,
|
|
179
|
-
* "10/09/2026" in English), with the rest of the mask muted after the caret;
|
|
180
|
-
* the calendar icon opens the panel. A date that can't exist, or one left
|
|
181
|
-
* half typed, turns the field destructive with a caption under it, and so
|
|
182
|
-
* does a `value` that reads as no date. `actions` adds Today and Clear under
|
|
183
|
-
* the calendar.
|
|
184
|
-
*
|
|
185
|
-
* Localized through `locale`, a react-day-picker locale: month and weekday
|
|
186
|
-
* names, the formats shown and read, the week's first day and the clock all
|
|
187
|
-
* follow it, and `dir="rtl"` mirrors the panel. Every word it shows or
|
|
188
|
-
* announces comes from `labels`, and `formatDate` writes the field's text.
|
|
189
|
-
*
|
|
190
|
-
* `hidden` days leave gaps in the calendar and can't be typed. `required`
|
|
191
|
-
* keeps the picked day when it is pressed again and stops an empty native
|
|
192
|
-
* form submit; `unselectable` keeps a picked date from being cleared at all.
|
|
193
|
-
* `name` submits the value through a hidden input (`"yyyy-MM-dd"`, or
|
|
194
|
-
* `"yyyy-MM-ddTHH:mm"` with time), and `id`, the `aria-*` props, `onBlur`,
|
|
195
|
-
* `controlProps` and the `ref` reach the field's control: the button that
|
|
196
|
-
* opens the panel, or an `editable` field's input. `locale` also takes a
|
|
197
|
-
* BCP 47 tag ("sk"), read through Intl.
|
|
198
|
-
*
|
|
199
|
-
* The invalid caption renders as the field's next sibling rather than inside
|
|
200
|
-
* a wrapper, so the field keeps its place in a flex row or grid exactly as
|
|
201
|
-
* before and an input being typed into never remounts when the caption comes
|
|
202
|
-
* and goes. Lay the picker in a column (or wrap it) where the caption should
|
|
203
|
-
* sit under the field.
|
|
204
|
-
*
|
|
205
|
-
* @example {@include ./examples.mdx}
|
|
206
|
-
*/
|
|
207
|
-
const DatePicker: ForwardRefExoticComponent<DatePickerProps & RefAttributes<HTMLButtonElement | HTMLInputElement>> =
|
|
208
|
-
forwardRef<HTMLButtonElement | HTMLInputElement, DatePickerProps>(function DatePicker(
|
|
209
|
-
{
|
|
210
|
-
value: valueProp,
|
|
211
|
-
defaultValue = null,
|
|
212
|
-
onValueChange,
|
|
213
|
-
editable = false,
|
|
214
|
-
formatDate,
|
|
215
|
-
labels,
|
|
216
|
-
actions = false,
|
|
217
|
-
readOnly = false,
|
|
218
|
-
withTime = false,
|
|
219
|
-
hourCycle,
|
|
220
|
-
minuteStep = 1,
|
|
221
|
-
locale: localeProp = defaultLocale,
|
|
222
|
-
placeholder,
|
|
223
|
-
disabled,
|
|
224
|
-
hidden,
|
|
225
|
-
required,
|
|
226
|
-
unselectable = false,
|
|
227
|
-
name,
|
|
228
|
-
startMonth,
|
|
229
|
-
endMonth,
|
|
230
|
-
variant,
|
|
231
|
-
invalid,
|
|
232
|
-
size,
|
|
233
|
-
open: openProp,
|
|
234
|
-
defaultOpen = false,
|
|
235
|
-
onOpenChange,
|
|
236
|
-
dir,
|
|
237
|
-
columnsSide,
|
|
238
|
-
timeColumnsSide,
|
|
239
|
-
id,
|
|
240
|
-
from,
|
|
241
|
-
effect,
|
|
242
|
-
hideSource,
|
|
243
|
-
tier,
|
|
244
|
-
className,
|
|
245
|
-
...control
|
|
246
|
-
},
|
|
247
|
-
ref,
|
|
248
|
-
) {
|
|
249
|
-
const [raw, setRaw] = useControllableState<Date | string | null>(
|
|
250
|
-
valueProp,
|
|
251
|
-
defaultValue,
|
|
252
|
-
onValueChange as ((value: Date | string | null) => void) | undefined,
|
|
253
|
-
)
|
|
254
|
-
const locale = resolveLocale(localeProp)
|
|
255
|
-
const [open, setOpen] = useControllableState(openProp, defaultOpen, onOpenChange)
|
|
256
|
-
const [typedInvalid, setTypedInvalid] = useState(false)
|
|
257
|
-
const sizeClasses = useSize(size)
|
|
258
|
-
const dateInput = useRef<HTMLInputElement>(null)
|
|
259
|
-
const date = toDate(raw)
|
|
260
|
-
const unreadable = date !== null && !isValid(date)
|
|
261
|
-
// The picked date, when there is a real one.
|
|
262
|
-
const value = unreadable ? null : date
|
|
263
|
-
// `unselectable`: a real date is never cleared.
|
|
264
|
-
const setValue = (next: Date | null) => {
|
|
265
|
-
if (next === null && unselectable && value) return
|
|
266
|
-
setRaw(next)
|
|
267
|
-
}
|
|
268
|
-
const showInvalid = unreadable || typedInvalid
|
|
269
|
-
const dateLabel = labels?.date || placeholder || 'Date'
|
|
270
|
-
const invalidCaption = labels?.invalid === undefined ? 'Invalid date' : labels.invalid
|
|
271
|
-
// `true` turns the field off; any other matcher picks out days.
|
|
272
|
-
const off = typeof disabled === 'boolean' && disabled
|
|
273
|
-
const days = off ? undefined : disabled
|
|
274
|
-
|
|
275
|
-
const allowed = (date: Date) =>
|
|
276
|
-
(!startMonth || date >= startMonth) &&
|
|
277
|
-
(!endMonth || date <= endOfMonth(endMonth)) &&
|
|
278
|
-
!(days && dateMatchModifiers(date, days)) &&
|
|
279
|
-
!(hidden && dateMatchModifiers(date, hidden))
|
|
280
|
-
|
|
281
|
-
const readDate = (text: string) => {
|
|
282
|
-
if (!text.trim()) {
|
|
283
|
-
if (unselectable && value) return false
|
|
284
|
-
setValue(null)
|
|
285
|
-
return true
|
|
286
|
-
}
|
|
287
|
-
const date = parseDateText(text, locale, value ?? undefined)
|
|
288
|
-
if (!date || !allowed(date)) return false
|
|
289
|
-
setValue(withTime ? keepTime(date, value) : date)
|
|
290
|
-
return true
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
const readTime = (text: string) => {
|
|
294
|
-
const time = parseTimeText(text, locale, value ?? new Date())
|
|
295
|
-
if (!time) return false
|
|
296
|
-
setValue(time)
|
|
297
|
-
return true
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
const header = (
|
|
301
|
-
<>
|
|
302
|
-
<PickerInput
|
|
303
|
-
ref={dateInput}
|
|
304
|
-
aria-label={dateLabel}
|
|
305
|
-
placeholder={placeholder}
|
|
306
|
-
formatted={value ? format(value, 'PP', { locale }) : ''}
|
|
307
|
-
onText={readDate}
|
|
308
|
-
onEnter={() => setOpen(false)}
|
|
309
|
-
className="flex-1"
|
|
310
|
-
/>
|
|
311
|
-
{withTime && (
|
|
312
|
-
<PickerInput
|
|
313
|
-
aria-label={labels?.time ?? 'Time'}
|
|
314
|
-
formatted={value ? formatTime(value, locale, hourCycle) : ''}
|
|
315
|
-
onText={readTime}
|
|
316
|
-
onEnter={() => setOpen(false)}
|
|
317
|
-
className="w-28 shrink-0"
|
|
318
|
-
/>
|
|
319
|
-
)}
|
|
320
|
-
</>
|
|
321
|
-
)
|
|
322
|
-
|
|
323
|
-
const isInvalid = invalidOf(invalid, control['aria-invalid'])
|
|
324
|
-
const attributes = controlAttributes(control)
|
|
325
|
-
|
|
326
|
-
const editor = editable ? (
|
|
327
|
-
<MaskedDateInput
|
|
328
|
-
ref={ref as Ref<HTMLInputElement>}
|
|
329
|
-
{...attributes}
|
|
330
|
-
id={id}
|
|
331
|
-
aria-label={control['aria-label'] ?? (control['aria-labelledby'] ? undefined : dateLabel)}
|
|
332
|
-
aria-invalid={isInvalid || showInvalid || undefined}
|
|
333
|
-
required={required}
|
|
334
|
-
value={value}
|
|
335
|
-
externallyInvalid={unreadable}
|
|
336
|
-
onValueChange={setValue}
|
|
337
|
-
onInvalidChange={setTypedInvalid}
|
|
338
|
-
locale={locale}
|
|
339
|
-
withTime={withTime}
|
|
340
|
-
allowed={allowed}
|
|
341
|
-
disabled={off}
|
|
342
|
-
readOnly={readOnly}
|
|
343
|
-
clearable={!unselectable}
|
|
344
|
-
/>
|
|
345
|
-
) : undefined
|
|
346
|
-
|
|
347
|
-
const shell = (
|
|
348
|
-
<PickerShell
|
|
349
|
-
open={open}
|
|
350
|
-
onOpenChange={setOpen}
|
|
351
|
-
size={size}
|
|
352
|
-
variant={variant}
|
|
353
|
-
invalid={isInvalid || showInvalid}
|
|
354
|
-
disabled={off}
|
|
355
|
-
readOnly={readOnly}
|
|
356
|
-
icon="calendar"
|
|
357
|
-
display={
|
|
358
|
-
value
|
|
359
|
-
? (formatDate?.(value) ??
|
|
360
|
-
(withTime
|
|
361
|
-
? `${format(value, 'PP', { locale })}, ${formatTime(value, locale, hourCycle)}`
|
|
362
|
-
: format(value, 'PP', { locale })))
|
|
363
|
-
: ''
|
|
364
|
-
}
|
|
365
|
-
controlRef={ref as Ref<HTMLButtonElement>}
|
|
366
|
-
controlProps={editable ? undefined : attributes}
|
|
367
|
-
formValues={[
|
|
368
|
-
{ slot: 'value', name, value: value ? format(value, withTime ? "yyyy-MM-dd'T'HH:mm" : 'yyyy-MM-dd') : '' },
|
|
369
|
-
]}
|
|
370
|
-
required={required}
|
|
371
|
-
placeholder={placeholder}
|
|
372
|
-
header={header}
|
|
373
|
-
initialFocus={dateInput}
|
|
374
|
-
editor={editor}
|
|
375
|
-
triggerLabel={labels?.calendar ?? 'Open calendar'}
|
|
376
|
-
closeLabel={labels?.close}
|
|
377
|
-
id={id}
|
|
378
|
-
dir={dir}
|
|
379
|
-
from={from}
|
|
380
|
-
effect={effect}
|
|
381
|
-
hideSource={hideSource}
|
|
382
|
-
tier={tier}
|
|
383
|
-
className={className}
|
|
384
|
-
>
|
|
385
|
-
<Calendar
|
|
386
|
-
mode="single"
|
|
387
|
-
locale={locale}
|
|
388
|
-
selected={value ?? undefined}
|
|
389
|
-
onSelect={day => {
|
|
390
|
-
// Pressing the picked day again clears it, unless the date must stay.
|
|
391
|
-
if (!day && (required || unselectable) && value) {
|
|
392
|
-
if (!withTime) setOpen(false)
|
|
393
|
-
return
|
|
394
|
-
}
|
|
395
|
-
setValue(day ? (withTime ? keepTime(day, value) : day) : null)
|
|
396
|
-
if (day && !withTime) setOpen(false)
|
|
397
|
-
}}
|
|
398
|
-
disabled={days}
|
|
399
|
-
hidden={hidden}
|
|
400
|
-
columnLabels={labels}
|
|
401
|
-
startMonth={startMonth}
|
|
402
|
-
endMonth={endMonth}
|
|
403
|
-
dir={dir}
|
|
404
|
-
columnsSide={columnsSide}
|
|
405
|
-
extraColumnsSide={timeColumnsSide}
|
|
406
|
-
extraColumns={
|
|
407
|
-
withTime
|
|
408
|
-
? orientation => (
|
|
409
|
-
<TimeColumns
|
|
410
|
-
value={value && { hours: value.getHours(), minutes: value.getMinutes() }}
|
|
411
|
-
onValueChange={time => setValue(set(value ?? new Date(), { ...time, seconds: 0, milliseconds: 0 }))}
|
|
412
|
-
hourCycle={hourCycle ?? hourCycleOf(locale)}
|
|
413
|
-
minuteStep={minuteStep}
|
|
414
|
-
locale={locale}
|
|
415
|
-
orientation={orientation}
|
|
416
|
-
labels={labels}
|
|
417
|
-
/>
|
|
418
|
-
)
|
|
419
|
-
: undefined
|
|
420
|
-
}
|
|
421
|
-
/>
|
|
422
|
-
{actions && (
|
|
423
|
-
<div className="flex items-center justify-between gap-1 border-t border-border pt-1">
|
|
424
|
-
<Button
|
|
425
|
-
variant="ghost"
|
|
426
|
-
size={sizeClasses.variant === 'compact' ? 'xs' : 'compact'}
|
|
427
|
-
disabled={!allowed(startOfDay(new Date()))}
|
|
428
|
-
onClick={() => {
|
|
429
|
-
const today = startOfDay(new Date())
|
|
430
|
-
setValue(withTime ? keepTime(today, value) : today)
|
|
431
|
-
if (!withTime) setOpen(false)
|
|
432
|
-
}}
|
|
433
|
-
>
|
|
434
|
-
{labels?.today ?? 'Today'}
|
|
435
|
-
</Button>
|
|
436
|
-
{!unselectable && (
|
|
437
|
-
<Button
|
|
438
|
-
variant="ghost"
|
|
439
|
-
size={sizeClasses.variant === 'compact' ? 'xs' : 'compact'}
|
|
440
|
-
disabled={raw === null}
|
|
441
|
-
onClick={() => {
|
|
442
|
-
setValue(null)
|
|
443
|
-
setTypedInvalid(false)
|
|
444
|
-
}}
|
|
445
|
-
>
|
|
446
|
-
{labels?.clear ?? 'Clear'}
|
|
447
|
-
</Button>
|
|
448
|
-
)}
|
|
449
|
-
</div>
|
|
450
|
-
)}
|
|
451
|
-
</PickerShell>
|
|
452
|
-
)
|
|
453
|
-
|
|
454
|
-
// The caption is a sibling, so the field (and a focused input in it) never remounts as it comes and goes.
|
|
455
|
-
return (
|
|
456
|
-
<>
|
|
457
|
-
{shell}
|
|
458
|
-
{showInvalid && invalidCaption !== null && (
|
|
459
|
-
<p
|
|
460
|
-
role="alert"
|
|
461
|
-
className={cn(
|
|
462
|
-
'mt-1 weight-medium text-destructive',
|
|
463
|
-
sizeClasses.variant === 'compact' ? 'text-caption-compact' : 'text-caption',
|
|
464
|
-
)}
|
|
465
|
-
>
|
|
466
|
-
{invalidCaption}
|
|
467
|
-
</p>
|
|
468
|
-
)}
|
|
469
|
-
</>
|
|
470
|
-
)
|
|
471
|
-
})
|
|
472
|
-
|
|
473
|
-
export type { DatePickerLabels, DatePickerProps }
|
|
474
|
-
export { DatePicker }
|
|
475
|
-
|
|
476
|
-
export default DatePicker
|