@powered-by-array/ui 1.77.0 → 1.78.0

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 (95) hide show
  1. package/dist/components/CardContainer/CardContainer.variants.d.ts +1 -1
  2. package/dist/components/CardContainer/CardContainer.variants.d.ts.map +1 -1
  3. package/dist/components/CardContainer/CardContainer.variants.js +2 -0
  4. package/dist/components/CardContainer/CardContainer.variants.js.map +1 -1
  5. package/dist/components/DropdownButton/DropdownButton.d.ts +1 -1
  6. package/dist/components/DropdownButton/DropdownButton.d.ts.map +1 -1
  7. package/dist/components/DropdownButton/DropdownButton.js +21 -3
  8. package/dist/components/DropdownButton/DropdownButton.js.map +1 -1
  9. package/dist/components/DropdownButton/DropdownButton.types.d.ts +11 -0
  10. package/dist/components/DropdownButton/DropdownButton.types.d.ts.map +1 -1
  11. package/dist/components/DropdownButton/DropdownButton.variants.d.ts +3 -3
  12. package/dist/components/DropdownButton/DropdownButton.variants.d.ts.map +1 -1
  13. package/dist/components/DropdownButton/DropdownButton.variants.js +11 -7
  14. package/dist/components/DropdownButton/DropdownButton.variants.js.map +1 -1
  15. package/dist/components/LineChartCard/LineChartCard.d.ts +7 -0
  16. package/dist/components/LineChartCard/LineChartCard.d.ts.map +1 -0
  17. package/dist/components/LineChartCard/LineChartCard.js +17 -0
  18. package/dist/components/LineChartCard/LineChartCard.js.map +1 -0
  19. package/dist/components/LineChartCard/LineChartCard.types.d.ts +19 -0
  20. package/dist/components/LineChartCard/LineChartCard.types.d.ts.map +1 -0
  21. package/dist/components/LineChartCard/LineChartCard.types.js +2 -0
  22. package/dist/components/LineChartCard/LineChartCard.types.js.map +1 -0
  23. package/dist/components/LineChartCard/LineChartCard.variants.d.ts +23 -0
  24. package/dist/components/LineChartCard/LineChartCard.variants.d.ts.map +1 -0
  25. package/dist/components/LineChartCard/LineChartCard.variants.js +36 -0
  26. package/dist/components/LineChartCard/LineChartCard.variants.js.map +1 -0
  27. package/dist/components/LineChartCard/index.d.ts +5 -0
  28. package/dist/components/LineChartCard/index.d.ts.map +1 -0
  29. package/dist/components/LineChartCard/index.js +3 -0
  30. package/dist/components/LineChartCard/index.js.map +1 -0
  31. package/dist/components/SemanticBarChart/Chart/Chart.d.ts +3 -1
  32. package/dist/components/SemanticBarChart/Chart/Chart.d.ts.map +1 -1
  33. package/dist/components/SemanticBarChart/Chart/Chart.js +2 -2
  34. package/dist/components/SemanticBarChart/Chart/Chart.js.map +1 -1
  35. package/dist/components/SemanticLineChart/SemanticLineChart.d.ts +7 -0
  36. package/dist/components/SemanticLineChart/SemanticLineChart.d.ts.map +1 -0
  37. package/dist/components/SemanticLineChart/SemanticLineChart.js +99 -0
  38. package/dist/components/SemanticLineChart/SemanticLineChart.js.map +1 -0
  39. package/dist/components/SemanticLineChart/SemanticLineChart.path.utils.d.ts +18 -0
  40. package/dist/components/SemanticLineChart/SemanticLineChart.path.utils.d.ts.map +1 -0
  41. package/dist/components/SemanticLineChart/SemanticLineChart.path.utils.js +52 -0
  42. package/dist/components/SemanticLineChart/SemanticLineChart.path.utils.js.map +1 -0
  43. package/dist/components/SemanticLineChart/SemanticLineChart.types.d.ts +49 -0
  44. package/dist/components/SemanticLineChart/SemanticLineChart.types.d.ts.map +1 -0
  45. package/dist/components/SemanticLineChart/SemanticLineChart.types.js +2 -0
  46. package/dist/components/SemanticLineChart/SemanticLineChart.types.js.map +1 -0
  47. package/dist/components/SemanticLineChart/SemanticLineChart.utils.d.ts +17 -0
  48. package/dist/components/SemanticLineChart/SemanticLineChart.utils.d.ts.map +1 -0
  49. package/dist/components/SemanticLineChart/SemanticLineChart.utils.js +58 -0
  50. package/dist/components/SemanticLineChart/SemanticLineChart.utils.js.map +1 -0
  51. package/dist/components/SemanticLineChart/SemanticLineChart.variants.d.ts +68 -0
  52. package/dist/components/SemanticLineChart/SemanticLineChart.variants.d.ts.map +1 -0
  53. package/dist/components/SemanticLineChart/SemanticLineChart.variants.js +98 -0
  54. package/dist/components/SemanticLineChart/SemanticLineChart.variants.js.map +1 -0
  55. package/dist/components/SemanticLineChart/SemanticLineChartDot.d.ts +12 -0
  56. package/dist/components/SemanticLineChart/SemanticLineChartDot.d.ts.map +1 -0
  57. package/dist/components/SemanticLineChart/SemanticLineChartDot.js +10 -0
  58. package/dist/components/SemanticLineChart/SemanticLineChartDot.js.map +1 -0
  59. package/dist/components/SemanticLineChart/SemanticLineChartGrid.d.ts +9 -0
  60. package/dist/components/SemanticLineChart/SemanticLineChartGrid.d.ts.map +1 -0
  61. package/dist/components/SemanticLineChart/SemanticLineChartGrid.js +52 -0
  62. package/dist/components/SemanticLineChart/SemanticLineChartGrid.js.map +1 -0
  63. package/dist/components/SemanticLineChart/SemanticLineChartHitCurve.d.ts +12 -0
  64. package/dist/components/SemanticLineChart/SemanticLineChartHitCurve.d.ts.map +1 -0
  65. package/dist/components/SemanticLineChart/SemanticLineChartHitCurve.js +21 -0
  66. package/dist/components/SemanticLineChart/SemanticLineChartHitCurve.js.map +1 -0
  67. package/dist/components/SemanticLineChart/SemanticLineChartSeriesDots.d.ts +21 -0
  68. package/dist/components/SemanticLineChart/SemanticLineChartSeriesDots.d.ts.map +1 -0
  69. package/dist/components/SemanticLineChart/SemanticLineChartSeriesDots.js +65 -0
  70. package/dist/components/SemanticLineChart/SemanticLineChartSeriesDots.js.map +1 -0
  71. package/dist/components/SemanticLineChart/SemanticLineChartTrimmedCurve.d.ts +10 -0
  72. package/dist/components/SemanticLineChart/SemanticLineChartTrimmedCurve.d.ts.map +1 -0
  73. package/dist/components/SemanticLineChart/SemanticLineChartTrimmedCurve.js +13 -0
  74. package/dist/components/SemanticLineChart/SemanticLineChartTrimmedCurve.js.map +1 -0
  75. package/dist/components/SemanticLineChart/index.d.ts +5 -0
  76. package/dist/components/SemanticLineChart/index.d.ts.map +1 -0
  77. package/dist/components/SemanticLineChart/index.js +3 -0
  78. package/dist/components/SemanticLineChart/index.js.map +1 -0
  79. package/dist/components/SemanticLineChart/useSemanticLineChartDotsReveal.d.ts +6 -0
  80. package/dist/components/SemanticLineChart/useSemanticLineChartDotsReveal.d.ts.map +1 -0
  81. package/dist/components/SemanticLineChart/useSemanticLineChartDotsReveal.js +47 -0
  82. package/dist/components/SemanticLineChart/useSemanticLineChartDotsReveal.js.map +1 -0
  83. package/dist/components/SemanticLineChart/useSemanticLineChartEntryAnimation.d.ts +18 -0
  84. package/dist/components/SemanticLineChart/useSemanticLineChartEntryAnimation.d.ts.map +1 -0
  85. package/dist/components/SemanticLineChart/useSemanticLineChartEntryAnimation.js +37 -0
  86. package/dist/components/SemanticLineChart/useSemanticLineChartEntryAnimation.js.map +1 -0
  87. package/dist/components/SemanticLineChart/useSemanticLineChartSeriesHover.d.ts +13 -0
  88. package/dist/components/SemanticLineChart/useSemanticLineChartSeriesHover.d.ts.map +1 -0
  89. package/dist/components/SemanticLineChart/useSemanticLineChartSeriesHover.js +57 -0
  90. package/dist/components/SemanticLineChart/useSemanticLineChartSeriesHover.js.map +1 -0
  91. package/dist/index.d.ts +7 -0
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +3 -0
  94. package/dist/index.js.map +1 -1
  95. package/package.json +1 -1
