/*
 * FoderTorget — designsystem ovanpå Bootstrap 5.3.
 *
 * Schweizisk grafisk design / light brutalism:
 *   · noll rundade hörn, överallt
 *   · 1px svarta linjer grupperar innehåll — inga svävande kort med skuggor
 *   · grotesk i rubriker, monospace i etiketter och siffror
 *   · asymmetriskt rutnät, inte tre lika breda kort
 *
 * Nästan allt görs genom att skriva om Bootstraps egna CSS-variabler i stället
 * för att jaga selektorer med !important. Bootstrap 5.3 läser dem i runtime, så
 * en omdefinition på :root slår igenom i komponenter vi aldrig rör.
 *
 * Typsnitten är systemtypsnitt med flit. CSP förbjuder CDN, och Helvetica ÄR
 * den schweiziska grotesken — det autentiska valet är också det som inte kräver
 * en enda extra begäran.
 */

:root {
    /* --- Typografi ------------------------------------------------------ */
    --ft-grotesque: "Helvetica Neue", Helvetica, Inter, "Liberation Sans", Arial, sans-serif;
    --ft-mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas,
               "Liberation Mono", "DejaVu Sans Mono", monospace;

    --bs-font-sans-serif: var(--ft-grotesque);
    --bs-font-monospace: var(--ft-mono);
    --bs-body-font-family: var(--ft-grotesque);

    /* --- Färg ----------------------------------------------------------- */
    /*
     * Varje grundfärg finns i två former: en triplett och en färg byggd av den.
     * Det är inte dubbelarbete. Bootstrap 5.3 läser en rad värden som
     * rgba(var(--bs-*-rgb), α) — bland annat varje <a> och .text-body — och en
     * sådan variabel går inte att fylla med en hex. Tripletten är den enda
     * formen som når hela Bootstrap; hexen i kommentaren är för ögat.
     *
     * Mörkt läge skriver därför bara om tripletterna. Allt nedanför följer med
     * av sig självt, eftersom det bara pekar vidare.
     */
    --ft-ink-rgb: 17, 17, 17;              /* #111111 */
    --ft-paper-rgb: 255, 255, 255;         /* #ffffff */
    --ft-paper-alt-rgb: 244, 244, 242;     /* #f4f4f2 */
    --ft-muted-rgb: 107, 107, 107;         /* #6b6b6b */
    --ft-accent-rgb: 31, 122, 61;          /* #1f7a3d — vallgrönt, plattat */

    --ft-ink: rgb(var(--ft-ink-rgb));
    --ft-paper: rgb(var(--ft-paper-rgb));
    --ft-paper-alt: rgb(var(--ft-paper-alt-rgb));
    --ft-muted: rgb(var(--ft-muted-rgb));
    --ft-accent: rgb(var(--ft-accent-rgb));

    --ft-rule: #111111;
    /* Sekundär linje. Schweizisk typografi bygger på hierarki mellan linjer,
       inte på att varje linje skriker lika högt: #111 bär strukturen, hårlinjen
       delar innehåll inom den. Utan skillnaden blir uppslaget ett kalkylblad. */
    --ft-hairline: #d8d8d3;

    /*
     * Text som ligger PÅ en fylld yta. --ft-paper duger i båda lägena — vitt på
     * mörkgrönt när sidan är ljus, mörkgrönt på ljusgrönt när den är mörk — så
     * raden behöver aldrig skrivas om. Det var precis vad --ft-accent-ink lades
     * till för och sedan aldrig användes: knapparna skrev #fff rakt av, och i
     * mörkt läge blev det vit text på nästan vit botten.
     */
    --ft-accent-ink: var(--ft-paper);

    --ft-danger: #b91c1c;
    --ft-danger-ink: var(--ft-paper);

    /* Signalgult är samma gult i båda lägena — en varning ska väga lika tungt
       oavsett. Därför är dess text FAST mörk och inte --ft-ink, som vänder. */
    --ft-signal: #ffd200;
    --ft-signal-ink: #111111;

    /* --- Bootstraps ikoner, som ligger som data-URI:er -------------------- */
    /*
     * Fyra ikoner är SVG:er inbakade i Bootstrap-variabler. En url() kan inte
     * innehålla var(), så färgen måste ligga i strängen — och Bootstraps ljusa
     * varianter finns bara under [data-bs-theme=dark], ett attribut vi aldrig
     * sätter. Genom att lyfta hela url():en hit hamnar bilden i paletten
     * tillsammans med allt annat som vänder, i stället för i en regel som
     * någon måste minnas att spegla i båda mörka blocken.
     */
    --ft-select-chevron: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23111111' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
    /* Bocken och punkten ligger PÅ .form-check-input:checked, som fylls med
       --ft-ink. De ska alltså ha papperets färg, inte bläckets. */
    --ft-check-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e");
    --ft-radio-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23ffffff'/%3e%3c/svg%3e");
    --ft-toggler-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23111111' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
    --ft-close-filter: none;

    /* --- Lägesberoende värden som inte är färger -------------------------- */
    --ft-media-filter: saturate(.92);
    --ft-toggle-to-dark: inline-flex;
    --ft-toggle-to-light: none;

    color-scheme: light;

    --bs-body-color: var(--ft-ink);
    --bs-body-bg: var(--ft-paper);
    --bs-secondary-color: var(--ft-muted);
    --bs-border-color: var(--ft-rule);
    --bs-border-color-translucent: var(--ft-rule);
    --bs-border-width: 1px;
    --bs-emphasis-color: var(--ft-ink);
    --bs-link-color: var(--ft-ink);
    --bs-link-hover-color: var(--ft-accent);

    /* --- Bryggan till Bootstraps rgb-variabler ---------------------------- */
    /*
     * Raderna ovanför räcker inte, och det är hela orsaken till att kortens
     * rubriker en gång var oläsliga i mörkt läge. Bootstrap läser .text-body och
     * varje naken <a> som rgba(var(--bs-*-rgb), α) — de bryr sig alltså inte om
     * --bs-body-color, utan om --bs-body-color-rgb, som vi aldrig satte. Den
     * behöll då Bootstraps förval 33,37,41: mörkgrå text på mörkgrönt papper,
     * 1,16:1.
     *
     * Bootstraps egna mörka värden ligger uteslutande under [data-bs-theme=dark]
     * — det finns inte en enda prefers-color-scheme-regel i hela dist-filen. Att
     * sätta det attributet skulle därför bara laga läget "uttryckligt mörkt" och
     * lämna förvalet "följ systemet" trasigt, vilket är det läge de flesta ser.
     * Bryggan nedan är det enda som täcker alla tre lägena.
     */
    --bs-body-color-rgb: var(--ft-ink-rgb);
    --bs-body-bg-rgb: var(--ft-paper-rgb);
    --bs-emphasis-color-rgb: var(--ft-ink-rgb);
    --bs-secondary-color-rgb: var(--ft-muted-rgb);
    --bs-tertiary-color-rgb: var(--ft-muted-rgb);
    --bs-link-color-rgb: var(--ft-ink-rgb);
    --bs-link-hover-color-rgb: var(--ft-accent-rgb);

    /* .text-body-tertiary. Bootstraps förval är rgba(bläck, .5), som mot vitt
       blir #909294 och faller på 3,12:1 redan i ljust läge. Tertiär får därför
       samma ton som sekundär — det enda värdet som klarar AA i båda lägena. */
    --bs-tertiary-color: var(--ft-muted);

    /* Grå plattor: inaktiva fält, .pagination hover/disabled, .nav-tabs hover.
       Bootstraps #e9ecef/#f8f9fa vänder aldrig och lyser som hål i mörkt läge. */
    --bs-secondary-bg: var(--ft-paper-alt);
    --bs-secondary-bg-rgb: var(--ft-paper-alt-rgb);
    --bs-tertiary-bg: var(--ft-paper-alt);
    --bs-tertiary-bg-rgb: var(--ft-paper-alt-rgb);

    /* Formulärvalidering. .invalid-feedback finns på 19 ställen. */
    --bs-form-invalid-color: var(--ft-danger);
    --bs-form-invalid-border-color: var(--ft-danger);
    --bs-form-valid-color: var(--ft-accent);
    --bs-form-valid-border-color: var(--ft-accent);

    /* <mark>, både Bootstraps .mark och träffmarkeringen i .ft-snippet. */
    --bs-highlight-bg: var(--ft-signal);
    --bs-highlight-color: var(--ft-signal-ink);

    --bs-code-color: var(--ft-accent);

    /* --- Noll radie. Alla Bootstraps radievariabler, inte bara en. ------- */
    --bs-border-radius: 0;
    --bs-border-radius-sm: 0;
    --bs-border-radius-lg: 0;
    --bs-border-radius-xl: 0;
    --bs-border-radius-xxl: 0;
    --bs-border-radius-2xl: 0;
    --bs-border-radius-pill: 0;

    /* --- Inga skuggor --------------------------------------------------- */
    --bs-box-shadow: none;
    --bs-box-shadow-sm: none;
    --bs-box-shadow-lg: none;
    --bs-box-shadow-inset: none;
}

