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