@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,348 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Local addition (not part of Fluid Functionalism): the editable DatePicker's
|
|
3
|
-
* text field. Typing fills a numeric mask in the locale's own order
|
|
4
|
-
* ("DD.MM.YYYY", "MM/DD/YYYY", with "HH:mm" for a time); the rest of the mask
|
|
5
|
-
* shows muted after the caret. After utegsk/ui's `MaskedDateInput`
|
|
6
|
-
* (`packages/ui/src/components/form/calendar/date-input.client.tsx`). The caller's
|
|
7
|
-
* attributes (`type`, `inputMode`, `autoComplete`, …) are spread after
|
|
8
|
-
* the field's own defaults (`text`, `numeric`, `off`), so they win; the value, text and
|
|
9
|
-
* key handling stay the field's.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { getDate, getHours, getMinutes, getMonth, getYear, isValid, type Locale, set } from 'date-fns'
|
|
13
|
-
import {
|
|
14
|
-
type FocusEvent,
|
|
15
|
-
forwardRef,
|
|
16
|
-
type InputHTMLAttributes,
|
|
17
|
-
type KeyboardEvent,
|
|
18
|
-
useEffect,
|
|
19
|
-
useMemo,
|
|
20
|
-
useRef,
|
|
21
|
-
useState,
|
|
22
|
-
} from 'react'
|
|
23
|
-
import { useSize } from '../../../../lib/size-context'
|
|
24
|
-
import { cn } from '../../../../lib/utils'
|
|
25
|
-
|
|
26
|
-
type Part = 'day' | 'month' | 'year' | 'hour' | 'minute'
|
|
27
|
-
type Slot = { type: Part; width: number } | { type: 'literal'; value: string }
|
|
28
|
-
|
|
29
|
-
const PLACEHOLDER: Record<Part, string> = { day: 'DD', month: 'MM', year: 'YYYY', hour: 'HH', minute: 'mm' }
|
|
30
|
-
|
|
31
|
-
/** The locale's numeric date (and 24-hour time) as a mask: parts in order, literals between. */
|
|
32
|
-
function maskOf(locale: Locale, withTime: boolean): Slot[] {
|
|
33
|
-
const parts = new Intl.DateTimeFormat(locale.code, {
|
|
34
|
-
calendar: 'gregory',
|
|
35
|
-
numberingSystem: 'latn',
|
|
36
|
-
day: '2-digit',
|
|
37
|
-
month: '2-digit',
|
|
38
|
-
year: 'numeric',
|
|
39
|
-
...(withTime ? { hour: '2-digit', minute: '2-digit', hourCycle: 'h23' as const } : {}),
|
|
40
|
-
}).formatToParts(new Date(2006, 10, 22, 13, 45))
|
|
41
|
-
return parts.flatMap<Slot>(part => {
|
|
42
|
-
if (part.type === 'literal') return [{ type: 'literal', value: part.value }]
|
|
43
|
-
if (!(part.type in PLACEHOLDER)) return []
|
|
44
|
-
const type = part.type as Part
|
|
45
|
-
return [{ type, width: type === 'year' ? 4 : 2 }]
|
|
46
|
-
})
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/** Every digit the locale writes, mapped to its Latin twin, so "٢" types as "2". */
|
|
50
|
-
function digitsOf(locale: Locale) {
|
|
51
|
-
const format = new Intl.NumberFormat(locale.code, { useGrouping: false })
|
|
52
|
-
const map = new Map<string, string>()
|
|
53
|
-
for (let digit = 0; digit <= 9; digit++) {
|
|
54
|
-
map.set(String(digit), String(digit))
|
|
55
|
-
for (const char of format.format(digit)) if (/\p{Nd}/u.test(char)) map.set(char, String(digit))
|
|
56
|
-
}
|
|
57
|
-
return map
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const digitCount = (mask: Slot[]) => mask.reduce((n, slot) => n + (slot.type === 'literal' ? 0 : slot.width), 0)
|
|
61
|
-
|
|
62
|
-
/** The typed digits laid into the mask; a literal follows each finished part. */
|
|
63
|
-
function layout(digits: string, mask: Slot[]) {
|
|
64
|
-
let at = 0
|
|
65
|
-
let text = ''
|
|
66
|
-
for (const slot of mask) {
|
|
67
|
-
if (slot.type === 'literal') {
|
|
68
|
-
if (text) text += slot.value
|
|
69
|
-
continue
|
|
70
|
-
}
|
|
71
|
-
const chunk = digits.slice(at, at + slot.width)
|
|
72
|
-
if (!chunk) break
|
|
73
|
-
text += chunk
|
|
74
|
-
at += chunk.length
|
|
75
|
-
if (chunk.length < slot.width) break
|
|
76
|
-
}
|
|
77
|
-
return text.trimEnd()
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
function formatMasked(date: Date, mask: Slot[]) {
|
|
81
|
-
const values: Record<Part, number> = {
|
|
82
|
-
day: getDate(date),
|
|
83
|
-
month: getMonth(date) + 1,
|
|
84
|
-
year: getYear(date),
|
|
85
|
-
hour: getHours(date),
|
|
86
|
-
minute: getMinutes(date),
|
|
87
|
-
}
|
|
88
|
-
return mask
|
|
89
|
-
.map(slot => (slot.type === 'literal' ? slot.value : String(values[slot.type]).padStart(slot.width, '0')))
|
|
90
|
-
.join('')
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/** A complete set of digits as a date, keeping `base`'s time when the mask has none; `null` when no such day exists. */
|
|
94
|
-
function parseMasked(digits: string, mask: Slot[], base: Date | null): Date | null {
|
|
95
|
-
const values: Partial<Record<Part, number>> = {}
|
|
96
|
-
let at = 0
|
|
97
|
-
for (const slot of mask) {
|
|
98
|
-
if (slot.type === 'literal') continue
|
|
99
|
-
values[slot.type] = Number(digits.slice(at, at + slot.width))
|
|
100
|
-
at += slot.width
|
|
101
|
-
}
|
|
102
|
-
const { day = 0, month = 0, year = 0, hour, minute } = values
|
|
103
|
-
const date = set(base ?? new Date(0), {
|
|
104
|
-
year,
|
|
105
|
-
month: month - 1,
|
|
106
|
-
date: day,
|
|
107
|
-
hours: hour ?? base?.getHours() ?? 0,
|
|
108
|
-
minutes: minute ?? base?.getMinutes() ?? 0,
|
|
109
|
-
seconds: 0,
|
|
110
|
-
milliseconds: 0,
|
|
111
|
-
})
|
|
112
|
-
const exact =
|
|
113
|
-
isValid(date) &&
|
|
114
|
-
year >= 1000 &&
|
|
115
|
-
getYear(date) === year &&
|
|
116
|
-
getMonth(date) === month - 1 &&
|
|
117
|
-
getDate(date) === day &&
|
|
118
|
-
(hour === undefined || getHours(date) === hour) &&
|
|
119
|
-
(minute === undefined || getMinutes(date) === minute)
|
|
120
|
-
return exact ? date : null
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/** Puts the caret after the `count`th digit. */
|
|
124
|
-
function caretAfter(input: HTMLInputElement, count: number) {
|
|
125
|
-
requestAnimationFrame(() => {
|
|
126
|
-
let seen = 0
|
|
127
|
-
let i = 0
|
|
128
|
-
while (i < input.value.length && seen < count) {
|
|
129
|
-
if (/\p{Nd}/u.test(input.value[i] ?? '')) seen++
|
|
130
|
-
i++
|
|
131
|
-
}
|
|
132
|
-
input.setSelectionRange(i, i)
|
|
133
|
-
})
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
interface MaskedDateInputProps
|
|
137
|
-
extends Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'defaultValue' | 'onChange'> {
|
|
138
|
-
/** The committed date; `null` when empty. */
|
|
139
|
-
value: Date | null
|
|
140
|
-
/** The value from outside can't be read as a date: keep what was typed and stay invalid. */
|
|
141
|
-
externallyInvalid: boolean
|
|
142
|
-
/** A complete, real date; `null` once emptied; an Invalid Date when left incomplete or impossible (Escape then brings back the last real date). */
|
|
143
|
-
onValueChange: (value: Date | null) => void
|
|
144
|
-
/** Whether what is typed can't be a date (impossible, or left incomplete). */
|
|
145
|
-
onInvalidChange: (invalid: boolean) => void
|
|
146
|
-
locale: Locale
|
|
147
|
-
withTime: boolean
|
|
148
|
-
/** Whether a day may be picked (bounds, disabled days). */
|
|
149
|
-
allowed: (date: Date) => boolean
|
|
150
|
-
/** Whether emptying the text clears the date; when not, leaving it empty brings the date back. Defaults to `true`. */
|
|
151
|
-
clearable?: boolean
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/** A numeric text field over the locale's date mask. */
|
|
155
|
-
const MaskedDateInput = forwardRef<HTMLInputElement, MaskedDateInputProps>(
|
|
156
|
-
(
|
|
157
|
-
{
|
|
158
|
-
value,
|
|
159
|
-
externallyInvalid,
|
|
160
|
-
onValueChange,
|
|
161
|
-
onInvalidChange,
|
|
162
|
-
locale,
|
|
163
|
-
withTime,
|
|
164
|
-
allowed,
|
|
165
|
-
clearable = true,
|
|
166
|
-
onFocus,
|
|
167
|
-
onBlur,
|
|
168
|
-
onKeyDown,
|
|
169
|
-
placeholder,
|
|
170
|
-
className,
|
|
171
|
-
...props
|
|
172
|
-
},
|
|
173
|
-
ref,
|
|
174
|
-
) => {
|
|
175
|
-
const size = useSize()
|
|
176
|
-
const mask = useMemo(() => maskOf(locale, withTime), [locale, withTime])
|
|
177
|
-
const digitMap = useMemo(() => digitsOf(locale), [locale])
|
|
178
|
-
const full = digitCount(mask)
|
|
179
|
-
const formatted = value && isValid(value) ? formatMasked(value, mask) : ''
|
|
180
|
-
const [text, setText] = useState(formatted)
|
|
181
|
-
const [focused, setFocused] = useState(false)
|
|
182
|
-
// Typed text the value can't hold (incomplete, impossible): kept until replaced.
|
|
183
|
-
const keepText = useRef(false)
|
|
184
|
-
// The last real date, so Escape can bring it back after an invalid entry.
|
|
185
|
-
const lastValid = useRef<Date | null>(null)
|
|
186
|
-
if (value && isValid(value)) lastValid.current = value
|
|
187
|
-
// Whether the Invalid Date in `value` is one this field reported.
|
|
188
|
-
const emittedInvalid = useRef(false)
|
|
189
|
-
|
|
190
|
-
const emit = (next: Date | null) => {
|
|
191
|
-
emittedInvalid.current = next !== null && !isValid(next)
|
|
192
|
-
onValueChange(next)
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const digitsIn = (s: string) => Array.from(s, char => digitMap.get(char) ?? '').join('')
|
|
196
|
-
|
|
197
|
-
const flag = (invalid: boolean) => onInvalidChange(invalid)
|
|
198
|
-
|
|
199
|
-
// The value changed from outside (a calendar pick, a reset): show it.
|
|
200
|
-
useEffect(() => {
|
|
201
|
-
if (focused || (keepText.current && externallyInvalid)) return
|
|
202
|
-
keepText.current = false
|
|
203
|
-
setText(formatted)
|
|
204
|
-
flag(false)
|
|
205
|
-
}, [formatted, externallyInvalid, focused])
|
|
206
|
-
|
|
207
|
-
const commit = (digits: string) => {
|
|
208
|
-
const next = digits.slice(0, full)
|
|
209
|
-
setText(layout(next, mask))
|
|
210
|
-
if (!next) {
|
|
211
|
-
keepText.current = false
|
|
212
|
-
flag(false)
|
|
213
|
-
emit(null)
|
|
214
|
-
return
|
|
215
|
-
}
|
|
216
|
-
if (next.length < full) {
|
|
217
|
-
flag(false)
|
|
218
|
-
return
|
|
219
|
-
}
|
|
220
|
-
const date = parseMasked(next, mask, value && isValid(value) ? value : null)
|
|
221
|
-
const ok = !!date && allowed(date)
|
|
222
|
-
flag(!ok)
|
|
223
|
-
if (ok) {
|
|
224
|
-
keepText.current = false
|
|
225
|
-
emit(date)
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {
|
|
230
|
-
onKeyDown?.(e)
|
|
231
|
-
if (e.defaultPrevented || props.readOnly || props.disabled) return
|
|
232
|
-
const input = e.currentTarget
|
|
233
|
-
const start = input.selectionStart ?? text.length
|
|
234
|
-
const end = input.selectionEnd ?? start
|
|
235
|
-
const digits = digitsIn(text)
|
|
236
|
-
const from = digitsIn(text.slice(0, start)).length
|
|
237
|
-
const to = digitsIn(text.slice(0, end)).length
|
|
238
|
-
const typed = digitMap.get(e.key)
|
|
239
|
-
|
|
240
|
-
if (typed !== undefined) {
|
|
241
|
-
e.preventDefault()
|
|
242
|
-
// Overtype in place, so a fixed-width mask edits like a segmented field.
|
|
243
|
-
const next =
|
|
244
|
-
from === to
|
|
245
|
-
? from < digits.length
|
|
246
|
-
? digits.slice(0, from) + typed + digits.slice(from + 1)
|
|
247
|
-
: digits + typed
|
|
248
|
-
: digits.slice(0, from) + typed + digits.slice(to)
|
|
249
|
-
commit(next)
|
|
250
|
-
caretAfter(input, from + 1)
|
|
251
|
-
return
|
|
252
|
-
}
|
|
253
|
-
if (e.key === 'Escape') {
|
|
254
|
-
const restore = lastValid.current
|
|
255
|
-
const restored = restore ? formatMasked(restore, mask) : ''
|
|
256
|
-
// The picker hands an Invalid Date down as `null` + `externallyInvalid`.
|
|
257
|
-
const invalidNow = externallyInvalid || (value !== null && !isValid(value))
|
|
258
|
-
if (text === restored && !invalidNow) return
|
|
259
|
-
// Handled here: a surrounding Dialog must not close as well.
|
|
260
|
-
e.preventDefault()
|
|
261
|
-
e.stopPropagation()
|
|
262
|
-
keepText.current = false
|
|
263
|
-
setText(restored)
|
|
264
|
-
flag(false)
|
|
265
|
-
if (invalidNow && emittedInvalid.current) emit(restore)
|
|
266
|
-
return
|
|
267
|
-
}
|
|
268
|
-
if (e.key !== 'Backspace' && e.key !== 'Delete') return
|
|
269
|
-
let cutFrom = from
|
|
270
|
-
let cutTo = to
|
|
271
|
-
if (cutFrom === cutTo) {
|
|
272
|
-
if (e.key === 'Backspace') cutFrom = Math.max(0, cutFrom - 1)
|
|
273
|
-
else cutTo = Math.min(digits.length, cutTo + 1)
|
|
274
|
-
}
|
|
275
|
-
if (cutFrom === cutTo) return
|
|
276
|
-
e.preventDefault()
|
|
277
|
-
commit(digits.slice(0, cutFrom) + digits.slice(cutTo))
|
|
278
|
-
caretAfter(input, cutFrom)
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
const handleBlur = (e: FocusEvent<HTMLInputElement>) => {
|
|
282
|
-
setFocused(false)
|
|
283
|
-
const digits = digitsIn(text)
|
|
284
|
-
if (!digits && !clearable && formatted) {
|
|
285
|
-
setText(formatted)
|
|
286
|
-
flag(false)
|
|
287
|
-
onBlur?.(e)
|
|
288
|
-
return
|
|
289
|
-
}
|
|
290
|
-
const date = digits.length === full ? parseMasked(digits, mask, value && isValid(value) ? value : null) : null
|
|
291
|
-
if (digits && !(date && allowed(date))) {
|
|
292
|
-
// Left incomplete or impossible: say so, and let a form see it.
|
|
293
|
-
keepText.current = true
|
|
294
|
-
flag(true)
|
|
295
|
-
emit(new Date(Number.NaN))
|
|
296
|
-
}
|
|
297
|
-
onBlur?.(e)
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
const ghost =
|
|
301
|
-
placeholder === undefined
|
|
302
|
-
? mask.map(slot => (slot.type === 'literal' ? slot.value : PLACEHOLDER[slot.type])).join('')
|
|
303
|
-
: ''
|
|
304
|
-
|
|
305
|
-
return (
|
|
306
|
-
<span className="relative flex h-full min-w-0 flex-1 items-center">
|
|
307
|
-
{/* The rest of the mask, muted, right after what is typed. */}
|
|
308
|
-
{ghost && (
|
|
309
|
-
<span
|
|
310
|
-
aria-hidden
|
|
311
|
-
className={cn(
|
|
312
|
-
'pointer-events-none absolute inset-0 flex items-center overflow-hidden whitespace-pre tabular-nums',
|
|
313
|
-
size.text,
|
|
314
|
-
)}
|
|
315
|
-
>
|
|
316
|
-
<span className="invisible">{text}</span>
|
|
317
|
-
<span className="text-muted-foreground">{ghost.slice(text.length)}</span>
|
|
318
|
-
</span>
|
|
319
|
-
)}
|
|
320
|
-
<input
|
|
321
|
-
ref={ref}
|
|
322
|
-
type="text"
|
|
323
|
-
inputMode="numeric"
|
|
324
|
-
autoComplete="off"
|
|
325
|
-
{...props}
|
|
326
|
-
value={text}
|
|
327
|
-
placeholder={placeholder}
|
|
328
|
-
onChange={e => commit(digitsIn(e.target.value))}
|
|
329
|
-
onFocus={e => {
|
|
330
|
-
setFocused(true)
|
|
331
|
-
onFocus?.(e)
|
|
332
|
-
}}
|
|
333
|
-
onBlur={handleBlur}
|
|
334
|
-
onKeyDown={handleKeyDown}
|
|
335
|
-
className={cn(
|
|
336
|
-
'relative w-full min-w-0 bg-transparent tabular-nums text-foreground outline-none font-[inherit] placeholder:text-muted-foreground',
|
|
337
|
-
size.text,
|
|
338
|
-
className,
|
|
339
|
-
)}
|
|
340
|
-
/>
|
|
341
|
-
</span>
|
|
342
|
-
)
|
|
343
|
-
},
|
|
344
|
-
)
|
|
345
|
-
MaskedDateInput.displayName = 'MaskedDateInput'
|
|
346
|
-
|
|
347
|
-
export type { MaskedDateInputProps }
|
|
348
|
-
export { MaskedDateInput }
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import DateRangePicker from './index'
|
|
2
|
-
import { Label } from '../../input'
|
|
3
|
-
import { de } from 'react-day-picker/locale'
|
|
4
|
-
|
|
5
|
-
# Basics
|
|
6
|
-
|
|
7
|
-
## Basic
|
|
8
|
-
|
|
9
|
-
Click a start and an end; the days under the pointer preview the range.
|
|
10
|
-
|
|
11
|
-
<div className="w-80 max-w-full">
|
|
12
|
-
<DateRangePicker placeholder="Pick a range" />
|
|
13
|
-
</div>
|
|
14
|
-
|
|
15
|
-
## With a range
|
|
16
|
-
|
|
17
|
-
The field writes the range the way the locale does.
|
|
18
|
-
|
|
19
|
-
<div className="w-80 max-w-full">
|
|
20
|
-
<DateRangePicker defaultValue={{ from: new Date(2026, 9, 9), to: new Date(2026, 9, 15) }} />
|
|
21
|
-
</div>
|
|
22
|
-
|
|
23
|
-
## With time
|
|
24
|
-
|
|
25
|
-
`withTime` adds the times: the columns set the end being picked, lit in the header (focus an end's input to switch), and the panel stays open. `hourCycle` picks the clock for both the columns and the field.
|
|
26
|
-
|
|
27
|
-
<div className="w-96 max-w-full">
|
|
28
|
-
<DateRangePicker
|
|
29
|
-
withTime
|
|
30
|
-
hourCycle="h23"
|
|
31
|
-
minuteStep={15}
|
|
32
|
-
defaultValue={{ from: new Date(2026, 9, 9, 9, 0), to: new Date(2026, 9, 11, 17, 30) }}
|
|
33
|
-
/>
|
|
34
|
-
</div>
|
|
35
|
-
|
|
36
|
-
## Hidden days and read only
|
|
37
|
-
|
|
38
|
-
`hidden` leaves the weekends out; `readOnly` shows a range and never opens.
|
|
39
|
-
|
|
40
|
-
<div className="flex w-80 max-w-full flex-col gap-2">
|
|
41
|
-
<DateRangePicker placeholder="Working days" hidden={{ dayOfWeek: [0, 6] }} />
|
|
42
|
-
<DateRangePicker readOnly defaultValue={{ from: new Date(2026, 9, 9), to: new Date(2026, 9, 15) }} />
|
|
43
|
-
</div>
|
|
44
|
-
|
|
45
|
-
# Editable
|
|
46
|
-
|
|
47
|
-
`editable` makes the field two masked inputs, one per end, typed in the locale's numeric order; the calendar icon opens the panel. An end that can't be a date, or one left half typed, turns the field destructive with a caption.
|
|
48
|
-
|
|
49
|
-
<div className="flex w-80 max-w-full flex-col gap-1">
|
|
50
|
-
<Label htmlFor="editable-range">Stay</Label>
|
|
51
|
-
<DateRangePicker id="editable-range" editable locale={de} defaultValue={{ from: new Date(2026, 9, 9), to: new Date(2026, 9, 15) }} />
|
|
52
|
-
</div>
|
|
53
|
-
|
|
54
|
-
## Editable with time
|
|
55
|
-
|
|
56
|
-
<div className="w-[30rem] max-w-full">
|
|
57
|
-
<DateRangePicker editable withTime locale={de} defaultValue={{ from: new Date(2026, 9, 9, 9, 0), to: new Date(2026, 9, 11, 17, 30) }} />
|
|
58
|
-
</div>
|
|
59
|
-
|
|
60
|
-
## Editable with a 12-hour clock
|
|
61
|
-
|
|
62
|
-
The panel's header keeps both ends readable on a phone: when the two inputs don't fit side by side, they stack.
|
|
63
|
-
|
|
64
|
-
<div className="w-[30rem] max-w-full">
|
|
65
|
-
<DateRangePicker editable withTime hourCycle="h12" defaultValue={{ from: new Date(2026, 9, 1, 0, 0), to: new Date(2026, 9, 11, 17, 30) }} />
|
|
66
|
-
</div>
|
|
67
|
-
|
|
68
|
-
# Localization
|
|
69
|
-
|
|
70
|
-
## German, this year only
|
|
71
|
-
|
|
72
|
-
<div className="w-80 max-w-full">
|
|
73
|
-
<DateRangePicker
|
|
74
|
-
locale={de}
|
|
75
|
-
startMonth={new Date(2026, 0, 1)}
|
|
76
|
-
endMonth={new Date(2026, 11, 1)}
|
|
77
|
-
defaultValue={{ from: new Date(2026, 9, 9), to: new Date(2026, 9, 15) }}
|
|
78
|
-
/>
|
|
79
|
-
</div>
|
|
80
|
-
|
|
81
|
-
## Slovak, labels and format
|
|
82
|
-
|
|
83
|
-
`locale` takes a BCP 47 tag; `labels` names every part (the ends, the columns, the buttons) and `formatDate` writes each end in the field.
|
|
84
|
-
|
|
85
|
-
<div className="w-80 max-w-full">
|
|
86
|
-
<DateRangePicker
|
|
87
|
-
locale="sk"
|
|
88
|
-
placeholder="Termín"
|
|
89
|
-
formatDate={date => date.toLocaleDateString('sk', { day: 'numeric', month: 'long' })}
|
|
90
|
-
labels={{ start: 'Začiatok', end: 'Koniec', close: 'Zavrieť', month: 'Mesiac', year: 'Rok', calendar: 'Otvoriť kalendár' }}
|
|
91
|
-
defaultValue={{ from: new Date(2026, 9, 9), to: new Date(2026, 9, 15) }}
|
|
92
|
-
/>
|
|
93
|
-
</div>
|