@uisatin/ui 0.0.0-stage → 0.1.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 (329) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +67 -2
  3. package/chunk-2HKBZFIK.js +339 -0
  4. package/chunk-2HKBZFIK.js.map +1 -0
  5. package/chunk-2YEWSJD7.js +95 -0
  6. package/chunk-2YEWSJD7.js.map +1 -0
  7. package/chunk-3DINAQLL.js +153 -0
  8. package/chunk-3DINAQLL.js.map +1 -0
  9. package/chunk-3ERGAHKA.js +179 -0
  10. package/chunk-3ERGAHKA.js.map +1 -0
  11. package/chunk-6C7CGJX2.js +86 -0
  12. package/chunk-6C7CGJX2.js.map +1 -0
  13. package/chunk-6YXUBP27.js +474 -0
  14. package/chunk-6YXUBP27.js.map +1 -0
  15. package/chunk-72OCFAPT.js +175 -0
  16. package/chunk-72OCFAPT.js.map +1 -0
  17. package/chunk-7TXHCRAG.js +51 -0
  18. package/chunk-7TXHCRAG.js.map +1 -0
  19. package/chunk-A5XEM3GF.js +260 -0
  20. package/chunk-A5XEM3GF.js.map +1 -0
  21. package/chunk-AN2RNJLR.js +79 -0
  22. package/chunk-AN2RNJLR.js.map +1 -0
  23. package/chunk-B2K45IUR.js +36 -0
  24. package/chunk-B2K45IUR.js.map +1 -0
  25. package/chunk-B6V4VSGH.js +82 -0
  26. package/chunk-B6V4VSGH.js.map +1 -0
  27. package/chunk-BKZBWPUH.js +59 -0
  28. package/chunk-BKZBWPUH.js.map +1 -0
  29. package/chunk-BNTPPZCK.js +220 -0
  30. package/chunk-BNTPPZCK.js.map +1 -0
  31. package/chunk-BNZVTLHV.js +98 -0
  32. package/chunk-BNZVTLHV.js.map +1 -0
  33. package/chunk-CL2II6BX.js +89 -0
  34. package/chunk-CL2II6BX.js.map +1 -0
  35. package/chunk-DETGJAIC.js +147 -0
  36. package/chunk-DETGJAIC.js.map +1 -0
  37. package/chunk-DO3TBNSC.js +130 -0
  38. package/chunk-DO3TBNSC.js.map +1 -0
  39. package/chunk-ESC5JCVQ.js +90 -0
  40. package/chunk-ESC5JCVQ.js.map +1 -0
  41. package/chunk-FDKIX4DC.js +55 -0
  42. package/chunk-FDKIX4DC.js.map +1 -0
  43. package/chunk-GICKPMJU.js +239 -0
  44. package/chunk-GICKPMJU.js.map +1 -0
  45. package/chunk-GQA24FYG.js +57 -0
  46. package/chunk-GQA24FYG.js.map +1 -0
  47. package/chunk-H4NU7NPO.js +264 -0
  48. package/chunk-H4NU7NPO.js.map +1 -0
  49. package/chunk-H63FYCMY.js +11 -0
  50. package/chunk-H63FYCMY.js.map +1 -0
  51. package/chunk-HL42K2NH.js +76 -0
  52. package/chunk-HL42K2NH.js.map +1 -0
  53. package/chunk-HNQUX43Z.js +109 -0
  54. package/chunk-HNQUX43Z.js.map +1 -0
  55. package/chunk-HRKPV66B.js +32 -0
  56. package/chunk-HRKPV66B.js.map +1 -0
  57. package/chunk-J3NSDRVH.js +83 -0
  58. package/chunk-J3NSDRVH.js.map +1 -0
  59. package/chunk-JPNWHWAQ.js +151 -0
  60. package/chunk-JPNWHWAQ.js.map +1 -0
  61. package/chunk-KNUWZNFV.js +240 -0
  62. package/chunk-KNUWZNFV.js.map +1 -0
  63. package/chunk-L6NCCSIP.js +213 -0
  64. package/chunk-L6NCCSIP.js.map +1 -0
  65. package/chunk-LLHTVIM3.js +50 -0
  66. package/chunk-LLHTVIM3.js.map +1 -0
  67. package/chunk-LW3TRU5W.js +131 -0
  68. package/chunk-LW3TRU5W.js.map +1 -0
  69. package/chunk-LZMKSFCF.js +79 -0
  70. package/chunk-LZMKSFCF.js.map +1 -0
  71. package/chunk-MR3JDI7E.js +122 -0
  72. package/chunk-MR3JDI7E.js.map +1 -0
  73. package/chunk-NN6PKJWS.js +44 -0
  74. package/chunk-NN6PKJWS.js.map +1 -0
  75. package/chunk-NSRTTYQ4.js +252 -0
  76. package/chunk-NSRTTYQ4.js.map +1 -0
  77. package/chunk-O7F3CIDV.js +45 -0
  78. package/chunk-O7F3CIDV.js.map +1 -0
  79. package/chunk-P4O6TGDR.js +166 -0
  80. package/chunk-P4O6TGDR.js.map +1 -0
  81. package/chunk-PF3YBUKT.js +81 -0
  82. package/chunk-PF3YBUKT.js.map +1 -0
  83. package/chunk-PVOLDO4G.js +47 -0
  84. package/chunk-PVOLDO4G.js.map +1 -0
  85. package/chunk-QS4N4MNP.js +215 -0
  86. package/chunk-QS4N4MNP.js.map +1 -0
  87. package/chunk-QUF2IPOZ.js +98 -0
  88. package/chunk-QUF2IPOZ.js.map +1 -0
  89. package/chunk-RTJ76X5U.js +126 -0
  90. package/chunk-RTJ76X5U.js.map +1 -0
  91. package/chunk-SH6NG6VN.js +40 -0
  92. package/chunk-SH6NG6VN.js.map +1 -0
  93. package/chunk-SHDFUXYV.js +195 -0
  94. package/chunk-SHDFUXYV.js.map +1 -0
  95. package/chunk-TKO44NDI.js +84 -0
  96. package/chunk-TKO44NDI.js.map +1 -0
  97. package/chunk-TOMSU4S4.js +149 -0
  98. package/chunk-TOMSU4S4.js.map +1 -0
  99. package/chunk-TVLGZGYN.js +59 -0
  100. package/chunk-TVLGZGYN.js.map +1 -0
  101. package/chunk-TX3H3QMA.js +520 -0
  102. package/chunk-TX3H3QMA.js.map +1 -0
  103. package/chunk-UBNHSZSE.js +88 -0
  104. package/chunk-UBNHSZSE.js.map +1 -0
  105. package/chunk-UC3ZJWOD.js +73 -0
  106. package/chunk-UC3ZJWOD.js.map +1 -0
  107. package/chunk-UGRSWP6U.js +69 -0
  108. package/chunk-UGRSWP6U.js.map +1 -0
  109. package/chunk-VAGIAREV.js +214 -0
  110. package/chunk-VAGIAREV.js.map +1 -0
  111. package/chunk-WTMZT3IT.js +105 -0
  112. package/chunk-WTMZT3IT.js.map +1 -0
  113. package/chunk-WX6BP5ZP.js +39 -0
  114. package/chunk-WX6BP5ZP.js.map +1 -0
  115. package/chunk-X3PQANZO.js +255 -0
  116. package/chunk-X3PQANZO.js.map +1 -0
  117. package/chunk-XILQ7GXE.js +66 -0
  118. package/chunk-XILQ7GXE.js.map +1 -0
  119. package/chunk-XL75JRUA.js +130 -0
  120. package/chunk-XL75JRUA.js.map +1 -0
  121. package/chunk-XZNHT6MO.js +348 -0
  122. package/chunk-XZNHT6MO.js.map +1 -0
  123. package/chunk-Y5AYU7PK.js +44 -0
  124. package/chunk-Y5AYU7PK.js.map +1 -0
  125. package/chunk-YG7JOOLJ.js +28 -0
  126. package/chunk-YG7JOOLJ.js.map +1 -0
  127. package/chunk-YPJYW624.js +195 -0
  128. package/chunk-YPJYW624.js.map +1 -0
  129. package/chunk-YPNKBE5X.js +104 -0
  130. package/chunk-YPNKBE5X.js.map +1 -0
  131. package/components/accordion.d.ts +27 -0
  132. package/components/accordion.js +4 -0
  133. package/components/accordion.js.map +1 -0
  134. package/components/agent-loading.d.ts +65 -0
  135. package/components/agent-loading.js +4 -0
  136. package/components/agent-loading.js.map +1 -0
  137. package/components/agent-picker.d.ts +82 -0
  138. package/components/agent-picker.js +5 -0
  139. package/components/agent-picker.js.map +1 -0
  140. package/components/agent-suggestion.d.ts +69 -0
  141. package/components/agent-suggestion.js +6 -0
  142. package/components/agent-suggestion.js.map +1 -0
  143. package/components/announcement-bar.d.ts +39 -0
  144. package/components/announcement-bar.js +6 -0
  145. package/components/announcement-bar.js.map +1 -0
  146. package/components/attachment.d.ts +73 -0
  147. package/components/attachment.js +5 -0
  148. package/components/attachment.js.map +1 -0
  149. package/components/avatar.d.ts +34 -0
  150. package/components/avatar.js +6 -0
  151. package/components/avatar.js.map +1 -0
  152. package/components/badge.d.ts +19 -0
  153. package/components/badge.js +4 -0
  154. package/components/badge.js.map +1 -0
  155. package/components/banner.d.ts +54 -0
  156. package/components/banner.js +5 -0
  157. package/components/banner.js.map +1 -0
  158. package/components/bar-chart.d.ts +32 -0
  159. package/components/bar-chart.js +11 -0
  160. package/components/bar-chart.js.map +1 -0
  161. package/components/breadcrumb.d.ts +32 -0
  162. package/components/breadcrumb.js +6 -0
  163. package/components/breadcrumb.js.map +1 -0
  164. package/components/button.d.ts +32 -0
  165. package/components/button.js +4 -0
  166. package/components/button.js.map +1 -0
  167. package/components/card.d.ts +28 -0
  168. package/components/card.js +5 -0
  169. package/components/card.js.map +1 -0
  170. package/components/channel-chart.d.ts +14 -0
  171. package/components/channel-chart.js +11 -0
  172. package/components/channel-chart.js.map +1 -0
  173. package/components/chart.d.ts +88 -0
  174. package/components/chart.js +10 -0
  175. package/components/chart.js.map +1 -0
  176. package/components/checkbox.d.ts +17 -0
  177. package/components/checkbox.js +4 -0
  178. package/components/checkbox.js.map +1 -0
  179. package/components/chip.d.ts +54 -0
  180. package/components/chip.js +4 -0
  181. package/components/chip.js.map +1 -0
  182. package/components/citations.d.ts +37 -0
  183. package/components/citations.js +5 -0
  184. package/components/citations.js.map +1 -0
  185. package/components/code-block.d.ts +13 -0
  186. package/components/code-block.js +5 -0
  187. package/components/code-block.js.map +1 -0
  188. package/components/combobox.d.ts +58 -0
  189. package/components/combobox.js +10 -0
  190. package/components/combobox.js.map +1 -0
  191. package/components/command-menu.d.ts +54 -0
  192. package/components/command-menu.js +6 -0
  193. package/components/command-menu.js.map +1 -0
  194. package/components/context-menu.d.ts +46 -0
  195. package/components/context-menu.js +6 -0
  196. package/components/context-menu.js.map +1 -0
  197. package/components/cookie-consent.d.ts +26 -0
  198. package/components/cookie-consent.js +5 -0
  199. package/components/cookie-consent.js.map +1 -0
  200. package/components/date-picker.d.ts +112 -0
  201. package/components/date-picker.js +9 -0
  202. package/components/date-picker.js.map +1 -0
  203. package/components/decision-card.d.ts +65 -0
  204. package/components/decision-card.js +7 -0
  205. package/components/decision-card.js.map +1 -0
  206. package/components/dialog.d.ts +68 -0
  207. package/components/dialog.js +5 -0
  208. package/components/dialog.js.map +1 -0
  209. package/components/donut-chart.d.ts +20 -0
  210. package/components/donut-chart.js +11 -0
  211. package/components/donut-chart.js.map +1 -0
  212. package/components/dot.d.ts +21 -0
  213. package/components/dot.js +4 -0
  214. package/components/dot.js.map +1 -0
  215. package/components/dropdown.d.ts +74 -0
  216. package/components/dropdown.js +5 -0
  217. package/components/dropdown.js.map +1 -0
  218. package/components/empty-state.d.ts +25 -0
  219. package/components/empty-state.js +4 -0
  220. package/components/empty-state.js.map +1 -0
  221. package/components/file-upload.d.ts +78 -0
  222. package/components/file-upload.js +7 -0
  223. package/components/file-upload.js.map +1 -0
  224. package/components/floating.d.ts +30 -0
  225. package/components/floating.js +3 -0
  226. package/components/floating.js.map +1 -0
  227. package/components/form-field.d.ts +35 -0
  228. package/components/form-field.js +4 -0
  229. package/components/form-field.js.map +1 -0
  230. package/components/hover-card.d.ts +30 -0
  231. package/components/hover-card.js +4 -0
  232. package/components/hover-card.js.map +1 -0
  233. package/components/input-otp.d.ts +49 -0
  234. package/components/input-otp.js +8 -0
  235. package/components/input-otp.js.map +1 -0
  236. package/components/input.d.ts +28 -0
  237. package/components/input.js +5 -0
  238. package/components/input.js.map +1 -0
  239. package/components/kbd.d.ts +37 -0
  240. package/components/kbd.js +4 -0
  241. package/components/kbd.js.map +1 -0
  242. package/components/line-chart.d.ts +29 -0
  243. package/components/line-chart.js +12 -0
  244. package/components/line-chart.js.map +1 -0
  245. package/components/message-actions.d.ts +24 -0
  246. package/components/message-actions.js +5 -0
  247. package/components/message-actions.js.map +1 -0
  248. package/components/message.d.ts +40 -0
  249. package/components/message.js +8 -0
  250. package/components/message.js.map +1 -0
  251. package/components/number-input.d.ts +33 -0
  252. package/components/number-input.js +8 -0
  253. package/components/number-input.js.map +1 -0
  254. package/components/pagination.d.ts +45 -0
  255. package/components/pagination.js +6 -0
  256. package/components/pagination.js.map +1 -0
  257. package/components/popover.d.ts +44 -0
  258. package/components/popover.js +4 -0
  259. package/components/popover.js.map +1 -0
  260. package/components/progress.d.ts +24 -0
  261. package/components/progress.js +4 -0
  262. package/components/progress.js.map +1 -0
  263. package/components/prompt-bar.d.ts +63 -0
  264. package/components/prompt-bar.js +6 -0
  265. package/components/prompt-bar.js.map +1 -0
  266. package/components/radio.d.ts +27 -0
  267. package/components/radio.js +4 -0
  268. package/components/radio.js.map +1 -0
  269. package/components/search-bar.d.ts +20 -0
  270. package/components/search-bar.js +5 -0
  271. package/components/search-bar.js.map +1 -0
  272. package/components/segmented-control.d.ts +32 -0
  273. package/components/segmented-control.js +5 -0
  274. package/components/segmented-control.js.map +1 -0
  275. package/components/select.d.ts +97 -0
  276. package/components/select.js +7 -0
  277. package/components/select.js.map +1 -0
  278. package/components/sheet.d.ts +37 -0
  279. package/components/sheet.js +6 -0
  280. package/components/sheet.js.map +1 -0
  281. package/components/sidebar.d.ts +52 -0
  282. package/components/sidebar.js +4 -0
  283. package/components/sidebar.js.map +1 -0
  284. package/components/skeleton.d.ts +18 -0
  285. package/components/skeleton.js +4 -0
  286. package/components/skeleton.js.map +1 -0
  287. package/components/slider.d.ts +57 -0
  288. package/components/slider.js +8 -0
  289. package/components/slider.js.map +1 -0
  290. package/components/sliding-indicator.d.ts +23 -0
  291. package/components/sliding-indicator.js +3 -0
  292. package/components/sliding-indicator.js.map +1 -0
  293. package/components/streaming-text.d.ts +33 -0
  294. package/components/streaming-text.js +4 -0
  295. package/components/streaming-text.js.map +1 -0
  296. package/components/switch.d.ts +15 -0
  297. package/components/switch.js +4 -0
  298. package/components/switch.js.map +1 -0
  299. package/components/table.d.ts +57 -0
  300. package/components/table.js +5 -0
  301. package/components/table.js.map +1 -0
  302. package/components/tabs.d.ts +45 -0
  303. package/components/tabs.js +5 -0
  304. package/components/tabs.js.map +1 -0
  305. package/components/textarea.d.ts +30 -0
  306. package/components/textarea.js +5 -0
  307. package/components/textarea.js.map +1 -0
  308. package/components/thinking.d.ts +64 -0
  309. package/components/thinking.js +5 -0
  310. package/components/thinking.js.map +1 -0
  311. package/components/toast.d.ts +71 -0
  312. package/components/toast.js +5 -0
  313. package/components/toast.js.map +1 -0
  314. package/components/toggle.d.ts +30 -0
  315. package/components/toggle.js +4 -0
  316. package/components/toggle.js.map +1 -0
  317. package/components/tooltip.d.ts +35 -0
  318. package/components/tooltip.js +5 -0
  319. package/components/tooltip.js.map +1 -0
  320. package/index.d.ts +64 -0
  321. package/index.js +230 -0
  322. package/index.js.map +1 -0
  323. package/lib/utils.d.ts +3 -0
  324. package/lib/utils.js +3 -0
  325. package/lib/utils.js.map +1 -0
  326. package/package.json +54 -4
  327. package/styles.css +2 -0
  328. package/theme/create-theme.d.ts +44 -0
  329. package/theme/index.d.ts +1 -0
