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