/* Bootstrap sätter radie direkt på ett fåtal ställen och via .rounded-*.
   Den här regeln är den enda globala hammaren i filen — allt annat är
   variabler — och den finns för att en enda kvarglömd rundning förstör hela
   uttrycket. */
*,
*::before,
*::after {
    border-radius: 0 !important;
}

/* Ett undantag, och bara ett: radioknappen behåller sin cirkel.
   Fyrkantig blir den omöjlig att skilja från en kryssruta, och skillnaden
   mellan "välj en" och "välj flera" är information, inte dekoration. */
.form-check-input[type="radio"] {
    border-radius: 50% !important;
}

/* Skuggor likaså: .shadow, .shadow-sm och .card fångas i ett svep. */
.shadow,
.shadow-sm,
.shadow-lg,
.card,
.dropdown-menu,
.offcanvas,
.modal-content {
    box-shadow: none !important;
}

body {
    background: var(--ft-paper);
    -webkit-font-smoothing: antialiased;
}

/* --- Rubriker: tät grotesk --------------------------------------------- */

h1, h2, h3, h4, h5, h6,
.h1, .h2, .h3, .h4, .h5, .h6,
.navbar-brand,
.display-1, .display-2, .display-3, .display-4, .display-5, .display-6 {
    font-family: var(--ft-grotesque);
    font-weight: 700;
    letter-spacing: -0.022em;
    line-height: 1.05;
    text-wrap: balance;
}

