@andreagiugni/tailwind-dashboard-ui 1.0.10 → 1.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -221,7 +221,7 @@ in [Peer dependencies](#peer-dependencies)).
221
221
 
222
222
  | Component | Key props |
223
223
  |---|---|
224
- | `BarChart` | `series`, `categories`, `colors?`, `height?`, `options?` (merged over defaults) |
224
+ | `BarChart` | `series`, `categories`, `colors?`, `height?`, `horizontal?`, `showBarValues?`, `showBarPercentages?`, `percentageMode?`, `barValueFormatter?`, `barPercentageFormatter?`, `options?` (merged over defaults) |
225
225
  | `LineChart` | `series`, `categories`, `colors?`, `height?`, `options?` |
226
226
  | `Calendar` | `events`, `onEventClick`, `onDateSelect`, `initialView` |
227
227
  | `Editor` (WYSIWYG) | `content`, `onChange(html)`, `placeholder?`, `editable?`, `toolbar?`, `rows?` — Tiptap-powered, customizable toolbar |
@@ -0,0 +1,340 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var React = require('react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var React__default = /*#__PURE__*/_interopDefault(React);
10
+
11
+ var defaultOptions = {
12
+ colors: ["#465fff"],
13
+ chart: {
14
+ fontFamily: "Outfit, sans-serif",
15
+ type: "bar",
16
+ height: 180,
17
+ toolbar: {
18
+ show: false
19
+ }
20
+ },
21
+ plotOptions: {
22
+ bar: {
23
+ horizontal: false,
24
+ columnWidth: "39%",
25
+ borderRadius: 5,
26
+ borderRadiusApplication: "end"
27
+ }
28
+ },
29
+ dataLabels: {
30
+ enabled: false
31
+ },
32
+ // No transparent stroke around the columns: it shrinks and shifts the
33
+ // painted bar inside its allocated slot, so the hover highlight band
34
+ // (crosshairs width "barWidth" = the allocated width) would render wider
35
+ // than — and offset from — the visible bar.
36
+ stroke: {
37
+ show: false
38
+ },
39
+ xaxis: {
40
+ categories: [
41
+ "Jan",
42
+ "Feb",
43
+ "Mar",
44
+ "Apr",
45
+ "May",
46
+ "Jun",
47
+ "Jul",
48
+ "Aug",
49
+ "Sep",
50
+ "Oct",
51
+ "Nov",
52
+ "Dec"
53
+ ],
54
+ axisBorder: {
55
+ show: false
56
+ },
57
+ axisTicks: {
58
+ show: false
59
+ },
60
+ // Match the hover highlight band to the bar width (the default band spans
61
+ // the whole category slot, looking ~3x wider than the 39% columns).
62
+ crosshairs: {
63
+ width: "barWidth"
64
+ }
65
+ },
66
+ legend: {
67
+ show: true,
68
+ position: "top",
69
+ horizontalAlign: "left",
70
+ fontFamily: "Outfit",
71
+ // Rounded, border-less swatches that echo the column styling. ApexCharts
72
+ // sets the marker span's `color` to the series color, so `currentColor`
73
+ // picks it up; `customHTML` lets us round the corners (the built-in shapes
74
+ // are sharp SVG paths that CSS border-radius can't touch).
75
+ markers: {
76
+ size: 7,
77
+ strokeWidth: 0,
78
+ customHTML: () => '<span style="display:block;height:100%;width:100%;border-radius:3px;background:currentColor"></span>'
79
+ }
80
+ },
81
+ yaxis: {
82
+ title: {
83
+ text: void 0
84
+ }
85
+ },
86
+ grid: {
87
+ yaxis: {
88
+ lines: {
89
+ show: true
90
+ }
91
+ }
92
+ },
93
+ fill: {
94
+ opacity: 1
95
+ },
96
+ tooltip: {
97
+ x: {
98
+ show: false
99
+ },
100
+ y: {
101
+ formatter: (val) => `${val}`
102
+ }
103
+ }
104
+ };
105
+ var defaultSeries = [
106
+ {
107
+ name: "Sales",
108
+ data: [168, 385, 201, 298, 187, 195, 291, 110, 215, 390, 280, 112]
109
+ }
110
+ ];
111
+ var horizontalGridOptions = {
112
+ borderColor: "transparent",
113
+ xaxis: {
114
+ lines: {
115
+ show: false
116
+ }
117
+ },
118
+ yaxis: {
119
+ lines: {
120
+ show: false
121
+ }
122
+ }
123
+ };
124
+ function mergeGridOptions(base, override) {
125
+ return {
126
+ ...base,
127
+ ...override,
128
+ xaxis: {
129
+ ...base?.xaxis,
130
+ ...override?.xaxis,
131
+ lines: {
132
+ ...base?.xaxis?.lines,
133
+ ...override?.xaxis?.lines
134
+ }
135
+ },
136
+ yaxis: {
137
+ ...base?.yaxis,
138
+ ...override?.yaxis,
139
+ lines: {
140
+ ...base?.yaxis?.lines,
141
+ ...override?.yaxis?.lines
142
+ }
143
+ }
144
+ };
145
+ }
146
+ function getDataValue(value) {
147
+ if (typeof value === "number") return value;
148
+ if (Array.isArray(value) && typeof value[1] === "number") return value[1];
149
+ if (value && typeof value === "object" && "y" in value) {
150
+ const y = value.y;
151
+ return typeof y === "number" ? y : null;
152
+ }
153
+ return null;
154
+ }
155
+ function getValueMatrix(series) {
156
+ return series.map((item) => item.data.map((value) => getDataValue(value) ?? 0));
157
+ }
158
+ function getSeriesTotal(matrix) {
159
+ return matrix.reduce(
160
+ (seriesTotal, data) => seriesTotal + data.reduce((total, value) => total + value, 0),
161
+ 0
162
+ );
163
+ }
164
+ function getCategoryTotal(matrix, dataPointIndex) {
165
+ return matrix.reduce((total, data) => total + (data[dataPointIndex] ?? 0), 0);
166
+ }
167
+ function mergeDataLabels(base, override, generated) {
168
+ return {
169
+ ...base,
170
+ ...override,
171
+ ...generated,
172
+ style: {
173
+ ...base?.style,
174
+ ...override?.style,
175
+ ...generated?.style
176
+ },
177
+ background: {
178
+ ...base?.background,
179
+ ...override?.background,
180
+ ...generated?.background
181
+ }
182
+ };
183
+ }
184
+ function mergeAnnotations(override, generated) {
185
+ if (!override && !generated) return void 0;
186
+ return {
187
+ ...override,
188
+ ...generated,
189
+ points: [...override?.points ?? [], ...generated?.points ?? []]
190
+ };
191
+ }
192
+ var BarChart = ({
193
+ series,
194
+ categories,
195
+ colors,
196
+ height,
197
+ horizontal,
198
+ showBarValues = false,
199
+ showBarPercentages = false,
200
+ percentageMode = "total",
201
+ barValueFormatter,
202
+ barPercentageFormatter,
203
+ options
204
+ }) => {
205
+ const [Chart, setChart] = React__default.default.useState(null);
206
+ const effectiveSeries = series ?? defaultSeries;
207
+ const effectiveCategories = categories ?? options?.xaxis?.categories;
208
+ const valueMatrix = getValueMatrix(effectiveSeries);
209
+ const seriesTotal = getSeriesTotal(valueMatrix);
210
+ const isHorizontal = horizontal ?? options?.plotOptions?.bar?.horizontal === true;
211
+ const hasGeneratedLabels = showBarValues || showBarPercentages;
212
+ const baseGridOptions = isHorizontal ? mergeGridOptions(defaultOptions.grid, horizontalGridOptions) : defaultOptions.grid;
213
+ const getLabelContext = (seriesIndex, dataPointIndex, total) => ({
214
+ seriesIndex,
215
+ dataPointIndex,
216
+ seriesName: effectiveSeries[seriesIndex]?.name,
217
+ category: effectiveCategories?.[dataPointIndex],
218
+ total
219
+ });
220
+ const generatedDataLabels = hasGeneratedLabels ? {
221
+ enabled: true,
222
+ textAnchor: "middle",
223
+ offsetX: 0,
224
+ offsetY: 0,
225
+ background: {
226
+ enabled: false
227
+ },
228
+ style: {
229
+ fontSize: "12px",
230
+ fontWeight: 600,
231
+ colors: [showBarPercentages ? "#ffffff" : "#344054"]
232
+ },
233
+ formatter: (value, opts) => {
234
+ const seriesIndex = opts?.seriesIndex ?? 0;
235
+ const dataPointIndex = opts?.dataPointIndex ?? 0;
236
+ const numericValue = typeof value === "number" ? value : valueMatrix[seriesIndex]?.[dataPointIndex] ?? 0;
237
+ const total = percentageMode === "category" ? getCategoryTotal(valueMatrix, dataPointIndex) : seriesTotal;
238
+ const context = getLabelContext(seriesIndex, dataPointIndex, total);
239
+ if (showBarPercentages) {
240
+ const percentage = total > 0 ? numericValue / total * 100 : 0;
241
+ return barPercentageFormatter ? barPercentageFormatter(percentage, numericValue, context) : `${Math.round(percentage)}%`;
242
+ }
243
+ return barValueFormatter ? barValueFormatter(numericValue, context) : `${numericValue}`;
244
+ }
245
+ } : void 0;
246
+ const generatedAnnotations = isHorizontal && showBarValues ? {
247
+ points: effectiveSeries.flatMap(
248
+ (item, seriesIndex) => item.data.map((dataPoint, dataPointIndex) => {
249
+ const value = getDataValue(dataPoint) ?? 0;
250
+ const total = percentageMode === "category" ? getCategoryTotal(valueMatrix, dataPointIndex) : seriesTotal;
251
+ const context = getLabelContext(seriesIndex, dataPointIndex, total);
252
+ return {
253
+ x: value,
254
+ y: dataPointIndex,
255
+ seriesIndex,
256
+ marker: {
257
+ size: 0
258
+ },
259
+ label: {
260
+ text: barValueFormatter ? barValueFormatter(value, context) : `${value}`,
261
+ borderWidth: 0,
262
+ offsetY: -12,
263
+ style: {
264
+ background: "transparent",
265
+ color: "#344054",
266
+ fontSize: "12px",
267
+ fontWeight: 600,
268
+ padding: {
269
+ left: 0,
270
+ right: 0,
271
+ top: 0,
272
+ bottom: 0
273
+ }
274
+ }
275
+ }
276
+ };
277
+ })
278
+ )
279
+ } : void 0;
280
+ const mergedOptions = {
281
+ ...defaultOptions,
282
+ ...options,
283
+ colors: colors ?? options?.colors ?? defaultOptions.colors,
284
+ chart: {
285
+ ...defaultOptions.chart,
286
+ ...options?.chart,
287
+ height: height ?? options?.chart?.height ?? defaultOptions.chart?.height
288
+ },
289
+ plotOptions: {
290
+ ...defaultOptions.plotOptions,
291
+ ...options?.plotOptions,
292
+ bar: {
293
+ ...defaultOptions.plotOptions?.bar,
294
+ ...options?.plotOptions?.bar,
295
+ horizontal: isHorizontal,
296
+ ...hasGeneratedLabels && {
297
+ dataLabels: {
298
+ ...options?.plotOptions?.bar?.dataLabels,
299
+ position: showBarPercentages ? "center" : "top"
300
+ }
301
+ }
302
+ }
303
+ },
304
+ dataLabels: mergeDataLabels(
305
+ defaultOptions.dataLabels,
306
+ options?.dataLabels,
307
+ generatedDataLabels
308
+ ),
309
+ xaxis: {
310
+ ...defaultOptions.xaxis,
311
+ ...options?.xaxis,
312
+ categories: categories ?? options?.xaxis?.categories ?? defaultOptions.xaxis?.categories
313
+ },
314
+ grid: mergeGridOptions(baseGridOptions, options?.grid),
315
+ annotations: mergeAnnotations(options?.annotations, generatedAnnotations)
316
+ };
317
+ React__default.default.useEffect(() => {
318
+ let isMounted = true;
319
+ import('react-apexcharts').then((module) => {
320
+ if (isMounted) setChart(() => module.default);
321
+ });
322
+ return () => {
323
+ isMounted = false;
324
+ };
325
+ }, []);
326
+ if (!Chart) return null;
327
+ return /* @__PURE__ */ jsxRuntime.jsx(
328
+ Chart,
329
+ {
330
+ options: mergedOptions,
331
+ series: effectiveSeries,
332
+ type: "bar",
333
+ height: height ?? 180
334
+ }
335
+ );
336
+ };
337
+
338
+ exports.BarChart = BarChart;
339
+ //# sourceMappingURL=chunk-VEQ43DHE.cjs.map
340
+ //# sourceMappingURL=chunk-VEQ43DHE.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Charts/BarChart.tsx"],"names":["React","jsx"],"mappings":"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","file":"chunk-VEQ43DHE.cjs","sourcesContent":["\"use client\";\nimport React from \"react\";\nimport type { ApexOptions } from \"apexcharts\";\n\ntype ReactApexChartProps = {\n options: ApexOptions;\n series: ApexAxisChartSeries;\n type: \"bar\" | \"area\";\n height: number;\n};\ntype ReactApexChartComponent = React.ComponentType<ReactApexChartProps>;\n\nexport interface BarChartProps {\n series?: ApexAxisChartSeries;\n categories?: string[];\n colors?: string[];\n height?: number;\n horizontal?: boolean;\n showBarValues?: boolean;\n showBarPercentages?: boolean;\n percentageMode?: \"total\" | \"category\";\n barValueFormatter?: (value: number, context: BarChartLabelContext) => string;\n barPercentageFormatter?: (\n percentage: number,\n value: number,\n context: BarChartLabelContext\n ) => string;\n options?: ApexOptions;\n}\n\nexport interface BarChartLabelContext {\n seriesIndex: number;\n dataPointIndex: number;\n seriesName?: string;\n category?: string;\n total: number;\n}\n\nconst defaultOptions: ApexOptions = {\n colors: [\"#465fff\"],\n chart: {\n fontFamily: \"Outfit, sans-serif\",\n type: \"bar\",\n height: 180,\n toolbar: {\n show: false,\n },\n },\n plotOptions: {\n bar: {\n horizontal: false,\n columnWidth: \"39%\",\n borderRadius: 5,\n borderRadiusApplication: \"end\",\n },\n },\n dataLabels: {\n enabled: false,\n },\n // No transparent stroke around the columns: it shrinks and shifts the\n // painted bar inside its allocated slot, so the hover highlight band\n // (crosshairs width \"barWidth\" = the allocated width) would render wider\n // than — and offset from — the visible bar.\n stroke: {\n show: false,\n },\n xaxis: {\n categories: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n axisBorder: {\n show: false,\n },\n axisTicks: {\n show: false,\n },\n // Match the hover highlight band to the bar width (the default band spans\n // the whole category slot, looking ~3x wider than the 39% columns).\n crosshairs: {\n width: \"barWidth\",\n },\n },\n legend: {\n show: true,\n position: \"top\",\n horizontalAlign: \"left\",\n fontFamily: \"Outfit\",\n // Rounded, border-less swatches that echo the column styling. ApexCharts\n // sets the marker span's `color` to the series color, so `currentColor`\n // picks it up; `customHTML` lets us round the corners (the built-in shapes\n // are sharp SVG paths that CSS border-radius can't touch).\n markers: {\n size: 7,\n strokeWidth: 0,\n customHTML: () =>\n '<span style=\"display:block;height:100%;width:100%;border-radius:3px;background:currentColor\"></span>',\n },\n },\n yaxis: {\n title: {\n text: undefined,\n },\n },\n grid: {\n yaxis: {\n lines: {\n show: true,\n },\n },\n },\n fill: {\n opacity: 1,\n },\n tooltip: {\n x: {\n show: false,\n },\n y: {\n formatter: (val: number) => `${val}`,\n },\n },\n};\n\nconst defaultSeries: ApexAxisChartSeries = [\n {\n name: \"Sales\",\n data: [168, 385, 201, 298, 187, 195, 291, 110, 215, 390, 280, 112],\n },\n];\n\nconst horizontalGridOptions: ApexOptions[\"grid\"] = {\n borderColor: \"transparent\",\n xaxis: {\n lines: {\n show: false,\n },\n },\n yaxis: {\n lines: {\n show: false,\n },\n },\n};\n\nfunction mergeGridOptions(\n base: ApexOptions[\"grid\"],\n override: ApexOptions[\"grid\"]\n): ApexOptions[\"grid\"] {\n return {\n ...base,\n ...override,\n xaxis: {\n ...base?.xaxis,\n ...override?.xaxis,\n lines: {\n ...base?.xaxis?.lines,\n ...override?.xaxis?.lines,\n },\n },\n yaxis: {\n ...base?.yaxis,\n ...override?.yaxis,\n lines: {\n ...base?.yaxis?.lines,\n ...override?.yaxis?.lines,\n },\n },\n };\n}\n\nfunction getDataValue(value: unknown): number | null {\n if (typeof value === \"number\") return value;\n if (Array.isArray(value) && typeof value[1] === \"number\") return value[1];\n if (value && typeof value === \"object\" && \"y\" in value) {\n const y = (value as { y: unknown }).y;\n return typeof y === \"number\" ? y : null;\n }\n return null;\n}\n\nfunction getValueMatrix(series: ApexAxisChartSeries): number[][] {\n return series.map((item) => item.data.map((value) => getDataValue(value) ?? 0));\n}\n\nfunction getSeriesTotal(matrix: number[][]): number {\n return matrix.reduce(\n (seriesTotal, data) => seriesTotal + data.reduce((total, value) => total + value, 0),\n 0\n );\n}\n\nfunction getCategoryTotal(matrix: number[][], dataPointIndex: number): number {\n return matrix.reduce((total, data) => total + (data[dataPointIndex] ?? 0), 0);\n}\n\nfunction mergeDataLabels(\n base: ApexOptions[\"dataLabels\"],\n override: ApexOptions[\"dataLabels\"],\n generated: ApexOptions[\"dataLabels\"]\n): ApexOptions[\"dataLabels\"] {\n return {\n ...base,\n ...override,\n ...generated,\n style: {\n ...base?.style,\n ...override?.style,\n ...generated?.style,\n },\n background: {\n ...base?.background,\n ...override?.background,\n ...generated?.background,\n },\n };\n}\n\nfunction mergeAnnotations(\n override: ApexOptions[\"annotations\"],\n generated: ApexOptions[\"annotations\"]\n): ApexOptions[\"annotations\"] | undefined {\n if (!override && !generated) return undefined;\n return {\n ...override,\n ...generated,\n points: [...(override?.points ?? []), ...(generated?.points ?? [])],\n };\n}\n\nexport const BarChart: React.FC<BarChartProps> = ({\n series,\n categories,\n colors,\n height,\n horizontal,\n showBarValues = false,\n showBarPercentages = false,\n percentageMode = \"total\",\n barValueFormatter,\n barPercentageFormatter,\n options,\n}) => {\n const [Chart, setChart] = React.useState<ReactApexChartComponent | null>(null);\n const effectiveSeries = series ?? defaultSeries;\n const effectiveCategories =\n categories ?? (options?.xaxis?.categories as string[] | undefined);\n const valueMatrix = getValueMatrix(effectiveSeries);\n const seriesTotal = getSeriesTotal(valueMatrix);\n const isHorizontal = horizontal ?? (options?.plotOptions?.bar?.horizontal === true);\n const hasGeneratedLabels = showBarValues || showBarPercentages;\n const baseGridOptions = isHorizontal\n ? mergeGridOptions(defaultOptions.grid, horizontalGridOptions)\n : defaultOptions.grid;\n const getLabelContext = (\n seriesIndex: number,\n dataPointIndex: number,\n total: number\n ): BarChartLabelContext => ({\n seriesIndex,\n dataPointIndex,\n seriesName: effectiveSeries[seriesIndex]?.name,\n category: effectiveCategories?.[dataPointIndex],\n total,\n });\n const generatedDataLabels: ApexOptions[\"dataLabels\"] | undefined = hasGeneratedLabels\n ? {\n enabled: true,\n textAnchor: \"middle\",\n offsetX: 0,\n offsetY: 0,\n background: {\n enabled: false,\n },\n style: {\n fontSize: \"12px\",\n fontWeight: 600,\n colors: [showBarPercentages ? \"#ffffff\" : \"#344054\"],\n },\n formatter: (value, opts) => {\n const seriesIndex = opts?.seriesIndex ?? 0;\n const dataPointIndex = opts?.dataPointIndex ?? 0;\n const numericValue =\n typeof value === \"number\"\n ? value\n : valueMatrix[seriesIndex]?.[dataPointIndex] ?? 0;\n const total =\n percentageMode === \"category\"\n ? getCategoryTotal(valueMatrix, dataPointIndex)\n : seriesTotal;\n const context = getLabelContext(seriesIndex, dataPointIndex, total);\n\n if (showBarPercentages) {\n const percentage = total > 0 ? (numericValue / total) * 100 : 0;\n return barPercentageFormatter\n ? barPercentageFormatter(percentage, numericValue, context)\n : `${Math.round(percentage)}%`;\n }\n\n return barValueFormatter\n ? barValueFormatter(numericValue, context)\n : `${numericValue}`;\n },\n }\n : undefined;\n const generatedAnnotations: ApexOptions[\"annotations\"] | undefined =\n isHorizontal && showBarValues\n ? {\n points: effectiveSeries.flatMap((item, seriesIndex) =>\n item.data.map((dataPoint, dataPointIndex) => {\n const value = getDataValue(dataPoint) ?? 0;\n const total =\n percentageMode === \"category\"\n ? getCategoryTotal(valueMatrix, dataPointIndex)\n : seriesTotal;\n const context = getLabelContext(seriesIndex, dataPointIndex, total);\n return {\n x: value,\n y: dataPointIndex,\n seriesIndex,\n marker: {\n size: 0,\n },\n label: {\n text: barValueFormatter ? barValueFormatter(value, context) : `${value}`,\n borderWidth: 0,\n offsetY: -12,\n style: {\n background: \"transparent\",\n color: \"#344054\",\n fontSize: \"12px\",\n fontWeight: 600,\n padding: {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n },\n },\n },\n };\n })\n ),\n }\n : undefined;\n const mergedOptions: ApexOptions = {\n ...defaultOptions,\n ...options,\n colors: colors ?? options?.colors ?? defaultOptions.colors,\n chart: {\n ...defaultOptions.chart,\n ...options?.chart,\n height: height ?? options?.chart?.height ?? defaultOptions.chart?.height,\n },\n plotOptions: {\n ...defaultOptions.plotOptions,\n ...options?.plotOptions,\n bar: {\n ...defaultOptions.plotOptions?.bar,\n ...options?.plotOptions?.bar,\n horizontal: isHorizontal,\n ...(hasGeneratedLabels && {\n dataLabels: {\n ...options?.plotOptions?.bar?.dataLabels,\n position: showBarPercentages ? \"center\" : \"top\",\n },\n }),\n },\n },\n dataLabels: mergeDataLabels(\n defaultOptions.dataLabels,\n options?.dataLabels,\n generatedDataLabels\n ),\n xaxis: {\n ...defaultOptions.xaxis,\n ...options?.xaxis,\n categories:\n categories ??\n options?.xaxis?.categories ??\n defaultOptions.xaxis?.categories,\n },\n grid: mergeGridOptions(baseGridOptions, options?.grid),\n annotations: mergeAnnotations(options?.annotations, generatedAnnotations),\n };\n\n React.useEffect(() => {\n let isMounted = true;\n\n import(\"react-apexcharts\").then((module) => {\n if (isMounted) setChart(() => module.default as ReactApexChartComponent);\n });\n\n return () => {\n isMounted = false;\n };\n }, []);\n\n if (!Chart) return null;\n\n return (\n <Chart\n options={mergedOptions}\n series={effectiveSeries}\n type=\"bar\"\n height={height ?? 180}\n />\n );\n};\n"]}
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import Chart from 'react-apexcharts';
2
+ import React from 'react';
3
3
  import { jsx } from 'react/jsx-runtime';
4
4
 
5
5
  var defaultOptions = {
@@ -123,6 +123,7 @@ var LineChart = ({
123
123
  height,
124
124
  options
125
125
  }) => {
126
+ const [Chart, setChart] = React.useState(null);
126
127
  const mergedOptions = {
127
128
  ...defaultOptions,
128
129
  ...options,
@@ -138,6 +139,16 @@ var LineChart = ({
138
139
  categories: categories ?? options?.xaxis?.categories ?? defaultOptions.xaxis?.categories
139
140
  }
140
141
  };
142
+ React.useEffect(() => {
143
+ let isMounted = true;
144
+ import('react-apexcharts').then((module) => {
145
+ if (isMounted) setChart(() => module.default);
146
+ });
147
+ return () => {
148
+ isMounted = false;
149
+ };
150
+ }, []);
151
+ if (!Chart) return null;
141
152
  return /* @__PURE__ */ jsx(
142
153
  Chart,
143
154
  {
@@ -150,5 +161,5 @@ var LineChart = ({
150
161
  };
151
162
 
152
163
  export { LineChart };
153
- //# sourceMappingURL=chunk-NWIOJGF7.js.map
154
- //# sourceMappingURL=chunk-NWIOJGF7.js.map
164
+ //# sourceMappingURL=chunk-W6E275RF.js.map
165
+ //# sourceMappingURL=chunk-W6E275RF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Charts/LineChart.tsx"],"names":[],"mappings":"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","file":"chunk-W6E275RF.js","sourcesContent":["\"use client\";\nimport React from \"react\";\nimport type { ApexOptions } from \"apexcharts\";\n\ntype ReactApexChartProps = {\n options: ApexOptions;\n series: ApexAxisChartSeries;\n type: \"bar\" | \"area\";\n height: number;\n};\ntype ReactApexChartComponent = React.ComponentType<ReactApexChartProps>;\n\nexport interface LineChartProps {\n series?: ApexAxisChartSeries;\n categories?: string[];\n colors?: string[];\n height?: number;\n options?: ApexOptions;\n}\n\nconst defaultOptions: ApexOptions = {\n legend: {\n show: false,\n position: \"top\",\n horizontalAlign: \"left\",\n // Rounded, border-less swatches (visible when the legend is enabled).\n // ApexCharts sets the marker span's `color` to the series color, so\n // `currentColor` picks it up; `customHTML` rounds the corners.\n markers: {\n size: 7,\n strokeWidth: 0,\n customHTML: () =>\n '<span style=\"display:block;height:100%;width:100%;border-radius:3px;background:currentColor\"></span>',\n },\n },\n colors: [\"#465FFF\", \"#9CB9FF\"],\n chart: {\n fontFamily: \"Outfit, sans-serif\",\n height: 310,\n type: \"line\",\n toolbar: {\n show: false,\n },\n },\n stroke: {\n curve: \"straight\",\n width: [2, 2],\n },\n fill: {\n type: \"gradient\",\n gradient: {\n opacityFrom: 0.55,\n opacityTo: 0,\n },\n },\n markers: {\n size: 0,\n strokeColors: \"#fff\",\n strokeWidth: 2,\n hover: {\n size: 6,\n },\n },\n grid: {\n xaxis: {\n lines: {\n show: false,\n },\n },\n yaxis: {\n lines: {\n show: true,\n },\n },\n },\n dataLabels: {\n enabled: false,\n },\n tooltip: {\n enabled: true,\n x: {\n format: \"dd MMM yyyy\",\n },\n },\n xaxis: {\n type: \"category\",\n categories: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n axisBorder: {\n show: false,\n },\n axisTicks: {\n show: false,\n },\n tooltip: {\n enabled: false,\n },\n },\n yaxis: {\n labels: {\n style: {\n fontSize: \"12px\",\n colors: [\"#6B7280\"],\n },\n },\n title: {\n text: \"\",\n style: {\n fontSize: \"0px\",\n },\n },\n },\n};\n\nconst defaultSeries: ApexAxisChartSeries = [\n {\n name: \"Sales\",\n data: [180, 190, 170, 160, 175, 165, 170, 205, 230, 210, 240, 235],\n },\n {\n name: \"Revenue\",\n data: [40, 30, 50, 40, 55, 40, 70, 100, 110, 120, 150, 140],\n },\n];\n\nexport const LineChart: React.FC<LineChartProps> = ({\n series,\n categories,\n colors,\n height,\n options,\n}) => {\n const [Chart, setChart] = React.useState<ReactApexChartComponent | null>(null);\n const mergedOptions: ApexOptions = {\n ...defaultOptions,\n ...options,\n colors: colors ?? options?.colors ?? defaultOptions.colors,\n chart: {\n ...defaultOptions.chart,\n ...options?.chart,\n height: height ?? options?.chart?.height ?? defaultOptions.chart?.height,\n },\n xaxis: {\n ...defaultOptions.xaxis,\n ...options?.xaxis,\n categories:\n categories ??\n options?.xaxis?.categories ??\n defaultOptions.xaxis?.categories,\n },\n };\n\n React.useEffect(() => {\n let isMounted = true;\n\n import(\"react-apexcharts\").then((module) => {\n if (isMounted) setChart(() => module.default as ReactApexChartComponent);\n });\n\n return () => {\n isMounted = false;\n };\n }, []);\n\n if (!Chart) return null;\n\n return (\n <Chart\n options={mergedOptions}\n series={series ?? defaultSeries}\n type=\"area\"\n height={height ?? 310}\n />\n );\n};\n"]}