@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.
- package/LICENSE +21 -0
- package/README.md +41 -0
- package/dist/charts/area.d.ts +8 -0
- package/dist/charts/area.js +55 -0
- package/dist/charts/area.js.map +1 -0
- package/dist/charts/bar.d.ts +9 -0
- package/dist/charts/bar.js +42 -0
- package/dist/charts/bar.js.map +1 -0
- package/dist/charts/bullet.d.ts +8 -0
- package/dist/charts/bullet.js +50 -0
- package/dist/charts/bullet.js.map +1 -0
- package/dist/charts/chart-colors.d.ts +1 -0
- package/dist/charts/chart-colors.js +3 -0
- package/dist/charts/charts.d.ts +6 -0
- package/dist/charts/charts.js +15 -0
- package/dist/charts/charts.js.map +1 -0
- package/dist/charts/config.d.ts +117 -0
- package/dist/charts/config.js +117 -0
- package/dist/charts/config.js.map +1 -0
- package/dist/charts/custom-chart.d.ts +6 -0
- package/dist/charts/custom-chart.js +15 -0
- package/dist/charts/custom-chart.js.map +1 -0
- package/dist/charts/date-navigation.d.ts +22 -0
- package/dist/charts/date-navigation.js +122 -0
- package/dist/charts/date-navigation.js.map +1 -0
- package/dist/charts/donut.d.ts +8 -0
- package/dist/charts/donut.js +36 -0
- package/dist/charts/donut.js.map +1 -0
- package/dist/charts/frame.d.ts +9 -0
- package/dist/charts/frame.js +22 -0
- package/dist/charts/frame.js.map +1 -0
- package/dist/charts/funnel.d.ts +7 -0
- package/dist/charts/funnel.js +35 -0
- package/dist/charts/funnel.js.map +1 -0
- package/dist/charts/gauge.d.ts +8 -0
- package/dist/charts/gauge.js +46 -0
- package/dist/charts/gauge.js.map +1 -0
- package/dist/charts/grouped-bar.d.ts +7 -0
- package/dist/charts/grouped-bar.js +42 -0
- package/dist/charts/grouped-bar.js.map +1 -0
- package/dist/charts/heatmap-calendar.d.ts +27 -0
- package/dist/charts/heatmap-calendar.js +200 -0
- package/dist/charts/heatmap-calendar.js.map +1 -0
- package/dist/charts/item-list.d.ts +9 -0
- package/dist/charts/item-list.js +22 -0
- package/dist/charts/item-list.js.map +1 -0
- package/dist/charts/line.d.ts +9 -0
- package/dist/charts/line.js +58 -0
- package/dist/charts/line.js.map +1 -0
- package/dist/charts/palette.d.ts +33 -0
- package/dist/charts/palette.js +44 -0
- package/dist/charts/palette.js.map +1 -0
- package/dist/charts/radar.d.ts +6 -0
- package/dist/charts/radar.js +37 -0
- package/dist/charts/radar.js.map +1 -0
- package/dist/charts/sample.d.ts +42 -0
- package/dist/charts/sample.js +124 -0
- package/dist/charts/sample.js.map +1 -0
- package/dist/charts/sankey.d.ts +6 -0
- package/dist/charts/sankey.js +51 -0
- package/dist/charts/sankey.js.map +1 -0
- package/dist/charts/slot-bar.d.ts +15 -0
- package/dist/charts/slot-bar.js +80 -0
- package/dist/charts/slot-bar.js.map +1 -0
- package/dist/charts/sparkline.d.ts +6 -0
- package/dist/charts/sparkline.js +29 -0
- package/dist/charts/sparkline.js.map +1 -0
- package/dist/charts/stacked-bar.d.ts +7 -0
- package/dist/charts/stacked-bar.js +51 -0
- package/dist/charts/stacked-bar.js.map +1 -0
- package/dist/charts/stat-card.d.ts +21 -0
- package/dist/charts/stat-card.js +66 -0
- package/dist/charts/stat-card.js.map +1 -0
- package/dist/charts/timeline.d.ts +17 -0
- package/dist/charts/timeline.js +79 -0
- package/dist/charts/timeline.js.map +1 -0
- package/dist/charts/timeseries.d.ts +6 -0
- package/dist/charts/timeseries.js +15 -0
- package/dist/charts/timeseries.js.map +1 -0
- package/dist/components/accordion.d.ts +6 -0
- package/dist/components/accordion.js +21 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert-dialog.d.ts +25 -0
- package/dist/components/alert-dialog.js +61 -0
- package/dist/components/alert-dialog.js.map +1 -0
- package/dist/components/app-header.d.ts +10 -0
- package/dist/components/app-header.js +35 -0
- package/dist/components/app-header.js.map +1 -0
- package/dist/components/app-shell.d.ts +4 -0
- package/dist/components/app-shell.js +29 -0
- package/dist/components/app-shell.js.map +1 -0
- package/dist/components/autocomplete.d.ts +47 -0
- package/dist/components/autocomplete.js +28 -0
- package/dist/components/autocomplete.js.map +1 -0
- package/dist/components/avatar.d.ts +5 -0
- package/dist/components/avatar.js +28 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.d.ts +10 -0
- package/dist/components/badge.js +37 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/banner.d.ts +22 -0
- package/dist/components/banner.js +88 -0
- package/dist/components/banner.js.map +1 -0
- package/dist/components/basalt-mark.d.ts +8 -0
- package/dist/components/basalt-mark.js +17 -0
- package/dist/components/basalt-mark.js.map +1 -0
- package/dist/components/breadcrumbs.d.ts +9 -0
- package/dist/components/breadcrumbs.js +38 -0
- package/dist/components/breadcrumbs.js.map +1 -0
- package/dist/components/button.d.ts +17 -0
- package/dist/components/button.js +73 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/checkbox.d.ts +86 -0
- package/dist/components/checkbox.js +107 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/clipboard-text.d.ts +5 -0
- package/dist/components/clipboard-text.js +33 -0
- package/dist/components/clipboard-text.js.map +1 -0
- package/dist/components/code.d.ts +26 -0
- package/dist/components/code.js +45 -0
- package/dist/components/code.js.map +1 -0
- package/dist/components/collapsible.d.ts +33 -0
- package/dist/components/collapsible.js +38 -0
- package/dist/components/collapsible.js.map +1 -0
- package/dist/components/combobox.d.ts +47 -0
- package/dist/components/combobox.js +28 -0
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/command-palette.d.ts +83 -0
- package/dist/components/command-palette.js +90 -0
- package/dist/components/command-palette.js.map +1 -0
- package/dist/components/confirm-dialog.d.ts +52 -0
- package/dist/components/confirm-dialog.js +61 -0
- package/dist/components/confirm-dialog.js.map +1 -0
- package/dist/components/context-menu.d.ts +7 -0
- package/dist/components/context-menu.js +23 -0
- package/dist/components/context-menu.js.map +1 -0
- package/dist/components/data-table.d.ts +76 -0
- package/dist/components/data-table.js +230 -0
- package/dist/components/data-table.js.map +1 -0
- package/dist/components/date-picker.d.ts +90 -0
- package/dist/components/date-picker.js +452 -0
- package/dist/components/date-picker.js.map +1 -0
- package/dist/components/dialog.d.ts +37 -0
- package/dist/components/dialog.js +67 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +38 -0
- package/dist/components/dropdown-menu.js +24 -0
- package/dist/components/dropdown-menu.js.map +1 -0
- package/dist/components/empty.d.ts +6 -0
- package/dist/components/empty.js +28 -0
- package/dist/components/empty.js.map +1 -0
- package/dist/components/field.d.ts +39 -0
- package/dist/components/field.js +52 -0
- package/dist/components/field.js.map +1 -0
- package/dist/components/flow.d.ts +24 -0
- package/dist/components/flow.js +56 -0
- package/dist/components/flow.js.map +1 -0
- package/dist/components/grid.d.ts +15 -0
- package/dist/components/grid.js +24 -0
- package/dist/components/grid.js.map +1 -0
- package/dist/components/hover-card.d.ts +5 -0
- package/dist/components/hover-card.js +18 -0
- package/dist/components/hover-card.js.map +1 -0
- package/dist/components/input-area.d.ts +19 -0
- package/dist/components/input-area.js +27 -0
- package/dist/components/input-area.js.map +1 -0
- package/dist/components/input-group.d.ts +70 -0
- package/dist/components/input-group.js +78 -0
- package/dist/components/input-group.js.map +1 -0
- package/dist/components/input.d.ts +19 -0
- package/dist/components/input.js +28 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/label.d.ts +20 -0
- package/dist/components/label.js +34 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/layer-card.d.ts +69 -0
- package/dist/components/layer-card.js +104 -0
- package/dist/components/layer-card.js.map +1 -0
- package/dist/components/link.d.ts +8 -0
- package/dist/components/link.js +18 -0
- package/dist/components/link.js.map +1 -0
- package/dist/components/loader.d.ts +4 -0
- package/dist/components/loader.js +66 -0
- package/dist/components/loader.js.map +1 -0
- package/dist/components/loading-screen.d.ts +5 -0
- package/dist/components/loading-screen.js +24 -0
- package/dist/components/loading-screen.js.map +1 -0
- package/dist/components/menu-bar.d.ts +8 -0
- package/dist/components/menu-bar.js +42 -0
- package/dist/components/menu-bar.js.map +1 -0
- package/dist/components/meter.d.ts +8 -0
- package/dist/components/meter.js +26 -0
- package/dist/components/meter.js.map +1 -0
- package/dist/components/navigation-menu.d.ts +6 -0
- package/dist/components/navigation-menu.js +16 -0
- package/dist/components/navigation-menu.js.map +1 -0
- package/dist/components/overlay.d.ts +16 -0
- package/dist/components/overlay.js +14 -0
- package/dist/components/overlay.js.map +1 -0
- package/dist/components/page-header.d.ts +19 -0
- package/dist/components/page-header.js +43 -0
- package/dist/components/page-header.js.map +1 -0
- package/dist/components/pagination.d.ts +35 -0
- package/dist/components/pagination.js +68 -0
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/popover.d.ts +38 -0
- package/dist/components/popover.js +65 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/radio.d.ts +108 -0
- package/dist/components/radio.js +80 -0
- package/dist/components/radio.js.map +1 -0
- package/dist/components/scroll-area.d.ts +15 -0
- package/dist/components/scroll-area.js +49 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/segment-control.d.ts +35 -0
- package/dist/components/segment-control.js +46 -0
- package/dist/components/segment-control.js.map +1 -0
- package/dist/components/select.d.ts +99 -0
- package/dist/components/select.js +51 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/sensitive-input.d.ts +23 -0
- package/dist/components/sensitive-input.js +43 -0
- package/dist/components/sensitive-input.js.map +1 -0
- package/dist/components/separator.d.ts +26 -0
- package/dist/components/separator.js +18 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/sheet.d.ts +26 -0
- package/dist/components/sheet.js +49 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/sidebar.d.ts +101 -0
- package/dist/components/sidebar.js +260 -0
- package/dist/components/sidebar.js.map +1 -0
- package/dist/components/skeleton-line.d.ts +6 -0
- package/dist/components/skeleton-line.js +22 -0
- package/dist/components/skeleton-line.js.map +1 -0
- package/dist/components/slider.d.ts +3 -0
- package/dist/components/slider.js +21 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/stat-strip.d.ts +19 -0
- package/dist/components/stat-strip.js +27 -0
- package/dist/components/stat-strip.js.map +1 -0
- package/dist/components/switch.d.ts +85 -0
- package/dist/components/switch.js +94 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/table-of-contents.d.ts +33 -0
- package/dist/components/table-of-contents.js +37 -0
- package/dist/components/table-of-contents.js.map +1 -0
- package/dist/components/table-pager.d.ts +26 -0
- package/dist/components/table-pager.js +35 -0
- package/dist/components/table-pager.js.map +1 -0
- package/dist/components/table.d.ts +45 -0
- package/dist/components/table.js +32 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.d.ts +65 -0
- package/dist/components/tabs.js +56 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/text.d.ts +32 -0
- package/dist/components/text.js +46 -0
- package/dist/components/text.js.map +1 -0
- package/dist/components/theme-toggle.d.ts +7 -0
- package/dist/components/theme-toggle.js +28 -0
- package/dist/components/theme-toggle.js.map +1 -0
- package/dist/components/toast.d.ts +27 -0
- package/dist/components/toast.js +78 -0
- package/dist/components/toast.js.map +1 -0
- package/dist/components/toggle-group.d.ts +4 -0
- package/dist/components/toggle-group.js +48 -0
- package/dist/components/toggle-group.js.map +1 -0
- package/dist/components/toggle.d.ts +7 -0
- package/dist/components/toggle.js +37 -0
- package/dist/components/toggle.js.map +1 -0
- package/dist/components/toolbar.d.ts +58 -0
- package/dist/components/toolbar.js +76 -0
- package/dist/components/toolbar.js.map +1 -0
- package/dist/components/tooltip.d.ts +13 -0
- package/dist/components/tooltip.js +18 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/typeahead-field.d.ts +24 -0
- package/dist/components/typeahead-field.js +177 -0
- package/dist/components/typeahead-field.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +35 -0
- package/dist/providers/link.d.ts +12 -0
- package/dist/providers/link.js +18 -0
- package/dist/providers/link.js.map +1 -0
- package/dist/providers/theme.d.ts +11 -0
- package/dist/providers/theme.js +43 -0
- package/dist/providers/theme.js.map +1 -0
- package/dist/styles/standalone.css +2233 -0
- package/dist/styles/tailwind.css +103 -0
- package/dist/styles/tokens.css +277 -0
- package/dist/utils/cn.d.ts +2 -0
- package/dist/utils/cn.js +11 -0
- package/dist/utils/cn.js.map +1 -0
- package/dist/utils/control-surface.d.ts +2 -0
- package/dist/utils/control-surface.js +11 -0
- package/dist/utils/control-surface.js.map +1 -0
- package/dist/utils/selection-indicator.d.ts +24 -0
- package/dist/utils/selection-indicator.js +108 -0
- package/dist/utils/selection-indicator.js.map +1 -0
- 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,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
|