.display-5 {
    font-weight: 800;
    letter-spacing: -0.035em;
}

/* Ett schweiziskt manér som faktiskt bär funktion: versal monospace-etikett
   ovanför ett block talar om vad blocket är utan att ta rubrikens plats. */
.ft-eyebrow {
    font-family: var(--ft-mono);
    font-size: .6875rem;
    font-weight: 600;
    letter-spacing: .16em;
    text-transform: uppercase;
    color: var(--ft-muted);
    display: block;
    margin-bottom: .5rem;
}

.ft-rule-top {
    border-top: 1px solid var(--ft-rule);
    padding-top: .75rem;
}

/* --- Etiketter och siffror: monospace ---------------------------------- */

.badge,
.form-label,
.form-text,
.breadcrumb,
.nav-tabs .nav-link,
.pagination,
.table thead th,
.ft-meta {
    font-family: var(--ft-mono);
    letter-spacing: .02em;
}

.badge {
    font-size: .6875rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .08em;
    padding: .3em .55em;
    border: 1px solid var(--ft-rule);
    background: var(--ft-paper) !important;
    color: var(--ft-ink) !important;
}

/* Bootstraps text-bg-* fylls i igen, men platt och utan rundning.
   Varje färgpar går via tokens: en fast #fff här betyder vit text på nästan
   vit botten så fort --ft-ink vänder. text-bg-warning är den värsta av dem —
   den bär "väntar", "reserverad" och "behöver granskas". */
.badge.text-bg-success  { background: var(--ft-accent) !important; color: var(--ft-accent-ink) !important; border-color: var(--ft-accent); }
.badge.text-bg-dark     { background: var(--ft-ink) !important; color: var(--ft-paper) !important; }
.badge.text-bg-warning  { background: var(--ft-signal) !important; color: var(--ft-signal-ink) !important; }
.badge.text-bg-primary  { background: var(--ft-ink) !important; color: var(--ft-paper) !important; }
.badge.text-bg-info     { background: var(--ft-paper-alt) !important; color: var(--ft-ink) !important; }
.badge.text-bg-secondary{ background: var(--ft-paper-alt) !important; color: var(--ft-muted) !important; }
.badge.text-bg-light    { background: var(--ft-paper) !important; color: var(--ft-muted) !important; }

.form-label {
    font-size: .6875rem;
    font-weight: 600;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: var(--ft-ink);
    margin-bottom: .35rem;
}

.form-text {
    font-size: .75rem;
    color: var(--ft-muted);
}

/* Siffror ska stå i kolumn — priser och näringsvärden jämförs i blicken. */
.ft-num,
.table td,
.ft-nutrition-strip .ft-value {
    font-variant-numeric: tabular-nums;
    font-feature-settings: "tnum" 1;
}

/* --- Linjer i stället för kort ----------------------------------------- */

.card {
    border: 1px solid var(--ft-rule);
    background: var(--ft-paper);
}

/* Staplade kort får luft. Att klistra ihop dem gör sidan tätare än den behöver
   vara — pris och gård är två olika saker och ska läsas som två. */
.card + .card {
    margin-top: 1.5rem;
}

/* Där korten VERKLIGEN ska bilda en sammanhängande list — inkorgen — begärs det
   uttryckligen i stället för att gälla överallt. */
.ft-stack > .card + .card {
    margin-top: -1px;
}

.card-body {
    padding: 1.5rem;
}

.card-header {
    background: var(--ft-paper);
    border-bottom: 1px solid var(--ft-rule);
    font-family: var(--ft-mono);
    font-size: .6875rem;
    font-weight: 600;
    letter-spacing: .12em;
    text-transform: uppercase;
}

