
:root{
  --bg:#f5f7fa; --card:#fff; --ink:#111927; --muted:#6b7a8d; --line:#e3e8ef;
  --brand:#1e40af; --brand2:#172d6e; --soft:#eef3ff;
  --ok:#0d7a4d; --oks:#e5f6ed; --warn:#96620a; --warns:#fdf5e3; --bad:#b02a20; --bads:#fdeeec;
  --sehatsy:#0e7490; --coffee:#92400e;
}
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  background:var(--bg);color:var(--ink);font-size:13.5px;line-height:1.5;-webkit-font-smoothing:antialiased}
#app{display:flex;min-height:100vh}
aside{width:238px;background:var(--brand2);color:#bfcdf0;flex-shrink:0;display:flex;flex-direction:column}
.brand{padding:18px 16px;border-bottom:1px solid rgba(255,255,255,.12)}
.brand b{color:#fff;font-size:14px;display:block;letter-spacing:.3px}
.brand span{font-size:10.5px;color:#8ba3d8}
nav{padding:8px 0;flex:1;overflow-y:auto}
.ng{padding:13px 16px 5px;font-size:9.5px;letter-spacing:1.1px;text-transform:uppercase;color:#7f97ce;font-weight:700}
nav a{display:flex;justify-content:space-between;align-items:center;gap:6px;padding:8px 16px;color:#bfcdf0;
  cursor:pointer;font-size:13px;border-left:3px solid transparent}
nav a:hover{background:rgba(255,255,255,.07);color:#fff}
nav a.active{background:rgba(255,255,255,.14);color:#fff;border-left-color:#60a5fa;font-weight:600}
nav a .pill{background:#dc2626;color:#fff;font-size:9.5px;padding:1px 6px;border-radius:9px;font-weight:700}
.sfoot{padding:10px 16px;border-top:1px solid rgba(255,255,255,.12);font-size:10.5px;color:#7f97ce}
main{flex:1;min-width:0;display:flex;flex-direction:column}
header{background:var(--card);border-bottom:1px solid var(--line);padding:14px 24px;
  display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap}
header h1{font-size:18px;font-weight:650;letter-spacing:-.2px}
header p{font-size:12px;color:var(--muted);margin-top:1px}
.content{padding:22px 24px 60px;flex:1}
button{font-family:inherit;font-size:12.5px;cursor:pointer;border:none;border-radius:6px;padding:7px 13px;font-weight:600}
.btn{background:var(--brand);color:#fff}.btn:hover{background:var(--brand2)}
.btn-o{background:#fff;color:var(--ink);border:1px solid var(--line)}.btn-o:hover{background:#f8fafc}
.btn-s{padding:4px 9px;font-size:11.5px}
.btn-ok{background:var(--ok);color:#fff}
.btn-bad{background:#fff;color:var(--bad);border:1px solid #f0c7c3}.btn-bad:hover{background:var(--bads)}
/* A wide table must be able to scroll sideways rather than be clipped.
   overflow:hidden used to cut the right-hand columns off with no way to reach them. */
.card{background:var(--card);border:1px solid var(--line);border-radius:9px;margin-bottom:18px;
  overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch}
.card-h{padding:12px 16px;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;
  align-items:center;gap:10px;flex-wrap:wrap}
.card-h h3{font-size:13.5px;font-weight:650}
.card-h small{color:var(--muted);font-size:11.5px;font-weight:400;display:block;margin-top:1px}
.card-b{padding:16px}
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(178px,1fr));gap:12px;margin-bottom:18px}
.kpi{background:var(--card);border:1px solid var(--line);border-radius:9px;padding:14px 16px}
.kpi .lb{font-size:10.5px;color:var(--muted);text-transform:uppercase;letter-spacing:.5px;font-weight:700}
.kpi .vl{font-size:21px;font-weight:700;margin-top:6px;letter-spacing:-.6px}
.kpi .sb{font-size:11.5px;color:var(--muted);margin-top:2px}
table{width:100%;border-collapse:collapse}
th{text-align:left;padding:9px 12px;font-size:10.5px;text-transform:uppercase;letter-spacing:.5px;
  color:var(--muted);background:#f8fafc;border-bottom:1px solid var(--line);font-weight:700;white-space:nowrap}
td{padding:9px 12px;border-bottom:1px solid #f1f5f9;vertical-align:middle}
tbody tr:last-child td{border-bottom:none}
tbody tr:hover{background:#fbfcfe}
.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px}
.empty{padding:40px 20px;text-align:center;color:var(--muted)}
.empty b{display:block;color:var(--ink);margin-bottom:3px;font-size:13.5px}
.tag{display:inline-block;padding:2px 8px;border-radius:20px;font-size:10.5px;font-weight:700;white-space:nowrap}
.t-ok{background:var(--oks);color:var(--ok)}.t-warn{background:var(--warns);color:var(--warn)}
.t-bad{background:var(--bads);color:var(--bad)}.t-info{background:var(--soft);color:var(--brand)}
.t-gray{background:#f1f5f9;color:var(--muted)}
.t-bu1{background:#e0f2fe;color:var(--sehatsy)}.t-bu2{background:#fef3c7;color:var(--coffee)}
label{display:block;font-size:11.5px;font-weight:650;margin-bottom:4px;color:#334155}
input,select,textarea{width:100%;padding:7px 10px;border:1px solid #cbd5e1;border-radius:6px;
  font-family:inherit;font-size:13px;background:#fff;color:var(--ink)}
input:focus,select:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--soft)}
input:disabled{background:#f8fafc;color:var(--muted)}
/* ---------- Date picker ----------
   The field is a button, not a text box: there is nothing to type wrong, and
   the month and the year are chosen from lists rather than stepped through. */
.dpwrap{display:inline-block;position:relative}
.fld .dpwrap,.g3 .dpwrap{display:block}   /* inside a form it fills the field like any other input */
.dpbtn{display:flex;align-items:center;justify-content:space-between;gap:10px;
  min-width:158px;width:100%;padding:7px 10px;background:#fff;color:var(--ink);
  border:1px solid #cbd5e1;border-radius:6px;font-size:13px;font-weight:500;text-align:left}
.dpbtn:hover{border-color:var(--brand);background:#fbfcff}
.dpbtn:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--soft)}
.dpcal{color:var(--muted);font-size:11px;flex-shrink:0}
.dphost{position:fixed;z-index:220;background:#fff;border:1px solid var(--line);border-radius:10px;
  box-shadow:0 14px 40px rgba(15,23,42,.22);padding:10px;width:263px}
.dph{display:flex;align-items:center;gap:5px;margin-bottom:8px}
.dph .dpsel{flex:1;min-width:0;padding:5px 6px;font-size:12.5px;font-weight:600}
.dpnav{background:#f1f5f9;color:var(--ink);padding:4px 9px;font-size:15px;line-height:1.1;flex-shrink:0}
.dpnav:hover{background:var(--soft);color:var(--brand)}
.dpdow{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:3px}
.dpdow span{text-align:center;font-size:10px;font-weight:700;color:var(--muted);text-transform:uppercase}
.dpgrid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.dpd{background:none;color:var(--ink);padding:6px 0;font-size:12.5px;font-weight:500;border-radius:5px}
.dpd:hover{background:var(--soft);color:var(--brand)}
.dpd.off{visibility:hidden}
.dpd.now{box-shadow:inset 0 0 0 1px var(--brand);font-weight:700}
.dpd.sel{background:var(--brand);color:#fff;font-weight:700}
.dpf{display:flex;gap:5px;margin-top:9px;padding-top:8px;border-top:1px solid var(--line)}
.dpq{flex:1;background:#f8fafc;color:#334155;border:1px solid var(--line);
  padding:5px 2px;font-size:10.5px;font-weight:650}
.dpq:hover{background:var(--soft);color:var(--brand);border-color:#c3d4f7}
/* Second row of the filter bar: jump straight to a month, or to a named range. */
.pbar2{margin-top:11px;padding-top:11px;border-top:1px dashed var(--line);gap:18px}
.pbar2 select{min-width:112px}
.chips{display:flex;gap:5px;flex-wrap:wrap}
.chip{background:#f1f5f9;color:#334155;border:1px solid var(--line);border-radius:20px;
  padding:5px 12px;font-size:11.5px;font-weight:650}
.chip:hover{background:var(--soft);color:var(--brand);border-color:#c3d4f7}
.chip.on{background:var(--brand);color:#fff;border-color:var(--brand)}
/* A document number that leads back to the document that made it. Underlined on
   hover only, so a ledger full of them does not look like a page of hyperlinks. */
.doclink{color:var(--brand);cursor:pointer;font-weight:650;border-bottom:1px dotted #93b0e8}
.doclink:hover{color:var(--brand2);border-bottom-style:solid;background:var(--soft)}
.filtnote{padding:8px 16px;border-top:1px solid var(--line);background:#fbfcfe;
  font-size:11.5px;color:var(--muted)}
.filtnote b{color:var(--ink)}
.g2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.g3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px}
.g4{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:12px}
.fld{margin-bottom:12px}
.hint{font-size:11px;color:var(--muted);margin-top:3px}
.modal{position:fixed;inset:0;background:rgba(15,23,42,.55);display:flex;align-items:flex-start;
  justify-content:center;padding:30px 16px;z-index:100;overflow-y:auto}
.mbox{background:#fff;border-radius:11px;width:100%;max-width:880px;box-shadow:0 20px 50px rgba(0,0,0,.28)}
.mh{padding:14px 20px;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;align-items:center}
.mh h3{font-size:15px}
.mb{padding:20px}
.mf{padding:12px 20px;border-top:1px solid var(--line);display:flex;justify-content:flex-end;gap:8px;
  background:#f8fafc;border-radius:0 0 11px 11px;flex-wrap:wrap}
.x{background:none;color:var(--muted);font-size:21px;padding:0 5px;line-height:1}
.tb{display:flex;gap:8px;flex-wrap:wrap;align-items:flex-end}
.tb input,.tb select{width:auto;min-width:135px}
.lt input,.lt select{padding:5px 8px;font-size:12.5px}
.tot{margin-left:auto;width:330px;margin-top:12px}
.tot div{display:flex;justify-content:space-between;padding:5px 0;font-size:13px}
.tot .g{border-top:2px solid var(--ink);margin-top:5px;padding-top:8px;font-weight:750;font-size:15.5px}
.bar{display:flex;align-items:center;gap:10px;margin-bottom:9px}
.bar .nm{width:165px;font-size:12px;flex-shrink:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.trk{flex:1;height:8px;background:#eef2f7;border-radius:4px;overflow:hidden}
.fil{height:100%;border-radius:4px;background:var(--brand)}
.bar .vl{width:118px;text-align:right;font-size:12px;font-weight:650;font-variant-numeric:tabular-nums}
.banner{background:var(--warns);border:1px solid #f0dfae;color:#7a4d05;padding:10px 14px;border-radius:7px;
  margin-bottom:16px;font-size:12.5px}
.banner.info{background:var(--soft);border-color:#c3d4f7;color:#1e3a8a}
.clk{cursor:pointer}
.rpt td,.rpt th{padding:6px 12px}
.rpt .sec{font-weight:700;background:#f8fafc}
.rpt .tot2{font-weight:700;border-top:1.5px solid var(--ink)}
.ind{padding-left:28px !important;color:#334155}
.je{background:#fafbfd;border:1px dashed #cbd5e1;border-radius:7px;padding:12px;margin-top:14px}
.je h4{font-size:11px;text-transform:uppercase;letter-spacing:.6px;color:var(--muted);margin-bottom:8px}
.je table{font-size:12px}.je td{padding:4px 8px;border:none}
@media(max-width:860px){#app{flex-direction:column}aside{width:100%}nav{display:flex;flex-wrap:wrap;padding:5px}
 .ng{display:none}nav a{border-left:none}.g2,.g3,.g4{grid-template-columns:1fr}.tot{width:100%}}


/* ============ ONLINE EDITION ADDITIONS ============ */

/* --- sign-in screen --- */
#signin{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px;background:var(--bg)}
#signin .card{width:100%;max-width:390px;margin:0;box-shadow:0 12px 34px rgba(15,23,42,.10)}
#signin .brandbox{background:var(--brand2);color:#fff;padding:24px 22px}
#signin .brandbox b{display:block;font-size:15px;letter-spacing:.3px}
#signin .brandbox span{font-size:11.5px;color:#8ba3d8}
#signin .pad{padding:22px}
#signin label{margin-top:14px}
#signin label:first-of-type{margin-top:0}
#signin button{width:100%;margin-top:20px;padding:11px;font-size:14px}
#signin button:disabled{opacity:.6;cursor:default}
#signin .alert{background:var(--bads);border:1px solid #f0c7c3;color:var(--bad);
  padding:10px 13px;border-radius:7px;margin-bottom:14px;font-size:12.5px}
#signin .fine{font-size:11px;color:var(--muted);margin-top:16px;text-align:center;line-height:1.5}

/* --- save status strip --- */
#syncbar:empty{display:none}
.syncmsg{display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:8px 24px;font-size:12.5px;font-weight:600;border-bottom:1px solid var(--line)}
.syncmsg.s-ok{background:var(--oks);color:var(--ok)}
.syncmsg.s-wait{background:var(--soft);color:var(--brand)}
.syncmsg.s-warn{background:var(--warns);color:var(--warn)}
.syncmsg.s-bad{background:var(--bads);color:var(--bad)}

/* --- sidebar footer with the signed-in user --- */
.sfoot a{color:#bfcdf0}
.sfoot a:hover{color:#fff}
.sfoot div:first-child b{color:#fff;font-size:12px}

/* ============ NARROW SCREENS & PHONES ============ */

/* Nothing may push the page wider than the viewport */
html,body{max-width:100%;overflow-x:hidden}
#app{max-width:100%}
main{min-width:0;max-width:100%}
.content{max-width:100%}

/* Give the scrollbar under a table a little breathing room, and make it visible
   on macOS where scrollbars are hidden until you scroll */
.card::-webkit-scrollbar{height:9px}
.card::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:5px}
.card::-webkit-scrollbar-thumb:hover{background:#94a3b8}
.card::-webkit-scrollbar-track{background:#f1f5f9}

/* Keep data tables readable rather than squeezing every column into slivers.
   Below this width the card scrolls sideways instead. */
@media(max-width:1200px){
  .card > table{min-width:860px}
  .card > .card-h + table{min-width:860px}
  /* two-column summary tables stay narrow */
  .card > table.rpt{min-width:0}
  .g2 .card > table,.g3 .card > table{min-width:0}
}

@media(max-width:860px){
  .content{padding:14px 12px 50px}
  header{padding:12px 14px}
  header h1{font-size:17px}
  th,td{padding:8px 10px}
  .card > table{min-width:820px}
  .kpis{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px}
  .kpi .vl{font-size:19px}
  .banner{font-size:12px;padding:9px 12px}
  .modal{padding:14px 8px}
  .mb{padding:14px}
  .mf{padding:12px 14px}
  .tb input,.tb select{min-width:0;width:100%}
  .tb > div{flex:1 1 100%}
  .dpwrap,.dpbtn{width:100%;min-width:0}
  .pbar2{gap:11px}
  .pbar2 select{min-width:0;flex:1}
  #act{width:100%}
  #act button{flex:1 1 auto}
}

@media(max-width:520px){
  .content{padding:10px 8px 44px}
  th,td{padding:7px 8px;font-size:12.5px}
  .card > table{min-width:760px}
  .kpis{grid-template-columns:1fr 1fr}
  .tot{width:100%}
  .bar .nm{width:110px}
  .bar .vl{width:88px}
}

/* On touch devices a nudge that the table can be swiped */
@media(hover:none){
  .card > table{position:relative}
}

/* ---------- Dashboard: the work row, section headings, locked panel ----------
   The two rows of figures answer different questions — one is a flow across the chosen
   period, the other a balance on a single day — so they are labelled rather than left to
   look identical under one date picker. */
.secttl{font-size:10.5px;letter-spacing:.7px;text-transform:uppercase;color:var(--muted);
  font-weight:700;margin:0 0 8px}
.secttl span{text-transform:none;letter-spacing:0;font-weight:400;font-size:11px}
.todo{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:18px}
.td{flex:1 1 200px;background:var(--card);border:1px solid var(--line);
  border-left:3px solid var(--muted);border-radius:9px;padding:11px 14px;display:flex;gap:11px;
  align-items:center;cursor:pointer}
.td:hover{border-color:#c8d2e0}
.td.warn{border-left-color:var(--warn);background:var(--warns)}
.td.bad{border-left-color:var(--bad);background:var(--bads)}
.td .n{font-size:22px;font-weight:700;line-height:1;letter-spacing:-.5px}
.td.warn .n{color:var(--warn)}.td.bad .n{color:var(--bad)}
.td .t{font-size:12px;line-height:1.35}
.td .t b{display:block;font-size:12.5px}
.td .t span{color:var(--muted);font-size:11.5px}
.allok{background:var(--oks);border:1px solid #bfe4d0;border-left:3px solid var(--ok);
  border-radius:9px;padding:11px 14px;color:var(--ok);font-weight:600;margin-bottom:18px}
.sumrow{border-top:1px solid var(--line);margin-top:10px;padding-top:9px;display:flex;
  justify-content:space-between;font-weight:700;font-size:12.5px}
.tiednote{margin-top:12px;padding-top:11px;border-top:1px dashed var(--line);
  font-size:11.5px;color:var(--muted);line-height:1.6}
.tiednote b{color:var(--ink)}
.lockbox{background:#f8fafc;border:1px dashed #cbd5e1;border-radius:9px;padding:22px;
  text-align:center;color:var(--muted);font-size:12.5px}
.lockbox b{display:block;color:var(--ink);margin-bottom:3px;font-size:13px}

/* ---------- Sidebar groups that fold ----------
   Twenty-five entries is a scroll. A group the user closes stays closed on the next visit. */
.ng{cursor:pointer;user-select:none;display:flex;justify-content:space-between;align-items:center}
.ng .ch{font-size:9px;opacity:.7;display:inline-block;transition:transform .12s;padding-left:6px}
.grp.closed a{display:none}
.grp.closed .ng .ch{transform:rotate(-90deg)}

/* ---------- A card that folds ----------
   Used for the Certificate of Analysis on an item that is not coffee: the questions are
   about beans, so they are out of the way, but the fields stay in the page because the
   save reads every one of them. */
details.card > summary{list-style:none;padding:12px 16px;border-bottom:1px solid var(--line);
  display:flex;align-items:center;gap:2px}
details.card > summary::-webkit-details-marker{display:none}
details.card > summary::before{content:'\25B8';color:var(--muted);font-size:11px;
  margin-right:7px;transition:transform .12s;display:inline-block}
details.card[open] > summary::before{transform:rotate(90deg)}
details.card > summary:hover{background:#f8fafc}
details.card:not([open]) > summary{border-bottom:0}