@@ -0,0 +1,348 @@
1
+ import { useFieldChrome, FieldChrome, Select } from './chunk-72OCFAPT.js';
2
+ import { Button } from './chunk-HNQUX43Z.js';
3
+ import { cn } from './chunk-H63FYCMY.js';
4
+ import * as React from 'react';
5
+ import { Popover } from 'radix-ui';
6
+ import { Calendar as Calendar$1, NavArrowDown, NavArrowLeft, NavArrowRight } from 'iconoir-react';
7
+ import { jsx, jsxs } from 'react/jsx-runtime';
8
+
9
+ var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
10
+ var DOW = ["M", "T", "W", "T", "F", "S", "S"];
11
+ var DOW_FULL = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
12
+ var startOfDay = (d) => new Date(d.getFullYear(), d.getMonth(), d.getDate());
13
+ var sameDay = (a, b) => !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
14
+ var addDays = (d, n) => new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);
15
+ var addMonths = (d, n) => new Date(d.getFullYear(), d.getMonth() + n, 1);
16
+ var fullDate = new Intl.DateTimeFormat("en-US", { weekday: "long", month: "long", day: "numeric", year: "numeric" });
17
+ var formatDate = (d) => new Intl.DateTimeFormat("en-US", { month: "short", day: "numeric", year: "numeric" }).format(d);
18
+ var formatRange = ({ from, to }) => {
19
+ if (!from) return "";
20
+ if (!to || sameDay(from, to)) return formatDate(from);
21
+ const sameYear = from.getFullYear() === to.getFullYear();
22
+ const f = new Intl.DateTimeFormat("en-US", { month: "short", day: "numeric", ...sameYear ? {} : { year: "numeric" } }).format(from);
23
+ return `${f} \u2013 ${formatDate(to)}`;
24
+ };
25
+ function weeksOf(month) {
26
+ const first = new Date(month.getFullYear(), month.getMonth(), 1);
27
+ const start = addDays(first, -((first.getDay() + 6) % 7));
28
+ return Array.from({ length: 6 }, (_, w) => Array.from({ length: 7 }, (_2, i) => addDays(start, w * 7 + i)));
29
+ }
30
+ function Calendar({
31
+ mode = "single",
32
+ value,
33
+ onValueChange,
34
+ range,
35
+ onRangeChange,
36
+ month: monthProp,
37
+ onMonthChange,
38
+ months = 1,
39
+ header = "title",
40
+ min,
41
+ max,
42
+ today: todayProp,
43
+ className
44
+ }) {
45
+ const today = startOfDay(todayProp ?? /* @__PURE__ */ new Date());
46
+ const anchor = mode === "range" ? range?.from : value;
47
+ const [innerMonth, setInnerMonth] = React.useState(() => addMonths(anchor ?? today, 0));
48
+ const month = monthProp ? addMonths(monthProp, 0) : innerMonth;
49
+ const setMonth = (m) => {
50
+ if (!monthProp) setInnerMonth(m);
51
+ onMonthChange?.(m);
52
+ };
53
+ const [focus, setFocus] = React.useState(() => startOfDay(anchor ?? today));
54
+ const [hover, setHover] = React.useState(null);
55
+ const gridRef = React.useRef(null);
56
+ const disabled = (d) => min && d < startOfDay(min) || max && d > startOfDay(max) || false;
57
+ const picking = mode === "range" && !!range?.from && !range?.to;
58
+ const pick = (d) => {
59
+ if (disabled(d)) return;
60
+ if (mode === "single") return onValueChange?.(d);
61
+ if (!range?.from || range.to) return onRangeChange?.({ from: d, to: null });
62
+ onRangeChange?.(d < range.from ? { from: d, to: range.from } : { from: range.from, to: d });
63
+ };
64
+ const moveFocus = (d) => {
65
+ setFocus(d);
66
+ const last = addMonths(month, months - 1);
67
+ if (d < month) setMonth(addMonths(d, 0));
68
+ else if (d >= addMonths(last, 1)) setMonth(addMonths(d, -(months - 1)));
69
+ requestAnimationFrame(() => gridRef.current?.querySelector("[data-focus]")?.focus());
70
+ };
71
+ const onKeyDown = (e) => {
72
+ const map = {
73
+ ArrowLeft: () => addDays(focus, -1),
74
+ ArrowRight: () => addDays(focus, 1),
75
+ ArrowUp: () => addDays(focus, -7),
76
+ ArrowDown: () => addDays(focus, 7),
77
+ PageUp: () => new Date(focus.getFullYear(), focus.getMonth() - 1, focus.getDate()),
78
+ PageDown: () => new Date(focus.getFullYear(), focus.getMonth() + 1, focus.getDate()),
79
+ Home: () => addDays(focus, -((focus.getDay() + 6) % 7)),
80
+ End: () => addDays(focus, 6 - (focus.getDay() + 6) % 7)
81
+ };
82
+ if (map[e.key]) {
83
+ e.preventDefault();
84
+ const next = map[e.key]();
85
+ moveFocus(next);
86
+ if (picking) setHover(next);
87
+ } else if (e.key === "Enter" || e.key === " ") {
88
+ e.preventDefault();
89
+ pick(focus);
90
+ }
91
+ };
92
+ const navBtn = (dir, label, onClick) => /* @__PURE__ */ jsx(Button, { variant: "tertiary", size: "xs", iconOnly: true, "aria-label": label, onClick, children: dir < 0 ? /* @__PURE__ */ jsx(NavArrowLeft, { "aria-hidden": true }) : /* @__PURE__ */ jsx(NavArrowRight, { "aria-hidden": true }) });
93
+ const renderMonth = (m, i) => {
94
+ const end = range?.to ?? (picking ? hover : null);
95
+ const lo = range?.from && end ? end < range.from ? end : range.from : null;
96
+ const hi = range?.from && end ? end < range.from ? range.from : end : null;
97
+ const titleId = `cal-${m.getFullYear()}-${m.getMonth()}`;
98
+ return /* @__PURE__ */ jsxs("div", { className: "flex w-[280px] shrink-0 flex-col gap-2", children: [
99
+ header === "picker" && months === 1 ? /* @__PURE__ */ jsxs("div", { className: "flex h-8 items-center gap-1", children: [
100
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
101
+ navBtn(-1, "Previous month", () => setMonth(addMonths(month, -1))),
102
+ /* @__PURE__ */ jsx("span", { id: titleId, className: "min-w-[72px] text-center text-sm leading-5 font-medium text-text-default", children: MONTHS[m.getMonth()] }),
103
+ navBtn(1, "Next month", () => setMonth(addMonths(month, 1)))
104
+ ] }),
105
+ /* @__PURE__ */ jsx("span", { className: "flex-1" }),
106
+ /* @__PURE__ */ jsx(
107
+ Select,
108
+ {
109
+ size: "sm",
110
+ "aria-label": "Year",
111
+ value: String(m.getFullYear()),
112
+ onValueChange: (y) => setMonth(new Date(Number(y), m.getMonth(), 1)),
113
+ options: yearOptions(m.getFullYear(), today.getFullYear(), min, max),
114
+ wrapperClassName: "w-auto shrink-0",
115
+ className: "w-[92px]"
116
+ }
117
+ )
118
+ ] }) : /* @__PURE__ */ jsxs("div", { className: "flex h-8 items-center gap-1", children: [
119
+ months === 2 && (i === 0 ? navBtn(-1, "Previous month", () => setMonth(addMonths(month, -1))) : /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "size-6 shrink-0" })),
120
+ /* @__PURE__ */ jsxs("span", { id: titleId, className: cn("flex-1 text-sm leading-5 font-medium text-text-default", months === 2 && "text-center"), children: [
121
+ MONTHS[m.getMonth()],
122
+ " ",
123
+ m.getFullYear()
124
+ ] }),
125
+ months === 1 && navBtn(-1, "Previous month", () => setMonth(addMonths(month, -1))),
126
+ months === 2 && i === 0 && /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "size-6 shrink-0" }),
127
+ (months === 1 || i === 1) && navBtn(1, "Next month", () => setMonth(addMonths(month, 1)))
128
+ ] }),
129
+ /* @__PURE__ */ jsxs("div", { role: "grid", "aria-labelledby": titleId, className: "flex flex-col gap-1", onKeyDown, children: [
130
+ /* @__PURE__ */ jsx("div", { role: "row", className: "flex", children: DOW.map((d, k) => /* @__PURE__ */ jsx("span", { role: "columnheader", "aria-label": DOW_FULL[k], className: "grid h-6 w-10 place-items-center text-xs text-text-muted", children: d }, k)) }),
131
+ weeksOf(m).map((week, w) => /* @__PURE__ */ jsx("div", { role: "row", className: "flex", children: week.map((d) => {
132
+ const out = d.getMonth() !== m.getMonth();
133
+ const isSingle = mode === "single" && sameDay(d, value);
134
+ const isEnd = mode === "range" && !out && (sameDay(d, range?.from) || sameDay(d, range?.to));
135
+ const inBand = mode === "range" && !out && lo && hi && !sameDay(lo, hi) && d >= lo && d <= hi;
136
+ const bandFrom = inBand && sameDay(d, lo) ? "left-1/2" : "left-0";
137
+ const bandTo = inBand && sameDay(d, hi) ? "right-1/2" : "right-0";
138
+ const isHoverEnd = picking && !out && sameDay(d, hover) && !isEnd;
139
+ const isToday = sameDay(d, today);
140
+ const off = disabled(d);
141
+ const focused = sameDay(d, focus) && !out;
142
+ return /* @__PURE__ */ jsxs(
143
+ "div",
144
+ {
145
+ role: "gridcell",
146
+ "aria-selected": isSingle || isEnd || void 0,
147
+ onPointerEnter: () => picking && !out && !off && setHover(d),
148
+ className: "relative grid size-10 place-items-center",
149
+ children: [
150
+ inBand && /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: cn("absolute inset-y-0.5 bg-status-brand-bg", bandFrom, bandTo) }),
151
+ /* @__PURE__ */ jsxs(
152
+ "button",
153
+ {
154
+ type: "button",
155
+ tabIndex: focused ? 0 : -1,
156
+ "data-focus": focused || void 0,
157
+ disabled: off,
158
+ "aria-label": fullDate.format(d),
159
+ "aria-current": isToday ? "date" : void 0,
160
+ onClick: () => {
161
+ setFocus(d);
162
+ pick(d);
163
+ },
164
+ onFocus: () => setFocus(d),
165
+ className: cn(
166
+ "relative grid size-9 place-items-center text-sm leading-5 font-medium outline-none",
167
+ // While the end is being picked the band and the end circle move together,
168
+ // so neither fades: a fade here would trail the pointer.
169
+ !picking && "transition-[background-color,color] duration-(--duration-fast) ease-(--ease-out)",
170
+ "focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)] disabled:pointer-events-none disabled:opacity-40",
171
+ isEnd ? "rounded-md" : "rounded-full",
172
+ isSingle || isEnd ? "bg-action-primary-bg text-text-on-solid" : cn(out ? "text-text-subtle" : "text-text-default", isHoverEnd ? "bg-bg-hover" : !inBand && "hover:bg-bg-hover")
173
+ ),
174
+ children: [
175
+ d.getDate(),
176
+ isToday && !isSingle && !isEnd && /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "absolute bottom-1 left-1/2 h-0.5 w-3 -translate-x-1/2 rounded-full bg-action-primary-bg" })
177
+ ]
178
+ }
179
+ )
180
+ ]
181
+ },
182
+ d.toISOString()
183
+ );
184
+ }) }, w))
185
+ ] })
186
+ ] }, i);
187
+ };
188
+ return /* @__PURE__ */ jsx("div", { ref: gridRef, "data-slot": "calendar", className: cn("flex gap-6", className), onPointerLeave: () => setHover(null), children: Array.from({ length: months }, (_, i) => renderMonth(addMonths(month, i), i)) });
189
+ }
190
+ function yearOptions(shown, thisYear, min, max) {
191
+ const from = min ? min.getFullYear() : Math.min(shown, thisYear - 100);
192
+ const to = max ? max.getFullYear() : Math.max(shown, thisYear + 20);
193
+ return Array.from({ length: to - from + 1 }, (_, i) => {
194
+ const y = String(to - i);
195
+ return { value: y, label: y };
196
+ });
197
+ }
198
+ var surfaceClass = cn(
199
+ "rounded-xl border border-border-default bg-bg-popover",
200
+ "[box-shadow:0_4px_6px_-4px_var(--effect-shadow-sm),0_10px_15px_-3px_var(--effect-shadow-sm)]"
201
+ );
202
+ var popClass = cn(
203
+ "z-50 outline-none",
204
+ "origin-(--radix-popover-content-transform-origin) data-[state=open]:animate-[satin-enter_var(--duration-base)_var(--ease-out)]"
205
+ );
206
+ function Trigger({ text, placeholder, chrome, size, open, className, ...props }) {
207
+ return /* @__PURE__ */ jsxs(
208
+ "button",
209
+ {
210
+ type: "button",
211
+ id: chrome.controlId,
212
+ "data-slot": "date-picker-trigger",
213
+ "data-size": size,
214
+ "data-filled": text ? true : void 0,
215
+ "data-invalid": chrome.invalid || void 0,
216
+ "data-disabled": chrome.disabled || void 0,
217
+ "data-state": open ? "open" : "closed",
218
+ disabled: chrome.disabled,
219
+ "aria-invalid": chrome.invalid || void 0,
220
+ "aria-describedby": chrome.describedBy,
221
+ className: cn("satin-field cursor-pointer text-left", className),
222
+ ...props,
223
+ children: [
224
+ /* @__PURE__ */ jsx("span", { className: "satin-field-icon", "aria-hidden": true, children: /* @__PURE__ */ jsx(Calendar$1, {}) }),
225
+ /* @__PURE__ */ jsx("span", { className: cn("min-w-0 flex-1 truncate", text ? "text-text-default" : "text-text-placeholder"), children: text || placeholder }),
226
+ /* @__PURE__ */ jsx("span", { className: "satin-field-icon", "aria-hidden": true, children: /* @__PURE__ */ jsx(NavArrowDown, { className: cn("transition-transform duration-(--duration-fast) ease-(--ease-out)", open && "rotate-180") }) })
227
+ ]
228
+ }
229
+ );
230
+ }
231
+ function DatePickerPanel({ value, onValueChange, min, max, today, className }) {
232
+ return /* @__PURE__ */ jsx("div", { "data-slot": "date-picker-panel", className: cn(surfaceClass, "w-fit p-3", className), children: /* @__PURE__ */ jsx(Calendar, { header: "picker", value, onValueChange, min, max, today }) });
233
+ }
234
+ function DatePicker({
235
+ value: valueProp,
236
+ defaultValue = null,
237
+ onValueChange,
238
+ min,
239
+ max,
240
+ today,
241
+ label,
242
+ hint,
243
+ error,
244
+ placeholder = "Pick a date",
245
+ disabled,
246
+ id,
247
+ size = "md",
248
+ container,
249
+ wrapperClassName,
250
+ className
251
+ }) {
252
+ const chrome = useFieldChrome({ id, disabled, error, hint });
253
+ const [inner, setInner] = React.useState(defaultValue);
254
+ const value = valueProp !== void 0 ? valueProp : inner;
255
+ const [open, setOpen] = React.useState(false);
256
+ return /* @__PURE__ */ jsx(FieldChrome, { label, chrome, className: wrapperClassName, children: /* @__PURE__ */ jsxs(Popover.Root, { open, onOpenChange: setOpen, children: [
257
+ /* @__PURE__ */ jsx(Popover.Trigger, { asChild: true, children: /* @__PURE__ */ jsx(Trigger, { text: value ? formatDate(value) : "", placeholder, chrome, size, open, className }) }),
258
+ /* @__PURE__ */ jsx(Popover.Portal, { container, children: /* @__PURE__ */ jsx(Popover.Content, { "data-slot": "date-picker", align: "start", sideOffset: 4, collisionPadding: 8, className: popClass, children: /* @__PURE__ */ jsx(
259
+ DatePickerPanel,
260
+ {
261
+ value,
262
+ min,
263
+ max,
264
+ today,
265
+ onValueChange: (d) => {
266
+ if (valueProp === void 0) setInner(d);
267
+ onValueChange?.(d);
268
+ setOpen(false);
269
+ }
270
+ }
271
+ ) }) })
272
+ ] }) });
273
+ }
274
+ var todayDate = () => startOfDay(/* @__PURE__ */ new Date());
275
+ function DateRangePicker({
276
+ value: valueProp,
277
+ defaultValue = { from: null, to: null },
278
+ onValueChange,
279
+ min,
280
+ max,
281
+ today,
282
+ label,
283
+ hint,
284
+ error,
285
+ placeholder = "Pick dates",
286
+ disabled,
287
+ id,
288
+ size = "md",
289
+ applyLabel = "Apply",
290
+ cancelLabel = "Cancel",
291
+ container,
292
+ wrapperClassName,
293
+ className
294
+ }) {
295
+ const chrome = useFieldChrome({ id, disabled, error, hint });
296
+ const [inner, setInner] = React.useState(defaultValue);
297
+ const value = valueProp ?? inner;
298
+ const [open, setOpen] = React.useState(false);
299
+ const commit = (r) => {
300
+ if (!valueProp) setInner(r);
301
+ onValueChange?.(r);
302
+ setOpen(false);
303
+ };
304
+ return /* @__PURE__ */ jsx(FieldChrome, { label, chrome, className: wrapperClassName, children: /* @__PURE__ */ jsxs(Popover.Root, { open, onOpenChange: setOpen, children: [
305
+ /* @__PURE__ */ jsx(Popover.Trigger, { asChild: true, children: /* @__PURE__ */ jsx(Trigger, { text: formatRange(value), placeholder, chrome, size, open, className }) }),
306
+ /* @__PURE__ */ jsx(Popover.Portal, { container, children: /* @__PURE__ */ jsx(Popover.Content, { "data-slot": "date-range-picker", align: "start", sideOffset: 4, collisionPadding: 8, className: popClass, children: /* @__PURE__ */ jsx(
307
+ DateRangePickerPanel,
308
+ {
309
+ value,
310
+ min,
311
+ max,
312
+ today,
313
+ applyLabel,
314
+ cancelLabel,
315
+ onApply: commit,
316
+ onCancel: () => setOpen(false)
317
+ }
318
+ ) }) })
319
+ ] }) });
320
+ }
321
+ function DateRangePickerPanel({
322
+ value = { from: null, to: null },
323
+ onApply,
324
+ onCancel,
325
+ min,
326
+ max,
327
+ today,
328
+ applyLabel = "Apply",
329
+ cancelLabel = "Cancel",
330
+ className
331
+ }) {
332
+ const [draft, setDraft] = React.useState(value);
333
+ const [month, setMonth] = React.useState(() => addMonths(value.from ?? today ?? todayDate(), 0));
334
+ return /* @__PURE__ */ jsxs("div", { "data-slot": "date-range-picker-panel", className: cn(surfaceClass, "flex w-fit shrink-0 flex-col overflow-hidden", className), children: [
335
+ /* @__PURE__ */ jsx("div", { className: "p-3", children: /* @__PURE__ */ jsx(Calendar, { mode: "range", months: 2, range: draft, onRangeChange: setDraft, month, onMonthChange: setMonth, min, max, today }) }),
336
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-2 border-t border-border-subtle px-3 py-2", children: [
337
+ /* @__PURE__ */ jsx(Button, { variant: "secondary", onClick: () => {
338
+ setDraft(value);
339
+ onCancel?.();
340
+ }, children: cancelLabel }),
341
+ /* @__PURE__ */ jsx(Button, { disabled: !draft.from || !draft.to, onClick: () => onApply?.(draft), children: applyLabel })
342
+ ] })
343
+ ] });
344
+ }
345
+
346
+ export { Calendar, DatePicker, DatePickerPanel, DateRangePicker, DateRangePickerPanel, formatDate, formatRange };
347
+ //# sourceMappingURL=chunk-XZNHT6MO.js.map
348
+ //# sourceMappingURL=chunk-XZNHT6MO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/date-picker.tsx"],"names":["_","CalendarIcon","PopoverPrimitive"],"mappings":"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","file":"chunk-XZNHT6MO.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Popover as PopoverPrimitive } from 'radix-ui'\nimport { Calendar as CalendarIcon, NavArrowDown, NavArrowLeft, NavArrowRight } from 'iconoir-react'\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\nimport { FieldChrome, Select, useFieldChrome } from './select'\n\n/**\n * Calendar, DatePicker and DateRangePicker, 1:1 with the uiKit design (🆕 date picker).\n *\n * Calendar: one month (or two side by side), Monday first, weekdays as one letter in text/xs muted.\n * Days are 36px in 40px cells, their numbers text/sm (13px) medium. A picked day is a primary circle; the two ends of a range are\n * primary squares rounded radius-md, with a band in status/brand/bg — a tint of the brand —\n * from the middle of the first to the middle of the last. While the end is being picked the day\n * under the pointer gets a bg/hover circle and the band runs up to it. Today is a 12×2 primary\n * dash under its number; days of other months are text/subtle.\n *\n * Header: \"November 2026\" in text/sm (13px) medium, with arrows, or (`header=\"picker\"`) \"‹ November ›\" on the left and the\n * year as a small Select on the right, newest first, the shown year checked. Always six weeks, so\n * the height never jumps between months.\n *\n * Keyboard: the grid is one tab stop; arrows move a day or a week, Page Up / Down a month, Home /\n * End the week, Enter or Space picks.\n */\n\nexport type DateRange = { from: Date | null; to: Date | null }\n\nconst MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\nconst DOW = ['M', 'T', 'W', 'T', 'F', 'S', 'S']\nconst DOW_FULL = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']\n\nconst startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate())\nconst sameDay = (a?: Date | null, b?: Date | null) => !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate()\nconst addDays = (d: Date, n: number) => new Date(d.getFullYear(), d.getMonth(), d.getDate() + n)\nconst addMonths = (d: Date, n: number) => new Date(d.getFullYear(), d.getMonth() + n, 1)\nconst fullDate = new Intl.DateTimeFormat('en-US', { weekday: 'long', month: 'long', day: 'numeric', year: 'numeric' })\nexport const formatDate = (d: Date) => new Intl.DateTimeFormat('en-US', { month: 'short', day: 'numeric', year: 'numeric' }).format(d)\nexport const formatRange = ({ from, to }: DateRange) => {\n if (!from) return ''\n if (!to || sameDay(from, to)) return formatDate(from)\n const sameYear = from.getFullYear() === to.getFullYear()\n const f = new Intl.DateTimeFormat('en-US', { month: 'short', day: 'numeric', ...(sameYear ? {} : { year: 'numeric' }) }).format(from)\n return `${f} – ${formatDate(to)}`\n}\n\n/**\n * Always six weeks, Monday first, filled with the end of the month before and the start of the\n * one after, so the calendar keeps its height from month to month.\n */\nfunction weeksOf(month: Date) {\n const first = new Date(month.getFullYear(), month.getMonth(), 1)\n const start = addDays(first, -((first.getDay() + 6) % 7))\n return Array.from({ length: 6 }, (_, w) => Array.from({ length: 7 }, (_, i) => addDays(start, w * 7 + i)))\n}\n\nexport interface CalendarProps {\n mode?: 'single' | 'range'\n /** single: the picked day. */\n value?: Date | null\n onValueChange?: (value: Date) => void\n /** range: the picked range. */\n range?: DateRange\n onRangeChange?: (range: DateRange) => void\n /** The first month shown. Defaults to the value's month, or today's. */\n month?: Date\n onMonthChange?: (month: Date) => void\n /** Two months side by side (the range picker). */\n months?: 1 | 2\n header?: 'title' | 'picker'\n min?: Date\n max?: Date\n /** Today, for the dash. Defaults to now. */\n today?: Date\n className?: string\n}\n\nexport function Calendar({\n mode = 'single',\n value,\n onValueChange,\n range,\n onRangeChange,\n month: monthProp,\n onMonthChange,\n months = 1,\n header = 'title',\n min,\n max,\n today: todayProp,\n className,\n}: CalendarProps) {\n const today = startOfDay(todayProp ?? new Date())\n const anchor = mode === 'range' ? range?.from : value\n const [innerMonth, setInnerMonth] = React.useState(() => addMonths(anchor ?? today, 0))\n const month = monthProp ? addMonths(monthProp, 0) : innerMonth\n const setMonth = (m: Date) => {\n if (!monthProp) setInnerMonth(m)\n onMonthChange?.(m)\n }\n const [focus, setFocus] = React.useState<Date>(() => startOfDay(anchor ?? today))\n const [hover, setHover] = React.useState<Date | null>(null)\n const gridRef = React.useRef<HTMLDivElement>(null)\n\n const disabled = (d: Date) => (min && d < startOfDay(min)) || (max && d > startOfDay(max)) || false\n const picking = mode === 'range' && !!range?.from && !range?.to\n\n const pick = (d: Date) => {\n if (disabled(d)) return\n if (mode === 'single') return onValueChange?.(d)\n if (!range?.from || range.to) return onRangeChange?.({ from: d, to: null })\n onRangeChange?.(d < range.from ? { from: d, to: range.from } : { from: range.from, to: d })\n }\n\n const moveFocus = (d: Date) => {\n setFocus(d)\n const last = addMonths(month, months - 1)\n if (d < month) setMonth(addMonths(d, 0))\n else if (d >= addMonths(last, 1)) setMonth(addMonths(d, -(months - 1)))\n requestAnimationFrame(() => gridRef.current?.querySelector<HTMLElement>('[data-focus]')?.focus())\n }\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n const map: Record<string, () => Date> = {\n ArrowLeft: () => addDays(focus, -1),\n ArrowRight: () => addDays(focus, 1),\n ArrowUp: () => addDays(focus, -7),\n ArrowDown: () => addDays(focus, 7),\n PageUp: () => new Date(focus.getFullYear(), focus.getMonth() - 1, focus.getDate()),\n PageDown: () => new Date(focus.getFullYear(), focus.getMonth() + 1, focus.getDate()),\n Home: () => addDays(focus, -((focus.getDay() + 6) % 7)),\n End: () => addDays(focus, 6 - ((focus.getDay() + 6) % 7)),\n }\n if (map[e.key]) {\n e.preventDefault()\n const next = map[e.key]()\n moveFocus(next)\n if (picking) setHover(next)\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n pick(focus)\n }\n }\n\n const navBtn = (dir: -1 | 1, label: string, onClick: () => void) => (\n <Button variant=\"tertiary\" size=\"xs\" iconOnly aria-label={label} onClick={onClick}>\n {dir < 0 ? <NavArrowLeft aria-hidden /> : <NavArrowRight aria-hidden />}\n </Button>\n )\n\n const renderMonth = (m: Date, i: number) => {\n const end = range?.to ?? (picking ? hover : null)\n const lo = range?.from && end ? (end < range.from ? end : range.from) : null\n const hi = range?.from && end ? (end < range.from ? range.from : end) : null\n const titleId = `cal-${m.getFullYear()}-${m.getMonth()}`\n return (\n <div key={i} className=\"flex w-[280px] shrink-0 flex-col gap-2\">\n {/* Header */}\n {header === 'picker' && months === 1 ? (\n <div className=\"flex h-8 items-center gap-1\">\n <div className=\"flex items-center gap-1\">\n {navBtn(-1, 'Previous month', () => setMonth(addMonths(month, -1)))}\n <span id={titleId} className=\"min-w-[72px] text-center text-sm leading-5 font-medium text-text-default\">\n {MONTHS[m.getMonth()]}\n </span>\n {navBtn(1, 'Next month', () => setMonth(addMonths(month, 1)))}\n </div>\n <span className=\"flex-1\" />\n {/* The year: a plain Select, the shown year checked. */}\n <Select\n size=\"sm\"\n aria-label=\"Year\"\n value={String(m.getFullYear())}\n onValueChange={(y) => setMonth(new Date(Number(y), m.getMonth(), 1))}\n options={yearOptions(m.getFullYear(), today.getFullYear(), min, max)}\n wrapperClassName=\"w-auto shrink-0\"\n className=\"w-[92px]\"\n />\n </div>\n ) : (\n <div className=\"flex h-8 items-center gap-1\">\n {/* Two months: each title centred over its own month, an empty slot the arrow's size\n balancing the arrow on the other side. */}\n {months === 2 && (i === 0 ? navBtn(-1, 'Previous month', () => setMonth(addMonths(month, -1))) : <span aria-hidden className=\"size-6 shrink-0\" />)}\n <span id={titleId} className={cn('flex-1 text-sm leading-5 font-medium text-text-default', months === 2 && 'text-center')}>\n {MONTHS[m.getMonth()]} {m.getFullYear()}\n </span>\n {months === 1 && navBtn(-1, 'Previous month', () => setMonth(addMonths(month, -1)))}\n {months === 2 && i === 0 && <span aria-hidden className=\"size-6 shrink-0\" />}\n {(months === 1 || i === 1) && navBtn(1, 'Next month', () => setMonth(addMonths(month, 1)))}\n </div>\n )}\n\n {(\n <div role=\"grid\" aria-labelledby={titleId} className=\"flex flex-col gap-1\" onKeyDown={onKeyDown}>\n <div role=\"row\" className=\"flex\">\n {DOW.map((d, k) => (\n <span key={k} role=\"columnheader\" aria-label={DOW_FULL[k]} className=\"grid h-6 w-10 place-items-center text-xs text-text-muted\">\n {d}\n </span>\n ))}\n </div>\n {weeksOf(m).map((week, w) => (\n <div key={w} role=\"row\" className=\"flex\">\n {week.map((d) => {\n const out = d.getMonth() !== m.getMonth()\n const isSingle = mode === 'single' && sameDay(d, value)\n const isEnd = mode === 'range' && !out && (sameDay(d, range?.from) || sameDay(d, range?.to))\n const inBand = mode === 'range' && !out && lo && hi && !sameDay(lo, hi) && d >= lo && d <= hi\n const bandFrom = inBand && sameDay(d, lo) ? 'left-1/2' : 'left-0'\n const bandTo = inBand && sameDay(d, hi) ? 'right-1/2' : 'right-0'\n const isHoverEnd = picking && !out && sameDay(d, hover) && !isEnd\n const isToday = sameDay(d, today)\n const off = disabled(d)\n const focused = sameDay(d, focus) && !out\n return (\n <div\n key={d.toISOString()}\n role=\"gridcell\"\n aria-selected={isSingle || isEnd || undefined}\n // The whole 40px cell tracks the pointer, so the preview never stalls in the\n // gaps between the 36px days.\n onPointerEnter={() => picking && !out && !off && setHover(d)}\n className=\"relative grid size-10 place-items-center\"\n >\n {inBand && <span aria-hidden className={cn('absolute inset-y-0.5 bg-status-brand-bg', bandFrom, bandTo)} />}\n <button\n type=\"button\"\n tabIndex={focused ? 0 : -1}\n data-focus={focused || undefined}\n disabled={off}\n aria-label={fullDate.format(d)}\n aria-current={isToday ? 'date' : undefined}\n onClick={() => {\n setFocus(d)\n pick(d)\n }}\n onFocus={() => setFocus(d)}\n className={cn(\n 'relative grid size-9 place-items-center text-sm leading-5 font-medium outline-none',\n // While the end is being picked the band and the end circle move together,\n // so neither fades: a fade here would trail the pointer.\n !picking && 'transition-[background-color,color] duration-(--duration-fast) ease-(--ease-out)',\n 'focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)] disabled:pointer-events-none disabled:opacity-40',\n isEnd ? 'rounded-md' : 'rounded-full',\n isSingle || isEnd\n ? 'bg-action-primary-bg text-text-on-solid'\n : cn(out ? 'text-text-subtle' : 'text-text-default', isHoverEnd ? 'bg-bg-hover' : !inBand && 'hover:bg-bg-hover'),\n )}\n >\n {d.getDate()}\n {isToday && !isSingle && !isEnd && (\n <span aria-hidden className=\"absolute bottom-1 left-1/2 h-0.5 w-3 -translate-x-1/2 rounded-full bg-action-primary-bg\" />\n )}\n </button>\n </div>\n )\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n }\n\n return (\n <div ref={gridRef} data-slot=\"calendar\" className={cn('flex gap-6', className)} onPointerLeave={() => setHover(null)}>\n {Array.from({ length: months }, (_, i) => renderMonth(addMonths(month, i), i))}\n </div>\n )\n}\n\n/** Years for the dropdown: within min/max, or 100 back and 20 ahead of today. */\nfunction yearOptions(shown: number, thisYear: number, min?: Date, max?: Date) {\n const from = min ? min.getFullYear() : Math.min(shown, thisYear - 100)\n const to = max ? max.getFullYear() : Math.max(shown, thisYear + 20)\n return Array.from({ length: to - from + 1 }, (_, i) => {\n const y = String(to - i)\n return { value: y, label: y }\n })\n}\n\n/* ---------- pickers ---------- */\n\n/** The panels' surface: Popover's bg, border, radius and lg shadow. */\nconst surfaceClass = cn(\n 'rounded-xl border border-border-default bg-bg-popover',\n '[box-shadow:0_4px_6px_-4px_var(--effect-shadow-sm),0_10px_15px_-3px_var(--effect-shadow-sm)]',\n)\nconst popClass = cn(\n 'z-50 outline-none',\n 'origin-(--radix-popover-content-transform-origin) data-[state=open]:animate-[satin-enter_var(--duration-base)_var(--ease-out)]',\n)\n\ninterface FieldBits {\n label?: React.ReactNode\n hint?: React.ReactNode\n error?: React.ReactNode | boolean\n placeholder?: string\n disabled?: boolean\n id?: string\n size?: 'sm' | 'md' | 'lg'\n /** Classes for the outer wrapper (label + field + hint). `className` styles the field. */\n wrapperClassName?: string\n className?: string\n}\n\nfunction Trigger({ text, placeholder, chrome, size, open, className, ...props }: { text: string; placeholder: string; chrome: ReturnType<typeof useFieldChrome>; size: 'sm' | 'md' | 'lg'; open: boolean; className?: string } & React.ComponentProps<'button'>) {\n return (\n <button\n type=\"button\"\n id={chrome.controlId}\n data-slot=\"date-picker-trigger\"\n data-size={size}\n data-filled={text ? true : undefined}\n data-invalid={chrome.invalid || undefined}\n data-disabled={chrome.disabled || undefined}\n data-state={open ? 'open' : 'closed'}\n disabled={chrome.disabled}\n aria-invalid={chrome.invalid || undefined}\n aria-describedby={chrome.describedBy}\n className={cn('satin-field cursor-pointer text-left', className)}\n {...props}\n >\n <span className=\"satin-field-icon\" aria-hidden>\n <CalendarIcon />\n </span>\n <span className={cn('min-w-0 flex-1 truncate', text ? 'text-text-default' : 'text-text-placeholder')}>{text || placeholder}</span>\n <span className=\"satin-field-icon\" aria-hidden>\n <NavArrowDown className={cn('transition-transform duration-(--duration-fast) ease-(--ease-out)', open && 'rotate-180')} />\n </span>\n </button>\n )\n}\n\nexport interface DatePickerPanelProps {\n value?: Date | null\n onValueChange?: (value: Date) => void\n min?: Date\n max?: Date\n today?: Date\n className?: string\n}\n\n/** The date picker's panel on its own, in place: the popover surface with the Calendar, month and year to pick. */\nexport function DatePickerPanel({ value, onValueChange, min, max, today, className }: DatePickerPanelProps) {\n return (\n <div data-slot=\"date-picker-panel\" className={cn(surfaceClass, 'w-fit p-3', className)}>\n <Calendar header=\"picker\" value={value} onValueChange={onValueChange} min={min} max={max} today={today} />\n </div>\n )\n}\n\nexport interface DatePickerProps extends FieldBits {\n value?: Date | null\n defaultValue?: Date | null\n onValueChange?: (value: Date) => void\n min?: Date\n max?: Date\n today?: Date\n /** Portal target. */\n container?: HTMLElement | null\n}\n\n/** A date field: the kit Input's skin with a calendar icon; the Calendar opens 4px below, with month and year to pick. */\nexport function DatePicker({\n value: valueProp,\n defaultValue = null,\n onValueChange,\n min,\n max,\n today,\n label,\n hint,\n error,\n placeholder = 'Pick a date',\n disabled,\n id,\n size = 'md',\n container,\n wrapperClassName,\n className,\n}: DatePickerProps) {\n const chrome = useFieldChrome({ id, disabled, error, hint })\n const [inner, setInner] = React.useState<Date | null>(defaultValue)\n const value = valueProp !== undefined ? valueProp : inner\n const [open, setOpen] = React.useState(false)\n return (\n <FieldChrome label={label} chrome={chrome} className={wrapperClassName}>\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PopoverPrimitive.Trigger asChild>\n <Trigger text={value ? formatDate(value) : ''} placeholder={placeholder} chrome={chrome} size={size} open={open} className={className} />\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal container={container}>\n <PopoverPrimitive.Content data-slot=\"date-picker\" align=\"start\" sideOffset={4} collisionPadding={8} className={popClass}>\n <DatePickerPanel\n value={value}\n min={min}\n max={max}\n today={today}\n onValueChange={(d) => {\n if (valueProp === undefined) setInner(d)\n onValueChange?.(d)\n setOpen(false)\n }}\n />\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n </FieldChrome>\n )\n}\n\nconst todayDate = () => startOfDay(new Date())\n\nexport interface DateRangePickerProps extends FieldBits {\n value?: DateRange\n defaultValue?: DateRange\n /** Called on Apply. */\n onValueChange?: (value: DateRange) => void\n min?: Date\n max?: Date\n today?: Date\n applyLabel?: string\n cancelLabel?: string\n container?: HTMLElement | null\n}\n\n/**\n * A range field: two months, Cancel and Apply in the footer. Picks wait for Apply. Picking an\n * end before the start swaps them.\n */\nexport function DateRangePicker({\n value: valueProp,\n defaultValue = { from: null, to: null },\n onValueChange,\n min,\n max,\n today,\n label,\n hint,\n error,\n placeholder = 'Pick dates',\n disabled,\n id,\n size = 'md',\n applyLabel = 'Apply',\n cancelLabel = 'Cancel',\n container,\n wrapperClassName,\n className,\n}: DateRangePickerProps) {\n const chrome = useFieldChrome({ id, disabled, error, hint })\n const [inner, setInner] = React.useState<DateRange>(defaultValue)\n const value = valueProp ?? inner\n const [open, setOpen] = React.useState(false)\n const commit = (r: DateRange) => {\n if (!valueProp) setInner(r)\n onValueChange?.(r)\n setOpen(false)\n }\n return (\n <FieldChrome label={label} chrome={chrome} className={wrapperClassName}>\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PopoverPrimitive.Trigger asChild>\n <Trigger text={formatRange(value)} placeholder={placeholder} chrome={chrome} size={size} open={open} className={className} />\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal container={container}>\n <PopoverPrimitive.Content data-slot=\"date-range-picker\" align=\"start\" sideOffset={4} collisionPadding={8} className={popClass}>\n <DateRangePickerPanel\n value={value}\n min={min}\n max={max}\n today={today}\n applyLabel={applyLabel}\n cancelLabel={cancelLabel}\n onApply={commit}\n onCancel={() => setOpen(false)}\n />\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n </FieldChrome>\n )\n}\n\nexport interface DateRangePickerPanelProps {\n /** The range the panel starts from; picks stay in the panel until Apply. */\n value?: DateRange\n /** Apply. */\n onApply?: (value: DateRange) => void\n onCancel?: () => void\n min?: Date\n max?: Date\n today?: Date\n applyLabel?: string\n cancelLabel?: string\n className?: string\n}\n\n/** The range picker's panel on its own, in place: two months, Cancel and Apply. */\nexport function DateRangePickerPanel({\n value = { from: null, to: null },\n onApply,\n onCancel,\n min,\n max,\n today,\n applyLabel = 'Apply',\n cancelLabel = 'Cancel',\n className,\n}: DateRangePickerPanelProps) {\n const [draft, setDraft] = React.useState<DateRange>(value)\n const [month, setMonth] = React.useState(() => addMonths(value.from ?? today ?? todayDate(), 0))\n return (\n <div data-slot=\"date-range-picker-panel\" className={cn(surfaceClass, 'flex w-fit shrink-0 flex-col overflow-hidden', className)}>\n <div className=\"p-3\">\n <Calendar mode=\"range\" months={2} range={draft} onRangeChange={setDraft} month={month} onMonthChange={setMonth} min={min} max={max} today={today} />\n </div>\n <div className=\"flex items-center justify-end gap-2 border-t border-border-subtle px-3 py-2\">\n <Button variant=\"secondary\" onClick={() => { setDraft(value); onCancel?.() }}>\n {cancelLabel}\n </Button>\n <Button disabled={!draft.from || !draft.to} onClick={() => onApply?.(draft)}>\n {applyLabel}\n </Button>\n </div>\n </div>\n )\n}\n"]}
@@ -0,0 +1,44 @@
1
+ import * as React from 'react';
2
+ import { createPortal } from 'react-dom';
3
+ import { useFloating, autoUpdate, offset, flip, shift, arrow } from '@floating-ui/react-dom';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ // src/components/floating.tsx
7
+ function Floating({ anchor, side = "top", sideOffset = 8, collisionPadding = 8, className, children }) {
8
+ const arrowRef = React.useRef(null);
9
+ const [mounted, setMounted] = React.useState(false);
10
+ React.useEffect(() => setMounted(true), []);
11
+ const { refs, floatingStyles, placement, middlewareData, isPositioned } = useFloating({
12
+ strategy: "fixed",
13
+ placement: side,
14
+ elements: { reference: anchor },
15
+ whileElementsMounted: autoUpdate,
16
+ middleware: [
17
+ offset(sideOffset),
18
+ flip({ padding: collisionPadding }),
19
+ shift({ padding: collisionPadding }),
20
+ arrow({ element: arrowRef, padding: 8 })
21
+ ]
22
+ });
23
+ if (!mounted || !anchor) return null;
24
+ const actual = placement.split("-")[0];
25
+ const { x, y } = middlewareData.arrow ?? {};
26
+ const arrowStyle = actual === "top" || actual === "bottom" ? { left: x ?? void 0 } : { top: y ?? void 0 };
27
+ return createPortal(
28
+ /* @__PURE__ */ jsx(
29
+ "div",
30
+ {
31
+ ref: refs.setFloating,
32
+ "data-side": actual,
33
+ className,
34
+ style: { ...floatingStyles, zIndex: 60, visibility: isPositioned ? void 0 : "hidden" },
35
+ children: children({ side: actual, arrowRef, arrowStyle })
36
+ }
37
+ ),
38
+ document.body
39
+ );
40
+ }
41
+
42
+ export { Floating };
43
+ //# sourceMappingURL=chunk-Y5AYU7PK.js.map
44
+ //# sourceMappingURL=chunk-Y5AYU7PK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/floating.tsx"],"names":[],"mappings":";;;;;;AAoCO,SAAS,QAAA,CAAS,EAAE,MAAA,EAAQ,IAAA,GAAO,KAAA,EAAO,UAAA,GAAa,CAAA,EAAG,gBAAA,GAAmB,CAAA,EAAG,SAAA,EAAW,QAAA,EAAS,EAAkB;AAC3H,EAAA,MAAM,QAAA,GAAiB,aAA2B,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAU,eAAS,KAAK,CAAA;AAClD,EAAM,gBAAU,MAAM,UAAA,CAAW,IAAI,CAAA,EAAG,EAAE,CAAA;AAE1C,EAAA,MAAM,EAAE,IAAA,EAAM,cAAA,EAAgB,WAAW,cAAA,EAAgB,YAAA,KAAiB,WAAA,CAAY;AAAA,IACpF,QAAA,EAAU,OAAA;AAAA,IACV,SAAA,EAAW,IAAA;AAAA,IACX,QAAA,EAAU,EAAE,SAAA,EAAW,MAAA,EAAO;AAAA,IAC9B,oBAAA,EAAsB,UAAA;AAAA,IACtB,UAAA,EAAY;AAAA,MACV,OAAO,UAAU,CAAA;AAAA,MACjB,IAAA,CAAK,EAAE,OAAA,EAAS,gBAAA,EAAkB,CAAA;AAAA,MAClC,KAAA,CAAM,EAAE,OAAA,EAAS,gBAAA,EAAkB,CAAA;AAAA,MACnC,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,GAAG;AAAA;AACzC,GACD,CAAA;AAED,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,MAAA,EAAQ,OAAO,IAAA;AAChC,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACrC,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,cAAA,CAAe,SAAS,EAAC;AAC1C,EAAA,MAAM,UAAA,GAAkC,MAAA,KAAW,KAAA,IAAS,MAAA,KAAW,QAAA,GAAW,EAAE,IAAA,EAAM,CAAA,IAAK,MAAA,EAAU,GAAI,EAAE,GAAA,EAAK,KAAK,MAAA,EAAU;AAEnI,EAAA,OAAO,YAAA;AAAA,oBACL,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAK,IAAA,CAAK,WAAA;AAAA,QACV,WAAA,EAAW,MAAA;AAAA,QACX,SAAA;AAAA,QAEA,KAAA,EAAO,EAAE,GAAG,cAAA,EAAgB,QAAQ,EAAA,EAAI,UAAA,EAAY,YAAA,GAAe,MAAA,GAAY,QAAA,EAAS;AAAA,QAEvF,mBAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,YAAY;AAAA;AAAA,KAClD;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AACF","file":"chunk-Y5AYU7PK.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { arrow, autoUpdate, flip, offset, shift, useFloating } from '@floating-ui/react-dom'\n\n/**\n * Anchored positioning for anything that floats next to an element: tooltips, chart\n * tooltips, small hints. Built on Floating UI (the engine Radix uses for Tooltip, Popover and\n * DropdownMenu), so every floating layer in Satin keeps the same rules:\n *\n * - it renders in a portal on `body`, so a card's `overflow: hidden` never cuts it off;\n * - it flips to the other side when there's no room and slides along the edge to stay\n * 8px inside the viewport;\n * - its pointer follows the anchor when it slides;\n * - it follows the anchor on scroll and resize.\n */\nexport type FloatingSide = 'top' | 'right' | 'bottom' | 'left'\n\nexport interface FloatingProps {\n /** The element it points at. Nothing renders while it's null. */\n anchor: Element | null\n side?: FloatingSide\n /** Gap between the anchor and the layer, pointer included. */\n sideOffset?: number\n /** How close to the viewport edge it may go. */\n collisionPadding?: number\n className?: string\n /** Gets the side it ended up on and the pointer's props (ref and position). */\n children: (state: {\n side: FloatingSide\n arrowRef: React.RefObject<HTMLElement | null>\n arrowStyle: React.CSSProperties\n }) => React.ReactNode\n}\n\nexport function Floating({ anchor, side = 'top', sideOffset = 8, collisionPadding = 8, className, children }: FloatingProps) {\n const arrowRef = React.useRef<HTMLElement | null>(null)\n const [mounted, setMounted] = React.useState(false)\n React.useEffect(() => setMounted(true), [])\n\n const { refs, floatingStyles, placement, middlewareData, isPositioned } = useFloating({\n strategy: 'fixed',\n placement: side,\n elements: { reference: anchor },\n whileElementsMounted: autoUpdate,\n middleware: [\n offset(sideOffset),\n flip({ padding: collisionPadding }),\n shift({ padding: collisionPadding }),\n arrow({ element: arrowRef, padding: 8 }),\n ],\n })\n\n if (!mounted || !anchor) return null\n const actual = placement.split('-')[0] as FloatingSide\n const { x, y } = middlewareData.arrow ?? {}\n const arrowStyle: React.CSSProperties = actual === 'top' || actual === 'bottom' ? { left: x ?? undefined } : { top: y ?? undefined }\n\n return createPortal(\n <div\n ref={refs.setFloating}\n data-side={actual}\n className={className}\n // Hidden until the first position lands, so it never flashes in the corner.\n style={{ ...floatingStyles, zIndex: 60, visibility: isPositioned ? undefined : 'hidden' }}\n >\n {children({ side: actual, arrowRef, arrowStyle })}\n </div>,\n document.body,\n )\n}\n"]}
@@ -0,0 +1,28 @@
1
+ import { cn } from './chunk-H63FYCMY.js';
2
+ import 'react';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
5
+ function Skeleton({ shape = "text", animated = false, width, height, className, style, ...props }) {
6
+ return /* @__PURE__ */ jsx(
7
+ "div",
8
+ {
9
+ "aria-hidden": true,
10
+ "data-slot": "skeleton",
11
+ "data-shape": shape,
12
+ "data-animated": animated || void 0,
13
+ className: cn(
14
+ "satin-skeleton relative shrink-0 overflow-hidden bg-bg-muted",
15
+ shape === "text" && "h-3 w-60 max-w-full rounded-sm",
16
+ shape === "circle" && "size-8 rounded-full",
17
+ shape === "rect" && "h-30 w-60 max-w-full rounded-lg",
18
+ className
19
+ ),
20
+ style: { width, height, ...style },
21
+ ...props
22
+ }
23
+ );
24
+ }
25
+
26
+ export { Skeleton };
27
+ //# sourceMappingURL=chunk-YG7JOOLJ.js.map
28
+ //# sourceMappingURL=chunk-YG7JOOLJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/skeleton.tsx"],"names":[],"mappings":";;;;AAsBO,SAAS,QAAA,CAAS,EAAE,KAAA,GAAQ,MAAA,EAAQ,QAAA,GAAW,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,GAAG,KAAA,EAAM,EAAkB;AACvH,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAW,IAAA;AAAA,MACX,WAAA,EAAU,UAAA;AAAA,MACV,YAAA,EAAY,KAAA;AAAA,MACZ,iBAAe,QAAA,IAAY,MAAA;AAAA,MAC3B,SAAA,EAAW,EAAA;AAAA,QACT,8DAAA;AAAA,QACA,UAAU,MAAA,IAAU,gCAAA;AAAA,QACpB,UAAU,QAAA,IAAY,qBAAA;AAAA,QACtB,UAAU,MAAA,IAAU,iCAAA;AAAA,QACpB;AAAA,OACF;AAAA,MACA,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,GAAG,KAAA,EAAM;AAAA,MAChC,GAAG;AAAA;AAAA,GACN;AAEJ","file":"chunk-YG7JOOLJ.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../lib/utils'\n\n/**\n * Skeleton, 1:1 with the uiKit `Skeleton` set (4025:3862): a bg/muted placeholder in three\n * shapes. text is a 12px line at radius-sm (240 wide by default), circle 32px round, rect\n * 240 × 120 at radius-lg. Size it with `width` / `height` or classes.\n *\n * `animated` runs a soft band across the block (a 6% wash of text/default, so it lightens in\n * Dark and darkens in Light), 1.6 s a pass on ease-in-out; with reduced motion it stays still.\n *\n * The blocks are aria-hidden: put `aria-busy` on the region that is loading.\n */\nexport interface SkeletonProps extends React.ComponentProps<'div'> {\n shape?: 'text' | 'circle' | 'rect'\n animated?: boolean\n width?: number | string\n height?: number | string\n}\n\nexport function Skeleton({ shape = 'text', animated = false, width, height, className, style, ...props }: SkeletonProps) {\n return (\n <div\n aria-hidden\n data-slot=\"skeleton\"\n data-shape={shape}\n data-animated={animated || undefined}\n className={cn(\n 'satin-skeleton relative shrink-0 overflow-hidden bg-bg-muted',\n shape === 'text' && 'h-3 w-60 max-w-full rounded-sm',\n shape === 'circle' && 'size-8 rounded-full',\n shape === 'rect' && 'h-30 w-60 max-w-full rounded-lg',\n className,\n )}\n style={{ width, height, ...style }}\n {...props}\n />\n )\n}\n"]}