/* Avdelaren inne i ett kort är en hårlinje. Kortets egen ram bär strukturen;
   en lika svart linje mitt i den konkurrerar med ramen. */
hr {
    border-top: 1px solid var(--ft-hairline);
    opacity: 1;
}

/* --- Knappar ----------------------------------------------------------- */

.btn {
    font-family: var(--ft-mono);
    font-size: .75rem;
    font-weight: 600;
    letter-spacing: .1em;
    text-transform: uppercase;
    border: 1px solid var(--ft-rule);
    padding: .55rem 1.1rem;
    transition: none;          /* brutalism: ingen mjuk övergång */
}

.btn-lg { font-size: .8125rem; padding: .8rem 1.4rem; }
.btn-sm { font-size: .6875rem; padding: .35rem .7rem; }

/* Sajtens primära åtgärd: sök i hjälten, skicka förfrågan, publicera annons. */
.btn-success {
    background: var(--ft-accent);
    border-color: var(--ft-accent);
    color: var(--ft-accent-ink);
}

.btn-success:hover,
.btn-success:focus {
    background: var(--ft-ink);
    border-color: var(--ft-ink);
    color: var(--ft-paper);
}

.btn-dark { background: var(--ft-ink); border-color: var(--ft-ink); color: var(--ft-paper); }

.btn-outline-secondary,
.btn-outline-danger,
.btn-outline-light {
    background: var(--ft-paper);
    border-color: var(--ft-rule);
    color: var(--ft-ink);
}

/* :focus var inte med förut, så tangentbordsfokus på t.ex. Logga ut i menyn
   fick aldrig samma behandling som muspekaren. */
.btn-outline-secondary:hover,
.btn-outline-secondary:focus,
.btn-outline-light:hover,
.btn-outline-light:focus {
    background: var(--ft-ink);
    border-color: var(--ft-ink);
    color: var(--ft-paper);
}

.btn-outline-danger { color: var(--ft-danger); border-color: var(--ft-danger); }

.btn-outline-danger:hover,
.btn-outline-danger:focus {
    background: var(--ft-danger);
    border-color: var(--ft-danger);
    color: var(--ft-danger-ink);
}

.btn-danger {
    background: var(--ft-danger);
    border-color: var(--ft-danger);
    color: var(--ft-danger-ink);
}

/* Bootstraps egna #198754 når 3,94:1 mot mörkt papper. Används av tomma
   sökträffar, rollväljaren i registreringen och språkväxlaren. */
.btn-outline-success {
    background: var(--ft-paper);
    border-color: var(--ft-accent);
    color: var(--ft-accent);
}

.btn-outline-success:hover,
.btn-outline-success:focus,
.btn-check:checked + .btn-outline-success {
    background: var(--ft-accent);
    border-color: var(--ft-accent);
    color: var(--ft-accent-ink);
}

.btn:disabled,
.btn.disabled {
    background: var(--ft-paper-alt);
    border-color: var(--ft-rule);
    color: var(--ft-muted);
    opacity: 1;
}

/* --- Formulär ---------------------------------------------------------- */

.form-control,
.form-select {
    border: 1px solid var(--ft-rule);
    padding: .55rem .7rem;
    font-family: var(--ft-grotesque);
    background-color: var(--ft-paper);
}

/* Pilen i en <select> är en bakgrundsbild, inte ett element, så den flyter
   ovanpå texten om ingen lämnar plats åt den. Bootstrap reserverar 2.25rem
   till höger just därför — kortformen ovan skrev över den, och den längsta
   sorteringsetiketten hamnade under pilen. .form-select-sm minskar aldrig
   den högermarginalen, så ett värde räcker för båda storlekarna. */
.form-select {
    padding-right: 2.25rem;
}

/* Fokus som en ram, inte som ett sken. Glöden hör inte hemma här, men
   markeringen måste ändå vara omöjlig att missa för tangentbordsnavigering. */
.form-control:focus,
.form-select:focus,
.btn:focus-visible,
.form-check-input:focus,
a:focus-visible {
    outline: 2px solid var(--ft-accent);
    outline-offset: 1px;
    box-shadow: none !important;
    border-color: var(--ft-ink);
}

.form-check-input {
    border: 1px solid var(--ft-rule);
}

.form-check-input:checked {
    background-color: var(--ft-ink);
    border-color: var(--ft-ink);
}

.input-group-text {
    border: 1px solid var(--ft-rule);
    background: var(--ft-paper-alt);
    font-family: var(--ft-mono);
    font-size: .75rem;
}

/* --- Bootstraps ikoner ------------------------------------------------- */

