@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 CHANGED
@@ -105,28 +105,34 @@ import { GeneralCard } from '@roax/ui'
105
105
  ```jsx
106
106
  import { FunnelChart, TimeSeriesComparisonChart } from '@roax/ui'
107
107
 
108
- <FunnelChart data={[
109
- { title: 'Impresiones', value: 120000, previous: 98000,
110
- percentageChange: 22.4, isPositive: true, unit: '',
111
- previousDateRange: '2024-03-01 - 2024-03-31' },
112
- { title: 'Clics', value: 8400, previous: 7200,
113
- percentageChange: 16.7, isPositive: true, unit: '' },
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={data} // [{ date: '2024-05-01', ventas: 800000, inversión: 200000 }]
118
- lines={['ventas', 'inversión']}
119
- colors={{ ventas: '#FF2F86', inversión: '#5B01D2' }}
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="Pesos (COP)"
122
- displayNames={{ ventas: 'Ventas', inversión: 'Inversión en Ads' }}
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="Inversión por plataforma"
128
- currencySymbol="COP"
129
- locale="es-CO"
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({ data = [] }) {
276
- return /* @__PURE__ */ React.createElement(import_react_pro8.CCard, { className: "mt-4 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 * 45 + 50 }, /* @__PURE__ */ React.createElement(
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: "#FF8AAE" }), /* @__PURE__ */ React.createElement("stop", { offset: "100%", stopColor: "#FF1F3D" }))),
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: "title",
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.title), ":", " ", /* @__PURE__ */ React.createElement("span", null, formatValue(value, item.unit, item.title)));
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.title || index}`,
325
+ key: `cell-${entry.label || index}`,
321
326
  fill: entry.color || "url(#funnelGradient)"
322
327
  }
323
328
  )))
