@nocoo/basalt 3.2.0 → 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 +73 -56
- package/ai/INTEGRATION.md +819 -825
- package/ai/RECIPES.md +334 -135
- package/ai/USAGE.md +2 -2
- package/ai/registry.json +454 -97
- 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 +3 -4
- 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 +7 -11
- package/dist/charts/heatmap-calendar.js.map +1 -1
- package/dist/charts/heatmap-matrix.js +4 -5
- package/dist/charts/heatmap-matrix.js.map +1 -1
- 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 +2 -3
- package/dist/components/app-header.js.map +1 -1
- package/dist/components/app-shell.js +2 -3
- package/dist/components/app-shell.js.map +1 -1
- 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 +2 -3
- package/dist/components/chat-composer.js.map +1 -1
- 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 +2 -3
- package/dist/components/chat-message.js.map +1 -1
- package/dist/components/checkbox.js +1 -2
- package/dist/components/clipboard-text.js +1 -2
- package/dist/components/code.js +2 -3
- package/dist/components/code.js.map +1 -1
- 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 +3 -4
- package/dist/components/command-palette.js.map +1 -1
- package/dist/components/confirm-dialog.js +3 -12
- package/dist/components/confirm-dialog.js.map +1 -1
- package/dist/components/context-cards.js +2 -3
- package/dist/components/context-cards.js.map +1 -1
- package/dist/components/context-menu.js +2 -3
- package/dist/components/context-menu.js.map +1 -1
- package/dist/components/data-table.js +129 -131
- 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 +2 -3
- package/dist/components/diff-table.js.map +1 -1
- package/dist/components/dock.js +1 -2
- package/dist/components/dock.js.map +1 -1
- package/dist/components/dropdown-menu.js +2 -3
- package/dist/components/dropdown-menu.js.map +1 -1
- package/dist/components/editable-nav-item.js +3 -4
- package/dist/components/editable-nav-item.js.map +1 -1
- 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 +2 -3
- package/dist/components/file-dropzone.js.map +1 -1
- package/dist/components/filter-bar.js +2 -3
- package/dist/components/filter-bar.js.map +1 -1
- 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 +4 -5
- package/dist/components/icon-picker.js.map +1 -1
- package/dist/components/inline-editable.js +2 -3
- package/dist/components/inline-editable.js.map +1 -1
- package/dist/components/input-area.js +1 -2
- package/dist/components/input-group.js +4 -5
- 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 +3 -3
- package/dist/components/layer-card.js.map +1 -1
- package/dist/components/link.js +2 -3
- package/dist/components/link.js.map +1 -1
- package/dist/components/loader.js +1 -2
- package/dist/components/loading-screen.js +1 -2
- package/dist/components/menu-bar.js +3 -4
- package/dist/components/menu-bar.js.map +1 -1
- package/dist/components/meter.js +1 -2
- package/dist/components/multi-select.js +2 -3
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/navigation-menu.js +1 -2
- package/dist/components/overlay.d.ts +3 -6
- package/dist/components/overlay.js +4 -5
- package/dist/components/overlay.js.map +1 -1
- 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 +3 -4
- package/dist/components/responsive-master-detail.js.map +1 -1
- package/dist/components/scroll-area.js +2 -3
- package/dist/components/scroll-area.js.map +1 -1
- package/dist/components/section-rule.js +1 -2
- package/dist/components/segment-control.js +2 -3
- package/dist/components/segment-control.js.map +1 -1
- package/dist/components/select.js +2 -3
- package/dist/components/select.js.map +1 -1
- package/dist/components/sensitive-input.js +2 -3
- package/dist/components/sensitive-input.js.map +1 -1
- 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 +2 -3
- package/dist/components/table.js.map +1 -1
- package/dist/components/tabs.js +2 -3
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/tag-badge.js +1 -2
- package/dist/components/tag-color-picker.js +3 -4
- package/dist/components/tag-color-picker.js.map +1 -1
- 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 +2 -3
- package/dist/components/toast.js.map +1 -1
- 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 +9 -10
- package/dist/components/toolbar.js.map +1 -1
- 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/base.css +71 -0
- package/dist/styles/standalone.css +127 -98
- package/dist/styles/tailwind.css +10 -2
- package/dist/styles/tokens.css +55 -7
- package/dist/utils/cn.js +1 -2
- package/dist/utils/control-surface.js +1 -2
- package/dist/utils/navigation.d.ts +2 -2
- 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
package/ai/sources.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"hash": "a227003ef4032c2c"
|
|
5
5
|
},
|
|
6
6
|
"packages/basalt/src/index.ts": {
|
|
7
|
-
"content": "export {\n\tAlertDialog,\n\tAlertDialogAction,\n\tAlertDialogCancel,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogTitle,\n\tAlertDialogTrigger,\n} from \"./components/alert-dialog\";\nexport { Avatar, AvatarFallback, AvatarImage } from \"./components/avatar\";\nexport { Badge } from \"./components/badge\";\nexport { Button } from \"./components/button\";\nexport { Checkbox } from \"./components/checkbox\";\nexport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"./components/collapsible\";\nexport {\n\tCommandEmpty,\n\tCommandGroup,\n\tCommandInput,\n\tCommandItem,\n\tCommandList,\n\tCommandPalette,\n\tCommandPaletteTrigger,\n\tCommandSeparator,\n\tCommandShortcut,\n} from \"./components/command-palette\";\nexport { ConfirmDialog, useConfirm } from \"./components/confirm-dialog\";\nexport { DescriptionList } from \"./components/description-list\";\nexport {\n\tDialog,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogTrigger,\n} from \"./components/dialog\";\nexport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"./components/dropdown-menu\";\nexport { Field } from \"./components/field\";\nexport { Input } from \"./components/input\";\nexport { Label } from \"./components/label\";\nexport { LayerCard } from \"./components/layer-card\";\nexport { Link } from \"./components/link\";\nexport { Meter } from \"./components/meter\";\nexport {\n\tPopover,\n\tPopoverClose,\n\tPopoverContent,\n\tPopoverDescription,\n\tPopoverTitle,\n\tPopoverTrigger,\n} from \"./components/popover\";\nexport { ScrollArea } from \"./components/scroll-area\";\nexport { SegmentControl } from \"./components/segment-control\";\nexport { Separator } from \"./components/separator\";\nexport {\n\tSheet,\n\tSheetClose,\n\tSheetContent,\n\tSheetDescription,\n\tSheetFooter,\n\tSheetHeader,\n\tSheetTitle,\n\tSheetTrigger,\n} from \"./components/sheet\";\nexport {\n\tContentIsland,\n\tSidebar,\n\tSidebarFooter,\n\tSidebarGroup,\n\tSidebarHeader,\n\tSidebarIconItem,\n\tSidebarItem,\n\tSidebarNav,\n\tSidebarPartition,\n\tSidebarProvider,\n\tSidebarSearch,\n\tSidebarUser,\n} from \"./components/sidebar\";\nexport { StatStrip } from \"./components/stat-strip\";\nexport { Switch } from \"./components/switch\";\nexport { TablePager } from \"./components/table-pager\";\nexport { Tabs, TabsContent, TabsList, TabsTrigger } from \"./components/tabs\";\nexport { Text } from \"./components/text\";\nexport { ThemeToggle } from \"./components/theme-toggle\";\nexport { Toast, Toaster, toast } from \"./components/toast\";\nexport { Toolbar } from \"./components/toolbar\";\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"./components/tooltip\";\nexport { LinkProvider } from \"./providers/link\";\nexport { ThemeProvider } from \"./providers/theme\";\n",
|
|
8
|
-
"hash": "
|
|
7
|
+
"content": "export {\n\tAlertDialog,\n\tAlertDialogAction,\n\tAlertDialogCancel,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogTitle,\n\tAlertDialogTrigger,\n} from \"./components/alert-dialog\";\nexport { Avatar, AvatarFallback, AvatarImage } from \"./components/avatar\";\nexport { Badge } from \"./components/badge\";\nexport { Button } from \"./components/button\";\nexport { Checkbox } from \"./components/checkbox\";\nexport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"./components/collapsible\";\nexport {\n\tCommandEmpty,\n\tCommandGroup,\n\tCommandInput,\n\tCommandItem,\n\tCommandList,\n\tCommandPalette,\n\tCommandPaletteTrigger,\n\tCommandSeparator,\n\tCommandShortcut,\n} from \"./components/command-palette\";\nexport { ConfirmDialog, useConfirm } from \"./components/confirm-dialog\";\nexport { DescriptionList } from \"./components/description-list\";\nexport {\n\tDialog,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogTrigger,\n} from \"./components/dialog\";\nexport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"./components/dropdown-menu\";\nexport { Field } from \"./components/field\";\nexport { Input } from \"./components/input\";\nexport { Label } from \"./components/label\";\nexport { LayerCard } from \"./components/layer-card\";\nexport { Link } from \"./components/link\";\nexport { Meter } from \"./components/meter\";\nexport {\n\tPopover,\n\tPopoverClose,\n\tPopoverContent,\n\tPopoverDescription,\n\tPopoverTitle,\n\tPopoverTrigger,\n} from \"./components/popover\";\nexport { ScrollArea } from \"./components/scroll-area\";\nexport { SegmentControl } from \"./components/segment-control\";\nexport { Separator } from \"./components/separator\";\nexport {\n\tSheet,\n\tSheetClose,\n\tSheetContent,\n\tSheetDescription,\n\tSheetFooter,\n\tSheetHeader,\n\tSheetTitle,\n\tSheetTrigger,\n} from \"./components/sheet\";\nexport {\n\tContentIsland,\n\tSidebar,\n\tSidebarBrand,\n\tSidebarFooter,\n\tSidebarGroup,\n\tSidebarHeader,\n\tSidebarIconItem,\n\tSidebarItem,\n\tSidebarNav,\n\tSidebarPartition,\n\tSidebarProvider,\n\tSidebarSearch,\n\tSidebarToggle,\n\tSidebarUser,\n} from \"./components/sidebar\";\nexport { StatStrip } from \"./components/stat-strip\";\nexport { Switch } from \"./components/switch\";\nexport { TablePager } from \"./components/table-pager\";\nexport { Tabs, TabsContent, TabsList, TabsTrigger } from \"./components/tabs\";\nexport { Text } from \"./components/text\";\nexport { ThemeToggle } from \"./components/theme-toggle\";\nexport { Toast, Toaster, toast } from \"./components/toast\";\nexport { Toolbar } from \"./components/toolbar\";\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"./components/tooltip\";\nexport { LinkProvider } from \"./providers/link\";\nexport { ThemeProvider } from \"./providers/theme\";\n",
|
|
8
|
+
"hash": "04fd1456079a4540"
|
|
9
9
|
}
|
|
10
10
|
}
|
|
@@ -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
|
}
|
|
@@ -24,14 +24,14 @@ function c({ ariaLabel: c, className: l, children: u, size: d = "h-basalt-36 w-b
|
|
|
24
24
|
minWidth: 0
|
|
25
25
|
},
|
|
26
26
|
children: [/* @__PURE__ */ i("div", {
|
|
27
|
-
className: "min-h-0 w-full flex-1 basalt-chart
|
|
27
|
+
className: "min-h-0 w-full flex-1 basalt-chart",
|
|
28
28
|
children: /* @__PURE__ */ i(o, {
|
|
29
29
|
...t,
|
|
30
30
|
children: x
|
|
31
31
|
})
|
|
32
32
|
}), f]
|
|
33
33
|
}) : /* @__PURE__ */ i("div", {
|
|
34
|
-
className: e(d, "min-h-0 min-w-0 basalt-chart
|
|
34
|
+
className: e(d, "min-h-0 min-w-0 basalt-chart", l),
|
|
35
35
|
children: /* @__PURE__ */ i(o, {
|
|
36
36
|
...t,
|
|
37
37
|
children: x
|
|
@@ -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
|
|
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))",
|
|
@@ -94,7 +94,7 @@ function y({ values: o, ariaLabel: s = "Heatmap calendar", className: f }) {
|
|
|
94
94
|
onBlur: (e) => {
|
|
95
95
|
e.currentTarget.contains(e.relatedTarget) || (y.current = !1);
|
|
96
96
|
},
|
|
97
|
-
className: e("grid grid-cols-7 gap-basalt-space-sm p-basalt-space-xs
|
|
97
|
+
className: e("basalt-focus basalt-focus-inset grid grid-cols-7 gap-basalt-space-sm p-basalt-space-xs", f),
|
|
98
98
|
children: o.map((e, r) => /* @__PURE__ */ d(t, {
|
|
99
99
|
open: h === r,
|
|
100
100
|
onOpenChange: (e) => {
|
|
@@ -116,7 +116,7 @@ function y({ values: o, ariaLabel: s = "Heatmap calendar", className: f }) {
|
|
|
116
116
|
},
|
|
117
117
|
onKeyDown: (e) => b(e, r),
|
|
118
118
|
"aria-label": `Position ${r + 1}: ${e}`,
|
|
119
|
-
className: "box-border m-0 h-basalt-3 w-basalt-3 cursor-pointer rounded-basalt-sm border-0 p-0 transition-colors basalt-motion
|
|
119
|
+
className: "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",
|
|
120
120
|
style: { backgroundColor: `hsl(var(--basalt-chart-5) / ${.2 + Math.min(4, Math.max(0, e)) * .15})` }
|
|
121
121
|
})
|
|
122
122
|
}), /* @__PURE__ */ u(n, { children: /* @__PURE__ */ d("div", {
|
|
@@ -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);
|
|
@@ -218,7 +215,7 @@ function b({ data: v, year: y, colorScale: b = f.green, valueFormatter: x = (e)
|
|
|
218
215
|
onBlur: (e) => {
|
|
219
216
|
e.currentTarget.contains(e.relatedTarget) || (q.current = !1);
|
|
220
217
|
},
|
|
221
|
-
className: e("
|
|
218
|
+
className: e("basalt-focus basalt-focus-inset overflow-x-auto rounded-basalt-md", j),
|
|
222
219
|
children: /* @__PURE__ */ u(r, { children: /* @__PURE__ */ d("div", {
|
|
223
220
|
className: "inline-block p-basalt-space-sm",
|
|
224
221
|
role: "group",
|
|
@@ -285,7 +282,7 @@ function b({ data: v, year: y, colorScale: b = f.green, valueFormatter: x = (e)
|
|
|
285
282
|
G((e) => e === a ? null : e);
|
|
286
283
|
},
|
|
287
284
|
onKeyDown: (e) => X(e, a),
|
|
288
|
-
className: "box-border m-0 cursor-pointer rounded-basalt-sm border-0 p-0 transition-colors basalt-motion hover:ring-1 hover:ring-basalt-foreground
|
|
285
|
+
className: "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",
|
|
289
286
|
style: {
|
|
290
287
|
width: C,
|
|
291
288
|
height: C,
|
|
@@ -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\"grid grid-cols-7 gap-basalt-space-sm p-basalt-space-xs outline-none\",\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=\"box-border m-0 h-basalt-3 w-basalt-3 cursor-pointer rounded-basalt-sm border-0 p-0 transition-colors basalt-motion focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-basalt-ring\"\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(\n\t\t\t\t\"overflow-x-auto rounded-basalt-md outline-none focus-visible:ring-1 focus-visible:ring-basalt-ring\",\n\t\t\t\tclassName,\n\t\t\t)}\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=\"box-border m-0 cursor-pointer rounded-basalt-sm border-0 p-0 transition-colors basalt-motion hover:ring-1 hover:ring-basalt-foreground focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-basalt-ring\"\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":";;;;;;AAMA,IAAaA,IAAqB;CACjC,OAAO;EACN;EACA;EACA;EACA;EACA;CACD;CACA,KAAK;EACJ;EACA;EACA;EACA;EACA;CACD;CACA,MAAM;EACL;EACA;EACA;EACA;EACA;CACD;CACA,QAAQ;EACP;EACA;EACA;EACA;EACA;CACD;AACD;AAEA,SAASC,EAAa,GAAgB;CACrC,OAAO,MAAM,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,MACpC,IAAI,KAAK,eAAeC,GAAQ,EAAE,SAAS,QAAQ,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,MAAM,GAAG,IAAIC,CAAK,CAAC,CAC1F;AACD;AAEA,SAASC,EAAW,GAAgB;CACnC,OAAO,MAAM,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,MACrC,IAAI,KAAK,eAAeF,GAAQ,EAAE,OAAO,QAAQ,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,MAAMC,GAAO,CAAC,CAAC,CACpF;AACD;AAEA,SAASE,EAAa,GAAwB;CAC7C,IAAMC,IAAkB,CAAC,GACnBC,IAAY,IAAI,KAAKC,GAAM,GAAG,CAAC,GAC/BC,IAAU,IAAI,KAAKD,GAAM,IAAI,EAAE,GAC/BE,IAAW,IAAI,KAAKH,CAAS;CACnC,EAAS,QAAQG,EAAS,QAAQ,IAAIA,EAAS,OAAO,CAAC;CACvD,IAAIC,IAAc,IAAI,KAAKD,CAAQ,GAC/BE,IAAsB,CAAC;CAC3B,QAAOD,KAAeF,KAAWG,EAAY,SAAS,OACjDA,EAAY,WAAW,MAC1BN,EAAM,KAAKM,CAAW,GACtB,IAAc,CAAC,IAEZ,MAAcH,MAKlB,AAFAG,EAAY,KAAK,IAAI,KAAKD,CAAW,CAAC,GACtC,IAAc,IAAI,KAAKA,CAAW,GAClCA,EAAY,QAAQA,EAAY,QAAQ,IAAI,CAAC;CAK9C,OAHIC,EAAY,SAAS,KACxBN,EAAM,KAAKM,CAAW,GAEhBN;AACR;AAEA,SAASO,EAAW,GAAoB;CAIvC,OAAO,GAHMC,EAAK,YAGR,EAAK,GAFD,OAAOA,EAAK,SAAS,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,GAEpC,EAAM,GADZ,OAAOA,EAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,GAAG,GACpB;AAC5B;AAEA,SAASC,EAAc,GAAe,GAAkB,GAAuC;CAC9F,IAAIC,MAAU,GACb,OAAO;CAER,IAAMC,IAASC,EAAW,SAAS,GAC7BC,IAAa,KAAK,IAAIH,IAAQI,GAAU,CAAC;CAC/C,OAAO,KAAK,KAAKD,IAAaF,CAAM;AACrC;AAwFA,SAAgBI,EAAgB,GAA6B;CAI5D,OAHI,UAAUC,IACN,kBAACC,GAAD,EAAa,GAAID,EAAQ,CAAA,IAE1B,kBAACE,GAAD,EAAe,GAAIF,EAAQ,CAAA;AACnC;AAEA,SAASE,EAAc,EACtB,WACA,eAAY,oBACZ,gBAC8B;CAC9B,IAAM,CAACC,GAAWC,KAAgBC,EAAS,CAAC,GACtC,CAACC,GAAgBC,KAAqBF,EAAwB,IAAI,GAClEG,IAAeC,EAA8B,IAAI,GACjDC,IAAWD,EAAqC,CAAC,CAAC,GAClDE,IAAqBF,EAAO,EAAK;CAIvC,QAAgB;EACf,IAAMG,IAAWD,EAAmB;EACpC,IAAIE,EAAO,WAAW,GAGrB,AAFAT,EAAa,CAAC,GACdG,EAAkB,IAAI,GAClBK,KACHJ,EAAa,SAAS,MAAM;OAEvB,IAAIL,KAAaU,EAAO,QAAQ;GACtC,IAAMC,IAAOD,EAAO,SAAS;GAE7B,AADAT,EAAaU,CAAI,GACbF,KACHF,EAAS,QAAQI,EAAK,EAAE,MAAM;EAEhC,OAAO,AAAIF,KACVF,EAAS,QAAQP,EAAU,EAAE,MAAM;CAErC,GAAG,CAACU,EAAO,QAAQV,CAAS,CAAC;CAE7B,IAAMY,KAAiB,GAAqC,MAAyB;EACpF,IAAIF,EAAO,WAAW,GAAG;EAEzB,IAAI,EAAE,QAAQ,UAAU;GACvB,EAAkB,IAAI;GACtB;EACD;EAEA,IAAIG,IAAUC;EACd,IAAI,EAAE,QAAQ,cACb,IAAU,KAAK,IAAIJ,EAAO,SAAS,GAAGI,IAAe,CAAC;OAChD,IAAI,EAAE,QAAQ,aACpB,IAAU,KAAK,IAAI,GAAGA,IAAe,CAAC;OAChC,IAAI,EAAE,QAAQ,aACpB,IAAU,KAAK,IAAIJ,EAAO,SAAS,GAAGI,IAAe,CAAC;OAChD,IAAI,EAAE,QAAQ,WACpB,IAAU,KAAK,IAAI,GAAGA,IAAe,CAAC;OAChC,IAAI,EAAE,QAAQ,QACpB,IAAU;OACJ,IAAI,EAAE,QAAQ,OACpB,IAAUJ,EAAO,SAAS;OAE1B;EAMD,AAHA,EAAE,eAAe,GACjBT,EAAaY,CAAO,GACpBT,EAAkBS,CAAO,GACzBN,EAAS,QAAQM,EAAQ,EAAE,MAAM;CAClC,GAEME,IACL,kBAAC,OAAD;EACC,KAAKV;EACL,UAAU;EACV,MAAK;EACL,cAAYW;EACZ,eAAe;GACd,EAAmB,UAAU;EAC9B;EACA,SAAS,MAAM;GACd,AAAK,EAAE,cAAc,SAAS,EAAE,aAAa,MAC5C,EAAmB,UAAU;EAE/B;EACA,WAAWC,EACV,0FACAC,CACD;EAEC,UAAAR,EAAO,KAAK,GAAO,MAIlB,kBAACS,GAAD;GAEC,MAJahB,MAAmBzB;GAKhC,eAAe,MAAS;IACvB,AACC0B,EADGO,IACejC,KAEC,MACd0C,MAAS1C,IAGZ6B,EAAS,QAAQ7B,OAAW,QAC5B,SAAS,kBAAkB6B,EAAS,QAAQ7B,KACtB0C,IAAO,OALHA,CAM3B;GAEH;GAhBD,UAAA,CAkBC,kBAACC,GAAD;IAAgB,SAAA;IACf,UAAA,kBAAC,UAAD;KACC,MAAM,MAAO;MACZ,EAAS,QAAQ3C,KAAS4C;KAC3B;KACA,MAAK;KACL,UA3Bc5C,MAAUsB,IA2BF,IAAI;KAC1B,eAAe;MAEd,AADAC,EAAavB,CAAK,GAClB0B,EAAkB1B,CAAK;KACxB;KACA,cAAc;MACb,GAAmB,MAAU0C,MAAS1C,IAAQ,OAAO0C,CAAK;KAC3D;KACA,YAAY,MAAMR,EAAc,GAAGlC,CAAK;KACxC,cAAY,YAAYA,IAAQ,EAAE,IAAIa;KACtC,WAAU;KACV,OAAO,EACN,iBAAiB,+BAA+B,KAAM,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,CAAK,CAAC,IAAI,IAAK,GAC9F;IACA,CAAA;GACc,CAAA,GAChB,kBAACgC,GAAD,EAAA,UACC,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KAAgC;KACrB7C,IAAQ;KAAE;KAAGa;IACnB;GACU,CAAA,EAAA,CAAA,CACR;EA5CH,GAAAb,CA4CG,CAEV;CACG,CAAA;CAON,OAJIgC,EAAO,WAAW,IACdK,IAGD,kBAACS,GAAD,EAAA,UAAkBT,EAA2B,CAAA;AACrD;AAEA,SAASjB,EAAY,EACpB,SACA,SACA,gBAAavB,EAAmB,OAChC,qBAAkB,MAAUgB,EAAM,eAAe,GACjD,iBAAc,SACd,cAAW,IACX,aAAU,GACV,YAAS,SACT,kBACA,gBACA,eAAY,QACZ,eAAY,QACZ,eAAY,oBACZ,gBAC4B;CAC5B,IAAMkC,IAAWC,KAAiBlD,EAAaC,CAAM,GAC/CkD,IAASC,KAAejD,EAAWF,CAAM,GACzCoD,IAAaC,EAAM,GACnBC,IAAkBzB,EAA8B,IAAI,GAEpD,EAAE,UAAO,YAAS,aAAU,WAAQ,cAAW,wBAAqB0B,QAAc;EACvF,IAAMnD,IAAQD,EAAaG,CAAI,GACzBkD,oBAAU,IAAI,IAAoB,GACpCtC,IAAW;EACf,KAAK,IAAMuC,KAASC,GAEnB,AADAF,EAAQ,IAAIC,EAAM,MAAMA,EAAM,KAAK,GAC/BA,EAAM,QAAQvC,MACjB,IAAWuC,EAAM;EAInB,IAAME,IAAiD,CAAC,GACpDC,IAAY;EAChB,EAAM,SAAS,GAAM,MAAc;GAClC,IAAMC,IAAiBC,EAAK,MAAM,MAASlD,EAAK,YAAY,MAAMN,CAAI;GACtE,IAAIuD,GAAgB;IACnB,IAAME,IAAQF,EAAe,SAAS;IACtC,AAAIE,MAAUH,MACbD,EAAO,KAAK;KAAE,OAAOT,EAAOa;KAAQ;IAAU,CAAC,GAC/C,IAAYA;GAEd;EACD,CAAC;EAED,IAAMC,IAAsB,CAAC,GACvBC,oBAAmB,IAAI,IAAoB;EAYjD,OAVA7D,EAAM,SAAS,MAAS;GACvB,EAAK,SAAS,MAAS;IACtB,IAAIQ,EAAK,YAAY,MAAMN,GAAM;KAChC,IAAM4D,IAAUvD,EAAWC,CAAI;KAE/B,AADAqD,EAAiB,IAAIC,GAASF,EAAU,MAAM,GAC9CA,EAAU,KAAKE,CAAO;IACvB;GACD,CAAC;EACF,CAAC,GAEM;GAAE;GAAO;GAAS;GAAU;GAAQ;GAAW;EAAiB;CACxE,GAAG;EAACR;EAAMR;EAAQ5C;CAAI,CAAC,GAEjB,CAAC6D,GAAYC,KAAiB3C,QAC5BuC,EAAU,MAAM,GAAG1D,EAAK,OAC/B,GACK,CAAC+D,GAAiBC,KAAsB7C,EAAwB,IAAI,GAEpEK,IAAWD,kBAAuC,IAAI,IAAI,CAAC,GAC3D0C,IAAyB1C,EAAO,EAAK;CAI3C,QAAgB;EACf,IAAMG,IAAWuC,EAAuB;EACxC,IAAIP,EAAU,WAAW,GAGxB,AAFAI,EAAc,EAAE,GAChBE,EAAmB,IAAI,GACnBtC,KACHsB,EAAgB,SAAS,MAAM;OAE1B,IAAI,CAACW,EAAiB,IAAIE,CAAU,GAAG;GAC7C,IAAMK,IAAWR,EAAU,MAAM;GAEjC,AADAI,EAAcI,CAAQ,GAClBxC,KACHF,EAAS,QAAQ,IAAI0C,CAAQ,CAAC,EAAE,MAAM;EAExC;CACD,GAAG;EAACR;EAAWC;EAAkBE;CAAU,CAAC;CAE5C,IAAMM,IAAeR,EAAiB,IAAIE,CAAU,IAAIA,IAAaH,EAAU,IAEzEU,KAAiB,MAAmC;EACzD,AAAKC,MACLP,EAAcO,CAAU,GACxBL,EAAmBK,CAAU,GAE7B7C,EADqB,QAAQ,IAAI6C,CACjC,CAAA,EAAK,MAAM;CACZ,GAEMC,KAAqB,GAAqC,MAAoB;EACnF,IAAIZ,EAAU,WAAW,GAAG;EAE5B,IAAMa,IAAaZ,EAAiB,IAAIC,CAAO,KAAK;EAEpD,IAAI,EAAE,QAAQ,UACb,EAAmB,IAAI;OAIxB,IAAI,EAAE,QAAQ,aAAa;GAC1B,EAAE,eAAe;GAEjB,IAAMY,IAAUd,EAAUa,IAAa;GACvC,AAAIC,KACHJ,EAAcI,CAAO;EAEvB,OAAO,IAAI,EAAE,QAAQ,WAAW;GAC/B,EAAE,eAAe;GAEjB,IAAMC,IAAUf,EAAUa,IAAa;GACvC,AAAIE,KACHL,EAAcK,CAAO;EAEvB,OAAO,IAAI,EAAE,QAAQ,cAAc;GAClC,EAAE,eAAe;GAEjB,IAAMC,IAAYH,IAAa;GAC/B,AAAIG,IAAYhB,EAAU,SACzBU,EAAcV,EAAUgB,EAAU,IAElCN,EAAcV,EAAUA,EAAU,SAAS,EAAE;EAE/C,OAAO,IAAI,EAAE,QAAQ,aAAa;GACjC,EAAE,eAAe;GAEjB,IAAMgB,IAAYH,IAAa;GAC/B,AACCH,EADGM,KAAa,IACFhB,EAAUgB,KAEVhB,EAAU,EAAE;EAE5B,OAAO,AAAI,EAAE,QAAQ,UACpB,EAAE,eAAe,GACjBU,EAAcV,EAAU,EAAE,KAChB,EAAE,QAAQ,UACpB,EAAE,eAAe,GACjBU,EAAcV,EAAUA,EAAU,SAAS,EAAE;CAE/C;CAIA,OACC,kBAAC,OAAD;EACC,KAAKV;EACL,UAAU;EACV,MAAK;EACL,cAAY,GAAGf,EAAU;EACzB,eAAe;GACd,EAAuB,UAAU;EAClC;EACA,SAAS,MAAM;GACd,AAAK,EAAE,cAAc,SAAS,EAAE,aAAa,MAC5C,EAAuB,UAAU;EAEnC;EACA,WAAWC,EAAG,qEAAqEC,CAAS;EAE5F,UAAA,kBAACM,GAAD,EAAA,UACC,kBAAC,OAAD;GAAK,WAAU;GAAiC,MAAK;GAAQ,cAAYR;GAAzE,UAAA;IACC,kBAAC,OAAD;KACC,WAAU;KACV,OAAO,EAAE,YAAY,GAAW;KAE/B,UAAAoB,EAAO,KAAK,MACZ,kBAAC,OAAD;MAEC,WAAU;MACV,OAAO,EAAE,MAAMsB,EAAM,aAAaC,IAAWC,GAAS;MAErD,UAAAF,EAAM;KACH,GALC,GAAGA,EAAM,MAAM,GAAGA,EAAM,WAKzB,CACL;IACG,CAAA;IACL,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACC,kBAAC,OAAD;MACC,WAAU;MACV,OAAO,EAAE,OAAO,GAAW;MAC3B,eAAY;MAEX,UAAAjC,EAAS,KAAK,GAAK,MACnB,kBAAC,OAAD;OAEC,OAAO;QACN,QAAQkC,IAAWC;QACnB,YAAY,GAAGD,IAAWC,EAAQ;QAClC,YAAYlF,IAAQ,KAAM,IAAI,YAAY;OAC3C;OAEC,UAAAmF;MACG,GARC,GAAGA,EAAI,GAAGnF,GAQX,CACL;KACG,CAAA,GACL,kBAAC,OAAD;MAAK,WAAU;MAAO,OAAO,EAAE,KAAKkF,EAAQ;MAC1C,UAAA/E,EAAM,KAAK,GAAM,MACjB,kBAAC,OAAD;OAAqB,WAAU;OAAgB,OAAO,EAAE,KAAK+E,EAAQ;OACnE,UAAArB,EAAK,KAAK,GAAM,MAAa;QAC7B,IAAMI,IAAUvD,EAAWC,CAAI;QAE/B,IADsBA,EAAK,YAAY,MAAMN,GAE5C,OACC,kBAAC,OAAD;SAEC,OAAO;UACN,OAAO4E;UACP,QAAQA;UACR,YAAY;SACb;SACA,eAAY;QACZ,GAPKG,CAOL;QAIH,IAAMvE,IAAQ0C,EAAQ,IAAIU,CAAO,KAAK,GAChCoB,IAAazE,EAAcC,GAAOI,GAAUF,CAAU,GACtDuE,IAAad,MAAiBP,GAC9BsB,IAAiBC,EAAe3E,GAAOoD,CAAO,GAC9CwB,IAAY,GAAGxB,EAAQ,IAAIyB,EAAY,IAAIH;QAGjD,OACC,kBAAC9C,GAAD;SAEC,MALa2B,MAAoBH;SAMjC,eAAe,MAAS;UACvB,AACCI,EADGpC,IACgBgC,KAEC,MACfvB,MAASuB,IAGZ,SAAS,kBAAkBpC,EAAS,QAAQ,IAAIoC,CAAO,IACjCvB,IAAO,OAJDA,CAK7B;SAEH;SAfD,UAAA,CAiBC,kBAACC,GAAD;UAAgB,SAAA;UACf,UAAA,kBAAC,UAAD;WACC,MAAM,MAAO;YACZ,AAAIC,IACHf,EAAS,QAAQ,IAAIoC,GAASrB,CAAE,IAEhCf,EAAS,QAAQ,OAAOoC,CAAO;WAEjC;WACA,MAAK;WACL,cAAYwB;WACZ,UAAUH,IAAa,IAAI;WAC3B,eAAe;YAEd,AADAnB,EAAcF,CAAO,GACrBI,EAAmBJ,CAAO;WAC3B;WACA,cAAc;YACb,GAAoB,MAAUvB,MAASuB,IAAU,OAAOvB,CAAK;WAC9D;WACA,YAAY,MAAMiC,EAAkB,GAAGV,CAAO;WAC9C,WAAU;WACV,OAAO;YACN,OAAOgB;YACP,QAAQA;YACR,iBAAiBlE,EAAWsE;WAC7B;UACA,CAAA;SACc,CAAA,GAChB,kBAACxC,GAAD;UAAgB,IAAI,GAAGM,EAAW,GAAGc;UACpC,UAAA,kBAAC,OAAD;WAAK,WAAU;WAAf,UAAA,CACC,kBAAC,OAAD;YAAK,WAAU;YAAe,UAAAA;WAAa,CAAA,GAC3C,kBAAC,OAAD;YAAK,WAAU;YAAf,UAAA;aACEyB;aAAY;aAAGH;YACZ;WACD,CAAA,CAAA;;SACU,CAAA,CACR;QApDH,GAAAH,CAoDG;OAEX,CAAC;MACG,GAlFKO,CAkFL,CACL;KACG,CAAA,CACD;;IACL,kBAAC,OAAD;KACC,WAAU;KACV,eAAY;KAFb,UAAA;MAIC,kBAAC,QAAD,EAAA,UAAOC,EAAgB,CAAA;MACtB7E,EAAW,KAAK,MAChB,kBAAC,OAAD;OAEC,WAAU;OACV,OAAO;QACN,OAAOkE;QACP,QAAQA;QACR,iBAAiBY;OAClB;MACA,GAPKA,CAOL,CACD;MACD,kBAAC,QAAD,EAAA,UAAOC,EAAgB,CAAA;KACnB;;GACD;EACW,CAAA,EAAA,CAAA;CACb,CAAA;AAEP"}
|