@justanarthur/modo-ui 0.6.0-canary.8 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/README.md +66 -164
  2. package/dist/base.css +4 -141
  3. package/dist/blocks/sidebar-app/index.js +26 -40
  4. package/dist/components/AI/input-message/index.js +16 -23
  5. package/dist/components/AI/thinking-indicator/index.js +6 -9
  6. package/dist/components/accordion/index.d.ts +11 -39
  7. package/dist/components/accordion/index.js +13 -18
  8. package/dist/components/badge/index.d.ts +11 -18
  9. package/dist/components/badge/index.js +7 -12
  10. package/dist/components/button/index.d.ts +17 -53
  11. package/dist/components/button/index.js +6 -11
  12. package/dist/components/card/index.d.ts +9 -32
  13. package/dist/components/card/index.js +11 -17
  14. package/dist/components/copy/index.d.ts +8 -41
  15. package/dist/components/copy/index.js +9 -15
  16. package/dist/components/inputs/checkbox/index.d.ts +9 -28
  17. package/dist/components/inputs/checkbox/index.js +13 -18
  18. package/dist/components/inputs/color-picker/index.d.ts +14 -22
  19. package/dist/components/inputs/color-picker/index.js +18 -26
  20. package/dist/components/inputs/combobox/index.d.ts +20 -85
  21. package/dist/components/inputs/combobox/index.js +18 -27
  22. package/dist/components/inputs/date-time/calendar/index.d.ts +18 -24
  23. package/dist/components/inputs/date-time/calendar/index.js +11 -15
  24. package/dist/components/inputs/date-time/date-picker/index.d.ts +16 -105
  25. package/dist/components/inputs/date-time/date-picker/index.js +25 -35
  26. package/dist/components/inputs/date-time/date-range-picker/index.d.ts +12 -106
  27. package/dist/components/inputs/date-time/date-range-picker/index.js +24 -35
  28. package/dist/components/inputs/date-time/duration-picker/index.d.ts +13 -66
  29. package/dist/components/inputs/date-time/duration-picker/index.js +24 -33
  30. package/dist/components/inputs/date-time/month-picker/index.d.ts +10 -60
  31. package/dist/components/inputs/date-time/month-picker/index.js +23 -32
  32. package/dist/components/inputs/date-time/time-picker/index.d.ts +10 -58
  33. package/dist/components/inputs/date-time/time-picker/index.js +24 -33
  34. package/dist/components/inputs/input/index.d.ts +13 -95
  35. package/dist/components/inputs/input/index.js +9 -18
  36. package/dist/components/inputs/radio/index.d.ts +5 -20
  37. package/dist/components/inputs/radio/index.js +12 -16
  38. package/dist/components/inputs/search/index.d.ts +3 -3
  39. package/dist/components/inputs/search/index.js +18 -26
  40. package/dist/components/inputs/select/index.d.ts +23 -99
  41. package/dist/components/inputs/select/index.js +14 -29
  42. package/dist/components/inputs/slider/index.d.ts +0 -9
  43. package/dist/components/inputs/slider/index.js +5 -8
  44. package/dist/components/inputs/switch/index.d.ts +2 -8
  45. package/dist/components/inputs/switch/index.js +12 -15
  46. package/dist/components/inputs/textarea/index.d.ts +1 -20
  47. package/dist/components/inputs/textarea/index.js +6 -9
  48. package/dist/components/navigation/sidebar/index.d.ts +21 -44
  49. package/dist/components/navigation/sidebar/index.js +31 -42
  50. package/dist/components/navigation/tabs/index.d.ts +2 -8
  51. package/dist/components/navigation/tabs/index.js +10 -15
  52. package/dist/components/navigation/tabs-subtle/index.js +10 -13
  53. package/dist/components/overlays/alert-dialog/index.d.ts +16 -135
  54. package/dist/components/overlays/alert-dialog/index.js +13 -23
  55. package/dist/components/overlays/command/index.d.ts +20 -25
  56. package/dist/components/overlays/command/index.js +17 -25
  57. package/dist/components/overlays/context-menu/index.d.ts +17 -39
  58. package/dist/components/overlays/context-menu/index.js +18 -29
  59. package/dist/components/overlays/dialog/index.d.ts +16 -42
  60. package/dist/components/overlays/dialog/index.js +12 -20
  61. package/dist/components/overlays/dropdown/index.d.ts +34 -304
  62. package/dist/components/overlays/dropdown/index.js +17 -44
  63. package/dist/components/overlays/popover/index.d.ts +12 -38
  64. package/dist/components/overlays/popover/index.js +9 -13
  65. package/dist/components/overlays/preview-card/index.js +8 -12
  66. package/dist/components/overlays/sheet/index.d.ts +8 -25
  67. package/dist/components/overlays/sheet/index.js +13 -19
  68. package/dist/components/overlays/toast/index.d.ts +50 -209
  69. package/dist/components/overlays/toast/index.js +10 -23
  70. package/dist/components/overlays/tooltip/index.d.ts +21 -123
  71. package/dist/components/overlays/tooltip/index.js +6 -16
  72. package/dist/components/table/index.d.ts +8 -63
  73. package/dist/components/table/index.js +9 -20
  74. package/dist/index.d.ts +1048 -2999
  75. package/dist/index.js +82 -231
  76. package/dist/preset.d.ts +0 -22
  77. package/dist/preset.js +2 -24
  78. package/dist/primitives/code/index.js +5 -8
  79. package/dist/primitives/craft/index.js +6 -10
  80. package/dist/primitives/fluid-hover/index.js +8 -10
  81. package/dist/primitives/morph/index.js +10 -16
  82. package/dist/primitives/motion/index.js +8 -11
  83. package/dist/primitives/scroll-area/index.js +3 -5
  84. package/dist/primitives/sizes/index.js +4 -6
  85. package/dist/primitives/surface/index.js +4 -6
  86. package/dist/shared/{components-4y816hwp.js → components-0q0sqfh4.js} +49 -27
  87. package/dist/shared/components-0sn7ypjw.js +61 -0
  88. package/dist/shared/{components-vc864c51.js → components-11da9ajg.js} +5 -8
  89. package/dist/shared/components-1434p1mh.js +123 -0
  90. package/dist/shared/{components-t2a3qmy9.js → components-1z6tdadk.js} +24 -40
  91. package/dist/shared/{components-qs4rkqsj.js → components-27nnvrwe.js} +14 -15
  92. package/dist/shared/{components-av5t26rc.js → components-2dxkv6zm.js} +7 -8
  93. package/dist/shared/{components-wqrvqq5p.js → components-2ecg8svx.js} +152 -234
  94. package/dist/shared/{components-3ydr2fqe.js → components-2ph6t61s.js} +34 -37
  95. package/dist/shared/{components-6gk118w3.js → components-39jq9va1.js} +24 -29
  96. package/dist/shared/components-3ky44908.js +9 -0
  97. package/dist/shared/{components-y1qvbawa.js → components-3mkepka5.js} +25 -28
  98. package/dist/shared/{components-xqszvkj4.js → components-4700p9kz.js} +22 -24
  99. package/dist/shared/{components-yhgq0qxx.js → components-59efxjd9.js} +12 -13
  100. package/dist/shared/{components-9j9abkct.js → components-5vgpnxgy.js} +27 -51
  101. package/dist/shared/{components-8tt3xbb5.js → components-5xc2j8jz.js} +18 -19
  102. package/dist/shared/{components-jymmaevv.js → components-6p8tfcd6.js} +29 -57
  103. package/dist/shared/{components-4nck8acq.js → components-7r3etddy.js} +54 -19
  104. package/dist/shared/{components-skfd7kff.js → components-8snj490h.js} +32 -78
  105. package/dist/shared/{components-ctqmge8t.js → components-b0eac83j.js} +30 -9
  106. package/dist/shared/{components-9sttq78t.js → components-b2wyq2cq.js} +59 -41
  107. package/dist/shared/{components-vkwq2k96.js → components-b3c5et5b.js} +38 -49
  108. package/dist/shared/{components-rrbpmfx4.js → components-c6s6b43g.js} +2 -3
  109. package/dist/shared/{components-pw06rbxq.js → components-chacnk61.js} +19 -19
  110. package/dist/shared/{components-71nbt03m.js → components-cv16mryv.js} +7 -26
  111. package/dist/shared/{components-eqze3y30.js → components-d6xtjht3.js} +30 -35
  112. package/dist/shared/{components-5y5shqfd.js → components-dk0gjr5a.js} +18 -19
  113. package/dist/shared/{components-khspp26b.js → components-fzrq6tr3.js} +34 -37
  114. package/dist/shared/{components-km7fhgbk.js → components-gc5vtq2f.js} +30 -66
  115. package/dist/shared/components-gf5s6ap9.js +42 -0
  116. package/dist/shared/{components-qqcmtrbv.js → components-gz8zf3ec.js} +55 -56
  117. package/dist/shared/{components-mattt5jp.js → components-h2ajmhwn.js} +35 -107
  118. package/dist/shared/{components-awra5sff.js → components-hqeq3w9q.js} +16 -24
  119. package/dist/shared/{components-5tzhqbcw.js → components-hw9yk32z.js} +24 -36
  120. package/dist/shared/components-hyq23phv.js +310 -0
  121. package/dist/shared/{components-8mt5bsv6.js → components-jbbmdr74.js} +22 -41
  122. package/dist/shared/{components-dcc02hs2.js → components-jjw69c4c.js} +4 -7
  123. package/dist/shared/{components-2syq4mwc.js → components-jthe1pwb.js} +420 -139
  124. package/dist/shared/{components-r7q1zm7r.js → components-jwst3vtj.js} +76 -224
  125. package/dist/shared/{components-qdm3yh26.js → components-kvr7f9hy.js} +10 -19
  126. package/dist/shared/{components-s8yqk2dc.js → components-kwa6mrf9.js} +11 -46
  127. package/dist/shared/{components-de99ykt7.js → components-men63rwj.js} +2 -3
  128. package/dist/shared/{components-6b0zb8z3.js → components-mjthm1kf.js} +9 -13
  129. package/dist/shared/{components-2c64r8c9.js → components-n42c79bz.js} +22 -23
  130. package/dist/shared/{components-tz1fv35x.js → components-n7mjr357.js} +2 -3
  131. package/dist/shared/components-ng72k97e.js +128 -0
  132. package/dist/shared/{components-dyae0y7h.js → components-pbmqctfa.js} +65 -169
  133. package/dist/shared/{components-px2zm7dc.js → components-q5xj5c16.js} +8 -9
  134. package/dist/shared/components-raknhppb.js +64 -0
  135. package/dist/shared/{components-8rb25gbe.js → components-rr7a6ja9.js} +27 -59
  136. package/dist/shared/{components-5012r6gr.js → components-s083f38z.js} +34 -164
  137. package/dist/shared/components-s5ngg32c.js +267 -0
  138. package/dist/shared/components-sn1rxx1d.js +143 -0
  139. package/dist/shared/{components-r8eqs7gz.js → components-ta7shw28.js} +4 -4
  140. package/dist/shared/{components-9as3rf68.js → components-vc7vq5nz.js} +3 -6
  141. package/dist/shared/{components-ft3zdc79.js → components-vfbhxf5r.js} +5 -6
  142. package/dist/shared/components-vynjtrk6.js +19 -0
  143. package/dist/shared/{components-w0xq6q9k.js → components-w1r67ag9.js} +149 -294
  144. package/dist/shared/{components-z0bqtvcp.js → components-w90endve.js} +72 -71
  145. package/dist/shared/{components-t5pk5nmc.js → components-wvp1m52g.js} +102 -149
  146. package/dist/shared/components-wy9jpqny.js +146 -0
  147. package/dist/shared/{components-5sxjeh6h.js → components-y9y0g8er.js} +28 -52
  148. package/dist/shared/components-ypp01w3p.js +986 -0
  149. package/dist/shared/{components-t50hrswb.js → components-zfnmn5d4.js} +36 -82
  150. package/dist/shared/{components-jqpefjsn.js → components-zrkzcayz.js} +6 -54
  151. package/dist/shared/{components-vf45j12c.js → components-zx6b6yby.js} +18 -4
  152. package/dist/styles.css +32 -320
  153. package/dist/tailwind.css +0 -16
  154. package/dist/tokens.css +0 -67
  155. package/package.json +4 -227
  156. package/DESIGN.md +0 -623
  157. package/blocks/sidebar-app/examples.mdx +0 -33
  158. package/blocks/sidebar-app/index.tsx +0 -218
  159. package/blocks/sidebar-app/inset-topbar.tsx +0 -25
  160. package/blocks/sidebar-app/menu-grid.ts +0 -26
  161. package/blocks/sidebar-app/nav-data.ts +0 -36
  162. package/blocks/sidebar-app/search-field.tsx +0 -48
  163. package/blocks/sidebar-app/user-footer.tsx +0 -67
  164. package/blocks/sidebar-app/workspace-header.tsx +0 -129
  165. package/components/AI/input-message/examples.mdx +0 -130
  166. package/components/AI/input-message/file-thumbnail.tsx +0 -173
  167. package/components/AI/input-message/index.tsx +0 -1385
  168. package/components/AI/thinking-indicator/examples.mdx +0 -27
  169. package/components/AI/thinking-indicator/index.tsx +0 -210
  170. package/components/accordion/examples.mdx +0 -233
  171. package/components/accordion/index.tsx +0 -1071
  172. package/components/avatar/examples.mdx +0 -95
  173. package/components/avatar/index.tsx +0 -129
  174. package/components/badge/change-demo.tsx +0 -29
  175. package/components/badge/examples.mdx +0 -124
  176. package/components/badge/index.tsx +0 -225
  177. package/components/badge/variants.ts +0 -73
  178. package/components/button/examples.mdx +0 -168
  179. package/components/button/index.tsx +0 -424
  180. package/components/button/loading-demo.tsx +0 -25
  181. package/components/button/variants.ts +0 -168
  182. package/components/card/examples.mdx +0 -251
  183. package/components/card/index.tsx +0 -1070
  184. package/components/copy/examples.mdx +0 -125
  185. package/components/copy/index.tsx +0 -662
  186. package/components/inputs/checkbox/examples.mdx +0 -87
  187. package/components/inputs/checkbox/index.tsx +0 -611
  188. package/components/inputs/checkbox/select-all-demo.tsx +0 -48
  189. package/components/inputs/color-picker/examples.mdx +0 -111
  190. package/components/inputs/color-picker/index.tsx +0 -1981
  191. package/components/inputs/color-picker/variants.ts +0 -401
  192. package/components/inputs/combobox/examples.mdx +0 -366
  193. package/components/inputs/combobox/index.tsx +0 -1527
  194. package/components/inputs/combobox/remote-demo.tsx +0 -105
  195. package/components/inputs/date-time/calendar/examples.mdx +0 -45
  196. package/components/inputs/date-time/calendar/index.tsx +0 -370
  197. package/components/inputs/date-time/calendar/use-month-window.ts +0 -173
  198. package/components/inputs/date-time/date-picker/examples.mdx +0 -243
  199. package/components/inputs/date-time/date-picker/index.tsx +0 -476
  200. package/components/inputs/date-time/date-picker/masked-date-input.tsx +0 -348
  201. package/components/inputs/date-time/date-range-picker/examples.mdx +0 -93
  202. package/components/inputs/date-time/date-range-picker/index.tsx +0 -525
  203. package/components/inputs/date-time/duration-picker/examples.mdx +0 -40
  204. package/components/inputs/date-time/duration-picker/index.tsx +0 -253
  205. package/components/inputs/date-time/month-picker/examples.mdx +0 -45
  206. package/components/inputs/date-time/month-picker/index.tsx +0 -254
  207. package/components/inputs/date-time/picker-shell.tsx +0 -581
  208. package/components/inputs/date-time/time-columns.tsx +0 -94
  209. package/components/inputs/date-time/time-picker/examples.mdx +0 -57
  210. package/components/inputs/date-time/time-picker/index.tsx +0 -227
  211. package/components/inputs/field/examples.mdx +0 -117
  212. package/components/inputs/field/index.tsx +0 -268
  213. package/components/inputs/file-dropzone/examples.mdx +0 -83
  214. package/components/inputs/file-dropzone/file-row.tsx +0 -201
  215. package/components/inputs/file-dropzone/index.tsx +0 -316
  216. package/components/inputs/file-dropzone/upload-demo.tsx +0 -67
  217. package/components/inputs/file-dropzone/variants.ts +0 -94
  218. package/components/inputs/input/examples.mdx +0 -166
  219. package/components/inputs/input/index.tsx +0 -494
  220. package/components/inputs/input/password-demo.tsx +0 -30
  221. package/components/inputs/label/examples.mdx +0 -67
  222. package/components/inputs/label/index.tsx +0 -85
  223. package/components/inputs/number-input/examples.mdx +0 -69
  224. package/components/inputs/number-input/index.tsx +0 -221
  225. package/components/inputs/radio/examples.mdx +0 -77
  226. package/components/inputs/radio/index.tsx +0 -636
  227. package/components/inputs/search/examples.mdx +0 -74
  228. package/components/inputs/search/index.tsx +0 -333
  229. package/components/inputs/select/examples.mdx +0 -296
  230. package/components/inputs/select/index.tsx +0 -1044
  231. package/components/inputs/select/variants.ts +0 -32
  232. package/components/inputs/slider/examples.mdx +0 -153
  233. package/components/inputs/slider/index.tsx +0 -1867
  234. package/components/inputs/switch/examples.mdx +0 -96
  235. package/components/inputs/switch/index.tsx +0 -504
  236. package/components/inputs/textarea/examples.mdx +0 -126
  237. package/components/inputs/textarea/index.tsx +0 -207
  238. package/components/navigation/navigation-menu/examples.mdx +0 -136
  239. package/components/navigation/navigation-menu/index.tsx +0 -704
  240. package/components/navigation/pagination/examples.mdx +0 -74
  241. package/components/navigation/pagination/index.tsx +0 -401
  242. package/components/navigation/sidebar/examples.mdx +0 -325
  243. package/components/navigation/sidebar/index.tsx +0 -453
  244. package/components/navigation/sidebar/sidebar-core.tsx +0 -1408
  245. package/components/navigation/sidebar/sidebar-menu.tsx +0 -1495
  246. package/components/navigation/sidebar/sidebar.css +0 -74
  247. package/components/navigation/sidebar/variants.ts +0 -55
  248. package/components/navigation/tabs/examples.mdx +0 -89
  249. package/components/navigation/tabs/index.tsx +0 -494
  250. package/components/navigation/tabs-subtle/examples.mdx +0 -49
  251. package/components/navigation/tabs-subtle/index.tsx +0 -512
  252. package/components/overlays/alert-dialog/examples.mdx +0 -123
  253. package/components/overlays/alert-dialog/index.tsx +0 -276
  254. package/components/overlays/alert-dialog/pending-demo.tsx +0 -36
  255. package/components/overlays/command/examples.mdx +0 -113
  256. package/components/overlays/command/index.tsx +0 -425
  257. package/components/overlays/context-menu/examples.mdx +0 -56
  258. package/components/overlays/context-menu/index.tsx +0 -279
  259. package/components/overlays/dialog/examples.mdx +0 -165
  260. package/components/overlays/dialog/index.tsx +0 -451
  261. package/components/overlays/dropdown/dropdown-search.tsx +0 -395
  262. package/components/overlays/dropdown/examples.mdx +0 -444
  263. package/components/overlays/dropdown/index.tsx +0 -1241
  264. package/components/overlays/dropdown/menu-item.tsx +0 -510
  265. package/components/overlays/dropdown/menu-parts.tsx +0 -725
  266. package/components/overlays/popover/anchored-demo.tsx +0 -59
  267. package/components/overlays/popover/examples.mdx +0 -203
  268. package/components/overlays/popover/index.tsx +0 -317
  269. package/components/overlays/preview-card/examples.mdx +0 -61
  270. package/components/overlays/preview-card/index.tsx +0 -204
  271. package/components/overlays/sheet/examples.mdx +0 -101
  272. package/components/overlays/sheet/index.tsx +0 -307
  273. package/components/overlays/toast/examples.mdx +0 -85
  274. package/components/overlays/toast/global-demo.tsx +0 -72
  275. package/components/overlays/toast/index.tsx +0 -544
  276. package/components/overlays/toast/manager.ts +0 -193
  277. package/components/overlays/tooltip/examples.mdx +0 -106
  278. package/components/overlays/tooltip/index.tsx +0 -539
  279. package/components/progress/examples.mdx +0 -59
  280. package/components/progress/index.tsx +0 -174
  281. package/components/progress/progress.css +0 -49
  282. package/components/progress/step-demo.tsx +0 -27
  283. package/components/table/examples.mdx +0 -188
  284. package/components/table/index.tsx +0 -535
  285. package/components/table/sort-demo.tsx +0 -61
  286. package/dist/components/avatar/index.d.ts +0 -46
  287. package/dist/components/avatar/index.js +0 -19
  288. package/dist/components/badge/variants.d.ts +0 -33
  289. package/dist/components/badge/variants.js +0 -10
  290. package/dist/components/button/variants.d.ts +0 -39
  291. package/dist/components/button/variants.js +0 -8
  292. package/dist/components/inputs/color-picker/variants.d.ts +0 -61
  293. package/dist/components/inputs/color-picker/variants.js +0 -28
  294. package/dist/components/inputs/field/index.d.ts +0 -116
  295. package/dist/components/inputs/field/index.js +0 -29
  296. package/dist/components/inputs/file-dropzone/index.d.ts +0 -167
  297. package/dist/components/inputs/file-dropzone/index.js +0 -33
  298. package/dist/components/inputs/file-dropzone/variants.d.ts +0 -35
  299. package/dist/components/inputs/file-dropzone/variants.js +0 -12
  300. package/dist/components/inputs/label/index.d.ts +0 -32
  301. package/dist/components/inputs/label/index.js +0 -11
  302. package/dist/components/inputs/number-input/index.d.ts +0 -87
  303. package/dist/components/inputs/number-input/index.js +0 -21
  304. package/dist/components/inputs/select/variants.d.ts +0 -5
  305. package/dist/components/inputs/select/variants.js +0 -6
  306. package/dist/components/navigation/navigation-menu/index.d.ts +0 -126
  307. package/dist/components/navigation/navigation-menu/index.js +0 -41
  308. package/dist/components/navigation/pagination/index.d.ts +0 -75
  309. package/dist/components/navigation/pagination/index.js +0 -41
  310. package/dist/components/navigation/sidebar/variants.d.ts +0 -25
  311. package/dist/components/navigation/sidebar/variants.js +0 -28
  312. package/dist/components/progress/index.d.ts +0 -56
  313. package/dist/components/progress/index.js +0 -15
  314. package/dist/docs/index.d.ts +0 -83
  315. package/dist/docs/index.js +0 -288
  316. package/dist/docs/vite.d.ts +0 -31
  317. package/dist/docs/vite.js +0 -45
  318. package/dist/lib/date-locale.d.ts +0 -26
  319. package/dist/lib/date-locale.js +0 -24
  320. package/dist/lib/field-classes.d.ts +0 -149
  321. package/dist/lib/field-classes.js +0 -41
  322. package/dist/lib/field-variants.d.ts +0 -47
  323. package/dist/lib/field-variants.js +0 -26
  324. package/dist/lib/fluid-hover-highlight.d.ts +0 -112
  325. package/dist/lib/fluid-hover-highlight.js +0 -17
  326. package/dist/lib/focus-ring.d.ts +0 -18
  327. package/dist/lib/focus-ring.js +0 -11
  328. package/dist/lib/goo-indicator.d.ts +0 -46
  329. package/dist/lib/goo-indicator.js +0 -14
  330. package/dist/lib/icon-context.d.ts +0 -30
  331. package/dist/lib/icon-context.js +0 -12
  332. package/dist/lib/inert.d.ts +0 -9
  333. package/dist/lib/inert.js +0 -8
  334. package/dist/lib/morph-layers.d.ts +0 -93
  335. package/dist/lib/morph-layers.js +0 -13
  336. package/dist/lib/morph-part.d.ts +0 -21
  337. package/dist/lib/morph-part.js +0 -12
  338. package/dist/lib/popup.d.ts +0 -20
  339. package/dist/lib/popup.js +0 -12
  340. package/dist/lib/reduced-motion.d.ts +0 -9
  341. package/dist/lib/reduced-motion.js +0 -6
  342. package/dist/lib/row-index.d.ts +0 -10
  343. package/dist/lib/row-index.js +0 -8
  344. package/dist/lib/row-order.d.ts +0 -28
  345. package/dist/lib/row-order.js +0 -10
  346. package/dist/lib/scroll-column.d.ts +0 -31
  347. package/dist/lib/scroll-column.js +0 -19
  348. package/dist/lib/shape-context.d.ts +0 -30
  349. package/dist/lib/shape-context.js +0 -13
  350. package/dist/lib/shape-radius.d.ts +0 -19
  351. package/dist/lib/shape-radius.js +0 -6
  352. package/dist/lib/size-context.d.ts +0 -94
  353. package/dist/lib/size-context.js +0 -20
  354. package/dist/lib/size-scale.d.ts +0 -79
  355. package/dist/lib/size-scale.js +0 -8
  356. package/dist/lib/slot.d.ts +0 -39
  357. package/dist/lib/slot.js +0 -14
  358. package/dist/lib/springs.d.ts +0 -44
  359. package/dist/lib/springs.js +0 -8
  360. package/dist/lib/surface-classes.d.ts +0 -19
  361. package/dist/lib/surface-classes.js +0 -10
  362. package/dist/lib/surface-context.d.ts +0 -9
  363. package/dist/lib/surface-context.js +0 -8
  364. package/dist/lib/use-controllable-state.d.ts +0 -2
  365. package/dist/lib/use-controllable-state.js +0 -6
  366. package/dist/lib/use-fluid-hover.d.ts +0 -138
  367. package/dist/lib/use-fluid-hover.js +0 -14
  368. package/dist/lib/use-is-mobile.d.ts +0 -2
  369. package/dist/lib/use-is-mobile.js +0 -6
  370. package/dist/lib/use-keyboard-nav-gate.d.ts +0 -20
  371. package/dist/lib/use-keyboard-nav-gate.js +0 -7
  372. package/dist/lib/use-merge-split.d.ts +0 -47
  373. package/dist/lib/use-merge-split.js +0 -15
  374. package/dist/lib/use-morph.d.ts +0 -101
  375. package/dist/lib/use-morph.js +0 -20
  376. package/dist/lib/use-touch-primary.d.ts +0 -2
  377. package/dist/lib/use-touch-primary.js +0 -6
  378. package/dist/lib/utils.d.ts +0 -3
  379. package/dist/lib/utils.js +0 -6
  380. package/dist/primitives/separator/index.d.ts +0 -25
  381. package/dist/primitives/separator/index.js +0 -9
  382. package/dist/primitives/skeleton/index.d.ts +0 -35
  383. package/dist/primitives/skeleton/index.js +0 -13
  384. package/dist/shared/components-124epb7f.js +0 -53
  385. package/dist/shared/components-1kab3j44.js +0 -337
  386. package/dist/shared/components-26snnbs9.js +0 -322
  387. package/dist/shared/components-34txk9rj.js +0 -35
  388. package/dist/shared/components-3h92d94m.js +0 -23
  389. package/dist/shared/components-4vfm04wq.js +0 -82
  390. package/dist/shared/components-54nq988h.js +0 -123
  391. package/dist/shared/components-7s7pykk5.js +0 -281
  392. package/dist/shared/components-7zkhz3r8.js +0 -399
  393. package/dist/shared/components-8v644a0s.js +0 -298
  394. package/dist/shared/components-a4evvq8h.js +0 -271
  395. package/dist/shared/components-adkarj8n.js +0 -35
  396. package/dist/shared/components-b1e239g3.js +0 -28
  397. package/dist/shared/components-b94t6qtj.js +0 -143
  398. package/dist/shared/components-c9yr4ed1.js +0 -44
  399. package/dist/shared/components-cwg1d0w6.js +0 -254
  400. package/dist/shared/components-d3shbwqq.js +0 -95
  401. package/dist/shared/components-dhgk6mbt.js +0 -16
  402. package/dist/shared/components-drxrtnp2.js +0 -25
  403. package/dist/shared/components-ej4r7wmj.js +0 -482
  404. package/dist/shared/components-f7h57m6t.js +0 -59
  405. package/dist/shared/components-fejdzvqc.js +0 -448
  406. package/dist/shared/components-gx4h5rbb.js +0 -40
  407. package/dist/shared/components-gyt7my41.js +0 -328
  408. package/dist/shared/components-h6p86be3.js +0 -19
  409. package/dist/shared/components-h83az0bz.js +0 -33
  410. package/dist/shared/components-hdzrqqpx.js +0 -55
  411. package/dist/shared/components-krtx3m5b.js +0 -84
  412. package/dist/shared/components-kswxnm3h.js +0 -24
  413. package/dist/shared/components-mpa2y6x8.js +0 -277
  414. package/dist/shared/components-mrbaxt8q.js +0 -62
  415. package/dist/shared/components-pt5ftm4p.js +0 -38
  416. package/dist/shared/components-rpw4md2b.js +0 -179
  417. package/dist/shared/components-rtadhd9j.js +0 -64
  418. package/dist/shared/components-tz4gaf1v.js +0 -23
  419. package/dist/shared/components-wbbckbw8.js +0 -34
  420. package/dist/shared/components-xdqmt6ed.js +0 -20
  421. package/dist/shared/components-xjkdvnbg.js +0 -107
  422. package/dist/shared/components-z3v0n0de.js +0 -11
  423. package/dist/shared/components-z6dfqtyt.js +0 -1545
  424. package/dist/tokens/colors.css +0 -230
  425. package/dist/tokens/motion.css +0 -40
  426. package/dist/tokens/radius.css +0 -10
  427. package/dist/tokens/spacing.css +0 -9
  428. package/dist/tokens/typography.css +0 -119
  429. package/docs/chrome.css +0 -120
  430. package/docs/chrome.tsx +0 -283
  431. package/docs/index.ts +0 -9
  432. package/docs/vite.ts +0 -85
  433. package/index.ts +0 -60
  434. package/lib/date-locale.ts +0 -195
  435. package/lib/field-classes.ts +0 -121
  436. package/lib/field-variants.ts +0 -117
  437. package/lib/fluid-hover-highlight.tsx +0 -139
  438. package/lib/focus-ring.tsx +0 -46
  439. package/lib/goo-indicator.tsx +0 -261
  440. package/lib/icon-context.tsx +0 -310
  441. package/lib/inert.ts +0 -22
  442. package/lib/morph-layers.tsx +0 -102
  443. package/lib/morph-part.tsx +0 -49
  444. package/lib/popup.ts +0 -52
  445. package/lib/reduced-motion.ts +0 -19
  446. package/lib/row-index.tsx +0 -29
  447. package/lib/row-order.tsx +0 -126
  448. package/lib/scroll-column.tsx +0 -273
  449. package/lib/shape-context.tsx +0 -138
  450. package/lib/shape-radius.ts +0 -67
  451. package/lib/size-context.tsx +0 -66
  452. package/lib/size-scale.ts +0 -115
  453. package/lib/slot.ts +0 -115
  454. package/lib/springs.ts +0 -62
  455. package/lib/surface-classes.ts +0 -58
  456. package/lib/surface-context.tsx +0 -21
  457. package/lib/use-controllable-state.ts +0 -44
  458. package/lib/use-fluid-hover.ts +0 -541
  459. package/lib/use-is-mobile.ts +0 -25
  460. package/lib/use-keyboard-nav-gate.ts +0 -45
  461. package/lib/use-merge-split.tsx +0 -209
  462. package/lib/use-morph.ts +0 -557
  463. package/lib/use-touch-primary.tsx +0 -43
  464. package/lib/utils.ts +0 -37
  465. package/preset.ts +0 -199
  466. package/primitives/code/examples.mdx +0 -27
  467. package/primitives/code/index.tsx +0 -80
  468. package/primitives/craft/demos.tsx +0 -173
  469. package/primitives/craft/examples.mdx +0 -142
  470. package/primitives/craft/index.tsx +0 -76
  471. package/primitives/fluid-hover/examples.mdx +0 -84
  472. package/primitives/fluid-hover/index.tsx +0 -316
  473. package/primitives/morph/examples.mdx +0 -139
  474. package/primitives/morph/index.tsx +0 -192
  475. package/primitives/motion/examples.mdx +0 -100
  476. package/primitives/motion/index.tsx +0 -160
  477. package/primitives/scroll-area/examples.mdx +0 -58
  478. package/primitives/scroll-area/index.tsx +0 -204
  479. package/primitives/separator/examples.mdx +0 -30
  480. package/primitives/separator/index.tsx +0 -53
  481. package/primitives/sizes/examples.mdx +0 -167
  482. package/primitives/sizes/index.tsx +0 -89
  483. package/primitives/skeleton/examples.mdx +0 -51
  484. package/primitives/skeleton/index.tsx +0 -72
  485. package/primitives/skeleton/skeleton.css +0 -15
  486. package/primitives/surface/examples.mdx +0 -173
  487. package/primitives/surface/index.tsx +0 -109
  488. package/primitives/surface/surface.css +0 -176
  489. /package/dist/shared/{components-3ey0hzpb.js → components-1v7rxytx.js} +0 -0
  490. /package/dist/shared/{components-jcnjay5g.js → components-ezxhrmer.js} +0 -0
