diff --git a/public/components/aliases-crud.js b/public/components/aliases-crud.js
index 288c423..19462fe 100644
--- a/public/components/aliases-crud.js
+++ b/public/components/aliases-crud.js
@@ -20,45 +20,45 @@ class AliasesCrud extends HTMLElement {
:host { display:block; height:100%; padding:16px; overflow:hidden; }
* { box-sizing:border-box; font-family:system-ui,Segoe UI,Roboto,Arial; }
.container { display:grid; grid-template-columns:1fr 1fr; gap:16px; height:100%; }
- .panel { background:#121823; border:1px solid #1e2a3a; border-radius:10px; padding:16px; overflow:hidden; display:flex; flex-direction:column; }
- .panel-title { font-size:14px; font-weight:700; color:#8aa0b5; text-transform:uppercase; letter-spacing:.4px; margin-bottom:12px; }
+ .panel { background:var(--panel); border:1px solid var(--border); border-radius:10px; padding:16px; overflow:hidden; display:flex; flex-direction:column; }
+ .panel-title { font-size:14px; font-weight:700; color:var(--text-muted); text-transform:uppercase; letter-spacing:.4px; margin-bottom:12px; }
.toolbar { display:flex; gap:8px; margin-bottom:12px; }
- input, select, textarea { background:#0f1520; color:#e7eef7; border:1px solid #253245; border-radius:8px; padding:8px 12px; font-size:13px; width:100%; }
- input:focus, select:focus, textarea:focus { outline:none; border-color:#1f6feb; }
- button { cursor:pointer; background:#1f6feb; color:#fff; border:none; border-radius:8px; padding:8px 16px; font-size:13px; }
- button:hover { background:#1a5fd0; }
+ input, select, textarea { background:var(--panel-2); color:var(--text); border:1px solid var(--border-hi); border-radius:8px; padding:8px 12px; font-size:13px; width:100%; }
+ input:focus, select:focus, textarea:focus { outline:none; border-color:var(--accent); }
+ button { cursor:pointer; background:var(--accent); color:#fff; border:none; border-radius:8px; padding:8px 16px; font-size:13px; }
+ button:hover { background:var(--accent-hover); }
button:disabled { opacity:.5; cursor:not-allowed; }
- button.secondary { background:#253245; }
- button.secondary:hover { background:#2d3e52; }
- button.danger { background:#e74c3c; }
- button.danger:hover { background:#c0392b; }
+ button.secondary { background:var(--border-hi); }
+ button.secondary:hover { background:var(--border-hi); }
+ button.danger { background:var(--err); }
+ button.danger:hover { background:var(--err); }
button.small { padding:4px 8px; font-size:11px; }
.list { flex:1; overflow-y:auto; }
- .item { background:#0f1520; border:1px solid #253245; border-radius:8px; padding:12px; margin-bottom:8px; cursor:pointer; transition:all .15s; }
- .item:hover { border-color:#1f6feb; }
- .item.active { border-color:#1f6feb; background:#111b2a; }
- .item-alias { font-weight:600; color:#e7eef7; margin-bottom:4px; font-size:15px; }
- .item-products { font-size:12px; color:#8aa0b5; }
- .item-boost { color:#2ecc71; font-size:11px; }
+ .item { background:var(--panel-2); border:1px solid var(--border-hi); border-radius:8px; padding:12px; margin-bottom:8px; cursor:pointer; transition:all .15s; }
+ .item:hover { border-color:var(--accent); }
+ .item.active { border-color:var(--accent); background:var(--accent-soft); }
+ .item-alias { font-weight:600; color:var(--text); margin-bottom:4px; font-size:15px; }
+ .item-products { font-size:12px; color:var(--text-muted); }
+ .item-boost { color:var(--ok); font-size:11px; }
.form { flex:1; overflow-y:auto; }
- .form-empty { color:#8aa0b5; text-align:center; padding:40px; }
+ .form-empty { color:var(--text-muted); text-align:center; padding:40px; }
.field { margin-bottom:16px; }
- .field label { display:block; font-size:12px; color:#8aa0b5; margin-bottom:4px; text-transform:uppercase; letter-spacing:.4px; }
- .field-hint { font-size:11px; color:#8aa0b5; margin-top:4px; }
+ .field label { display:block; font-size:12px; color:var(--text-muted); margin-bottom:4px; text-transform:uppercase; letter-spacing:.4px; }
+ .field-hint { font-size:11px; color:var(--text-muted); margin-top:4px; }
.actions { display:flex; gap:8px; margin-top:16px; }
- .loading { text-align:center; padding:40px; color:#8aa0b5; }
+ .loading { text-align:center; padding:40px; color:var(--text-muted); }
/* Product mappings table */
.mappings-table { width:100%; border-collapse:collapse; margin-top:8px; }
- .mappings-table th { text-align:left; font-size:11px; color:#8aa0b5; padding:8px 4px; border-bottom:1px solid #253245; }
- .mappings-table td { padding:6px 4px; border-bottom:1px solid #1e2a3a; vertical-align:middle; }
+ .mappings-table th { text-align:left; font-size:11px; color:var(--text-muted); padding:8px 4px; border-bottom:1px solid var(--border-hi); }
+ .mappings-table td { padding:6px 4px; border-bottom:1px solid var(--border); vertical-align:middle; }
.mappings-table input[type="number"] { width:70px; padding:6px 8px; font-size:12px; }
- .mappings-table .product-name { font-size:13px; color:#e7eef7; }
- .mappings-table .btn-remove { background:#e74c3c; padding:4px 8px; font-size:11px; }
+ .mappings-table .product-name { font-size:13px; color:var(--text); }
+ .mappings-table .btn-remove { background:var(--err); padding:4px 8px; font-size:11px; }
.add-mapping-row { display:flex; gap:8px; margin-top:12px; align-items:flex-end; }
.add-mapping-row .field { margin-bottom:0; }
@@ -67,19 +67,19 @@ class AliasesCrud extends HTMLElement {
.product-selector { position:relative; }
.product-dropdown {
position:absolute; top:100%; left:0; right:0; z-index:100;
- background:#0f1520; border:1px solid #253245; border-radius:8px;
+ background:var(--panel-2); border:1px solid var(--border-hi); border-radius:8px;
max-height:200px; overflow-y:auto; display:none;
}
.product-dropdown.open { display:block; }
.product-option {
- padding:8px 12px; cursor:pointer; font-size:13px; color:#e7eef7;
+ padding:8px 12px; cursor:pointer; font-size:13px; color:var(--text);
display:flex; justify-content:space-between; align-items:center;
}
- .product-option:hover { background:#1a2535; }
- .product-option .price { font-size:11px; color:#8aa0b5; }
+ .product-option:hover { background:var(--panel-2); }
+ .product-option .price { font-size:11px; color:var(--text-muted); }
- .empty-hint { color:#8aa0b5; font-size:12px; font-style:italic; }
- .badge { display:inline-block; padding:2px 6px; border-radius:999px; font-size:10px; background:#253245; color:#8aa0b5; margin-left:4px; }
+ .empty-hint { color:var(--text-muted); font-size:12px; font-style:italic; }
+ .badge { display:inline-block; padding:2px 6px; border-radius:999px; font-size:10px; background:var(--border-hi); color:var(--text-muted); margin-left:4px; }
diff --git a/public/components/chat-simulator.js b/public/components/chat-simulator.js
index c3e5944..76a3487 100644
--- a/public/components/chat-simulator.js
+++ b/public/components/chat-simulator.js
@@ -11,25 +11,49 @@ class ChatSimulator extends HTMLElement {
this._sending = false;
this.shadowRoot.innerHTML = `
diff --git a/public/components/conversation-inspector.js b/public/components/conversation-inspector.js
index 1f4ac72..3f0752a 100644
--- a/public/components/conversation-inspector.js
+++ b/public/components/conversation-inspector.js
@@ -19,31 +19,63 @@ class ConversationInspector extends HTMLElement {
this.shadowRoot.innerHTML = `
diff --git a/public/components/conversation-list.js b/public/components/conversation-list.js
index 8879b1a..d8acb83 100644
--- a/public/components/conversation-list.js
+++ b/public/components/conversation-list.js
@@ -14,27 +14,68 @@ class ConversationList extends HTMLElement {
this.shadowRoot.innerHTML = `
diff --git a/public/components/conversations-crud.js b/public/components/conversations-crud.js
index 6877f4a..65d5413 100644
--- a/public/components/conversations-crud.js
+++ b/public/components/conversations-crud.js
@@ -18,40 +18,40 @@ class ConversationsCrud extends HTMLElement {
:host { display:block; height:100%; padding:16px; overflow:hidden; }
* { box-sizing:border-box; font-family:system-ui,Segoe UI,Roboto,Arial; }
.container { display:grid; grid-template-columns:1fr 1fr; gap:16px; height:100%; }
- .panel { background:#121823; border:1px solid #1e2a3a; border-radius:10px; padding:16px; overflow:hidden; display:flex; flex-direction:column; }
- .panel-title { font-size:14px; font-weight:700; color:#8aa0b5; text-transform:uppercase; letter-spacing:.4px; margin-bottom:12px; }
+ .panel { background:var(--panel); border:1px solid var(--border); border-radius:10px; padding:16px; overflow:hidden; display:flex; flex-direction:column; }
+ .panel-title { font-size:14px; font-weight:700; color:var(--text-muted); text-transform:uppercase; letter-spacing:.4px; margin-bottom:12px; }
.toolbar { display:flex; gap:8px; margin-bottom:12px; flex-wrap:wrap; }
- input, select { background:#0f1520; color:#e7eef7; border:1px solid #253245; border-radius:8px; padding:8px 12px; font-size:13px; }
- input:focus, select:focus { outline:none; border-color:#1f6feb; }
- button { cursor:pointer; background:#1f6feb; color:#fff; border:none; border-radius:8px; padding:8px 16px; font-size:13px; }
- button:hover { background:#1a5fd0; }
+ input, select { background:var(--panel-2); color:var(--text); border:1px solid var(--border-hi); border-radius:8px; padding:8px 12px; font-size:13px; }
+ input:focus, select:focus { outline:none; border-color:var(--accent); }
+ button { cursor:pointer; background:var(--accent); color:#fff; border:none; border-radius:8px; padding:8px 16px; font-size:13px; }
+ button:hover { background:var(--accent-hover); }
button:disabled { opacity:.5; cursor:not-allowed; }
- button.secondary { background:#253245; }
- button.secondary:hover { background:#2d3e52; }
- button.danger { background:#e74c3c; }
- button.danger:hover { background:#c0392b; }
+ button.secondary { background:var(--border-hi); }
+ button.secondary:hover { background:var(--border-hi); }
+ button.danger { background:var(--err); }
+ button.danger:hover { background:var(--err); }
.list { flex:1; overflow-y:auto; }
- .item { background:#0f1520; border:1px solid #253245; border-radius:8px; padding:12px; margin-bottom:8px; cursor:pointer; transition:all .15s; }
- .item:hover { border-color:#1f6feb; }
- .item.active { border-color:#1f6feb; background:#111b2a; }
+ .item { background:var(--panel-2); border:1px solid var(--border-hi); border-radius:8px; padding:12px; margin-bottom:8px; cursor:pointer; transition:all .15s; }
+ .item:hover { border-color:var(--accent); }
+ .item.active { border-color:var(--accent); background:var(--accent-soft); }
.item-header { display:flex; align-items:center; gap:8px; margin-bottom:4px; }
- .item-name { font-weight:600; color:#e7eef7; flex:1; }
- .item-meta { font-size:12px; color:#8aa0b5; }
+ .item-name { font-weight:600; color:var(--text); flex:1; }
+ .item-meta { font-size:12px; color:var(--text-muted); }
.dot { width:8px; height:8px; border-radius:50%; flex-shrink:0; }
- .ok { background:#2ecc71; } .warn { background:#f1c40f; } .err { background:#e74c3c; }
+ .ok { background:var(--ok); } .warn { background:var(--warn); } .err { background:var(--err); }
.chips { display:flex; flex-wrap:wrap; gap:6px; margin-top:6px; }
- .chip { display:inline-block; padding:2px 8px; border-radius:999px; font-size:11px; background:#253245; color:#8aa0b5; }
+ .chip { display:inline-block; padding:2px 8px; border-radius:999px; font-size:11px; background:var(--border-hi); color:var(--text-muted); }
.detail { flex:1; overflow-y:auto; }
- .detail-empty { color:#8aa0b5; text-align:center; padding:40px; }
+ .detail-empty { color:var(--text-muted); text-align:center; padding:40px; }
.field { margin-bottom:16px; }
- .field label { display:block; font-size:12px; color:#8aa0b5; margin-bottom:4px; text-transform:uppercase; letter-spacing:.4px; }
- .field-value { background:#0f1520; border:1px solid #253245; border-radius:8px; padding:10px 12px; color:#e7eef7; font-size:13px; }
+ .field label { display:block; font-size:12px; color:var(--text-muted); margin-bottom:4px; text-transform:uppercase; letter-spacing:.4px; }
+ .field-value { background:var(--panel-2); border:1px solid var(--border-hi); border-radius:8px; padding:10px 12px; color:var(--text); font-size:13px; }
.actions { display:flex; gap:8px; margin-top:16px; flex-wrap:wrap; }
- .loading { text-align:center; padding:40px; color:#8aa0b5; }
+ .loading { text-align:center; padding:40px; color:var(--text-muted); }
diff --git a/public/components/debug-panel.js b/public/components/debug-panel.js
index 5f828ea..98a2900 100644
--- a/public/components/debug-panel.js
+++ b/public/components/debug-panel.js
@@ -9,12 +9,12 @@ class DebugPanel extends HTMLElement {
this.shadowRoot.innerHTML = `
diff --git a/public/components/home-dashboard.js b/public/components/home-dashboard.js
index c29ab58..0ccfbc6 100644
--- a/public/components/home-dashboard.js
+++ b/public/components/home-dashboard.js
@@ -10,6 +10,20 @@ function formatNumber(value) {
return new Intl.NumberFormat("es-AR", { maximumFractionDigits: 1 }).format(value);
}
+/** Lee una CSS custom property del :root. Fallback al hex provisto. */
+function cssVar(name, fallback = "") {
+ const v = getComputedStyle(document.documentElement).getPropertyValue(name).trim();
+ return v || fallback;
+}
+
+/** rgba con alpha desde un hex (#RRGGBB) o sky/etc — para fills de charts. */
+function withAlpha(hex, alpha) {
+ const m = /^#?([0-9a-f]{6})$/i.exec(hex || "");
+ if (!m) return hex;
+ const n = parseInt(m[1], 16);
+ return `rgba(${(n >> 16) & 255}, ${(n >> 8) & 255}, ${n & 255}, ${alpha})`;
+}
+
class HomeDashboard extends HTMLElement {
constructor() {
super();
@@ -20,109 +34,86 @@ class HomeDashboard extends HTMLElement {
this.shadowRoot.innerHTML = `