@nocoo/basalt 3.2.1 → 3.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/README.md +25 -19
  2. package/ai/COMPATIBILITY.md +41 -36
  3. package/ai/DESIGN.md +53 -47
  4. package/ai/INTEGRATION.md +814 -820
  5. package/ai/RECIPES.md +334 -135
  6. package/ai/USAGE.md +2 -2
  7. package/ai/registry.json +384 -27
  8. package/ai/sources.json +2 -2
  9. package/dist/assets/brand-mark.js +1 -2
  10. package/dist/charts/area.js +1 -2
  11. package/dist/charts/bar.js +1 -2
  12. package/dist/charts/bullet.js +1 -2
  13. package/dist/charts/chart-colors.js +1 -2
  14. package/dist/charts/charts.js +1 -2
  15. package/dist/charts/config.js +1 -2
  16. package/dist/charts/custom-chart.js +1 -2
  17. package/dist/charts/date-navigation.js +1 -2
  18. package/dist/charts/donut.js +1 -2
  19. package/dist/charts/frame.js +1 -2
  20. package/dist/charts/frame.js.map +1 -1
  21. package/dist/charts/funnel.js +1 -2
  22. package/dist/charts/gauge.js +1 -2
  23. package/dist/charts/grouped-bar.js +1 -2
  24. package/dist/charts/heatmap-calendar.js +3 -7
  25. package/dist/charts/heatmap-calendar.js.map +1 -1
  26. package/dist/charts/heatmap-matrix.js +1 -2
  27. package/dist/charts/item-list.js +1 -2
  28. package/dist/charts/legend.js +1 -2
  29. package/dist/charts/line.js +1 -2
  30. package/dist/charts/palette.js +1 -2
  31. package/dist/charts/radar.js +1 -2
  32. package/dist/charts/sample.js +1 -2
  33. package/dist/charts/sankey.js +1 -2
  34. package/dist/charts/series.js +1 -2
  35. package/dist/charts/slot-bar.js +1 -2
  36. package/dist/charts/sparkline.js +1 -2
  37. package/dist/charts/stacked-bar.js +1 -2
  38. package/dist/charts/stat-card.js +1 -2
  39. package/dist/charts/timeline.js +1 -2
  40. package/dist/charts/timeseries.js +1 -2
  41. package/dist/charts/tooltip.js +31 -27
  42. package/dist/charts/tooltip.js.map +1 -1
  43. package/dist/components/accordion.js +1 -2
  44. package/dist/components/alert-dialog.js +1 -2
  45. package/dist/components/app-header.js +1 -2
  46. package/dist/components/app-shell.js +1 -2
  47. package/dist/components/approval-card.js +1 -2
  48. package/dist/components/autocomplete.js +1 -2
  49. package/dist/components/avatar.js +1 -2
  50. package/dist/components/badge.js +1 -2
  51. package/dist/components/banner.js +1 -2
  52. package/dist/components/basalt-mark.js +1 -2
  53. package/dist/components/battery-meter.js +1 -2
  54. package/dist/components/breadcrumbs.js +1 -2
  55. package/dist/components/button.d.ts +1 -1
  56. package/dist/components/button.js +3 -3
  57. package/dist/components/button.js.map +1 -1
  58. package/dist/components/chat-bubble.js +1 -2
  59. package/dist/components/chat-composer.js +1 -2
  60. package/dist/components/chat-header.js +1 -2
  61. package/dist/components/chat-inbox.js +1 -2
  62. package/dist/components/chat-markdown.js +1 -2
  63. package/dist/components/chat-message.js +1 -2
  64. package/dist/components/checkbox.js +1 -2
  65. package/dist/components/clipboard-text.js +1 -2
  66. package/dist/components/code.js +1 -2
  67. package/dist/components/collapsible.js +1 -2
  68. package/dist/components/collapsible.js.map +1 -1
  69. package/dist/components/combobox.js +1 -2
  70. package/dist/components/command-palette.js +1 -2
  71. package/dist/components/confirm-dialog.js +3 -12
  72. package/dist/components/confirm-dialog.js.map +1 -1
  73. package/dist/components/context-cards.js +1 -2
  74. package/dist/components/context-menu.js +1 -2
  75. package/dist/components/data-table.js +2 -7
  76. package/dist/components/data-table.js.map +1 -1
  77. package/dist/components/date-picker.js +7 -18
  78. package/dist/components/date-picker.js.map +1 -1
  79. package/dist/components/delete-resource.js +1 -2
  80. package/dist/components/description-list.js +1 -2
  81. package/dist/components/dialog.js +1 -2
  82. package/dist/components/diff-table.js +1 -2
  83. package/dist/components/dock.js +1 -2
  84. package/dist/components/dock.js.map +1 -1
  85. package/dist/components/dropdown-menu.js +1 -2
  86. package/dist/components/editable-nav-item.js +1 -2
  87. package/dist/components/empty.js +1 -2
  88. package/dist/components/fab.js +1 -2
  89. package/dist/components/field.js +1 -2
  90. package/dist/components/file-dropzone.js +1 -2
  91. package/dist/components/filter-bar.js +1 -2
  92. package/dist/components/flow.js +1 -2
  93. package/dist/components/grid.js +1 -2
  94. package/dist/components/hover-card.js +1 -2
  95. package/dist/components/icon-picker.js +1 -2
  96. package/dist/components/inline-editable.js +1 -2
  97. package/dist/components/input-area.js +1 -2
  98. package/dist/components/input-group.js +2 -3
  99. package/dist/components/input-group.js.map +1 -1
  100. package/dist/components/input.js +1 -2
  101. package/dist/components/label.js +1 -2
  102. package/dist/components/layer-card.js +1 -2
  103. package/dist/components/link.js +1 -2
  104. package/dist/components/loader.js +1 -2
  105. package/dist/components/loading-screen.js +1 -2
  106. package/dist/components/menu-bar.js +1 -2
  107. package/dist/components/meter.js +1 -2
  108. package/dist/components/multi-select.js +1 -2
  109. package/dist/components/navigation-menu.js +1 -2
  110. package/dist/components/overlay.js +1 -2
  111. package/dist/components/page-header.js +1 -2
  112. package/dist/components/pagination.js +1 -2
  113. package/dist/components/popover.js +1 -2
  114. package/dist/components/prompt-bar.js +1 -2
  115. package/dist/components/radio.js +2 -7
  116. package/dist/components/radio.js.map +1 -1
  117. package/dist/components/recommendation-card.js +1 -2
  118. package/dist/components/resource-list.js +1 -2
  119. package/dist/components/responsive-master-detail.js +1 -2
  120. package/dist/components/scroll-area.js +1 -2
  121. package/dist/components/section-rule.js +1 -2
  122. package/dist/components/segment-control.js +1 -2
  123. package/dist/components/select.js +1 -2
  124. package/dist/components/sensitive-input.js +1 -2
  125. package/dist/components/separator.js +1 -2
  126. package/dist/components/sheet.js +1 -2
  127. package/dist/components/sidebar.d.ts +53 -19
  128. package/dist/components/sidebar.js +201 -100
  129. package/dist/components/sidebar.js.map +1 -1
  130. package/dist/components/skeleton-line.js +1 -2
  131. package/dist/components/slider.js +1 -2
  132. package/dist/components/stat-strip.js +1 -2
  133. package/dist/components/switch.js +1 -2
  134. package/dist/components/table-of-contents.js +1 -2
  135. package/dist/components/table-pager.js +1 -2
  136. package/dist/components/table.js +1 -2
  137. package/dist/components/tabs.js +1 -2
  138. package/dist/components/tag-badge.js +1 -2
  139. package/dist/components/tag-color-picker.js +1 -2
  140. package/dist/components/text.js +1 -2
  141. package/dist/components/theme-toggle.js +1 -2
  142. package/dist/components/thinking.js +1 -2
  143. package/dist/components/toast.js +1 -2
  144. package/dist/components/toggle-group.js +1 -2
  145. package/dist/components/toggle.js +1 -2
  146. package/dist/components/tool-chips.js +1 -2
  147. package/dist/components/toolbar.js +1 -2
  148. package/dist/components/tooltip.js +1 -2
  149. package/dist/components/typeahead-field.js +6 -21
  150. package/dist/components/typeahead-field.js.map +1 -1
  151. package/dist/components/upload-queue.js +1 -2
  152. package/dist/index.d.ts +1 -1
  153. package/dist/index.js +11 -11
  154. package/dist/models/agent-feedback.js +1 -2
  155. package/dist/models/avatar.js +1 -2
  156. package/dist/models/code.js +1 -2
  157. package/dist/models/context-cards.js +1 -2
  158. package/dist/models/diff-table.js +1 -2
  159. package/dist/models/recommendation.js +1 -2
  160. package/dist/providers/accent.js +2 -7
  161. package/dist/providers/accent.js.map +1 -1
  162. package/dist/providers/link.js +1 -2
  163. package/dist/providers/theme.js +2 -7
  164. package/dist/providers/theme.js.map +1 -1
  165. package/dist/styles/standalone.css +55 -11
  166. package/dist/styles/tailwind.css +2 -0
  167. package/dist/styles/tokens.css +51 -6
  168. package/dist/utils/cn.js +1 -2
  169. package/dist/utils/control-surface.js +1 -2
  170. package/dist/utils/navigation.d.ts +1 -1
  171. package/dist/utils/navigation.js +2 -3
  172. package/dist/utils/navigation.js.map +1 -1
  173. package/dist/utils/preference-store.js +1 -2
  174. package/dist/utils/selection-indicator.js +1 -2
  175. package/dist/utils/use-checkable-group.js +1 -2
  176. package/dist/utils/use-hover-highlight.js +2 -3
  177. package/dist/utils/use-hover-highlight.js.map +1 -1
  178. package/dist/viewmodels/use-approval-card.js +11 -13
  179. package/dist/viewmodels/use-approval-card.js.map +1 -1
  180. package/dist/viewmodels/use-chat-composer.js +1 -2
  181. package/dist/viewmodels/use-chat-message.js +1 -2
  182. package/dist/viewmodels/use-code-block.js +1 -2
  183. package/dist/viewmodels/use-code-block.js.map +1 -1
  184. package/dist/viewmodels/use-context-cards.js +1 -2
  185. package/dist/viewmodels/use-diff-table.js +1 -2
  186. package/dist/viewmodels/use-diff-table.js.map +1 -1
  187. package/dist/viewmodels/use-loader.js +1 -2
  188. package/dist/viewmodels/use-recommendation-card.js +1 -2
  189. package/dist/viewmodels/use-recommendation-card.js.map +1 -1
  190. package/dist/viewmodels/use-thinking.js +1 -2
  191. package/dist/viewmodels/use-tool-chips.js +1 -2
  192. package/package.json +1 -1