/*
 * Fyra ikoner är inte CSS-färger utan SVG:er inbakade i variabler, och de
 * vände därför aldrig: pilen i varje <select> stod kvar i mörkgrått mot mörkt
 * papper, bocken i en ikryssad ruta var vit mot en nästan vit ruta, och krysset
 * som stänger en avisering var svart. Bilderna själva ligger i paletten; här
 * pekas de bara ut, så de här raderna behöver aldrig veta vilket läge det är.
 */
.form-select {
    --bs-form-select-bg-img: var(--ft-select-chevron);
}

.form-check-input:checked[type="checkbox"] {
    --bs-form-check-bg-image: var(--ft-check-image);
}

.form-check-input:checked[type="radio"] {
    --bs-form-check-bg-image: var(--ft-radio-image);
}

.btn-close {
    filter: var(--ft-close-filter);
}

/* --- Navigering -------------------------------------------------------- */

.navbar {
    border-bottom: 1px solid var(--ft-rule);
    background: var(--ft-paper) !important;
    padding-block: .85rem;

    /* Hamburgaren. Menyn bar tidigare data-bs-theme="dark", vilket tvingade
       Bootstrap att välja sin VITA ikon — mot den här vita menyraden. I ljust
       läge var knappen alltså osynlig, och fungerade bara i mörkt av misstag. */
    --bs-navbar-toggler-icon-bg: var(--ft-toggler-icon);
}

/* Ordmärket är grönt överallt, precis som i den smala auth-layouten (där det
   ligger som .text-success). --ft-accent och inte en fast hex: tonen vänder
   själv i mörkt läge, där #1f7a3d hade blivit för mörkt mot papperet. */
.navbar .navbar-brand,
.navbar .navbar-brand:hover,
.navbar .navbar-brand:focus {
    font-weight: 800;
    letter-spacing: -0.03em;
    font-size: 1.15rem;
    color: var(--ft-accent);
}

.navbar .nav-link {
    font-family: var(--ft-mono);
    font-size: .75rem;
    font-weight: 600;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: var(--ft-ink);
}

.navbar .nav-link:hover,
.navbar .nav-link:focus {
    color: var(--ft-accent);
}

.navbar .navbar-text {
    font-family: var(--ft-mono);
    font-size: .75rem;
    color: var(--ft-muted);
}

.navbar-toggler {
    border: 1px solid var(--ft-rule);
}

.nav-tabs {
    border-bottom: 1px solid var(--ft-rule);
}

.nav-tabs .nav-link {
    font-size: .6875rem;
    font-weight: 600;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: var(--ft-muted);
    border: 1px solid transparent;
    border-bottom: 0;
}

.nav-tabs .nav-link.active {
    color: var(--ft-ink);
    border-color: var(--ft-rule);
    border-bottom-color: var(--ft-paper);
}

/* --- Sidfot ------------------------------------------------------------ */

footer {
    border-top: 1px solid var(--ft-rule);
    background: var(--ft-paper);
}

/* --- Aviseringar ------------------------------------------------------- */

.alert {
    border: 1px solid var(--ft-rule);
    background: var(--ft-paper);
    color: var(--ft-ink);
    font-size: .9375rem;
}

.alert-success { border-left: 5px solid var(--ft-accent); }
.alert-danger  { border-left: 5px solid var(--ft-danger); }
.alert-warning { border-left: 5px solid var(--ft-signal); }
.alert-info,
.alert-light,
.alert-secondary { border-left: 5px solid var(--ft-ink); }

/* --- Tabeller ---------------------------------------------------------- */

.table {
    border-color: var(--ft-rule);
}

.table thead th {
    font-size: .6875rem;
    font-weight: 600;
    letter-spacing: .1em;
    text-transform: uppercase;
    border-bottom: 1px solid var(--ft-rule);
}

/* --- Asymmetriskt rutnät ----------------------------------------------- */

/*
 * Hjärtat i layouten. Ett schweiziskt uppslag är inte tre lika breda spalter
 * utan en bred huvudspalt mot en smal marginalspalt. Klasserna används på
 * start-, sök- och annonssidorna.
 */
/*
 * Rutnätet ligger i en .container, inte kant i kant mot fönstret. Linjer som
 * går ut i skärmkanten läser som ett kalkylblad; samma linjer med marginal
 * omkring sig läser som ett uppslag.
 *
 * Delningarna INNE i rutnätet är hårlinjer. Bara ytterkanterna får bära #111,
 * så det finns en hierarki att läsa i stället för ett jämntjockt galler.
 */
.ft-grid {
    display: grid;
    grid-template-columns: repeat(12, minmax(0, 1fr));
    gap: 0;
    border-top: 1px solid var(--ft-rule);
}

