@nocoo/basalt 2.0.0-rc.1

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 (301) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -0
  3. package/dist/charts/area.d.ts +8 -0
  4. package/dist/charts/area.js +55 -0
  5. package/dist/charts/area.js.map +1 -0
  6. package/dist/charts/bar.d.ts +9 -0
  7. package/dist/charts/bar.js +42 -0
  8. package/dist/charts/bar.js.map +1 -0
  9. package/dist/charts/bullet.d.ts +8 -0
  10. package/dist/charts/bullet.js +50 -0
  11. package/dist/charts/bullet.js.map +1 -0
  12. package/dist/charts/chart-colors.d.ts +1 -0
  13. package/dist/charts/chart-colors.js +3 -0
  14. package/dist/charts/charts.d.ts +6 -0
  15. package/dist/charts/charts.js +15 -0
  16. package/dist/charts/charts.js.map +1 -0
  17. package/dist/charts/config.d.ts +117 -0
  18. package/dist/charts/config.js +117 -0
  19. package/dist/charts/config.js.map +1 -0
  20. package/dist/charts/custom-chart.d.ts +6 -0
  21. package/dist/charts/custom-chart.js +15 -0
  22. package/dist/charts/custom-chart.js.map +1 -0
  23. package/dist/charts/date-navigation.d.ts +22 -0
  24. package/dist/charts/date-navigation.js +122 -0
  25. package/dist/charts/date-navigation.js.map +1 -0
  26. package/dist/charts/donut.d.ts +8 -0
  27. package/dist/charts/donut.js +36 -0
  28. package/dist/charts/donut.js.map +1 -0
  29. package/dist/charts/frame.d.ts +9 -0
  30. package/dist/charts/frame.js +22 -0
  31. package/dist/charts/frame.js.map +1 -0
  32. package/dist/charts/funnel.d.ts +7 -0
  33. package/dist/charts/funnel.js +35 -0
  34. package/dist/charts/funnel.js.map +1 -0
  35. package/dist/charts/gauge.d.ts +8 -0
  36. package/dist/charts/gauge.js +46 -0
  37. package/dist/charts/gauge.js.map +1 -0
  38. package/dist/charts/grouped-bar.d.ts +7 -0
  39. package/dist/charts/grouped-bar.js +42 -0
  40. package/dist/charts/grouped-bar.js.map +1 -0
  41. package/dist/charts/heatmap-calendar.d.ts +27 -0
  42. package/dist/charts/heatmap-calendar.js +200 -0
  43. package/dist/charts/heatmap-calendar.js.map +1 -0
  44. package/dist/charts/item-list.d.ts +9 -0
  45. package/dist/charts/item-list.js +22 -0
  46. package/dist/charts/item-list.js.map +1 -0
  47. package/dist/charts/line.d.ts +9 -0
  48. package/dist/charts/line.js +58 -0
  49. package/dist/charts/line.js.map +1 -0
  50. package/dist/charts/palette.d.ts +33 -0
  51. package/dist/charts/palette.js +44 -0
  52. package/dist/charts/palette.js.map +1 -0
  53. package/dist/charts/radar.d.ts +6 -0
  54. package/dist/charts/radar.js +37 -0
  55. package/dist/charts/radar.js.map +1 -0
  56. package/dist/charts/sample.d.ts +42 -0
  57. package/dist/charts/sample.js +124 -0
  58. package/dist/charts/sample.js.map +1 -0
  59. package/dist/charts/sankey.d.ts +6 -0
  60. package/dist/charts/sankey.js +51 -0
  61. package/dist/charts/sankey.js.map +1 -0
  62. package/dist/charts/slot-bar.d.ts +15 -0
  63. package/dist/charts/slot-bar.js +80 -0
  64. package/dist/charts/slot-bar.js.map +1 -0
  65. package/dist/charts/sparkline.d.ts +6 -0
  66. package/dist/charts/sparkline.js +29 -0
  67. package/dist/charts/sparkline.js.map +1 -0
  68. package/dist/charts/stacked-bar.d.ts +7 -0
  69. package/dist/charts/stacked-bar.js +51 -0
  70. package/dist/charts/stacked-bar.js.map +1 -0
  71. package/dist/charts/stat-card.d.ts +21 -0
  72. package/dist/charts/stat-card.js +66 -0
  73. package/dist/charts/stat-card.js.map +1 -0
  74. package/dist/charts/timeline.d.ts +17 -0
  75. package/dist/charts/timeline.js +79 -0
  76. package/dist/charts/timeline.js.map +1 -0
  77. package/dist/charts/timeseries.d.ts +6 -0
  78. package/dist/charts/timeseries.js +15 -0
  79. package/dist/charts/timeseries.js.map +1 -0
  80. package/dist/components/accordion.d.ts +6 -0
  81. package/dist/components/accordion.js +21 -0
  82. package/dist/components/accordion.js.map +1 -0
  83. package/dist/components/alert-dialog.d.ts +25 -0
  84. package/dist/components/alert-dialog.js +61 -0
  85. package/dist/components/alert-dialog.js.map +1 -0
  86. package/dist/components/app-header.d.ts +10 -0
  87. package/dist/components/app-header.js +35 -0
  88. package/dist/components/app-header.js.map +1 -0
  89. package/dist/components/app-shell.d.ts +4 -0
  90. package/dist/components/app-shell.js +29 -0
  91. package/dist/components/app-shell.js.map +1 -0
  92. package/dist/components/autocomplete.d.ts +47 -0
  93. package/dist/components/autocomplete.js +28 -0
  94. package/dist/components/autocomplete.js.map +1 -0
  95. package/dist/components/avatar.d.ts +5 -0
  96. package/dist/components/avatar.js +28 -0
  97. package/dist/components/avatar.js.map +1 -0
  98. package/dist/components/badge.d.ts +10 -0
  99. package/dist/components/badge.js +37 -0
  100. package/dist/components/badge.js.map +1 -0
  101. package/dist/components/banner.d.ts +22 -0
  102. package/dist/components/banner.js +88 -0
  103. package/dist/components/banner.js.map +1 -0
  104. package/dist/components/basalt-mark.d.ts +8 -0
  105. package/dist/components/basalt-mark.js +17 -0
  106. package/dist/components/basalt-mark.js.map +1 -0
  107. package/dist/components/breadcrumbs.d.ts +9 -0
  108. package/dist/components/breadcrumbs.js +38 -0
  109. package/dist/components/breadcrumbs.js.map +1 -0
  110. package/dist/components/button.d.ts +17 -0
  111. package/dist/components/button.js +73 -0
  112. package/dist/components/button.js.map +1 -0
  113. package/dist/components/checkbox.d.ts +86 -0
  114. package/dist/components/checkbox.js +107 -0
  115. package/dist/components/checkbox.js.map +1 -0
  116. package/dist/components/clipboard-text.d.ts +5 -0
  117. package/dist/components/clipboard-text.js +33 -0
  118. package/dist/components/clipboard-text.js.map +1 -0
  119. package/dist/components/code.d.ts +26 -0
  120. package/dist/components/code.js +45 -0
  121. package/dist/components/code.js.map +1 -0
  122. package/dist/components/collapsible.d.ts +33 -0
  123. package/dist/components/collapsible.js +38 -0
  124. package/dist/components/collapsible.js.map +1 -0
  125. package/dist/components/combobox.d.ts +47 -0
  126. package/dist/components/combobox.js +28 -0
  127. package/dist/components/combobox.js.map +1 -0
  128. package/dist/components/command-palette.d.ts +83 -0
  129. package/dist/components/command-palette.js +90 -0
  130. package/dist/components/command-palette.js.map +1 -0
  131. package/dist/components/confirm-dialog.d.ts +52 -0
  132. package/dist/components/confirm-dialog.js +61 -0
  133. package/dist/components/confirm-dialog.js.map +1 -0
  134. package/dist/components/context-menu.d.ts +7 -0
  135. package/dist/components/context-menu.js +23 -0
  136. package/dist/components/context-menu.js.map +1 -0
  137. package/dist/components/data-table.d.ts +76 -0
  138. package/dist/components/data-table.js +230 -0
  139. package/dist/components/data-table.js.map +1 -0
  140. package/dist/components/date-picker.d.ts +90 -0
  141. package/dist/components/date-picker.js +452 -0
  142. package/dist/components/date-picker.js.map +1 -0
  143. package/dist/components/dialog.d.ts +37 -0
  144. package/dist/components/dialog.js +67 -0
  145. package/dist/components/dialog.js.map +1 -0
  146. package/dist/components/dropdown-menu.d.ts +38 -0
  147. package/dist/components/dropdown-menu.js +24 -0
  148. package/dist/components/dropdown-menu.js.map +1 -0
  149. package/dist/components/empty.d.ts +6 -0
  150. package/dist/components/empty.js +28 -0
  151. package/dist/components/empty.js.map +1 -0
  152. package/dist/components/field.d.ts +39 -0
  153. package/dist/components/field.js +52 -0
  154. package/dist/components/field.js.map +1 -0
  155. package/dist/components/flow.d.ts +24 -0
  156. package/dist/components/flow.js +56 -0
  157. package/dist/components/flow.js.map +1 -0
  158. package/dist/components/grid.d.ts +15 -0
  159. package/dist/components/grid.js +24 -0
  160. package/dist/components/grid.js.map +1 -0
  161. package/dist/components/hover-card.d.ts +5 -0
  162. package/dist/components/hover-card.js +18 -0
  163. package/dist/components/hover-card.js.map +1 -0
  164. package/dist/components/input-area.d.ts +19 -0
  165. package/dist/components/input-area.js +27 -0
  166. package/dist/components/input-area.js.map +1 -0
  167. package/dist/components/input-group.d.ts +70 -0
  168. package/dist/components/input-group.js +78 -0
  169. package/dist/components/input-group.js.map +1 -0
  170. package/dist/components/input.d.ts +19 -0
  171. package/dist/components/input.js +28 -0
  172. package/dist/components/input.js.map +1 -0
  173. package/dist/components/label.d.ts +20 -0
  174. package/dist/components/label.js +34 -0
  175. package/dist/components/label.js.map +1 -0
  176. package/dist/components/layer-card.d.ts +69 -0
  177. package/dist/components/layer-card.js +104 -0
  178. package/dist/components/layer-card.js.map +1 -0
  179. package/dist/components/link.d.ts +8 -0
  180. package/dist/components/link.js +18 -0
  181. package/dist/components/link.js.map +1 -0
  182. package/dist/components/loader.d.ts +4 -0
  183. package/dist/components/loader.js +66 -0
  184. package/dist/components/loader.js.map +1 -0
  185. package/dist/components/loading-screen.d.ts +5 -0
  186. package/dist/components/loading-screen.js +24 -0
  187. package/dist/components/loading-screen.js.map +1 -0
  188. package/dist/components/menu-bar.d.ts +8 -0
  189. package/dist/components/menu-bar.js +42 -0
  190. package/dist/components/menu-bar.js.map +1 -0
  191. package/dist/components/meter.d.ts +8 -0
  192. package/dist/components/meter.js +26 -0
  193. package/dist/components/meter.js.map +1 -0
  194. package/dist/components/navigation-menu.d.ts +6 -0
  195. package/dist/components/navigation-menu.js +16 -0
  196. package/dist/components/navigation-menu.js.map +1 -0
  197. package/dist/components/overlay.d.ts +16 -0
  198. package/dist/components/overlay.js +14 -0
  199. package/dist/components/overlay.js.map +1 -0
  200. package/dist/components/page-header.d.ts +19 -0
  201. package/dist/components/page-header.js +43 -0
  202. package/dist/components/page-header.js.map +1 -0
  203. package/dist/components/pagination.d.ts +35 -0
  204. package/dist/components/pagination.js +68 -0
  205. package/dist/components/pagination.js.map +1 -0
  206. package/dist/components/popover.d.ts +38 -0
  207. package/dist/components/popover.js +65 -0
  208. package/dist/components/popover.js.map +1 -0
  209. package/dist/components/radio.d.ts +108 -0
  210. package/dist/components/radio.js +80 -0
  211. package/dist/components/radio.js.map +1 -0
  212. package/dist/components/scroll-area.d.ts +15 -0
  213. package/dist/components/scroll-area.js +49 -0
  214. package/dist/components/scroll-area.js.map +1 -0
  215. package/dist/components/segment-control.d.ts +35 -0
  216. package/dist/components/segment-control.js +46 -0
  217. package/dist/components/segment-control.js.map +1 -0
  218. package/dist/components/select.d.ts +99 -0
  219. package/dist/components/select.js +51 -0
  220. package/dist/components/select.js.map +1 -0
  221. package/dist/components/sensitive-input.d.ts +23 -0
  222. package/dist/components/sensitive-input.js +43 -0
  223. package/dist/components/sensitive-input.js.map +1 -0
  224. package/dist/components/separator.d.ts +26 -0
  225. package/dist/components/separator.js +18 -0
  226. package/dist/components/separator.js.map +1 -0
  227. package/dist/components/sheet.d.ts +26 -0
  228. package/dist/components/sheet.js +49 -0
  229. package/dist/components/sheet.js.map +1 -0
  230. package/dist/components/sidebar.d.ts +101 -0
  231. package/dist/components/sidebar.js +260 -0
  232. package/dist/components/sidebar.js.map +1 -0
  233. package/dist/components/skeleton-line.d.ts +6 -0
  234. package/dist/components/skeleton-line.js +22 -0
  235. package/dist/components/skeleton-line.js.map +1 -0
  236. package/dist/components/slider.d.ts +3 -0
  237. package/dist/components/slider.js +21 -0
  238. package/dist/components/slider.js.map +1 -0
  239. package/dist/components/stat-strip.d.ts +19 -0
  240. package/dist/components/stat-strip.js +27 -0
  241. package/dist/components/stat-strip.js.map +1 -0
  242. package/dist/components/switch.d.ts +85 -0
  243. package/dist/components/switch.js +94 -0
  244. package/dist/components/switch.js.map +1 -0
  245. package/dist/components/table-of-contents.d.ts +33 -0
  246. package/dist/components/table-of-contents.js +37 -0
  247. package/dist/components/table-of-contents.js.map +1 -0
  248. package/dist/components/table-pager.d.ts +26 -0
  249. package/dist/components/table-pager.js +35 -0
  250. package/dist/components/table-pager.js.map +1 -0
  251. package/dist/components/table.d.ts +45 -0
  252. package/dist/components/table.js +32 -0
  253. package/dist/components/table.js.map +1 -0
  254. package/dist/components/tabs.d.ts +65 -0
  255. package/dist/components/tabs.js +56 -0
  256. package/dist/components/tabs.js.map +1 -0
  257. package/dist/components/text.d.ts +32 -0
  258. package/dist/components/text.js +46 -0
  259. package/dist/components/text.js.map +1 -0
  260. package/dist/components/theme-toggle.d.ts +7 -0
  261. package/dist/components/theme-toggle.js +28 -0
  262. package/dist/components/theme-toggle.js.map +1 -0
  263. package/dist/components/toast.d.ts +27 -0
  264. package/dist/components/toast.js +78 -0
  265. package/dist/components/toast.js.map +1 -0
  266. package/dist/components/toggle-group.d.ts +4 -0
  267. package/dist/components/toggle-group.js +48 -0
  268. package/dist/components/toggle-group.js.map +1 -0
  269. package/dist/components/toggle.d.ts +7 -0
  270. package/dist/components/toggle.js +37 -0
  271. package/dist/components/toggle.js.map +1 -0
  272. package/dist/components/toolbar.d.ts +58 -0
  273. package/dist/components/toolbar.js +76 -0
  274. package/dist/components/toolbar.js.map +1 -0
  275. package/dist/components/tooltip.d.ts +13 -0
  276. package/dist/components/tooltip.js +18 -0
  277. package/dist/components/tooltip.js.map +1 -0
  278. package/dist/components/typeahead-field.d.ts +24 -0
  279. package/dist/components/typeahead-field.js +177 -0
  280. package/dist/components/typeahead-field.js.map +1 -0
  281. package/dist/index.d.ts +33 -0
  282. package/dist/index.js +35 -0
  283. package/dist/providers/link.d.ts +12 -0
  284. package/dist/providers/link.js +18 -0
  285. package/dist/providers/link.js.map +1 -0
  286. package/dist/providers/theme.d.ts +11 -0
  287. package/dist/providers/theme.js +43 -0
  288. package/dist/providers/theme.js.map +1 -0
  289. package/dist/styles/standalone.css +2233 -0
  290. package/dist/styles/tailwind.css +103 -0
  291. package/dist/styles/tokens.css +277 -0
  292. package/dist/utils/cn.d.ts +2 -0
  293. package/dist/utils/cn.js +11 -0
  294. package/dist/utils/cn.js.map +1 -0
  295. package/dist/utils/control-surface.d.ts +2 -0
  296. package/dist/utils/control-surface.js +11 -0
  297. package/dist/utils/control-surface.js.map +1 -0
  298. package/dist/utils/selection-indicator.d.ts +24 -0
  299. package/dist/utils/selection-indicator.js +108 -0
  300. package/dist/utils/selection-indicator.js.map +1 -0
  301. package/package.json +107 -0
