@roax/ui 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -15
- package/dist/index.js +40 -66
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +44 -70
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -105,28 +105,34 @@ import { GeneralCard } from '@roax/ui'
|
|
|
105
105
|
```jsx
|
|
106
106
|
import { FunnelChart, TimeSeriesComparisonChart } from '@roax/ui'
|
|
107
107
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
]}
|
|
108
|
+
// FunnelChart — solo el gráfico, sin cards
|
|
109
|
+
<FunnelChart
|
|
110
|
+
data={[
|
|
111
|
+
{ label: 'Impressions', value: 120000 },
|
|
112
|
+
{ label: 'Clicks', value: 8400 },
|
|
113
|
+
{ label: 'Purchases', value: 630, unit: 'COP', color: '#5B01D2' },
|
|
114
|
+
]}
|
|
115
|
+
gradientStart="#FF8AAE"
|
|
116
|
+
gradientEnd="#FF1F3D"
|
|
117
|
+
/>
|
|
115
118
|
|
|
119
|
+
// TimeSeriesComparisonChart — genérico, cualquier clave de datos
|
|
116
120
|
<TimeSeriesComparisonChart
|
|
117
|
-
data={
|
|
118
|
-
lines={['
|
|
119
|
-
colors={{
|
|
121
|
+
data={[{ date: '2024-05-01', sales: 800000, adSpend: 200000 }]}
|
|
122
|
+
lines={['sales', 'adSpend']}
|
|
123
|
+
colors={{ sales: '#FF2F86', adSpend: '#5B01D2' }}
|
|
120
124
|
currency="COP"
|
|
121
|
-
yAxisLabel="
|
|
122
|
-
displayNames={{
|
|
125
|
+
yAxisLabel="COP"
|
|
126
|
+
displayNames={{ sales: 'Sales', adSpend: 'Ad Spend' }}
|
|
127
|
+
xDataKey="date"
|
|
128
|
+
height={340}
|
|
123
129
|
/>
|
|
124
130
|
|
|
125
131
|
<InvestmentByPlatformChart
|
|
126
132
|
data={[{ name: 'Meta', value: 4500000 }, { name: 'Google', value: 2500000 }]}
|
|
127
|
-
title="
|
|
128
|
-
currencySymbol="
|
|
129
|
-
locale="
|
|
133
|
+
title="Investment by Platform"
|
|
134
|
+
currencySymbol="USD"
|
|
135
|
+
locale="en-US"
|
|
130
136
|
/>
|
|
131
137
|
```
|
|
132
138
|
|
package/dist/index.js
CHANGED
|
@@ -272,8 +272,13 @@ function GeneralCard({
|
|
|
272
272
|
// src/components/charts/FunnelChart.jsx
|
|
273
273
|
var import_recharts = require("recharts");
|
|
274
274
|
var import_react_pro8 = require("@coreui/react-pro");
|
|
275
|
-
function FunnelChart({
|
|
276
|
-
|
|
275
|
+
function FunnelChart({
|
|
276
|
+
data = [],
|
|
277
|
+
gradientStart = "#FF8AAE",
|
|
278
|
+
gradientEnd = "#FF1F3D",
|
|
279
|
+
barHeight = 45
|
|
280
|
+
}) {
|
|
281
|
+
return /* @__PURE__ */ React.createElement(import_react_pro8.CCard, { className: "rounded-4 shadow-sm p-3" }, /* @__PURE__ */ React.createElement(import_react_pro8.CCardBody, null, /* @__PURE__ */ React.createElement(import_recharts.ResponsiveContainer, { width: "100%", height: data.length * barHeight + 50 }, /* @__PURE__ */ React.createElement(
|
|
277
282
|
import_recharts.BarChart,
|
|
278
283
|
{
|
|
279
284
|
data,
|
|
@@ -281,12 +286,12 @@ function FunnelChart({ data = [] }) {
|
|
|
281
286
|
margin: { top: 10, right: 60, left: 20, bottom: 0 },
|
|
282
287
|
barCategoryGap: 15
|
|
283
288
|
},
|
|
284
|
-
/* @__PURE__ */ React.createElement("defs", null, /* @__PURE__ */ React.createElement("linearGradient", { id: "funnelGradient", x1: "0", y1: "0", x2: "1", y2: "0" }, /* @__PURE__ */ React.createElement("stop", { offset: "0%", stopColor:
|
|
289
|
+
/* @__PURE__ */ React.createElement("defs", null, /* @__PURE__ */ React.createElement("linearGradient", { id: "funnelGradient", x1: "0", y1: "0", x2: "1", y2: "0" }, /* @__PURE__ */ React.createElement("stop", { offset: "0%", stopColor: gradientStart }), /* @__PURE__ */ React.createElement("stop", { offset: "100%", stopColor: gradientEnd }))),
|
|
285
290
|
/* @__PURE__ */ React.createElement(import_recharts.XAxis, { type: "number", hide: true, domain: [0, "dataMax"] }),
|
|
286
291
|
/* @__PURE__ */ React.createElement(
|
|
287
292
|
import_recharts.YAxis,
|
|
288
293
|
{
|
|
289
|
-
dataKey: "
|
|
294
|
+
dataKey: "label",
|
|
290
295
|
type: "category",
|
|
291
296
|
width: 130,
|
|
292
297
|
axisLine: false,
|
|
@@ -300,7 +305,7 @@ function FunnelChart({ data = [] }) {
|
|
|
300
305
|
content: ({ active, payload }) => {
|
|
301
306
|
if (active && payload && payload.length > 0) {
|
|
302
307
|
const { value, payload: item } = payload[0];
|
|
303
|
-
return /* @__PURE__ */ React.createElement("div", { className: "bg-white shadow-sm p-2 rounded" }, /* @__PURE__ */ React.createElement("strong", null, item.
|
|
308
|
+
return /* @__PURE__ */ React.createElement("div", { className: "bg-white shadow-sm p-2 rounded" }, /* @__PURE__ */ React.createElement("strong", null, item.label), ":", " ", /* @__PURE__ */ React.createElement("span", null, formatValue(value, item.unit, item.label)));
|
|
304
309
|
}
|
|
305
310
|
return null;
|
|
306
311
|
}
|
|
@@ -317,35 +322,11 @@ function FunnelChart({ data = [] }) {
|
|
|
317
322
|
), data.map((entry, index) => /* @__PURE__ */ React.createElement(
|
|
318
323
|
import_recharts.Cell,
|
|
319
324
|
{
|
|
320
|
-
key: `cell-${entry.
|
|
325
|
+
key: `cell-${entry.label || index}`,
|
|
321
326
|
fill: entry.color || "url(#funnelGradient)"
|
|
322
327
|
}
|
|
323
328
|
)))
|
|
324
|
-
))
|
|
325
|
-
GeneralCard,
|
|
326
|
-
{
|
|
327
|
-
title: item.title,
|
|
328
|
-
current: item.value,
|
|
329
|
-
previous: item.previous,
|
|
330
|
-
change: item.percentageChange,
|
|
331
|
-
isPositive: item.isPositive,
|
|
332
|
-
unit: item.unit,
|
|
333
|
-
previousDateRange: item.previousDateRange,
|
|
334
|
-
tooltipText: item.title
|
|
335
|
-
}
|
|
336
|
-
)))), data.length > 3 && /* @__PURE__ */ React.createElement(import_react_pro8.CRow, { className: "pt-3 g-3" }, data.slice(3).map((item, index) => /* @__PURE__ */ React.createElement(import_react_pro8.CCol, { xs: 12, md: 5, lg: 4, key: `card-bottom-${index}` }, /* @__PURE__ */ React.createElement(
|
|
337
|
-
GeneralCard,
|
|
338
|
-
{
|
|
339
|
-
title: item.title,
|
|
340
|
-
current: item.value,
|
|
341
|
-
previous: item.previous,
|
|
342
|
-
change: item.percentageChange,
|
|
343
|
-
isPositive: item.isPositive,
|
|
344
|
-
unit: item.unit,
|
|
345
|
-
previousDateRange: item.previousDateRange,
|
|
346
|
-
tooltipText: item.title
|
|
347
|
-
}
|
|
348
|
-
))))));
|
|
329
|
+
))));
|
|
349
330
|
}
|
|
350
331
|
|
|
351
332
|
// src/components/charts/TimeSeriesComparisonChart.jsx
|
|
@@ -355,42 +336,36 @@ function TimeSeriesComparisonChart({
|
|
|
355
336
|
data = [],
|
|
356
337
|
lines = [],
|
|
357
338
|
colors = {},
|
|
358
|
-
cards = [],
|
|
359
339
|
currency = "",
|
|
360
340
|
yAxisLabel = "",
|
|
361
|
-
displayNames = {}
|
|
341
|
+
displayNames = {},
|
|
342
|
+
xDataKey = "date",
|
|
343
|
+
height = 340
|
|
362
344
|
}) {
|
|
363
|
-
const
|
|
364
|
-
|
|
365
|
-
if (lower.includes("%")) return "%";
|
|
366
|
-
if (lower.includes("venta") || lower.includes("inversi\xF3n")) return currency || "";
|
|
367
|
-
return "";
|
|
368
|
-
};
|
|
369
|
-
const maxY = data.length ? Math.ceil(
|
|
370
|
-
Math.max(
|
|
371
|
-
...lines.map((lineName) => Math.max(...data.map((d) => d[lineName] || 0)))
|
|
372
|
-
) * 1.1
|
|
345
|
+
const maxY = data.length && lines.length ? Math.ceil(
|
|
346
|
+
Math.max(...lines.map((key) => Math.max(...data.map((d) => d[key] || 0)))) * 1.1
|
|
373
347
|
) : 100;
|
|
374
|
-
|
|
375
|
-
|
|
348
|
+
const formatYTick = (val) => {
|
|
349
|
+
const prefix = currency ? `${currency} ` : "";
|
|
350
|
+
if (val >= 1e6) return `${prefix}${(val / 1e6).toFixed(1)}M`;
|
|
351
|
+
if (val >= 1e3) return `${prefix}${(val / 1e3).toFixed(0)}K`;
|
|
352
|
+
return `${prefix}${val}`;
|
|
353
|
+
};
|
|
354
|
+
return /* @__PURE__ */ React.createElement(import_react_pro9.CCard, { className: "rounded-4 shadow-sm p-3" }, /* @__PURE__ */ React.createElement(import_react_pro9.CCardBody, null, /* @__PURE__ */ React.createElement(import_recharts2.ResponsiveContainer, { width: "100%", height }, /* @__PURE__ */ React.createElement(import_recharts2.LineChart, { data, margin: { top: 20, right: 30, left: 10, bottom: 10 } }, /* @__PURE__ */ React.createElement(import_recharts2.CartesianGrid, { strokeDasharray: "3 3", stroke: "#e5e5e5" }), /* @__PURE__ */ React.createElement(
|
|
355
|
+
import_recharts2.XAxis,
|
|
376
356
|
{
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
change: card.percentageChange,
|
|
381
|
-
isPositive: card.isPositive,
|
|
382
|
-
unit: card.unit,
|
|
383
|
-
previousDateRange: card.previousDateRange,
|
|
384
|
-
tooltipText: card.title
|
|
357
|
+
dataKey: xDataKey,
|
|
358
|
+
stroke: "#333",
|
|
359
|
+
tick: { fontSize: 12 }
|
|
385
360
|
}
|
|
386
|
-
)
|
|
361
|
+
), /* @__PURE__ */ React.createElement(
|
|
387
362
|
import_recharts2.YAxis,
|
|
388
363
|
{
|
|
389
364
|
yAxisId: "left",
|
|
390
365
|
stroke: "#333",
|
|
391
|
-
tickFormatter:
|
|
366
|
+
tickFormatter: formatYTick,
|
|
392
367
|
tick: { fontSize: 12 },
|
|
393
|
-
width:
|
|
368
|
+
width: 80,
|
|
394
369
|
domain: [0, maxY],
|
|
395
370
|
allowDecimals: false,
|
|
396
371
|
label: yAxisLabel ? {
|
|
@@ -403,10 +378,10 @@ function TimeSeriesComparisonChart({
|
|
|
403
378
|
), /* @__PURE__ */ React.createElement(
|
|
404
379
|
import_recharts2.Tooltip,
|
|
405
380
|
{
|
|
406
|
-
formatter: (val,
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
381
|
+
formatter: (val, key) => [
|
|
382
|
+
`${currency ? currency + " " : ""}${val.toLocaleString()}`,
|
|
383
|
+
displayNames[key] || key
|
|
384
|
+
],
|
|
410
385
|
labelClassName: "fw-bold",
|
|
411
386
|
wrapperStyle: { zIndex: 1e3 }
|
|
412
387
|
}
|
|
@@ -415,18 +390,17 @@ function TimeSeriesComparisonChart({
|
|
|
415
390
|
{
|
|
416
391
|
verticalAlign: "bottom",
|
|
417
392
|
height: 36,
|
|
418
|
-
wrapperStyle: { marginTop: 20 },
|
|
419
393
|
iconType: "circle",
|
|
420
|
-
formatter: (
|
|
394
|
+
formatter: (key) => displayNames[key] || key
|
|
421
395
|
}
|
|
422
|
-
), lines.map((
|
|
396
|
+
), lines.map((key) => /* @__PURE__ */ React.createElement(
|
|
423
397
|
import_recharts2.Line,
|
|
424
398
|
{
|
|
425
|
-
key
|
|
399
|
+
key,
|
|
426
400
|
yAxisId: "left",
|
|
427
401
|
type: "monotone",
|
|
428
|
-
dataKey:
|
|
429
|
-
stroke: colors[
|
|
402
|
+
dataKey: key,
|
|
403
|
+
stroke: colors[key] || "#ED1E78",
|
|
430
404
|
strokeWidth: 2.5,
|
|
431
405
|
dot: { r: 4 },
|
|
432
406
|
activeDot: { r: 6 }
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js","../src/components/buttons/SolidButton.jsx","../src/components/buttons/OutlineButton.jsx","../src/components/buttons/TextButton.jsx","../src/components/buttons/IconButton.jsx","../src/components/custom-tooltip/CustomTooltip.jsx","../src/components/modal/Modal.jsx","../src/components/card/MetricCard.jsx","../src/components/card/card-utils.js","../src/components/card/GeneralCard.jsx","../src/components/charts/FunnelChart.jsx","../src/components/charts/TimeSeriesComparisonChart.jsx","../src/components/charts/TopProductsChart.jsx","../src/components/charts/SalesByChannelChart.jsx","../src/components/charts/InvestmentByPlatformChart.jsx","../src/components/pagination/PaginatedTable.jsx","../src/components/pagination/PaginatedGrid.jsx","../src/components/skeletons/CardSkeleton.jsx","../src/components/skeletons/TextSkeleton.jsx","../src/components/skeletons/MetricsSkeleton.jsx","../src/components/skeletons/ReportTableSkeleton.jsx","../src/components/skeletons/SummaryReportSkeleton.jsx","../../../node_modules/@coreui/icons-pro/src/duotone/cid-exclamation-circle.ts","../src/components/feedback/NoDataMessage.jsx","../src/components/back-button/BackButton.jsx"],"sourcesContent":["// ── Buttons ───────────────────────────────────────────────────────────────────\nexport { default as SolidButton } from './components/buttons/SolidButton'\nexport { default as OutlineButton } from './components/buttons/OutlineButton'\nexport { default as TextButton } from './components/buttons/TextButton'\nexport { default as IconButton } from './components/buttons/IconButton'\n\n// ── Overlay ───────────────────────────────────────────────────────────────────\nexport { default as CustomTooltip } from './components/custom-tooltip/CustomTooltip'\n\n// ── Modal ─────────────────────────────────────────────────────────────────────\nexport { default as Modal } from './components/modal/Modal'\n\n// ── Cards ─────────────────────────────────────────────────────────────────────\nexport { default as MetricCard } from './components/card/MetricCard'\nexport { default as GeneralCard } from './components/card/GeneralCard'\nexport { formatValue, getBadgeStyles, formatDateRange } from './components/card/card-utils'\n\n// ── Charts ────────────────────────────────────────────────────────────────────\nexport { default as FunnelChart } from './components/charts/FunnelChart'\nexport { default as TimeSeriesComparisonChart } from './components/charts/TimeSeriesComparisonChart'\nexport { default as TopProductsChart } from './components/charts/TopProductsChart'\nexport { default as SalesByChannelChart } from './components/charts/SalesByChannelChart'\nexport { default as InvestmentByPlatformChart } from './components/charts/InvestmentByPlatformChart'\n\n// ── Pagination ────────────────────────────────────────────────────────────────\nexport { default as PaginatedTable } from './components/pagination/PaginatedTable'\nexport { default as PaginatedGrid } from './components/pagination/PaginatedGrid'\n\n// ── Skeletons ─────────────────────────────────────────────────────────────────\nexport { default as CardSkeleton } from './components/skeletons/CardSkeleton'\nexport { default as TextSkeleton } from './components/skeletons/TextSkeleton'\nexport { default as MetricsSkeleton } from './components/skeletons/MetricsSkeleton'\nexport { default as ReportTableSkeleton } from './components/skeletons/ReportTableSkeleton'\nexport { default as SummaryReportSkeleton } from './components/skeletons/SummaryReportSkeleton'\n\n// ── Feedback ──────────────────────────────────────────────────────────────────\nexport { NoDataMessage } from './components/feedback/NoDataMessage'\n\n// ── Navigation ────────────────────────────────────────────────────────────────\nexport { default as BackButton } from './components/back-button/BackButton'\n","'use client'\nimport { CLoadingButton } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport './SolidButton.scss'\n\nexport default function SolidButton({ title = 'Button', onClick, color = 'custom-primary', textColor = 'custom-white', className = '', loading = false, icon, svgComponent: SvgComponent, type = 'submit', badge, disabled }) {\n return (\n <CLoadingButton\n type={type}\n onClick={onClick}\n className={`solid-button rounded-4 px-4 py-2 fw-semibold text-${textColor} bg-${color} ${className}`}\n loading={loading}\n disabledOnLoading\n disabled={disabled}\n style={{ minHeight: '44px', minWidth: 'fit-content', fontSize: '0.95rem', letterSpacing: '0.3px' }}\n >\n {icon && <CIcon icon={icon} className=\"btn-icon\" />}\n {SvgComponent && !icon && <SvgComponent />}\n <span className=\"btn-title\">{title}</span>\n {badge && badge}\n </CLoadingButton>\n )\n}\n","'use client'\nimport { CLoadingButton } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport './OutlineButton.scss'\n\nexport default function OutlineButton({ title = 'Button', onClick, color = 'custom-primary', className = '', loading = false, icon, type = 'submit', disabled }) {\n return (\n <CLoadingButton\n type={type}\n onClick={onClick}\n className={`outline-button rounded-3 fw-medium text-${color} border-${color} ${className}`}\n loading={loading}\n disabledOnLoading\n disabled={disabled}\n variant=\"outline\"\n style={{ maxHeight: '40px', minWidth: 'fit-content' }}\n >\n {icon && <CIcon icon={icon} />}\n <span>{title}</span>\n </CLoadingButton>\n )\n}\n ","'use client'\nimport { CLoadingButton } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\n\nexport default function TextButton({ disabled, title, onClick, color = 'dark', className = '', loading = false, icon, children }) {\n return (\n <span className=\"d-inline-block\" tabIndex={0}>\n <CLoadingButton\n disabled={disabled}\n onClick={onClick}\n variant=\"ghost\"\n type=\"button\"\n color={color}\n className={`rounded-3 px-2 d-flex justify-content-center gap-2 fw-medium ${className}`}\n loading={loading}\n >\n {icon && <CIcon size=\"xl\" icon={icon} />}\n {children ? children : title}\n </CLoadingButton>\n </span>\n )\n}\n","'use client'\nimport { CLoadingButton } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport CustomTooltip from '../custom-tooltip/CustomTooltip'\n\nexport default function IconButton({ title, onClick, color = 'dark', className = '', loading = false, icon, tooltip = '', disabled }) {\n return (\n <CustomTooltip content={tooltip} placement=\"bottom\">\n <CLoadingButton\n onClick={onClick}\n variant=\"ghost\"\n type=\"button\"\n color={color}\n className={`d-flex justify-content-center align-items-center gap-1 m-0 p-1 ${className}`}\n loading={loading}\n disabled={disabled}\n >\n <CIcon size=\"xl\" icon={icon} />\n {title && <span className=\"ml-2 d-none d-md-block\">{title}</span>}\n </CLoadingButton>\n </CustomTooltip>\n )\n}\n","'use client'\nimport Tippy from '@tippyjs/react'\nimport 'tippy.js/dist/tippy.css'\n\nexport default function CustomTooltip({ content, placement = 'bottom', delay = 0, className = '', children }) {\n return (\n <Tippy content={content} placement={placement} className={className} delay={delay}>\n {children}\n </Tippy>\n )\n}\n","'use client'\nimport CIcon from '@coreui/icons-react'\nimport { CModal, CModalBody, CModalHeader, CModalTitle } from '@coreui/react-pro'\nimport { cilX } from '@coreui/icons'\n\nexport default function Modal({ title, titleIcon, visible, setVisible, alignment = 'center', size, children }) {\n return (\n <CModal alignment={alignment} visible={visible} onClose={() => setVisible(false)} size={size} focus keyboard aria-labelledby=\"roax-modal-title\">\n <CModalHeader className=\"position-relative\">\n <CModalTitle id=\"roax-modal-title\" className=\"d-flex align-items-center gap-2\">\n {titleIcon && <CIcon icon={titleIcon} size=\"lg\" className=\"text-muted\" />}\n {title}\n </CModalTitle>\n <button\n onClick={() => setVisible(false)}\n type=\"button\"\n className=\"position-absolute end-0 top-0 mt-3 me-3 p-0 bg-transparent border-0\"\n style={{ fontSize: '1.25rem', color: 'var(--cui-body-color)', zIndex: 10 }}\n aria-label=\"Cerrar\"\n >\n <CIcon icon={cilX} size=\"lg\" />\n </button>\n </CModalHeader>\n <CModalBody>{children}</CModalBody>\n </CModal>\n )\n}\n","'use client'\nimport { CCard, CCardBody } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport { cilArrowTop, cilArrowBottom, cilInfo } from '@coreui/icons'\nimport CustomTooltip from '../custom-tooltip/CustomTooltip'\nimport { formatValue, getBadgeStyles, formatDateRange } from './card-utils'\nimport './MetricCard.scss'\n\nexport default function MetricCard({ title, current, previous, change, isPositive, unit = '', previousDateRange = '', tooltipText = '', backgroundColor }) {\n const isColored = !!backgroundColor\n return (\n <CCard\n className={`metric-card w-100 h-100 d-flex flex-column border-0${isColored ? ' metric-card--colored' : ''}`}\n style={isColored ? { background: backgroundColor } : undefined}\n >\n <CCardBody className=\"d-flex flex-column justify-content-between h-100 p-4 position-relative\">\n {tooltipText && (\n <div className=\"position-absolute top-0 end-0 m-2\">\n <CustomTooltip content={tooltipText} placement=\"top\">\n <CIcon icon={cilInfo} style={{ cursor: 'pointer', opacity: 0.5, width: 16, height: 16 }} />\n </CustomTooltip>\n </div>\n )}\n <p className=\"metric-card__title m-0\">{title}</p>\n <div className=\"d-flex align-items-center gap-2 mt-1\">\n <span className=\"metric-card__value\">{formatValue(current, unit, title)}</span>\n {typeof change === 'number' && isFinite(change) && current > 0 && (\n <div style={getBadgeStyles(isPositive)}>\n <CIcon icon={isPositive ? cilArrowTop : cilArrowBottom} size=\"sm\" />\n {Math.abs(change)}%\n </div>\n )}\n </div>\n <hr className=\"metric-card__divider\" />\n {(() => {\n const { formattedRange } = formatDateRange(previousDateRange)\n return (\n <div className=\"d-flex justify-content-between align-items-center metric-card__footer\">\n <strong>{formatValue(previous, unit, title)}</strong>\n <span>{formattedRange}</span>\n </div>\n )\n })()}\n </CCardBody>\n </CCard>\n )\n}\n","export const formatValue = (val, unit = '', title = '') => {\n if (val == null || typeof val !== 'number' || val === 0) return '0'\n if (title.includes('ROAS')) return `x ${val.toFixed(2)}`\n if (title.includes('CAC %')) return `${val.toFixed(2)}%`\n if (unit === '%' || title.includes('%')) return `${val.toFixed(2)}%`\n if (unit === 'x') return `x ${val.toFixed(2)}`\n if (unit === 'COP') return `COP ${Math.round(val).toLocaleString('es-CO')}`\n return val.toLocaleString(undefined, { minimumFractionDigits: 0, maximumFractionDigits: 2 })\n}\n\nexport const getBadgeStyles = (isPositive) => ({\n backgroundColor: isPositive ? '#55ed7b' : '#f74a4a',\n color: isPositive ? '#0b3e26' : '#842029',\n borderRadius: '9999px',\n padding: '4px 10px',\n fontSize: '0.75rem',\n fontWeight: 700,\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n})\n\nexport function formatDateRange(previousDateRange) {\n if (!previousDateRange) return { formattedRange: '' }\n const parts = previousDateRange.split(' - ')\n const parseDate = (str) => { const [y, m, d] = str.split('-').map(Number); return new Date(y, m - 1, d) }\n const format = (date) => {\n const day = String(date.getDate()).padStart(2, '0')\n const month = date.toLocaleString('es-CO', { month: 'short' }).replace('.', '')\n const year = String(date.getFullYear()).slice(-2)\n return `${month} ${day},${year}`\n }\n const since = parseDate(parts[0])\n const until = parts[1] ? parseDate(parts[1]) : null\n return { formattedRange: until ? `${format(since)} - ${format(until)}` : format(since) }\n}\n","import { CCard, CCardBody } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport { cilArrowTop, cilArrowBottom } from '@coreui/icons'\nimport { Info } from 'lucide-react'\nimport CustomTooltip from '../custom-tooltip/CustomTooltip'\nimport { getBadgeStyles, formatValue, formatDateRange } from './card-utils'\n\nimport './general-card.scss'\n\n/**\n * GeneralCard\n *\n * Tarjeta de métrica con valor actual, valor anterior, variación porcentual y tooltip.\n *\n * @param {string} title - Nombre de la métrica\n * @param {number} current - Valor del período actual\n * @param {number} previous - Valor del período anterior\n * @param {number} change - Variación porcentual\n * @param {boolean} isPositive - Si la variación es positiva\n * @param {string} [unit] - Unidad ('COP', '%', 'x')\n * @param {string} [previousDateRange] - Rango de fechas anterior ('yyyy-MM-dd - yyyy-MM-dd')\n * @param {string} [tooltipText] - Texto del tooltip informativo\n * @param {string} [backgroundColor] - Color de fondo personalizado\n */\nexport default function GeneralCard({\n title,\n current,\n previous,\n change,\n isPositive,\n unit = '',\n previousDateRange = '',\n tooltipText = '',\n backgroundColor,\n}) {\n const isColored = !!backgroundColor\n const cardClass = `general-card w-100 h-100 d-flex flex-column border-0${isColored ? ' general-card--colored' : ''}`\n\n return (\n <CCard\n className={cardClass}\n style={isColored ? { background: backgroundColor } : undefined}\n >\n <CCardBody className=\"d-flex flex-column justify-content-between h-100 p-4 position-relative\">\n {tooltipText && (\n <div className=\"position-absolute top-0 end-0 m-2\">\n <CustomTooltip content={tooltipText} placement=\"top\">\n <Info\n size={16}\n strokeWidth={2}\n style={{ cursor: 'pointer', opacity: 0.5 }}\n />\n </CustomTooltip>\n </div>\n )}\n\n <p className=\"general-card__title m-0\">{title}</p>\n\n <div className=\"d-flex align-items-center gap-2 mt-1\">\n <span className=\"general-card__value\">\n {formatValue(current, unit, title)}\n </span>\n {typeof change === 'number' && isFinite(change) && current > 0 && (\n <div style={getBadgeStyles(isPositive)}>\n <CIcon icon={isPositive ? cilArrowTop : cilArrowBottom} size=\"sm\" />\n {Math.abs(change)}%\n </div>\n )}\n </div>\n\n <hr className=\"general-card__divider\" />\n\n {(() => {\n const { formattedRange } = formatDateRange(previousDateRange)\n return (\n <div className=\"d-flex justify-content-between align-items-center general-card__footer\">\n <strong>{formatValue(previous, unit, title)}</strong>\n <span>{formattedRange}</span>\n </div>\n )\n })()}\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\n\nimport {\n ResponsiveContainer,\n BarChart,\n Bar,\n XAxis,\n YAxis,\n Tooltip,\n Cell,\n LabelList,\n} from 'recharts'\nimport { CCard, CCardBody, CRow, CCol } from '@coreui/react-pro'\nimport { formatValue } from '../card/card-utils'\nimport GeneralCard from '../card/GeneralCard'\n\n/**\n * FunnelChart\n *\n * Gráfico de embudo horizontal con tarjetas de métricas debajo.\n *\n * @param {Array} data - Cada item: { title, value, previous, percentageChange, isPositive, unit, previousDateRange, color? }\n */\nexport default function FunnelChart({ data = [] }) {\n return (\n <CCard className=\"mt-4 rounded-4 shadow-sm p-3\">\n <CCardBody>\n <ResponsiveContainer width=\"100%\" height={data.length * 45 + 50}>\n <BarChart\n data={data}\n layout=\"vertical\"\n margin={{ top: 10, right: 60, left: 20, bottom: 0 }}\n barCategoryGap={15}\n >\n <defs>\n <linearGradient id=\"funnelGradient\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n <stop offset=\"0%\" stopColor=\"#FF8AAE\" />\n <stop offset=\"100%\" stopColor=\"#FF1F3D\" />\n </linearGradient>\n </defs>\n <XAxis type=\"number\" hide domain={[0, 'dataMax']} />\n <YAxis\n dataKey=\"title\"\n type=\"category\"\n width={130}\n axisLine={false}\n tickLine={false}\n style={{ fontWeight: 600, fill: '#333', fontSize: 13 }}\n />\n <Tooltip\n content={({ active, payload }) => {\n if (active && payload && payload.length > 0) {\n const { value, payload: item } = payload[0]\n return (\n <div className=\"bg-white shadow-sm p-2 rounded\">\n <strong>{item.title}</strong>:{' '}\n <span>{formatValue(value, item.unit, item.title)}</span>\n </div>\n )\n }\n return null\n }}\n />\n <Bar dataKey=\"value\" fill=\"url(#funnelGradient)\" radius={[0, 10, 10, 0]}>\n <LabelList\n dataKey=\"value\"\n position=\"right\"\n formatter={(val) => formatValue(val)}\n style={{ fill: '#333', fontWeight: 500, fontSize: 12 }}\n />\n {data.map((entry, index) => (\n <Cell\n key={`cell-${entry.title || index}`}\n fill={entry.color || 'url(#funnelGradient)'}\n />\n ))}\n </Bar>\n </BarChart>\n </ResponsiveContainer>\n\n <CRow className=\"pt-4 g-3\">\n {data.slice(0, 3).map((item, index) => (\n <CCol xs={12} md={4} key={`card-top-${index}`}>\n <GeneralCard\n title={item.title}\n current={item.value}\n previous={item.previous}\n change={item.percentageChange}\n isPositive={item.isPositive}\n unit={item.unit}\n previousDateRange={item.previousDateRange}\n tooltipText={item.title}\n />\n </CCol>\n ))}\n </CRow>\n\n {data.length > 3 && (\n <CRow className=\"pt-3 g-3\">\n {data.slice(3).map((item, index) => (\n <CCol xs={12} md={5} lg={4} key={`card-bottom-${index}`}>\n <GeneralCard\n title={item.title}\n current={item.value}\n previous={item.previous}\n change={item.percentageChange}\n isPositive={item.isPositive}\n unit={item.unit}\n previousDateRange={item.previousDateRange}\n tooltipText={item.title}\n />\n </CCol>\n ))}\n </CRow>\n )}\n </CCardBody>\n </CCard>\n )\n}\n","import {\n ResponsiveContainer,\n LineChart,\n Line,\n XAxis,\n YAxis,\n Tooltip,\n Legend,\n CartesianGrid,\n} from 'recharts'\nimport { CCard, CCardBody, CRow, CCol } from '@coreui/react-pro'\nimport { formatValue } from '../card/card-utils'\nimport GeneralCard from '../card/GeneralCard'\n\n/**\n * TimeSeriesComparisonChart\n *\n * Gráfico de líneas para comparar series de tiempo con tarjetas de resumen opcionales.\n *\n * @param {Array} data - Array de puntos { date, [lineName]: number, ... }\n * @param {Array} lines - Claves de las líneas a dibujar (e.g. ['ventas', 'inversión'])\n * @param {Object} colors - Mapa de nombre → color (e.g. { ventas: '#FF2F86' })\n * @param {Array} cards - Tarjetas de resumen opcionales\n * @param {string} currency - Símbolo de moneda para el eje Y (e.g. 'COP')\n * @param {string} yAxisLabel - Etiqueta del eje Y\n * @param {Object} displayNames - Mapa de clave → nombre legible para tooltip/leyenda\n */\nexport default function TimeSeriesComparisonChart({\n data = [],\n lines = [],\n colors = {},\n cards = [],\n currency = '',\n yAxisLabel = '',\n displayNames = {},\n}) {\n const detectUnit = (name = '') => {\n const lower = name.toLowerCase()\n if (lower.includes('%')) return '%'\n if (lower.includes('venta') || lower.includes('inversión')) return currency || ''\n return ''\n }\n\n const maxY = data.length\n ? Math.ceil(\n Math.max(\n ...lines.map((lineName) => Math.max(...data.map((d) => d[lineName] || 0)))\n ) * 1.1\n )\n : 100\n\n return (\n <CCard className=\"mt-4 rounded-4 shadow-sm p-3\">\n <CCardBody>\n {cards.length > 0 && (\n <CRow className=\"pt-4 g-3 justify-content-center text-center mb-4\">\n {cards.map((card, index) => (\n <CCol xs={12} md={4} lg={5} key={index}>\n <GeneralCard\n title={card.title}\n current={card.value}\n previous={card.previous}\n change={card.percentageChange}\n isPositive={card.isPositive}\n unit={card.unit}\n previousDateRange={card.previousDateRange}\n tooltipText={card.title}\n />\n </CCol>\n ))}\n </CRow>\n )}\n\n <ResponsiveContainer width=\"100%\" height={340}>\n <LineChart data={data} margin={{ top: 20, right: 30, left: 10, bottom: 10 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#e5e5e5\" />\n <XAxis dataKey=\"date\" stroke=\"#333\" tick={{ fontSize: 12 }} />\n <YAxis\n yAxisId=\"left\"\n stroke=\"#333\"\n tickFormatter={(val) =>\n `${currency ? currency + ' ' : ''}${\n val >= 1_000_000\n ? (val / 1_000_000).toFixed(1) + 'M'\n : val.toLocaleString('es-CO')\n }`\n }\n tick={{ fontSize: 12 }}\n width={100}\n domain={[0, maxY]}\n allowDecimals={false}\n label={\n yAxisLabel\n ? {\n value: yAxisLabel,\n angle: -90,\n position: 'insideLeft',\n style: { textAnchor: 'middle', fill: '#333', fontSize: 13 },\n }\n : undefined\n }\n />\n <Tooltip\n formatter={(val, name) => {\n const unit = detectUnit(name)\n return [formatValue(val, unit), displayNames[name] || name]\n }}\n labelClassName=\"fw-bold\"\n wrapperStyle={{ zIndex: 1000 }}\n />\n <Legend\n verticalAlign=\"bottom\"\n height={36}\n wrapperStyle={{ marginTop: 20 }}\n iconType=\"circle\"\n formatter={(value) => displayNames[value] || value}\n />\n {lines.map((lineName) => (\n <Line\n key={lineName}\n yAxisId=\"left\"\n type=\"monotone\"\n dataKey={lineName}\n stroke={colors[lineName] || '#000'}\n strokeWidth={2.5}\n dot={{ r: 4 }}\n activeDot={{ r: 6 }}\n />\n ))}\n </LineChart>\n </ResponsiveContainer>\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\n\nimport {\n BarChart,\n Bar,\n XAxis,\n YAxis,\n Tooltip,\n ResponsiveContainer,\n LabelList,\n Cell,\n} from 'recharts'\nimport { CCard, CCardBody } from '@coreui/react-pro'\n\nconst COLORS = ['#FF6A8D', '#FF8AAE', '#FFA3BC', '#FFC3D0', '#FFE0E7']\n\nconst ChartTooltip = ({ active, payload }) => {\n if (active && payload && payload.length) {\n return (\n <div className=\"bg-white p-2 shadow rounded border border-light\">\n <p className=\"mb-1 fw-semibold\">{payload[0].payload.name}</p>\n <p className=\"mb-0 text-muted\">Cantidad: {payload[0].value.toLocaleString()}</p>\n </div>\n )\n }\n return null\n}\n\n/**\n * TopProductsChart\n *\n * Gráfico horizontal de barras para los productos más vendidos.\n *\n * @param {Array} data - Array de { name: string, quantity: number }\n * @param {string} title - Título del gráfico\n * @param {string} emptyText - Mensaje cuando no hay datos\n * @param {number} maxItems - Máximo de productos a mostrar (default 5)\n */\nexport default function TopProductsChart({\n data = [],\n title = 'Productos Más Vendidos',\n emptyText = 'No se registraron productos vendidos en este rango de fechas.',\n maxItems = 5,\n}) {\n const processedData = (data || [])\n .filter((item) => item.quantity > 0 && item.name?.trim())\n .sort((a, b) => b.quantity - a.quantity)\n .slice(0, maxItems)\n .map((item) => ({ name: item.name, quantity: item.quantity }))\n\n if (!processedData.length) {\n return (\n <CCard className=\"mt-4 rounded-4 shadow-sm p-3\">\n <CCardBody className=\"text-center py-5\">\n <p className=\"text-muted mb-2\">\n <i className=\"bi bi-box-seam fs-4 d-block mb-2\" />\n {emptyText}\n </p>\n </CCardBody>\n </CCard>\n )\n }\n\n return (\n <CCard className=\"mt-4 rounded-4 shadow-sm p-3\">\n <CCardBody>\n <h5 className=\"fw-semibold text-center fs-5 mb-4\">{title}</h5>\n <div style={{ height: `${Math.max(processedData.length * 50, 80)}px` }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart\n layout=\"vertical\"\n data={processedData}\n margin={{ top: 10, right: 40, left: 20, bottom: 10 }}\n >\n <defs>\n <linearGradient id=\"barGradient\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n <stop offset=\"0%\" stopColor=\"#FF8AAE\" />\n <stop offset=\"100%\" stopColor=\"#FF1F3D\" />\n </linearGradient>\n </defs>\n <XAxis\n type=\"number\"\n tickFormatter={(value) => value.toLocaleString()}\n axisLine={false}\n tick={{ fontSize: 12 }}\n />\n <YAxis\n type=\"category\"\n dataKey=\"name\"\n width={150}\n tick={{ fontSize: 13 }}\n tickFormatter={(value) =>\n value.length > 30 ? value.substring(0, 30) + '...' : value\n }\n />\n <Tooltip content={<ChartTooltip />} />\n <Bar dataKey=\"quantity\" fill=\"url(#barGradient)\" radius={[0, 8, 8, 0]}>\n <LabelList\n dataKey=\"quantity\"\n position=\"right\"\n formatter={(value) => value.toLocaleString()}\n style={{ fill: '#333', fontWeight: 500, fontSize: 12 }}\n />\n {processedData.map((_, index) => (\n <Cell key={`cell-${index}`} fill={COLORS[index % COLORS.length]} />\n ))}\n </Bar>\n </BarChart>\n </ResponsiveContainer>\n </div>\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\n\nimport {\n ResponsiveContainer,\n BarChart,\n Bar,\n XAxis,\n YAxis,\n Tooltip,\n Legend,\n CartesianGrid,\n} from 'recharts'\nimport { CCard, CCardBody } from '@coreui/react-pro'\n\n/**\n * SalesByChannelChart\n *\n * Gráfico de barras apiladas para ventas por canal (Meta, TikTok, Google).\n *\n * @param {Array} data - Array de { fecha: string, Meta?: number, TikTok?: number, Google?: number }\n * @param {string} title - Título del gráfico\n * @param {string} emptyText - Mensaje cuando no hay datos\n * @param {string[]} channels - Canales a mostrar (default ['Meta', 'TikTok', 'Google'])\n * @param {Object} channelColors - Mapa canal → color\n */\nexport default function SalesByChannelChart({\n data = [],\n title = 'Ventas por canal',\n emptyText = 'Sin datos para este período',\n channels = ['Meta', 'TikTok', 'Google'],\n channelColors = { Meta: '#FF2F86', TikTok: '#C0C0C0', Google: '#333333' },\n}) {\n const hasData = data.length > 0\n\n return (\n <CCard className=\"rounded-4 shadow-sm p-3\">\n <CCardBody>\n <h5 className=\"fw-bold text-center\">{title}</h5>\n {!hasData ? (\n <p className=\"text-center text-muted\">{emptyText}</p>\n ) : (\n <ResponsiveContainer width=\"100%\" height={300}>\n <BarChart data={data} margin={{ top: 20, right: 30, left: 10, bottom: 10 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#e5e5e5\" />\n <XAxis\n dataKey=\"fecha\"\n tick={{ fontSize: 12 }}\n angle={-45}\n textAnchor=\"end\"\n interval={Math.ceil(data.length / 10)}\n />\n <YAxis tick={{ fontSize: 12 }} />\n <Tooltip />\n <Legend verticalAlign=\"top\" height={36} iconType=\"circle\" />\n {channels.map((channel) => (\n <Bar\n key={channel}\n dataKey={channel}\n stackId=\"ventas\"\n fill={channelColors[channel] || '#888'}\n />\n ))}\n </BarChart>\n </ResponsiveContainer>\n )}\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\n\nimport {\n PieChart,\n Pie,\n Cell,\n Legend,\n Tooltip,\n ResponsiveContainer,\n} from 'recharts'\nimport { CCard, CCardBody } from '@coreui/react-pro'\n\nconst DEFAULT_COLORS = ['#FF2F86', '#D9D9D9', '#333333']\n\n/**\n * InvestmentByPlatformChart\n *\n * Gráfico de dona para distribución de inversión por plataforma.\n *\n * @param {Array} data - Array de { name: string, value: number }\n * @param {string} title - Título del gráfico\n * @param {string[]} colors - Colores para cada slice\n * @param {string} currencySymbol - Símbolo de moneda para el tooltip\n * @param {string} locale - Locale para formatear números (default 'es-CO')\n */\nexport default function InvestmentByPlatformChart({\n data = [],\n title = 'Inversión por plataforma',\n colors = DEFAULT_COLORS,\n currencySymbol = 'COP',\n locale = 'es-CO',\n}) {\n return (\n <CCard className=\"rounded-4 shadow-sm p-3\">\n <CCardBody>\n <h5 className=\"text-center fw-bold\">{title}</h5>\n <ResponsiveContainer width=\"100%\" height={280}>\n <PieChart>\n <Pie\n data={data}\n dataKey=\"value\"\n nameKey=\"name\"\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={60}\n outerRadius={100}\n paddingAngle={5}\n label={({ name, percent }) => `${name} ${(percent * 100).toFixed(1)}%`}\n >\n {data.map((_, index) => (\n <Cell key={`cell-${index}`} fill={colors[index % colors.length]} />\n ))}\n </Pie>\n <Tooltip\n formatter={(value) =>\n `${currencySymbol} ${value.toLocaleString(locale)}`\n }\n />\n <Legend verticalAlign=\"bottom\" height={36} />\n </PieChart>\n </ResponsiveContainer>\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\nimport { CTable, CTableHead, CTableBody, CTableRow, CTableHeaderCell, CSpinner } from '@coreui/react-pro'\n\nexport default function PaginatedTable({ data = [], itemsPerPage = 10, currentPage = 1, setCurrentPage = () => {}, columns = [], renderRow = () => null, loading = false, emptyMessage = 'No hay datos disponibles.' }) {\n const totalPages = Math.ceil(data.length / itemsPerPage)\n const paginatedData = data.slice((currentPage - 1) * itemsPerPage, currentPage * itemsPerPage)\n\n if (loading) return <div className=\"text-center py-5\"><CSpinner color=\"secondary\" /></div>\n if (!data.length) return <div className=\"text-center py-5 text-muted\">{emptyMessage}</div>\n\n const renderPagination = () => {\n const pages = Array.from({ length: totalPages }, (_, i) => i + 1)\n return (\n <div className=\"d-flex justify-content-center align-items-center gap-2 mt-3 flex-wrap\">\n {currentPage > 1 && <button onClick={() => setCurrentPage(currentPage - 1)} className=\"px-3 py-1 rounded-pill border bg-white text-dark\" style={{ minWidth: 80, fontWeight: 500 }}>Anterior</button>}\n {pages.map(i => <button key={i} onClick={() => setCurrentPage(i)} className={`px-3 py-1 rounded-pill border ${i === currentPage ? 'bg-dark text-white' : 'bg-white text-dark'}`}>{i}</button>)}\n {currentPage < totalPages && <button onClick={() => setCurrentPage(currentPage + 1)} className=\"px-3 py-1 rounded-pill border bg-white text-dark\" style={{ minWidth: 80, fontWeight: 500 }}>Siguiente</button>}\n </div>\n )\n }\n\n return (\n <>\n <CTable hover responsive>\n <CTableHead className=\"bg-dark text-white\">\n <CTableRow>{columns.map((col, i) => <CTableHeaderCell key={i}>{col}</CTableHeaderCell>)}</CTableRow>\n </CTableHead>\n <CTableBody>{paginatedData.map(renderRow)}</CTableBody>\n </CTable>\n {totalPages > 1 && renderPagination()}\n </>\n )\n}\n","'use client'\nimport { CSpinner } from '@coreui/react-pro'\n\nexport default function PaginatedGrid({ data = [], itemsPerPage = 6, currentPage = 1, setCurrentPage = () => {}, renderItem = () => null, loading = false, emptyMessage = 'No hay elementos.' }) {\n const totalPages = Math.ceil(data.length / itemsPerPage)\n const paginatedData = data.slice((currentPage - 1) * itemsPerPage, currentPage * itemsPerPage)\n\n if (loading) return <div className=\"text-center py-5\"><CSpinner color=\"secondary\" /></div>\n if (!data.length) return <div className=\"text-center py-5 text-muted\">{emptyMessage}</div>\n\n const renderPagination = () => {\n const pages = Array.from({ length: totalPages }, (_, i) => i + 1)\n return (\n <div className=\"d-flex justify-content-center gap-2 mt-4 flex-wrap\">\n {currentPage > 1 && <button onClick={() => setCurrentPage(currentPage - 1)} className=\"px-3 py-1 rounded-pill border bg-white text-dark\">Anterior</button>}\n {pages.map(i => <button key={i} onClick={() => setCurrentPage(i)} className={`px-3 py-1 rounded-pill border ${i === currentPage ? 'bg-dark text-white' : 'bg-white text-dark'}`}>{i}</button>)}\n {currentPage < totalPages && <button onClick={() => setCurrentPage(currentPage + 1)} className=\"px-3 py-1 rounded-pill border bg-white text-dark\">Siguiente</button>}\n </div>\n )\n }\n\n return (\n <>\n <div className=\"row g-4\">{paginatedData.map(renderItem)}</div>\n {totalPages > 1 && renderPagination()}\n </>\n )\n}\n","import { CCard, CPlaceholder } from '@coreui/react-pro'\n\nexport default function CardSkeleton() {\n return (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder component=\"div\" animation=\"glow\" className=\"d-flex flex-column gap-2 bg-transparent\">\n <CPlaceholder className=\"p-4 mt-2 rounded-1\" size=\"lg\" xs={12} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n )\n}\n","import { CCard, CPlaceholder } from '@coreui/react-pro'\n\nexport default function TextSkeleton() {\n return (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder component=\"div\" animation=\"glow\" className=\"d-flex flex-column gap-2 bg-transparent\">\n <CPlaceholder className=\"p-0 my-2 rounded-1\" size=\"lg\" xs={8} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n )\n}\n","import { CCard, CPlaceholder } from '@coreui/react-pro'\n\nexport default function MetricsSkeleton() {\n return (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder component=\"div\" animation=\"glow\" className=\"d-flex flex-column gap-2 bg-transparent\">\n <CPlaceholder className=\"p-5 mt-2 rounded-1\" size=\"lg\" xs={12} color=\"skeleton\" />\n <CPlaceholder className=\"p-3 mt-2 rounded-1\" size=\"xs\" xs={12} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n )\n}\n","import { CCard, CPlaceholder } from '@coreui/react-pro'\n\n/**\n * ReportTableSkeleton\n *\n * Placeholder animado para tablas de reporte mientras cargan los datos.\n */\nexport default function ReportTableSkeleton() {\n return (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder\n component=\"div\"\n animation=\"glow\"\n className=\"d-flex flex-column gap-2 bg-transparent\"\n >\n <CPlaceholder className=\"p-4 mt-2 rounded-1\" size=\"lg\" xs={12} color=\"skeleton\" />\n <CPlaceholder className=\"p-5 mt-2 rounded-1\" size=\"lg\" xs={12} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n )\n}\n","'use client'\n\nimport { CCard, CCol, CPlaceholder, CRow } from '@coreui/react-pro'\n\nconst CardPlaceholder = ({ className = '' }) => (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder\n component=\"div\"\n animation=\"glow\"\n className={`d-flex flex-column gap-2 bg-transparent ${className}`}\n >\n <CPlaceholder className=\"p-4 mt-2 rounded-2\" size=\"lg\" xs={12} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n)\n\n/**\n * SummaryReportSkeleton\n *\n * Grilla de placeholders animados para reportes de resumen mientras cargan.\n *\n * @param {Array} layout - Array de { sm, md } para controlar el grid (default: 8 columnas predefinidas)\n */\nexport default function SummaryReportSkeleton({\n layout = [\n { sm: 6, md: 6 },\n { sm: 6, md: 6 },\n { sm: 6, md: 4 },\n { sm: 6, md: 4 },\n { sm: 6, md: 4 },\n { sm: 6, md: 6 },\n { sm: 6, md: 4 },\n { sm: 6, md: 2 },\n ],\n}) {\n return (\n <CRow className=\"g-md-3 px-4 px-sm-2 g-sm-2 pt-2 pb-4\">\n {layout.map((col, index) => (\n <CCol sm={col.sm} md={col.md} key={index}>\n <CardPlaceholder />\n </CCol>\n ))}\n </CRow>\n )\n}\n","export var cidExclamationCircle = [\"512 512\", \"<path fill='var(--ci-secondary-color, currentColor)' d='M256,16C123.452,16,16,123.452,16,256S123.452,496,256,496a238.867,238.867,0,0,0,132.685-40q1.668-1.108,3.315-2.246A239.721,239.721,0,0,0,496,256C496,123.452,388.548,16,256,16Z' class='ci-secondary' opacity='var(--ci-secondary-opacity, 0.25)'/><polygon fill='var(--ci-primary-color, currentColor)' points='224 232 238 304 274 304 288 232 288 120 224 120 224 232' class='ci-primary'/><rect width='40' height='40' x='236' y='344' fill='var(--ci-primary-color, currentColor)' class='ci-primary'/>\"];\n","import { cidExclamationCircle } from '@coreui/icons-pro'\nimport CIcon from '@coreui/icons-react'\n\n/**\n * NoDataMessage\n *\n * Alerta visual cuando no hay datos disponibles para el período seleccionado.\n *\n * @param {string} message - Mensaje a mostrar\n */\nexport function NoDataMessage({\n message = 'No se obtuvieron datos. Revisa el rango de fechas y la integración.',\n}) {\n return (\n <div\n className=\"d-flex align-items-center gap-2 rounded-3 px-3 py-3 mt-3 mb-3\"\n style={{\n backgroundColor: 'var(--cui-warning-bg-subtle)',\n border: '1px solid var(--cui-warning)',\n color: 'var(--cui-body-color)',\n }}\n >\n <CIcon\n icon={cidExclamationCircle}\n className=\"flex-shrink-0 me-2 text-warning\"\n size=\"xxl\"\n />\n {message}\n </div>\n )\n}\n","'use client'\nimport { useRouter } from 'next/navigation'\nimport { CButton } from '@coreui/react-pro'\nimport { cilArrowLeft } from '@coreui/icons'\nimport CIcon from '@coreui/icons-react'\nimport CustomTooltip from '../custom-tooltip/CustomTooltip'\n\nexport default function BackButton({ title, color = 'dark', className = '', path }) {\n const { back, push } = useRouter()\n return (\n <CustomTooltip content=\"Volver atrás\" placement=\"bottom\">\n <CButton color={color} variant=\"ghost\" className={`back-button d-flex align-items-center px-0 ${className}`} onClick={() => path ? push(path) : back()}>\n <CIcon icon={cilArrowLeft} size=\"lg\" className=\"mx-1\" />\n {title && <span className=\"px-2\">{title}</span>}\n </CButton>\n </CustomTooltip>\n )\n}\n"],"mappings":"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","names":["CIcon","import_react_pro","import_icons_react","CIcon","import_react_pro","import_icons_react","CIcon","import_react_pro","import_icons_react","Tippy","CIcon","import_icons_react","import_react_pro","CIcon","import_react_pro","import_icons_react","import_icons","CIcon","import_react_pro","import_icons_react","import_icons","CIcon","import_react_pro","import_recharts","import_react_pro","import_recharts","import_react_pro","import_recharts","import_react_pro","import_recharts","import_react_pro","import_react_pro","import_react_pro","import_react_pro","import_react_pro","import_react_pro","import_react_pro","import_react_pro","import_icons_react","CIcon","import_react_pro","import_icons","import_icons_react","CIcon"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.js","../src/components/buttons/SolidButton.jsx","../src/components/buttons/OutlineButton.jsx","../src/components/buttons/TextButton.jsx","../src/components/buttons/IconButton.jsx","../src/components/custom-tooltip/CustomTooltip.jsx","../src/components/modal/Modal.jsx","../src/components/card/MetricCard.jsx","../src/components/card/card-utils.js","../src/components/card/GeneralCard.jsx","../src/components/charts/FunnelChart.jsx","../src/components/charts/TimeSeriesComparisonChart.jsx","../src/components/charts/TopProductsChart.jsx","../src/components/charts/SalesByChannelChart.jsx","../src/components/charts/InvestmentByPlatformChart.jsx","../src/components/pagination/PaginatedTable.jsx","../src/components/pagination/PaginatedGrid.jsx","../src/components/skeletons/CardSkeleton.jsx","../src/components/skeletons/TextSkeleton.jsx","../src/components/skeletons/MetricsSkeleton.jsx","../src/components/skeletons/ReportTableSkeleton.jsx","../src/components/skeletons/SummaryReportSkeleton.jsx","../../../node_modules/@coreui/icons-pro/src/duotone/cid-exclamation-circle.ts","../src/components/feedback/NoDataMessage.jsx","../src/components/back-button/BackButton.jsx"],"sourcesContent":["// ── Buttons ───────────────────────────────────────────────────────────────────\nexport { default as SolidButton } from './components/buttons/SolidButton'\nexport { default as OutlineButton } from './components/buttons/OutlineButton'\nexport { default as TextButton } from './components/buttons/TextButton'\nexport { default as IconButton } from './components/buttons/IconButton'\n\n// ── Overlay ───────────────────────────────────────────────────────────────────\nexport { default as CustomTooltip } from './components/custom-tooltip/CustomTooltip'\n\n// ── Modal ─────────────────────────────────────────────────────────────────────\nexport { default as Modal } from './components/modal/Modal'\n\n// ── Cards ─────────────────────────────────────────────────────────────────────\nexport { default as MetricCard } from './components/card/MetricCard'\nexport { default as GeneralCard } from './components/card/GeneralCard'\nexport { formatValue, getBadgeStyles, formatDateRange } from './components/card/card-utils'\n\n// ── Charts ────────────────────────────────────────────────────────────────────\nexport { default as FunnelChart } from './components/charts/FunnelChart'\nexport { default as TimeSeriesComparisonChart } from './components/charts/TimeSeriesComparisonChart'\nexport { default as TopProductsChart } from './components/charts/TopProductsChart'\nexport { default as SalesByChannelChart } from './components/charts/SalesByChannelChart'\nexport { default as InvestmentByPlatformChart } from './components/charts/InvestmentByPlatformChart'\n\n// ── Pagination ────────────────────────────────────────────────────────────────\nexport { default as PaginatedTable } from './components/pagination/PaginatedTable'\nexport { default as PaginatedGrid } from './components/pagination/PaginatedGrid'\n\n// ── Skeletons ─────────────────────────────────────────────────────────────────\nexport { default as CardSkeleton } from './components/skeletons/CardSkeleton'\nexport { default as TextSkeleton } from './components/skeletons/TextSkeleton'\nexport { default as MetricsSkeleton } from './components/skeletons/MetricsSkeleton'\nexport { default as ReportTableSkeleton } from './components/skeletons/ReportTableSkeleton'\nexport { default as SummaryReportSkeleton } from './components/skeletons/SummaryReportSkeleton'\n\n// ── Feedback ──────────────────────────────────────────────────────────────────\nexport { NoDataMessage } from './components/feedback/NoDataMessage'\n\n// ── Navigation ────────────────────────────────────────────────────────────────\nexport { default as BackButton } from './components/back-button/BackButton'\n","'use client'\nimport { CLoadingButton } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport './SolidButton.scss'\n\nexport default function SolidButton({ title = 'Button', onClick, color = 'custom-primary', textColor = 'custom-white', className = '', loading = false, icon, svgComponent: SvgComponent, type = 'submit', badge, disabled }) {\n return (\n <CLoadingButton\n type={type}\n onClick={onClick}\n className={`solid-button rounded-4 px-4 py-2 fw-semibold text-${textColor} bg-${color} ${className}`}\n loading={loading}\n disabledOnLoading\n disabled={disabled}\n style={{ minHeight: '44px', minWidth: 'fit-content', fontSize: '0.95rem', letterSpacing: '0.3px' }}\n >\n {icon && <CIcon icon={icon} className=\"btn-icon\" />}\n {SvgComponent && !icon && <SvgComponent />}\n <span className=\"btn-title\">{title}</span>\n {badge && badge}\n </CLoadingButton>\n )\n}\n","'use client'\nimport { CLoadingButton } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport './OutlineButton.scss'\n\nexport default function OutlineButton({ title = 'Button', onClick, color = 'custom-primary', className = '', loading = false, icon, type = 'submit', disabled }) {\n return (\n <CLoadingButton\n type={type}\n onClick={onClick}\n className={`outline-button rounded-3 fw-medium text-${color} border-${color} ${className}`}\n loading={loading}\n disabledOnLoading\n disabled={disabled}\n variant=\"outline\"\n style={{ maxHeight: '40px', minWidth: 'fit-content' }}\n >\n {icon && <CIcon icon={icon} />}\n <span>{title}</span>\n </CLoadingButton>\n )\n}\n ","'use client'\nimport { CLoadingButton } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\n\nexport default function TextButton({ disabled, title, onClick, color = 'dark', className = '', loading = false, icon, children }) {\n return (\n <span className=\"d-inline-block\" tabIndex={0}>\n <CLoadingButton\n disabled={disabled}\n onClick={onClick}\n variant=\"ghost\"\n type=\"button\"\n color={color}\n className={`rounded-3 px-2 d-flex justify-content-center gap-2 fw-medium ${className}`}\n loading={loading}\n >\n {icon && <CIcon size=\"xl\" icon={icon} />}\n {children ? children : title}\n </CLoadingButton>\n </span>\n )\n}\n","'use client'\nimport { CLoadingButton } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport CustomTooltip from '../custom-tooltip/CustomTooltip'\n\nexport default function IconButton({ title, onClick, color = 'dark', className = '', loading = false, icon, tooltip = '', disabled }) {\n return (\n <CustomTooltip content={tooltip} placement=\"bottom\">\n <CLoadingButton\n onClick={onClick}\n variant=\"ghost\"\n type=\"button\"\n color={color}\n className={`d-flex justify-content-center align-items-center gap-1 m-0 p-1 ${className}`}\n loading={loading}\n disabled={disabled}\n >\n <CIcon size=\"xl\" icon={icon} />\n {title && <span className=\"ml-2 d-none d-md-block\">{title}</span>}\n </CLoadingButton>\n </CustomTooltip>\n )\n}\n","'use client'\nimport Tippy from '@tippyjs/react'\nimport 'tippy.js/dist/tippy.css'\n\nexport default function CustomTooltip({ content, placement = 'bottom', delay = 0, className = '', children }) {\n return (\n <Tippy content={content} placement={placement} className={className} delay={delay}>\n {children}\n </Tippy>\n )\n}\n","'use client'\nimport CIcon from '@coreui/icons-react'\nimport { CModal, CModalBody, CModalHeader, CModalTitle } from '@coreui/react-pro'\nimport { cilX } from '@coreui/icons'\n\nexport default function Modal({ title, titleIcon, visible, setVisible, alignment = 'center', size, children }) {\n return (\n <CModal alignment={alignment} visible={visible} onClose={() => setVisible(false)} size={size} focus keyboard aria-labelledby=\"roax-modal-title\">\n <CModalHeader className=\"position-relative\">\n <CModalTitle id=\"roax-modal-title\" className=\"d-flex align-items-center gap-2\">\n {titleIcon && <CIcon icon={titleIcon} size=\"lg\" className=\"text-muted\" />}\n {title}\n </CModalTitle>\n <button\n onClick={() => setVisible(false)}\n type=\"button\"\n className=\"position-absolute end-0 top-0 mt-3 me-3 p-0 bg-transparent border-0\"\n style={{ fontSize: '1.25rem', color: 'var(--cui-body-color)', zIndex: 10 }}\n aria-label=\"Cerrar\"\n >\n <CIcon icon={cilX} size=\"lg\" />\n </button>\n </CModalHeader>\n <CModalBody>{children}</CModalBody>\n </CModal>\n )\n}\n","'use client'\nimport { CCard, CCardBody } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport { cilArrowTop, cilArrowBottom, cilInfo } from '@coreui/icons'\nimport CustomTooltip from '../custom-tooltip/CustomTooltip'\nimport { formatValue, getBadgeStyles, formatDateRange } from './card-utils'\nimport './MetricCard.scss'\n\nexport default function MetricCard({ title, current, previous, change, isPositive, unit = '', previousDateRange = '', tooltipText = '', backgroundColor }) {\n const isColored = !!backgroundColor\n return (\n <CCard\n className={`metric-card w-100 h-100 d-flex flex-column border-0${isColored ? ' metric-card--colored' : ''}`}\n style={isColored ? { background: backgroundColor } : undefined}\n >\n <CCardBody className=\"d-flex flex-column justify-content-between h-100 p-4 position-relative\">\n {tooltipText && (\n <div className=\"position-absolute top-0 end-0 m-2\">\n <CustomTooltip content={tooltipText} placement=\"top\">\n <CIcon icon={cilInfo} style={{ cursor: 'pointer', opacity: 0.5, width: 16, height: 16 }} />\n </CustomTooltip>\n </div>\n )}\n <p className=\"metric-card__title m-0\">{title}</p>\n <div className=\"d-flex align-items-center gap-2 mt-1\">\n <span className=\"metric-card__value\">{formatValue(current, unit, title)}</span>\n {typeof change === 'number' && isFinite(change) && current > 0 && (\n <div style={getBadgeStyles(isPositive)}>\n <CIcon icon={isPositive ? cilArrowTop : cilArrowBottom} size=\"sm\" />\n {Math.abs(change)}%\n </div>\n )}\n </div>\n <hr className=\"metric-card__divider\" />\n {(() => {\n const { formattedRange } = formatDateRange(previousDateRange)\n return (\n <div className=\"d-flex justify-content-between align-items-center metric-card__footer\">\n <strong>{formatValue(previous, unit, title)}</strong>\n <span>{formattedRange}</span>\n </div>\n )\n })()}\n </CCardBody>\n </CCard>\n )\n}\n","export const formatValue = (val, unit = '', title = '') => {\n if (val == null || typeof val !== 'number' || val === 0) return '0'\n if (title.includes('ROAS')) return `x ${val.toFixed(2)}`\n if (title.includes('CAC %')) return `${val.toFixed(2)}%`\n if (unit === '%' || title.includes('%')) return `${val.toFixed(2)}%`\n if (unit === 'x') return `x ${val.toFixed(2)}`\n if (unit === 'COP') return `COP ${Math.round(val).toLocaleString('es-CO')}`\n return val.toLocaleString(undefined, { minimumFractionDigits: 0, maximumFractionDigits: 2 })\n}\n\nexport const getBadgeStyles = (isPositive) => ({\n backgroundColor: isPositive ? '#55ed7b' : '#f74a4a',\n color: isPositive ? '#0b3e26' : '#842029',\n borderRadius: '9999px',\n padding: '4px 10px',\n fontSize: '0.75rem',\n fontWeight: 700,\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n})\n\nexport function formatDateRange(previousDateRange) {\n if (!previousDateRange) return { formattedRange: '' }\n const parts = previousDateRange.split(' - ')\n const parseDate = (str) => { const [y, m, d] = str.split('-').map(Number); return new Date(y, m - 1, d) }\n const format = (date) => {\n const day = String(date.getDate()).padStart(2, '0')\n const month = date.toLocaleString('es-CO', { month: 'short' }).replace('.', '')\n const year = String(date.getFullYear()).slice(-2)\n return `${month} ${day},${year}`\n }\n const since = parseDate(parts[0])\n const until = parts[1] ? parseDate(parts[1]) : null\n return { formattedRange: until ? `${format(since)} - ${format(until)}` : format(since) }\n}\n","import { CCard, CCardBody } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport { cilArrowTop, cilArrowBottom } from '@coreui/icons'\nimport { Info } from 'lucide-react'\nimport CustomTooltip from '../custom-tooltip/CustomTooltip'\nimport { getBadgeStyles, formatValue, formatDateRange } from './card-utils'\n\nimport './general-card.scss'\n\n/**\n * GeneralCard\n *\n * Tarjeta de métrica con valor actual, valor anterior, variación porcentual y tooltip.\n *\n * @param {string} title - Nombre de la métrica\n * @param {number} current - Valor del período actual\n * @param {number} previous - Valor del período anterior\n * @param {number} change - Variación porcentual\n * @param {boolean} isPositive - Si la variación es positiva\n * @param {string} [unit] - Unidad ('COP', '%', 'x')\n * @param {string} [previousDateRange] - Rango de fechas anterior ('yyyy-MM-dd - yyyy-MM-dd')\n * @param {string} [tooltipText] - Texto del tooltip informativo\n * @param {string} [backgroundColor] - Color de fondo personalizado\n */\nexport default function GeneralCard({\n title,\n current,\n previous,\n change,\n isPositive,\n unit = '',\n previousDateRange = '',\n tooltipText = '',\n backgroundColor,\n}) {\n const isColored = !!backgroundColor\n const cardClass = `general-card w-100 h-100 d-flex flex-column border-0${isColored ? ' general-card--colored' : ''}`\n\n return (\n <CCard\n className={cardClass}\n style={isColored ? { background: backgroundColor } : undefined}\n >\n <CCardBody className=\"d-flex flex-column justify-content-between h-100 p-4 position-relative\">\n {tooltipText && (\n <div className=\"position-absolute top-0 end-0 m-2\">\n <CustomTooltip content={tooltipText} placement=\"top\">\n <Info\n size={16}\n strokeWidth={2}\n style={{ cursor: 'pointer', opacity: 0.5 }}\n />\n </CustomTooltip>\n </div>\n )}\n\n <p className=\"general-card__title m-0\">{title}</p>\n\n <div className=\"d-flex align-items-center gap-2 mt-1\">\n <span className=\"general-card__value\">\n {formatValue(current, unit, title)}\n </span>\n {typeof change === 'number' && isFinite(change) && current > 0 && (\n <div style={getBadgeStyles(isPositive)}>\n <CIcon icon={isPositive ? cilArrowTop : cilArrowBottom} size=\"sm\" />\n {Math.abs(change)}%\n </div>\n )}\n </div>\n\n <hr className=\"general-card__divider\" />\n\n {(() => {\n const { formattedRange } = formatDateRange(previousDateRange)\n return (\n <div className=\"d-flex justify-content-between align-items-center general-card__footer\">\n <strong>{formatValue(previous, unit, title)}</strong>\n <span>{formattedRange}</span>\n </div>\n )\n })()}\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\n\nimport {\n ResponsiveContainer,\n BarChart,\n Bar,\n XAxis,\n YAxis,\n Tooltip,\n Cell,\n LabelList,\n} from 'recharts'\nimport { CCard, CCardBody } from '@coreui/react-pro'\nimport { formatValue } from '../card/card-utils'\n\n/**\n * FunnelChart\n *\n * Gráfico de embudo horizontal (barras horizontales apiladas por etapa).\n *\n * @param {Array} data - Array de etapas del embudo\n * @param {string} data[].label - Etiqueta de la etapa (eje Y)\n * @param {number} data[].value - Valor de la etapa\n * @param {string} [data[].unit] - Unidad del valor ('COP', '%', 'x', '')\n * @param {string} [data[].color] - Color personalizado de la barra\n * @param {string} [gradientStart] - Color inicial del gradiente (default: '#FF8AAE')\n * @param {string} [gradientEnd] - Color final del gradiente (default: '#FF1F3D')\n * @param {number} [barHeight] - Altura por barra en px (default: 45)\n */\nexport default function FunnelChart({\n data = [],\n gradientStart = '#FF8AAE',\n gradientEnd = '#FF1F3D',\n barHeight = 45,\n}) {\n return (\n <CCard className=\"rounded-4 shadow-sm p-3\">\n <CCardBody>\n <ResponsiveContainer width=\"100%\" height={data.length * barHeight + 50}>\n <BarChart\n data={data}\n layout=\"vertical\"\n margin={{ top: 10, right: 60, left: 20, bottom: 0 }}\n barCategoryGap={15}\n >\n <defs>\n <linearGradient id=\"funnelGradient\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n <stop offset=\"0%\" stopColor={gradientStart} />\n <stop offset=\"100%\" stopColor={gradientEnd} />\n </linearGradient>\n </defs>\n\n <XAxis type=\"number\" hide domain={[0, 'dataMax']} />\n <YAxis\n dataKey=\"label\"\n type=\"category\"\n width={130}\n axisLine={false}\n tickLine={false}\n style={{ fontWeight: 600, fill: '#333', fontSize: 13 }}\n />\n <Tooltip\n content={({ active, payload }) => {\n if (active && payload && payload.length > 0) {\n const { value, payload: item } = payload[0]\n return (\n <div className=\"bg-white shadow-sm p-2 rounded\">\n <strong>{item.label}</strong>:{' '}\n <span>{formatValue(value, item.unit, item.label)}</span>\n </div>\n )\n }\n return null\n }}\n />\n <Bar dataKey=\"value\" fill=\"url(#funnelGradient)\" radius={[0, 10, 10, 0]}>\n <LabelList\n dataKey=\"value\"\n position=\"right\"\n formatter={(val) => formatValue(val)}\n style={{ fill: '#333', fontWeight: 500, fontSize: 12 }}\n />\n {data.map((entry, index) => (\n <Cell\n key={`cell-${entry.label || index}`}\n fill={entry.color || 'url(#funnelGradient)'}\n />\n ))}\n </Bar>\n </BarChart>\n </ResponsiveContainer>\n </CCardBody>\n </CCard>\n )\n}\n","import {\n ResponsiveContainer,\n LineChart,\n Line,\n XAxis,\n YAxis,\n Tooltip,\n Legend,\n CartesianGrid,\n} from 'recharts'\nimport { CCard, CCardBody } from '@coreui/react-pro'\n\n/**\n * TimeSeriesComparisonChart\n *\n * Gráfico de líneas genérico para comparar múltiples series de tiempo.\n *\n * @param {Array} data - Puntos de datos: [{ date: string, [key]: number }]\n * @param {string} data[].date - Etiqueta del eje X (fecha u otro valor)\n * @param {string[]} lines - Claves de las series a graficar (deben existir en data)\n * @param {Object} [colors] - Mapa clave → color de línea (e.g. { ventas: '#FF2F86' })\n * @param {string} [currency] - Prefijo para el eje Y (e.g. 'COP', '$', '€')\n * @param {string} [yAxisLabel] - Etiqueta vertical del eje Y\n * @param {Object} [displayNames] - Mapa clave → nombre legible en tooltip/leyenda\n * @param {string} [xDataKey] - Clave del eje X en los datos (default: 'date')\n * @param {number} [height] - Altura del gráfico en px (default: 340)\n */\nexport default function TimeSeriesComparisonChart({\n data = [],\n lines = [],\n colors = {},\n currency = '',\n yAxisLabel = '',\n displayNames = {},\n xDataKey = 'date',\n height = 340,\n}) {\n const maxY = data.length && lines.length\n ? Math.ceil(\n Math.max(...lines.map((key) => Math.max(...data.map((d) => d[key] || 0)))) * 1.1\n )\n : 100\n\n const formatYTick = (val) => {\n const prefix = currency ? `${currency} ` : ''\n if (val >= 1_000_000) return `${prefix}${(val / 1_000_000).toFixed(1)}M`\n if (val >= 1_000) return `${prefix}${(val / 1_000).toFixed(0)}K`\n return `${prefix}${val}`\n }\n\n return (\n <CCard className=\"rounded-4 shadow-sm p-3\">\n <CCardBody>\n <ResponsiveContainer width=\"100%\" height={height}>\n <LineChart data={data} margin={{ top: 20, right: 30, left: 10, bottom: 10 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#e5e5e5\" />\n <XAxis\n dataKey={xDataKey}\n stroke=\"#333\"\n tick={{ fontSize: 12 }}\n />\n <YAxis\n yAxisId=\"left\"\n stroke=\"#333\"\n tickFormatter={formatYTick}\n tick={{ fontSize: 12 }}\n width={80}\n domain={[0, maxY]}\n allowDecimals={false}\n label={\n yAxisLabel\n ? {\n value: yAxisLabel,\n angle: -90,\n position: 'insideLeft',\n style: { textAnchor: 'middle', fill: '#333', fontSize: 13 },\n }\n : undefined\n }\n />\n <Tooltip\n formatter={(val, key) => [\n `${currency ? currency + ' ' : ''}${val.toLocaleString()}`,\n displayNames[key] || key,\n ]}\n labelClassName=\"fw-bold\"\n wrapperStyle={{ zIndex: 1000 }}\n />\n <Legend\n verticalAlign=\"bottom\"\n height={36}\n iconType=\"circle\"\n formatter={(key) => displayNames[key] || key}\n />\n {lines.map((key) => (\n <Line\n key={key}\n yAxisId=\"left\"\n type=\"monotone\"\n dataKey={key}\n stroke={colors[key] || '#ED1E78'}\n strokeWidth={2.5}\n dot={{ r: 4 }}\n activeDot={{ r: 6 }}\n />\n ))}\n </LineChart>\n </ResponsiveContainer>\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\n\nimport {\n BarChart,\n Bar,\n XAxis,\n YAxis,\n Tooltip,\n ResponsiveContainer,\n LabelList,\n Cell,\n} from 'recharts'\nimport { CCard, CCardBody } from '@coreui/react-pro'\n\nconst COLORS = ['#FF6A8D', '#FF8AAE', '#FFA3BC', '#FFC3D0', '#FFE0E7']\n\nconst ChartTooltip = ({ active, payload }) => {\n if (active && payload && payload.length) {\n return (\n <div className=\"bg-white p-2 shadow rounded border border-light\">\n <p className=\"mb-1 fw-semibold\">{payload[0].payload.name}</p>\n <p className=\"mb-0 text-muted\">Cantidad: {payload[0].value.toLocaleString()}</p>\n </div>\n )\n }\n return null\n}\n\n/**\n * TopProductsChart\n *\n * Gráfico horizontal de barras para los productos más vendidos.\n *\n * @param {Array} data - Array de { name: string, quantity: number }\n * @param {string} title - Título del gráfico\n * @param {string} emptyText - Mensaje cuando no hay datos\n * @param {number} maxItems - Máximo de productos a mostrar (default 5)\n */\nexport default function TopProductsChart({\n data = [],\n title = 'Productos Más Vendidos',\n emptyText = 'No se registraron productos vendidos en este rango de fechas.',\n maxItems = 5,\n}) {\n const processedData = (data || [])\n .filter((item) => item.quantity > 0 && item.name?.trim())\n .sort((a, b) => b.quantity - a.quantity)\n .slice(0, maxItems)\n .map((item) => ({ name: item.name, quantity: item.quantity }))\n\n if (!processedData.length) {\n return (\n <CCard className=\"mt-4 rounded-4 shadow-sm p-3\">\n <CCardBody className=\"text-center py-5\">\n <p className=\"text-muted mb-2\">\n <i className=\"bi bi-box-seam fs-4 d-block mb-2\" />\n {emptyText}\n </p>\n </CCardBody>\n </CCard>\n )\n }\n\n return (\n <CCard className=\"mt-4 rounded-4 shadow-sm p-3\">\n <CCardBody>\n <h5 className=\"fw-semibold text-center fs-5 mb-4\">{title}</h5>\n <div style={{ height: `${Math.max(processedData.length * 50, 80)}px` }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart\n layout=\"vertical\"\n data={processedData}\n margin={{ top: 10, right: 40, left: 20, bottom: 10 }}\n >\n <defs>\n <linearGradient id=\"barGradient\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n <stop offset=\"0%\" stopColor=\"#FF8AAE\" />\n <stop offset=\"100%\" stopColor=\"#FF1F3D\" />\n </linearGradient>\n </defs>\n <XAxis\n type=\"number\"\n tickFormatter={(value) => value.toLocaleString()}\n axisLine={false}\n tick={{ fontSize: 12 }}\n />\n <YAxis\n type=\"category\"\n dataKey=\"name\"\n width={150}\n tick={{ fontSize: 13 }}\n tickFormatter={(value) =>\n value.length > 30 ? value.substring(0, 30) + '...' : value\n }\n />\n <Tooltip content={<ChartTooltip />} />\n <Bar dataKey=\"quantity\" fill=\"url(#barGradient)\" radius={[0, 8, 8, 0]}>\n <LabelList\n dataKey=\"quantity\"\n position=\"right\"\n formatter={(value) => value.toLocaleString()}\n style={{ fill: '#333', fontWeight: 500, fontSize: 12 }}\n />\n {processedData.map((_, index) => (\n <Cell key={`cell-${index}`} fill={COLORS[index % COLORS.length]} />\n ))}\n </Bar>\n </BarChart>\n </ResponsiveContainer>\n </div>\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\n\nimport {\n ResponsiveContainer,\n BarChart,\n Bar,\n XAxis,\n YAxis,\n Tooltip,\n Legend,\n CartesianGrid,\n} from 'recharts'\nimport { CCard, CCardBody } from '@coreui/react-pro'\n\n/**\n * SalesByChannelChart\n *\n * Gráfico de barras apiladas para ventas por canal (Meta, TikTok, Google).\n *\n * @param {Array} data - Array de { fecha: string, Meta?: number, TikTok?: number, Google?: number }\n * @param {string} title - Título del gráfico\n * @param {string} emptyText - Mensaje cuando no hay datos\n * @param {string[]} channels - Canales a mostrar (default ['Meta', 'TikTok', 'Google'])\n * @param {Object} channelColors - Mapa canal → color\n */\nexport default function SalesByChannelChart({\n data = [],\n title = 'Ventas por canal',\n emptyText = 'Sin datos para este período',\n channels = ['Meta', 'TikTok', 'Google'],\n channelColors = { Meta: '#FF2F86', TikTok: '#C0C0C0', Google: '#333333' },\n}) {\n const hasData = data.length > 0\n\n return (\n <CCard className=\"rounded-4 shadow-sm p-3\">\n <CCardBody>\n <h5 className=\"fw-bold text-center\">{title}</h5>\n {!hasData ? (\n <p className=\"text-center text-muted\">{emptyText}</p>\n ) : (\n <ResponsiveContainer width=\"100%\" height={300}>\n <BarChart data={data} margin={{ top: 20, right: 30, left: 10, bottom: 10 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#e5e5e5\" />\n <XAxis\n dataKey=\"fecha\"\n tick={{ fontSize: 12 }}\n angle={-45}\n textAnchor=\"end\"\n interval={Math.ceil(data.length / 10)}\n />\n <YAxis tick={{ fontSize: 12 }} />\n <Tooltip />\n <Legend verticalAlign=\"top\" height={36} iconType=\"circle\" />\n {channels.map((channel) => (\n <Bar\n key={channel}\n dataKey={channel}\n stackId=\"ventas\"\n fill={channelColors[channel] || '#888'}\n />\n ))}\n </BarChart>\n </ResponsiveContainer>\n )}\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\n\nimport {\n PieChart,\n Pie,\n Cell,\n Legend,\n Tooltip,\n ResponsiveContainer,\n} from 'recharts'\nimport { CCard, CCardBody } from '@coreui/react-pro'\n\nconst DEFAULT_COLORS = ['#FF2F86', '#D9D9D9', '#333333']\n\n/**\n * InvestmentByPlatformChart\n *\n * Gráfico de dona para distribución de inversión por plataforma.\n *\n * @param {Array} data - Array de { name: string, value: number }\n * @param {string} title - Título del gráfico\n * @param {string[]} colors - Colores para cada slice\n * @param {string} currencySymbol - Símbolo de moneda para el tooltip\n * @param {string} locale - Locale para formatear números (default 'es-CO')\n */\nexport default function InvestmentByPlatformChart({\n data = [],\n title = 'Inversión por plataforma',\n colors = DEFAULT_COLORS,\n currencySymbol = 'COP',\n locale = 'es-CO',\n}) {\n return (\n <CCard className=\"rounded-4 shadow-sm p-3\">\n <CCardBody>\n <h5 className=\"text-center fw-bold\">{title}</h5>\n <ResponsiveContainer width=\"100%\" height={280}>\n <PieChart>\n <Pie\n data={data}\n dataKey=\"value\"\n nameKey=\"name\"\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={60}\n outerRadius={100}\n paddingAngle={5}\n label={({ name, percent }) => `${name} ${(percent * 100).toFixed(1)}%`}\n >\n {data.map((_, index) => (\n <Cell key={`cell-${index}`} fill={colors[index % colors.length]} />\n ))}\n </Pie>\n <Tooltip\n formatter={(value) =>\n `${currencySymbol} ${value.toLocaleString(locale)}`\n }\n />\n <Legend verticalAlign=\"bottom\" height={36} />\n </PieChart>\n </ResponsiveContainer>\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\nimport { CTable, CTableHead, CTableBody, CTableRow, CTableHeaderCell, CSpinner } from '@coreui/react-pro'\n\nexport default function PaginatedTable({ data = [], itemsPerPage = 10, currentPage = 1, setCurrentPage = () => {}, columns = [], renderRow = () => null, loading = false, emptyMessage = 'No hay datos disponibles.' }) {\n const totalPages = Math.ceil(data.length / itemsPerPage)\n const paginatedData = data.slice((currentPage - 1) * itemsPerPage, currentPage * itemsPerPage)\n\n if (loading) return <div className=\"text-center py-5\"><CSpinner color=\"secondary\" /></div>\n if (!data.length) return <div className=\"text-center py-5 text-muted\">{emptyMessage}</div>\n\n const renderPagination = () => {\n const pages = Array.from({ length: totalPages }, (_, i) => i + 1)\n return (\n <div className=\"d-flex justify-content-center align-items-center gap-2 mt-3 flex-wrap\">\n {currentPage > 1 && <button onClick={() => setCurrentPage(currentPage - 1)} className=\"px-3 py-1 rounded-pill border bg-white text-dark\" style={{ minWidth: 80, fontWeight: 500 }}>Anterior</button>}\n {pages.map(i => <button key={i} onClick={() => setCurrentPage(i)} className={`px-3 py-1 rounded-pill border ${i === currentPage ? 'bg-dark text-white' : 'bg-white text-dark'}`}>{i}</button>)}\n {currentPage < totalPages && <button onClick={() => setCurrentPage(currentPage + 1)} className=\"px-3 py-1 rounded-pill border bg-white text-dark\" style={{ minWidth: 80, fontWeight: 500 }}>Siguiente</button>}\n </div>\n )\n }\n\n return (\n <>\n <CTable hover responsive>\n <CTableHead className=\"bg-dark text-white\">\n <CTableRow>{columns.map((col, i) => <CTableHeaderCell key={i}>{col}</CTableHeaderCell>)}</CTableRow>\n </CTableHead>\n <CTableBody>{paginatedData.map(renderRow)}</CTableBody>\n </CTable>\n {totalPages > 1 && renderPagination()}\n </>\n )\n}\n","'use client'\nimport { CSpinner } from '@coreui/react-pro'\n\nexport default function PaginatedGrid({ data = [], itemsPerPage = 6, currentPage = 1, setCurrentPage = () => {}, renderItem = () => null, loading = false, emptyMessage = 'No hay elementos.' }) {\n const totalPages = Math.ceil(data.length / itemsPerPage)\n const paginatedData = data.slice((currentPage - 1) * itemsPerPage, currentPage * itemsPerPage)\n\n if (loading) return <div className=\"text-center py-5\"><CSpinner color=\"secondary\" /></div>\n if (!data.length) return <div className=\"text-center py-5 text-muted\">{emptyMessage}</div>\n\n const renderPagination = () => {\n const pages = Array.from({ length: totalPages }, (_, i) => i + 1)\n return (\n <div className=\"d-flex justify-content-center gap-2 mt-4 flex-wrap\">\n {currentPage > 1 && <button onClick={() => setCurrentPage(currentPage - 1)} className=\"px-3 py-1 rounded-pill border bg-white text-dark\">Anterior</button>}\n {pages.map(i => <button key={i} onClick={() => setCurrentPage(i)} className={`px-3 py-1 rounded-pill border ${i === currentPage ? 'bg-dark text-white' : 'bg-white text-dark'}`}>{i}</button>)}\n {currentPage < totalPages && <button onClick={() => setCurrentPage(currentPage + 1)} className=\"px-3 py-1 rounded-pill border bg-white text-dark\">Siguiente</button>}\n </div>\n )\n }\n\n return (\n <>\n <div className=\"row g-4\">{paginatedData.map(renderItem)}</div>\n {totalPages > 1 && renderPagination()}\n </>\n )\n}\n","import { CCard, CPlaceholder } from '@coreui/react-pro'\n\nexport default function CardSkeleton() {\n return (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder component=\"div\" animation=\"glow\" className=\"d-flex flex-column gap-2 bg-transparent\">\n <CPlaceholder className=\"p-4 mt-2 rounded-1\" size=\"lg\" xs={12} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n )\n}\n","import { CCard, CPlaceholder } from '@coreui/react-pro'\n\nexport default function TextSkeleton() {\n return (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder component=\"div\" animation=\"glow\" className=\"d-flex flex-column gap-2 bg-transparent\">\n <CPlaceholder className=\"p-0 my-2 rounded-1\" size=\"lg\" xs={8} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n )\n}\n","import { CCard, CPlaceholder } from '@coreui/react-pro'\n\nexport default function MetricsSkeleton() {\n return (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder component=\"div\" animation=\"glow\" className=\"d-flex flex-column gap-2 bg-transparent\">\n <CPlaceholder className=\"p-5 mt-2 rounded-1\" size=\"lg\" xs={12} color=\"skeleton\" />\n <CPlaceholder className=\"p-3 mt-2 rounded-1\" size=\"xs\" xs={12} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n )\n}\n","import { CCard, CPlaceholder } from '@coreui/react-pro'\n\n/**\n * ReportTableSkeleton\n *\n * Placeholder animado para tablas de reporte mientras cargan los datos.\n */\nexport default function ReportTableSkeleton() {\n return (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder\n component=\"div\"\n animation=\"glow\"\n className=\"d-flex flex-column gap-2 bg-transparent\"\n >\n <CPlaceholder className=\"p-4 mt-2 rounded-1\" size=\"lg\" xs={12} color=\"skeleton\" />\n <CPlaceholder className=\"p-5 mt-2 rounded-1\" size=\"lg\" xs={12} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n )\n}\n","'use client'\n\nimport { CCard, CCol, CPlaceholder, CRow } from '@coreui/react-pro'\n\nconst CardPlaceholder = ({ className = '' }) => (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder\n component=\"div\"\n animation=\"glow\"\n className={`d-flex flex-column gap-2 bg-transparent ${className}`}\n >\n <CPlaceholder className=\"p-4 mt-2 rounded-2\" size=\"lg\" xs={12} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n)\n\n/**\n * SummaryReportSkeleton\n *\n * Grilla de placeholders animados para reportes de resumen mientras cargan.\n *\n * @param {Array} layout - Array de { sm, md } para controlar el grid (default: 8 columnas predefinidas)\n */\nexport default function SummaryReportSkeleton({\n layout = [\n { sm: 6, md: 6 },\n { sm: 6, md: 6 },\n { sm: 6, md: 4 },\n { sm: 6, md: 4 },\n { sm: 6, md: 4 },\n { sm: 6, md: 6 },\n { sm: 6, md: 4 },\n { sm: 6, md: 2 },\n ],\n}) {\n return (\n <CRow className=\"g-md-3 px-4 px-sm-2 g-sm-2 pt-2 pb-4\">\n {layout.map((col, index) => (\n <CCol sm={col.sm} md={col.md} key={index}>\n <CardPlaceholder />\n </CCol>\n ))}\n </CRow>\n )\n}\n","export var cidExclamationCircle = [\"512 512\", \"<path fill='var(--ci-secondary-color, currentColor)' d='M256,16C123.452,16,16,123.452,16,256S123.452,496,256,496a238.867,238.867,0,0,0,132.685-40q1.668-1.108,3.315-2.246A239.721,239.721,0,0,0,496,256C496,123.452,388.548,16,256,16Z' class='ci-secondary' opacity='var(--ci-secondary-opacity, 0.25)'/><polygon fill='var(--ci-primary-color, currentColor)' points='224 232 238 304 274 304 288 232 288 120 224 120 224 232' class='ci-primary'/><rect width='40' height='40' x='236' y='344' fill='var(--ci-primary-color, currentColor)' class='ci-primary'/>\"];\n","import { cidExclamationCircle } from '@coreui/icons-pro'\nimport CIcon from '@coreui/icons-react'\n\n/**\n * NoDataMessage\n *\n * Alerta visual cuando no hay datos disponibles para el período seleccionado.\n *\n * @param {string} message - Mensaje a mostrar\n */\nexport function NoDataMessage({\n message = 'No se obtuvieron datos. Revisa el rango de fechas y la integración.',\n}) {\n return (\n <div\n className=\"d-flex align-items-center gap-2 rounded-3 px-3 py-3 mt-3 mb-3\"\n style={{\n backgroundColor: 'var(--cui-warning-bg-subtle)',\n border: '1px solid var(--cui-warning)',\n color: 'var(--cui-body-color)',\n }}\n >\n <CIcon\n icon={cidExclamationCircle}\n className=\"flex-shrink-0 me-2 text-warning\"\n size=\"xxl\"\n />\n {message}\n </div>\n )\n}\n","'use client'\nimport { useRouter } from 'next/navigation'\nimport { CButton } from '@coreui/react-pro'\nimport { cilArrowLeft } from '@coreui/icons'\nimport CIcon from '@coreui/icons-react'\nimport CustomTooltip from '../custom-tooltip/CustomTooltip'\n\nexport default function BackButton({ title, color = 'dark', className = '', path }) {\n const { back, push } = useRouter()\n return (\n <CustomTooltip content=\"Volver atrás\" placement=\"bottom\">\n <CButton color={color} variant=\"ghost\" className={`back-button d-flex align-items-center px-0 ${className}`} onClick={() => path ? push(path) : back()}>\n <CIcon icon={cilArrowLeft} size=\"lg\" className=\"mx-1\" />\n {title && <span className=\"px-2\">{title}</span>}\n </CButton>\n </CustomTooltip>\n )\n}\n"],"mappings":"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","names":["CIcon","import_react_pro","import_icons_react","CIcon","import_react_pro","import_icons_react","CIcon","import_react_pro","import_icons_react","Tippy","CIcon","import_icons_react","import_react_pro","CIcon","import_react_pro","import_icons_react","import_icons","CIcon","import_react_pro","import_icons_react","import_icons","CIcon","import_react_pro","import_recharts","import_react_pro","import_recharts","import_react_pro","import_recharts","import_react_pro","import_recharts","import_react_pro","import_react_pro","import_react_pro","import_react_pro","import_react_pro","import_react_pro","import_react_pro","import_react_pro","import_icons_react","CIcon","import_react_pro","import_icons","import_icons_react","CIcon"]}
|
package/dist/index.mjs
CHANGED
|
@@ -221,9 +221,14 @@ import {
|
|
|
221
221
|
Cell,
|
|
222
222
|
LabelList
|
|
223
223
|
} from "recharts";
|
|
224
|
-
import { CCard as CCard3, CCardBody as CCardBody3
|
|
225
|
-
function FunnelChart({
|
|
226
|
-
|
|
224
|
+
import { CCard as CCard3, CCardBody as CCardBody3 } from "@coreui/react-pro";
|
|
225
|
+
function FunnelChart({
|
|
226
|
+
data = [],
|
|
227
|
+
gradientStart = "#FF8AAE",
|
|
228
|
+
gradientEnd = "#FF1F3D",
|
|
229
|
+
barHeight = 45
|
|
230
|
+
}) {
|
|
231
|
+
return /* @__PURE__ */ React.createElement(CCard3, { className: "rounded-4 shadow-sm p-3" }, /* @__PURE__ */ React.createElement(CCardBody3, null, /* @__PURE__ */ React.createElement(ResponsiveContainer, { width: "100%", height: data.length * barHeight + 50 }, /* @__PURE__ */ React.createElement(
|
|
227
232
|
BarChart,
|
|
228
233
|
{
|
|
229
234
|
data,
|
|
@@ -231,12 +236,12 @@ function FunnelChart({ data = [] }) {
|
|
|
231
236
|
margin: { top: 10, right: 60, left: 20, bottom: 0 },
|
|
232
237
|
barCategoryGap: 15
|
|
233
238
|
},
|
|
234
|
-
/* @__PURE__ */ React.createElement("defs", null, /* @__PURE__ */ React.createElement("linearGradient", { id: "funnelGradient", x1: "0", y1: "0", x2: "1", y2: "0" }, /* @__PURE__ */ React.createElement("stop", { offset: "0%", stopColor:
|
|
239
|
+
/* @__PURE__ */ React.createElement("defs", null, /* @__PURE__ */ React.createElement("linearGradient", { id: "funnelGradient", x1: "0", y1: "0", x2: "1", y2: "0" }, /* @__PURE__ */ React.createElement("stop", { offset: "0%", stopColor: gradientStart }), /* @__PURE__ */ React.createElement("stop", { offset: "100%", stopColor: gradientEnd }))),
|
|
235
240
|
/* @__PURE__ */ React.createElement(XAxis, { type: "number", hide: true, domain: [0, "dataMax"] }),
|
|
236
241
|
/* @__PURE__ */ React.createElement(
|
|
237
242
|
YAxis,
|
|
238
243
|
{
|
|
239
|
-
dataKey: "
|
|
244
|
+
dataKey: "label",
|
|
240
245
|
type: "category",
|
|
241
246
|
width: 130,
|
|
242
247
|
axisLine: false,
|
|
@@ -250,7 +255,7 @@ function FunnelChart({ data = [] }) {
|
|
|
250
255
|
content: ({ active, payload }) => {
|
|
251
256
|
if (active && payload && payload.length > 0) {
|
|
252
257
|
const { value, payload: item } = payload[0];
|
|
253
|
-
return /* @__PURE__ */ React.createElement("div", { className: "bg-white shadow-sm p-2 rounded" }, /* @__PURE__ */ React.createElement("strong", null, item.
|
|
258
|
+
return /* @__PURE__ */ React.createElement("div", { className: "bg-white shadow-sm p-2 rounded" }, /* @__PURE__ */ React.createElement("strong", null, item.label), ":", " ", /* @__PURE__ */ React.createElement("span", null, formatValue(value, item.unit, item.label)));
|
|
254
259
|
}
|
|
255
260
|
return null;
|
|
256
261
|
}
|
|
@@ -267,35 +272,11 @@ function FunnelChart({ data = [] }) {
|
|
|
267
272
|
), data.map((entry, index) => /* @__PURE__ */ React.createElement(
|
|
268
273
|
Cell,
|
|
269
274
|
{
|
|
270
|
-
key: `cell-${entry.
|
|
275
|
+
key: `cell-${entry.label || index}`,
|
|
271
276
|
fill: entry.color || "url(#funnelGradient)"
|
|
272
277
|
}
|
|
273
278
|
)))
|
|
274
|
-
))
|
|
275
|
-
GeneralCard,
|
|
276
|
-
{
|
|
277
|
-
title: item.title,
|
|
278
|
-
current: item.value,
|
|
279
|
-
previous: item.previous,
|
|
280
|
-
change: item.percentageChange,
|
|
281
|
-
isPositive: item.isPositive,
|
|
282
|
-
unit: item.unit,
|
|
283
|
-
previousDateRange: item.previousDateRange,
|
|
284
|
-
tooltipText: item.title
|
|
285
|
-
}
|
|
286
|
-
)))), data.length > 3 && /* @__PURE__ */ React.createElement(CRow, { className: "pt-3 g-3" }, data.slice(3).map((item, index) => /* @__PURE__ */ React.createElement(CCol, { xs: 12, md: 5, lg: 4, key: `card-bottom-${index}` }, /* @__PURE__ */ React.createElement(
|
|
287
|
-
GeneralCard,
|
|
288
|
-
{
|
|
289
|
-
title: item.title,
|
|
290
|
-
current: item.value,
|
|
291
|
-
previous: item.previous,
|
|
292
|
-
change: item.percentageChange,
|
|
293
|
-
isPositive: item.isPositive,
|
|
294
|
-
unit: item.unit,
|
|
295
|
-
previousDateRange: item.previousDateRange,
|
|
296
|
-
tooltipText: item.title
|
|
297
|
-
}
|
|
298
|
-
))))));
|
|
279
|
+
))));
|
|
299
280
|
}
|
|
300
281
|
|
|
301
282
|
// src/components/charts/TimeSeriesComparisonChart.jsx
|
|
@@ -309,47 +290,41 @@ import {
|
|
|
309
290
|
Legend,
|
|
310
291
|
CartesianGrid
|
|
311
292
|
} from "recharts";
|
|
312
|
-
import { CCard as CCard4, CCardBody as CCardBody4
|
|
293
|
+
import { CCard as CCard4, CCardBody as CCardBody4 } from "@coreui/react-pro";
|
|
313
294
|
function TimeSeriesComparisonChart({
|
|
314
295
|
data = [],
|
|
315
296
|
lines = [],
|
|
316
297
|
colors = {},
|
|
317
|
-
cards = [],
|
|
318
298
|
currency = "",
|
|
319
299
|
yAxisLabel = "",
|
|
320
|
-
displayNames = {}
|
|
300
|
+
displayNames = {},
|
|
301
|
+
xDataKey = "date",
|
|
302
|
+
height = 340
|
|
321
303
|
}) {
|
|
322
|
-
const
|
|
323
|
-
|
|
324
|
-
if (lower.includes("%")) return "%";
|
|
325
|
-
if (lower.includes("venta") || lower.includes("inversi\xF3n")) return currency || "";
|
|
326
|
-
return "";
|
|
327
|
-
};
|
|
328
|
-
const maxY = data.length ? Math.ceil(
|
|
329
|
-
Math.max(
|
|
330
|
-
...lines.map((lineName) => Math.max(...data.map((d) => d[lineName] || 0)))
|
|
331
|
-
) * 1.1
|
|
304
|
+
const maxY = data.length && lines.length ? Math.ceil(
|
|
305
|
+
Math.max(...lines.map((key) => Math.max(...data.map((d) => d[key] || 0)))) * 1.1
|
|
332
306
|
) : 100;
|
|
333
|
-
|
|
334
|
-
|
|
307
|
+
const formatYTick = (val) => {
|
|
308
|
+
const prefix = currency ? `${currency} ` : "";
|
|
309
|
+
if (val >= 1e6) return `${prefix}${(val / 1e6).toFixed(1)}M`;
|
|
310
|
+
if (val >= 1e3) return `${prefix}${(val / 1e3).toFixed(0)}K`;
|
|
311
|
+
return `${prefix}${val}`;
|
|
312
|
+
};
|
|
313
|
+
return /* @__PURE__ */ React.createElement(CCard4, { className: "rounded-4 shadow-sm p-3" }, /* @__PURE__ */ React.createElement(CCardBody4, null, /* @__PURE__ */ React.createElement(ResponsiveContainer2, { width: "100%", height }, /* @__PURE__ */ React.createElement(LineChart, { data, margin: { top: 20, right: 30, left: 10, bottom: 10 } }, /* @__PURE__ */ React.createElement(CartesianGrid, { strokeDasharray: "3 3", stroke: "#e5e5e5" }), /* @__PURE__ */ React.createElement(
|
|
314
|
+
XAxis2,
|
|
335
315
|
{
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
change: card.percentageChange,
|
|
340
|
-
isPositive: card.isPositive,
|
|
341
|
-
unit: card.unit,
|
|
342
|
-
previousDateRange: card.previousDateRange,
|
|
343
|
-
tooltipText: card.title
|
|
316
|
+
dataKey: xDataKey,
|
|
317
|
+
stroke: "#333",
|
|
318
|
+
tick: { fontSize: 12 }
|
|
344
319
|
}
|
|
345
|
-
)
|
|
320
|
+
), /* @__PURE__ */ React.createElement(
|
|
346
321
|
YAxis2,
|
|
347
322
|
{
|
|
348
323
|
yAxisId: "left",
|
|
349
324
|
stroke: "#333",
|
|
350
|
-
tickFormatter:
|
|
325
|
+
tickFormatter: formatYTick,
|
|
351
326
|
tick: { fontSize: 12 },
|
|
352
|
-
width:
|
|
327
|
+
width: 80,
|
|
353
328
|
domain: [0, maxY],
|
|
354
329
|
allowDecimals: false,
|
|
355
330
|
label: yAxisLabel ? {
|
|
@@ -362,10 +337,10 @@ function TimeSeriesComparisonChart({
|
|
|
362
337
|
), /* @__PURE__ */ React.createElement(
|
|
363
338
|
Tooltip2,
|
|
364
339
|
{
|
|
365
|
-
formatter: (val,
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
340
|
+
formatter: (val, key) => [
|
|
341
|
+
`${currency ? currency + " " : ""}${val.toLocaleString()}`,
|
|
342
|
+
displayNames[key] || key
|
|
343
|
+
],
|
|
369
344
|
labelClassName: "fw-bold",
|
|
370
345
|
wrapperStyle: { zIndex: 1e3 }
|
|
371
346
|
}
|
|
@@ -374,18 +349,17 @@ function TimeSeriesComparisonChart({
|
|
|
374
349
|
{
|
|
375
350
|
verticalAlign: "bottom",
|
|
376
351
|
height: 36,
|
|
377
|
-
wrapperStyle: { marginTop: 20 },
|
|
378
352
|
iconType: "circle",
|
|
379
|
-
formatter: (
|
|
353
|
+
formatter: (key) => displayNames[key] || key
|
|
380
354
|
}
|
|
381
|
-
), lines.map((
|
|
355
|
+
), lines.map((key) => /* @__PURE__ */ React.createElement(
|
|
382
356
|
Line,
|
|
383
357
|
{
|
|
384
|
-
key
|
|
358
|
+
key,
|
|
385
359
|
yAxisId: "left",
|
|
386
360
|
type: "monotone",
|
|
387
|
-
dataKey:
|
|
388
|
-
stroke: colors[
|
|
361
|
+
dataKey: key,
|
|
362
|
+
stroke: colors[key] || "#ED1E78",
|
|
389
363
|
strokeWidth: 2.5,
|
|
390
364
|
dot: { r: 4 },
|
|
391
365
|
activeDot: { r: 6 }
|
|
@@ -609,7 +583,7 @@ function ReportTableSkeleton() {
|
|
|
609
583
|
}
|
|
610
584
|
|
|
611
585
|
// src/components/skeletons/SummaryReportSkeleton.jsx
|
|
612
|
-
import { CCard as CCard12, CCol
|
|
586
|
+
import { CCard as CCard12, CCol, CPlaceholder as CPlaceholder5, CRow } from "@coreui/react-pro";
|
|
613
587
|
var CardPlaceholder = ({ className = "" }) => /* @__PURE__ */ React.createElement(CCard12, { className: "shadow-none p-0 m-0 bg-transparent border-0" }, /* @__PURE__ */ React.createElement(
|
|
614
588
|
CPlaceholder5,
|
|
615
589
|
{
|
|
@@ -631,7 +605,7 @@ function SummaryReportSkeleton({
|
|
|
631
605
|
{ sm: 6, md: 2 }
|
|
632
606
|
]
|
|
633
607
|
}) {
|
|
634
|
-
return /* @__PURE__ */ React.createElement(
|
|
608
|
+
return /* @__PURE__ */ React.createElement(CRow, { className: "g-md-3 px-4 px-sm-2 g-sm-2 pt-2 pb-4" }, layout.map((col, index) => /* @__PURE__ */ React.createElement(CCol, { sm: col.sm, md: col.md, key: index }, /* @__PURE__ */ React.createElement(CardPlaceholder, null))));
|
|
635
609
|
}
|
|
636
610
|
|
|
637
611
|
// ../../node_modules/@coreui/icons-pro/dist/esm/duotone/cid-exclamation-circle.js
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/buttons/SolidButton.jsx","../src/components/buttons/OutlineButton.jsx","../src/components/buttons/TextButton.jsx","../src/components/buttons/IconButton.jsx","../src/components/custom-tooltip/CustomTooltip.jsx","../src/components/modal/Modal.jsx","../src/components/card/MetricCard.jsx","../src/components/card/card-utils.js","../src/components/card/GeneralCard.jsx","../src/components/charts/FunnelChart.jsx","../src/components/charts/TimeSeriesComparisonChart.jsx","../src/components/charts/TopProductsChart.jsx","../src/components/charts/SalesByChannelChart.jsx","../src/components/charts/InvestmentByPlatformChart.jsx","../src/components/pagination/PaginatedTable.jsx","../src/components/pagination/PaginatedGrid.jsx","../src/components/skeletons/CardSkeleton.jsx","../src/components/skeletons/TextSkeleton.jsx","../src/components/skeletons/MetricsSkeleton.jsx","../src/components/skeletons/ReportTableSkeleton.jsx","../src/components/skeletons/SummaryReportSkeleton.jsx","../../../node_modules/@coreui/icons-pro/src/duotone/cid-exclamation-circle.ts","../src/components/feedback/NoDataMessage.jsx","../src/components/back-button/BackButton.jsx"],"sourcesContent":["'use client'\nimport { CLoadingButton } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport './SolidButton.scss'\n\nexport default function SolidButton({ title = 'Button', onClick, color = 'custom-primary', textColor = 'custom-white', className = '', loading = false, icon, svgComponent: SvgComponent, type = 'submit', badge, disabled }) {\n return (\n <CLoadingButton\n type={type}\n onClick={onClick}\n className={`solid-button rounded-4 px-4 py-2 fw-semibold text-${textColor} bg-${color} ${className}`}\n loading={loading}\n disabledOnLoading\n disabled={disabled}\n style={{ minHeight: '44px', minWidth: 'fit-content', fontSize: '0.95rem', letterSpacing: '0.3px' }}\n >\n {icon && <CIcon icon={icon} className=\"btn-icon\" />}\n {SvgComponent && !icon && <SvgComponent />}\n <span className=\"btn-title\">{title}</span>\n {badge && badge}\n </CLoadingButton>\n )\n}\n","'use client'\nimport { CLoadingButton } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport './OutlineButton.scss'\n\nexport default function OutlineButton({ title = 'Button', onClick, color = 'custom-primary', className = '', loading = false, icon, type = 'submit', disabled }) {\n return (\n <CLoadingButton\n type={type}\n onClick={onClick}\n className={`outline-button rounded-3 fw-medium text-${color} border-${color} ${className}`}\n loading={loading}\n disabledOnLoading\n disabled={disabled}\n variant=\"outline\"\n style={{ maxHeight: '40px', minWidth: 'fit-content' }}\n >\n {icon && <CIcon icon={icon} />}\n <span>{title}</span>\n </CLoadingButton>\n )\n}\n ","'use client'\nimport { CLoadingButton } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\n\nexport default function TextButton({ disabled, title, onClick, color = 'dark', className = '', loading = false, icon, children }) {\n return (\n <span className=\"d-inline-block\" tabIndex={0}>\n <CLoadingButton\n disabled={disabled}\n onClick={onClick}\n variant=\"ghost\"\n type=\"button\"\n color={color}\n className={`rounded-3 px-2 d-flex justify-content-center gap-2 fw-medium ${className}`}\n loading={loading}\n >\n {icon && <CIcon size=\"xl\" icon={icon} />}\n {children ? children : title}\n </CLoadingButton>\n </span>\n )\n}\n","'use client'\nimport { CLoadingButton } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport CustomTooltip from '../custom-tooltip/CustomTooltip'\n\nexport default function IconButton({ title, onClick, color = 'dark', className = '', loading = false, icon, tooltip = '', disabled }) {\n return (\n <CustomTooltip content={tooltip} placement=\"bottom\">\n <CLoadingButton\n onClick={onClick}\n variant=\"ghost\"\n type=\"button\"\n color={color}\n className={`d-flex justify-content-center align-items-center gap-1 m-0 p-1 ${className}`}\n loading={loading}\n disabled={disabled}\n >\n <CIcon size=\"xl\" icon={icon} />\n {title && <span className=\"ml-2 d-none d-md-block\">{title}</span>}\n </CLoadingButton>\n </CustomTooltip>\n )\n}\n","'use client'\nimport Tippy from '@tippyjs/react'\nimport 'tippy.js/dist/tippy.css'\n\nexport default function CustomTooltip({ content, placement = 'bottom', delay = 0, className = '', children }) {\n return (\n <Tippy content={content} placement={placement} className={className} delay={delay}>\n {children}\n </Tippy>\n )\n}\n","'use client'\nimport CIcon from '@coreui/icons-react'\nimport { CModal, CModalBody, CModalHeader, CModalTitle } from '@coreui/react-pro'\nimport { cilX } from '@coreui/icons'\n\nexport default function Modal({ title, titleIcon, visible, setVisible, alignment = 'center', size, children }) {\n return (\n <CModal alignment={alignment} visible={visible} onClose={() => setVisible(false)} size={size} focus keyboard aria-labelledby=\"roax-modal-title\">\n <CModalHeader className=\"position-relative\">\n <CModalTitle id=\"roax-modal-title\" className=\"d-flex align-items-center gap-2\">\n {titleIcon && <CIcon icon={titleIcon} size=\"lg\" className=\"text-muted\" />}\n {title}\n </CModalTitle>\n <button\n onClick={() => setVisible(false)}\n type=\"button\"\n className=\"position-absolute end-0 top-0 mt-3 me-3 p-0 bg-transparent border-0\"\n style={{ fontSize: '1.25rem', color: 'var(--cui-body-color)', zIndex: 10 }}\n aria-label=\"Cerrar\"\n >\n <CIcon icon={cilX} size=\"lg\" />\n </button>\n </CModalHeader>\n <CModalBody>{children}</CModalBody>\n </CModal>\n )\n}\n","'use client'\nimport { CCard, CCardBody } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport { cilArrowTop, cilArrowBottom, cilInfo } from '@coreui/icons'\nimport CustomTooltip from '../custom-tooltip/CustomTooltip'\nimport { formatValue, getBadgeStyles, formatDateRange } from './card-utils'\nimport './MetricCard.scss'\n\nexport default function MetricCard({ title, current, previous, change, isPositive, unit = '', previousDateRange = '', tooltipText = '', backgroundColor }) {\n const isColored = !!backgroundColor\n return (\n <CCard\n className={`metric-card w-100 h-100 d-flex flex-column border-0${isColored ? ' metric-card--colored' : ''}`}\n style={isColored ? { background: backgroundColor } : undefined}\n >\n <CCardBody className=\"d-flex flex-column justify-content-between h-100 p-4 position-relative\">\n {tooltipText && (\n <div className=\"position-absolute top-0 end-0 m-2\">\n <CustomTooltip content={tooltipText} placement=\"top\">\n <CIcon icon={cilInfo} style={{ cursor: 'pointer', opacity: 0.5, width: 16, height: 16 }} />\n </CustomTooltip>\n </div>\n )}\n <p className=\"metric-card__title m-0\">{title}</p>\n <div className=\"d-flex align-items-center gap-2 mt-1\">\n <span className=\"metric-card__value\">{formatValue(current, unit, title)}</span>\n {typeof change === 'number' && isFinite(change) && current > 0 && (\n <div style={getBadgeStyles(isPositive)}>\n <CIcon icon={isPositive ? cilArrowTop : cilArrowBottom} size=\"sm\" />\n {Math.abs(change)}%\n </div>\n )}\n </div>\n <hr className=\"metric-card__divider\" />\n {(() => {\n const { formattedRange } = formatDateRange(previousDateRange)\n return (\n <div className=\"d-flex justify-content-between align-items-center metric-card__footer\">\n <strong>{formatValue(previous, unit, title)}</strong>\n <span>{formattedRange}</span>\n </div>\n )\n })()}\n </CCardBody>\n </CCard>\n )\n}\n","export const formatValue = (val, unit = '', title = '') => {\n if (val == null || typeof val !== 'number' || val === 0) return '0'\n if (title.includes('ROAS')) return `x ${val.toFixed(2)}`\n if (title.includes('CAC %')) return `${val.toFixed(2)}%`\n if (unit === '%' || title.includes('%')) return `${val.toFixed(2)}%`\n if (unit === 'x') return `x ${val.toFixed(2)}`\n if (unit === 'COP') return `COP ${Math.round(val).toLocaleString('es-CO')}`\n return val.toLocaleString(undefined, { minimumFractionDigits: 0, maximumFractionDigits: 2 })\n}\n\nexport const getBadgeStyles = (isPositive) => ({\n backgroundColor: isPositive ? '#55ed7b' : '#f74a4a',\n color: isPositive ? '#0b3e26' : '#842029',\n borderRadius: '9999px',\n padding: '4px 10px',\n fontSize: '0.75rem',\n fontWeight: 700,\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n})\n\nexport function formatDateRange(previousDateRange) {\n if (!previousDateRange) return { formattedRange: '' }\n const parts = previousDateRange.split(' - ')\n const parseDate = (str) => { const [y, m, d] = str.split('-').map(Number); return new Date(y, m - 1, d) }\n const format = (date) => {\n const day = String(date.getDate()).padStart(2, '0')\n const month = date.toLocaleString('es-CO', { month: 'short' }).replace('.', '')\n const year = String(date.getFullYear()).slice(-2)\n return `${month} ${day},${year}`\n }\n const since = parseDate(parts[0])\n const until = parts[1] ? parseDate(parts[1]) : null\n return { formattedRange: until ? `${format(since)} - ${format(until)}` : format(since) }\n}\n","import { CCard, CCardBody } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport { cilArrowTop, cilArrowBottom } from '@coreui/icons'\nimport { Info } from 'lucide-react'\nimport CustomTooltip from '../custom-tooltip/CustomTooltip'\nimport { getBadgeStyles, formatValue, formatDateRange } from './card-utils'\n\nimport './general-card.scss'\n\n/**\n * GeneralCard\n *\n * Tarjeta de métrica con valor actual, valor anterior, variación porcentual y tooltip.\n *\n * @param {string} title - Nombre de la métrica\n * @param {number} current - Valor del período actual\n * @param {number} previous - Valor del período anterior\n * @param {number} change - Variación porcentual\n * @param {boolean} isPositive - Si la variación es positiva\n * @param {string} [unit] - Unidad ('COP', '%', 'x')\n * @param {string} [previousDateRange] - Rango de fechas anterior ('yyyy-MM-dd - yyyy-MM-dd')\n * @param {string} [tooltipText] - Texto del tooltip informativo\n * @param {string} [backgroundColor] - Color de fondo personalizado\n */\nexport default function GeneralCard({\n title,\n current,\n previous,\n change,\n isPositive,\n unit = '',\n previousDateRange = '',\n tooltipText = '',\n backgroundColor,\n}) {\n const isColored = !!backgroundColor\n const cardClass = `general-card w-100 h-100 d-flex flex-column border-0${isColored ? ' general-card--colored' : ''}`\n\n return (\n <CCard\n className={cardClass}\n style={isColored ? { background: backgroundColor } : undefined}\n >\n <CCardBody className=\"d-flex flex-column justify-content-between h-100 p-4 position-relative\">\n {tooltipText && (\n <div className=\"position-absolute top-0 end-0 m-2\">\n <CustomTooltip content={tooltipText} placement=\"top\">\n <Info\n size={16}\n strokeWidth={2}\n style={{ cursor: 'pointer', opacity: 0.5 }}\n />\n </CustomTooltip>\n </div>\n )}\n\n <p className=\"general-card__title m-0\">{title}</p>\n\n <div className=\"d-flex align-items-center gap-2 mt-1\">\n <span className=\"general-card__value\">\n {formatValue(current, unit, title)}\n </span>\n {typeof change === 'number' && isFinite(change) && current > 0 && (\n <div style={getBadgeStyles(isPositive)}>\n <CIcon icon={isPositive ? cilArrowTop : cilArrowBottom} size=\"sm\" />\n {Math.abs(change)}%\n </div>\n )}\n </div>\n\n <hr className=\"general-card__divider\" />\n\n {(() => {\n const { formattedRange } = formatDateRange(previousDateRange)\n return (\n <div className=\"d-flex justify-content-between align-items-center general-card__footer\">\n <strong>{formatValue(previous, unit, title)}</strong>\n <span>{formattedRange}</span>\n </div>\n )\n })()}\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\n\nimport {\n ResponsiveContainer,\n BarChart,\n Bar,\n XAxis,\n YAxis,\n Tooltip,\n Cell,\n LabelList,\n} from 'recharts'\nimport { CCard, CCardBody, CRow, CCol } from '@coreui/react-pro'\nimport { formatValue } from '../card/card-utils'\nimport GeneralCard from '../card/GeneralCard'\n\n/**\n * FunnelChart\n *\n * Gráfico de embudo horizontal con tarjetas de métricas debajo.\n *\n * @param {Array} data - Cada item: { title, value, previous, percentageChange, isPositive, unit, previousDateRange, color? }\n */\nexport default function FunnelChart({ data = [] }) {\n return (\n <CCard className=\"mt-4 rounded-4 shadow-sm p-3\">\n <CCardBody>\n <ResponsiveContainer width=\"100%\" height={data.length * 45 + 50}>\n <BarChart\n data={data}\n layout=\"vertical\"\n margin={{ top: 10, right: 60, left: 20, bottom: 0 }}\n barCategoryGap={15}\n >\n <defs>\n <linearGradient id=\"funnelGradient\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n <stop offset=\"0%\" stopColor=\"#FF8AAE\" />\n <stop offset=\"100%\" stopColor=\"#FF1F3D\" />\n </linearGradient>\n </defs>\n <XAxis type=\"number\" hide domain={[0, 'dataMax']} />\n <YAxis\n dataKey=\"title\"\n type=\"category\"\n width={130}\n axisLine={false}\n tickLine={false}\n style={{ fontWeight: 600, fill: '#333', fontSize: 13 }}\n />\n <Tooltip\n content={({ active, payload }) => {\n if (active && payload && payload.length > 0) {\n const { value, payload: item } = payload[0]\n return (\n <div className=\"bg-white shadow-sm p-2 rounded\">\n <strong>{item.title}</strong>:{' '}\n <span>{formatValue(value, item.unit, item.title)}</span>\n </div>\n )\n }\n return null\n }}\n />\n <Bar dataKey=\"value\" fill=\"url(#funnelGradient)\" radius={[0, 10, 10, 0]}>\n <LabelList\n dataKey=\"value\"\n position=\"right\"\n formatter={(val) => formatValue(val)}\n style={{ fill: '#333', fontWeight: 500, fontSize: 12 }}\n />\n {data.map((entry, index) => (\n <Cell\n key={`cell-${entry.title || index}`}\n fill={entry.color || 'url(#funnelGradient)'}\n />\n ))}\n </Bar>\n </BarChart>\n </ResponsiveContainer>\n\n <CRow className=\"pt-4 g-3\">\n {data.slice(0, 3).map((item, index) => (\n <CCol xs={12} md={4} key={`card-top-${index}`}>\n <GeneralCard\n title={item.title}\n current={item.value}\n previous={item.previous}\n change={item.percentageChange}\n isPositive={item.isPositive}\n unit={item.unit}\n previousDateRange={item.previousDateRange}\n tooltipText={item.title}\n />\n </CCol>\n ))}\n </CRow>\n\n {data.length > 3 && (\n <CRow className=\"pt-3 g-3\">\n {data.slice(3).map((item, index) => (\n <CCol xs={12} md={5} lg={4} key={`card-bottom-${index}`}>\n <GeneralCard\n title={item.title}\n current={item.value}\n previous={item.previous}\n change={item.percentageChange}\n isPositive={item.isPositive}\n unit={item.unit}\n previousDateRange={item.previousDateRange}\n tooltipText={item.title}\n />\n </CCol>\n ))}\n </CRow>\n )}\n </CCardBody>\n </CCard>\n )\n}\n","import {\n ResponsiveContainer,\n LineChart,\n Line,\n XAxis,\n YAxis,\n Tooltip,\n Legend,\n CartesianGrid,\n} from 'recharts'\nimport { CCard, CCardBody, CRow, CCol } from '@coreui/react-pro'\nimport { formatValue } from '../card/card-utils'\nimport GeneralCard from '../card/GeneralCard'\n\n/**\n * TimeSeriesComparisonChart\n *\n * Gráfico de líneas para comparar series de tiempo con tarjetas de resumen opcionales.\n *\n * @param {Array} data - Array de puntos { date, [lineName]: number, ... }\n * @param {Array} lines - Claves de las líneas a dibujar (e.g. ['ventas', 'inversión'])\n * @param {Object} colors - Mapa de nombre → color (e.g. { ventas: '#FF2F86' })\n * @param {Array} cards - Tarjetas de resumen opcionales\n * @param {string} currency - Símbolo de moneda para el eje Y (e.g. 'COP')\n * @param {string} yAxisLabel - Etiqueta del eje Y\n * @param {Object} displayNames - Mapa de clave → nombre legible para tooltip/leyenda\n */\nexport default function TimeSeriesComparisonChart({\n data = [],\n lines = [],\n colors = {},\n cards = [],\n currency = '',\n yAxisLabel = '',\n displayNames = {},\n}) {\n const detectUnit = (name = '') => {\n const lower = name.toLowerCase()\n if (lower.includes('%')) return '%'\n if (lower.includes('venta') || lower.includes('inversión')) return currency || ''\n return ''\n }\n\n const maxY = data.length\n ? Math.ceil(\n Math.max(\n ...lines.map((lineName) => Math.max(...data.map((d) => d[lineName] || 0)))\n ) * 1.1\n )\n : 100\n\n return (\n <CCard className=\"mt-4 rounded-4 shadow-sm p-3\">\n <CCardBody>\n {cards.length > 0 && (\n <CRow className=\"pt-4 g-3 justify-content-center text-center mb-4\">\n {cards.map((card, index) => (\n <CCol xs={12} md={4} lg={5} key={index}>\n <GeneralCard\n title={card.title}\n current={card.value}\n previous={card.previous}\n change={card.percentageChange}\n isPositive={card.isPositive}\n unit={card.unit}\n previousDateRange={card.previousDateRange}\n tooltipText={card.title}\n />\n </CCol>\n ))}\n </CRow>\n )}\n\n <ResponsiveContainer width=\"100%\" height={340}>\n <LineChart data={data} margin={{ top: 20, right: 30, left: 10, bottom: 10 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#e5e5e5\" />\n <XAxis dataKey=\"date\" stroke=\"#333\" tick={{ fontSize: 12 }} />\n <YAxis\n yAxisId=\"left\"\n stroke=\"#333\"\n tickFormatter={(val) =>\n `${currency ? currency + ' ' : ''}${\n val >= 1_000_000\n ? (val / 1_000_000).toFixed(1) + 'M'\n : val.toLocaleString('es-CO')\n }`\n }\n tick={{ fontSize: 12 }}\n width={100}\n domain={[0, maxY]}\n allowDecimals={false}\n label={\n yAxisLabel\n ? {\n value: yAxisLabel,\n angle: -90,\n position: 'insideLeft',\n style: { textAnchor: 'middle', fill: '#333', fontSize: 13 },\n }\n : undefined\n }\n />\n <Tooltip\n formatter={(val, name) => {\n const unit = detectUnit(name)\n return [formatValue(val, unit), displayNames[name] || name]\n }}\n labelClassName=\"fw-bold\"\n wrapperStyle={{ zIndex: 1000 }}\n />\n <Legend\n verticalAlign=\"bottom\"\n height={36}\n wrapperStyle={{ marginTop: 20 }}\n iconType=\"circle\"\n formatter={(value) => displayNames[value] || value}\n />\n {lines.map((lineName) => (\n <Line\n key={lineName}\n yAxisId=\"left\"\n type=\"monotone\"\n dataKey={lineName}\n stroke={colors[lineName] || '#000'}\n strokeWidth={2.5}\n dot={{ r: 4 }}\n activeDot={{ r: 6 }}\n />\n ))}\n </LineChart>\n </ResponsiveContainer>\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\n\nimport {\n BarChart,\n Bar,\n XAxis,\n YAxis,\n Tooltip,\n ResponsiveContainer,\n LabelList,\n Cell,\n} from 'recharts'\nimport { CCard, CCardBody } from '@coreui/react-pro'\n\nconst COLORS = ['#FF6A8D', '#FF8AAE', '#FFA3BC', '#FFC3D0', '#FFE0E7']\n\nconst ChartTooltip = ({ active, payload }) => {\n if (active && payload && payload.length) {\n return (\n <div className=\"bg-white p-2 shadow rounded border border-light\">\n <p className=\"mb-1 fw-semibold\">{payload[0].payload.name}</p>\n <p className=\"mb-0 text-muted\">Cantidad: {payload[0].value.toLocaleString()}</p>\n </div>\n )\n }\n return null\n}\n\n/**\n * TopProductsChart\n *\n * Gráfico horizontal de barras para los productos más vendidos.\n *\n * @param {Array} data - Array de { name: string, quantity: number }\n * @param {string} title - Título del gráfico\n * @param {string} emptyText - Mensaje cuando no hay datos\n * @param {number} maxItems - Máximo de productos a mostrar (default 5)\n */\nexport default function TopProductsChart({\n data = [],\n title = 'Productos Más Vendidos',\n emptyText = 'No se registraron productos vendidos en este rango de fechas.',\n maxItems = 5,\n}) {\n const processedData = (data || [])\n .filter((item) => item.quantity > 0 && item.name?.trim())\n .sort((a, b) => b.quantity - a.quantity)\n .slice(0, maxItems)\n .map((item) => ({ name: item.name, quantity: item.quantity }))\n\n if (!processedData.length) {\n return (\n <CCard className=\"mt-4 rounded-4 shadow-sm p-3\">\n <CCardBody className=\"text-center py-5\">\n <p className=\"text-muted mb-2\">\n <i className=\"bi bi-box-seam fs-4 d-block mb-2\" />\n {emptyText}\n </p>\n </CCardBody>\n </CCard>\n )\n }\n\n return (\n <CCard className=\"mt-4 rounded-4 shadow-sm p-3\">\n <CCardBody>\n <h5 className=\"fw-semibold text-center fs-5 mb-4\">{title}</h5>\n <div style={{ height: `${Math.max(processedData.length * 50, 80)}px` }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart\n layout=\"vertical\"\n data={processedData}\n margin={{ top: 10, right: 40, left: 20, bottom: 10 }}\n >\n <defs>\n <linearGradient id=\"barGradient\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n <stop offset=\"0%\" stopColor=\"#FF8AAE\" />\n <stop offset=\"100%\" stopColor=\"#FF1F3D\" />\n </linearGradient>\n </defs>\n <XAxis\n type=\"number\"\n tickFormatter={(value) => value.toLocaleString()}\n axisLine={false}\n tick={{ fontSize: 12 }}\n />\n <YAxis\n type=\"category\"\n dataKey=\"name\"\n width={150}\n tick={{ fontSize: 13 }}\n tickFormatter={(value) =>\n value.length > 30 ? value.substring(0, 30) + '...' : value\n }\n />\n <Tooltip content={<ChartTooltip />} />\n <Bar dataKey=\"quantity\" fill=\"url(#barGradient)\" radius={[0, 8, 8, 0]}>\n <LabelList\n dataKey=\"quantity\"\n position=\"right\"\n formatter={(value) => value.toLocaleString()}\n style={{ fill: '#333', fontWeight: 500, fontSize: 12 }}\n />\n {processedData.map((_, index) => (\n <Cell key={`cell-${index}`} fill={COLORS[index % COLORS.length]} />\n ))}\n </Bar>\n </BarChart>\n </ResponsiveContainer>\n </div>\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\n\nimport {\n ResponsiveContainer,\n BarChart,\n Bar,\n XAxis,\n YAxis,\n Tooltip,\n Legend,\n CartesianGrid,\n} from 'recharts'\nimport { CCard, CCardBody } from '@coreui/react-pro'\n\n/**\n * SalesByChannelChart\n *\n * Gráfico de barras apiladas para ventas por canal (Meta, TikTok, Google).\n *\n * @param {Array} data - Array de { fecha: string, Meta?: number, TikTok?: number, Google?: number }\n * @param {string} title - Título del gráfico\n * @param {string} emptyText - Mensaje cuando no hay datos\n * @param {string[]} channels - Canales a mostrar (default ['Meta', 'TikTok', 'Google'])\n * @param {Object} channelColors - Mapa canal → color\n */\nexport default function SalesByChannelChart({\n data = [],\n title = 'Ventas por canal',\n emptyText = 'Sin datos para este período',\n channels = ['Meta', 'TikTok', 'Google'],\n channelColors = { Meta: '#FF2F86', TikTok: '#C0C0C0', Google: '#333333' },\n}) {\n const hasData = data.length > 0\n\n return (\n <CCard className=\"rounded-4 shadow-sm p-3\">\n <CCardBody>\n <h5 className=\"fw-bold text-center\">{title}</h5>\n {!hasData ? (\n <p className=\"text-center text-muted\">{emptyText}</p>\n ) : (\n <ResponsiveContainer width=\"100%\" height={300}>\n <BarChart data={data} margin={{ top: 20, right: 30, left: 10, bottom: 10 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#e5e5e5\" />\n <XAxis\n dataKey=\"fecha\"\n tick={{ fontSize: 12 }}\n angle={-45}\n textAnchor=\"end\"\n interval={Math.ceil(data.length / 10)}\n />\n <YAxis tick={{ fontSize: 12 }} />\n <Tooltip />\n <Legend verticalAlign=\"top\" height={36} iconType=\"circle\" />\n {channels.map((channel) => (\n <Bar\n key={channel}\n dataKey={channel}\n stackId=\"ventas\"\n fill={channelColors[channel] || '#888'}\n />\n ))}\n </BarChart>\n </ResponsiveContainer>\n )}\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\n\nimport {\n PieChart,\n Pie,\n Cell,\n Legend,\n Tooltip,\n ResponsiveContainer,\n} from 'recharts'\nimport { CCard, CCardBody } from '@coreui/react-pro'\n\nconst DEFAULT_COLORS = ['#FF2F86', '#D9D9D9', '#333333']\n\n/**\n * InvestmentByPlatformChart\n *\n * Gráfico de dona para distribución de inversión por plataforma.\n *\n * @param {Array} data - Array de { name: string, value: number }\n * @param {string} title - Título del gráfico\n * @param {string[]} colors - Colores para cada slice\n * @param {string} currencySymbol - Símbolo de moneda para el tooltip\n * @param {string} locale - Locale para formatear números (default 'es-CO')\n */\nexport default function InvestmentByPlatformChart({\n data = [],\n title = 'Inversión por plataforma',\n colors = DEFAULT_COLORS,\n currencySymbol = 'COP',\n locale = 'es-CO',\n}) {\n return (\n <CCard className=\"rounded-4 shadow-sm p-3\">\n <CCardBody>\n <h5 className=\"text-center fw-bold\">{title}</h5>\n <ResponsiveContainer width=\"100%\" height={280}>\n <PieChart>\n <Pie\n data={data}\n dataKey=\"value\"\n nameKey=\"name\"\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={60}\n outerRadius={100}\n paddingAngle={5}\n label={({ name, percent }) => `${name} ${(percent * 100).toFixed(1)}%`}\n >\n {data.map((_, index) => (\n <Cell key={`cell-${index}`} fill={colors[index % colors.length]} />\n ))}\n </Pie>\n <Tooltip\n formatter={(value) =>\n `${currencySymbol} ${value.toLocaleString(locale)}`\n }\n />\n <Legend verticalAlign=\"bottom\" height={36} />\n </PieChart>\n </ResponsiveContainer>\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\nimport { CTable, CTableHead, CTableBody, CTableRow, CTableHeaderCell, CSpinner } from '@coreui/react-pro'\n\nexport default function PaginatedTable({ data = [], itemsPerPage = 10, currentPage = 1, setCurrentPage = () => {}, columns = [], renderRow = () => null, loading = false, emptyMessage = 'No hay datos disponibles.' }) {\n const totalPages = Math.ceil(data.length / itemsPerPage)\n const paginatedData = data.slice((currentPage - 1) * itemsPerPage, currentPage * itemsPerPage)\n\n if (loading) return <div className=\"text-center py-5\"><CSpinner color=\"secondary\" /></div>\n if (!data.length) return <div className=\"text-center py-5 text-muted\">{emptyMessage}</div>\n\n const renderPagination = () => {\n const pages = Array.from({ length: totalPages }, (_, i) => i + 1)\n return (\n <div className=\"d-flex justify-content-center align-items-center gap-2 mt-3 flex-wrap\">\n {currentPage > 1 && <button onClick={() => setCurrentPage(currentPage - 1)} className=\"px-3 py-1 rounded-pill border bg-white text-dark\" style={{ minWidth: 80, fontWeight: 500 }}>Anterior</button>}\n {pages.map(i => <button key={i} onClick={() => setCurrentPage(i)} className={`px-3 py-1 rounded-pill border ${i === currentPage ? 'bg-dark text-white' : 'bg-white text-dark'}`}>{i}</button>)}\n {currentPage < totalPages && <button onClick={() => setCurrentPage(currentPage + 1)} className=\"px-3 py-1 rounded-pill border bg-white text-dark\" style={{ minWidth: 80, fontWeight: 500 }}>Siguiente</button>}\n </div>\n )\n }\n\n return (\n <>\n <CTable hover responsive>\n <CTableHead className=\"bg-dark text-white\">\n <CTableRow>{columns.map((col, i) => <CTableHeaderCell key={i}>{col}</CTableHeaderCell>)}</CTableRow>\n </CTableHead>\n <CTableBody>{paginatedData.map(renderRow)}</CTableBody>\n </CTable>\n {totalPages > 1 && renderPagination()}\n </>\n )\n}\n","'use client'\nimport { CSpinner } from '@coreui/react-pro'\n\nexport default function PaginatedGrid({ data = [], itemsPerPage = 6, currentPage = 1, setCurrentPage = () => {}, renderItem = () => null, loading = false, emptyMessage = 'No hay elementos.' }) {\n const totalPages = Math.ceil(data.length / itemsPerPage)\n const paginatedData = data.slice((currentPage - 1) * itemsPerPage, currentPage * itemsPerPage)\n\n if (loading) return <div className=\"text-center py-5\"><CSpinner color=\"secondary\" /></div>\n if (!data.length) return <div className=\"text-center py-5 text-muted\">{emptyMessage}</div>\n\n const renderPagination = () => {\n const pages = Array.from({ length: totalPages }, (_, i) => i + 1)\n return (\n <div className=\"d-flex justify-content-center gap-2 mt-4 flex-wrap\">\n {currentPage > 1 && <button onClick={() => setCurrentPage(currentPage - 1)} className=\"px-3 py-1 rounded-pill border bg-white text-dark\">Anterior</button>}\n {pages.map(i => <button key={i} onClick={() => setCurrentPage(i)} className={`px-3 py-1 rounded-pill border ${i === currentPage ? 'bg-dark text-white' : 'bg-white text-dark'}`}>{i}</button>)}\n {currentPage < totalPages && <button onClick={() => setCurrentPage(currentPage + 1)} className=\"px-3 py-1 rounded-pill border bg-white text-dark\">Siguiente</button>}\n </div>\n )\n }\n\n return (\n <>\n <div className=\"row g-4\">{paginatedData.map(renderItem)}</div>\n {totalPages > 1 && renderPagination()}\n </>\n )\n}\n","import { CCard, CPlaceholder } from '@coreui/react-pro'\n\nexport default function CardSkeleton() {\n return (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder component=\"div\" animation=\"glow\" className=\"d-flex flex-column gap-2 bg-transparent\">\n <CPlaceholder className=\"p-4 mt-2 rounded-1\" size=\"lg\" xs={12} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n )\n}\n","import { CCard, CPlaceholder } from '@coreui/react-pro'\n\nexport default function TextSkeleton() {\n return (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder component=\"div\" animation=\"glow\" className=\"d-flex flex-column gap-2 bg-transparent\">\n <CPlaceholder className=\"p-0 my-2 rounded-1\" size=\"lg\" xs={8} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n )\n}\n","import { CCard, CPlaceholder } from '@coreui/react-pro'\n\nexport default function MetricsSkeleton() {\n return (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder component=\"div\" animation=\"glow\" className=\"d-flex flex-column gap-2 bg-transparent\">\n <CPlaceholder className=\"p-5 mt-2 rounded-1\" size=\"lg\" xs={12} color=\"skeleton\" />\n <CPlaceholder className=\"p-3 mt-2 rounded-1\" size=\"xs\" xs={12} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n )\n}\n","import { CCard, CPlaceholder } from '@coreui/react-pro'\n\n/**\n * ReportTableSkeleton\n *\n * Placeholder animado para tablas de reporte mientras cargan los datos.\n */\nexport default function ReportTableSkeleton() {\n return (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder\n component=\"div\"\n animation=\"glow\"\n className=\"d-flex flex-column gap-2 bg-transparent\"\n >\n <CPlaceholder className=\"p-4 mt-2 rounded-1\" size=\"lg\" xs={12} color=\"skeleton\" />\n <CPlaceholder className=\"p-5 mt-2 rounded-1\" size=\"lg\" xs={12} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n )\n}\n","'use client'\n\nimport { CCard, CCol, CPlaceholder, CRow } from '@coreui/react-pro'\n\nconst CardPlaceholder = ({ className = '' }) => (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder\n component=\"div\"\n animation=\"glow\"\n className={`d-flex flex-column gap-2 bg-transparent ${className}`}\n >\n <CPlaceholder className=\"p-4 mt-2 rounded-2\" size=\"lg\" xs={12} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n)\n\n/**\n * SummaryReportSkeleton\n *\n * Grilla de placeholders animados para reportes de resumen mientras cargan.\n *\n * @param {Array} layout - Array de { sm, md } para controlar el grid (default: 8 columnas predefinidas)\n */\nexport default function SummaryReportSkeleton({\n layout = [\n { sm: 6, md: 6 },\n { sm: 6, md: 6 },\n { sm: 6, md: 4 },\n { sm: 6, md: 4 },\n { sm: 6, md: 4 },\n { sm: 6, md: 6 },\n { sm: 6, md: 4 },\n { sm: 6, md: 2 },\n ],\n}) {\n return (\n <CRow className=\"g-md-3 px-4 px-sm-2 g-sm-2 pt-2 pb-4\">\n {layout.map((col, index) => (\n <CCol sm={col.sm} md={col.md} key={index}>\n <CardPlaceholder />\n </CCol>\n ))}\n </CRow>\n )\n}\n","export var cidExclamationCircle = [\"512 512\", \"<path fill='var(--ci-secondary-color, currentColor)' d='M256,16C123.452,16,16,123.452,16,256S123.452,496,256,496a238.867,238.867,0,0,0,132.685-40q1.668-1.108,3.315-2.246A239.721,239.721,0,0,0,496,256C496,123.452,388.548,16,256,16Z' class='ci-secondary' opacity='var(--ci-secondary-opacity, 0.25)'/><polygon fill='var(--ci-primary-color, currentColor)' points='224 232 238 304 274 304 288 232 288 120 224 120 224 232' class='ci-primary'/><rect width='40' height='40' x='236' y='344' fill='var(--ci-primary-color, currentColor)' class='ci-primary'/>\"];\n","import { cidExclamationCircle } from '@coreui/icons-pro'\nimport CIcon from '@coreui/icons-react'\n\n/**\n * NoDataMessage\n *\n * Alerta visual cuando no hay datos disponibles para el período seleccionado.\n *\n * @param {string} message - Mensaje a mostrar\n */\nexport function NoDataMessage({\n message = 'No se obtuvieron datos. Revisa el rango de fechas y la integración.',\n}) {\n return (\n <div\n className=\"d-flex align-items-center gap-2 rounded-3 px-3 py-3 mt-3 mb-3\"\n style={{\n backgroundColor: 'var(--cui-warning-bg-subtle)',\n border: '1px solid var(--cui-warning)',\n color: 'var(--cui-body-color)',\n }}\n >\n <CIcon\n icon={cidExclamationCircle}\n className=\"flex-shrink-0 me-2 text-warning\"\n size=\"xxl\"\n />\n {message}\n </div>\n )\n}\n","'use client'\nimport { useRouter } from 'next/navigation'\nimport { CButton } from '@coreui/react-pro'\nimport { cilArrowLeft } from '@coreui/icons'\nimport CIcon from '@coreui/icons-react'\nimport CustomTooltip from '../custom-tooltip/CustomTooltip'\n\nexport default function BackButton({ title, color = 'dark', className = '', path }) {\n const { back, push } = useRouter()\n return (\n <CustomTooltip content=\"Volver atrás\" placement=\"bottom\">\n <CButton color={color} variant=\"ghost\" className={`back-button d-flex align-items-center px-0 ${className}`} onClick={() => path ? push(path) : back()}>\n <CIcon icon={cilArrowLeft} size=\"lg\" className=\"mx-1\" />\n {title && <span className=\"px-2\">{title}</span>}\n </CButton>\n </CustomTooltip>\n )\n}\n"],"mappings":"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","names":["CLoadingButton","CIcon","CLoadingButton","CIcon","CLoadingButton","CIcon","CLoadingButton","CIcon","CIcon","CIcon","CIcon","CCard","CCardBody","CIcon","cilArrowTop","cilArrowBottom","CCard","CCardBody","CIcon","cilArrowTop","cilArrowBottom","CCard","CCardBody","CCard","CCardBody","ResponsiveContainer","XAxis","YAxis","Tooltip","CCard","CCardBody","CRow","CCol","CCard","CCardBody","CRow","CCol","ResponsiveContainer","XAxis","YAxis","Tooltip","BarChart","Bar","XAxis","YAxis","Tooltip","ResponsiveContainer","LabelList","Cell","CCard","CCardBody","ResponsiveContainer","BarChart","Bar","XAxis","YAxis","Tooltip","Legend","CartesianGrid","CCard","CCardBody","Cell","Legend","Tooltip","ResponsiveContainer","CCard","CCardBody","CSpinner","CCard","CCard","CPlaceholder","CCard","CPlaceholder","CCard","CPlaceholder","CCard","CCol","CPlaceholder","CRow","CIcon","CIcon","CIcon"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/buttons/SolidButton.jsx","../src/components/buttons/OutlineButton.jsx","../src/components/buttons/TextButton.jsx","../src/components/buttons/IconButton.jsx","../src/components/custom-tooltip/CustomTooltip.jsx","../src/components/modal/Modal.jsx","../src/components/card/MetricCard.jsx","../src/components/card/card-utils.js","../src/components/card/GeneralCard.jsx","../src/components/charts/FunnelChart.jsx","../src/components/charts/TimeSeriesComparisonChart.jsx","../src/components/charts/TopProductsChart.jsx","../src/components/charts/SalesByChannelChart.jsx","../src/components/charts/InvestmentByPlatformChart.jsx","../src/components/pagination/PaginatedTable.jsx","../src/components/pagination/PaginatedGrid.jsx","../src/components/skeletons/CardSkeleton.jsx","../src/components/skeletons/TextSkeleton.jsx","../src/components/skeletons/MetricsSkeleton.jsx","../src/components/skeletons/ReportTableSkeleton.jsx","../src/components/skeletons/SummaryReportSkeleton.jsx","../../../node_modules/@coreui/icons-pro/src/duotone/cid-exclamation-circle.ts","../src/components/feedback/NoDataMessage.jsx","../src/components/back-button/BackButton.jsx"],"sourcesContent":["'use client'\nimport { CLoadingButton } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport './SolidButton.scss'\n\nexport default function SolidButton({ title = 'Button', onClick, color = 'custom-primary', textColor = 'custom-white', className = '', loading = false, icon, svgComponent: SvgComponent, type = 'submit', badge, disabled }) {\n return (\n <CLoadingButton\n type={type}\n onClick={onClick}\n className={`solid-button rounded-4 px-4 py-2 fw-semibold text-${textColor} bg-${color} ${className}`}\n loading={loading}\n disabledOnLoading\n disabled={disabled}\n style={{ minHeight: '44px', minWidth: 'fit-content', fontSize: '0.95rem', letterSpacing: '0.3px' }}\n >\n {icon && <CIcon icon={icon} className=\"btn-icon\" />}\n {SvgComponent && !icon && <SvgComponent />}\n <span className=\"btn-title\">{title}</span>\n {badge && badge}\n </CLoadingButton>\n )\n}\n","'use client'\nimport { CLoadingButton } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport './OutlineButton.scss'\n\nexport default function OutlineButton({ title = 'Button', onClick, color = 'custom-primary', className = '', loading = false, icon, type = 'submit', disabled }) {\n return (\n <CLoadingButton\n type={type}\n onClick={onClick}\n className={`outline-button rounded-3 fw-medium text-${color} border-${color} ${className}`}\n loading={loading}\n disabledOnLoading\n disabled={disabled}\n variant=\"outline\"\n style={{ maxHeight: '40px', minWidth: 'fit-content' }}\n >\n {icon && <CIcon icon={icon} />}\n <span>{title}</span>\n </CLoadingButton>\n )\n}\n ","'use client'\nimport { CLoadingButton } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\n\nexport default function TextButton({ disabled, title, onClick, color = 'dark', className = '', loading = false, icon, children }) {\n return (\n <span className=\"d-inline-block\" tabIndex={0}>\n <CLoadingButton\n disabled={disabled}\n onClick={onClick}\n variant=\"ghost\"\n type=\"button\"\n color={color}\n className={`rounded-3 px-2 d-flex justify-content-center gap-2 fw-medium ${className}`}\n loading={loading}\n >\n {icon && <CIcon size=\"xl\" icon={icon} />}\n {children ? children : title}\n </CLoadingButton>\n </span>\n )\n}\n","'use client'\nimport { CLoadingButton } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport CustomTooltip from '../custom-tooltip/CustomTooltip'\n\nexport default function IconButton({ title, onClick, color = 'dark', className = '', loading = false, icon, tooltip = '', disabled }) {\n return (\n <CustomTooltip content={tooltip} placement=\"bottom\">\n <CLoadingButton\n onClick={onClick}\n variant=\"ghost\"\n type=\"button\"\n color={color}\n className={`d-flex justify-content-center align-items-center gap-1 m-0 p-1 ${className}`}\n loading={loading}\n disabled={disabled}\n >\n <CIcon size=\"xl\" icon={icon} />\n {title && <span className=\"ml-2 d-none d-md-block\">{title}</span>}\n </CLoadingButton>\n </CustomTooltip>\n )\n}\n","'use client'\nimport Tippy from '@tippyjs/react'\nimport 'tippy.js/dist/tippy.css'\n\nexport default function CustomTooltip({ content, placement = 'bottom', delay = 0, className = '', children }) {\n return (\n <Tippy content={content} placement={placement} className={className} delay={delay}>\n {children}\n </Tippy>\n )\n}\n","'use client'\nimport CIcon from '@coreui/icons-react'\nimport { CModal, CModalBody, CModalHeader, CModalTitle } from '@coreui/react-pro'\nimport { cilX } from '@coreui/icons'\n\nexport default function Modal({ title, titleIcon, visible, setVisible, alignment = 'center', size, children }) {\n return (\n <CModal alignment={alignment} visible={visible} onClose={() => setVisible(false)} size={size} focus keyboard aria-labelledby=\"roax-modal-title\">\n <CModalHeader className=\"position-relative\">\n <CModalTitle id=\"roax-modal-title\" className=\"d-flex align-items-center gap-2\">\n {titleIcon && <CIcon icon={titleIcon} size=\"lg\" className=\"text-muted\" />}\n {title}\n </CModalTitle>\n <button\n onClick={() => setVisible(false)}\n type=\"button\"\n className=\"position-absolute end-0 top-0 mt-3 me-3 p-0 bg-transparent border-0\"\n style={{ fontSize: '1.25rem', color: 'var(--cui-body-color)', zIndex: 10 }}\n aria-label=\"Cerrar\"\n >\n <CIcon icon={cilX} size=\"lg\" />\n </button>\n </CModalHeader>\n <CModalBody>{children}</CModalBody>\n </CModal>\n )\n}\n","'use client'\nimport { CCard, CCardBody } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport { cilArrowTop, cilArrowBottom, cilInfo } from '@coreui/icons'\nimport CustomTooltip from '../custom-tooltip/CustomTooltip'\nimport { formatValue, getBadgeStyles, formatDateRange } from './card-utils'\nimport './MetricCard.scss'\n\nexport default function MetricCard({ title, current, previous, change, isPositive, unit = '', previousDateRange = '', tooltipText = '', backgroundColor }) {\n const isColored = !!backgroundColor\n return (\n <CCard\n className={`metric-card w-100 h-100 d-flex flex-column border-0${isColored ? ' metric-card--colored' : ''}`}\n style={isColored ? { background: backgroundColor } : undefined}\n >\n <CCardBody className=\"d-flex flex-column justify-content-between h-100 p-4 position-relative\">\n {tooltipText && (\n <div className=\"position-absolute top-0 end-0 m-2\">\n <CustomTooltip content={tooltipText} placement=\"top\">\n <CIcon icon={cilInfo} style={{ cursor: 'pointer', opacity: 0.5, width: 16, height: 16 }} />\n </CustomTooltip>\n </div>\n )}\n <p className=\"metric-card__title m-0\">{title}</p>\n <div className=\"d-flex align-items-center gap-2 mt-1\">\n <span className=\"metric-card__value\">{formatValue(current, unit, title)}</span>\n {typeof change === 'number' && isFinite(change) && current > 0 && (\n <div style={getBadgeStyles(isPositive)}>\n <CIcon icon={isPositive ? cilArrowTop : cilArrowBottom} size=\"sm\" />\n {Math.abs(change)}%\n </div>\n )}\n </div>\n <hr className=\"metric-card__divider\" />\n {(() => {\n const { formattedRange } = formatDateRange(previousDateRange)\n return (\n <div className=\"d-flex justify-content-between align-items-center metric-card__footer\">\n <strong>{formatValue(previous, unit, title)}</strong>\n <span>{formattedRange}</span>\n </div>\n )\n })()}\n </CCardBody>\n </CCard>\n )\n}\n","export const formatValue = (val, unit = '', title = '') => {\n if (val == null || typeof val !== 'number' || val === 0) return '0'\n if (title.includes('ROAS')) return `x ${val.toFixed(2)}`\n if (title.includes('CAC %')) return `${val.toFixed(2)}%`\n if (unit === '%' || title.includes('%')) return `${val.toFixed(2)}%`\n if (unit === 'x') return `x ${val.toFixed(2)}`\n if (unit === 'COP') return `COP ${Math.round(val).toLocaleString('es-CO')}`\n return val.toLocaleString(undefined, { minimumFractionDigits: 0, maximumFractionDigits: 2 })\n}\n\nexport const getBadgeStyles = (isPositive) => ({\n backgroundColor: isPositive ? '#55ed7b' : '#f74a4a',\n color: isPositive ? '#0b3e26' : '#842029',\n borderRadius: '9999px',\n padding: '4px 10px',\n fontSize: '0.75rem',\n fontWeight: 700,\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n})\n\nexport function formatDateRange(previousDateRange) {\n if (!previousDateRange) return { formattedRange: '' }\n const parts = previousDateRange.split(' - ')\n const parseDate = (str) => { const [y, m, d] = str.split('-').map(Number); return new Date(y, m - 1, d) }\n const format = (date) => {\n const day = String(date.getDate()).padStart(2, '0')\n const month = date.toLocaleString('es-CO', { month: 'short' }).replace('.', '')\n const year = String(date.getFullYear()).slice(-2)\n return `${month} ${day},${year}`\n }\n const since = parseDate(parts[0])\n const until = parts[1] ? parseDate(parts[1]) : null\n return { formattedRange: until ? `${format(since)} - ${format(until)}` : format(since) }\n}\n","import { CCard, CCardBody } from '@coreui/react-pro'\nimport CIcon from '@coreui/icons-react'\nimport { cilArrowTop, cilArrowBottom } from '@coreui/icons'\nimport { Info } from 'lucide-react'\nimport CustomTooltip from '../custom-tooltip/CustomTooltip'\nimport { getBadgeStyles, formatValue, formatDateRange } from './card-utils'\n\nimport './general-card.scss'\n\n/**\n * GeneralCard\n *\n * Tarjeta de métrica con valor actual, valor anterior, variación porcentual y tooltip.\n *\n * @param {string} title - Nombre de la métrica\n * @param {number} current - Valor del período actual\n * @param {number} previous - Valor del período anterior\n * @param {number} change - Variación porcentual\n * @param {boolean} isPositive - Si la variación es positiva\n * @param {string} [unit] - Unidad ('COP', '%', 'x')\n * @param {string} [previousDateRange] - Rango de fechas anterior ('yyyy-MM-dd - yyyy-MM-dd')\n * @param {string} [tooltipText] - Texto del tooltip informativo\n * @param {string} [backgroundColor] - Color de fondo personalizado\n */\nexport default function GeneralCard({\n title,\n current,\n previous,\n change,\n isPositive,\n unit = '',\n previousDateRange = '',\n tooltipText = '',\n backgroundColor,\n}) {\n const isColored = !!backgroundColor\n const cardClass = `general-card w-100 h-100 d-flex flex-column border-0${isColored ? ' general-card--colored' : ''}`\n\n return (\n <CCard\n className={cardClass}\n style={isColored ? { background: backgroundColor } : undefined}\n >\n <CCardBody className=\"d-flex flex-column justify-content-between h-100 p-4 position-relative\">\n {tooltipText && (\n <div className=\"position-absolute top-0 end-0 m-2\">\n <CustomTooltip content={tooltipText} placement=\"top\">\n <Info\n size={16}\n strokeWidth={2}\n style={{ cursor: 'pointer', opacity: 0.5 }}\n />\n </CustomTooltip>\n </div>\n )}\n\n <p className=\"general-card__title m-0\">{title}</p>\n\n <div className=\"d-flex align-items-center gap-2 mt-1\">\n <span className=\"general-card__value\">\n {formatValue(current, unit, title)}\n </span>\n {typeof change === 'number' && isFinite(change) && current > 0 && (\n <div style={getBadgeStyles(isPositive)}>\n <CIcon icon={isPositive ? cilArrowTop : cilArrowBottom} size=\"sm\" />\n {Math.abs(change)}%\n </div>\n )}\n </div>\n\n <hr className=\"general-card__divider\" />\n\n {(() => {\n const { formattedRange } = formatDateRange(previousDateRange)\n return (\n <div className=\"d-flex justify-content-between align-items-center general-card__footer\">\n <strong>{formatValue(previous, unit, title)}</strong>\n <span>{formattedRange}</span>\n </div>\n )\n })()}\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\n\nimport {\n ResponsiveContainer,\n BarChart,\n Bar,\n XAxis,\n YAxis,\n Tooltip,\n Cell,\n LabelList,\n} from 'recharts'\nimport { CCard, CCardBody } from '@coreui/react-pro'\nimport { formatValue } from '../card/card-utils'\n\n/**\n * FunnelChart\n *\n * Gráfico de embudo horizontal (barras horizontales apiladas por etapa).\n *\n * @param {Array} data - Array de etapas del embudo\n * @param {string} data[].label - Etiqueta de la etapa (eje Y)\n * @param {number} data[].value - Valor de la etapa\n * @param {string} [data[].unit] - Unidad del valor ('COP', '%', 'x', '')\n * @param {string} [data[].color] - Color personalizado de la barra\n * @param {string} [gradientStart] - Color inicial del gradiente (default: '#FF8AAE')\n * @param {string} [gradientEnd] - Color final del gradiente (default: '#FF1F3D')\n * @param {number} [barHeight] - Altura por barra en px (default: 45)\n */\nexport default function FunnelChart({\n data = [],\n gradientStart = '#FF8AAE',\n gradientEnd = '#FF1F3D',\n barHeight = 45,\n}) {\n return (\n <CCard className=\"rounded-4 shadow-sm p-3\">\n <CCardBody>\n <ResponsiveContainer width=\"100%\" height={data.length * barHeight + 50}>\n <BarChart\n data={data}\n layout=\"vertical\"\n margin={{ top: 10, right: 60, left: 20, bottom: 0 }}\n barCategoryGap={15}\n >\n <defs>\n <linearGradient id=\"funnelGradient\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n <stop offset=\"0%\" stopColor={gradientStart} />\n <stop offset=\"100%\" stopColor={gradientEnd} />\n </linearGradient>\n </defs>\n\n <XAxis type=\"number\" hide domain={[0, 'dataMax']} />\n <YAxis\n dataKey=\"label\"\n type=\"category\"\n width={130}\n axisLine={false}\n tickLine={false}\n style={{ fontWeight: 600, fill: '#333', fontSize: 13 }}\n />\n <Tooltip\n content={({ active, payload }) => {\n if (active && payload && payload.length > 0) {\n const { value, payload: item } = payload[0]\n return (\n <div className=\"bg-white shadow-sm p-2 rounded\">\n <strong>{item.label}</strong>:{' '}\n <span>{formatValue(value, item.unit, item.label)}</span>\n </div>\n )\n }\n return null\n }}\n />\n <Bar dataKey=\"value\" fill=\"url(#funnelGradient)\" radius={[0, 10, 10, 0]}>\n <LabelList\n dataKey=\"value\"\n position=\"right\"\n formatter={(val) => formatValue(val)}\n style={{ fill: '#333', fontWeight: 500, fontSize: 12 }}\n />\n {data.map((entry, index) => (\n <Cell\n key={`cell-${entry.label || index}`}\n fill={entry.color || 'url(#funnelGradient)'}\n />\n ))}\n </Bar>\n </BarChart>\n </ResponsiveContainer>\n </CCardBody>\n </CCard>\n )\n}\n","import {\n ResponsiveContainer,\n LineChart,\n Line,\n XAxis,\n YAxis,\n Tooltip,\n Legend,\n CartesianGrid,\n} from 'recharts'\nimport { CCard, CCardBody } from '@coreui/react-pro'\n\n/**\n * TimeSeriesComparisonChart\n *\n * Gráfico de líneas genérico para comparar múltiples series de tiempo.\n *\n * @param {Array} data - Puntos de datos: [{ date: string, [key]: number }]\n * @param {string} data[].date - Etiqueta del eje X (fecha u otro valor)\n * @param {string[]} lines - Claves de las series a graficar (deben existir en data)\n * @param {Object} [colors] - Mapa clave → color de línea (e.g. { ventas: '#FF2F86' })\n * @param {string} [currency] - Prefijo para el eje Y (e.g. 'COP', '$', '€')\n * @param {string} [yAxisLabel] - Etiqueta vertical del eje Y\n * @param {Object} [displayNames] - Mapa clave → nombre legible en tooltip/leyenda\n * @param {string} [xDataKey] - Clave del eje X en los datos (default: 'date')\n * @param {number} [height] - Altura del gráfico en px (default: 340)\n */\nexport default function TimeSeriesComparisonChart({\n data = [],\n lines = [],\n colors = {},\n currency = '',\n yAxisLabel = '',\n displayNames = {},\n xDataKey = 'date',\n height = 340,\n}) {\n const maxY = data.length && lines.length\n ? Math.ceil(\n Math.max(...lines.map((key) => Math.max(...data.map((d) => d[key] || 0)))) * 1.1\n )\n : 100\n\n const formatYTick = (val) => {\n const prefix = currency ? `${currency} ` : ''\n if (val >= 1_000_000) return `${prefix}${(val / 1_000_000).toFixed(1)}M`\n if (val >= 1_000) return `${prefix}${(val / 1_000).toFixed(0)}K`\n return `${prefix}${val}`\n }\n\n return (\n <CCard className=\"rounded-4 shadow-sm p-3\">\n <CCardBody>\n <ResponsiveContainer width=\"100%\" height={height}>\n <LineChart data={data} margin={{ top: 20, right: 30, left: 10, bottom: 10 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#e5e5e5\" />\n <XAxis\n dataKey={xDataKey}\n stroke=\"#333\"\n tick={{ fontSize: 12 }}\n />\n <YAxis\n yAxisId=\"left\"\n stroke=\"#333\"\n tickFormatter={formatYTick}\n tick={{ fontSize: 12 }}\n width={80}\n domain={[0, maxY]}\n allowDecimals={false}\n label={\n yAxisLabel\n ? {\n value: yAxisLabel,\n angle: -90,\n position: 'insideLeft',\n style: { textAnchor: 'middle', fill: '#333', fontSize: 13 },\n }\n : undefined\n }\n />\n <Tooltip\n formatter={(val, key) => [\n `${currency ? currency + ' ' : ''}${val.toLocaleString()}`,\n displayNames[key] || key,\n ]}\n labelClassName=\"fw-bold\"\n wrapperStyle={{ zIndex: 1000 }}\n />\n <Legend\n verticalAlign=\"bottom\"\n height={36}\n iconType=\"circle\"\n formatter={(key) => displayNames[key] || key}\n />\n {lines.map((key) => (\n <Line\n key={key}\n yAxisId=\"left\"\n type=\"monotone\"\n dataKey={key}\n stroke={colors[key] || '#ED1E78'}\n strokeWidth={2.5}\n dot={{ r: 4 }}\n activeDot={{ r: 6 }}\n />\n ))}\n </LineChart>\n </ResponsiveContainer>\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\n\nimport {\n BarChart,\n Bar,\n XAxis,\n YAxis,\n Tooltip,\n ResponsiveContainer,\n LabelList,\n Cell,\n} from 'recharts'\nimport { CCard, CCardBody } from '@coreui/react-pro'\n\nconst COLORS = ['#FF6A8D', '#FF8AAE', '#FFA3BC', '#FFC3D0', '#FFE0E7']\n\nconst ChartTooltip = ({ active, payload }) => {\n if (active && payload && payload.length) {\n return (\n <div className=\"bg-white p-2 shadow rounded border border-light\">\n <p className=\"mb-1 fw-semibold\">{payload[0].payload.name}</p>\n <p className=\"mb-0 text-muted\">Cantidad: {payload[0].value.toLocaleString()}</p>\n </div>\n )\n }\n return null\n}\n\n/**\n * TopProductsChart\n *\n * Gráfico horizontal de barras para los productos más vendidos.\n *\n * @param {Array} data - Array de { name: string, quantity: number }\n * @param {string} title - Título del gráfico\n * @param {string} emptyText - Mensaje cuando no hay datos\n * @param {number} maxItems - Máximo de productos a mostrar (default 5)\n */\nexport default function TopProductsChart({\n data = [],\n title = 'Productos Más Vendidos',\n emptyText = 'No se registraron productos vendidos en este rango de fechas.',\n maxItems = 5,\n}) {\n const processedData = (data || [])\n .filter((item) => item.quantity > 0 && item.name?.trim())\n .sort((a, b) => b.quantity - a.quantity)\n .slice(0, maxItems)\n .map((item) => ({ name: item.name, quantity: item.quantity }))\n\n if (!processedData.length) {\n return (\n <CCard className=\"mt-4 rounded-4 shadow-sm p-3\">\n <CCardBody className=\"text-center py-5\">\n <p className=\"text-muted mb-2\">\n <i className=\"bi bi-box-seam fs-4 d-block mb-2\" />\n {emptyText}\n </p>\n </CCardBody>\n </CCard>\n )\n }\n\n return (\n <CCard className=\"mt-4 rounded-4 shadow-sm p-3\">\n <CCardBody>\n <h5 className=\"fw-semibold text-center fs-5 mb-4\">{title}</h5>\n <div style={{ height: `${Math.max(processedData.length * 50, 80)}px` }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart\n layout=\"vertical\"\n data={processedData}\n margin={{ top: 10, right: 40, left: 20, bottom: 10 }}\n >\n <defs>\n <linearGradient id=\"barGradient\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n <stop offset=\"0%\" stopColor=\"#FF8AAE\" />\n <stop offset=\"100%\" stopColor=\"#FF1F3D\" />\n </linearGradient>\n </defs>\n <XAxis\n type=\"number\"\n tickFormatter={(value) => value.toLocaleString()}\n axisLine={false}\n tick={{ fontSize: 12 }}\n />\n <YAxis\n type=\"category\"\n dataKey=\"name\"\n width={150}\n tick={{ fontSize: 13 }}\n tickFormatter={(value) =>\n value.length > 30 ? value.substring(0, 30) + '...' : value\n }\n />\n <Tooltip content={<ChartTooltip />} />\n <Bar dataKey=\"quantity\" fill=\"url(#barGradient)\" radius={[0, 8, 8, 0]}>\n <LabelList\n dataKey=\"quantity\"\n position=\"right\"\n formatter={(value) => value.toLocaleString()}\n style={{ fill: '#333', fontWeight: 500, fontSize: 12 }}\n />\n {processedData.map((_, index) => (\n <Cell key={`cell-${index}`} fill={COLORS[index % COLORS.length]} />\n ))}\n </Bar>\n </BarChart>\n </ResponsiveContainer>\n </div>\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\n\nimport {\n ResponsiveContainer,\n BarChart,\n Bar,\n XAxis,\n YAxis,\n Tooltip,\n Legend,\n CartesianGrid,\n} from 'recharts'\nimport { CCard, CCardBody } from '@coreui/react-pro'\n\n/**\n * SalesByChannelChart\n *\n * Gráfico de barras apiladas para ventas por canal (Meta, TikTok, Google).\n *\n * @param {Array} data - Array de { fecha: string, Meta?: number, TikTok?: number, Google?: number }\n * @param {string} title - Título del gráfico\n * @param {string} emptyText - Mensaje cuando no hay datos\n * @param {string[]} channels - Canales a mostrar (default ['Meta', 'TikTok', 'Google'])\n * @param {Object} channelColors - Mapa canal → color\n */\nexport default function SalesByChannelChart({\n data = [],\n title = 'Ventas por canal',\n emptyText = 'Sin datos para este período',\n channels = ['Meta', 'TikTok', 'Google'],\n channelColors = { Meta: '#FF2F86', TikTok: '#C0C0C0', Google: '#333333' },\n}) {\n const hasData = data.length > 0\n\n return (\n <CCard className=\"rounded-4 shadow-sm p-3\">\n <CCardBody>\n <h5 className=\"fw-bold text-center\">{title}</h5>\n {!hasData ? (\n <p className=\"text-center text-muted\">{emptyText}</p>\n ) : (\n <ResponsiveContainer width=\"100%\" height={300}>\n <BarChart data={data} margin={{ top: 20, right: 30, left: 10, bottom: 10 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#e5e5e5\" />\n <XAxis\n dataKey=\"fecha\"\n tick={{ fontSize: 12 }}\n angle={-45}\n textAnchor=\"end\"\n interval={Math.ceil(data.length / 10)}\n />\n <YAxis tick={{ fontSize: 12 }} />\n <Tooltip />\n <Legend verticalAlign=\"top\" height={36} iconType=\"circle\" />\n {channels.map((channel) => (\n <Bar\n key={channel}\n dataKey={channel}\n stackId=\"ventas\"\n fill={channelColors[channel] || '#888'}\n />\n ))}\n </BarChart>\n </ResponsiveContainer>\n )}\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\n\nimport {\n PieChart,\n Pie,\n Cell,\n Legend,\n Tooltip,\n ResponsiveContainer,\n} from 'recharts'\nimport { CCard, CCardBody } from '@coreui/react-pro'\n\nconst DEFAULT_COLORS = ['#FF2F86', '#D9D9D9', '#333333']\n\n/**\n * InvestmentByPlatformChart\n *\n * Gráfico de dona para distribución de inversión por plataforma.\n *\n * @param {Array} data - Array de { name: string, value: number }\n * @param {string} title - Título del gráfico\n * @param {string[]} colors - Colores para cada slice\n * @param {string} currencySymbol - Símbolo de moneda para el tooltip\n * @param {string} locale - Locale para formatear números (default 'es-CO')\n */\nexport default function InvestmentByPlatformChart({\n data = [],\n title = 'Inversión por plataforma',\n colors = DEFAULT_COLORS,\n currencySymbol = 'COP',\n locale = 'es-CO',\n}) {\n return (\n <CCard className=\"rounded-4 shadow-sm p-3\">\n <CCardBody>\n <h5 className=\"text-center fw-bold\">{title}</h5>\n <ResponsiveContainer width=\"100%\" height={280}>\n <PieChart>\n <Pie\n data={data}\n dataKey=\"value\"\n nameKey=\"name\"\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={60}\n outerRadius={100}\n paddingAngle={5}\n label={({ name, percent }) => `${name} ${(percent * 100).toFixed(1)}%`}\n >\n {data.map((_, index) => (\n <Cell key={`cell-${index}`} fill={colors[index % colors.length]} />\n ))}\n </Pie>\n <Tooltip\n formatter={(value) =>\n `${currencySymbol} ${value.toLocaleString(locale)}`\n }\n />\n <Legend verticalAlign=\"bottom\" height={36} />\n </PieChart>\n </ResponsiveContainer>\n </CCardBody>\n </CCard>\n )\n}\n","'use client'\nimport { CTable, CTableHead, CTableBody, CTableRow, CTableHeaderCell, CSpinner } from '@coreui/react-pro'\n\nexport default function PaginatedTable({ data = [], itemsPerPage = 10, currentPage = 1, setCurrentPage = () => {}, columns = [], renderRow = () => null, loading = false, emptyMessage = 'No hay datos disponibles.' }) {\n const totalPages = Math.ceil(data.length / itemsPerPage)\n const paginatedData = data.slice((currentPage - 1) * itemsPerPage, currentPage * itemsPerPage)\n\n if (loading) return <div className=\"text-center py-5\"><CSpinner color=\"secondary\" /></div>\n if (!data.length) return <div className=\"text-center py-5 text-muted\">{emptyMessage}</div>\n\n const renderPagination = () => {\n const pages = Array.from({ length: totalPages }, (_, i) => i + 1)\n return (\n <div className=\"d-flex justify-content-center align-items-center gap-2 mt-3 flex-wrap\">\n {currentPage > 1 && <button onClick={() => setCurrentPage(currentPage - 1)} className=\"px-3 py-1 rounded-pill border bg-white text-dark\" style={{ minWidth: 80, fontWeight: 500 }}>Anterior</button>}\n {pages.map(i => <button key={i} onClick={() => setCurrentPage(i)} className={`px-3 py-1 rounded-pill border ${i === currentPage ? 'bg-dark text-white' : 'bg-white text-dark'}`}>{i}</button>)}\n {currentPage < totalPages && <button onClick={() => setCurrentPage(currentPage + 1)} className=\"px-3 py-1 rounded-pill border bg-white text-dark\" style={{ minWidth: 80, fontWeight: 500 }}>Siguiente</button>}\n </div>\n )\n }\n\n return (\n <>\n <CTable hover responsive>\n <CTableHead className=\"bg-dark text-white\">\n <CTableRow>{columns.map((col, i) => <CTableHeaderCell key={i}>{col}</CTableHeaderCell>)}</CTableRow>\n </CTableHead>\n <CTableBody>{paginatedData.map(renderRow)}</CTableBody>\n </CTable>\n {totalPages > 1 && renderPagination()}\n </>\n )\n}\n","'use client'\nimport { CSpinner } from '@coreui/react-pro'\n\nexport default function PaginatedGrid({ data = [], itemsPerPage = 6, currentPage = 1, setCurrentPage = () => {}, renderItem = () => null, loading = false, emptyMessage = 'No hay elementos.' }) {\n const totalPages = Math.ceil(data.length / itemsPerPage)\n const paginatedData = data.slice((currentPage - 1) * itemsPerPage, currentPage * itemsPerPage)\n\n if (loading) return <div className=\"text-center py-5\"><CSpinner color=\"secondary\" /></div>\n if (!data.length) return <div className=\"text-center py-5 text-muted\">{emptyMessage}</div>\n\n const renderPagination = () => {\n const pages = Array.from({ length: totalPages }, (_, i) => i + 1)\n return (\n <div className=\"d-flex justify-content-center gap-2 mt-4 flex-wrap\">\n {currentPage > 1 && <button onClick={() => setCurrentPage(currentPage - 1)} className=\"px-3 py-1 rounded-pill border bg-white text-dark\">Anterior</button>}\n {pages.map(i => <button key={i} onClick={() => setCurrentPage(i)} className={`px-3 py-1 rounded-pill border ${i === currentPage ? 'bg-dark text-white' : 'bg-white text-dark'}`}>{i}</button>)}\n {currentPage < totalPages && <button onClick={() => setCurrentPage(currentPage + 1)} className=\"px-3 py-1 rounded-pill border bg-white text-dark\">Siguiente</button>}\n </div>\n )\n }\n\n return (\n <>\n <div className=\"row g-4\">{paginatedData.map(renderItem)}</div>\n {totalPages > 1 && renderPagination()}\n </>\n )\n}\n","import { CCard, CPlaceholder } from '@coreui/react-pro'\n\nexport default function CardSkeleton() {\n return (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder component=\"div\" animation=\"glow\" className=\"d-flex flex-column gap-2 bg-transparent\">\n <CPlaceholder className=\"p-4 mt-2 rounded-1\" size=\"lg\" xs={12} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n )\n}\n","import { CCard, CPlaceholder } from '@coreui/react-pro'\n\nexport default function TextSkeleton() {\n return (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder component=\"div\" animation=\"glow\" className=\"d-flex flex-column gap-2 bg-transparent\">\n <CPlaceholder className=\"p-0 my-2 rounded-1\" size=\"lg\" xs={8} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n )\n}\n","import { CCard, CPlaceholder } from '@coreui/react-pro'\n\nexport default function MetricsSkeleton() {\n return (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder component=\"div\" animation=\"glow\" className=\"d-flex flex-column gap-2 bg-transparent\">\n <CPlaceholder className=\"p-5 mt-2 rounded-1\" size=\"lg\" xs={12} color=\"skeleton\" />\n <CPlaceholder className=\"p-3 mt-2 rounded-1\" size=\"xs\" xs={12} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n )\n}\n","import { CCard, CPlaceholder } from '@coreui/react-pro'\n\n/**\n * ReportTableSkeleton\n *\n * Placeholder animado para tablas de reporte mientras cargan los datos.\n */\nexport default function ReportTableSkeleton() {\n return (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder\n component=\"div\"\n animation=\"glow\"\n className=\"d-flex flex-column gap-2 bg-transparent\"\n >\n <CPlaceholder className=\"p-4 mt-2 rounded-1\" size=\"lg\" xs={12} color=\"skeleton\" />\n <CPlaceholder className=\"p-5 mt-2 rounded-1\" size=\"lg\" xs={12} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n )\n}\n","'use client'\n\nimport { CCard, CCol, CPlaceholder, CRow } from '@coreui/react-pro'\n\nconst CardPlaceholder = ({ className = '' }) => (\n <CCard className=\"shadow-none p-0 m-0 bg-transparent border-0\">\n <CPlaceholder\n component=\"div\"\n animation=\"glow\"\n className={`d-flex flex-column gap-2 bg-transparent ${className}`}\n >\n <CPlaceholder className=\"p-4 mt-2 rounded-2\" size=\"lg\" xs={12} color=\"skeleton\" />\n </CPlaceholder>\n </CCard>\n)\n\n/**\n * SummaryReportSkeleton\n *\n * Grilla de placeholders animados para reportes de resumen mientras cargan.\n *\n * @param {Array} layout - Array de { sm, md } para controlar el grid (default: 8 columnas predefinidas)\n */\nexport default function SummaryReportSkeleton({\n layout = [\n { sm: 6, md: 6 },\n { sm: 6, md: 6 },\n { sm: 6, md: 4 },\n { sm: 6, md: 4 },\n { sm: 6, md: 4 },\n { sm: 6, md: 6 },\n { sm: 6, md: 4 },\n { sm: 6, md: 2 },\n ],\n}) {\n return (\n <CRow className=\"g-md-3 px-4 px-sm-2 g-sm-2 pt-2 pb-4\">\n {layout.map((col, index) => (\n <CCol sm={col.sm} md={col.md} key={index}>\n <CardPlaceholder />\n </CCol>\n ))}\n </CRow>\n )\n}\n","export var cidExclamationCircle = [\"512 512\", \"<path fill='var(--ci-secondary-color, currentColor)' d='M256,16C123.452,16,16,123.452,16,256S123.452,496,256,496a238.867,238.867,0,0,0,132.685-40q1.668-1.108,3.315-2.246A239.721,239.721,0,0,0,496,256C496,123.452,388.548,16,256,16Z' class='ci-secondary' opacity='var(--ci-secondary-opacity, 0.25)'/><polygon fill='var(--ci-primary-color, currentColor)' points='224 232 238 304 274 304 288 232 288 120 224 120 224 232' class='ci-primary'/><rect width='40' height='40' x='236' y='344' fill='var(--ci-primary-color, currentColor)' class='ci-primary'/>\"];\n","import { cidExclamationCircle } from '@coreui/icons-pro'\nimport CIcon from '@coreui/icons-react'\n\n/**\n * NoDataMessage\n *\n * Alerta visual cuando no hay datos disponibles para el período seleccionado.\n *\n * @param {string} message - Mensaje a mostrar\n */\nexport function NoDataMessage({\n message = 'No se obtuvieron datos. Revisa el rango de fechas y la integración.',\n}) {\n return (\n <div\n className=\"d-flex align-items-center gap-2 rounded-3 px-3 py-3 mt-3 mb-3\"\n style={{\n backgroundColor: 'var(--cui-warning-bg-subtle)',\n border: '1px solid var(--cui-warning)',\n color: 'var(--cui-body-color)',\n }}\n >\n <CIcon\n icon={cidExclamationCircle}\n className=\"flex-shrink-0 me-2 text-warning\"\n size=\"xxl\"\n />\n {message}\n </div>\n )\n}\n","'use client'\nimport { useRouter } from 'next/navigation'\nimport { CButton } from '@coreui/react-pro'\nimport { cilArrowLeft } from '@coreui/icons'\nimport CIcon from '@coreui/icons-react'\nimport CustomTooltip from '../custom-tooltip/CustomTooltip'\n\nexport default function BackButton({ title, color = 'dark', className = '', path }) {\n const { back, push } = useRouter()\n return (\n <CustomTooltip content=\"Volver atrás\" placement=\"bottom\">\n <CButton color={color} variant=\"ghost\" className={`back-button d-flex align-items-center px-0 ${className}`} onClick={() => path ? push(path) : back()}>\n <CIcon icon={cilArrowLeft} size=\"lg\" className=\"mx-1\" />\n {title && <span className=\"px-2\">{title}</span>}\n </CButton>\n </CustomTooltip>\n )\n}\n"],"mappings":"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","names":["CLoadingButton","CIcon","CLoadingButton","CIcon","CLoadingButton","CIcon","CLoadingButton","CIcon","CIcon","CIcon","CIcon","CCard","CCardBody","CIcon","cilArrowTop","cilArrowBottom","CCard","CCardBody","CIcon","cilArrowTop","cilArrowBottom","CCard","CCardBody","CCard","CCardBody","ResponsiveContainer","XAxis","YAxis","Tooltip","CCard","CCardBody","BarChart","Bar","XAxis","YAxis","Tooltip","ResponsiveContainer","LabelList","Cell","CCard","CCardBody","ResponsiveContainer","BarChart","Bar","XAxis","YAxis","Tooltip","Legend","CartesianGrid","CCard","CCardBody","Cell","Legend","Tooltip","ResponsiveContainer","CCard","CCardBody","CSpinner","CCard","CCard","CPlaceholder","CCard","CPlaceholder","CCard","CPlaceholder","CCard","CPlaceholder","CIcon","CIcon","CIcon"]}
|
package/package.json
CHANGED