@@ -1,7 +1,6 @@
1
1
  "use client";
2
- //#region src/assets/brand-mark.ts
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
@@ -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
- //#region src/charts/area.tsx
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
@@ -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
- //#region src/charts/bar.tsx
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
@@ -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
- //#region src/charts/bullet.tsx
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
@@ -1,3 +1,2 @@
1
1
  "use client";
2
- import { CHART_COLORS as e, ChartPalette as t } from "./palette.js";
3
- export { e as CHART_COLORS, t as Colors };
2
+ export { CHART_COLORS, ChartPalette as Colors } from "./palette.js";
@@ -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
- //#region src/charts/charts.tsx
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
@@ -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
- //#region src/charts/config.ts
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
- //#region src/charts/custom-chart.tsx
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
- //#region src/charts/date-navigation.tsx
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
@@ -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
- //#region src/charts/donut.tsx
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
@@ -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
- //#region src/charts/frame.tsx
7
+ // src/charts/frame.tsx
8
8
  function s(e) {
9
9
  return e != null && e !== !1;
10
10
  }
@@ -66,7 +66,6 @@ function l(e) {
66
66
  function u(e) {
67
67
  return /* @__PURE__ */ i(c, { ...e });
68
68
  }
69
- //#endregion
70
69
  export { l as ChartFrame, u as ChartShell };
71
70
 
72
71
  //# sourceMappingURL=frame.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"frame.js","names":["hasSlotContent","slot","ChartContainer","summaryId","useId","hasSummary","summary","hasAlternative","dataAlternative","childProps","children","childLayer","clonedChild","cloneElement","accessibilityLayer","ariaLabel","plotContainer","legend","cn","size","className","ResponsiveContainer","RESPONSIVE_CONTAINER_PROPS","ChartFrame","props","ChartShell"],"sources":["../../src/charts/frame.tsx"],"sourcesContent":["import { cloneElement, type ReactElement, type ReactNode, useId } from \"react\";\nimport { ResponsiveContainer } from \"recharts\";\nimport { cn } from \"../utils/cn\";\nimport { RESPONSIVE_CONTAINER_PROPS } from \"./config\";\n\nexport type ChartFrameProps = {\n\t/**\n\t * Accessible label describing the purpose or dataset of the chart.\n\t */\n\tariaLabel: string;\n\t/**\n\t * Additional CSS class names for styling the chart container.\n\t */\n\tclassName?: string;\n\t/**\n\t * Single child Recharts element to render inside the responsive container.\n\t * Explicit child accessibilityLayer prop takes precedence over wrapper prop, which defaults to true.\n\t */\n\tchildren: ReactElement<{\n\t\taccessibilityLayer?: boolean;\n\t\t\"aria-label\"?: string;\n\t\t\"aria-describedby\"?: string;\n\t}>;\n\t/**\n\t * Tailwind size classes for the chart container.\n\t * @default \"h-basalt-36 w-basalt-56\"\n\t */\n\tsize?: string;\n\t/**\n\t * Textual summary describing key insights, highs, lows, and keyboard exploration instructions.\n\t * Associated with the chart via useId and aria-describedby.\n\t */\n\tsummary?: ReactNode;\n\t/**\n\t * Accessible tabular or structured data alternative rendered outside the plot area.\n\t */\n\tdataAlternative?: ReactNode;\n\t/**\n\t * Whether the interactive accessibility layer is enabled on the underlying Recharts graphic.\n\t * Enables keyboard exploration with Tab and arrow keys where supported by the underlying chart type.\n\t * Non-interactive compact or decorative charts without tooltip navigation should provide summary or dataAlternative.\n\t * @default true\n\t */\n\taccessibilityLayer?: boolean;\n};\n\nexport type ChartShellProps = ChartFrameProps & {\n\t/**\n\t * Optional legend node rendered alongside the chart plot.\n\t */\n\tlegend?: ReactNode;\n};\n\nexport type ChartAccessibilityProps = Pick<\n\tChartFrameProps,\n\t\"summary\" | \"dataAlternative\" | \"accessibilityLayer\"\n>;\n\nfunction hasSlotContent(slot: ReactNode | undefined): boolean {\n\treturn slot !== undefined && slot !== null && slot !== false;\n}\n\nfunction ChartContainer({\n\tariaLabel,\n\tclassName,\n\tchildren,\n\tsize = \"h-basalt-36 w-basalt-56\",\n\tlegend,\n\tsummary,\n\tdataAlternative,\n\taccessibilityLayer = true,\n}: ChartShellProps) {\n\tconst summaryId = useId();\n\tconst hasSummary = hasSlotContent(summary);\n\tconst hasAlternative = hasSlotContent(dataAlternative);\n\n\tconst childProps = (children?.props ?? {}) as {\n\t\taccessibilityLayer?: boolean;\n\t\t\"aria-label\"?: string;\n\t\t\"aria-describedby\"?: string;\n\t};\n\tconst childLayer = childProps.accessibilityLayer;\n\tconst resolvedLayer = childLayer !== undefined ? childLayer : accessibilityLayer;\n\n\tconst clonedChild = cloneElement(children, {\n\t\taccessibilityLayer: resolvedLayer,\n\t\t\"aria-label\": childProps[\"aria-label\"] ?? ariaLabel,\n\t\t\"aria-describedby\": childProps[\"aria-describedby\"] ?? (hasSummary ? summaryId : undefined),\n\t});\n\n\tlet plotContainer: ReactNode;\n\tif (hasSlotContent(legend)) {\n\t\tplotContainer = (\n\t\t\t<div\n\t\t\t\tdata-testid=\"chart-shell\"\n\t\t\t\tclassName={cn(size, className)}\n\t\t\t\tstyle={{ display: \"flex\", flexDirection: \"column\", minHeight: 0, minWidth: 0 }}\n\t\t\t>\n\t\t\t\t<div className=\"min-h-0 w-full flex-1 basalt-chart\">\n\t\t\t\t\t<ResponsiveContainer {...RESPONSIVE_CONTAINER_PROPS}>{clonedChild}</ResponsiveContainer>\n\t\t\t\t</div>\n\t\t\t\t{legend}\n\t\t\t</div>\n\t\t);\n\t} else {\n\t\tplotContainer = (\n\t\t\t<div className={cn(size, \"min-h-0 min-w-0 basalt-chart\", className)}>\n\t\t\t\t<ResponsiveContainer {...RESPONSIVE_CONTAINER_PROPS}>{clonedChild}</ResponsiveContainer>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (!hasSummary && !hasAlternative) {\n\t\treturn (\n\t\t\t<figure role=\"group\" aria-label={ariaLabel} className=\"contents m-0 p-0\">\n\t\t\t\t{plotContainer}\n\t\t\t</figure>\n\t\t);\n\t}\n\n\treturn (\n\t\t<figure\n\t\t\trole=\"group\"\n\t\t\taria-label={ariaLabel}\n\t\t\taria-describedby={hasSummary ? summaryId : undefined}\n\t\t\tclassName=\"relative m-0 flex flex-col gap-basalt-space-lg p-0 min-h-0 min-w-0\"\n\t\t>\n\t\t\t{hasSummary ? (\n\t\t\t\t<div id={summaryId} className=\"text-basalt-sm text-basalt-muted-foreground\">\n\t\t\t\t\t{summary}\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t\t{plotContainer}\n\t\t\t{hasAlternative ? (\n\t\t\t\t<div className=\"text-basalt-sm text-basalt-muted-foreground\">{dataAlternative}</div>\n\t\t\t) : null}\n\t\t</figure>\n\t);\n}\n\nexport function ChartFrame(props: ChartFrameProps) {\n\treturn <ChartContainer {...props} />;\n}\n\nexport function ChartShell(props: ChartShellProps) {\n\treturn <ChartContainer {...props} />;\n}\n"],"mappings":";;;;;;;AA0DA,SAASA,EAAe,GAAsC;CAC7D,OAAOC,KAA+B,QAAQA,MAAS;AACxD;AAEA,SAASC,EAAe,EACvB,cACA,cACA,aACA,UAAO,2BACP,WACA,YACA,oBACA,wBAAqB,MACF;CACnB,IAAMC,IAAYC,EAAM,GAClBC,IAAaL,EAAeM,CAAO,GACnCC,IAAiBP,EAAeQ,CAAe,GAE/CC,IAAcC,GAAU,SAAS,CAAC,GAKlCC,IAAaF,EAAW,oBAGxBG,IAAcC,EAAaH,GAAU;EAC1C,oBAHqBC,MAAe,KAAA,IAAyBG,IAAbH;EAIhD,cAAcF,EAAW,iBAAiBM;EAC1C,oBAAoBN,EAAW,wBAAwBJ,IAAaF,IAAY,KAAA;CACjF,CAAC,GAEGa;CA8BJ,OA7BA,AAcCA,IAdGhB,EAAeiB,CAAM,IAEvB,kBAAC,OAAD;EACC,eAAY;EACZ,WAAWC,EAAGC,GAAMC,CAAS;EAC7B,OAAO;GAAE,SAAS;GAAQ,eAAe;GAAU,WAAW;GAAG,UAAU;EAAE;EAH9E,UAAA,CAKC,kBAAC,OAAD;GAAK,WAAU;GACd,UAAA,kBAACC,GAAD;IAAqB,GAAIC;IAA6B,UAAAV;GAAiC,CAAA;EACnF,CAAA,GACJK,CACG;MAIL,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"}
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"}
@@ -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
- //#region src/charts/funnel.tsx
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
@@ -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
- //#region src/charts/gauge.tsx
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
- //#region src/charts/grouped-bar.tsx
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
- //#region src/charts/heatmap-calendar.tsx
6
+ // src/charts/heatmap-calendar.tsx
7
7
  var f = {
8
8
  green: [
9
9
  "hsl(var(--basalt-muted))",
@@ -185,11 +185,8 @@ function b({ data: v, year: y, colorScale: b = f.green, valueFormatter: x = (e)
185
185
  }, X = (e, t) => {
186
186
  if (B.length === 0) return;
187
187
  let n = V.get(t) ?? 0;
188
- if (e.key === "Escape") {
189
- G(null);
190
- return;
191
- }
192
- if (e.key === "ArrowDown") {
188
+ if (e.key === "Escape") G(null);
189
+ else if (e.key === "ArrowDown") {
193
190
  e.preventDefault();
194
191
  let t = B[n + 1];
195
192
  t && Y(t);
@@ -334,7 +331,6 @@ function b({ data: v, year: y, colorScale: b = f.green, valueFormatter: x = (e)
334
331
  }) })
335
332
  });
336
333
  }
337
- //#endregion
338
334
  export { v as HeatmapCalendar, f as heatmapColorScales };
339
335
 
340
336
  //# sourceMappingURL=heatmap-calendar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"heatmap-calendar.js","names":["heatmapColorScales","weekdayNames","locale","index","monthNames","getYearWeeks","weeks","startDate","year","endDate","firstDay","currentDate","currentWeek","formatDate","date","getColorIndex","value","levels","colorScale","normalized","maxValue","HeatmapCalendar","props","YearHeatmap","ValuesHeatmap","activeIdx","setActiveIdx","useState","openTooltipIdx","setOpenTooltipIdx","containerRef","useRef","cellRefs","isFocusedInsideRef","hadFocus","values","next","handleKeyDown","nextIdx","currentIndex","container","ariaLabel","cn","className","Tooltip","curr","TooltipTrigger","el","TooltipContent","TooltipProvider","weekdays","weekdayLabels","months","monthLabels","calendarId","useId","scrollRegionRef","useMemo","dataMap","point","data","labels","lastMonth","firstDayOfWeek","week","month","validDays","dateToValidIndex","dateStr","activeDate","setActiveDate","openTooltipDate","setOpenTooltipDate","isYearFocusedInsideRef","nextDate","selectedDate","navigateToDay","targetDate","handleCellKeyDown","currentIdx","nextDay","prevDay","targetIdx","label","cellSize","cellGap","day","dayIndex","colorIndex","isSelected","formattedValue","valueFormatter","labelText","metricLabel","weekIndex","lessLabel","color","moreLabel"],"sources":["../../src/charts/heatmap-calendar.tsx"],"sourcesContent":["import { type KeyboardEvent, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"../components/tooltip\";\nimport { cn } from \"../utils/cn\";\n\nexport type HeatmapDataPoint = { date: string; value: number };\n\nexport const heatmapColorScales = {\n\tgreen: [\n\t\t\"hsl(var(--basalt-muted))\",\n\t\t\"hsl(var(--basalt-heatmap-green-1))\",\n\t\t\"hsl(var(--basalt-heatmap-green-2))\",\n\t\t\"hsl(var(--basalt-heatmap-green-3))\",\n\t\t\"hsl(var(--basalt-heatmap-green-4))\",\n\t],\n\tred: [\n\t\t\"hsl(var(--basalt-muted))\",\n\t\t\"hsl(var(--basalt-heatmap-red-1))\",\n\t\t\"hsl(var(--basalt-heatmap-red-2))\",\n\t\t\"hsl(var(--basalt-heatmap-red-3))\",\n\t\t\"hsl(var(--basalt-heatmap-red-4))\",\n\t],\n\tblue: [\n\t\t\"hsl(var(--basalt-muted))\",\n\t\t\"hsl(var(--basalt-heatmap-blue-1))\",\n\t\t\"hsl(var(--basalt-heatmap-blue-2))\",\n\t\t\"hsl(var(--basalt-heatmap-blue-3))\",\n\t\t\"hsl(var(--basalt-heatmap-blue-4))\",\n\t],\n\torange: [\n\t\t\"hsl(var(--basalt-muted))\",\n\t\t\"hsl(var(--basalt-heatmap-orange-1))\",\n\t\t\"hsl(var(--basalt-heatmap-orange-2))\",\n\t\t\"hsl(var(--basalt-heatmap-orange-3))\",\n\t\t\"hsl(var(--basalt-heatmap-orange-4))\",\n\t],\n} as const;\n\nfunction weekdayNames(locale: string) {\n\treturn Array.from({ length: 7 }, (_, index) =>\n\t\tnew Intl.DateTimeFormat(locale, { weekday: \"short\" }).format(new Date(2023, 0, 1 + index)),\n\t);\n}\n\nfunction monthNames(locale: string) {\n\treturn Array.from({ length: 12 }, (_, index) =>\n\t\tnew Intl.DateTimeFormat(locale, { month: \"short\" }).format(new Date(2023, index, 1)),\n\t);\n}\n\nfunction getYearWeeks(year: number): Date[][] {\n\tconst weeks: Date[][] = [];\n\tconst startDate = new Date(year, 0, 1);\n\tconst endDate = new Date(year, 11, 31);\n\tconst firstDay = new Date(startDate);\n\tfirstDay.setDate(firstDay.getDate() - firstDay.getDay());\n\tlet currentDate = new Date(firstDay);\n\tlet currentWeek: Date[] = [];\n\twhile (currentDate <= endDate || currentWeek.length > 0) {\n\t\tif (currentWeek.length === 7) {\n\t\t\tweeks.push(currentWeek);\n\t\t\tcurrentWeek = [];\n\t\t}\n\t\tif (currentDate > endDate) {\n\t\t\tbreak;\n\t\t}\n\t\tcurrentWeek.push(new Date(currentDate));\n\t\tcurrentDate = new Date(currentDate);\n\t\tcurrentDate.setDate(currentDate.getDate() + 1);\n\t}\n\tif (currentWeek.length > 0) {\n\t\tweeks.push(currentWeek);\n\t}\n\treturn weeks;\n}\n\nfunction formatDate(date: Date): string {\n\tconst year = date.getFullYear();\n\tconst month = String(date.getMonth() + 1).padStart(2, \"0\");\n\tconst day = String(date.getDate()).padStart(2, \"0\");\n\treturn `${year}-${month}-${day}`;\n}\n\nfunction getColorIndex(value: number, maxValue: number, colorScale: readonly string[]): number {\n\tif (value === 0) {\n\t\treturn 0;\n\t}\n\tconst levels = colorScale.length - 1;\n\tconst normalized = Math.min(value / maxValue, 1);\n\treturn Math.ceil(normalized * levels);\n}\n\nexport type HeatmapCalendarValuesProps = {\n\t/**\n\t * Numeric values sequence to display in a compact 7-column grid.\n\t */\n\tvalues: number[];\n\t/**\n\t * Accessible name describing the heatmap purpose or data.\n\t * @default \"Heatmap calendar\"\n\t */\n\tariaLabel?: string;\n\t/**\n\t * Additional CSS class names for the outer container.\n\t */\n\tclassName?: string;\n};\n\nexport type HeatmapCalendarYearProps = {\n\t/**\n\t * Dataset of daily metrics with ISO date strings (\"YYYY-MM-DD\") and numeric values.\n\t */\n\tdata: HeatmapDataPoint[];\n\t/**\n\t * Calendar year to render.\n\t */\n\tyear: number;\n\t/**\n\t * Array of color values forming the intensity gradient from lowest to highest.\n\t * @default heatmapColorScales.green\n\t */\n\tcolorScale?: readonly string[];\n\t/**\n\t * Formatter for tooltip value display and accessible label.\n\t * @default (value) => value.toLocaleString()\n\t */\n\tvalueFormatter?: (value: number, date: string) => string;\n\t/**\n\t * Name of the metric for accessible labeling and tooltips.\n\t * @default \"Value\"\n\t */\n\tmetricLabel?: string;\n\t/**\n\t * Pixel width and height of each day cell.\n\t * @default 12\n\t */\n\tcellSize?: number;\n\t/**\n\t * Pixel gap between adjacent cells.\n\t * @default 2\n\t */\n\tcellGap?: number;\n\t/**\n\t * BCP 47 locale tag used for weekday and month label formatting.\n\t * @default \"en-US\"\n\t */\n\tlocale?: string;\n\t/**\n\t * Explicit custom weekday labels override.\n\t */\n\tweekdayLabels?: string[];\n\t/**\n\t * Explicit custom month labels override.\n\t */\n\tmonthLabels?: string[];\n\t/**\n\t * Label text for the lower end of the color scale legend.\n\t * @default \"Less\"\n\t */\n\tlessLabel?: string;\n\t/**\n\t * Label text for the upper end of the color scale legend.\n\t * @default \"More\"\n\t */\n\tmoreLabel?: string;\n\t/**\n\t * Accessible name describing the yearly heatmap dataset.\n\t * @default \"Heatmap calendar\"\n\t */\n\tariaLabel?: string;\n\t/**\n\t * Additional CSS class names for the outer scrollable container.\n\t */\n\tclassName?: string;\n};\n\nexport type HeatmapCalendarProps = HeatmapCalendarValuesProps | HeatmapCalendarYearProps;\n\nexport function HeatmapCalendar(props: HeatmapCalendarProps) {\n\tif (\"data\" in props) {\n\t\treturn <YearHeatmap {...props} />;\n\t}\n\treturn <ValuesHeatmap {...props} />;\n}\n\nfunction ValuesHeatmap({\n\tvalues,\n\tariaLabel = \"Heatmap calendar\",\n\tclassName,\n}: HeatmapCalendarValuesProps) {\n\tconst [activeIdx, setActiveIdx] = useState(0);\n\tconst [openTooltipIdx, setOpenTooltipIdx] = useState<number | null>(null);\n\tconst containerRef = useRef<HTMLDivElement | null>(null);\n\tconst cellRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\tconst isFocusedInsideRef = useRef(false);\n\n\t// When values array shrinks, empties, or restores: if an item or container currently held focus,\n\t// restore focus to the new valid index or empty container without stealing focus from outside.\n\tuseEffect(() => {\n\t\tconst hadFocus = isFocusedInsideRef.current;\n\t\tif (values.length === 0) {\n\t\t\tsetActiveIdx(0);\n\t\t\tsetOpenTooltipIdx(null);\n\t\t\tif (hadFocus) {\n\t\t\t\tcontainerRef.current?.focus();\n\t\t\t}\n\t\t} else if (activeIdx >= values.length) {\n\t\t\tconst next = values.length - 1;\n\t\t\tsetActiveIdx(next);\n\t\t\tif (hadFocus) {\n\t\t\t\tcellRefs.current[next]?.focus();\n\t\t\t}\n\t\t} else if (hadFocus) {\n\t\t\tcellRefs.current[activeIdx]?.focus();\n\t\t}\n\t}, [values.length, activeIdx]);\n\n\tconst handleKeyDown = (e: KeyboardEvent<HTMLButtonElement>, currentIndex: number) => {\n\t\tif (values.length === 0) return;\n\n\t\tif (e.key === \"Escape\") {\n\t\t\tsetOpenTooltipIdx(null);\n\t\t\treturn;\n\t\t}\n\n\t\tlet nextIdx = currentIndex;\n\t\tif (e.key === \"ArrowRight\") {\n\t\t\tnextIdx = Math.min(values.length - 1, currentIndex + 1);\n\t\t} else if (e.key === \"ArrowLeft\") {\n\t\t\tnextIdx = Math.max(0, currentIndex - 1);\n\t\t} else if (e.key === \"ArrowDown\") {\n\t\t\tnextIdx = Math.min(values.length - 1, currentIndex + 7);\n\t\t} else if (e.key === \"ArrowUp\") {\n\t\t\tnextIdx = Math.max(0, currentIndex - 7);\n\t\t} else if (e.key === \"Home\") {\n\t\t\tnextIdx = 0;\n\t\t} else if (e.key === \"End\") {\n\t\t\tnextIdx = values.length - 1;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\te.preventDefault();\n\t\tsetActiveIdx(nextIdx);\n\t\tsetOpenTooltipIdx(nextIdx);\n\t\tcellRefs.current[nextIdx]?.focus();\n\t};\n\n\tconst container = (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\ttabIndex={-1}\n\t\t\trole=\"region\"\n\t\t\taria-label={ariaLabel}\n\t\t\tonFocus={() => {\n\t\t\t\tisFocusedInsideRef.current = true;\n\t\t\t}}\n\t\t\tonBlur={(e) => {\n\t\t\t\tif (!e.currentTarget.contains(e.relatedTarget)) {\n\t\t\t\t\tisFocusedInsideRef.current = false;\n\t\t\t\t}\n\t\t\t}}\n\t\t\tclassName={cn(\n\t\t\t\t\"basalt-focus basalt-focus-inset grid grid-cols-7 gap-basalt-space-sm p-basalt-space-xs\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{values.map((value, index) => {\n\t\t\t\tconst isCurrent = index === activeIdx;\n\t\t\t\tconst isOpen = openTooltipIdx === index;\n\t\t\t\treturn (\n\t\t\t\t\t<Tooltip\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\topen={isOpen}\n\t\t\t\t\t\tonOpenChange={(next) => {\n\t\t\t\t\t\t\tif (next) {\n\t\t\t\t\t\t\t\tsetOpenTooltipIdx(index);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsetOpenTooltipIdx((curr) => {\n\t\t\t\t\t\t\t\t\tif (curr !== index) return curr;\n\t\t\t\t\t\t\t\t\t// If this cell currently holds document focus, ignore scroll dismiss\n\t\t\t\t\t\t\t\t\tconst isCellFocused =\n\t\t\t\t\t\t\t\t\t\tcellRefs.current[index] !== null &&\n\t\t\t\t\t\t\t\t\t\tdocument.activeElement === cellRefs.current[index];\n\t\t\t\t\t\t\t\t\treturn isCellFocused ? curr : null;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\tcellRefs.current[index] = el;\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\ttabIndex={isCurrent ? 0 : -1}\n\t\t\t\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\t\t\t\tsetActiveIdx(index);\n\t\t\t\t\t\t\t\t\tsetOpenTooltipIdx(index);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonBlur={() => {\n\t\t\t\t\t\t\t\t\tsetOpenTooltipIdx((curr) => (curr === index ? null : curr));\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonKeyDown={(e) => handleKeyDown(e, index)}\n\t\t\t\t\t\t\t\taria-label={`Position ${index + 1}: ${value}`}\n\t\t\t\t\t\t\t\tclassName=\"basalt-focus basalt-focus-inset basalt-focus-swatch box-border m-0 h-basalt-3 w-basalt-3 cursor-pointer rounded-basalt-sm border-0 p-0 transition-colors basalt-motion\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tbackgroundColor: `hsl(var(--basalt-chart-5) / ${0.2 + Math.min(4, Math.max(0, value)) * 0.15})`,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t<div className=\"text-basalt-sm\">\n\t\t\t\t\t\t\t\tPosition {index + 1}: {value}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n\n\tif (values.length === 0) {\n\t\treturn container;\n\t}\n\n\treturn <TooltipProvider>{container}</TooltipProvider>;\n}\n\nfunction YearHeatmap({\n\tdata,\n\tyear,\n\tcolorScale = heatmapColorScales.green,\n\tvalueFormatter = (value) => value.toLocaleString(),\n\tmetricLabel = \"Value\",\n\tcellSize = 12,\n\tcellGap = 2,\n\tlocale = \"en-US\",\n\tweekdayLabels,\n\tmonthLabels,\n\tlessLabel = \"Less\",\n\tmoreLabel = \"More\",\n\tariaLabel = \"Heatmap calendar\",\n\tclassName,\n}: HeatmapCalendarYearProps) {\n\tconst weekdays = weekdayLabels ?? weekdayNames(locale);\n\tconst months = monthLabels ?? monthNames(locale);\n\tconst calendarId = useId();\n\tconst scrollRegionRef = useRef<HTMLDivElement | null>(null);\n\n\tconst { weeks, dataMap, maxValue, labels, validDays, dateToValidIndex } = useMemo(() => {\n\t\tconst weeks = getYearWeeks(year);\n\t\tconst dataMap = new Map<string, number>();\n\t\tlet maxValue = 0;\n\t\tfor (const point of data) {\n\t\t\tdataMap.set(point.date, point.value);\n\t\t\tif (point.value > maxValue) {\n\t\t\t\tmaxValue = point.value;\n\t\t\t}\n\t\t}\n\n\t\tconst labels: { month: string; weekIndex: number }[] = [];\n\t\tlet lastMonth = -1;\n\t\tweeks.forEach((week, weekIndex) => {\n\t\t\tconst firstDayOfWeek = week.find((date) => date.getFullYear() === year);\n\t\t\tif (firstDayOfWeek) {\n\t\t\t\tconst month = firstDayOfWeek.getMonth();\n\t\t\t\tif (month !== lastMonth) {\n\t\t\t\t\tlabels.push({ month: months[month], weekIndex });\n\t\t\t\t\tlastMonth = month;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tconst validDays: string[] = [];\n\t\tconst dateToValidIndex = new Map<string, number>();\n\n\t\tweeks.forEach((week) => {\n\t\t\tweek.forEach((date) => {\n\t\t\t\tif (date.getFullYear() === year) {\n\t\t\t\t\tconst dateStr = formatDate(date);\n\t\t\t\t\tdateToValidIndex.set(dateStr, validDays.length);\n\t\t\t\t\tvalidDays.push(dateStr);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\treturn { weeks, dataMap, maxValue, labels, validDays, dateToValidIndex };\n\t}, [data, months, year]);\n\n\tconst [activeDate, setActiveDate] = useState<string>(() => {\n\t\treturn validDays[0] ?? `${year}-01-01`;\n\t});\n\tconst [openTooltipDate, setOpenTooltipDate] = useState<string | null>(null);\n\n\tconst cellRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\n\tconst isYearFocusedInsideRef = useRef(false);\n\n\t// If year or validDays change: if a cell held focus, restore focus to the clamped\n\t// active date or scroll container; if focus was outside, do NOT steal focus.\n\tuseEffect(() => {\n\t\tconst hadFocus = isYearFocusedInsideRef.current;\n\t\tif (validDays.length === 0) {\n\t\t\tsetActiveDate(\"\");\n\t\t\tsetOpenTooltipDate(null);\n\t\t\tif (hadFocus) {\n\t\t\t\tscrollRegionRef.current?.focus();\n\t\t\t}\n\t\t} else if (!dateToValidIndex.has(activeDate)) {\n\t\t\tconst nextDate = validDays[0] ?? \"\";\n\t\t\tsetActiveDate(nextDate);\n\t\t\tif (hadFocus) {\n\t\t\t\tcellRefs.current.get(nextDate)?.focus();\n\t\t\t}\n\t\t}\n\t}, [validDays, dateToValidIndex, activeDate]);\n\n\tconst selectedDate = dateToValidIndex.has(activeDate) ? activeDate : validDays[0];\n\n\tconst navigateToDay = (targetDate: string | undefined) => {\n\t\tif (!targetDate) return;\n\t\tsetActiveDate(targetDate);\n\t\tsetOpenTooltipDate(targetDate);\n\t\tconst btn = cellRefs.current.get(targetDate);\n\t\tbtn?.focus();\n\t};\n\n\tconst handleCellKeyDown = (e: KeyboardEvent<HTMLButtonElement>, dateStr: string) => {\n\t\tif (validDays.length === 0) return;\n\n\t\tconst currentIdx = dateToValidIndex.get(dateStr) ?? 0;\n\n\t\tif (e.key === \"Escape\") {\n\t\t\tsetOpenTooltipDate(null);\n\t\t\treturn;\n\t\t}\n\n\t\tif (e.key === \"ArrowDown\") {\n\t\t\te.preventDefault();\n\t\t\t// Visually next day (down in the column)\n\t\t\tconst nextDay = validDays[currentIdx + 1];\n\t\t\tif (nextDay) {\n\t\t\t\tnavigateToDay(nextDay);\n\t\t\t}\n\t\t} else if (e.key === \"ArrowUp\") {\n\t\t\te.preventDefault();\n\t\t\t// Visually previous day (up in the column)\n\t\t\tconst prevDay = validDays[currentIdx - 1];\n\t\t\tif (prevDay) {\n\t\t\t\tnavigateToDay(prevDay);\n\t\t\t}\n\t\t} else if (e.key === \"ArrowRight\") {\n\t\t\te.preventDefault();\n\t\t\t// Visually next week (right in the row: +7 days by index)\n\t\t\tconst targetIdx = currentIdx + 7;\n\t\t\tif (targetIdx < validDays.length) {\n\t\t\t\tnavigateToDay(validDays[targetIdx]);\n\t\t\t} else {\n\t\t\t\tnavigateToDay(validDays[validDays.length - 1]);\n\t\t\t}\n\t\t} else if (e.key === \"ArrowLeft\") {\n\t\t\te.preventDefault();\n\t\t\t// Visually previous week (left in the row: -7 days by index)\n\t\t\tconst targetIdx = currentIdx - 7;\n\t\t\tif (targetIdx >= 0) {\n\t\t\t\tnavigateToDay(validDays[targetIdx]);\n\t\t\t} else {\n\t\t\t\tnavigateToDay(validDays[0]);\n\t\t\t}\n\t\t} else if (e.key === \"Home\") {\n\t\t\te.preventDefault();\n\t\t\tnavigateToDay(validDays[0]);\n\t\t} else if (e.key === \"End\") {\n\t\t\te.preventDefault();\n\t\t\tnavigateToDay(validDays[validDays.length - 1]);\n\t\t}\n\t};\n\n\tconst labelWidth = 30;\n\n\treturn (\n\t\t<div\n\t\t\tref={scrollRegionRef}\n\t\t\ttabIndex={-1}\n\t\t\trole=\"region\"\n\t\t\taria-label={`${ariaLabel} scrollable view`}\n\t\t\tonFocus={() => {\n\t\t\t\tisYearFocusedInsideRef.current = true;\n\t\t\t}}\n\t\t\tonBlur={(e) => {\n\t\t\t\tif (!e.currentTarget.contains(e.relatedTarget)) {\n\t\t\t\t\tisYearFocusedInsideRef.current = false;\n\t\t\t\t}\n\t\t\t}}\n\t\t\tclassName={cn(\"basalt-focus basalt-focus-inset overflow-x-auto rounded-basalt-md\", className)}\n\t\t>\n\t\t\t<TooltipProvider>\n\t\t\t\t<div className=\"inline-block p-basalt-space-sm\" role=\"group\" aria-label={ariaLabel}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"relative mb-basalt-space-sm h-basalt-4 text-basalt-sm text-basalt-muted-foreground\"\n\t\t\t\t\t\tstyle={{ marginLeft: labelWidth }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{labels.map((label) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={`${label.month}-${label.weekIndex}`}\n\t\t\t\t\t\t\t\tclassName=\"absolute\"\n\t\t\t\t\t\t\t\tstyle={{ left: label.weekIndex * (cellSize + cellGap) }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{label.month}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"mr-basalt-space-sm flex flex-col text-basalt-sm text-basalt-muted-foreground select-none\"\n\t\t\t\t\t\t\tstyle={{ width: labelWidth }}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{weekdays.map((day, index) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={`${day}-${index}`}\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\theight: cellSize + cellGap,\n\t\t\t\t\t\t\t\t\t\tlineHeight: `${cellSize + cellGap}px`,\n\t\t\t\t\t\t\t\t\t\tvisibility: index % 2 === 1 ? \"visible\" : \"hidden\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{day}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex\" style={{ gap: cellGap }}>\n\t\t\t\t\t\t\t{weeks.map((week, weekIndex) => (\n\t\t\t\t\t\t\t\t<div key={weekIndex} className=\"flex flex-col\" style={{ gap: cellGap }}>\n\t\t\t\t\t\t\t\t\t{week.map((date, dayIndex) => {\n\t\t\t\t\t\t\t\t\t\tconst dateStr = formatDate(date);\n\t\t\t\t\t\t\t\t\t\tconst isCurrentYear = date.getFullYear() === year;\n\t\t\t\t\t\t\t\t\t\tif (!isCurrentYear) {\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={dayIndex}\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: cellSize,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theight: cellSize,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvisibility: \"hidden\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tconst value = dataMap.get(dateStr) ?? 0;\n\t\t\t\t\t\t\t\t\t\tconst colorIndex = getColorIndex(value, maxValue, colorScale);\n\t\t\t\t\t\t\t\t\t\tconst isSelected = selectedDate === dateStr;\n\t\t\t\t\t\t\t\t\t\tconst formattedValue = valueFormatter(value, dateStr);\n\t\t\t\t\t\t\t\t\t\tconst labelText = `${dateStr}, ${metricLabel}: ${formattedValue}`;\n\t\t\t\t\t\t\t\t\t\tconst isOpen = openTooltipDate === dateStr;\n\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\t\t\t\t\t\tkey={dayIndex}\n\t\t\t\t\t\t\t\t\t\t\t\topen={isOpen}\n\t\t\t\t\t\t\t\t\t\t\t\tonOpenChange={(next) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (next) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetOpenTooltipDate(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetOpenTooltipDate((curr) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (curr !== dateStr) return curr;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// If this cell currently holds document focus, ignore scroll dismiss\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst isCellFocused =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdocument.activeElement === cellRefs.current.get(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn isCellFocused ? curr : null;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (el) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcellRefs.current.set(dateStr, el);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcellRefs.current.delete(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={labelText}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttabIndex={isSelected ? 0 : -1}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetActiveDate(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetOpenTooltipDate(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonBlur={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetOpenTooltipDate((curr) => (curr === dateStr ? null : curr));\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(e) => handleCellKeyDown(e, dateStr)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"basalt-focus basalt-focus-inset basalt-focus-swatch box-border m-0 cursor-pointer rounded-basalt-sm border-0 p-0 transition-colors basalt-motion hover:ring-1 hover:ring-basalt-foreground\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: cellSize,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\theight: cellSize,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbackgroundColor: colorScale[colorIndex],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t\t\t\t\t\t<TooltipContent id={`${calendarId}-${dateStr}`}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-basalt-base\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"font-medium\">{dateStr}</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-basalt-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{metricLabel}: {formattedValue}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"mt-basalt-space-lg flex items-center justify-end gap-basalt-space-sm text-basalt-sm text-basalt-muted-foreground select-none\"\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>{lessLabel}</span>\n\t\t\t\t\t\t{colorScale.map((color) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={color}\n\t\t\t\t\t\t\t\tclassName=\"rounded-basalt-sm\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\twidth: cellSize,\n\t\t\t\t\t\t\t\t\theight: cellSize,\n\t\t\t\t\t\t\t\t\tbackgroundColor: color,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t<span>{moreLabel}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</TooltipProvider>\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"heatmap-calendar.js","names":["heatmapColorScales","weekdayNames","locale","index","monthNames","getYearWeeks","weeks","startDate","year","endDate","firstDay","currentDate","currentWeek","formatDate","date","getColorIndex","value","levels","colorScale","normalized","maxValue","HeatmapCalendar","props","YearHeatmap","ValuesHeatmap","activeIdx","setActiveIdx","useState","openTooltipIdx","setOpenTooltipIdx","containerRef","useRef","cellRefs","isFocusedInsideRef","hadFocus","values","next","handleKeyDown","nextIdx","currentIndex","container","ariaLabel","cn","className","Tooltip","curr","TooltipTrigger","el","TooltipContent","TooltipProvider","weekdays","weekdayLabels","months","monthLabels","calendarId","useId","scrollRegionRef","useMemo","dataMap","point","data","labels","lastMonth","firstDayOfWeek","week","month","validDays","dateToValidIndex","dateStr","activeDate","setActiveDate","openTooltipDate","setOpenTooltipDate","isYearFocusedInsideRef","nextDate","selectedDate","navigateToDay","targetDate","handleCellKeyDown","currentIdx","nextDay","prevDay","targetIdx","label","cellSize","cellGap","day","dayIndex","colorIndex","isSelected","formattedValue","valueFormatter","labelText","metricLabel","weekIndex","lessLabel","color","moreLabel"],"sources":["../../src/charts/heatmap-calendar.tsx"],"sourcesContent":["import { type KeyboardEvent, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"../components/tooltip\";\nimport { cn } from \"../utils/cn\";\n\nexport type HeatmapDataPoint = { date: string; value: number };\n\nexport const heatmapColorScales = {\n\tgreen: [\n\t\t\"hsl(var(--basalt-muted))\",\n\t\t\"hsl(var(--basalt-heatmap-green-1))\",\n\t\t\"hsl(var(--basalt-heatmap-green-2))\",\n\t\t\"hsl(var(--basalt-heatmap-green-3))\",\n\t\t\"hsl(var(--basalt-heatmap-green-4))\",\n\t],\n\tred: [\n\t\t\"hsl(var(--basalt-muted))\",\n\t\t\"hsl(var(--basalt-heatmap-red-1))\",\n\t\t\"hsl(var(--basalt-heatmap-red-2))\",\n\t\t\"hsl(var(--basalt-heatmap-red-3))\",\n\t\t\"hsl(var(--basalt-heatmap-red-4))\",\n\t],\n\tblue: [\n\t\t\"hsl(var(--basalt-muted))\",\n\t\t\"hsl(var(--basalt-heatmap-blue-1))\",\n\t\t\"hsl(var(--basalt-heatmap-blue-2))\",\n\t\t\"hsl(var(--basalt-heatmap-blue-3))\",\n\t\t\"hsl(var(--basalt-heatmap-blue-4))\",\n\t],\n\torange: [\n\t\t\"hsl(var(--basalt-muted))\",\n\t\t\"hsl(var(--basalt-heatmap-orange-1))\",\n\t\t\"hsl(var(--basalt-heatmap-orange-2))\",\n\t\t\"hsl(var(--basalt-heatmap-orange-3))\",\n\t\t\"hsl(var(--basalt-heatmap-orange-4))\",\n\t],\n} as const;\n\nfunction weekdayNames(locale: string) {\n\treturn Array.from({ length: 7 }, (_, index) =>\n\t\tnew Intl.DateTimeFormat(locale, { weekday: \"short\" }).format(new Date(2023, 0, 1 + index)),\n\t);\n}\n\nfunction monthNames(locale: string) {\n\treturn Array.from({ length: 12 }, (_, index) =>\n\t\tnew Intl.DateTimeFormat(locale, { month: \"short\" }).format(new Date(2023, index, 1)),\n\t);\n}\n\nfunction getYearWeeks(year: number): Date[][] {\n\tconst weeks: Date[][] = [];\n\tconst startDate = new Date(year, 0, 1);\n\tconst endDate = new Date(year, 11, 31);\n\tconst firstDay = new Date(startDate);\n\tfirstDay.setDate(firstDay.getDate() - firstDay.getDay());\n\tlet currentDate = new Date(firstDay);\n\tlet currentWeek: Date[] = [];\n\twhile (currentDate <= endDate || currentWeek.length > 0) {\n\t\tif (currentWeek.length === 7) {\n\t\t\tweeks.push(currentWeek);\n\t\t\tcurrentWeek = [];\n\t\t}\n\t\tif (currentDate > endDate) {\n\t\t\tbreak;\n\t\t}\n\t\tcurrentWeek.push(new Date(currentDate));\n\t\tcurrentDate = new Date(currentDate);\n\t\tcurrentDate.setDate(currentDate.getDate() + 1);\n\t}\n\tif (currentWeek.length > 0) {\n\t\tweeks.push(currentWeek);\n\t}\n\treturn weeks;\n}\n\nfunction formatDate(date: Date): string {\n\tconst year = date.getFullYear();\n\tconst month = String(date.getMonth() + 1).padStart(2, \"0\");\n\tconst day = String(date.getDate()).padStart(2, \"0\");\n\treturn `${year}-${month}-${day}`;\n}\n\nfunction getColorIndex(value: number, maxValue: number, colorScale: readonly string[]): number {\n\tif (value === 0) {\n\t\treturn 0;\n\t}\n\tconst levels = colorScale.length - 1;\n\tconst normalized = Math.min(value / maxValue, 1);\n\treturn Math.ceil(normalized * levels);\n}\n\nexport type HeatmapCalendarValuesProps = {\n\t/**\n\t * Numeric values sequence to display in a compact 7-column grid.\n\t */\n\tvalues: number[];\n\t/**\n\t * Accessible name describing the heatmap purpose or data.\n\t * @default \"Heatmap calendar\"\n\t */\n\tariaLabel?: string;\n\t/**\n\t * Additional CSS class names for the outer container.\n\t */\n\tclassName?: string;\n};\n\nexport type HeatmapCalendarYearProps = {\n\t/**\n\t * Dataset of daily metrics with ISO date strings (\"YYYY-MM-DD\") and numeric values.\n\t */\n\tdata: HeatmapDataPoint[];\n\t/**\n\t * Calendar year to render.\n\t */\n\tyear: number;\n\t/**\n\t * Array of color values forming the intensity gradient from lowest to highest.\n\t * @default heatmapColorScales.green\n\t */\n\tcolorScale?: readonly string[];\n\t/**\n\t * Formatter for tooltip value display and accessible label.\n\t * @default (value) => value.toLocaleString()\n\t */\n\tvalueFormatter?: (value: number, date: string) => string;\n\t/**\n\t * Name of the metric for accessible labeling and tooltips.\n\t * @default \"Value\"\n\t */\n\tmetricLabel?: string;\n\t/**\n\t * Pixel width and height of each day cell.\n\t * @default 12\n\t */\n\tcellSize?: number;\n\t/**\n\t * Pixel gap between adjacent cells.\n\t * @default 2\n\t */\n\tcellGap?: number;\n\t/**\n\t * BCP 47 locale tag used for weekday and month label formatting.\n\t * @default \"en-US\"\n\t */\n\tlocale?: string;\n\t/**\n\t * Explicit custom weekday labels override.\n\t */\n\tweekdayLabels?: string[];\n\t/**\n\t * Explicit custom month labels override.\n\t */\n\tmonthLabels?: string[];\n\t/**\n\t * Label text for the lower end of the color scale legend.\n\t * @default \"Less\"\n\t */\n\tlessLabel?: string;\n\t/**\n\t * Label text for the upper end of the color scale legend.\n\t * @default \"More\"\n\t */\n\tmoreLabel?: string;\n\t/**\n\t * Accessible name describing the yearly heatmap dataset.\n\t * @default \"Heatmap calendar\"\n\t */\n\tariaLabel?: string;\n\t/**\n\t * Additional CSS class names for the outer scrollable container.\n\t */\n\tclassName?: string;\n};\n\nexport type HeatmapCalendarProps = HeatmapCalendarValuesProps | HeatmapCalendarYearProps;\n\nexport function HeatmapCalendar(props: HeatmapCalendarProps) {\n\tif (\"data\" in props) {\n\t\treturn <YearHeatmap {...props} />;\n\t}\n\treturn <ValuesHeatmap {...props} />;\n}\n\nfunction ValuesHeatmap({\n\tvalues,\n\tariaLabel = \"Heatmap calendar\",\n\tclassName,\n}: HeatmapCalendarValuesProps) {\n\tconst [activeIdx, setActiveIdx] = useState(0);\n\tconst [openTooltipIdx, setOpenTooltipIdx] = useState<number | null>(null);\n\tconst containerRef = useRef<HTMLDivElement | null>(null);\n\tconst cellRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\tconst isFocusedInsideRef = useRef(false);\n\n\t// When values array shrinks, empties, or restores: if an item or container currently held focus,\n\t// restore focus to the new valid index or empty container without stealing focus from outside.\n\tuseEffect(() => {\n\t\tconst hadFocus = isFocusedInsideRef.current;\n\t\tif (values.length === 0) {\n\t\t\tsetActiveIdx(0);\n\t\t\tsetOpenTooltipIdx(null);\n\t\t\tif (hadFocus) {\n\t\t\t\tcontainerRef.current?.focus();\n\t\t\t}\n\t\t} else if (activeIdx >= values.length) {\n\t\t\tconst next = values.length - 1;\n\t\t\tsetActiveIdx(next);\n\t\t\tif (hadFocus) {\n\t\t\t\tcellRefs.current[next]?.focus();\n\t\t\t}\n\t\t} else if (hadFocus) {\n\t\t\tcellRefs.current[activeIdx]?.focus();\n\t\t}\n\t}, [values.length, activeIdx]);\n\n\tconst handleKeyDown = (e: KeyboardEvent<HTMLButtonElement>, currentIndex: number) => {\n\t\tif (values.length === 0) return;\n\n\t\tif (e.key === \"Escape\") {\n\t\t\tsetOpenTooltipIdx(null);\n\t\t\treturn;\n\t\t}\n\n\t\tlet nextIdx = currentIndex;\n\t\tif (e.key === \"ArrowRight\") {\n\t\t\tnextIdx = Math.min(values.length - 1, currentIndex + 1);\n\t\t} else if (e.key === \"ArrowLeft\") {\n\t\t\tnextIdx = Math.max(0, currentIndex - 1);\n\t\t} else if (e.key === \"ArrowDown\") {\n\t\t\tnextIdx = Math.min(values.length - 1, currentIndex + 7);\n\t\t} else if (e.key === \"ArrowUp\") {\n\t\t\tnextIdx = Math.max(0, currentIndex - 7);\n\t\t} else if (e.key === \"Home\") {\n\t\t\tnextIdx = 0;\n\t\t} else if (e.key === \"End\") {\n\t\t\tnextIdx = values.length - 1;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\te.preventDefault();\n\t\tsetActiveIdx(nextIdx);\n\t\tsetOpenTooltipIdx(nextIdx);\n\t\tcellRefs.current[nextIdx]?.focus();\n\t};\n\n\tconst container = (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\ttabIndex={-1}\n\t\t\trole=\"region\"\n\t\t\taria-label={ariaLabel}\n\t\t\tonFocus={() => {\n\t\t\t\tisFocusedInsideRef.current = true;\n\t\t\t}}\n\t\t\tonBlur={(e) => {\n\t\t\t\tif (!e.currentTarget.contains(e.relatedTarget)) {\n\t\t\t\t\tisFocusedInsideRef.current = false;\n\t\t\t\t}\n\t\t\t}}\n\t\t\tclassName={cn(\n\t\t\t\t\"basalt-focus basalt-focus-inset grid grid-cols-7 gap-basalt-space-sm p-basalt-space-xs\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{values.map((value, index) => {\n\t\t\t\tconst isCurrent = index === activeIdx;\n\t\t\t\tconst isOpen = openTooltipIdx === index;\n\t\t\t\treturn (\n\t\t\t\t\t<Tooltip\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\topen={isOpen}\n\t\t\t\t\t\tonOpenChange={(next) => {\n\t\t\t\t\t\t\tif (next) {\n\t\t\t\t\t\t\t\tsetOpenTooltipIdx(index);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsetOpenTooltipIdx((curr) => {\n\t\t\t\t\t\t\t\t\tif (curr !== index) return curr;\n\t\t\t\t\t\t\t\t\t// If this cell currently holds document focus, ignore scroll dismiss\n\t\t\t\t\t\t\t\t\tconst isCellFocused =\n\t\t\t\t\t\t\t\t\t\tcellRefs.current[index] !== null &&\n\t\t\t\t\t\t\t\t\t\tdocument.activeElement === cellRefs.current[index];\n\t\t\t\t\t\t\t\t\treturn isCellFocused ? curr : null;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\tcellRefs.current[index] = el;\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\ttabIndex={isCurrent ? 0 : -1}\n\t\t\t\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\t\t\t\tsetActiveIdx(index);\n\t\t\t\t\t\t\t\t\tsetOpenTooltipIdx(index);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonBlur={() => {\n\t\t\t\t\t\t\t\t\tsetOpenTooltipIdx((curr) => (curr === index ? null : curr));\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonKeyDown={(e) => handleKeyDown(e, index)}\n\t\t\t\t\t\t\t\taria-label={`Position ${index + 1}: ${value}`}\n\t\t\t\t\t\t\t\tclassName=\"basalt-focus basalt-focus-inset basalt-focus-swatch box-border m-0 h-basalt-3 w-basalt-3 cursor-pointer rounded-basalt-sm border-0 p-0 transition-colors basalt-motion\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tbackgroundColor: `hsl(var(--basalt-chart-5) / ${0.2 + Math.min(4, Math.max(0, value)) * 0.15})`,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t<div className=\"text-basalt-sm\">\n\t\t\t\t\t\t\t\tPosition {index + 1}: {value}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n\n\tif (values.length === 0) {\n\t\treturn container;\n\t}\n\n\treturn <TooltipProvider>{container}</TooltipProvider>;\n}\n\nfunction YearHeatmap({\n\tdata,\n\tyear,\n\tcolorScale = heatmapColorScales.green,\n\tvalueFormatter = (value) => value.toLocaleString(),\n\tmetricLabel = \"Value\",\n\tcellSize = 12,\n\tcellGap = 2,\n\tlocale = \"en-US\",\n\tweekdayLabels,\n\tmonthLabels,\n\tlessLabel = \"Less\",\n\tmoreLabel = \"More\",\n\tariaLabel = \"Heatmap calendar\",\n\tclassName,\n}: HeatmapCalendarYearProps) {\n\tconst weekdays = weekdayLabels ?? weekdayNames(locale);\n\tconst months = monthLabels ?? monthNames(locale);\n\tconst calendarId = useId();\n\tconst scrollRegionRef = useRef<HTMLDivElement | null>(null);\n\n\tconst { weeks, dataMap, maxValue, labels, validDays, dateToValidIndex } = useMemo(() => {\n\t\tconst weeks = getYearWeeks(year);\n\t\tconst dataMap = new Map<string, number>();\n\t\tlet maxValue = 0;\n\t\tfor (const point of data) {\n\t\t\tdataMap.set(point.date, point.value);\n\t\t\tif (point.value > maxValue) {\n\t\t\t\tmaxValue = point.value;\n\t\t\t}\n\t\t}\n\n\t\tconst labels: { month: string; weekIndex: number }[] = [];\n\t\tlet lastMonth = -1;\n\t\tweeks.forEach((week, weekIndex) => {\n\t\t\tconst firstDayOfWeek = week.find((date) => date.getFullYear() === year);\n\t\t\tif (firstDayOfWeek) {\n\t\t\t\tconst month = firstDayOfWeek.getMonth();\n\t\t\t\tif (month !== lastMonth) {\n\t\t\t\t\tlabels.push({ month: months[month], weekIndex });\n\t\t\t\t\tlastMonth = month;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tconst validDays: string[] = [];\n\t\tconst dateToValidIndex = new Map<string, number>();\n\n\t\tweeks.forEach((week) => {\n\t\t\tweek.forEach((date) => {\n\t\t\t\tif (date.getFullYear() === year) {\n\t\t\t\t\tconst dateStr = formatDate(date);\n\t\t\t\t\tdateToValidIndex.set(dateStr, validDays.length);\n\t\t\t\t\tvalidDays.push(dateStr);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\treturn { weeks, dataMap, maxValue, labels, validDays, dateToValidIndex };\n\t}, [data, months, year]);\n\n\tconst [activeDate, setActiveDate] = useState<string>(() => {\n\t\treturn validDays[0] ?? `${year}-01-01`;\n\t});\n\tconst [openTooltipDate, setOpenTooltipDate] = useState<string | null>(null);\n\n\tconst cellRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\n\tconst isYearFocusedInsideRef = useRef(false);\n\n\t// If year or validDays change: if a cell held focus, restore focus to the clamped\n\t// active date or scroll container; if focus was outside, do NOT steal focus.\n\tuseEffect(() => {\n\t\tconst hadFocus = isYearFocusedInsideRef.current;\n\t\tif (validDays.length === 0) {\n\t\t\tsetActiveDate(\"\");\n\t\t\tsetOpenTooltipDate(null);\n\t\t\tif (hadFocus) {\n\t\t\t\tscrollRegionRef.current?.focus();\n\t\t\t}\n\t\t} else if (!dateToValidIndex.has(activeDate)) {\n\t\t\tconst nextDate = validDays[0] ?? \"\";\n\t\t\tsetActiveDate(nextDate);\n\t\t\tif (hadFocus) {\n\t\t\t\tcellRefs.current.get(nextDate)?.focus();\n\t\t\t}\n\t\t}\n\t}, [validDays, dateToValidIndex, activeDate]);\n\n\tconst selectedDate = dateToValidIndex.has(activeDate) ? activeDate : validDays[0];\n\n\tconst navigateToDay = (targetDate: string | undefined) => {\n\t\tif (!targetDate) return;\n\t\tsetActiveDate(targetDate);\n\t\tsetOpenTooltipDate(targetDate);\n\t\tconst btn = cellRefs.current.get(targetDate);\n\t\tbtn?.focus();\n\t};\n\n\tconst handleCellKeyDown = (e: KeyboardEvent<HTMLButtonElement>, dateStr: string) => {\n\t\tif (validDays.length === 0) return;\n\n\t\tconst currentIdx = dateToValidIndex.get(dateStr) ?? 0;\n\n\t\tif (e.key === \"Escape\") {\n\t\t\tsetOpenTooltipDate(null);\n\t\t\treturn;\n\t\t}\n\n\t\tif (e.key === \"ArrowDown\") {\n\t\t\te.preventDefault();\n\t\t\t// Visually next day (down in the column)\n\t\t\tconst nextDay = validDays[currentIdx + 1];\n\t\t\tif (nextDay) {\n\t\t\t\tnavigateToDay(nextDay);\n\t\t\t}\n\t\t} else if (e.key === \"ArrowUp\") {\n\t\t\te.preventDefault();\n\t\t\t// Visually previous day (up in the column)\n\t\t\tconst prevDay = validDays[currentIdx - 1];\n\t\t\tif (prevDay) {\n\t\t\t\tnavigateToDay(prevDay);\n\t\t\t}\n\t\t} else if (e.key === \"ArrowRight\") {\n\t\t\te.preventDefault();\n\t\t\t// Visually next week (right in the row: +7 days by index)\n\t\t\tconst targetIdx = currentIdx + 7;\n\t\t\tif (targetIdx < validDays.length) {\n\t\t\t\tnavigateToDay(validDays[targetIdx]);\n\t\t\t} else {\n\t\t\t\tnavigateToDay(validDays[validDays.length - 1]);\n\t\t\t}\n\t\t} else if (e.key === \"ArrowLeft\") {\n\t\t\te.preventDefault();\n\t\t\t// Visually previous week (left in the row: -7 days by index)\n\t\t\tconst targetIdx = currentIdx - 7;\n\t\t\tif (targetIdx >= 0) {\n\t\t\t\tnavigateToDay(validDays[targetIdx]);\n\t\t\t} else {\n\t\t\t\tnavigateToDay(validDays[0]);\n\t\t\t}\n\t\t} else if (e.key === \"Home\") {\n\t\t\te.preventDefault();\n\t\t\tnavigateToDay(validDays[0]);\n\t\t} else if (e.key === \"End\") {\n\t\t\te.preventDefault();\n\t\t\tnavigateToDay(validDays[validDays.length - 1]);\n\t\t}\n\t};\n\n\tconst labelWidth = 30;\n\n\treturn (\n\t\t<div\n\t\t\tref={scrollRegionRef}\n\t\t\ttabIndex={-1}\n\t\t\trole=\"region\"\n\t\t\taria-label={`${ariaLabel} scrollable view`}\n\t\t\tonFocus={() => {\n\t\t\t\tisYearFocusedInsideRef.current = true;\n\t\t\t}}\n\t\t\tonBlur={(e) => {\n\t\t\t\tif (!e.currentTarget.contains(e.relatedTarget)) {\n\t\t\t\t\tisYearFocusedInsideRef.current = false;\n\t\t\t\t}\n\t\t\t}}\n\t\t\tclassName={cn(\"basalt-focus basalt-focus-inset overflow-x-auto rounded-basalt-md\", className)}\n\t\t>\n\t\t\t<TooltipProvider>\n\t\t\t\t<div className=\"inline-block p-basalt-space-sm\" role=\"group\" aria-label={ariaLabel}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"relative mb-basalt-space-sm h-basalt-4 text-basalt-sm text-basalt-muted-foreground\"\n\t\t\t\t\t\tstyle={{ marginLeft: labelWidth }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{labels.map((label) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={`${label.month}-${label.weekIndex}`}\n\t\t\t\t\t\t\t\tclassName=\"absolute\"\n\t\t\t\t\t\t\t\tstyle={{ left: label.weekIndex * (cellSize + cellGap) }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{label.month}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"mr-basalt-space-sm flex flex-col text-basalt-sm text-basalt-muted-foreground select-none\"\n\t\t\t\t\t\t\tstyle={{ width: labelWidth }}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{weekdays.map((day, index) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={`${day}-${index}`}\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\theight: cellSize + cellGap,\n\t\t\t\t\t\t\t\t\t\tlineHeight: `${cellSize + cellGap}px`,\n\t\t\t\t\t\t\t\t\t\tvisibility: index % 2 === 1 ? \"visible\" : \"hidden\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{day}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex\" style={{ gap: cellGap }}>\n\t\t\t\t\t\t\t{weeks.map((week, weekIndex) => (\n\t\t\t\t\t\t\t\t<div key={weekIndex} className=\"flex flex-col\" style={{ gap: cellGap }}>\n\t\t\t\t\t\t\t\t\t{week.map((date, dayIndex) => {\n\t\t\t\t\t\t\t\t\t\tconst dateStr = formatDate(date);\n\t\t\t\t\t\t\t\t\t\tconst isCurrentYear = date.getFullYear() === year;\n\t\t\t\t\t\t\t\t\t\tif (!isCurrentYear) {\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={dayIndex}\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: cellSize,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theight: cellSize,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvisibility: \"hidden\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tconst value = dataMap.get(dateStr) ?? 0;\n\t\t\t\t\t\t\t\t\t\tconst colorIndex = getColorIndex(value, maxValue, colorScale);\n\t\t\t\t\t\t\t\t\t\tconst isSelected = selectedDate === dateStr;\n\t\t\t\t\t\t\t\t\t\tconst formattedValue = valueFormatter(value, dateStr);\n\t\t\t\t\t\t\t\t\t\tconst labelText = `${dateStr}, ${metricLabel}: ${formattedValue}`;\n\t\t\t\t\t\t\t\t\t\tconst isOpen = openTooltipDate === dateStr;\n\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\t\t\t\t\t\tkey={dayIndex}\n\t\t\t\t\t\t\t\t\t\t\t\topen={isOpen}\n\t\t\t\t\t\t\t\t\t\t\t\tonOpenChange={(next) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (next) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetOpenTooltipDate(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetOpenTooltipDate((curr) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (curr !== dateStr) return curr;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// If this cell currently holds document focus, ignore scroll dismiss\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst isCellFocused =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdocument.activeElement === cellRefs.current.get(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn isCellFocused ? curr : null;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (el) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcellRefs.current.set(dateStr, el);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcellRefs.current.delete(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={labelText}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttabIndex={isSelected ? 0 : -1}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetActiveDate(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetOpenTooltipDate(dateStr);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonBlur={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetOpenTooltipDate((curr) => (curr === dateStr ? null : curr));\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(e) => handleCellKeyDown(e, dateStr)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"basalt-focus basalt-focus-inset basalt-focus-swatch box-border m-0 cursor-pointer rounded-basalt-sm border-0 p-0 transition-colors basalt-motion hover:ring-1 hover:ring-basalt-foreground\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: cellSize,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\theight: cellSize,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbackgroundColor: colorScale[colorIndex],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t\t\t\t\t\t<TooltipContent id={`${calendarId}-${dateStr}`}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-basalt-base\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"font-medium\">{dateStr}</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-basalt-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{metricLabel}: {formattedValue}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"mt-basalt-space-lg flex items-center justify-end gap-basalt-space-sm text-basalt-sm text-basalt-muted-foreground select-none\"\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>{lessLabel}</span>\n\t\t\t\t\t\t{colorScale.map((color) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={color}\n\t\t\t\t\t\t\t\tclassName=\"rounded-basalt-sm\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\twidth: cellSize,\n\t\t\t\t\t\t\t\t\theight: cellSize,\n\t\t\t\t\t\t\t\t\tbackgroundColor: color,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t<span>{moreLabel}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</TooltipProvider>\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
@@ -4,7 +4,7 @@ import { Tooltip as t, TooltipContent as n, TooltipProvider as r, TooltipTrigger
4
4
  import { heatmapColorScales as a } from "./heatmap-calendar.js";
5
5
  import { forwardRef as o, useCallback as s, useEffect as c, useId as l, useMemo as u, useRef as d, useState as f } from "react";
6
6
  import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
7
- //#region src/charts/heatmap-matrix.tsx
7
+ // src/charts/heatmap-matrix.tsx
8
8
  function g(e, t, n, r) {
9
9
  if (e == null || typeof e != "number" || !Number.isFinite(e)) return -1;
10
10
  if (r <= 1) return 0;
@@ -243,7 +243,6 @@ var _ = o(function({ rowLabels: o, columnLabels: _, values: v, domain: y, colorS
243
243
  }) });
244
244
  });
245
245
  _.displayName = "HeatmapMatrix";
246
- //#endregion
247
246
  export { _ as HeatmapMatrix };
248
247
 
249
248
  //# sourceMappingURL=heatmap-matrix.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { cn as e } from "../utils/cn.js";
3
3
  import { jsx as t, jsxs as n } from "react/jsx-runtime";
4
- //#region src/charts/item-list.tsx
4
+ // src/charts/item-list.tsx
5
5
  function r({ items: r, ariaLabel: i = "Item list", className: a }) {
6
6
  return /* @__PURE__ */ t("ul", {
7
7
  className: e("space-y-basalt-space-sm text-basalt-base", a),
@@ -12,7 +12,6 @@ function r({ items: r, ariaLabel: i = "Item list", className: a }) {
12
12
  }) : null] }, e.id ?? `${e.label}-${e.value ?? ""}-${t}`))
