/* EGF Kalkylsvit, delad stilmall */
:root{
  /* ETIKETTSTORLEKEN, ett värde för hela gränssnittet.
     Appens designspråk är versaliserad monospace i 9,5-11 px: stramt och
     prydligt på en skärm man sitter framför. I en bil, i solljus, med
     handskar är det oläsbart, och etiketterna sattes på 62 ställen i den här
     filen. Att höja dem klass för klass tog fyra vändor och gick fram och
     tillbaka: en ny regel kunde förlora mot en senare utan mediafråga.
     En variabel är EN plats att ändra, och mobilen ändrar den nedan. */
  --tx-etikett:10.5px;

  /* --ink-3 är hjälptexternas färg. #6d7672 klarade 4,68:1 mot vitt men bara
     3,90:1 mot --paper, och de hint-stycken som ligger direkt i en tabbpanel
     (profilvarningen och PDF-beskedet i offerten) står just på --paper.
     #5c645f ger 5,08:1 mot --paper och 6,10:1 mot vitt, över 4,5:1 i båda. */
  --ink:#14181a; --ink-2:#4a534f; --ink-3:#5c645f;
  --paper:#e9ebe5; --surface:#fff; --line:#cfd3ca; --line-2:#e4e7df;
  /* --line duger till dekorativa avgränsare men inte till ett fälts kant: ett
     vitt fält på en vit panel har kanten som enda tecken på att fältet finns,
     och 1,52:1 mot vitt syns inte i solljus. --falt-kant ger 3,37:1 mot vitt,
     3,11:1 mot #f5f6f2 och 3,28:1 mot .radkort, alltså över kravet 3:1. */
  --falt-kant:#878e83;
  --accent:#f2b705; --accent-deep:#8a6a00;
  --ok:#2f7a4f; --warn:#a1560a; --stop:#a3231a;
  --mono:ui-monospace,"SF Mono","Cascadia Mono","Roboto Mono",Menlo,Consolas,monospace;
  --sans:"Roboto Condensed","Archivo Narrow","Helvetica Neue Condensed",-apple-system,"Segoe UI",system-ui,sans-serif;
  /* 2026-08-12: moderniseringstokens, radier och skuggdjup på ett ställe.
     Bara CSS, inga typsnitt eller bibliotek: laddtiden ska förbli densamma. */
  --r:10px; --r-sm:7px;
  --skugga-1:0 1px 2px rgba(20,24,26,.05),0 3px 10px rgba(20,24,26,.05);
  --skugga-2:0 4px 10px rgba(20,24,26,.08),0 12px 28px rgba(20,24,26,.10);
  --ring:0 0 0 3px rgba(138,106,0,.22);
}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
h2{scroll-margin-top:14px}
button,a,summary{-webkit-tap-highlight-color:rgba(242,183,5,.25)}
html,body{margin:0;padding:0}
body{background:var(--paper);color:var(--ink);font-family:-apple-system,"Segoe UI",Roboto,system-ui,sans-serif;font-size:14px;line-height:1.45;-webkit-font-smoothing:antialiased}
/* Sticky: Logga in och logotypen följer med ner på landningssidan och guiderna
   (ägarens begäran 2026-08-27). z-index över hjältens rutnät och kortens
   skuggor. Appens inloggade topp (.apptopp) är medvetet inte sticky, där tar
   mobilväxlaren (rad ~282) och prisblocket den platsen. */
.masthead{background:var(--ink);color:var(--paper);padding:13px 20px;display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;border-bottom:3px solid var(--accent);
  position:sticky;top:0;z-index:30}