324
- )), /* @__PURE__ */ React.createElement(import_react_pro8.CRow, { className: "pt-4 g-3" }, data.slice(0, 3).map((item, index) => /* @__PURE__ */ React.createElement(import_react_pro8.CCol, { xs: 12, md: 4, key: `card-top-${index}` }, /* @__PURE__ */ React.createElement(
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 detectUnit = (name = "") => {
364
- const lower = name.toLowerCase();
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
- return /* @__PURE__ */ React.createElement(import_react_pro9.CCard, { className: "mt-4 rounded-4 shadow-sm p-3" }, /* @__PURE__ */ React.createElement(import_react_pro9.CCardBody, null, cards.length > 0 && /* @__PURE__ */ React.createElement(import_react_pro9.CRow, { className: "pt-4 g-3 justify-content-center text-center mb-4" }, cards.map((card, index) => /* @__PURE__ */ React.createElement(import_react_pro9.CCol, { xs: 12, md: 4, lg: 5, key: index }, /* @__PURE__ */ React.createElement(
375
- GeneralCard,
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
- title: card.title,
378
- current: card.value,
379
- previous: card.previous,
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
- )))), /* @__PURE__ */ React.createElement(import_recharts2.ResponsiveContainer, { width: "100%", height: 340 }, /* @__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(import_recharts2.XAxis, { dataKey: "date", stroke: "#333", tick: { fontSize: 12 } }), /* @__PURE__ */ React.createElement(
361
+ ), /* @__PURE__ */ React.createElement(
387
362
  import_recharts2.YAxis,
388
363
  {
389
364
  yAxisId: "left",
390
365
  stroke: "#333",
391
- tickFormatter: (val) => `${currency ? currency + " " : ""}${val >= 1e6 ? (val / 1e6).toFixed(1) + "M" : val.toLocaleString("es-CO")}`,
366
+ tickFormatter: formatYTick,
392
367
  tick: { fontSize: 12 },
393
- width: 100,
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, name) => {
407
- const unit = detectUnit(name);
408
- return [formatValue(val, unit), displayNames[name] || name];
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: (value) => displayNames[value] || value
394
+ formatter: (key) => displayNames[key] || key
421
395
  }
422
- ), lines.map((lineName) => /* @__PURE__ */ React.createElement(
396
+ ), lines.map((key) => /* @__PURE__ */ React.createElement(
423
397
  import_recharts2.Line,
424
398
  {
425
- key: lineName,
399
+ key,
426
400
  yAxisId: "left",
427
401
  type: "monotone",
428
- dataKey: lineName,
429
- stroke: colors[lineName] || "#000",
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, CRow, CCol } from "@coreui/react-pro";
225
- function FunnelChart({ data = [] }) {
226
- return /* @__PURE__ */ React.createElement(CCard3, { className: "mt-4 rounded-4 shadow-sm p-3" }, /* @__PURE__ */ React.createElement(CCardBody3, null, /* @__PURE__ */ React.createElement(ResponsiveContainer, { width: "100%", height: data.length * 45 + 50 }, /* @__PURE__ */ React.createElement(
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: "#FF8AAE" }), /* @__PURE__ */ React.createElement("stop", { offset: "100%", stopColor: "#FF1F3D" }))),
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: "title",
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.title), ":", " ", /* @__PURE__ */ React.createElement("span", null, formatValue(value, item.unit, item.title)));
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.title || index}`,
275
+ key: `cell-${entry.label || index}`,
271
276
  fill: entry.color || "url(#funnelGradient)"
272
277
  }
273
278
  )))
274
- )), /* @__PURE__ */ React.createElement(CRow, { className: "pt-4 g-3" }, data.slice(0, 3).map((item, index) => /* @__PURE__ */ React.createElement(CCol, { xs: 12, md: 4, key: `card-top-${index}` }, /* @__PURE__ */ React.createElement(
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, CRow as CRow2, CCol as CCol2 } from "@coreui/react-pro";
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 detectUnit = (name = "") => {
323
- const lower = name.toLowerCase();
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
- return /* @__PURE__ */ React.createElement(CCard4, { className: "mt-4 rounded-4 shadow-sm p-3" }, /* @__PURE__ */ React.createElement(CCardBody4, null, cards.length > 0 && /* @__PURE__ */ React.createElement(CRow2, { className: "pt-4 g-3 justify-content-center text-center mb-4" }, cards.map((card, index) => /* @__PURE__ */ React.createElement(CCol2, { xs: 12, md: 4, lg: 5, key: index }, /* @__PURE__ */ React.createElement(
334
- GeneralCard,
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
- title: card.title,
337
- current: card.value,
338
- previous: card.previous,
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
- )))), /* @__PURE__ */ React.createElement(ResponsiveContainer2, { width: "100%", height: 340 }, /* @__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(XAxis2, { dataKey: "date", stroke: "#333", tick: { fontSize: 12 } }), /* @__PURE__ */ React.createElement(
320
+ ), /* @__PURE__ */ React.createElement(
346
321
  YAxis2,
347
322
  {
348
323
  yAxisId: "left",
349
324
  stroke: "#333",
350
- tickFormatter: (val) => `${currency ? currency + " " : ""}${val >= 1e6 ? (val / 1e6).toFixed(1) + "M" : val.toLocaleString("es-CO")}`,
325
+ tickFormatter: formatYTick,
351
326
  tick: { fontSize: 12 },
352
- width: 100,
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, name) => {
366
- const unit = detectUnit(name);
367
- return [formatValue(val, unit), displayNames[name] || name];
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: (value) => displayNames[value] || value
353
+ formatter: (key) => displayNames[key] || key
380
354
  }
381
- ), lines.map((lineName) => /* @__PURE__ */ React.createElement(
355
+ ), lines.map((key) => /* @__PURE__ */ React.createElement(
382
356
  Line,
383
357
  {
384
- key: lineName,
358
+ key,
385
359
  yAxisId: "left",
386
360
  type: "monotone",
387
- dataKey: lineName,
388
- stroke: colors[lineName] || "#000",
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 as CCol3, CPlaceholder as CPlaceholder5, CRow as CRow3 } from "@coreui/react-pro";
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(CRow3, { className: "g-md-3 px-4 px-sm-2 g-sm-2 pt-2 pb-4" }, layout.map((col, index) => /* @__PURE__ */ React.createElement(CCol3, { sm: col.sm, md: col.md, key: index }, /* @__PURE__ */ React.createElement(CardPlaceholder, null))));
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
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roax/ui",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Roax UI Component Library — componentes reutilizables para proyectos Roax",
5
5
  "keywords": ["react", "ui", "components", "roax", "coreui"],
6
6
  "main": "./dist/index.js",