:root{--bg:#f5f5f2;--surface:#ffffff;--surface-2:#f1efe8;--border:rgba(0,0,0,0.10);--border-2:rgba(0,0,0,0.18);--text:#1a1a18;--text-2:#5f5e5a;--text-3:#9c9a92;--green:#1D9E75;--green-bg:#E1F5EE;--green-text:#085041;--amber:#BA7517;--amber-bg:#FAEEDA;--amber-text:#633806;--blue:#185FA5;--blue-bg:#E6F1FB;--blue-text:#0C447C;--red:#A32D2D;--red-bg:#FCEBEB;--red-text:#791F1F;--purple:#534AB7;--purple-bg:#EEEDFE;--purple-text:#3C3489;--radius:8px;--radius-lg:12px;--sidebar-w:224px}
@media(prefers-color-scheme:dark){:root{--bg:#1a1a18;--surface:#242422;--surface-2:#2c2c2a;--border:rgba(255,255,255,0.10);--border-2:rgba(255,255,255,0.18);--text:#e8e6dc;--text-2:#a8a6a0;--text-3:#6a6866;--green-bg:#04342C;--green-text:#9FE1CB;--amber-bg:#412402;--amber-text:#FAC775;--blue-bg:#042C53;--blue-text:#B5D4F4;--red-bg:#501313;--red-text:#F7C1C1;--purple-bg:#26215C;--purple-text:#CECBF6}}
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;background:var(--bg);color:var(--text);font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased}
.app-layout{display:flex;min-height:100vh}
.sidebar{width:var(--sidebar-w);background:var(--surface);border-right:.5px solid var(--border);display:flex;flex-direction:column;position:fixed;top:0;left:0;bottom:0;z-index:200;overflow-y:auto;overflow-x:hidden;transition:transform .22s ease}
.sidebar-logo{display:flex;align-items:center;gap:10px;padding:18px 16px 16px;border-bottom:.5px solid var(--border);margin-bottom:8px;flex-shrink:0}
.logo-mark{width:34px;height:34px;background:var(--green);color:var(--green-bg);border-radius:9px;display:flex;align-items:center;justify-content:center;font-size:17px;font-weight:700;flex-shrink:0}
.logo-name{font-size:14px;font-weight:500;color:var(--text);line-height:1.3}.logo-sub{font-size:11px;color:var(--text-3)}
.nav-section{font-size:10px;color:var(--text-3);padding:12px 16px 4px;letter-spacing:.06em;text-transform:uppercase}
.nav-item{display:flex;align-items:center;gap:9px;padding:8px 16px;font-size:13px;color:var(--text-2);text-decoration:none;transition:background .1s,color .1s;border-left:2.5px solid transparent;white-space:nowrap}
.nav-item:hover{background:var(--surface-2);color:var(--text)}
.nav-item.active{background:var(--green-bg);color:var(--green-text);border-left-color:var(--green);font-weight:500}
.nav-icon{width:16px;height:16px;flex-shrink:0}
.sidebar-footer{margin-top:auto;padding:12px 16px 18px;border-top:.5px solid var(--border);display:flex;flex-direction:column;gap:8px}
.lang-toggle{display:flex;align-items:center;gap:6px;padding:7px 10px;border:.5px solid var(--border-2);border-radius:var(--radius);font-size:12px;color:var(--text-2);background:transparent;cursor:pointer;width:100%;transition:background .1s}
.lang-toggle:hover{background:var(--surface-2)}.logout-btn{font-size:12px;color:var(--text-3);text-decoration:none;padding:2px 0}.logout-btn:hover{color:var(--red)}
.sidebar-backdrop{display:none;position:fixed;inset:0;z-index:190;background:rgba(0,0,0,0.4)}
.main-content{margin-left:var(--sidebar-w);flex:1;min-width:0;padding:24px}
.page-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:20px;gap:12px}
.page-header-left{display:flex;align-items:flex-start;gap:10px;min-width:0}
.page-title{font-size:20px;font-weight:500;color:var(--text)}.page-sub{font-size:13px;color:var(--text-2);margin-top:2px}
.current-date{font-size:12px;color:var(--text-3);white-space:nowrap;padding-top:4px}
.mobile-menu-btn{display:none;flex-shrink:0;background:transparent;border:.5px solid var(--border-2);border-radius:var(--radius);padding:7px;cursor:pointer;color:var(--text);align-items:center;justify-content:center}
.card{background:var(--surface);border:.5px solid var(--border);border-radius:var(--radius-lg);padding:16px}
.card+.card{margin-top:14px}
.card-title{display:flex;align-items:center;justify-content:space-between;font-size:13px;font-weight:500;color:var(--text);margin-bottom:14px;gap:8px}
.card-action{font-size:11px;color:var(--text-2);background:var(--surface-2);border:.5px solid var(--border);border-radius:20px;padding:3px 10px;white-space:nowrap;cursor:pointer;font-weight:400;transition:background .15s,color .15s}.card-action:hover{background:var(--surface-3,var(--surface));color:var(--text);border-color:var(--text-3)}
.metrics-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-bottom:16px}
.metric-card{background:var(--surface-2);border-radius:var(--radius);padding:12px 14px}
.metric-label{font-size:11px;color:var(--text-2);margin-bottom:5px}
.metric-value{font-size:20px;font-weight:500;color:var(--text)}
.metric-value.green{color:var(--green)}.metric-value.amber{color:var(--amber)}.metric-value.blue{color:var(--blue)}.metric-value.red{color:var(--red)}.metric-value.purple{color:var(--purple)}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.35}}
.metric-value.loading{color:var(--text-3);animation:pulse .8s ease-in-out infinite}
.metric-sub{font-size:11px;color:var(--text-3);margin-top:3px}
.progress-outer{height:6px;background:var(--surface-2);border-radius:3px;overflow:hidden;margin-bottom:6px}
.progress-fill{height:100%;background:var(--green);border-radius:3px;transition:width .8s ease}
.progress-label{font-size:11px;color:var(--text-3)}
.two-col{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.three-col{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}
.data-table{width:100%;border-collapse:collapse;font-size:12px}
.data-table th{text-align:left;color:var(--text-3);font-weight:400;font-size:11px;padding:0 6px 8px 0;border-bottom:.5px solid var(--border)}
.data-table td{padding:7px 6px 7px 0;border-bottom:.5px solid var(--border);color:var(--text);vertical-align:middle}
.data-table tr:last-child td{border-bottom:none}
.data-table tr.row-overdue td{color:var(--red)}.data-table tr.row-paid td{color:var(--text-3)}
.loading-row{text-align:center;color:var(--text-3);padding:16px!important}
.badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:20px;font-size:11px;white-space:nowrap}
.badge-paid{background:var(--green-bg);color:var(--green-text)}.badge-pending{background:var(--amber-bg);color:var(--amber-text)}.badge-nf{background:var(--blue-bg);color:var(--blue-text)}.badge-due{background:var(--red-bg);color:var(--red-text)}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 16px;border-radius:var(--radius);font-size:13px;font-weight:500;cursor:pointer;border:.5px solid var(--border-2);background:transparent;color:var(--text);text-decoration:none;transition:background .1s;white-space:nowrap}
.btn:hover{background:var(--surface-2)}.btn:active{transform:scale(.98)}
.btn-primary{background:var(--green);color:var(--green-bg);border-color:var(--green)}.btn-primary:hover{background:#0F6E56}
.btn-full{width:100%}
.btn-icon{width:26px;height:26px;display:inline-flex;align-items:center;justify-content:center;border:.5px solid var(--border);border-radius:var(--radius);background:transparent;cursor:pointer;font-size:12px;color:var(--text-2);transition:background .1s}
.btn-icon:hover{background:var(--surface-2);color:var(--text)}.btn-icon.red:hover{background:var(--red-bg);color:var(--red-text);border-color:var(--red)}
.btn-xs{padding:3px 9px;font-size:11px;border-radius:var(--radius);cursor:pointer;border:.5px solid var(--border);background:transparent;color:var(--text-2);white-space:nowrap}
.btn-xs.btn-green{background:var(--green-bg);color:var(--green-text);border-color:var(--green)}.btn-xs.btn-green:hover{background:#9FE1CB}
.form-group{display:flex;flex-direction:column;gap:5px;margin-bottom:14px}
.form-label{font-size:12px;color:var(--text-2)}
.form-input{padding:8px 12px;border:.5px solid var(--border-2);border-radius:var(--radius);font-size:13px;background:var(--surface);color:var(--text);outline:none;width:100%;transition:border-color .15s}
.form-input:focus{border-color:var(--green)}select.form-input{cursor:pointer}.form-input[readonly]{background:var(--surface-2)}
.alert{padding:10px 14px;border-radius:var(--radius);font-size:13px;margin-bottom:14px;line-height:1.5}
.alert-error{background:var(--red-bg);color:var(--red-text)}.alert-success{background:var(--green-bg);color:var(--green-text)}.alert-info{background:var(--blue-bg);color:var(--blue-text)}.alert-warn{background:var(--amber-bg);color:var(--amber-text)}
.alert strong{font-weight:500}.alert a{color:inherit}
.upload-zone{border:1.5px dashed var(--border-2);border-radius:var(--radius);padding:24px 16px;text-align:center;cursor:pointer;transition:background .1s,border-color .15s}
.upload-zone:hover{background:var(--surface-2);border-color:var(--green)}.upload-zone-text{font-size:13px;color:var(--text-2);margin-top:8px}.upload-zone-sub{font-size:11px;color:var(--text-3);margin-top:3px}
@keyframes spin{to{transform:rotate(360deg)}}
.ai-spinner{width:28px;height:28px;border:2.5px solid var(--green-bg);border-top-color:var(--green);border-radius:50%;animation:spin .8s linear infinite;margin:0 auto 10px}
.field-filled{background:var(--green-bg)!important;border-color:var(--green)!important;transition:background .3s,border-color .3s}
.green{color:var(--green)!important}.amber{color:var(--amber)!important}.red{color:var(--red)!important}.blue{color:var(--blue)!important}.purple{color:var(--purple)!important}
.login-body{display:flex;align-items:center;justify-content:center;min-height:100vh;padding:24px}
.login-card{background:var(--surface);border:.5px solid var(--border);border-radius:var(--radius-lg);padding:32px;width:100%;max-width:360px}
.login-logo{text-align:center;margin-bottom:28px}.login-logo-mark{width:52px;height:52px;background:var(--green);color:var(--green-bg);border-radius:14px;font-size:24px;font-weight:700;display:flex;align-items:center;justify-content:center;margin:0 auto 12px}
.login-logo-text{font-size:18px;font-weight:500}.login-logo-sub{font-size:13px;color:var(--text-2);margin-top:3px}
.login-hint{font-size:11px;color:var(--text-3);text-align:center;margin-top:20px;line-height:1.8}
.login-hint code{font-family:monospace;background:var(--surface-2);padding:1px 5px;border-radius:4px;font-size:11px}
.sep{border:none;border-top:.5px solid var(--border);margin:14px 0}
.chart-container{position:relative;width:100%}
@media(max-width:900px){.metrics-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.three-col{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:680px){.mobile-menu-btn{display:flex}.sidebar{transform:translateX(-100%);box-shadow:4px 0 24px rgba(0,0,0,.12)}.sidebar.open{transform:translateX(0)}.sidebar-backdrop.open{display:block}.main-content{margin-left:0;padding:16px}.page-title{font-size:17px}.current-date{display:none}.metrics-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.two-col,.three-col{grid-template-columns:1fr}.card{padding:12px}.hide-mobile{display:none!important}}
@media print{.sidebar,.page-header,.btn,.btn-icon,.mobile-menu-btn,.sidebar-backdrop{display:none!important}.main-content{margin-left:0!important;padding:0!important}.card{border:none!important;break-inside:avoid}body{font-size:11px;color:#000;background:#fff}}

/* ── Sortable table headers ── */
th.sortable {
  cursor: pointer !important;
  user-select: none;
  white-space: nowrap;
}
th.sortable:hover { opacity: 0.7; }
th.sort-asc  { color: var(--green) !important; }
th.sort-desc { color: var(--green) !important; }

/* ── Dark scrollbar ── */
::-webkit-scrollbar { width: 5px; height: 5px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
::-webkit-scrollbar-thumb:hover { background: var(--text-3); }
* { scrollbar-width: thin; scrollbar-color: var(--border) transparent; }

/* ── Metric cards equal height ── */
.metrics-grid { align-items: stretch; }
.metric-card  { display: flex; flex-direction: column; justify-content: space-between; }

th.sortable {
  cursor: pointer;
  user-select: none;
  white-space: nowrap;
}
th.sortable:hover { opacity: 0.75; }
/* Sort icon span — CSS border triangles, no SVG needed */
.sort-icon {
  display: inline-block;
  width: 8px;
  height: 14px;
  margin-left: 5px;
  vertical-align: middle;
  position: relative;
}
.sort-icon::before,
.sort-icon::after {
  content: '';
  position: absolute;
  left: 0;
  border-left: 4px solid transparent;
  border-right: 4px solid transparent;
}
.sort-icon::before {
  top: 1px;
  border-bottom: 5px solid currentColor;
  opacity: 0.25;
}
.sort-icon::after {
  bottom: 1px;
  border-top: 5px solid currentColor;
  opacity: 0.25;
}
th.sortable.sort-asc .sort-icon::before  { border-bottom-color: var(--green); opacity: 1; }
th.sortable.sort-asc .sort-icon::after   { opacity: 0.1; }
th.sortable.sort-desc .sort-icon::after  { border-top-color: var(--green); opacity: 1; }
th.sortable.sort-desc .sort-icon::before { opacity: 0.1; }