.masthead h1,.masthead .logo{font-family:var(--sans);font-size:20px;font-weight:700;letter-spacing:.02em;text-transform:uppercase;margin:0}
.masthead h1 a,.masthead .logo a{color:inherit;text-decoration:none}
.masthead .mark{color:var(--accent)}
.masthead .sub{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.09em;text-transform:uppercase;color:#9aa39f}
.masthead .spacer{flex:1}
.shell{display:grid;grid-template-columns:minmax(340px,410px) 1fr}
.pane-in{background:var(--surface);border-right:1px solid var(--line);padding-bottom:60px;min-height:calc(100vh - 56px)}
.pane-out{padding:18px 20px 90px;min-width:0}
/* minmax(0,1fr), inte 1fr: ett rutnätsbarn har min-width:auto och växer efter
   sitt innehåll. Med `1fr` blev kolumnen 538 px på en 390 px-skärm (mätt
   2026-08-17), hela formuläret sköts åt sidan och Avancerad-knappen hamnade
   halvvägs utanför skärmkanten. minmax(0,…) tillåter kolumnen att krympa, och
   min-width:0 gör samma sak för panelen inuti. */
@media (max-width:960px){.shell{grid-template-columns:minmax(0,1fr)}
  .pane-in{border-right:0;border-bottom:1px solid var(--line);min-height:0;min-width:0}}
.grp{border-bottom:1px solid var(--line-2)}
.grp>summary{list-style:none;cursor:pointer;padding:11px 16px;font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.11em;text-transform:uppercase;color:var(--ink-2);display:flex;align-items:center;gap:9px;user-select:none}
.grp>summary::-webkit-details-marker{display:none}
.grp>summary::before{content:"";width:7px;height:7px;flex:none;border-right:1.5px solid var(--ink-3);border-bottom:1.5px solid var(--ink-3);transform:rotate(-45deg);transition:transform .16s}
.grp[open]>summary::before{transform:rotate(45deg)}
.grp>summary:hover{background:#f5f6f2}
.grp>summary .badge{margin-left:auto;font-size:var(--tx-etikett);color:var(--ink-3);letter-spacing:.04em}
.grp .body{padding:2px 16px 16px}
.row{display:flex;align-items:center;gap:10px;margin:7px 0}
.row label{flex:1;font-size:13px;color:var(--ink-2)}
.hint{display:block;font-size:var(--tx-etikett);color:var(--ink-3);line-height:1.35}
input[type=number],input[type=text],input[type=email],select{font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:13px;width:96px;flex:none;padding:6px 8px;border:1px solid var(--falt-kant);border-radius:var(--r-sm);background:var(--surface);color:var(--ink);text-align:right;transition:border-color .12s,box-shadow .12s}
input:hover,select:hover{border-color:var(--ink-3)}
input[type=text],input[type=email]{text-align:left;width:100%}
select{width:196px;text-align:left;font-family:inherit}
/* I en flex-rad betyder width:100% "lika bred som hela raden", fältet la sig
   ovanpå etiketten och stack ut ur kortet (Projekt: Beskrivning/Kund/E-post/Adress).
   Rätt beteende är radens RESTBREDD: väx och krymp, aldrig utanför. */
.row input[type=text],.row input[type=email]{flex:1 1 140px;width:auto;min-width:0}
.row select{flex:0 1 auto;min-width:0;max-width:100%}
/* mjuk fokusring i stället för hård outline, samma färg, modernare känsla */
input:not([type=checkbox]):not([type=radio]):focus,select:focus{outline:none;border-color:var(--accent-deep);box-shadow:var(--ring)}
/* En kryssruta ritar inte författarens border, så på den blev den mjuka ringen
   (1,33:1 mot sina bakgrunder) allt som återstod av fokusmarkeringen, just på de
   rutor som låser upp e-signeringen. De får en riktig outline i stället:
   --accent-deep ger 4,22:1 mot --paper, 4,62:1 mot .note.stop och 5,07:1 mot vitt. */
input[type=checkbox]:focus-visible,input[type=radio]:focus-visible{outline:3px solid var(--accent-deep);outline-offset:2px}
input:disabled{background:#f3f4f0;color:var(--ink-3)}
/* min-width, inte width: "arbetsdagar" (betalningsplanen), "kr/vända", "veckor" och
   "kr/m²/v" behövde 37-68 px i en 30 px ruta och spillde ut över fönsterkanten
   (desktopsvepet 2026-08-27, alla 147 verktyg på Offert-fliken). */
.unit{font-family:var(--mono);font-size:var(--tx-etikett);color:var(--ink-3);min-width:30px;flex:none;white-space:nowrap}
.seg{display:flex;border:1px solid var(--falt-kant);border-radius:var(--r-sm);overflow:hidden;width:100%}
.seg button{flex:1;border:0;background:var(--surface);cursor:pointer;padding:7px 4px;font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.04em;text-transform:uppercase;color:var(--ink-2);border-right:1px solid var(--line-2)}
.seg button:last-child{border-right:0}
.seg button[aria-pressed=true]{background:var(--ink);color:var(--accent)}
.seg button:hover:not([aria-pressed=true]){background:#f1f2ee}
.check{display:flex;align-items:center;gap:8px;margin:6px 0;font-size:13px;color:var(--ink-2)}
.check input{width:auto;flex:none}
.radkort{border:1px solid var(--falt-kant);border-radius:var(--r-sm);padding:9px 10px;margin:8px 0;background:#fbfcfa}
.radkort .top{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.radkort .top .lbl{font-family:var(--mono);font-size:var(--tx-etikett);color:var(--ink-3);flex:none}
.radkort .top input[type=number]{width:64px}
.radkort .top input[type=text]{flex:1;width:auto;min-width:90px}
.radkort select{width:100%;margin-top:5px}
.radkort .del{border:1px solid var(--line);background:var(--surface);cursor:pointer;width:26px;height:28px;border-radius:var(--r-sm);color:var(--ink-3);font-size:15px;flex:none;margin-left:auto}
.kalkyllista .radkort{padding:12px;background:var(--surface)}
.radkort-huvud{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}
.radkort-huvud>span{font-family:var(--mono);font-size:11px;color:var(--ink-3);text-transform:uppercase;letter-spacing:.05em}
.radkort-huvud>div{display:flex;align-items:center;gap:6px}
.radkort-huvud .radkopiera{min-height:44px;padding:8px 10px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface);font-size:12px}
.radkort-huvud .del{width:44px;height:44px;margin:0;font-size:21px}
.kalkyllista .radkort .top{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;align-items:start}
.radcell{display:block;min-width:0}
.radcell .lbl{display:block;margin-bottom:4px}
.radcell-text{grid-column:1/-1}
.kalkyllista .radkort .top input[type=text]{box-sizing:border-box;width:100%;min-width:0}
.radcell-varde{display:flex;align-items:center;gap:4px;min-width:0}
.kalkyllista .radkort .top input[type=number]{box-sizing:border-box;flex:1 1 0;width:0;min-width:0;min-height:44px}
.radcell-varde .unit{flex:none;font-size:11px}
.radcell-auto input{background:#f1f3ed;color:var(--ink-2)}
.radcell-auto-text{display:block;margin-top:4px;font-size:12px;line-height:1.4;color:var(--ink-3)}
.radcell-manuell{display:block;min-height:44px;padding:5px 0;background:transparent;border:0;color:var(--accent-deep);font-size:12px;text-decoration:underline}
.lista-kvitto{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px;padding:10px 12px;margin:10px 0;
  border:1px solid var(--line);border-left:3px solid var(--accent-deep);border-radius:var(--r-sm);font-size:12px;background:#fff9e6}
.lista-kvitto button{min-height:44px;font-size:12px}
.mini{border:1px solid var(--line);background:var(--surface);cursor:pointer;font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.08em;text-transform:uppercase;padding:5px 10px;border-radius:var(--r-sm);color:var(--ink-2);transition:background .12s,border-color .12s}
.mini:hover{background:#f1f2ee;border-color:var(--ink-3)}

/* Projekt: gör en växande lista av delkalkyler snabb att överblicka även i mobilen. */
.projekt-filter{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:end;margin-bottom:8px}
.projekt-filter label{display:grid;gap:5px;min-width:0;color:var(--ink-2);font-family:var(--mono);font-size:12px;letter-spacing:.04em}
.projekt-filter input{width:100%;min-width:0;min-height:44px}
.projekt-filter button,.projekt-filterstatus button,.projekt-inga button,.projekt-korthuvud button,.projekt-angra button{
  min-height:44px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface);color:var(--ink-2);
  padding:8px 12px;font-family:var(--mono);font-size:11px;letter-spacing:.06em;text-transform:uppercase;cursor:pointer
}
.projekt-filter button[aria-pressed="true"]{border-color:var(--gul);background:var(--ink);color:var(--gul)}
.projekt-filterstatus{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:0 0 8px;padding:8px 10px;
  border-left:3px solid var(--gul);background:#f3f4ef;color:var(--ink-2);font-size:12px}
.projekt-filterstatus button{min-height:36px;padding:5px 9px;flex:none}
.projekt-delrad{display:flex;gap:11px;align-items:flex-start;padding:10px 8px;border-bottom:1px solid #eceee8;cursor:pointer}
.projekt-delrad:hover{background:#fafbf7}
.projekt-delrad:has(input:focus-visible){outline:2px solid var(--gul);outline-offset:-2px}
.projekt-delrad input{flex:none;margin-top:3px}
.projekt-inga{display:grid;gap:5px;justify-items:start;padding:18px;border:1px dashed var(--line);background:#fafbf7}
.projekt-inga span{color:var(--ink-2);font-size:13px}
.projekt-korthuvud{display:flex;align-items:center;justify-content:space-between;gap:10px;border-bottom:1px solid var(--line);padding:9px 12px}
.projekt-korthuvud h3{margin:0;font-size:14px}
.projekt-korthuvud button{min-height:44px;padding:8px 10px}
.projekt-angra{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px;padding:9px 10px;
  border-left:3px solid var(--gul);background:#fff8d9;font-size:13px}
.projekt-angra.fel{border-left-color:#a3231a;background:#fff0ee;color:#781c16}
.projekt-angra button{min-height:36px;padding:5px 9px;flex:none}

.kundbank-filter{display:grid;grid-template-columns:minmax(220px,1fr) auto auto;gap:8px;align-items:end;margin-bottom:12px;
  padding:10px;border:1px solid var(--line);background:#f7f8f3}
.kundbank-filter label{display:grid;gap:5px;min-width:0;color:var(--ink-2);font-family:var(--mono);font-size:12px;letter-spacing:.04em}
.kundbank-filter input{width:100%;min-width:0;min-height:44px}
.kundbank-filter p{align-self:center;margin:0;color:var(--ink-2);font-size:12px;white-space:nowrap}
.kundbank-filter .mini{min-height:44px}
.kundbank-tomt{margin:2px 0 12px}
.efter-filter{display:grid;gap:9px;margin-bottom:12px;padding:10px;border:1px solid var(--line);background:#f7f8f3}
.efter-filter>label{display:grid;gap:5px;color:var(--ink-2);font-family:var(--mono);font-size:12px;letter-spacing:.04em}
.efter-filter input{width:100%;min-width:0;min-height:44px}
.efter-filter>p{margin:0;color:var(--ink-2);font-size:12px}
.efter-filterval{display:flex;gap:6px;flex-wrap:wrap}
.efter-filterval button{display:flex;align-items:center;gap:7px;min-height:40px;padding:7px 10px;border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--surface);color:var(--ink-2);font-family:var(--mono);font-size:10px;text-transform:uppercase;letter-spacing:.05em;cursor:pointer}
.efter-filterval button span{display:grid;place-items:center;min-width:20px;height:20px;padding:0 4px;border-radius:10px;background:#e8eae4;font-size:10px}
.efter-filterval button[aria-pressed="true"]{border-color:var(--ink);background:var(--ink);color:#fff}
.efter-filterval button[aria-pressed="true"] span{background:var(--gul);color:var(--ink)}
.efter-tomt{margin:2px 0 12px}
.efter-tabellskroll{max-width:100%;overflow-x:auto;overscroll-behavior-inline:contain;-webkit-overflow-scrolling:touch;
  scrollbar-gutter:stable;border-bottom:1px solid var(--line-2)}
.efter-tabellskroll table{display:table;min-width:720px}
.efter-tabellskroll.bred table{min-width:1100px}
.efter-tabellskroll::after{content:"Dra i sidled för fler kolumner →";display:none;position:sticky;left:0;width:max-content;
  padding:6px 10px;color:var(--ink-3);font-family:var(--mono);font-size:10px;text-transform:uppercase;letter-spacing:.04em}

@media (max-width:640px){
  .projekt-filter{grid-template-columns:1fr}
  .projekt-filter button{width:100%}
  .projekt-filterstatus,.projekt-angra{align-items:flex-start;flex-direction:column}
  .projekt-filterstatus button,.projekt-angra button{width:100%}
  .projekt-korthuvud{align-items:stretch;flex-direction:column}
  .projekt-korthuvud button{width:100%}
  .projekt-delrad{padding:12px 4px}
  .kundbank-filter{grid-template-columns:1fr;align-items:stretch}
  .kundbank-filter p{white-space:normal}
  .kundbank-filter .mini{width:100%}
  .efter-filterval{display:grid;grid-template-columns:1fr 1fr}
  .efter-filterval button{justify-content:space-between;min-height:44px}
  .efter-tabellskroll::after{display:block}
}
/* flikarna som piller i stället för kantiga mappflikar, samma färgspråk, modernare form */
.tabs{display:flex;gap:6px;margin-bottom:14px;flex-wrap:wrap}
.tabs button{border:1px solid var(--line);background:transparent;cursor:pointer;padding:7px 14px;font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.1em;text-transform:uppercase;color:var(--ink-2);border-radius:999px;transition:background .12s,border-color .12s,color .12s}
.tabs button[aria-selected=true]{background:var(--ink);color:var(--accent);border-color:var(--ink)}
.tabs button:hover:not([aria-selected=true]){border-color:var(--ink-3)}
.card{background:var(--surface);border:1px solid var(--line-2);border-radius:var(--r);margin-bottom:14px;box-shadow:var(--skugga-1)}
.card>h3{margin:0;padding:9px 14px;border-bottom:1px solid var(--line-2);font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.11em;text-transform:uppercase;color:var(--ink-2);font-weight:400}
.card .pad{padding:14px}
.cols{display:grid;grid-template-columns:1fr 1fr;gap:14px}
/* Tre lika kort i bredd. Landningssidans "Det som faktiskt skiljer" fick ett
   tredje kort 2026-08-27 och det hamnade ensamt på en egen rad i tvåkolumns-
   rutnätet. Faller till en kolumn under 820 px som .cols. */
.cols.cols-3{grid-template-columns:1fr 1fr 1fr}
@media (max-width:820px){.cols,.cols.cols-3{grid-template-columns:1fr}}
.total{background:linear-gradient(150deg,#1b2124,#14181a 60%);color:var(--paper);border-radius:var(--r);padding:16px 18px;margin-bottom:14px;display:grid;grid-template-columns:1fr auto;gap:6px 20px;align-items:end;box-shadow:var(--skugga-1)}
.total .lbl{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.11em;text-transform:uppercase;color:#8f9894}
.total .big{font-family:var(--sans);font-size:40px;font-weight:700;line-height:1;font-variant-numeric:tabular-nums;color:var(--accent)}
.total .sm{font-family:var(--mono);font-size:13px;color:#c9cfcb;text-align:right;font-variant-numeric:tabular-nums}
.total .sm span{display:block}
.total .band{grid-column:1/-1}
.total .strip{grid-column:1/-1;border-top:1px solid #2c3330;padding-top:10px;margin-top:8px;display:flex;gap:22px;flex-wrap:wrap}
.total .strip div{font-family:var(--mono);font-size:var(--tx-etikett);color:#8f9894}
.total .strip b{display:block;font-size:15px;color:var(--paper);font-weight:500}
table{width:100%;border-collapse:collapse;font-size:13px}
th{text-align:left;font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);font-weight:400;padding:6px 10px;border-bottom:1px solid var(--line)}
td{padding:5px 10px;border-bottom:1px solid var(--line-2);vertical-align:top}
td.n,th.n{text-align:right;font-family:var(--mono);font-variant-numeric:tabular-nums;white-space:nowrap}
tr.sum td{border-top:1.5px solid var(--ink);border-bottom:0;font-weight:600;padding-top:8px}
tr.sub td{color:var(--ink-2)}
td.grp-h{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);background:#f5f6f2;padding-top:8px}
tbody tr:hover{background:#fafbf8}
.pos{color:var(--ok)} .neg{color:var(--stop)}
.note{display:flex;gap:9px;padding:9px 12px;border-left:3px solid;margin:0 0 8px;font-size:13px;background:var(--surface);border-radius:0 var(--r-sm) var(--r-sm) 0}
.note.stop{border-color:var(--stop)} .note.warn{border-color:var(--warn)}
.note.info{border-color:var(--ink-3)} .note.ok{border-color:var(--ok)}
.note .tag{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.06em;text-transform:uppercase;flex:none;padding-top:2px;width:88px;overflow-wrap:break-word;line-height:1.3}
.note.stop .tag{color:var(--stop)} .note.warn .tag{color:var(--warn)}
.note.info .tag{color:var(--ink-3)} .note.ok .tag{color:var(--ok)}
.flernoter{margin:0 0 8px}
.flernoter>summary{list-style:none;cursor:pointer;font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.08em;text-transform:uppercase;color:var(--ink-3);padding:7px 12px;background:var(--surface);border-left:3px solid var(--line);user-select:none}
.flernoter>summary::-webkit-details-marker{display:none}
.flernoter>summary:hover{color:var(--ink-2)}
.flernoter[open]>summary{margin-bottom:8px}
svg{display:block;max-width:100%;height:auto}
.legend{display:flex;gap:14px;flex-wrap:wrap;padding:10px 14px;border-top:1px solid var(--line-2);font-family:var(--mono);font-size:var(--tx-etikett);color:var(--ink-2)}
.legend span{display:flex;align-items:center;gap:5px}
.legend i{width:11px;height:11px;display:block;border:1px solid rgba(0,0,0,.25)}
.btn{border:1px solid var(--ink);background:var(--ink);color:var(--accent);font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.1em;text-transform:uppercase;padding:9px 16px;border-radius:var(--r-sm);cursor:pointer;transition:transform .12s,box-shadow .12s,opacity .12s}
.btn.ghost{background:transparent;color:var(--ink)}
.btn.primary,.admin-prisspara .btn{background:var(--accent);border-color:var(--accent);color:var(--ink)}
.btn:hover{opacity:.92;transform:translateY(-1px);box-shadow:var(--skugga-1)}
.btn:active{transform:translateY(0);box-shadow:none}
button:disabled{cursor:not-allowed}
.btn:disabled,.mini:disabled{opacity:.55;transform:none;box-shadow:none;cursor:not-allowed}
a.btn,a.mini{text-decoration:none;display:inline-flex;align-items:center;justify-content:center}
.btnrow{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px}
.objlist{font-size:12.5px}
.objlist div{display:flex;align-items:center;gap:8px;padding:5px 0;border-bottom:1px solid var(--line-2)}
.objlist span{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* ---------- säljdokument: offert, avtal, fakturaunderlag, bygglovsunderlag ---------- */
/* på skärm får dokumentet pappersskugga och mjuka hörn; utskriften nollar båda */
.offert{background:var(--surface);border:1px solid var(--line-2);border-radius:var(--r);box-shadow:var(--skugga-1);padding:40px 44px 46px;max-width:840px;font-size:13.5px;line-height:1.55;position:relative}
/* brevhuvud: avsändarblock till vänster, dokumentets nyckeltal till höger, gul accentlinje under */
.brev{display:flex;justify-content:space-between;align-items:flex-start;gap:28px;flex-wrap:wrap;padding-bottom:13px;border-bottom:2.5px solid var(--accent)}
.brev-avs{display:flex;gap:13px;align-items:flex-start;min-width:0}
.brev-marke{width:40px;height:40px;flex:none}
.brev-marke svg{width:100%;height:100%;display:block}
.brev-namn{font-family:var(--sans);font-size:19px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;line-height:1.05;margin:1px 0 0}
.brev-fin{font-family:var(--mono);font-size:var(--tx-etikett);line-height:1.65;color:var(--ink-3);margin-top:4px;letter-spacing:.01em}
.brev-meta{margin-left:auto;text-align:right;font-family:var(--mono);font-size:var(--tx-etikett);line-height:1.5;color:var(--ink);min-width:150px}
.brev-meta div{margin:2px 0}
.brev-meta span{font-size:var(--tx-etikett);letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);margin-right:7px}
.brev-meta b{font-weight:500;font-variant-numeric:tabular-nums}
.dok-titel{margin:26px 0 18px}
.offert h2{font-family:var(--sans);text-transform:uppercase;letter-spacing:.02em;font-size:27px;line-height:1.1;margin:0}
.dok-titel .fine{margin:7px 0 0;max-width:64ch}
.offert .mottagare{margin:0 0 16px}
.offert .mottagare .mrk{display:block;font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.11em;text-transform:uppercase;color:var(--ink-3);margin-bottom:3px}
.offert .ingress{font-size:14.5px;line-height:1.6;max-width:68ch;margin:0 0 4px}
.offert h4{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.13em;text-transform:uppercase;color:var(--ink-2);font-weight:400;margin:28px 0 9px;padding-bottom:6px;border-bottom:1px solid var(--line-2);display:flex;align-items:center;gap:9px}
.offert h4::before{content:"";width:14px;height:2px;background:var(--accent);flex:none}
.offert p{margin:8px 0} .offert ul{margin:7px 0 4px;padding-left:17px} .offert li{margin:4px 0}
.offert li::marker{color:var(--accent-deep)}
.offert table{margin:2px 0 6px}
.offert td{padding:7px 0}
.offert th{padding:6px 0}
.offert td.n,.offert th.n{padding-left:16px}
.offert tbody tr:hover{background:none}
/* projektkalkylen har eget brevhuvud och egen slutrad (.tot), samma familj som verktygens */
.offert .brevhuvud{font-family:var(--mono);font-size:var(--tx-etikett);line-height:1.6;color:var(--ink-3);
  padding-bottom:11px;border-bottom:2.5px solid var(--accent);margin-bottom:22px}
.offert .brevhuvud b{font-family:var(--sans);font-size:17px;text-transform:uppercase;letter-spacing:.03em;color:var(--ink);display:block}
.offert tr.sum td{border-top:1px solid var(--ink);border-bottom:0;font-weight:600;padding-top:9px}
.offert tr.sub td{color:var(--ink-2);font-size:12.5px}
/* ROT/RUT-avdraget är ofta kundens viktigaste siffra på hela dokumentet, utan
   emphasis såg det ut som en förbisedd momsrad. Samma storlek som övriga sub-rader
   (den ska inte konkurrera med Att betala-raden), men i accentfärg och fet stil så
   ögat stannar på den. */
.offert tr.rot td{color:var(--accent-deep);font-weight:700}
/* summan är dokumentets tyngdpunkt: beloppet stort, etiketten underordnad */
.offert tr.slut td,.offert tr.tot td{border-top:2px solid var(--ink);border-bottom:0;padding-top:13px;padding-bottom:2px;
  font-family:var(--sans);font-size:26px;font-weight:700;line-height:1;font-variant-numeric:tabular-nums}
.offert tr.slut td:first-child,.offert tr.tot td:first-child{font-family:var(--mono);font-size:var(--tx-etikett);font-weight:400;letter-spacing:.12em;
  text-transform:uppercase;color:var(--ink-2);vertical-align:bottom;padding-bottom:6px}
.offert .prisnot{margin:14px 0 4px;padding:11px 14px;border-left:3px solid var(--accent);background:#faf9f2;
  font-size:12.5px;line-height:1.55;color:var(--ink-2)}
.offert .prisnot strong{color:var(--ink)}
.offert .signatur{margin-top:36px;padding-top:18px;border-top:1px solid var(--line-2)}
.sidfot{display:none}
.fine{font-size:11.5px;color:var(--ink-2);line-height:1.55}
/* startsida */
.hub{max-width:1060px;margin:0 auto;padding:26px 20px 80px}
.hub h2{font-family:var(--mono);font-size:12px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-2);font-weight:400;margin:30px 0 12px;border-bottom:1px solid var(--line);padding-bottom:7px}
.hubgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px}
.hubkort{display:block;background:var(--surface);border:1px solid var(--line-2);border-radius:var(--r);padding:15px 16px;text-decoration:none;color:var(--ink);box-shadow:var(--skugga-1);transition:border-color .14s,transform .14s,box-shadow .14s}
.hubkort:hover{border-color:var(--accent-deep);transform:translateY(-2px);box-shadow:var(--skugga-2)}
.hubkort b{font-family:var(--sans);font-size:16px;text-transform:uppercase;letter-spacing:.02em;display:block;margin-bottom:5px}
.hubkort span{font-size:12.5px;color:var(--ink-2);line-height:1.45;display:block}
.hubkort .tagg{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.1em;text-transform:uppercase;color:var(--accent-deep);display:inline-block;margin-top:9px}
/* desktop: totalsumman följer med när flikinnehållet scrollas */
/* Menyn är 12,5 px som bas, för det är telefonen som används i fält och där
   ska texten gå att läsa i solljus. På skrivbordet får den vara diskret igen.
   Basen är den mindre skärmen, inte tvärtom: ett fel åt det hållet syns direkt,
   ett fel åt andra hållet upptäcks först när någon står ute och kisar. */
@media (min-width:961px){
  .appnav a{font-size:var(--tx-etikett)}
  .apptopp .konto>button{font-size:var(--tx-etikett)}
  .sidtitel .sub{font-size:var(--tx-etikett)}

  .total{position:sticky;top:12px;z-index:15;box-shadow:0 3px 14px rgba(20,24,26,.18)}
  /* Interaktiv 3D behöver hela sin canvas. Den klistrade prisrutan låg annars
     ovanpå takfoten och dolde detaljvyerna; React sätter klassen bara medan
     WebGL-vyn är öppen. Priset ligger kvar i normalt dokumentflöde. */
  body.egf-3d-oppen .total{position:static}
}
.navchips{display:flex;gap:6px;flex-wrap:wrap;margin:0 0 16px}
.navchips a{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.06em;text-transform:uppercase;color:var(--ink-2);text-decoration:none;border:1px solid var(--line);border-radius:999px;padding:5px 11px;background:var(--surface);transition:border-color .12s,color .12s}
.navchips a:hover{border-color:var(--accent-deep);color:var(--ink)}
/* mörkt läge borttaget på ägarens begäran 2026-08-04, sviten är alltid ljus */
/* fältbruk: telefon och surfplatta på plats. 840 (inte 700) för att täcka in
   820×1180-surfplattan, under det breddläget fanns ingen touch-anpassning alls:
   19px checkrader, 23–29px knappar/fält på en pekskärm. */
@media (max-width:840px){
  body{font-size:15px}
  /* LÄSBAR TEXT PÅ TELEFON. Gränssnittets etiketter är versaliserad monospace
     med luft mellan bokstäverna, och på skärm ser 10,5 px stramt och prydligt
     ut. I en bil, i solljus, med skyddsglasögon på är det oläsbart. Versaler
     och letter-spacing gör det värre, inte bättre: ögat får inga ordbilder att
     känna igen.

     12 px är golvet mätt av e2e/mobil.spec.js. Reglerna nedan träffar de
     etiketter som faktiskt låg under: menyn, flikarna, korthuvudena, enheterna
     och hinttexterna. Storlekarna på skrivbordet rörs inte. */
  .appnav a,.apptopp .konto>button,.masthead .sub,.sidtitel .sub{font-size:12.5px}
  .grp>summary,.card>h3,.total .lbl,.klass,.dok-titel{font-size:12px}
  .hint,.fine,.unit,.komprad,.lagertext{font-size:12px}
  .seg button,.tabs button,.mini{font-size:12px}
  /* Letter-spacing stjäl bredd på en 390 px skärm och tvingar fram radbrytningar
     mitt i ord. Halveras här, syns inte men ger tillbaka en tredjedels rad. */
  .appnav a,.tabs button,.seg button,.grp>summary,.card>h3{letter-spacing:.05em}
  input[type=number],input[type=text],input[type=email],input[type=password],input[type=date],select{font-size:16px;padding:10px 9px;width:110px;min-height:44px}
  /* Baslinje för ALLA kryssrutor, inte bara .check, sidor som Projekt.jsx bygger
     enstaka rutor med inline-stil utan att gå via .check, och ärvde annars
     webbläsarens 13 px. Klasser med egen storlek (.utr, .pb-bock, .tillaggsval)
     är mer specifika och vinner ändå. */
  /* Rutan ritas 22 px. TRÄFFYTAN är LABELN runt den, inte rutan: hela raden
     "Egna lagertjocklekar …" går att trycka på, och det är så en kryssruta
     används på telefon. ::after fungerar inte här, input är ett replaced
     element och får inga pseudoelement, det var ett felförsök 2026-08-21. */
  input[type=checkbox]{width:22px;height:22px}
  label:has(>input[type=checkbox]),.check{min-height:44px;display:flex;align-items:center;gap:10px}
  input[type=text],input[type=email],input[type=password],input[type=date],select{width:100%}
  /* etiketten på egen rad, fält och select i full bredd under, inget spränger */
  .row{flex-wrap:wrap}
  .row label{flex:1 1 100%}
  .row input[type=number]{flex:1 1 auto;width:auto;min-width:110px;max-width:160px}
  .row .unit{width:auto}
  .seg button{padding:14px 4px;font-size:var(--tx-etikett);min-height:44px}
  .mini{padding:13px 14px;font-size:var(--tx-etikett);min-height:44px}
  /* checkboxraden var bara 19px hög, under 40px räcker inte på en pekskärm.
     .check är redan flex+align-items:center, så min-height centrerar gratis. */
  .check{min-height:44px}
  /* Kryssrutan själv var 13×13, omöjlig att pricka med handske. Samma storlek
     som .utr input (utrustningslistan) ger konsekvent känsla över appen. */
  .check input[type=checkbox]{width:22px;height:22px;flex:0 0 auto}
  /* 3D-styrningens hint-text (t.ex. "Klicka = markera ...") delar annars rad med kameraknapparna,
     dess flex:1 krymper till en smal kolumn, radbryts till flera rader och stretch-drar upp knapparna
     i höjd (~89px). Egen rad löser det utan att röra JS-genererad HTML. */
  .btnrow .hint{flex:1 1 100%!important;align-self:auto!important;order:-1;margin-bottom:2px}
  .btn{padding:14px 18px;min-height:44px}
  .butik-omrade,.pb-val small,.verktygshubb-svephjalp{font-size:12px}
  .projekt-filter button,.projekt-filterstatus button,.projekt-inga button,
  .projekt-korthuvud button,.projekt-angra button{font-size:12px}
  .efter-filterval button,.efter-filterval button span{font-size:12px}
  /* Flikraden är mobilens navigering mellan Ritning/Mängder/Kalkyl/Offert och
     fästs i toppen (2026-08-17). Förut satt .total där, men priset står redan
     i den fastnaglade prisraden längst ned, så det fastnaglade prisblocket
     gjorde bara två saker: åt en tredjedel av skärmen och LÅSTE FLIKARNA under
     sig. Uppmätt: ett klick på Offert-fliken fastnade i prisblocket och
     guidraden ("intercepts pointer events"), kunden kom aldrig vidare. */
  .tabs{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;
    position:sticky;top:0;z-index:22;background:var(--paper);box-shadow:0 2px 8px rgba(20,24,26,.14)}
  .tabs::-webkit-scrollbar{display:none}
  .tabs button{padding:10px 14px;flex:none}
  .grp>summary{padding:14px 16px}
  .total{position:static;box-shadow:none;grid-template-columns:minmax(0,1fr);gap:7px}
  .total .big{font-size:32px;white-space:nowrap}
  .total .sm{grid-column:1/-1;display:flex;flex-wrap:wrap;gap:5px 14px;text-align:left;font-size:12px}
  .total .sm span{display:inline}
  .total .strip{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px;padding-bottom:4px}
  .total .strip>div{min-width:0;overflow-wrap:anywhere}
  .total .strip b{font-size:14px;line-height:1.45;white-space:normal}
  .pane-out{padding:12px 12px 90px}
  .offert{padding:20px 16px;font-size:14px}
  .brev{gap:14px}
  .brev-meta{margin-left:0;text-align:left;min-width:0;width:100%;border-top:1px solid var(--line-2);padding-top:8px}
  .brev-meta span{display:inline-block;min-width:88px;margin-right:4px}
  .offert h2{font-size:21px}
  .dok-titel{margin:20px 0 14px}
  .offert tr.slut td,.offert tr.tot td{font-size:20px}
  .offert tr.slut td:first-child,.offert tr.tot td:first-child{font-size:var(--tx-etikett)}
  .radkort .del{width:44px;height:44px}
  .tabs button{padding:13px 14px;flex:none;min-height:44px}
  /* breda tabeller scrollar i sitt kort i stället för att spränga sidan */
  table{display:block;overflow-x:auto;-webkit-overflow-scrolling:touch}
  .offert{padding:16px 12px}
  /* Huvudmenyns länkar (appnav) och Konto-knappen landade på 30–38 px höjd,
     under WCAG-målytan 44 px. display:flex+align-items centrerar texten om
     istället för att bara växa nedåt via padding. */
  .apptopp .konto>button{min-height:44px;display:inline-flex;align-items:center}
  .appnav a{min-height:44px;display:flex;align-items:center}
  .masthead h1 a,.masthead .logo a{display:inline-flex;align-items:center;min-height:44px}
}

/* ============================================================================
   Inloggade undersidor: samma arbetsyta som dashboarden.

   Varje sida behåller sin egen logik. Det här lagret samlar bara sidhuvud,
   navigation, tomlägen och responsiva dataytor så att Projekt, Kundbank,
   Guider och Admin känns som samma produkt även på en telefon.
   ============================================================================ */
.sida-intro{position:relative;overflow:hidden;background:#181d1f;color:#f3f4f0;border-bottom:3px solid var(--accent)}
.sida-intro::before{content:"";position:absolute;inset:0;pointer-events:none;opacity:.28;
  background-image:linear-gradient(rgba(255,255,255,.055) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.055) 1px,transparent 1px);
  background-size:48px 48px}
.sida-intro::after{content:"";position:absolute;width:240px;height:240px;right:-140px;top:-150px;
  border:1px solid rgba(242,183,5,.32);transform:rotate(45deg);pointer-events:none}
.sida-intro-in{position:relative;z-index:1;max-width:1160px;margin:0 auto;padding:29px 20px 27px;
  display:flex;align-items:flex-end;justify-content:space-between;gap:34px}
.sida-intro-text{min-width:0}
.sida-intro-kicker{display:block;margin-bottom:7px;font-family:var(--mono);font-size:10px;line-height:1.3;
  letter-spacing:.13em;text-transform:uppercase;color:var(--accent)}
.sida-intro h1{margin:0;font-family:var(--sans);font-size:clamp(30px,4.4vw,48px);line-height:.98;
  letter-spacing:.01em;text-transform:uppercase;color:#f3f4f0;overflow-wrap:anywhere;hyphens:auto}
.sida-intro p{max-width:67ch;margin:10px 0 0;color:#aeb7b2;font-size:14px;line-height:1.5}
.sida-intro-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:16px}
.sida-intro-actions .btn{border-color:var(--accent);background:var(--accent);color:var(--ink);text-decoration:none}
.sida-intro-actions .btn.ghost{border-color:#58615d;background:transparent;color:#f3f4f0}
.sida-intro-status{display:flex;align-items:stretch;gap:0;margin:0;flex:none;border:1px solid #3a423e;background:rgba(0,0,0,.1)}
.sida-intro-status>div{min-width:104px;padding:11px 14px}
.sida-intro-status>div+div{border-left:1px solid #3a423e}
.sida-intro-status dt{font-family:var(--mono);font-size:9px;letter-spacing:.09em;text-transform:uppercase;color:#8f9894}
.sida-intro-status dd{margin:4px 0 0;font-family:var(--sans);font-size:22px;font-weight:700;line-height:1;color:var(--accent);
  font-variant-numeric:tabular-nums}
.sida-intro-kompakt .sida-intro-in{padding-top:20px;padding-bottom:19px}
.sida-intro-kompakt h1{font-size:clamp(26px,3.5vw,38px)}
.sida-intro+.hub{padding-top:28px}

.sida-sektionnav{display:flex;gap:6px;overflow-x:auto;margin:0 0 20px;padding:0 0 4px;scrollbar-width:thin}
.sida-sektionnav a{flex:none;display:inline-flex;align-items:center;min-height:38px;padding:7px 12px;border:1px solid var(--line);
  border-radius:999px;background:var(--surface);color:var(--ink-2);font-family:var(--mono);font-size:10px;
  letter-spacing:.07em;text-transform:uppercase;text-decoration:none}
.sida-sektionnav a:hover,.sida-sektionnav a:focus-visible{border-color:var(--accent-deep);color:var(--ink)}
.sida-sektionshuvud{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;margin:30px 0 12px;
  padding-bottom:8px;border-bottom:2px solid var(--ink)}
.hub .sida-sektionshuvud h2{margin:0;padding:0;border:0;font-family:var(--sans);font-size:22px;font-weight:700;
  letter-spacing:.01em;color:var(--ink)}
.sida-sektionshuvud span{font-family:var(--mono);font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-3)}
.sida-tomt{padding:28px;border:1px dashed #b7beb4;background:#f7f8f4;text-align:center}
.sida-tomt strong,.sida-tomt h1{display:block;font-family:var(--sans);font-size:19px;text-transform:uppercase;margin:0}
.sida-tomt p{max-width:56ch;margin:7px auto 15px;color:var(--ink-2);line-height:1.5}
.tabellskroll{max-width:100%;overflow-x:auto;border:1px solid var(--line-2);background:var(--surface);box-shadow:var(--skugga-1)}
.tabellskroll>table{min-width:680px}

/* Admin: tabellen är ett dataverktyg på dator och en kortlista på telefon.
   Att pressa sex kolumner till 390 px gjorde tidigare orden lodräta. */
.admin-nav{position:sticky;top:94px;z-index:25;padding-top:8px;background:linear-gradient(var(--paper) 82%,transparent)}
#admin-konton,#admin-support,#admin-statistik,#admin-priser{scroll-margin-top:152px}
.admin-kontokort-lista{display:none}
.admin-kontotabell td:nth-child(3),.admin-kontotabell td:nth-child(4){white-space:nowrap}
.admin-rattighetsrad{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:7px 0;border-top:1px solid var(--line-2)}
.admin-rattighetsrad:first-child{border-top:0}
.admin-ge-rattighet{display:grid;grid-template-columns:repeat(4,minmax(120px,1fr)) auto;gap:10px;align-items:end;margin-top:18px;
  padding-top:16px;border-top:1px solid var(--line)}
.admin-ge-rattighet label{display:flex;flex-direction:column;gap:5px;font-family:var(--mono);font-size:10px;
  letter-spacing:.06em;text-transform:uppercase;color:var(--ink-3)}
.admin-ge-rattighet input,.admin-ge-rattighet select{width:100%;min-height:44px}
.admin-ge-rattighet .hint{grid-column:1/-1}

/* Mina verktyg: samma information som kvittotabellen, men utan mikroskopiska
   kolumner på mobil. */
.mv-kortlista{display:none}
.mv-summa{display:flex;justify-content:space-between;gap:16px;align-items:flex-end;padding:16px 18px;background:var(--ink);color:#fff;
  border-bottom:3px solid var(--accent)}
.mv-summa span{font-family:var(--mono);font-size:10px;letter-spacing:.07em;text-transform:uppercase;color:#aeb7b2}
.mv-summa b{font-family:var(--sans);font-size:24px;color:var(--accent);white-space:nowrap}

@media (max-width:840px){
  .sida-intro-in{padding:23px 16px 21px;align-items:flex-start}
  .sida-intro h1{font-size:clamp(24px,7vw,31px);line-height:1.08}
  .sida-intro p{font-size:13px}
  .sida-intro-status,.sida-intro-status *{display:none}
  .sida-intro-kicker,.sida-sektionnav a,.sida-sektionshuvud span,
  .admin-ge-rattighet label,.mv-summa span{font-size:12px}
  .sida-intro+.hub{padding:20px 14px 70px}
  .sida-sektionnav{margin-left:-14px;margin-right:-14px;padding-left:14px;padding-right:14px}
  .sida-sektionnav a{min-height:44px}
  .sida-sektionshuvud{align-items:flex-start;flex-direction:column;gap:3px}
  .hub .sida-sektionshuvud h2{font-size:20px}
  .sida-tomt{padding:23px 15px}
  .tabellskroll{margin-left:-1px;margin-right:-1px;box-shadow:none}

  .admin-kontotabell{display:none}
  .admin-kontokort-lista{display:grid;gap:10px}
  .admin-kontokort{border:1px solid var(--line);background:var(--surface);box-shadow:var(--skugga-1)}
  .admin-kontokort-summary{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;width:100%;padding:13px 14px;
    border:0;background:transparent;color:inherit;text-align:left;cursor:pointer}
  .admin-kontokort-summary:focus-visible{outline:3px solid var(--accent-deep);outline-offset:-3px}
  .admin-kontokort.oppet{border-color:#a7aa9f;box-shadow:0 8px 22px rgba(20,24,26,.11)}
  .admin-kontokort-summary-slut{display:flex;align-items:center;gap:8px;flex:none}
  .admin-kontokort-pil{position:relative;width:18px;height:18px}
  .admin-kontokort-pil::before,.admin-kontokort-pil::after{content:"";position:absolute;left:3px;top:8px;width:12px;height:1.5px;background:var(--ink)}
  .admin-kontokort-pil::after{transform:rotate(90deg);transition:transform .15s}
  .admin-kontokort-summary[aria-expanded=true] .admin-kontokort-pil::after{transform:rotate(0)}
  .admin-kontokort-detaljer{border-top:1px solid var(--line-2)}
  .admin-kontokort-summary b{display:block;font-size:15px;overflow-wrap:anywhere}
  .admin-kontokort-summary>div>span{display:block;font-size:12px;color:var(--ink-3)}
  .admin-kontostatus{flex:none;padding:3px 8px;border:1px solid var(--ok);border-radius:999px;font-family:var(--mono);
    font-size:12px;text-transform:uppercase;color:var(--ok)}
  .admin-kontostatus.stangt{border-color:var(--stop);color:var(--stop)}
  .admin-kontokort-meta{display:grid;grid-template-columns:1fr 1fr;gap:8px;padding:11px 14px;border-bottom:1px solid var(--line-2)}
  .admin-kontokort-meta span{font-size:12px;color:var(--ink-3)}
  .admin-kontokort-meta b{display:block;margin-top:2px;font-family:var(--mono);font-size:12px;color:var(--ink);font-weight:500}
  .admin-kontokort-rattigheter{padding:8px 14px}
  .admin-kontokort-rattigheter>span{font-family:var(--mono);font-size:12px;text-transform:uppercase;color:var(--ink-3)}
  .admin-rattighetsrad{align-items:flex-start;flex-direction:column}
  .admin-rattighetsrad .mini{width:100%}
  .admin-kontokort-actions{display:grid;grid-template-columns:1fr 1fr;gap:7px;padding:11px 14px;background:#f7f8f4}
  .admin-kontokort-actions .mini{width:100%;white-space:normal}
  .admin-ge-rattighet{grid-template-columns:1fr;padding:15px 14px;margin:14px -14px -14px;background:#f7f8f4}
  .admin-ge-rattighet .hint{grid-column:auto}
  .admin-ge-rattighet button{width:100%}
  .admin-nav{top:63px;margin-left:-14px;margin-right:-14px;padding-left:14px;padding-right:14px}
  #admin-konton,#admin-support,#admin-statistik,#admin-priser{scroll-margin-top:126px}

  .mv-tabell{display:none}
  .mv-kortlista{display:grid;gap:9px;margin-top:14px}
  .mv-kort{background:var(--surface);border:1px solid var(--line);box-shadow:var(--skugga-1)}
  .mv-kort-huvud{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;padding:13px 14px;border-bottom:1px solid var(--line-2)}
  .mv-kort-huvud b{font-size:15px}
  .mv-kort-pris{font-family:var(--sans);font-size:18px;font-weight:700;white-space:nowrap}
  .mv-kort-meta{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:10px 14px;color:var(--ink-2)}
  .mv-kort .kampanj{padding:0 14px 12px}
  .mv-summa{margin-top:1px}
}
/* ---------- utskrift: A4, dokumentet ensamt på papperet ---------- */
@page{margin:16mm 15mm 20mm}
@media print{
  body{background:#fff;font-size:10.5pt}
  .masthead,.pane-in,.tabs,.btnrow,.noprint,.navchips,.legend{display:none!important}
  .total,.note,.flernoter{display:none!important}
  /* INTERNT UNDERLAG FÅR ALDRIG PÅ PAPPRET. Kalkylsäkerheten säger hur osäker vår
     egen kalkyl är, riskbufferten hur mycket vi lagt på, och guidraden är våra
     arbetsguider, allt tre är till för den som räknar, inte för kunden som får
     offerten. De hamnade i utskriften för att de är .card, och .card är just vad
     dokumentet självt består av. Upptäckt i en skarp kund-PDF 2026-08-14. */
  [data-sakerhet],.guidrad{display:none!important}
  /* accentlinjer, gula markörer och prisnotens platta hör till identiteten, de ska med på papperet */
  .offert,.offert *{-webkit-print-color-adjust:exact;print-color-adjust:exact}
  .shell{display:block}.pane-out{padding:0}
  .card{break-inside:avoid}
  .offert{border:0;border-radius:0;box-shadow:none;padding:0;max-width:none;font-size:10.5pt;line-height:1.45}
  .offert h2{font-size:21pt}
  .brev-namn{font-size:15pt}
  .brev-fin{font-size:7.5pt}
  .brev-meta{font-size:8.5pt}
  .offert .ingress{font-size:11pt}
  .offert h4{font-size:8.5pt;margin:16pt 0 6pt}
  .offert tr.slut td,.offert tr.tot td{font-size:19pt}
  .offert .prisnot{background:none;padding:8pt 10pt}
  /* inget block får klyvas mitt itu, och en rubrik får aldrig bli ensam sist på sidan */
  tr,td,th,li,p,.prisnot,.brev,.dok-titel,.mottagare,.signatur,figure,svg{break-inside:avoid}
  thead{display:table-header-group}
  h2,h3,h4{break-after:avoid}
  h4+table,h4+ul,h4+p,p+ul,p+table,.dok-titel{break-before:avoid}
  /* Sidfot sist i dokumentet. position:fixed upprepas INTE per ark i Chrome (den hamnar
     där vyporten slutar och lägger sig över texten), och counter(page) stöds inte utanför
     @page-marginalrutorna, sidnumret i utskrift kommer från webbläsarens egen sidfot.
     Den handrullade PDF:en numrerar sina sidor själv. */
  .sidfot{display:flex!important;gap:10px;justify-content:space-between;align-items:baseline;
    margin-top:16pt;border-top:.5pt solid #cfd3ca;padding-top:4pt;break-inside:avoid;
    font-family:var(--mono);font-size:7.5pt;letter-spacing:.03em;color:#6d7672}
}

/* "Detta behöver du", avprickningslista i Mängd-fliken. Stor träffyta: den används i
   bilen och i förrådet, ofta med handskar på. */
.utr{display:flex;gap:10px;align-items:flex-start;padding:9px 11px;margin-bottom:6px;
  border:1px solid var(--linje,#d8d5cc);border-radius:9px;background:#fff}
.utr.klar{background:#f4faf6;border-color:#2f7a4f}
.utr input{width:22px;height:22px;flex:0 0 auto;margin-top:1px}
.utr b{display:block;font-size:14.5px;font-weight:600}
.utr span span{display:block;font-size:12.5px;color:#5d635f;margin-top:2px;line-height:1.35}
@media print{.utr input{-webkit-appearance:none;appearance:none;border:1.5px solid #555;border-radius:3px}}

/* ---------- landningssida (utloggad besökare på "/"), bara .landning-* här ---------- */
/* Ritningsrutnätet: två lager linjer i CSS (fin 24 px, grov 120 px), ingen bild.
   Svagt nog att texten inte tävlar med det, tydligt nog att bandet läser som
   ett ritningsblad och inte en svart ruta. background-color, inte background:
   kortformen hade nollat background-image. */
.landning-hero{background-color:var(--ink);color:var(--paper);border-bottom:3px solid var(--accent);padding:56px 20px 64px;
  background-image:linear-gradient(rgba(242,183,5,.07) 1px,transparent 1px),linear-gradient(90deg,rgba(242,183,5,.07) 1px,transparent 1px),
    linear-gradient(rgba(233,235,229,.045) 1px,transparent 1px),linear-gradient(90deg,rgba(233,235,229,.045) 1px,transparent 1px);
  background-size:120px 120px,120px 120px,24px 24px,24px 24px}
/* 1180, inte 1060: samma bredd som .landning .hub nedan, hjälten och innehållet
   ska ha samma kant. */
.landning-hero>div{max-width:1180px;margin:0 auto}
/* 52 px i taket: "RÄKNA HELA JOBBET" är 17 tecken och textspalten 598 px vid
   1440, 56 hade knappt fått plats med systemets fallback-typsnitt. */
.landning-hero h1{font-family:var(--sans);font-size:clamp(28px,4.3vw,52px);font-weight:700;line-height:1.04;text-transform:uppercase;letter-spacing:.01em;color:var(--accent);margin:0 0 16px}
.landning-hero p{font-size:15.5px;line-height:1.6;max-width:64ch;color:#c9cfcb;margin:0 0 24px}
/* .btn är mörk på mörkt, på hjältebottnen inverteras den, spöket blir ljust */
.landning-hero .btn{text-decoration:none;background:var(--accent);border-color:var(--accent);color:var(--ink)}
.landning-hero .btn.ghost{background:transparent;border-color:#8f9894;color:var(--paper)}
.landning-steg{list-style:none;margin:0 0 10px;padding:0;display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;counter-reset:steg}
.landning-steg li{background:var(--surface);border:1px solid var(--line-2);border-radius:var(--r);padding:14px 16px;box-shadow:var(--skugga-1)}
.landning-steg li::before{counter-increment:steg;content:counter(steg);display:block;font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.1em;color:var(--accent-deep);margin-bottom:6px}
.landning-steg b{font-family:var(--sans);font-size:15px;text-transform:uppercase;letter-spacing:.02em;display:block;margin-bottom:4px}
.landning-steg span{font-size:12.5px;color:var(--ink-2);line-height:1.45}
.landning-ingress{max-width:68ch;margin:0 0 14px;color:var(--ink-2)}
.landning-brod{margin:0;font-size:13.5px;line-height:1.55;max-width:68ch}
.landning-verktyg{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:6px}
.landning-verktyg li{font-size:12.5px;border:1px solid var(--line-2);border-radius:999px;padding:4px 11px;background:#fbfcfa;color:var(--ink-2)}
.landning-login{padding-bottom:26px;scroll-margin-top:14px}
.landning-fot{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.08em;text-transform:uppercase;color:var(--ink-3);margin:0;padding:0 20px 44px}
/* Punkten mellan posterna ritas av css så den följer sitt ord vid radbrytning. */
.landning-fot>span+span::before{content:"\00B7";padding:0 9px}

/* ---------- appram: toppbar + sidhuvuden för det inloggade läget ---------- */
/* Toppbaren är appens ENDA mörka list; sidorna under har ljusa .sidtitel-huvuden.
   Inte sticky: på en telefon i fält är skärmytan dyrare än menyn, och priset
   (.total/.prisrad) äger redan de fasta kanterna. */
.apptopp{display:block;padding:0}
.apptopp .topprad{display:flex;align-items:center;gap:14px;padding:10px 16px 6px}
.apptopp h1,.apptopp .logo{font-size:18px}
.apptopp .konto{margin-left:auto;position:relative}
.apptopp .konto>button{border:1px solid #3a423e;background:transparent;color:#c9cfcb;cursor:pointer;
  font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.08em;text-transform:uppercase;padding:8px 12px;border-radius:2px}
.apptopp .konto>button:hover,.apptopp .konto>button[aria-expanded=true]{border-color:var(--accent);color:var(--accent)}
.mobilmenyknapp{display:none;border:1px solid #3a423e;background:transparent;color:#c9cfcb;cursor:pointer;
  font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.08em;text-transform:uppercase;padding:8px 10px;border-radius:2px}
.mobilmenyknapp>span{display:flex;width:15px;flex-direction:column;gap:3px}
.mobilmenyknapp i{display:block;width:15px;height:1px;background:currentColor}
.mobilmenyknapp:hover,.mobilmenyknapp[aria-expanded=true]{border-color:var(--accent);color:var(--accent)}
.kontomeny{position:absolute;right:0;top:calc(100% + 8px);z-index:60;min-width:190px;display:flex;flex-direction:column;
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);box-shadow:var(--skugga-2);overflow:hidden}
.kontomeny a,.kontomeny button{display:block;width:100%;text-align:left;border:0;background:none;cursor:pointer;
  font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.08em;text-transform:uppercase;color:var(--ink);
  text-decoration:none;padding:13px 16px;border-bottom:1px solid var(--line-2)}
.kontomeny :last-child{border-bottom:0}
.kontomeny a:hover,.kontomeny button:hover{background:#f1f2ee}
.appnav{display:flex;gap:2px;padding:0 10px;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}
.appnav::-webkit-scrollbar{display:none}
.appnav a{flex:none;font-family:var(--mono);font-size:12.5px;letter-spacing:.09em;text-transform:uppercase;
  color:#9aa39f;text-decoration:none;padding:11px 12px 9px;border-bottom:3px solid transparent;margin-bottom:-3px}
.appnav a:hover{color:var(--paper)}
.appnav a.aktiv,.appnav a[aria-current=page]{color:var(--accent);border-bottom-color:var(--accent)}
@media (max-width:700px){
  /* Utan wrap blev raden 441 px bred vid 200 % textstorlek på en 320 px skärm och
     Konto-knappen hamnade utanför vyn. #root klipper spillet (ingen sidledsrullning),
     så vägen till Profil, Inställningar och Logga ut försvann helt. Med wrap hoppar
     Konto ned på egen rad. min-width:0 på logotypen så att ett långt firmanamn
     inte kan låsa första raden i stället. */
  .apptopp .topprad{padding:9px 12px;gap:7px;flex-wrap:wrap}
  .apptopp .logo{min-width:0}
  .apptopp .topprad h1{margin-right:auto}
  .mobilmenyknapp{display:inline-flex;align-items:center;gap:7px;min-height:44px}
  .apptopp .konto>button{padding-left:9px;padding-right:9px}
  /* minmax(0,…), inte 1fr: en rutnätspost har min-width:auto och tvingar spåret
     att bli minst så brett som sitt längsta ord. Vid 200 % textstorlek blev
     kolumnerna 171+176 px i en 320 px vy och höger kolumn sköts utanför skärmen.
     overflow-wrap nedan behövs för att etiketten ska radbryta i stället för att
     klippas när spåret väl är låst. */
  .appnav{display:none;grid-template-columns:repeat(2,minmax(0,1fr));gap:0;padding:0;border-top:1px solid #303735;overflow:visible}
  .appnav.appnav-oppen{display:grid}
  .appnav a{min-height:52px;margin:0;padding:13px 16px;border-right:1px solid #303735;border-bottom:1px solid #303735!important;justify-content:flex-start;overflow-wrap:anywhere}
  .appnav a:nth-child(2n){border-right:0}
  .appnav a:nth-last-child(-n+2){border-bottom:0!important}
  .appnav a.aktiv,.appnav a[aria-current=page]{background:#22282a;box-shadow:inset 3px 0 var(--accent)}
}
/* Ljust sidhuvud under toppbaren: var-är-jag + väg tillbaka. */
.sidtitel{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;padding:14px 20px 11px;
  background:var(--surface);border-bottom:1px solid var(--line)}
.sidtitel h1{font-family:var(--sans);font-size:21px;font-weight:700;letter-spacing:.02em;text-transform:uppercase;margin:0}
.sidtitel .mark{color:var(--accent-deep)}
.sidtitel .sub{font-family:var(--mono);font-size:12px;letter-spacing:.09em;text-transform:uppercase;color:var(--ink-3)}
.sidtitel .tillbaka{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.06em;text-transform:uppercase;
  color:var(--ink-2);text-decoration:none;border:1px solid var(--line);border-radius:999px;padding:4px 11px;background:var(--surface);transition:border-color .12s,color .12s}
.sidtitel .tillbaka:hover{border-color:var(--accent-deep);color:var(--ink)}
.kalkyl-live{margin-left:auto;display:inline-flex;align-items:center;gap:7px;font-family:var(--mono);
  font-size:var(--tx-etikett);letter-spacing:.05em;text-transform:uppercase;color:var(--ink-3)}
.kalkyl-live i{width:7px;height:7px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 3px color-mix(in srgb,var(--ok) 14%,transparent)}
.kalkyl-live.raknar i{background:var(--accent-deep);animation:kalkylpuls .9s ease-in-out infinite alternate}
.kalkyl-live.misslyckad{color:var(--stop)}
.kalkyl-live.misslyckad i{background:var(--stop);box-shadow:none}
.kalkyl-fel{display:flex;align-items:center;justify-content:space-between;gap:16px;margin:12px 0;
  padding:14px 16px;border:1px solid var(--warn);border-left:4px solid var(--warn);background:#fff8e7;border-radius:var(--r-sm)}
.kalkyl-fel strong{font-size:14px}
.kalkyl-fel p{margin:4px 0 0;font-size:13px;line-height:1.5}
.kalkyl-fel button{flex:none;min-height:44px}
.resultat-dokument{margin:0;padding:0;border:0;min-inline-size:0}
.resultat-dokument:disabled{opacity:.6}
@media(max-width:600px){.kalkyl-fel{align-items:stretch;flex-direction:column;margin:10px 12px}.prisrad .lbl{max-width:52%}}
@media print{.resultat-dokument:disabled{display:none!important}}
@keyframes kalkylpuls{to{opacity:.35;transform:scale(.72)}}
/* Sökrutan i verktygslistan. 16px så iOS inte auto-zoomar. */
.soklada{margin:14px 0 4px}
/* min-height, inte bara padding: höjden blev 43 px på CI:s Linux (andra
   typsnittsmått) och föll på 44 px-regeln för tryckytor, medan samma fält var
   44 på Windows. Ett mått som inte beror på typsnittet håller överallt. */
.soklada input{width:100%;min-height:44px;font-family:inherit;font-size:16px;text-align:left;padding:11px 16px;
  border:1px solid var(--line);border-radius:999px;background:var(--surface);color:var(--ink);transition:border-color .12s,box-shadow .12s}
.soklada input:focus{outline:none;border-color:var(--accent-deep);box-shadow:var(--ring)}
.butik-sokrad{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:stretch}
.butik-sokrad .mini{min-width:76px}
.butik-tomt{margin:14px 0 18px}
.butik-omrade{color:var(--muted);font-size:10px;font-weight:700;letter-spacing:.09em;text-transform:uppercase}
.kundbank-tabellskroll{max-width:100%;overflow-x:auto;overscroll-behavior-inline:contain}
.kundbank-tabellskroll:focus-visible{outline:2px solid var(--accent-deep);outline-offset:2px}
.kundbank-tabellskroll table{min-width:620px}
.kundbank-tabellskroll.bred table{min-width:900px}
.tabell-sidhint{display:none;margin:5px 0 0;color:var(--muted);font-size:11px}
@media(max-width:700px){.tabell-sidhint{display:block}}
/* Formulärgrupperna ritas som fieldset/legend i appen, nollställ webbläsarens
   fieldset-låda och ge legend samma röst som .grp>summary i den statiska sviten. */
fieldset.grp{margin:0;padding:0;border:0;border-bottom:1px solid var(--line-2);min-inline-size:0}
fieldset.grp legend{padding:0;width:100%}
/* Rubriken är nu en knapp INUTI legend (i stället för ren text), dragspelet
   på mobil behöver ett klickbart mål, och en <button> i <legend> behåller
   fieldset/legend-semantiken för skärmläsare i stället för att byta till
   details/summary och tappa gruppkopplingen till fälten. Samma typografi som
   den gamla legend-texten hade (mono, versaler, brevlådefärg), desktop ska
   se likadant ut. */
.grp-toggle{all:unset;box-sizing:border-box;display:flex;align-items:center;gap:8px;width:100%;
  padding:12px 16px 2px;font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.11em;
  text-transform:uppercase;color:var(--ink-2);cursor:default}
.grp-sammanfattning{display:none;color:var(--ink-3);font-weight:400;text-transform:none;
  letter-spacing:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.grp-status{margin-left:auto;flex:none;padding:3px 7px;border:1px solid var(--line-2);border-radius:999px;
  color:var(--ink-3);background:#f7f8f4;font-size:10px;letter-spacing:.03em;text-transform:none}
.grp-pil{display:none;margin-left:auto;flex:none;font-size:var(--tx-etikett);color:var(--ink-3)}

/* Kalkylens gemensamma arbetsflöde. Samma komponent används av alla verktyg,
   därför bor ordning, status och nästa steg här i stället för i varje modul. */
.kalkylstart{padding:14px 16px 15px;background:#f5f6f2;border-bottom:1px solid var(--line)}
.kalkylstart-huvud{display:flex;align-items:flex-end;justify-content:space-between;gap:12px;margin-bottom:12px}
.kalkylstart-huvud div>span,.formular-intro>span,.resultat-nasta-text>span,.sakerhet-overrad{
  display:block;font-family:var(--mono);font-size:10px;letter-spacing:.11em;text-transform:uppercase;color:var(--accent-deep)}
.kalkylstart-huvud h2{margin:2px 0 0;font-size:16px;line-height:1.15}
.kalkylstart-huvud small{font-family:var(--mono);font-size:10px;color:var(--ink-3);white-space:nowrap}
.kalkylstart-toggle,.kalkylstart-sammanfattning{display:none}
.kalkylstart-val{display:grid;grid-template-columns:78px minmax(0,1fr);align-items:center;gap:10px;margin-top:8px}
.kalkylstart-etikett{font-size:12px;color:var(--ink-2)}
.kalkylstart .seg button{padding:8px 4px}
.kalkylstart-ort{margin:10px 0 0;padding-top:10px;border-top:1px solid var(--line-2)}
.kalkylstart-ort label{font-size:12px}
.kalkylstart-ort .hint{margin-top:2px}
.formular-intro{padding:15px 16px 8px}
.kalkylsok{position:relative;padding:8px 16px 12px;border-bottom:1px solid var(--line-2)}
.kalkylsok>label{display:block;margin-bottom:5px;font-size:12px;font-weight:600}
.kalkylsok-inmatning{display:flex;position:relative}
.kalkylsok-inmatning input{box-sizing:border-box;min-width:0;width:100%;min-height:44px;padding:10px 42px 10px 12px;
  text-align:left;font:inherit;font-size:16px;border:1px solid var(--falt-kant);border-radius:var(--r-sm);background:var(--surface)}
.kalkylsok-inmatning button{position:absolute;right:0;top:0;bottom:0;min-width:44px;border:0;background:transparent;font-size:22px}
.kalkylsok ul{list-style:none;padding:0;margin:8px 0 0;border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden}
.kalkylsok li+li{border-top:1px solid var(--line-2)}
.kalkylsok li button{display:flex;justify-content:space-between;align-items:center;gap:12px;width:100%;min-height:48px;
  padding:10px 12px;text-align:left;white-space:normal;border:0;border-radius:0;background:var(--surface)}
.kalkylsok li button:hover,.kalkylsok li button:focus-visible{background:#fff5cc}
.kalkylsok li strong{font-size:13px;line-height:1.3}
.kalkylsok li small{display:block;margin-top:3px;font-size:12px;line-height:1.4;color:var(--ink-3)}
.kalkylsok-status{margin:8px 0 0;font-size:12px;line-height:1.4;color:var(--ink-2)}
.grp-toggle:focus-visible{outline:2px solid var(--accent-deep);outline-offset:-3px;border-radius:var(--r-sm)}
.formular-intro p{margin:3px 0 0;font-size:12px;line-height:1.4;color:var(--ink-3)}
.formular-kvitto{margin-top:10px;padding:10px 11px;border:1px solid var(--line-2);border-radius:var(--r-sm);background:#f7f8f4}
.formular-kvitto-rad{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:11px}
.formular-kvitto-rad strong{font-size:12px;color:var(--ink)}
.formular-kvitto-rad span{color:var(--ink-3);white-space:nowrap}
.formular-kvitto-progress{height:4px;margin-top:7px;overflow:hidden;border-radius:999px;background:var(--line-2)}
.formular-kvitto-progress i{display:block;height:100%;min-width:2px;border-radius:inherit;background:var(--accent-deep)}
.formular-kvitto small{display:block;margin-top:6px;color:var(--ink-3);font-size:10px;line-height:1.35}
.visa-avancerat{display:grid;grid-template-columns:1fr auto;gap:2px 10px;width:calc(100% - 32px);margin:14px 16px;
  padding:11px 12px;text-align:left;border:1px solid var(--line);border-radius:var(--r-sm);background:#f7f8f4;
  color:var(--ink-2);cursor:pointer;font-family:var(--mono);font-size:11px}
.visa-avancerat span{grid-column:1/-1;font-family:var(--sans);font-size:12px;font-weight:700;color:var(--ink)}
.visa-avancerat b{grid-row:2;grid-column:2;color:var(--accent-deep);font-size:16px;line-height:1}
.visa-avancerat:hover{border-color:var(--accent-deep);background:var(--surface)}

.resultat-nasta{display:grid;grid-template-columns:minmax(210px,1fr) auto;align-items:center;gap:14px;
  margin:-3px 0 14px;padding:12px 14px;border:1px solid var(--line);border-left:4px solid var(--accent-deep);
  border-radius:var(--r);background:var(--surface);box-shadow:var(--skugga-1)}
.resultat-nasta-text strong{display:block;margin-top:2px;font-size:14px}
.resultat-nasta-text small{display:block;margin-top:2px;color:var(--ink-3);font-size:11px}
.resultat-nasta-knappar{display:flex;gap:7px;flex-wrap:wrap;justify-content:flex-end}
.resultat-nasta button,.resultat-nasta .projekt-lank{border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface);color:var(--ink-2);
  padding:9px 12px;cursor:pointer;font-family:var(--mono);font-size:10px;letter-spacing:.05em;text-transform:uppercase;text-decoration:none}
.resultat-nasta button:hover,.resultat-nasta .projekt-lank:hover{border-color:var(--ink-3);color:var(--ink)}
.resultat-nasta .projekt-lank{display:inline-flex;align-items:center;justify-content:center}
.resultat-nasta button.primar{background:var(--ink);border-color:var(--ink);color:var(--accent)}
.resultat-nasta button.primar b{margin-left:5px;font-size:14px}

.sakerhet-kort>h2{display:flex;justify-content:space-between;gap:14px}
.sakerhet-kort>h2 span{font-size:9px;letter-spacing:.04em;text-transform:none;color:var(--ink-3)}
.sakerhet-grid{display:grid;grid-template-columns:minmax(220px,.8fr) minmax(280px,1.2fr);gap:16px;padding:12px 14px!important}
.sakerhet-sammanfattning{padding-right:16px;border-right:1px solid var(--line-2)}
.sakerhet-niva{margin-top:3px;font-size:20px;font-weight:700;color:var(--sakerhet-ton)}
.sakerhet-spann{margin-top:3px;font-size:12px;font-variant-numeric:tabular-nums;color:var(--ink-2)}
.sakerhet-kvitto{margin-top:10px}
.sakerhet-progress{height:4px;overflow:hidden;border-radius:999px;background:var(--line-2)}
.sakerhet-progress i{display:block;height:100%;min-width:2px;background:var(--sakerhet-ton);border-radius:inherit}
.sakerhet-kvitto p{margin:6px 0 0;font-size:12px;line-height:1.4}
.sakerhet-atgarder{display:flex;gap:5px;flex-wrap:wrap;margin-bottom:8px}
.sakerhet-atgarder .sakerhet-overrad{width:100%}
.sakerhet-atgarder .hint{display:inline-block;padding:3px 7px;border-radius:999px;background:#f5f6f2;border:1px solid var(--line-2)}
.sakerhet-atgard{appearance:none;border:1px solid var(--line-2);border-radius:999px;background:#f5f6f2;color:var(--ink-2);padding:3px 8px;font:inherit;font-size:inherit;cursor:pointer}
.sakerhet-atgard:hover,.sakerhet-atgard:focus-visible{border-color:var(--sakerhet-ton);color:var(--ink);background:#fff}
@media(max-width:960px){.sakerhet-atgard{min-height:44px;padding:9px 12px}}
.sakerhet-atgard b{color:var(--sakerhet-ton);margin-left:3px}
.sakerhet-rad{font-size:12px;line-height:1.4}
.sakerhet-priser table{margin-top:8px}
.sakerhet-priser .hint{margin-top:5px}
@media (max-width:1100px){
  .sakerhet-grid{grid-template-columns:1fr}
  .sakerhet-sammanfattning{padding-right:0;padding-bottom:12px;border-right:0;border-bottom:1px solid var(--line-2)}
}
/* En stop-rad ska inte gå att missa: bredare kant, tonad botten, fet tagg. */
.note.stop{border-left-width:5px;background:#fdf2f0}
.note.stop .tag{font-weight:700}
/* Prisrad på mobil, fast nere, slutpriset alltid inom synhåll medan man fyller i. */
.prisrad{display:none}
@media (max-width:960px){
  .kalkylstart{padding:10px 16px 12px}
  .kalkylstart-huvud{align-items:center;margin-bottom:4px}
  .kalkylstart-huvud small{display:none}
  .kalkylstart-toggle{display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:8px 12px;
    font-size:12px;flex:none;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm)}
  .kalkylstart-sammanfattning{display:flex;flex-wrap:wrap;gap:4px 12px;margin:0;font-size:12px;color:var(--ink-2)}
  .kalkylstart-sammanfattning span+span{border-left:1px solid var(--line);padding-left:12px}
  .kalkylstart:not(.oppen) .kalkylstart-innehall{display:none}
  .kalkylstart.oppen .kalkylstart-innehall{padding-top:8px}
  .prisrad{position:fixed;left:0;right:0;bottom:0;z-index:25;display:flex;align-items:center;
    justify-content:space-between;gap:14px;width:100%;border:0;border-top:3px solid var(--accent);
    background:var(--ink);color:var(--paper);cursor:pointer;text-align:left;
    border-radius:14px 14px 0 0;box-shadow:0 -6px 22px rgba(20,24,26,.22);
    padding:10px 16px calc(10px + env(safe-area-inset-bottom))}
  .prisrad .lbl{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.1em;text-transform:uppercase;color:#8f9894}
  .prisrad b{font-family:var(--sans);font-size:22px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--accent)}
  /* På Offert/Faktura visar dokumentet sitt eget pris, samma resonemang som
     static-regeln för .total ovan. */
  html:has(#v-offert:not([hidden])) .prisrad,
  html:has(#v-faktura:not([hidden])) .prisrad{display:none}
  /* Prisraden är position:fixed och LIGGER ÖVER sidans sista rader. Utan
     frizon längst ned hamnar resultatflikarna och guidraden under den,
     uppmätt 2026-08-17: ett klick på Offert-fliken gick rakt in i prisraden
     ("intercepts pointer events") och kunden kom aldrig vidare. Frizonen är
     radens höjd (~64 px) + telefonens egen bottenmarginal. */
  .pane-out,.pane-in{padding-bottom:calc(84px + env(safe-area-inset-bottom))}
}
@media print{.apptopp,.appnav,.kontomeny,.sidtitel,.prisrad,.soklada{display:none!important}}

/* ---------- mobil informationsarkitektur (verktygssidan) ----------
   Allt i det här blocket gäller BARA under 960 px, samma brytpunkt som redan
   staplar .shell till en kolumn. Ovanför den ska sidan se ut och bete sig
   precis som innan: alla fältgrupper öppna, formulär och resultat sida vid
   sida, ingen växlare synlig. */
.mobil-vyval{display:none}
/* .krymp: en textrad som BLIR kortare på mobil (se @media nedan). På desktop
   är den bara sin vanliga <summary> utan skärmläsarens standardpil, allt
   innehåll ligger redan inuti <summary> (details har inga andra barn), så
   `open` styr inget annat än om raden är klippt eller inte. */
details.krymp{margin:0}
details.krymp>summary{list-style:none;cursor:default;display:block}
details.krymp>summary::-webkit-details-marker{display:none}
@media (max-width:960px){
  /* Fältgrupperna som dragspel, en öppen i taget (Formular.jsx). Rubriken
     blir klickbar och rymmer en kort sammanfattning av gruppens värden när
     den är stängd. */
  .grp-toggle{cursor:pointer;padding:14px 16px;min-height:44px}
  .grp-toggle:active{background:#f5f6f2}
  .grp-status{margin-left:0}
  .grp-pil{display:inline-block}
  .grp:not(.oppen) .grp-sammanfattning{display:inline}
  .grp .body{display:none}
  .grp.oppen .body{display:block}

  /* Formulär/Resultat, segmenterad växling i stället för en enda lång rulle.
     .dold-mobil sätts av Verktyg.jsx på den panel som INTE är vald just nu;
     .mobil-vyval är själva växlaren och syns bara här. */
  .dold-mobil{display:none}
  .mobil-vyval{display:flex;margin:10px 12px}
  .mobil-vyval button{padding:8px 6px;text-transform:none;letter-spacing:0;flex-direction:column;align-items:center;justify-content:center}
  .mobil-vyval button span{display:block;font-family:var(--sans);font-size:13px;font-weight:700}
  .mobil-vyval button small{display:block;margin-top:1px;font-family:var(--mono);font-size:12px;color:var(--ink-3)}
  .mobil-vyval button[aria-pressed=true] small{color:#c8cfcb}
  .kalkyl-live{width:100%;margin-left:0}
  .kalkylstart-huvud div>span,.formular-intro>span,.resultat-nasta-text>span,.sakerhet-overrad,
  .kalkylstart-huvud small,.grp-status{font-size:12px}
  .visa-avancerat{font-size:12px}
  .visa-avancerat span{font-size:13px}
  .formular-kvitto-rad{align-items:flex-start;flex-direction:column;gap:2px;font-size:12px}
  .formular-kvitto-rad strong{font-size:13px}
  .formular-kvitto small{font-size:12px}
  .resultat-nasta{grid-template-columns:1fr;align-items:start}
  .resultat-nasta-text small,.resultat-nasta button,.resultat-nasta .projekt-lank{font-size:12px}
  .resultat-nasta-knappar{justify-content:stretch}
  .resultat-nasta button,.resultat-nasta .projekt-lank{flex:1;min-height:42px}
  .sakerhet-kort>h2 span{display:none}

  /* "Visa mer"-textblock: branschriktvärden, kontrollstatusens motivering,
     de mindre kontrollnoterna (info/ok. ALDRIG stop/warn, se Resultat.jsx)
     och verktygets fältips (Krymp.jsx). Klampen ligger på .krymp-text. INTE
     på <summary> själv, för line-clamp+overflow:hidden klipper bort ALLT som
     inte får plats, ett ::after på summary hade försvunnit med resten. Visa
     mer/mindre-lappen är ett eget syskon (.krymp-vxl) och klipps därför aldrig. */
  details.krymp>summary{cursor:pointer}
  details.krymp:not([open]) .krymp-text{
    display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden}
  .krymp-vxl{display:block;white-space:nowrap;color:var(--accent-deep);font-weight:600}
  details.krymp:not([open]) .krymp-vxl::after{content:"Visa mer ▾"}
  details.krymp[open] .krymp-vxl::after{content:"Visa mindre ▴"}

  /* Butiken: ~150 kort i en enda kolumn är den värsta höjden i hela sviten
     (46 000+ px uppmätt). Samma "visa mer"-princip som fältgrupperna: de
     första korten räcker för att bedöma sortimentet, resten är ett tryck bort.
     Sökrutan filtrerar ändå ner listan direkt om man vet vad man letar efter. */
  .hubgrid:not(.visa-alla)>*:nth-child(n+13){display:none}
  .visa-fler-mobil{display:flex;width:100%;justify-content:center;margin:4px 20px 16px;min-height:44px}
}
.visa-fler-mobil{display:none}

/* ---------- prisform-badge: avtalets viktigaste ord, i färg ----------
   fast = grön (bindande) · ca = gul (takregel) · lopande = blå (beräknad kostnad).
   I prisrutan (mörk botten) fylld chip; i offertdokumentet (.dok) samma färger
   men tryckvänlig, den ska bära även i svartvit utskrift via texten. */
.prisform{display:inline-block;font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.12em;
  text-transform:uppercase;font-weight:700;padding:4px 10px;border-radius:999px;margin-bottom:6px}
.prisform.fast{background:var(--ok);color:#fff}
.prisform.ca{background:var(--accent);color:var(--ink)}
.prisform.lopande{background:#3d6580;color:#fff}
.prisform.dok{margin:7px 0 0;font-size:var(--tx-etikett)}
@media print{.prisform.dok{-webkit-print-color-adjust:exact;print-color-adjust:exact}}
/* ---------- precisionsklass i sortimentet: Detaljkalkyl / Överslag ----------
   Oscopad med flit: samma badge används i verktygslistan, i butiken och i
   Mina verktyg-tabellen. Två kopior hade hunnit glida isär. */
.klass{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.1em;text-transform:uppercase;
  display:inline-block;margin:0 8px 5px 0;padding:2px 9px;border-radius:999px}
.klass.detalj{background:var(--ink);color:var(--accent)}
.klass.overslag{border:1px solid var(--line);color:var(--ink-3);background:transparent}
/* .tagg fanns bara inuti .hubkort, butiken och kassan använder den också. */
.tagg{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.1em;text-transform:uppercase;
  color:var(--accent-deep);display:inline-block;margin-top:9px}

/* ---------- butik, kassa och Mina verktyg: prisspråket ----------
   Inga nya beroenden och inga webbtypsnitt, samma tokens (--r/--r-sm,
   --skugga-1) och samma monofont som resten av sviten. */
.butikstyr{margin:14px 0 0;max-width:420px}
.intervallval{width:auto}
.butikkort .pad{display:flex;flex-direction:column;gap:2px}
.butikkort b{font-family:var(--sans);font-size:16px;text-transform:uppercase;letter-spacing:.02em}
.saljtext{margin:2px 0 6px;font-size:12.5px;color:var(--ink-2);line-height:1.45}
/* Ett belopp är en rad, inte en mening: siffran fet, "exkl moms" diskret intill,
   och kampanjnamnet under. Ordinarie pris står kvar överstruket, aldrig omskrivet. */
.belopp{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px}
/* text-transform:none: .butikkort b versaliserar titeln, och ett belopp ska inte
   följa med i det, "199 KR/MÅN" är skrik, och innerText() ärver omvandlingen. */
.belopp b{font-family:var(--sans);font-size:18px;font-variant-numeric:tabular-nums;text-transform:none}
.belopp s{color:var(--ink-3);font-size:12.5px;font-variant-numeric:tabular-nums}
.exkl{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.06em;text-transform:uppercase;color:var(--ink-3)}
.kampanj{flex:1 1 100%;font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.06em;
  text-transform:uppercase;color:var(--accent-deep)}
.prisrad-kort{justify-content:space-between;flex-wrap:wrap}
.tillaggsrad{justify-content:space-between;flex-wrap:wrap;gap:8px;
  border-top:1px dashed var(--line-2);margin-top:10px;padding-top:10px}
.tillaggstext{font-size:12.5px;color:var(--ink-2);line-height:1.4}
/* Kassan: en sida, ett beslut. */
.kassa .card{max-width:560px}
.kassatitel{font-family:var(--sans);font-size:20px;text-transform:uppercase;letter-spacing:.02em;display:block}
.tillagg{border:1px solid var(--line-2);border-radius:var(--r-sm);background:#fbfcfa;padding:11px 13px;margin:10px 0}
.tillaggsval{display:flex;align-items:flex-start;gap:9px;cursor:pointer}
.tillaggsval input{margin-top:3px;flex:none}
.varden{margin:8px 0 0;padding-left:18px;font-size:12.5px;color:var(--ink-2);line-height:1.5}
.kassatotal{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;margin:12px 0 4px;
  border-top:1px solid var(--line);padding-top:11px}
.kassatotal>span:first-child{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.11em;
  text-transform:uppercase;color:var(--ink-2)}
.kassatotal b{font-family:var(--sans);font-size:24px;font-variant-numeric:tabular-nums}
/* Erbjudanderaden under ett kort i verktygslistan. Hylsan finns för att knappen
   ska ligga UTANFÖR kortlänken; visuellt är de ett kort. */
.hubkort-hylsa{display:flex;flex-direction:column}
.hubkort-hylsa>.hubkort{flex:1;border-bottom-left-radius:0;border-bottom-right-radius:0;box-shadow:none}
.hubkort-hylsa>.hubkort:hover{transform:none;box-shadow:none}
.kortfot{display:flex;align-items:center;justify-content:space-between;gap:9px;flex-wrap:wrap;
  background:#fbfcfa;border:1px solid var(--line-2);border-top:0;
  border-radius:0 0 var(--r) var(--r);box-shadow:var(--skugga-1);padding:9px 14px}
.kortfot .mini{text-decoration:none;flex:none}
/* Mina verktyg: en kvittotabell, siffrorna i sifferkolumn, summan tyngst. */
.mv-tabell{background:var(--surface);border:1px solid var(--line-2);border-radius:var(--r);
  box-shadow:var(--skugga-1);overflow:hidden;margin-top:18px}
.mv-tabell th,.mv-tabell td{padding:9px 14px;border-bottom:1px solid var(--line-2);text-align:left}
.mv-tabell thead th{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.11em;
  text-transform:uppercase;color:var(--ink-2);font-weight:400}
.mv-tabell .hoger{text-align:right;font-variant-numeric:tabular-nums}
.mv-tabell .klass{margin:0}
.mv-tabell .kampanj{display:block}
.mv-tabell tfoot th,.mv-tabell tfoot td{border-bottom:0;background:#fbfcfa}
.mv-tabell tfoot b{font-family:var(--sans);font-size:17px}
.arsrad{margin:12px 0 4px;font-size:13.5px;color:var(--ink-2)}
.arsrad b{color:var(--ink);font-variant-numeric:tabular-nums}

/* Arbetsguider. Länken i en kontrollrad ska HJÄLPA, inte skrika: samma
   textstorlek som noten, understruken bara vid hovring, ingen egen färgklick
   som konkurrerar med stop-/warn-färgen till vänster. Guidraden under noterna
   är ännu tystare, en etikett i versaler och länkarna på rad. */
.notguide{color:var(--accent-deep);text-decoration:none;white-space:nowrap}
.notguide:hover,.notguide:focus-visible{text-decoration:underline}
.guidrad{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 12px;
  margin:10px 0 0;padding-top:9px;border-top:1px solid var(--line-2);font-size:12.5px}
.guidrad .lbl{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.06em;
  text-transform:uppercase;color:var(--ink-3)}
.guidrad a{color:var(--accent-deep);text-decoration:none}
.guidrad a:hover,.guidrad a:focus-visible{text-decoration:underline}

/* Den som bett systemet om mindre rörelse ska slippa mikroanimationerna,
   allt fungerar identiskt utan dem. */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{transition:none!important;animation:none!important}
  html{scroll-behavior:auto}
  .btn:hover,.hubkort:hover{transform:none}
}

/* ---- Platsbesöket ----
   Sidan används STÅENDE i en hall, i motljus, med handskar på. Det styr allt här:
   inget träffbart under 44 px, ± -knappar så man slipper pricka en sifferrad på en
   telefon, och ifyllt/avbockat markeras med både färg OCH ram, en grön nyans räcker
   inte för den som har solen i skärmen eller är rödgrönblind. */
.pb-val{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:10px;margin-top:12px}
.pb-val button{min-height:56px;padding:14px 12px;text-align:left;line-height:1.3;
  font-size:13px;letter-spacing:.04em;display:flex;flex-direction:column;gap:4px;align-items:flex-start}
.pb-val .tagg{margin:0}
.pb-val small{color:var(--muted);font-size:10px;letter-spacing:.04em;text-transform:uppercase}
.pb-tomt{margin-top:12px}

.pb-matt{display:grid;gap:10px}
.pb-rad{display:grid;grid-template-columns:1fr auto;gap:10px;align-items:center;
  padding:10px 12px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface)}
.pb-rad.ifylld{border-color:var(--ok);border-left-width:4px;background:#f4faf6}
.pb-rad label{font-size:15px;line-height:1.3;color:var(--ink)}
.pb-rad .sub{display:block;font-size:12.5px;color:var(--ink-3);margin-top:3px;line-height:1.35}
.pb-tal{display:flex;align-items:stretch;gap:6px}
.pb-tal button{width:46px;min-height:46px;font-size:22px;line-height:1;cursor:pointer;
  border:1px solid var(--line);background:var(--surface);border-radius:var(--r-sm);color:var(--ink)}
.pb-tal button:active{background:var(--ink);color:var(--accent)}
.pb-tal input{width:88px;min-height:46px;padding:10px;font-size:17px;text-align:right;
  border:1px solid var(--line);border-radius:var(--r-sm);font-variant-numeric:tabular-nums}

/* Mätråd som inte hör till något fält, de fanns i datan men syntes aldrig i gamla sidan. */
.pb-rad-fri{padding:9px 0;border-bottom:1px solid var(--line-2)}
.pb-rad-fri:last-child{border-bottom:0}
.pb-rad-fri b{display:block;font-size:15px}
.pb-rad-fri span{display:block;font-size:13px;color:var(--ink-2);margin-top:2px;line-height:1.4}

.pb-bock{display:flex;gap:12px;align-items:flex-start;min-height:44px;padding:11px 12px;
  border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface);
  margin-bottom:7px;cursor:pointer}
.pb-bock input{width:26px;height:26px;flex:0 0 auto;margin:0}
.pb-bock.klar{background:#f4faf6;border-color:var(--ok)}
.pb-bock b{display:block;font-size:15px;line-height:1.3}
.pb-bock span span{display:block;font-size:13px;color:var(--ink-2);margin-top:3px;line-height:1.4}

.pb-fara{border-left:4px solid var(--stop);padding:9px 12px;margin-bottom:8px;
  background:#fdf6f3;border-radius:0 var(--r-sm) var(--r-sm) 0}
.pb-fara b{display:block;font-size:14.5px}
.pb-fara .f{font-size:13px;color:var(--ink-2);margin-top:3px;line-height:1.4}
.pb-fara .g{font-size:13px;color:var(--ok);margin-top:4px;line-height:1.4}

/* Knapparna klistrar i underkant: mätlistan är lång och "Öppna kalkylen" ska aldrig
   kräva att man scrollar hela vägen ner med en hand upptagen av en tumstock. */
.pb-knappar{position:sticky;bottom:0;z-index:5;display:flex;gap:8px;flex-wrap:wrap;
  padding:12px 0 14px;background:var(--paper);border-top:1px solid var(--line)}
.pb-knappar .btn{flex:1 1 170px;min-height:52px}
#pb-notis{width:100%;font-family:inherit;font-size:16px;padding:11px;
  border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface)}
/* Tillbaka-knappen i sidtiteln är en <button>, inte en <a>, nollar webbläsarförvalet. */
.sidtitel button.tillbaka{background:none;cursor:pointer}
@media (max-width:520px){
  .pb-rad{grid-template-columns:1fr}
  .pb-tal input{flex:1;width:auto}
}

/* ---- Arbetsguiderna som appsidor (sidor/guider/Guide.jsx) ------------------
   Guidernas HTML kommer ORÖRD från rotens guide-<id>.html, samma fil som den
   fristående versionen byggs ur. Den bygger på .card/.pad/table/.mini/.hint, som
   redan finns här ovan, och på en spaltbredd som källfilen bär i <main style="…">
   (enspaltig 960 px, tvåspaltig 1100 px). Det .wrap gjorde i rotens stilmall gör
   .guidsida här: en grid som tar emot just den inline-stilen.

   Läsbart med handskar på armlängds avstånd: brödtexten i en guide är 15 px och
   1,6 i radavstånd, inte kalkylens 13 px, en guide LÄSES, en tabell avläses. */
.guidsida{display:grid;gap:14px;margin:0 auto;padding:14px 20px 40px;width:100%}
.guidsida>.card{min-width:0}            /* utan detta växer ett brett kort ut griden */
.guidsida .pad{overflow-x:auto}         /* breda tabeller rullar I kortet, aldrig sidan */
.guidsida .pad>p{font-size:15px;line-height:1.6;margin:0 0 10px}
.guidsida .pad>p:last-child{margin-bottom:0}
.guidsida svg{max-width:100%;height:auto}
.guidsida .mini{min-height:34px}
/* Avsnittsmenyn = djuplänkarna. Rullar i sidled på en smal skärm i stället för att
   bygga en fem rader hög menyvägg ovanför guiden. */
.guidmeny{display:flex;gap:8px;overflow-x:auto;max-width:1100px;margin:0 auto;
  padding:10px 20px 0;scrollbar-width:thin}
.guidmeny a{flex:none;font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.08em;
  text-transform:uppercase;color:var(--ink-2);text-decoration:none;white-space:nowrap;
  border:1px solid var(--line-2);border-radius:var(--r-sm);padding:7px 11px;background:var(--surface)}
.guidmeny a:hover{border-color:var(--accent-deep);color:var(--ink)}
/* Vägen till kontot sist i guiden, bara för den som inte är inloggad (Guide.jsx).
   Samma spaltbredd och sidopadding som .guidsida så kortet läses som guidens
   sista kort, inte som en banderoll. Skärm bara: på pappret i bilen är en
   köpknapp skräp. */
.guidkonto{margin:0 auto;padding:0 20px 40px;width:100%}
.guidkonto .pad>p{font-size:15px;line-height:1.6;margin:0 0 12px}
.guidkonto .btnrow{margin:0}
.guidkonto .btn{text-decoration:none;display:inline-block}
/* Surfplatta i fält: en tvåspaltig guide (packlistan, fälttipsen) blir enspaltig i
   stället för två halva spalter man måste zooma i. !important för att slå
   grid-template-columns som kommer inline ur källfilen. */
@media (max-width:900px){
  .guidsida{grid-template-columns:1fr!important;padding:12px 14px 34px}
  .guidsida>.card{grid-column:auto!important}
  .guidmeny{padding:10px 14px 0}
}
/* Papper: guiderna används utskrivna i bilen. Appramen och avsnittsmenyn är
   skärmnavigering och ska bort, men rubriken ska MED, annars är sex utskrivna
   guider sex likadana blad. .sidtitel döljs i utskrift längre upp; .guidtitel har
   två klasser och vinner därför på specificitet. */
@media print{
  .guidmeny,.guidkonto{display:none!important}
  .sidtitel.guidtitel{display:flex!important;border:none;padding:0 0 10px}
  .sidtitel.guidtitel .tillbaka{display:none!important}
  .guidsida{padding:0;display:block;max-width:none!important}
  .guidsida .pad{overflow:visible}
}
/* BARA BLÅKOPIAN PÅ PAPPRET, ritverktygsguidens knapp "Skriv ut blåkopian".

   Knappen bor i guidens källfil (guide-ritverktyg.html): den sätter klassen
   .skriv-blakopia på <html>, anropar print() och tar bort klassen på afterprint.
   Skriptet följer med hit, men REGLERNA som svarar på klassen gjorde det inte:
   de står i källfilens egen <style>, och tolk.js plockar ut <main>, inte stilen.
   I appen skrev knappen därför ut hela guiden, skärmdumparna, alla ritningstyper,
   hela formuläret och materialtabellen, i stället för det ena bladet man ville ha
   med till bygget. Den fristående filen bär sin stil själv och var aldrig trasig.

   Källfilens regler går INTE att kopiera hit. De pekar på den fristående filens
   DOM: body>*:not(.wrap), .wrap>*:not(#blakopiakort) och .mast. Här ligger kortet
   i .guidsida inne i appramen, och varken .wrap eller .mast finns. Därför
   visibility och inte en display-kedja mot namngivna föräldrar: visibility bryr
   sig inte om föräldrakedjan alls och överlever nästa gång appramen ritas om.

   Reglerna är verkningslösa på alla andra sidor: klassen sätts bara av den här
   guidens knapp, och #blakopiakort finns bara i den här guidens kort. */
@media print{
  html.skriv-blakopia body *{visibility:hidden}
  html.skriv-blakopia #blakopiakort,html.skriv-blakopia #blakopiakort *{visibility:visible}
  /* Knapparna är skärm, aldrig papper. */
  html.skriv-blakopia #blakopiakort .mini{display:none!important}
  /* Gömt innehåll TAR fortfarande PLATS. Guiden är närmare 3 000 px hög, så utan
     de här raderna kom ritningen på blad ett och tre blanka blad efter den, mätt
     som ark i en riktig utskrift.

     Kortet lyfts ur flödet till arkets övre vänstra hörn. absolute, inte fixed:
     fixed upprepas per ark i Chrome (se .sidfot längre upp). Resten av flödet
     nollas på body:s BARN och inte på body själv, en overflow på body ärvs av
     vyporten i stället för att klippa (CSS-reglen om overflow-propagering), och
     då står de tomma arken kvar. Kortet klipps inte med: utan positionerad
     förälder hänger en absolut ruta i sidan, utanför varje förälders klippruta. */
  html.skriv-blakopia body>*{height:0;overflow:hidden}
  html.skriv-blakopia #blakopiakort{position:absolute;top:0;left:0;width:100%;
    margin:0;border:0;box-shadow:none;break-inside:avoid}
  html.skriv-blakopia #blakopiakort svg{width:100%;height:auto;max-height:none}
  /* Ritningen ska läsas, inte dekorera: färgerna kvar, annars blir en blå
     blåkopia ett grått fält. */
  html.skriv-blakopia #blakopiakort,html.skriv-blakopia #blakopiakort *{
    -webkit-print-color-adjust:exact;print-color-adjust:exact}
}

/* ---------- offertversioner och ÄTA ----------
   Versionslistan och ÄTA-korten är ARBETSYTA, inte dokument: de ligger i .card som
   allt annat till vänster om offerten och bär .noprint i komponenterna. Bara
   kontraktsvärdets kedja följer med i utskrift, det är den siffra man visar kunden.

   Färgerna kommer ur samma tokens som noterna (--ok/--warn/--stop) i stället för nya
   hexvärden, så att en statusrad ser likadan ut som varje annan status i sviten. */
.versioner{width:100%}
.versioner td,.versioner th{vertical-align:top}
.versioner tr.accepterad td{background:#f2f8f2}
.versioner tr.accepterad .mrk{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.06em;
  color:#2c6b34;text-transform:none}
.versiondetalj{border:1px solid var(--line);border-radius:var(--r-sm);padding:2px 12px 10px;
  margin:10px 0;background:#fbfcfa}
.versiondetalj h4{margin:12px 0 4px}
.versiondetalj table{width:100%}

/* ÄTA-kortets vänsterkant bär statusen, en godkänd rad ska gå att hitta med ögat i
   en lista på tio, utan att läsa varje etikett. */
.radkort.ata{border-left-width:3px}
.radkort.ata.godkand{border-left-color:#3d8a48}
.radkort.ata.avvisad{border-left-color:#a3231a}
.radkort.ata.skickad{border-left-color:#b8860b}
.radkort.ny{background:var(--surface);border-style:dashed}
.atastatus{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.08em;text-transform:uppercase;
  color:var(--ink-3)}
.atastatus.godkand{color:#2c6b34}
.atastatus.avvisad{color:#a3231a}
.atastatus.skickad{color:#8a6400}

/* Kedjan: offert + godkända ÄTA = kontraktsvärde. Samma sluttyngd som offertens
   "Att betala" (.offert tr.slut), det är samma sorts siffra. */
.kedja{width:100%}
.kedja tr.slut td{border-top:2px solid var(--ink);padding-top:11px;font-size:17px;font-weight:600}
.kedja tr.slut td:first-child{font-family:var(--mono);font-size:var(--tx-etikett);font-weight:400;
  letter-spacing:.12em;text-transform:uppercase}

/* ---------- arbetsordern (internt underlag). Arbetsorder.jsx ----------
   Dokumentet ärver .offert helt och hållet: samma brev, samma tabeller, samma
   utskriftsregler. Bara tre saker skiljer, och de finns bara här.

   Stämpeln skrivs UT. Arbetsordern innehåller inga priser, men den innehåller vår
   kalkylerade tid, och den som råkar lämna pappret hos kunden ska åtminstone ha
   lämnat något som säger vad det är. print-color-adjust ärvs från .offert-regeln. */
.ao-stampel{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.08em;text-transform:uppercase;
  color:var(--stop);border:1px solid var(--stop);border-radius:var(--r-sm);
  padding:6px 10px;margin:0 0 18px;display:block}
/* Momenten på en dag radbryter hellre än pressar ihop kolumnen på en telefon. */
.ao-dag{display:inline-block;margin:0 14px 2px 0}
.ao-kontroll{list-style:none;padding-left:0}
.ao-kontroll label{display:flex;gap:8px;align-items:baseline;cursor:pointer}
.ao-kontroll input{width:auto;flex:none}
/* Arbetsordern läses lika ofta på en telefon i regnet som på papper: momenten under en
   dag får egen rad, och kryssrutan samma 40 px träffyta som .check redan har. */
@media (max-width:840px){
  .ao-dag{display:block;margin-right:0}
  .ao-kontroll label{min-height:40px}
}
@media print{
  /* Kryssrutorna ska gå att bocka av med penna, samma behandling som utrustnings-
     listan redan får (.utr input ovan). */
  .ao input{-webkit-appearance:none;appearance:none;border:1.5px solid #555;border-radius:3px;
    width:11pt;height:11pt}
  .ao-stampel{font-size:8pt;padding:4pt 6pt;margin-bottom:10pt}
}

/* ---- Formular.jsx: bool-hint och autostyrda fält ----
   Hint inuti kryssrutans label ger tvåradiga labels; :has flyttar upp rutan till
   första raden i stället för mitt emellan. Utan :has-stöd blir den centrerad,
   dagens utseende, inget går sönder. */
.check:has(.hint){align-items:flex-start}
.check:has(.hint) input{margin-top:2px}
/* Förklaringsraden för ett fält som räknas automatiskt (AutoRad). Samma röst
   som en label plus dämpad hint, en radersättning, inte en varning. */
.autolast{flex:1;font-size:13px;color:var(--ink-3)}

/* ---- Ritning.jsx: 3D-verktygsraden (Verktygsrad3D) ----
   Touch-först: motorns .mini är 10px-uppercase och liten, knapparna i 3D-raden
   får tumstorlek (44 px, WCAG-målytan) på ALLA skärmar, inte bara i mobilbrytpunkten,
   för raden används stående vid kund. Raden ligger i dokumentflödet OVANFÖR
   canvasen och kan därför aldrig täcka scenen. */
.egf3dRad .btnrow{margin-bottom:6px}
.egf3dRad .mini{min-width:44px;min-height:44px}
.egf3dRad .egf3dSol,.egf3dRad .egf3dPalett{align-items:center;gap:8px;flex-wrap:wrap}
.egf3dRad .egf3dSol label{display:flex;align-items:center;gap:6px}
.egf3dRad .egf3dSol input[type=range]{width:150px;min-height:44px}
.egf3dRad .egf3dSol b{min-width:44px}
.egf3dRad .egf3dPalett .hint,.egf3dRad .egf3dSol .hint{margin:0}
.egf3dRad .egf3dPalett>.hint{flex-basis:100%}
.egf3dRad .egf3dHjalp{margin:0 0 8px}
.egf3dWorkspace.aktiv{position:relative;display:flex;flex-direction:column;min-height:520px;margin:4px 0 12px;
  overflow:hidden;border:1px solid #aeb7b1;border-radius:10px;background:#dce2df;box-shadow:var(--skugga-2)}
.egf3dWorkspace.helskarm{position:fixed;inset:14px;z-index:90;height:auto;min-height:0;margin:0;border-radius:12px}
.egf3dRad{position:relative;z-index:4;flex:none;background:#f7f8f4;border-bottom:1px solid var(--line)}
.egf3dPrimar{display:flex;align-items:center;gap:6px;padding:8px;margin:0}
.egf3dPrimar .mini{white-space:nowrap}
.egf3dPrimar .mini:last-child{margin-left:auto}
.egf3dByggsteg{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 10px;
  border-top:1px solid var(--line-2);background:#eef1eb}
.egf3dByggsteg>div:first-child{display:grid;grid-template-columns:auto 1fr;align-items:baseline;gap:1px 9px;min-width:0}
.egf3dByggsteg span{grid-row:1/3;font:700 9px/1.2 var(--mono);letter-spacing:.10em;text-transform:uppercase;color:var(--accent-deep)}
.egf3dByggsteg b{font:700 12px/1.25 var(--sans);color:var(--ink)}
.egf3dByggsteg small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px;color:var(--ink-3)}
.egf3dByggstegKnappar{display:flex;gap:5px;flex:none}
.egf3dByggstegKnappar .mini:last-child{min-width:78px}
.egf3dSnabbhjalp{margin:0;padding:0 10px 8px;color:var(--ink-3);font-size:11px;line-height:1.35;text-align:center}
.ritning3dIntro{display:flex;align-items:center;justify-content:space-between;gap:18px;padding:12px 14px;
  border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:8px;background:var(--surface)}
.ritning3dIntro>div{display:flex;flex-direction:column;gap:3px;min-width:0}
.ritning3dIntro b{font-family:var(--sans);font-size:14px;text-transform:uppercase;letter-spacing:.02em;color:var(--ink)}
.ritning3dIntro span{font-size:12px;line-height:1.45;color:var(--ink-3)}
.ritning3dIntro .mini{flex:none;min-height:44px}
.egf3dCanvasSlot{flex:1;min-height:420px;min-width:0;background:#dfe4e8}
.egf3dCanvasSlot>div{width:100%}
.egf3dCanvasSlot canvas:focus-visible{outline:3px solid var(--accent);outline-offset:-3px}
.egf3dMerPanel{padding:12px 14px 14px;max-height:min(58vh,560px);overflow:auto;background:#f7f8f4;
  border-top:1px solid var(--line);box-shadow:0 18px 44px rgba(20,24,26,.18)}
.egf3dPanelHuvud{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:8px}
.egf3dPanelHuvud>div{display:flex;flex-direction:column;gap:2px}
.egf3dPanelHuvud b{font-family:var(--sans);font-size:17px;text-transform:uppercase;letter-spacing:.025em}
.egf3dPanelHuvud span{font-size:12px;color:var(--ink-3)}
.egf3dSektion{padding:10px 0 4px;border-top:1px solid var(--line-2)}
.egf3dSektion h4{margin:0 0 8px;font-family:var(--mono);font-size:var(--tx-etikett);font-weight:700;
  letter-spacing:.11em;text-transform:uppercase;color:var(--ink-2)}
.egf3dSektion .btnrow{margin-bottom:6px}
.egf3dLage{display:flex;align-items:center;gap:7px;margin:0 0 8px;font-size:12px;color:var(--ink-2)}
.egf3dLagePunkt{width:9px;height:9px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 3px rgba(47,122,79,.13)}
.egf3dLagePunkt.aktiv{background:var(--warn);box-shadow:0 0 0 3px rgba(161,86,10,.14)}
.egf3dAktivHjalp{margin:4px 0 8px;padding:9px 11px;border-left:3px solid var(--accent);
  background:#fff7df;color:var(--ink-2);font-size:12px;line-height:1.45}
.egf3dFarligt{display:flex;justify-content:flex-end;padding-top:8px;border-top:1px solid var(--line-2)}
body.egf-3d-helskarm{overflow:hidden}
.ritningsblad{margin-top:10px;overflow:auto;border:1px solid #c8cfcb;border-radius:8px;background:#f1f1eb;box-shadow:0 12px 32px rgba(32,48,43,.09)}
.ritningsblad>svg{display:block;width:100%;min-width:760px;max-height:none;height:auto}
.ritningsblad:focus-visible{outline:3px solid var(--accent-deep);outline-offset:3px}
@media(max-width:760px){.ritningsblad{margin-left:-8px;margin-right:-8px;border-radius:4px}.ritningsblad>svg{min-width:680px}}
@media (max-width:700px), (max-width:1100px) and (max-height:500px){
  /* mobil: reglagen på egen rad så raden inte trycker ut canvasen i sidled */
  .egf3dRad .egf3dSol label{flex:1 1 100%}
  body.egf-3d-oppen{overflow:hidden}
  .egf3dWorkspace.aktiv{position:fixed;inset:0;z-index:90;height:100dvh;min-height:0;margin:0;border:0;border-radius:0}
  .egf3dPrimar{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:4px;padding:7px}
  .egf3dPrimar .mini{min-width:0!important;padding-left:4px;padding-right:4px;font-size:12px}
  .egf3dPrimar .mini:last-child{margin-left:0}
  .egf3dByggsteg{padding:6px 7px;gap:7px}
  .egf3dByggsteg>div:first-child{grid-template-columns:1fr;gap:0}
  .egf3dByggsteg span{display:none}
  .egf3dByggsteg small{max-width:48vw}
  .egf3dByggsteg .mini{min-height:40px;min-width:40px;padding-left:8px;padding-right:8px}
  button.egf3dHelskarmKnapp{display:none!important}
  .egf3dCanvasSlot{min-height:0}
  .egf3dCanvasSlot>div{height:100%!important}
  .egf3dMerPanel{position:fixed;left:0;right:0;bottom:0;z-index:8;max-height:calc(100dvh - 62px);
    padding:12px 12px max(14px,env(safe-area-inset-bottom));border-top:2px solid var(--accent);border-radius:12px 12px 0 0}
  .ritning3dIntro{align-items:stretch;flex-direction:column;gap:10px;padding:12px}
  .ritning3dIntro .mini{width:100%}
}
@media (max-width:1100px) and (max-height:500px){
  .egf3dPrimar{padding:5px 7px}
  .egf3dSnabbhjalp{display:none}
  .egf3dByggsteg{padding:4px 7px}
}
@media (min-width:600px) and (max-width:1100px) and (max-height:500px){
  /* Sex synliga knappar inklusive sidovy och Stäng. Ingen andra rad som
     stjäl modellens höjd när telefonen vrids till landskap. */
  .egf3dPrimar{grid-template-columns:repeat(6,minmax(0,1fr))}
}

/* ============================================================================
   AUTENTISERINGSSIDOR. Logga in / Skapa konto / Återställ lösenord
   (Login.jsx, Registrera.jsx, Aterstall.jsx, och Login.jsx inbäddat i
   Landning.jsx). Allt under den här rubriken ägs av det här blocket. En annan
   agent rör mobilreglerna längre upp i filen (@media max-width:840px m.fl.),
   den ytan är inte vidrörd här, och den agenten bör lämna DET HÄR blocket ifred.

   Mobilt är grundläget (ingen media query): formuläret ligger FÖRST i DOM-
   ordningen (grid-area "form" före "info") så det syns utan scroll på en
   390 px-skärm. Från 900 px och uppåt växlar auth-grid till två spalter och
   byter SIDA, säljfältet till vänster, formuläret till höger, utan att
   DOM-ordningen ändras (grid-template-areas, inte `order`), så tabbordningen
   för tangentbord fortsätter träffa formuläret först oavsett skärmbredd. */
/* .masthead .logo a{display:inline-flex} (mobilblocket längre upp i filen, inte
   rört här) äter mellanslaget mellan "EGF" och "Kalkyl" när logotypen omsluter en
   <a>. Landning.jsx har ingen länk i sin h1 och märker det aldrig, men
   auth-sidorna länkar hem. Skrivs om till inline bara här; högre specificitet
   (.auth-yta + .masthead + .logo + a) vinner utan !important. */
.auth-yta .masthead .logo a{display:inline}
.auth-yta{min-height:100vh;background:var(--paper);display:flex;flex-direction:column}
.auth-grid{flex:1;display:grid;grid-template-columns:1fr;grid-template-areas:"form" "info"}
.auth-formcol{grid-area:form;display:flex;flex-direction:column;justify-content:center;padding:26px 20px 10px}
.auth-info{grid-area:info;display:flex;flex-direction:column;justify-content:center;
  background:var(--ink);color:var(--paper);padding:30px 20px 42px}
.auth-formwrap{width:100%;max-width:400px;margin:0 auto}
.auth-rubrik{font-family:var(--sans);font-size:21px;font-weight:700;text-transform:uppercase;
  letter-spacing:.02em;color:var(--ink);margin:0 0 12px}
.auth-info-in{max-width:440px;margin:0 auto;width:100%}
.auth-info-in h2{font-family:var(--sans);font-size:clamp(20px,4vw,26px);font-weight:700;line-height:1.18;
  text-transform:uppercase;letter-spacing:.02em;color:var(--accent);margin:0 0 12px}
.auth-info-in p{font-size:13.5px;line-height:1.6;color:#c9cfcb;margin:0 0 16px;max-width:44ch}
.auth-info-kort .auth-info-in p{margin-bottom:0}
.auth-punkter{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:9px}
.auth-punkter li{position:relative;padding-left:22px;font-size:13px;line-height:1.5;color:#dfe3de}
.auth-punkter li::before{content:"✓";position:absolute;left:0;top:0;color:var(--accent);font-weight:700}
@media (min-width:900px){
  .auth-grid{grid-template-columns:minmax(380px,440px) 1fr;grid-template-areas:"info form";min-height:100vh}
  .auth-formcol{padding:48px 44px}
  .auth-info{padding:48px 44px}
  .auth-rubrik{font-size:25px;margin-bottom:16px}
}

/* Fält: en egen, enklare radmall än .row (som är byggd för kalkylens smala
   sifferfält), etikett ovanpå, fält i full bredd, plats för en inline-hint. */
.auth-falt{margin:0 0 14px}
.auth-falt label{display:block;font-size:13px;color:var(--ink-2);margin-bottom:5px}
/* .row/inputbasreglerna längre upp i filen stylar input[type=text] på desktop
   men INTE input[type=password] (bara i mobilbrytpunkten), ett lösenordsfält
   såg därför ut som webbläsarens standardfält på en dator. Scopat till
   .auth-card så fixen bara gäller de här tre sidorna. */
.auth-card input[type=password]{font-family:inherit;text-align:left;width:100%;padding:6px 8px;
  border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface);color:var(--ink);
  font-size:13px;transition:border-color .12s,box-shadow .12s}
.auth-card input[type=password]:hover{border-color:var(--ink-3)}
.auth-card input[type=password]:focus{outline:none;border-color:var(--accent-deep);box-shadow:var(--ring)}
.auth-card input[type=password]:disabled{background:#f3f4f0;color:var(--ink-3)}
.auth-pwwrap{position:relative}
.auth-pwwrap input{padding-right:54px}
.auth-pwtoggle{position:absolute;right:4px;top:50%;transform:translateY(-50%);border:0;background:none;
  cursor:pointer;font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.06em;text-transform:uppercase;
  color:var(--accent-deep);padding:7px 8px;border-radius:var(--r-sm)}
.auth-pwtoggle:hover{background:#f1f2ee}
.auth-pwtoggle:focus-visible{outline:2px solid var(--accent-deep);outline-offset:1px}
/* .hint finns redan (grå hjälptext), varning är samma storlek, stopfärg. */
.hint.varning{color:var(--stop)}
/* Kryssrutans etikett är en hel mening (villkor/håll-mig-inloggad) och radbryts
   ofta till två rader, .check centrerar annars kryssrutan mitt i texten. */
.auth-villkor,.auth-hallkvar{align-items:flex-start}
.auth-villkor input,.auth-hallkvar input{margin-top:2px}

/* Lösenordsstyrkan i Registrera.jsx: fyra fack, färgade efter styrka() i
   komponenten. n1=rött, n2=orange, n3/n4=grönt, samma tokens som noterna. */
.auth-styrka{display:flex;align-items:center;gap:8px;margin-top:6px}
.auth-styrka-fack{display:flex;gap:3px;flex:none}
.auth-styrka-fack i{display:block;width:20px;height:4px;border-radius:2px;background:var(--line)}
.auth-styrka-fack i.n1{background:var(--stop)}
.auth-styrka-fack i.n2{background:var(--warn)}
.auth-styrka-fack i.n3,.auth-styrka-fack i.n4{background:var(--ok)}
.auth-styrka span{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.06em;text-transform:uppercase;color:var(--ink-3)}

/* Laddsnurra i knappen, respekterar prefers-reduced-motion via den globala
   *,*::before,*::after-regeln (!important) längre upp i filen. */
.auth-snurr{display:inline-block;width:11px;height:11px;margin-right:7px;vertical-align:-1px;
  border:2px solid currentColor;border-top-color:transparent;border-radius:50%;
  animation:auth-snurr .6s linear infinite}
@keyframes auth-snurr{to{transform:rotate(360deg)}}
.auth-btnrow{align-items:center}

/* "Ny kund? Skapa konto". App.jsx lägger den här <p>:n som SYSKON direkt efter
   <Login/> på /logga-in (inte i Login.jsx självt, se kommentaren i App.jsx om
   varför). Adjacent-sibling-väljaren träffar den utan att App.jsx behöver röras. */
.auth-yta + p{margin:0;padding:20px 20px 40px;text-align:center;background:var(--paper)}
.auth-yta + p a{font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.08em;text-transform:uppercase;
  color:var(--accent-deep);text-decoration:none}

/* Inloggningen är entrén till en arbetsyta, inte ett litet formulär i en tom
   sida. Reglerna är medvetet scopade så Registrera och Återställ behåller sina
   enklare flöden. */
.auth-login{min-height:100dvh}
.auth-login .masthead{position:relative;padding:16px clamp(20px,4vw,56px)}
.auth-login .auth-grid{min-height:0}
.auth-login .auth-formcol{background:#f4f5f1;padding:36px 20px 44px}
.auth-login .auth-formwrap{max-width:460px}
.auth-kicker,.auth-info-kicker,.verktygshubb-kicker,.verktygshubb-sektionsetikett{
  display:block;font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.13em;text-transform:uppercase}
.auth-kicker{color:var(--accent-deep);margin-bottom:8px}
.auth-login .auth-rubrik{font-size:clamp(30px,5vw,44px);line-height:1;margin-bottom:9px}
.auth-intro{color:var(--ink-2);font-size:15px;margin:0 0 22px}
.auth-login .auth-card{border-color:#d9ddd3;box-shadow:0 16px 42px rgba(20,24,26,.09);margin-bottom:0}
.auth-login .auth-card .pad{padding:24px}
.auth-login .auth-falt{margin-bottom:17px}
.auth-login .auth-falt label{font-family:var(--mono);font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-2);margin-bottom:7px}
.auth-login .auth-card input[type=text],.auth-login .auth-card input[type=password]{
  min-height:48px;padding:11px 12px;font-size:15px;border-color:#c8cdc3;background:#fff}
.auth-login .auth-pwwrap input{padding-right:64px}
.auth-login .auth-pwtoggle{right:7px;padding:9px}
.auth-login .auth-hallkvar{margin-top:3px}
.auth-login .auth-hallkvar label{line-height:1.4}
.auth-login .auth-btnrow{margin:24px 0 0;justify-content:space-between}
.auth-login .auth-btnrow .btn{min-height:44px;padding:10px 24px}
.auth-login .auth-btnrow .mini{border:0;background:transparent;padding:10px 0;color:var(--ink-2)}
.auth-nykund{margin:18px 0 0;text-align:center;font-size:13px;color:var(--ink-2)}
.auth-nykund a{color:var(--accent-deep);font-weight:650;text-decoration-thickness:1px;text-underline-offset:3px}
.auth-login .auth-info{position:relative;overflow:hidden;background:#171c1e;padding:40px 24px 48px}
.auth-login .auth-info::before{content:"";position:absolute;inset:0;opacity:.12;pointer-events:none;
  background-image:linear-gradient(rgba(255,255,255,.18) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.18) 1px,transparent 1px);
  background-size:48px 48px}
.auth-login .auth-info::after{content:"";position:absolute;width:260px;height:260px;border:1px solid rgba(242,183,5,.28);
  right:-110px;bottom:-110px;transform:rotate(45deg);pointer-events:none}
.auth-login .auth-info-in{position:relative;z-index:1;max-width:600px}
.auth-info-kicker{color:var(--accent);margin-bottom:15px}
.auth-login .auth-info-in h2{max-width:12ch;font-size:clamp(32px,4.2vw,58px);line-height:.98;color:#f4f5f1;margin-bottom:22px}
.auth-login .auth-info-in>p{font-size:15px;line-height:1.65;max-width:50ch;color:#bfc7c2}
.auth-flode{display:grid;grid-template-columns:repeat(3,1fr);margin:32px 0 26px;border-top:1px solid #3a423e;border-bottom:1px solid #3a423e}
.auth-flode>div{position:relative;padding:18px 14px 18px 0;min-width:0}
.auth-flode>div+div{border-left:1px solid #3a423e;padding-left:18px}
.auth-flode span{display:block;font-family:var(--mono);font-size:10px;color:var(--accent);margin-bottom:8px}
.auth-flode b{display:block;font-family:var(--sans);font-size:16px;text-transform:uppercase;color:#fff;letter-spacing:.03em}
.auth-flode small{display:block;color:#929c97;font-size:11px;margin-top:2px}
.auth-fakta{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:10px}
.auth-fakta>div{border-left:3px solid var(--accent);padding:5px 0 5px 14px}
.auth-fakta strong{display:block;font-family:var(--sans);font-size:34px;line-height:1;color:#fff}
.auth-fakta span{display:block;font-size:11px;color:#9ea7a2;margin-top:5px;max-width:19ch}
.auth-login .auth-info-in .auth-fortroende{font-family:var(--mono);font-size:10px;letter-spacing:.04em;color:#7f8984;margin:28px 0 0}
@media (min-width:900px){
  .auth-login .auth-grid{grid-template-columns:minmax(500px,1.2fr) minmax(440px,.8fr);grid-template-areas:"info form"}
  .auth-login .auth-info{padding:clamp(50px,7vw,96px)}
  .auth-login .auth-formcol{padding:56px clamp(40px,6vw,84px)}
}
@media (max-width:520px){
  .auth-login .masthead .sub{display:none}
  .auth-login .auth-formcol{padding-top:28px}
  .auth-login .auth-card .pad{padding:19px}
  .auth-login .auth-btnrow{align-items:stretch;flex-direction:column}
  .auth-login .auth-btnrow .mini{text-align:center}
  .auth-flode{grid-template-columns:1fr}
  .auth-flode>div+div{border-left:0;border-top:1px solid #3a423e;padding-left:0}
  .auth-login .auth-falt label,.auth-flode span,.auth-flode small,
  .auth-fakta span,.auth-login .auth-info-in .auth-fortroende{font-size:12px}
}

/* Inloggad startsida: en avgränsad arbetsyta. Bara vald kategori ritas ut;
   det gör 147 verktyg hanterbara utan att gömma dem bakom en ny sidstruktur. */
.sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}
.verktygshubb{min-height:calc(100vh - 94px);background:#eef0ea}
.verktygshubb-hero{background:#181d1f;color:#f3f4f0;border-bottom:3px solid var(--accent);padding:34px max(20px,calc((100vw - 1160px)/2)) 0}
.verktygshubb-hero-in{display:flex;align-items:flex-end;justify-content:space-between;gap:30px;padding-bottom:28px}
.verktygshubb-kicker{color:var(--accent);margin-bottom:9px}
.verktygshubb-rubrik h1{font-family:var(--sans);font-size:clamp(34px,5vw,58px);line-height:.95;text-transform:uppercase;letter-spacing:.01em;margin:0}
.verktygshubb-rubrik p{font-size:15px;color:#aeb7b2;margin:12px 0 0}
.verktygshubb-status{display:grid;grid-template-columns:auto minmax(90px,130px);gap:10px;align-items:end;padding-bottom:3px}
.verktygshubb-status strong{font-family:var(--sans);font-size:44px;line-height:.82;color:var(--accent)}
.verktygshubb-status span{font-family:var(--mono);font-size:10px;line-height:1.35;text-transform:uppercase;letter-spacing:.08em;color:#aeb7b2}
.verktygshubb-snabbval{display:grid;grid-template-columns:1.55fr repeat(3,1fr);border-top:1px solid #3a423e}
.verktygshubb-snabbval a{min-height:70px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:13px 18px;color:#e6e9e3;text-decoration:none;border-right:1px solid #3a423e;transition:background .14s,color .14s}
.verktygshubb-snabbval a:last-child{border-right:0}
.verktygshubb-snabbval a:hover,.verktygshubb-snabbval a:focus-visible{background:#22292b;color:var(--accent)}
.verktygshubb-snabbval a b{font-family:var(--mono);font-size:11px;text-transform:uppercase;letter-spacing:.07em}
.verktygshubb-snabbval a small{display:block;font-size:11px;color:#929c97;margin-top:3px}
.verktygshubb-snabbval-primar{background:var(--accent)!important;color:var(--ink)!important}
.verktygshubb-snabbval-primar:hover,.verktygshubb-snabbval-primar:focus-visible{background:#ffd13a!important}
.verktygshubb-snabbval-ikon{display:grid;place-items:center;flex:none;width:34px;height:34px;border:1px solid rgba(20,24,26,.35);font-size:24px;font-weight:300}
.verktygshubb-innehall{max-width:1160px;padding-top:36px}
.verktygshubb-sok{display:grid;grid-template-columns:minmax(220px,.65fr) minmax(360px,1.35fr);gap:36px;align-items:end;padding-bottom:32px;border-bottom:1px solid var(--line)}
.verktygshubb-sektionsetikett{color:var(--accent-deep);margin-bottom:6px}
.hub .verktygshubb-sok h2,.hub .verktygshubb-sektionshuvud h2,.hub .verktygshubb-kategorihuvud h2,.hub .verktygshubb-tomt h2{
  font-family:var(--sans);font-size:clamp(21px,3vw,28px);font-weight:700;line-height:1.05;text-transform:uppercase;letter-spacing:.02em;color:var(--ink);margin:0;padding:0;border:0}
.verktygshubb-soklada{position:relative;display:flex;align-items:center;margin:0}
.verktygshubb-soklada input{width:100%;min-height:52px;padding:12px 80px 12px 45px;border:1px solid #bfc5ba;border-radius:0;background:#fff;color:var(--ink);font-size:14px;text-align:left;box-shadow:0 5px 16px rgba(20,24,26,.05)}
.verktygshubb-soklada input:focus{border-color:var(--accent-deep);box-shadow:var(--ring)}
.verktygshubb-sokikon{position:absolute;left:16px;z-index:1;font-size:23px;line-height:1;color:var(--ink-3);transform:rotate(-18deg)}
.verktygshubb-soklada button{position:absolute;right:8px;border:0;background:#eef0ea;cursor:pointer;padding:8px 9px;font-family:var(--mono);font-size:9px;text-transform:uppercase;color:var(--ink-2)}
.verktygshubb-senaste,.verktygshubb-kategorier,.verktygshubb-aktivkategori,.verktygshubb-resultat{padding-top:34px}
.verktygshubb-sektionshuvud,.verktygshubb-kategorihuvud{display:flex;align-items:flex-end;justify-content:space-between;gap:20px;margin-bottom:15px}
.verktygshubb-sektionsnot{font-family:var(--mono);font-size:10px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-3)}
.verktygshubb-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:13px}
.verktygshubb .hubkort-hylsa{min-width:0}
.verktygshubb .hubkort{position:relative;min-height:160px;padding:18px 17px 16px;border-radius:0;border-color:#d8dcd3;box-shadow:0 2px 10px rgba(20,24,26,.05)}
.verktygshubb .hubkort::before{content:"";position:absolute;left:-1px;top:-1px;bottom:-1px;width:3px;background:transparent;transition:background .14s}
.verktygshubb .hubkort:hover{transform:translateY(-2px);border-color:#b9bfb4;box-shadow:0 10px 24px rgba(20,24,26,.1)}
.verktygshubb .hubkort:hover::before{background:var(--accent)}
.verktygshubb .hubkort-hylsa>.hubkort:last-child{border-radius:0}
.verktygshubb .hubkort-kod{font-family:var(--mono);font-size:9px;text-transform:uppercase;letter-spacing:.1em;color:var(--ink-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:15px}
.verktygshubb .hubkort b{min-width:0;font-size:17px;line-height:1.08;margin-bottom:8px;overflow-wrap:anywhere;hyphens:auto}
.verktygshubb .hubkort .klass{font-size:10px}
.verktygshubb .hubkort .tagg{font-size:9px;margin-top:7px}
.verktygshubb .hubkort .hubkort-oppna{position:absolute;left:17px;right:17px;bottom:15px;display:flex;justify-content:space-between;align-items:center;padding-top:9px;border-top:1px solid var(--line-2);font-family:var(--mono);font-size:9px;text-transform:uppercase;letter-spacing:.07em;color:var(--ink-2)}
.verktygshubb .hubkort:has(.tagg) .hubkort-oppna{position:static;margin-top:12px}
.verktygshubb .kortfot{border-radius:0;padding:10px 14px}
.verktygshubb-kategorival{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));border:1px solid #cbd0c6;background:#fff}
.verktygshubb-kategorival button{position:relative;min-height:92px;padding:14px 12px;border:0;border-right:1px solid var(--line-2);border-bottom:1px solid var(--line-2);background:#fff;color:var(--ink);cursor:pointer;text-align:left}
.verktygshubb-kategorival button:nth-child(7n){border-right:0}
.verktygshubb-kategorival button:nth-last-child(-n+7){border-bottom:0}
.verktygshubb-kategorival button:hover{background:#f6f7f3}
.verktygshubb-kategorival button.aktiv{background:var(--ink);color:#fff;box-shadow:inset 0 -3px var(--accent)}
.verktygshubb-kategorival button>span{display:block;font-family:var(--mono);font-size:9px;color:var(--accent-deep);letter-spacing:.08em;margin-bottom:9px}
.verktygshubb-kategorival button.aktiv>span{color:var(--accent)}
.verktygshubb-kategorival button b{display:block;font-family:var(--sans);font-size:13px;line-height:1.12;text-transform:uppercase}
.verktygshubb-kategorival button small{position:absolute;right:9px;top:9px;font-family:var(--mono);font-size:9px;color:var(--ink-3)}
.verktygshubb-kategorival button.aktiv small{color:#aeb7b2}
.verktygshubb-svephjalp{display:none}
.verktygshubb-kategorihuvud{align-items:flex-start;border-top:3px solid var(--ink);padding-top:20px}
.verktygshubb-kategorihuvud p{margin:7px 0 0;color:var(--ink-2);max-width:58ch}
.verktygshubb-kategorihuvud .mini{color:var(--ink-2);text-decoration:none;white-space:nowrap}
.verktygshubb-tomt{text-align:center;padding:70px 20px;background:#f7f8f5;border:1px solid var(--line);margin-top:32px}
.verktygshubb-tomt>span{display:block;font-size:36px;color:var(--ink-3);margin-bottom:10px}
.verktygshubb-tomt p{color:var(--ink-2);margin:10px auto 18px;max-width:50ch}
@media (max-width:980px){
  .verktygshubb-snabbval{grid-template-columns:1.4fr repeat(3,1fr)}
  .verktygshubb-snabbval a{padding:12px 10px}
  .verktygshubb-grid{grid-template-columns:repeat(3,minmax(0,1fr))}
  .verktygshubb-kategorival{grid-template-columns:repeat(4,minmax(0,1fr))}
  .verktygshubb-kategorival button:nth-child(7n){border-right:1px solid var(--line-2)}
  .verktygshubb-kategorival button:nth-child(4n){border-right:0}
  .verktygshubb-kategorival button:nth-last-child(-n+7){border-bottom:1px solid var(--line-2)}
  .verktygshubb-kategorival button:nth-last-child(-n+2){border-bottom:0}
}
@media (max-width:700px){
  .verktygshubb-hero{padding-top:26px}
  .verktygshubb-hero-in{align-items:flex-start;padding-bottom:24px}
  .verktygshubb-status{grid-template-columns:auto;gap:5px;text-align:right}
  .verktygshubb-status strong{font-size:34px}
  .verktygshubb-status span{max-width:10ch}
  .verktygshubb-snabbval{grid-template-columns:1fr 1fr}
  .verktygshubb-snabbval a{min-height:62px;border-bottom:1px solid #3a423e}
  .verktygshubb-snabbval a:nth-child(2){border-right:0}
  .verktygshubb-snabbval a:nth-last-child(-n+2){border-bottom:0}
  .verktygshubb-innehall{padding-top:28px}
  .verktygshubb-sok{grid-template-columns:1fr;gap:15px;padding-bottom:26px}
  .verktygshubb-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .verktygshubb-kategorival{display:flex;overflow-x:auto;scroll-snap-type:x mandatory}
  .verktygshubb-kategorival button{flex:0 0 145px;border-bottom:0!important;scroll-snap-align:start}
  .verktygshubb-kategorival button:nth-child(n){border-right:1px solid var(--line-2)}
  .verktygshubb-kategorival button:last-child{border-right:0}
  .verktygshubb-svephjalp{display:flex;justify-content:space-between;margin:7px 0 0;color:var(--ink-2);font-family:var(--mono);font-size:10px;letter-spacing:.05em;text-transform:uppercase}
  /* Läsbarhetsgolvet i mobilens kvalitetsprov är 12 px. De här etiketterna är
     små på skrivbordet men används ute på plats och får inte krympa under det. */
  .verktygshubb-status span,.verktygshubb-snabbval a b,.verktygshubb-snabbval a small,
  .verktygshubb-sektionsnot,.verktygshubb-kategorival button>span,
  .verktygshubb-kategorival button small,.verktygshubb .hubkort-kod,
  .verktygshubb .hubkort .klass,.verktygshubb .hubkort .tagg,
  .verktygshubb .hubkort .hubkort-oppna{font-size:12px}
}
@media (max-width:460px){
  .verktygshubb-rubrik h1{font-size:34px}
  .verktygshubb-status{display:none}
  .verktygshubb-snabbval{grid-template-columns:1fr}
  .verktygshubb-snabbval a{border-right:0;border-bottom:1px solid #3a423e!important}
  .verktygshubb-snabbval a:last-child{border-bottom:0!important}
  .verktygshubb-grid{grid-template-columns:1fr}
  .verktygshubb-sektionshuvud,.verktygshubb-kategorihuvud{align-items:flex-start;flex-direction:column;gap:9px}
  .verktygshubb-soklada input{font-size:13px}
}

/* ============================================================================
   Landningssidan, omgörningen 2026-08-17. ÄGD AV Landning.jsx-agenten.
   Bara nya klasser här, inga ändringar ovanför. De gamla .landning-* reglerna
   (rad ~309, "landningssida (utloggad besökare på /)") lever kvar orörda och
   återanvänds rakt av (landning-ingress, landning-brod, landning-verktyg,
   landning-login, landning-fot), de klasserna dupliceras INTE här.
   landning-steg är i bruk igen sedan 2026-08-27: flödesremsan "Från mått
   till offert", fem steg med bild där en riktig finns (tillägg längst ned).
   ============================================================================ */

/* Hero: text + produktbilder sida vid sida, återställd 2026-08-22. Bilderna
   som revs 2026-08-21 bar ett långt tankstreck inbränt i JPEG och saknade
   generator i repot; de nya skrivs ur den körande appen och vaktas av
   app/e2e/landningsbild.spec.js, se landning-bilder.mjs. */
.landning-hero-grid{display:grid;grid-template-columns:1.1fr 1fr;gap:44px;align-items:center}
/* Enspaltigt: bildspalten börjar vid bandets kant, left:-36 hade hamnat utanför. */
/* Enspaltigt OCH tätare: 56/64 px band-padding och 24 px styckemarginaler
   gav en 1 163 px hög hjälte på 390 px, bilden började på y=855, under vecket.
   Målet är hjälte under 700 och bilden inom första skärmen. */
@media (max-width:860px){.landning-hero-grid{grid-template-columns:1fr;gap:12px}
  .landning-hero{padding:16px 20px 14px}.landning-hero h1{margin-bottom:8px}
  .landning-hero p{margin-bottom:10px}.landning-hero p.landning-stamp{margin-bottom:8px}
  .landning-hero .btnrow{margin-bottom:8px}}
/* Sedan 2026-08-27 bär hjälten EN bild, 3D-vyn. Prispanelen som förut låg som
   ett kort över bildens hörn bor i flödesremsan (.landning-steg) som steget
   Kalkyl: en bild per besked, och hjälten under 700 px på en telefon. */
.landning-hero-bilder{padding:0 12px 12px 0}
.landning-hero-bilder img{width:100%;height:auto;display:block;border-radius:var(--r);
  box-shadow:12px 12px 0 var(--accent);border:1px solid rgba(255,255,255,.08)}
/* Stämpelraden ovanför rubriken: ett steg per ord, ram som en ritningsstämpel.
   p.landning-stamp av samma skäl som p.landning-hero-pris nedan. */
.landning-hero p.landning-stamp{display:inline-block;font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.16em;
  text-transform:uppercase;color:var(--paper);border:1px solid rgba(233,235,229,.4);padding:5px 10px;margin:0 0 18px;max-width:none}
.landning-hero p{font-size:16px}
/* Innehållsbredden 1180 bara här: .hub delas med det inloggade lägets startsida
   och ska inte breddas därifrån. Räknaren ger sektionsrubrikerna 01, 02 ... */
.landning{counter-reset:avsnitt}
.landning .hub{max-width:1180px}
/* Mörkt band mitt på sidan (Det som skiljer): bryter raden av vita kort på
   grått. Kortens vita byts mot en svag ljus ton på svart, rubrikerna gula. */
.landning-mork{background-color:var(--ink);color:var(--paper);border-top:3px solid var(--accent);border-bottom:3px solid var(--accent);margin-top:0;
  background-image:linear-gradient(rgba(255,255,255,.04) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.04) 1px,transparent 1px);
  background-size:48px 48px}
.landning .landning-mork .hub{padding-top:4px;padding-bottom:46px}
.landning .landning-mork .hub>h2{color:var(--accent);border-color:rgba(255,255,255,.28)}
.landning .landning-mork .hub>h2::before{color:var(--accent);border-color:var(--accent)}
.landning-mork .card{background:rgba(255,255,255,.055);border-color:rgba(255,255,255,.13);box-shadow:none}
.landning .landning-mork .card>h3{color:var(--accent);border-color:rgba(255,255,255,.13)}
/* Hubben före bandet: 80 px bottenluft plus bandets marginal gav ett tomt fält
   efter knappen. :has, stöds av alla webbläsare sedan 2023. */
.landning .hub:has(+.landning-mork){padding-bottom:36px}
.landning-mork .landning-brod{color:#d6dbd8}
.landning-mork+.hub{padding-top:10px}
/* Intoning (useIntoning i Landning.jsx): bara under .animerad, som JS sätter
   när observern finns och rörelse inte är avstängd. Syskonen förskjuts. */
.landning.animerad .avslojas{opacity:0;transform:translateY(18px);transition:opacity .55s ease,transform .55s ease}
.landning.animerad .avslojas.syns{opacity:1;transform:none}
.landning.animerad .avslojas:nth-child(2){transition-delay:.07s}
.landning.animerad .avslojas:nth-child(3){transition-delay:.14s}
.landning.animerad .avslojas:nth-child(4){transition-delay:.21s}
.landning.animerad .avslojas:nth-child(5){transition-delay:.28s}
.landning.animerad .avslojas:nth-child(6){transition-delay:.35s}
@media (prefers-reduced-motion:reduce){.landning.animerad .avslojas{opacity:1;transform:none;transition:none}}
.landning .hub>h2{font-family:var(--sans);font-size:clamp(20px,2.2vw,26px);font-weight:700;letter-spacing:.02em;
  text-transform:uppercase;color:var(--ink);border-bottom:2px solid var(--ink);padding-bottom:8px;margin:46px 0 14px;
  display:flex;align-items:baseline;gap:12px}
.landning .hub>h2::before{counter-increment:avsnitt;content:counter(avsnitt,decimal-leading-zero);flex:none;
  font-family:var(--mono);font-size:var(--tx-etikett);font-weight:400;letter-spacing:.12em;color:var(--accent-deep);
  border:1px solid var(--accent-deep);border-radius:3px;padding:2px 6px}
/* Kanterna ett steg mörkare (--line i stället för --line-2) på landningssidans
   kort, så de läser som rutor på ett kalkylunderlag och inte som mjuka plattor. */
.landning .card,.landning-guide,.landning-kat,.landning-bevis-bild{border-color:var(--line)}
.landning .card>h3{color:var(--ink)}
/* Platshållare medan bildchunken (dynamisk import, se landning-bilder.mjs)
   fortfarande hämtas, samma mått som bilden, ingen layoutstuds när den dyker upp.
   I hjälten ljus mot det mörka bandet, i bevisavsnittet grå mot papperet. */
.landning-bild-plats{width:100%;border-radius:var(--r);background:var(--line-2)}
.landning-hero-bilder .landning-bild-plats{background:rgba(255,255,255,.06)}
/* p.landning-hero-pris, inte .landning-hero-pris: .landning-hero p (rad 351) är
   en klass PLUS ett typnamn och vinner annars över färg, storlek och marginal,
   oavsett vem som står sist i filen. Regeln fanns redan här men användes aldrig,
   och hade den tagits i bruk som den stod hade prisraden ritats som vanlig grå
   brödtext i 15,5 px, alltså inte som en prisrad alls.
   13 px, inte 12: det här är talet en hantverkare jämför med sin egen timme, och
   golvet (12) är ett golv, inte ett mål. */
/* max-width:none uttryckligen, inte utelämnad: .landning-hero p ärver ned 64ch
   hit, och ch räknas UTAN letter-spacing, så raden bröts i två strax före sista
   ordet på skrivbordet. Kort nog att sköta sig själv, och på telefon ska den
   brytas. */
p.landning-hero-pris{font-family:var(--mono);font-size:13px;letter-spacing:.06em;
  color:var(--accent);margin:0 0 18px;max-width:none}

/* dl.landning-svar (två frågor i hjälten) är borttagen 2026-08-27: prisraden,
   trygghetsraden och prisavsnittet bär beskeden. */

/* Guidekorten. Egen klass trots att de ser ut som .hubkort: .hubkort hör till
   det inloggade lägets rutnät och ska inte kunna ändras härifrån. Länken är
   HELA kortet, inte rubriken, det är den enda träffytan som duger med handskar. */
.landning-guider{display:grid;grid-template-columns:repeat(auto-fill,minmax(215px,1fr));gap:10px;margin-bottom:18px;counter-reset:guide}
.landning-guide{display:flex;flex-direction:column;gap:5px;min-height:44px;padding:13px 15px;
  background:var(--surface);border:1px solid var(--line-2);border-radius:var(--r);
  box-shadow:var(--skugga-1);text-decoration:none;color:inherit;
  transition:border-color .12s,transform .12s,box-shadow .12s}
/* Löpnumret som pseudoelement, inte i DOM: getByText och alt-texter ser det
   aldrig. Dolda kort (mobilens n+7) räknas inte, så 01 till 06 står kvar. */
.landning-guide::before{counter-increment:guide;content:counter(guide,decimal-leading-zero);
  font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.12em;color:var(--accent-deep)}
.landning-guide:hover{border-color:var(--ink);transform:translateY(-1px);box-shadow:var(--skugga-2)}
.landning-guide b{font-family:var(--sans);font-size:14.5px;text-transform:uppercase;letter-spacing:.01em}
.landning-guide span{font-size:12.5px;line-height:1.45;color:var(--ink-2)}
/* "Visa alla N guider"-knappen är borta 2026-08-27: sidan visar tre utvalda
   guider och länkar till /guider för resten. */

/* Konkret bevis: exempelkalkylen (siffror, inte adjektiv) + offert-skärmdump. */
.landning-bevis{display:grid;grid-template-columns:1fr 1fr;gap:24px;align-items:start;margin-bottom:8px}
@media (max-width:820px){.landning-bevis{grid-template-columns:1fr}}
.landning-tag{display:inline-block;font-family:var(--mono);font-size:var(--tx-etikett);letter-spacing:.08em;
  text-transform:uppercase;background:var(--ink);color:var(--accent);padding:3px 9px;
  border-radius:999px;margin-right:6px}
.landning-bevis-rad{font-family:var(--sans);font-size:16px;font-weight:700;text-transform:uppercase;
  letter-spacing:.02em;margin:0 0 8px;display:flex;align-items:center;flex-wrap:wrap;gap:4px}
.landning-fakta{list-style:none;margin:14px 0 0;padding:0;display:flex;flex-direction:column;gap:7px}
.landning-fakta li{font-size:13.5px;color:var(--ink-2);border-bottom:1px dashed var(--line-2);padding-bottom:7px}
.landning-fakta b{color:var(--ink);font-variant-numeric:tabular-nums}
/* .landning-fakta.rader (offertraderna i text) är borttagen 2026-08-22: de sju
   raderna stod både här och i offertbilden intill, och två listor med samma
   innehåll läste som en dubblering. Bilden bär radnivån ensam nu. */
/* Nyckeltalsraden som ersätter dem: beloppet störst, måtten i mono under,
   samma typsnitt som sidans övriga siffror (p.landning-hero-pris ovan). */
.landning-fakta-sum{font-size:15px;border-bottom:0;padding-top:2px}
.landning-fakta-sum b{color:var(--accent-deep);font-family:var(--mono);font-size:26px;letter-spacing:-.01em}
.landning-fakta-matt{display:block;font-family:var(--mono);font-size:13px;letter-spacing:.04em;color:var(--ink-2);margin-top:4px}
.landning-bevis-bild{margin:0;background:var(--surface);border:1px solid var(--line-2);border-radius:var(--r);
  overflow:hidden;box-shadow:var(--skugga-1)}
.landning-bevis-bild img{width:100%;height:auto;display:block}
/* Offertbilden i två varianter, en synlig åt gången. Helbilden (740 px källa)
   renderades 348 px bred under 640 px och brödtexten blev ~4 px, det underkända
   mobilfyndet 2026-08-21. Mobilvarianten är en beskärning med bara titel,
   prisbadge och Att betala-raden, fotad i riktig 390 px-rendering med dubbel
   täthet (landningsbild.spec.js), så den är läsbar där den faktiskt visas. */
.landning-bevis-bild .bild-mobil{display:none}
.landning-bevis-bild figcaption{font-size:var(--tx-etikett);color:var(--ink-3);padding:8px 12px;border-top:1px solid var(--line-2)}

/* .cols-4 (fyra värdeblock i rad) är borttagen 2026-08-22. Värdeblocken är två,
   inte fyra, och .cols räcker för dem. Sökt igenom hela repot: klassen hade noll
   användare kvar, också i de fristående HTML-filerna. */

/* Founding-priskortet, samma .card, bara en accentkant så det inte ser ut
   som en andra kopia av ordinarie pris. */
.landning-founding{border-color:var(--accent-deep)}
.landning-founding>h3{color:var(--accent-deep)}

/* Verktygslistan: kategori-kort som fälls ut, i stället för 1500 px chips.
   Samma visuella mönster som .grp (formulärgrupperna), egen klass ändå,
   .grp är scopad till kalkylformuläret och ska inte råka träffas härifrån. */
/* align-items:start: gridceller sträcks annars till radens högsta kort, och när
   en kategori öppnades stod fem TOMMA vita pelare bredvid den öppna (ägarens
   skärmbild 2026-08-22). Öppnat kort spänner dessutom hela raden: 18 chips i en
   150 px-kolumn blir en meterlång stapel, över hela bredden blir de tre rader.
   Chipsen radar sig själva, .landning-verktyg är redan flex-wrap. */
.landning-kategorier{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px;margin-bottom:18px;align-items:start;counter-reset:kat}
/* 180 px-kolumner på dator: löpnumret tog 30 px av kortet och 150 px-kolumnerna
   avstavade "BELÄGG-NING" och "RÅDGIV-NING" mitt i orden. 1180 px innehåll ger
   sex kolumner ändå. Telefonen behåller 150, där ger 180 en enda pelare. */
/* 230 i stället för 180: sex 180-kolumner avstavade ändå "BELÄGG-NING",
   "ÅTERVIN-NING", "RÅDGIV-NING" och "PROJEKT-LEDNING" vid 1440 (granskning
   2026-08-27), löpnumret och "18 ST" åt upp utrymmet. 230 ger fyra kolumner
   om 287 px, där vartenda ord ryms helt. En rad till, inga avstavningar. */
@media (min-width:861px){.landning-kategorier{grid-template-columns:repeat(auto-fill,minmax(230px,1fr))}}
.landning-kat[open]{grid-column:1/-1;border-color:var(--ink)}
.landning-kat{background:var(--surface);border:1px solid var(--line-2);border-radius:var(--r);box-shadow:var(--skugga-1);
  transition:border-color .12s,box-shadow .12s}
.landning-kat:hover{border-color:var(--ink);box-shadow:var(--skugga-2)}
.landning-kat>summary{list-style:none;cursor:pointer;padding:12px 14px;display:flex;align-items:center;gap:8px;
  font-family:var(--sans);font-size:13.5px;font-weight:700;text-transform:uppercase;letter-spacing:.01em;
  user-select:none}
.landning-kat>summary::-webkit-details-marker{display:none}
/* Löpnumret (01, 02 ...) i stället för en pil: en numrerad ruta läser som en
   post på en arbetsorder, och öppet kort visas genom att rutan fylls svart.
   Pseudoelement, aldrig DOM-text: landning.spec.js klickar getByText("Schakt &
   VA", {exact:true}), och ett nummer i spannet hade fällt det. */
.landning-kat>summary::before{counter-increment:kat;content:counter(kat,decimal-leading-zero);flex:none;
  font-family:var(--mono);font-size:var(--tx-etikett);font-weight:400;letter-spacing:.08em;line-height:1.2;
  color:var(--accent-deep);border:1px solid var(--line);border-radius:3px;padding:2px 5px;
  transition:background .12s,color .12s,border-color .12s}
.landning-kat[open]>summary::before,.landning-kat:hover>summary::before{background:var(--ink);color:var(--accent);border-color:var(--ink)}
/* Rubriken är ett flexbarn med min-width:auto, alltså kan den inte krympa under
   sitt längsta ORD. "PROJEKTLEDNING" är 118 px och kolumnen 159,7 px minus 28 px
   luft och 15 px pil: rubriken sprängde sin ruta och sköt "4 ST" 9 px utanför
   kortets kant (uppmätt 15,1 px vid 1024, 9,1 px vid 1280/1440/1600, 0 vid 390 px
   där rutnätet ger bredare kolumner). Sidan spillde inte i sidled, så mobilsvepet
   såg det aldrig, men på dator hängde antalet utanför den vita rutan.
   min-width:0 låter rubriken krympa, hyphens:auto bryter ordet på svenskt
   avstavningsställe (index.html har lang="sv") i stället för mitt i.
   flex-wrap:wrap fixade också spillet men kostade 98 px sidhöjd på dator och
   183 px på mobil, det här kostar 20 px respektive 0. */
.landning-kat>summary>span:first-of-type{min-width:0;hyphens:auto}
/* nowrap: "16 ST" bröts till två rader när löpnumret tog sin plats i kortet. */
.landning-kat-antal{margin-left:auto;font-family:var(--mono);font-size:var(--tx-etikett);color:var(--ink-3);white-space:nowrap}

/* ---- omgörningen 2026-08-27: färre avsnitt, tydligare ordning ---- */
/* Hopplänken: utanför skärmen tills den får fokus (top<0, inte left:-9999, så
   mobilsvepet hoppar över den som "ovanför vyn" i stället för att mäta den). */
.hopplank{position:absolute;top:-100px;left:8px;z-index:50;background:var(--accent);color:var(--ink);
  font-family:var(--mono);font-size:12.5px;letter-spacing:.08em;text-transform:uppercase;padding:12px 16px;
  border-radius:var(--r-sm);text-decoration:none;min-height:44px;display:inline-flex;align-items:center}
.hopplank:focus{top:8px;outline:2px solid var(--ink)}
.app-innehall:focus{outline:none}
/* Mastheadet: logotyp (div, inte h1), undertitel, och den ENDA Logga in-länken,
   44 px hög så den går att träffa på telefon. center i stället för baseline:
   en 44 px länk bredvid en 20 px logotyp ser annars ut att hänga. */
.landning .masthead{align-items:center;padding-top:4px;padding-bottom:4px}
.landning-loggain{margin-left:auto;color:var(--paper);font-family:var(--mono);font-size:12.5px;letter-spacing:.1em;
  text-transform:uppercase;text-decoration:none;display:inline-flex;align-items:center;min-height:44px;padding:0 6px;
  border-bottom:2px solid transparent}
.landning-loggain:hover{border-bottom-color:var(--accent)}
@media (max-width:640px){.landning .masthead .sub{display:none}}
/* Trygghetsraden under knapparna: mono, ett steg dämpad, ingen 24 px marginal. */
p.landning-trygg{font-family:var(--mono);font-size:12.5px;letter-spacing:.04em;color:#9aa39f;margin:0;max-width:none}
/* Sekundärknappen är en <button>, inte en länk: den scrollar, adressen rörs inte. */
.landning-hero button.btn{font-size:var(--tx-etikett)}
/* CTA-raderna efter exemplet och efter priset. */
.landning-cta{margin:14px 0 0}
.landning-cta .btn{text-decoration:none;display:inline-flex;align-items:center}
/* Flödesremsan: fem steg i rad på dator (.landning-steg auto-fit 220 ger fem
   kolumner vid 1180), två kolumner på telefon, bilden längst ned i kortet så
   texterna står på samma höjd. */
/* Under 640 visas stegen UTAN bilder: en 750 px bred prispanel i en 170 px
   kolumn är samma oläsbara text som det underkända mobilfyndet 2026-08-21
   (offertbilden i 348 px). Bilderna finns på dator, på telefon bär hjälten 3D:n
   och bevisavsnittet offertens mobilbeskärning. */
@media (max-width:640px){.landning-steg{grid-template-columns:1fr 1fr;gap:8px}.landning-steg li{padding:11px 12px}}
/* Fem i rad på dator, alltid: auto-fit 220 gav fyra plus en ensam på 1140 px. */
@media (min-width:861px){.landning-steg{grid-template-columns:repeat(5,1fr)}}
.landning-steg li{display:flex;flex-direction:column;gap:4px;min-width:0;border-color:var(--line)}
.landning-steg img,.landning-steg .landning-bild-plats{width:100%;height:auto;display:block;margin-top:auto;padding-top:8px;
  border-radius:var(--r-sm)}
.landning-steg img{border-top:1px solid var(--line-2);border-radius:0}
@media (max-width:640px){.landning-steg img,.landning-steg picture,.landning-steg .landning-bild-plats{display:none}}
/* Pristabellen: rubrik vänster, belopp höger i mono. Founding-raden gulmarkerad. */
.landning-pris{max-width:600px}
/* Tabellen och villkoren sida vid sida på dator: högerhalvan stod tom
   (granskning 2026-08-27, 1440 px). Under 861 staplas de som förut. */
@media (min-width:861px){
  .landning-prisrad{display:grid;grid-template-columns:minmax(0,600px) minmax(0,1fr);gap:28px;align-items:start}
  .landning-prisrad .landning-fortroende{margin:0;padding-top:4px}
}
.landning-pristabell{width:100%;border-collapse:collapse;font-size:14px}
.landning-pristabell caption{text-align:left;padding:10px 14px;font-family:var(--mono);font-size:var(--tx-etikett);
  letter-spacing:.1em;text-transform:uppercase;color:var(--ink-2);border-bottom:1px solid var(--line-2)}
.landning-pristabell th,.landning-pristabell td{padding:10px 14px;border-bottom:1px solid var(--line-2);text-align:left;font-weight:400;
  vertical-align:top}
.landning-pristabell td{text-align:right;font-family:var(--mono);white-space:nowrap;font-variant-numeric:tabular-nums}
.landning-pris-tot th,.landning-pris-tot td{font-weight:700;color:var(--ink);border-top:2px solid var(--ink)}
.landning-pris-founding th,.landning-pris-founding td{background:rgba(242,183,5,.16);color:var(--accent-deep);font-weight:700}
.landning-pris-fot{margin:0;padding:10px 14px}
/* Fem populära verktyg som mörka kort, ingen länk (verktygen kräver konto). */
.landning-populara{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:10px;margin-bottom:14px}
/* Åtta bildkort: fyra i bredd på dator ger två jämna rader (auto-fill gav 6+2). */
@media (min-width:861px){.landning-populara{grid-template-columns:repeat(4,1fr)}}
/* 3D-vyn i bevisets vänsterspalt. */
.landning-bevis-3d{margin:16px 0 0;background:var(--surface);border:1px solid var(--line-2);border-radius:var(--r);overflow:hidden;box-shadow:var(--skugga-1)}
.landning-bevis-3d img{width:100%;height:auto;display:block}
.landning-bevis-3d figcaption{font-size:12.5px;color:var(--ink-2);padding:8px 12px;border-top:1px solid var(--line-2)}
/* Hjälten tonas in vid laddning: texten först, bilden strax efter. */
@keyframes landning-in{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
.landning-hero-grid>div:first-child{animation:landning-in .55s ease both}
.landning-hero-bilder{animation:landning-in .65s .15s ease both}
@media (prefers-reduced-motion:reduce){.landning-hero-grid>div:first-child,.landning-hero-bilder{animation:none}}
/* Bildkort sedan 2026-08-27: verktygets egen 3D-vy (verktyg-<kod>.webp) över
   namn och pris. Bilden zoomar svagt vid hovring. */
.landning-popular{background:var(--ink);color:var(--paper);border-radius:var(--r);padding:0;display:flex;flex-direction:column;gap:0;overflow:hidden;
  box-shadow:var(--skugga-1);transition:transform .15s,box-shadow .15s}
.landning-popular:hover{transform:translateY(-2px);box-shadow:var(--skugga-2)}
/* height:auto uttryckligen: img bär width/height-attribut (mot layoutskutt),
   och attributhöjden 405 hade annars vunnit över aspect-ratio. */
.landning-popular img{display:block;width:100%;height:auto;aspect-ratio:16/9;object-fit:cover;transition:transform .4s ease}
.landning-popular:hover img{transform:scale(1.05)}
.landning-popular>div{padding:11px 14px 12px;display:flex;flex-direction:column;gap:3px;border-top:2px solid var(--accent)}
.landning-popular b{font-family:var(--sans);font-size:14.5px;text-transform:uppercase;letter-spacing:.01em;color:var(--accent)}
.landning-popular span{font-family:var(--mono);font-size:12px;letter-spacing:.04em;color:#c9cfcb}
/* Två i bredd på telefon (auto-fill 180 ger en pelare på 358 px). Efter
   auto-fill-regeln i filen, annars vinner den. */
@media (max-width:640px){.landning-populara{grid-template-columns:1fr 1fr;gap:8px}}
/* Förtroenderaderna och guidelänken: länkar som ska gå att träffa på telefon. */
.landning-fortroende{max-width:68ch;margin-top:10px}
.landning-fortroende a,.landning-support a,.landning-alla-guider{color:var(--accent-deep);display:inline-flex;align-items:center;min-height:44px}
.landning-alla-guider{font-family:var(--mono);font-size:12.5px;letter-spacing:.08em;text-transform:uppercase;text-decoration:none;
  border-bottom:2px solid var(--accent-deep)}
.landning-kat .landning-verktyg{padding:0 14px 14px}

/* Mobil: sidan är lång, och varje sektion kostar mer relativt sett här än på
   skrivbordet, för allt som ligger i två eller fyra kolumner där ligger i en
   kolumn här. Reglerna nedan tar bort höjd utan att ta bort besked.
   Uppmätt sidhöjd vid 390 px: 6 216 px före omgörningen, 5 344 px efter. */
@media (max-width:640px){
  /* Hjälten: sidopaddingen 16 här, höjdmåtten sätts i 860-regeln ovan
     (hjälte under 700 px, bilden inom första skärmen). */
  .landning-hero{padding-left:16px;padding-right:16px}
  /* Offertbilden byter till mobilbeskärningen, se .bild-mobil ovan. */
  .landning-bevis-bild .bild-hel{display:none}
  .landning-bevis-bild .bild-mobil{display:block}
  .hub h2,.landning .hub>h2{margin-top:26px}
  .card .pad{padding:11px}
  .cols{gap:8px}
  .landning-fakta li{padding-bottom:5px}
  .landning-kategorier{gap:7px}
  /* Fotlänkarna Integritet och Villkor mätte 42 px. Mobilsvepets golv är 40, så
     de passerade provet, men uppdragets krav är 44. inline-flex + min-height,
     inte padding: 12 px text plus padding hade gett en 29 px hög rad som ser
     ut att vara fixad. Samma mönster som .appnav a och .masthead h1 a. */
  .landning-fot a{display:inline-flex;align-items:center;min-height:44px;padding:0 6px}
  /* min-height: summary står inte i mobilsvepets väljarlista (button, a, input …)
     så provet mätte den aldrig, men den trycks med tumme som allt annat. 9 px
     padding runt 12,5 px text gav 33 px hög träffyta. */
  .landning-kat>summary{padding:9px 11px;font-size:12.5px;min-height:44px}
  .landning-guide{padding:11px 12px}
}
.auth-yta + p a:hover{text-decoration:underline}

/* ---------- Mönsterritaren ----------
   Två spalter på skärm, en på telefon. Fälten är avsiktligt stora: målgruppen
   står ofta i en bil med handskar på, inte vid ett skrivbord. */
.monster-rad{display:grid;grid-template-columns:minmax(0,340px) minmax(0,1fr);gap:14px;align-items:start}
.monster-in{display:flex;flex-direction:column;gap:4px;margin-top:10px}
.monster-in>span{font-size:12px;font-weight:700;color:#5d6b65}
.monster-in input,.monster-in select{padding:11px 10px;font-size:16px;border:1px solid #c3cbc6;border-radius:8px;background:#fff;min-width:0}
.monster-grupp{border:1px solid #dde3df;border-radius:10px;padding:6px 12px 14px;margin-top:14px}
.monster-grupp legend{font-size:12px;font-weight:800;letter-spacing:.4px;color:#3c4a44;padding:0 6px}
.monster-tva{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.monster-forval{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}
.monster-duk{overflow:auto;border:1px solid #c8cfcb;border-radius:8px;background:#eceee9}
.monster-duk svg{display:block;max-width:100%;height:auto}
.monster-tal{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:8px;margin:12px 0 0}
.monster-tal>div{background:#f3f5f2;border-radius:8px;padding:8px 10px}
.monster-tal dt{font-size:var(--tx-etikett);font-weight:700;color:#5d6b65;margin:0}
.monster-tal dd{margin:2px 0 0;font-size:19px;font-weight:800;color:#20302b}
.monster-status{margin:10px 0 0;font-weight:700;color:#2b6146}
.monster-egna ul{list-style:none;margin:8px 0 0;padding:0}
.monster-egna li{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:10px 0;border-top:1px solid #e4e9e6}
.monster-knappar{margin-left:auto;display:flex;gap:6px}
@media(max-width:820px){.monster-rad{grid-template-columns:minmax(0,1fr)}}
.monster-jamkad{background:#eef5ef;border-left:3px solid #4f8f68;padding:8px 10px;border-radius:6px;margin-top:10px}

/* ---------- Inloggning och registrering på telefon ----------
   De här två sidorna är det FÖRSTA en ny kund ser, och de såg minst ut av
   allt: visa-lösenordet 10 px och 25 px hög, "Ny kund? Skapa konto" 13 px hög
   träffyta, loggan 27 px. Sidorna har egna klasser (.auth-*) som mobilblocket
   längre upp aldrig nådde.

   44 px är målytan, 12 px textgolvet, samma mått som resten av appen mäts mot
   i e2e/mobil.spec.js. */
@media (max-width:840px){
  /* Väljarna måste vara minst lika specifika som .auth-yta .masthead .logo a
     (rad ~807), som sätter display:inline och därmed nollar varje höjdregel.
     En mindre specifik regel förlorar tyst, och sidan ser ut att vara fixad
     medan träffytan är kvar på 16 px. */
  .auth-yta a,.auth-yta button,.auth-villkor a,.auth-yta + p a{font-size:12.5px}
  .auth-pwtoggle{font-size:12.5px;min-height:44px;min-width:56px;padding:0 12px}
  .auth-yta .masthead .logo a{display:inline-flex;align-items:center;min-height:44px}
  .auth-yta a.mini,.auth-yta + p a,.auth-btnrow a,.auth-btnrow button{
    min-height:44px;min-block-size:44px;display:inline-flex;align-items:center}
  .auth-nykund a{min-height:44px;display:inline-flex;align-items:center}
  .apptopp h1 a,.apptopp .logo a{min-height:44px;display:inline-flex;align-items:center}
  /* Villkors- och integritetssidorna är ren löptext med små länkar i. */
  .brev a,.brev-fin{font-size:12.5px}
}

/* ==========================================================================
   MOBILEN. Ett block, två saker: läsbar text och träffbara ytor.

   Textstorleken kommer ur --tx-etikett, alltså EN rad. Träffytorna måste
   fortfarande sättas per element, för höjd ärvs inte.

   Golvet är 12 px text och 44 px träffyta, mätt av e2e/mobil.spec.js på en
   390 px skärm. Skrivbordet rörs inte: allt ligger under 841 px. */
@media (max-width:840px){
  :root{--tx-etikett:12px}
  body{font-size:15px}
  /* SIDLEDSSPÄRR. Appens rotelement blev 402 px brett på en 390 px skärm, och
     hela sidan gick att dra i sidled. Ett enskilt brett barn räckte för att
     dra ut roten, och att jaga varje sådant barn är ett arbete utan slut:
     nästa tabell eller långa ord skapar ett nytt.

     Spärren sitter därför på roten. Innehåll som MÅSTE vara brett (menyn,
     flikraden, breda tabeller) har redan egen overflow-x:auto och scrollar
     inuti sig själva, precis som avsett. Det som saknar den scrollar inte
     längre ut hela sidan, det klipps mot kanten. */
  /* clip, inte hidden: hidden gör #root till en rullbehållare och då slutar
     position:sticky fungera för allt inuti (mastheadet stannade kvar högst upp
     på sidan på mobil, 2026-08-27). clip spärrar sidledsrullning lika hårt
     men skapar ingen rullbehållare. */
  #root,body>div{max-width:100%;overflow-x:clip}
  /* Långa ord och URL:er bryts i stället för att spränga sin behållare. */
  p,td,th,li,.hint,.fine{overflow-wrap:anywhere}
  th{letter-spacing:.04em}
  .btn,.mini,.seg button,.tabs button,.appnav a,.apptopp .konto>button,
  a.tillbaka,.guidsida a,.guidrad a{
    min-height:44px;display:inline-flex;align-items:center;justify-content:center}
  .check,.row label:has(>input[type=checkbox]),.hubkort,.hubkort-hylsa a{min-height:44px}
  input[type=checkbox],input[type=radio]{width:22px;height:22px}
  /* Filväljaren ritas av webbläsaren och blir 21 px hög. Den går att träffa,
     men knappt, och den används för att ladda upp firmalogotypen. */
  input[type=file]{min-height:44px;width:100%}
  main p a:not(.btn):not(.mini),.brev a:not(.btn):not(.mini),.card .pad a:not(.btn):not(.mini){padding:6px 0}
  /* Länkar mitt i en mening (".. finns i butiken", ".. under
     Företagsinställningar") ärver radhöjden och blir 16 px höga. De ska gå att
     träffa utan att raden hoppar isär: padding uppåt och nedåt räcker, och
     line-height håller ihop stycket. */
  /* 13 px padding, inte 11: med 11 landade länkarna på 39 px och missade
     40-golvet med en pixel. En pixel spelar ingen roll för ögat och all roll
     för tummen, och ett golv som nästan nås är inget golv. */
  /* 14 px, inte 13: med 13 landade de på 39,6 px som avrundas till 40 i
     rapporten men underkänns i mätningen. Marginal i stället för precis. */
  p a:not(.btn):not(.mini),li a:not(.btn):not(.mini),td a:not(.btn):not(.mini),.hint a:not(.btn):not(.mini),.brev a:not(.btn):not(.mini){display:inline-flex;align-items:center;min-height:44px;padding:12px 0;line-height:1.2}
  /* Villkorsraden under inloggningen har egen, tätare typografi. */
  .auth-villkor,.auth-villkor a{line-height:1.5}
  /* Villkorslänkarna ligger i en <label> tillsammans med kryssrutan, och
     labelns line-height klämmer dem till 31 px. Höj deras egen radhöjd i
     stället för att slåss med förälderns. */
  .auth-villkor a,.auth-villkor label a{display:inline-flex;align-items:center;min-height:44px;padding:10px 0;line-height:1.5}
  /* Guidernas innehållsförteckning: länkar i en lista, 33 px. */
  .guidmeny a,.guidsida nav a,.kortfot a{min-height:44px;display:inline-flex;align-items:center}
  /* Guidelänkarna i noterna ("Kapskolan ›") är 17 px höga och sitter mitt i en
     varningstext, alltså precis där man vill trycka när något ser fel ut. */
  .notguide,.note a{display:inline-flex;align-items:center;min-height:44px;padding:0 2px}
  /* "Resurser"-länken i packlistan och liknande länkar i kortens brödtext. */
  .card .pad a,.card p a{min-height:44px}
  .admin-ge-rattighet input,.admin-ge-rattighet select,.admin-ge-rattighet textarea,
  .admin .card textarea{min-height:44px}
}

/* Sidunika ytor ovanpå det gemensamma undersidesystemet. Ligger sist så de
   vinner över äldre, breda .hubgrid- och iframe-regler utan !important. */
.guide-start-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin-bottom:28px}
.guide-start-grid>a{position:relative;display:flex;flex-direction:column;min-height:150px;padding:16px 16px 15px;
  border:1px solid var(--line);border-top:3px solid var(--ink);background:var(--surface);color:var(--ink);text-decoration:none;
  box-shadow:var(--skugga-1);transition:transform .14s,border-color .14s}
.guide-start-grid>a:hover{transform:translateY(-2px);border-top-color:var(--accent-deep)}
.guide-start-grid span{font-family:var(--mono);font-size:10px;letter-spacing:.1em;color:var(--accent-deep)}
.guide-start-grid b{margin-top:14px;font-family:var(--sans);font-size:17px;text-transform:uppercase}
.guide-start-grid small{margin-top:5px;font-size:12px;line-height:1.45;color:var(--ink-2)}

.pb-flode{display:grid;grid-template-columns:repeat(3,1fr);list-style:none;margin:0 0 22px;padding:0;
  border:1px solid var(--line);background:var(--surface)}
.pb-flode li{padding:14px 16px;min-width:0}
.pb-flode li+li{border-left:1px solid var(--line-2)}
.pb-flode span{display:block;font-family:var(--mono);font-size:10px;color:var(--accent-deep);letter-spacing:.1em}
.pb-flode b{display:block;margin-top:7px;font-family:var(--sans);font-size:14px;text-transform:uppercase}
.pb-flode small{display:block;margin-top:2px;color:var(--ink-3);font-size:11px}

.tomtskiss-sida{height:calc(100vh - 92px);min-height:620px;display:flex;flex-direction:column;background:#eef0ea}
.tomtskiss-hjalp{display:flex;align-items:center;justify-content:center;gap:0;background:#f7f8f4;border-bottom:1px solid var(--line)}
.tomtskiss-hjalp span{padding:9px 18px;font-family:var(--mono);font-size:10px;text-transform:uppercase;color:var(--ink-2)}
.tomtskiss-hjalp span+span{border-left:1px solid var(--line)}
.tomtskiss-hjalp b{color:var(--accent-deep);margin-right:7px}

/* Butiken blir en produktkatalog, inte en följd av identiska formulärkort. */
.butikkort{position:relative;overflow:hidden;border-radius:0;border-color:#d4d9d0;transition:transform .14s,box-shadow .14s,border-color .14s}
.butikkort::before{content:"";position:absolute;inset:0 auto 0 0;width:3px;background:transparent;transition:background .14s}
.butikkort:hover{transform:translateY(-2px);box-shadow:var(--skugga-2);border-color:#b9bfb4}
.butikkort:hover::before{background:var(--accent)}
.butikkort .pad{height:100%;padding:17px}
.butikkort .prisrad-kort{margin-top:auto;padding-top:10px}
.admin-prisinfo{margin:0 0 12px;border-left:3px solid var(--accent);background:#f7f8f4;box-shadow:var(--skugga-1)}
.admin-prisinfo summary{position:relative;cursor:pointer;list-style:none;padding:12px 42px 12px 14px;font-family:var(--mono);
  font-size:11px;letter-spacing:.07em;text-transform:uppercase;color:var(--ink-2)}
.admin-prisinfo summary::-webkit-details-marker{display:none}
.admin-prisinfo summary::after{content:"+";position:absolute;right:14px;top:50%;transform:translateY(-50%);font-size:18px;color:var(--accent-deep)}
.admin-prisinfo[open] summary::after{content:"−"}
.admin-prisinfo p{max-width:78ch;margin:0;padding:0 14px 14px;color:var(--ink-2);font-size:12.5px;line-height:1.55}
.admin-prisverktyg{overflow:clip}
.admin-prisverktygsrad{display:grid;grid-template-columns:minmax(260px,1fr) auto auto;align-items:end;gap:12px;margin-bottom:14px}
.admin-prissok{display:flex;flex-direction:column;gap:5px;min-width:0;font-family:var(--mono);font-size:10px;
  letter-spacing:.08em;text-transform:uppercase;color:var(--ink-3)}
.admin-prissok input[type=search]{width:100%;min-height:42px;text-align:left}
.admin-prisfilter{display:flex;border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden}
.admin-prisfilter button{min-height:42px;padding:7px 12px;border:0;border-right:1px solid var(--line);background:var(--surface);
  color:var(--ink-2);cursor:pointer;font-family:var(--mono);font-size:10px;letter-spacing:.06em;text-transform:uppercase}
.admin-prisfilter button:last-child{border-right:0}
.admin-prisfilter button[aria-pressed=true]{background:var(--ink);color:var(--accent)}
.admin-pristraff{min-width:66px;padding-bottom:7px;font-family:var(--sans);font-size:21px;line-height:1;text-align:right}
.admin-pristraff span{font-family:var(--mono);font-size:10px;font-weight:400;color:var(--ink-3)}
.admin-priskort-lista{display:none}
.admin-prisspara{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:14px}
.admin-prissparstatus{display:grid;gap:5px;min-width:0}
.admin-prissparstatus>strong{font-size:14px;line-height:1.4}
.admin-prisandrad{background:#fffae8}
.admin-andradmarke{display:inline-block;margin-left:7px;padding:2px 5px;border:1px solid #d8bb54;border-radius:3px;font-size:11px;color:#685008}
.admin-priskort.admin-prisandrad::before{background:var(--accent-deep)}
.admin-prisspara .hint{max-width:52ch}

@media (max-width:840px){
  .guide-start-grid{grid-template-columns:1fr;gap:8px}
  .guide-start-grid>a{min-height:0}
  .guide-start-grid span,.pb-flode span,.pb-flode small,.tomtskiss-hjalp span{font-size:12px}
  .pb-flode{grid-template-columns:1fr}
  .pb-flode li{display:grid;grid-template-columns:34px 1fr;gap:1px 8px;padding:11px 13px}
  .pb-flode li+li{border-left:0;border-top:1px solid var(--line-2)}
  .pb-flode span{grid-row:1/3;align-self:center}
  .pb-flode b,.pb-flode small{grid-column:2}
  .tomtskiss-sida{height:auto;min-height:calc(100vh - 98px)}
  .tomtskiss-hjalp{justify-content:flex-start;overflow-x:auto}
  .tomtskiss-hjalp span{flex:none;min-height:44px;display:inline-flex;align-items:center;padding:8px 13px}
  .butikkort .pad{padding:15px}
  .admin-pristabell{display:none}
  .admin-prisinfo summary{min-height:44px;display:flex;align-items:center;font-size:12px}
  .admin-prisinfo p{font-size:13px}
  .admin-prisverktyg{margin-left:-1px;margin-right:-1px;border-radius:3px;overflow:visible}
  .admin-prisverktyg>.pad{padding:12px}
  .admin-prisverktygsrad{grid-template-columns:1fr auto;gap:10px;margin-bottom:12px}
  .admin-prissok{grid-column:1/-1;font-size:12px}
  .admin-prissok input[type=search]{width:100%;min-height:48px;padding-left:13px;font-size:16px}
  .admin-prisfilter{min-width:0;grid-column:1/-1;display:grid;grid-template-columns:repeat(4,minmax(0,1fr))}
  .admin-prisfilter button{min-height:44px;padding:7px 5px;font-size:12px}
  .admin-pristraff{align-self:center;min-width:56px;padding:0;font-size:22px}
  .admin-pristraff span{display:block;margin-top:3px;font-size:12px}
  .admin-priskort-lista{display:grid;gap:7px}
  .admin-priskort{position:relative;border:1px solid var(--line);background:var(--surface);box-shadow:0 1px 2px rgba(20,24,26,.04)}
  .admin-priskort::before{content:"";position:absolute;inset:-1px auto -1px -1px;width:3px;background:#9ca49e}
  .admin-priskort.oppet{border-color:#a7aa9f;box-shadow:0 8px 22px rgba(20,24,26,.11)}
  .admin-priskort.oppet::before{background:var(--accent)}
  .admin-priskort-summary{display:grid;grid-template-columns:minmax(0,1fr) auto 22px;align-items:center;gap:9px;width:100%;
    min-height:70px;padding:10px 9px 10px 13px;border:0;background:transparent;color:var(--ink);cursor:pointer;text-align:left}
  .admin-priskort-summary:focus-visible{outline:3px solid var(--accent-deep);outline-offset:-3px}
  .admin-priskort-identitet{min-width:0}
  .admin-priskort-identitet b{display:block;overflow:hidden;font-family:var(--sans);font-size:15px;line-height:1.12;
    text-overflow:ellipsis;white-space:nowrap}
  .admin-priskort-identitet small{display:block;overflow:hidden;margin-top:5px;font-family:var(--mono);font-size:12px;
    color:var(--ink-3);text-overflow:ellipsis;white-space:nowrap}
  .admin-priskort-status{display:flex;flex-direction:column;align-items:stretch;gap:4px}
  .admin-priskort-status>span{min-width:70px;padding:2px 5px;border:1px solid #d7dbd3;background:#f5f6f2;font-family:var(--mono);
    font-size:12px;line-height:1.3;text-align:center;text-transform:uppercase;color:var(--ink-3);white-space:nowrap}
  .admin-priskort-status>span.aktiv{border-color:#d6aa1e;background:#fff6d3;color:#665000}
  .admin-priskort-pil{position:relative;width:22px;height:22px}
  .admin-priskort-pil::before,.admin-priskort-pil::after{content:"";position:absolute;left:5px;top:10px;width:12px;height:1.5px;background:var(--ink)}
  .admin-priskort-pil::after{transform:rotate(90deg);transition:transform .15s}
  .admin-priskort-summary[aria-expanded=true] .admin-priskort-pil::after{transform:rotate(0)}
  .admin-priskort-panel{border-top:2px solid var(--ink);background:#f7f8f4}
  .admin-priskort fieldset{min-width:0;margin:0;padding:14px;border:0}
  .admin-priskort fieldset+fieldset{border-top:1px solid var(--line)}
  .admin-priskort legend{display:flex;align-items:baseline;justify-content:space-between;gap:10px;width:100%;padding:0;
    font-family:var(--mono);text-transform:uppercase}
  .admin-priskort legend span{font-size:12px;font-weight:700;color:var(--ink)}
  .admin-priskort legend small{font-size:11px;color:var(--ink-3)}
  .admin-priskort fieldset>label:not(.check){display:grid;grid-template-columns:1fr minmax(110px,136px);align-items:center;gap:12px;
    margin-top:11px;font-size:13px;color:var(--ink-2)}
  .admin-priskort input[type=number]{display:block;width:100%;min-height:46px;margin:0;font-size:17px;font-weight:700}
  .admin-priskort .check{align-items:center;margin:8px 0 0;font-size:13px}
  .admin-pris-visaalla{min-height:48px;border:1px dashed #aeb5aa;background:#f7f8f4;color:var(--ink-2);cursor:pointer;
    font-family:var(--mono);font-size:12px;letter-spacing:.05em;text-transform:uppercase}
  .admin-pris-visaalla:hover{border-color:var(--accent-deep);color:var(--ink)}
  .admin-pristomt{padding:22px 14px}
  .admin-pristomt p{margin-bottom:0}
  .admin-prisspara{position:sticky;bottom:0;z-index:10;display:grid;grid-template-columns:1fr;gap:9px;margin:12px -12px -12px;
    padding:10px 12px max(10px,env(safe-area-inset-bottom));border-top:1px solid #343a37;background:rgba(20,24,26,.97);
    box-shadow:0 -7px 18px rgba(20,24,26,.16)}
  .admin-prisspara .btn{width:100%}
  .admin-prissparstatus{color:#fff}
  .admin-prissparstatus .fel{color:#ffc8b8}
  .admin-prisspara .hint{align-self:center;max-width:52ch;color:#c1c8c3;font-size:12px;line-height:1.3}
}

/* Sista mobilgolvet ligger sist med avsikt: de sidunika blocken ovanför har
   egna desktopstorlekar och får annars högre kaskadprioritet än det gemensamma
   12/44-golvet. */
@media (max-width:840px){
  .butik-omrade,.pb-val small,.verktygshubb-svephjalp{font-size:12px}
  textarea[aria-label^="Svar på ärende"]{min-height:44px}
}

/* ---------- global orientering: snabbsökning och mobilens tumrad ----------
   En kalkyl ska gå att nå från vilken arbetsyta som helst utan att användaren
   först måste gå hem. På skrivbordet är sökningen synlig i toppbaren och nås
   med Ctrl/Cmd+K; på telefon ligger de fyra vanligaste flödena inom tummens
   räckvidd. Själva verktygssidan undantas i App.jsx eftersom slutpriset redan
   äger nederkanten där. */
.app-sokknapp{display:inline-flex;align-items:center;gap:8px;min-height:38px;margin-left:5px;padding:6px 9px;
  border:1px solid #3a423e;border-radius:var(--r-sm);background:#1b2022;color:#c9cfcb;cursor:pointer;
  font-family:var(--mono);font-size:10px;letter-spacing:.06em;text-transform:uppercase}
.app-sokknapp svg{flex:none}
.app-sokknapp kbd{margin-left:4px;padding:2px 5px;border:1px solid #47504c;border-radius:3px;background:#101416;
  color:#8f9894;font:9px/1.2 var(--mono);letter-spacing:0;text-transform:none}
.app-sokknapp:hover,.app-sokknapp:focus-visible{border-color:var(--accent);color:var(--accent);outline:none}
.appdock{display:none}

.snabbsok-dialog{width:min(680px,calc(100vw - 32px));max-width:none;max-height:min(760px,calc(100dvh - 48px));
  margin:auto;padding:0;border:0;border-radius:14px;background:var(--surface);color:var(--ink);box-shadow:0 24px 90px rgba(5,8,9,.42);overflow:hidden}
.snabbsok-dialog::backdrop{background:rgba(10,14,15,.74);backdrop-filter:blur(4px)}
.snabbsok-yta{display:flex;max-height:inherit;flex-direction:column;overflow:hidden}
.snabbsok-huvud{display:flex;align-items:center;justify-content:space-between;gap:18px;padding:20px 22px 15px;
  border-bottom:1px solid #303735;background:var(--ink);color:#f3f4f0}
.snabbsok-huvud span{display:block;margin-bottom:4px;color:var(--accent);font:10px/1.2 var(--mono);letter-spacing:.1em;text-transform:uppercase}
.snabbsok-huvud h2{margin:0;font:700 26px/1 var(--sans);letter-spacing:.02em;text-transform:uppercase}
.snabbsok-huvud button{display:grid;place-items:center;flex:none;width:44px;height:44px;padding:0;border:1px solid #47504c;
  border-radius:50%;background:transparent;color:#c9cfcb;cursor:pointer;font-size:25px;line-height:1}
.snabbsok-huvud button:hover,.snabbsok-huvud button:focus-visible{border-color:var(--accent);color:var(--accent);outline:none}
.snabbsok-falt{position:relative;display:flex;align-items:center;margin:16px 18px 8px}
.snabbsok-falt>span{position:absolute;left:15px;z-index:1;color:var(--ink-3);font-size:24px;line-height:1;transform:rotate(-18deg)}
.snabbsok-falt input{width:100%;min-height:54px;padding:12px 78px 12px 46px;border:2px solid var(--ink);border-radius:9px;
  background:#fff;text-align:left;font-family:inherit;font-size:16px;line-height:1.3;color:var(--ink);box-shadow:none}
.snabbsok-falt input:focus{border-color:var(--accent-deep);box-shadow:var(--ring)}
.snabbsok-falt>button{position:absolute;right:7px;min-height:40px;padding:0 10px;border:0;border-radius:5px;background:#eef0ea;
  color:var(--ink-2);cursor:pointer;font:10px var(--mono);letter-spacing:.06em;text-transform:uppercase}
.snabbsok-resultat{min-height:180px;padding:4px 18px 18px;overflow-y:auto;overscroll-behavior:contain}
.snabbsok-resultat section+section{margin-top:18px}
.snabbsok-resultat h3{margin:10px 0 7px;color:var(--ink-3);font:10px/1.2 var(--mono);letter-spacing:.11em;text-transform:uppercase}
.snabbsok-lista{display:grid;grid-template-columns:1fr 1fr;border:1px solid var(--line);border-radius:9px;overflow:hidden;background:#fff}
.snabbsok-lista a{display:flex;align-items:center;justify-content:space-between;gap:12px;min-width:0;min-height:68px;padding:11px 13px;
  border-bottom:1px solid var(--line-2);color:var(--ink);text-decoration:none}
.snabbsok-lista a:nth-child(odd){border-right:1px solid var(--line-2)}
.snabbsok-lista a:nth-last-child(-n+2){border-bottom:0}
.snabbsok-lista a:hover,.snabbsok-lista a:focus-visible{position:relative;z-index:1;background:#fff7d9;outline:2px solid var(--accent-deep);outline-offset:-2px}
.snabbsok-lista a>span{min-width:0}
.snabbsok-lista b{display:block;overflow:hidden;font-family:var(--sans);font-size:15px;line-height:1.15;text-overflow:ellipsis;white-space:nowrap}
.snabbsok-lista small{display:block;overflow:hidden;margin-top:4px;color:var(--ink-3);font-size:11px;line-height:1.3;text-overflow:ellipsis;white-space:nowrap}
.snabbsok-lista i{flex:none;color:var(--accent-deep);font:normal 12px var(--mono);white-space:nowrap}
.snabbsok-laddar{margin:14px 0 0;padding:12px;border-left:3px solid var(--line);color:var(--ink-3);font-size:12px}
.snabbsok-visaalla{width:100%;min-height:44px;margin-top:8px;padding:10px;border:1px solid var(--line);border-radius:var(--r-sm);background:#f7f8f3;color:var(--ink);cursor:pointer;font:600 14px var(--sans)}
.snabbsok-tomt{display:grid;gap:5px;margin-top:10px;padding:28px 18px;border:1px dashed var(--line);background:#f7f8f4;text-align:center}
.snabbsok-tomt b{font-family:var(--sans);font-size:17px}.snabbsok-tomt span{color:var(--ink-3);font-size:12px}
.snabbsok-fot{display:flex;justify-content:space-between;gap:12px;padding:9px 18px;border-top:1px solid var(--line-2);background:#f5f6f2;
  color:var(--ink-3);font:10px var(--mono);letter-spacing:.03em}
.snabbsok-fot kbd{display:inline-block;padding:2px 5px;border:1px solid var(--line);border-bottom-width:2px;border-radius:3px;background:#fff;color:var(--ink-2);font:inherit}

@media (max-width:700px){
  .app-sokknapp{order:2;width:44px;min-width:44px;height:44px;margin-left:auto;padding:0;justify-content:center}
  .app-sokknapp span,.app-sokknapp kbd{display:none}
  .mobilmenyknapp{order:3}.apptopp .konto{order:4;margin-left:0}
  .apptopp:has(.appnav-oppen) .appdock{display:none}
  .appdock{position:fixed;left:0;right:0;bottom:0;z-index:28;display:grid;grid-template-columns:repeat(5,1fr);
    min-height:64px;padding-bottom:env(safe-area-inset-bottom);border-top:1px solid #343b38;background:rgba(20,24,26,.98);
    box-shadow:0 -5px 20px rgba(20,24,26,.2)}
  .appdock a,.appdock button{display:flex;min-width:0;min-height:64px;flex-direction:column;align-items:center;justify-content:center;gap:3px;
    padding:5px 2px;border:0;border-right:1px solid #2b3230;background:transparent;color:#9aa39f;text-decoration:none;
    cursor:pointer;font:12px/1.1 var(--mono);letter-spacing:.02em}
  .appdock>:last-child{border-right:0}
  .appdock svg{width:19px;height:19px}
  /* Etiketten är ett enda obrytbart ord i en 64 px cell. Cellen har redan
     min-width:0, så det är spannet som spiller: vid 200 % textstorlek blir ordet
     ~90 px och lägger sig omlott med grannens etikett. Låt det bryta i stället. */
  .appdock a>span,.appdock button>span{overflow-wrap:anywhere;text-align:center}
  .appdock a:hover,.appdock button:hover,
  .appdock a[aria-current=page]{background:#202628;color:var(--accent);outline:none;box-shadow:inset 0 3px var(--accent)}
  /* Fokus låg tidigare i samma regel som aktuell flik, med outline:none. Att tabba
     till fliken för den sida man redan står på gav då noll synlig förändring.
     outline-offset:-3px ritar ringen innanför kanten så tumradens fasta läge inte
     klipper den. #f2b705 mot #202628 ger 8,44:1, långt över kravet 3:1. */
  .appdock a:focus-visible,.appdock button:focus-visible{background:#202628;color:var(--accent);
    outline:3px solid var(--accent);outline-offset:-3px;box-shadow:inset 0 3px var(--accent)}
  .apptopp:has(.appdock)~.app-innehall{padding-bottom:calc(70px + env(safe-area-inset-bottom))}
  .apptopp:has(.appdock)~.app-innehall .admin-prisspara{bottom:calc(64px + env(safe-area-inset-bottom))}

  .snabbsok-dialog{width:100%;max-height:86dvh;margin:auto 0 0;border-radius:17px 17px 0 0}
  .snabbsok-huvud{padding:16px 16px 13px}.snabbsok-huvud h2{font-size:23px}
  .snabbsok-falt{margin:13px 12px 6px}.snabbsok-falt input{min-height:56px;font-size:16px}
  .snabbsok-resultat{padding:4px 12px calc(16px + env(safe-area-inset-bottom))}
  .snabbsok-lista{grid-template-columns:1fr}
  .snabbsok-lista a:nth-child(n){min-height:64px;border-right:0;border-bottom:1px solid var(--line-2)}
  .snabbsok-lista a:last-child{border-bottom:0}
  .snabbsok-lista b{font-size:16px}.snabbsok-lista small{font-size:12px}
  .snabbsok-fot{display:none}
}

/* På 320–360 px finns sökningen redan mitt i tumraden. Ta bort den dubbla
   toppikonen där så logotyp, Meny och Konto aldrig tvingas utanför skärmen. */
@media (max-width:360px){
  .apptopp:has(.appdock) .app-sokknapp{display:none}
  .apptopp:not(:has(.appdock)) .mobilmenyknapp{width:44px;min-width:44px;padding:0;overflow:hidden;font-size:0;gap:0}
}

@media print{.app-sokknapp,.appdock,.snabbsok-dialog{display:none!important}}

/* Projekt: ett läsbart arbetsflöde utan att dölja offertens kontrollpunkter. */
.projekt-vagvisare{display:flex;justify-content:space-between;align-items:center;gap:24px;padding:16px 24px;
  border-bottom:1px solid var(--line);background:#f7f8f3}
.projekt-vagvisare nav{display:flex;gap:8px;flex-wrap:wrap}
.projekt-vagvisare nav button{display:flex;align-items:center;gap:8px;min-height:46px;padding:9px 13px;
  border:1px solid var(--line);border-radius:var(--r-sm);background:white;color:var(--ink);cursor:pointer;font:600 14px var(--sans)}
.projekt-vagvisare nav button:hover,.projekt-vagvisare nav button:focus-visible{border-color:var(--accent-deep);background:#fff7d9;outline:2px solid var(--accent);outline-offset:2px}
.projekt-vagvisare nav button>span{display:grid;place-items:center;width:23px;height:23px;flex:none;border-radius:50%;background:var(--ink);color:var(--accent);font:12px var(--mono)}
.projekt-vagvisare nav small{font:11px var(--mono);color:var(--ink-3)}
.projekt-snabbtotal{display:grid;gap:2px;text-align:right;min-width:0}
.projekt-snabbtotal>span{font-size:12px;color:var(--ink-2)}
.projekt-snabbtotal>b{font:700 22px/1.2 var(--sans);overflow-wrap:anywhere}
.projekt-snabbtotal>small{font:11px var(--mono);color:var(--warn)}
.projekt-shell [tabindex="-1"]{scroll-margin-top:20px}
.projekt-shell [tabindex="-1"]:focus{outline:2px solid var(--accent-deep);outline-offset:-2px}
.projekt-start{padding:16px;background:#f7f8f3;border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:var(--r-sm)}
.projekt-start>b{font:700 22px var(--sans)}
.projekt-start p{font-size:13px;color:var(--ink-2);margin:8px 0 16px}
.projekt-start .btn{min-height:44px;display:inline-flex;align-items:center}
.projekt-overfort{margin-bottom:16px;padding:13px;border-left:3px solid var(--accent-deep);background:#fff9e1}
.projekt-overfort>b{display:block;line-height:1.4}
.projekt-overfort>p{margin:6px 0 10px;font-size:13px;line-height:1.5}
.projekt-textknapp{display:block;min-height:44px;margin-top:5px;padding:6px 0;border:0;background:none;color:var(--accent-deep);font:inherit;text-align:left;text-decoration:underline;text-underline-offset:3px;cursor:pointer}
.projekt-kundkort .row{align-items:flex-start;flex-direction:column;gap:5px;margin:12px 0}
.projekt-kundkort .row input,.projekt-kundkort .row select{flex:none;width:100%;min-height:44px;text-align:left}
.projekt-kundkort .row label{flex:none}
.projekt-shell .pane-out>.card>table{display:table;width:100%;table-layout:fixed}
.projekt-shell .pane-out>.card>table td:first-child{overflow-wrap:anywhere}
.projekt-shell .pane-out>.card>table td.n{width:38%;white-space:normal;overflow-wrap:anywhere}
.projekt-offerthuvud{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px;padding:12px 14px;border-bottom:1px solid var(--line)}
.projekt-offerthuvud h3{margin:0;font:12px var(--mono);text-transform:uppercase;letter-spacing:.06em;color:var(--ink-2)}
.projekt-offerthuvud>div{display:flex;gap:6px;flex-wrap:wrap}
.projekt-sparyta{margin-top:20px;padding-top:16px;border-top:1px solid var(--line)}
.projekt-sparyta>.btn{width:100%;min-height:46px;white-space:normal}
.projekt-sparyta>.hint{margin:8px 0 0}
.projekt-osparat{margin:0 0 10px;padding-left:10px;border-left:3px solid var(--accent);font-size:12px;color:var(--ink-2)}
.projekt-sparbesked{padding:10px 12px;border-left:3px solid var(--ok);background:#eef7ef;color:#235737;font-size:13px}
.projekt-sparbesked.fel{border-color:var(--stop);background:#fff0ee;color:var(--stop)}
.projekt-kopierat{margin:12px 14px;padding:10px 12px;background:#f4f5ed;border-left:3px solid var(--accent);font-size:13px}
.projekt-kopierat{line-height:1.6}
.installning-prisprofil input{scroll-margin-top:96px}
.installning-prisprofil .falt-grans{flex-basis:100%;margin:4px 0 0}
.installning-ogiltig input{border-color:var(--warn);background:#fff9e9}
.konto-spara{position:sticky;bottom:12px;z-index:9;display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:16px -14px -14px;padding:12px 14px;background:#f7f8f3;border-top:1px solid var(--line);box-shadow:0 -3px 14px #14181a0d}
.konto-spara>p{flex:1 1 160px;margin:0;font-size:13px;font-weight:600}
.konto-spara button{min-height:44px}
@media(max-width:700px){
  .konto-spara{bottom:calc(64px + env(safe-area-inset-bottom));display:grid;grid-template-columns:1fr 1fr;margin:16px -12px -12px;padding:10px 12px}
  .konto-spara>p{grid-column:1/-1}
  .konto-spara button{white-space:normal;font-size:12px;padding:9px}
}
.projekt-delrad:has(input:checked){background:#fff9e6;box-shadow:inset 3px 0 var(--accent)}
.projekt-delrad>span{min-width:0;overflow-wrap:anywhere}
@media(max-width:1100px){
  .projekt-vagvisare{align-items:stretch;flex-direction:column;gap:12px}
  .projekt-snabbtotal{text-align:left}
}
@media(max-width:600px){
  .projekt-vagvisare{padding:14px 12px}
  .projekt-vagvisare nav{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px}
  .projekt-vagvisare nav button{flex-direction:column;gap:5px;padding:9px 4px;font-size:13px;text-align:center;line-height:1.25}
  .projekt-vagvisare nav small{display:none}
  .projekt-snabbtotal{border-top:1px solid var(--line);padding-top:10px}
  .projekt-snabbtotal>b{font-size:20px}
}

/* Arbetsytan: korta återvägar och kategoriurval som ryms i handen. */
.verktygshubb-senastelista{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:10px}
.verktygshubb-senastelista a{display:flex;align-items:center;gap:12px;min-width:0;padding:16px 14px;border:1px solid var(--line);border-radius:var(--r-sm);background:#fff;color:var(--ink);text-decoration:none;box-shadow:var(--skugga-1)}
.verktygshubb-senastelista a:hover,.verktygshubb-senastelista a:focus-visible{border-color:var(--accent-deep);background:#fff9e6;outline:2px solid var(--accent);outline-offset:2px}
.verktygshubb-senastelista a>span:nth-child(2){flex:1;min-width:0}
.verktygshubb-senastelista b{display:block;font:700 17px/1.2 var(--sans);overflow-wrap:anywhere}
.verktygshubb-senastelista small{display:block;margin-top:4px;font-size:12px;color:var(--ink-3)}
.verktygshubb-senastenummer{font:12px var(--mono);color:var(--accent-deep)}
.verktygshubb-kategorival{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:1px;background:var(--line)}
.verktygshubb-kategorival button:nth-child(n){border:0}
.verktygshubb-kategorimobil{display:none}
.verktygshubb-soklada input{font-size:16px}
.kalkylsok-bladdra{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;min-height:44px;margin-top:6px;padding:8px 0;border:0;background:transparent;color:var(--ink-2);cursor:pointer;font:12px var(--mono);text-align:left}
.kalkylsok-bladdra:hover{color:var(--accent-deep)}
.kalkylsok-bladdra>span{font-size:18px}
.grupp-steg{margin-top:18px;padding-top:12px;border-top:1px solid var(--line-2)}
.grupp-steg>span{display:block;margin-bottom:8px;font:12px var(--mono);color:var(--ink-3)}
.grupp-steg>div{display:flex;align-items:stretch;gap:8px}
.grupp-steg button{flex:1;min-width:0;min-height:48px;padding:10px 12px;border:1px solid var(--ink);border-radius:var(--r-sm);background:var(--ink);color:#fff;cursor:pointer;font:600 14px/1.3 var(--sans);text-align:left;overflow-wrap:anywhere}
.grupp-steg button small{display:block;margin-bottom:3px;color:var(--accent);font:12px var(--mono)}
.grupp-steg .grupp-foregaende{flex:0 1 auto;background:white;color:var(--ink-2);border-color:var(--line)}
/* Arbetsvyerna har egen navigering. Apphuvudet ska inte ligga ovanpå deras
   flikar, vilket tidigare gjorde första raden omöjlig att trycka på. */
.apptopp-arbetslage{position:relative}
.pb-sparstatus{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 16px;padding:12px 14px;border:1px solid var(--line);border-radius:var(--r-sm);background:#f8f9f5;color:var(--ink-2);font-size:13px}
.pb-sparstatus>span:first-child{font-weight:700;font-size:18px;color:var(--accent-deep)}
.pb-sparstatus.synkad>span:first-child{color:var(--ok)}
.pb-sparstatus.lokal{border-left:3px solid var(--warn)}
.pb-sparstatus.fel{border-left:3px solid var(--stop);background:#fff0ee;color:var(--stop)}
.pb-sparstatus button{margin-left:auto}
.efter-utfall{background:#f8f9f5}
.efter-utfall-huvud{display:grid;gap:3px;margin-bottom:15px;padding-left:12px;border-left:3px solid var(--accent)}
.efter-utfall-huvud>span{font:12px var(--mono);color:var(--ink-3)}
.efter-utfall-huvud>b{font:700 22px var(--sans);overflow-wrap:anywhere}
.efter-utfall-huvud>small{font-size:13px;color:var(--ink-2)}
.efter-momentrad{padding:12px 0;border-bottom:1px solid var(--line-2)}
.efter-utfall input[aria-invalid=true]{border:2px solid var(--stop);background:#fff3f1}
.efter-utfall-sparyta{margin-top:20px;padding:16px;background:white;border:1px solid var(--line);border-radius:var(--r-sm)}
.efter-utfall-summering{display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap}
.efter-utfall-summering>span{display:grid;gap:3px;color:var(--ink-3);font-size:12px}
.efter-utfall-summering b{color:var(--ink);font:700 22px var(--sans)}
.efter-sparbesked{padding:12px 14px;border-left:3px solid var(--ok);background:#eef7ef;color:#235737;font-size:13px}
.jobbrad>div:first-child>span{min-width:0;overflow-wrap:anywhere}
.jobbrad>div:first-child>button{flex:none;max-width:140px;white-space:normal}
.row.tal-utanfor{flex-wrap:wrap}
.falt-grans{flex:1 1 100%;margin:4px 0 0;padding:7px 9px;border-left:3px solid var(--warn);background:#fff8e5;color:#734100;font-size:12px;line-height:1.4}
.tal-utanfor input,.radcell input[aria-invalid=true]{border-color:var(--warn);background:#fffaf0}
.radval{display:block;min-width:0;margin-top:9px}
.radval>.lbl{display:block;margin-bottom:4px;color:var(--ink-2)}
.radkort .radval select{margin-top:0}
.kundbank-nyckeltal{display:grid;grid-template-columns:1fr 1fr 2fr;margin:0 0 22px;border:1px solid var(--line);border-radius:var(--r);background:white;overflow:hidden}
.kundbank-nyckeltal>div{min-width:0;padding:18px 20px;border-right:1px solid var(--line)}
.kundbank-nyckeltal>div:last-child{border-right:0}
.kundbank-nyckeltal dt{font:12px/1.3 var(--mono);color:var(--ink-3)}
.kundbank-nyckeltal dd{margin:6px 0 0;font:700 28px/1.2 var(--sans);overflow-wrap:anywhere}
.kundbank-register .kundbank-filter{grid-template-columns:minmax(0,1fr) minmax(180px,.45fr);align-items:end}
.kundbank-register .kundbank-filter select{width:100%;min-height:44px;font-size:14px}
.kundbank-kundkort{border-bottom:1px solid var(--line-2)}
.kundbank-kundrad{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:15px 0}
.kundbank-kundrad>span{min-width:0;overflow-wrap:anywhere}
.kundbank-kundrad b{font:700 19px var(--sans)}
.kundbank-kundrad .hint{margin-top:4px;line-height:1.6}
.kundbank-kundrad>button{flex:none;min-height:44px}
.kundbank-kundrad:has(button[aria-expanded=true])>button{background:var(--ink);color:var(--accent);border-color:var(--ink)}
.kundbank-kunddetalj{border-top:1px solid var(--line-2);padding:8px 0 10px;background:#fafbf8}
.kundbank-installning>summary{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:52px;padding:14px 16px;cursor:pointer;font:600 15px var(--sans)}
.kundbank-installning>summary::before{content:"+";color:var(--accent-deep);font:18px var(--mono)}
.kundbank-installning[open]>summary::before{content:"−"}
.kundbank-installning>summary small{margin-left:auto;color:var(--ink-3);font:12px var(--mono)}
.kundbank-installning[open]>summary{border-bottom:1px solid var(--line)}
@media(max-width:600px){
  .kundbank-nyckeltal{grid-template-columns:1fr 1fr;margin-bottom:16px}
  .kundbank-nyckeltal>div{padding:13px 16px}
  .kundbank-nyckeltal>div:nth-child(2){border-right:0}
  .kundbank-nyckeltal>div:last-child{grid-column:1/-1;border-top:1px solid var(--line)}
  .kundbank-nyckeltal dd{font-size:24px}
  .kundbank-register .kundbank-filter{grid-template-columns:1fr}
  .kundbank-register .kundbank-filter select{font-size:16px}
  .kundbank-installning>summary{flex-wrap:wrap}
  .kundbank-installning>summary small{flex-basis:100%;margin-left:24px}
}
@media(max-width:960px){
  .mobil-vyval{position:sticky;top:0;z-index:25;margin:0;padding:8px 12px;background:var(--paper);border:0;border-radius:0;box-shadow:0 2px 8px rgba(20,24,26,.1)}
  .mobil-vyval button{min-height:50px}
  .mobil-vyval~.shell .tabs{top:66px;scroll-margin-top:82px}
  /* Reservera läsyta även innan den lata ritmotorn har laddat. Annars klampar
     flikens scrollning mot den tillfälligt korta sidan och stannar vid råden. */
  .mobil-vyval~.shell #v-ritning:not([hidden]){min-height:calc(100svh - 140px)}
  .mobil-vyval~.shell .grp-toggle,.mobil-vyval~.shell .total{scroll-margin-top:82px}
  .resultat-nasta-knappar{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
  .resultat-nasta-knappar button,.resultat-nasta-knappar .projekt-lank{min-width:0;min-height:48px;white-space:normal}
}
@media(max-width:700px){
  .verktygshubb-hero{padding:20px 16px 0}
  .verktygshubb-hero-in{padding-bottom:18px}
  .verktygshubb-snabbval{grid-template-columns:1fr 1fr}
  .verktygshubb-snabbval a{gap:8px;padding:12px 10px;min-height:58px;border-bottom:1px solid #3a423e!important;border-right:1px solid #3a423e}
  .verktygshubb-snabbval a:nth-child(2n){border-right:0}
  .verktygshubb-snabbval a:nth-last-child(-n+2){border-bottom:0!important}
  .verktygshubb-snabbval-ikon{display:none}
  .verktygshubb-snabbval a small{font-size:12px;line-height:1.3}
  .verktygshubb-snabbval a.verktygshubb-snabbval-primar small{color:#51410a}
  .verktygshubb-innehall{padding-top:22px}
  .verktygshubb-sok{gap:10px;padding-bottom:22px}
  .verktygshubb-soklada input{padding-right:65px;font-size:16px}
  .verktygshubb-senaste,.verktygshubb-kategorier,.verktygshubb-aktivkategori,.verktygshubb-resultat{padding-top:24px}
  .verktygshubb-kategorival{display:none}
  .verktygshubb-kategorimobil{display:grid;gap:6px;font:12px var(--mono);color:var(--ink-2)}
  .verktygshubb-kategorimobil select{width:100%;min-height:50px;padding:10px 12px;background:white;color:var(--ink);font-size:16px;white-space:normal}
  .verktygshubb-senastelista{grid-template-columns:1fr;gap:8px}
  .verktygshubb-senastelista a{padding:12px 14px;min-height:68px}
}
