@nocoo/basalt 3.2.1 → 3.2.4
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/README.md +25 -19
- package/ai/COMPATIBILITY.md +41 -36
- package/ai/DESIGN.md +53 -47
- package/ai/INTEGRATION.md +814 -820
- package/ai/RECIPES.md +334 -135
- package/ai/USAGE.md +2 -2
- package/ai/registry.json +384 -27
- package/ai/sources.json +2 -2
- package/dist/assets/brand-mark.js +1 -2
- package/dist/charts/area.js +1 -2
- package/dist/charts/bar.js +1 -2
- package/dist/charts/bullet.js +1 -2
- package/dist/charts/chart-colors.js +1 -2
- package/dist/charts/charts.js +1 -2
- package/dist/charts/config.js +1 -2
- package/dist/charts/custom-chart.js +1 -2
- package/dist/charts/date-navigation.js +1 -2
- package/dist/charts/donut.js +1 -2
- package/dist/charts/frame.js +1 -2
- package/dist/charts/frame.js.map +1 -1
- package/dist/charts/funnel.js +1 -2
- package/dist/charts/gauge.js +1 -2
- package/dist/charts/grouped-bar.js +1 -2
- package/dist/charts/heatmap-calendar.js +3 -7
- package/dist/charts/heatmap-calendar.js.map +1 -1
- package/dist/charts/heatmap-matrix.js +1 -2
- package/dist/charts/item-list.js +1 -2
- package/dist/charts/legend.js +1 -2
- package/dist/charts/line.js +1 -2
- package/dist/charts/palette.js +1 -2
- package/dist/charts/radar.js +1 -2
- package/dist/charts/sample.js +1 -2
- package/dist/charts/sankey.js +1 -2
- package/dist/charts/series.js +1 -2
- package/dist/charts/slot-bar.js +1 -2
- package/dist/charts/sparkline.js +1 -2
- package/dist/charts/stacked-bar.js +1 -2
- package/dist/charts/stat-card.js +1 -2
- package/dist/charts/timeline.js +1 -2
- package/dist/charts/timeseries.js +1 -2
- package/dist/charts/tooltip.js +31 -27
- package/dist/charts/tooltip.js.map +1 -1
- package/dist/components/accordion.js +1 -2
- package/dist/components/alert-dialog.js +1 -2
- package/dist/components/app-header.js +1 -2
- package/dist/components/app-shell.js +1 -2
- package/dist/components/approval-card.js +1 -2
- package/dist/components/autocomplete.js +1 -2
- package/dist/components/avatar.js +1 -2
- package/dist/components/badge.js +1 -2
- package/dist/components/banner.js +1 -2
- package/dist/components/basalt-mark.js +1 -2
- package/dist/components/battery-meter.js +1 -2
- package/dist/components/breadcrumbs.js +1 -2
- package/dist/components/button.d.ts +1 -1
- package/dist/components/button.js +3 -3
- package/dist/components/button.js.map +1 -1
- package/dist/components/chat-bubble.js +1 -2
- package/dist/components/chat-composer.js +1 -2
- package/dist/components/chat-header.js +1 -2
- package/dist/components/chat-inbox.js +1 -2
- package/dist/components/chat-markdown.js +1 -2
- package/dist/components/chat-message.js +1 -2
- package/dist/components/checkbox.js +1 -2
- package/dist/components/clipboard-text.js +1 -2
- package/dist/components/code.js +1 -2
- package/dist/components/collapsible.js +1 -2
- package/dist/components/collapsible.js.map +1 -1
- package/dist/components/combobox.js +1 -2
- package/dist/components/command-palette.js +1 -2
- package/dist/components/confirm-dialog.js +3 -12
- package/dist/components/confirm-dialog.js.map +1 -1
- package/dist/components/context-cards.js +1 -2
- package/dist/components/context-menu.js +1 -2
- package/dist/components/data-table.js +2 -7
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-picker.js +7 -18
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/delete-resource.js +1 -2
- package/dist/components/description-list.js +1 -2
- package/dist/components/dialog.js +1 -2
- package/dist/components/diff-table.js +1 -2
- package/dist/components/dock.js +1 -2
- package/dist/components/dock.js.map +1 -1
- package/dist/components/dropdown-menu.js +1 -2
- package/dist/components/editable-nav-item.js +1 -2
- package/dist/components/empty.js +1 -2
- package/dist/components/fab.js +1 -2
- package/dist/components/field.js +1 -2
- package/dist/components/file-dropzone.js +1 -2
- package/dist/components/filter-bar.js +1 -2
- package/dist/components/flow.js +1 -2
- package/dist/components/grid.js +1 -2
- package/dist/components/hover-card.js +1 -2
- package/dist/components/icon-picker.js +1 -2
- package/dist/components/inline-editable.js +1 -2
- package/dist/components/input-area.js +1 -2
- package/dist/components/input-group.js +2 -3
- package/dist/components/input-group.js.map +1 -1
- package/dist/components/input.js +1 -2
- package/dist/components/label.js +1 -2
- package/dist/components/layer-card.js +1 -2
- package/dist/components/link.js +1 -2
- package/dist/components/loader.js +1 -2
- package/dist/components/loading-screen.js +1 -2
- package/dist/components/menu-bar.js +1 -2
- package/dist/components/meter.js +1 -2
- package/dist/components/multi-select.js +1 -2
- package/dist/components/navigation-menu.js +1 -2
- package/dist/components/overlay.js +1 -2
- package/dist/components/page-header.js +1 -2
- package/dist/components/pagination.js +1 -2
- package/dist/components/popover.js +1 -2
- package/dist/components/prompt-bar.js +1 -2
- package/dist/components/radio.js +2 -7
- package/dist/components/radio.js.map +1 -1
- package/dist/components/recommendation-card.js +1 -2
- package/dist/components/resource-list.js +1 -2
- package/dist/components/responsive-master-detail.js +1 -2
- package/dist/components/scroll-area.js +1 -2
- package/dist/components/section-rule.js +1 -2
- package/dist/components/segment-control.js +1 -2
- package/dist/components/select.js +1 -2
- package/dist/components/sensitive-input.js +1 -2
- package/dist/components/separator.js +1 -2
- package/dist/components/sheet.js +1 -2
- package/dist/components/sidebar.d.ts +53 -19
- package/dist/components/sidebar.js +201 -100
- package/dist/components/sidebar.js.map +1 -1
- package/dist/components/skeleton-line.js +1 -2
- package/dist/components/slider.js +1 -2
- package/dist/components/stat-strip.js +1 -2
- package/dist/components/switch.js +1 -2
- package/dist/components/table-of-contents.js +1 -2
- package/dist/components/table-pager.js +1 -2
- package/dist/components/table.js +1 -2
- package/dist/components/tabs.js +1 -2
- package/dist/components/tag-badge.js +1 -2
- package/dist/components/tag-color-picker.js +1 -2
- package/dist/components/text.js +1 -2
- package/dist/components/theme-toggle.js +1 -2
- package/dist/components/thinking.js +1 -2
- package/dist/components/toast.js +1 -2
- package/dist/components/toggle-group.js +1 -2
- package/dist/components/toggle.js +1 -2
- package/dist/components/tool-chips.js +1 -2
- package/dist/components/toolbar.js +1 -2
- package/dist/components/tooltip.js +1 -2
- package/dist/components/typeahead-field.js +6 -21
- package/dist/components/typeahead-field.js.map +1 -1
- package/dist/components/upload-queue.js +1 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +11 -11
- package/dist/models/agent-feedback.js +1 -2
- package/dist/models/avatar.js +1 -2
- package/dist/models/code.js +1 -2
- package/dist/models/context-cards.js +1 -2
- package/dist/models/diff-table.js +1 -2
- package/dist/models/recommendation.js +1 -2
- package/dist/providers/accent.js +2 -7
- package/dist/providers/accent.js.map +1 -1
- package/dist/providers/link.js +1 -2
- package/dist/providers/theme.js +2 -7
- package/dist/providers/theme.js.map +1 -1
- package/dist/styles/standalone.css +55 -11
- package/dist/styles/tailwind.css +2 -0
- package/dist/styles/tokens.css +51 -6
- package/dist/utils/cn.js +1 -2
- package/dist/utils/control-surface.js +1 -2
- package/dist/utils/navigation.d.ts +1 -1
- package/dist/utils/navigation.js +2 -3
- package/dist/utils/navigation.js.map +1 -1
- package/dist/utils/preference-store.js +1 -2
- package/dist/utils/selection-indicator.js +1 -2
- package/dist/utils/use-checkable-group.js +1 -2
- package/dist/utils/use-hover-highlight.js +2 -3
- package/dist/utils/use-hover-highlight.js.map +1 -1
- package/dist/viewmodels/use-approval-card.js +11 -13
- package/dist/viewmodels/use-approval-card.js.map +1 -1
- package/dist/viewmodels/use-chat-composer.js +1 -2
- package/dist/viewmodels/use-chat-message.js +1 -2
- package/dist/viewmodels/use-code-block.js +1 -2
- package/dist/viewmodels/use-code-block.js.map +1 -1
- package/dist/viewmodels/use-context-cards.js +1 -2
- package/dist/viewmodels/use-diff-table.js +1 -2
- package/dist/viewmodels/use-diff-table.js.map +1 -1
- package/dist/viewmodels/use-loader.js +1 -2
- package/dist/viewmodels/use-recommendation-card.js +1 -2
- package/dist/viewmodels/use-recommendation-card.js.map +1 -1
- package/dist/viewmodels/use-thinking.js +1 -2
- package/dist/viewmodels/use-tool-chips.js +1 -2
- package/package.json +1 -1
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
|
|
2
|
+
// src/assets/brand-mark.ts
|
|
3
3
|
var e = "data:image/png;base64,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";
|
|
4
|
-
//#endregion
|
|
5
4
|
export { e as basaltMarkPng };
|
|
6
5
|
|
|
7
6
|
//# sourceMappingURL=brand-mark.js.map
|
package/dist/charts/area.js
CHANGED
|
@@ -5,7 +5,7 @@ import { ChartShell as u } from "./frame.js";
|
|
|
5
5
|
import { ChartLegend as d } from "./legend.js";
|
|
6
6
|
import { jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
7
7
|
import { Area as m, AreaChart as h, CartesianGrid as g, Tooltip as _, XAxis as v, YAxis as y } from "recharts";
|
|
8
|
-
|
|
8
|
+
// src/charts/area.tsx
|
|
9
9
|
function b({ data: b, series: x, ariaLabel: S = "Area chart", className: C, showAxes: w = !1, showLegend: T = !1, stacked: E = !1, stackOffset: D, valueFormatter: O, xValueFormatter: k, yDomain: A, legend: j, customTooltip: M, summary: N, dataAlternative: P, accessibilityLayer: F }) {
|
|
10
10
|
let I = c(x, l(b)), L = E || D ? "stack" : void 0, R = j === void 0 ? T ? /* @__PURE__ */ f(d, {
|
|
11
11
|
items: I,
|
|
@@ -56,7 +56,6 @@ function b({ data: b, series: x, ariaLabel: S = "Area chart", className: C, show
|
|
|
56
56
|
})
|
|
57
57
|
});
|
|
58
58
|
}
|
|
59
|
-
//#endregion
|
|
60
59
|
export { b as AreaChart };
|
|
61
60
|
|
|
62
61
|
//# sourceMappingURL=area.js.map
|
package/dist/charts/bar.js
CHANGED
|
@@ -5,7 +5,7 @@ import { ChartShell as u } from "./frame.js";
|
|
|
5
5
|
import { ChartLegend as d } from "./legend.js";
|
|
6
6
|
import { jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
7
7
|
import { Bar as m, BarChart as h, CartesianGrid as g, Tooltip as _, XAxis as v, YAxis as y } from "recharts";
|
|
8
|
-
|
|
8
|
+
// src/charts/bar.tsx
|
|
9
9
|
function b({ data: b, series: x, ariaLabel: S = "Bar chart", className: C, showAxes: w = !1, showLegend: T = !1, color: E, valueFormatter: D, xValueFormatter: O, yDomain: k, legend: A, customTooltip: j, summary: M, dataAlternative: N, accessibilityLayer: P }) {
|
|
10
10
|
let F = c(l(x, ["y"]), E), I = A === void 0 ? T ? /* @__PURE__ */ f(d, {
|
|
11
11
|
items: F,
|
|
@@ -49,7 +49,6 @@ function b({ data: b, series: x, ariaLabel: S = "Bar chart", className: C, showA
|
|
|
49
49
|
})
|
|
50
50
|
});
|
|
51
51
|
}
|
|
52
|
-
//#endregion
|
|
53
52
|
export { b as BarChart };
|
|
54
53
|
|
|
55
54
|
//# sourceMappingURL=bar.js.map
|
package/dist/charts/bullet.js
CHANGED
|
@@ -4,7 +4,7 @@ import { resolveChartSeries as i } from "./series.js";
|
|
|
4
4
|
import { ChartFrame as a } from "./frame.js";
|
|
5
5
|
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
6
6
|
import { Bar as c, BarChart as l, Tooltip as u, XAxis as d, YAxis as f } from "recharts";
|
|
7
|
-
|
|
7
|
+
// src/charts/bullet.tsx
|
|
8
8
|
function p({ data: p, series: m, ariaLabel: h = "Bullet chart", className: g, showAxes: _ = !0, valueFormatter: v, summary: y, dataAlternative: b, accessibilityLayer: x }) {
|
|
9
9
|
let S = i(m, ["target", "value"]);
|
|
10
10
|
return /* @__PURE__ */ o(a, {
|
|
@@ -42,7 +42,6 @@ function p({ data: p, series: m, ariaLabel: h = "Bullet chart", className: g, sh
|
|
|
42
42
|
})
|
|
43
43
|
});
|
|
44
44
|
}
|
|
45
|
-
//#endregion
|
|
46
45
|
export { p as BulletChart };
|
|
47
46
|
|
|
48
47
|
//# sourceMappingURL=bullet.js.map
|
package/dist/charts/charts.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { LineChart as e } from "./line.js";
|
|
3
3
|
import { jsx as t } from "react/jsx-runtime";
|
|
4
|
-
|
|
4
|
+
// src/charts/charts.tsx
|
|
5
5
|
function n({ ariaLabel: n = "Charts", ...r }) {
|
|
6
6
|
return /* @__PURE__ */ t(e, {
|
|
7
7
|
ariaLabel: n,
|
|
8
8
|
...r
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
|
-
//#endregion
|
|
12
11
|
export { n as Charts };
|
|
13
12
|
|
|
14
13
|
//# sourceMappingURL=charts.js.map
|
package/dist/charts/config.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { CHART_COLORS as e, chartAxis as t, withAlpha as n } from "./palette.js";
|
|
3
3
|
import { ChartTooltipContent as r } from "./tooltip.js";
|
|
4
4
|
import { createElement as i } from "react";
|
|
5
|
-
|
|
5
|
+
// src/charts/config.ts
|
|
6
6
|
var a = {
|
|
7
7
|
axisFontSize: "var(--basalt-text-sm)",
|
|
8
8
|
legendFontSize: "var(--basalt-text-sm)",
|
|
@@ -129,7 +129,6 @@ var b = {
|
|
|
129
129
|
bottom: 2,
|
|
130
130
|
left: 2
|
|
131
131
|
};
|
|
132
|
-
//#endregion
|
|
133
132
|
export { m as ANIMATION_PROPS, u as AXIS_CONFIG, p as BAR_RADIUS, x as CHART_PLOT_MARGIN, S as CHART_PLOT_MARGIN_BARE, g as CHART_TOOLTIP_CURSOR_BAR, h as CHART_TOOLTIP_CURSOR_LINE, a as CHART_TYPE, f as GRID_PROPS, b as RESPONSIVE_CONTAINER_PROPS, d as cartesianAxisProps, o as chartFontSize, s as chartTextStyle, c as chartTickStyle, _ as chartTooltipContentStyle, v as chartTooltipProps, l as getChartColor, y as seriesColor };
|
|
134
133
|
|
|
135
134
|
//# sourceMappingURL=config.js.map
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { LineChart as e } from "./line.js";
|
|
3
3
|
import { jsx as t } from "react/jsx-runtime";
|
|
4
|
-
|
|
4
|
+
// src/charts/custom-chart.tsx
|
|
5
5
|
function n({ ariaLabel: n = "Custom chart", ...r }) {
|
|
6
6
|
return /* @__PURE__ */ t(e, {
|
|
7
7
|
ariaLabel: n,
|
|
8
8
|
...r
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
|
-
//#endregion
|
|
12
11
|
export { n as CustomChart };
|
|
13
12
|
|
|
14
13
|
//# sourceMappingURL=custom-chart.js.map
|
|
@@ -5,7 +5,7 @@ import { DatePicker as n } from "../components/date-picker.js";
|
|
|
5
5
|
import { useState as r } from "react";
|
|
6
6
|
import { Calendar as i, ChevronLeft as a, ChevronRight as o } from "lucide-react";
|
|
7
7
|
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
8
|
-
|
|
8
|
+
// src/charts/date-navigation.tsx
|
|
9
9
|
function l(e, t) {
|
|
10
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
11
|
return r.setDate(r.getDate() + t), `${r.getFullYear()}-${String(r.getMonth() + 1).padStart(2, "0")}-${String(r.getDate()).padStart(2, "0")}`;
|
|
@@ -116,7 +116,6 @@ function m({ selectedDate: t, onPrevDay: n, onNextDay: r, onToday: l, onToggleCa
|
|
|
116
116
|
]
|
|
117
117
|
});
|
|
118
118
|
}
|
|
119
|
-
//#endregion
|
|
120
119
|
export { f as DateNavigation };
|
|
121
120
|
|
|
122
121
|
//# sourceMappingURL=date-navigation.js.map
|
package/dist/charts/donut.js
CHANGED
|
@@ -4,7 +4,7 @@ import { ChartShell as r } from "./frame.js";
|
|
|
4
4
|
import { ChartLegend as i } from "./legend.js";
|
|
5
5
|
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
6
6
|
import { Cell as s, Pie as c, PieChart as l, Tooltip as u } from "recharts";
|
|
7
|
-
|
|
7
|
+
// src/charts/donut.tsx
|
|
8
8
|
function d({ data: d, series: f, ariaLabel: p = "Donut chart", className: m, showLegend: h = !1, valueFormatter: g, summary: _, dataAlternative: v, accessibilityLayer: y }) {
|
|
9
9
|
let b = d.map((e, t) => {
|
|
10
10
|
let r = f?.find((t) => t.key === e.name);
|
|
@@ -43,7 +43,6 @@ function d({ data: d, series: f, ariaLabel: p = "Donut chart", className: m, sho
|
|
|
43
43
|
}) })] })
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
|
-
//#endregion
|
|
47
46
|
export { d as DonutChart };
|
|
48
47
|
|
|
49
48
|
//# sourceMappingURL=donut.js.map
|
package/dist/charts/frame.js
CHANGED
|
@@ -4,7 +4,7 @@ import { RESPONSIVE_CONTAINER_PROPS as t } from "./config.js";
|
|
|
4
4
|
import { cloneElement as n, useId as r } from "react";
|
|
5
5
|
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
6
6
|
import { ResponsiveContainer as o } from "recharts";
|
|
7
|
-
|
|
7
|
+
// src/charts/frame.tsx
|
|
8
8
|
function s(e) {
|
|
9
9
|
return e != null && e !== !1;
|
|
10
10
|
}
|
|
@@ -66,7 +66,6 @@ function l(e) {
|
|
|
66
66
|
function u(e) {
|
|
67
67
|
return /* @__PURE__ */ i(c, { ...e });
|
|
68
68
|
}
|
|
69
|
-
//#endregion
|
|
70
69
|
export { l as ChartFrame, u as ChartShell };
|
|
71
70
|
|
|
72
71
|
//# sourceMappingURL=frame.js.map
|
package/dist/charts/frame.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.js","names":["hasSlotContent","slot","ChartContainer","summaryId","useId","hasSummary","summary","hasAlternative","dataAlternative","childProps","children","childLayer","clonedChild","cloneElement","accessibilityLayer","ariaLabel","plotContainer","legend","cn","size","className","ResponsiveContainer","RESPONSIVE_CONTAINER_PROPS","ChartFrame","props","ChartShell"],"sources":["../../src/charts/frame.tsx"],"sourcesContent":["import { cloneElement, type ReactElement, type ReactNode, useId } from \"react\";\nimport { ResponsiveContainer } from \"recharts\";\nimport { cn } from \"../utils/cn\";\nimport { RESPONSIVE_CONTAINER_PROPS } from \"./config\";\n\nexport type ChartFrameProps = {\n\t/**\n\t * Accessible label describing the purpose or dataset of the chart.\n\t */\n\tariaLabel: string;\n\t/**\n\t * Additional CSS class names for styling the chart container.\n\t */\n\tclassName?: string;\n\t/**\n\t * Single child Recharts element to render inside the responsive container.\n\t * Explicit child accessibilityLayer prop takes precedence over wrapper prop, which defaults to true.\n\t */\n\tchildren: ReactElement<{\n\t\taccessibilityLayer?: boolean;\n\t\t\"aria-label\"?: string;\n\t\t\"aria-describedby\"?: string;\n\t}>;\n\t/**\n\t * Tailwind size classes for the chart container.\n\t * @default \"h-basalt-36 w-basalt-56\"\n\t */\n\tsize?: string;\n\t/**\n\t * Textual summary describing key insights, highs, lows, and keyboard exploration instructions.\n\t * Associated with the chart via useId and aria-describedby.\n\t */\n\tsummary?: ReactNode;\n\t/**\n\t * Accessible tabular or structured data alternative rendered outside the plot area.\n\t */\n\tdataAlternative?: ReactNode;\n\t/**\n\t * Whether the interactive accessibility layer is enabled on the underlying Recharts graphic.\n\t * Enables keyboard exploration with Tab and arrow keys where supported by the underlying chart type.\n\t * Non-interactive compact or decorative charts without tooltip navigation should provide summary or dataAlternative.\n\t * @default true\n\t */\n\taccessibilityLayer?: boolean;\n};\n\nexport type ChartShellProps = ChartFrameProps & {\n\t/**\n\t * Optional legend node rendered alongside the chart plot.\n\t */\n\tlegend?: ReactNode;\n};\n\nexport type ChartAccessibilityProps = Pick<\n\tChartFrameProps,\n\t\"summary\" | \"dataAlternative\" | \"accessibilityLayer\"\n>;\n\nfunction hasSlotContent(slot: ReactNode | undefined): boolean {\n\treturn slot !== undefined && slot !== null && slot !== false;\n}\n\nfunction ChartContainer({\n\tariaLabel,\n\tclassName,\n\tchildren,\n\tsize = \"h-basalt-36 w-basalt-56\",\n\tlegend,\n\tsummary,\n\tdataAlternative,\n\taccessibilityLayer = true,\n}: ChartShellProps) {\n\tconst summaryId = useId();\n\tconst hasSummary = hasSlotContent(summary);\n\tconst hasAlternative = hasSlotContent(dataAlternative);\n\n\tconst childProps = (children?.props ?? {}) as {\n\t\taccessibilityLayer?: boolean;\n\t\t\"aria-label\"?: string;\n\t\t\"aria-describedby\"?: string;\n\t};\n\tconst childLayer = childProps.accessibilityLayer;\n\tconst resolvedLayer = childLayer !== undefined ? childLayer : accessibilityLayer;\n\n\tconst clonedChild = cloneElement(children, {\n\t\taccessibilityLayer: resolvedLayer,\n\t\t\"aria-label\": childProps[\"aria-label\"] ?? ariaLabel,\n\t\t\"aria-describedby\": childProps[\"aria-describedby\"] ?? (hasSummary ? summaryId : undefined),\n\t});\n\n\tlet plotContainer: ReactNode;\n\tif (hasSlotContent(legend)) {\n\t\tplotContainer = (\n\t\t\t<div\n\t\t\t\tdata-testid=\"chart-shell\"\n\t\t\t\tclassName={cn(size, className)}\n\t\t\t\tstyle={{ display: \"flex\", flexDirection: \"column\", minHeight: 0, minWidth: 0 }}\n\t\t\t>\n\t\t\t\t<div className=\"min-h-0 w-full flex-1 basalt-chart\">\n\t\t\t\t\t<ResponsiveContainer {...RESPONSIVE_CONTAINER_PROPS}>{clonedChild}</ResponsiveContainer>\n\t\t\t\t</div>\n\t\t\t\t{legend}\n\t\t\t</div>\n\t\t);\n\t} else {\n\t\tplotContainer = (\n\t\t\t<div className={cn(size, \"min-h-0 min-w-0 basalt-chart\", className)}>\n\t\t\t\t<ResponsiveContainer {...RESPONSIVE_CONTAINER_PROPS}>{clonedChild}</ResponsiveContainer>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (!hasSummary && !hasAlternative) {\n\t\treturn (\n\t\t\t<figure role=\"group\" aria-label={ariaLabel} className=\"contents m-0 p-0\">\n\t\t\t\t{plotContainer}\n\t\t\t</figure>\n\t\t);\n\t}\n\n\treturn (\n\t\t<figure\n\t\t\trole=\"group\"\n\t\t\taria-label={ariaLabel}\n\t\t\taria-describedby={hasSummary ? summaryId : undefined}\n\t\t\tclassName=\"relative m-0 flex flex-col gap-basalt-space-lg p-0 min-h-0 min-w-0\"\n\t\t>\n\t\t\t{hasSummary ? (\n\t\t\t\t<div id={summaryId} className=\"text-basalt-sm text-basalt-muted-foreground\">\n\t\t\t\t\t{summary}\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t\t{plotContainer}\n\t\t\t{hasAlternative ? (\n\t\t\t\t<div className=\"text-basalt-sm text-basalt-muted-foreground\">{dataAlternative}</div>\n\t\t\t) : null}\n\t\t</figure>\n\t);\n}\n\nexport function ChartFrame(props: ChartFrameProps) {\n\treturn <ChartContainer {...props} />;\n}\n\nexport function ChartShell(props: ChartShellProps) {\n\treturn <ChartContainer {...props} />;\n}\n"],"mappings":";;;;;;;AA0DA,SAASA,EAAe,GAAsC;CAC7D,OAAOC,KAA+B,QAAQA,MAAS;AACxD;AAEA,SAASC,EAAe,EACvB,cACA,cACA,aACA,UAAO,2BACP,WACA,YACA,oBACA,wBAAqB,MACF;CACnB,IAAMC,IAAYC,EAAM,GAClBC,IAAaL,EAAeM,CAAO,GACnCC,IAAiBP,EAAeQ,CAAe,GAE/CC,IAAcC,GAAU,SAAS,CAAC,GAKlCC,IAAaF,EAAW,oBAGxBG,IAAcC,EAAaH,GAAU;EAC1C,oBAHqBC,MAAe,KAAA,IAAyBG,IAAbH;EAIhD,cAAcF,EAAW,iBAAiBM;EAC1C,oBAAoBN,EAAW,wBAAwBJ,IAAaF,IAAY,KAAA;CACjF,CAAC,GAEGa;CA8BJ,OA7BA,AAcCA,IAdGhB,EAAeiB,CAAM,IAEvB,kBAAC,OAAD;EACC,eAAY;EACZ,WAAWC,EAAGC,GAAMC,CAAS;EAC7B,OAAO;GAAE,SAAS;GAAQ,eAAe;GAAU,WAAW;GAAG,UAAU;EAAE;EAH9E,UAAA,CAKC,kBAAC,OAAD;GAAK,WAAU;GACd,UAAA,kBAACC,GAAD;IAAqB,GAAIC;IAA6B,UAAAV;GAAiC,CAAA;EACnF,CAAA,GACJK,CACG;
|
|
1
|
+
{"version":3,"file":"frame.js","names":["hasSlotContent","slot","ChartContainer","summaryId","useId","hasSummary","summary","hasAlternative","dataAlternative","childProps","children","childLayer","clonedChild","cloneElement","accessibilityLayer","ariaLabel","plotContainer","legend","cn","size","className","ResponsiveContainer","RESPONSIVE_CONTAINER_PROPS","ChartFrame","props","ChartShell"],"sources":["../../src/charts/frame.tsx"],"sourcesContent":["import { cloneElement, type ReactElement, type ReactNode, useId } from \"react\";\nimport { ResponsiveContainer } from \"recharts\";\nimport { cn } from \"../utils/cn\";\nimport { RESPONSIVE_CONTAINER_PROPS } from \"./config\";\n\nexport type ChartFrameProps = {\n\t/**\n\t * Accessible label describing the purpose or dataset of the chart.\n\t */\n\tariaLabel: string;\n\t/**\n\t * Additional CSS class names for styling the chart container.\n\t */\n\tclassName?: string;\n\t/**\n\t * Single child Recharts element to render inside the responsive container.\n\t * Explicit child accessibilityLayer prop takes precedence over wrapper prop, which defaults to true.\n\t */\n\tchildren: ReactElement<{\n\t\taccessibilityLayer?: boolean;\n\t\t\"aria-label\"?: string;\n\t\t\"aria-describedby\"?: string;\n\t}>;\n\t/**\n\t * Tailwind size classes for the chart container.\n\t * @default \"h-basalt-36 w-basalt-56\"\n\t */\n\tsize?: string;\n\t/**\n\t * Textual summary describing key insights, highs, lows, and keyboard exploration instructions.\n\t * Associated with the chart via useId and aria-describedby.\n\t */\n\tsummary?: ReactNode;\n\t/**\n\t * Accessible tabular or structured data alternative rendered outside the plot area.\n\t */\n\tdataAlternative?: ReactNode;\n\t/**\n\t * Whether the interactive accessibility layer is enabled on the underlying Recharts graphic.\n\t * Enables keyboard exploration with Tab and arrow keys where supported by the underlying chart type.\n\t * Non-interactive compact or decorative charts without tooltip navigation should provide summary or dataAlternative.\n\t * @default true\n\t */\n\taccessibilityLayer?: boolean;\n};\n\nexport type ChartShellProps = ChartFrameProps & {\n\t/**\n\t * Optional legend node rendered alongside the chart plot.\n\t */\n\tlegend?: ReactNode;\n};\n\nexport type ChartAccessibilityProps = Pick<\n\tChartFrameProps,\n\t\"summary\" | \"dataAlternative\" | \"accessibilityLayer\"\n>;\n\nfunction hasSlotContent(slot: ReactNode | undefined): boolean {\n\treturn slot !== undefined && slot !== null && slot !== false;\n}\n\nfunction ChartContainer({\n\tariaLabel,\n\tclassName,\n\tchildren,\n\tsize = \"h-basalt-36 w-basalt-56\",\n\tlegend,\n\tsummary,\n\tdataAlternative,\n\taccessibilityLayer = true,\n}: ChartShellProps) {\n\tconst summaryId = useId();\n\tconst hasSummary = hasSlotContent(summary);\n\tconst hasAlternative = hasSlotContent(dataAlternative);\n\n\tconst childProps = (children?.props ?? {}) as {\n\t\taccessibilityLayer?: boolean;\n\t\t\"aria-label\"?: string;\n\t\t\"aria-describedby\"?: string;\n\t};\n\tconst childLayer = childProps.accessibilityLayer;\n\tconst resolvedLayer = childLayer !== undefined ? childLayer : accessibilityLayer;\n\n\tconst clonedChild = cloneElement(children, {\n\t\taccessibilityLayer: resolvedLayer,\n\t\t\"aria-label\": childProps[\"aria-label\"] ?? ariaLabel,\n\t\t\"aria-describedby\": childProps[\"aria-describedby\"] ?? (hasSummary ? summaryId : undefined),\n\t});\n\n\tlet plotContainer: ReactNode;\n\tif (hasSlotContent(legend)) {\n\t\tplotContainer = (\n\t\t\t<div\n\t\t\t\tdata-testid=\"chart-shell\"\n\t\t\t\tclassName={cn(size, className)}\n\t\t\t\tstyle={{ display: \"flex\", flexDirection: \"column\", minHeight: 0, minWidth: 0 }}\n\t\t\t>\n\t\t\t\t<div className=\"min-h-0 w-full flex-1 basalt-chart\">\n\t\t\t\t\t<ResponsiveContainer {...RESPONSIVE_CONTAINER_PROPS}>{clonedChild}</ResponsiveContainer>\n\t\t\t\t</div>\n\t\t\t\t{legend}\n\t\t\t</div>\n\t\t);\n\t} else {\n\t\tplotContainer = (\n\t\t\t<div className={cn(size, \"min-h-0 min-w-0 basalt-chart\", className)}>\n\t\t\t\t<ResponsiveContainer {...RESPONSIVE_CONTAINER_PROPS}>{clonedChild}</ResponsiveContainer>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (!hasSummary && !hasAlternative) {\n\t\treturn (\n\t\t\t<figure role=\"group\" aria-label={ariaLabel} className=\"contents m-0 p-0\">\n\t\t\t\t{plotContainer}\n\t\t\t</figure>\n\t\t);\n\t}\n\n\treturn (\n\t\t<figure\n\t\t\trole=\"group\"\n\t\t\taria-label={ariaLabel}\n\t\t\taria-describedby={hasSummary ? summaryId : undefined}\n\t\t\tclassName=\"relative m-0 flex flex-col gap-basalt-space-lg p-0 min-h-0 min-w-0\"\n\t\t>\n\t\t\t{hasSummary ? (\n\t\t\t\t<div id={summaryId} className=\"text-basalt-sm text-basalt-muted-foreground\">\n\t\t\t\t\t{summary}\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t\t{plotContainer}\n\t\t\t{hasAlternative ? (\n\t\t\t\t<div className=\"text-basalt-sm text-basalt-muted-foreground\">{dataAlternative}</div>\n\t\t\t) : null}\n\t\t</figure>\n\t);\n}\n\nexport function ChartFrame(props: ChartFrameProps) {\n\treturn <ChartContainer {...props} />;\n}\n\nexport function ChartShell(props: ChartShellProps) {\n\treturn <ChartContainer {...props} />;\n}\n"],"mappings":";;;;;;;AA0DA,SAASA,EAAe,GAAsC;CAC7D,OAAOC,KAA+B,QAAQA,MAAS;AACxD;AAEA,SAASC,EAAe,EACvB,cACA,cACA,aACA,UAAO,2BACP,WACA,YACA,oBACA,wBAAqB,MACF;CACnB,IAAMC,IAAYC,EAAM,GAClBC,IAAaL,EAAeM,CAAO,GACnCC,IAAiBP,EAAeQ,CAAe,GAE/CC,IAAcC,GAAU,SAAS,CAAC,GAKlCC,IAAaF,EAAW,oBAGxBG,IAAcC,EAAaH,GAAU;EAC1C,oBAHqBC,MAAe,KAAA,IAAyBG,IAAbH;EAIhD,cAAcF,EAAW,iBAAiBM;EAC1C,oBAAoBN,EAAW,wBAAwBJ,IAAaF,IAAY,KAAA;CACjF,CAAC,GAEGa;CA8BJ,OA7BA,AAcCA,IAdGhB,EAAeiB,CAAM,IAEvB,kBAAC,OAAD;EACC,eAAY;EACZ,WAAWC,EAAGC,GAAMC,CAAS;EAC7B,OAAO;GAAE,SAAS;GAAQ,eAAe;GAAU,WAAW;GAAG,UAAU;EAAE;EAH9E,UAAA,CAKC,kBAAC,OAAD;GAAK,WAAU;GACd,UAAA,kBAACC,GAAD;IAAqB,GAAIC;IAA6B,UAAAV;GAAiC,CAAA;EACnF,CAAA,GACJK,CACG;C,KAIL,kBAAC,OAAD;EAAK,WAAWC,EAAGC,GAAM,gCAAgCC,CAAS;EACjE,UAAA,kBAACC,GAAD;GAAqB,GAAIC;GAA6B,UAAAV;EAAiC,CAAA;CACnF,CAAA,GAIH,CAACP,KAAc,CAACE,IAElB,kBAAC,UAAD;EAAQ,MAAK;EAAQ,cAAYQ;EAAW,WAAU;EACpD,UAAAC;CACM,CAAA,IAKT,kBAAC,UAAD;EACC,MAAK;EACL,cAAYD;EACZ,oBAAkBV,IAAaF,IAAY,KAAA;EAC3C,WAAU;EAJX,UAAA;GAMEE,IACA,kBAAC,OAAD;IAAK,IAAIF;IAAW,WAAU;IAC5B,UAAAG;GACG,CAAA,IACF;GACHU;GACAT,IACA,kBAAC,OAAD;IAAK,WAAU;IAA+C,UAAAC;GAAqB,CAAA,IAChF;EACG;;AAEV;AAEA,SAAgBe,EAAW,GAAwB;CAClD,OAAO,kBAACrB,GAAD,EAAgB,GAAIsB,EAAQ,CAAA;AACpC;AAEA,SAAgBC,EAAW,GAAwB;CAClD,OAAO,kBAACvB,GAAD,EAAgB,GAAIsB,EAAQ,CAAA;AACpC"}
|
package/dist/charts/funnel.js
CHANGED
|
@@ -4,7 +4,7 @@ import { ANIMATION_PROPS as t, chartFontSize as n, chartTooltipProps as r, serie
|
|
|
4
4
|
import { ChartFrame as a } from "./frame.js";
|
|
5
5
|
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
6
6
|
import { Funnel as c, FunnelChart as l, LabelList as u, Tooltip as d } from "recharts";
|
|
7
|
-
|
|
7
|
+
// src/charts/funnel.tsx
|
|
8
8
|
function f({ data: f, series: p, ariaLabel: m = "Funnel chart", className: h, valueFormatter: g, summary: _, dataAlternative: v, accessibilityLayer: y }) {
|
|
9
9
|
return /* @__PURE__ */ o(a, {
|
|
10
10
|
ariaLabel: m,
|
|
@@ -32,7 +32,6 @@ function f({ data: f, series: p, ariaLabel: m = "Funnel chart", className: h, va
|
|
|
32
32
|
})] })
|
|
33
33
|
});
|
|
34
34
|
}
|
|
35
|
-
//#endregion
|
|
36
35
|
export { f as FunnelChart };
|
|
37
36
|
|
|
38
37
|
//# sourceMappingURL=funnel.js.map
|
package/dist/charts/gauge.js
CHANGED
|
@@ -6,7 +6,7 @@ import { ChartFrame as i } from "./frame.js";
|
|
|
6
6
|
import { useId as a } from "react";
|
|
7
7
|
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
8
8
|
import { PolarAngleAxis as c, RadialBar as l, RadialBarChart as u } from "recharts";
|
|
9
|
-
|
|
9
|
+
// src/charts/gauge.tsx
|
|
10
10
|
function d({ value: d, max: f = 100, series: p, ariaLabel: m = "Gauge", className: h, hideValue: g = !1, valueFormatter: _, summary: v, dataAlternative: y, accessibilityLayer: b }) {
|
|
11
11
|
let x = a(), S = f === 0 ? 0 : Math.min(100, Math.max(0, d / f * 100)), C = _ ? _(d) : String(d), w = v != null && v !== !1, T = y != null && y !== !1, E = /* @__PURE__ */ s("div", {
|
|
12
12
|
className: e("relative h-basalt-36 w-basalt-36", h),
|
|
@@ -59,7 +59,6 @@ function d({ value: d, max: f = 100, series: p, ariaLabel: m = "Gauge", classNam
|
|
|
59
59
|
]
|
|
60
60
|
});
|
|
61
61
|
}
|
|
62
|
-
//#endregion
|
|
63
62
|
export { d as Gauge };
|
|
64
63
|
|
|
65
64
|
//# sourceMappingURL=gauge.js.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { resolveChartSeries as e } from "./series.js";
|
|
3
3
|
import { BarChart as t } from "./bar.js";
|
|
4
4
|
import { jsx as n } from "react/jsx-runtime";
|
|
5
|
-
|
|
5
|
+
// src/charts/grouped-bar.tsx
|
|
6
6
|
function r({ series: r, ariaLabel: i = "Grouped bar chart", ...a }) {
|
|
7
7
|
let o = e(r, ["y", "y2"]);
|
|
8
8
|
return /* @__PURE__ */ n(t, {
|
|
@@ -12,7 +12,6 @@ function r({ series: r, ariaLabel: i = "Grouped bar chart", ...a }) {
|
|
|
12
12
|
color: void 0
|
|
13
13
|
});
|
|
14
14
|
}
|
|
15
|
-
//#endregion
|
|
16
15
|
export { r as GroupedBarChart };
|
|
17
16
|
|
|
18
17
|
//# sourceMappingURL=grouped-bar.js.map
|
|
@@ -3,7 +3,7 @@ import { cn as e } from "../utils/cn.js";
|
|
|
3
3
|
import { Tooltip as t, TooltipContent as n, TooltipProvider as r, TooltipTrigger as i } from "../components/tooltip.js";
|
|
4
4
|
import { useEffect as a, useId as o, useMemo as s, useRef as c, useState as l } from "react";
|
|
5
5
|
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
6
|
-
|
|
6
|
+
// src/charts/heatmap-calendar.tsx
|
|
7
7
|
var f = {
|
|
8
8
|
green: [
|
|
9
9
|
"hsl(var(--basalt-muted))",
|
|
@@ -185,11 +185,8 @@ function b({ data: v, year: y, colorScale: b = f.green, valueFormatter: x = (e)
|
|
|
185
185
|
}, X = (e, t) => {
|
|
186
186
|
if (B.length === 0) return;
|
|
187
187
|
let n = V.get(t) ?? 0;
|
|
188
|
-
if (e.key === "Escape")
|
|
189
|
-
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
if (e.key === "ArrowDown") {
|
|
188
|
+
if (e.key === "Escape") G(null);
|
|
189
|
+
else if (e.key === "ArrowDown") {
|
|
193
190
|
e.preventDefault();
|
|
194
191
|
let t = B[n + 1];
|
|
195
192
|
t && Y(t);
|
|
@@ -334,7 +331,6 @@ function b({ data: v, year: y, colorScale: b = f.green, valueFormatter: x = (e)
|
|
|
334
331
|
}) })
|
|
335
332
|
});
|
|
336
333
|
}
|
|
337
|
-
//#endregion
|
|
338
334
|
export { v as HeatmapCalendar, f as heatmapColorScales };
|
|
339
335
|
|
|
340
336
|
//# sourceMappingURL=heatmap-calendar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heatmap-calendar.js","names":["heatmapColorScales","weekdayNames","locale","index","monthNames","getYearWeeks","weeks","startDate","year","endDate","firstDay","currentDate","currentWeek","formatDate","date","getColorIndex","value","levels","colorScale","normalized","maxValue","HeatmapCalendar","props","YearHeatmap","ValuesHeatmap","activeIdx","setActiveIdx","useState","openTooltipIdx","setOpenTooltipIdx","containerRef","useRef","cellRefs","isFocusedInsideRef","hadFocus","values","next","handleKeyDown","nextIdx","currentIndex","container","ariaLabel","cn","className","Tooltip","curr","TooltipTrigger","el","TooltipContent","TooltipProvider","weekdays","weekdayLabels","months","monthLabels","calendarId","useId","scrollRegionRef","useMemo","dataMap","point","data","labels","lastMonth","firstDayOfWeek","week","month","validDays","dateToValidIndex","dateStr","activeDate","setActiveDate","openTooltipDate","setOpenTooltipDate","isYearFocusedInsideRef","nextDate","selectedDate","navigateToDay","targetDate","handleCellKeyDown","currentIdx","nextDay","prevDay","targetIdx","label","cellSize","cellGap","day","dayIndex","colorIndex","isSelected","formattedValue","valueFormatter","labelText","metricLabel","weekIndex","lessLabel","color","moreLabel"],"sources":["../../src/charts/heatmap-calendar.tsx"],"sourcesContent":["import { type KeyboardEvent, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"../components/tooltip\";\nimport { cn } from \"../utils/cn\";\n\nexport type HeatmapDataPoint = { date: string; value: number };\n\nexport const heatmapColorScales = {\n\tgreen: [\n\t\t\"hsl(var(--basalt-muted))\",\n\t\t\"hsl(var(--basalt-heatmap-green-1))\",\n\t\t\"hsl(var(--basalt-heatmap-green-2))\",\n\t\t\"hsl(var(--basalt-heatmap-green-3))\",\n\t\t\"hsl(var(--basalt-heatmap-green-4))\",\n\t],\n\tred: [\n\t\t\"hsl(var(--basalt-muted))\",\n\t\t\"hsl(var(--basalt-heatmap-red-1))\",\n\t\t\"hsl(var(--basalt-heatmap-red-2))\",\n\t\t\"hsl(var(--basalt-heatmap-red-3))\",\n\t\t\"hsl(var(--basalt-heatmap-red-4))\",\n\t],\n\tblue: [\n\t\t\"hsl(var(--basalt-muted))\",\n\t\t\"hsl(var(--basalt-heatmap-blue-1))\",\n\t\t\"hsl(var(--basalt-heatmap-blue-2))\",\n\t\t\"hsl(var(--basalt-heatmap-blue-3))\",\n\t\t\"hsl(var(--basalt-heatmap-blue-4))\",\n\t],\n\torange: [\n\t\t\"hsl(var(--basalt-muted))\",\n\t\t\"hsl(var(--basalt-heatmap-orange-1))\",\n\t\t\"hsl(var(--basalt-heatmap-orange-2))\",\n\t\t\"hsl(var(--basalt-heatmap-orange-3))\",\n\t\t\"hsl(var(--basalt-heatmap-orange-4))\",\n\t],\n} as const;\n\nfunction weekdayNames(locale: string) {\n\treturn Array.from({ length: 7 }, (_, index) =>\n\t\tnew Intl.DateTimeFormat(locale, { weekday: \"short\" }).format(new Date(2023, 0, 1 + index)),\n\t);\n}\n\nfunction monthNames(locale: string) {\n\treturn Array.from({ length: 12 }, (_, index) =>\n\t\tnew Intl.DateTimeFormat(locale, { month: \"short\" }).format(new Date(2023, index, 1)),\n\t);\n}\n\nfunction getYearWeeks(year: number): Date[][] {\n\tconst weeks: Date[][] = [];\n\tconst startDate = new Date(year, 0, 1);\n\tconst endDate = new Date(year, 11, 31);\n\tconst firstDay = new Date(startDate);\n\tfirstDay.setDate(firstDay.getDate() - firstDay.getDay());\n\tlet currentDate = new Date(firstDay);\n\tlet currentWeek: Date[] = [];\n\twhile (currentDate <= endDate || currentWeek.length > 0) {\n\t\tif (currentWeek.length === 7) {\n\t\t\tweeks.push(currentWeek);\n\t\t\tcurrentWeek = [];\n\t\t}\n\t\tif (currentDate > endDate) {\n\t\t\tbreak;\n\t\t}\n\t\tcurrentWeek.push(new Date(currentDate));\n\t\tcurrentDate = new Date(currentDate);\n\t\tcurrentDate.setDate(currentDate.getDate() + 1);\n\t}\n\tif (currentWeek.length > 0) {\n\t\tweeks.push(currentWeek);\n\t}\n\treturn weeks;\n}\n\nfunction formatDate(date: Date): string {\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 getColorIndex(value: number, maxValue: number, colorScale: readonly string[]): number {\n\tif (value === 0) {\n\t\treturn 0;\n\t}\n\tconst levels = colorScale.length - 1;\n\tconst normalized = Math.min(value / maxValue, 1);\n\treturn Math.ceil(normalized * levels);\n}\n\nexport type HeatmapCalendarValuesProps = {\n\t/**\n\t * Numeric values sequence to display in a compact 7-column grid.\n\t */\n\tvalues: number[];\n\t/**\n\t * Accessible name describing the heatmap purpose or data.\n\t * @default \"Heatmap calendar\"\n\t */\n\tariaLabel?: string;\n\t/**\n\t * Additional CSS class names for the outer container.\n\t */\n\tclassName?: string;\n};\n\nexport type HeatmapCalendarYearProps = {\n\t/**\n\t * Dataset of daily metrics with ISO date strings (\"YYYY-MM-DD\") and numeric values.\n\t */\n\tdata: HeatmapDataPoint[];\n\t/**\n\t * Calendar year to render.\n\t */\n\tyear: number;\n\t/**\n\t * Array of color values forming the intensity gradient from lowest to highest.\n\t * @default heatmapColorScales.green\n\t */\n\tcolorScale?: readonly string[];\n\t/**\n\t * Formatter for tooltip value display and accessible label.\n\t * @default (value) => value.toLocaleString()\n\t */\n\tvalueFormatter?: (value: number, date: string) => string;\n\t/**\n\t * Name of the metric for accessible labeling and tooltips.\n\t * @default \"Value\"\n\t */\n\tmetricLabel?: string;\n\t/**\n\t * Pixel width and height of each day cell.\n\t * @default 12\n\t */\n\tcellSize?: number;\n\t/**\n\t * Pixel gap between adjacent cells.\n\t * @default 2\n\t */\n\tcellGap?: number;\n\t/**\n\t * BCP 47 locale tag used for weekday and month label formatting.\n\t * @default \"en-US\"\n\t */\n\tlocale?: string;\n\t/**\n\t * Explicit custom weekday labels override.\n\t */\n\tweekdayLabels?: string[];\n\t/**\n\t * Explicit custom month labels override.\n\t */\n\tmonthLabels?: string[];\n\t/**\n\t * Label text for the lower end of the color scale legend.\n\t * @default \"Less\"\n\t */\n\tlessLabel?: string;\n\t/**\n\t * Label text for the upper end of the color scale legend.\n\t * @default \"More\"\n\t */\n\tmoreLabel?: string;\n\t/**\n\t * Accessible name describing the yearly heatmap dataset.\n\t * @default \"Heatmap calendar\"\n\t */\n\tariaLabel?: string;\n\t/**\n\t * Additional CSS class names for the outer scrollable container.\n\t */\n\tclassName?: string;\n};\n\nexport type HeatmapCalendarProps = HeatmapCalendarValuesProps | HeatmapCalendarYearProps;\n\nexport function HeatmapCalendar(props: HeatmapCalendarProps) {\n\tif (\"data\" in props) {\n\t\treturn <YearHeatmap {...props} />;\n\t}\n\treturn <ValuesHeatmap {...props} />;\n}\n\nfunction ValuesHeatmap({\n\tvalues,\n\tariaLabel = \"Heatmap calendar\",\n\tclassName,\n}: HeatmapCalendarValuesProps) {\n\tconst [activeIdx, setActiveIdx] = useState(0);\n\tconst [openTooltipIdx, setOpenTooltipIdx] = useState<number | null>(null);\n\tconst containerRef = useRef<HTMLDivElement | null>(null);\n\tconst cellRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\tconst isFocusedInsideRef = useRef(false);\n\n\t// When values array shrinks, empties, or restores: if an item or container currently held focus,\n\t// restore focus to the new valid index or empty container without stealing focus from outside.\n\tuseEffect(() => {\n\t\tconst hadFocus = isFocusedInsideRef.current;\n\t\tif (values.length === 0) {\n\t\t\tsetActiveIdx(0);\n\t\t\tsetOpenTooltipIdx(null);\n\t\t\tif (hadFocus) {\n\t\t\t\tcontainerRef.current?.focus();\n\t\t\t}\n\t\t} else if (activeIdx >= values.length) {\n\t\t\tconst next = values.length - 1;\n\t\t\tsetActiveIdx(next);\n\t\t\tif (hadFocus) {\n\t\t\t\tcellRefs.current[next]?.focus();\n\t\t\t}\n\t\t} else if (hadFocus) {\n\t\t\tcellRefs.current[activeIdx]?.focus();\n\t\t}\n\t}, [values.length, activeIdx]);\n\n\tconst handleKeyDown = (e: KeyboardEvent<HTMLButtonElement>, currentIndex: number) => {\n\t\tif (values.length === 0) return;\n\n\t\tif (e.key === \"Escape\") {\n\t\t\tsetOpenTooltipIdx(null);\n\t\t\treturn;\n\t\t}\n\n\t\tlet nextIdx = currentIndex;\n\t\tif (e.key === \"ArrowRight\") {\n\t\t\tnextIdx = Math.min(values.length - 1, currentIndex + 1);\n\t\t} else if (e.key === \"ArrowLeft\") {\n\t\t\tnextIdx = Math.max(0, currentIndex - 1);\n\t\t} else if (e.key === \"ArrowDown\") {\n\t\t\tnextIdx = Math.min(values.length - 1, currentIndex + 7);\n\t\t} else if (e.key === \"ArrowUp\") {\n\t\t\tnextIdx = Math.max(0, currentIndex - 7);\n\t\t} else if (e.key === \"Home\") {\n\t\t\tnextIdx = 0;\n\t\t} else if (e.key === \"End\") {\n\t\t\tnextIdx = values.length - 1;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\te.preventDefault();\n\t\tsetActiveIdx(nextIdx);\n\t\tsetOpenTooltipIdx(nextIdx);\n\t\tcellRefs.current[nextIdx]?.focus();\n\t};\n\n\tconst container = (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\ttabIndex={-1}\n\t\t\trole=\"region\"\n\t\t\taria-label={ariaLabel}\n\t\t\tonFocus={() => {\n\t\t\t\tisFocusedInsideRef.current = true;\n\t\t\t}}\n\t\t\tonBlur={(e) => {\n\t\t\t\tif (!e.currentTarget.contains(e.relatedTarget)) {\n\t\t\t\t\tisFocusedInsideRef.current = false;\n\t\t\t\t}\n\t\t\t}}\n\t\t\tclassName={cn(\n\t\t\t\t\"basalt-focus basalt-focus-inset grid grid-cols-7 gap-basalt-space-sm p-basalt-space-xs\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{values.map((value, index) => {\n\t\t\t\tconst isCurrent = index === activeIdx;\n\t\t\t\tconst isOpen = openTooltipIdx === index;\n\t\t\t\treturn (\n\t\t\t\t\t<Tooltip\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\topen={isOpen}\n\t\t\t\t\t\tonOpenChange={(next) => {\n\t\t\t\t\t\t\tif (next) {\n\t\t\t\t\t\t\t\tsetOpenTooltipIdx(index);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsetOpenTooltipIdx((curr) => {\n\t\t\t\t\t\t\t\t\tif (curr !== index) return curr;\n\t\t\t\t\t\t\t\t\t// If this cell currently holds document focus, ignore scroll dismiss\n\t\t\t\t\t\t\t\t\tconst isCellFocused =\n\t\t\t\t\t\t\t\t\t\tcellRefs.current[index] !== null &&\n\t\t\t\t\t\t\t\t\t\tdocument.activeElement === cellRefs.current[index];\n\t\t\t\t\t\t\t\t\treturn isCellFocused ? curr : null;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\tcellRefs.current[index] = el;\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\ttabIndex={isCurrent ? 0 : -1}\n\t\t\t\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\t\t\t\tsetActiveIdx(index);\n\t\t\t\t\t\t\t\t\tsetOpenTooltipIdx(index);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonBlur={() => {\n\t\t\t\t\t\t\t\t\tsetOpenTooltipIdx((curr) => (curr === index ? null : curr));\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonKeyDown={(e) => handleKeyDown(e, index)}\n\t\t\t\t\t\t\t\taria-label={`Position ${index + 1}: ${value}`}\n\t\t\t\t\t\t\t\tclassName=\"basalt-focus basalt-focus-inset basalt-focus-swatch box-border m-0 h-basalt-3 w-basalt-3 cursor-pointer rounded-basalt-sm border-0 p-0 transition-colors basalt-motion\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tbackgroundColor: `hsl(var(--basalt-chart-5) / ${0.2 + Math.min(4, Math.max(0, value)) * 0.15})`,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t<div className=\"text-basalt-sm\">\n\t\t\t\t\t\t\t\tPosition {index + 1}: {value}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n\n\tif (values.length === 0) {\n\t\treturn container;\n\t}\n\n\treturn <TooltipProvider>{container}</TooltipProvider>;\n}\n\nfunction YearHeatmap({\n\tdata,\n\tyear,\n\tcolorScale = heatmapColorScales.green,\n\tvalueFormatter = (value) => value.toLocaleString(),\n\tmetricLabel = \"Value\",\n\tcellSize = 12,\n\tcellGap = 2,\n\tlocale = \"en-US\",\n\tweekdayLabels,\n\tmonthLabels,\n\tlessLabel = \"Less\",\n\tmoreLabel = \"More\",\n\tariaLabel = \"Heatmap calendar\",\n\tclassName,\n}: HeatmapCalendarYearProps) {\n\tconst weekdays = weekdayLabels ?? weekdayNames(locale);\n\tconst months = monthLabels ?? monthNames(locale);\n\tconst calendarId = useId();\n\tconst scrollRegionRef = useRef<HTMLDivElement | null>(null);\n\n\tconst { weeks, dataMap, maxValue, labels, validDays, dateToValidIndex } = useMemo(() => {\n\t\tconst weeks = getYearWeeks(year);\n\t\tconst dataMap = new Map<string, number>();\n\t\tlet maxValue = 0;\n\t\tfor (const point of data) {\n\t\t\tdataMap.set(point.date, point.value);\n\t\t\tif (point.value > maxValue) {\n\t\t\t\tmaxValue = point.value;\n\t\t\t}\n\t\t}\n\n\t\tconst labels: { month: string; weekIndex: number }[] = [];\n\t\tlet lastMonth = -1;\n\t\tweeks.forEach((week, weekIndex) => {\n\t\t\tconst firstDayOfWeek = week.find((date) => date.getFullYear() === year);\n\t\t\tif (firstDayOfWeek) {\n\t\t\t\tconst month = firstDayOfWeek.getMonth();\n\t\t\t\tif (month !== lastMonth) {\n\t\t\t\t\tlabels.push({ month: months[month], weekIndex });\n\t\t\t\t\tlastMonth = month;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tconst validDays: string[] = [];\n\t\tconst dateToValidIndex = new Map<string, number>();\n\n\t\tweeks.forEach((week) => {\n\t\t\tweek.forEach((date) => {\n\t\t\t\tif (date.getFullYear() === year) {\n\t\t\t\t\tconst dateStr = formatDate(date);\n\t\t\t\t\tdateToValidIndex.set(dateStr, validDays.length);\n\t\t\t\t\tvalidDays.push(dateStr);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\treturn { weeks, dataMap, maxValue, labels, validDays, dateToValidIndex };\n\t}, [data, months, year]);\n\n\tconst [activeDate, setActiveDate] = useState<string>(() => {\n\t\treturn validDays[0] ?? `${year}-01-01`;\n\t});\n\tconst [openTooltipDate, setOpenTooltipDate] = useState<string | null>(null);\n\n\tconst cellRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\n\tconst isYearFocusedInsideRef = useRef(false);\n\n\t// If year or validDays change: if a cell held focus, restore focus to the clamped\n\t// active date or scroll container; if focus was outside, do NOT steal focus.\n\tuseEffect(() => {\n\t\tconst hadFocus = isYearFocusedInsideRef.current;\n\t\tif (validDays.length === 0) {\n\t\t\tsetActiveDate(\"\");\n\t\t\tsetOpenTooltipDate(null);\n\t\t\tif (hadFocus) {\n\t\t\t\tscrollRegionRef.current?.focus();\n\t\t\t}\n\t\t} else if (!dateToValidIndex.has(activeDate)) {\n\t\t\tconst nextDate = validDays[0] ?? \"\";\n\t\t\tsetActiveDate(nextDate);\n\t\t\tif (hadFocus) {\n\t\t\t\tcellRefs.current.get(nextDate)?.focus();\n\t\t\t}\n\t\t}\n\t}, [validDays, dateToValidIndex, activeDate]);\n\n\tconst selectedDate = dateToValidIndex.has(activeDate) ? activeDate : validDays[0];\n\n\tconst navigateToDay = (targetDate: string | undefined) => {\n\t\tif (!targetDate) return;\n\t\tsetActiveDate(targetDate);\n\t\tsetOpenTooltipDate(targetDate);\n\t\tconst btn = cellRefs.current.get(targetDate);\n\t\tbtn?.focus();\n\t};\n\n\tconst handleCellKeyDown = (e: KeyboardEvent<HTMLButtonElement>, dateStr: string) => {\n\t\tif (validDays.length === 0) return;\n\n\t\tconst currentIdx = dateToValidIndex.get(dateStr) ?? 0;\n\n\t\tif (e.key === \"Escape\") {\n\t\t\tsetOpenTooltipDate(null);\n\t\t\treturn;\n\t\t}\n\n\t\tif (e.key === \"ArrowDown\") {\n\t\t\te.preventDefault();\n\t\t\t// Visually next day (down in the column)\n\t\t\tconst nextDay = validDays[currentIdx + 1];\n\t\t\tif (nextDay) {\n\t\t\t\tnavigateToDay(nextDay);\n\t\t\t}\n\t\t} else if (e.key === \"ArrowUp\") {\n\t\t\te.preventDefault();\n\t\t\t// Visually previous day (up in the column)\n\t\t\tconst prevDay = validDays[currentIdx - 1];\n\t\t\tif (prevDay) {\n\t\t\t\tnavigateToDay(prevDay);\n\t\t\t}\n\t\t} else if (e.key === \"ArrowRight\") {\n\t\t\te.preventDefault();\n\t\t\t// Visually next week (right in the row: +7 days by index)\n\t\t\tconst targetIdx = currentIdx + 7;\n\t\t\tif (targetIdx < validDays.length) {\n\t\t\t\tnavigateToDay(validDays[targetIdx]);\n\t\t\t} else {\n\t\t\t\tnavigateToDay(validDays[validDays.length - 1]);\n\t\t\t}\n\t\t} else if (e.key === \"ArrowLeft\") {\n\t\t\te.preventDefault();\n\t\t\t// Visually previous week (left in the row: -7 days by index)\n\t\t\tconst targetIdx = currentIdx - 7;\n\t\t\tif (targetIdx >= 0) {\n\t\t\t\tnavigateToDay(validDays[targetIdx]);\n\t\t\t} else {\n\t\t\t\tnavigateToDay(validDays[0]);\n\t\t\t}\n\t\t} else if (e.key === \"Home\") {\n\t\t\te.preventDefault();\n\t\t\tnavigateToDay(validDays[0]);\n\t\t} else if (e.key === \"End\") {\n\t\t\te.preventDefault();\n\t\t\tnavigateToDay(validDays[validDays.length - 1]);\n\t\t}\n\t};\n\n\tconst labelWidth = 30;\n\n\treturn (\n\t\t<div\n\t\t\tref={scrollRegionRef}\n\t\t\ttabIndex={-1}\n\t\t\trole=\"region\"\n\t\t\taria-label={`${ariaLabel} scrollable view`}\n\t\t\tonFocus={() => {\n\t\t\t\tisYearFocusedInsideRef.current = true;\n\t\t\t}}\n\t\t\tonBlur={(e) => {\n\t\t\t\tif (!e.currentTarget.contains(e.relatedTarget)) {\n\t\t\t\t\tisYearFocusedInsideRef.current = false;\n\t\t\t\t}\n\t\t\t}}\n\t\t\tclassName={cn(\"basalt-focus basalt-focus-inset overflow-x-auto rounded-basalt-md\", className)}\n\t\t>\n\t\t\t<TooltipProvider>\n\t\t\t\t<div className=\"inline-block p-basalt-space-sm\" role=\"group\" aria-label={ariaLabel}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"relative mb-basalt-space-sm h-basalt-4 text-basalt-sm text-basalt-muted-foreground\"\n\t\t\t\t\t\tstyle={{ marginLeft: labelWidth }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{labels.map((label) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={`${label.month}-${label.weekIndex}`}\n\t\t\t\t\t\t\t\tclassName=\"absolute\"\n\t\t\t\t\t\t\t\tstyle={{ left: label.weekIndex * (cellSize + cellGap) }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{label.month}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"mr-basalt-space-sm flex flex-col text-basalt-sm text-basalt-muted-foreground select-none\"\n\t\t\t\t\t\t\tstyle={{ width: labelWidth }}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{weekdays.map((day, index) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={`${day}-${index}`}\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\theight: cellSize + cellGap,\n\t\t\t\t\t\t\t\t\t\tlineHeight: `${cellSize + cellGap}px`,\n\t\t\t\t\t\t\t\t\t\tvisibility: index % 2 === 1 ? \"visible\" : \"hidden\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{day}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex\" style={{ gap: cellGap }}>\n\t\t\t\t\t\t\t{weeks.map((week, weekIndex) => (\n\t\t\t\t\t\t\t\t<div key={weekIndex} className=\"flex flex-col\" style={{ gap: cellGap }}>\n\t\t\t\t\t\t\t\t\t{week.map((date, dayIndex) => {\n\t\t\t\t\t\t\t\t\t\tconst dateStr = formatDate(date);\n\t\t\t\t\t\t\t\t\t\tconst isCurrentYear = date.getFullYear() === year;\n\t\t\t\t\t\t\t\t\t\tif (!isCurrentYear) {\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={dayIndex}\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: cellSize,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theight: cellSize,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvisibility: \"hidden\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tconst value = dataMap.get(dateStr) ?? 0;\n\t\t\t\t\t\t\t\t\t\tconst colorIndex = getColorIndex(value, maxValue, colorScale);\n\t\t\t\t\t\t\t\t\t\tconst isSelected = selectedDate === dateStr;\n\t\t\t\t\t\t\t\t\t\tconst formattedValue = valueFormatter(value, dateStr);\n\t\t\t\t\t\t\t\t\t\tconst labelText = `${dateStr}, ${metricLabel}: ${formattedValue}`;\n\t\t\t\t\t\t\t\t\t\tconst isOpen = openTooltipDate === dateStr;\n\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\t\t\t\t\t\tkey={dayIndex}\n\t\t\t\t\t\t\t\t\t\t\t\topen={isOpen}\n\t\t\t\t\t\t\t\t\t\t\t\tonOpenChange={(next) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (next) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetOpenTooltipDate(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetOpenTooltipDate((curr) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (curr !== dateStr) return curr;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// If this cell currently holds document focus, ignore scroll dismiss\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst isCellFocused =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdocument.activeElement === cellRefs.current.get(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn isCellFocused ? curr : null;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (el) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcellRefs.current.set(dateStr, el);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcellRefs.current.delete(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={labelText}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttabIndex={isSelected ? 0 : -1}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetActiveDate(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetOpenTooltipDate(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonBlur={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetOpenTooltipDate((curr) => (curr === dateStr ? null : curr));\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(e) => handleCellKeyDown(e, dateStr)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"basalt-focus basalt-focus-inset basalt-focus-swatch box-border m-0 cursor-pointer rounded-basalt-sm border-0 p-0 transition-colors basalt-motion hover:ring-1 hover:ring-basalt-foreground\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: cellSize,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\theight: cellSize,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbackgroundColor: colorScale[colorIndex],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t\t\t\t\t\t<TooltipContent id={`${calendarId}-${dateStr}`}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-basalt-base\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"font-medium\">{dateStr}</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-basalt-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{metricLabel}: {formattedValue}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"mt-basalt-space-lg flex items-center justify-end gap-basalt-space-sm text-basalt-sm text-basalt-muted-foreground select-none\"\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>{lessLabel}</span>\n\t\t\t\t\t\t{colorScale.map((color) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={color}\n\t\t\t\t\t\t\t\tclassName=\"rounded-basalt-sm\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\twidth: cellSize,\n\t\t\t\t\t\t\t\t\theight: cellSize,\n\t\t\t\t\t\t\t\t\tbackgroundColor: color,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t<span>{moreLabel}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</TooltipProvider>\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"heatmap-calendar.js","names":["heatmapColorScales","weekdayNames","locale","index","monthNames","getYearWeeks","weeks","startDate","year","endDate","firstDay","currentDate","currentWeek","formatDate","date","getColorIndex","value","levels","colorScale","normalized","maxValue","HeatmapCalendar","props","YearHeatmap","ValuesHeatmap","activeIdx","setActiveIdx","useState","openTooltipIdx","setOpenTooltipIdx","containerRef","useRef","cellRefs","isFocusedInsideRef","hadFocus","values","next","handleKeyDown","nextIdx","currentIndex","container","ariaLabel","cn","className","Tooltip","curr","TooltipTrigger","el","TooltipContent","TooltipProvider","weekdays","weekdayLabels","months","monthLabels","calendarId","useId","scrollRegionRef","useMemo","dataMap","point","data","labels","lastMonth","firstDayOfWeek","week","month","validDays","dateToValidIndex","dateStr","activeDate","setActiveDate","openTooltipDate","setOpenTooltipDate","isYearFocusedInsideRef","nextDate","selectedDate","navigateToDay","targetDate","handleCellKeyDown","currentIdx","nextDay","prevDay","targetIdx","label","cellSize","cellGap","day","dayIndex","colorIndex","isSelected","formattedValue","valueFormatter","labelText","metricLabel","weekIndex","lessLabel","color","moreLabel"],"sources":["../../src/charts/heatmap-calendar.tsx"],"sourcesContent":["import { type KeyboardEvent, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"../components/tooltip\";\nimport { cn } from \"../utils/cn\";\n\nexport type HeatmapDataPoint = { date: string; value: number };\n\nexport const heatmapColorScales = {\n\tgreen: [\n\t\t\"hsl(var(--basalt-muted))\",\n\t\t\"hsl(var(--basalt-heatmap-green-1))\",\n\t\t\"hsl(var(--basalt-heatmap-green-2))\",\n\t\t\"hsl(var(--basalt-heatmap-green-3))\",\n\t\t\"hsl(var(--basalt-heatmap-green-4))\",\n\t],\n\tred: [\n\t\t\"hsl(var(--basalt-muted))\",\n\t\t\"hsl(var(--basalt-heatmap-red-1))\",\n\t\t\"hsl(var(--basalt-heatmap-red-2))\",\n\t\t\"hsl(var(--basalt-heatmap-red-3))\",\n\t\t\"hsl(var(--basalt-heatmap-red-4))\",\n\t],\n\tblue: [\n\t\t\"hsl(var(--basalt-muted))\",\n\t\t\"hsl(var(--basalt-heatmap-blue-1))\",\n\t\t\"hsl(var(--basalt-heatmap-blue-2))\",\n\t\t\"hsl(var(--basalt-heatmap-blue-3))\",\n\t\t\"hsl(var(--basalt-heatmap-blue-4))\",\n\t],\n\torange: [\n\t\t\"hsl(var(--basalt-muted))\",\n\t\t\"hsl(var(--basalt-heatmap-orange-1))\",\n\t\t\"hsl(var(--basalt-heatmap-orange-2))\",\n\t\t\"hsl(var(--basalt-heatmap-orange-3))\",\n\t\t\"hsl(var(--basalt-heatmap-orange-4))\",\n\t],\n} as const;\n\nfunction weekdayNames(locale: string) {\n\treturn Array.from({ length: 7 }, (_, index) =>\n\t\tnew Intl.DateTimeFormat(locale, { weekday: \"short\" }).format(new Date(2023, 0, 1 + index)),\n\t);\n}\n\nfunction monthNames(locale: string) {\n\treturn Array.from({ length: 12 }, (_, index) =>\n\t\tnew Intl.DateTimeFormat(locale, { month: \"short\" }).format(new Date(2023, index, 1)),\n\t);\n}\n\nfunction getYearWeeks(year: number): Date[][] {\n\tconst weeks: Date[][] = [];\n\tconst startDate = new Date(year, 0, 1);\n\tconst endDate = new Date(year, 11, 31);\n\tconst firstDay = new Date(startDate);\n\tfirstDay.setDate(firstDay.getDate() - firstDay.getDay());\n\tlet currentDate = new Date(firstDay);\n\tlet currentWeek: Date[] = [];\n\twhile (currentDate <= endDate || currentWeek.length > 0) {\n\t\tif (currentWeek.length === 7) {\n\t\t\tweeks.push(currentWeek);\n\t\t\tcurrentWeek = [];\n\t\t}\n\t\tif (currentDate > endDate) {\n\t\t\tbreak;\n\t\t}\n\t\tcurrentWeek.push(new Date(currentDate));\n\t\tcurrentDate = new Date(currentDate);\n\t\tcurrentDate.setDate(currentDate.getDate() + 1);\n\t}\n\tif (currentWeek.length > 0) {\n\t\tweeks.push(currentWeek);\n\t}\n\treturn weeks;\n}\n\nfunction formatDate(date: Date): string {\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 getColorIndex(value: number, maxValue: number, colorScale: readonly string[]): number {\n\tif (value === 0) {\n\t\treturn 0;\n\t}\n\tconst levels = colorScale.length - 1;\n\tconst normalized = Math.min(value / maxValue, 1);\n\treturn Math.ceil(normalized * levels);\n}\n\nexport type HeatmapCalendarValuesProps = {\n\t/**\n\t * Numeric values sequence to display in a compact 7-column grid.\n\t */\n\tvalues: number[];\n\t/**\n\t * Accessible name describing the heatmap purpose or data.\n\t * @default \"Heatmap calendar\"\n\t */\n\tariaLabel?: string;\n\t/**\n\t * Additional CSS class names for the outer container.\n\t */\n\tclassName?: string;\n};\n\nexport type HeatmapCalendarYearProps = {\n\t/**\n\t * Dataset of daily metrics with ISO date strings (\"YYYY-MM-DD\") and numeric values.\n\t */\n\tdata: HeatmapDataPoint[];\n\t/**\n\t * Calendar year to render.\n\t */\n\tyear: number;\n\t/**\n\t * Array of color values forming the intensity gradient from lowest to highest.\n\t * @default heatmapColorScales.green\n\t */\n\tcolorScale?: readonly string[];\n\t/**\n\t * Formatter for tooltip value display and accessible label.\n\t * @default (value) => value.toLocaleString()\n\t */\n\tvalueFormatter?: (value: number, date: string) => string;\n\t/**\n\t * Name of the metric for accessible labeling and tooltips.\n\t * @default \"Value\"\n\t */\n\tmetricLabel?: string;\n\t/**\n\t * Pixel width and height of each day cell.\n\t * @default 12\n\t */\n\tcellSize?: number;\n\t/**\n\t * Pixel gap between adjacent cells.\n\t * @default 2\n\t */\n\tcellGap?: number;\n\t/**\n\t * BCP 47 locale tag used for weekday and month label formatting.\n\t * @default \"en-US\"\n\t */\n\tlocale?: string;\n\t/**\n\t * Explicit custom weekday labels override.\n\t */\n\tweekdayLabels?: string[];\n\t/**\n\t * Explicit custom month labels override.\n\t */\n\tmonthLabels?: string[];\n\t/**\n\t * Label text for the lower end of the color scale legend.\n\t * @default \"Less\"\n\t */\n\tlessLabel?: string;\n\t/**\n\t * Label text for the upper end of the color scale legend.\n\t * @default \"More\"\n\t */\n\tmoreLabel?: string;\n\t/**\n\t * Accessible name describing the yearly heatmap dataset.\n\t * @default \"Heatmap calendar\"\n\t */\n\tariaLabel?: string;\n\t/**\n\t * Additional CSS class names for the outer scrollable container.\n\t */\n\tclassName?: string;\n};\n\nexport type HeatmapCalendarProps = HeatmapCalendarValuesProps | HeatmapCalendarYearProps;\n\nexport function HeatmapCalendar(props: HeatmapCalendarProps) {\n\tif (\"data\" in props) {\n\t\treturn <YearHeatmap {...props} />;\n\t}\n\treturn <ValuesHeatmap {...props} />;\n}\n\nfunction ValuesHeatmap({\n\tvalues,\n\tariaLabel = \"Heatmap calendar\",\n\tclassName,\n}: HeatmapCalendarValuesProps) {\n\tconst [activeIdx, setActiveIdx] = useState(0);\n\tconst [openTooltipIdx, setOpenTooltipIdx] = useState<number | null>(null);\n\tconst containerRef = useRef<HTMLDivElement | null>(null);\n\tconst cellRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\tconst isFocusedInsideRef = useRef(false);\n\n\t// When values array shrinks, empties, or restores: if an item or container currently held focus,\n\t// restore focus to the new valid index or empty container without stealing focus from outside.\n\tuseEffect(() => {\n\t\tconst hadFocus = isFocusedInsideRef.current;\n\t\tif (values.length === 0) {\n\t\t\tsetActiveIdx(0);\n\t\t\tsetOpenTooltipIdx(null);\n\t\t\tif (hadFocus) {\n\t\t\t\tcontainerRef.current?.focus();\n\t\t\t}\n\t\t} else if (activeIdx >= values.length) {\n\t\t\tconst next = values.length - 1;\n\t\t\tsetActiveIdx(next);\n\t\t\tif (hadFocus) {\n\t\t\t\tcellRefs.current[next]?.focus();\n\t\t\t}\n\t\t} else if (hadFocus) {\n\t\t\tcellRefs.current[activeIdx]?.focus();\n\t\t}\n\t}, [values.length, activeIdx]);\n\n\tconst handleKeyDown = (e: KeyboardEvent<HTMLButtonElement>, currentIndex: number) => {\n\t\tif (values.length === 0) return;\n\n\t\tif (e.key === \"Escape\") {\n\t\t\tsetOpenTooltipIdx(null);\n\t\t\treturn;\n\t\t}\n\n\t\tlet nextIdx = currentIndex;\n\t\tif (e.key === \"ArrowRight\") {\n\t\t\tnextIdx = Math.min(values.length - 1, currentIndex + 1);\n\t\t} else if (e.key === \"ArrowLeft\") {\n\t\t\tnextIdx = Math.max(0, currentIndex - 1);\n\t\t} else if (e.key === \"ArrowDown\") {\n\t\t\tnextIdx = Math.min(values.length - 1, currentIndex + 7);\n\t\t} else if (e.key === \"ArrowUp\") {\n\t\t\tnextIdx = Math.max(0, currentIndex - 7);\n\t\t} else if (e.key === \"Home\") {\n\t\t\tnextIdx = 0;\n\t\t} else if (e.key === \"End\") {\n\t\t\tnextIdx = values.length - 1;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\te.preventDefault();\n\t\tsetActiveIdx(nextIdx);\n\t\tsetOpenTooltipIdx(nextIdx);\n\t\tcellRefs.current[nextIdx]?.focus();\n\t};\n\n\tconst container = (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\ttabIndex={-1}\n\t\t\trole=\"region\"\n\t\t\taria-label={ariaLabel}\n\t\t\tonFocus={() => {\n\t\t\t\tisFocusedInsideRef.current = true;\n\t\t\t}}\n\t\t\tonBlur={(e) => {\n\t\t\t\tif (!e.currentTarget.contains(e.relatedTarget)) {\n\t\t\t\t\tisFocusedInsideRef.current = false;\n\t\t\t\t}\n\t\t\t}}\n\t\t\tclassName={cn(\n\t\t\t\t\"basalt-focus basalt-focus-inset grid grid-cols-7 gap-basalt-space-sm p-basalt-space-xs\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{values.map((value, index) => {\n\t\t\t\tconst isCurrent = index === activeIdx;\n\t\t\t\tconst isOpen = openTooltipIdx === index;\n\t\t\t\treturn (\n\t\t\t\t\t<Tooltip\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\topen={isOpen}\n\t\t\t\t\t\tonOpenChange={(next) => {\n\t\t\t\t\t\t\tif (next) {\n\t\t\t\t\t\t\t\tsetOpenTooltipIdx(index);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsetOpenTooltipIdx((curr) => {\n\t\t\t\t\t\t\t\t\tif (curr !== index) return curr;\n\t\t\t\t\t\t\t\t\t// If this cell currently holds document focus, ignore scroll dismiss\n\t\t\t\t\t\t\t\t\tconst isCellFocused =\n\t\t\t\t\t\t\t\t\t\tcellRefs.current[index] !== null &&\n\t\t\t\t\t\t\t\t\t\tdocument.activeElement === cellRefs.current[index];\n\t\t\t\t\t\t\t\t\treturn isCellFocused ? curr : null;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\tcellRefs.current[index] = el;\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\ttabIndex={isCurrent ? 0 : -1}\n\t\t\t\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\t\t\t\tsetActiveIdx(index);\n\t\t\t\t\t\t\t\t\tsetOpenTooltipIdx(index);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonBlur={() => {\n\t\t\t\t\t\t\t\t\tsetOpenTooltipIdx((curr) => (curr === index ? null : curr));\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonKeyDown={(e) => handleKeyDown(e, index)}\n\t\t\t\t\t\t\t\taria-label={`Position ${index + 1}: ${value}`}\n\t\t\t\t\t\t\t\tclassName=\"basalt-focus basalt-focus-inset basalt-focus-swatch box-border m-0 h-basalt-3 w-basalt-3 cursor-pointer rounded-basalt-sm border-0 p-0 transition-colors basalt-motion\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tbackgroundColor: `hsl(var(--basalt-chart-5) / ${0.2 + Math.min(4, Math.max(0, value)) * 0.15})`,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t<div className=\"text-basalt-sm\">\n\t\t\t\t\t\t\t\tPosition {index + 1}: {value}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n\n\tif (values.length === 0) {\n\t\treturn container;\n\t}\n\n\treturn <TooltipProvider>{container}</TooltipProvider>;\n}\n\nfunction YearHeatmap({\n\tdata,\n\tyear,\n\tcolorScale = heatmapColorScales.green,\n\tvalueFormatter = (value) => value.toLocaleString(),\n\tmetricLabel = \"Value\",\n\tcellSize = 12,\n\tcellGap = 2,\n\tlocale = \"en-US\",\n\tweekdayLabels,\n\tmonthLabels,\n\tlessLabel = \"Less\",\n\tmoreLabel = \"More\",\n\tariaLabel = \"Heatmap calendar\",\n\tclassName,\n}: HeatmapCalendarYearProps) {\n\tconst weekdays = weekdayLabels ?? weekdayNames(locale);\n\tconst months = monthLabels ?? monthNames(locale);\n\tconst calendarId = useId();\n\tconst scrollRegionRef = useRef<HTMLDivElement | null>(null);\n\n\tconst { weeks, dataMap, maxValue, labels, validDays, dateToValidIndex } = useMemo(() => {\n\t\tconst weeks = getYearWeeks(year);\n\t\tconst dataMap = new Map<string, number>();\n\t\tlet maxValue = 0;\n\t\tfor (const point of data) {\n\t\t\tdataMap.set(point.date, point.value);\n\t\t\tif (point.value > maxValue) {\n\t\t\t\tmaxValue = point.value;\n\t\t\t}\n\t\t}\n\n\t\tconst labels: { month: string; weekIndex: number }[] = [];\n\t\tlet lastMonth = -1;\n\t\tweeks.forEach((week, weekIndex) => {\n\t\t\tconst firstDayOfWeek = week.find((date) => date.getFullYear() === year);\n\t\t\tif (firstDayOfWeek) {\n\t\t\t\tconst month = firstDayOfWeek.getMonth();\n\t\t\t\tif (month !== lastMonth) {\n\t\t\t\t\tlabels.push({ month: months[month], weekIndex });\n\t\t\t\t\tlastMonth = month;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tconst validDays: string[] = [];\n\t\tconst dateToValidIndex = new Map<string, number>();\n\n\t\tweeks.forEach((week) => {\n\t\t\tweek.forEach((date) => {\n\t\t\t\tif (date.getFullYear() === year) {\n\t\t\t\t\tconst dateStr = formatDate(date);\n\t\t\t\t\tdateToValidIndex.set(dateStr, validDays.length);\n\t\t\t\t\tvalidDays.push(dateStr);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\treturn { weeks, dataMap, maxValue, labels, validDays, dateToValidIndex };\n\t}, [data, months, year]);\n\n\tconst [activeDate, setActiveDate] = useState<string>(() => {\n\t\treturn validDays[0] ?? `${year}-01-01`;\n\t});\n\tconst [openTooltipDate, setOpenTooltipDate] = useState<string | null>(null);\n\n\tconst cellRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\n\tconst isYearFocusedInsideRef = useRef(false);\n\n\t// If year or validDays change: if a cell held focus, restore focus to the clamped\n\t// active date or scroll container; if focus was outside, do NOT steal focus.\n\tuseEffect(() => {\n\t\tconst hadFocus = isYearFocusedInsideRef.current;\n\t\tif (validDays.length === 0) {\n\t\t\tsetActiveDate(\"\");\n\t\t\tsetOpenTooltipDate(null);\n\t\t\tif (hadFocus) {\n\t\t\t\tscrollRegionRef.current?.focus();\n\t\t\t}\n\t\t} else if (!dateToValidIndex.has(activeDate)) {\n\t\t\tconst nextDate = validDays[0] ?? \"\";\n\t\t\tsetActiveDate(nextDate);\n\t\t\tif (hadFocus) {\n\t\t\t\tcellRefs.current.get(nextDate)?.focus();\n\t\t\t}\n\t\t}\n\t}, [validDays, dateToValidIndex, activeDate]);\n\n\tconst selectedDate = dateToValidIndex.has(activeDate) ? activeDate : validDays[0];\n\n\tconst navigateToDay = (targetDate: string | undefined) => {\n\t\tif (!targetDate) return;\n\t\tsetActiveDate(targetDate);\n\t\tsetOpenTooltipDate(targetDate);\n\t\tconst btn = cellRefs.current.get(targetDate);\n\t\tbtn?.focus();\n\t};\n\n\tconst handleCellKeyDown = (e: KeyboardEvent<HTMLButtonElement>, dateStr: string) => {\n\t\tif (validDays.length === 0) return;\n\n\t\tconst currentIdx = dateToValidIndex.get(dateStr) ?? 0;\n\n\t\tif (e.key === \"Escape\") {\n\t\t\tsetOpenTooltipDate(null);\n\t\t\treturn;\n\t\t}\n\n\t\tif (e.key === \"ArrowDown\") {\n\t\t\te.preventDefault();\n\t\t\t// Visually next day (down in the column)\n\t\t\tconst nextDay = validDays[currentIdx + 1];\n\t\t\tif (nextDay) {\n\t\t\t\tnavigateToDay(nextDay);\n\t\t\t}\n\t\t} else if (e.key === \"ArrowUp\") {\n\t\t\te.preventDefault();\n\t\t\t// Visually previous day (up in the column)\n\t\t\tconst prevDay = validDays[currentIdx - 1];\n\t\t\tif (prevDay) {\n\t\t\t\tnavigateToDay(prevDay);\n\t\t\t}\n\t\t} else if (e.key === \"ArrowRight\") {\n\t\t\te.preventDefault();\n\t\t\t// Visually next week (right in the row: +7 days by index)\n\t\t\tconst targetIdx = currentIdx + 7;\n\t\t\tif (targetIdx < validDays.length) {\n\t\t\t\tnavigateToDay(validDays[targetIdx]);\n\t\t\t} else {\n\t\t\t\tnavigateToDay(validDays[validDays.length - 1]);\n\t\t\t}\n\t\t} else if (e.key === \"ArrowLeft\") {\n\t\t\te.preventDefault();\n\t\t\t// Visually previous week (left in the row: -7 days by index)\n\t\t\tconst targetIdx = currentIdx - 7;\n\t\t\tif (targetIdx >= 0) {\n\t\t\t\tnavigateToDay(validDays[targetIdx]);\n\t\t\t} else {\n\t\t\t\tnavigateToDay(validDays[0]);\n\t\t\t}\n\t\t} else if (e.key === \"Home\") {\n\t\t\te.preventDefault();\n\t\t\tnavigateToDay(validDays[0]);\n\t\t} else if (e.key === \"End\") {\n\t\t\te.preventDefault();\n\t\t\tnavigateToDay(validDays[validDays.length - 1]);\n\t\t}\n\t};\n\n\tconst labelWidth = 30;\n\n\treturn (\n\t\t<div\n\t\t\tref={scrollRegionRef}\n\t\t\ttabIndex={-1}\n\t\t\trole=\"region\"\n\t\t\taria-label={`${ariaLabel} scrollable view`}\n\t\t\tonFocus={() => {\n\t\t\t\tisYearFocusedInsideRef.current = true;\n\t\t\t}}\n\t\t\tonBlur={(e) => {\n\t\t\t\tif (!e.currentTarget.contains(e.relatedTarget)) {\n\t\t\t\t\tisYearFocusedInsideRef.current = false;\n\t\t\t\t}\n\t\t\t}}\n\t\t\tclassName={cn(\"basalt-focus basalt-focus-inset overflow-x-auto rounded-basalt-md\", className)}\n\t\t>\n\t\t\t<TooltipProvider>\n\t\t\t\t<div className=\"inline-block p-basalt-space-sm\" role=\"group\" aria-label={ariaLabel}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"relative mb-basalt-space-sm h-basalt-4 text-basalt-sm text-basalt-muted-foreground\"\n\t\t\t\t\t\tstyle={{ marginLeft: labelWidth }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{labels.map((label) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={`${label.month}-${label.weekIndex}`}\n\t\t\t\t\t\t\t\tclassName=\"absolute\"\n\t\t\t\t\t\t\t\tstyle={{ left: label.weekIndex * (cellSize + cellGap) }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{label.month}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"mr-basalt-space-sm flex flex-col text-basalt-sm text-basalt-muted-foreground select-none\"\n\t\t\t\t\t\t\tstyle={{ width: labelWidth }}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{weekdays.map((day, index) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={`${day}-${index}`}\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\theight: cellSize + cellGap,\n\t\t\t\t\t\t\t\t\t\tlineHeight: `${cellSize + cellGap}px`,\n\t\t\t\t\t\t\t\t\t\tvisibility: index % 2 === 1 ? \"visible\" : \"hidden\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{day}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex\" style={{ gap: cellGap }}>\n\t\t\t\t\t\t\t{weeks.map((week, weekIndex) => (\n\t\t\t\t\t\t\t\t<div key={weekIndex} className=\"flex flex-col\" style={{ gap: cellGap }}>\n\t\t\t\t\t\t\t\t\t{week.map((date, dayIndex) => {\n\t\t\t\t\t\t\t\t\t\tconst dateStr = formatDate(date);\n\t\t\t\t\t\t\t\t\t\tconst isCurrentYear = date.getFullYear() === year;\n\t\t\t\t\t\t\t\t\t\tif (!isCurrentYear) {\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={dayIndex}\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: cellSize,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theight: cellSize,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvisibility: \"hidden\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tconst value = dataMap.get(dateStr) ?? 0;\n\t\t\t\t\t\t\t\t\t\tconst colorIndex = getColorIndex(value, maxValue, colorScale);\n\t\t\t\t\t\t\t\t\t\tconst isSelected = selectedDate === dateStr;\n\t\t\t\t\t\t\t\t\t\tconst formattedValue = valueFormatter(value, dateStr);\n\t\t\t\t\t\t\t\t\t\tconst labelText = `${dateStr}, ${metricLabel}: ${formattedValue}`;\n\t\t\t\t\t\t\t\t\t\tconst isOpen = openTooltipDate === dateStr;\n\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\t\t\t\t\t\tkey={dayIndex}\n\t\t\t\t\t\t\t\t\t\t\t\topen={isOpen}\n\t\t\t\t\t\t\t\t\t\t\t\tonOpenChange={(next) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (next) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetOpenTooltipDate(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetOpenTooltipDate((curr) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (curr !== dateStr) return curr;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// If this cell currently holds document focus, ignore scroll dismiss\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst isCellFocused =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdocument.activeElement === cellRefs.current.get(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn isCellFocused ? curr : null;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (el) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcellRefs.current.set(dateStr, el);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcellRefs.current.delete(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={labelText}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttabIndex={isSelected ? 0 : -1}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetActiveDate(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetOpenTooltipDate(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonBlur={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetOpenTooltipDate((curr) => (curr === dateStr ? null : curr));\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(e) => handleCellKeyDown(e, dateStr)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"basalt-focus basalt-focus-inset basalt-focus-swatch box-border m-0 cursor-pointer rounded-basalt-sm border-0 p-0 transition-colors basalt-motion hover:ring-1 hover:ring-basalt-foreground\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: cellSize,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\theight: cellSize,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbackgroundColor: colorScale[colorIndex],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t\t\t\t\t\t<TooltipContent id={`${calendarId}-${dateStr}`}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-basalt-base\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"font-medium\">{dateStr}</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-basalt-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{metricLabel}: {formattedValue}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"mt-basalt-space-lg flex items-center justify-end gap-basalt-space-sm text-basalt-sm text-basalt-muted-foreground select-none\"\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>{lessLabel}</span>\n\t\t\t\t\t\t{colorScale.map((color) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={color}\n\t\t\t\t\t\t\t\tclassName=\"rounded-basalt-sm\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\twidth: cellSize,\n\t\t\t\t\t\t\t\t\theight: cellSize,\n\t\t\t\t\t\t\t\t\tbackgroundColor: color,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t<span>{moreLabel}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</TooltipProvider>\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { Tooltip as t, TooltipContent as n, TooltipProvider as r, TooltipTrigger
|
|
|
4
4
|
import { heatmapColorScales as a } from "./heatmap-calendar.js";
|
|
5
5
|
import { forwardRef as o, useCallback as s, useEffect as c, useId as l, useMemo as u, useRef as d, useState as f } from "react";
|
|
6
6
|
import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
7
|
-
|
|
7
|
+
// src/charts/heatmap-matrix.tsx
|
|
8
8
|
function g(e, t, n, r) {
|
|
9
9
|
if (e == null || typeof e != "number" || !Number.isFinite(e)) return -1;
|
|
10
10
|
if (r <= 1) return 0;
|
|
@@ -243,7 +243,6 @@ var _ = o(function({ rowLabels: o, columnLabels: _, values: v, domain: y, colorS
|
|
|
243
243
|
}) });
|
|
244
244
|
});
|
|
245
245
|
_.displayName = "HeatmapMatrix";
|
|
246
|
-
//#endregion
|
|
247
246
|
export { _ as HeatmapMatrix };
|
|
248
247
|
|
|
249
248
|
//# sourceMappingURL=heatmap-matrix.js.map
|
package/dist/charts/item-list.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { cn as e } from "../utils/cn.js";
|
|
3
3
|
import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
4
|
-
|
|
4
|
+
// src/charts/item-list.tsx
|
|
5
5
|
function r({ items: r, ariaLabel: i = "Item list", className: a }) {
|
|
6
6
|
return /* @__PURE__ */ t("ul", {
|
|
7
7
|
className: e("space-y-basalt-space-sm text-basalt-base", a),
|
|
@@ -12,7 +12,6 @@ function r({ items: r, ariaLabel: i = "Item list", className: a }) {
|
|
|
12
12
|
}) : null] }, e.id ?? `${e.label}-${e.value ?? ""}-${t}`))
|
|
13
13
|
});
|
|
14
14
|
}
|
|
15
|
-
//#endregion
|
|
16
15
|
export { r as ItemList };
|
|
17
16
|
|
|
18
17
|
//# sourceMappingURL=item-list.js.map
|
package/dist/charts/legend.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { seriesColor as e } from "./config.js";
|
|
3
3
|
import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
4
|
-
|
|
4
|
+
// src/charts/legend.tsx
|
|
5
5
|
function r({ items: r, shape: i = "line" }) {
|
|
6
6
|
return r.length === 0 ? null : /* @__PURE__ */ t("div", {
|
|
7
7
|
"data-testid": "chart-legend",
|
|
@@ -50,7 +50,6 @@ function r({ items: r, shape: i = "line" }) {
|
|
|
50
50
|
})
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
|
-
//#endregion
|
|
54
53
|
export { r as ChartLegend };
|
|
55
54
|
|
|
56
55
|
//# sourceMappingURL=legend.js.map
|
package/dist/charts/line.js
CHANGED
|
@@ -5,7 +5,7 @@ import { ChartShell as d } from "./frame.js";
|
|
|
5
5
|
import { ChartLegend as f } from "./legend.js";
|
|
6
6
|
import { jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
7
7
|
import { CartesianGrid as h, Line as g, LineChart as _, Tooltip as v, XAxis as y, YAxis as b } from "recharts";
|
|
8
|
-
|
|
8
|
+
// src/charts/line.tsx
|
|
9
9
|
function x({ data: x, series: S, ariaLabel: C = "Line chart", className: w, showAxes: T = !1, showLegend: E = !1, color: D, valueFormatter: O, xValueFormatter: k, yDomain: A, legend: j, customTooltip: M, summary: N, dataAlternative: P, accessibilityLayer: F }) {
|
|
10
10
|
let I = c(l(S, u(x)), D), L = j === void 0 ? E ? /* @__PURE__ */ p(f, {
|
|
11
11
|
items: I,
|
|
@@ -51,7 +51,6 @@ function x({ data: x, series: S, ariaLabel: C = "Line chart", className: w, show
|
|
|
51
51
|
})
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
|
-
//#endregion
|
|
55
54
|
export { x as LineChart };
|
|
56
55
|
|
|
57
56
|
//# sourceMappingURL=line.js.map
|
package/dist/charts/palette.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as e } from "react/jsx-runtime";
|
|
3
|
-
|
|
3
|
+
// src/charts/palette.tsx
|
|
4
4
|
var t = (e) => `hsl(var(--basalt-${e}))`, n = (e, t) => `hsl(var(--basalt-${e}) / ${t})`, r = t("chart-axis"), i = t("chart-muted"), a = {
|
|
5
5
|
primary: t("chart-1"),
|
|
6
6
|
sky: t("chart-2"),
|
|
@@ -44,7 +44,6 @@ function s({ ariaLabel: t = "Chart colors" }) {
|
|
|
44
44
|
}, t))
|
|
45
45
|
});
|
|
46
46
|
}
|
|
47
|
-
//#endregion
|
|
48
47
|
export { o as CHART_COLORS, s as ChartPalette, a as chart, r as chartAxis, i as chartMuted, n as withAlpha };
|
|
49
48
|
|
|
50
49
|
//# sourceMappingURL=palette.js.map
|