diff --git a/src/admin-bi.js b/src/admin-bi.js
index 0a203c2..1e36dc5 100644
--- a/src/admin-bi.js
+++ b/src/admin-bi.js
@@ -812,7 +812,7 @@ function buildAdminBIHTML(user) {
.skel-value { height: 32px; width: 55%; }
.skel-badge { height: 18px; width: 70px; }
.skel-text { height: 14px; width: 80%; margin: 4px 0; }
- .skel-chart { height: 100%; width: 100%; min-height: 180px; border-radius: 12px; }
+ .skel-chart { height: 100%; width: 100%; min-height: 180px; border-radius: 12px; position: absolute; top: 0; left: 0; z-index: 2; }
.skel-row { height: 32px; margin: 6px 0; width: 100%; }
.skel-gauge { height: 40px; width: 90px; }
`;
@@ -909,11 +909,11 @@ ${buildHeader({ role: role, userName: user.nome, activePage: 'bi' })}
@@ -968,7 +968,7 @@ ${buildHeader({ role: role, userName: user.nome, activePage: 'bi' })}
Ranking Agentes
@@ -991,7 +991,7 @@ ${buildHeader({ role: role, userName: user.nome, activePage: 'bi' })}
Forecast: Historical + Predicted Volume
Loading forecast...
-
+
@@ -1009,7 +1009,7 @@ ${buildHeader({ role: role, userName: user.nome, activePage: 'bi' })}
-
Resumo Netting
@@ -1077,11 +1077,11 @@ ${buildHeader({ role: role, userName: user.nome, activePage: 'bi' })}
Receita por Produto ao Longo do Tempo
-
+
Composicao de Receita por Produto
-
+
@@ -1131,11 +1131,11 @@ ${buildHeader({ role: role, userName: user.nome, activePage: 'bi' })}
Distribuicao por Segmento
-
+
@@ -1147,12 +1147,12 @@ ${buildHeader({ role: role, userName: user.nome, activePage: 'bi' })}
Cross-sell CambioPay vs Checkout
-
+
Maturidade de Clientes
-
+
@@ -1231,11 +1231,9 @@ const fmtPct = (curr, prev) => {
};
// === Skeleton helpers ===
-function showChart(skelId, canvasId) {
+function showChart(skelId) {
var s = document.getElementById(skelId);
if (s) s.remove();
- var c = document.getElementById(canvasId);
- if (c) c.style.display = '';
}
// === Date & Filter Logic ===
@@ -1260,8 +1258,9 @@ function setPreset(preset) {
}
document.getElementById('dateStart').value = start;
document.getElementById('dateEnd').value = today;
- document.querySelectorAll('.preset-btn').forEach(b => b.classList.remove('active'));
- document.querySelector('[data-preset="'+preset+'"]').classList.add('active');
+ document.querySelectorAll('.preset-btn[data-preset]').forEach(b => b.classList.remove('active'));
+ var _pb = document.querySelector('[data-preset="'+preset+'"]');
+ if (_pb) _pb.classList.add('active');
currentStart = start; currentEnd = today;
loadAll();
}
diff --git a/src/admin-cliente.js b/src/admin-cliente.js
index 610f692..3db9664 100644
--- a/src/admin-cliente.js
+++ b/src/admin-cliente.js
@@ -330,6 +330,28 @@ function buildAdminClienteHTML(user) {
[data-theme="dark"] .date-inputs input[type="date"] { background: var(--card); color: var(--text); border-color: var(--border); }
[data-theme="dark"] .data-table tr:hover td { background: rgba(255,255,255,0.03); }
+ /* === Skeleton Loading Shimmer === */
+ @keyframes shimmer {
+ 0% { background-position: -400px 0; }
+ 100% { background-position: 400px 0; }
+ }
+ .skel {
+ background: linear-gradient(90deg, var(--card-bg,var(--card)) 25%, var(--border) 50%, var(--card-bg,var(--card)) 75%);
+ background-size: 800px 100%;
+ animation: shimmer 1.5s infinite ease-in-out;
+ border-radius: 6px;
+ display: inline-block;
+ }
+ .skel-value { height: 32px; width: 55%; }
+ .skel-badge { height: 18px; width: 70px; }
+ .skel-text { height: 14px; width: 80%; margin: 4px 0; }
+ .skel-chart { height: 100%; width: 100%; min-height: 180px; border-radius: 12px; position: absolute; top: 0; left: 0; z-index: 2; }
+ .skel-row { height: 32px; margin: 6px 0; width: 100%; }
+ .skel-gauge { height: 40px; width: 90px; }
+ .skel-avatar { width: 56px; height: 56px; border-radius: 50%; }
+ .skel-name { height: 22px; width: 160px; }
+ .skel-stat { height: 18px; width: 70px; }
+
/* === Merchant / Checkout === */
.merchant-badge {
display: none; padding: 4px 12px; border-radius: 8px; font-size: 11px; font-weight: 800;
@@ -397,23 +419,23 @@ ${buildHeader({ role: role, userName: user.nome, activePage: 'cliente' })}
@@ -440,12 +462,12 @@ ${buildHeader({ role: role, userName: user.nome, activePage: 'cliente' })}
-
-
-
-
Ticket Medio
--
USD / operacao
-
-
Spread Medio
--
% ponderado
+
+
+
+
Ticket Medio
USD / operacao
+
+
@@ -455,12 +477,12 @@ ${buildHeader({ role: role, userName: user.nome, activePage: 'cliente' })}
CambioCheckout (Merchant)
-
-
Payers Unicos
--
pagadores distintos
-
-
-
Ticket Checkout
--
USD / operacao
-
+
+
Payers Unicos
pagadores distintos
+
+
+
Ticket Checkout
USD / operacao
+
@@ -469,7 +491,7 @@ ${buildHeader({ role: role, userName: user.nome, activePage: 'cliente' })}