@jiwambe/components 0.3.4 → 0.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +8 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +10 -0
- package/dist/client.js.map +1 -1
- package/dist/components/Accordion/Accordion.test.d.ts +2 -0
- package/dist/components/Accordion/Accordion.test.d.ts.map +1 -0
- package/dist/components/BarGraph/BarGraph.d.ts +66 -0
- package/dist/components/BarGraph/BarGraph.d.ts.map +1 -0
- package/dist/components/BarGraph/BarGraph.js +151 -0
- package/dist/components/BarGraph/BarGraph.js.map +1 -0
- package/dist/components/BarGraph/BarGraph.test.d.ts +1 -0
- package/dist/components/BarGraph/BarGraph.test.d.ts.map +1 -0
- package/dist/components/BarGraph/BarGraphSkeleton.d.ts +12 -0
- package/dist/components/BarGraph/BarGraphSkeleton.d.ts.map +1 -0
- package/dist/components/BarGraph/BarGraphSkeleton.js +36 -0
- package/dist/components/BarGraph/BarGraphSkeleton.js.map +1 -0
- package/dist/components/Box/Box.test.d.ts +15 -0
- package/dist/components/Box/Box.test.d.ts.map +1 -0
- package/dist/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
- package/dist/components/Breadcrumb/Breadcrumb.js +89 -0
- package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -0
- package/dist/components/Button/Button.test.d.ts +2 -0
- package/dist/components/Button/Button.test.d.ts.map +1 -0
- package/dist/components/Card/Card.d.ts +57 -43
- package/dist/components/Card/Card.d.ts.map +1 -1
- package/dist/components/Card/Card.js +51 -89
- package/dist/components/Card/Card.js.map +1 -1
- package/dist/components/Card/Card.test.d.ts +2 -0
- package/dist/components/Card/Card.test.d.ts.map +1 -0
- package/dist/components/CheckboxGroup/CheckboxGroup.test.d.ts +2 -0
- package/dist/components/CheckboxGroup/CheckboxGroup.test.d.ts.map +1 -0
- package/dist/components/Container/Container.test.d.ts +2 -0
- package/dist/components/Container/Container.test.d.ts.map +1 -0
- package/dist/components/DataTable/DataTable.d.ts +74 -0
- package/dist/components/DataTable/DataTable.d.ts.map +1 -0
- package/dist/components/DataTable/DataTable.js +183 -0
- package/dist/components/DataTable/DataTable.js.map +1 -0
- package/dist/components/DataTable/DataTable.test.d.ts +2 -0
- package/dist/components/DataTable/DataTable.test.d.ts.map +1 -0
- package/dist/components/DataTable/DataTableCell.d.ts +15 -0
- package/dist/components/DataTable/DataTableCell.d.ts.map +1 -0
- package/dist/components/DataTable/DataTableCell.js +24 -0
- package/dist/components/DataTable/DataTableCell.js.map +1 -0
- package/dist/components/DataTable/DataTableHeader.d.ts +31 -0
- package/dist/components/DataTable/DataTableHeader.d.ts.map +1 -0
- package/dist/components/DataTable/DataTableHeader.js +83 -0
- package/dist/components/DataTable/DataTableHeader.js.map +1 -0
- package/dist/components/DataTable/DataTablePagination.d.ts +26 -0
- package/dist/components/DataTable/DataTablePagination.d.ts.map +1 -0
- package/dist/components/DataTable/DataTablePagination.js +115 -0
- package/dist/components/DataTable/DataTablePagination.js.map +1 -0
- package/dist/components/DataTable/DataTableReviewerCell.d.ts +18 -0
- package/dist/components/DataTable/DataTableReviewerCell.d.ts.map +1 -0
- package/dist/components/DataTable/DataTableReviewerCell.js +31 -0
- package/dist/components/DataTable/DataTableReviewerCell.js.map +1 -0
- package/dist/components/DataTable/DataTableRow.d.ts +35 -0
- package/dist/components/DataTable/DataTableRow.d.ts.map +1 -0
- package/dist/components/DataTable/DataTableRow.js +77 -0
- package/dist/components/DataTable/DataTableRow.js.map +1 -0
- package/dist/components/DataTable/DataTableRowMenu.d.ts +25 -0
- package/dist/components/DataTable/DataTableRowMenu.d.ts.map +1 -0
- package/dist/components/DataTable/DataTableRowMenu.js +60 -0
- package/dist/components/DataTable/DataTableRowMenu.js.map +1 -0
- package/dist/components/DataTable/DataTableStatusBadge.d.ts +16 -0
- package/dist/components/DataTable/DataTableStatusBadge.d.ts.map +1 -0
- package/dist/components/DataTable/DataTableStatusBadge.js +37 -0
- package/dist/components/DataTable/DataTableStatusBadge.js.map +1 -0
- package/dist/components/DataTable/DataTableToolbar.d.ts +32 -0
- package/dist/components/DataTable/DataTableToolbar.d.ts.map +1 -0
- package/dist/components/DataTable/DataTableToolbar.js +37 -0
- package/dist/components/DataTable/DataTableToolbar.js.map +1 -0
- package/dist/components/DateInput/DateInput.test.d.ts +2 -0
- package/dist/components/DateInput/DateInput.test.d.ts.map +1 -0
- package/dist/components/Dialog/Dialog.d.ts +28 -0
- package/dist/components/Dialog/Dialog.d.ts.map +1 -0
- package/dist/components/Dialog/Dialog.js +34 -0
- package/dist/components/Dialog/Dialog.js.map +1 -0
- package/dist/components/Dialog/Dialog.test.d.ts +2 -0
- package/dist/components/Dialog/Dialog.test.d.ts.map +1 -0
- package/dist/components/Divider/Divider.test.d.ts +2 -0
- package/dist/components/Divider/Divider.test.d.ts.map +1 -0
- package/dist/components/Drawer/Drawer.test.d.ts +2 -0
- package/dist/components/Drawer/Drawer.test.d.ts.map +1 -0
- package/dist/components/FAQ/FAQ.test.d.ts +2 -0
- package/dist/components/FAQ/FAQ.test.d.ts.map +1 -0
- package/dist/components/Grid/Grid.d.ts +6 -6
- package/dist/components/Grid/Grid.js.map +1 -1
- package/dist/components/Grid/Grid.test.d.ts +2 -0
- package/dist/components/Grid/Grid.test.d.ts.map +1 -0
- package/dist/components/Icon/Icon.d.ts +17 -13
- package/dist/components/Icon/Icon.d.ts.map +1 -1
- package/dist/components/Icon/Icon.js +12 -162
- package/dist/components/Icon/Icon.js.map +1 -1
- package/dist/components/Icon/Icon.test.d.ts +2 -0
- package/dist/components/Icon/Icon.test.d.ts.map +1 -0
- package/dist/components/JiwambeCard/JiwambeCard.d.ts +54 -0
- package/dist/components/JiwambeCard/JiwambeCard.d.ts.map +1 -0
- package/dist/components/JiwambeCard/JiwambeCard.js +101 -0
- package/dist/components/JiwambeCard/JiwambeCard.js.map +1 -0
- package/dist/components/JiwambeCard/JiwambeCard.test.d.ts +2 -0
- package/dist/components/JiwambeCard/JiwambeCard.test.d.ts.map +1 -0
- package/dist/components/LineGraph/LineGraph.d.ts +40 -0
- package/dist/components/LineGraph/LineGraph.d.ts.map +1 -0
- package/dist/components/LineGraph/LineGraph.js +176 -0
- package/dist/components/LineGraph/LineGraph.js.map +1 -0
- package/dist/components/LineGraph/LineGraph.test.d.ts +1 -0
- package/dist/components/LineGraph/LineGraph.test.d.ts.map +1 -0
- package/dist/components/LineGraph/LineGraphLegend.d.ts +17 -0
- package/dist/components/LineGraph/LineGraphLegend.d.ts.map +1 -0
- package/dist/components/LineGraph/LineGraphLegend.js +56 -0
- package/dist/components/LineGraph/LineGraphLegend.js.map +1 -0
- package/dist/components/LineGraph/LineGraphSkeleton.d.ts +12 -0
- package/dist/components/LineGraph/LineGraphSkeleton.d.ts.map +1 -0
- package/dist/components/LineGraph/LineGraphSkeleton.js +21 -0
- package/dist/components/LineGraph/LineGraphSkeleton.js.map +1 -0
- package/dist/components/LineGraph/LineGraphTooltip.d.ts +12 -0
- package/dist/components/LineGraph/LineGraphTooltip.d.ts.map +1 -0
- package/dist/components/LineGraph/LineGraphTooltip.js +41 -0
- package/dist/components/LineGraph/LineGraphTooltip.js.map +1 -0
- package/dist/components/LineGraph/lineGraphUtils.d.ts +33 -0
- package/dist/components/LineGraph/lineGraphUtils.d.ts.map +1 -0
- package/dist/components/LineGraph/lineGraphUtils.js +62 -0
- package/dist/components/LineGraph/lineGraphUtils.js.map +1 -0
- package/dist/components/LineGraph/types.d.ts +21 -0
- package/dist/components/LineGraph/types.d.ts.map +1 -0
- package/dist/components/Link/Link.test.d.ts +2 -0
- package/dist/components/Link/Link.test.d.ts.map +1 -0
- package/dist/components/List/List.d.ts +5 -3
- package/dist/components/List/List.d.ts.map +1 -1
- package/dist/components/List/List.js +35 -6
- package/dist/components/List/List.js.map +1 -1
- package/dist/components/List/List.test.d.ts +2 -0
- package/dist/components/List/List.test.d.ts.map +1 -0
- package/dist/components/Overlay/Overlay.test.d.ts +2 -0
- package/dist/components/Overlay/Overlay.test.d.ts.map +1 -0
- package/dist/components/PhoneInput/PhoneInput.test.d.ts +2 -0
- package/dist/components/PhoneInput/PhoneInput.test.d.ts.map +1 -0
- package/dist/components/Popover/Popover.test.d.ts +2 -0
- package/dist/components/Popover/Popover.test.d.ts.map +1 -0
- package/dist/components/ProductCard/ProductCard.d.ts +12 -0
- package/dist/components/ProductCard/ProductCard.d.ts.map +1 -1
- package/dist/components/ProductCard/ProductCard.js +25 -10
- package/dist/components/ProductCard/ProductCard.js.map +1 -1
- package/dist/components/ProductCard/ProductCard.test.d.ts +2 -0
- package/dist/components/ProductCard/ProductCard.test.d.ts.map +1 -0
- package/dist/components/ProductImage/ProductImage.test.d.ts +2 -0
- package/dist/components/ProductImage/ProductImage.test.d.ts.map +1 -0
- package/dist/components/RadioGroup/RadioGroup.test.d.ts +2 -0
- package/dist/components/RadioGroup/RadioGroup.test.d.ts.map +1 -0
- package/dist/components/Section/Section.test.d.ts +2 -0
- package/dist/components/Section/Section.test.d.ts.map +1 -0
- package/dist/components/Select/Select.test.d.ts +2 -0
- package/dist/components/Select/Select.test.d.ts.map +1 -0
- package/dist/components/SelectTab/SelectTab.test.d.ts +2 -0
- package/dist/components/SelectTab/SelectTab.test.d.ts.map +1 -0
- package/dist/components/Skeleton/Skeleton.d.ts +4 -4
- package/dist/components/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/components/Skeleton/Skeleton.js +1 -1
- package/dist/components/Skeleton/Skeleton.js.map +1 -1
- package/dist/components/Skeleton/Skeleton.test.d.ts +2 -0
- package/dist/components/Skeleton/Skeleton.test.d.ts.map +1 -0
- package/dist/components/Slider/Slider.test.d.ts +2 -0
- package/dist/components/Slider/Slider.test.d.ts.map +1 -0
- package/dist/components/Stack/Stack.test.d.ts +2 -0
- package/dist/components/Stack/Stack.test.d.ts.map +1 -0
- package/dist/components/Tab/Tab.test.d.ts +2 -0
- package/dist/components/Tab/Tab.test.d.ts.map +1 -0
- package/dist/components/TextArea/TextArea.test.d.ts +2 -0
- package/dist/components/TextArea/TextArea.test.d.ts.map +1 -0
- package/dist/components/TextInput/TextInput.test.d.ts +2 -0
- package/dist/components/TextInput/TextInput.test.d.ts.map +1 -0
- package/dist/components/Toggle/Toggle.test.d.ts +2 -0
- package/dist/components/Toggle/Toggle.test.d.ts.map +1 -0
- package/dist/components/Typography/Typography.test.d.ts +15 -0
- package/dist/components/Typography/Typography.test.d.ts.map +1 -0
- package/dist/components/UploadInput/UploadInput.test.d.ts +2 -0
- package/dist/components/UploadInput/UploadInput.test.d.ts.map +1 -0
- package/dist/components/index.d.ts +18 -3
- package/dist/components/index.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/node_modules/.pnpm/@jiwambe_icons@0.3.1_react@19.2.4/node_modules/@jiwambe/icons/dist/icons/Check.js +10 -0
- package/dist/node_modules/.pnpm/@jiwambe_icons@0.3.1_react@19.2.4/node_modules/@jiwambe/icons/dist/icons/Check.js.map +1 -0
- package/dist/node_modules/.pnpm/@jiwambe_icons@0.3.1_react@19.2.4/node_modules/@jiwambe/icons/dist/icons/ChevronLeft.js +10 -0
- package/dist/node_modules/.pnpm/@jiwambe_icons@0.3.1_react@19.2.4/node_modules/@jiwambe/icons/dist/icons/ChevronLeft.js.map +1 -0
- package/dist/node_modules/.pnpm/@jiwambe_icons@0.3.1_react@19.2.4/node_modules/@jiwambe/icons/dist/icons/ChevronRight.js +10 -0
- package/dist/node_modules/.pnpm/@jiwambe_icons@0.3.1_react@19.2.4/node_modules/@jiwambe/icons/dist/icons/ChevronRight.js.map +1 -0
- package/dist/plugin/jiwambe-plugin.d.ts.map +1 -1
- package/dist/plugin/jiwambe-plugin.js +5 -0
- package/dist/plugin/jiwambe-plugin.js.map +1 -1
- package/dist/server.d.ts +3 -3
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -2
- package/dist/types/list.d.ts +4 -3
- package/dist/types/list.d.ts.map +1 -1
- package/dist/types/list.js.map +1 -1
- package/dist/utils/layoutClasses.test.d.ts +2 -0
- package/dist/utils/layoutClasses.test.d.ts.map +1 -0
- package/dist/utils/spacing.test.d.ts +2 -0
- package/dist/utils/spacing.test.d.ts.map +1 -0
- package/package.json +5 -3
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useEffect, useMemo } from "react";
|
|
4
|
+
import { ResponsiveContainer, LineChart, CartesianGrid, XAxis, YAxis, Tooltip, Line } from "recharts";
|
|
5
|
+
import { Typography } from "../Typography/Typography.js";
|
|
6
|
+
import { Stack } from "../Stack/Stack.js";
|
|
7
|
+
import { LineGraphSkeleton } from "./LineGraphSkeleton.js";
|
|
8
|
+
import { LineGraphLegend } from "./LineGraphLegend.js";
|
|
9
|
+
import { LineGraphTooltip } from "./LineGraphTooltip.js";
|
|
10
|
+
import { validateSeries, getSeriesColor } from "./lineGraphUtils.js";
|
|
11
|
+
function LineGraph({
|
|
12
|
+
series,
|
|
13
|
+
title,
|
|
14
|
+
description,
|
|
15
|
+
xAxisLabel,
|
|
16
|
+
yAxisLabel,
|
|
17
|
+
xTickFormatter,
|
|
18
|
+
yTickFormatter,
|
|
19
|
+
tooltipValueFormatter,
|
|
20
|
+
height = 320,
|
|
21
|
+
loading = false,
|
|
22
|
+
showGrid = true,
|
|
23
|
+
legendPosition = "bottom",
|
|
24
|
+
interactiveLegend = true,
|
|
25
|
+
onDataPointClick,
|
|
26
|
+
className = ""
|
|
27
|
+
}) {
|
|
28
|
+
const [hiddenIds, setHiddenIds] = useState([]);
|
|
29
|
+
const [mounted, setMounted] = useState(false);
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
setMounted(true);
|
|
32
|
+
validateSeries(series);
|
|
33
|
+
}, [series]);
|
|
34
|
+
const chartData = useMemo(() => {
|
|
35
|
+
if (!series.length) return [];
|
|
36
|
+
return series[0].data.map((point) => {
|
|
37
|
+
const entry = { x: point.x };
|
|
38
|
+
series.forEach((s) => {
|
|
39
|
+
const p = s.data.find((dp) => dp.x === point.x);
|
|
40
|
+
if (p) {
|
|
41
|
+
entry[s.id] = p.y;
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
return entry;
|
|
45
|
+
});
|
|
46
|
+
}, [series]);
|
|
47
|
+
const handleToggle = (id) => {
|
|
48
|
+
setHiddenIds(
|
|
49
|
+
(prev) => prev.includes(id) ? prev.filter((item) => item !== id) : [...prev, id]
|
|
50
|
+
);
|
|
51
|
+
};
|
|
52
|
+
const [colors, setColors] = useState({
|
|
53
|
+
grid: "#e5e5e5",
|
|
54
|
+
// Fallback neutral-200
|
|
55
|
+
tick: "#737373"
|
|
56
|
+
// Fallback text-secondary (neutral-500)
|
|
57
|
+
});
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
if (!mounted) return;
|
|
60
|
+
const style = getComputedStyle(document.documentElement);
|
|
61
|
+
const grid = style.getPropertyValue("--color-neutral-200").trim();
|
|
62
|
+
const tick = style.getPropertyValue("--color-text-secondary").trim();
|
|
63
|
+
setColors({
|
|
64
|
+
grid: grid || "#e5e5e5",
|
|
65
|
+
tick: tick || "#737373"
|
|
66
|
+
});
|
|
67
|
+
}, [mounted]);
|
|
68
|
+
if (loading) {
|
|
69
|
+
return /* @__PURE__ */ jsx(LineGraphSkeleton, { height, showTitle: !!title });
|
|
70
|
+
}
|
|
71
|
+
if (!mounted) {
|
|
72
|
+
return /* @__PURE__ */ jsx("div", { style: { height, width: "100%" }, className });
|
|
73
|
+
}
|
|
74
|
+
return /* @__PURE__ */ jsxs(
|
|
75
|
+
"figure",
|
|
76
|
+
{
|
|
77
|
+
role: "figure",
|
|
78
|
+
"aria-label": title ?? "Line graph",
|
|
79
|
+
className: ["flex flex-col w-full min-w-0", className].filter(Boolean).join(" "),
|
|
80
|
+
children: [
|
|
81
|
+
(title || description) && /* @__PURE__ */ jsxs(Stack, { spacing: "space-0-25", className: "mb-space-6", children: [
|
|
82
|
+
title && /* @__PURE__ */ jsx(Typography, { variant: "title-md", as: "h3", children: title }),
|
|
83
|
+
description && /* @__PURE__ */ jsx(Typography, { variant: "text-xs", className: "text-text-secondary", children: description })
|
|
84
|
+
] }),
|
|
85
|
+
legendPosition === "top" && /* @__PURE__ */ jsx("div", { className: "mb-space-4", children: /* @__PURE__ */ jsx(
|
|
86
|
+
LineGraphLegend,
|
|
87
|
+
{
|
|
88
|
+
series,
|
|
89
|
+
hiddenIds,
|
|
90
|
+
onToggle: handleToggle,
|
|
91
|
+
interactive: interactiveLegend
|
|
92
|
+
}
|
|
93
|
+
) }),
|
|
94
|
+
/* @__PURE__ */ jsx("div", { className: "w-full min-w-0", style: { height }, children: /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height, children: /* @__PURE__ */ jsxs(LineChart, { data: chartData, margin: { top: 10, right: 10, left: 10, bottom: 0 }, children: [
|
|
95
|
+
/* @__PURE__ */ jsx(
|
|
96
|
+
CartesianGrid,
|
|
97
|
+
{
|
|
98
|
+
stroke: colors.grid,
|
|
99
|
+
strokeDasharray: "3 3",
|
|
100
|
+
vertical: false,
|
|
101
|
+
display: showGrid ? "block" : "none"
|
|
102
|
+
}
|
|
103
|
+
),
|
|
104
|
+
/* @__PURE__ */ jsx(
|
|
105
|
+
XAxis,
|
|
106
|
+
{
|
|
107
|
+
dataKey: "x",
|
|
108
|
+
tickFormatter: xTickFormatter,
|
|
109
|
+
tick: { fill: colors.tick, fontSize: 12 },
|
|
110
|
+
axisLine: false,
|
|
111
|
+
tickLine: false,
|
|
112
|
+
dy: 10,
|
|
113
|
+
label: xAxisLabel ? { value: xAxisLabel, position: "insideBottom", offset: -5 } : void 0
|
|
114
|
+
}
|
|
115
|
+
),
|
|
116
|
+
/* @__PURE__ */ jsx(
|
|
117
|
+
YAxis,
|
|
118
|
+
{
|
|
119
|
+
tickFormatter: yTickFormatter,
|
|
120
|
+
tick: { fill: colors.tick, fontSize: 12 },
|
|
121
|
+
axisLine: false,
|
|
122
|
+
tickLine: false,
|
|
123
|
+
dx: -10,
|
|
124
|
+
label: yAxisLabel ? { value: yAxisLabel, angle: -90, position: "insideLeft" } : void 0
|
|
125
|
+
}
|
|
126
|
+
),
|
|
127
|
+
/* @__PURE__ */ jsx(
|
|
128
|
+
Tooltip,
|
|
129
|
+
{
|
|
130
|
+
content: /* @__PURE__ */ jsx(
|
|
131
|
+
LineGraphTooltip,
|
|
132
|
+
{
|
|
133
|
+
tooltipValueFormatter: tooltipValueFormatter || ((val) => yTickFormatter ? yTickFormatter(val) : val.toLocaleString())
|
|
134
|
+
}
|
|
135
|
+
),
|
|
136
|
+
cursor: { stroke: colors.grid, strokeWidth: 1 }
|
|
137
|
+
}
|
|
138
|
+
),
|
|
139
|
+
series.map((s, idx) => {
|
|
140
|
+
const color = getSeriesColor(s, idx);
|
|
141
|
+
const isHidden = hiddenIds.includes(s.id) || s.hidden;
|
|
142
|
+
return /* @__PURE__ */ jsx(
|
|
143
|
+
Line,
|
|
144
|
+
{
|
|
145
|
+
type: "monotone",
|
|
146
|
+
dataKey: s.id,
|
|
147
|
+
name: s.label,
|
|
148
|
+
stroke: color,
|
|
149
|
+
strokeWidth: 2,
|
|
150
|
+
strokeDasharray: s.dashed ? "5 5" : void 0,
|
|
151
|
+
dot: false,
|
|
152
|
+
activeDot: { r: 5, fill: color, stroke: "#fff", strokeWidth: 2 },
|
|
153
|
+
hide: isHidden,
|
|
154
|
+
onClick: onDataPointClick ? (data) => onDataPointClick(data.payload, s) : void 0
|
|
155
|
+
},
|
|
156
|
+
s.id
|
|
157
|
+
);
|
|
158
|
+
})
|
|
159
|
+
] }) }) }),
|
|
160
|
+
legendPosition === "bottom" && /* @__PURE__ */ jsx(
|
|
161
|
+
LineGraphLegend,
|
|
162
|
+
{
|
|
163
|
+
series,
|
|
164
|
+
hiddenIds,
|
|
165
|
+
onToggle: handleToggle,
|
|
166
|
+
interactive: interactiveLegend
|
|
167
|
+
}
|
|
168
|
+
)
|
|
169
|
+
]
|
|
170
|
+
}
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
export {
|
|
174
|
+
LineGraph
|
|
175
|
+
};
|
|
176
|
+
//# sourceMappingURL=LineGraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LineGraph.js","sources":["../../../src/components/LineGraph/LineGraph.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useMemo, useEffect } from 'react';\nimport {\n LineChart,\n Line,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n ResponsiveContainer,\n} from 'recharts';\nimport { Typography } from '../Typography/Typography';\nimport { Stack } from '../Stack/Stack';\nimport { LineGraphSkeleton } from './LineGraphSkeleton';\nimport { LineGraphLegend } from './LineGraphLegend';\nimport { LineGraphTooltip } from './LineGraphTooltip';\nimport { getSeriesColor, validateSeries } from './lineGraphUtils';\nimport type { LineGraphDataPoint, LineGraphSeries } from './types';\nexport type { LineGraphDataPoint, LineGraphSeries };\n\nexport interface LineGraphProps {\n /** One or more data series to render */\n series: LineGraphSeries[];\n /** Chart title — rendered above the graph */\n title?: string;\n /** Subtitle / description rendered below the title */\n description?: string;\n /** X-axis label */\n xAxisLabel?: string;\n /** Y-axis label */\n yAxisLabel?: string;\n /** Custom formatter for X-axis tick labels */\n xTickFormatter?: (value: string | number) => string;\n /** Custom formatter for Y-axis tick labels */\n yTickFormatter?: (value: number) => string;\n /** Custom formatter for tooltip Y values */\n tooltipValueFormatter?: (value: number, seriesLabel: string) => string;\n /** Fixed chart height in px. @default 320 */\n height?: number;\n /** Show skeleton loading state */\n loading?: boolean;\n /** Show horizontal gridlines. @default true */\n showGrid?: boolean;\n /** Position of the legend. @default 'bottom' */\n legendPosition?: 'top' | 'bottom' | 'none';\n /** Allow toggling series visibility by clicking legend items. @default true */\n interactiveLegend?: boolean;\n /** Called when a data point is clicked */\n onDataPointClick?: (point: LineGraphDataPoint, series: LineGraphSeries) => void;\n /** Additional class names */\n className?: string;\n}\n\n/**\n * LineGraph component for visualizing one or more data series.\n * Built with recharts and integrated with Jiwambe design tokens.\n */\nexport function LineGraph({\n series,\n title,\n description,\n xAxisLabel,\n yAxisLabel,\n xTickFormatter,\n yTickFormatter,\n tooltipValueFormatter,\n height = 320,\n loading = false,\n showGrid = true,\n legendPosition = 'bottom',\n interactiveLegend = true,\n onDataPointClick,\n className = '',\n}: LineGraphProps) {\n // State for legend interactivity (toggled-off series IDs)\n const [hiddenIds, setHiddenIds] = useState<string[]>([]);\n const [mounted, setMounted] = useState(false);\n\n // Monitor props to reset hidden IDs if needed or validate\n useEffect(() => {\n setMounted(true);\n validateSeries(series);\n }, [series]);\n\n // Transform series data into recharts' expected format: [{ x: '...', series1: ..., series2: ... }]\n const chartData = useMemo(() => {\n if (!series.length) return [];\n \n // Use the first series as the source of truth for X-axis keys\n return series[0].data.map((point) => {\n const entry: any = { x: point.x };\n series.forEach((s) => {\n const p = s.data.find((dp) => dp.x === point.x);\n if (p) {\n entry[s.id] = p.y;\n }\n });\n return entry;\n });\n }, [series]);\n\n const handleToggle = (id: string) => {\n setHiddenIds((prev) => \n prev.includes(id) ? prev.filter((item) => item !== id) : [...prev, id]\n );\n };\n\n // Resolve axis/grid colors from CSS variables at runtime\n const [colors, setColors] = useState({\n grid: '#e5e5e5', // Fallback neutral-200\n tick: '#737373', // Fallback text-secondary (neutral-500)\n });\n\n useEffect(() => {\n if (!mounted) return;\n // This ensures we have the correct values on the client side\n const style = getComputedStyle(document.documentElement);\n const grid = style.getPropertyValue('--color-neutral-200').trim();\n const tick = style.getPropertyValue('--color-text-secondary').trim();\n \n setColors({\n grid: grid || '#e5e5e5',\n tick: tick || '#737373',\n });\n }, [mounted]);\n\n if (loading) {\n return <LineGraphSkeleton height={height} showTitle={!!title} />;\n }\n\n // Pre-hydration or no client mount: render shell to avoid layout shift\n if (!mounted) {\n return <div style={{ height, width: '100%' }} className={className} />;\n }\n\n return (\n <figure\n role=\"figure\"\n aria-label={title ?? 'Line graph'}\n className={['flex flex-col w-full min-w-0', className].filter(Boolean).join(' ')}\n >\n {/* Header */}\n {(title || description) && (\n <Stack spacing=\"space-0-25\" className=\"mb-space-6\">\n {title && (\n <Typography variant=\"title-md\" as=\"h3\">\n {title}\n </Typography>\n )}\n {description && (\n <Typography variant=\"text-xs\" className=\"text-text-secondary\">\n {description}\n </Typography>\n )}\n </Stack>\n )}\n\n {/* Legend Top */}\n {legendPosition === 'top' && (\n <div className=\"mb-space-4\">\n <LineGraphLegend\n series={series}\n hiddenIds={hiddenIds}\n onToggle={handleToggle}\n interactive={interactiveLegend}\n />\n </div>\n )}\n\n {/* Chart */}\n <div className=\"w-full min-w-0\" style={{ height }}>\n <ResponsiveContainer width=\"100%\" height={height}>\n <LineChart data={chartData} margin={{ top: 10, right: 10, left: 10, bottom: 0 }}>\n <CartesianGrid\n stroke={colors.grid}\n strokeDasharray=\"3 3\"\n vertical={false}\n display={showGrid ? 'block' : 'none'}\n />\n <XAxis\n dataKey=\"x\"\n tickFormatter={xTickFormatter}\n tick={{ fill: colors.tick, fontSize: 12 }}\n axisLine={false}\n tickLine={false}\n dy={10}\n label={xAxisLabel ? { value: xAxisLabel, position: 'insideBottom', offset: -5 } : undefined}\n />\n <YAxis\n tickFormatter={yTickFormatter}\n tick={{ fill: colors.tick, fontSize: 12 }}\n axisLine={false}\n tickLine={false}\n dx={-10}\n label={yAxisLabel ? { value: yAxisLabel, angle: -90, position: 'insideLeft' } : undefined}\n />\n <Tooltip\n content={\n <LineGraphTooltip\n tooltipValueFormatter={tooltipValueFormatter || ((val) => yTickFormatter ? yTickFormatter(val) : val.toLocaleString())}\n />\n }\n cursor={{ stroke: colors.grid, strokeWidth: 1 }}\n />\n {series.map((s, idx) => {\n const color = getSeriesColor(s, idx);\n const isHidden = hiddenIds.includes(s.id) || s.hidden;\n\n return (\n <Line\n key={s.id}\n type=\"monotone\"\n dataKey={s.id}\n name={s.label}\n stroke={color}\n strokeWidth={2}\n strokeDasharray={s.dashed ? '5 5' : undefined}\n dot={false}\n activeDot={{ r: 5, fill: color, stroke: '#fff', strokeWidth: 2 }}\n hide={isHidden}\n onClick={onDataPointClick ? (data: any) => onDataPointClick(data.payload, s) : undefined}\n />\n );\n })}\n </LineChart>\n </ResponsiveContainer>\n </div>\n\n {/* Legend Bottom */}\n {legendPosition === 'bottom' && (\n <LineGraphLegend\n series={series}\n hiddenIds={hiddenIds}\n onToggle={handleToggle}\n interactive={interactiveLegend}\n />\n )}\n </figure>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AA0DO;AAAmB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACS;AACC;AACC;AACM;AACG;AACpB;AAEF;AAEE;AACA;AAGA;AACE;AACA;AAAqB;AAIvB;AACE;AAGA;AACE;AACA;AACE;AACA;AACE;AAAgB;AAClB;AAEF;AAAO;AACR;AAGH;AACE;AAAA;AACuE;AAAA;AAKzE;AAAqC;AAC7B;AAAA;AACA;AAAA;AAGR;AACE;AAEA;AACA;AACA;AAEA;AAAU;AACM;AACA;AACf;AAGH;AACE;AAA8D;AAIhE;AACE;AAAoE;AAGtE;AACE;AAAC;AAAA;AACM;AACgB;AAC0D;AAG7E;AAEG;AAGC;AAKA;AAEJ;AAME;AAAC;AAAA;AACC;AACA;AACU;AACG;AAAA;AAEjB;AAOI;AAAA;AAAC;AAAA;AACgB;AACC;AACN;AACoB;AAAA;AAAA;AAEhC;AAAC;AAAA;AACS;AACO;AACsB;AAC3B;AACA;AACN;AAC8E;AAAA;AAAA;AAEpF;AAAC;AAAA;AACgB;AACsB;AAC3B;AACA;AACN;AAC4E;AAAA;AAAA;AAElF;AAAC;AAAA;AAEG;AAAC;AAAA;AACsG;AAAe;AAAA;AAG5E;AAAE;AAAA;AAG9C;AACA;AAEA;AACE;AAAC;AAAA;AAEM;AACM;AACH;AACA;AACK;AACuB;AAC/B;AACwD;AACvD;AACyE;AAAA;AAVxE;AAAA;AAaZ;AAGP;AAIE;AAAC;AAAA;AACC;AACA;AACU;AACG;AAAA;AAAA;AACf;AAAA;AAIR;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=LineGraph.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LineGraph.test.d.ts","sourceRoot":"","sources":["../../../src/components/LineGraph/LineGraph.test.tsx"],"names":[],"mappings":"AAKA,OAAO,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { LineGraphSeries } from './types';
|
|
2
|
+
export interface LineGraphLegendProps {
|
|
3
|
+
/** One or more series to render in the legend */
|
|
4
|
+
series: LineGraphSeries[];
|
|
5
|
+
/** IDs of series currently hidden */
|
|
6
|
+
hiddenIds: string[];
|
|
7
|
+
/** Fired when a series is toggled */
|
|
8
|
+
onToggle?: (id: string) => void;
|
|
9
|
+
/** Whether the legend is interactive. @default true */
|
|
10
|
+
interactive?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Custom legend component for the LineGraph.
|
|
14
|
+
* Renders a list of items with colored dots/squares and series labels.
|
|
15
|
+
*/
|
|
16
|
+
export declare function LineGraphLegend({ series, hiddenIds, onToggle, interactive, }: LineGraphLegendProps): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
//# sourceMappingURL=LineGraphLegend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LineGraphLegend.d.ts","sourceRoot":"","sources":["../../../src/components/LineGraph/LineGraphLegend.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,WAAW,oBAAoB;IACnC,iDAAiD;IACjD,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,qCAAqC;IACrC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,uDAAuD;IACvD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,SAAS,EACT,QAAQ,EACR,WAAkB,GACnB,EAAE,oBAAoB,2CA6CtB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Typography } from "../Typography/Typography.js";
|
|
4
|
+
import { Stack } from "../Stack/Stack.js";
|
|
5
|
+
import { getSeriesColor } from "./lineGraphUtils.js";
|
|
6
|
+
function LineGraphLegend({
|
|
7
|
+
series,
|
|
8
|
+
hiddenIds,
|
|
9
|
+
onToggle,
|
|
10
|
+
interactive = true
|
|
11
|
+
}) {
|
|
12
|
+
return /* @__PURE__ */ jsx(Stack, { direction: "row", spacing: "space-4", justifyContent: "center", className: "flex-wrap pt-space-4", children: series.map((s, idx) => {
|
|
13
|
+
const isHidden = hiddenIds.includes(s.id);
|
|
14
|
+
const color = getSeriesColor(s, idx);
|
|
15
|
+
const content = /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: "space-2", alignItems: "center", className: "py-space-1", children: [
|
|
16
|
+
/* @__PURE__ */ jsx(
|
|
17
|
+
"div",
|
|
18
|
+
{
|
|
19
|
+
className: "w-3 h-3 rounded-rad-xs shrink-0",
|
|
20
|
+
style: { backgroundColor: color },
|
|
21
|
+
"aria-hidden": "true"
|
|
22
|
+
}
|
|
23
|
+
),
|
|
24
|
+
/* @__PURE__ */ jsx(
|
|
25
|
+
Typography,
|
|
26
|
+
{
|
|
27
|
+
variant: "text-xs",
|
|
28
|
+
className: ["font-semibold", isHidden ? "text-text-disabled opacity-40" : "text-text-secondary"].filter(Boolean).join(" "),
|
|
29
|
+
children: s.label
|
|
30
|
+
}
|
|
31
|
+
)
|
|
32
|
+
] });
|
|
33
|
+
if (interactive && onToggle) {
|
|
34
|
+
return /* @__PURE__ */ jsx(
|
|
35
|
+
"button",
|
|
36
|
+
{
|
|
37
|
+
type: "button",
|
|
38
|
+
className: [
|
|
39
|
+
"cursor-pointer transition-opacity border-none bg-transparent p-0",
|
|
40
|
+
isHidden ? "opacity-50" : "hover:opacity-80"
|
|
41
|
+
].filter(Boolean).join(" "),
|
|
42
|
+
onClick: () => onToggle(s.id),
|
|
43
|
+
"aria-pressed": !isHidden,
|
|
44
|
+
"aria-label": `Toggle ${s.label}`,
|
|
45
|
+
children: content
|
|
46
|
+
},
|
|
47
|
+
s.id
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
return /* @__PURE__ */ jsx("div", { children: content }, s.id);
|
|
51
|
+
}) });
|
|
52
|
+
}
|
|
53
|
+
export {
|
|
54
|
+
LineGraphLegend
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=LineGraphLegend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LineGraphLegend.js","sources":["../../../src/components/LineGraph/LineGraphLegend.tsx"],"sourcesContent":["'use client';\n\nimport { Typography } from '../Typography/Typography';\nimport { Stack } from '../Stack/Stack';\nimport { getSeriesColor } from './lineGraphUtils';\nimport type { LineGraphSeries } from './types';\n\nexport interface LineGraphLegendProps {\n /** One or more series to render in the legend */\n series: LineGraphSeries[];\n /** IDs of series currently hidden */\n hiddenIds: string[];\n /** Fired when a series is toggled */\n onToggle?: (id: string) => void;\n /** Whether the legend is interactive. @default true */\n interactive?: boolean;\n}\n\n/**\n * Custom legend component for the LineGraph.\n * Renders a list of items with colored dots/squares and series labels.\n */\nexport function LineGraphLegend({\n series,\n hiddenIds,\n onToggle,\n interactive = true,\n}: LineGraphLegendProps) {\n return (\n <Stack direction=\"row\" spacing=\"space-4\" justifyContent=\"center\" className=\"flex-wrap pt-space-4\">\n {series.map((s, idx) => {\n const isHidden = hiddenIds.includes(s.id);\n const color = getSeriesColor(s, idx);\n \n const content = (\n <Stack direction=\"row\" spacing=\"space-2\" alignItems=\"center\" className=\"py-space-1\">\n <div\n className=\"w-3 h-3 rounded-rad-xs shrink-0\"\n style={{ backgroundColor: color }}\n aria-hidden=\"true\"\n />\n <Typography\n variant=\"text-xs\"\n className={['font-semibold', isHidden ? 'text-text-disabled opacity-40' : 'text-text-secondary'].filter(Boolean).join(' ')}\n >\n {s.label}\n </Typography>\n </Stack>\n );\n\n if (interactive && onToggle) {\n return (\n <button\n key={s.id}\n type=\"button\"\n className={[\n 'cursor-pointer transition-opacity border-none bg-transparent p-0',\n isHidden ? 'opacity-50' : 'hover:opacity-80',\n ].filter(Boolean).join(' ')}\n onClick={() => onToggle(s.id)}\n aria-pressed={!isHidden}\n aria-label={`Toggle ${s.label}`}\n >\n {content}\n </button>\n );\n }\n\n return <div key={s.id}>{content}</div>;\n })}\n </Stack>\n );\n}\n"],"names":[],"mappings":";;;;;AAsBO;AAAyB;AAC9B;AACA;AACA;AAEF;AACE;AAGM;AACA;AAEA;AAEI;AAAA;AAAC;AAAA;AACW;AACgB;AACd;AAAA;AAAA;AAEd;AAAC;AAAA;AACS;AACiH;AAEtH;AAAA;AAAA;AAKT;AACE;AACE;AAAC;AAAA;AAEM;AACM;AACT;AAC0B;AACF;AACE;AACb;AACc;AAE5B;AAAA;AAVM;AAAA;AAeb;AAAgC;AAIxC;;;;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface LineGraphSkeletonProps {
|
|
2
|
+
/** Chart height in px. @default 320 */
|
|
3
|
+
height?: number;
|
|
4
|
+
/** Whether to show the title block. @default true */
|
|
5
|
+
showTitle?: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Loading skeleton for the LineGraph component.
|
|
9
|
+
* Mirrors the structure of a rendered chart.
|
|
10
|
+
*/
|
|
11
|
+
export declare function LineGraphSkeleton({ height, showTitle }: LineGraphSkeletonProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=LineGraphSkeleton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LineGraphSkeleton.d.ts","sourceRoot":"","sources":["../../../src/components/LineGraph/LineGraphSkeleton.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,sBAAsB;IACrC,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,MAAY,EAAE,SAAgB,EAAE,EAAE,sBAAsB,2CAqB3F"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Skeleton } from "../Skeleton/Skeleton.js";
|
|
3
|
+
import { Stack } from "../Stack/Stack.js";
|
|
4
|
+
function LineGraphSkeleton({ height = 320, showTitle = true }) {
|
|
5
|
+
return /* @__PURE__ */ jsxs(Stack, { spacing: "space-4", className: "w-full", children: [
|
|
6
|
+
showTitle && /* @__PURE__ */ jsxs(Stack, { spacing: "space-1", children: [
|
|
7
|
+
/* @__PURE__ */ jsx(Skeleton, { width: "40%", height: "1.5rem", radius: "xs" }),
|
|
8
|
+
/* @__PURE__ */ jsx(Skeleton, { width: "60%", height: "1rem", radius: "xs" })
|
|
9
|
+
] }),
|
|
10
|
+
/* @__PURE__ */ jsx(Skeleton, { width: "100%", height: `${height}px`, radius: "md" }),
|
|
11
|
+
/* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: "space-4", justifyContent: "center", children: [
|
|
12
|
+
/* @__PURE__ */ jsx(Skeleton, { width: "5rem", height: "1.25rem", radius: "rounded" }),
|
|
13
|
+
/* @__PURE__ */ jsx(Skeleton, { width: "6rem", height: "1.25rem", radius: "rounded" }),
|
|
14
|
+
/* @__PURE__ */ jsx(Skeleton, { width: "5rem", height: "1.25rem", radius: "rounded" })
|
|
15
|
+
] })
|
|
16
|
+
] });
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
LineGraphSkeleton
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=LineGraphSkeleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LineGraphSkeleton.js","sources":["../../../src/components/LineGraph/LineGraphSkeleton.tsx"],"sourcesContent":["import { Skeleton } from '../Skeleton/Skeleton';\nimport { Stack } from '../Stack/Stack';\n\nexport interface LineGraphSkeletonProps {\n /** Chart height in px. @default 320 */\n height?: number;\n /** Whether to show the title block. @default true */\n showTitle?: boolean;\n}\n\n/**\n * Loading skeleton for the LineGraph component.\n * Mirrors the structure of a rendered chart.\n */\nexport function LineGraphSkeleton({ height = 320, showTitle = true }: LineGraphSkeletonProps) {\n return (\n <Stack spacing=\"space-4\" className=\"w-full\">\n {showTitle && (\n <Stack spacing=\"space-1\">\n <Skeleton width=\"40%\" height=\"1.5rem\" radius=\"xs\" />\n <Skeleton width=\"60%\" height=\"1rem\" radius=\"xs\" />\n </Stack>\n )}\n \n {/* Main chart area skeleton */}\n <Skeleton width=\"100%\" height={`${height}px`} radius=\"md\" />\n\n {/* Legend placeholder */}\n <Stack direction=\"row\" spacing=\"space-4\" justifyContent=\"center\">\n <Skeleton width=\"5rem\" height=\"1.25rem\" radius=\"rounded\" />\n <Skeleton width=\"6rem\" height=\"1.25rem\" radius=\"rounded\" />\n <Skeleton width=\"5rem\" height=\"1.25rem\" radius=\"rounded\" />\n </Stack>\n </Stack>\n );\n}\n"],"names":[],"mappings":";;;AAcO,SAAS,kBAAkB,EAAE,SAAS,KAAK,YAAY,QAAgC;AAC5F,SACE,qBAAC,OAAA,EAAM,SAAQ,WAAU,WAAU,UAChC,UAAA;AAAA,IAAA,aACC,qBAAC,OAAA,EAAM,SAAQ,WACb,UAAA;AAAA,MAAA,oBAAC,YAAS,OAAM,OAAM,QAAO,UAAS,QAAO,MAAK;AAAA,0BACjD,UAAA,EAAS,OAAM,OAAM,QAAO,QAAO,QAAO,KAAA,CAAK;AAAA,IAAA,GAClD;AAAA,IAIF,oBAAC,YAAS,OAAM,QAAO,QAAQ,GAAG,MAAM,MAAM,QAAO,KAAA,CAAK;AAAA,yBAGzD,OAAA,EAAM,WAAU,OAAM,SAAQ,WAAU,gBAAe,UACtD,UAAA;AAAA,MAAA,oBAAC,YAAS,OAAM,QAAO,QAAO,WAAU,QAAO,WAAU;AAAA,0BACxD,UAAA,EAAS,OAAM,QAAO,QAAO,WAAU,QAAO,WAAU;AAAA,0BACxD,UAAA,EAAS,OAAM,QAAO,QAAO,WAAU,QAAO,UAAA,CAAU;AAAA,IAAA,EAAA,CAC3D;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface LineGraphTooltipProps {
|
|
2
|
+
active?: boolean;
|
|
3
|
+
payload?: any[];
|
|
4
|
+
label?: string | number;
|
|
5
|
+
/** Custom formatter for tooltip Y values. */
|
|
6
|
+
tooltipValueFormatter?: (value: number, seriesLabel: string) => string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Custom tooltip content for the LineGraph.
|
|
10
|
+
*/
|
|
11
|
+
export declare function LineGraphTooltip({ active, payload, label, tooltipValueFormatter, }: LineGraphTooltipProps): import("react/jsx-runtime").JSX.Element | null;
|
|
12
|
+
//# sourceMappingURL=LineGraphTooltip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LineGraphTooltip.d.ts","sourceRoot":"","sources":["../../../src/components/LineGraph/LineGraphTooltip.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,6CAA6C;IAC7C,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;CACxE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,OAAO,EACP,KAAK,EACL,qBAAqB,GACtB,EAAE,qBAAqB,kDA0CvB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
3
|
+
import { Typography } from "../Typography/Typography.js";
|
|
4
|
+
import { Stack } from "../Stack/Stack.js";
|
|
5
|
+
import { formatAxisTick } from "./lineGraphUtils.js";
|
|
6
|
+
function LineGraphTooltip({
|
|
7
|
+
active,
|
|
8
|
+
payload,
|
|
9
|
+
label,
|
|
10
|
+
tooltipValueFormatter
|
|
11
|
+
}) {
|
|
12
|
+
if (!active || !(payload == null ? void 0 : payload.length)) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
return /* @__PURE__ */ jsxs("div", { className: "bg-fill-bg-primary border border-border-light rounded-rad-md elevation-low px-space-3 py-space-2 min-w-[12rem]", children: [
|
|
16
|
+
/* @__PURE__ */ jsx(Typography, { variant: "text-xs", className: "text-text-secondary font-semibold mb-space-2", children: formatAxisTick(label || "") }),
|
|
17
|
+
/* @__PURE__ */ jsx(Stack, { spacing: "space-1", children: payload.map((item, index) => {
|
|
18
|
+
const color = item.color || "var(--color-neutral-400)";
|
|
19
|
+
const value = item.value;
|
|
20
|
+
const formattedValue = tooltipValueFormatter ? tooltipValueFormatter(value, item.name || "") : value.toLocaleString();
|
|
21
|
+
return /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: "space-2", alignItems: "center", justifyContent: "space-between", children: [
|
|
22
|
+
/* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: "space-2", alignItems: "center", children: [
|
|
23
|
+
/* @__PURE__ */ jsx(
|
|
24
|
+
"div",
|
|
25
|
+
{
|
|
26
|
+
className: "w-2 h-2 rounded-full shrink-0",
|
|
27
|
+
style: { backgroundColor: color },
|
|
28
|
+
"aria-hidden": "true"
|
|
29
|
+
}
|
|
30
|
+
),
|
|
31
|
+
/* @__PURE__ */ jsx(Typography, { variant: "text-xs", className: "text-text-secondary", children: item.name })
|
|
32
|
+
] }),
|
|
33
|
+
/* @__PURE__ */ jsx(Typography, { variant: "text-xs", className: "text-text-primary font-bold", children: formattedValue })
|
|
34
|
+
] }, item.dataKey || index);
|
|
35
|
+
}) })
|
|
36
|
+
] });
|
|
37
|
+
}
|
|
38
|
+
export {
|
|
39
|
+
LineGraphTooltip
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=LineGraphTooltip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LineGraphTooltip.js","sources":["../../../src/components/LineGraph/LineGraphTooltip.tsx"],"sourcesContent":["'use client';\n\nimport { Typography } from '../Typography/Typography';\nimport { Stack } from '../Stack/Stack';\nimport { formatAxisTick } from './lineGraphUtils';\n\nexport interface LineGraphTooltipProps {\n active?: boolean;\n payload?: any[];\n label?: string | number;\n /** Custom formatter for tooltip Y values. */\n tooltipValueFormatter?: (value: number, seriesLabel: string) => string;\n}\n\n/**\n * Custom tooltip content for the LineGraph.\n */\nexport function LineGraphTooltip({\n active,\n payload,\n label,\n tooltipValueFormatter,\n}: LineGraphTooltipProps) {\n if (!active || !payload?.length) {\n return null;\n }\n\n return (\n <div className=\"bg-fill-bg-primary border border-border-light rounded-rad-md elevation-low px-space-3 py-space-2 min-w-[12rem]\">\n {/* X-axis label row */}\n <Typography variant=\"text-xs\" className=\"text-text-secondary font-semibold mb-space-2\">\n {formatAxisTick(label || '')}\n </Typography>\n\n {/* Series data rows */}\n <Stack spacing=\"space-1\">\n {payload.map((item, index) => {\n const color = item.color || 'var(--color-neutral-400)';\n const value = item.value as number;\n const formattedValue = tooltipValueFormatter\n ? tooltipValueFormatter(value, item.name || '')\n : value.toLocaleString();\n\n return (\n <Stack key={item.dataKey || index} direction=\"row\" spacing=\"space-2\" alignItems=\"center\" justifyContent=\"space-between\">\n <Stack direction=\"row\" spacing=\"space-2\" alignItems=\"center\">\n <div\n className=\"w-2 h-2 rounded-full shrink-0\"\n style={{ backgroundColor: color }}\n aria-hidden=\"true\"\n />\n <Typography variant=\"text-xs\" className=\"text-text-secondary\">\n {item.name}\n </Typography>\n </Stack>\n <Typography variant=\"text-xs\" className=\"text-text-primary font-bold\">\n {formattedValue}\n </Typography>\n </Stack>\n );\n })}\n </Stack>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;AAiBO;AAA0B;AAC/B;AACA;AACA;AAEF;AACE;AACE;AAAO;AAGT;AAGI;AAEA;AAKI;AACA;AACA;AAIA;AAEI;AACE;AAAA;AAAC;AAAA;AACW;AACgB;AACd;AAAA;AAAA;AAId;AACF;AAGA;AACF;AAGN;AAGN;;;;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { LineGraphSeries } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Predefined color palette for chart series based on Jiwambe design tokens.
|
|
4
|
+
*/
|
|
5
|
+
export declare const SERIES_COLORS: string[];
|
|
6
|
+
/**
|
|
7
|
+
* Returns the color for a given series, falling back to the palette if not provided.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getSeriesColor(series: LineGraphSeries, index: number): string;
|
|
10
|
+
/**
|
|
11
|
+
* Formats a value for an axis tick if no custom formatter is provided.
|
|
12
|
+
*/
|
|
13
|
+
export declare function formatAxisTick(value: string | number): string;
|
|
14
|
+
/**
|
|
15
|
+
* Validates that all series have consistent X-axis keys.
|
|
16
|
+
* Warnings are logged to the console in development.
|
|
17
|
+
*/
|
|
18
|
+
export declare function validateSeries(series: LineGraphSeries[]): void;
|
|
19
|
+
/**
|
|
20
|
+
* Transforms an array of grouped series data into a flattened array of objects
|
|
21
|
+
* required by recharts BarChart.
|
|
22
|
+
*
|
|
23
|
+
* E.g., merges two series with {x: 'Jan', y: 100} and {x: 'Jan', y: 200}
|
|
24
|
+
* into a single object {x: 'Jan', [series1Id]: 100, [series2Id]: 200}
|
|
25
|
+
*/
|
|
26
|
+
export declare function transformToBarChartData(series: Array<{
|
|
27
|
+
id: string;
|
|
28
|
+
data: Array<{
|
|
29
|
+
x: string | number;
|
|
30
|
+
y: number;
|
|
31
|
+
}>;
|
|
32
|
+
}>): Record<string, string | number>[];
|
|
33
|
+
//# sourceMappingURL=lineGraphUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lineGraphUtils.d.ts","sourceRoot":"","sources":["../../../src/components/LineGraph/lineGraphUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,aAAa,UAOzB,CAAC;AAEF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG7E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAK7D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAa9D;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,GAC5E,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,CA2BnC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
const SERIES_COLORS = [
|
|
2
|
+
"var(--color-green-500)",
|
|
3
|
+
"var(--color-neutral-400)",
|
|
4
|
+
// Closest equivalent for blue in the current palette
|
|
5
|
+
"var(--color-yellow-500)",
|
|
6
|
+
"var(--color-red-500)",
|
|
7
|
+
"var(--color-neutral-600)",
|
|
8
|
+
"var(--color-green-300)"
|
|
9
|
+
];
|
|
10
|
+
function getSeriesColor(series, index) {
|
|
11
|
+
if (series.color) return series.color;
|
|
12
|
+
return SERIES_COLORS[index % SERIES_COLORS.length];
|
|
13
|
+
}
|
|
14
|
+
function formatAxisTick(value) {
|
|
15
|
+
if (typeof value === "number") {
|
|
16
|
+
return value.toLocaleString();
|
|
17
|
+
}
|
|
18
|
+
return String(value);
|
|
19
|
+
}
|
|
20
|
+
function validateSeries(series) {
|
|
21
|
+
if (series.length < 2) return;
|
|
22
|
+
const firstSeriesKeys = series[0].data.map((p) => p.x).join(",");
|
|
23
|
+
for (let i = 1; i < series.length; i++) {
|
|
24
|
+
const currentKeys = series[i].data.map((p) => p.x).join(",");
|
|
25
|
+
if (currentKeys !== firstSeriesKeys) {
|
|
26
|
+
console.warn(
|
|
27
|
+
`Jiwambe LineGraph: Series "${series[i].label}" (index ${i}) has different X-axis points than the first series. This may cause rendering artifacts.`
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function transformToBarChartData(series) {
|
|
33
|
+
const dataMap = /* @__PURE__ */ new Map();
|
|
34
|
+
series.forEach((s) => {
|
|
35
|
+
s.data.forEach((point) => {
|
|
36
|
+
let entry = dataMap.get(point.x);
|
|
37
|
+
if (!entry) {
|
|
38
|
+
entry = { x: point.x };
|
|
39
|
+
dataMap.set(point.x, entry);
|
|
40
|
+
}
|
|
41
|
+
entry[s.id] = point.y;
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
const allIds = series.map((s) => s.id);
|
|
45
|
+
const result = Array.from(dataMap.values());
|
|
46
|
+
result.forEach((entry) => {
|
|
47
|
+
allIds.forEach((id) => {
|
|
48
|
+
if (!(id in entry)) {
|
|
49
|
+
entry[id] = void 0;
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
export {
|
|
56
|
+
SERIES_COLORS,
|
|
57
|
+
formatAxisTick,
|
|
58
|
+
getSeriesColor,
|
|
59
|
+
transformToBarChartData,
|
|
60
|
+
validateSeries
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=lineGraphUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lineGraphUtils.js","sources":["../../../src/components/LineGraph/lineGraphUtils.ts"],"sourcesContent":["/**\n * Predefined color palette for chart series based on Jiwambe design tokens.\n */\nexport const SERIES_COLORS = [\n 'var(--color-green-500)',\n 'var(--color-neutral-400)', // Closest equivalent for blue in the current palette\n 'var(--color-yellow-500)',\n 'var(--color-red-500)',\n 'var(--color-neutral-600)',\n 'var(--color-green-300)',\n];\n\nimport type { LineGraphSeries } from './types';\n\n/**\n * Returns the color for a given series, falling back to the palette if not provided.\n */\nexport function getSeriesColor(series: LineGraphSeries, index: number): string {\n if (series.color) return series.color;\n return SERIES_COLORS[index % SERIES_COLORS.length];\n}\n\n/**\n * Formats a value for an axis tick if no custom formatter is provided.\n */\nexport function formatAxisTick(value: string | number): string {\n if (typeof value === 'number') {\n return value.toLocaleString();\n }\n return String(value);\n}\n\n/**\n * Validates that all series have consistent X-axis keys.\n * Warnings are logged to the console in development.\n */\nexport function validateSeries(series: LineGraphSeries[]): void {\n if (series.length < 2) return;\n\n const firstSeriesKeys = series[0].data.map((p: any) => p.x).join(',');\n \n for (let i = 1; i < series.length; i++) {\n const currentKeys = series[i].data.map((p: any) => p.x).join(',');\n if (currentKeys !== firstSeriesKeys) {\n console.warn(\n `Jiwambe LineGraph: Series \"${series[i].label}\" (index ${i}) has different X-axis points than the first series. This may cause rendering artifacts.`\n );\n }\n }\n}\n\n/**\n * Transforms an array of grouped series data into a flattened array of objects\n * required by recharts BarChart.\n * \n * E.g., merges two series with {x: 'Jan', y: 100} and {x: 'Jan', y: 200}\n * into a single object {x: 'Jan', [series1Id]: 100, [series2Id]: 200}\n */\nexport function transformToBarChartData(\n series: Array<{ id: string; data: Array<{ x: string | number; y: number }> }>\n): Record<string, string | number>[] {\n const dataMap = new Map<string | number, Record<string, string | number>>();\n \n series.forEach(s => {\n s.data.forEach(point => {\n let entry = dataMap.get(point.x);\n if (!entry) {\n entry = { x: point.x };\n dataMap.set(point.x, entry);\n }\n entry[s.id] = point.y;\n });\n });\n\n // Ensure all keys exist on all objects (missing keys -> undefined)\n const allIds = series.map(s => s.id);\n const result = Array.from(dataMap.values());\n \n result.forEach(entry => {\n allIds.forEach(id => {\n if (!(id in entry)) {\n entry[id] = undefined as any;\n }\n });\n });\n\n return result;\n}\n"],"names":[],"mappings":"AAGO,MAAM,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOO,SAAS,eAAe,QAAyB,OAAuB;AAC7E,MAAI,OAAO,MAAO,QAAO,OAAO;AAChC,SAAO,cAAc,QAAQ,cAAc,MAAM;AACnD;AAKO,SAAS,eAAe,OAAgC;AAC7D,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,MAAM,eAAA;AAAA,EACf;AACA,SAAO,OAAO,KAAK;AACrB;AAMO,SAAS,eAAe,QAAiC;AAC9D,MAAI,OAAO,SAAS,EAAG;AAEvB,QAAM,kBAAkB,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,MAAW,EAAE,CAAC,EAAE,KAAK,GAAG;AAEpE,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,cAAc,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,MAAW,EAAE,CAAC,EAAE,KAAK,GAAG;AAChE,QAAI,gBAAgB,iBAAiB;AACnC,cAAQ;AAAA,QACN,8BAA8B,OAAO,CAAC,EAAE,KAAK,YAAY,CAAC;AAAA,MAAA;AAAA,IAE9D;AAAA,EACF;AACF;AASO,SAAS,wBACd,QACmC;AACnC,QAAM,8BAAc,IAAA;AAEpB,SAAO,QAAQ,CAAA,MAAK;AAClB,MAAE,KAAK,QAAQ,CAAA,UAAS;AACtB,UAAI,QAAQ,QAAQ,IAAI,MAAM,CAAC;AAC/B,UAAI,CAAC,OAAO;AACV,gBAAQ,EAAE,GAAG,MAAM,EAAA;AACnB,gBAAQ,IAAI,MAAM,GAAG,KAAK;AAAA,MAC5B;AACA,YAAM,EAAE,EAAE,IAAI,MAAM;AAAA,IACtB,CAAC;AAAA,EACH,CAAC;AAGD,QAAM,SAAS,OAAO,IAAI,CAAA,MAAK,EAAE,EAAE;AACnC,QAAM,SAAS,MAAM,KAAK,QAAQ,QAAQ;AAE1C,SAAO,QAAQ,CAAA,UAAS;AACtB,WAAO,QAAQ,CAAA,OAAM;AACnB,UAAI,EAAE,MAAM,QAAQ;AAClB,cAAM,EAAE,IAAI;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AACT;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface LineGraphDataPoint {
|
|
2
|
+
/** X-axis value — can be a date string, label, or number */
|
|
3
|
+
x: string | number;
|
|
4
|
+
/** Y-axis numeric value */
|
|
5
|
+
y: number;
|
|
6
|
+
}
|
|
7
|
+
export interface LineGraphSeries {
|
|
8
|
+
/** Unique identifier for this series */
|
|
9
|
+
id: string;
|
|
10
|
+
/** Display label shown in legend and tooltip */
|
|
11
|
+
label: string;
|
|
12
|
+
/** Data points for this series. x must be consistent across all series. */
|
|
13
|
+
data: LineGraphDataPoint[];
|
|
14
|
+
/** Optional override color. Must be a valid CSS color or Jiwambe variable. */
|
|
15
|
+
color?: string;
|
|
16
|
+
/** Render this series as dashed */
|
|
17
|
+
dashed?: boolean;
|
|
18
|
+
/** Hide this series from the chart but keep it in the legend */
|
|
19
|
+
hidden?: boolean;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/LineGraph/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACnB,2BAA2B;IAC3B,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gEAAgE;IAChE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Link.test.d.ts","sourceRoot":"","sources":["../../../src/components/Link/Link.test.tsx"],"names":[],"mappings":""}
|
|
@@ -3,9 +3,11 @@ import { ListProps, ListItemProps } from '../../types/list';
|
|
|
3
3
|
* Semantic list component. Renders a <ul> or <ol> with consistent
|
|
4
4
|
* marker styling and item spacing using design system tokens.
|
|
5
5
|
*
|
|
6
|
-
* For marker="disc" and marker="decimal", the list uses block
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* For marker="disc" and marker="decimal", the root list uses inline block
|
|
7
|
+
* layout and list-style so markers show even with Tailwind preflight; vertical
|
|
8
|
+
* spacing uses item margins from the plugin. For marker="none", inline flex,
|
|
9
|
+
* column direction, and gap replace Tailwind utility classes so spacing works
|
|
10
|
+
* without extra consumer CSS.
|
|
9
11
|
*
|
|
10
12
|
* Use indent (e.g. indent="space-list-indent" for 27px) and itemPadding="none"
|
|
11
13
|
* for legal/body-copy lists.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"List.d.ts","sourceRoot":"","sources":["../../../src/components/List/List.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"List.d.ts","sourceRoot":"","sources":["../../../src/components/List/List.tsx"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAiE1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,IAAI,CAAC,EACnB,MAAe,EACf,OAAmB,EACnB,MAAM,EACN,WAAuB,EACvB,SAAc,EACd,KAAK,EACL,QAAQ,GACT,EAAE,SAAS,2CA6BX;yBArCe,IAAI;sDAgDjB,aAAa"}
|