.ft-grid + .ft-grid {
    border-top: 1px solid var(--ft-hairline);
}

.ft-grid > * {
    grid-column: span 12;
    padding: 2.75rem 2rem 3rem;
    border-bottom: 1px solid var(--ft-hairline);
}

/* Nedersta raden avslutas mot luft, inte mot ännu en linje. */
.ft-grid:last-of-type > * {
    border-bottom: 0;
}

@media (min-width: 62em) {
    .ft-col-8 { grid-column: span 8; border-right: 1px solid var(--ft-hairline); }
    .ft-col-7 { grid-column: span 7; border-right: 1px solid var(--ft-hairline); }
    .ft-col-5 { grid-column: span 5; border-right: 1px solid var(--ft-hairline); }
    .ft-col-4 { grid-column: span 4; border-right: 1px solid var(--ft-hairline); }
    .ft-col-3 { grid-column: span 3; border-right: 1px solid var(--ft-hairline); }
    .ft-col-9 { grid-column: span 9; border-right: 1px solid var(--ft-hairline); }

    /* Sista cellen på varje rad ska inte ha en linje mot marginalen. */
    .ft-grid > :last-child { border-right: 0; }
}

@media (max-width: 61.99em) {
    .ft-grid > * { padding: 2rem 0 2.25rem; }
}

/* --- Ingångar per fodertyp (efter Hästnets kategorirad) ----------------- */

.ft-categories {
    display: flex;
    flex-wrap: wrap;
    gap: .5rem;
}

.ft-category {
    font-family: var(--ft-mono);
    font-size: .75rem;
    font-weight: 600;
    letter-spacing: .08em;
    text-transform: uppercase;
    padding: .6rem 1rem;
    border: 1px solid var(--ft-rule);
    color: var(--ft-ink);
    text-decoration: none;
    background: var(--ft-paper);
}

/* Bakgrunden blir bläck, alltså måste texten bli papper — inte #fff. I mörkt
   läge är bläcket nästan vitt, och en fast vit text försvann rakt in i det. */
.ft-category:hover,
.ft-category:focus {
    background: var(--ft-ink);
    color: var(--ft-paper);
}

/* --- Sektionsrubrik med linje ------------------------------------------ */

.ft-section-head {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: 1rem;
    border-bottom: 1px solid var(--ft-rule);
    padding-bottom: .6rem;
    margin-bottom: 1.5rem;
}

/* --- Näringsremsa ------------------------------------------------------- */

.ft-nutrition-strip {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    background: var(--ft-paper);
    border: 1px solid var(--ft-rule);
    overflow: hidden;
}

.ft-nutrition-strip > div {
    padding: .4rem .25rem;
    text-align: center;
    border-inline-end: 1px solid var(--ft-rule);
}

.ft-nutrition-strip > div:last-child {
    border-inline-end: 0;
}

.ft-nutrition-strip .ft-value {
    font-family: var(--ft-mono);
    font-weight: 700;
    font-size: .875rem;
    line-height: 1.1;
}

.ft-nutrition-strip .ft-label {
    font-family: var(--ft-mono);
    font-size: .625rem;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: var(--ft-muted);
}

.ft-nutrition-strip--empty {
    align-items: center;
    /* text-align, inte bara justify-content: texten är ett naket textnod-barn i
       ett rutnät, alltså ett anonymt rutnätsobjekt. justify-content centrerar
       SPÅRET i behållaren, och spåret är redan 1fr — det fyller hela bredden
       och rubriken hamnade därför till vänster i det. */
    justify-content: center;
    text-align: center;
    grid-template-columns: 1fr;
    color: var(--ft-muted);
    font-family: var(--ft-mono);
    font-size: .6875rem;
    letter-spacing: .08em;
    text-transform: uppercase;
    min-height: 3.1rem;
}

/* --- Annonskort --------------------------------------------------------- */

.ft-card-media {
    aspect-ratio: 4 / 3;
    object-fit: cover;
    width: 100%;
    background: var(--ft-paper-alt);
    border-bottom: 1px solid var(--ft-rule);
    filter: var(--ft-media-filter);
}

.ft-card-badges {
    position: absolute;
    top: 0;
    inset-inline-start: 0;
    display: flex;
    flex-wrap: wrap;
    gap: 0;
}

.ft-card-badges .badge {
    border-inline-start: 0;
    border-top: 0;
}

/* --- Filtersidopanel ---------------------------------------------------- */

.ft-filter-group + .ft-filter-group {
    margin-top: 1.25rem;
    padding-top: 1.25rem;
    border-top: 1px solid var(--ft-rule);
}

.ft-filter-nutrition {
    background: var(--ft-paper-alt);
    border: 1px solid var(--ft-rule);
    padding: 1rem;
}