@@ -0,0 +1,99 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { Line, LineChart, XAxis, YAxis, } from "recharts";
5
+ import { cn } from "../../lib/cn.js";
6
+ import { ChartContainer, ChartTooltip, ChartTooltipContent, } from "../SemanticBarChart/Chart/index.js";
7
+ import { SemanticLineChartGrid } from "./SemanticLineChartGrid.js";
8
+ import { SemanticLineChartDot } from "./SemanticLineChartDot.js";
9
+ import { SemanticLineChartHitCurve } from "./SemanticLineChartHitCurve.js";
10
+ import { SemanticLineChartTrimmedCurve } from "./SemanticLineChartTrimmedCurve.js";
11
+ import { SemanticLineChartSeriesDots } from "./SemanticLineChartSeriesDots.js";
12
+ import { resolveLineChartTrimRadius } from "./SemanticLineChart.path.utils.js";
13
+ import { buildLineChartConfig, orderSeriesForHover, seriesColorVar } from "./SemanticLineChart.utils.js";
14
+ import { useSemanticLineChartEntryAnimation } from "./useSemanticLineChartEntryAnimation.js";
15
+ import { useSemanticLineChartDotsReveal } from "./useSemanticLineChartDotsReveal.js";
16
+ import { useSemanticLineChartSeriesHover } from "./useSemanticLineChartSeriesHover.js";
17
+ import { DEFAULT_LINE_MARGIN, SEMANTIC_LINE_CHART_BASE_LINE_Z_INDEX, SEMANTIC_LINE_CHART_DOT_INNER_RADIUS, SEMANTIC_LINE_CHART_HOVERED_LINE_Z_INDEX, SEMANTIC_LINE_CHART_HOVER_STROKE_DELTA, SEMANTIC_LINE_CHART_SERIES_LINE_CLASS, SEMANTIC_LINE_CHART_ANIMATION_DURATION_MS, SEMANTIC_LINE_CHART_ANIMATION_STAGGER_MS, SEMANTIC_LINE_CHART_ANIMATION_EASING, SEMANTIC_LINE_CHART_RESIZE_DEBOUNCE_MS, SEMANTIC_LINE_CHART_Y_AXIS_WIDTH, SEMANTIC_LINE_CHART_Y_LABEL_X, SEMANTIC_LINE_CHART_X_AXIS_PADDING, semanticLineChartChartContainerVariants, semanticLineChartXAxisTick, semanticLineChartYAxisTick, } from "./SemanticLineChart.variants.js";
18
+ /** Right-aligned Y tick labels inside the Figma 36px label column. */
19
+ function renderYAxisTick(tickProps, tickFormatter) {
20
+ const rawValue = tickProps.payload?.value;
21
+ const label = rawValue != null && tickFormatter != null
22
+ ? tickFormatter(rawValue)
23
+ : rawValue != null
24
+ ? String(rawValue)
25
+ : "";
26
+ return (_jsx("text", { x: SEMANTIC_LINE_CHART_Y_LABEL_X, y: tickProps.y, dy: 3, textAnchor: "end", fill: semanticLineChartYAxisTick.fill, fontSize: semanticLineChartYAxisTick.fontSize, className: "font-mono", children: label }));
27
+ }
28
+ /**
29
+ * Multi-series line chart composed from `ChartContainer` and Recharts.
30
+ * Series colors default to semantic chart tokens (`--chart-1` … `--chart-10`).
31
+ */
32
+ export function SemanticLineChart({ className, data, series, chartClassName, chartMargin, chartConfig = {}, chartId, yDomain, yTicks, yTickFormatter, xTickFormatter, gridVertical = true, strokeWidth = 2, dotRadius = SEMANTIC_LINE_CHART_DOT_INNER_RADIUS, showDots = true, showTooltip = false, "aria-label": ariaLabelProp, ...props }) {
33
+ const resolvedConfig = React.useMemo(() => buildLineChartConfig(series, chartConfig), [series, chartConfig]);
34
+ const margin = React.useMemo(() => {
35
+ return {
36
+ ...DEFAULT_LINE_MARGIN,
37
+ ...chartMargin,
38
+ };
39
+ }, [chartMargin]);
40
+ const defaultAriaLabel = React.useMemo(() => {
41
+ const summaries = series.map((item) => {
42
+ const values = data
43
+ .map((row) => {
44
+ const raw = row[item.dataKey];
45
+ const numeric = typeof raw === "number" ? raw : Number(raw);
46
+ const formatted = Number.isFinite(numeric)
47
+ ? yTickFormatter != null
48
+ ? yTickFormatter(numeric)
49
+ : String(numeric)
50
+ : String(raw);
51
+ return `${row.name} ${formatted}`;
52
+ })
53
+ .join(", ");
54
+ return `${item.label ?? item.dataKey}: ${values}`;
55
+ });
56
+ return `Line chart, ${summaries.join("; ")}`;
57
+ }, [data, series, yTickFormatter]);
58
+ const suppressMouseFocus = React.useCallback((event) => {
59
+ // Recharts activates keyboard tooltip state on SVG focus (index 0). Mouse clicks
60
+ // should not move focus there; Tab still reaches the chart for arrow-key navigation.
61
+ event.preventDefault();
62
+ }, []);
63
+ const { isEntryAnimationActive } = useSemanticLineChartEntryAnimation({
64
+ seriesCount: series.length,
65
+ });
66
+ const hoverInteractionsEnabled = !isEntryAnimationActive;
67
+ const { hoveredSeriesKey, handleSeriesEnter, handleSeriesLeave, clearHoveredSeries, } = useSemanticLineChartSeriesHover(hoverInteractionsEnabled);
68
+ const orderedSeries = React.useMemo(() => orderSeriesForHover(series, hoveredSeriesKey), [series, hoveredSeriesKey]);
69
+ const entryTrimRadius = resolveLineChartTrimRadius(showDots, dotRadius, isEntryAnimationActive);
70
+ const showSeriesDots = showDots && !isEntryAnimationActive;
71
+ const seriesDotsOpacity = useSemanticLineChartDotsReveal(showSeriesDots);
72
+ const renderTrimmedCurve = React.useCallback((curveProps) => (_jsx(SemanticLineChartTrimmedCurve, { ...curveProps, trimRadius: entryTrimRadius })), [entryTrimRadius]);
73
+ const renderHitCurve = React.useCallback((curveProps) => (_jsx(SemanticLineChartHitCurve, { points: curveProps.points, interactive: hoverInteractionsEnabled })), [hoverInteractionsEnabled]);
74
+ const renderActiveDot = React.useCallback((dotProps) => {
75
+ const dataKey = typeof dotProps.dataKey === "string" ? dotProps.dataKey : undefined;
76
+ if (dotProps.cx == null || dotProps.cy == null || dataKey == null) {
77
+ return null;
78
+ }
79
+ return (_jsx(SemanticLineChartDot, { cx: dotProps.cx, cy: dotProps.cy, fill: seriesColorVar(dataKey), innerRadius: dotRadius }));
80
+ }, [dotRadius]);
81
+ return (_jsx("div", { "data-slot": "semantic-line-chart", role: "group", className: cn("w-full", className), "aria-label": ariaLabelProp ?? defaultAriaLabel, ...props, children: _jsx(ChartContainer, { id: chartId, config: resolvedConfig, debounce: SEMANTIC_LINE_CHART_RESIZE_DEBOUNCE_MS, className: cn(semanticLineChartChartContainerVariants(), chartClassName), "data-entry-animating": isEntryAnimationActive || undefined, onMouseDown: suppressMouseFocus, onMouseLeave: clearHoveredSeries, children: _jsxs(LineChart, { accessibilityLayer: true, data: data, margin: margin, children: [_jsx(SemanticLineChartGrid, { gridVertical: gridVertical, yDomain: yDomain, yTicks: yTicks }), _jsx(XAxis, { dataKey: "name", tickLine: false, axisLine: false, tickMargin: 10, interval: 0, minTickGap: 0, padding: SEMANTIC_LINE_CHART_X_AXIS_PADDING, tick: semanticLineChartXAxisTick, ...(xTickFormatter != null ? { tickFormatter: xTickFormatter } : {}) }), _jsx(YAxis, { ...(yDomain != null ? { domain: yDomain } : {}), ...(yTicks != null ? { ticks: yTicks } : {}), ...(yTickFormatter != null ? { tickFormatter: yTickFormatter } : {}), tickLine: false, axisLine: false, width: SEMANTIC_LINE_CHART_Y_AXIS_WIDTH, interval: 0, minTickGap: 0, allowDecimals: false, tick: (tickProps) => renderYAxisTick(tickProps, yTickFormatter) }), showTooltip ? (_jsx(ChartTooltip, { shared: true, trigger: "hover", cursor: false, isAnimationActive: false, content: _jsx(ChartTooltipContent, { indicator: "dot" }) })) : null, orderedSeries.map((item) => {
82
+ const color = seriesColorVar(item.dataKey);
83
+ const seriesAnimationIndex = series.findIndex((seriesItem) => seriesItem.dataKey === item.dataKey);
84
+ const animationBegin = seriesAnimationIndex * SEMANTIC_LINE_CHART_ANIMATION_STAGGER_MS;
85
+ const isHovered = hoverInteractionsEnabled && hoveredSeriesKey === item.dataKey;
86
+ const seriesStrokeWidth = isHovered
87
+ ? strokeWidth + SEMANTIC_LINE_CHART_HOVER_STROKE_DELTA
88
+ : strokeWidth;
89
+ const seriesCurveZIndex = isHovered
90
+ ? SEMANTIC_LINE_CHART_HOVERED_LINE_Z_INDEX
91
+ : SEMANTIC_LINE_CHART_BASE_LINE_Z_INDEX;
92
+ const seriesMouseHandlers = {
93
+ onMouseEnter: () => handleSeriesEnter(item.dataKey),
94
+ onMouseLeave: () => handleSeriesLeave(item.dataKey),
95
+ };
96
+ return (_jsxs(React.Fragment, { children: [_jsx(Line, { id: `semantic-line-chart-curve-${item.dataKey}`, className: cn(SEMANTIC_LINE_CHART_SERIES_LINE_CLASS, "semantic-line-chart-series-line"), type: "linear", dataKey: item.dataKey, name: item.label ?? item.dataKey, stroke: color, strokeWidth: seriesStrokeWidth, shape: renderTrimmedCurve, dot: false, activeDot: false, isAnimationActive: isEntryAnimationActive, animateNewValues: false, animationBegin: animationBegin, animationDuration: isEntryAnimationActive ? SEMANTIC_LINE_CHART_ANIMATION_DURATION_MS : 0, animationEasing: SEMANTIC_LINE_CHART_ANIMATION_EASING, legendType: "none", tooltipType: "none", zIndex: seriesCurveZIndex }), _jsx(Line, { id: `semantic-line-chart-hit-${item.dataKey}`, className: "semantic-line-chart-series-hit-line", type: "linear", dataKey: item.dataKey, name: item.label ?? item.dataKey, stroke: showTooltip ? color : "none", shape: renderHitCurve, dot: false, activeDot: showTooltip ? renderActiveDot : false, isAnimationActive: false, legendType: "none", tooltipType: showTooltip ? undefined : "none", zIndex: seriesCurveZIndex, ...(hoverInteractionsEnabled ? seriesMouseHandlers : {}) })] }, item.dataKey));
97
+ }), showSeriesDots ? (_jsx(SemanticLineChartSeriesDots, { series: series, data: data, dotRadius: dotRadius, excludedDataKey: hoveredSeriesKey, raisedDataKey: hoveredSeriesKey != null && hoverInteractionsEnabled ? hoveredSeriesKey : null, opacity: seriesDotsOpacity, onSeriesMouseEnter: handleSeriesEnter, onSeriesMouseLeave: handleSeriesLeave })) : null] }) }) }));
98
+ }
99
+ //# sourceMappingURL=SemanticLineChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SemanticLineChart.js","sourceRoot":"","sources":["../../../src/components/SemanticLineChart/SemanticLineChart.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ type LineChartPoint = {
2
+ x?: number | null;
3
+ y?: number | null;
4
+ };
5
+ /** Small gap between each line terminus and the dot edge (Figma separation). */
6
+ export declare const SEMANTIC_LINE_CHART_LINE_DOT_SEPARATION_PX = 4;
7
+ /** Distance from dot center where series lines stop along each segment. */
8
+ export declare function getLineTrimRadius(dotInnerRadius: number, separationPx?: number): number;
9
+ /** Trim radius for visible curves: gaps only when dots are shown and entry draw is done. */
10
+ export declare function resolveLineChartTrimRadius(showDots: boolean, dotInnerRadius: number, isEntryAnimationActive: boolean): number;
11
+ /**
12
+ * Builds line path data between data points. When `trimRadius` is zero the path is
13
+ * one continuous polyline (smooth dash-draw animation). Otherwise segments are
14
+ * trimmed so strokes stop before dot centers.
15
+ */
16
+ export declare function getTrimmedLinearPath(points: ReadonlyArray<LineChartPoint> | undefined, trimRadius: number): string | null;
17
+ export {};
18
+ //# sourceMappingURL=SemanticLineChart.path.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SemanticLineChart.path.utils.d.ts","sourceRoot":"","sources":["../../../src/components/SemanticLineChart/SemanticLineChart.path.utils.ts"],"names":[],"mappings":"AAAA,KAAK,cAAc,GAAG;IACpB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACnB,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,0CAA0C,IAAI,CAAC;AAE5D,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAC/B,cAAc,EAAE,MAAM,EACtB,YAAY,GAAE,MAAmD,GAChE,MAAM,CAER;AAED,4FAA4F;AAC5F,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,OAAO,EACjB,cAAc,EAAE,MAAM,EACtB,sBAAsB,EAAE,OAAO,GAC9B,MAAM,CAMR;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,CAAC,cAAc,CAAC,GAAG,SAAS,EACjD,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CA6Cf"}
@@ -0,0 +1,52 @@
1
+ /** Small gap between each line terminus and the dot edge (Figma separation). */
2
+ export const SEMANTIC_LINE_CHART_LINE_DOT_SEPARATION_PX = 4;
3
+ /** Distance from dot center where series lines stop along each segment. */
4
+ export function getLineTrimRadius(dotInnerRadius, separationPx = SEMANTIC_LINE_CHART_LINE_DOT_SEPARATION_PX) {
5
+ return dotInnerRadius + separationPx;
6
+ }
7
+ /** Trim radius for visible curves: gaps only when dots are shown and entry draw is done. */
8
+ export function resolveLineChartTrimRadius(showDots, dotInnerRadius, isEntryAnimationActive) {
9
+ if (!showDots || isEntryAnimationActive) {
10
+ return 0;
11
+ }
12
+ return getLineTrimRadius(dotInnerRadius);
13
+ }
14
+ /**
15
+ * Builds line path data between data points. When `trimRadius` is zero the path is
16
+ * one continuous polyline (smooth dash-draw animation). Otherwise segments are
17
+ * trimmed so strokes stop before dot centers.
18
+ */
19
+ export function getTrimmedLinearPath(points, trimRadius) {
20
+ if (points == null || points.length < 2) {
21
+ return null;
22
+ }
23
+ const validPoints = points.filter((point) => point?.x != null && point?.y != null);
24
+ if (validPoints.length < 2) {
25
+ return null;
26
+ }
27
+ if (trimRadius <= 0) {
28
+ return validPoints
29
+ .map((point, index) => `${index === 0 ? "M" : "L"} ${point.x} ${point.y}`)
30
+ .join(" ");
31
+ }
32
+ const segments = [];
33
+ for (let index = 0; index < validPoints.length - 1; index += 1) {
34
+ const start = validPoints[index];
35
+ const end = validPoints[index + 1];
36
+ const dx = end.x - start.x;
37
+ const dy = end.y - start.y;
38
+ const length = Math.hypot(dx, dy);
39
+ if (length <= trimRadius * 2) {
40
+ continue;
41
+ }
42
+ const unitX = dx / length;
43
+ const unitY = dy / length;
44
+ const x1 = start.x + unitX * trimRadius;
45
+ const y1 = start.y + unitY * trimRadius;
46
+ const x2 = end.x - unitX * trimRadius;
47
+ const y2 = end.y - unitY * trimRadius;
48
+ segments.push(`M ${x1} ${y1} L ${x2} ${y2}`);
49
+ }
50
+ return segments.length > 0 ? segments.join(" ") : null;
51
+ }
52
+ //# sourceMappingURL=SemanticLineChart.path.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SemanticLineChart.path.utils.js","sourceRoot":"","sources":["../../../src/components/SemanticLineChart/SemanticLineChart.path.utils.ts"],"names":[],"mappings":"AAKA,gFAAgF;AAChF,MAAM,CAAC,MAAM,0CAA0C,GAAG,CAAC,CAAC;AAE5D,2EAA2E;AAC3E,MAAM,UAAU,iBAAiB,CAC/B,cAAsB,EACtB,eAAuB,0CAA0C;IAEjE,OAAO,cAAc,GAAG,YAAY,CAAC;AACvC,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,0BAA0B,CACxC,QAAiB,EACjB,cAAsB,EACtB,sBAA+B;IAE/B,IAAI,CAAC,QAAQ,IAAI,sBAAsB,EAAE,CAAC;QACxC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,iBAAiB,CAAC,cAAc,CAAC,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAiD,EACjD,UAAkB;IAElB,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAC/B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC,IAAI,IAAI,CACb,CAAC;IAErC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;QACpB,OAAO,WAAW;aACf,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;aACzE,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAEnC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAC3B,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAElC,IAAI,MAAM,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YAC7B,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,EAAE,GAAG,MAAM,CAAC;QAC1B,MAAM,KAAK,GAAG,EAAE,GAAG,MAAM,CAAC;QAE1B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,UAAU,CAAC;QACxC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,UAAU,CAAC;QACxC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,UAAU,CAAC;QACtC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,UAAU,CAAC;QAEtC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACzD,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type * as React from "react";
2
+ import type { Margin } from "recharts";
3
+ import type { ChartConfig } from "../SemanticBarChart/Chart/index.js";
4
+ export type SemanticLineChartDatum = Record<string, string | number> & {
5
+ /** Category label on the X-axis (e.g. date). */
6
+ name: string;
7
+ };
8
+ export type SemanticLineChartSeries = {
9
+ /** Key on each datum row plotted as a line. */
10
+ dataKey: string;
11
+ /** Human-readable name for tooltips, legends, and aria summaries. */
12
+ label?: string;
13
+ /**
14
+ * Override stroke and dot fill. When omitted, resolved from `chartConfig[dataKey].theme`
15
+ * or the default series palette (`SEMANTIC_LINE_CHART_SERIES_THEMES`).
16
+ */
17
+ color?: string;
18
+ };
19
+ export type SemanticLineChartProps = Omit<React.ComponentProps<"div">, "children"> & {
20
+ /** One row per X-axis category; each `series.dataKey` must exist on every row. */
21
+ data: SemanticLineChartDatum[];
22
+ /** Trend lines to render; at least one required. */
23
+ series: SemanticLineChartSeries[];
24
+ /** Extra classes on the inner `ChartContainer`. */
25
+ chartClassName?: string;
26
+ /** Recharts `<LineChart margin={...}>`. */
27
+ chartMargin?: Partial<Margin>;
28
+ /** Tooltip/legend color keys; colors default from {@link SEMANTIC_LINE_CHART_SERIES_COLORS}. */
29
+ chartConfig?: ChartConfig;
30
+ /** Optional stable id for `ChartContainer`. */
31
+ chartId?: string;
32
+ /** When set, passed to `<YAxis domain={...} />`. Omit for automatic scaling. */
33
+ yDomain?: [number, number];
34
+ /** When set, passed to `<YAxis ticks={...} />`. */
35
+ yTicks?: number[];
36
+ yTickFormatter?: (value: number) => string;
37
+ xTickFormatter?: (value: string) => string;
38
+ /** Show vertical grid lines at each X tick (default). */
39
+ gridVertical?: boolean;
40
+ /** Line stroke width in px. */
41
+ strokeWidth?: number;
42
+ /** Dot radius in px. */
43
+ dotRadius?: number;
44
+ /** Show dots at each data point (default). */
45
+ showDots?: boolean;
46
+ /** Optional tooltip layer. */
47
+ showTooltip?: boolean;
48
+ };
49
+ //# sourceMappingURL=SemanticLineChart.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SemanticLineChart.types.d.ts","sourceRoot":"","sources":["../../../src/components/SemanticLineChart/SemanticLineChart.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAEtE,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG;IACrE,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG;IACnF,kFAAkF;IAClF,IAAI,EAAE,sBAAsB,EAAE,CAAC;IAC/B,oDAAoD;IACpD,MAAM,EAAE,uBAAuB,EAAE,CAAC;IAClC,mDAAmD;IACnD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,gGAAgG;IAChG,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,yDAAyD;IACzD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8BAA8B;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SemanticLineChart.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SemanticLineChart.types.js","sourceRoot":"","sources":["../../../src/components/SemanticLineChart/SemanticLineChart.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import type { ChartConfig } from "../SemanticBarChart/Chart/index.js";
2
+ import type { SemanticLineChartSeries } from "./SemanticLineChart.types.js";
3
+ import { type SemanticLineChartSeriesTheme } from "./SemanticLineChart.variants.js";
4
+ /** Scoped CSS variable injected by `ChartContainer` / `ChartStyle` per series key. */
5
+ export declare function seriesColorVar(dataKey: string): string;
6
+ export declare function resolveSeriesTheme(item: SemanticLineChartSeries, index: number, chartConfig: ChartConfig): SemanticLineChartSeriesTheme;
7
+ export declare function buildLineChartConfig(series: SemanticLineChartSeries[], chartConfig: ChartConfig): ChartConfig;
8
+ /** Y-axis tick values that receive horizontal grid lines (excludes the bottom / domain min). */
9
+ export declare function resolveGridHorizontalValues(yTicks: number[] | undefined, yDomain: [number, number] | undefined): number[] | undefined;
10
+ /**
11
+ * Puts the hovered series last so its curve and dots render above siblings
12
+ * within Recharts' fixed z-index layers (line `400`, dot `600`).
13
+ */
14
+ export declare function orderSeriesForHover<T extends {
15
+ dataKey: string;
16
+ }>(series: readonly T[], hoveredDataKey: string | null): T[];
17
+ //# sourceMappingURL=SemanticLineChart.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SemanticLineChart.utils.d.ts","sourceRoot":"","sources":["../../../src/components/SemanticLineChart/SemanticLineChart.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,iCAAiC,CAAC;AAEzC,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAMD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,uBAAuB,EAC7B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,WAAW,GACvB,4BAA4B,CAiB9B;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,uBAAuB,EAAE,EACjC,WAAW,EAAE,WAAW,GACvB,WAAW,CAeb;AAED,gGAAgG;AAChG,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAC5B,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GACpC,MAAM,EAAE,GAAG,SAAS,CAQtB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,EAC/D,MAAM,EAAE,SAAS,CAAC,EAAE,EACpB,cAAc,EAAE,MAAM,GAAG,IAAI,GAC5B,CAAC,EAAE,CAWL"}
@@ -0,0 +1,58 @@
1
+ import { SEMANTIC_LINE_CHART_SERIES_THEMES, } from "./SemanticLineChart.variants.js";
2
+ /** Scoped CSS variable injected by `ChartContainer` / `ChartStyle` per series key. */
3
+ export function seriesColorVar(dataKey) {
4
+ return `var(--color-${dataKey})`;
5
+ }
6
+ function sameTheme(color) {
7
+ return { light: color, dark: color };
8
+ }
9
+ export function resolveSeriesTheme(item, index, chartConfig) {
10
+ if (item.color != null && item.color !== "") {
11
+ return sameTheme(item.color);
12
+ }
13
+ const existing = chartConfig[item.dataKey];
14
+ if (existing?.theme != null) {
15
+ return existing.theme;
16
+ }
17
+ if (existing?.color != null && existing.color !== "") {
18
+ return sameTheme(existing.color);
19
+ }
20
+ return SEMANTIC_LINE_CHART_SERIES_THEMES[index % SEMANTIC_LINE_CHART_SERIES_THEMES.length];
21
+ }
22
+ export function buildLineChartConfig(series, chartConfig) {
23
+ const merged = { ...chartConfig };
24
+ series.forEach((item, index) => {
25
+ if (merged[item.dataKey] != null) {
26
+ return;
27
+ }
28
+ merged[item.dataKey] = {
29
+ label: item.label ?? item.dataKey,
30
+ theme: resolveSeriesTheme(item, index, chartConfig),
31
+ };
32
+ });
33
+ return merged;
34
+ }
35
+ /** Y-axis tick values that receive horizontal grid lines (excludes the bottom / domain min). */
36
+ export function resolveGridHorizontalValues(yTicks, yDomain) {
37
+ if (yTicks == null || yTicks.length === 0) {
38
+ return undefined;
39
+ }
40
+ const min = yDomain?.[0] ?? Math.min(...yTicks);
41
+ const filtered = yTicks.filter((tick) => tick !== min);
42
+ return filtered.length > 0 ? filtered : undefined;
43
+ }
44
+ /**
45
+ * Puts the hovered series last so its curve and dots render above siblings
46
+ * within Recharts' fixed z-index layers (line `400`, dot `600`).
47
+ */
48
+ export function orderSeriesForHover(series, hoveredDataKey) {
49
+ if (hoveredDataKey == null) {
50
+ return [...series];
51
+ }
52
+ const hovered = series.find((item) => item.dataKey === hoveredDataKey);
53
+ if (hovered == null) {
54
+ return [...series];
55
+ }
56
+ return [...series.filter((item) => item.dataKey !== hoveredDataKey), hovered];
57
+ }
58
+ //# sourceMappingURL=SemanticLineChart.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SemanticLineChart.utils.js","sourceRoot":"","sources":["../../../src/components/SemanticLineChart/SemanticLineChart.utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import type { Margin } from "recharts";
2
+ import type { ChartConfig } from "../SemanticBarChart/Chart/index.js";
3
+ /** Default `LineChart` margin tuned for axis labels (Y + X). */
4
+ export declare const DEFAULT_LINE_MARGIN: Margin;
5
+ /** Figma Y-axis label column (`w-[36px]`). */
6
+ export declare const SEMANTIC_LINE_CHART_Y_LABEL_COLUMN_WIDTH = 36;
7
+ /** Figma gap between Y labels and the plot/grid (`gap-[12px]`). */
8
+ export declare const SEMANTIC_LINE_CHART_Y_LABEL_TO_GRID_GAP = 12;
9
+ /**
10
+ * Reserved Y-axis band: label column + gap before the plot.
11
+ * Keeps labels inside the card while grid lines start after the gap.
12
+ */
13
+ export declare const SEMANTIC_LINE_CHART_Y_AXIS_WIDTH: number;
14
+ /** X coordinate (textAnchor `end`) for right-aligned Y-axis labels. */
15
+ export declare const SEMANTIC_LINE_CHART_Y_LABEL_X: number;
16
+ /** Figma plot edge inset — keeps the first X label from overlapping the Y-axis column. */
17
+ export declare const SEMANTIC_LINE_CHART_X_AXIS_PADDING: {
18
+ readonly left: 20;
19
+ readonly right: 24;
20
+ };
21
+ /** Figma data-point inner diameter (`12px` → radius `6`). */
22
+ export declare const SEMANTIC_LINE_CHART_DOT_INNER_RADIUS = 6;
23
+ /** Invisible hit-target stroke width for series hover on line paths. */
24
+ export declare const SEMANTIC_LINE_CHART_HIT_STROKE_WIDTH = 16;
25
+ /** Default Recharts line layer (`DefaultZIndexes.line`). */
26
+ export declare const SEMANTIC_LINE_CHART_BASE_LINE_Z_INDEX = 400;
27
+ /** Raised line layer — above other series curves (`400`) and their dots (`600`). */
28
+ export declare const SEMANTIC_LINE_CHART_HOVERED_LINE_Z_INDEX = 650;
29
+ /** Raised dot layer for the hovered series — above its floated curve. */
30
+ export declare const SEMANTIC_LINE_CHART_HOVERED_DOTS_Z_INDEX = 700;
31
+ /** Extra stroke width applied to the hovered series curve. */
32
+ export declare const SEMANTIC_LINE_CHART_HOVER_STROKE_DELTA = 1;
33
+ /** Recharts class on visible series lines. */
34
+ export declare const SEMANTIC_LINE_CHART_SERIES_LINE_CLASS = "semantic-line-chart-series-line";
35
+ export type SemanticLineChartSeriesTheme = NonNullable<ChartConfig[string]["theme"]>;
36
+ /**
37
+ * Default light/dark stroke pairs for multi-series line charts.
38
+ * Dark values are one step richer than `chart.*` `darkValue` in `tokens.json` so
39
+ * series strokes stay distinct from `stroke-border` grid lines on navy surfaces.
40
+ */
41
+ export declare const SEMANTIC_LINE_CHART_SERIES_THEMES: readonly SemanticLineChartSeriesTheme[];
42
+ /** @deprecated Use {@link SEMANTIC_LINE_CHART_SERIES_THEMES} light values. */
43
+ export declare const SEMANTIC_LINE_CHART_SERIES_COLORS: readonly string[];
44
+ /** Recharts `XAxis` tick styling — Figma mono semibold category labels. */
45
+ export declare const semanticLineChartXAxisTick: {
46
+ readonly fill: "var(--color-semantic-fg-secondary)";
47
+ readonly fontSize: 10;
48
+ readonly fontWeight: 600;
49
+ };
50
+ /** Recharts `YAxis` tick styling — Figma mono regular percentage labels. */
51
+ export declare const semanticLineChartYAxisTick: {
52
+ readonly fill: "var(--color-semantic-fg-muted)";
53
+ readonly fontSize: 10;
54
+ readonly textAnchor: "end";
55
+ };
56
+ /** Default mount animation duration for each series line (ms). */
57
+ export declare const SEMANTIC_LINE_CHART_ANIMATION_DURATION_MS = 1000;
58
+ /** Delay between each series line starting its draw animation (ms). */
59
+ export declare const SEMANTIC_LINE_CHART_ANIMATION_STAGGER_MS = 140;
60
+ /** Recharts easing for the entry draw animation. */
61
+ export declare const SEMANTIC_LINE_CHART_ANIMATION_EASING: "ease-out";
62
+ /** Dot opacity fade-in after line entry animation completes (ms). */
63
+ export declare const SEMANTIC_LINE_CHART_DOTS_FADE_IN_MS = 500;
64
+ /** Debounce Recharts resize updates to reduce jank while the container animates. */
65
+ export declare const SEMANTIC_LINE_CHART_RESIZE_DEBOUNCE_MS = 50;
66
+ /** Recharts axis/grid overrides applied on the inner `ChartContainer`. */
67
+ export declare const semanticLineChartChartContainerVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
68
+ //# sourceMappingURL=SemanticLineChart.variants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SemanticLineChart.variants.d.ts","sourceRoot":"","sources":["../../../src/components/SemanticLineChart/SemanticLineChart.variants.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAEtE,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,EAAE,MAKjC,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,wCAAwC,KAAK,CAAC;AAE3D,mEAAmE;AACnE,eAAO,MAAM,uCAAuC,KAAK,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,gCAAgC,QACuC,CAAC;AAErF,uEAAuE;AACvE,eAAO,MAAM,6BAA6B,QAC2B,CAAC;AAEtE,0FAA0F;AAC1F,eAAO,MAAM,kCAAkC;;;CAGrC,CAAC;AAEX,6DAA6D;AAC7D,eAAO,MAAM,oCAAoC,IAAI,CAAC;AAEtD,wEAAwE;AACxE,eAAO,MAAM,oCAAoC,KAAK,CAAC;AAEvD,4DAA4D;AAC5D,eAAO,MAAM,qCAAqC,MAAM,CAAC;AAEzD,oFAAoF;AACpF,eAAO,MAAM,wCAAwC,MAAM,CAAC;AAE5D,yEAAyE;AACzE,eAAO,MAAM,wCAAwC,MAAM,CAAC;AAE5D,8DAA8D;AAC9D,eAAO,MAAM,sCAAsC,IAAI,CAAC;AAExD,8CAA8C;AAC9C,eAAO,MAAM,qCAAqC,oCAAoC,CAAC;AAEvF,MAAM,MAAM,4BAA4B,GAAG,WAAW,CACpD,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAC7B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,EAAE,SAAS,4BAA4B,EAYzE,CAAC;AAEb,8EAA8E;AAC9E,eAAO,MAAM,iCAAiC,EAEzC,SAAS,MAAM,EAAE,CAAC;AAEvB,2EAA2E;AAC3E,eAAO,MAAM,0BAA0B;;;;CAI7B,CAAC;AAEX,4EAA4E;AAC5E,eAAO,MAAM,0BAA0B;;;;CAI7B,CAAC;AAEX,kEAAkE;AAClE,eAAO,MAAM,yCAAyC,OAAO,CAAC;AAE9D,uEAAuE;AACvE,eAAO,MAAM,wCAAwC,MAAM,CAAC;AAE5D,oDAAoD;AACpD,eAAO,MAAM,oCAAoC,EAAG,UAAmB,CAAC;AAExE,qEAAqE;AACrE,eAAO,MAAM,mCAAmC,MAAM,CAAC;AAEvD,oFAAoF;AACpF,eAAO,MAAM,sCAAsC,KAAK,CAAC;AAEzD,0EAA0E;AAC1E,eAAO,MAAM,uCAAuC,oFAgBlD,CAAC"}
@@ -0,0 +1,98 @@
1
+ import { cva } from "class-variance-authority";
2
+ /** Default `LineChart` margin tuned for axis labels (Y + X). */
3
+ export const DEFAULT_LINE_MARGIN = {
4
+ top: 10,
5
+ right: 24,
6
+ bottom: 32,
7
+ left: 8,
8
+ };
9
+ /** Figma Y-axis label column (`w-[36px]`). */
10
+ export const SEMANTIC_LINE_CHART_Y_LABEL_COLUMN_WIDTH = 36;
11
+ /** Figma gap between Y labels and the plot/grid (`gap-[12px]`). */
12
+ export const SEMANTIC_LINE_CHART_Y_LABEL_TO_GRID_GAP = 12;
13
+ /**
14
+ * Reserved Y-axis band: label column + gap before the plot.
15
+ * Keeps labels inside the card while grid lines start after the gap.
16
+ */
17
+ export const SEMANTIC_LINE_CHART_Y_AXIS_WIDTH = SEMANTIC_LINE_CHART_Y_LABEL_COLUMN_WIDTH + SEMANTIC_LINE_CHART_Y_LABEL_TO_GRID_GAP;
18
+ /** X coordinate (textAnchor `end`) for right-aligned Y-axis labels. */
19
+ export const SEMANTIC_LINE_CHART_Y_LABEL_X = DEFAULT_LINE_MARGIN.left + SEMANTIC_LINE_CHART_Y_LABEL_COLUMN_WIDTH;
20
+ /** Figma plot edge inset — keeps the first X label from overlapping the Y-axis column. */
21
+ export const SEMANTIC_LINE_CHART_X_AXIS_PADDING = {
22
+ left: 20,
23
+ right: 24,
24
+ };
25
+ /** Figma data-point inner diameter (`12px` → radius `6`). */
26
+ export const SEMANTIC_LINE_CHART_DOT_INNER_RADIUS = 6;
27
+ /** Invisible hit-target stroke width for series hover on line paths. */
28
+ export const SEMANTIC_LINE_CHART_HIT_STROKE_WIDTH = 16;
29
+ /** Default Recharts line layer (`DefaultZIndexes.line`). */
30
+ export const SEMANTIC_LINE_CHART_BASE_LINE_Z_INDEX = 400;
31
+ /** Raised line layer — above other series curves (`400`) and their dots (`600`). */
32
+ export const SEMANTIC_LINE_CHART_HOVERED_LINE_Z_INDEX = 650;
33
+ /** Raised dot layer for the hovered series — above its floated curve. */
34
+ export const SEMANTIC_LINE_CHART_HOVERED_DOTS_Z_INDEX = 700;
35
+ /** Extra stroke width applied to the hovered series curve. */
36
+ export const SEMANTIC_LINE_CHART_HOVER_STROKE_DELTA = 1;
37
+ /** Recharts class on visible series lines. */
38
+ export const SEMANTIC_LINE_CHART_SERIES_LINE_CLASS = "semantic-line-chart-series-line";
39
+ /**
40
+ * Default light/dark stroke pairs for multi-series line charts.
41
+ * Dark values are one step richer than `chart.*` `darkValue` in `tokens.json` so
42
+ * series strokes stay distinct from `stroke-border` grid lines on navy surfaces.
43
+ */
44
+ export const SEMANTIC_LINE_CHART_SERIES_THEMES = [
45
+ { light: "var(--color-blue-500)", dark: "var(--color-blue-400)" },
46
+ { light: "var(--color-yellow-500)", dark: "var(--color-yellow-500)" },
47
+ { light: "var(--color-blue-400)", dark: "var(--color-blue-400)" },
48
+ { light: "var(--color-blue-500)", dark: "var(--color-blue-500)" },
49
+ { light: "var(--color-red-500)", dark: "var(--color-red-500)" },
50
+ { light: "var(--color-green-500)", dark: "var(--color-green-500)" },
51
+ { light: "var(--color-blue-300)", dark: "var(--color-blue-400)" },
52
+ { light: "var(--color-red-400)", dark: "var(--color-red-500)" },
53
+ { light: "var(--color-green-400)", dark: "var(--color-green-500)" },
54
+ { light: "var(--color-blue-300)", dark: "var(--color-blue-400)" },
55
+ ];
56
+ /** @deprecated Use {@link SEMANTIC_LINE_CHART_SERIES_THEMES} light values. */
57
+ export const SEMANTIC_LINE_CHART_SERIES_COLORS = SEMANTIC_LINE_CHART_SERIES_THEMES.map((theme) => theme.light);
58
+ /** Recharts `XAxis` tick styling — Figma mono semibold category labels. */
59
+ export const semanticLineChartXAxisTick = {
60
+ fill: "var(--color-semantic-fg-secondary)",
61
+ fontSize: 10,
62
+ fontWeight: 600,
63
+ };
64
+ /** Recharts `YAxis` tick styling — Figma mono regular percentage labels. */
65
+ export const semanticLineChartYAxisTick = {
66
+ fill: "var(--color-semantic-fg-muted)",
67
+ fontSize: 10,
68
+ textAnchor: "end",
69
+ };
70
+ /** Default mount animation duration for each series line (ms). */
71
+ export const SEMANTIC_LINE_CHART_ANIMATION_DURATION_MS = 1000;
72
+ /** Delay between each series line starting its draw animation (ms). */
73
+ export const SEMANTIC_LINE_CHART_ANIMATION_STAGGER_MS = 140;
74
+ /** Recharts easing for the entry draw animation. */
75
+ export const SEMANTIC_LINE_CHART_ANIMATION_EASING = "ease-out";
76
+ /** Dot opacity fade-in after line entry animation completes (ms). */
77
+ export const SEMANTIC_LINE_CHART_DOTS_FADE_IN_MS = 500;
78
+ /** Debounce Recharts resize updates to reduce jank while the container animates. */
79
+ export const SEMANTIC_LINE_CHART_RESIZE_DEBOUNCE_MS = 50;
80
+ /** Recharts axis/grid overrides applied on the inner `ChartContainer`. */
81
+ export const semanticLineChartChartContainerVariants = cva([
82
+ "aspect-auto h-[221px] w-full overflow-visible",
83
+ "[&_.recharts-cartesian-grid-horizontal_line[stroke='#ccc']]:stroke-border/20",
84
+ "[&_.recharts-cartesian-grid-vertical_line[stroke='#ccc']]:stroke-border/20",
85
+ "dark:[&_.recharts-cartesian-grid-horizontal_line[stroke='#ccc']]:stroke-border/50",
86
+ "dark:[&_.recharts-cartesian-grid-vertical_line[stroke='#ccc']]:stroke-border/50",
87
+ "[&_.semantic-line-chart-series-line_.recharts-line-curve]:pointer-events-none",
88
+ "[&_.semantic-line-chart-series-hit-line_.semantic-line-chart-series-hit-curve]:pointer-events-auto",
89
+ "data-[entry-animating]:[&_.semantic-line-chart-series-hit-line_.semantic-line-chart-series-hit-curve]:pointer-events-none",
90
+ "[&_.recharts-active-dot]:pointer-events-none",
91
+ "[&_.recharts-wrapper]:outline-none",
92
+ "[&_.recharts-surface]:outline-none",
93
+ "[&_.recharts-surface:focus]:outline-none",
94
+ "[&_.recharts-surface:focus-visible]:outline-none",
95
+ "[&_.recharts-xAxis_.recharts-cartesian-axis-tick_text]:font-mono",
96
+ "[&_.recharts-yAxis_.recharts-cartesian-axis-tick_text]:font-mono",
97
+ ]);
98
+ //# sourceMappingURL=SemanticLineChart.variants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SemanticLineChart.variants.js","sourceRoot":"","sources":["../../../src/components/SemanticLineChart/SemanticLineChart.variants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAK/C,gEAAgE;AAChE,MAAM,CAAC,MAAM,mBAAmB,GAAW;IACzC,GAAG,EAAE,EAAE;IACP,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,CAAC;CACR,CAAC;AAEF,8CAA8C;AAC9C,MAAM,CAAC,MAAM,wCAAwC,GAAG,EAAE,CAAC;AAE3D,mEAAmE;AACnE,MAAM,CAAC,MAAM,uCAAuC,GAAG,EAAE,CAAC;AAE1D;;;GAGG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAC3C,wCAAwC,GAAG,uCAAuC,CAAC;AAErF,uEAAuE;AACvE,MAAM,CAAC,MAAM,6BAA6B,GACxC,mBAAmB,CAAC,IAAI,GAAG,wCAAwC,CAAC;AAEtE,0FAA0F;AAC1F,MAAM,CAAC,MAAM,kCAAkC,GAAG;IAChD,IAAI,EAAE,EAAE;IACR,KAAK,EAAE,EAAE;CACD,CAAC;AAEX,6DAA6D;AAC7D,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAAC,CAAC;AAEtD,wEAAwE;AACxE,MAAM,CAAC,MAAM,oCAAoC,GAAG,EAAE,CAAC;AAEvD,4DAA4D;AAC5D,MAAM,CAAC,MAAM,qCAAqC,GAAG,GAAG,CAAC;AAEzD,oFAAoF;AACpF,MAAM,CAAC,MAAM,wCAAwC,GAAG,GAAG,CAAC;AAE5D,yEAAyE;AACzE,MAAM,CAAC,MAAM,wCAAwC,GAAG,GAAG,CAAC;AAE5D,8DAA8D;AAC9D,MAAM,CAAC,MAAM,sCAAsC,GAAG,CAAC,CAAC;AAExD,8CAA8C;AAC9C,MAAM,CAAC,MAAM,qCAAqC,GAAG,iCAAiC,CAAC;AAMvF;;;;GAIG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAC5C;IACE,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjE,EAAE,KAAK,EAAE,yBAAyB,EAAE,IAAI,EAAE,yBAAyB,EAAE;IACrE,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjE,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjE,EAAE,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,sBAAsB,EAAE;IAC/D,EAAE,KAAK,EAAE,wBAAwB,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACnE,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjE,EAAE,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,sBAAsB,EAAE;IAC/D,EAAE,KAAK,EAAE,wBAAwB,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACnE,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,uBAAuB,EAAE;CACzD,CAAC;AAEb,8EAA8E;AAC9E,MAAM,CAAC,MAAM,iCAAiC,GAAG,iCAAiC,CAAC,GAAG,CACpF,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CACF,CAAC;AAEvB,2EAA2E;AAC3E,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,IAAI,EAAE,oCAAoC;IAC1C,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,GAAG;CACP,CAAC;AAEX,4EAA4E;AAC5E,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,IAAI,EAAE,gCAAgC;IACtC,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,KAAc;CAClB,CAAC;AAEX,kEAAkE;AAClE,MAAM,CAAC,MAAM,yCAAyC,GAAG,IAAI,CAAC;AAE9D,uEAAuE;AACvE,MAAM,CAAC,MAAM,wCAAwC,GAAG,GAAG,CAAC;AAE5D,oDAAoD;AACpD,MAAM,CAAC,MAAM,oCAAoC,GAAG,UAAmB,CAAC;AAExE,qEAAqE;AACrE,MAAM,CAAC,MAAM,mCAAmC,GAAG,GAAG,CAAC;AAEvD,oFAAoF;AACpF,MAAM,CAAC,MAAM,sCAAsC,GAAG,EAAE,CAAC;AAEzD,0EAA0E;AAC1E,MAAM,CAAC,MAAM,uCAAuC,GAAG,GAAG,CAAC;IACzD,+CAA+C;IAC/C,8EAA8E;IAC9E,4EAA4E;IAC5E,mFAAmF;IACnF,iFAAiF;IACjF,+EAA+E;IAC/E,oGAAoG;IACpG,2HAA2H;IAC3H,8CAA8C;IAC9C,oCAAoC;IACpC,oCAAoC;IACpC,0CAA0C;IAC1C,kDAAkD;IAClD,kEAAkE;IAClE,kEAAkE;CACnE,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { DotProps } from "recharts";
2
+ import type * as React from "react";
3
+ type SemanticLineChartDotProps = DotProps & {
4
+ fill?: string;
5
+ /** Dot radius in px; defaults to Figma `12px` diameter. */
6
+ innerRadius?: number;
7
+ style?: React.CSSProperties;
8
+ };
9
+ /** Figma line-chart marker — solid inner dot only; gaps come from trimmed line segments. */
10
+ export declare function SemanticLineChartDot({ cx, cy, fill, innerRadius, className, style, }: SemanticLineChartDotProps): import("react/jsx-runtime").JSX.Element | null;
11
+ export {};
12
+ //# sourceMappingURL=SemanticLineChartDot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SemanticLineChartDot.d.ts","sourceRoot":"","sources":["../../../src/components/SemanticLineChart/SemanticLineChartDot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAIpC,KAAK,yBAAyB,GAAG,QAAQ,GAAG;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,CAAC;AAEF,4FAA4F;AAC5F,wBAAgB,oBAAoB,CAAC,EACnC,EAAE,EACF,EAAE,EACF,IAAI,EACJ,WAAkD,EAClD,SAAS,EACT,KAAK,GACN,EAAE,yBAAyB,kDAgB3B"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { SEMANTIC_LINE_CHART_DOT_INNER_RADIUS } from "./SemanticLineChart.variants.js";
3
+ /** Figma line-chart marker — solid inner dot only; gaps come from trimmed line segments. */
4
+ export function SemanticLineChartDot({ cx, cy, fill, innerRadius = SEMANTIC_LINE_CHART_DOT_INNER_RADIUS, className, style, }) {
5
+ if (cx == null || cy == null || fill == null) {
6
+ return null;
7
+ }
8
+ return (_jsx("circle", { className: className ?? "recharts-dot semantic-line-chart-dot", cx: cx, cy: cy, r: innerRadius, fill: fill, stroke: "none", style: style }));
9
+ }
10
+ //# sourceMappingURL=SemanticLineChartDot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SemanticLineChartDot.js","sourceRoot":"","sources":["../../../src/components/SemanticLineChart/SemanticLineChartDot.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,oCAAoC,EAAE,MAAM,iCAAiC,CAAC;AASvF,4FAA4F;AAC5F,MAAM,UAAU,oBAAoB,CAAC,EACnC,EAAE,EACF,EAAE,EACF,IAAI,EACJ,WAAW,GAAG,oCAAoC,EAClD,SAAS,EACT,KAAK,GACqB;IAC1B,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,iBACE,SAAS,EAAE,SAAS,IAAI,sCAAsC,EAC9D,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,EAAE,EACN,CAAC,EAAE,WAAW,EACd,IAAI,EAAE,IAAI,EACV,MAAM,EAAC,MAAM,EACb,KAAK,EAAE,KAAK,GACZ,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { SemanticLineChartProps } from "./SemanticLineChart.types.js";
2
+ type SemanticLineChartGridProps = Pick<SemanticLineChartProps, "gridVertical" | "yDomain" | "yTicks">;
3
+ /**
4
+ * Figma-aligned grid: internal guides within the plot, with gaps before axis
5
+ * labels and no left/right/bottom perimeter border lines.
6
+ */
7
+ export declare function SemanticLineChartGrid({ gridVertical, yDomain, yTicks, }: SemanticLineChartGridProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=SemanticLineChartGrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SemanticLineChartGrid.d.ts","sourceRoot":"","sources":["../../../src/components/SemanticLineChart/SemanticLineChartGrid.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAwF3E,KAAK,0BAA0B,GAAG,IAAI,CACpC,sBAAsB,EACtB,cAAc,GAAG,SAAS,GAAG,QAAQ,CACtC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,YAAmB,EACnB,OAAO,EACP,MAAM,GACP,EAAE,0BAA0B,2CAa5B"}