@@ -1,525 +0,0 @@
1
- /*
2
- * Local addition (not part of Fluid Functionalism): a date range field over
3
- * the scrolling Calendar (react-day-picker's range mode). Props after
4
- * shadcn's range picker and utegsk/ui's DateRangePicker (`editable`,
5
- * `withTime`, `hourCycle`, `hidden`, per-end input props), kept in line with
6
- * the other pickers here.
7
- */
8
-
9
- import { endOfMonth, format, isValid, type Locale, set } from 'date-fns'
10
- import {
11
- type ForwardRefExoticComponent,
12
- forwardRef,
13
- type InputHTMLAttributes,
14
- type ReactNode,
15
- type Ref,
16
- type RefAttributes,
17
- type RefObject,
18
- useMemo,
19
- useRef,
20
- useState,
21
- } from 'react'
22
- import { type DateRange, dateMatchModifiers, type Matcher } from 'react-day-picker'
23
- import {
24
- defaultLocale,
25
- formatTime,
26
- type HourCycle,
27
- hourCycleOf,
28
- parseDateText,
29
- parseDateTimeText,
30
- resolveLocale,
31
- } from '../../../../lib/date-locale'
32
- import { FieldStateContext, type FieldVariant } from '../../../../lib/field-classes'
33
- import { type SizeVariant, useSize } from '../../../../lib/size-context'
34
- import { useControllableState } from '../../../../lib/use-controllable-state'
35
- import { cn } from '../../../../lib/utils'
36
- import Calendar from '../calendar'
37
- import { MaskedDateInput } from '../date-picker/masked-date-input'
38
- import {
39
- assignRefs,
40
- controlAttributes,
41
- invalidOf,
42
- type PickerControlProps,
43
- PickerInput,
44
- PickerShell,
45
- } from '../picker-shell'
46
- import { type Time, TimeColumns } from '../time-columns'
47
-
48
- /** Every word the picker shows or announces, for translating it. */
49
- interface DateRangePickerLabels {
50
- /** Names the range's start: the panel's start input, and an `editable` field's. Defaults to `"Start date"`. */
51
- start?: string
52
- /** Names the range's end: the panel's end input, and an `editable` field's. Defaults to `"End date"`. */
53
- end?: string
54
- /** Names the calendar button of an `editable` field. Defaults to `"Open calendar"`. */
55
- calendar?: string
56
- /** Names the panel's close button. Defaults to `"Close"`. */
57
- close?: string
58
- /** Names the month column. Defaults to the locale's name for it. */
59
- month?: string
60
- /** Names the year column. Defaults to the locale's name for it. */
61
- year?: string
62
- /** Names the hour column (`withTime`). Defaults to the locale's name for it. */
63
- hour?: string
64
- /** Names the minute column (`withTime`). Defaults to the locale's name for it. */
65
- minute?: string
66
- /** Caption under an `editable` field holding an end that is no real date, rendered as the field's next sibling; `null` keeps only the destructive ring. Defaults to `"Invalid date"`. */
67
- invalid?: ReactNode
68
- }
69
-
70
- /** Attributes for one end's input of an `editable` range, its `ref` included. */
71
- type DateRangeInputProps = Omit<
72
- InputHTMLAttributes<HTMLInputElement>,
73
- 'value' | 'defaultValue' | 'onChange' | 'type'
74
- > & { ref?: Ref<HTMLInputElement> } & { [data: `data-${string}`]: string | number | boolean | undefined }
75
-
76
- interface DateRangePickerProps extends PickerControlProps {
77
- /** The picked range, react-day-picker's `{ from, to }`; `null` when empty. */
78
- value?: DateRange | null
79
- /** Initial range, for an uncontrolled picker. Defaults to `null`. */
80
- defaultValue?: DateRange | null
81
- /** Called with the new range: `{ from }` alone after the first click, `null` when cleared. An `editable` end left incomplete or impossible reports an Invalid Date there (`isNaN(date.getTime())`), so a form can reject it. */
82
- onValueChange?: (value: DateRange | null) => void
83
- /** The field is two text inputs to type the ends into, in the locale's numeric order ("09.10.2026 – 15.10.2026"); its calendar icon opens the panel. Defaults to `false`. */
84
- editable?: boolean
85
- /** Adds hour and minute columns, and the times to the field. The columns set the end being picked (the start after the first click, the end after the second), or whichever end's input has focus; a new start takes 00:00 and a new end 23:59. Defaults to `false`. */
86
- withTime?: boolean
87
- /** The clock for the times: on `'h12'` / `'h11'` the hours read with AM/PM. Defaults to the locale's. */
88
- hourCycle?: HourCycle
89
- /** Steps between the minute column's options. Defaults to `1`. */
90
- minuteStep?: number
91
- /** The field's text for each end, in place of the locale's range format: `(date) => …`. */
92
- formatDate?: (date: Date) => ReactNode
93
- /** Every word the picker shows or announces (`start`, `end`, `calendar`, `close`, `month`, `year`, `hour`, `minute`, `invalid`), for translating it. Defaults to English and the locale's field names. */
94
- labels?: DateRangePickerLabels
95
- /** Shows the range but never opens or takes typing. Defaults to `false`. */
96
- readOnly?: boolean
97
- /** A react-day-picker / date-fns locale (`import { de } from 'react-day-picker/locale'`), or a BCP 47 tag (`"sk"`) read through Intl. Defaults to `enUS`. */
98
- locale?: Locale | string
99
- /** Shown while empty. */
100
- placeholder?: string
101
- /** `true` disables the field; any other react-day-picker matcher disables the days it matches. */
102
- disabled?: Matcher | Matcher[]
103
- /** Days to leave out of the calendar, as react-day-picker matchers: they show as gaps and can't be typed either. */
104
- hidden?: Matcher | Matcher[]
105
- /** Names both ends for a native form: two hidden inputs carry them, start then end, as `"yyyy-MM-dd"` (with `withTime`, `"yyyy-MM-ddTHH:mm"`). */
106
- name?: string
107
- /** Names the start's hidden input on its own, in place of `name`. */
108
- startName?: string
109
- /** Names the end's hidden input on its own, in place of `name`. */
110
- endName?: string
111
- /** Attributes for an `editable` field's start input (`ref`, `id`, `aria-*`, handlers…), over the picker's own. */
112
- startInputProps?: DateRangeInputProps
113
- /** Attributes for an `editable` field's end input, over the picker's own. */
114
- endInputProps?: DateRangeInputProps
115
- /** The first month the calendar reaches. Defaults to 100 years back. */
116
- startMonth?: Date
117
- /** The last month the calendar reaches. Defaults to 50 years ahead. */
118
- endMonth?: Date
119
- /** Framed at rest, or invisible until hovered or focused. Defaults to `"bordered"`. */
120
- variant?: FieldVariant
121
- /** Marks the field invalid. Defaults to `false`. */
122
- invalid?: boolean
123
- /** Pins the field and its panel to one step of the size ladder. Defaults to the surrounding SizeProvider. */
124
- size?: SizeVariant
125
- /** Controlled open state. */
126
- open?: boolean
127
- /** Initial open state, for an uncontrolled panel. Defaults to `false`. */
128
- defaultOpen?: boolean
129
- /** Called when the panel opens or closes. */
130
- onOpenChange?: (open: boolean) => void
131
- /** Text direction of the panel; `'rtl'` mirrors it. */
132
- dir?: 'ltr' | 'rtl'
133
- /** Which side of the days the month and year columns stand on. Defaults to `'end'`. */
134
- columnsSide?: 'start' | 'end'
135
- /** Which side of the days the hour and minute columns stand on, outside the month and year columns when they share it. Defaults to `'end'`. */
136
- timeColumnsSide?: 'start' | 'end'
137
- /** Id of the field's control (its button, or an `editable` field's start input), for a `Label`'s `htmlFor`. */
138
- id?: string
139
- /** Where the panel grows from (see Morph): the field, the press point, its own center, a viewport edge, or a ref to any element. Defaults to `'trigger'` (the field). */
140
- from?: 'trigger' | 'pointer' | 'center' | 'top' | 'right' | 'bottom' | 'left' | RefObject<HTMLElement | null>
141
- /** How the panel grows (see Morph), as Combobox's list does: with the liquid goo neck, a plain morph, a slide or a fade. `'morph'` with `hideSource` opens it in place over the field. Defaults to `'goo'`. */
142
- effect?: 'goo' | 'morph' | 'slide' | 'fade'
143
- /** Hide the field while open, so it reads as turning into the panel. Defaults to `false`. */
144
- hideSource?: boolean
145
- /** Spring tier of a plain morph, slide or fade; goo runs on its own `spring.goo`. Defaults to `'moderate'`. */
146
- tier?: 'moderate' | 'slow'
147
- /** Classes for the field. */
148
- className?: string
149
- }
150
-
151
- type End = 'from' | 'to'
152
-
153
- /** A real date, or `undefined` for none (or an Invalid Date). */
154
- const real = (date: Date | undefined) => (date && isValid(date) ? date : undefined)
155
-
156
- /** `day` at `time`'s hours and minutes. */
157
- const atTime = (day: Date, { hours, minutes }: Time) => set(day, { hours, minutes, seconds: 0, milliseconds: 0 })
158
-
159
- const timeOf = (date: Date | undefined, fallback: Time): Time =>
160
- date ? { hours: date.getHours(), minutes: date.getMinutes() } : fallback
161
-
162
- const START_TIME: Time = { hours: 0, minutes: 0 }
163
- const END_TIME: Time = { hours: 23, minutes: 59 }
164
-
165
- const ACTIVE_END = { active: true, invalid: false, disabled: false }
166
-
167
- /**
168
- * A field for a span of days, picked with two clicks on a scrolling calendar.
169
- *
170
- * The first click starts the range and the days under the pointer preview it;
171
- * the second ends it (either way round) and closes the panel. The header
172
- * holds both ends as text, each read in the locale's formats as you type, and
173
- * the field shows the range the way the locale writes one ("9 – 15 Oct
174
- * 2026"). Everything else — the month and year columns, the bottom sheet on a
175
- * phone, the locale — works as in DatePicker.
176
- *
177
- * `editable` turns the field into two masked inputs, one per end, typed in
178
- * the locale's numeric order as DatePicker's are; the calendar icon opens the
179
- * panel. `withTime` adds the times: hour and minute columns beside the days
180
- * set the end being picked (the start after the first click, the end after
181
- * the second) or whichever end's header input has focus, lit in the header,
182
- * and the panel stays open until closed. `formatDate` writes each end in the
183
- * field and `labels` every word, `hidden` days leave gaps, and `readOnly`
184
- * shows the range without opening.
185
- *
186
- * In a form, `name` submits both ends through hidden inputs (or
187
- * `startName` / `endName` one each), and `required` stops a submit until
188
- * both are set. `id`, the `aria-*` props, `onBlur`, `controlProps` and the
189
- * `ref` reach the field's control: its button, or both inputs of an
190
- * `editable` field (the `ref` and `id` its start), where `startInputProps`
191
- * and `endInputProps` add to each.
192
- *
193
- * @example {@include ./examples.mdx}
194
- */
195
- const DateRangePicker: ForwardRefExoticComponent<
196
- DateRangePickerProps & RefAttributes<HTMLButtonElement | HTMLInputElement>
197
- > = forwardRef<HTMLButtonElement | HTMLInputElement, DateRangePickerProps>(function DateRangePicker(
198
- {
199
- value: valueProp,
200
- defaultValue = null,
201
- onValueChange,
202
- editable = false,
203
- withTime = false,
204
- hourCycle,
205
- minuteStep = 1,
206
- formatDate,
207
- labels,
208
- readOnly = false,
209
- locale: localeProp = defaultLocale,
210
- placeholder,
211
- disabled,
212
- hidden,
213
- name,
214
- startName,
215
- endName,
216
- startInputProps,
217
- endInputProps,
218
- startMonth,
219
- endMonth,
220
- variant,
221
- invalid,
222
- size,
223
- open: openProp,
224
- defaultOpen = false,
225
- onOpenChange,
226
- dir,
227
- columnsSide,
228
- timeColumnsSide,
229
- id,
230
- // `from` is also the range's start, below.
231
- from: growFrom,
232
- effect,
233
- hideSource,
234
- tier,
235
- className,
236
- ...control
237
- },
238
- ref,
239
- ) {
240
- const [value, setValue] = useControllableState(valueProp, defaultValue, onValueChange)
241
- const [open, setOpenState] = useControllableState(openProp, defaultOpen, onOpenChange)
242
- // After the first click, the next one ends the range.
243
- const [picking, setPicking] = useState(false)
244
- // The end the time columns set.
245
- const [activeEnd, setActiveEnd] = useState<End>('from')
246
- const [typedInvalid, setTypedInvalid] = useState<Record<End, boolean>>({ from: false, to: false })
247
- const fromInput = useRef<HTMLInputElement>(null)
248
- const sizeClasses = useSize(size)
249
- const locale = resolveLocale(localeProp)
250
- // `true` turns the field off; any other matcher picks out days.
251
- const off = typeof disabled === 'boolean' && disabled
252
- const days = off ? undefined : disabled
253
- const from = real(value?.from)
254
- const to = from ? real(value?.to) : undefined
255
- // An end that reads as no date (an editable end left half typed).
256
- const unreadable = { from: !!value?.from && !from, to: !!value?.to && !real(value.to) }
257
- const showInvalid = unreadable.from || unreadable.to || typedInvalid.from || typedInvalid.to
258
- const invalidCaption = labels?.invalid === undefined ? 'Invalid date' : labels.invalid
259
- const startLabel = labels?.start ?? 'Start date'
260
- const endLabel = labels?.end ?? 'End date'
261
-
262
- const setOpen = (next: boolean) => {
263
- setPicking(false)
264
- if (next) setActiveEnd('from')
265
- setOpenState(next)
266
- }
267
-
268
- const allowed = (date: Date) =>
269
- (!startMonth || date >= startMonth) &&
270
- (!endMonth || date <= endOfMonth(endMonth)) &&
271
- !(days && dateMatchModifiers(date, days)) &&
272
- !(hidden && dateMatchModifiers(date, hidden))
273
-
274
- const pick = (day: Date) => {
275
- if (!picking || !from) {
276
- setValue({ from: withTime ? atTime(day, timeOf(from, START_TIME)) : day, to: undefined })
277
- setPicking(true)
278
- setActiveEnd('from')
279
- return
280
- }
281
- if (!withTime) {
282
- setValue(day < from ? { from: day, to: from } : { from, to: day })
283
- setOpen(false)
284
- return
285
- }
286
- // With times each end keeps its own: the start's, and the end's (23:59 for a new one).
287
- const endTime = timeOf(to, END_TIME)
288
- const startTime = timeOf(from, START_TIME)
289
- const end = atTime(day, endTime)
290
- setValue(end < from ? { from: atTime(day, startTime), to: atTime(from, endTime) } : { from, to: end })
291
- setPicking(false)
292
- setActiveEnd('to')
293
- }
294
-
295
- /** Sets the active end's time; a missing end takes the start's day (or today's). */
296
- const setTime = (time: Time) => {
297
- if (activeEnd === 'from') {
298
- const next = atTime(from ?? new Date(), time)
299
- setValue({ from: to && next > to ? to : next, to })
300
- return
301
- }
302
- if (!from) return
303
- const next = atTime(to ?? from, time)
304
- setValue({ from, to: next < from ? from : next })
305
- }
306
-
307
- const readEnd = (end: End) => (text: string) => {
308
- if (!text.trim()) {
309
- setValue(end === 'from' ? null : from ? { from, to: undefined } : null)
310
- return true
311
- }
312
- const reference = (end === 'from' ? from : to) ?? undefined
313
- const date = withTime ? parseDateTimeText(text, locale, reference) : parseDateText(text, locale, reference)
314
- if (!date || !allowed(date)) return false
315
- if (end === 'from') setValue({ from: date, to: to && to >= date ? to : undefined })
316
- else if (!from || date < from) return false
317
- else setValue({ from, to: date })
318
- return true
319
- }
320
-
321
- /** What an editable end's input reports: a real date, `null` once emptied, or an Invalid Date. */
322
- const typeEnd = (end: End) => (date: Date | null) => {
323
- if (end === 'from') {
324
- if (date === null) setValue(null)
325
- else if (!isValid(date)) setValue({ from: date, to: value?.to })
326
- else setValue({ from: date, to: to && to >= date ? to : undefined })
327
- return
328
- }
329
- if (date === null) setValue(from ? { from, to: undefined } : null)
330
- else setValue({ from: value?.from, to: date })
331
- }
332
-
333
- const dateText = (date: Date) =>
334
- withTime
335
- ? `${format(date, 'PP', { locale })}, ${formatTime(date, locale, hourCycle)}`
336
- : format(date, 'PP', { locale })
337
-
338
- const displayOf = (from: Date | undefined, to: Date | undefined): ReactNode => {
339
- if (!from) return ''
340
- if (formatDate)
341
- return (
342
- <>
343
- {formatDate(from)} – {to && formatDate(to)}
344
- </>
345
- )
346
- if (!to) return `${dateText(from)} –`
347
- return new Intl.DateTimeFormat(locale.code, {
348
- dateStyle: 'medium',
349
- ...(withTime && { timeStyle: 'short', ...(hourCycle && { hourCycle }) }),
350
- }).formatRange(from, to)
351
- }
352
-
353
- const endInput = (end: End, ariaLabel: string) => {
354
- const own = end === 'from' ? fromInput : undefined
355
- const formatted = end === 'from' ? from : to
356
- const field = (
357
- <PickerInput
358
- ref={own}
359
- aria-label={ariaLabel}
360
- placeholder={end === 'from' ? placeholder : undefined}
361
- formatted={formatted ? dateText(formatted) : ''}
362
- onText={readEnd(end)}
363
- onEnter={() => setOpen(false)}
364
- onFocus={() => setActiveEnd(end)}
365
- // With times, an end needs room for its whole text ("Oct 1, 2026, 12:00 AM"): below that the ends stack.
366
- className={cn('min-w-0 flex-1', withTime && 'min-w-[10.5rem]')}
367
- />
368
- )
369
- // With times, the end the columns set is lit.
370
- return withTime && activeEnd === end ? (
371
- <FieldStateContext.Provider value={ACTIVE_END}>{field}</FieldStateContext.Provider>
372
- ) : (
373
- field
374
- )
375
- }
376
-
377
- const header = (
378
- <div className={cn('flex min-w-0 flex-1 items-center', withTime && 'flex-wrap gap-y-1')}>
379
- {endInput('from', startLabel)}
380
- <span aria-hidden className="px-0.5 text-muted-foreground">
381
- –
382
- </span>
383
- {endInput('to', endLabel)}
384
- </div>
385
- )
386
-
387
- const isInvalid = invalidOf(invalid, control['aria-invalid'])
388
- const attributes = controlAttributes(control)
389
- const labelFor = (props: DateRangeInputProps | undefined, fallback: string) =>
390
- props?.['aria-label'] ??
391
- control['aria-label'] ??
392
- ((props?.['aria-labelledby'] ?? control['aria-labelledby']) ? undefined : fallback)
393
-
394
- // The picker's `ref` is the start input's too.
395
- const startRef = useMemo(() => assignRefs<HTMLInputElement>(ref, startInputProps?.ref), [ref, startInputProps?.ref])
396
-
397
- const masked = (end: End, props: DateRangeInputProps | undefined) => {
398
- const { ref: inputRef, ...rest } = props ?? {}
399
- return (
400
- <MaskedDateInput
401
- ref={end === 'from' ? startRef : inputRef}
402
- {...attributes}
403
- id={end === 'from' ? id : undefined}
404
- required={control.required}
405
- {...rest}
406
- aria-label={labelFor(props, end === 'from' ? startLabel : endLabel)}
407
- aria-invalid={isInvalid || unreadable[end] || typedInvalid[end] || undefined}
408
- value={(end === 'from' ? from : real(value?.to)) ?? null}
409
- externallyInvalid={unreadable[end]}
410
- onValueChange={typeEnd(end)}
411
- onInvalidChange={flag => setTypedInvalid(state => ({ ...state, [end]: flag }))}
412
- locale={locale}
413
- withTime={withTime}
414
- allowed={date => allowed(date) && (end === 'from' || !from || date >= from)}
415
- disabled={off || rest.disabled}
416
- readOnly={readOnly || rest.readOnly}
417
- className={cn('text-center', rest.className)}
418
- />
419
- )
420
- }
421
-
422
- const editor = editable ? (
423
- <>
424
- {masked('from', startInputProps)}
425
- <span aria-hidden className={cn('shrink-0 text-muted-foreground', sizeClasses.text)}>
426
- –
427
- </span>
428
- {masked('to', endInputProps)}
429
- </>
430
- ) : undefined
431
-
432
- const iso = (date: Date | undefined) => (date ? format(date, withTime ? "yyyy-MM-dd'T'HH:mm" : 'yyyy-MM-dd') : '')
433
-
434
- const shell = (
435
- <PickerShell
436
- open={open}
437
- onOpenChange={setOpen}
438
- size={size}
439
- variant={variant}
440
- invalid={editable ? isInvalid || showInvalid : isInvalid}
441
- disabled={off}
442
- readOnly={readOnly}
443
- icon="calendar"
444
- display={displayOf(from, to)}
445
- placeholder={placeholder}
446
- header={header}
447
- initialFocus={fromInput}
448
- editor={editor}
449
- triggerLabel={labels?.calendar ?? 'Open calendar'}
450
- closeLabel={labels?.close}
451
- controlRef={ref as Ref<HTMLButtonElement>}
452
- controlProps={editable ? undefined : attributes}
453
- formValues={[
454
- { slot: 'start', name: startName ?? name, value: iso(from) },
455
- { slot: 'end', name: endName ?? name, value: iso(to) },
456
- ]}
457
- required={control.required}
458
- id={id}
459
- dir={dir}
460
- from={growFrom}
461
- effect={effect}
462
- hideSource={hideSource}
463
- tier={tier}
464
- className={className}
465
- >
466
- <Calendar
467
- mode="range"
468
- locale={locale}
469
- selected={from ? { from, to } : undefined}
470
- // The range is ours to build (two clicks, then close); DayPicker's own
471
- // range logic would keep extending it.
472
- onSelect={(_, day) => pick(day)}
473
- disabled={days}
474
- hidden={hidden}
475
- startMonth={startMonth}
476
- endMonth={endMonth}
477
- dir={dir}
478
- columnsSide={columnsSide}
479
- columnLabels={labels}
480
- extraColumnsSide={timeColumnsSide}
481
- extraColumns={
482
- withTime
483
- ? orientation => {
484
- const end = activeEnd === 'from' ? from : to
485
- return (
486
- <TimeColumns
487
- value={end ? timeOf(end, START_TIME) : null}
488
- onValueChange={setTime}
489
- hourCycle={hourCycle ?? hourCycleOf(locale)}
490
- minuteStep={minuteStep}
491
- locale={locale}
492
- orientation={orientation}
493
- labels={labels}
494
- />
495
- )
496
- }
497
- : undefined
498
- }
499
- />
500
- </PickerShell>
501
- )
502
-
503
- // As DatePicker's: the caption is a sibling, so the field never remounts as it comes and goes.
504
- return (
505
- <>
506
- {shell}
507
- {editable && showInvalid && invalidCaption !== null && (
508
- <p
509
- role="alert"
510
- className={cn(
511
- 'mt-1 weight-medium text-destructive',
512
- sizeClasses.variant === 'compact' ? 'text-caption-compact' : 'text-caption',
513
- )}
514
- >
515
- {invalidCaption}
516
- </p>
517
- )}
518
- </>
519
- )
520
- })
521
-
522
- export type { DateRangeInputProps, DateRangePickerLabels, DateRangePickerProps }
523
- export { DateRangePicker }
524
-
525
- export default DateRangePicker
@@ -1,40 +0,0 @@
1
- import DurationPicker from './index'
2
- import { de } from 'react-day-picker/locale'
3
-
4
- # Basic
5
-
6
- <div className="w-60 max-w-full">
7
- <DurationPicker defaultValue={{ hours: 1, minutes: 30 }} />
8
- </div>
9
-
10
- # German, up to 8 hours
11
-
12
- `maxHours` ends the hour column; `minuteStep` thins the minutes.
13
-
14
- <div className="w-60 max-w-full">
15
- <DurationPicker locale={de} maxHours={8} minuteStep={15} placeholder="Dauer" />
16
- </div>
17
-
18
- # Half hours, from one hour
19
-
20
- `minHours` starts the hour column and `hourStep` thins it; `formatValue` writes the field's text.
21
-
22
- <div className="w-60 max-w-full">
23
- <DurationPicker
24
- minHours={1}
25
- maxHours={12}
26
- hourStep={2}
27
- minuteStep={30}
28
- formatValue={value => value.hours + ' h ' + String(value.minutes).padStart(2, '0') + ' min'}
29
- defaultValue={{ hours: 3, minutes: 30 }}
30
- />
31
- </div>
32
-
33
- # Slovak labels, read only
34
-
35
- `labels` names the columns and the panel's input; `readOnly` shows the duration and never opens.
36
-
37
- <div className="flex w-60 max-w-full flex-col gap-2">
38
- <DurationPicker locale="sk" labels={{ duration: 'Trvanie', hour: 'Hodiny', minute: 'Minúty', close: 'Zavrieť' }} placeholder="Trvanie" />
39
- <DurationPicker readOnly defaultValue={{ hours: 2, minutes: 15 }} />
40
- </div>