@sckyzo/cosmos-charts 0.0.1

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/CHANGELOG.md ADDED
@@ -0,0 +1,22 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@sckyzo/cosmos-charts` are documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.0.1] - 2026-05-20
9
+
10
+ First test release.
11
+
12
+ ### Added
13
+
14
+ - Opinionated ApexCharts 5 wrappers themed for Cosmos: BarChart,
15
+ LineAreaChart, DonutChart, RadialBarChart, GradientRadial, SemiCircleGauge,
16
+ StrokedGauge, TreemapChart, Sparkline (+ SparklineGroup) and RealtimeChart.
17
+ - Tree-shakable: each component registers only the apexcharts chart type it
18
+ needs via the v5 subpath imports (`apexcharts/bar`, `apexcharts/line`, …)
19
+ on top of `react-apexcharts/core`, so consumers don't pay for unused types.
20
+ - Ships ESM + CJS + type declarations (`dist/`), built with tsup.
21
+ - `apexcharts` 5 and `react-apexcharts` 2 as dependencies; `react` /
22
+ `react-dom` 19 as peer dependencies.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 SckyzO
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # @sckyzo/cosmos-charts
2
+
3
+ Cosmos charts — opinionated [ApexCharts](https://apexcharts.com/) wrappers themed for the Cosmos design system.
4
+
5
+ Kept in a dedicated subpackage so that `@sckyzo/cosmos-react` consumers who don't render charts don't ship the ApexCharts bundle.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ pnpm add @sckyzo/cosmos-charts
11
+ ```
12
+
13
+ ## Use
14
+
15
+ ```tsx
16
+ import { LineAreaChart, RealtimeChart, useChartTheme } from '@sckyzo/cosmos-charts';
17
+
18
+ <LineAreaChart
19
+ series={[{ name: 'CPU', data: [12, 19, 23, 31, 22, 18, 25] }]}
20
+ categories={['00h', '04h', '08h', '12h', '16h', '20h', '24h']}
21
+ />;
22
+ ```
23
+
24
+ The included `useChartTheme()` hook adapts ApexCharts grid + axis tokens to the current Cosmos color scheme (subscribes to `<html class="dark">` toggles).
25
+
26
+ ## Charts shipped
27
+
28
+ | Chart | Notes |
29
+ | --------------------------------- | ------------------------------------------------- |
30
+ | `LineAreaChart` | Smooth area + gradient fill |
31
+ | `RealtimeChart` | Live updates with WARN/CRIT threshold annotations |
32
+ | `RadialBarChart` | Multi-series radial gauge |
33
+ | `GradientRadial` | Single gradient radial |
34
+ | `SemiCircleGauge` | Half-donut gauge |
35
+ | `StrokedGauge` | Dashed-stroke radial |
36
+ | `DonutChart` / `DonutRightLegend` | Donut with bottom or right legend |
37
+ | `Sparkline` / `SparklineGroup` | Mini sparklines + KPI grid |
38
+ | `TreemapChart` | Repartition treemap |
package/dist/index.cjs ADDED
@@ -0,0 +1,484 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ require('apexcharts/line');
5
+ var ReactApexChart = require('react-apexcharts/core');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+ require('apexcharts/features/annotations');
8
+ require('apexcharts/radialBar');
9
+ require('apexcharts/donut');
10
+ require('apexcharts/features/legend');
11
+ require('apexcharts/treemap');
12
+ require('apexcharts/bar');
13
+
14
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
15
+
16
+ var ReactApexChart__default = /*#__PURE__*/_interopDefault(ReactApexChart);
17
+
18
+ var COSMOS_BRAND = "#465fff";
19
+ var COSMOS_PALETTE = ["#465fff", "#10b981", "#f59e0b", "#ef4444", "#8b5cf6"];
20
+ var detectDark = () => {
21
+ if (typeof document === "undefined") return false;
22
+ return document.documentElement.classList.contains("dark");
23
+ };
24
+ var useDarkMode = () => {
25
+ const [dark, setDark] = react.useState(detectDark);
26
+ react.useEffect(() => {
27
+ if (typeof document === "undefined") return;
28
+ const observer = new MutationObserver(() => setDark(detectDark()));
29
+ observer.observe(document.documentElement, {
30
+ attributes: true,
31
+ attributeFilter: ["class"]
32
+ });
33
+ return () => observer.disconnect();
34
+ }, []);
35
+ return dark;
36
+ };
37
+ var useChartTheme = () => {
38
+ const dark = useDarkMode();
39
+ const grid = {
40
+ borderColor: dark ? "#1f2937" : "#e5e7eb",
41
+ strokeDashArray: 4
42
+ };
43
+ const axisLabels = {
44
+ style: {
45
+ colors: dark ? "#9ca3af" : "#6b7280",
46
+ fontSize: "11px",
47
+ fontFamily: "inherit"
48
+ }
49
+ };
50
+ return { dark, grid, axisLabels, brand: COSMOS_BRAND, palette: COSMOS_PALETTE };
51
+ };
52
+ var LineAreaChart = ({
53
+ series,
54
+ categories,
55
+ height = 280,
56
+ width = "100%"
57
+ }) => {
58
+ const { grid, axisLabels, palette } = useChartTheme();
59
+ const options = {
60
+ chart: {
61
+ type: "area",
62
+ toolbar: { show: false },
63
+ zoom: { enabled: false },
64
+ fontFamily: "inherit"
65
+ },
66
+ colors: palette,
67
+ dataLabels: { enabled: false },
68
+ stroke: { curve: "smooth", width: 2 },
69
+ fill: { type: "gradient", gradient: { opacityFrom: 0.45, opacityTo: 0.05 } },
70
+ grid,
71
+ xaxis: {
72
+ categories,
73
+ labels: axisLabels,
74
+ axisBorder: { show: false },
75
+ axisTicks: { show: false }
76
+ },
77
+ yaxis: { labels: axisLabels },
78
+ legend: { show: false },
79
+ tooltip: { theme: "dark" }
80
+ };
81
+ return /* @__PURE__ */ jsxRuntime.jsx(ReactApexChart__default.default, { type: "area", options, series, height, width });
82
+ };
83
+ var defaultGenerator = /* @__PURE__ */ (() => {
84
+ let last = 50;
85
+ return () => {
86
+ last += (Math.random() - 0.5) * 8;
87
+ last = Math.max(20, Math.min(95, last));
88
+ return Math.round(last);
89
+ };
90
+ })();
91
+ var RealtimeChart = ({
92
+ generator = defaultGenerator,
93
+ intervalMs = 2e3,
94
+ windowSize = 30,
95
+ warnThreshold = 70,
96
+ critThreshold = 85,
97
+ height = 240,
98
+ width = "100%"
99
+ }) => {
100
+ const { grid, axisLabels, brand } = useChartTheme();
101
+ const [series, setSeries] = react.useState(() => Array.from({ length: windowSize }, () => generator()));
102
+ react.useEffect(() => {
103
+ const id = setInterval(() => {
104
+ setSeries((current) => [...current.slice(1), generator()]);
105
+ }, intervalMs);
106
+ return () => clearInterval(id);
107
+ }, [generator, intervalMs]);
108
+ const options = {
109
+ chart: {
110
+ type: "line",
111
+ animations: { enabled: true, dynamicAnimation: { enabled: true, speed: 800 } },
112
+ toolbar: { show: false },
113
+ zoom: { enabled: false },
114
+ fontFamily: "inherit"
115
+ },
116
+ colors: [brand],
117
+ stroke: { curve: "smooth", width: 2 },
118
+ dataLabels: { enabled: false },
119
+ grid,
120
+ xaxis: {
121
+ type: "numeric",
122
+ labels: { show: false },
123
+ axisBorder: { show: false },
124
+ axisTicks: { show: false }
125
+ },
126
+ yaxis: { min: 0, max: 100, labels: axisLabels },
127
+ annotations: {
128
+ yaxis: [
129
+ {
130
+ y: warnThreshold,
131
+ borderColor: "#f59e0b",
132
+ label: { text: "WARN", style: { color: "#fff", background: "#f59e0b" } }
133
+ },
134
+ {
135
+ y: critThreshold,
136
+ borderColor: "#ef4444",
137
+ label: { text: "CRIT", style: { color: "#fff", background: "#ef4444" } }
138
+ }
139
+ ]
140
+ },
141
+ tooltip: { theme: "dark" }
142
+ };
143
+ return /* @__PURE__ */ jsxRuntime.jsx(
144
+ ReactApexChart__default.default,
145
+ {
146
+ type: "line",
147
+ options,
148
+ series: [{ name: "value", data: series }],
149
+ height,
150
+ width
151
+ }
152
+ );
153
+ };
154
+ var RadialBarChart = ({
155
+ series,
156
+ labels,
157
+ height = 320,
158
+ width = "100%"
159
+ }) => {
160
+ const { palette } = useChartTheme();
161
+ const options = {
162
+ chart: { type: "radialBar", fontFamily: "inherit" },
163
+ colors: palette,
164
+ labels,
165
+ plotOptions: {
166
+ radialBar: {
167
+ track: { background: "rgba(150,150,150,0.15)" },
168
+ dataLabels: {
169
+ name: { fontSize: "12px" },
170
+ value: { fontSize: "14px", formatter: (v) => `${v}%` },
171
+ total: {
172
+ show: true,
173
+ label: "Avg",
174
+ formatter: () => `${Math.round(series.reduce((a, b) => a + b, 0) / series.length)}%`
175
+ }
176
+ }
177
+ }
178
+ }
179
+ };
180
+ return /* @__PURE__ */ jsxRuntime.jsx(
181
+ ReactApexChart__default.default,
182
+ {
183
+ type: "radialBar",
184
+ options,
185
+ series,
186
+ height,
187
+ width
188
+ }
189
+ );
190
+ };
191
+ var GradientRadial = ({
192
+ value,
193
+ label = "Score",
194
+ height = 280,
195
+ width = "100%"
196
+ }) => {
197
+ const { brand } = useChartTheme();
198
+ const options = {
199
+ chart: { type: "radialBar", fontFamily: "inherit" },
200
+ colors: [brand],
201
+ fill: {
202
+ type: "gradient",
203
+ gradient: {
204
+ shade: "dark",
205
+ type: "horizontal",
206
+ shadeIntensity: 0.5,
207
+ gradientToColors: ["#10b981"],
208
+ inverseColors: false,
209
+ opacityFrom: 1,
210
+ opacityTo: 1,
211
+ stops: [0, 100]
212
+ }
213
+ },
214
+ plotOptions: {
215
+ radialBar: {
216
+ hollow: { size: "70%" },
217
+ dataLabels: {
218
+ name: { fontSize: "12px", offsetY: -10 },
219
+ value: { fontSize: "32px", fontWeight: 700, formatter: (v) => `${v}%` }
220
+ }
221
+ }
222
+ },
223
+ labels: [label]
224
+ };
225
+ return /* @__PURE__ */ jsxRuntime.jsx(
226
+ ReactApexChart__default.default,
227
+ {
228
+ type: "radialBar",
229
+ options,
230
+ series: [value],
231
+ height,
232
+ width
233
+ }
234
+ );
235
+ };
236
+ var SemiCircleGauge = ({
237
+ value,
238
+ label = "",
239
+ color,
240
+ height = 200,
241
+ width = "100%"
242
+ }) => {
243
+ const { brand } = useChartTheme();
244
+ const options = {
245
+ chart: { type: "radialBar", fontFamily: "inherit", sparkline: { enabled: true } },
246
+ colors: [color ?? brand],
247
+ plotOptions: {
248
+ radialBar: {
249
+ startAngle: -90,
250
+ endAngle: 90,
251
+ track: { background: "rgba(150,150,150,0.15)", strokeWidth: "100%" },
252
+ dataLabels: {
253
+ name: { offsetY: -10, fontSize: "12px" },
254
+ value: { offsetY: -45, fontSize: "24px", fontWeight: 700, formatter: (v) => `${v}%` }
255
+ }
256
+ }
257
+ },
258
+ labels: [label]
259
+ };
260
+ return /* @__PURE__ */ jsxRuntime.jsx(
261
+ ReactApexChart__default.default,
262
+ {
263
+ type: "radialBar",
264
+ options,
265
+ series: [value],
266
+ height,
267
+ width
268
+ }
269
+ );
270
+ };
271
+ var StrokedGauge = ({
272
+ value,
273
+ label = "",
274
+ height = 280,
275
+ width = "100%"
276
+ }) => {
277
+ const { brand } = useChartTheme();
278
+ const options = {
279
+ chart: { type: "radialBar", fontFamily: "inherit" },
280
+ colors: [brand],
281
+ stroke: { lineCap: "round", dashArray: 4 },
282
+ plotOptions: {
283
+ radialBar: {
284
+ hollow: { size: "70%" },
285
+ track: { background: "rgba(150,150,150,0.15)", strokeWidth: "100%" },
286
+ dataLabels: {
287
+ name: { fontSize: "12px", offsetY: -10 },
288
+ value: { fontSize: "32px", fontWeight: 700, formatter: (v) => `${v}%` }
289
+ }
290
+ }
291
+ },
292
+ labels: [label]
293
+ };
294
+ return /* @__PURE__ */ jsxRuntime.jsx(
295
+ ReactApexChart__default.default,
296
+ {
297
+ type: "radialBar",
298
+ options,
299
+ series: [value],
300
+ height,
301
+ width
302
+ }
303
+ );
304
+ };
305
+ var DonutChart = ({
306
+ series,
307
+ labels,
308
+ rightLegend = false,
309
+ height = 280,
310
+ width = "100%"
311
+ }) => {
312
+ const { palette } = useChartTheme();
313
+ const options = {
314
+ chart: { type: "donut", fontFamily: "inherit" },
315
+ colors: palette,
316
+ labels,
317
+ legend: { position: rightLegend ? "right" : "bottom" },
318
+ dataLabels: { enabled: false },
319
+ plotOptions: {
320
+ pie: {
321
+ donut: { size: "68%", labels: { show: true, total: { show: true, label: "Total" } } }
322
+ }
323
+ }
324
+ };
325
+ return /* @__PURE__ */ jsxRuntime.jsx(ReactApexChart__default.default, { type: "donut", options, series, height, width });
326
+ };
327
+ var DonutRightLegend = (props) => /* @__PURE__ */ jsxRuntime.jsx(DonutChart, { ...props, rightLegend: true });
328
+ var Sparkline = ({
329
+ data,
330
+ color,
331
+ variant = "area",
332
+ height = 60,
333
+ width = "100%"
334
+ }) => {
335
+ const { brand } = useChartTheme();
336
+ const options = {
337
+ chart: { sparkline: { enabled: true }, fontFamily: "inherit", type: variant },
338
+ colors: [color ?? brand],
339
+ stroke: { curve: "smooth", width: 2 },
340
+ fill: variant === "area" ? { type: "gradient", gradient: { opacityFrom: 0.45, opacityTo: 0.05 } } : void 0,
341
+ tooltip: { fixed: { enabled: false }, x: { show: false }, marker: { show: false } }
342
+ };
343
+ return /* @__PURE__ */ jsxRuntime.jsx(
344
+ ReactApexChart__default.default,
345
+ {
346
+ type: variant,
347
+ options,
348
+ series: [{ name: "value", data }],
349
+ height,
350
+ width
351
+ }
352
+ );
353
+ };
354
+ var SparklineGroup = ({
355
+ items,
356
+ className
357
+ }) => /* @__PURE__ */ jsxRuntime.jsx(
358
+ "div",
359
+ {
360
+ className,
361
+ style: {
362
+ display: "grid",
363
+ gap: "1rem",
364
+ gridTemplateColumns: "repeat(auto-fit, minmax(180px, 1fr))"
365
+ },
366
+ children: items.map((it) => /* @__PURE__ */ jsxRuntime.jsxs(
367
+ "div",
368
+ {
369
+ className: "rounded-2xl border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900",
370
+ children: [
371
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-medium tracking-wider text-gray-500 uppercase dark:text-gray-400", children: it.label }),
372
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-2xl font-bold text-gray-900 dark:text-white", children: it.value }),
373
+ /* @__PURE__ */ jsxRuntime.jsx(Sparkline, { data: it.data, color: it.color, height: 50 })
374
+ ]
375
+ },
376
+ it.label
377
+ ))
378
+ }
379
+ );
380
+ var TreemapChart = ({ series, height = 320, width = "100%" }) => {
381
+ const { palette } = useChartTheme();
382
+ const options = {
383
+ chart: { type: "treemap", fontFamily: "inherit", toolbar: { show: false } },
384
+ colors: palette,
385
+ legend: { show: false },
386
+ dataLabels: { enabled: true, style: { fontSize: "12px" } },
387
+ plotOptions: { treemap: { distributed: true, enableShades: false } }
388
+ };
389
+ return /* @__PURE__ */ jsxRuntime.jsx(
390
+ ReactApexChart__default.default,
391
+ {
392
+ type: "treemap",
393
+ options,
394
+ series,
395
+ height,
396
+ width
397
+ }
398
+ );
399
+ };
400
+ var BarChart = ({
401
+ series,
402
+ categories,
403
+ orientation = "vertical",
404
+ stacked = false,
405
+ colors,
406
+ formatValue,
407
+ showLegend,
408
+ borderRadius = 4,
409
+ height = 320,
410
+ width = "100%"
411
+ }) => {
412
+ const { grid, axisLabels, palette } = useChartTheme();
413
+ const horizontal = orientation === "horizontal";
414
+ const legendVisible = showLegend ?? series.length > 1;
415
+ const valueFormatter = formatValue ?? ((v) => String(v));
416
+ const options = {
417
+ chart: {
418
+ type: "bar",
419
+ toolbar: { show: false },
420
+ zoom: { enabled: false },
421
+ stacked,
422
+ fontFamily: "inherit"
423
+ },
424
+ colors: colors ?? palette,
425
+ dataLabels: { enabled: false },
426
+ plotOptions: {
427
+ bar: {
428
+ horizontal,
429
+ borderRadius,
430
+ borderRadiusApplication: "end",
431
+ columnWidth: "55%"
432
+ }
433
+ },
434
+ grid,
435
+ xaxis: {
436
+ categories,
437
+ labels: {
438
+ ...axisLabels,
439
+ formatter: horizontal ? (val) => valueFormatter(Number(val)) : void 0
440
+ },
441
+ axisBorder: { show: false },
442
+ axisTicks: { show: false }
443
+ },
444
+ yaxis: {
445
+ labels: {
446
+ ...axisLabels,
447
+ formatter: horizontal ? void 0 : (val) => valueFormatter(Number(val))
448
+ }
449
+ },
450
+ legend: {
451
+ show: legendVisible,
452
+ position: "top",
453
+ horizontalAlign: "right",
454
+ labels: { colors: axisLabels.style.colors },
455
+ markers: { size: 5 }
456
+ },
457
+ tooltip: {
458
+ theme: "dark",
459
+ y: { formatter: (v) => valueFormatter(Number(v)) }
460
+ },
461
+ fill: { opacity: 1 },
462
+ stroke: { show: false }
463
+ };
464
+ return /* @__PURE__ */ jsxRuntime.jsx(ReactApexChart__default.default, { type: "bar", options, series, height, width });
465
+ };
466
+
467
+ exports.BarChart = BarChart;
468
+ exports.COSMOS_BRAND = COSMOS_BRAND;
469
+ exports.COSMOS_PALETTE = COSMOS_PALETTE;
470
+ exports.DonutChart = DonutChart;
471
+ exports.DonutRightLegend = DonutRightLegend;
472
+ exports.GradientRadial = GradientRadial;
473
+ exports.LineAreaChart = LineAreaChart;
474
+ exports.RadialBarChart = RadialBarChart;
475
+ exports.RealtimeChart = RealtimeChart;
476
+ exports.SemiCircleGauge = SemiCircleGauge;
477
+ exports.Sparkline = Sparkline;
478
+ exports.SparklineGroup = SparklineGroup;
479
+ exports.StrokedGauge = StrokedGauge;
480
+ exports.TreemapChart = TreemapChart;
481
+ exports.useChartTheme = useChartTheme;
482
+ exports.useDarkMode = useDarkMode;
483
+ //# sourceMappingURL=index.cjs.map
484
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/theme.ts","../src/LineAreaChart.tsx","../src/RealtimeChart.tsx","../src/RadialBarChart.tsx","../src/GradientRadial.tsx","../src/SemiCircleGauge.tsx","../src/StrokedGauge.tsx","../src/DonutChart.tsx","../src/Sparkline.tsx","../src/TreemapChart.tsx","../src/BarChart.tsx"],"names":["useState","useEffect","ReactApexChart","jsx","jsxs"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ApexOptions } from 'apexcharts';\nimport { useEffect, useState } from 'react';\n\nexport const COSMOS_BRAND = '#465fff';\nexport const COSMOS_PALETTE = ['#465fff', '#10b981', '#f59e0b', '#ef4444', '#8b5cf6'];\n\nconst detectDark = (): boolean => {\n if (typeof document === 'undefined') return false;\n return document.documentElement.classList.contains('dark');\n};\n\n/**\n * Subscribes to dark-mode toggles on `<html>` (the Cosmos convention).\n * Returns the current `isDark` value.\n */\nexport const useDarkMode = (): boolean => {\n const [dark, setDark] = useState(detectDark);\n\n useEffect(() => {\n if (typeof document === 'undefined') return;\n const observer = new MutationObserver(() => setDark(detectDark()));\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n return () => observer.disconnect();\n }, []);\n\n return dark;\n};\n\n/**\n * Returns ApexCharts grid + axis options matching the Cosmos design tokens\n * for the current color scheme.\n */\nexport const useChartTheme = () => {\n const dark = useDarkMode();\n const grid: ApexOptions['grid'] = {\n borderColor: dark ? '#1f2937' : '#e5e7eb',\n strokeDashArray: 4,\n };\n const axisLabels = {\n style: {\n colors: dark ? '#9ca3af' : '#6b7280',\n fontSize: '11px',\n fontFamily: 'inherit',\n },\n };\n return { dark, grid, axisLabels, brand: COSMOS_BRAND, palette: COSMOS_PALETTE };\n};\n","import type { ApexOptions } from 'apexcharts';\nimport 'apexcharts/line';\nimport ReactApexChart from 'react-apexcharts/core';\nimport { useChartTheme } from './theme';\nimport type { ChartSize } from './types';\n\nexport type LineAreaChartProps = ChartSize & {\n series: { name: string; data: number[] }[];\n categories: (string | number)[];\n};\n\nexport const LineAreaChart = ({\n series,\n categories,\n height = 280,\n width = '100%',\n}: LineAreaChartProps) => {\n const { grid, axisLabels, palette } = useChartTheme();\n const options: ApexOptions = {\n chart: {\n type: 'area',\n toolbar: { show: false },\n zoom: { enabled: false },\n fontFamily: 'inherit',\n },\n colors: palette,\n dataLabels: { enabled: false },\n stroke: { curve: 'smooth', width: 2 },\n fill: { type: 'gradient', gradient: { opacityFrom: 0.45, opacityTo: 0.05 } },\n grid,\n xaxis: {\n categories,\n labels: axisLabels,\n axisBorder: { show: false },\n axisTicks: { show: false },\n },\n yaxis: { labels: axisLabels },\n legend: { show: false },\n tooltip: { theme: 'dark' },\n };\n return (\n <ReactApexChart type=\"area\" options={options} series={series} height={height} width={width} />\n );\n};\n","import { useEffect, useState } from 'react';\nimport type { ApexOptions } from 'apexcharts';\nimport 'apexcharts/line';\nimport 'apexcharts/features/annotations';\nimport ReactApexChart from 'react-apexcharts/core';\nimport { useChartTheme } from './theme';\nimport type { ChartSize } from './types';\n\nexport type RealtimeChartProps = ChartSize & {\n /** Sample generator — defaults to a noisy walk between 30 and 80. */\n generator?: () => number;\n /** Interval in ms — defaults to 2000. */\n intervalMs?: number;\n windowSize?: number;\n warnThreshold?: number;\n critThreshold?: number;\n};\n\nconst defaultGenerator = (() => {\n let last = 50;\n return () => {\n last += (Math.random() - 0.5) * 8;\n last = Math.max(20, Math.min(95, last));\n return Math.round(last);\n };\n})();\n\nexport const RealtimeChart = ({\n generator = defaultGenerator,\n intervalMs = 2000,\n windowSize = 30,\n warnThreshold = 70,\n critThreshold = 85,\n height = 240,\n width = '100%',\n}: RealtimeChartProps) => {\n const { grid, axisLabels, brand } = useChartTheme();\n const [series, setSeries] = useState(() => Array.from({ length: windowSize }, () => generator()));\n\n useEffect(() => {\n const id = setInterval(() => {\n setSeries((current) => [...current.slice(1), generator()]);\n }, intervalMs);\n return () => clearInterval(id);\n }, [generator, intervalMs]);\n\n const options: ApexOptions = {\n chart: {\n type: 'line',\n animations: { enabled: true, dynamicAnimation: { enabled: true, speed: 800 } },\n toolbar: { show: false },\n zoom: { enabled: false },\n fontFamily: 'inherit',\n },\n colors: [brand],\n stroke: { curve: 'smooth', width: 2 },\n dataLabels: { enabled: false },\n grid,\n xaxis: {\n type: 'numeric',\n labels: { show: false },\n axisBorder: { show: false },\n axisTicks: { show: false },\n },\n yaxis: { min: 0, max: 100, labels: axisLabels },\n annotations: {\n yaxis: [\n {\n y: warnThreshold,\n borderColor: '#f59e0b',\n label: { text: 'WARN', style: { color: '#fff', background: '#f59e0b' } },\n },\n {\n y: critThreshold,\n borderColor: '#ef4444',\n label: { text: 'CRIT', style: { color: '#fff', background: '#ef4444' } },\n },\n ],\n },\n tooltip: { theme: 'dark' },\n };\n\n return (\n <ReactApexChart\n type=\"line\"\n options={options}\n series={[{ name: 'value', data: series }]}\n height={height}\n width={width}\n />\n );\n};\n","import type { ApexOptions } from 'apexcharts';\nimport 'apexcharts/radialBar';\nimport ReactApexChart from 'react-apexcharts/core';\nimport { useChartTheme } from './theme';\nimport type { ChartSize } from './types';\n\nexport type RadialBarChartProps = ChartSize & {\n series: number[];\n labels: string[];\n};\n\nexport const RadialBarChart = ({\n series,\n labels,\n height = 320,\n width = '100%',\n}: RadialBarChartProps) => {\n const { palette } = useChartTheme();\n const options: ApexOptions = {\n chart: { type: 'radialBar', fontFamily: 'inherit' },\n colors: palette,\n labels,\n plotOptions: {\n radialBar: {\n track: { background: 'rgba(150,150,150,0.15)' },\n dataLabels: {\n name: { fontSize: '12px' },\n value: { fontSize: '14px', formatter: (v) => `${v}%` },\n total: {\n show: true,\n label: 'Avg',\n formatter: () => `${Math.round(series.reduce((a, b) => a + b, 0) / series.length)}%`,\n },\n },\n },\n },\n };\n return (\n <ReactApexChart\n type=\"radialBar\"\n options={options}\n series={series}\n height={height}\n width={width}\n />\n );\n};\n","import type { ApexOptions } from 'apexcharts';\nimport 'apexcharts/radialBar';\nimport ReactApexChart from 'react-apexcharts/core';\nimport { useChartTheme } from './theme';\nimport type { ChartSize } from './types';\n\nexport type GradientRadialProps = ChartSize & {\n value: number;\n label?: string;\n};\n\nexport const GradientRadial = ({\n value,\n label = 'Score',\n height = 280,\n width = '100%',\n}: GradientRadialProps) => {\n const { brand } = useChartTheme();\n const options: ApexOptions = {\n chart: { type: 'radialBar', fontFamily: 'inherit' },\n colors: [brand],\n fill: {\n type: 'gradient',\n gradient: {\n shade: 'dark',\n type: 'horizontal',\n shadeIntensity: 0.5,\n gradientToColors: ['#10b981'],\n inverseColors: false,\n opacityFrom: 1,\n opacityTo: 1,\n stops: [0, 100],\n },\n },\n plotOptions: {\n radialBar: {\n hollow: { size: '70%' },\n dataLabels: {\n name: { fontSize: '12px', offsetY: -10 },\n value: { fontSize: '32px', fontWeight: 700, formatter: (v) => `${v}%` },\n },\n },\n },\n labels: [label],\n };\n return (\n <ReactApexChart\n type=\"radialBar\"\n options={options}\n series={[value]}\n height={height}\n width={width}\n />\n );\n};\n","import type { ApexOptions } from 'apexcharts';\nimport 'apexcharts/radialBar';\nimport ReactApexChart from 'react-apexcharts/core';\nimport { useChartTheme } from './theme';\nimport type { ChartSize } from './types';\n\nexport type SemiCircleGaugeProps = ChartSize & {\n value: number;\n label?: string;\n color?: string;\n};\n\nexport const SemiCircleGauge = ({\n value,\n label = '',\n color,\n height = 200,\n width = '100%',\n}: SemiCircleGaugeProps) => {\n const { brand } = useChartTheme();\n const options: ApexOptions = {\n chart: { type: 'radialBar', fontFamily: 'inherit', sparkline: { enabled: true } },\n colors: [color ?? brand],\n plotOptions: {\n radialBar: {\n startAngle: -90,\n endAngle: 90,\n track: { background: 'rgba(150,150,150,0.15)', strokeWidth: '100%' },\n dataLabels: {\n name: { offsetY: -10, fontSize: '12px' },\n value: { offsetY: -45, fontSize: '24px', fontWeight: 700, formatter: (v) => `${v}%` },\n },\n },\n },\n labels: [label],\n };\n return (\n <ReactApexChart\n type=\"radialBar\"\n options={options}\n series={[value]}\n height={height}\n width={width}\n />\n );\n};\n","import type { ApexOptions } from 'apexcharts';\nimport 'apexcharts/radialBar';\nimport ReactApexChart from 'react-apexcharts/core';\nimport { useChartTheme } from './theme';\nimport type { ChartSize } from './types';\n\nexport type StrokedGaugeProps = ChartSize & {\n value: number;\n label?: string;\n};\n\nexport const StrokedGauge = ({\n value,\n label = '',\n height = 280,\n width = '100%',\n}: StrokedGaugeProps) => {\n const { brand } = useChartTheme();\n const options: ApexOptions = {\n chart: { type: 'radialBar', fontFamily: 'inherit' },\n colors: [brand],\n stroke: { lineCap: 'round', dashArray: 4 },\n plotOptions: {\n radialBar: {\n hollow: { size: '70%' },\n track: { background: 'rgba(150,150,150,0.15)', strokeWidth: '100%' },\n dataLabels: {\n name: { fontSize: '12px', offsetY: -10 },\n value: { fontSize: '32px', fontWeight: 700, formatter: (v) => `${v}%` },\n },\n },\n },\n labels: [label],\n };\n return (\n <ReactApexChart\n type=\"radialBar\"\n options={options}\n series={[value]}\n height={height}\n width={width}\n />\n );\n};\n","import type { ApexOptions } from 'apexcharts';\nimport 'apexcharts/donut';\nimport 'apexcharts/features/legend';\nimport ReactApexChart from 'react-apexcharts/core';\nimport { useChartTheme } from './theme';\nimport type { ChartSize } from './types';\n\nexport type DonutChartProps = ChartSize & {\n series: number[];\n labels: string[];\n /** Whether to show the right-side legend (default: bottom). */\n rightLegend?: boolean;\n};\n\nexport const DonutChart = ({\n series,\n labels,\n rightLegend = false,\n height = 280,\n width = '100%',\n}: DonutChartProps) => {\n const { palette } = useChartTheme();\n const options: ApexOptions = {\n chart: { type: 'donut', fontFamily: 'inherit' },\n colors: palette,\n labels,\n legend: { position: rightLegend ? 'right' : 'bottom' },\n dataLabels: { enabled: false },\n plotOptions: {\n pie: {\n donut: { size: '68%', labels: { show: true, total: { show: true, label: 'Total' } } },\n },\n },\n };\n return (\n <ReactApexChart type=\"donut\" options={options} series={series} height={height} width={width} />\n );\n};\n\nexport const DonutRightLegend = (props: Omit<DonutChartProps, 'rightLegend'>) => (\n <DonutChart {...props} rightLegend />\n);\n","import type { ApexOptions } from 'apexcharts';\nimport 'apexcharts/line';\nimport ReactApexChart from 'react-apexcharts/core';\nimport { useChartTheme } from './theme';\nimport type { ChartSize } from './types';\n\nexport type SparklineProps = ChartSize & {\n data: number[];\n color?: string;\n variant?: 'line' | 'area';\n};\n\nexport const Sparkline = ({\n data,\n color,\n variant = 'area',\n height = 60,\n width = '100%',\n}: SparklineProps) => {\n const { brand } = useChartTheme();\n const options: ApexOptions = {\n chart: { sparkline: { enabled: true }, fontFamily: 'inherit', type: variant },\n colors: [color ?? brand],\n stroke: { curve: 'smooth', width: 2 },\n fill:\n variant === 'area'\n ? { type: 'gradient', gradient: { opacityFrom: 0.45, opacityTo: 0.05 } }\n : undefined,\n tooltip: { fixed: { enabled: false }, x: { show: false }, marker: { show: false } },\n };\n return (\n <ReactApexChart\n type={variant}\n options={options}\n series={[{ name: 'value', data }]}\n height={height}\n width={width}\n />\n );\n};\n\nexport type SparklineGroupItem = {\n label: string;\n value: number | string;\n data: number[];\n color?: string;\n};\n\nexport const SparklineGroup = ({\n items,\n className,\n}: {\n items: SparklineGroupItem[];\n className?: string;\n}) => (\n <div\n className={className}\n style={{\n display: 'grid',\n gap: '1rem',\n gridTemplateColumns: 'repeat(auto-fit, minmax(180px, 1fr))',\n }}\n >\n {items.map((it) => (\n <div\n key={it.label}\n className=\"rounded-2xl border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\"\n >\n <p className=\"text-xs font-medium tracking-wider text-gray-500 uppercase dark:text-gray-400\">\n {it.label}\n </p>\n <p className=\"mt-1 text-2xl font-bold text-gray-900 dark:text-white\">{it.value}</p>\n <Sparkline data={it.data} color={it.color} height={50} />\n </div>\n ))}\n </div>\n);\n","import type { ApexOptions } from 'apexcharts';\nimport 'apexcharts/treemap';\nimport ReactApexChart from 'react-apexcharts/core';\nimport { useChartTheme } from './theme';\nimport type { ChartSize } from './types';\n\nexport type TreemapDatum = { x: string; y: number };\n\nexport type TreemapChartProps = ChartSize & {\n series: { name?: string; data: TreemapDatum[] }[];\n};\n\nexport const TreemapChart = ({ series, height = 320, width = '100%' }: TreemapChartProps) => {\n const { palette } = useChartTheme();\n const options: ApexOptions = {\n chart: { type: 'treemap', fontFamily: 'inherit', toolbar: { show: false } },\n colors: palette,\n legend: { show: false },\n dataLabels: { enabled: true, style: { fontSize: '12px' } },\n plotOptions: { treemap: { distributed: true, enableShades: false } },\n };\n return (\n <ReactApexChart\n type=\"treemap\"\n options={options}\n series={series}\n height={height}\n width={width}\n />\n );\n};\n","import type { ApexOptions } from 'apexcharts';\nimport 'apexcharts/bar';\nimport 'apexcharts/features/legend';\nimport ReactApexChart from 'react-apexcharts/core';\nimport { useChartTheme } from './theme';\nimport type { ChartSize } from './types';\n\nexport type BarChartOrientation = 'vertical' | 'horizontal';\n\nexport type BarChartProps = ChartSize & {\n series: { name: string; data: number[] }[];\n categories: (string | number)[];\n /** `vertical` (default) draws bars upward; `horizontal` draws them rightward. */\n orientation?: BarChartOrientation;\n /** Stack multi-series bars instead of grouping them side-by-side. */\n stacked?: boolean;\n /** Override the default Cosmos palette. */\n colors?: string[];\n /** Format the numeric axis labels (and tooltip values). */\n formatValue?: (value: number) => string;\n /** Show the legend (auto-true when 2+ series). */\n showLegend?: boolean;\n /** Tailwind border-radius applied to bar tops. Default 4. */\n borderRadius?: number;\n};\n\nexport const BarChart = ({\n series,\n categories,\n orientation = 'vertical',\n stacked = false,\n colors,\n formatValue,\n showLegend,\n borderRadius = 4,\n height = 320,\n width = '100%',\n}: BarChartProps) => {\n const { grid, axisLabels, palette } = useChartTheme();\n const horizontal = orientation === 'horizontal';\n const legendVisible = showLegend ?? series.length > 1;\n\n const valueFormatter = formatValue ?? ((v: number) => String(v));\n\n const options: ApexOptions = {\n chart: {\n type: 'bar',\n toolbar: { show: false },\n zoom: { enabled: false },\n stacked,\n fontFamily: 'inherit',\n },\n colors: colors ?? palette,\n dataLabels: { enabled: false },\n plotOptions: {\n bar: {\n horizontal,\n borderRadius,\n borderRadiusApplication: 'end',\n columnWidth: '55%',\n },\n },\n grid,\n xaxis: {\n categories,\n labels: {\n ...axisLabels,\n formatter: horizontal ? (val) => valueFormatter(Number(val)) : undefined,\n },\n axisBorder: { show: false },\n axisTicks: { show: false },\n },\n yaxis: {\n labels: {\n ...axisLabels,\n formatter: horizontal ? undefined : (val) => valueFormatter(Number(val)),\n },\n },\n legend: {\n show: legendVisible,\n position: 'top',\n horizontalAlign: 'right',\n labels: { colors: axisLabels.style.colors },\n markers: { size: 5 },\n },\n tooltip: {\n theme: 'dark',\n y: { formatter: (v) => valueFormatter(Number(v)) },\n },\n fill: { opacity: 1 },\n stroke: { show: false },\n };\n\n return (\n <ReactApexChart type=\"bar\" options={options} series={series} height={height} width={width} />\n );\n};\n"]}