@andreagiugni/tailwind-dashboard-ui 1.0.14 → 1.0.16
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-OXOGLCGX.js → chunk-C7OCYM5S.js} +118 -47
- package/dist/chunk-C7OCYM5S.js.map +1 -0
- package/dist/{chunk-WIBFUDZM.cjs → chunk-MIIZ4KLS.cjs} +118 -47
- package/dist/chunk-MIIZ4KLS.cjs.map +1 -0
- package/dist/components/Charts/BarChart.cjs +2 -2
- package/dist/components/Charts/BarChart.d.cts +3 -0
- package/dist/components/Charts/BarChart.d.ts +3 -0
- package/dist/components/Charts/BarChart.js +1 -1
- package/dist/index.cjs +7 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-OXOGLCGX.js.map +0 -1
- package/dist/chunk-WIBFUDZM.cjs.map +0 -1
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?`, `horizontal?`, `showBarValues?`, `showBarPercentages?`, `
|
|
224
|
+
| `BarChart` | `series`, `categories`, `colors?`, `barColors?` (per-option bar colors), `height?`, `horizontal?`, `showBarValues?`, `showBarPercentages?`, `minBarWidth?` (fixed px minimum for horizontal bars, default `30`), `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 |
|
|
@@ -170,27 +170,42 @@ function getSeriesTotal(matrix) {
|
|
|
170
170
|
function getCategoryTotal(matrix, dataPointIndex) {
|
|
171
171
|
return matrix.reduce((total, data) => total + (data[dataPointIndex] ?? 0), 0);
|
|
172
172
|
}
|
|
173
|
-
function
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
if (
|
|
182
|
-
|
|
183
|
-
|
|
173
|
+
function withDataPointColor(value, fillColor, dataPointIndex, categories) {
|
|
174
|
+
if (Array.isArray(value)) {
|
|
175
|
+
return {
|
|
176
|
+
x: value[0],
|
|
177
|
+
y: value[1],
|
|
178
|
+
fillColor
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
if (value && typeof value === "object") {
|
|
182
|
+
return {
|
|
183
|
+
...value,
|
|
184
|
+
fillColor
|
|
185
|
+
};
|
|
184
186
|
}
|
|
185
|
-
return
|
|
187
|
+
return {
|
|
188
|
+
x: categories?.[dataPointIndex] ?? dataPointIndex,
|
|
189
|
+
y: value,
|
|
190
|
+
fillColor
|
|
191
|
+
};
|
|
186
192
|
}
|
|
187
|
-
function
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
193
|
+
function applyBarColors(series, barColors, fallbackColors, categories) {
|
|
194
|
+
if (!barColors?.length) return series;
|
|
195
|
+
return series.map((item, seriesIndex) => {
|
|
196
|
+
const fallbackColor = fallbackColors?.[seriesIndex] ?? fallbackColors?.[0] ?? defaultOptions.colors?.[0];
|
|
197
|
+
return {
|
|
198
|
+
...item,
|
|
199
|
+
data: item.data.map(
|
|
200
|
+
(value, dataPointIndex) => withDataPointColor(
|
|
201
|
+
value,
|
|
202
|
+
barColors[dataPointIndex] ?? fallbackColor ?? "#465fff",
|
|
203
|
+
dataPointIndex,
|
|
204
|
+
categories
|
|
205
|
+
)
|
|
206
|
+
)
|
|
207
|
+
};
|
|
208
|
+
});
|
|
194
209
|
}
|
|
195
210
|
function mergeDataLabels(base, override, generated) {
|
|
196
211
|
return {
|
|
@@ -237,15 +252,63 @@ function mergeAnnotations(override, generated) {
|
|
|
237
252
|
points: [...override?.points ?? [], ...generated?.points ?? []]
|
|
238
253
|
};
|
|
239
254
|
}
|
|
255
|
+
function getChartElement(chartContext) {
|
|
256
|
+
if (typeof Element === "undefined") return null;
|
|
257
|
+
if (!chartContext || typeof chartContext !== "object" || !("el" in chartContext)) return null;
|
|
258
|
+
const element = chartContext.el;
|
|
259
|
+
return element instanceof Element ? element : null;
|
|
260
|
+
}
|
|
261
|
+
function applyMinimumHorizontalBarWidth(chartContext, minBarWidth, valueMatrix) {
|
|
262
|
+
const root = getChartElement(chartContext);
|
|
263
|
+
if (!root) return;
|
|
264
|
+
root.querySelectorAll("[data-taildashboard-min-bar]").forEach((element) => element.remove());
|
|
265
|
+
if (minBarWidth <= 0) return;
|
|
266
|
+
const values = valueMatrix.flat();
|
|
267
|
+
const paths = Array.from(root.querySelectorAll(".apexcharts-bar-area"));
|
|
268
|
+
const documentRef = root.ownerDocument;
|
|
269
|
+
paths.forEach((path, index) => {
|
|
270
|
+
const value = values[index] ?? 0;
|
|
271
|
+
if (value < 0 || typeof path.getBBox !== "function") return;
|
|
272
|
+
const box = path.getBBox();
|
|
273
|
+
if (box.width >= minBarWidth || box.height <= 0) return;
|
|
274
|
+
const overlay = documentRef.createElementNS("http://www.w3.org/2000/svg", "rect");
|
|
275
|
+
const radius = Math.min(5, box.height / 2, minBarWidth / 2);
|
|
276
|
+
overlay.setAttribute("data-taildashboard-min-bar", "true");
|
|
277
|
+
overlay.setAttribute("x", `${box.x}`);
|
|
278
|
+
overlay.setAttribute("y", `${box.y}`);
|
|
279
|
+
overlay.setAttribute("width", `${minBarWidth}`);
|
|
280
|
+
overlay.setAttribute("height", `${box.height}`);
|
|
281
|
+
overlay.setAttribute("rx", `${radius}`);
|
|
282
|
+
overlay.setAttribute("fill", path.getAttribute("fill") ?? path.style.fill ?? "currentColor");
|
|
283
|
+
overlay.setAttribute("opacity", path.getAttribute("opacity") ?? path.style.opacity ?? "1");
|
|
284
|
+
overlay.style.pointerEvents = "none";
|
|
285
|
+
path.parentNode?.insertBefore(overlay, path.nextSibling);
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
function scheduleMinimumHorizontalBarWidth(chartContext, minBarWidth, valueMatrix) {
|
|
289
|
+
applyMinimumHorizontalBarWidth(chartContext, minBarWidth, valueMatrix);
|
|
290
|
+
if (typeof window === "undefined" || typeof window.requestAnimationFrame !== "function") return;
|
|
291
|
+
window.requestAnimationFrame(() => {
|
|
292
|
+
applyMinimumHorizontalBarWidth(chartContext, minBarWidth, valueMatrix);
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
function composeMinimumBarWidthEvent(userEvent, minBarWidth, valueMatrix) {
|
|
296
|
+
return (chart, eventOptions) => {
|
|
297
|
+
userEvent?.(chart, eventOptions);
|
|
298
|
+
scheduleMinimumHorizontalBarWidth(chart, minBarWidth, valueMatrix);
|
|
299
|
+
};
|
|
300
|
+
}
|
|
240
301
|
var BarChart = ({
|
|
241
302
|
series,
|
|
242
303
|
categories,
|
|
243
304
|
colors,
|
|
305
|
+
barColors,
|
|
244
306
|
height,
|
|
245
307
|
horizontal,
|
|
246
308
|
showBarValues = false,
|
|
247
309
|
showBarPercentages = false,
|
|
248
|
-
|
|
310
|
+
minBarWidth,
|
|
311
|
+
minBarPercentage,
|
|
249
312
|
percentageMode = "total",
|
|
250
313
|
barValueFormatter,
|
|
251
314
|
barPercentageFormatter,
|
|
@@ -254,16 +317,19 @@ var BarChart = ({
|
|
|
254
317
|
const [Chart, setChart] = React.useState(null);
|
|
255
318
|
const effectiveSeries = series ?? defaultSeries;
|
|
256
319
|
const effectiveCategories = categories ?? options?.xaxis?.categories;
|
|
320
|
+
const effectiveColors = colors ?? options?.colors ?? defaultOptions.colors;
|
|
321
|
+
const chartSeries = applyBarColors(
|
|
322
|
+
effectiveSeries,
|
|
323
|
+
barColors,
|
|
324
|
+
effectiveColors,
|
|
325
|
+
effectiveCategories
|
|
326
|
+
);
|
|
257
327
|
const valueMatrix = getValueMatrix(effectiveSeries);
|
|
258
328
|
const seriesTotal = getSeriesTotal(valueMatrix);
|
|
259
329
|
const isHorizontal = horizontal ?? options?.plotOptions?.bar?.horizontal === true;
|
|
260
330
|
const hasGeneratedLabels = showBarValues || showBarPercentages;
|
|
261
|
-
const
|
|
262
|
-
const
|
|
263
|
-
const minimumBarValue = minimumValueScale * (Math.max(0, minBarPercentage) / 100);
|
|
264
|
-
const hasMinimumBarValue = isHorizontal && minimumBarValue > 0;
|
|
265
|
-
const chartSeries = hasMinimumBarValue ? applyMinimumBarValue(effectiveSeries, minimumBarValue) : effectiveSeries;
|
|
266
|
-
const chartValueMatrix = getValueMatrix(chartSeries);
|
|
331
|
+
const resolvedMinBarWidth = minBarWidth ?? (minBarPercentage === 0 ? 0 : 30);
|
|
332
|
+
const hasMinimumBarWidth = isHorizontal && resolvedMinBarWidth > 0;
|
|
267
333
|
const baseGridOptions = isHorizontal ? mergeGridOptions(defaultOptions.grid, horizontalGridOptions) : defaultOptions.grid;
|
|
268
334
|
const getLabelContext = (seriesIndex, dataPointIndex, total) => ({
|
|
269
335
|
seriesIndex,
|
|
@@ -302,11 +368,10 @@ var BarChart = ({
|
|
|
302
368
|
points: effectiveSeries.flatMap(
|
|
303
369
|
(item, seriesIndex) => item.data.map((dataPoint, dataPointIndex) => {
|
|
304
370
|
const value = getDataValue(dataPoint) ?? 0;
|
|
305
|
-
const chartValue = chartValueMatrix[seriesIndex]?.[dataPointIndex] ?? value;
|
|
306
371
|
const total = percentageMode === "category" ? getCategoryTotal(valueMatrix, dataPointIndex) : seriesTotal;
|
|
307
372
|
const context = getLabelContext(seriesIndex, dataPointIndex, total);
|
|
308
373
|
return {
|
|
309
|
-
x:
|
|
374
|
+
x: value,
|
|
310
375
|
y: dataPointIndex,
|
|
311
376
|
seriesIndex,
|
|
312
377
|
marker: {
|
|
@@ -333,24 +398,33 @@ var BarChart = ({
|
|
|
333
398
|
})
|
|
334
399
|
)
|
|
335
400
|
} : void 0;
|
|
336
|
-
const
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
401
|
+
const userChartEvents = options?.chart?.events;
|
|
402
|
+
const generatedChartEvents = hasMinimumBarWidth ? {
|
|
403
|
+
...userChartEvents,
|
|
404
|
+
mounted: composeMinimumBarWidthEvent(
|
|
405
|
+
userChartEvents?.mounted,
|
|
406
|
+
resolvedMinBarWidth,
|
|
407
|
+
valueMatrix
|
|
408
|
+
),
|
|
409
|
+
updated: composeMinimumBarWidthEvent(
|
|
410
|
+
userChartEvents?.updated,
|
|
411
|
+
resolvedMinBarWidth,
|
|
412
|
+
valueMatrix
|
|
413
|
+
),
|
|
414
|
+
animationEnd: composeMinimumBarWidthEvent(
|
|
415
|
+
userChartEvents?.animationEnd,
|
|
416
|
+
resolvedMinBarWidth,
|
|
417
|
+
valueMatrix
|
|
418
|
+
)
|
|
419
|
+
} : userChartEvents;
|
|
347
420
|
const mergedOptions = {
|
|
348
421
|
...defaultOptions,
|
|
349
422
|
...options,
|
|
350
|
-
colors:
|
|
423
|
+
colors: effectiveColors,
|
|
351
424
|
chart: {
|
|
352
425
|
...defaultOptions.chart,
|
|
353
426
|
...options?.chart,
|
|
427
|
+
events: generatedChartEvents,
|
|
354
428
|
animations: {
|
|
355
429
|
...defaultOptions.chart?.animations,
|
|
356
430
|
...options?.chart?.animations,
|
|
@@ -388,14 +462,11 @@ var BarChart = ({
|
|
|
388
462
|
xaxis: {
|
|
389
463
|
...defaultOptions.xaxis,
|
|
390
464
|
...options?.xaxis,
|
|
391
|
-
categories: categories ?? options?.xaxis?.categories ?? defaultOptions.xaxis?.categories
|
|
392
|
-
...hasMinimumBarValue && options?.xaxis?.max === void 0 && {
|
|
393
|
-
max: minimumValueScale
|
|
394
|
-
}
|
|
465
|
+
categories: categories ?? options?.xaxis?.categories ?? defaultOptions.xaxis?.categories
|
|
395
466
|
},
|
|
396
467
|
grid: mergeGridOptions(baseGridOptions, options?.grid),
|
|
397
468
|
annotations: mergeAnnotations(options?.annotations, generatedAnnotations),
|
|
398
|
-
tooltip: mergeTooltipOptions(defaultOptions.tooltip, options?.tooltip,
|
|
469
|
+
tooltip: mergeTooltipOptions(defaultOptions.tooltip, options?.tooltip, void 0)
|
|
399
470
|
};
|
|
400
471
|
React.useEffect(() => {
|
|
401
472
|
let isMounted = true;
|
|
@@ -419,5 +490,5 @@ var BarChart = ({
|
|
|
419
490
|
};
|
|
420
491
|
|
|
421
492
|
export { BarChart };
|
|
422
|
-
//# sourceMappingURL=chunk-
|
|
423
|
-
//# sourceMappingURL=chunk-
|
|
493
|
+
//# sourceMappingURL=chunk-C7OCYM5S.js.map
|
|
494
|
+
//# sourceMappingURL=chunk-C7OCYM5S.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Charts/BarChart.tsx"],"names":[],"mappings":"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","file":"chunk-C7OCYM5S.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 barColors?: string[];\n height?: number;\n horizontal?: boolean;\n showBarValues?: boolean;\n showBarPercentages?: boolean;\n minBarWidth?: number;\n /** @deprecated Use minBarWidth. Passing 0 still disables the minimum visual width. */\n minBarPercentage?: number;\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 animations: {\n enabled: true,\n speed: 200,\n animateGradually: {\n enabled: false,\n delay: 0,\n },\n dynamicAnimation: {\n enabled: true,\n speed: 175,\n },\n },\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 withDataPointColor(\n value: unknown,\n fillColor: string,\n dataPointIndex: number,\n categories?: string[]\n): unknown {\n if (Array.isArray(value)) {\n return {\n x: value[0],\n y: value[1],\n fillColor,\n };\n }\n\n if (value && typeof value === \"object\") {\n return {\n ...value,\n fillColor,\n };\n }\n\n return {\n x: categories?.[dataPointIndex] ?? dataPointIndex,\n y: value,\n fillColor,\n };\n}\n\nfunction applyBarColors(\n series: ApexAxisChartSeries,\n barColors: string[] | undefined,\n fallbackColors: string[] | undefined,\n categories?: string[]\n): ApexAxisChartSeries {\n if (!barColors?.length) return series;\n\n return series.map((item, seriesIndex) => {\n const fallbackColor =\n fallbackColors?.[seriesIndex] ?? fallbackColors?.[0] ?? defaultOptions.colors?.[0];\n\n return {\n ...item,\n data: item.data.map((value, dataPointIndex) =>\n withDataPointColor(\n value,\n barColors[dataPointIndex] ?? fallbackColor ?? \"#465fff\",\n dataPointIndex,\n categories\n )\n ) as typeof item.data,\n };\n });\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 mergeTooltipOptions(\n base: ApexOptions[\"tooltip\"],\n override: ApexOptions[\"tooltip\"],\n generated: ApexOptions[\"tooltip\"]\n): ApexOptions[\"tooltip\"] {\n const baseY = Array.isArray(base?.y) ? undefined : base?.y;\n const overrideY = Array.isArray(override?.y) ? undefined : override?.y;\n const generatedY = Array.isArray(generated?.y) ? undefined : generated?.y;\n\n return {\n ...base,\n ...override,\n ...generated,\n x: {\n ...base?.x,\n ...override?.x,\n ...generated?.x,\n },\n y: {\n ...baseY,\n ...overrideY,\n ...generatedY,\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\nfunction getChartElement(chartContext: unknown): Element | null {\n if (typeof Element === \"undefined\") return null;\n if (!chartContext || typeof chartContext !== \"object\" || !(\"el\" in chartContext)) return null;\n\n const element = (chartContext as { el?: unknown }).el;\n return element instanceof Element ? element : null;\n}\n\nfunction applyMinimumHorizontalBarWidth(\n chartContext: unknown,\n minBarWidth: number,\n valueMatrix: number[][]\n) {\n const root = getChartElement(chartContext);\n if (!root) return;\n\n root\n .querySelectorAll(\"[data-taildashboard-min-bar]\")\n .forEach((element) => element.remove());\n\n if (minBarWidth <= 0) return;\n\n const values = valueMatrix.flat();\n const paths = Array.from(root.querySelectorAll<SVGPathElement>(\".apexcharts-bar-area\"));\n const documentRef = root.ownerDocument;\n\n paths.forEach((path, index) => {\n const value = values[index] ?? 0;\n if (value < 0 || typeof path.getBBox !== \"function\") return;\n\n const box = path.getBBox();\n if (box.width >= minBarWidth || box.height <= 0) return;\n\n const overlay = documentRef.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n const radius = Math.min(5, box.height / 2, minBarWidth / 2);\n overlay.setAttribute(\"data-taildashboard-min-bar\", \"true\");\n overlay.setAttribute(\"x\", `${box.x}`);\n overlay.setAttribute(\"y\", `${box.y}`);\n overlay.setAttribute(\"width\", `${minBarWidth}`);\n overlay.setAttribute(\"height\", `${box.height}`);\n overlay.setAttribute(\"rx\", `${radius}`);\n overlay.setAttribute(\"fill\", path.getAttribute(\"fill\") ?? path.style.fill ?? \"currentColor\");\n overlay.setAttribute(\"opacity\", path.getAttribute(\"opacity\") ?? path.style.opacity ?? \"1\");\n overlay.style.pointerEvents = \"none\";\n path.parentNode?.insertBefore(overlay, path.nextSibling);\n });\n}\n\nfunction scheduleMinimumHorizontalBarWidth(\n chartContext: unknown,\n minBarWidth: number,\n valueMatrix: number[][]\n) {\n applyMinimumHorizontalBarWidth(chartContext, minBarWidth, valueMatrix);\n\n if (typeof window === \"undefined\" || typeof window.requestAnimationFrame !== \"function\") return;\n\n window.requestAnimationFrame(() => {\n applyMinimumHorizontalBarWidth(chartContext, minBarWidth, valueMatrix);\n });\n}\n\ntype ApexChartEvents = NonNullable<NonNullable<ApexOptions[\"chart\"]>[\"events\"]>;\ntype ApexLifecycleEvent = NonNullable<ApexChartEvents[\"mounted\"]>;\n\nfunction composeMinimumBarWidthEvent(\n userEvent: ApexLifecycleEvent | undefined,\n minBarWidth: number,\n valueMatrix: number[][]\n): ApexLifecycleEvent {\n return (chart, eventOptions) => {\n userEvent?.(chart, eventOptions);\n scheduleMinimumHorizontalBarWidth(chart, minBarWidth, valueMatrix);\n };\n}\n\nexport const BarChart: React.FC<BarChartProps> = ({\n series,\n categories,\n colors,\n barColors,\n height,\n horizontal,\n showBarValues = false,\n showBarPercentages = false,\n minBarWidth,\n minBarPercentage,\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 effectiveColors = colors ?? options?.colors ?? defaultOptions.colors;\n const chartSeries = applyBarColors(\n effectiveSeries,\n barColors,\n effectiveColors as string[] | undefined,\n effectiveCategories\n );\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 resolvedMinBarWidth = minBarWidth ?? (minBarPercentage === 0 ? 0 : 30);\n const hasMinimumBarWidth = isHorizontal && resolvedMinBarWidth > 0;\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 = 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 userChartEvents = options?.chart?.events;\n const generatedChartEvents: ApexChartEvents | undefined = hasMinimumBarWidth\n ? {\n ...userChartEvents,\n mounted: composeMinimumBarWidthEvent(\n userChartEvents?.mounted,\n resolvedMinBarWidth,\n valueMatrix\n ),\n updated: composeMinimumBarWidthEvent(\n userChartEvents?.updated,\n resolvedMinBarWidth,\n valueMatrix\n ),\n animationEnd: composeMinimumBarWidthEvent(\n userChartEvents?.animationEnd,\n resolvedMinBarWidth,\n valueMatrix\n ),\n }\n : userChartEvents;\n const mergedOptions: ApexOptions = {\n ...defaultOptions,\n ...options,\n colors: effectiveColors,\n chart: {\n ...defaultOptions.chart,\n ...options?.chart,\n events: generatedChartEvents,\n animations: {\n ...defaultOptions.chart?.animations,\n ...options?.chart?.animations,\n animateGradually: {\n ...defaultOptions.chart?.animations?.animateGradually,\n ...options?.chart?.animations?.animateGradually,\n },\n dynamicAnimation: {\n ...defaultOptions.chart?.animations?.dynamicAnimation,\n ...options?.chart?.animations?.dynamicAnimation,\n },\n },\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 tooltip: mergeTooltipOptions(defaultOptions.tooltip, options?.tooltip, undefined),\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={chartSeries}\n type=\"bar\"\n height={height ?? 180}\n />\n );\n};\n"]}
|
|
@@ -176,27 +176,42 @@ function getSeriesTotal(matrix) {
|
|
|
176
176
|
function getCategoryTotal(matrix, dataPointIndex) {
|
|
177
177
|
return matrix.reduce((total, data) => total + (data[dataPointIndex] ?? 0), 0);
|
|
178
178
|
}
|
|
179
|
-
function
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
if (
|
|
188
|
-
|
|
189
|
-
|
|
179
|
+
function withDataPointColor(value, fillColor, dataPointIndex, categories) {
|
|
180
|
+
if (Array.isArray(value)) {
|
|
181
|
+
return {
|
|
182
|
+
x: value[0],
|
|
183
|
+
y: value[1],
|
|
184
|
+
fillColor
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
if (value && typeof value === "object") {
|
|
188
|
+
return {
|
|
189
|
+
...value,
|
|
190
|
+
fillColor
|
|
191
|
+
};
|
|
190
192
|
}
|
|
191
|
-
return
|
|
193
|
+
return {
|
|
194
|
+
x: categories?.[dataPointIndex] ?? dataPointIndex,
|
|
195
|
+
y: value,
|
|
196
|
+
fillColor
|
|
197
|
+
};
|
|
192
198
|
}
|
|
193
|
-
function
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
199
|
+
function applyBarColors(series, barColors, fallbackColors, categories) {
|
|
200
|
+
if (!barColors?.length) return series;
|
|
201
|
+
return series.map((item, seriesIndex) => {
|
|
202
|
+
const fallbackColor = fallbackColors?.[seriesIndex] ?? fallbackColors?.[0] ?? defaultOptions.colors?.[0];
|
|
203
|
+
return {
|
|
204
|
+
...item,
|
|
205
|
+
data: item.data.map(
|
|
206
|
+
(value, dataPointIndex) => withDataPointColor(
|
|
207
|
+
value,
|
|
208
|
+
barColors[dataPointIndex] ?? fallbackColor ?? "#465fff",
|
|
209
|
+
dataPointIndex,
|
|
210
|
+
categories
|
|
211
|
+
)
|
|
212
|
+
)
|
|
213
|
+
};
|
|
214
|
+
});
|
|
200
215
|
}
|
|
201
216
|
function mergeDataLabels(base, override, generated) {
|
|
202
217
|
return {
|
|
@@ -243,15 +258,63 @@ function mergeAnnotations(override, generated) {
|
|
|
243
258
|
points: [...override?.points ?? [], ...generated?.points ?? []]
|
|
244
259
|
};
|
|
245
260
|
}
|
|
261
|
+
function getChartElement(chartContext) {
|
|
262
|
+
if (typeof Element === "undefined") return null;
|
|
263
|
+
if (!chartContext || typeof chartContext !== "object" || !("el" in chartContext)) return null;
|
|
264
|
+
const element = chartContext.el;
|
|
265
|
+
return element instanceof Element ? element : null;
|
|
266
|
+
}
|
|
267
|
+
function applyMinimumHorizontalBarWidth(chartContext, minBarWidth, valueMatrix) {
|
|
268
|
+
const root = getChartElement(chartContext);
|
|
269
|
+
if (!root) return;
|
|
270
|
+
root.querySelectorAll("[data-taildashboard-min-bar]").forEach((element) => element.remove());
|
|
271
|
+
if (minBarWidth <= 0) return;
|
|
272
|
+
const values = valueMatrix.flat();
|
|
273
|
+
const paths = Array.from(root.querySelectorAll(".apexcharts-bar-area"));
|
|
274
|
+
const documentRef = root.ownerDocument;
|
|
275
|
+
paths.forEach((path, index) => {
|
|
276
|
+
const value = values[index] ?? 0;
|
|
277
|
+
if (value < 0 || typeof path.getBBox !== "function") return;
|
|
278
|
+
const box = path.getBBox();
|
|
279
|
+
if (box.width >= minBarWidth || box.height <= 0) return;
|
|
280
|
+
const overlay = documentRef.createElementNS("http://www.w3.org/2000/svg", "rect");
|
|
281
|
+
const radius = Math.min(5, box.height / 2, minBarWidth / 2);
|
|
282
|
+
overlay.setAttribute("data-taildashboard-min-bar", "true");
|
|
283
|
+
overlay.setAttribute("x", `${box.x}`);
|
|
284
|
+
overlay.setAttribute("y", `${box.y}`);
|
|
285
|
+
overlay.setAttribute("width", `${minBarWidth}`);
|
|
286
|
+
overlay.setAttribute("height", `${box.height}`);
|
|
287
|
+
overlay.setAttribute("rx", `${radius}`);
|
|
288
|
+
overlay.setAttribute("fill", path.getAttribute("fill") ?? path.style.fill ?? "currentColor");
|
|
289
|
+
overlay.setAttribute("opacity", path.getAttribute("opacity") ?? path.style.opacity ?? "1");
|
|
290
|
+
overlay.style.pointerEvents = "none";
|
|
291
|
+
path.parentNode?.insertBefore(overlay, path.nextSibling);
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
function scheduleMinimumHorizontalBarWidth(chartContext, minBarWidth, valueMatrix) {
|
|
295
|
+
applyMinimumHorizontalBarWidth(chartContext, minBarWidth, valueMatrix);
|
|
296
|
+
if (typeof window === "undefined" || typeof window.requestAnimationFrame !== "function") return;
|
|
297
|
+
window.requestAnimationFrame(() => {
|
|
298
|
+
applyMinimumHorizontalBarWidth(chartContext, minBarWidth, valueMatrix);
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
function composeMinimumBarWidthEvent(userEvent, minBarWidth, valueMatrix) {
|
|
302
|
+
return (chart, eventOptions) => {
|
|
303
|
+
userEvent?.(chart, eventOptions);
|
|
304
|
+
scheduleMinimumHorizontalBarWidth(chart, minBarWidth, valueMatrix);
|
|
305
|
+
};
|
|
306
|
+
}
|
|
246
307
|
var BarChart = ({
|
|
247
308
|
series,
|
|
248
309
|
categories,
|
|
249
310
|
colors,
|
|
311
|
+
barColors,
|
|
250
312
|
height,
|
|
251
313
|
horizontal,
|
|
252
314
|
showBarValues = false,
|
|
253
315
|
showBarPercentages = false,
|
|
254
|
-
|
|
316
|
+
minBarWidth,
|
|
317
|
+
minBarPercentage,
|
|
255
318
|
percentageMode = "total",
|
|
256
319
|
barValueFormatter,
|
|
257
320
|
barPercentageFormatter,
|
|
@@ -260,16 +323,19 @@ var BarChart = ({
|
|
|
260
323
|
const [Chart, setChart] = React__default.default.useState(null);
|
|
261
324
|
const effectiveSeries = series ?? defaultSeries;
|
|
262
325
|
const effectiveCategories = categories ?? options?.xaxis?.categories;
|
|
326
|
+
const effectiveColors = colors ?? options?.colors ?? defaultOptions.colors;
|
|
327
|
+
const chartSeries = applyBarColors(
|
|
328
|
+
effectiveSeries,
|
|
329
|
+
barColors,
|
|
330
|
+
effectiveColors,
|
|
331
|
+
effectiveCategories
|
|
332
|
+
);
|
|
263
333
|
const valueMatrix = getValueMatrix(effectiveSeries);
|
|
264
334
|
const seriesTotal = getSeriesTotal(valueMatrix);
|
|
265
335
|
const isHorizontal = horizontal ?? options?.plotOptions?.bar?.horizontal === true;
|
|
266
336
|
const hasGeneratedLabels = showBarValues || showBarPercentages;
|
|
267
|
-
const
|
|
268
|
-
const
|
|
269
|
-
const minimumBarValue = minimumValueScale * (Math.max(0, minBarPercentage) / 100);
|
|
270
|
-
const hasMinimumBarValue = isHorizontal && minimumBarValue > 0;
|
|
271
|
-
const chartSeries = hasMinimumBarValue ? applyMinimumBarValue(effectiveSeries, minimumBarValue) : effectiveSeries;
|
|
272
|
-
const chartValueMatrix = getValueMatrix(chartSeries);
|
|
337
|
+
const resolvedMinBarWidth = minBarWidth ?? (minBarPercentage === 0 ? 0 : 30);
|
|
338
|
+
const hasMinimumBarWidth = isHorizontal && resolvedMinBarWidth > 0;
|
|
273
339
|
const baseGridOptions = isHorizontal ? mergeGridOptions(defaultOptions.grid, horizontalGridOptions) : defaultOptions.grid;
|
|
274
340
|
const getLabelContext = (seriesIndex, dataPointIndex, total) => ({
|
|
275
341
|
seriesIndex,
|
|
@@ -308,11 +374,10 @@ var BarChart = ({
|
|
|
308
374
|
points: effectiveSeries.flatMap(
|
|
309
375
|
(item, seriesIndex) => item.data.map((dataPoint, dataPointIndex) => {
|
|
310
376
|
const value = getDataValue(dataPoint) ?? 0;
|
|
311
|
-
const chartValue = chartValueMatrix[seriesIndex]?.[dataPointIndex] ?? value;
|
|
312
377
|
const total = percentageMode === "category" ? getCategoryTotal(valueMatrix, dataPointIndex) : seriesTotal;
|
|
313
378
|
const context = getLabelContext(seriesIndex, dataPointIndex, total);
|
|
314
379
|
return {
|
|
315
|
-
x:
|
|
380
|
+
x: value,
|
|
316
381
|
y: dataPointIndex,
|
|
317
382
|
seriesIndex,
|
|
318
383
|
marker: {
|
|
@@ -339,24 +404,33 @@ var BarChart = ({
|
|
|
339
404
|
})
|
|
340
405
|
)
|
|
341
406
|
} : void 0;
|
|
342
|
-
const
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
407
|
+
const userChartEvents = options?.chart?.events;
|
|
408
|
+
const generatedChartEvents = hasMinimumBarWidth ? {
|
|
409
|
+
...userChartEvents,
|
|
410
|
+
mounted: composeMinimumBarWidthEvent(
|
|
411
|
+
userChartEvents?.mounted,
|
|
412
|
+
resolvedMinBarWidth,
|
|
413
|
+
valueMatrix
|
|
414
|
+
),
|
|
415
|
+
updated: composeMinimumBarWidthEvent(
|
|
416
|
+
userChartEvents?.updated,
|
|
417
|
+
resolvedMinBarWidth,
|
|
418
|
+
valueMatrix
|
|
419
|
+
),
|
|
420
|
+
animationEnd: composeMinimumBarWidthEvent(
|
|
421
|
+
userChartEvents?.animationEnd,
|
|
422
|
+
resolvedMinBarWidth,
|
|
423
|
+
valueMatrix
|
|
424
|
+
)
|
|
425
|
+
} : userChartEvents;
|
|
353
426
|
const mergedOptions = {
|
|
354
427
|
...defaultOptions,
|
|
355
428
|
...options,
|
|
356
|
-
colors:
|
|
429
|
+
colors: effectiveColors,
|
|
357
430
|
chart: {
|
|
358
431
|
...defaultOptions.chart,
|
|
359
432
|
...options?.chart,
|
|
433
|
+
events: generatedChartEvents,
|
|
360
434
|
animations: {
|
|
361
435
|
...defaultOptions.chart?.animations,
|
|
362
436
|
...options?.chart?.animations,
|
|
@@ -394,14 +468,11 @@ var BarChart = ({
|
|
|
394
468
|
xaxis: {
|
|
395
469
|
...defaultOptions.xaxis,
|
|
396
470
|
...options?.xaxis,
|
|
397
|
-
categories: categories ?? options?.xaxis?.categories ?? defaultOptions.xaxis?.categories
|
|
398
|
-
...hasMinimumBarValue && options?.xaxis?.max === void 0 && {
|
|
399
|
-
max: minimumValueScale
|
|
400
|
-
}
|
|
471
|
+
categories: categories ?? options?.xaxis?.categories ?? defaultOptions.xaxis?.categories
|
|
401
472
|
},
|
|
402
473
|
grid: mergeGridOptions(baseGridOptions, options?.grid),
|
|
403
474
|
annotations: mergeAnnotations(options?.annotations, generatedAnnotations),
|
|
404
|
-
tooltip: mergeTooltipOptions(defaultOptions.tooltip, options?.tooltip,
|
|
475
|
+
tooltip: mergeTooltipOptions(defaultOptions.tooltip, options?.tooltip, void 0)
|
|
405
476
|
};
|
|
406
477
|
React__default.default.useEffect(() => {
|
|
407
478
|
let isMounted = true;
|
|
@@ -425,5 +496,5 @@ var BarChart = ({
|
|
|
425
496
|
};
|
|
426
497
|
|
|
427
498
|
exports.BarChart = BarChart;
|
|
428
|
-
//# sourceMappingURL=chunk-
|
|
429
|
-
//# sourceMappingURL=chunk-
|
|
499
|
+
//# sourceMappingURL=chunk-MIIZ4KLS.cjs.map
|
|
500
|
+
//# sourceMappingURL=chunk-MIIZ4KLS.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Charts/BarChart.tsx"],"names":["React","jsx"],"mappings":"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","file":"chunk-MIIZ4KLS.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 barColors?: string[];\n height?: number;\n horizontal?: boolean;\n showBarValues?: boolean;\n showBarPercentages?: boolean;\n minBarWidth?: number;\n /** @deprecated Use minBarWidth. Passing 0 still disables the minimum visual width. */\n minBarPercentage?: number;\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 animations: {\n enabled: true,\n speed: 200,\n animateGradually: {\n enabled: false,\n delay: 0,\n },\n dynamicAnimation: {\n enabled: true,\n speed: 175,\n },\n },\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 withDataPointColor(\n value: unknown,\n fillColor: string,\n dataPointIndex: number,\n categories?: string[]\n): unknown {\n if (Array.isArray(value)) {\n return {\n x: value[0],\n y: value[1],\n fillColor,\n };\n }\n\n if (value && typeof value === \"object\") {\n return {\n ...value,\n fillColor,\n };\n }\n\n return {\n x: categories?.[dataPointIndex] ?? dataPointIndex,\n y: value,\n fillColor,\n };\n}\n\nfunction applyBarColors(\n series: ApexAxisChartSeries,\n barColors: string[] | undefined,\n fallbackColors: string[] | undefined,\n categories?: string[]\n): ApexAxisChartSeries {\n if (!barColors?.length) return series;\n\n return series.map((item, seriesIndex) => {\n const fallbackColor =\n fallbackColors?.[seriesIndex] ?? fallbackColors?.[0] ?? defaultOptions.colors?.[0];\n\n return {\n ...item,\n data: item.data.map((value, dataPointIndex) =>\n withDataPointColor(\n value,\n barColors[dataPointIndex] ?? fallbackColor ?? \"#465fff\",\n dataPointIndex,\n categories\n )\n ) as typeof item.data,\n };\n });\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 mergeTooltipOptions(\n base: ApexOptions[\"tooltip\"],\n override: ApexOptions[\"tooltip\"],\n generated: ApexOptions[\"tooltip\"]\n): ApexOptions[\"tooltip\"] {\n const baseY = Array.isArray(base?.y) ? undefined : base?.y;\n const overrideY = Array.isArray(override?.y) ? undefined : override?.y;\n const generatedY = Array.isArray(generated?.y) ? undefined : generated?.y;\n\n return {\n ...base,\n ...override,\n ...generated,\n x: {\n ...base?.x,\n ...override?.x,\n ...generated?.x,\n },\n y: {\n ...baseY,\n ...overrideY,\n ...generatedY,\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\nfunction getChartElement(chartContext: unknown): Element | null {\n if (typeof Element === \"undefined\") return null;\n if (!chartContext || typeof chartContext !== \"object\" || !(\"el\" in chartContext)) return null;\n\n const element = (chartContext as { el?: unknown }).el;\n return element instanceof Element ? element : null;\n}\n\nfunction applyMinimumHorizontalBarWidth(\n chartContext: unknown,\n minBarWidth: number,\n valueMatrix: number[][]\n) {\n const root = getChartElement(chartContext);\n if (!root) return;\n\n root\n .querySelectorAll(\"[data-taildashboard-min-bar]\")\n .forEach((element) => element.remove());\n\n if (minBarWidth <= 0) return;\n\n const values = valueMatrix.flat();\n const paths = Array.from(root.querySelectorAll<SVGPathElement>(\".apexcharts-bar-area\"));\n const documentRef = root.ownerDocument;\n\n paths.forEach((path, index) => {\n const value = values[index] ?? 0;\n if (value < 0 || typeof path.getBBox !== \"function\") return;\n\n const box = path.getBBox();\n if (box.width >= minBarWidth || box.height <= 0) return;\n\n const overlay = documentRef.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n const radius = Math.min(5, box.height / 2, minBarWidth / 2);\n overlay.setAttribute(\"data-taildashboard-min-bar\", \"true\");\n overlay.setAttribute(\"x\", `${box.x}`);\n overlay.setAttribute(\"y\", `${box.y}`);\n overlay.setAttribute(\"width\", `${minBarWidth}`);\n overlay.setAttribute(\"height\", `${box.height}`);\n overlay.setAttribute(\"rx\", `${radius}`);\n overlay.setAttribute(\"fill\", path.getAttribute(\"fill\") ?? path.style.fill ?? \"currentColor\");\n overlay.setAttribute(\"opacity\", path.getAttribute(\"opacity\") ?? path.style.opacity ?? \"1\");\n overlay.style.pointerEvents = \"none\";\n path.parentNode?.insertBefore(overlay, path.nextSibling);\n });\n}\n\nfunction scheduleMinimumHorizontalBarWidth(\n chartContext: unknown,\n minBarWidth: number,\n valueMatrix: number[][]\n) {\n applyMinimumHorizontalBarWidth(chartContext, minBarWidth, valueMatrix);\n\n if (typeof window === \"undefined\" || typeof window.requestAnimationFrame !== \"function\") return;\n\n window.requestAnimationFrame(() => {\n applyMinimumHorizontalBarWidth(chartContext, minBarWidth, valueMatrix);\n });\n}\n\ntype ApexChartEvents = NonNullable<NonNullable<ApexOptions[\"chart\"]>[\"events\"]>;\ntype ApexLifecycleEvent = NonNullable<ApexChartEvents[\"mounted\"]>;\n\nfunction composeMinimumBarWidthEvent(\n userEvent: ApexLifecycleEvent | undefined,\n minBarWidth: number,\n valueMatrix: number[][]\n): ApexLifecycleEvent {\n return (chart, eventOptions) => {\n userEvent?.(chart, eventOptions);\n scheduleMinimumHorizontalBarWidth(chart, minBarWidth, valueMatrix);\n };\n}\n\nexport const BarChart: React.FC<BarChartProps> = ({\n series,\n categories,\n colors,\n barColors,\n height,\n horizontal,\n showBarValues = false,\n showBarPercentages = false,\n minBarWidth,\n minBarPercentage,\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 effectiveColors = colors ?? options?.colors ?? defaultOptions.colors;\n const chartSeries = applyBarColors(\n effectiveSeries,\n barColors,\n effectiveColors as string[] | undefined,\n effectiveCategories\n );\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 resolvedMinBarWidth = minBarWidth ?? (minBarPercentage === 0 ? 0 : 30);\n const hasMinimumBarWidth = isHorizontal && resolvedMinBarWidth > 0;\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 = 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 userChartEvents = options?.chart?.events;\n const generatedChartEvents: ApexChartEvents | undefined = hasMinimumBarWidth\n ? {\n ...userChartEvents,\n mounted: composeMinimumBarWidthEvent(\n userChartEvents?.mounted,\n resolvedMinBarWidth,\n valueMatrix\n ),\n updated: composeMinimumBarWidthEvent(\n userChartEvents?.updated,\n resolvedMinBarWidth,\n valueMatrix\n ),\n animationEnd: composeMinimumBarWidthEvent(\n userChartEvents?.animationEnd,\n resolvedMinBarWidth,\n valueMatrix\n ),\n }\n : userChartEvents;\n const mergedOptions: ApexOptions = {\n ...defaultOptions,\n ...options,\n colors: effectiveColors,\n chart: {\n ...defaultOptions.chart,\n ...options?.chart,\n events: generatedChartEvents,\n animations: {\n ...defaultOptions.chart?.animations,\n ...options?.chart?.animations,\n animateGradually: {\n ...defaultOptions.chart?.animations?.animateGradually,\n ...options?.chart?.animations?.animateGradually,\n },\n dynamicAnimation: {\n ...defaultOptions.chart?.animations?.dynamicAnimation,\n ...options?.chart?.animations?.dynamicAnimation,\n },\n },\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 tooltip: mergeTooltipOptions(defaultOptions.tooltip, options?.tooltip, undefined),\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={chartSeries}\n type=\"bar\"\n height={height ?? 180}\n />\n );\n};\n"]}
|