@@ -0,0 +1,122 @@
1
+ "use client";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import { Button as t } from "../components/button.js";
4
+ import { DatePicker as n } from "../components/date-picker.js";
5
+ import { useState as r } from "react";
6
+ import { Calendar as i, ChevronLeft as a, ChevronRight as o } from "lucide-react";
7
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
8
+ //#region src/charts/date-navigation.tsx
9
+ function l(e, t) {
10
+ let n = /^(\d{4,})-(\d{2})-(\d{2})$/.exec(e), r = n ? new Date(Number(n[1]), Number(n[2]) - 1, Number(n[3])) : /* @__PURE__ */ new Date();
11
+ return r.setDate(r.getDate() + t), `${r.getFullYear()}-${String(r.getMonth() + 1).padStart(2, "0")}-${String(r.getDate()).padStart(2, "0")}`;
12
+ }
13
+ function u(e, t) {
14
+ let n = new Intl.DateTimeFormat("en-CA", {
15
+ timeZone: t,
16
+ year: "numeric",
17
+ month: "2-digit",
18
+ day: "2-digit"
19
+ }).formatToParts(e), r = (e) => Number(n.find((t) => t.type === e)?.value);
20
+ return {
21
+ y: r("year"),
22
+ m: r("month"),
23
+ d: r("day")
24
+ };
25
+ }
26
+ function d(e, t) {
27
+ return e.y === t.y && e.m === t.m && e.d === t.d;
28
+ }
29
+ function f(e) {
30
+ return "onPrevDay" in e ? /* @__PURE__ */ s(m, { ...e }) : /* @__PURE__ */ s(p, { ...e });
31
+ }
32
+ function p({ value: e, defaultValue: i = "", onChange: u, disabled: d, ariaLabel: f, "aria-label": p, ...m }) {
33
+ let [h, g] = r(e ?? i), _ = e ?? h;
34
+ function v(t) {
35
+ e === void 0 && g(t), u?.(t);
36
+ }
37
+ return /* @__PURE__ */ c("div", {
38
+ className: "inline-flex items-center gap-1",
39
+ children: [
40
+ /* @__PURE__ */ s(t, {
41
+ variant: "outline",
42
+ size: "icon",
43
+ disabled: d,
44
+ "aria-label": "Previous day",
45
+ onClick: () => v(l(_, -1)),
46
+ children: /* @__PURE__ */ s(a, {})
47
+ }),
48
+ /* @__PURE__ */ s(n, {
49
+ ...m,
50
+ value: _,
51
+ disabled: d,
52
+ onChange: v,
53
+ "aria-label": f ?? p ?? "Date navigation"
54
+ }),
55
+ /* @__PURE__ */ s(t, {
56
+ variant: "outline",
57
+ size: "icon",
58
+ disabled: d,
59
+ "aria-label": "Next day",
60
+ onClick: () => v(l(_, 1)),
61
+ children: /* @__PURE__ */ s(o, {})
62
+ })
63
+ ]
64
+ });
65
+ }
66
+ function m({ selectedDate: t, onPrevDay: n, onNextDay: r, onToday: l, onToggleCalendar: f, todayLabel: p = "Today", previousDayLabel: m = "Previous day", nextDayLabel: h = "Next day", formatDate: g, locale: _ = "en-US", timeZone: v, className: y }) {
67
+ let b = g ?? ((e) => e.toLocaleDateString(_, {
68
+ weekday: "short",
69
+ year: "numeric",
70
+ month: "short",
71
+ day: "numeric",
72
+ timeZone: v
73
+ })), x = d(u(t, v), u(/* @__PURE__ */ new Date(), v)), S = b(t);
74
+ return /* @__PURE__ */ c("div", {
75
+ className: e("flex items-center justify-center gap-2", y),
76
+ children: [
77
+ /* @__PURE__ */ s("button", {
78
+ type: "button",
79
+ onClick: l,
80
+ disabled: x,
81
+ className: e("mr-2 rounded-lg px-3 py-1.5 text-sm font-medium transition-colors", x ? "cursor-not-allowed text-basalt-muted-foreground opacity-50" : "bg-basalt-secondary text-basalt-foreground hover:bg-basalt-accent"),
82
+ children: p
83
+ }),
84
+ /* @__PURE__ */ s("button", {
85
+ type: "button",
86
+ onClick: n,
87
+ "aria-label": m,
88
+ className: "flex h-8 w-8 items-center justify-center rounded-lg text-basalt-muted-foreground transition-colors hover:bg-basalt-accent hover:text-basalt-foreground",
89
+ children: /* @__PURE__ */ s(a, {
90
+ className: "h-4 w-4",
91
+ strokeWidth: 1.5
92
+ })
93
+ }),
94
+ f ? /* @__PURE__ */ c("button", {
95
+ type: "button",
96
+ onClick: f,
97
+ className: "flex cursor-pointer items-center gap-2 rounded-lg px-3 py-1.5 text-lg font-medium transition-colors hover:bg-basalt-accent",
98
+ children: [/* @__PURE__ */ s("span", { children: S }), /* @__PURE__ */ s(i, {
99
+ className: "h-4 w-4 text-basalt-muted-foreground",
100
+ strokeWidth: 1.5
101
+ })]
102
+ }) : /* @__PURE__ */ s("span", {
103
+ className: "flex items-center gap-2 rounded-lg px-3 py-1.5 text-lg font-medium",
104
+ children: S
105
+ }),
106
+ /* @__PURE__ */ s("button", {
107
+ type: "button",
108
+ onClick: r,
109
+ "aria-label": h,
110
+ className: "flex h-8 w-8 items-center justify-center rounded-lg text-basalt-muted-foreground transition-colors hover:bg-basalt-accent hover:text-basalt-foreground",
111
+ children: /* @__PURE__ */ s(o, {
112
+ className: "h-4 w-4",
113
+ strokeWidth: 1.5
114
+ })
115
+ })
116
+ ]
117
+ });
118
+ }
119
+ //#endregion
120
+ export { f as DateNavigation };
121
+
122
+ //# sourceMappingURL=date-navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-navigation.js","names":[],"sources":["../../src/charts/date-navigation.tsx"],"sourcesContent":["import { Calendar as CalendarIcon, ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { type ComponentProps, useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { DatePicker } from \"../components/date-picker\";\nimport { cn } from \"../utils/cn\";\n\nfunction shiftIso(value: string, delta: number) {\n\tconst match = /^(\\d{4,})-(\\d{2})-(\\d{2})$/.exec(value);\n\tconst date = match\n\t\t? new Date(Number(match[1]), Number(match[2]) - 1, Number(match[3]))\n\t\t: new Date();\n\tdate.setDate(date.getDate() + delta);\n\tconst year = date.getFullYear();\n\tconst month = String(date.getMonth() + 1).padStart(2, \"0\");\n\tconst day = String(date.getDate()).padStart(2, \"0\");\n\treturn `${year}-${month}-${day}`;\n}\n\nfunction civilInZone(date: Date, timeZone?: string) {\n\tconst parts = new Intl.DateTimeFormat(\"en-CA\", {\n\t\ttimeZone,\n\t\tyear: \"numeric\",\n\t\tmonth: \"2-digit\",\n\t\tday: \"2-digit\",\n\t}).formatToParts(date);\n\tconst read = (type: Intl.DateTimeFormatPartTypes) =>\n\t\tNumber(parts.find((part) => part.type === type)?.value);\n\treturn { y: read(\"year\"), m: read(\"month\"), d: read(\"day\") };\n}\n\nfunction isSameCivil(\n\tleft: { y: number; m: number; d: number },\n\tright: { y: number; m: number; d: number },\n) {\n\treturn left.y === right.y && left.m === right.m && left.d === right.d;\n}\n\ntype PickerProps = ComponentProps<typeof DatePicker> & {\n\tariaLabel?: string;\n\tselectedDate?: undefined;\n};\n\ntype DisplayProps = {\n\tselectedDate: Date;\n\tonPrevDay: () => void;\n\tonNextDay: () => void;\n\tonToday: () => void;\n\tonToggleCalendar?: () => void;\n\ttodayLabel?: string;\n\tpreviousDayLabel?: string;\n\tnextDayLabel?: string;\n\tformatDate?: (date: Date) => string;\n\tlocale?: string;\n\ttimeZone?: string;\n\tclassName?: string;\n};\n\nexport function DateNavigation(props: PickerProps | DisplayProps) {\n\tif (\"onPrevDay\" in props) {\n\t\treturn <DateNavigationDisplay {...props} />;\n\t}\n\treturn <DateNavigationPicker {...props} />;\n}\n\nfunction DateNavigationPicker({\n\tvalue,\n\tdefaultValue = \"\",\n\tonChange,\n\tdisabled,\n\tariaLabel,\n\t\"aria-label\": ariaLabelAttr,\n\t...props\n}: PickerProps) {\n\tconst [uncontrolled, setUncontrolled] = useState(value ?? defaultValue);\n\tconst selected = value ?? uncontrolled;\n\tfunction commit(next: string) {\n\t\tif (value === undefined) {\n\t\t\tsetUncontrolled(next);\n\t\t}\n\t\tonChange?.(next);\n\t}\n\treturn (\n\t\t<div className=\"inline-flex items-center gap-1\">\n\t\t\t<Button\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tsize=\"icon\"\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-label=\"Previous day\"\n\t\t\t\tonClick={() => commit(shiftIso(selected, -1))}\n\t\t\t>\n\t\t\t\t<ChevronLeft />\n\t\t\t</Button>\n\t\t\t<DatePicker\n\t\t\t\t{...props}\n\t\t\t\tvalue={selected}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tonChange={commit}\n\t\t\t\taria-label={ariaLabel ?? ariaLabelAttr ?? \"Date navigation\"}\n\t\t\t/>\n\t\t\t<Button\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tsize=\"icon\"\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-label=\"Next day\"\n\t\t\t\tonClick={() => commit(shiftIso(selected, 1))}\n\t\t\t>\n\t\t\t\t<ChevronRight />\n\t\t\t</Button>\n\t\t</div>\n\t);\n}\n\nfunction DateNavigationDisplay({\n\tselectedDate,\n\tonPrevDay,\n\tonNextDay,\n\tonToday,\n\tonToggleCalendar,\n\ttodayLabel = \"Today\",\n\tpreviousDayLabel = \"Previous day\",\n\tnextDayLabel = \"Next day\",\n\tformatDate,\n\tlocale = \"en-US\",\n\ttimeZone,\n\tclassName,\n}: DisplayProps) {\n\tconst resolvedFormatDate =\n\t\tformatDate ??\n\t\t((date: Date) =>\n\t\t\tdate.toLocaleDateString(locale, {\n\t\t\t\tweekday: \"short\",\n\t\t\t\tyear: \"numeric\",\n\t\t\t\tmonth: \"short\",\n\t\t\t\tday: \"numeric\",\n\t\t\t\ttimeZone,\n\t\t\t}));\n\tconst isToday = isSameCivil(\n\t\tcivilInZone(selectedDate, timeZone),\n\t\tcivilInZone(new Date(), timeZone),\n\t);\n\tconst formatted = resolvedFormatDate(selectedDate);\n\treturn (\n\t\t<div className={cn(\"flex items-center justify-center gap-2\", className)}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={onToday}\n\t\t\t\tdisabled={isToday}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"mr-2 rounded-lg px-3 py-1.5 text-sm font-medium transition-colors\",\n\t\t\t\t\tisToday\n\t\t\t\t\t\t? \"cursor-not-allowed text-basalt-muted-foreground opacity-50\"\n\t\t\t\t\t\t: \"bg-basalt-secondary text-basalt-foreground hover:bg-basalt-accent\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{todayLabel}\n\t\t\t</button>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={onPrevDay}\n\t\t\t\taria-label={previousDayLabel}\n\t\t\t\tclassName=\"flex h-8 w-8 items-center justify-center rounded-lg text-basalt-muted-foreground transition-colors hover:bg-basalt-accent hover:text-basalt-foreground\"\n\t\t\t>\n\t\t\t\t<ChevronLeft className=\"h-4 w-4\" strokeWidth={1.5} />\n\t\t\t</button>\n\t\t\t{onToggleCalendar ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={onToggleCalendar}\n\t\t\t\t\tclassName=\"flex cursor-pointer items-center gap-2 rounded-lg px-3 py-1.5 text-lg font-medium transition-colors hover:bg-basalt-accent\"\n\t\t\t\t>\n\t\t\t\t\t<span>{formatted}</span>\n\t\t\t\t\t<CalendarIcon className=\"h-4 w-4 text-basalt-muted-foreground\" strokeWidth={1.5} />\n\t\t\t\t</button>\n\t\t\t) : (\n\t\t\t\t<span className=\"flex items-center gap-2 rounded-lg px-3 py-1.5 text-lg font-medium\">\n\t\t\t\t\t{formatted}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={onNextDay}\n\t\t\t\taria-label={nextDayLabel}\n\t\t\t\tclassName=\"flex h-8 w-8 items-center justify-center rounded-lg text-basalt-muted-foreground transition-colors hover:bg-basalt-accent hover:text-basalt-foreground\"\n\t\t\t>\n\t\t\t\t<ChevronRight className=\"h-4 w-4\" strokeWidth={1.5} />\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type NamedValue } from "./sample.js";
2
+ export declare function DonutChart({ data, ariaLabel, className, showLegend, valueFormatter, }: {
3
+ data?: NamedValue[];
4
+ ariaLabel?: string;
5
+ className?: string;
6
+ showLegend?: boolean;
7
+ valueFormatter?: (value: number) => string;
8
+ }): import("react").JSX.Element;
@@ -0,0 +1,36 @@
1
+ "use client";
2
+ import { CHART_COLORS as e } from "./palette.js";
3
+ import { ANIMATION_PROPS as t, chartLegendProps as n, chartTooltipProps as r } from "./config.js";
4
+ import { DONUT_SAMPLE as i } from "./sample.js";
5
+ import { ChartFrame as a } from "./frame.js";
6
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
7
+ import { Cell as c, Legend as l, Pie as u, PieChart as d, Tooltip as f } from "recharts";
8
+ //#region src/charts/donut.tsx
9
+ function p({ data: p = i, ariaLabel: m = "Donut chart", className: h, showLegend: g = !1, valueFormatter: _ }) {
10
+ return /* @__PURE__ */ o(a, {
11
+ ariaLabel: m,
12
+ className: h,
13
+ size: "h-36 w-36",
14
+ children: /* @__PURE__ */ s(d, { children: [
15
+ /* @__PURE__ */ o(u, {
16
+ data: p,
17
+ dataKey: "value",
18
+ nameKey: "name",
19
+ innerRadius: 24,
20
+ outerRadius: 48,
21
+ stroke: "none",
22
+ ...t,
23
+ children: p.map((t, n) => /* @__PURE__ */ o(c, { fill: e[n % e.length] }, `${t.name}-${n}`))
24
+ }),
25
+ g ? /* @__PURE__ */ o(l, { ...n() }) : null,
26
+ /* @__PURE__ */ o(f, { ...r({
27
+ formatter: _,
28
+ cursor: !1
29
+ }) })
30
+ ] })
31
+ });
32
+ }
33
+ //#endregion
34
+ export { p as DonutChart };
35
+
36
+ //# sourceMappingURL=donut.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"donut.js","names":[],"sources":["../../src/charts/donut.tsx"],"sourcesContent":["import { Cell, Legend, Pie, PieChart, Tooltip } from \"recharts\";\nimport { ANIMATION_PROPS, chartLegendProps, chartTooltipProps } from \"./config\";\nimport { ChartFrame } from \"./frame\";\nimport { CHART_COLORS } from \"./palette\";\nimport { DONUT_SAMPLE, type NamedValue } from \"./sample\";\n\nexport function DonutChart({\n\tdata = DONUT_SAMPLE,\n\tariaLabel = \"Donut chart\",\n\tclassName,\n\tshowLegend = false,\n\tvalueFormatter,\n}: {\n\tdata?: NamedValue[];\n\tariaLabel?: string;\n\tclassName?: string;\n\tshowLegend?: boolean;\n\tvalueFormatter?: (value: number) => string;\n}) {\n\treturn (\n\t\t<ChartFrame ariaLabel={ariaLabel} className={className} size=\"h-36 w-36\">\n\t\t\t<PieChart>\n\t\t\t\t<Pie\n\t\t\t\t\tdata={data}\n\t\t\t\t\tdataKey=\"value\"\n\t\t\t\t\tnameKey=\"name\"\n\t\t\t\t\tinnerRadius={24}\n\t\t\t\t\touterRadius={48}\n\t\t\t\t\tstroke=\"none\"\n\t\t\t\t\t{...ANIMATION_PROPS}\n\t\t\t\t>\n\t\t\t\t\t{data.map((entry, index) => (\n\t\t\t\t\t\t<Cell key={`${entry.name}-${index}`} fill={CHART_COLORS[index % CHART_COLORS.length]} />\n\t\t\t\t\t))}\n\t\t\t\t</Pie>\n\t\t\t\t{showLegend ? <Legend {...chartLegendProps()} /> : null}\n\t\t\t\t<Tooltip {...chartTooltipProps({ formatter: valueFormatter, cursor: false })} />\n\t\t\t</PieChart>\n\t\t</ChartFrame>\n\t);\n}\n"],"mappings":";;;;;;;;AAMA,SAAgB,EAAW,EAC1B,UAAO,GACP,eAAY,eACZ,cACA,gBAAa,IACb,qBAOE;CACF,OACC,kBAAC,GAAD;EAAuB;EAAsB;EAAW,MAAK;EAC5D,UAAA,kBAAC,GAAD,EAAA,UAAA;GACC,kBAAC,GAAD;IACO;IACN,SAAQ;IACR,SAAQ;IACR,aAAa;IACb,aAAa;IACb,QAAO;IACP,GAAI;IAEH,UAAA,EAAK,KAAK,GAAO,MACjB,kBAAC,GAAD,EAAqC,MAAM,EAAa,IAAQ,EAAa,QAAU,GAA5E,GAAG,EAAM,KAAK,GAAG,GAA2D,CACvF;GACG,CAAA;GACJ,IAAa,kBAAC,GAAD,EAAQ,GAAI,EAAiB,EAAI,CAAA,IAAI;GACnD,kBAAC,GAAD,EAAS,GAAI,EAAkB;IAAE,WAAW;IAAgB,QAAQ;GAAM,CAAC,EAAI,CAAA;EACtE,EAAA,CAAA;CACC,CAAA;AAEd"}
@@ -0,0 +1,9 @@
1
+ import { type ReactElement } from "react";
2
+ export declare function ChartFrame({ ariaLabel, className, children, size, }: {
3
+ ariaLabel?: string;
4
+ className?: string;
5
+ children: ReactElement<{
6
+ accessibilityLayer?: boolean;
7
+ }>;
8
+ size?: string;
9
+ }): import("react").JSX.Element;
@@ -0,0 +1,22 @@
1
+ "use client";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import { RESPONSIVE_CONTAINER_PROPS as t } from "./config.js";
4
+ import { cloneElement as n } from "react";
5
+ import { jsx as r } from "react/jsx-runtime";
6
+ import { ResponsiveContainer as i } from "recharts";
7
+ //#region src/charts/frame.tsx
8
+ function a({ ariaLabel: a, className: o, children: s, size: c = "h-36 w-56" }) {
9
+ return /* @__PURE__ */ r("div", {
10
+ role: "img",
11
+ "aria-label": a,
12
+ className: e(c, "basalt-chart outline-none [&_.recharts-layer]:outline-none [&_.recharts-rectangle]:outline-none [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none [&_.recharts-wrapper]:outline-none", o),
13
+ children: /* @__PURE__ */ r(i, {
14
+ ...t,
15
+ children: n(s, { accessibilityLayer: !1 })
16
+ })
17
+ });
18
+ }
19
+ //#endregion
20
+ export { a as ChartFrame };
21
+
22
+ //# sourceMappingURL=frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.js","names":[],"sources":["../../src/charts/frame.tsx"],"sourcesContent":["import { cloneElement, type ReactElement } from \"react\";\nimport { ResponsiveContainer } from \"recharts\";\nimport { cn } from \"../utils/cn\";\nimport { RESPONSIVE_CONTAINER_PROPS } from \"./config\";\n\nexport function ChartFrame({\n\tariaLabel,\n\tclassName,\n\tchildren,\n\tsize = \"h-36 w-56\",\n}: {\n\tariaLabel?: string;\n\tclassName?: string;\n\tchildren: ReactElement<{ accessibilityLayer?: boolean }>;\n\tsize?: string;\n}) {\n\treturn (\n\t\t<div\n\t\t\trole=\"img\"\n\t\t\taria-label={ariaLabel}\n\t\t\tclassName={cn(\n\t\t\t\tsize,\n\t\t\t\t\"basalt-chart outline-none [&_.recharts-layer]:outline-none [&_.recharts-rectangle]:outline-none [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none [&_.recharts-wrapper]:outline-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<ResponsiveContainer {...RESPONSIVE_CONTAINER_PROPS}>\n\t\t\t\t{cloneElement(children, { accessibilityLayer: false })}\n\t\t\t</ResponsiveContainer>\n\t\t</div>\n\t);\n}\n"],"mappings":";;;;;;;AAKA,SAAgB,EAAW,EAC1B,cACA,cACA,aACA,UAAO,eAML;CACF,OACC,kBAAC,OAAD;EACC,MAAK;EACL,cAAY;EACZ,WAAW,EACV,GACA,2MACA,CACD;EAEA,UAAA,kBAAC,GAAD;GAAqB,GAAI;GACvB,UAAA,EAAa,GAAU,EAAE,oBAAoB,GAAM,CAAC;EACjC,CAAA;CACjB,CAAA;AAEP"}
@@ -0,0 +1,7 @@
1
+ import { type NamedValue } from "./sample.js";
2
+ export declare function FunnelChart({ data, ariaLabel, className, valueFormatter, }: {
3
+ data?: NamedValue[];
4
+ ariaLabel?: string;
5
+ className?: string;
6
+ valueFormatter?: (value: number) => string;
7
+ }): import("react").JSX.Element;
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import { CHART_COLORS as e, chartAxis as t } from "./palette.js";
3
+ import { ANIMATION_PROPS as n, chartFontSize as r, chartTooltipProps as i } from "./config.js";
4
+ import { FUNNEL_SAMPLE as a } from "./sample.js";
5
+ import { ChartFrame as o } from "./frame.js";
6
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
7
+ import { Funnel as l, FunnelChart as u, LabelList as d, Tooltip as f } from "recharts";
8
+ //#region src/charts/funnel.tsx
9
+ function p({ data: p = a, ariaLabel: m = "Funnel chart", className: h, valueFormatter: g }) {
10
+ return /* @__PURE__ */ s(o, {
11
+ ariaLabel: m,
12
+ className: h,
13
+ children: /* @__PURE__ */ c(u, { children: [/* @__PURE__ */ s(f, { ...i({
14
+ formatter: g,
15
+ cursor: !1
16
+ }) }), /* @__PURE__ */ s(l, {
17
+ data: p,
18
+ dataKey: "value",
19
+ nameKey: "name",
20
+ fill: e[1],
21
+ ...n,
22
+ children: /* @__PURE__ */ s(d, {
23
+ dataKey: "name",
24
+ position: "right",
25
+ fill: t,
26
+ stroke: "none",
27
+ fontSize: r("axis")
28
+ })
29
+ })] })
30
+ });
31
+ }
32
+ //#endregion
33
+ export { p as FunnelChart };
34
+
35
+ //# sourceMappingURL=funnel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"funnel.js","names":[],"sources":["../../src/charts/funnel.tsx"],"sourcesContent":["import { Funnel, LabelList, FunnelChart as RechartsFunnel, Tooltip } from \"recharts\";\nimport { ANIMATION_PROPS, chartFontSize, chartTooltipProps } from \"./config\";\nimport { ChartFrame } from \"./frame\";\nimport { CHART_COLORS, chartAxis } from \"./palette\";\nimport { FUNNEL_SAMPLE, type NamedValue } from \"./sample\";\n\nexport function FunnelChart({\n\tdata = FUNNEL_SAMPLE,\n\tariaLabel = \"Funnel chart\",\n\tclassName,\n\tvalueFormatter,\n}: {\n\tdata?: NamedValue[];\n\tariaLabel?: string;\n\tclassName?: string;\n\tvalueFormatter?: (value: number) => string;\n}) {\n\treturn (\n\t\t<ChartFrame ariaLabel={ariaLabel} className={className}>\n\t\t\t<RechartsFunnel>\n\t\t\t\t<Tooltip {...chartTooltipProps({ formatter: valueFormatter, cursor: false })} />\n\t\t\t\t<Funnel\n\t\t\t\t\tdata={data}\n\t\t\t\t\tdataKey=\"value\"\n\t\t\t\t\tnameKey=\"name\"\n\t\t\t\t\tfill={CHART_COLORS[1]}\n\t\t\t\t\t{...ANIMATION_PROPS}\n\t\t\t\t>\n\t\t\t\t\t<LabelList\n\t\t\t\t\t\tdataKey=\"name\"\n\t\t\t\t\t\tposition=\"right\"\n\t\t\t\t\t\tfill={chartAxis}\n\t\t\t\t\t\tstroke=\"none\"\n\t\t\t\t\t\tfontSize={chartFontSize(\"axis\")}\n\t\t\t\t\t/>\n\t\t\t\t</Funnel>\n\t\t\t</RechartsFunnel>\n\t\t</ChartFrame>\n\t);\n}\n"],"mappings":";;;;;;;;AAMA,SAAgB,EAAY,EAC3B,UAAO,GACP,eAAY,gBACZ,cACA,qBAME;CACF,OACC,kBAAC,GAAD;EAAuB;EAAsB;EAC5C,UAAA,kBAAC,GAAD,EAAA,UAAA,CACC,kBAAC,GAAD,EAAS,GAAI,EAAkB;GAAE,WAAW;GAAgB,QAAQ;EAAM,CAAC,EAAI,CAAA,GAC/E,kBAAC,GAAD;GACO;GACN,SAAQ;GACR,SAAQ;GACR,MAAM,EAAa;GACnB,GAAI;GAEJ,UAAA,kBAAC,GAAD;IACC,SAAQ;IACR,UAAS;IACT,MAAM;IACN,QAAO;IACP,UAAU,EAAc,MAAM;GAC9B,CAAA;EACM,CAAA,CACO,EAAA,CAAA;CACL,CAAA;AAEd"}
@@ -0,0 +1,8 @@
1
+ export declare function Gauge({ value, max, ariaLabel, className, hideValue, valueFormatter, }: {
2
+ value?: number;
3
+ max?: number;
4
+ ariaLabel?: string;
5
+ className?: string;
6
+ hideValue?: boolean;
7
+ valueFormatter?: (value: number) => string;
8
+ }): import("react").JSX.Element;
@@ -0,0 +1,46 @@
1
+ "use client";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import { CHART_COLORS as t } from "./palette.js";
4
+ import { ChartFrame as n } from "./frame.js";
5
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
6
+ import { PolarAngleAxis as a, RadialBar as o, RadialBarChart as s } from "recharts";
7
+ //#region src/charts/gauge.tsx
8
+ function c({ value: c = 72, max: l = 100, ariaLabel: u = "Gauge", className: d, hideValue: f = !1, valueFormatter: p }) {
9
+ let m = l === 0 ? 0 : Math.min(100, Math.max(0, c / l * 100)), h = p ? p(c) : String(c);
10
+ return /* @__PURE__ */ i("div", {
11
+ className: e("relative h-36 w-36", d),
12
+ children: [/* @__PURE__ */ r(n, {
13
+ ariaLabel: u,
14
+ className: "h-full w-full",
15
+ size: "h-full w-full",
16
+ children: /* @__PURE__ */ i(s, {
17
+ cx: "50%",
18
+ cy: "50%",
19
+ innerRadius: "75%",
20
+ outerRadius: "95%",
21
+ startAngle: 90,
22
+ endAngle: -270,
23
+ data: [{ value: m }],
24
+ barSize: 12,
25
+ children: [/* @__PURE__ */ r(a, {
26
+ type: "number",
27
+ domain: [0, 100],
28
+ angleAxisId: 0,
29
+ tick: !1
30
+ }), /* @__PURE__ */ r(o, {
31
+ dataKey: "value",
32
+ cornerRadius: 6,
33
+ fill: t[4],
34
+ background: { fill: t[23] }
35
+ })]
36
+ })
37
+ }), f ? null : /* @__PURE__ */ r("span", {
38
+ className: "pointer-events-none absolute inset-0 flex items-center justify-center text-sm font-semibold text-basalt-foreground",
39
+ children: h
40
+ })]
41
+ });
42
+ }
43
+ //#endregion
44
+ export { c as Gauge };
45
+
46
+ //# sourceMappingURL=gauge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gauge.js","names":[],"sources":["../../src/charts/gauge.tsx"],"sourcesContent":["import { PolarAngleAxis, RadialBar, RadialBarChart } from \"recharts\";\nimport { cn } from \"../utils/cn\";\nimport { ChartFrame } from \"./frame\";\nimport { CHART_COLORS } from \"./palette\";\n\nexport function Gauge({\n\tvalue = 72,\n\tmax = 100,\n\tariaLabel = \"Gauge\",\n\tclassName,\n\thideValue = false,\n\tvalueFormatter,\n}: {\n\tvalue?: number;\n\tmax?: number;\n\tariaLabel?: string;\n\tclassName?: string;\n\thideValue?: boolean;\n\tvalueFormatter?: (value: number) => string;\n}) {\n\tconst percent = max === 0 ? 0 : Math.min(100, Math.max(0, (value / max) * 100));\n\tconst display = valueFormatter ? valueFormatter(value) : String(value);\n\treturn (\n\t\t<div className={cn(\"relative h-36 w-36\", className)}>\n\t\t\t<ChartFrame ariaLabel={ariaLabel} className=\"h-full w-full\" size=\"h-full w-full\">\n\t\t\t\t<RadialBarChart\n\t\t\t\t\tcx=\"50%\"\n\t\t\t\t\tcy=\"50%\"\n\t\t\t\t\tinnerRadius=\"75%\"\n\t\t\t\t\touterRadius=\"95%\"\n\t\t\t\t\tstartAngle={90}\n\t\t\t\t\tendAngle={-270}\n\t\t\t\t\tdata={[{ value: percent }]}\n\t\t\t\t\tbarSize={12}\n\t\t\t\t>\n\t\t\t\t\t<PolarAngleAxis type=\"number\" domain={[0, 100]} angleAxisId={0} tick={false} />\n\t\t\t\t\t<RadialBar\n\t\t\t\t\t\tdataKey=\"value\"\n\t\t\t\t\t\tcornerRadius={6}\n\t\t\t\t\t\tfill={CHART_COLORS[4]}\n\t\t\t\t\t\tbackground={{ fill: CHART_COLORS[23] }}\n\t\t\t\t\t/>\n\t\t\t\t</RadialBarChart>\n\t\t\t</ChartFrame>\n\t\t\t{hideValue ? null : (\n\t\t\t\t<span className=\"pointer-events-none absolute inset-0 flex items-center justify-center text-sm font-semibold text-basalt-foreground\">\n\t\t\t\t\t{display}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"],"mappings":";;;;;;;AAKA,SAAgB,EAAM,EACrB,WAAQ,IACR,SAAM,KACN,eAAY,SACZ,cACA,eAAY,IACZ,qBAQE;CACF,IAAM,IAAU,MAAQ,IAAI,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,GAAI,IAAQ,IAAO,GAAG,CAAC,GACxE,IAAU,IAAiB,EAAe,CAAK,IAAI,OAAO,CAAK;CACrE,OACC,kBAAC,OAAD;EAAK,WAAW,EAAG,sBAAsB,CAAS;EAAlD,UAAA,CACC,kBAAC,GAAD;GAAuB;GAAW,WAAU;GAAgB,MAAK;GAChE,UAAA,kBAAC,GAAD;IACC,IAAG;IACH,IAAG;IACH,aAAY;IACZ,aAAY;IACZ,YAAY;IACZ,UAAU;IACV,MAAM,CAAC,EAAE,OAAO,EAAQ,CAAC;IACzB,SAAS;IARV,UAAA,CAUC,kBAAC,GAAD;KAAgB,MAAK;KAAS,QAAQ,CAAC,GAAG,GAAG;KAAG,aAAa;KAAG,MAAM;IAAQ,CAAA,GAC9E,kBAAC,GAAD;KACC,SAAQ;KACR,cAAc;KACd,MAAM,EAAa;KACnB,YAAY,EAAE,MAAM,EAAa,IAAI;IACrC,CAAA,CACc;;EACL,CAAA,GACX,IAAY,OACZ,kBAAC,QAAD;GAAM,WAAU;GACd,UAAA;EACI,CAAA,CAEH;;AAEP"}
@@ -0,0 +1,7 @@
1
+ import { type XYPoint } from "./sample.js";
2
+ export declare function GroupedBarChart({ data, ariaLabel, className, showAxes, }: {
3
+ data?: XYPoint[];
4
+ ariaLabel?: string;
5
+ className?: string;
6
+ showAxes?: boolean;
7
+ }): import("react").JSX.Element;
@@ -0,0 +1,42 @@
1
+ "use client";
2
+ import { CHART_COLORS as e } from "./palette.js";
3
+ import { ANIMATION_PROPS as t, BAR_RADIUS as n, GRID_PROPS as r, cartesianAxisProps as i, chartTooltipProps as a } from "./config.js";
4
+ import { SAMPLE as o } from "./sample.js";
5
+ import { ChartFrame as s } from "./frame.js";
6
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
7
+ import { Bar as u, BarChart as d, CartesianGrid as f, Tooltip as p, XAxis as m, YAxis as h } from "recharts";
8
+ //#region src/charts/grouped-bar.tsx
9
+ function g({ data: g = o, ariaLabel: _ = "Grouped bar chart", className: v, showAxes: y = !1 }) {
10
+ return /* @__PURE__ */ c(s, {
11
+ ariaLabel: _,
12
+ className: v,
13
+ children: /* @__PURE__ */ l(d, {
14
+ data: g,
15
+ children: [
16
+ y ? /* @__PURE__ */ c(f, { ...r }) : null,
17
+ /* @__PURE__ */ c(m, {
18
+ dataKey: "x",
19
+ ...i(!y)
20
+ }),
21
+ /* @__PURE__ */ c(h, { ...i(!y) }),
22
+ /* @__PURE__ */ c(p, { ...a({ cursor: "bar" }) }),
23
+ /* @__PURE__ */ c(u, {
24
+ dataKey: "y",
25
+ fill: e[0],
26
+ radius: n.vertical,
27
+ ...t
28
+ }),
29
+ /* @__PURE__ */ c(u, {
30
+ dataKey: "y2",
31
+ fill: e[2],
32
+ radius: n.vertical,
33
+ ...t
34
+ })
35
+ ]
36
+ })
37
+ });
38
+ }
39
+ //#endregion
40
+ export { g as GroupedBarChart };
41
+
42
+ //# sourceMappingURL=grouped-bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouped-bar.js","names":[],"sources":["../../src/charts/grouped-bar.tsx"],"sourcesContent":["import { Bar, CartesianGrid, BarChart as RechartsBar, Tooltip, XAxis, YAxis } from \"recharts\";\nimport {\n\tANIMATION_PROPS,\n\tBAR_RADIUS,\n\tcartesianAxisProps,\n\tchartTooltipProps,\n\tGRID_PROPS,\n} from \"./config\";\nimport { ChartFrame } from \"./frame\";\nimport { CHART_COLORS } from \"./palette\";\nimport { SAMPLE, type XYPoint } from \"./sample\";\n\nexport function GroupedBarChart({\n\tdata = SAMPLE,\n\tariaLabel = \"Grouped bar chart\",\n\tclassName,\n\tshowAxes = false,\n}: {\n\tdata?: XYPoint[];\n\tariaLabel?: string;\n\tclassName?: string;\n\tshowAxes?: boolean;\n}) {\n\treturn (\n\t\t<ChartFrame ariaLabel={ariaLabel} className={className}>\n\t\t\t<RechartsBar data={data}>\n\t\t\t\t{showAxes ? <CartesianGrid {...GRID_PROPS} /> : null}\n\t\t\t\t<XAxis dataKey=\"x\" {...cartesianAxisProps(!showAxes)} />\n\t\t\t\t<YAxis {...cartesianAxisProps(!showAxes)} />\n\t\t\t\t<Tooltip {...chartTooltipProps({ cursor: \"bar\" })} />\n\t\t\t\t<Bar dataKey=\"y\" fill={CHART_COLORS[0]} radius={BAR_RADIUS.vertical} {...ANIMATION_PROPS} />\n\t\t\t\t<Bar\n\t\t\t\t\tdataKey=\"y2\"\n\t\t\t\t\tfill={CHART_COLORS[2]}\n\t\t\t\t\tradius={BAR_RADIUS.vertical}\n\t\t\t\t\t{...ANIMATION_PROPS}\n\t\t\t\t/>\n\t\t\t</RechartsBar>\n\t\t</ChartFrame>\n\t);\n}\n"],"mappings":";;;;;;;;AAYA,SAAgB,EAAgB,EAC/B,UAAO,GACP,eAAY,qBACZ,cACA,cAAW,MAMT;CACF,OACC,kBAAC,GAAD;EAAuB;EAAsB;EAC5C,UAAA,kBAAC,GAAD;GAAmB;GAAnB,UAAA;IACE,IAAW,kBAAC,GAAD,EAAe,GAAI,EAAa,CAAA,IAAI;IAChD,kBAAC,GAAD;KAAO,SAAQ;KAAI,GAAI,EAAmB,CAAC,CAAQ;IAAI,CAAA;IACvD,kBAAC,GAAD,EAAO,GAAI,EAAmB,CAAC,CAAQ,EAAI,CAAA;IAC3C,kBAAC,GAAD,EAAS,GAAI,EAAkB,EAAE,QAAQ,MAAM,CAAC,EAAI,CAAA;IACpD,kBAAC,GAAD;KAAK,SAAQ;KAAI,MAAM,EAAa;KAAI,QAAQ,EAAW;KAAU,GAAI;IAAkB,CAAA;IAC3F,kBAAC,GAAD;KACC,SAAQ;KACR,MAAM,EAAa;KACnB,QAAQ,EAAW;KACnB,GAAI;IACJ,CAAA;GACW;;CACF,CAAA;AAEd"}
@@ -0,0 +1,27 @@
1
+ export type HeatmapDataPoint = {
2
+ date: string;
3
+ value: number;
4
+ };
5
+ export declare const heatmapColorScales: {
6
+ readonly green: readonly ["hsl(var(--basalt-muted))", "hsl(var(--basalt-heatmap-green-1))", "hsl(var(--basalt-heatmap-green-2))", "hsl(var(--basalt-heatmap-green-3))", "hsl(var(--basalt-heatmap-green-4))"];
7
+ readonly red: readonly ["hsl(var(--basalt-muted))", "hsl(var(--basalt-heatmap-red-1))", "hsl(var(--basalt-heatmap-red-2))", "hsl(var(--basalt-heatmap-red-3))", "hsl(var(--basalt-heatmap-red-4))"];
8
+ readonly blue: readonly ["hsl(var(--basalt-muted))", "hsl(var(--basalt-heatmap-blue-1))", "hsl(var(--basalt-heatmap-blue-2))", "hsl(var(--basalt-heatmap-blue-3))", "hsl(var(--basalt-heatmap-blue-4))"];
9
+ readonly orange: readonly ["hsl(var(--basalt-muted))", "hsl(var(--basalt-heatmap-orange-1))", "hsl(var(--basalt-heatmap-orange-2))", "hsl(var(--basalt-heatmap-orange-3))", "hsl(var(--basalt-heatmap-orange-4))"];
10
+ };
11
+ export declare function HeatmapCalendar({ values, data, year, colorScale, valueFormatter, metricLabel, cellSize, cellGap, locale, weekdayLabels, monthLabels, lessLabel, moreLabel, ariaLabel, className, }: {
12
+ values?: number[];
13
+ data?: HeatmapDataPoint[];
14
+ year?: number;
15
+ colorScale?: readonly string[];
16
+ valueFormatter?: (value: number, date: string) => string;
17
+ metricLabel?: string;
18
+ cellSize?: number;
19
+ cellGap?: number;
20
+ locale?: string;
21
+ weekdayLabels?: string[];
22
+ monthLabels?: string[];
23
+ lessLabel?: string;
24
+ moreLabel?: string;
25
+ ariaLabel?: string;
26
+ className?: string;
27
+ }): import("react").JSX.Element;
@@ -0,0 +1,200 @@
1
+ "use client";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import { Tooltip as t, TooltipContent as n, TooltipProvider as r, TooltipTrigger as i } from "../components/tooltip.js";
4
+ import { useMemo as a } from "react";
5
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
6
+ //#region src/charts/heatmap-calendar.tsx
7
+ var c = {
8
+ green: [
9
+ "hsl(var(--basalt-muted))",
10
+ "hsl(var(--basalt-heatmap-green-1))",
11
+ "hsl(var(--basalt-heatmap-green-2))",
12
+ "hsl(var(--basalt-heatmap-green-3))",
13
+ "hsl(var(--basalt-heatmap-green-4))"
14
+ ],
15
+ red: [
16
+ "hsl(var(--basalt-muted))",
17
+ "hsl(var(--basalt-heatmap-red-1))",
18
+ "hsl(var(--basalt-heatmap-red-2))",
19
+ "hsl(var(--basalt-heatmap-red-3))",
20
+ "hsl(var(--basalt-heatmap-red-4))"
21
+ ],
22
+ blue: [
23
+ "hsl(var(--basalt-muted))",
24
+ "hsl(var(--basalt-heatmap-blue-1))",
25
+ "hsl(var(--basalt-heatmap-blue-2))",
26
+ "hsl(var(--basalt-heatmap-blue-3))",
27
+ "hsl(var(--basalt-heatmap-blue-4))"
28
+ ],
29
+ orange: [
30
+ "hsl(var(--basalt-muted))",
31
+ "hsl(var(--basalt-heatmap-orange-1))",
32
+ "hsl(var(--basalt-heatmap-orange-2))",
33
+ "hsl(var(--basalt-heatmap-orange-3))",
34
+ "hsl(var(--basalt-heatmap-orange-4))"
35
+ ]
36
+ };
37
+ function l(e) {
38
+ return Array.from({ length: 7 }, (t, n) => new Intl.DateTimeFormat(e, { weekday: "short" }).format(new Date(2023, 0, 1 + n)));
39
+ }
40
+ function u(e) {
41
+ return Array.from({ length: 12 }, (t, n) => new Intl.DateTimeFormat(e, { month: "short" }).format(new Date(2023, n, 1)));
42
+ }
43
+ function d(e) {
44
+ let t = [], n = new Date(e, 0, 1), r = new Date(e, 11, 31), i = new Date(n);
45
+ i.setDate(i.getDate() - i.getDay());
46
+ let a = new Date(i), o = [];
47
+ for (; (a <= r || o.length > 0) && (o.length === 7 && (t.push(o), o = []), !(a > r));) o.push(new Date(a)), a = new Date(a), a.setDate(a.getDate() + 1);
48
+ return o.length > 0 && t.push(o), t;
49
+ }
50
+ function f(e) {
51
+ return `${e.getFullYear()}-${String(e.getMonth() + 1).padStart(2, "0")}-${String(e.getDate()).padStart(2, "0")}`;
52
+ }
53
+ function p(e, t, n) {
54
+ if (e === 0) return 0;
55
+ let r = n.length - 1, i = Math.min(e / t, 1);
56
+ return Math.ceil(i * r);
57
+ }
58
+ function m({ values: t = Array.from({ length: 28 }, (e, t) => t % 5), data: n, year: r, colorScale: i = c.green, valueFormatter: a = (e) => e.toLocaleString(), metricLabel: s = "Value", cellSize: l = 12, cellGap: u = 2, locale: d = "en-US", weekdayLabels: f, monthLabels: p, lessLabel: m = "Less", moreLabel: g = "More", ariaLabel: _ = "Heatmap calendar", className: v }) {
59
+ return n && r != null ? /* @__PURE__ */ o(h, {
60
+ data: n,
61
+ year: r,
62
+ colorScale: i,
63
+ valueFormatter: a,
64
+ metricLabel: s,
65
+ cellSize: l,
66
+ cellGap: u,
67
+ locale: d,
68
+ weekdayLabels: f,
69
+ monthLabels: p,
70
+ lessLabel: m,
71
+ moreLabel: g,
72
+ ariaLabel: _,
73
+ className: v
74
+ }) : /* @__PURE__ */ o("div", {
75
+ className: e("grid grid-cols-7 gap-1", v),
76
+ role: "img",
77
+ "aria-label": _,
78
+ children: t.map((e, t) => /* @__PURE__ */ o("span", {
79
+ className: "h-3 w-3 rounded-sm bg-basalt-primary",
80
+ style: { opacity: .2 + Math.min(4, Math.max(0, e)) * .15 }
81
+ }, t))
82
+ });
83
+ }
84
+ function h({ data: c, year: m, colorScale: h, valueFormatter: g, metricLabel: _, cellSize: v, cellGap: y, locale: b, weekdayLabels: x, monthLabels: S, lessLabel: C, moreLabel: w, ariaLabel: T, className: E }) {
85
+ let D = x ?? l(b), O = S ?? u(b), { weeks: k, dataMap: A, maxValue: j, labels: M } = a(() => {
86
+ let e = d(m), t = /* @__PURE__ */ new Map(), n = 0;
87
+ for (let e of c) t.set(e.date, e.value), e.value > n && (n = e.value);
88
+ let r = [], i = -1;
89
+ return e.forEach((e, t) => {
90
+ let n = e.find((e) => e.getFullYear() === m);
91
+ if (n) {
92
+ let e = n.getMonth();
93
+ e !== i && (r.push({
94
+ month: O[e],
95
+ weekIndex: t
96
+ }), i = e);
97
+ }
98
+ }), {
99
+ weeks: e,
100
+ dataMap: t,
101
+ maxValue: n,
102
+ labels: r
103
+ };
104
+ }, [
105
+ c,
106
+ O,
107
+ m
108
+ ]);
109
+ return /* @__PURE__ */ o("div", {
110
+ className: e("overflow-x-auto", E),
111
+ role: "img",
112
+ "aria-label": T,
113
+ children: /* @__PURE__ */ o(r, { children: /* @__PURE__ */ s("div", {
114
+ className: "inline-block",
115
+ children: [
116
+ /* @__PURE__ */ o("div", {
117
+ className: "relative mb-1 h-4 text-xs text-basalt-muted-foreground",
118
+ style: { marginLeft: 30 },
119
+ children: M.map((e) => /* @__PURE__ */ o("div", {
120
+ className: "absolute",
121
+ style: { left: e.weekIndex * (v + y) },
122
+ children: e.month
123
+ }, `${e.month}-${e.weekIndex}`))
124
+ }),
125
+ /* @__PURE__ */ s("div", {
126
+ className: "flex",
127
+ children: [/* @__PURE__ */ o("div", {
128
+ className: "mr-1 flex flex-col text-xs text-basalt-muted-foreground",
129
+ style: { width: 30 },
130
+ children: D.map((e, t) => /* @__PURE__ */ o("div", {
131
+ style: {
132
+ height: v + y,
133
+ lineHeight: `${v + y}px`,
134
+ visibility: t % 2 == 1 ? "visible" : "hidden"
135
+ },
136
+ children: e
137
+ }, `${e}-${t}`))
138
+ }), /* @__PURE__ */ o("div", {
139
+ className: "flex",
140
+ style: { gap: y },
141
+ children: k.map((e, r) => /* @__PURE__ */ o("div", {
142
+ className: "flex flex-col",
143
+ style: { gap: y },
144
+ children: e.map((e, r) => {
145
+ let a = f(e), c = A.get(a) ?? 0, l = e.getFullYear() === m, u = p(c, j, h);
146
+ return l ? /* @__PURE__ */ s(t, { children: [/* @__PURE__ */ o(i, {
147
+ asChild: !0,
148
+ children: /* @__PURE__ */ o("div", {
149
+ className: "cursor-pointer rounded-sm transition-colors hover:ring-1 hover:ring-basalt-foreground",
150
+ style: {
151
+ width: v,
152
+ height: v,
153
+ backgroundColor: h[u]
154
+ }
155
+ })
156
+ }), /* @__PURE__ */ o(n, { children: /* @__PURE__ */ s("div", {
157
+ className: "text-sm",
158
+ children: [/* @__PURE__ */ o("div", {
159
+ className: "font-medium",
160
+ children: a
161
+ }), /* @__PURE__ */ s("div", {
162
+ className: "text-basalt-muted-foreground",
163
+ children: [
164
+ _,
165
+ ": ",
166
+ g(c, a)
167
+ ]
168
+ })]
169
+ }) })] }, r) : /* @__PURE__ */ o("div", { style: {
170
+ width: v,
171
+ height: v,
172
+ visibility: "hidden"
173
+ } }, r);
174
+ })
175
+ }, r))
176
+ })]
177
+ }),
178
+ /* @__PURE__ */ s("div", {
179
+ className: "mt-2 flex items-center justify-end gap-1 text-xs text-basalt-muted-foreground",
180
+ children: [
181
+ /* @__PURE__ */ o("span", { children: C }),
182
+ h.map((e) => /* @__PURE__ */ o("div", {
183
+ className: "rounded-sm",
184
+ style: {
185
+ width: v,
186
+ height: v,
187
+ backgroundColor: e
188
+ }
189
+ }, e)),
190
+ /* @__PURE__ */ o("span", { children: w })
191
+ ]
192
+ })
193
+ ]
194
+ }) })
195
+ });
196
+ }
197
+ //#endregion
198
+ export { m as HeatmapCalendar, c as heatmapColorScales };
199
+
200
+ //# sourceMappingURL=heatmap-calendar.js.map