:root{
  --gf-primary:#0d6efd;
  --gf-sidebar-w:250px;
  --gf-sidebar-bg:#0f172a;
  --gf-sidebar-fg:#cbd5e1;
  --gf-bg:#f4f6fa;
  --gf-card-border:rgba(15,23,42,.06);
}
[data-bs-theme="dark"]{
  --gf-bg:#0b1220;
  --gf-sidebar-bg:#070c18;
  --gf-card-border:rgba(255,255,255,.06);
}
html,body{height:100%}
body{background:var(--gf-bg);font-family:Inter,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;font-size:.925rem}
.btn-primary{--bs-btn-bg:var(--gf-primary);--bs-btn-border-color:var(--gf-primary);--bs-btn-hover-bg:color-mix(in srgb,var(--gf-primary) 85%,black);--bs-btn-hover-border-color:color-mix(in srgb,var(--gf-primary) 85%,black)}
.text-primary{color:var(--gf-primary)!important}

/* shell */
.gf-shell{display:flex;min-height:100vh}
.gf-sidebar{width:var(--gf-sidebar-w);background:var(--gf-sidebar-bg);color:var(--gf-sidebar-fg);display:flex;flex-direction:column;position:fixed;inset:0 auto 0 0;z-index:1040;transition:transform .2s}
.gf-brand{display:flex;align-items:center;gap:.6rem;padding:1.1rem 1.25rem;color:#fff;text-decoration:none;font-weight:700;font-size:1.05rem;border-bottom:1px solid rgba(255,255,255,.06)}
.gf-brand i{color:var(--gf-primary);font-size:1.3rem}
.gf-logo{height:28px;width:auto}
.gf-nav{flex:1;overflow-y:auto;padding:.75rem .75rem}
.gf-nav a{display:flex;align-items:center;gap:.7rem;padding:.55rem .75rem;border-radius:.5rem;color:var(--gf-sidebar-fg);text-decoration:none;font-size:.9rem;margin-bottom:2px}
.gf-nav a i{width:1.2rem;text-align:center;font-size:1.05rem;opacity:.85}
.gf-nav a:hover{background:rgba(255,255,255,.06);color:#fff}
.gf-nav a.active{background:var(--gf-primary);color:#fff}
.gf-nav-sep{font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;color:#64748b;padding:.9rem .75rem .3rem}
.gf-sidebar-footer{padding:.75rem 1.25rem;border-top:1px solid rgba(255,255,255,.06)}
.gf-main{flex:1;margin-left:var(--gf-sidebar-w);display:flex;flex-direction:column;min-width:0}
.gf-topbar{display:flex;align-items:center;gap:.75rem;padding:.6rem 1.25rem;background:var(--bs-body-bg);border-bottom:1px solid var(--gf-card-border);position:sticky;top:0;z-index:1020}
.gf-content{padding:1.25rem;flex:1}
@media (max-width:991.98px){
  .gf-sidebar{transform:translateX(-100%)}
  .gf-sidebar.show{transform:none;box-shadow:0 0 0 100vw rgba(0,0,0,.4)}
  .gf-main{margin-left:0}
}

/* cards & widgets */
.card{border:1px solid var(--gf-card-border);border-radius:.85rem;box-shadow:0 1px 2px rgba(15,23,42,.04)}
.card-header{background:transparent;border-bottom:1px solid var(--gf-card-border);font-weight:600}
.gf-stat{padding:1rem 1.15rem}
.gf-stat .label{font-size:.75rem;text-transform:uppercase;letter-spacing:.05em;color:var(--bs-secondary-color)}
.gf-stat .value{font-size:clamp(1.05rem,1.3vw,1.45rem);font-weight:700;letter-spacing:-.01em;line-height:1.2;word-break:break-word}
.gf-stat .sub{font-size:.8rem;color:var(--bs-secondary-color)}
.gf-stat .icon{width:42px;height:42px;border-radius:.65rem;display:grid;place-items:center;font-size:1.2rem}
.gf-dot{display:inline-block;width:.6rem;height:.6rem;border-radius:50%}
.gf-cat-icon{width:32px;height:32px;border-radius:.5rem;display:inline-grid;place-items:center;color:#fff;font-size:.95rem}
.gf-amount-income{color:#198754;font-weight:600}
.gf-amount-expense{color:#dc3545;font-weight:600}
.gf-amount-transfer{color:#6c757d;font-weight:600}
.gf-score{width:96px;height:96px;border-radius:50%;display:grid;place-items:center;font-weight:700;font-size:1.6rem;background:conic-gradient(var(--gf-score-color) calc(var(--gf-score)*1%),var(--bs-tertiary-bg) 0)}
.gf-score span{background:var(--bs-body-bg);width:74px;height:74px;border-radius:50%;display:grid;place-items:center}
.table>:not(caption)>*>*{padding:.6rem .75rem}
.table-sm>:not(caption)>*>*{padding:.4rem .5rem}
.table thead th{font-size:.75rem;text-transform:uppercase;letter-spacing:.04em;color:var(--bs-secondary-color);font-weight:600;border-bottom-width:1px}
.gf-page-title{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:1.25rem;flex-wrap:wrap}
.gf-page-title h1{font-size:1.35rem;font-weight:700;margin:0}
.gf-filter{background:var(--bs-body-bg);border:1px solid var(--gf-card-border);border-radius:.75rem;padding:.75rem 1rem;margin-bottom:1rem}
.progress{height:.55rem;border-radius:1rem}
.gf-empty{text-align:center;padding:3rem 1rem;color:var(--bs-secondary-color)}
.gf-empty i{font-size:2.5rem;display:block;margin-bottom:.5rem;opacity:.5}
.gf-alert-item{border-left:4px solid var(--bs-secondary);padding:.6rem .9rem;border-radius:.5rem;background:var(--bs-tertiary-bg);margin-bottom:.5rem}
.gf-alert-item.danger{border-color:#dc3545}.gf-alert-item.warning{border-color:#ffc107}.gf-alert-item.info{border-color:#0dcaf0}.gf-alert-item.success{border-color:#198754}
.gf-timeline .row-ev{display:flex;gap:.75rem;padding:.4rem 0;border-bottom:1px dashed var(--gf-card-border);font-size:.85rem}
.gf-timeline .row-ev .d{width:80px;color:var(--bs-secondary-color);flex:none}
.gf-clickable{cursor:pointer}
.gf-clickable:hover{background:var(--bs-tertiary-bg)}
.gf-chart{position:relative;height:280px}
.gf-chart-sm{position:relative;height:200px}
.gf-toasts{z-index:1080}
.form-label{font-size:.8rem;font-weight:600;color:var(--bs-secondary-color);margin-bottom:.25rem}
.gf-kv{display:flex;justify-content:space-between;gap:1rem;padding:.35rem 0;border-bottom:1px dashed var(--gf-card-border);font-size:.875rem}
.gf-kv:last-child{border-bottom:0}
.gf-settings-nav .nav-link{color:var(--bs-body-color);border-radius:.5rem;padding:.5rem .75rem}
.gf-settings-nav .nav-link.active{background:var(--gf-primary);color:#fff}

/* auth */
.gf-auth{background:linear-gradient(135deg,#0f172a,#1e3a8a);min-height:100vh;display:grid;place-items:center;padding:1rem}
.gf-auth-card{width:100%;max-width:420px;border:0;border-radius:1rem;box-shadow:0 20px 60px rgba(0,0,0,.4)}
@media print{.gf-sidebar,.gf-topbar,.btn,.gf-filter{display:none!important}.gf-main{margin:0}}
.gf-kv-box{background:var(--gf-bg,#f6f7fb);border-radius:.75rem;padding:.65rem .9rem;height:100%}