.ft-preset-chip {
    font-size: .6875rem;
}

/* --- Analysgranskning --------------------------------------------------- */

.ft-confidence {
    font-family: var(--ft-mono);
    font-size: .6875rem;
    font-weight: 600;
    letter-spacing: .06em;
    text-transform: uppercase;
    padding: .1rem .4rem;
    border: 1px solid var(--ft-rule);
    white-space: nowrap;
}

.ft-confidence--high { background: var(--ft-accent); color: var(--ft-accent-ink); }
.ft-confidence--mid  { background: var(--ft-signal); color: var(--ft-signal-ink); }
.ft-confidence--low  { background: var(--ft-danger); color: var(--ft-danger-ink); }

.ft-snippet {
    font-family: var(--ft-mono);
    font-size: .75rem;
    color: var(--ft-ink);
    background: var(--ft-paper-alt);
    border-left: 3px solid var(--ft-rule);
    padding: .35rem .5rem;
    word-break: break-word;
}

.ft-snippet mark {
    background: var(--ft-signal);
    color: var(--ft-signal-ink);
    padding: 0 .1rem;
}

/* --- Listor ------------------------------------------------------------- */

.list-group-item {
    border-color: var(--ft-rule);
    background: var(--ft-paper);
}

.list-group-item-action:hover {
    background: var(--ft-paper-alt);
}

/* --- Diverse Bootstrap-toner som bryter uttrycket ----------------------- */

.bg-success-subtle,
.bg-light,
.bg-body-tertiary { background: var(--ft-paper-alt) !important; }

.text-body-secondary { color: var(--ft-muted) !important; }
.text-success { color: var(--ft-accent) !important; }

.breadcrumb {
    font-size: .6875rem;
    letter-spacing: .08em;
    text-transform: uppercase;
}

/* Aktiv sida i pagineringen är Bootstrap-blå med vit text: 3,68:1, underkänt
   i BÅDA lägena. Inte ett mörkerfel — ett fel som bara aldrig mättes. */
.pagination {
    --bs-pagination-active-color: var(--ft-paper);
    --bs-pagination-active-bg: var(--ft-ink);
    --bs-pagination-active-border-color: var(--ft-ink);
}

.min-w-0 { min-width: 0; }

/* --- Söksidan: 3/9 delat av en linje ------------------------------------ */

@media (min-width: 62em) {
    .ft-split > aside {
        border-right: 1px solid var(--ft-rule);
        padding-right: 1.5rem;
    }

    .ft-split > :last-child {
        padding-left: 1.5rem;
    }
}

/*
 * Resultatnätet. Korten står kant i kant och delar sina linjer i stället för
 * att sväva var för sig — negativa marginaler gör att två 1px-ramar blir en.
 */
.ft-mesh > [class*="col-"] {
    padding: .5rem;
}

/* ========================================================================== */
/* Mörkt läge                                                                 */
/*                                                                            */
/* Tre lägen: uttryckligt ljust, uttryckligt mörkt, och "följ systemet".       */
/* Det sista är standard och görs helt i CSS — servern skriver inget           */
/* data-theme alls då. Ingen inline-JS behövs för att undvika blinkning, och   */
/* därmed behöver CSP:n inte luckras upp med 'unsafe-inline'.                  */
/*                                                                            */
/* DE TVÅ BLOCKEN NEDAN MÅSTE VARA IDENTISKA. Selektorerna går inte att slå    */
/* ihop — den ena måste ligga i en mediefråga, och CSS kan inte lyfta en       */
/* selektor ur en sådan. Två block är alltså golvet. Det som INTE är           */
/* oundvikligt är att de tillåts glida isär, och det var precis vad som hände: */
/* .badge.text-bg-dark lappades på båda ställena medan .btn-success:hover och  */
/* .ft-category:hover glömdes, och blev vit text på nästan vit botten.         */
/* `bin/console theme:check` jämför numera blocken tecken för tecken.          */
/*                                                                            */
/* Därför står här bara --ft-*. Inga --bs-*, inga selektorer, inga regler:     */
/* allt annat i filen läser dessa och vänder av sig självt.                    */
/* ========================================================================== */

@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) {
        --ft-ink-rgb: 238, 243, 236;       /* #eef3ec */
        --ft-paper-rgb: 15, 26, 19;        /* #0f1a13 */
        --ft-paper-alt-rgb: 22, 38, 27;    /* #16261b */
        --ft-muted-rgb: 157, 176, 163;     /* #9db0a3 */
        --ft-accent-rgb: 63, 169, 100;     /* #3fa964 */

        --ft-rule: #e3ebe1;
        --ft-hairline: #2c4033;
        --ft-danger: #f2635c;

        --ft-select-chevron: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23eef3ec' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
        --ft-check-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%230f1a13' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e");
        --ft-radio-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%230f1a13'/%3e%3c/svg%3e");
        --ft-toggler-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23eef3ec' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
        --ft-close-filter: invert(1) grayscale(100%) brightness(200%);

        --ft-media-filter: saturate(.85) brightness(.85);
        --ft-toggle-to-dark: none;
        --ft-toggle-to-light: inline-flex;

        color-scheme: dark;
    }
}