13
13
  });
14
14
  }
15
- //#endregion
16
15
  export { r as ItemList };
17
16
 
18
17
  //# sourceMappingURL=item-list.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { seriesColor as e } from "./config.js";
3
3
  import { jsx as t, jsxs as n } from "react/jsx-runtime";
4
- //#region src/charts/legend.tsx
4
+ // src/charts/legend.tsx
5
5
  function r({ items: r, shape: i = "line" }) {
6
6
  return r.length === 0 ? null : /* @__PURE__ */ t("div", {
7
7
  "data-testid": "chart-legend",
@@ -50,7 +50,6 @@ function r({ items: r, shape: i = "line" }) {
50
50
  })
51
51
  });
52
52
  }
53
- //#endregion
54
53
  export { r as ChartLegend };
55
54
 
56
55
  //# sourceMappingURL=legend.js.map
@@ -5,7 +5,7 @@ import { ChartShell as d } from "./frame.js";
5
5
  import { ChartLegend as f } from "./legend.js";
6
6
  import { jsx as p, jsxs as m } from "react/jsx-runtime";
7
7
  import { CartesianGrid as h, Line as g, LineChart as _, Tooltip as v, XAxis as y, YAxis as b } from "recharts";
8
- //#region src/charts/line.tsx
8
+ // src/charts/line.tsx
9
9
  function x({ data: x, series: S, ariaLabel: C = "Line chart", className: w, showAxes: T = !1, showLegend: E = !1, color: D, valueFormatter: O, xValueFormatter: k, yDomain: A, legend: j, customTooltip: M, summary: N, dataAlternative: P, accessibilityLayer: F }) {
10
10
  let I = c(l(S, u(x)), D), L = j === void 0 ? E ? /* @__PURE__ */ p(f, {
11
11
  items: I,
@@ -51,7 +51,6 @@ function x({ data: x, series: S, ariaLabel: C = "Line chart", className: w, show
51
51
  })
52
52
  });
53
53
  }
54
- //#endregion
55
54
  export { x as LineChart };
56
55
 
57
56
  //# sourceMappingURL=line.js.map
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsx as e } from "react/jsx-runtime";
3
- //#region src/charts/palette.tsx
3
+ // src/charts/palette.tsx
4
4
  var t = (e) => `hsl(var(--basalt-${e}))`, n = (e, t) => `hsl(var(--basalt-${e}) / ${t})`, r = t("chart-axis"), i = t("chart-muted"), a = {
5
5
  primary: t("chart-1"),
6
6
  sky: t("chart-2"),
@@ -44,7 +44,6 @@ function s({ ariaLabel: t = "Chart colors" }) {
44
44
  }, t))
45
45
  });
46
46
  }
47
- //#endregion
48
47
  export { o as CHART_COLORS, s as ChartPalette, a as chart, r as chartAxis, i as chartMuted, n as withAlpha };
49
48
 
50
49
  //# sourceMappingURL=palette.js.map