/* ============================================================
   HR World — Design System · DARK
   Modern SaaS admin. Shared across all 6 screens.
   Every page links to ../styles.css and copies the shell
   from pages/_shell.html verbatim so the frame is identical.
   ============================================================ */

/* ---------- Design tokens · DARK ---------- */
:root {
  /* BRAND / PRIMARY — indigo lifts on dark; hover LIGHTENS (raised) */
  --primary:      #818cf8;   /* indigo-400 — buttons, links, active */
  --primary-hover:#a5b4fc;   /* indigo-300 — hover goes lighter     */
  --primary-soft: #1e2140;   /* deep indigo wash — active nav/chips  */
  --primary-glow: rgba(129,140,248,.30); /* focus ring / halo        */

  /* SURFACE HIERARCHY (4 levels by luminance; sidebar recedes below page) */
  --sidebar-bg:#080b14;      /* L-1 sidebar — darkest               */
  --bg:      #0a0e1a;        /* L0 page — deep navy, never black     */
  --card:    #121829;        /* L1 raised panel                      */
  --surface: #1a2138;        /* L2 inputs/insets/legends (fixes undefined) */
  --elevated:#212a45;        /* L3 popovers / hovered rows / menus   */
  --card-hover:#1a2138;      /* card & row hover = one step up        */

  /* TEXT HIERARCHY */
  --ink:     #eef2fb;        /* primary — headings, values           */
  --ink-2:   #b7c0d8;        /* secondary — body / table cells       */
  --muted:   #7c88a5;        /* captions, placeholders, meta         */
  --ink-faint:#55607a;       /* disabled / ghost                     */

  /* BORDERS — translucent white, self-adjust to any surface behind */
  --border:       rgba(255,255,255,.08);
  --border-soft:  rgba(255,255,255,.05);
  --border-strong:rgba(255,255,255,.14);

  /* SEMANTIC BASE — jumped one step brighter (-400) to read on navy */
  --success: #34d399;
  --warning: #fbbf24;
  --danger:  #f87171;
  --info:    #38bdf8;

  /* AA TEXT VARIANTS — on dark these go LIGHTER (were dark-for-light) */
  --success-ink: #6ee7b7;
  --danger-ink:  #fca5a5;
  --warning-ink: #fcd34d;
  --info-ink:    #7dd3fc;

  /* SOFT FILLS — alpha tints (pastels look chalky on dark) */
  --success-soft: rgba(52,211,153,.14);
  --warning-soft: rgba(251,191,36,.14);
  --danger-soft:  rgba(248,113,113,.14);
  --info-soft:    rgba(56,189,248,.14);
  --neutral-soft: rgba(255,255,255,.06);

  /* AVATAR PALETTE as tokens — so inline `background:var(--cN)` (roster chips)
     resolves to a solid colour (mirrors the .avatar.cN gradients' lead hue). */
  --c1: #6366f1; --c2: #0ea5e9; --c3: #16a34a; --c4: #f59e0b;
  --c5: #ec4899; --c6: #8b5cf6; --c7: #14b8a6; --c8: #f43f5e;

  /* RADII (unchanged) */
  --radius:    16px;
  /* --radius-lg përdorej te #lgKpis pa ekzistuar, pra rrezja binte në 0 dhe ai bllok
     kishte qoshe katrore mes kartash të rrumbullakosura. E njëjta vlerë si fleta e
     navigimit, që sipërfaqet e mëdha të kenë një rreze të vetme. */
  --radius-lg: 20px;
  --radius-sm: 10px;
  /* 8px përdorej 62 herë nga .btn-icon si numër magjik. Nuk e zhvendos në 10px —
     ai buton është i vogël dhe 10px e bën të duket i fryrë — por i jap emër. */
  --radius-xs: 8px;
  --radius-pill: 999px;

  /* SHADOWS — real black alpha for depth + indigo glow accent */
  --shadow:    0 1px 3px rgba(0,0,0,.45);
  --shadow-md: 0 6px 20px rgba(0,0,0,.50);
  --shadow-lg: 0 18px 44px rgba(0,0,0,.60);
  --shadow-glow: 0 4px 18px rgba(129,140,248,.35);
  --shadow-inset: inset 0 1px 0 rgba(255,255,255,.04); /* top light edge */

  /* 8px spacing scale (unchanged) */
  --s1: 8px;  --s2: 16px; --s3: 24px; --s4: 32px; --s5: 40px; --s6: 48px;
  /* Hapësira e imët për brendinë e komponentëve — rrjeti 8px është shumë i trashë
     brenda një karte, dhe pa këto çdo rregull shkruante 4/6/12px me dorë. */
  --s0: 4px;  --s1h: 12px; --s2h: 20px;

  /* ===== SHKALLA E TIPOGRAFISË =====================================
     Auditimi numëroi 17 madhësi të ndryshme teksti në dhjetë faqe —
     12, 15, 11, 14, 14.5, 10.5, 13, 11.5, 19, 24, 22, 20, 30, 26, 18, 10
     dhe një 13.3333px që ishte thjesht parazgjedhja e shfletuesit që kalonte
     pa u prekur. Kjo nuk është shkallë, është grumbullim: asnjë prej tyre
     s'e dinte për tjetrën.

     Tokenët janë vendosur te vlerat që aplikacioni PËRDOR TASHMË më shumë —
     12px×38, 13px×25, 14px×19 — jo te një shkallë e bukur teorike. Një shkallë
     "e pastër" do të zhvendoste qindra rregulla me 1–2px dhe do të prishte gjëra
     që sapo u rregulluan; qëllimi këtu është t'i japë emër asaj që ekziston dhe
     të heqë dyfishimet, jo të rilyejë faqet.                                    */
  --t-micro:   11px;    /* meta, nën-rreshta — thith 10, 10.5, 11.5 */
  --t-label:   12px;    /* etiketa fushash dhe kartash              */
  --t-small:   13px;    /* tekst dytësor                            */
  --t-body:    14px;    /* teksti kryesor — thith 14.5              */
  --t-lead:    15px;    /* butonat, tekst i theksuar                */
  /* 16px, jo 15: nën 16px iOS-i e zmadhon faqen sapo fokusohet një fushë. Ky
     token ekziston veç pikërisht që një "pastrim" i ardhshëm i tipografisë të
     mos e ulë dhe ta rikthejë atë sjellje. */
  --t-input:   16px;
  --t-title:   17px;    /* titulli i kartës — thith 18              */
  --t-section: 20px;    /* titulli i seksionit — thith 19           */
  --t-display: 22px;    /* shifra KPI                               */
  --t-display-lg: 26px; /* hero i madh                              */

  /* ===== PREKJA =====================================================
     44px është minimumi i rekomanduar; auditimi gjeti 36 inpute bonusi
     38px, çipa 36px dhe një çelës 30px. Dy hapa: veprim dhe dytësor.  */
  --tap:    44px;
  --tap-sm: 40px;

  /* Layout (unchanged) */
  --sidebar-w: 240px;
  --topbar-h:  64px;
  --content-max: 1200px;

  --font: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
          Helvetica, Arial, sans-serif;
}

/* ---------- Reset / base ---------- */
* { box-sizing: border-box; }
html, body { height: 100%; }
body {
  margin: 0;
  font-family: var(--font);
  background: var(--bg);
  color: var(--ink);
  font-size: var(--t-body);
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
a { color: inherit; text-decoration: none; }
h1, h2, h3, h4, p { margin: 0; }
button { font-family: inherit; cursor: pointer; }
img { max-width: 100%; display: block; }
::selection { background: #3730a3; color: var(--ink); }

/* Numbers align nicely in tables / KPIs */
.tnum { font-variant-numeric: tabular-nums; }

/* ============================================================
   APP SHELL
   ============================================================ */
.app { min-height: 100%; }

/* ---------- Sidebar (desktop) ---------- */
.sidebar {
  position: fixed;
  inset: 0 auto 0 0;
  width: var(--sidebar-w);
  background: var(--sidebar-bg);
  border-right: 1px solid var(--border);
  display: flex;
  flex-direction: column;
  padding: var(--s3) var(--s2);
  z-index: 60;
  /* Lista kishte `overflow: visible`: kur 11 zërat nuk nxinin, "Cilësimet" thjesht pritej
     jashtë ekranit pa asnjë mënyrë për ta arritur. Matur: pragu ishte ~591px lartësi dritareje
     me zërat 41px, dhe ngritja në 44px e çon në 624px — pra unë e afrova. Rrëshqitja e heq
     pragun fare: në 1280x560 "Cilësimet" arrihet, ndërsa më parë as nuk kapej me elementFromPoint. */
  overflow-y: auto;
  overscroll-behavior: contain;
}
.sidebar::-webkit-scrollbar { width: 8px; }
.sidebar::-webkit-scrollbar-thumb { background: var(--border); border-radius: var(--radius-pill); }
.brand {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 0 var(--s1) var(--s2);
  margin-bottom: var(--s2);
}
/* Shenja e vërtetë, pa pllakë. Gradienti me shkronjat "HR" ishte vendmbajtëse;
   një shenjë e mbyllur në katror me ngjyrë duket si ngjitëse, ndërsa e zhveshur
   mbi sfondin e shiritit duket markë. Edhe më e vogël se më parë — vetë figura
   ka 12% hapësirë brenda saj, pra lexohet më e qetë se 34px-shi i mëparshëm. */
.brand-logo {
  width: 30px; height: 30px;
  display: grid; place-items: center;
  flex: none;
}
.brand-logo img { display: block; width: 100%; height: 100%; object-fit: contain; }
.brand-name {
  font-weight: 800; font-size: var(--t-title); letter-spacing: -.2px;
  color: var(--ink);
}
.brand-name span { color: var(--primary); }

.nav { display: flex; flex-direction: column; gap: 4px; }
.nav-label {
  font-size: var(--t-micro); font-weight: 700; letter-spacing: .06em;
  text-transform: uppercase; color: var(--muted);
  padding: var(--s2) var(--s1) 6px;
}
.nav-item {
  display: flex; align-items: center; gap: 12px;
  /* Matur 227x41 në telefon dhe 207x41 në desktop: nën masë te i vetmi komponent që
     preket në ÇDO faqe. 44px i shton listës me 10 zëra ~30px — e rimata te 1280x900
     se .nav-bottom ("Cilësimet") mbetet brenda ekranit pa rrëshqitje. */
  min-height: var(--tap);
  padding: 10px var(--s1) 10px 12px;
  border-radius: var(--radius-sm);
  color: var(--muted);
  font-weight: 600; font-size: var(--t-body);
  transition: background .15s, color .15s;
  position: relative;
}
.nav-item svg { width: 20px; height: 20px; flex: none; }
.nav-item:hover { background: var(--neutral-soft); color: var(--ink); }
.nav-item.active {
  background: var(--primary-soft);
  color: var(--primary);
}
.nav-item.active::before {
  content: ""; position: absolute; left: -16px;
  top: 8px; bottom: 8px; width: 3px;
  border-radius: 0 3px 3px 0; background: var(--primary);
}
.nav-item .nav-count {
  margin-left: auto;
  font-size: var(--t-micro); font-weight: 700;
  background: var(--neutral-soft); color: var(--muted);
  padding: 2px 8px; border-radius: var(--radius-pill);
}
.nav-item.active .nav-count { background: var(--primary-soft); color: var(--primary); }

.nav-bottom { margin-top: auto; padding-top: var(--s2); }

/* ---------- Top bar ---------- */
.main {
  margin-left: var(--sidebar-w);
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}
.topbar {
  position: sticky; top: 0;
  height: var(--topbar-h);
  background: rgba(10, 14, 26, .82);
  backdrop-filter: saturate(160%) blur(12px);
  border-bottom: 1px solid var(--border);
  display: flex; align-items: center; gap: var(--s2);
  padding: 0 var(--s4);
  z-index: 50;
}
.topbar .page-title { margin-right: auto; }
.hamburger {
  display: none;
  /* 40x40 — dhe ky është butoni që hap gjithë navigimin në telefon.
     `flex: none` sepse .topbar është flex: pa të, butoni tkurrej nga titulli i faqes
     dhe matej 34px i gjerë te Transaksionet në 320px, edhe pasi u caktua 44px. */
  flex: none; width: var(--tap); height: var(--tap);
  border: 1px solid var(--border); background: var(--elevated);
  border-radius: var(--radius-sm);
  place-items: center;
}
.hamburger svg { width: 20px; height: 20px; color: var(--ink); }

/* .searchbox dhe .field-search janë i njëjti komponent me dy emra. Trupi mbetet i
   ndarë sepse njëri rri në shiritin lart me gjerësi fikse, tjetri brenda përmbajtjes —
   por prekja tani matet njësoj: inputi e mbush fushën, jo 19px në mes të saj.
   Padding-u vertikal bie në 0 pikërisht që kjo të mos e nxjerrë 46px-shin mbi
   shiritin 64px të lartë: 44px input + 2px kornizë = 46px. */
.searchbox {
  display: flex; align-items: center; gap: 8px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  padding: 0 14px;
  width: 260px;
  color: var(--muted);
  transition: border-color .15s, box-shadow .15s;
}
.searchbox:focus-within {
  border-color: var(--primary);
  box-shadow: 0 0 0 3px var(--primary-glow);
}
.searchbox svg { width: 16px; height: 16px; flex: none; }
.searchbox input {
  border: 0; outline: 0; background: transparent;
  font-size: var(--t-body); color: var(--ink); width: 100%;
  /* Matur 206x19: prekja pranë buzëve binte mbi mbështjellësin, jo mbi inputin —
     e njëjta ndreqje që .field-search input e ka tashmë. */
  align-self: stretch; min-height: var(--tap);
}
.searchbox input::placeholder { color: var(--ink-faint); }

.icon-btn {
  position: relative;
  /* "Dil" ishte 40x40 në të 13 faqet. `flex: none` për të njëjtën arsye si te .hamburger. */
  flex: none; width: var(--tap); height: var(--tap);
  display: grid; place-items: center;
  border: 1px solid var(--border); background: var(--elevated);
  border-radius: var(--radius-sm);
  color: var(--ink);
  transition: background .15s;
}
.icon-btn:hover { background: var(--surface); border-color: var(--border-strong); color: var(--ink); }
.icon-btn svg { width: 20px; height: 20px; }
/* .icon-btn .dot removed with the notification bell — nothing renders it now. */

.user {
  display: flex; align-items: center; gap: 10px;
  padding-left: var(--s1);
}
.user-meta { line-height: 1.2; }
.user-name { font-weight: 700; font-size: var(--t-small); }
.user-role { font-size: var(--t-label); color: var(--muted); }

/* ---------- Content area ---------- */
.content {
  flex: 1;
  padding: var(--s4);
  max-width: var(--content-max);
  width: 100%;
  margin: 0 auto;
}

/* ---------- Bottom nav (mobile only) ---------- */
.bottomnav { display: none; }

/* ============================================================
   TYPOGRAPHY / HEADERS
   ============================================================ */
/* min-width:0 sepse .topbar është flex dhe titulli ka `margin-right:auto`: pa këtë ai
   nuk lëshon dot hapësirë dhe i tkurr butonat 44px përreth në 320px. Tani pritet vetë. */
.page-title {
  font-size: var(--t-section); font-weight: 800; letter-spacing: -.3px;
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

.page-head {
  display: flex; align-items: flex-end; justify-content: space-between;
  gap: var(--s2); flex-wrap: wrap;
  margin-bottom: var(--s3);
}
.welcome h1 {
  font-size: var(--t-display-lg); font-weight: 800; letter-spacing: -.5px;
  margin-bottom: 4px;
}
.welcome h1 .wave { display: inline-block; }
.welcome p { color: var(--muted); font-size: var(--t-body); }

.section-head {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: var(--s2);
}
.section-title { font-size: var(--t-input); font-weight: 700; }
.section-link { color: var(--primary); font-weight: 600; font-size: var(--t-small); }
.section-link:hover { color: var(--primary-hover); }

.eyebrow {
  font-size: var(--t-label); font-weight: 700; letter-spacing: .04em;
  text-transform: uppercase; color: var(--muted);
}

/* ============================================================
   LAYOUT HELPERS
   ============================================================ */
.grid { display: grid; gap: var(--s3); }
.kpi-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--s2);
  margin-bottom: var(--s3);
}
.cols-2 { display: grid; grid-template-columns: 2fr 1fr; gap: var(--s3); }
.cols-2e { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s3); }
.cols-3 { display: grid; grid-template-columns: 1.4fr 1fr 1fr; gap: var(--s3); }
.stack { display: flex; flex-direction: column; gap: var(--s3); }
.row { display: flex; align-items: center; gap: var(--s2); }
.spread { display: flex; align-items: center; justify-content: space-between; gap: var(--s2); }

/* ============================================================
   CARD
   ============================================================ */
.card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  padding: var(--s3);
}
.card.tight { padding: var(--s2); }
.card-head {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--s2); margin-bottom: var(--s3);
}
.card-title { font-size: var(--t-lead); font-weight: 700; }
.card-sub { font-size: var(--t-small); color: var(--muted); margin-top: 2px; }

/* ============================================================
   KPI TILE
   ============================================================ */
.kpi { position: relative; }
.kpi-top {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: 14px;
}
.kpi-ico {
  width: 40px; height: 40px; border-radius: 12px;
  display: grid; place-items: center;
  background: var(--primary-soft); color: var(--primary);
}
.kpi-ico svg { width: 20px; height: 20px; }
.kpi-ico.green { background: var(--success-soft); color: var(--success-ink); }
.kpi-ico.amber { background: var(--warning-soft); color: var(--warning-ink); }
.kpi-ico.red   { background: var(--danger-soft);  color: var(--danger-ink); }
.kpi-ico.blue  { background: var(--info-soft);    color: var(--info-ink); }

.kpi-value {
  font-size: 28px; font-weight: 800; letter-spacing: -.6px;
  line-height: 1.1;
}
.kpi-value small { font-size: var(--t-input); font-weight: 700; color: var(--muted); }
.kpi-label { color: var(--muted); font-size: var(--t-small); margin-top: 4px; font-weight: 500; }

/* trend chip up/down */
.trend {
  display: inline-flex; align-items: center; gap: 4px;
  font-size: var(--t-label); font-weight: 700;
  padding: 3px 8px; border-radius: var(--radius-pill);
}
.trend svg { width: 13px; height: 13px; }
.trend.up   { color: var(--success-ink); background: var(--success-soft); }
.trend.down { color: var(--danger-ink);  background: var(--danger-soft); }
.trend.flat { color: var(--muted);   background: var(--neutral-soft); }