:root[data-theme="dark"] {
    --ft-ink-rgb: 238, 243, 236;       /* #eef3ec */
    --ft-paper-rgb: 15, 26, 19;        /* #0f1a13 */
    --ft-paper-alt-rgb: 22, 38, 27;    /* #16261b */
    --ft-muted-rgb: 157, 176, 163;     /* #9db0a3 */
    --ft-accent-rgb: 63, 169, 100;     /* #3fa964 */

    --ft-rule: #e3ebe1;
    --ft-hairline: #2c4033;
    --ft-danger: #f2635c;

    --ft-select-chevron: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23eef3ec' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
    --ft-check-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%230f1a13' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e");
    --ft-radio-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%230f1a13'/%3e%3c/svg%3e");
    --ft-toggler-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23eef3ec' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
    --ft-close-filter: invert(1) grayscale(100%) brightness(200%);

    --ft-media-filter: saturate(.85) brightness(.85);
    --ft-toggle-to-dark: none;
    --ft-toggle-to-light: inline-flex;

    color-scheme: dark;
}

/* --- Sol/måne-växlaren -------------------------------------------------- */

/*
 * Två knappar i samma formulär, där CSS visar den som är relevant. Det låter
 * växlaren fungera även i läget "följ systemet", där servern omöjligt kan veta
 * vad operativsystemet svarat — mediefrågan vet, och den får bestämma.
 */
.ft-theme-toggle {
    display: inline-flex;
}

.ft-theme-toggle button {
    display: none;
    border: 1px solid var(--ft-rule);
    background: transparent;
    color: var(--ft-ink);
    padding: .35rem .55rem;
    line-height: 1;
    cursor: pointer;
}

.ft-theme-toggle button:hover,
.ft-theme-toggle button:focus-visible {
    background: var(--ft-ink);
    color: var(--ft-paper);
}

/*
 * Vilken av de två knapparna som syns är ett lägesberoende värde som alla
 * andra, så det ligger i paletten. Förut krävdes fyra selektorblock för samma
 * sak — ett per läge, plus ett för "uttryckligt ljust" som bara upprepade
 * förvalet. Specificiteten (0,2,0) slår .ft-theme-toggle button ovan.
 */
.ft-theme-toggle [data-to="dark"]  { display: var(--ft-toggle-to-dark); }
.ft-theme-toggle [data-to="light"] { display: var(--ft-toggle-to-light); }

/* --- Klasser i stället för style-attribut ------------------------------- */

/*
 * Varje regel här ersätter ett inline style="". CSP:n tillåter inte
 * 'unsafe-inline' för stilar, och ett enda kvarglömt attribut skulle antingen
 * sluta fungera eller tvinga fram en uppluckrad policy för hela sajten.
 */

/*
 * Hoppa till innehållet. Ligger först i <body> och syns bara när den har
 * fokus — den ska inte kosta något visuellt för den som inte behöver den.
 * clip-vägen i stället för display:none: en gömd länk måste ändå gå att nå
 * med tangentbord, och display:none tar bort den ur tabbordningen.
 */
.ft-skip-link {
    position: absolute;
    inset-inline-start: -9999px;
    top: 0;
    z-index: 1080;
    padding: .6rem 1rem;
    background: var(--ft-ink);
    color: var(--ft-paper);
    font-family: var(--ft-mono);
    font-size: .75rem;
    font-weight: 600;
    letter-spacing: .1em;
    text-transform: uppercase;
    text-decoration: none;
}

.ft-skip-link:focus {
    inset-inline-start: 0;
    color: var(--ft-paper);
}

/* Målet får fokus programmatiskt via tabindex="-1"; ingen ram behövs där. */
main:focus {
    outline: none;
}

/*
 * Bootstrap animerar karusell, offcanvas och collapse. Den som bett systemet
 * om mindre rörelse ska inte få den ändå.
 */
@media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
        animation-duration: .001ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: .001ms !important;
        scroll-behavior: auto !important;
    }
}

.ft-preserve-lines {
    white-space: pre-wrap;
}

.ft-photo-4x3 {
    aspect-ratio: 4 / 3;
    object-fit: cover;
}

.ft-measure {
    max-width: 32rem;
}

.ft-pdf-frame {
    width: 100%;
    height: 78vh;
    border: 1px solid var(--ft-rule);
}