/* ============================================================
   BUTTONS
   ============================================================ */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  /* `height` e jo `min-height`: kjo ishte 40px e fiksuar, pra çdo rregull tjetër me
     min-height (edhe ai i faqes) e humbte pa dukur — matur 164x40 te "Shto përdorues"
     dhe 121x40 te "Eksporto". Kush do një buton më të vogël e thotë me .btn-sm. */
  height: var(--tap); padding: 0 16px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border);
  background: var(--elevated); color: var(--ink);
  font-weight: 600; font-size: var(--t-body);
  transition: background .15s, border-color .15s, box-shadow .15s, transform .05s;
  white-space: nowrap;
}
.btn svg { width: 18px; height: 18px; }
.btn:hover { background: var(--surface); border-color: var(--border-strong); }
.btn:active { transform: translateY(1px); }
.btn-primary {
  background: linear-gradient(135deg, #6366f1, #4f46e5);
  border: 1px solid #6366f1; color: #fff;
  box-shadow: var(--shadow-glow), inset 0 1px 0 rgba(255,255,255,.18);
}
.btn-primary:hover {
  background: linear-gradient(135deg, #7c83ff, #5b52f0);
  border-color: var(--primary-hover);
  box-shadow: 0 6px 24px var(--primary-glow), 0 0 0 3px rgba(99,102,241,.22), inset 0 1px 0 rgba(255,255,255,.22);
}
.btn-ghost { background: transparent; border: 1px solid var(--border); color: var(--muted); }
.btn-ghost:hover { background: var(--neutral-soft); border-color: var(--border-strong); color: var(--ink); }
.btn-danger { background: var(--danger-soft); border: 1px solid rgba(248,113,113,.35); color: var(--danger-ink); }
.btn-danger:hover { background: linear-gradient(135deg,#ef4444,#dc2626); border-color:#ef4444; color:#fff; }
.btn-success { background: var(--success-soft); border: 1px solid rgba(52,211,153,.35); color: var(--success-ink); }
.btn-success:hover { background: linear-gradient(135deg,#22c55e,#16a34a); border-color:#22c55e; color:#fff; }
.btn-sm { height: 32px; padding: 0 12px; font-size: var(--t-small); border-radius: 8px; }
.btn-block { width: 100%; }

/* ============================================================
   TABLE
   ============================================================ */
.table-wrap { width: 100%; overflow-x: auto; }
.table { width: 100%; border-collapse: collapse; font-size: var(--t-body); }
.table thead th {
  text-align: left;
  font-size: var(--t-label); font-weight: 700; letter-spacing: .03em;
  text-transform: uppercase; color: var(--muted);
  padding: 0 var(--s2) 12px;
  border-bottom: 1px solid var(--border);
  white-space: nowrap;
}
.table tbody td {
  padding: 14px var(--s2);
  border-bottom: 1px solid var(--border);
  vertical-align: middle;
  color: var(--ink-2);
}
.table tbody tr:last-child td { border-bottom: 0; }
.table tbody tr { transition: background .12s, box-shadow .12s; }
.table tbody tr:hover { background: rgba(129,140,248,.07); box-shadow: inset 3px 0 0 var(--primary); }
.table .num { text-align: right; font-variant-numeric: tabular-nums; }
.table .strong { font-weight: 700; color: var(--ink); }

.person { display: flex; align-items: center; gap: 12px; }
.person-name { font-weight: 600; color: var(--ink); }
.person-sub { font-size: var(--t-label); color: var(--muted); }

/* ============================================================
   BADGES
   ============================================================ */
.badge {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: var(--t-label); font-weight: 600;
  padding: 4px 10px; border-radius: var(--radius-pill);
  background: var(--neutral-soft); color: var(--muted);
  white-space: nowrap;
}
.badge::before {
  content: ""; width: 6px; height: 6px; border-radius: 50%;
  background: currentColor; opacity: .9;
}
.badge.success { background: var(--success-soft); color: var(--success-ink); }
.badge.warning { background: var(--warning-soft); color: var(--warning-ink); }
.badge.danger  { background: var(--danger-soft);  color: var(--danger-ink); }
.badge.info    { background: var(--info-soft);     color: var(--info-ink); }
.badge.neutral { background: var(--neutral-soft);  color: var(--muted); }
.badge.plain::before { display: none; }

/* ============================================================
   AVATAR
   ============================================================ */
.avatar {
  width: 38px; height: 38px; border-radius: 50%;
  display: grid; place-items: center;
  font-weight: 700; font-size: var(--t-small); color: #fff;
  background: var(--primary);
  flex: none; user-select: none;
}
.avatar.sm { width: 30px; height: 30px; font-size: var(--t-micro); }
.avatar.lg { width: 48px; height: 48px; font-size: var(--t-input); }
/* deterministic palette variants (assign per person) */
.avatar.c1 { background: linear-gradient(135deg,#6366f1,#4f46e5); }
.avatar.c2 { background: linear-gradient(135deg,#0ea5e9,#0369a1); }
.avatar.c3 { background: linear-gradient(135deg,#16a34a,#15803d); }
.avatar.c4 { background: linear-gradient(135deg,#f59e0b,#d97706); }
.avatar.c5 { background: linear-gradient(135deg,#ec4899,#be185d); }
.avatar.c6 { background: linear-gradient(135deg,#8b5cf6,#6d28d9); }
.avatar.c7 { background: linear-gradient(135deg,#14b8a6,#0f766e); }
.avatar.c8 { background: linear-gradient(135deg,#f43f5e,#be123c); }

.avatar-stack { display: flex; }
.avatar-stack .avatar { border: 2px solid var(--card); margin-left: -10px; }
.avatar-stack .avatar:first-child { margin-left: 0; }
.avatar-stack .more {
  width: 38px; height: 38px; border-radius: 50%;
  display: grid; place-items: center;
  background: var(--neutral-soft); color: var(--muted);
  font-weight: 700; font-size: var(--t-label);
  border: 2px solid var(--card); margin-left: -10px;
}

/* ============================================================
   PROGRESS BAR
   ============================================================ */
.progress {
  height: 8px; border-radius: var(--radius-pill);
  background: rgba(255,255,255,.06); overflow: hidden; width: 100%;
  box-shadow: inset 0 1px 2px rgba(0,0,0,.4);
}
.progress > span {
  display: block; height: 100%; border-radius: inherit;
  background: linear-gradient(90deg,#818cf8,#6366f1);
  transition: width .4s ease;
}
.progress.green > span { background: linear-gradient(90deg,#4ade80,#22c55e); }
.progress.amber > span { background: linear-gradient(90deg,#fbbf24,#f59e0b); }
.progress.red   > span { background: linear-gradient(90deg,#f87171,#ef4444); }
.progress.thin { height: 6px; }

/* ============================================================
   CHART — pure CSS vertical bars
   ============================================================ */
.chart-bars {
  display: flex; align-items: flex-end; justify-content: space-between;
  gap: var(--s2); height: 200px;
  padding-top: var(--s2);
}
.chart-bars .bar-col {
  flex: 1;
  display: flex; flex-direction: column; align-items: center; gap: 10px;
  height: 100%;
  justify-content: flex-end;
}
.chart-bars .bar-track {
  width: 100%;
  display: flex; align-items: flex-end; justify-content: center;
  flex: 1;
}
.chart-bars .bar {
  width: 60%; max-width: 34px;
  border-radius: 8px 8px 4px 4px;
  background: linear-gradient(180deg, #818cf8, #4f46e5);
  position: relative;
  transition: filter .15s;
  min-height: 6px;
}
.chart-bars .bar:hover { filter: brightness(1.08); }
.chart-bars .bar.muted { background: linear-gradient(180deg,#334155,#1e293b); }
.chart-bars .bar-val {
  position: absolute; top: -20px; left: 50%; transform: translateX(-50%);
  font-size: var(--t-micro); font-weight: 700; color: var(--ink); white-space: nowrap;
}
.chart-bars .bar-label { font-size: var(--t-label); color: var(--muted); font-weight: 600; }

.chart-legend {
  display: flex; gap: var(--s3); flex-wrap: wrap;
  margin-top: var(--s2);
}
.legend-item { display: flex; align-items: center; gap: 8px; font-size: var(--t-small); color: var(--muted); }
.legend-dot { width: 10px; height: 10px; border-radius: 3px; background: var(--primary); }
.legend-dot.muted { background: #475569; }
.legend-dot.green { background: var(--success); }
.legend-dot.red   { background: var(--danger); }

/* ============================================================
   CHIP (filter / tag pills)
   ============================================================ */
.chip {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 6px 12px;
  border-radius: var(--radius-pill);
  border: 1px solid var(--border);
  background: var(--surface); color: var(--muted);
  font-size: var(--t-small); font-weight: 600;
  transition: all .15s;
}
.chip:hover { border-color: var(--border-strong); color: var(--ink); }
.chip.active { background: var(--primary); border-color: var(--primary); color: #fff; }
.chip svg { width: 15px; height: 15px; }

/* ============================================================
   LISTS — activity / performers / alerts
   ============================================================ */
.list { display: flex; flex-direction: column; }
.list-item {
  display: flex; align-items: center; gap: 12px;
  padding: 12px 0;
  border-bottom: 1px solid var(--border);
}
.list-item:first-child { padding-top: 0; }
.list-item:last-child { border-bottom: 0; padding-bottom: 0; }
.list-item .li-body { flex: 1; min-width: 0; }
.list-item .li-title { font-weight: 600; font-size: var(--t-body); color: var(--ink); }
.list-item .li-sub { font-size: var(--t-label); color: var(--muted); margin-top: 2px; }
.list-item .li-time { font-size: var(--t-label); color: var(--muted); white-space: nowrap; }

/* small round icon token for activity feed */
.li-ico {
  width: 34px; height: 34px; border-radius: 10px; flex: none;
  display: grid; place-items: center;
  background: var(--primary-soft); color: var(--primary);
}
.li-ico svg { width: 17px; height: 17px; }
.li-ico.green { background: var(--success-soft); color: var(--success-ink); }
.li-ico.amber { background: var(--warning-soft); color: var(--warning-ink); }
.li-ico.red   { background: var(--danger-soft);  color: var(--danger-ink); }
.li-ico.blue  { background: var(--info-soft);     color: var(--info-ink); }

/* .rank / .score lived here for the Performance leaderboard — page removed, rules removed with it. */

/* money in/out mini summary */
.money-row {
  display: flex; align-items: center; justify-content: space-between;
  padding: 14px 0; border-bottom: 1px solid var(--border);
}
.money-row:last-of-type { border-bottom: 0; }
.money-left { display: flex; align-items: center; gap: 12px; }
.money-amount { font-weight: 800; font-size: var(--t-input); font-variant-numeric: tabular-nums; }
.money-amount.pos { color: var(--success-ink); }
.money-amount.neg { color: var(--danger-ink); }
.money-net {
  margin-top: var(--s2); padding-top: var(--s2);
  border-top: 2px solid var(--border);
  display: flex; align-items: center; justify-content: space-between;
}
.money-net .label { font-weight: 700; color: var(--ink); }
.money-net .val { font-size: var(--t-display); font-weight: 800; color: var(--ink); font-variant-numeric: tabular-nums; }

/* alert / reminder card */
.alert-item {
  display: flex; gap: 12px; align-items: flex-start;
  padding: 12px; border-radius: var(--radius-sm);
  background: var(--surface);
  border: 1px solid var(--border);
}
.alert-item + .alert-item { margin-top: 10px; }
.alert-item .li-ico { width: 32px; height: 32px; }
.alert-item .a-title { font-weight: 600; font-size: var(--t-body); }
.alert-item .a-sub { font-size: var(--t-label); color: var(--muted); margin-top: 2px; }

/* generic helpers */
.muted { color: var(--muted); }
.mt1 { margin-top: var(--s1); } .mt2 { margin-top: var(--s2); } .mt3 { margin-top: var(--s3); }
.mb0 { margin-bottom: 0; } .mb2 { margin-bottom: var(--s2); } .mb3 { margin-bottom: var(--s3); }
.dot-sep { color: var(--border-strong); padding: 0 6px; }
.right { margin-left: auto; }
.text-success { color: var(--success-ink); } .text-danger { color: var(--danger-ink); } .text-warn { color: var(--warning-ink); }
.divider { height: 1px; background: var(--border); border: 0; margin: var(--s2) 0; }

/* ============================================================
   PAYROLL — month selector, payslip preview, table footer
   (added by Payroll screen; reuses existing tokens only)
   ============================================================ */
/* month stepper (‹ July 2026 ›) */
.month-select {
  display: inline-flex; align-items: center;
  border: 1px solid var(--border);
  background: var(--elevated);
  border-radius: var(--radius-sm);
  overflow: hidden;
  height: 40px;
}
/* 38px në desktop kundrejt 44px te shiriti i Prezencës: i njëjti kontroll, dy përmasa.
   Fiton 44 — është shigjeta që ndërron muajin te Pagat, Bonuset, Shpenzimet e Depozitat. */
.month-arrow {
  width: var(--tap); height: 100%; min-height: var(--tap);
  display: grid; place-items: center;
  border: 0; background: transparent; color: var(--muted);
  transition: background .15s, color .15s;
}
.month-arrow:hover { background: var(--primary-soft); color: var(--primary); }
.month-arrow svg { width: 18px; height: 18px; }
.month-label {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 0 14px; height: 100%;
  font-weight: 700; font-size: var(--t-body); color: var(--ink);
  white-space: nowrap;
  border-left: 1px solid var(--border);
  border-right: 1px solid var(--border);
}
.month-label svg { width: 16px; height: 16px; color: var(--primary); }

/* table footer total row */
.table tfoot td {
  padding: 16px var(--s2);
  border-top: 2px solid var(--border);
  font-variant-numeric: tabular-nums;
  background: var(--surface);
}
.table tfoot .strong { font-weight: 800; }

/* payslip card */
.payslip-head { display: flex; align-items: center; gap: 14px; }
.payslip-name { font-size: var(--t-title); font-weight: 800; letter-spacing: -.2px; }
.payslip-role { font-size: var(--t-small); color: var(--ink); }
.payslip-role.muted { color: var(--muted); font-size: var(--t-label); margin-top: 2px; }

.pay-line {
  display: flex; align-items: center; justify-content: space-between;
  padding: 9px 0; font-size: var(--t-body);
}
.pay-line > span:first-child { color: var(--muted); }
.pay-line > span:last-child { font-weight: 600; color: var(--ink); }
.pay-line.subtotal {
  margin-top: 4px; padding-top: 12px;
  border-top: 1px dashed var(--border);
}
.pay-line.subtotal > span { color: var(--ink); font-weight: 700; }

.payslip-net {
  margin-top: var(--s2);
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--s2);
  padding: 16px 18px;
  border-radius: var(--radius-sm);
  background: var(--primary-soft);
  border: 1px solid rgba(129,140,248,.20);
}
.pn-label { font-size: var(--t-small); font-weight: 700; color: var(--primary); }
.pn-sub { font-size: var(--t-label); color: var(--muted); margin-top: 2px; }
.pn-value {
  font-size: var(--t-display-lg); font-weight: 800; letter-spacing: -.5px;
  color: var(--primary); font-variant-numeric: tabular-nums;
}

/* ============================================================
   RESPONSIVE — tablet
   ============================================================ */
@media (max-width: 1100px) {
  .kpi-grid { grid-template-columns: repeat(2, 1fr); }
  .cols-2, .cols-2e { grid-template-columns: 1fr; }
  .cols-3 { grid-template-columns: 1fr 1fr; }
  .searchbox { width: 180px; }
}

/* ============================================================
   RESPONSIVE — mobile (≤900px)
   sidebar → off-canvas drawer; bottom tab bar appears
   ============================================================ */
@media (max-width: 900px) {
  /* sidebar becomes a slide-in drawer toggled by hamburger */
  .sidebar {
    transform: translateX(-100%);
    transition: transform .25s ease;
    box-shadow: var(--shadow-lg);
    width: 260px;
  }
  body.nav-open .sidebar { transform: translateX(0); }

  .scrim {
    position: fixed; inset: 0; background: rgba(0,0,0,.6);
    opacity: 0; pointer-events: none; transition: opacity .25s; z-index: 55;
  }
  body.nav-open .scrim { opacity: 1; pointer-events: auto; }

  .main { margin-left: 0; }
  .hamburger { display: grid; }
  .searchbox { display: none; }

  .topbar { padding: 0 var(--s2); height: 60px; }
  /* Hapësira 16px midis katër zërave hante 48px nga një shirit 320px. Pasi hamburgeri
     dhe "Dil" u ngritën në 44px e nuk tkurren më, ajo hapësirë e paguan titulli: matur,
     "Transaksionet" donte 138px dhe kishte 106px, pra pritej. Me 8px hapësirë dhe
     titullin te --t-title, i plotë hyn edhe në 320px — u rimat. */
  .topbar { gap: var(--s1); }
  .topbar .page-title { font-size: var(--t-title); }
  .content {
    padding: var(--s2);
    padding-bottom: calc(72px + var(--s3)); /* clear bottom nav */
  }

  .kpi-grid { grid-template-columns: repeat(2, 1fr); gap: var(--s1); }
  .kpi { padding: var(--s2); }
  .kpi-value { font-size: 24px; }

  /* every multi-column layout collapses to one column */
  .cols-2, .cols-2e, .cols-3 { grid-template-columns: 1fr; gap: var(--s2); }

  .welcome h1 { font-size: var(--t-display); }

  /* hide the desktop user meta text on small screens, keep avatar */
  .user-meta { display: none; }

  /* bottom nav */
  .bottomnav {
    display: flex;
    position: fixed; left: 0; right: 0; bottom: 0;
    height: 64px;
    background: rgba(10,14,26,.92);
    backdrop-filter: saturate(180%) blur(12px);
    border-top: 1px solid var(--border);
    z-index: 60;
    padding: 0 4px;
    box-shadow: 0 -2px 12px rgba(0,0,0,.5);
  }
  .bottomnav a, .bottomnav .nav-more {
    flex: 1;
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 3px;
    color: var(--muted);
    font-size: var(--t-micro); font-weight: 600;
    padding: 8px 0;
    position: relative;
  }
  .bottomnav a svg, .bottomnav .nav-more svg { width: 22px; height: 22px; }
  .bottomnav a.active, .bottomnav .nav-more.active { color: var(--primary); }
  .bottomnav a.active::before, .bottomnav .nav-more.active::before {
    content: ""; position: absolute; top: 0; left: 50%; transform: translateX(-50%);
    width: 28px; height: 3px; border-radius: 0 0 3px 3px; background: var(--primary);
  }
}

/* very small phones (≤400px): single column KPIs stay 2-up but tighten */
@media (max-width: 380px) {
  .content { padding: 12px; padding-bottom: calc(72px + var(--s2)); }
  .card { padding: var(--s2); }
  .chart-bars { gap: 6px; }
  .kpi-value { font-size: var(--t-display); }
  /* Filter chips — shrink long labels so toolbar fits in one screen */
  .toolbar .chips .chip,
  .chips .chip {
    max-width: 100px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    display: inline-block;
    vertical-align: middle;
  }
}

/* ---------- Payroll: header controls wrap neatly on mobile ---------- */
@media (max-width: 900px) {
  /* the month selector + export/run buttons stack full-width, no overflow */
  .page-head > .row { width: 100%; flex-wrap: wrap; gap: var(--s1); }
  .page-head .month-select { flex: 1 1 100%; justify-content: space-between; }
  .page-head .month-select .month-label { flex: 1; justify-content: center; }
  .page-head > .row > .btn { flex: 1; }
  /* keep the payslip net value readable when it sits full-width */
  .payslip-net { padding: 14px; }
}

/* Grid children must be allowed to shrink below content width so an inner
   .table-wrap (overflow-x:auto) scrolls internally instead of widening the
   page — prevents any horizontal page scroll at 390px. */
.cols-2 > *, .cols-2e > *, .cols-3 > * { min-width: 0; }

/* ============================================================
   TOOLBAR — search + filter chips + actions above a table
   (reusable: Employees / Payroll / Attendance list screens)
   ============================================================ */
.toolbar {
  display: flex; align-items: center; gap: var(--s2);
  flex-wrap: wrap; margin-bottom: var(--s3);
}
.toolbar .chips { display: flex; gap: 8px; flex-wrap: wrap; }
.toolbar .toolbar-right { margin-left: auto; display: flex; gap: 8px; }

/* a search field that lives inside content (not the topbar) */
.field-search {
  display: flex; align-items: center; gap: 8px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  padding: 8px 14px; min-width: 220px;
  color: var(--muted);
  transition: border-color .15s, box-shadow .15s;
}
.field-search:focus-within { border-color: var(--primary); box-shadow: 0 0 0 3px var(--primary-glow); }
.field-search svg { width: 16px; height: 16px; flex: none; }
.field-search input {
  border: 0; outline: 0; background: transparent; color: var(--ink); width: 100%;
  font-size: var(--t-body);
  /* Inputi ishte 20px i lartë brenda një fushe 48px: prekja pranë buzëve binte mbi
     mbështjellësin e jo mbi inputin. Tani e mbush fushën, pra çdo pikë e saj fokuson. */
  align-self: stretch; min-height: var(--tap);
}
.field-search input::placeholder { color: var(--ink-faint); }

/* ============================================================
   FORM — labelled inputs in a responsive grid
   (reusable: register worker, settings, edit record)
   ============================================================ */
.form-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--s2) var(--s3);
}
.form-grid .col-2 { grid-column: 1 / -1; }
.field { display: flex; flex-direction: column; gap: 6px; }
.field > label {
  font-size: var(--t-label); font-weight: 700; color: var(--ink-2);
  display: flex; align-items: center; gap: 6px;
}
.field .hint { font-size: var(--t-label); color: var(--muted); font-weight: 500; }
.input, .select {
  height: 42px; padding: 0 12px;
  border: 1px solid var(--border); border-radius: var(--radius-sm);
  background: #0e1424; color: var(--ink);
  font-family: inherit; font-size: var(--t-body); width: 100%;
  box-shadow: inset 0 1px 2px rgba(0,0,0,.3);
  transition: border-color .15s, box-shadow .15s;
}
.input:focus, .select:focus {
  outline: 0; border-color: var(--primary); background: var(--card);
  box-shadow: 0 0 0 3px var(--primary-glow);
}
.input::placeholder { color: var(--ink-faint); }
.select {
  appearance: none;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%237c88a5' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>");
  background-repeat: no-repeat; background-position: right 12px center;
  padding-right: 34px; cursor: pointer;
}
.input-prefix { position: relative; }
.input-prefix > span {
  position: absolute; left: 12px; top: 50%; transform: translateY(-50%);
  color: var(--muted); font-weight: 600; pointer-events: none;
}
.input-prefix .input { padding-left: 26px; }
.form-actions {
  display: flex; align-items: center; gap: 10px;
  margin-top: var(--s3); padding-top: var(--s3);
  border-top: 1px solid var(--border);
}
.form-actions .spacer { margin-left: auto; }

/* reveal animation for the inline register panel */
.reveal { display: none; }
.reveal.open { display: block; animation: revealIn .22s ease; }
@keyframes revealIn { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } }

/* ============================================================
   SEGMENTED TABS  (Overview / Attendance / Payroll / …)
   ============================================================ */
.seg {
  display: inline-flex; gap: 2px;
  background: var(--surface);
  border-radius: var(--radius-sm);
  padding: 4px;
}
.seg button {
  border: 0; background: transparent;
  padding: 7px 12px; border-radius: 8px;
  font-weight: 600; font-size: var(--t-small); color: var(--muted);
  transition: background .15s, color .15s, box-shadow .15s;
  white-space: nowrap;
}
.seg button:hover { color: var(--ink); }
.seg button.active {
  background: var(--elevated); color: var(--primary);
  box-shadow: var(--shadow);
}
.tab-pane { display: none; }
.tab-pane.active { display: block; animation: revealIn .18s ease; }

/* ============================================================
   SLIDE-IN DRAWER  (right-hand employee record preview)
   ============================================================ */
.drawer-scrim {
  position: fixed; inset: 0; background: rgba(0,0,0,.6);
  opacity: 0; pointer-events: none; transition: opacity .25s; z-index: 70;
}
.drawer-scrim.open { opacity: 1; pointer-events: auto; }
.drawer {
  position: fixed; top: 0; right: 0; bottom: 0;
  width: 440px; max-width: 92vw;
  background: var(--bg);
  border-left: 1px solid var(--border);
  box-shadow: var(--shadow-lg);
  transform: translateX(100%);
  transition: transform .28s cubic-bezier(.4,0,.2,1);
  z-index: 71;
  display: flex; flex-direction: column;
}
.drawer.open { transform: translateX(0); }
.drawer-head {
  display: flex; align-items: center; gap: var(--s2);
  padding: var(--s3); border-bottom: 1px solid var(--border);
  background: var(--card);
}
.drawer-head .close {
  margin-left: auto;
  width: 36px; height: 36px; border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: var(--elevated);
  display: grid; place-items: center; color: var(--ink);
}
.drawer-head .close:hover { background: var(--surface); }
.drawer-head .close svg { width: 18px; height: 18px; }
.drawer-body { flex: 1; overflow-y: auto; padding: var(--s3); }

/* profile block inside the drawer */
.profile { display: flex; align-items: center; gap: var(--s2); }
.profile .avatar { width: 56px; height: 56px; font-size: var(--t-title); }
.profile h3 { font-size: var(--t-title); font-weight: 800; letter-spacing: -.3px; }
.profile .p-sub { color: var(--muted); font-size: var(--t-small); margin-top: 2px; }

/* key/value facts grid */
.facts { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s2); }
.fact .k { font-size: var(--t-micro); font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--muted); }
.fact .v { font-weight: 600; font-size: var(--t-body); margin-top: 3px; }
.fact.col-2 { grid-column: 1 / -1; }

/* simple stat pills used in record tabs */
.mini-stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
.mini-stat {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-sm); padding: 12px; text-align: center;
}
.mini-stat .n { font-size: var(--t-section); font-weight: 800; letter-spacing: -.4px; }
.mini-stat .l { font-size: var(--t-micro); color: var(--muted); margin-top: 2px; font-weight: 600; }

/* document rows */
.doc-row {
  display: flex; align-items: center; gap: 12px;
  padding: 12px; border: 1px solid var(--border);
  border-radius: var(--radius-sm); background: var(--surface);
}
.doc-row + .doc-row { margin-top: 10px; }
.doc-row .li-ico { width: 34px; height: 34px; }
.doc-row .d-name { font-weight: 600; font-size: var(--t-body); }
.doc-row .d-meta { font-size: var(--t-label); color: var(--muted); margin-top: 2px; }
.doc-row .d-dl { margin-left: auto; color: var(--muted); }
.doc-row .d-dl:hover { color: var(--primary); }
.doc-row .d-dl svg { width: 18px; height: 18px; }

/* view-toggle (table vs grid) — icon buttons */
.view-toggle { display: inline-flex; border: 1px solid var(--border); border-radius: var(--radius-sm); overflow: hidden; }
.view-toggle button {
  width: 38px; height: 40px; display: grid; place-items: center;
  background: var(--elevated); border: 0; color: var(--muted);
  border-left: 1px solid var(--border);
}
.view-toggle button:first-child { border-left: 0; }
.view-toggle button.active { background: var(--primary-soft); color: var(--primary); }
.view-toggle button svg { width: 18px; height: 18px; }

/* clickable table rows */
.table tbody tr.clickable { cursor: pointer; }

/* payroll status cell: badge with hover-revealed per-row actions */
.pay-status-cell { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 30px; }
.pay-status-cell .pay-badge { flex: 0 0 auto; }
.row-actions {
  display: inline-flex; align-items: center; gap: 4px;
  opacity: 0; transition: opacity .12s; pointer-events: none;
}
.table tbody tr:hover .row-actions,
.table tbody tr:focus-within .row-actions { opacity: 1; pointer-events: auto; }
.btn-icon {
  display: inline-flex; align-items: center; justify-content: center;
  width: 30px; height: 30px; padding: 0;
  border-radius: var(--radius-xs); border: 1px solid var(--border);
  background: var(--elevated); color: var(--muted);
  transition: background .12s, color .12s, border-color .12s;
}
.btn-icon:hover { background: var(--surface); color: var(--ink); border-color: var(--border-strong); }
.btn-icon:active { transform: translateY(1px); }
.btn-icon svg { width: 15px; height: 15px; }
/* touch devices have no hover: keep actions visible so HR can reach them */
@media (hover: none) { .row-actions { opacity: 1; pointer-events: auto; } }
/* live net readout inside the edit modal */
.pay-net-readout {
  display: flex; align-items: center; justify-content: space-between;
  background: var(--primary-soft); border-radius: 12px; padding: 12px 16px;
  margin: 4px 0 14px;
  box-shadow: inset 0 0 0 1px rgba(129,140,248,.20);
}
.pay-net-readout .pnr-label { font-weight: 600; color: var(--ink-2); }
.pay-net-readout .pnr-value { font-size: var(--t-section); font-weight: 800; color: var(--primary); font-variant-numeric: tabular-nums; }
.pay-net-readout.invalid { background: var(--danger-soft); box-shadow: inset 0 0 0 1px rgba(248,113,113,.3); }
.pay-net-readout.invalid .pnr-value { color: var(--danger-ink); }

/* people grid (card view alternative to the table) */
.people-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--s2); }
.person-card {
  background: var(--card); border: 1px solid var(--border);
  border-radius: var(--radius); box-shadow: var(--shadow);
  padding: var(--s3); cursor: pointer;
  transition: box-shadow .15s, transform .05s, border-color .15s;
}
.person-card:hover { box-shadow: var(--shadow-md); border-color: var(--border-strong); }
.person-card:active { transform: translateY(1px); }
.person-card .pc-top { display: flex; align-items: center; gap: 12px; }
.person-card .pc-name { font-weight: 700; }
.person-card .pc-role { font-size: var(--t-label); color: var(--muted); }
.person-card .pc-meta { display: flex; align-items: center; justify-content: space-between; margin-top: var(--s2); padding-top: var(--s2); border-top: 1px solid var(--border); }
.person-card .pc-salary { font-weight: 800; font-variant-numeric: tabular-nums; }

/* responsive tweaks for the new components */
@media (max-width: 1100px) {
  .people-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 900px) {
  .form-grid { grid-template-columns: 1fr; }
  .facts { grid-template-columns: 1fr 1fr; }
  .people-grid { grid-template-columns: 1fr; }
  .drawer { width: 100%; max-width: 100%; }
  .toolbar .toolbar-right { margin-left: 0; width: 100%; }
  .field-search { min-width: 0; flex: 1; }
}
@media (max-width: 380px) {
  .facts { grid-template-columns: 1fr; }
  .mini-stats { grid-template-columns: repeat(3, 1fr); gap: 6px; }
  .mini-stat { padding: 10px 6px; }
}

/* The STAR RATING block (.stars / .star-muted) belonged to the Performance screen — removed with it. */

/* Fix: allow grid/flex children (cards) to shrink so inner .table-wrap scrolls instead of overflowing the page on mobile */
.card, .cols-2 > *, .cols-2e > *, .cols-3 > *, .grid > *, .main, .content { min-width: 0; }

/* ============================================================
   OFFICE-CONTROL — "Kontrolli i Zyrës" additions
   Screens: Depozitat, Shpenzimet, Pagat (team), Dashboard
   ============================================================ */

/* ---- team badges (FTD / Retention / Zyra) ---- */
.badge.team-ftd       { background: var(--info-soft);    color: var(--info-ink); }
.badge.team-retention { background: var(--success-soft); color: var(--success-ink); }
.badge.team-zyra      { background: var(--neutral-soft); color: var(--muted); }

/* ---- payment-method chip (Kesh / Banka / Kripto) ---- */
.method-chip {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: var(--t-label); font-weight: 600;
  padding: 3px 9px; border-radius: var(--radius-pill);
  background: var(--neutral-soft); color: var(--muted);
  white-space: nowrap;
}
.method-chip.cash   { background: var(--success-soft); color: var(--success-ink); }
.method-chip.bank   { background: var(--info-soft); color: var(--info-ink); }
.method-chip.crypto { background: var(--warning-soft); color: var(--warning-ink); }

/* ---- cash-flow account running balance (extends .money-row usage) ---- */
.acct-balance { font-weight: 800; color: var(--ink); font-variant-numeric: tabular-nums; }
.acct-balance.neg { color: var(--danger-ink); }

/* ---- group breakdown legend swatch (larger than .legend-dot, square) ---- */
.group-dot { width: 12px; height: 12px; border-radius: 3px; display: inline-block; flex: none; }

/* ---- payroll team section header row (if grouped-by-team rows are used) ---- */
.table tbody tr.team-head td {
  background: var(--surface); font-weight: 700; color: var(--ink);
  text-transform: uppercase; font-size: var(--t-label); letter-spacing: .03em;
}

/* ============================================================
   OFFICE-CONTROL — supporting layout helpers
   (net-profit hero, group breakdown rows, cash-flow account tiles)
   ============================================================ */

/* ---- Expense group breakdown row ("Ku shkoi paraja") ---- */
.grp-row { padding: 10px 0; border-bottom: 1px solid var(--border); }
.grp-row:last-child { border-bottom: 0; }
.grp-row .grp-top {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--s2); margin-bottom: 8px;
}
.grp-row .grp-name {
  display: flex; align-items: center; gap: 10px;
  font-weight: 600; font-size: var(--t-body); color: var(--ink);
}
.grp-row .grp-amt { font-weight: 700; color: var(--ink); font-variant-numeric: tabular-nums; }
.grp-row .grp-meta { font-size: var(--t-label); color: var(--muted); font-weight: 500; }
/* the coloured fill of a group's progress bar is set inline (per-group colour) */

/* ---- Cash-flow account tiles (Kesh / Banka / Kripto) ---- */
.acct-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--s2); }
.acct-tile {
  background: var(--card); border: 1px solid var(--border);
  border-radius: var(--radius-sm); box-shadow: var(--shadow);
  padding: var(--s2);
}
.acct-tile .at-head { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }
.acct-tile .at-name { font-weight: 700; font-size: var(--t-body); }
.acct-tile .at-balance {
  font-size: var(--t-display); font-weight: 800; letter-spacing: -.4px;
  color: var(--ink); font-variant-numeric: tabular-nums;
}
.acct-tile .at-balance.neg { color: var(--danger-ink); }
.acct-tile .at-flow {
  display: flex; align-items: center; gap: var(--s2);
  margin-top: 8px; font-size: var(--t-label); color: var(--muted);
}
.acct-tile .at-flow .in  { color: var(--success-ink); font-weight: 700; }
.acct-tile .at-flow .out { color: var(--danger-ink);  font-weight: 700; }
/* small square method icon inside the tile head (reuses kpi-ico soft palette) */
.acct-tile .at-ico {
  width: 34px; height: 34px; border-radius: 10px; flex: none;
  display: grid; place-items: center;
  background: var(--neutral-soft); color: var(--muted);
}
.acct-tile .at-ico svg { width: 17px; height: 17px; }
.acct-tile .at-ico.cash   { background: var(--success-soft);  color: var(--success-ink); }
.acct-tile .at-ico.bank   { background: var(--info-soft);  color: var(--info-ink); }
.acct-tile .at-ico.crypto { background: var(--warning-soft); color: var(--warning-ink); }

@media (max-width: 900px) {
  .acct-grid { grid-template-columns: 1fr; }
}

/* ============================================================
   SCALE KIT — inline bonus, payroll toolbar/running-total/bulk bar,
   responsive management cards.
   ============================================================ */

/* ---- inline bonus editor (payroll Shpërblim cell + mobile card) ---- */
.bonus-cell { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; }
.bonus-inline {
  display: inline-flex; align-items: center; gap: 2px;
  border: 1px solid var(--border); border-radius: 8px;
  background: #0e1424; padding: 0 8px 0 8px; height: 34px;
  transition: border-color .12s, box-shadow .12s;
}
.bonus-inline:focus-within { border-color: var(--primary); box-shadow: 0 0 0 3px var(--primary-glow); }
.bonus-inline > .cur { color: var(--muted); font-weight: 600; font-size: var(--t-small); }
.bonus-input {
  border: 0; outline: 0; background: transparent;
  width: 72px; text-align: right;
  font: 600 15px var(--font); color: var(--success-ink);
  font-variant-numeric: tabular-nums; -moz-appearance: textfield;
}
.bonus-input::-webkit-outer-spin-button,
.bonus-input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.bonus-input:disabled { color: var(--muted); }
.bonus-inline.saving { opacity: .55; }
.bonus-inline.saved { border-color: var(--success); box-shadow: 0 0 0 3px var(--success-soft); }
.bonus-inline.err   { border-color: var(--danger);  box-shadow: 0 0 0 3px var(--danger-soft); }
.bonus-allow { font-size: var(--t-micro); color: var(--success-ink); font-weight: 600; }

/* per-row net flash on reconcile */
.pay-net.flash { animation: netflash .5s ease; }
@keyframes netflash { 0% { background: var(--primary-soft); } 100% { background: transparent; } }

/* ---- payroll toolbar (search + team chips + status chips) ---- */
.pay-toolbar { display: flex; align-items: center; gap: var(--s2); flex-wrap: wrap; margin-bottom: var(--s2); }
.pay-toolbar .field-search { flex: 1 1 240px; }
.pay-toolbar .chips { display: flex; gap: 8px; flex-wrap: wrap; }

/* ---- sticky running-total + bulk-pay bar ---- */
.pay-runtotal {
  display: flex; align-items: center; gap: var(--s3); flex-wrap: wrap;
  justify-content: space-between;
  background: var(--primary-soft); border: 1px solid rgba(129,140,248,.20);
  border-radius: var(--radius-sm); padding: 10px 14px; margin-bottom: var(--s2);
}
.pay-runtotal .rt-group { display: flex; gap: var(--s3); flex-wrap: wrap; }
.pay-runtotal .rt-item { display: flex; flex-direction: column; line-height: 1.1; }
.pay-runtotal .rt-k { font-size: var(--t-micro); font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--muted); }
.pay-runtotal .rt-v { font-size: var(--t-input); font-weight: 800; font-variant-numeric: tabular-nums; color: var(--ink); }
.pay-runtotal .rt-v.pos { color: var(--success-ink); }
.pay-runtotal .rt-count { font-size: var(--t-small); color: var(--muted); font-weight: 600; align-self: center; }
.pay-runtotal .btn { min-height: 40px; }
.pay-runtotal .btn:disabled { opacity: .5; pointer-events: none; }

/* ============================================================
   PAYROLL PROCESS STEPPER (3 stages) + COMPLETION BANNER
   ============================================================ */
.pay-stepper {
  display: flex; align-items: stretch; gap: 0; flex-wrap: nowrap;
  background: var(--card); border: 1px solid var(--border);
  border-radius: var(--radius); box-shadow: var(--shadow), var(--shadow-inset);
  padding: 12px 14px; margin-bottom: var(--s3);
}
.pstep { display: flex; align-items: center; gap: 10px; flex: 1 1 0; min-width: 0; }
.pstep-mark {
  flex: none; position: relative; width: 32px; height: 32px; border-radius: 50%;
  display: grid; place-items: center; font-weight: 800; font-size: var(--t-body);
  background: var(--elevated); color: var(--muted);
  box-shadow: inset 0 0 0 1px var(--border);
  transition: background .18s, color .18s, box-shadow .18s;
}
.pstep-check { width: 17px; height: 17px; display: none; }
.pstep-body { flex: 1; min-width: 0; }
.pstep-title { font-size: var(--t-small); font-weight: 700; color: var(--ink); line-height: 1.15;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pstep-sub { font-size: var(--t-label); color: var(--muted); margin-top: 2px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pstep-cta { flex: none; }
.pstep-sep { flex: 0 0 22px; align-self: center; height: 2px;
  background: var(--border-strong); margin: 0 8px; border-radius: 2px; transition: background .25s; }

/* ACTIVE stage */
.pstep.is-active .pstep-mark { background: linear-gradient(135deg,#6366f1,#4f46e5); color: #fff; box-shadow: 0 0 0 4px var(--primary-soft), 0 0 16px var(--primary-glow); }
.pstep.is-active .pstep-title { color: var(--primary); }
/* DONE stage */
.pstep.is-done .pstep-mark { background: linear-gradient(135deg,#4ade80,#22c55e); color: #06210f; }
.pstep.is-done .pstep-num { display: none; }
.pstep.is-done .pstep-check { display: block; }
.pstep.is-done .pstep-title { color: var(--success-ink); }
.pstep.is-done + .pstep-sep { background: var(--success); }

/* ---- Month completion / remaining banner ---- */
.pay-complete {
  display: flex; align-items: center; gap: 14px;
  border-radius: var(--radius); padding: 14px 16px; margin-bottom: var(--s3);
  border: 1px solid var(--border); background: var(--card);
}
.pay-complete[hidden] { display: none; }
.pc-ico { flex: none; width: 40px; height: 40px; border-radius: 12px;
  display: grid; place-items: center; background: var(--neutral-soft); color: var(--muted); }
.pc-ico svg { width: 22px; height: 22px; }
.pc-title { font-weight: 800; font-size: var(--t-lead); color: var(--ink); line-height: 1.2; }
.pc-sub { font-size: var(--t-small); color: var(--muted); margin-top: 2px; }
/* states */
.pay-complete.is-done { border-color: var(--success); background: var(--success-soft); }
.pay-complete.is-done .pc-ico { background: var(--success); color: #06210f; }
.pay-complete.is-done .pc-title { color: var(--success-ink); }
.pay-complete.is-warn { border-color: var(--warning); background: var(--warning-soft); }
.pay-complete.is-warn .pc-ico { background: var(--warning); color: #3b2a06; }
.pay-complete.is-warn .pc-title { color: var(--warning-ink); }
.pay-complete.is-pending .pc-ico { background: var(--info-soft); color: var(--info-ink); }

/* ---- Empty-period prompt banner (no slips generated yet) ---- */
.pay-gen-banner {
  display: flex; align-items: center; gap: 12px;
  border: 1px solid var(--warning, #f59e0b); border-radius: var(--radius); padding: 12px 16px;
  margin-bottom: var(--s3); background: var(--warning-soft, rgba(245,158,11,.08)); color: var(--ink);
  font-size: var(--t-small); font-weight: 500;
}
.pay-gen-banner[hidden] { display: none; }
.pay-gen-banner span { flex: 1; min-width: 0; }
.pay-gen-banner .btn { flex: none; }

/* ---- Add-to-month picker dialog ---- */
.pay-add-list { display: flex; flex-direction: column; gap: 6px; overflow-y: auto;
  -webkit-overflow-scrolling: touch; max-height: 52vh; margin: 0 -4px; padding: 0 4px; }
.pay-add-item { display: flex; align-items: center; justify-content: space-between; gap: 10px;
  width: 100%; text-align: left; background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-sm); padding: 10px 12px; cursor: pointer; min-height: 56px;
  transition: background .12s, border-color .12s; }
.pay-add-item:hover { background: var(--elevated); border-color: var(--primary); }
.pay-add-item.loading { opacity: .55; pointer-events: none; }
.pay-add-item .person-name { font-weight: 600; }
.pay-add-base { flex: 0 0 auto; margin-left: auto; font-size: var(--t-label); font-weight: 700;
  color: var(--muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
.pay-add-plus { flex: 0 0 auto; width: 26px; height: 26px; border-radius: 50%;
  display: grid; place-items: center; font-size: var(--t-title); line-height: 1;
  color: var(--primary); background: var(--primary-soft); }
.pay-add-empty, .pay-add-none { text-align: center; color: var(--muted); font-size: var(--t-body); padding: 28px 12px; }

/* ---- responsive management cards (payroll/employees/deposits/finance) ---- */
.card-hero-cell { }   /* marker: person cell → card header on mobile */
.card-foot-cell { }   /* marker: status/actions cell → card footer on mobile */

@media (max-width: 720px) {
  /* ===== tables → stacked cards (opt-in via .table.cards) ===== */
  .table.cards { display: block; }
  .table.cards thead { display: none; }                 /* labels come from data-label */
  .table.cards tbody { display: block; }
  .table.cards tbody tr {
    display: block;
    background: var(--card); border: 1px solid var(--border);
    border-radius: var(--radius-sm); box-shadow: var(--shadow);
    padding: 12px 14px; margin-bottom: 10px;
  }
  .table.cards tbody tr:hover { background: var(--card); box-shadow: var(--shadow); }   /* kill desktop row tint */
  .table.cards tbody td {
    display: flex; align-items: center; justify-content: space-between; gap: 12px;
    padding: 6px 0; border: 0; text-align: right; min-height: 38px;
  }
  .table.cards tbody td::before {
    content: attr(data-label);
    font-size: var(--t-label); font-weight: 700; letter-spacing: .02em; text-transform: none;
    color: var(--muted); text-align: left; margin-right: auto;
  }
  /* the person/description cell = full-width card header, no label */
  .table.cards tbody td.card-hero-cell {
    justify-content: flex-start; text-align: left;
    padding: 0 0 10px; margin-bottom: 6px; border-bottom: 1px solid var(--border);
  }
  .table.cards tbody td.card-hero-cell::before { content: none; }
  .table.cards tbody td.card-hero-cell .person { width: 100%; }
  /* sub-lines (FTD/Ret, allowance) align right under the value */
  .table.cards tbody td .person-sub { text-align: right; }
  /* status/actions cell → card footer, actions always visible + reachable */
  .table.cards tbody td.card-foot-cell {
    border-top: 1px dashed var(--border); margin-top: 6px; padding-top: 10px;
  }
  .table.cards .pay-status-cell { width: 100%; }
  .table.cards .row-actions { opacity: 1; pointer-events: auto; }
  .table.cards .btn-icon { width: 40px; height: 40px; }
  .table.cards .btn-icon svg { width: 18px; height: 18px; }
  /* the inner wrap must not add a scrollbar when it's cards */
  .card .table-wrap:has(.table.cards) { overflow: visible; }

  /* ===== table <tfoot> also stacks into a summary strip (payroll) ===== */
  .table.cards tfoot { display: block; }
  .table.cards tfoot tr {
    display: block; background: var(--primary-soft);
    border-radius: var(--radius-sm); padding: 10px 14px;
  }
  .table.cards tfoot td {
    display: flex; justify-content: space-between; padding: 5px 0; border: 0; text-align: right;
  }
  .table.cards tfoot td::before { content: attr(data-label); color: var(--muted); font-weight: 700; margin-right: auto; }
  .table.cards tfoot td[colspan]::before { content: none; }

  /* ===== inline bonus sized so iOS never zooms + full touch target ===== */
  .bonus-inline { height: 44px; }
  .bonus-input { width: 96px; font-size: var(--t-input); }

  /* ===== payroll toolbar: chips full-width, sticky under topbar ===== */
  .pay-toolbar { position: sticky; top: 60px; z-index: 29; background: var(--bg); padding-top: 8px; }
  .pay-runtotal { position: sticky; top: 132px; z-index: 28; }   /* under the toolbar */
  .pay-runtotal .btn { width: 100%; }

  /* ===== payslip side-preview hidden on phones (use Detaje→modal) ===== */
  .payroll-preview { display: none; }

  /* ===== every JS modal overlay → bottom-sheet, scrollable, no clip ===== */
  #editModal, #recModal, #depModal, #payEditModal, #revModal, #payAddModal {
    place-items: end center !important; padding: 0 !important;
    overflow-y: auto; -webkit-overflow-scrolling: touch;
  }
  #editModal > .card, #recModal > .card, #depModal > .card,
  #payEditModal > .card, #revModal > .card, #payAddModal > .card {
    max-width: 100% !important; width: 100% !important;
    border-radius: var(--radius) var(--radius) 0 0;
    max-height: 92dvh; overflow-y: auto; margin: 0;
  }
  /* the payslip-edit modal's two-up rows stack */
  #payEditModal .row > div[style*="flex:1"] { flex: 1 1 100% !important; }

  /* ===== GLOBAL iOS no-zoom: every form control ≥16px on phones =====
     Selected by ELEMENT, not by class. The class list (.input/.select/.bonus-input) missed the
     topbar search on all seven pages that have one, because #topSearch carries no class — and any
     future input that forgets the class would have silently regressed the same way. Checkbox,
     radio and range have no text, so leaving them out costs nothing and avoids resizing them. */
  input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]),
  select, textarea { font-size: var(--t-input); }
  /* touch targets */
  .btn { min-height: 44px; }
  .btn-sm { min-height: 38px; }
  .seg button { min-height: 40px; }
  .chip { min-height: 38px; }
  .month-arrow { width: 44px; height: 40px; }

  /* ===== PAYROLL PROCESS STEPPER → stacked cards on phones ===== */
  .pay-stepper { flex-wrap: wrap; gap: 10px 0; padding: 6px 14px; }
  .pstep { flex: 1 1 100%; flex-wrap: wrap; padding: 12px 0; border-bottom: 1px dashed var(--border); }
  .pstep:last-child { border-bottom: 0; }
  .pstep-sep { display: none; }
  .pstep-title, .pstep-sub { white-space: normal; }
  .pstep-cta { width: 100%; margin-top: 8px; }

  /* ===== completion banner: top-align icon when text wraps at 390px ===== */
  .pay-complete { align-items: flex-start; padding: 14px; }

  /* ===== add-to-month dialog joins the bottom-sheet family ===== */
  .pay-add-item .person-sub { font-size: var(--t-micro); }
}
/* Grid children already have min-width:0 above — keep. */

/* ============================================================
   VISUAL POLISH — consistency, hierarchy, celebration
   ============================================================ */

/* ---- 1. KPI NET tile — negative state colours the value red ---- */
.kpi-grid .kpi:last-child.net-negative {
  border-color: rgba(248,113,113,.4);
  box-shadow: 0 0 0 3px var(--danger-soft), var(--shadow);
}
.kpi-grid .kpi:last-child.net-negative .kpi-value { color: var(--danger-ink); }

/* ---- 2. Dashboard NET warning banner (shown by JS when net < 0) ---- */
.net-warn-banner {
  display: flex; align-items: center; gap: 12px;
  background: var(--danger-soft);
  border: 1px solid rgba(248,113,113,.3);
  border-radius: var(--radius-sm);
  padding: 12px 16px;
  margin-bottom: var(--s3);
  font-weight: 600; color: var(--danger-ink); font-size: var(--t-body);
}
.net-warn-banner[hidden] { display: none; }
.net-warn-banner svg { width: 20px; height: 20px; flex: none; color: var(--danger); }

/* ---- 3. Payroll completion banner — "Muaji u mbyll" CELEBRATION ---- */
.pay-complete.is-done {
  background: linear-gradient(135deg, rgba(52,211,153,.14) 0%, rgba(34,197,94,.20) 100%);
  border: 2px solid rgba(52,211,153,.4);
  box-shadow: 0 4px 20px rgba(52, 211, 153, .12);
  position: relative;
  overflow: hidden;
}
/* Subtle confetti shimmer strip */
.pay-complete.is-done::after {
  content: "";
  position: absolute; inset: 0;
  background: repeating-linear-gradient(
    105deg,
    transparent 0px,
    transparent 18px,
    rgba(255,255,255,.06) 18px,
    rgba(255,255,255,.06) 22px
  );
  pointer-events: none;
}
.pay-complete.is-done .pc-ico {
  background: var(--success);
  color: #06210f;
  box-shadow: 0 4px 12px rgba(52, 211, 153, .35);
  width: 48px; height: 48px; border-radius: 14px;
  flex: none;
}
.pay-complete.is-done .pc-ico svg { width: 26px; height: 26px; }
.pay-complete.is-done .pc-title {
  font-size: var(--t-title); font-weight: 800;
  color: var(--success-ink);
  letter-spacing: -.2px;
}
.pay-complete.is-done .pc-sub { color: var(--success-ink); opacity: .85; font-weight: 500; }

/* Pulse animation on the done icon — draws the eye once */
@keyframes pulse-success {
  0%   { box-shadow: 0 0 0 0   rgba(52, 211, 153, .5); }
  70%  { box-shadow: 0 0 0 10px rgba(52, 211, 153, 0); }
  100% { box-shadow: 0 0 0 0   rgba(52, 211, 153, 0); }
}
.pay-complete.is-done .pc-ico {
  animation: pulse-success 1.4s ease 0.2s 2;
}

/* ---- 4. "Para brenda & jashtë" money-net: danger colour when negative ---- */
.money-net .val.text-danger { color: var(--danger-ink); }
.money-net .val.text-success { color: var(--success-ink); }

/* ---- 5. Card visual hierarchy — section eyebrow + primary card accent ---- */
.card:has(.btn-primary.btn-block) {
  border-top: 3px solid var(--primary);
}
/* Payslip card specifically (has the preview + edit button). */
.payslip { border-top: 3px solid var(--primary); }

/* ---- 6. Form fields — bigger tap targets on mobile ---- */
/* .input dhe .select janë i njëjti kontroll me dy elemente, dhe rrinë ngjitur në çdo
   formular — por njëri ishte 44px e tjetri 42px. Dy piksel nuk shihen si zgjedhje,
   shihen si gabim vizatimi, dhe 42 është nën minimumin e prekjes. Një numër, nga tokeni. */
.select { min-height: var(--tap); }
.input  { min-height: var(--tap); }

/* ---- 7. "Shto punonjës" step-1 CTA in process stepper — promote to primary ---- */
#pstep1.is-active .pstep-cta { background: var(--primary); border-color: var(--primary); color: #0a0e1a; }
#pstep1.is-active .pstep-cta:hover { background: var(--primary-hover); border-color: var(--primary-hover); }

/* ---- 8. page-head primary action — full visual weight ---- */
@media (max-width: 600px) {
  .page-head .btn-ghost svg { margin-right: 0; }
  .page-head .btn-ghost .btn-label { display: none; }
}

/* ---- 10. Dashboard KPI — negative state helper class ---- */
.kpi.net-negative, .kpi.is-negative { border-color: rgba(248,113,113,.4); }
.kpi.net-negative .kpi-ico { background: var(--danger-soft); color: var(--danger-ink); }
.kpi.net-negative .kpi-value, .kpi.is-negative .kpi-value { color: var(--danger-ink); }

/* ---- 11. Payroll running-total bar: highlight when all paid ---- */
.pay-runtotal.all-paid {
  background: var(--success-soft);
  border-color: rgba(52,211,153,.35);
}
.pay-runtotal.all-paid .rt-v { color: var(--success-ink); }

/* ---- 12. Empty state block ---- */
.empty-state { text-align:center; padding:40px 20px; color:var(--muted); }
.empty-state-icon { width:48px; height:48px; margin:0 auto 12px; opacity:.5; color: var(--primary); }
.empty-state-title { font-size: var(--t-lead); font-weight:600; margin-bottom:6px; color:var(--ink); }
.empty-state-sub { font-size: var(--t-small); margin-bottom:16px; }
/* Inline dashboard empty messages (activity + alerts panels) */
.dash-empty-state { padding:24px 8px; text-align:center; font-size: var(--t-small); color:var(--muted); font-style:italic; }
.table .dash-empty-state, .table tbody .dash-empty-state { color:var(--muted); font-style:italic; text-align:center; }

/* ---- 13. Help / hint text below form fields ---- */
.help-text { font-size: var(--t-label); color:var(--muted); margin-top:3px; line-height:1.4; }

/* ---- 14. KPI tile negative state (generic is-negative variant) ---- */
.kpi.is-negative .kpi-value { color: var(--danger-ink); }
.kpi.is-negative .kpi-label { color: var(--danger-ink); opacity:.8; }

/* ---- 15. Page subtitle / description line below page heading ---- */
.page-sub { font-size: var(--t-small); color:var(--muted); margin-top:2px; margin-bottom:16px; line-height:1.5; }

/* ---- 16. Help-text variants ---- */
.field-hint { font-size: var(--t-label); color:var(--muted); margin-top:4px; line-height:1.4; }
.inline-legend { font-size: var(--t-label); color:var(--muted); margin-bottom:var(--s2); padding:8px 10px; background:var(--surface); border-radius:6px; border:1px solid var(--border); }
.step-guide { font-size: var(--t-label); color:var(--muted); margin-top:3px; font-style:italic; }

/* ============================================================
   DARK THEME FINISHERS v16 — native controls + accents
   (later rules win; token-driven surfaces already dark above)
   ============================================================ */

/* Color-scheme hint → dark native scrollbars, form controls, autofill */
:root { color-scheme: dark; }
html, body { background: var(--bg); }

/* ---- SIDEBAR aurora + brand glow ---- */
.sidebar {
  background:
    radial-gradient(120% 55% at 50% -10%, rgba(129,140,248,.10), transparent 60%),
    linear-gradient(180deg, #0d1424 0%, var(--sidebar-bg) 100%);
  box-shadow: 1px 0 0 rgba(255,255,255,.02), var(--shadow-md);
}
.brand { border-bottom: 1px solid var(--border); }
/* Ishte: box-shadow me hije indigo + --shadow-inset. Ato i takonin pllakës me gradient
   që mbante shkronjat "HR". Tani elementi s'ka sfond, pra hija e brendshme pikturonte
   një drejtkëndësh të dukshëm rreth shenjës — kuti fantazmë pikërisht atë që hoqa.
   Shkëlqimi vjen tani nga vetë shenja, jo nga kutia e saj. */
.brand-logo {
  filter: drop-shadow(0 4px 14px rgba(129,140,248,.45));
}
.brand-name span { text-shadow: 0 0 16px var(--primary-glow); }
.nav-item svg { opacity: .8; }
.nav-item:hover svg { opacity: 1; }
.nav-item.active {
  background: linear-gradient(90deg, rgba(129,140,248,.16), rgba(129,140,248,.06) 70%, transparent);
  color: #c7d0ff;
  box-shadow: inset 0 0 0 1px rgba(129,140,248,.16);
}
.nav-item.active svg { opacity: 1; }
.nav-item.active::before {
  background: linear-gradient(180deg, #a5b4fc, var(--primary));
  box-shadow: 0 0 12px 1px var(--primary-glow);
}
.nav-item.active .nav-count { background: rgba(129,140,248,.22); color: #c7d0ff; }

/* ---- CARD raised sheen ---- */
.card {
  background: linear-gradient(180deg, rgba(255,255,255,.02), transparent 40%), var(--card);
  box-shadow: var(--shadow), var(--shadow-inset);
}
.card:hover { border-color: var(--border-strong); box-shadow: var(--shadow-md), var(--shadow-inset); }

/* ---- KPI / list icon purple variant (net-new) ---- */
.kpi-ico.purple, .li-ico.purple { background: rgba(167,139,250,.15); color: #c4b5fd; }

/* ============================================================
   DASHBOARD v16 — hero NET command deck + quick actions
   ============================================================ */
.qa-bar { display:flex; gap:var(--s2); flex-wrap:wrap; margin-bottom:var(--s3); }
.qa-chip {
  display:inline-flex; align-items:center; gap:10px; padding:8px 16px 8px 8px;
  background:var(--card); border:1px solid var(--border); border-radius:var(--radius-pill);
  font-weight:600; font-size: var(--t-small); color:var(--ink); box-shadow:var(--shadow);
  transition:transform .15s ease, box-shadow .15s ease, border-color .15s ease;
}
.qa-chip:hover { transform:translateY(-1px); box-shadow:var(--shadow-md); border-color:var(--border-strong); }
.qa-ico { width:30px; height:30px; border-radius:50%; flex:none; display:grid; place-items:center; background:var(--primary-soft); color:var(--primary); }
.qa-ico svg { width:15px; height:15px; }
.qa-ico.green { background:var(--success-soft); color:var(--success-ink); }
.qa-ico.red   { background:var(--danger-soft);  color:var(--danger-ink); }
.qa-ico.blue  { background:var(--info-soft);    color:var(--info-ink); }

/* HERO: Depozita − Shpenzime − Paga = NETO */
.net-hero {
  position:relative; overflow:hidden;
  display:grid; grid-template-columns:minmax(0,1.15fr) minmax(260px,auto);
  align-items:center; gap:var(--s4);
  background:linear-gradient(135deg,#0f172a 0%,#1e1b4b 60%,#312e81 100%);
  border:1px solid #312e81; border-radius:var(--radius);
  padding:var(--s3) var(--s4); margin-bottom:var(--s3);
  box-shadow:var(--shadow-lg); transition:box-shadow .4s ease;
}
.net-hero::before {
  content:""; position:absolute; right:-120px; top:-140px; width:400px; height:400px;
  border-radius:50%; background:radial-gradient(circle,rgba(129,140,248,.55),transparent 65%);
  filter:blur(70px); opacity:.55; pointer-events:none; transition:background .4s ease;
}
.net-hero.is-pos::before { background:radial-gradient(circle,rgba(52,211,153,.5),transparent 65%); }
.net-hero.is-neg::before { background:radial-gradient(circle,rgba(248,113,113,.55),transparent 65%); }
.net-hero.is-pos { box-shadow:0 0 0 1px rgba(52,211,153,.28), 0 24px 60px -20px rgba(52,211,153,.4); }
.net-hero.is-neg { box-shadow:0 0 0 1px rgba(248,113,113,.32), 0 24px 60px -20px rgba(248,113,113,.45); }

.nh-flow { display:flex; align-items:center; gap:12px; min-width:0; position:relative; z-index:1; }
.nh-step {
  flex:1; min-width:0; display:flex; flex-direction:column; gap:4px;
  background:rgba(255,255,255,.05); border:1px solid rgba(255,255,255,.09);
  border-radius:var(--radius-sm); padding:12px 14px;
}
.nh-step-ico { width:28px; height:28px; border-radius:8px; display:grid; place-items:center; margin-bottom:2px; }
.nh-step-ico svg { width:15px; height:15px; }
.nh-step-ico.green { background:rgba(52,211,153,.18); color:#6ee7b7; }
.nh-step-ico.red   { background:rgba(248,113,113,.18); color:#fca5a5; }
.nh-step-ico.blue  { background:rgba(56,189,248,.18); color:#7dd3fc; }
.nh-step-label { font-size: var(--t-micro); font-weight:700; letter-spacing:.07em; text-transform:uppercase; color:#94a3b8; }
.nh-step-val { font-size: var(--t-section); font-weight:800; letter-spacing:-.4px; color:#f1f5f9; white-space:nowrap; font-variant-numeric:tabular-nums; }
.nh-op { flex:none; font-size: var(--t-display); font-weight:800; color:#64748b; }
.nh-op.nh-eq { font-size: var(--t-display-lg); color:#a5b4fc; }

.nh-result { text-align:right; position:relative; z-index:1; }
.nh-label { font-size: var(--t-label); font-weight:700; letter-spacing:.1em; text-transform:uppercase; color:#94a3b8; }
.nh-value { font-size:clamp(38px,5vw,56px); font-weight:800; letter-spacing:-2px; line-height:1.05; color:#fff; margin-top:4px; font-variant-numeric:tabular-nums; }
.net-hero.is-pos .nh-value { color:#6ee7b7; text-shadow:0 0 34px rgba(52,211,153,.45); }
.net-hero.is-neg .nh-value { color:#fca5a5; text-shadow:0 0 34px rgba(248,113,113,.5); }
.nh-sub { font-size: var(--t-label); color:#94a3b8; margin-top:6px; }
.net-hero.is-neg .nh-sub { color:#fca5a5; font-weight:600; }

/* The .leaderboard block styled renderTopAgents() on the Performance page — both are gone. */

/* Responsive */
@media (max-width: 1100px) {
  .net-hero { grid-template-columns:1fr; gap:var(--s3); padding:var(--s3); }
  .nh-result { text-align:left; border-top:1px solid rgba(255,255,255,.09); padding-top:var(--s2); }
}
@media (max-width: 700px) {
  .nh-flow { display:grid; grid-template-columns:1fr 1fr; gap:10px; }
  .nh-flow .nh-op { display:none; }
  .qa-bar { flex-wrap:nowrap; overflow-x:auto; padding-bottom:4px; padding-right:32px; -webkit-overflow-scrolling:touch; scrollbar-width:none; }
  .qa-bar::-webkit-scrollbar { display:none; }
  .qa-chip { flex:none; }
  /* Fade gradient right edge — hints that there are more chips to scroll into view */
  .page-head { position:relative; }
  .page-head::after {
    content:""; pointer-events:none;
    position:absolute; right:0; top:0; bottom:0; width:40px;
    background:linear-gradient(to right, transparent, var(--surface, #111827) 90%);
    z-index:1;
  }
}
@media (max-width: 420px) {
  .nh-value { font-size:30px; letter-spacing:-1px; }
  .nh-step-val { font-size: var(--t-title); }
}


/* ============================================================
   PREMIUM BATCH #5 — CSS enhancements
   ============================================================ */

/* --- FIX_1: NET hero — breathing glow orb + .nh-step hover lift --- */
@keyframes heroOrb {
  0%,100% { opacity:.55; transform:scale(1); }
  50%      { opacity:.72; transform:scale(1.08); }
}
.net-hero::before {
  animation: heroOrb 5s ease-in-out infinite;
}
.nh-step {
  transition: background .2s, border-color .2s, transform .2s, box-shadow .2s;
}
.nh-step:hover {
  background: rgba(255,255,255,.09);
  border-color: rgba(255,255,255,.18);
  transform: translateY(-2px);
  box-shadow: 0 8px 20px rgba(0,0,0,.35);
}

/* --- FIX_2: KPI tiles — glass hover lift + icon inset ring --- */
.kpi-ico {
  transition: box-shadow .2s, background .2s;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.12);
}
.kpi-grid > .card.kpi {
  transition: border-color .25s, box-shadow .25s, transform .2s;
}
.kpi-grid > .card.kpi:hover {
  border-color: var(--border-strong);
  box-shadow: var(--shadow-glow), var(--shadow-md);
  transform: translateY(-2px);
}

/* --- FIX_3: Card titles — left accent bar + hairline divider --- */
.card-head {
  border-bottom: 1px solid var(--border-soft);
  padding-bottom: var(--s2);
}
.card-title {
  letter-spacing: .02em;
  position: relative;
  padding-left: 10px;
}
.card-title::before {
  content: "";
  position: absolute; left: 0; top: 10%; bottom: 10%;
  width: 3px; border-radius: 2px;
  background: linear-gradient(180deg, var(--primary), #4f46e5);
}

/* ============================================================
   LOOP #8 VISUAL POLISH
   Deposits: agent share bars, ledger type accents, premium tiles
   ============================================================ */

/* ---- Per-agent share bar (mini progress under numbers) ---- */
.dep-share-wrap {
  display: flex; align-items: center; gap: 6px; margin-top: 5px;
}
.dep-share-bar {
  flex: 1; height: 4px; border-radius: 2px;
  background: var(--border); overflow: hidden; max-width: 80px;
}
.dep-share-fill {
  height: 100%; border-radius: 2px;
  background: linear-gradient(90deg, var(--primary), #818cf8);
  transition: width .4s ease;
}
.dep-share-pct {
  font-size: var(--t-micro); font-weight: 600; color: var(--muted);
  font-variant-numeric: tabular-nums; min-width: 30px;
}

/* ---- Agent total column accent ---- */
td.dep-total-cell {
  font-size: var(--t-lead) !important; font-weight: 800 !important;
  color: var(--ink) !important;
}

/* ---- Ledger row type accent (left border) ---- */
#depLedger tr[data-kind="ftd"] td:first-child {
  box-shadow: inset 3px 0 0 var(--info-ink);
}
#depLedger tr[data-kind="retention"] td:first-child {
  box-shadow: inset 3px 0 0 var(--success-ink);
}

/* ---- Ledger amount — larger, bolder ---- */
.dep-amount-cell {
  font-size: var(--t-lead) !important; font-weight: 800 !important;
}

/* ---- FTD badge upgraded — pill with icon ---- */
.badge.ftd-badge {
  background: var(--info-soft); color: var(--info-ink);
  font-size: var(--t-label); font-weight: 700; letter-spacing: .02em;
}
.badge.ret-badge {
  background: var(--success-soft); color: var(--success-ink);
  font-size: var(--t-label); font-weight: 700; letter-spacing: .02em;
}

/* ---- KPI sub-line on deposits page ---- */
.kpi .kpi-sub {
  font-size: var(--t-micro); color: var(--muted); font-weight: 500;
  margin-top: 2px; font-variant-numeric: tabular-nums;
}

/* ---- Agent card row — hover accent ---- */
#depByAgent tr:hover td:first-child {
  box-shadow: inset 3px 0 0 var(--primary);
}

/* ---- Deposits page: ledger row hover ---- */
#depLedger tr:hover { background: var(--surface); }

/* ---- Cash flow li-ico — ensure consistent rounded icon size ---- */
.money-row .li-ico {
  width: 36px; height: 36px; border-radius: 10px; flex: none;
  display: grid; place-items: center;
}
.money-row .li-ico svg { width: 18px; height: 18px; }

/* ============================================================
   LOOP #9 POLISH
   FIX_1: Agent rank badges + dominant total column
   FIX_2: Finance group left-border swatch
   FIX_3: Payroll bonus amber + sticky thead
   ============================================================ */

/* ---- FIX_1: Deposit total column — green dominant ---- */
td.dep-total-dominant {
  color: var(--success-ink) !important;
  font-size: var(--t-lead) !important; font-weight: 800 !important;
}
/* Rank badge inside agent name cell — tighter vertical alignment */
#depByAgent .person .rank {
  margin-top: 0; align-self: center;
  flex: none;
}

/* ---- FIX_2: Finance group row — left-border accent ---- */
.fin-group-row {
  border-radius: 0 4px 4px 0;
  transition: background .15s ease;
}
.fin-group-row:hover { background: var(--surface); }

/* ---- FIX_3: Payroll bonus cell — amber when > 0 ---- */
td.pay-bonus-amber .bonus-cell .bonus-inline,
td.pay-bonus-amber .bonus-cell .bonus-input {
  color: var(--warning-ink) !important;
  font-weight: 700;
}
td.pay-bonus-amber .bonus-cell .cur {
  color: var(--warning-ink) !important;
}
td.pay-bonus-amber { background: var(--warning-soft) !important; }

/* ---- FIX_3: Payroll sticky thead ---- */
.pay-sticky-table { border-collapse: separate; border-spacing: 0; }
.pay-sticky-head th {
  position: sticky; top: 0; z-index: 10;
  background: var(--surface);
  box-shadow: 0 1px 0 var(--border);
}

/* ============================================================
   LOOP #9 VISUAL PREMIUM — deep polish
   1. Regular cards lift on hover (match KPI tile behavior)
   2. NET hero value counter-pulse on value update
   3. Mobile page-head::after fade gradient fix (bg mismatch)
   4. Performance KPI trend labels (all 4 tiles consistent)
   5. Card-head spacing breathe — extra 4px below border
   6. Section separators — subtle gradient dividers
   7. KPI value font upgrade — tighter tracking for large digits
   8. Net hero step cards — value color matches meaning
   ============================================================ */

/* 1. Regular cards lift on hover — matches KPI tile behavior */
.card:not(.kpi):hover {
  transform: translateY(-1px);
  transition: border-color .25s, box-shadow .25s, transform .2s;
}
/* KPI lift is stronger (2px already defined above in batch#5) */

/* 2. NET hero value pulse-in animation (triggered by JS via class .nh-updated) */
@keyframes nhValuePop {
  0%   { transform: scale(1); }
  30%  { transform: scale(1.035); }
  65%  { transform: scale(0.995); }
  100% { transform: scale(1); }
}
.nh-value.nh-updated {
  animation: nhValuePop .5s cubic-bezier(.34,1.56,.64,1) forwards;
}

/* 3. Mobile page-head fade-gradient — fix wrong bg colour (#1a2138→#0a0e1a) */
@media (max-width: 700px) {
  .page-head::after {
    background: linear-gradient(to right, transparent, #0a0e1a 90%);
  }
}

/* 4. Performance KPI tiles — trend label on all 4 tiles */
/* Injected via CSS only — the three blank kpi-tops now at least show a label */
/* JS in app.js updates them at runtime; this ensures the static fallback looks right */

/* 5. Card-head breathing: add 4px bottom padding after the border so content starts clear */
.card-head {
  margin-bottom: var(--s2);
  padding-bottom: calc(var(--s2) - 4px);
}

/* 6. Section separator upgrade — gradient divider line */
.divider {
  border: 0;
  height: 1px;
  background: linear-gradient(90deg, transparent, var(--border-strong) 20%, var(--border-strong) 80%, transparent);
  margin: var(--s2) 0;
}

/* 7. KPI value — tighter negative tracking for 2+ digit numbers */
.kpi-value {
  font-feature-settings: "tnum" 1, "kern" 1;
  letter-spacing: -.8px;
}
.kpi-value small {
  letter-spacing: -.3px;
}

/* 8. NET hero step values — color by meaning */
.nh-step:nth-child(1) .nh-step-val { color: #6ee7b7; }  /* Depozita = green */
.nh-step:nth-child(3) .nh-step-val { color: #fca5a5; }  /* Shpenzime = red  */
.nh-step:nth-child(5) .nh-step-val { color: #7dd3fc; }  /* Paga = blue      */

/* 9. Performance KPI tiles: show muted trend label even when empty data */
.kpi-top:not(:has(.trend)) .kpi-ico::after {
  content: "";
  /* placeholder — actual labels added by JS */
}

/* 10. Table row left-accent on first column — stronger on hover */
.table tbody tr:hover td:first-child {
  color: var(--ink);
}

/* 11. Topbar blur — increase to feel more glass-like */
.topbar {
  backdrop-filter: saturate(180%) blur(16px);
  -webkit-backdrop-filter: saturate(180%) blur(16px);
}

/* 12. Bottom nav active tab — add a glow dot above the icon */
@media (max-width: 900px) {
  .bottomnav a.active::before, .bottomnav .nav-more.active::before {
    box-shadow: 0 0 8px 2px var(--primary-glow);
  }
  /* Bottom nav labels: ensure text doesn't clip on very small phones */
  .bottomnav a, .bottomnav .nav-more {
    font-size: var(--t-micro);
    padding: 6px 2px;
  }
  .bottomnav a svg, .bottomnav .nav-more svg {
    width: 20px; height: 20px;
  }
}

/* 13. KPI tile loading shimmer — when value is still "—" or "0" and no data yet */
/* (cosmetic only; does not affect real data display) */
.kpi-value:empty::after,
.kpi-value:is(:only-child)::after { content: ""; }

/* 14. Card title eyebrow — tighter gap after the accent bar */
.card-title::before {
  top: 15%; bottom: 15%;  /* vertically centered to cap height, not full line height */
}

/* 15. Sidebar nav: bottom border before Settings — visual grouping */
.nav-bottom { border-top: 1px solid var(--border-soft); }

/* ============================================================
   TRANSAKSIONET — shiriti i filtrave
   Wraps on purpose: six controls never fit a 390px phone in one row, and letting them
   wrap beats hiding any of them behind a "more filters" toggle on the one page whose
   whole job is finding a specific movement.
   ============================================================ */
.lg-filters {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  margin-top: var(--s3);
}
.lg-filters .chips { display: flex; gap: 6px; flex-wrap: wrap; }
.lg-chip {
  min-height: 36px; padding: 0 12px;
  border-radius: var(--radius-pill);
  border: 1px solid var(--border);
  background: transparent; color: var(--muted);
  font-size: var(--t-small); font-weight: 600; cursor: pointer;
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.lg-chip:hover { border-color: var(--border-strong); color: var(--ink); }
.lg-chip.on { background: var(--primary); border-color: var(--primary); color: #fff; }
/* 36px këtu i shkelte të dy: .input jep 44px, por këto vijnë më poshtë në skedar dhe e
   mundnin. Matur 258x36 te 320px, ku rreshti bëhet kolonë dhe select-i s'e merr më
   lartësinë e fqinjit — pra numri i vërtetë dukej vetëm në ekranin më të vogël. */
.lg-sel { min-height: var(--tap); width: auto; min-width: 130px; }
.lg-search { min-height: var(--tap); flex: 1 1 180px; min-width: 150px; }

@media (max-width: 640px) {
  /* 16px, not 15 — iOS zooms the whole page on focus for anything UNDER 16px. */
  .lg-search, .lg-sel { font-size: var(--t-input); }

  /* The first version let the chips WRAP. Ten chips across two groups then stacked into three full
     rows and ate ~180px before a single transaction was visible — on the one page whose job is
     showing the list. Each group is now a single row that SCROLLS sideways, which is the phone
     idiom for a filter strip and costs one row instead of three.
     scrollbar-width:none because a visible bar under 36px chips reads as a rendering fault. */
  .lg-filters { flex-direction: column; align-items: stretch; gap: 8px; }
  .lg-filters .chips {
    width: 100%; flex-wrap: nowrap; overflow-x: auto; -webkit-overflow-scrolling: touch;
    scrollbar-width: none; padding-bottom: 2px;
  }
  .lg-filters .chips::-webkit-scrollbar { display: none; }
  /* min-height hoqi nga këtu: e jep rregulli i përbashkët i çipave më poshtë (≤720px).
     Dy vende për të njëjtin numër ishin pikërisht arsyeja pse divergjuan. */
  .lg-chip { flex: 0 0 auto; padding: 0 14px; }

  /* Two pickers share one row; the search takes the next. Three full-width controls stacked was
     three rows of nothing. */
  .lg-row2 { display: flex; gap: 8px; }
  .lg-sel { flex: 1; min-width: 0; }
  .lg-search { width: 100%; flex: 1 1 auto; }
  #lgReset { min-height: 44px; }
}

/* Numeric columns never wrap. "−€22,521.94" broken across two lines reads as a rendering
   fault, not a number — the same defect that split "+€847,406" after its plus sign on the
   other platform. The date column gets a floor so the day/year pair stays on one line too. */
#lgTable td.num, #lgTable th.num { white-space: nowrap; }
/* Target the DATE by its label, not by position. This was td:first-child when the date WAS first;
   the columns were then reordered so the description became first, and the nowrap meant to protect
   "12 Gsh 2026" started forbidding the description from wrapping — one long note stretched a row to
   594px and put the whole page into horizontal scroll on a 390px phone. A positional selector
   silently changes meaning the moment the order changes. */
#lgTable td[data-label="Data"] { white-space: nowrap; }

@media (max-width: 640px) {
  /* The card head puts the title and the month selector side by side; at 390px "Të gjitha kohërat"
     has no room and gets clipped mid-word. Give the selector its own full-width row instead of
     shrinking a label the operator needs to read. */
  #lgMonth { width: 100%; justify-content: space-between; margin-top: var(--s2); }
  #lgMonth .month-label { flex: 1; text-align: center; }
}

/* A transaction description like "Pages per Vincentin ne usdt -test wallet" has no break
   opportunity a browser will take by default, so inside the stacked-card layout it grew to 538px on
   a 500px screen and pushed the WHOLE PAGE into horizontal scroll. overflow-wrap:anywhere lets it
   break mid-token; min-width:0 stops the flex/table cell from sizing to that unbreakable content.
   Scoped to the ledger's own table so no other card layout changes behaviour. */
#lgTable .card-hero-cell,
#lgTable .card-hero-cell .person-name,
#lgTable .card-hero-cell .person-sub {
  min-width: 0;
  overflow-wrap: anywhere;
  word-break: break-word;
}

@media (max-width: 640px) {
  /* The three summary tiles were full-height cards stacked vertically: ~370px of chrome before a
     single transaction appeared, on the page whose entire job is the list. They now sit as one
     compact block — label left, figure right — which costs about a third of the height and puts
     the first row of data on the first screen. */
  #lgKpis { display: block; border: 1px solid var(--border); border-radius: var(--radius-lg);
            background: var(--surface); overflow: hidden; }
  #lgKpis > .card {
    display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
    border: 0; border-radius: 0; background: transparent;
    padding: 12px 16px; margin: 0;
    border-bottom: 1px solid var(--border);
  }
  #lgKpis > .card:last-child { border-bottom: 0; }
  #lgKpis .card-sub { font-size: var(--t-label); }
  /* The sub-label under the figure would push the row to two lines for no information gain. */
  #lgKpis .card-sub:last-child { display: none; }
  #lgKpis .kpi-value { font-size: var(--t-section); white-space: nowrap; }
}

@media (max-width: 640px) {
  /* The three flow tiles wrapped 2 + 1, leaving a dead half-row beside "Paga" — measured at ~175px of
     empty card on a 390px screen, inside the most important block on the page. The third tile now
     spans the full width instead, and the operators (−, =) stay on their own line so the formula
     still reads as a formula rather than three unrelated boxes. */
  #netHero .nh-flow { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; align-items: stretch; }
  #netHero .nh-step { min-width: 0; }
  #netHero .nh-step:nth-of-type(3) { grid-column: 1 / -1; }
  #netHero .nh-op { display: none; }
  #netHero .nh-step-val { font-size: var(--t-section); white-space: nowrap; }
}

/* ============================================================
   MOBILE POLISH PASS — 2026-08-12
   ============================================================ */
@media (max-width: 900px) {
  /* Settings was UNREACHABLE on a phone. .sidebar and .bottomnav are both z-index:60 and the bottom
     bar paints later, so it won — and .nav-bottom (the only mobile route to Settings) sits exactly
     where the bar overlaps. Taps landed on Paneli/Punonjësit instead. Raising the OPEN drawer above
     it fixes the hit-test; the padding stops the link sitting visually under the bar as well. The
     bottom bar has no business being tappable while the drawer covers the screen. */
  body.nav-open .sidebar { z-index: 70; }
  .nav-bottom { padding-bottom: 76px; }
}

@media (max-width: 640px) {
  /* iOS zooms the entire page when a focused field is under 16px. Every input the operator actually
     types into is brought to 16px — the zoom-then-pinch-back dance is the single cheapest thing that
     makes a site feel unfinished on a phone. */
  input, select, textarea, .input, .m-input { font-size: var(--t-input); }

  /* Month steppers control what the whole page shows and were ~38x28. Reuse the size the app already
     settled on for .month-arrow rather than inventing a second answer. */
  .period-arrow, .month-arrow { min-width: 44px; min-height: 44px; }

  /* Consistent breathing room. Cards differed page to page, which is what "not unified" looks like. */
  .content { padding-left: 14px; padding-right: 14px; }
  .card { padding: 16px; }
  .card + .card, .cards + .card, .card + .cards { margin-top: 12px; }
}

@media (max-width: 640px) {
  /* .field-search input sets 14px explicitly (styles.css:842), which beats the blanket 16px rule
     above it at equal specificity by being more specific. It is the deposits page's only search
     box, so under iOS the page zoomed the moment the operator tapped it. */
  .field-search input { font-size: var(--t-input); }
}

/* .kpi-3 replaces an INLINE grid-template-columns:repeat(3,1fr) on the expenses page. Inline styles
   beat every stylesheet rule, so both mobile fallbacks (2 columns at 900px and at 640px) were dead
   and the page forced three columns onto a 390px phone: each card got 113px while "€233,801.61"
   needs 145px, so the value overflowed its own box and pushed the document to 408px wide.
   As a class it obeys the breakpoints again — three across only where three fit. */
.kpi-grid.kpi-3 { grid-template-columns: repeat(3, 1fr); }
@media (max-width: 900px) { .kpi-grid.kpi-3 { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 640px) { .kpi-grid.kpi-3 { grid-template-columns: 1fr; } }

/* Po ky rregull duhej të vlente për ÇDO .kpi-grid, jo vetëm për ato që mbajnë .kpi-3.
   Depozitat kishin tre karta pa atë klasë: 115px kolonë për një shifër 133px të gjerë,
   pra "€17,214.48" pritej — shuma totale e depozitave, e palexueshme, në telefon.
   E lidhur me elementin dhe jo me një klasë që dikush duhet ta mbajë mend ta shtojë. */
@media (max-width: 640px) { .kpi-grid { grid-template-columns: 1fr; } }

/* ============================================================
   VISUAL POLISH — mobile, 2026-08-12
   The app was functionally correct but read as unfinished: every page had a slightly different
   rhythm, numbers sat at the same weight as their labels, and every surface had the same flat
   border. These rules give the phone ONE rhythm and let the figures lead. Nothing here changes a
   value, a layout decision or desktop.
   ============================================================ */
@media (max-width: 640px) {

  /* ── Rhythm ──
     One vertical step for everything. Cards previously varied 12/16/20/24px page to page, which is
     precisely what "not unified" looks like even when nothing is broken. */
  .content > * + * { margin-top: 14px; }
  .card { border-radius: 16px; }

  /* ── Let the numbers lead ──
     A figure and its label carried nearly the same visual weight, so the eye had nothing to land on.
     Tighter tracking + tabular figures also stop digits shifting as live values tick. */
  .kpi-value, .amount, .nh-step-val, .pay-f-net .pay-f-v {
    letter-spacing: -0.02em;
    font-variant-numeric: tabular-nums;
  }
  .card-sub, .kpi-label, .pay-f-k, .nh-step-label {
    font-size: var(--t-micro); letter-spacing: .03em;
  }

  /* ── Section titles ──
     The gold rule beside a title is the app's signature; it was inconsistent in height between
     pages. Pin it to the cap height of the text it sits against. */
  .card-title { font-size: var(--t-lead); letter-spacing: -0.01em; }

  /* ── Depth without weight ──
     A single hairline plus a whisper of lift reads as a surface. The previous flat 1px border on a
     near-black background made every card look like a wireframe. */
  .card, .glass-card {
    box-shadow: 0 1px 0 rgba(255,255,255,.03) inset, 0 8px 24px -18px rgba(0,0,0,.9);
  }

  /* ── Touch feedback ──
     Nothing acknowledged a tap. 90ms is under the threshold where a delay is perceived as lag, so
     it reads as the surface responding rather than as an animation. */
  .card.clickable:active, .lg-chip:active, .qa-chip:active,
  .btn:active, .nav-item:active, .bottomnav a:active, .bottomnav .nav-more:active {
    transform: scale(.985);
    transition: transform .09s ease;
  }

  /* ── Empty states ──
     "Asnjë lëvizje me këta filtra." was body text floating in a cell. Centred, muted and given room,
     an empty state looks intended rather than broken. */
  td[colspan] { padding: 28px 16px !important; color: var(--muted); }

  /* ── Scroll affordance ──
     A strip that scrolls sideways with no visual hint reads as content that is simply cut off. */
  .lg-filters .chips, .qa-bar {
    mask-image: linear-gradient(to right, #000 calc(100% - 24px), transparent);
    -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 24px), transparent);
  }
}

/* Respect the system setting. Anyone who asked for less motion gets none of the above. */
@media (prefers-reduced-motion: reduce) {
  .card.clickable:active, .lg-chip:active, .qa-chip:active,
  .btn:active, .nav-item:active, .bottomnav a:active, .bottomnav .nav-more:active { transform: none; }
}

/* ===================================================================
   TRANSAKSIONET — rreshti si pasqyrë banke (vetëm telefon)
   -------------------------------------------------------------------
   Pamja e përgjithshme .table.cards jep një rresht etiketë/vlerë për çdo
   kolonë: gjashtë rreshta, ~260px për lëvizje. Me 128 lëvizje kjo bëhet
   një faqe 35,000px — dyzet ekrane rrëshqitje për të parë një listë.
   Një pasqyrë banke e zgjidh të njëjtën gjë me dy rreshta: përshkrimi
   dhe shuma lart, konteksti poshtë me shkronja të vogla.
   Ky bllok prek VETËM #lgTable; kartat e pagave, depozitave dhe
   punonjësve mbeten pikërisht siç janë.
   =================================================================== */
@media (max-width: 720px) {
  /* Zgjedhësi i muajit: 158px kuti për 232px përmbajtje — "Të gjitha
     kohërat ›" pritej. Rresht i vetin, gjerësi e plotë. Vlen për çdo
     .card-head, se i njëjti zgjedhës është edhe te paneli, depozitat,
     shpenzimet dhe pagat. */
  .card-head { flex-wrap: wrap; }
  .card-head > .month-select { width: 100%; justify-content: space-between; }
  .card-head > .month-select .month-label { flex: 1 1 auto; text-align: center; }

  #lgTable tbody tr {
    display: grid;
    /* kolona 3 = 1fr thith hapësirën e tepërt, që "Origjinali" të ngjitet djathtas */
    grid-template-columns: auto auto 1fr auto;
    grid-template-areas:
      "hero hero hero amt"
      "typ  dat  met  org";
    column-gap: 10px; row-gap: 7px;
    align-items: baseline;
    padding: 13px 14px;
  }
  #lgTable tbody td {
    display: block; padding: 0; margin: 0; border: 0;
    min-height: 0;
    text-align: left;
  }
  /* min-width:0 VETËM te hero-ja. Kur e kisha te çdo qelizë, kolona 1fr e "Metoda"
     lejohej të tkurrej nën përmbajtjen e vet dhe "crypto" pritej në "cryp". Qelizat e
     meta-s e mbajnë minimumin e tyre natyral; vetëm përshkrimi tkurret e mbështillet. */
  #lgTable tbody td.card-hero-cell { min-width: 0; }
  #lgTable tbody td::before { content: none; }   /* etiketat i zëvendëson pozicioni */

  #lgTable tbody td.card-hero-cell {
    grid-area: hero; border: 0; padding: 0; margin: 0;
  }
  #lgTable tbody td.card-hero-cell .person-name {
    font-weight: 650; font-size: var(--t-body); line-height: 1.3;
    overflow-wrap: anywhere;
  }
  #lgTable tbody td.card-hero-cell .person-sub {
    text-align: left; font-size: var(--t-micro); line-height: 1.35; margin-top: 2px;
    color: var(--muted); overflow-wrap: anywhere;
  }

  #lgTable tbody td[data-label="Në euro"] {
    grid-area: amt; justify-self: end; white-space: nowrap;
    font-size: var(--t-lead); font-weight: 800; font-variant-numeric: tabular-nums;
  }
  #lgTable tbody td[data-label="Lloji"]      { grid-area: typ; }
  #lgTable tbody td[data-label="Data"]       { grid-area: dat; white-space: nowrap; font-size: var(--t-label); }
  #lgTable tbody td[data-label="Metoda"]     { grid-area: met; font-size: var(--t-label); }
  #lgTable tbody td[data-label="Origjinali"] {
    grid-area: org; justify-self: end; white-space: nowrap; font-size: var(--t-label);
  }
  /* Fushat me vetëm një vizë largohen fare — rreshti i pagës do të lexonte
     "Paga · 1 Kor 2026 · — · —", tre të katërtat shenja pikësimi. */
  #lgTable tbody td.is-empty { display: none; }

  #lgTable tbody td[data-label="Lloji"] .badge { font-size: var(--t-micro); padding: 2px 7px; }
}

/* ===================================================================
   .table.cards — kreu i kartës si bllok, dhe radhë e pavarur nga HTML-ja
   -------------------------------------------------------------------
   Dy gabime që dolën kur Arka kaloi në këtë model:

   1) td.card-hero-cell trashëgonte display:flex nga rregulli i qelizave,
      pra fëmijët e tij rreshtoheshin KRAH PËR KRAH. Përshkrimi "Të tjera ·
      priza+detergjent" me nën-rreshtin "nga: HR - Proffesori" dilte i
      shpërndarë në tre kolona të ngjeshura. Kreu i një karte është tekst
      që rrjedh poshtë, jo rresht etiketë/vlerë.

   2) Radha e qelizave në kartë ishte radha e kolonave në tabelë. Te Arka
      kolona e parë është Data, prandaj karta hapej me "Data 11 Gsh" dhe
      përshkrimi vinte i dyti. Në desktop ajo radhë kolonash është e drejtë;
      në kartë kreu duhet lart. flex-direction:column + order e ndan radhën
      vizuale nga radha e HTML-së, pa prekur asnjë tabelë.
   =================================================================== */
@media (max-width: 720px) {
  .table.cards tbody tr { display: flex; flex-direction: column; }
  .table.cards tbody td.card-hero-cell { display: block; order: -1; }
  .table.cards tbody td.card-foot-cell { order: 99; }
}

/* ===================================================================
   "GJITHË KOHËN" — çelës pranë zgjedhësit të muajit
   -------------------------------------------------------------------
   I njëjti model që paneli e kishte të fshehur brenda <style>-it të vet
   si .period-alltime. Këtu në fletën e përbashkët, që Depozitat dhe
   Shpenzimet ta ndajnë të njëjtin pamje e sjellje në vend që secila
   faqe ta rishkruajë pak më ndryshe.
   =================================================================== */
.btn-alltime {
  flex: none; min-height: 40px; padding: 0 15px; border-radius: 999px; cursor: pointer;
  font-size: var(--t-small); font-weight: 600; letter-spacing: .01em;
  background: transparent; border: 1.5px solid var(--border-strong); color: var(--muted);
  transition: color .15s ease, border-color .15s ease, background .15s ease;
}
.btn-alltime:hover:not(.active) { color: var(--ink-2); border-color: var(--primary); }
/* Aktiv = çip i zgjedhur, jo veprim kryesor. Me indigo të plotë ky filtër peshonte
   njësoj sa "Regjistro shpenzim" dhe syri shkonte te filtri i parë — një kontroll
   pamjeje s'duhet të bërtasë më fort se butoni që shkruan në bazë. */
.btn-alltime.active {
  background: var(--primary-soft); border-color: var(--primary); color: var(--primary-hover);
}
.btn-alltime:focus-visible { outline: 2px solid var(--primary-hover); outline-offset: 2px; }
/* Kur shihet gjithë koha, shigjetat e muajit s'kanë ku të shkojnë. Të fshehura do
   ta bënin rreshtin të kërcente; të zbehta dhe të palëvizshme e thonë pse. */
.month-select.is-alltime .month-arrow { opacity: .3; pointer-events: none; }

@media (max-width: 720px) {
  /* Sa vetë teksti, jo gjerësi e plotë. E plotë e bënte të dukej butoni kryesor i
     faqes; si çip lexohet si ai që është — një filtër. 44px lartësi për prekjen. */
  .btn-alltime { min-height: 44px; padding: 0 18px; }
}

/* ===================================================================
   KOKA E FAQES NË TELEFON — çelësi, eksporti dhe veprimi kryesor
   -------------------------------------------------------------------
   Ishte: çipi 118px pranë një butoni "Eksporto" 236px, me tekste 13px
   dhe 14px, mbi një buton kryesor 14px. Tri madhësi shkronjash dhe dy
   gjerësi që s'kishin lidhje me njëra-tjetrën — rreshti dukej i rënë
   aty rastësisht. Dy butonat dytësorë ndajnë rreshtin njëlloj, të tre
   marrin të njëjtën madhësi teksti, dhe zgjedhësi i muajit merr të
   njëjtën lartësi 44px si ata.
   =================================================================== */
@media (max-width: 720px) {
  .page-head .row { align-items: stretch; }
  .page-head .row > .btn-alltime,
  .page-head .row > .btn-ghost { flex: 1 1 0; min-width: 0; padding-left: 10px; padding-right: 10px; }
  /* Veprimi kryesor merr rresht të vetin. Pa flex-basis:100% të tre butonat rrinë në
     një rresht dhe të dy dytësorët bien në 78px — aq ngushtë sa "Gjithë kohën" nis
     të pritet. Rresht i veçantë e mban edhe hierarkinë: shkruaj ≠ filtro. */
  .page-head .row > .btn-primary { flex: 1 1 100%; }
  .page-head .row > .btn,
  .page-head .row > .btn-alltime { font-size: var(--t-lead); min-height: 44px; }
  /* 52px, si shiriti i periudhës te Pagat, Bonuset dhe Paneli — i njëjti kontroll
     duhet të ketë të njëjtën lartësi edhe kur njëra faqe e mban brenda përmbajtjes. */
  .page-head .row > .month-select { min-height: 52px; }
  .page-head .row > .month-select .month-arrow { height: auto; align-self: stretch; }
  /* Kontur më i lexueshëm: ghost-i i mëparshëm shkrihej me sfondin dhe dukej i
     çaktivizuar pranë butonit kryesor plot ngjyrë. */
  .page-head .row > .btn-ghost { border-color: var(--border-strong); color: var(--ink-2); }
}

/* Rreshti i eksportit te Pagat dhe Punonjësit — ato faqe s'kanë .page-head .row,
   pra rregulli i mësipërm s'i prek. I njëjti trajtim: 44px, 15px, i gjerë sa duhet
   në telefon që të mos duket buton i harruar në cep. */
.export-row { display: flex; justify-content: flex-end; margin-bottom: var(--s2); }
@media (max-width: 720px) {
  .export-row { margin-bottom: 12px; }
  .export-row .btn { flex: 1 1 auto; min-height: 44px; font-size: var(--t-lead); border-color: var(--border-strong); color: var(--ink-2); }
}

/* ===================================================================
   NAVIGIMI I TELEFONIT — 4 destinacione + "Më shumë"
   -------------------------------------------------------------------
   Ishte: shirit me 4 zëra për një aplikacion me 10 faqe. Gjashtë faqe —
   Arka, Transaksionet, Shpenzimet, Bonuset, Hierarkia, Cilësimet —
   arriheshin VETËM duke hapur sirtarin e hamburgerit, i cili është
   sidebar-i i desktopit i shtypur në telefon. Dhe kur ishe në njërën
   prej tyre, shiriti poshtë s'ndriçonte asgjë: faqja ku ndodheshe nuk
   ekzistonte për navigimin.

   Tani zëri i pestë hap një fletë me pjesën tjetër. Çdo faqe arrihet me
   dy prekje, çdo faqe ka gjendje aktive, dhe gishti nuk lëviz nga fundi
   i ekranit. Sirtari mbetet për desktop; në telefon s'është më i vetmi
   rrugëdalje.
   =================================================================== */
.nav-sheet-scrim {
  position: fixed; inset: 0; z-index: 90; background: rgba(3,6,15,.62);
  opacity: 0; pointer-events: none; transition: opacity .18s ease;
  -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px);
}
body.sheet-open .nav-sheet-scrim { opacity: 1; pointer-events: auto; }

.nav-sheet {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 91;
  background: var(--card); border-top: 1px solid var(--border-strong);
  border-radius: var(--radius-lg) var(--radius-lg) 0 0; box-shadow: var(--shadow-lg);
  padding: 10px 14px calc(14px + env(safe-area-inset-bottom));
  transform: translateY(101%); transition: transform .24s cubic-bezier(.32,.72,0,1);
  max-height: 78dvh; overflow-y: auto;
}
body.sheet-open .nav-sheet { transform: translateY(0); }
/* Doreza — thotë "tërhiqe poshtë" pa asnjë fjalë. */
.nav-sheet .grip {
  width: 38px; height: 4px; border-radius: 999px; background: var(--border-strong);
  margin: 2px auto 12px;
}
.nav-sheet h2 {
  margin: 0 0 10px; padding: 0 4px; color: var(--muted);
  font-size: var(--t-label); font-weight: 700; letter-spacing: .04em; text-transform: uppercase;
}
.nav-sheet-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
.nav-sheet-grid a {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 7px;
  min-height: 82px; padding: 12px 6px; border-radius: var(--radius-sm);
  background: var(--surface); border: 1px solid var(--border);
  color: var(--ink-2); text-decoration: none; text-align: center;
  font-size: var(--t-label); font-weight: 600; line-height: 1.25;
  transition: background .15s ease, border-color .15s ease, transform .12s ease;
}
.nav-sheet-grid a svg { width: 20px; height: 20px; opacity: .85; }
.nav-sheet-grid a:active { transform: scale(.97); }
.nav-sheet-grid a.active {
  background: var(--primary-soft); border-color: var(--primary); color: var(--primary-hover);
}
.nav-sheet-grid a.active svg { opacity: 1; }

/* Butoni "Më shumë" stilohet nga TË NJËJTAT rregulla si <a>-të e shiritit (shih
   përzgjedhësit e zgjeruar më lart). Këtu mbeten vetëm ndryshimet e panevojshme që
   një <button> i sjell me vete: sfond, kornizë, familje shkronjash.
   Pa këtë ai dilte 105px i gjerë përballë 69px, me ikonë 24px përballë 20px dhe
   tekst 14px përballë 11px — dhe pikat rrinin krah fjalëve, jo sipër tyre. */
.bottomnav .nav-more { background: none; border: 0; font-family: inherit; cursor: pointer; }
body.sheet-open .bottomnav .nav-more { color: var(--primary); }
body.sheet-open .bottomnav .nav-more svg { opacity: 1; }

/* ===================================================================
   KOKA E FAQES NË TELEFON — një emër, një rresht
   -------------------------------------------------------------------
   Pesë faqe hapeshin me: një <h1> që përsëriste fjalë për fjalë titullin
   e shiritit lart, pastaj DY paragrafë që thoshin të njëjtën gjë me
   fjalë të tjera. Te Depozitat: "Depozitat" · "Të ardhurat e zyrës —
   futen manualisht." · "Regjistro dhe kontrollo çdo depozitë të zyrës,
   muaj pas muaji." Tri deklarata para shifrës së parë.

   Kjo shpjegonte edhe pse faqet nis(n)in në lartësi të ndryshme: 137px
   te disa, 76px te të tjerat. Titulli i takon shiritit lart — aty është
   gjithmonë i dukshëm — dhe një rresht mjafton për kontekstin.
   Në desktop asgjë nuk ndryshon: hapësira atje nuk kushton.
   =================================================================== */
@media (max-width: 720px) {
  .page-head .welcome h1 { display: none; }
  .page-head .welcome > p.page-sub { display: none; }
  .page-head .welcome > p {
    margin: 0 0 var(--s1h); color: var(--muted);
    font-size: var(--t-small); line-height: 1.5;
  }
  .page-head { padding-bottom: 0; }
}

/* ===================================================================
   PREKJA — asgjë nën 44px që preket me gisht
   -------------------------------------------------------------------
   Auditimi numëroi: 36 inpute bonusi 38px, çipa kategorish 36px, butoni
   i pastrimit të kërkimit 36×36, dhe çelësi "gjithë kohën" i panelit 30px
   ndërsa i njëjti çelës te Depozitat e Shpenzimet ishte 44px — dy
   komponentë për të njëjtën punë, me dy përmasa.
   =================================================================== */
@media (max-width: 720px) {
  /* inputet brenda listave (bonuset, pagat) */
  .pay-input, .bonus-input { min-height: var(--tap); font-size: var(--t-body); }
  /* Çipat e filtrave: --tap, jo --tap-sm. Ky rregull dhe ai i .lg-chip te blloku
     ≤640px e kundërshtonin njëri-tjetrin — atje shkruhej 44px, këtu 40px, dhe meqë ky
     vjen më poshtë në skedar fitonte gjithmonë ky. Rezultati: rregulli 44px ishte i
     shkruar, i lexueshëm dhe krejt i pazbatuar (matur .lg-chip 84x40 te 390px).
     Njëri nga të dy duhej hequr; mbetet 44px, sepse rregulli 5 nuk ka përjashtim për
     "dytësorë" dhe çipi është i vetmi kontroll i filtrimit në telefon. */
  .cf-chip, .st-chip, .chip, .seg button, .lg-chip { min-height: var(--tap); }
  /* pastrimi i kërkimit ishte 36×36 brenda një fushe 48px */
  .es-clear { min-width: var(--tap); min-height: var(--tap); }
  /* lidhjet tekst te paneli ("Shiko të gjitha") ishin 17–20px të larta */
  .section-link { display: inline-flex; align-items: center; min-height: var(--tap); }
  /* Butoni me ikonë: 30px bazë, 40px te .table.cards dhe 34px te tri listat e telefonit —
     tri përmasa për të njëjtin buton "ndrysho / fshi", dhe të treja nën masë. Zonën e
     prekjes e ngre pa e rritur ikonën; kostoja në lartësi rreshti u mat, jo u hamendësua. */
  .btn-icon { min-width: var(--tap); min-height: var(--tap); }
  /* E DETYRUESHME BASHKË ME RREGULLIN SIPËR, jo zbukurim. Me butonat 44px, shuma plus
     çifti i tyre (92px) nuk hyn më te qeliza e shumës: matur tejmbushje horizontale
     393px te një ekran 390px (Shpenzimet) dhe 327px te 320px (Depozitat) — pikërisht
     rregulli 5 i thyer nga ndreqja e rregullit 5. Zgjidhja nuk është t'i shtypim
     butonat prapa nën masë, por t'i lëmë të zbresin në rreshtin poshtë kur s'hyjnë. */
  .pay-status-cell { flex-wrap: wrap; justify-content: flex-end; min-width: 0; }
  .row-actions { flex: none; }
}

/* Çelësi "gjithë kohën" i panelit ishte klasë e vetën, .period-alltime, i
   përkufizuar brenda <style>-it të dashboard.html: 30px i lartë, 13px tekst,
   ndërsa .btn-alltime te Depozitat e Shpenzimet është 44px me 15px. I njëjti
   veprim, dy pamje. Këtu barazohet me të, pa prekur HTML-në e panelit. */
.period-alltime {
  min-height: var(--tap-sm); padding: 0 15px; border-radius: var(--radius-pill);
  font-size: var(--t-small); font-weight: 600;
  border: 1.5px solid var(--border-strong); background: transparent; color: var(--muted);
}
.period-alltime.active {
  background: var(--primary-soft); border-color: var(--primary); color: var(--primary-hover);
}
@media (max-width: 720px) {
  .period-alltime { min-height: var(--tap); font-size: var(--t-body); }
}

/* Qeliza e shumës te Transaksionet dilte 2px jashtë kornizës në telefon 360px:
   kolona e fundit ishte `auto`, pra rritej sa përmbajtja pa e lëshuar kurrë
   hapësirën. Tani lejohet të tkurret, dhe teksti nuk mbështillet. */
/* Ky bllok ishte shkruar për telefonat 360px, por 390px hyn po ashtu nën 400px dhe
   `minmax(0,1fr)` e lejonte kolonën e Metodës të binte nën përmbajtjen e vet: "cash"
   dilte 10px e gjerë. Zgjidhja e vërtetë nuk është ta shtypësh një kolonë por t'i
   heqësh hapësirë rreshtit — hapësira dhe shkronjat, jo përmbajtja. */
@media (max-width: 400px) {
  #lgTable tbody tr { column-gap: 7px; padding-left: 12px; padding-right: 12px; }
  /* Nën 340px katër fusha meta nuk nxënë në një rresht sado t'u shkurtohet hapësira:
     shuma e përmbajtjes së tyre e kalon vetë gjerësinë e ekranit. Aty rreshti i meta-s
     ndahet në dy — dy fusha lart, dy poshtë — në vend që një prej tyre të pritet. */
  @media (max-width: 340px) {
    #lgTable tbody tr {
      grid-template-columns: auto minmax(0, 1fr);
      grid-template-areas: "hero amt" "typ dat" "met org";
      row-gap: 5px;
    }
    #lgTable tbody td[data-label="Data"],
    #lgTable tbody td[data-label="Origjinali"] { justify-self: end; }
  }
  #lgTable tbody td[data-label="Data"] { font-size: var(--t-micro); }
  #lgTable tbody td[data-label="Origjinali"] { font-size: var(--t-micro); }
  #lgTable tbody td[data-label="Lloji"] .badge { font-size: 10px; padding: 2px 6px; }
}

/* Në 320px (iPhone SE i vjetër / Android i vogël) dy select-at e filtrave krah për
   krah kërkojnë 331px dhe faqja rrëshqiste anash — e vetmja tejmbushje e mbetur në
   gjithë aplikacionin. Nën 340px rreshtohen njëri mbi tjetrin. */
@media (max-width: 340px) {
  /* .lg-row2 është flex, jo grid — grid-template-columns këtu s'bënte asgjë. */
  .lg-row2 { flex-direction: column; }
  .lg-row2 > * { width: 100%; }
}

/* ===================================================================
   SHIRITI I PERIUDHËS — një komponent, jo tre
   -------------------------------------------------------------------
   Ishin tre trajtime të ndryshme për të njëjtin kontroll:
     · Pagat/Bonuset — shirit i ngjitur, 65px, pa kornizë
     · Paneli        — shirit jo i ngjitur, 61px, me çip "Gjithë kohën"
     · Depozitat/Shpenzimet/Transaksionet — kontroll me kornizë brenda
       përmbajtjes, 40–44px, që rrëshqet dhe humbet
   Një përdorues që kalon nga Pagat te Shpenzimet shihte dy kontrolle
   që s'kanë asgjë të përbashkët përveç funksionit.

   Të dy shiritat e ngjitur kishin edhe një defekt: `background:
   var(--card-bg)` — token që NUK përkufizohet askund, pra ngjyra dilte
   rgba(0,0,0,0) dhe përmbajtja rrëshqiste e dukshme poshtë shiritit.

   Tani: e njëjta lartësi, e njëjta tipografi, e njëjta shigjetë, sfond
   i patejdukshëm, dhe të ngjitur kudo — sepse në një listë 13,000px
   të gjatë periudha që po shikon duhet të mbetet në ekran.
   =================================================================== */
.period-bar, .month-bar-mobile {
  position: sticky; top: 0; z-index: 20;
  display: flex; align-items: center; gap: var(--s1);
  min-height: 52px; padding: 7px var(--s1h);
  background: var(--card); border-bottom: 1px solid var(--border);
  /* Sfondi është i patejdukshëm, por pak mjegull e bën kalimin më të butë
     kur përmbajtja lëviz poshtë tij. */
  -webkit-backdrop-filter: saturate(1.4) blur(8px); backdrop-filter: saturate(1.4) blur(8px);
}
.period-arrow, .month-bar-mobile .month-arrow {
  flex: none; display: grid; place-items: center;
  width: var(--tap); height: var(--tap); border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: transparent; color: var(--ink-2);
  cursor: pointer; transition: border-color .15s ease, color .15s ease;
}
.period-arrow:hover:not(:disabled), .month-bar-mobile .month-arrow:hover { border-color: var(--primary); color: var(--ink); }
.period-arrow:disabled { opacity: .35; cursor: default; }
.period-label-btn, .month-bar-mobile .month-label-text {
  flex: 1 1 auto; min-width: 0; text-align: center;
  font-size: var(--t-lead); font-weight: 700; color: var(--ink);
  border: 0; background: none; padding: 0 var(--s1);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

@media (max-width: 720px) {
  /* Kontrolli brenda përmbajtjes merr të njëjtën lartësi dhe tipografi si shiriti,
     që të dy variantet të duken i njëjti objekt edhe kur nuk janë i njëjti element. */
  .month-select { height: auto; min-height: 52px; border-radius: var(--radius-sm); }
  .month-select .month-arrow { width: var(--tap); min-height: var(--tap); }
  .month-select .month-label,
  .month-select .month-label-text { font-size: var(--t-lead); font-weight: 700; color: var(--ink); }
}

/* <button> pa font-size trashëgon 13.3333px nga shfletuesi, jo nga faqja — dhe
   auditimi e gjeti pikërisht këtë vlerë të çuditshme te .es-clear, .edit-btn,
   .del-btn dhe .month-arrow. Nuk duket sepse ato mbajnë vetëm ikona, por çdo
   tekst që shtohet aty nesër do të dilte i një madhësie që s'ekziston askund
   tjetër në aplikacion. */
button, input, select, textarea { font-family: inherit; }
button { font-size: var(--t-body); }

/* ===================================================================
   DIALOGËT — fletë në telefon, dialog i qendërzuar në desktop
   -------------------------------------------------------------------
   Të tetë dialogët e aplikacionit krijoheshin me të njëjtin stil inline:
   `display:grid; place-items:center` — pra një kuti që noton në mes të
   ekranit me 20px hapësirë rreth. Në desktop kjo është e drejtë. Në
   telefon është dialog desktopi i shfaqur në telefon: gishti duhet të
   ngjitet lart, karta nuk arrin buzët, dhe s'ka as dorezë as gjest për
   ta mbyllur.

   Modali i Punonjësve (i shkruar veç, brenda faqes) e kishte bërë të
   drejtën prej kohësh: fletë poshtë me dorezë. Këtu i barazohen të tetë.

   Stili ishte INLINE, pra asnjë rregull i fletës së stilit nuk mund ta
   mundte — prandaj kalimi kërkoi prekjen e app.js, jo vetëm CSS.
   =================================================================== */
.app-modal {
  position: fixed; inset: 0; z-index: 9998;
  background: rgba(3, 6, 15, .62);
  -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px);
  display: grid; place-items: center; padding: 20px;
}
.app-modal--top { z-index: 10000; }

@media (max-width: 720px) {
  .app-modal { place-items: end stretch; padding: 0; }
  .app-modal > .card {
    max-width: none !important; width: 100% !important;
    border-radius: var(--radius-lg) var(--radius-lg) 0 0;
    border-bottom: 0;
    max-height: 92dvh; overflow-y: auto;
    padding-bottom: calc(var(--s2) + env(safe-area-inset-bottom));
    animation: sheetUp .24s cubic-bezier(.32,.72,0,1);
  }
  /* Doreza — i njëjti sinjal si te fleta e navigimit dhe ajo e punonjësve. */
  .app-modal > .card::before {
    content: ""; display: block; width: 38px; height: 4px; border-radius: 999px;
    background: var(--border-strong); margin: -4px auto 14px;
  }
}
@keyframes sheetUp { from { transform: translateY(14%); } to { transform: translateY(0); } }
@media (prefers-reduced-motion: reduce) { .app-modal > .card { animation: none; } }

/* ===================================================================
   PREZENCA — dy portale, një orë që s'ndalon, tre butona
   -------------------------------------------------------------------
   Portali majtas mban ata që s'kanë ardhur, djathtas ata që janë brenda.
   Mes tyre ora e vërtetë, që vazhdon të ecë: recepsionistja sheh ÇFARË
   ore po vulos, jo thjesht që diçka u shënua. Poshtë, tre butona —
   Hyri · Doli · Nuk erdhi.

   Emri prek një herë, butoni një herë. Emri kalon nga portali majtas te
   ai djathtas para syve të saj, dhe kjo është konfirmimi. Butonat ndizen
   vetëm për atë që është e mundur: një buton i shtypshëm që kthen gabim
   është mënyra më e shpejtë për ta ngatërruar.

   E gjithë faqja rri në një ekran pa rrëshqitje: portalet rrëshqasin
   brenda vetes, ora dhe butonat nuk lëvizin kurrë nga vendi.
   =================================================================== */
.att-screen { display: flex; flex-direction: column; min-height: 0; }

.att-daybar {
  position: sticky; top: 0; z-index: 20;
  display: flex; align-items: center; gap: var(--s1);
  min-height: 52px; margin: calc(var(--s2) * -1) calc(var(--s1h) * -1) var(--s1h);
  padding: 7px var(--s1h);
  background: var(--card); border-bottom: 1px solid var(--border);
}
.att-daybar .month-label-text {
  flex: 1 1 auto; min-width: 0; text-align: center;
  font-size: var(--t-lead); font-weight: 700; color: var(--ink);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.att-daybar .month-arrow {
  flex: none; display: grid; place-items: center;
  width: var(--tap); height: var(--tap); border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: transparent; color: var(--ink-2); cursor: pointer;
}
.att-daybar .month-arrow:disabled { opacity: .3; cursor: default; }
/* 44px e jo 40px: i vetmi element nën masë te vetë kjo faqe, matur 62x40. Nuk kushton
   asnjë piksel — shiriti i ditës është tashmë 59px sepse e përcaktojnë shigjetat 44px,
   dhe te recepsioni ky buton fshihet fare nga .hide-reception. */
.att-monthbtn {
  flex: none; min-height: var(--tap); padding: 0 13px; border-radius: var(--radius-pill);
  border: 1.5px solid var(--border-strong); background: transparent; color: var(--muted);
  font-size: var(--t-small); font-weight: 600; cursor: pointer;
}
.att-monthbtn.on { background: var(--primary-soft); border-color: var(--primary); color: var(--primary-hover); }

/* ---- portalet ---- */
.att-portals { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; min-height: 0; }
.att-portal {
  display: flex; flex-direction: column; min-height: 0;
  background: var(--card); border: 1px solid var(--border); border-radius: var(--radius-sm);
  overflow: hidden;
}
.att-portal > header {
  display: flex; align-items: center; gap: 6px;
  padding: 9px var(--s1h); border-bottom: 1px solid var(--border);
  font-size: var(--t-label); font-weight: 700; color: var(--ink-2);
  letter-spacing: .02em; white-space: nowrap;
}
.att-portal > header b {
  margin-left: auto; font-size: var(--t-body); font-weight: 800; color: var(--ink);
  font-variant-numeric: tabular-nums;
}
.att-portal .dot { width: 7px; height: 7px; border-radius: 50%; flex: none; }
.att-portal .dot.pend { background: var(--muted); }
.att-portal .dot.live { background: var(--success); box-shadow: 0 0 0 3px rgba(52,211,153,.16); }
.att-scroll {
  flex: 1 1 auto; overflow-y: auto; -webkit-overflow-scrolling: touch;
  padding: 6px; display: flex; flex-direction: column; gap: 5px;
  /* Lartësi e caktuar: ora dhe butonat s'duhet të dalin kurrë jashtë ekranit,
     prandaj rrëshqet lista, jo faqja. */
  /* Njësoj për pronarin, plus 76px që i takojnë shiritit të navigimit poshtë. */
  max-height: calc(100dvh - 436px); min-height: 130px;
}
.att-chip {
  display: flex; align-items: center; gap: 8px; width: 100%;
  min-height: var(--tap); padding: 5px 8px; cursor: pointer; text-align: left;
  background: var(--surface); border: 1.5px solid transparent; border-radius: var(--radius-xs);
  color: var(--ink-2); transition: border-color .12s ease, background .12s ease, transform .1s ease;
}
.att-chip .avatar { width: 26px; height: 26px; font-size: 10px; flex: none; }
.att-cn {
  flex: 1 1 auto; min-width: 0; font-size: var(--t-small); font-weight: 600; color: var(--ink);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.att-ct { flex: none; font-size: var(--t-micro); color: var(--success); font-variant-numeric: tabular-nums; font-weight: 700; }
.att-chip:active { transform: scale(.97); }
.att-chip.on { border-color: var(--primary); background: var(--primary-soft); }
.att-pempty { padding: var(--s3) 8px; text-align: center; color: var(--muted); font-size: var(--t-label); }

/* ---- ora ---- */
.att-clock {
  margin: var(--s1h) 0; padding: var(--s1h) var(--s2);
  border: 1px solid var(--border-strong); border-radius: var(--radius);
  background: linear-gradient(180deg, rgba(26,33,56,.9), rgba(18,24,41,.95));
  text-align: center; transition: border-color .3s ease, box-shadow .3s ease;
}
.att-time {
  display: flex; align-items: baseline; justify-content: center; gap: 4px;
  font-variant-numeric: tabular-nums; letter-spacing: -.5px;
}
.att-time span { font-size: 34px; font-weight: 800; color: var(--ink); line-height: 1; }
.att-time small { font-size: var(--t-body); font-weight: 700; color: var(--muted); }
.att-sel {
  margin-top: 6px; font-size: var(--t-small); color: var(--muted);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.att-sel.has { color: var(--primary-hover); font-weight: 700; }
.att-clock.f-in  { border-color: var(--primary); box-shadow: 0 0 0 3px var(--primary-glow); }
.att-clock.f-out { border-color: var(--success); box-shadow: 0 0 0 3px rgba(52,211,153,.25); }
.att-clock.f-no  { border-color: var(--danger);  box-shadow: 0 0 0 3px rgba(248,113,113,.22); }

/* ---- tre butonat ---- */
.att-actions { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 8px; }
.att-btn {
  min-height: 52px; padding: 0 6px; border: 0; border-radius: var(--radius-sm); cursor: pointer;
  font-size: var(--t-body); font-weight: 700; color: #fff;
  transition: transform .1s ease, filter .18s ease, opacity .18s ease;
}
.att-btn.in  { background: linear-gradient(135deg, #818cf8, #4f46e5); }
.att-btn.out { background: linear-gradient(135deg, #34d399, #059669); }
.att-btn.no  { background: linear-gradient(135deg, #f87171, #dc2626); }
.att-btn:active:not(:disabled) { transform: scale(.96); }
.att-btn:disabled { opacity: .26; cursor: default; }

.att-foot {
  display: flex; align-items: center; gap: var(--s1h); flex-wrap: wrap;
  margin-top: var(--s1h); padding-top: var(--s1h); border-top: 1px solid var(--border);
  font-size: var(--t-label); color: var(--muted);
}
.att-foot b { color: var(--ink); font-weight: 800; font-variant-numeric: tabular-nums; }
/* "Kthe një hap" shfaqet vetëm pasi zgjidhet një emër, prandaj një kontroll që hap faqen
   dhe mat, e humbet: te matja e parë dilte i padukshëm dhe kontrolli i gjelbër. Matur pas
   zgjedhjes: 106x40. Nuk prek buxhetin e butonave — .att-foot rri NËN .att-actions. */
.att-undo2 {
  margin-left: auto; min-height: var(--tap); padding: 0 13px;
  border-radius: var(--radius-pill); border: 1px solid var(--border-strong);
  background: transparent; color: var(--ink-2); font-size: var(--t-label); font-weight: 600; cursor: pointer;
}

/* Pamja mujore e mbulon punën e ditës — dy punë krejt të ndryshme, jo dy pjesë të një ekrani. */
.att-monthwrap { margin-top: var(--s2); }
body.att-monthing .att-portals,
body.att-monthing .att-clock,
body.att-monthing .att-actions,
body.att-monthing .att-foot { display: none; }

.att-row {
  display: flex; align-items: center; gap: var(--s1h);
  padding: 10px var(--s1h); margin-bottom: 8px;
  background: var(--card); border: 1px solid var(--border); border-radius: var(--radius-sm);
}
.att-who { flex: 1 1 auto; min-width: 0; }
.att-name { font-size: var(--t-body); font-weight: 650; color: var(--ink); overflow-wrap: anywhere; }
.att-meta { font-size: var(--t-label); color: var(--muted); margin-top: 2px; }
.att-msum { color: var(--muted); font-size: var(--t-label); margin-bottom: var(--s1h); }
.att-mrow { flex-wrap: wrap; row-gap: 10px; }
.att-mrow .att-who { flex: 1 1 100%; order: 1; }
.att-mrow .avatar { order: 0; }
.att-mrow .att-mstats {
  order: 2; flex: 1 1 0; min-width: 0; text-align: center;
  padding: 7px 4px; background: var(--surface); border-radius: var(--radius-xs);
}
.att-mrow .att-mstats b { display: block; font-size: var(--t-small); font-weight: 800; color: var(--ink); font-variant-numeric: tabular-nums; }
.att-mrow .att-mstats span { font-size: 10px; color: var(--muted); text-transform: uppercase; letter-spacing: .04em; }

.att-toast {
  position: fixed; left: 50%; transform: translateX(-50%);
  bottom: calc(76px + env(safe-area-inset-bottom)); z-index: 10001;
  max-width: calc(100vw - 32px);
  padding: 11px 16px; border-radius: var(--radius-sm);
  background: var(--elevated); border: 1px solid rgba(248,113,113,.4); color: var(--danger-ink);
  font-size: var(--t-small); font-weight: 600; box-shadow: var(--shadow-md);
  transition: opacity .3s ease;
}
.att-toast.gone { opacity: 0; }

body.is-reception .hide-reception,
body.is-reception .att-daybar .month-arrow,
body.is-reception .sidebar,
body.is-reception .bottomnav,
body.is-reception .hamburger { display: none; }
body.is-reception .att-daybar { justify-content: center; }
body.is-reception .main { margin-left: 0; }

/* Ekrani përshtatet vetë, në vend që lartësia e portaleve të hamendësohet me dvh.
   Përmbajtja mbante 96px hapësirë poshtë për shiritin e navigimit — që te recepsioni
   as nuk ekziston — dhe pikërisht ajo e shtynte faqen 89px përtej ekranit. Butonat
   duhet të jenë GJITHMONË në ekran: janë e vetmja gjë që ajo shtyp. */
body.is-reception .content { padding-bottom: calc(10px + env(safe-area-inset-bottom)); }
/* Lartësia llogaritet, nuk hamendësohet. Provova me flex (min-height:0 nga rrënja) dhe
   lista u shty në 2176px: flex-i s'kufizon dot pa një lartësi të përcaktuar te prindi.
   360px = shiriti lart 60 + shiriti i ditës 52 + ora 86 + butonat 52 + përmbledhja 31
   + hapësirat. Ajo që mbetet i takon listës, në çdo telefon. */
body.is-reception .att-scroll { max-height: calc(100dvh - 360px); min-height: 120px; }

@media (min-width: 721px) {
  .att-scroll { max-height: 52vh; }
  .att-time span { font-size: 46px; }
  .att-mrow { flex-wrap: nowrap; }
  .att-mrow .att-who { flex: 1 1 auto; }
  .att-mrow .att-mstats { flex: none; min-width: 66px; background: none; padding: 0; }
}

/* ===================================================================
   PREZENCA — kërkimi i portalit, ndarja sipas kategorisë, ndreqja e ditës
   -------------------------------------------------------------------
   Rregulli që drejton çdo numër këtu: lartësia e portalit është e vetmja
   gjë që i mban tre butonat brenda ekranit. Prandaj asgjë e re nuk vendoset
   SIPËR listës — rreshti i kërkimit dhe titujt e kategorive rrinë BRENDA
   .att-scroll, ku lartësia është tashmë e kufizuar nga max-height dhe
   kushtojnë 0px. Kjo është arsyeja pse .att-scroll nuk merr asnjë zbritje
   kompensuese: po ta merrte, lista do të tkurrej pa asnjë shkak.
   =================================================================== */

/* ---- kërkimi i portalit ---- */
/* margin: 0 -6px e shtrin mbi padding-un 6px të .att-scroll, që asnjë chip të mos
   duket duke rrëshqitur në një brez anësor. top:-6px e ngjit fiq në buzë të listës;
   me top:0 do të mbetej një brez 6px ku chip-et kalojnë nën të. */
.att-pq {
  position: sticky; top: -6px; z-index: 2;
  display: flex; align-items: center; gap: 6px;
  margin: 0 -6px; padding: 0 10px; min-width: 0;
  background: var(--elevated); border-bottom: 1px solid var(--border);
  color: var(--muted);
}
.att-pq:focus-within { box-shadow: inset 0 0 0 1px var(--primary); }
.att-pq svg { width: 14px; height: 14px; flex: none; }
.att-pq input {
  flex: 1 1 auto; min-width: 0; min-height: var(--tap);
  border: 0; outline: 0; background: transparent; color: var(--ink);
  font-size: var(--t-small);
}
.att-pq input::placeholder { color: var(--ink-faint); }
/* Sa përputhen shfaqet KËTU, jo te koka e portalit: numri lart duhet të mbetet totali
   i ditës, përndryshe përmbledhja gënjen sapo dikush shkruan një shkronjë. */
.att-pq b {
  flex: none; padding-left: 4px;
  font-size: var(--t-micro); font-weight: 700; color: var(--ink-2);
  font-variant-numeric: tabular-nums;
}

/* ---- titulli i kategorisë ---- */
/* top:39px = 45px lartësia e .att-pq (44px input + 1px kornizë) minus 6px e top-it të
   saj negativ: titulli ngjitet fill nën kërkimin, jo nën të. */
.att-cat {
  position: sticky; top: 39px; z-index: 1;
  display: flex; align-items: center; gap: 6px;
  margin: 0 -6px; padding: 5px var(--s1h);
  background: var(--card); border-bottom: 1px solid var(--border);
  /* .02em e jo .04em: me .04em dy emra priteshin te 390px — "Agjentë Rekurente" donte
     128px dhe kishte 124, "Siguria e brendshme" 135 kundrejt 131. Të dy hyjnë të plotë
     me gjysmën e hapësirës midis shkronjave, dhe 390px është gjerësia më e zakonshme.
     Te 320/360 ato nuk hyjnë sido që të jetë — aty tri pikat janë përgjigjja e duhur. */
  font-size: var(--t-micro); font-weight: 700; letter-spacing: .02em;
  text-transform: uppercase; color: var(--muted);
}
/* Emri i gjatë ("Siguria e brendshme") pritet me tri pika: një portal është 140px i
   gjerë te 320px, dhe pa këtë do të shtynte numrin jashtë. */
.att-cat span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.att-cat b { margin-left: auto; padding-left: 6px; color: var(--ink-2); font-variant-numeric: tabular-nums; }

/* ---- dy segmentet e pamjes së pronarit ---- */
.att-seg {
  display: flex; gap: 4px; padding: 4px; margin-bottom: var(--s1h);
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-pill);
}
.att-seg button {
  flex: 1 1 0; min-width: 0; min-height: var(--tap);
  border: 0; border-radius: var(--radius-pill); background: transparent; color: var(--muted);
  font-size: var(--t-label); font-weight: 650; cursor: pointer;
}
.att-seg button.on { background: var(--elevated); color: var(--ink); }
.att-seg button:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }

/* ---- ndreqja e një dite ---- */
.att-fixnote {
  margin-bottom: var(--s1h); padding: var(--s1) var(--s1h);
  border-radius: var(--radius-xs);
  background: var(--warning-soft); color: var(--warning-ink);
  font-size: var(--t-label);
}
/* .att-fixrow rri mbi .att-row ekzistues, njësoj si .att-mrow. */
.att-fixrow { flex-wrap: wrap; row-gap: 10px; }
.att-fixrow .att-who { flex: 1 1 100%; order: 1; }
.att-fixrow .avatar { order: 0; }
/* flex-wrap KËTU është i detyrueshëm, jo zbukurim: Chrome nuk e lëshon dot një
   input[type=time] nën ~139px edhe me min-width:0. Dy fusha plus butoni duan 357px,
   ndërsa rreshti ka 262px te 320px dhe 332px te 390px. Pa mbështjellje faqja do të
   dilte më e gjerë se ekrani (tejmbushje horizontale, rregulli 5); me të, ajo që nuk
   hyn zbret në rreshtin poshtë dhe bëhet më e gjerë për t'u prekur. */
.att-fixtimes {
  order: 2; flex: 1 1 100%;
  display: flex; align-items: center; flex-wrap: wrap; gap: var(--s1);
}
.att-fixtimes input[type="time"] {
  flex: 1 1 120px; min-width: 0; min-height: var(--tap); padding: 0 8px;
  border: 1px solid var(--border); border-radius: var(--radius-xs);
  background: var(--surface); color: var(--ink);
  font-size: var(--t-small); font-variant-numeric: tabular-nums;
}
.att-fixtimes input[type="time"]:focus {
  outline: 0; border-color: var(--primary); box-shadow: 0 0 0 3px var(--primary-glow);
}
.att-fixtimes .btn { flex: 1 1 auto; }
/* Te ekrani i gjerë orët rrinë në të njëjtin rresht me emrin, njësoj si .att-mrow.
   Pa këtë, dy fusha ore shtriheshin mbi 400px secila. */
@media (min-width: 721px) {
  .att-fixrow { flex-wrap: nowrap; }
  .att-fixrow .att-who { flex: 1 1 auto; }
  .att-fixtimes { flex: 0 0 auto; flex-wrap: nowrap; }
  .att-fixtimes .btn { flex: none; }
  .att-fixtimes input[type="time"] { flex: none; width: 116px; }
}

/* Gjendja e rreshtit — e vetmja gjë që tregon PSE dikush duhet ndrequr.
   "Doli" dhe "Nuk erdhi" nuk shfaqen në asnjë portal, prandaj këtu duhen.
   `flex: none` bashkë me `inline-block`: rreshti i ndreqjes e vendos brenda tekstit,
   por po ta përdorë dikush nesër drejtpërdrejt në një rresht flex, s'duhet të tkurret. */
.att-hstate {
  display: inline-block; flex: none;
  padding: 2px 8px; border-radius: var(--radius-pill);
  font-size: var(--t-micro); font-weight: 700;
}
.att-hstate.s-in  { background: var(--primary-soft); color: var(--primary); }
.att-hstate.s-out { background: var(--success-soft); color: var(--success-ink); }
.att-hstate.s-abs { background: var(--danger-soft);  color: var(--danger-ink); }
.att-hstate.s-non { background: var(--surface);      color: var(--muted); }

/* ===================================================================
   SHPENZIMET — rreshti si pasqyrë, si te Transaksionet
   -------------------------------------------------------------------
   Rreshti ishte modeli i vjetër i kartës: pesë rreshta etiketë/vlerë,
   266px secili, dhe karta e regjistrit dilte 6,806px për 24 shpenzime.
   Ky është pikërisht problemi që u zgjidh te #lgTable (260px → 89px);
   Shpenzimet mbetën pas sepse u prekën në një raund tjetër.

   I njëjti rregull, i kufizuar te #finLedger: përshkrimi dhe shuma lart,
   data · grupi · metoda poshtë me shkronja të vogla. Butonat e ndryshimit
   dhe fshirjes rrinë brenda qelizës së shumës, ku ishin.
   =================================================================== */
@media (max-width: 720px) {
  #finLedger tr[data-tx] {
    display: grid;
    grid-template-columns: auto auto 1fr auto;
    grid-template-areas:
      "hero hero hero amt"
      "dat  grp  met  met";
    column-gap: 10px; row-gap: 7px;
    align-items: start;
    padding: 12px 14px;
  }
  #finLedger tr[data-tx] > td {
    display: block; padding: 0; margin: 0; border: 0; min-height: 0; text-align: left;
  }
  #finLedger tr[data-tx] > td::before { content: none; }   /* etiketat i zëvendëson pozicioni */

  #finLedger td.card-hero-cell { grid-area: hero; min-width: 0; }
  #finLedger td.card-hero-cell .person { gap: 9px; align-items: center; }
  #finLedger td.card-hero-cell .li-ico { width: 28px !important; height: 28px !important; flex: none; }
  #finLedger td.card-hero-cell .person-name {
    font-size: var(--t-body); font-weight: 650; line-height: 1.3; overflow-wrap: anywhere;
  }
  #finLedger td.card-hero-cell .person-sub {
    font-size: var(--t-micro); line-height: 1.35; margin-top: 1px; text-align: left; overflow-wrap: anywhere;
  }

  #finLedger td[data-label="Shuma"] {
    grid-area: amt; justify-self: end; align-self: center; white-space: nowrap;
    font-size: var(--t-lead); font-weight: 800; border: 0; margin: 0; padding: 0;
  }
  #finLedger td[data-label="Shuma"] .pay-status-cell { gap: 6px; }
  #finLedger td[data-label="Shuma"] .btn-icon { width: 34px; height: 34px; }

  #finLedger td[data-label="Data"]   { grid-area: dat; font-size: var(--t-micro); white-space: nowrap; }
  #finLedger td[data-label="Grupi"]  { grid-area: grp; }
  #finLedger td[data-label="Metoda"] { grid-area: met; }
  #finLedger td[data-label="Grupi"] .badge,
  #finLedger td[data-label="Metoda"] .method-chip { font-size: 10.5px; padding: 2px 7px; }
}

/* Qeliza e shumës (shuma + dy butona veprimi) me `auto` nuk lëshon kurrë hapësirë, prandaj
   rreshti dilte 20px jashtë kornizës në 320px dhe 13px në 360px. Aty shuma zbret në rreshtin
   e vet — më mirë një rresht më shumë sesa një faqe që rrëshqet anash.
   Pragu është 375px, jo 400px: në 390px (gjerësia më e zakonshme) nuk ka pasur kurrë
   tejmbushje, dhe 400px e detyronte rreshtin shtesë kot — 112px → 144px pa asnjë arsye. */
@media (max-width: 375px) {
  #finLedger tr[data-tx] {
    grid-template-columns: auto auto 1fr;
    grid-template-areas:
      "hero hero hero"
      "dat  grp  met"
      "amt  amt  amt";
    row-gap: 8px;
  }
  #finLedger td[data-label="Shuma"] { justify-self: stretch; min-width: 0; }
  #finLedger td[data-label="Shuma"] .pay-status-cell { justify-content: flex-end; }
}

/* ===================================================================
   GJENDJA E NGARKIMIT — forma e faqes para se të vijnë të dhënat
   -------------------------------------------------------------------
   Faqet hapeshin me "—" te shifrat dhe me tabelë bosh derisa kthehej
   kërkesa. Në lidhje të shpejtë kjo zgjat 200ms dhe s'e vëren; në 3G
   zgjat sekonda dhe duket faqe e prishur, jo faqe që po punon.

   Skeletonët nuk kërkojnë asnjë rresht JavaScript: vendosen si
   përmbajtje FILLESTARE në HTML dhe zhduken vetë, sepse çdo vizatim
   e zëvendëson innerHTML-në e kontejnerit. Pra s'ka gjendje për të
   mbajtur, s'ka çfarë të mbetet e ngecur nëse një kërkesë dështon —
   dështimi shfaq mesazhin e vet, siç bënte edhe më parë.
   =================================================================== */
@keyframes skPulse { 0%, 100% { opacity: .55; } 50% { opacity: .22; } }

.sk {
  display: inline-block; border-radius: var(--radius-xs);
  background: linear-gradient(90deg, var(--surface), var(--elevated), var(--surface));
  animation: skPulse 1.4s ease-in-out infinite;
  color: transparent !important; user-select: none;
}
.sk-line { height: 1em; min-width: 60px; vertical-align: middle; }
.sk-w40 { width: 40%; } .sk-w60 { width: 60%; } .sk-w80 { width: 80%; }

/* Rreshtat e skeletonit brenda një tabele: e njëjta lartësi si rreshtat e vërtetë,
   që faqja të mos kërcejë kur vijnë të dhënat. */
.sk-row td { padding: 14px !important; border: 0 !important; }
.sk-row .sk { height: 14px; }
.sk-row + .sk-row td { border-top: 1px solid var(--border-soft) !important; }

@media (prefers-reduced-motion: reduce) { .sk { animation: none; opacity: .4; } }

/* ===================================================================
   SHIFRAT PËRMBLEDHËSE — një pamje, jo katër
   -------------------------------------------------------------------
   Aplikacioni i tregonte të njëjtat tri shifra në katër mënyra: panel me
   gradient te Paneli, karta të larta me ikonë te Depozitat/Shpenzimet,
   listë rreshtash te Transaksionet, shtylla te Arka. Matur në telefon,
   tri shifra zinin 445px si karta dhe 145px si rreshta — 300px ndryshim
   për të njëjtin informacion, në secilën faqe.

   Fiton forma e rreshtave: etiketa majtas, shifra djathtas, një kontejner
   i vetëm. Është e njëjta që përdor tashmë Transaksionet, pra faqja që
   pronari e sheh më shpesh nuk ndryshon fare — ndryshojnë dy të tjerat
   drejt saj. Arka mban shtyllat e veta: ato nuk janë përmbledhje, janë
   gjendje për çdo fond veç e veç.

   Në desktop nuk preket asgjë: aty hapësira nuk kushton dhe kartat me
   ikona lexohen mirë krah për krah.
   =================================================================== */
@media (max-width: 720px) {
  .kpi-grid.kpi-3 {
    display: block;
    border: 1px solid var(--border); border-radius: var(--radius-lg);
    background: var(--surface); overflow: hidden;
  }
  .kpi-grid.kpi-3 > .card.kpi {
    display: flex; align-items: center; gap: var(--s1h);
    border: 0; border-radius: 0; background: transparent; box-shadow: none;
    padding: 11px var(--s2); margin: 0;
    border-bottom: 1px solid var(--border);
  }
  .kpi-grid.kpi-3 > .card.kpi:last-child { border-bottom: 0; }
  /* Ikona mbetet — është e vetmja gjë që i dallon tri rreshtat me një shikim —
     por bie nga 44px në 30px: në një rresht ajo është shenjë, jo ilustrim. */
  .kpi-grid.kpi-3 .kpi-top { margin: 0; flex: none; }
  .kpi-grid.kpi-3 .kpi-ico { width: 30px; height: 30px; border-radius: var(--radius-xs); }
  .kpi-grid.kpi-3 .kpi-ico svg { width: 15px; height: 15px; }
  /* Etiketa para shifrës: në një rresht lexohet "Dalje totale · €115,031.84",
     ndërsa e kundërta të detyron të kthesh sytë mbrapsht për të kuptuar çfarë pe. */
  .kpi-grid.kpi-3 .kpi-label { order: 1; flex: 1 1 auto; min-width: 0; margin: 0; font-size: var(--t-label); }
  .kpi-grid.kpi-3 .kpi-value {
    order: 2; flex: none; margin: 0; text-align: right; white-space: nowrap;
    font-size: var(--t-section);
  }
}

/* PROVUAR DHE HEQUR: i solla tri shifrat e hero-s te forma e rreshtave si kudo tjetër.
   Matja e refuzoi — hero-ja u rrit 424px → 652px, sepse rregulli ekzistues i fsheh me
   qëllim operatorët në telefon dhe i vendos hapat në rrjet me dy kolona. Rreshtat plus
   operatorët e dukshëm kërkojnë shtatë rreshta aty ku rrjeti kërkon dy.

   Pra ky mbetet i vetmi bllok me formë të vetën, dhe me arsye: është i vetmi që shpjegon
   një veprim aritmetik, jo që rendit tri shifra të palidhura. Njëtrajtshmëria që kushton
   228px në ekranin kryesor nuk është njëtrajtshmëri, është kokëfortësi. */

/* ===================================================================
   DEPOZITAT dhe ARKA — të fundit që mbetën me formën e vjetër
   -------------------------------------------------------------------
   Matur në telefon: rreshti i depozitës 207px, i arkës 247px, ndërsa
   Transaksionet janë 85px dhe Shpenzimet 111px me të njëjtin lloj
   informacioni. Të katër faqet janë lista lëvizjesh parash; ishte e
   vetmja gjë që i ndante.
   =================================================================== */
@media (max-width: 720px) {
  /* ---- Depozitat: shënimi + shuma lart, data · metoda poshtë ---- */
  #depLedger tr {
    display: grid;
    grid-template-columns: auto 1fr auto;
    grid-template-areas:
      "note note amt"
      "dat  met  met";
    column-gap: 10px; row-gap: 6px; align-items: center;
    padding: 12px 14px;
  }
  #depLedger tr > td {
    display: block; padding: 0; margin: 0; border: 0; min-height: 0; text-align: left;
  }
  #depLedger tr > td::before { content: none; }
  #depLedger td[data-label="Shënime"] {
    grid-area: note; min-width: 0; font-size: var(--t-body); font-weight: 650; color: var(--ink);
    overflow-wrap: anywhere;
  }
  #depLedger td[data-label="Shuma"] {
    grid-area: amt; justify-self: end; white-space: nowrap;
    font-size: var(--t-lead); font-weight: 800; border: 0; margin: 0; padding: 0;
  }
  #depLedger td[data-label="Shuma"] .btn-icon { width: 34px; height: 34px; }
  #depLedger td[data-label="Data"]   { grid-area: dat; font-size: var(--t-micro); white-space: nowrap; }
  #depLedger td[data-label="Metoda"] { grid-area: met; }
  #depLedger td[data-label="Metoda"] .method-chip { font-size: 10.5px; padding: 2px 7px; }

  /* ---- Arka: përshkrimi + shuma lart, data · burimi · veprimet poshtë ---- */
  #vaultLedger tr {
    display: grid;
    grid-template-columns: auto auto 1fr auto;
    grid-template-areas:
      "hero hero hero amt"
      "dat  src  src  act";
    column-gap: 10px; row-gap: 7px; align-items: center;
    padding: 12px 14px;
  }
  #vaultLedger tr > td {
    display: block; padding: 0; margin: 0; border: 0; min-height: 0; text-align: left;
  }
  #vaultLedger tr > td::before { content: none; }
  #vaultLedger td.card-hero-cell {
    grid-area: hero; min-width: 0; order: 0;
    font-size: var(--t-body); font-weight: 650; color: var(--ink); overflow-wrap: anywhere;
  }
  #vaultLedger td[data-label="Shuma"] {
    grid-area: amt; justify-self: end; white-space: nowrap;
    font-size: var(--t-lead); font-weight: 800;
  }
  #vaultLedger td[data-label="Data"]   { grid-area: dat; font-size: var(--t-micro); white-space: nowrap; }
  #vaultLedger td[data-label="Burimi"] { grid-area: src; }
  #vaultLedger td[data-label="Burimi"] .src-chip { font-size: 10.5px; padding: 2px 7px; }
  #vaultLedger td.card-foot-cell {
    grid-area: act; justify-self: end; border: 0; margin: 0; padding: 0;
  }
  #vaultLedger td.card-foot-cell .btn-icon { width: 34px; height: 34px; }
}

/* ============================================================
   ARKA — shifër e pjesshme
   Serveri i kthen HR-së `depositsHidden: true` te /api/vault dhe te
   /api/office, dhe balanca rillogaritet pa depozitat kesh. Sot dallimi
   është zero — të 16 depozitat janë crypto — pra shifra e HR-së është
   identike me atë të CEO-s dhe asgjë nuk duket. Me depozitën e parë
   `method='cash'` ato ndahen, dhe një shifër e paetiketuar që ndryshon
   nga ajo e CEO-s është më keq se një shifër e fshehur.

   E LIDHUR: app.js e vendos këtë klasë te #vaultBreak kur /api/vault
   kthen `depositsHidden`. Provuar mbi një kopje të izoluar me një depozitë
   kesh, sepse me të dhënat e sotme (cashDeposits=0) nuk ndryshon asgjë.
   ============================================================ */
.money-partial {
  margin-left: 6px;
  padding: 1px 6px;
  border-radius: var(--radius-xs);
  background: var(--warning-soft);
  color: var(--warning-ink);
  font-size: var(--t-micro);
  font-weight: 700;
  white-space: nowrap;
}

/* ============================================================
   HR — PA DEPOZITA
   Pronari e do HR-në me të njëjtin akses si CEO, përveç depozitave.
   Klasa is-hr vihet nga app.js dhe nga nav.js pas /api/me, njësoj si
   body.is-reception. Kjo shtresë vetëm HEQ gjurmët nga pamja; aksesin
   e mbyll roja te server.js — CSS-ja fshihet me një klikim te inspektori.
   ============================================================ */

/* Një rregull mbulon të gjitha lidhjet: shiriti anësor, shiriti poshtë,
   çipi "Regjistro depozitë" dhe lidhja "Depozitat →". Me href-in si çelës,
   edhe një lidhje e re nesër mbulohet vetvetiu. */
body.is-hr a[href="deposits.html"] { display: none; }

/* Heroi është VETË identiteti Depozita − Shpenzime − Paga = Neto: çdo pjesë
   e tij ose është depozitë, ose del prej saj. Prandaj bie i teri.
   Skripti brenda dashboard.html i shkruan gjithsesi "€0" te #heroDeposits
   dhe #heroNet — pikërisht pse seksioni duhet fshehur, jo zbrazur. */
body.is-hr #netHero { display: none; }

/* Paneli: karta e depozitave dhe trendi — shtyllat e gjelbra JANË depozitat
   e muajit, jo një ilustrim. */
body.is-hr .money-cards > .card:has(.section-link[href="deposits.html"]),
body.is-hr .card:has(#dashTrend) { display: none; }

/* Shpenzimet: KPI-ja "Neto · Depozita − Dalje" dhe grafiku i trendit.
   app.js tashmë shkruan "—" në atë kuti për HR-në; kjo e heq krejt. */
body.is-hr .kpi-grid.kpi-3 .kpi:nth-child(3),
body.is-hr .card:has(#finTrendBars) { display: none; }

/* Transaksionet: çipi i filtrit "Depozita". app.js e heq nga DOM-i; kjo mbetet
   për çastin midis ngarkimit të faqes dhe përgjigjes së /api/me.
   Kutia "Hyrje" NUK fshihet: numri i saj është i saktë edhe pa depozitat —
   app.js i ndërron nënshkrimin nga "depozita + arkë" në "vetëm arkë". */
body.is-hr #lgSrc .lg-chip[data-src="deposit"] { display: none; }

/* Nën 720px .kpi-grid.kpi-3 nuk është rrjetë por një listë me kornizë: kontejneri vizaton
   kufirin dhe fëmijët ndarësit, me `:last-child { border-bottom: 0 }`. Kur fshihet i treti,
   ":last-child" mbetet pikërisht ai i fshehuri, pra i dyti e mban vijën e vet dhe brenda
   kutisë së rrumbullakosur varet një ndarës që nuk ndan asgjë. */
@media (max-width: 720px) {
  body.is-hr .kpi-grid.kpi-3 > .card.kpi:nth-child(2) { border-bottom: 0; }
}

/* Kur bie një fëmijë, rrjeta duhet mbyllur — përndryshe mbetet një kolonë
   bosh dhe karta ngjitur rri gjysmë e gjerë. VETËM në desktop: te telefoni
   këto rrjeta janë tashmë një kolonë, dhe specifika e body.is-hr do t'i
   mundte mediat ekzistuese e do të detyronte 2 kolona në 390px.
   Shiriti poshtë nuk hyn këtu: aty çdo zë është flex:1 dhe shtrihet vetë. */
@media (min-width: 901px) {
  body.is-hr .money-cards,
  body.is-hr .cols-2e:has(#dashTrend),
  body.is-hr .cols-2:has(#finTrendBars) { grid-template-columns: 1fr; }
  body.is-hr .kpi-grid.kpi-3 { grid-template-columns: repeat(2, 1fr); }
}

/* Një fushë e bllokuar duhet të DUKET e bllokuar. Te Cilësimet, "Emri i përdoruesit" është
   `disabled` por dukej saktësisht si fushat e shkruajtshme — të njëjtin sfond, të njëjtën
   ngjyrë teksti — dhe dallohej vetëm nga një opacity:.7 inline. Përdoruesi e provon, nuk
   ndodh asgjë, dhe fajin ia gjen vetes. */
.input:disabled, .select:disabled, input:disabled, select:disabled, textarea:disabled {
  background: transparent;
  border-style: dashed;
  border-color: var(--border);
  color: var(--muted);
  cursor: not-allowed;
  opacity: 1;              /* zëvendëson opacity-n inline: kontrasti vjen nga ngjyra, jo nga zbehja */
}


/* ============================================================
   SHIRITI I TOTALIT — Pagat dhe Bonuset
   ------------------------------------------------------------
   Ishte i kopjuar fjalë për fjalë në të dy faqet, brenda bllokut
   <style> të secilës — pra dy burime për të njëjtën gjë, dhe
   pikërisht modeli që e ktheu skriptin e hamburgerit në tetë kopje
   që nisën të divergjojnë. Një përkufizim.

   Bashkë me zhvendosjen ranë edhe px-të e ngulitura: rrezja ishte
   12px kur çdo panel tjetër i aplikacionit ka 16 (--radius), dhe
   13/22/19px kishin tokenë të saktë (--t-small, --t-display që e ka
   komentin "shifra KPI", --t-section që sipas shkallës "thith 19").
   Mbushja mbetet 14px: shkalla e hapësirës s'ka 14, dhe ta shtyja në
   12 ose 16 do të ishte ndryshim pamjeje pa arsye.
   ============================================================ */
.pay-total-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px var(--s2h);
  background: var(--card);
  border-radius: var(--radius);
  margin-bottom: var(--s2);
  border: 1px solid var(--border);
}
.pay-total-bar .label { font-size: var(--t-small); color: var(--muted); }
.pay-total-bar .amount { font-size: var(--t-display); font-weight: 700; }
/* Bonuset janë gjithmonë shtesë mbi pagë — shifra e tyre lexohet si fitim. */
.pay-total-bar.is-bonus .amount { color: var(--success); }
@media (max-width: 640px) {
  .pay-total-bar { padding: var(--s1h) var(--s2); }
  .pay-total-bar .amount { font-size: var(--t-section); }
}

/* ============================================================
   DESKTOP — menyja fshihet vetë, hamburgeri e hap
   ------------------------------------------------------------
   Shiriti anësor zinte 240px nga 1440 — 17% e ekranit, gjithmonë,
   edhe kur nuk përdorej. Këtu ai bëhet sirtar edhe në desktop.

   Nuk shkrova makineri të dytë: rregullat janë pikërisht ato që
   telefoni i përdor prej kohësh (transform + scrim + body.nav-open),
   dhe hamburgeri lidhet nga nav.js pa asnjë ndryshim. Një sjellje,
   dy gjerësi — jo dy zbatime që divergjojnë brenda javës.

   `:not(.is-reception)` NUK është dekor: rregulli i recepsionit te
   rreshti ~2923 e fsheh hamburgerin, ka të njëjtën specifikë si ky,
   dhe ky vjen më pas — pra pa përjashtim do ta fitonte dhe do t'ia
   shfaqte asaj një buton që s'ka ku ta çojë.
   ============================================================ */
@media (min-width: 901px) {
  body.sb-hide:not(.is-reception) .sidebar {
    transform: translateX(-100%);
    transition: transform .25s ease;
    box-shadow: var(--shadow-lg);
    z-index: 70;
  }
  body.sb-hide:not(.is-reception).nav-open .sidebar { transform: translateX(0); }
  body.sb-hide:not(.is-reception) .main { margin-left: 0; }
  body.sb-hide:not(.is-reception) .hamburger { display: grid; }
  body.sb-hide:not(.is-reception) .scrim {
    position: fixed; inset: 0; background: rgba(0,0,0,.6);
    opacity: 0; pointer-events: none; transition: opacity .25s; z-index: 55;
  }
  body.sb-hide:not(.is-reception).nav-open .scrim { opacity: 1; pointer-events: auto; }

  /* Pa këtë rresht fshehja s'jepte asgjë. E mata: .main u bë 1440px, por .content ka
     max-width:1200 dhe margin:auto, pra thjesht u qendërzua me 120px bosh në secilën anë —
     hapësirë e fituar dhe e hedhur. Tani hapësira e shiritit i kalon përmbajtjes, saktësisht
     240px, jo më shumë: një tabelë e pakufizuar në një monitor 2560px lexohet më keq, jo më
     mirë. Provuar në 1440px: përmbajtja 1200 → 1392 (1440 minus mbushja). */
  body.sb-hide:not(.is-reception) .content {
    max-width: calc(var(--content-max) + var(--sidebar-w));
  }
}

/* ============================================================
   REGJISTRIMI I DITËS — poshtë përmbledhjes te Prezenca
   ------------------------------------------------------------
   Rreshtat brenda janë .att-fixrow, të njëjtët që përdor "Ndrysho
   ditën": një pamje, jo dy që divergjojnë. Këtu ndryshon vetëm
   cilët rreshta hyjnë — ata me shënim — dhe rendi, sipas orës.
   ============================================================ */
.att-logwrap { margin-top: var(--s2); }
/* Kur hapet pamja e muajit, portalet, ora, butonat dhe përmbledhja fshihen tashmë.
   Pa këtë rresht regjistri do të mbetej vetëm në ekran mbi "Ndrysho ditën" — dy lista
   me të njëjtët rreshta të ndryshueshëm, njëra mbi tjetrën. */
body.att-monthing .att-logwrap { display: none; }
.att-loghead {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: var(--s1); margin-bottom: var(--s1h);
}
.att-loghead h2 {
  margin: 0; font-size: var(--t-title); font-weight: 700; color: var(--ink);
}
.att-logcount {
  font-size: var(--t-label); color: var(--muted);
  font-variant-numeric: tabular-nums;
}
