/*
Theme Name: Temporary Planet
Theme URI: https://temporaryplanet.dk
Description: Child theme til Storefront. Retningen "Værkstedet": mørk baggrund så produktfotoet er det eneste der lyser. Al CSS skrevet fra nul; Storefronts eget stylesheet er afmeldt i functions.php.
Author: Temporary Planet
Template: storefront
Version: 0.8.5
Requires PHP: 8.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: temporaryplanet
*/

/* ==========================================================================
   Skrifterne — selvhostede

   Laa paa fonts.googleapis.com indtil 17/9. To grunde til at flytte dem:

   1. JURA. Et opslag paa Googles fontserver sender den besoegendes IP-adresse
      til Google ved HVERT sidevisning, foer der er spurgt om noget. Det er en
      overfoersel af personoplysninger til en tredjepart, og den kan ikke
      komme efter et samtykke, fordi skriften skal bruges med det samme.
      Selvhostet findes problemet ikke -- filerne ligger paa vores egen server,
      og der er intet at give samtykke til.

   2. FART. To ekstra domaener (googleapis + gstatic) betyder to gange DNS,
      TLS og et CSS-svar der selv skal parses, foer den foerste fontfil
      overhovedet bliver bedt om. Nu er der ét hop til en fil vi selv ligger
      med.

   Kun latin og latin-ext er hentet. unicode-range betyder at latin-ext-filen
   foerst hentes hvis der faktisk staar et tegn i den -- dansk bruger den
   aldrig, saa den koster ingenting i praksis.

   Filerne opdateres ikke af sig selv laengere. Skal et snit skiftes, hentes
   woff2-filen fra fonts.googleapis.com med en moderne User-Agent og laegges
   i assets/fonts/.
   ========================================================================== */

@font-face {
	font-family: 'Anton';
	font-style: normal;
	font-weight: 400;
	font-display: swap;
	src: url('assets/fonts/anton-400-latin-ext.woff2') format('woff2');
	unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
	font-family: 'Anton';
	font-style: normal;
	font-weight: 400;
	font-display: swap;
	src: url('assets/fonts/anton-400-latin.woff2') format('woff2');
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
	font-family: 'Barlow';
	font-style: normal;
	font-weight: 400;
	font-display: swap;
	src: url('assets/fonts/barlow-400-latin-ext.woff2') format('woff2');
	unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
	font-family: 'Barlow';
	font-style: normal;
	font-weight: 400;
	font-display: swap;
	src: url('assets/fonts/barlow-400-latin.woff2') format('woff2');
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
	font-family: 'Barlow';
	font-style: normal;
	font-weight: 500;
	font-display: swap;
	src: url('assets/fonts/barlow-500-latin-ext.woff2') format('woff2');
	unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
	font-family: 'Barlow';
	font-style: normal;
	font-weight: 500;
	font-display: swap;
	src: url('assets/fonts/barlow-500-latin.woff2') format('woff2');
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
	font-family: 'Barlow';
	font-style: normal;
	font-weight: 600;
	font-display: swap;
	src: url('assets/fonts/barlow-600-latin-ext.woff2') format('woff2');
	unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
	font-family: 'Barlow';
	font-style: normal;
	font-weight: 600;
	font-display: swap;
	src: url('assets/fonts/barlow-600-latin.woff2') format('woff2');
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
	font-family: 'Barlow';
	font-style: normal;
	font-weight: 700;
	font-display: swap;
	src: url('assets/fonts/barlow-700-latin-ext.woff2') format('woff2');
	unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
	font-family: 'Barlow';
	font-style: normal;
	font-weight: 700;
	font-display: swap;
	src: url('assets/fonts/barlow-700-latin.woff2') format('woff2');
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* ==========================================================================
   Tokens — Værkstedet
   Mørkt hobbybord. Fotoet lyser, alt andet træder tilbage. Messing som eneste
   accent, fordi den findes i emnet: umalet metal, gamle Citadel-æsker.
   ========================================================================== */

:root {
	--bund:        #141416;   /* primersort */
	--flade:       #1d1e21;   /* kort og paneler */
	--flade-dyb:   #0e0f10;   /* bag fotoet, så motivet står frit */
	--kant:        #2c2e32;
	--kant-staerk: #3d4045;
	--felt:        #292b2f;   /* inputfelter -- et trin lysere end --flade */

	--ink:         #e8e6e2;
	--daempet:     #a09c94;
	--svag:        #83807a;

	/* Navigationens tekst. Lysere end --daempet, som forsvandt i baandet,
	   men ikke helt hvid: hvid er reserveret til hover. Samme vaerdi for
	   kategorier OG genveje -- ellers ser baandet ud som to systemer. */
	--nav-ink:     #cbc8c2;

	--messing:     #c8a24a;
	--messing-dyb: #8a6f2f;
	--rust:        #b2543a;

	/* Messingsystemets tre sidste led. De stod som raa vaerdier 36 steder i
	   fire filer indtil 18/9 -- #17140c sytten gange, #d9b45c seksten --
	   saa en aendring af knapfarven skulle laves 36 steder for ikke at
	   splitte sig. */
	--messing-lys:  #d9b45c;              /* messing paa hover */
	--paa-messing:  #17140c;              /* tekst paa messing */
	--messing-tint: rgba(200, 162, 74, .08); /* antydning bag konturknapper */

	/* Overgangen paa alt der reagerer paa musen. Maalt 18/9: praecis ÉN
	   kontrol paa hele sitet havde en overgang (cookieikonet i footeren);
	   alle andre skiftede farve i ét spring. Ikke fordi det var valgt --
	   fordi den aldrig blev skrevet. */
	--overgang: .15s ease;

	/* Sperring paa versaler. Foer stod der otte vaerdier -- .04 .05 .06 .07
	   .08 .12 .13 .14 -- hvor halvdelen ikke kan skelnes fra naboen ved 13
	   px. Fire trin, og hvert af dem har en rolle. */
	--sp-knap:  .05em;   /* knapper og korte versal-etiketter */
	--sp-meta:  .06em;   /* meta og smaa versaler i broedfladen */
	--sp-vid:   .08em;   /* bredere versal-etiketter */
	--sp-mikro: .14em;   /* de mindste versal-etiketter */
	--sp-anton: .01em;   /* Anton i versaler -- optisk, ikke en etiket */

	/* Anton-overskriften i paneler: kurvens skuffe og kassens blokke. Fem
	   steder i to filer stod den som 22px, og det er en stoerrelse med en
	   rolle, ikke et tilfaeldigt tal. */
	--t-panel: 22px;

	--radius: 4px;

	/* Den primaere handling. ÉT sted.
	   Maalt 8/9: knapperne var 46 px paa forsiden og i kurven, men 40 px paa
	   produktsiden -- og med 15 px/600 mod 14 px/700. Produktsidens egen regel
	   (.single-product .single_add_to_cart_button, 0-2-0) tabte til den
	   generelle (.woocommerce button.button, 0-2-1), som staar 1.500 linjer
	   laengere oppe. Specificitet slaar raekkefoelge, og tre halve
	   definitioner slaar ingen af dem. */
	--cta-h:  46px;
	--cta-px: 1.4rem;
	--bredde: 1600px;

	--r1: .25rem; --r2: .5rem; --r3: 1rem; --r4: 1.5rem; --r5: 2.5rem; --r6: 4rem;

	/* Skriftstoerrelser.
	   Foer stod der 15 forskellige tal spredt over filen -- 10, 10.5, 11,
	   11.5, 12, 12.5, 13, 13.5, 14, 14.5 -- valgt ét ad gangen mens tingene
	   blev bygget. Det er ikke en skala, det er drift, og resultatet var at
	   halvdelen af sitet stod paa 13 px eller derunder.

	   Seks trin, og hvert eneste font-size i filen peger paa ét af dem. Skal
	   der skrues igen, sker det her og ikke 56 steder.

	      xs   versaler-etiketter med sperring (kolonneoverskrifter, maerker)
	      s    meta, noter, taellere
	      m    UI-broedtekst: menu, filtre, produktnavne, kurvlinjer
	      l    fremhaevet UI
	      xl   subtotaler og lignende
	      2xl  smaa overskrifter
	   Selve broedteksten paa siden er 16 px og staar paa <body>. */
	--t-xs: 13px;
	--t-s:  14px;
	--t-m:  15px;
	--t-l:  16px;
	--t-xl: 17px;
	--t-2xl: 19px;
	/* Fire stoerrelser staar med tal og ikke med et trin, med vilje: tre er
	   Anton (site-title, kampagnefeltets navn, kurvens overskrift), hvor
	   maalet er skriftens hoejde og ikke laesbarhed i broedtekst, og den
	   fjerde er krydset i kurven, som er et tegn brugt som ikon. */

	--font: "Barlow", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	--font-display: "Anton", "Barlow", Impact, sans-serif;

	--ikon-kurv: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 8h12l-1 12H7L6 8z'/%3E%3Cpath d='M9 8V6a3 3 0 0 1 6 0v2'/%3E%3C/svg%3E");
}

*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }

body {
	margin: 0;
	background: var(--bund);
	color: var(--ink);
	font-family: var(--font);
	font-size: var(--t-xl);
	line-height: 1.55;
	-webkit-font-smoothing: antialiased;
}

/* Markeret tekst i messing. Den moerke tekstfarve er den samme som paa
   knapper og paginering -- messing er lys nok til at hvid tekst forsvinder
   i den. */
::selection { background: var(--messing); color: var(--paa-messing); }

img, svg, video { max-width: 100%; height: auto; }
a { color: inherit; text-decoration: none; transition: color var(--overgang); }
a:hover { color: #fff; }
:focus-visible { outline: 2px solid var(--messing); outline-offset: 2px; }

h1, h2, h3 { margin: 0 0 var(--r2); line-height: 1.15; text-wrap: balance; }
p { margin: 0 0 var(--r3); }

.col-full {
	width: 100%;
	max-width: var(--bredde);
	margin-inline: auto;
	/* 24 px, ikke 16. Med rammen paa 1600 px har skaerme mellem 1300 og 1600
	   ingen luft til overs i siderne, og indholdet klaebede til kanten. */
	padding-inline: var(--r4);
}

/* Paa en telefon er de 24 px for meget: skaermen er 390 px bred, og 48 px af
   dem gaar til luft der ikke gavner noget. 16 px i hver side. */
@media (max-width: 819px) {
	.col-full { padding-inline: var(--r3); }
}

#page { display: flex; flex-direction: column; min-height: 100vh; }
.site-content { flex: 1; padding-block: var(--r4) var(--r6); }

/* ==========================================================================
   Header
   Storefronts struktur, verificeret i browseren 3/9:

     .site-header > .col-full
         .site-branding > a > img.custom-logo
         nav.secondary-navigation          (1 punkt: KONTAKT OS)
         .site-search
     .storefront-primary-navigation > .col-full
         nav.main-navigation
             button.menu-toggle
             .primary-navigation           (56 punkter — desktop)
             .handheld-navigation          (40 punkter — mobil)
         ul.site-header-cart

   Storefront skjuler selv .handheld-navigation paa desktop med sin egen CSS.
   Den er afmeldt, saa det skal goeres her -- ellers staar begge menuer, og
   topniveauet ser ud til at have dubletter (Warhammer og Maling to gange).
   ========================================================================== */

/* Begge baand i samme flade. Baand 1 stod paa --bund og baand 2 paa --flade,
   saa headeren laeste som to ting oven paa hinanden i stedet for én
   navigation. Nu er skillelinjen mellem dem ogsaa vaek. */
.site-header {
	background: var(--flade);
	border-bottom: 1px solid var(--kant);
	/* Klaeber til toppen og koeres op naar man ruller ned, tilbage naar man
	   ruller op. sticky frem for fixed: headeren bliver i flowet, saa
	   indholdet ikke skal skubbes ned med en polstring der skal holdes
	   synkron med headerens hoejde. */
	position: sticky; top: 0; z-index: 80;
	transition: transform .22s ease;
}
.tp-nav-skjult .site-header { transform: translateY(-100%); }
@media (prefers-reduced-motion: reduce) {
	.site-header { transition: none; }
}

.site-header > .col-full {
	display: flex;
	align-items: center;
	gap: var(--r3) var(--r4);
	flex-wrap: wrap;
	padding-block: var(--r2);
}

.site-branding { margin: 0; flex: 0 0 auto; }
/* max-height og ikke height. Se kommentaren ved 48 px-reglen nedenfor:
   en fast hoejde sammen med WordPress' max-width: 100% trykker logoet
   sammen i bredden naar spalten bliver smal. */
.site-branding img,
.custom-logo {
	display: block;
	width: auto; height: auto;
	max-width: 100%; max-height: 36px;
}
.site-title { font-family: var(--font-display); font-size: 20px; text-transform: uppercase; margin: 0; }
.site-description { display: none; }

.secondary-navigation { flex: 1 1 auto; }
.secondary-navigation ul { list-style: none; margin: 0; padding: 0; display: flex; gap: var(--r3); }
.secondary-navigation a {
	font-size: var(--t-s); color: var(--svag);
	text-transform: uppercase; letter-spacing: var(--sp-meta);
}
.secondary-navigation a:hover { color: var(--daempet); }

.site-search { flex: 0 0 auto; margin-left: auto; }
.site-search .widget { margin: 0; }
.site-search form { display: flex; gap: 0; }
.site-search input[type="search"],
.site-search input[type="text"] { min-width: 15rem; }

/* --- Menubaandet --- */

.storefront-primary-navigation {
	position: relative;
	background: transparent;
	/* Samme flade som baandet ovenover, saa der skal en streg til for at
	   holde de to adskilt. */
	border-top: 1px solid var(--kant);
}
.storefront-primary-navigation > .col-full {
	display: flex; align-items: center; gap: var(--r4);
	padding-block: 0;
}

.main-navigation { flex: 1 1 auto; }
.main-navigation ul { list-style: none; margin: 0; padding: 0; }

/* Kun det oeverste niveau i PRIMARY ligger paa en raekke. */
.primary-navigation > ul { display: flex; flex-wrap: wrap; gap: 0 var(--r4); }
.handheld-navigation { display: none; }

.main-navigation li { position: relative; }
.main-navigation a {
	display: block;
	padding: .7rem 0;
	/* Ét trin under UI-broedteksten, med vilje: punkterne staar i versaler,
	   og versaler laeses stoerre end de maaler. 15 px ville have gjort
	   baandet tungere end alt andet paa siden. */
	font-size: var(--t-s);
	text-transform: uppercase;
	letter-spacing: var(--sp-knap);
	color: var(--nav-ink);
	white-space: nowrap;
}
.main-navigation a:hover,
.main-navigation .current-menu-item > a,
.main-navigation .current-menu-ancestor > a {
	color: var(--messing);
}

/* Storefronts egne udfold-knapper: hover klarer det paa desktop. Paa mobil
   taendes de igen -- se "Mobilheaderen" nederst i filen. */
.dropdown-toggle { display: none; }
.menu-toggle { display: none; }

/* --- Megamenuen ------------------------------------------------------------
   Efter artifacten "Navigationen til Vaerkstedet": kampagnefelt paa 240 px og
   derefter en kolonne pr. underkategori.

   Panelet ligger i `position: static`-flow inde i li'en, men er absolut
   placeret i forhold til MENUBAANDET, ikke i forhold til punktet. Derfor har
   .storefront-primary-navigation position: relative og li'en ikke. Ellers
   ville et panel paa 1.100 px starte ved punktets venstrekant og loebe ud
   over hoejre side af skaermen paa "Terninger".

   Baggrunden gaar fra kant til kant som hos Nexora; indholdet er venstre-
   stillet i samme bredde som resten af siden.
   -------------------------------------------------------------------------- */

.tp-nav-top { display: flex; flex-wrap: wrap; gap: 0 var(--r4); }
.tp-nav-top > li { position: static; }
/* "Nyheder" staar to steder paa desktop: som menupunkt i baandet og som
   genvej yderst til hoejre. Genvejen vinder, saa menupunktet skjules HER og
   slettes ikke i databasen -- mobilmenuens skuffe bygger sin liste af den
   samme menu, og der skal punktet blive staaende (genvejsbaandet er skjult
   under 820 px). Rammer paa href og ikke paa en klasse, fordi megamenuen
   udskriver punkterne uden id. */
.tp-nav-top > li:has(> a[href$="/nyheder/"]) { display: none; }
.tp-nav-top > li > a { font-weight: 600; }

/* Den side man staar paa. Klassen saettes af megamenu-walkeren.
   Stregen er en inset box-shadow paa linket, ikke text-decoration: linket
   fylder hele baandets hoejde, saa skyggen lander praecis paa baandets
   underkant og flugter med headerens border-bottom. En understregning ville
   sidde ved skriften og svaeve et stykke over linjen. */
.tp-nav-top > li.tp-aktiv > a {
	color: var(--messing);
	box-shadow: inset 0 -2px 0 var(--messing);
}

/* Streg efter "Shop alle": punktet er en handling, resten er kategorier.
   Den negative margen er ikke pynt -- uden den ville stregen staa 24 px fra
   "Warhammer" og 12 px fra "Shop alle". Nu er der 12 px til hver side. */
.tp-nav-top > li:first-child {
	padding-right: 12px;
	margin-right: -12px;
	border-right: 1px solid var(--kant-staerk);
}

.tp-pil {
	display: inline-block;
	width: .3em; height: .3em; margin-left: .45em;
	border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor;
	transform: translateY(-.18em) rotate(45deg);
}

.tp-mega {
	position: absolute; top: 100%; left: 0; right: 0; z-index: 60;
	background: var(--flade);
	border-top: 1px solid var(--kant);
	border-bottom: 1px solid var(--kant-staerk);
	box-shadow: 0 18px 40px rgba(0,0,0,.55);
	/* Skjult uden display:none, saa panelet kan tone frem og stadig maales. */
	opacity: 0; visibility: hidden;
	transition: opacity .12s ease, visibility .12s ease;
}
.tp-har-mega:hover > .tp-mega,
.tp-har-mega:focus-within > .tp-mega { opacity: 1; visibility: visible; }

/* Den kompakte liste. Topniveauer med faa underkategorier faar ikke et bredt
   panel -- se tp_fortjener_mega(). Denne er ankeret paa PUNKTET, saa den skal
   have sin egen position: relative tilbage.

   Selektoren skal matche ".tp-nav-top > li" i vaegt, ellers vinder den
   `position: static` som megapanelet har brug for, og listen lander i venstre
   skaermkant i stedet for under punktet. Set i browseren 4/9: baade "Bits" og
   "Terninger" stod paa x=0. */
.tp-nav-top > li.tp-har-liste { position: relative; }
.tp-liste {
	position: absolute; top: 100%; left: 0; z-index: 60;
	min-width: 15rem;
	background: var(--flade);
	border: 1px solid var(--kant-staerk);
	border-top: 0;
	box-shadow: 0 12px 30px rgba(0,0,0,.55);
	padding: var(--r1) 0;
	opacity: 0; visibility: hidden;
	transition: opacity .12s ease, visibility .12s ease;
}
.tp-har-liste:hover > .tp-liste,
.tp-har-liste:focus-within > .tp-liste { opacity: 1; visibility: visible; }
.tp-liste li { position: static; }
.tp-liste a {
	padding: .35rem var(--r2);
	font-size: var(--t-m); color: var(--daempet);
	text-transform: none; letter-spacing: 0; white-space: normal;
}
.tp-liste a:hover { background: var(--bund); color: var(--ink); }

/* --- Panelernes bevaegelse ------------------------------------------------
   Panelet toner allerede frem; her faar det et lille skub nedad, og
   indholdet kommer i to trin -- kampagnefeltet foerst, saa kolonnerne fra
   venstre.

   IND og UD har hver sin fart, og det er ikke pynt. Et menupanel lukker,
   hver gang man foerer musen hen over naboen, og en langsom udtoning goer
   baandet klaebrigt: man peger paa "Terninger" og ser stadig "Bits". Derfor
   staar varighed og forsinkelse paa HOVER-reglen og ikke paa grundreglen --
   saa er vejen ind blooed og vejen ud oejeblikkelig.

   Kun over 820 px. Under den er kategoribaandet vaek og menuen er en
   udfoldning i mobilpanelet.
   ------------------------------------------------------------------------ */

@media (min-width: 820px) {
	.tp-mega, .tp-liste { transform: translateY(-6px); }
	.tp-mega { transition: opacity .1s ease, visibility .1s, transform .1s ease; }
	.tp-liste { transition: opacity .1s ease, visibility .1s, transform .1s ease; }

	.tp-har-mega:hover > .tp-mega,
	.tp-har-mega:focus-within > .tp-mega,
	.tp-har-liste:hover > .tp-liste,
	.tp-har-liste:focus-within > .tp-liste {
		transform: none;
		transition-duration: .2s;
		transition-timing-function: cubic-bezier(.22, .61, .36, 1);
	}

	/* Boernene i panelet. `> *` og ikke klassenavnene: foerste barn er
	   kampagnefeltet, resten er kolonner, og trappen skal bare loebe hen ad
	   raekken uanset hvad de hedder. */
	.tp-mega-indre > * {
		opacity: 0; transform: translateY(8px);
		transition: opacity .1s ease, transform .1s ease;
	}
	.tp-har-mega:hover > .tp-mega .tp-mega-indre > *,
	.tp-har-mega:focus-within > .tp-mega .tp-mega-indre > * {
		opacity: 1; transform: none;
		transition: opacity .26s ease, transform .26s cubic-bezier(.22, .61, .36, 1);
	}
	.tp-har-mega:hover > .tp-mega .tp-mega-indre > :nth-child(2),
	.tp-har-mega:focus-within > .tp-mega .tp-mega-indre > :nth-child(2) { transition-delay: .05s; }
	.tp-har-mega:hover > .tp-mega .tp-mega-indre > :nth-child(3),
	.tp-har-mega:focus-within > .tp-mega .tp-mega-indre > :nth-child(3) { transition-delay: .09s; }
	.tp-har-mega:hover > .tp-mega .tp-mega-indre > :nth-child(4),
	.tp-har-mega:focus-within > .tp-mega .tp-mega-indre > :nth-child(4) { transition-delay: .13s; }
	.tp-har-mega:hover > .tp-mega .tp-mega-indre > :nth-child(5),
	.tp-har-mega:focus-within > .tp-mega .tp-mega-indre > :nth-child(5) { transition-delay: .17s; }
	.tp-har-mega:hover > .tp-mega .tp-mega-indre > :nth-child(n+6),
	.tp-har-mega:focus-within > .tp-mega .tp-mega-indre > :nth-child(n+6) { transition-delay: .2s; }
}

/* Bad brugeren om mindre bevaegelse, bliver toningen -- den er kort og
   forstyrrer ingen -- men skubbet og trappen ryger. */
@media (prefers-reduced-motion: reduce) {
	.tp-mega, .tp-liste, .tp-mega-indre > * {
		transform: none !important;
		transition-delay: 0s !important;
	}
}

.tp-mega-indre {
	/* Samme ramme som .col-full, saa foerste kolonne starter praecis hvor
	   "SHOP ALLE" starter. Panelet selv gaar fra kant til kant. */
	max-width: var(--bredde); margin-inline: auto;
	padding: var(--r4) var(--r4) var(--r5);
	display: grid;
	grid-template-columns: 240px repeat(var(--kol, 4), minmax(0, 210px));
	justify-content: start;
	gap: var(--r4);
	align-items: start;
}

/* ==========================================================================
   Fremhaevede felter — megamenuens kampagnefelt og karrusellens promo

   To felter, samme ide: et foto med en tekstblok haengt paa underkanten.
   De var bygget hver for sig og drev fra hinanden -- forskellig
   skriftstoerrelse, forskellig polstring, forskellig knap, og kun det ene
   taalte et langt produktnavn. Nu deler de ét afsnit og ét saet klasser
   (.tp-promo-*). Kun stoerrelsen er forskellig, og den staar hvert sit sted.

   Feltet var foerst en flexboks med min-height, og teksten skulle skubbes ned
   med align-items: flex-end. Det holdt ikke: feltets hoejde blev sat af
   teksten, billedet af feltet, og overlayet daekkede derfor kun den oeverste
   tredjedel mens fotoet fortsatte nedenunder. Nu bestemmer ET tal hoejden --
   3:4 i megamenuen (produktfotoets eget forhold, 500x667), sporets straekning
   i karrusellen. Billede og tekst er begge absolut placeret, saa ingen af dem
   kan paavirke den andens stoerrelse.
   ========================================================================== */
.tp-mega-promo,
.tp-kar-promo {
	position: relative;
	display: block;
	overflow: hidden;
	background: var(--flade-dyb);
	padding: 0;
}

/* Feltet er et <a> inde i .main-navigation, som saetter white-space: nowrap
   paa alle links. Uden ombrydning har line-clamp kun én linje at klippe i,
   og navnet bliver hugget midt i et ord ved feltets kant.
   ("FLESH HOUND OF KHORNE - B" -- maalt 345 px navn i et felt paa 240.)
   Det HAR staaet her hele tiden, som `.tp-mega-promo { white-space: normal }`
   -- men .main-navigation a vejer 0-1-1 og .tp-mega-promo kun 0-1-0, saa
   reglen tabte, og computed value var nowrap. En kommentar der forklarer en
   rettelse er ikke det samme som en rettelse der virker.
   .main-navigation .tp-mega-promo vejer 0-2-0 og vinder. Spaenderne indeni
   arver fra <a>'et, saa de foelger med. */
.main-navigation .tp-mega-promo,
.tp-kar-promo { white-space: normal; }
.tp-mega-promo { aspect-ratio: 3 / 4; border-radius: 3px; }

.tp-mega-promo img,
.tp-kar-promo img {
	position: absolute; inset: 0;
	width: 100%; height: 100%; object-fit: cover; opacity: .78;
}
/* Gradienten sidder paa tekstblokken og ikke paa feltet: saa er den kun saa
   hoej som teksten, og overgangen bliver kort og bloed. Ligger den paa hele
   feltet og ender paa rgba(...,.35) i stedet for 0, faar den en synlig kant
   tvaers over fotoet. */
.tp-promo-tekst {
	position: absolute; left: 0; right: 0; bottom: 0;
	padding: var(--r4) var(--r3) var(--r3);
	display: flex; flex-direction: column; align-items: flex-start; gap: var(--r2);
	background: linear-gradient(to top, rgba(14,15,16,.95) 40%, rgba(14,15,16,0));
}
.tp-promo-mrk {
	font-size: var(--t-xs); font-weight: 700; letter-spacing: var(--sp-mikro);
	text-transform: uppercase; color: var(--messing);
}
.tp-promo-navn {
	font-family: var(--font-display); font-weight: 400;
	font-size: 20px; line-height: 1.15; text-transform: uppercase;
	color: #fff;
	/* HOEJDEBUDGET. To linjer, hverken mere eller mindre.
	 *
	 * line-clamp alene er ikke nok: den saetter et loft, men ikke et gulv.
	 * Feltets titel er et produktnavn i megamenuen ("Keeper of Secrets" mod
	 * "White Dwarf Presents -- Index Astartes IV"), og uden et gulv hopper
	 * tekstblokken og dermed gradienten op og ned fra panel til panel.
	 * min-height paa to linjer giver det gulv, saa de to felter staar ens
	 * uanset hvad varen hedder.
	 *
	 * overflow-wrap: anywhere fordi Anton ikke orddeler og navnene er lange:
	 * "FLESH HOUND OF KHORNE - BODY" loeb ellers ud over kanten. */
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
	overflow: hidden;
	min-height: 2.3em;
	overflow-wrap: anywhere;
}
.tp-promo-brod {
	font-size: var(--t-s); line-height: 1.35; color: var(--daempet);
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
	overflow: hidden;
	min-height: 2.7em;
}
.tp-promo-knap {
	margin-top: 2px;
	white-space: nowrap;
}
.tp-mega-promo:hover .tp-promo-knap,
.tp-kar-promo:hover .tp-promo-knap { background: var(--messing-lys); border-color: var(--messing-lys); }

/* Kolonnerne */
.tp-mega-kol { min-width: 0; }
.tp-mega-kol h4 { margin: 0 0 12px; }
.tp-mega-kol h4 a {
	padding: 0; white-space: normal;
	font-size: var(--t-xs); font-weight: 700; letter-spacing: var(--sp-mikro);
	text-transform: uppercase; color: var(--messing);
}
.tp-mega-kol h4 a:hover { color: var(--messing-lys); }
.tp-mega-kol ul { display: flex; flex-direction: column; gap: 7px; }
.tp-mega-kol li { position: static; }
.tp-mega-kol a {
	padding: 0; font-size: var(--t-m); color: var(--daempet);
	text-transform: none; letter-spacing: 0; white-space: normal;
}
.tp-mega-kol a:hover { color: var(--ink); }

/* Kurv */
.site-header-cart { list-style: none; margin: 0; padding: 0; flex: 0 0 auto; position: relative; }
.site-header-cart > li { position: relative; }
.site-header-cart a { font-size: var(--t-m); color: var(--daempet); }
.site-header-cart a:hover { color: var(--ink); }
.site-header-cart .count { color: var(--svag); font-size: var(--t-s); }
/* --- Kurvskuffen ---------------------------------------------------------
   Efter Nexora: et panel paa 400 px der glider ind fra hoejre, med
   overskrift og antal, varelinjer med antalsvaelger og papirkurv, og en fast
   bund med subtotal og to knapper.

   Skuffen ligger i foden, ikke i headeren -- headerens .col-full er et grid
   med tre spalter, og to ekstra boern dér ville lande i spalterne.
   -------------------------------------------------------------------------- */

.tp-kurv-skygge {
	position: fixed; inset: 0; z-index: 120;
	background: rgba(0, 0, 0, .55);
	/* opacity alene er ikke nok: et gennemsigtigt lag over hele skaermen
	   opfanger stadig klik. */
	opacity: 0; visibility: hidden;
	transition: opacity .2s ease, visibility .2s ease;
}
.tp-kurv {
	position: fixed; inset: 0 0 0 auto; z-index: 121;
	width: min(400px, 92vw);
	display: flex; flex-direction: column;
	background: var(--flade);
	border-left: 1px solid var(--kant-staerk);
	box-shadow: -18px 0 46px rgba(0, 0, 0, .55);
	/* Uden visibility maler skuffen sin 46 px skygge ind over siden selv om
	   den staar parkeret uden for kanten -- en moerk stribe langs kanten paa
	   hver eneste side. Skyggen forsvinder foerst naar elementet er skjult. */
	visibility: hidden;
	/* Skuffen staar parkeret uden for kanten og koeres ind med transform.
	   Ikke med `right`, som ville faa browseren til at ombryde indholdet paa
	   hver frame. */
	transform: translateX(100%);
	/* visibility skal vente til skuffen er koert ud, ellers ses udgangen
	   aldrig -- den ville kun animere ind. `0s linear .22s` er ingen
	   overgang, men en forsinkelse paa selve skiftet. Samme greb som
	   mobilmenuens .tp-mm. */
	transition: transform .22s ease, visibility 0s linear .22s;
}
.tp-kurv-aaben .tp-kurv-skygge { opacity: 1; visibility: visible; }
.tp-kurv-aaben .tp-kurv {
	transform: translateX(0); visibility: visible;
	transition: transform .22s ease, visibility 0s linear 0s;
}
/* Baggrunden maa ikke kunne rulle bag et aabent panel. */
.tp-kurv-aaben, .tp-kurv-aaben body { overflow: hidden; }

.tp-kurv-top {
	display: flex; align-items: center; gap: var(--r2);
	padding: var(--r3);
	border-bottom: 2px solid var(--messing);
}
.tp-kurv-titel {
	margin: 0; flex: 1 1 auto;
	font-family: var(--font-display); font-weight: 400;
	font-size: var(--t-panel); letter-spacing: var(--sp-anton); text-transform: uppercase;
	color: var(--ink);
}
.tp-kurv-antal {
	font-family: var(--font); font-size: var(--t-s); font-weight: 500;
	text-transform: none; letter-spacing: 0; color: var(--svag);
	margin-left: 8px;
}
/* Lukkekrydset: samme komponent som filterets .tp-filterluk i arkiv.css.
   40 px er beroeringsmaalet, og stregen er tynd med vilje -- knappen er en
   udvej, ikke en handling. Aendrer du den ene, saa aendr den anden. */
.tp-kurv-luk {
	flex: 0 0 auto;
	width: 40px; height: 40px;
	display: flex; align-items: center; justify-content: center;
	background: var(--bund); color: var(--daempet);
	border: 1px solid var(--kant); border-radius: 50%;
	cursor: pointer;
	line-height: 1; padding: 0;
}
.tp-kurv-luk:hover { color: var(--ink); border-color: var(--kant-staerk); }
/* Maalene skal staa her: se kommentaren ved knappen i inc-kurv.php. */
.tp-kurv-luk svg {
	display: block; flex: none; width: 16px; height: 16px;
	fill: none; stroke: currentColor; stroke-width: 1.3; stroke-linecap: round;
}
/* Papirkurven er en SVG og skal have sine maal i CSS: den globale regel
   `img, svg { height: auto }` overtager ellers elementets egne attributter. */
.tp-kurv-fjern svg { display: block; flex: none; width: 17px; height: 17px; }

/* Indholdet ruller; bunden med subtotal bliver staaende. */
.tp-kurv-indhold {
	flex: 1 1 auto; min-height: 0;
	display: flex; flex-direction: column;
}
.tp-kurv-liste {
	list-style: none; margin: 0; padding: var(--r2) var(--r3);
	flex: 1 1 auto; overflow-y: auto;
}
.tp-kurv-linje {
	display: flex; gap: var(--r2);
	padding-block: var(--r3);
	border-bottom: 1px solid var(--kant);
}
.tp-kurv-linje:last-child { border-bottom: 0; }
.tp-kurv-linje.tp-arbejder { opacity: .45; pointer-events: none; }

/* Samme billedforhold som produktkortet: 3:4 og contain. Foer brugte kurven
   woocommerce_gallery_thumbnail, som er 100x100 og BESKAARET kvadratisk --
   et kvadrat i en 3:4-kasse gav sorte bjaelker over og under. Nu hentes
   woocommerce_thumbnail, den samme 500 px-fil som gridet, og saa fylder
   motivet kassen. Se tp_kurv_indhold(). */
.tp-kurv-foto { flex: 0 0 auto; width: 64px; }
.tp-kurv-foto img {
	width: 64px; aspect-ratio: 3 / 4; height: auto;
	object-fit: cover;
	background: var(--flade-dyb); border-radius: 2px; display: block;
}

.tp-kurv-tekst { min-width: 0; flex: 1 1 auto; display: flex; flex-direction: column; gap: 3px; }
.tp-kurv-navn {
	font-size: var(--t-m); font-weight: 600; line-height: 1.3; color: var(--ink);
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
	overflow: hidden;
}
.tp-kurv-navn:hover { color: var(--messing); }
.tp-kurv-meta { font-size: var(--t-s); color: var(--svag); }
.tp-kurv-pris {
	font-size: var(--t-m); font-weight: 700; color: var(--ink);
	font-variant-numeric: tabular-nums; margin-top: 2px;
}
.tp-kurv-pris del { color: var(--svag); font-weight: 400; margin-right: 5px; }
.tp-kurv-pris ins { text-decoration: none; }

.tp-kurv-styr { display: flex; align-items: center; gap: var(--r2); margin-top: 7px; }
.tp-antal {
	display: inline-flex; align-items: center;
	border: 1px solid var(--kant-staerk); border-radius: 3px;
	background: var(--bund);
}
.tp-antal-knap {
	width: 30px; height: 30px; display: grid; place-items: center;
	background: none; border: 0; color: var(--daempet);
	font-size: var(--t-xl); line-height: 1; cursor: pointer;
}
.tp-antal-knap:hover { color: var(--messing); }
.tp-antal-tal {
	min-width: 26px; text-align: center;
	font-size: var(--t-m); font-variant-numeric: tabular-nums; color: var(--ink);
}
.tp-kurv-fjern {
	background: none; border: 0; padding: 4px;
	color: var(--svag); cursor: pointer; line-height: 0;
}
.tp-kurv-fjern:hover { color: var(--rust); }

/* Bunden */
.tp-kurv-bund {
	flex: 0 0 auto;
	padding: var(--r3);
	border-top: 1px solid var(--kant);
	background: var(--flade-dyb);
}
.tp-kurv-sum {
	display: flex; align-items: baseline; justify-content: space-between;
	font-size: var(--t-xl); color: var(--ink);
}
.tp-kurv-sum strong { font-size: var(--t-2xl); font-variant-numeric: tabular-nums; }
.tp-kurv-note { margin: 5px 0 var(--r3); font-size: var(--t-s); color: var(--svag); }
.tp-kurv-knapper { display: grid; grid-template-columns: 1fr 1fr; gap: var(--r2); }

/* Geometrien staar i den samlede CTA-regel laengere nede. Her kun farven. */
.tp-knap { border-color: var(--messing-dyb); color: var(--messing); background: transparent; }
.tp-knap:hover { border-color: var(--messing); color: var(--messing); background: var(--messing-tint); }
.tp-knap--fyldt { background: var(--messing); border-color: var(--messing); color: var(--paa-messing); }
/* border-color SKAL staa her. Uden den bliver baggrunden lys messing mens
   kanten bliver staaende i den moerkere -- en 1 px ring rundt om knappen der
   ikke er valgt af nogen. Maalt 18/9: bg rgb(217,180,92) mod kant
   rgb(200,162,74). En hover-regel gaelder KUN de egenskaber den selv naevner. */
.tp-knap--fyldt:hover { background: var(--messing-lys); border-color: var(--messing-lys); color: var(--paa-messing); }
/* Én undtagelse, og den er bevidst: knappen i footerens koeb-boks. Hasse har
   bedt om at faa den "meget mindre", og boksen er en opfordring og ikke et
   koeb. */
/* .tp-knap--lille stod her med sine egne maal (36 px, --sp-meta) og igen
   nede ved kampagneknappen (38 px, --sp-knap) -- to definitioner af samme
   klassenavn i samme fil, hvoraf den ene var ubrugt. Kun den nede ved
   kampagneknappen er tilbage. */
.tp-kurv-tom {
	flex: 1 1 auto;
	display: flex; flex-direction: column; align-items: center; justify-content: center;
	gap: var(--r3); padding: var(--r5) var(--r3); text-align: center;
	color: var(--daempet);
}
.tp-kurv-tom p { margin: 0; }

@media (max-width: 559px) {
	.tp-kurv { width: 100vw; }
	.tp-kurv-knapper { grid-template-columns: 1fr; }
}

input[type="text"], input[type="search"], input[type="email"],
input[type="number"], input[type="tel"], select, textarea {
	background: var(--bund);
	border: 1px solid var(--kant-staerk);
	color: var(--ink);
	padding: .4rem .6rem;
	font: inherit; font-size: var(--t-m);
	border-radius: var(--radius);
	max-width: 100%;
}
select { cursor: pointer; }

/* Brødkrumme
   Storefront pakker den selv i .col-full, som allerede har bredde og
   sidepadding. Saetter man ogsaa padding-inline her, bliver den lagt OVENPAA
   -- broedkrummen stod 1 rem laengere inde end menupunkterne ovenover.
   Derfor kun lodret padding. */
.storefront-breadcrumb { border-bottom: 1px solid var(--kant); }
.woocommerce-breadcrumb {
	padding: var(--r2) 0;
	font-size: var(--t-s); color: var(--svag); letter-spacing: .02em;
}
.woocommerce-breadcrumb a { color: var(--daempet); }
.woocommerce-breadcrumb a:hover { color: var(--messing); }

/* Broedkrummen: hele stien, paa EN linje man kan skubbe til siden.
   Kategoritraeet er tre-fire niveauer dybt med lange navne, og ombrudt fyldte
   det tre linjer paa en telefon. Valgt efter power.dk: stien bliver staaende
   hel, og man ruller i den.

   Broedkrummen er ikke en liste, men et fladt drys af <a> og <span> med
   LOESE TEKSTNODER imellem (varens eget navn til sidst). I en flexbeholder
   bliver hver tekstnode sit eget anonyme flexbarn -- derfor virker
   flex-wrap: nowrap ogsaa paa dem. */
.woocommerce-breadcrumb {
	display: flex; align-items: center; flex-wrap: nowrap;
	overflow-x: auto; overscroll-behavior-x: contain;
	white-space: nowrap;
	/* Rullepanelet ville laegge sig oven i stregen under baandet. */
	scrollbar-width: none;
	-ms-overflow-style: none;
}
.woocommerce-breadcrumb::-webkit-scrollbar { display: none; }
.woocommerce-breadcrumb > * { flex: 0 0 auto; }
.woocommerce-breadcrumb .breadcrumb-separator { padding: 0 .1rem; color: var(--kant-staerk); }

/* Forsiden er et hus. Teksten slukkes med font-size: 0 paa selve linket --
   den kan ikke fjernes i PHP, fordi WooCommerces skabelon skriver krummen
   med esc_html() og derfor ikke tager imod markup. Teksten bliver staaende i
   DOM'en, saa en skaermlaeser siger stadig "Forside". */
.woocommerce-breadcrumb a:first-of-type {
	display: inline-flex; align-items: center;
	font-size: 0;
}
.woocommerce-breadcrumb a:first-of-type::before {
	content: ""; display: block;
	width: 16px; height: 16px;
	background: currentColor;
	-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 10.5 12 3l9 7.5'/%3E%3Cpath d='M5.5 9.5V20h13V9.5'/%3E%3C/svg%3E") center / contain no-repeat;
	mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 10.5 12 3l9 7.5'/%3E%3Cpath d='M5.5 9.5V20h13V9.5'/%3E%3C/svg%3E") center / contain no-repeat;
}

@media (max-width: 819px) {
	/* Helt ud til skaermkanten, som karrusellen. Rullefeltet skal naa kanten,
	   ellers ser stien klippet ud midt inde paa siden -- men teksten skal
	   stadig begynde inde ved gutteren, saa den negative margen faas igen
	   som padding. */
	.woocommerce-breadcrumb {
		margin-inline: calc(var(--r3) * -1);
		padding-inline: var(--r3);
		scroll-padding-inline: var(--r3);
	}
}

/* --------------------------------------------------------------------------
   Beskeden fra pluginnet (feriebesked og lignende)

   Staar foerst i <body> og dermed over BAADE logoet og navigationen. Den er
   ikke klaebende, og det er med vilje: en feriebesked skal laeses én gang og
   saa vaere ude af vejen. Den ruller op og bliver deroppe; headeren klaeber.

   Indholdet flugter med resten af siden -- samme maksbredde og samme
   sidepolstring som .col-full. Uden det staar teksten klistret til
   skaermkanten mens logoet lige under staar 24 px inde.

   Baade `p` og `h3` er naevnt. Pluginnet skriver et <p> siden 18/9 (en
   overskrift oeverst paa hver side lagde sig ind i dokumentets
   overskriftsstruktur foer sidens egen h1), men LIVE koerer stadig den gamle
   udgave med <h3> indtil cutover. Selektoren daekker begge, saa der ikke er
   en dag hvor baandet staar ustylet.
   -------------------------------------------------------------------------- */

.custom-notice {
	background: var(--messing); color: var(--paa-messing);
	padding-block: var(--r2);
}
.custom-notice p,
.custom-notice h3 {
	width: 100%; max-width: var(--bredde);
	margin-inline: auto; margin-block: 0;
	padding-inline: var(--r4);
	font-size: var(--t-m); font-weight: 600; line-height: 1.45;
	text-align: center;
}
/* Et link i beskeden skal kunne ses paa den messingfarvede bund. Arver man
   sidens linkfarve, bliver messing paa messing. */
.custom-notice a { color: var(--paa-messing); text-decoration: underline; font-weight: 700; }
.custom-notice a:hover { color: #3a2f12; }

@media (max-width: 819px) {
	.custom-notice p,
	.custom-notice h3 { padding-inline: var(--r3); font-size: var(--t-s); text-align: left; }
}

/* ==========================================================================
   Sektionsoverskrift — en overskrift med et link og evt. knapper til hoejre

   Bruges af forsidens karruseller i dag. Den bliver i BASEN og ikke i
   forside.css, selv om kun ét omraade bruger den nu: naeste gang en side
   skal have en sektion med overskrift og "se alle"-link, skal den se ud paa
   praecis samme maade. Det er den slags fællesdele der holder siderne ens.
   ========================================================================== */

.tp-sektion { margin-bottom: var(--r6); }
.tp-sektion-top {
	display: flex; align-items: baseline; justify-content: space-between;
	gap: var(--r3); flex-wrap: wrap;
	margin-bottom: var(--r3);
}
.tp-sektion-titel {
	margin: 0;
	font-family: var(--font-display); font-weight: 400;
	/* Ned fra clamp(26, 3.4vw, 38) 15/9 efter Hasses oenske. 38 px stod
	   naesten saa stort som hero-teksten og tog opmaerksomhed fra varerne,
	   som er det man er kommet efter. Gaelder alle steder sektionen bruges
	   -- forsiden og de beslaegtede varer paa produktsiden. */
	font-size: clamp(23px, 2.8vw, 31px);
	text-transform: uppercase; letter-spacing: var(--sp-anton);
	color: var(--ink);
}
.tp-sektion-hoejre { display: flex; align-items: center; gap: var(--r3); }
.tp-sektion-link {
	font-size: var(--t-s); text-transform: uppercase; letter-spacing: var(--sp-knap);
	color: var(--messing); white-space: nowrap;
}
.tp-sektion-link:hover { color: var(--messing-lys); }

/* ==========================================================================
   Knapper
   ========================================================================== */

/* DEN PRIMAERE HANDLING -- én definition for hele sitet.
   Alle selektorer der kan baere en primaer knap staar her, ogsaa dem der
   ellers ville tabe en specificitetskamp mod hinanden. Farven saettes
   bagefter; det er kun geometri og skrift her. */
.tp-knap,
.button, button, input[type="submit"],
.woocommerce a.button, .woocommerce button.button, .woocommerce input.button,
.single-product .single_add_to_cart_button,
.woocommerce .single-product .single_add_to_cart_button,
.tp-mere-knap,
.tp-promo-knap {
	display: inline-flex; align-items: center; justify-content: center;
	min-height: var(--cta-h);
	padding: 0 var(--cta-px);
	font: inherit;
	font-size: var(--t-s); font-weight: 700;
	letter-spacing: var(--sp-knap); text-transform: uppercase; text-align: center;
	border: 1px solid var(--messing); border-radius: var(--radius);
	cursor: pointer;
	transition: background-color var(--overgang), border-color var(--overgang), color var(--overgang);
}
.button, button, input[type="submit"],
.woocommerce a.button, .woocommerce button.button, .woocommerce input.button,
.tp-promo-knap {
	background: var(--messing); color: var(--paa-messing);
}
.button:hover, button:hover,
.woocommerce a.button:hover, .woocommerce button.button:hover { background: var(--messing-lys); border-color: var(--messing-lys); color: var(--paa-messing); }

/* DEN SEKUNDAERE HANDLING -- kontur, ikke fyldt.
   To knapper spillede den rolle med hver sin kant: "Vis flere" under
   produktgitteret stod med --messing-dyb, og "Tillad valgte" i
   cookiepanelet med --messing. Samme rolle, to udseender. Kanten er nu
   --messing-dyb begge steder: en sekundaer handling skal traede et skridt
   tilbage fra den fyldte, og faa hele messingen naar musen er der. */
.tp-knap--kontur,
.tp-mere-knap {
	background: transparent;
	color: var(--messing);
	border-color: var(--messing-dyb);
}
.tp-knap--kontur:hover,
.tp-mere-knap:hover {
	background: var(--messing-tint);
	color: var(--messing);
	border-color: var(--messing);
}

/* DEN LILLE STOERRELSE. Kampagnefeltets knap staar i et felt paa ca. 240 px
   og maa vaere mindre -- men den var ogsaa blevet et andet DESIGN: 2 px
   hjoerner mod 4, ingen kant, og en sperring der ikke passede. Kun hoejden
   og skriften skiller nu. */
.tp-knap--lille,
.tp-promo-knap {
	min-height: 38px;
	padding: 0 var(--r3);
	font-size: var(--t-xs);
}

/* IKONKNAPPER ER IKKE HANDLINGSKNAPPER.
   Reglen ovenover rammer ALLE <button>, ogsaa burgeren, forstoerrelsesglasset,
   krydset i kurven, plus/minus og papirkurven. Deres egne regler saetter en
   gennemsigtig baggrund, men `button:hover` vejer (0,1,1) og slaar en ren
   klasseregel (0,1,0) -- saa de blev messingfyldte i det oejeblik musen kom
   forbi. Set 6/9: soegeknappen stod som en gul firkant efter et klik.
   Derfor med elementnavn foran, saa vaegten er den samme og raekkefoelgen
   afgoer. */
button.tp-menuknap, button.tp-menuknap:hover,
button.tp-soegknap, button.tp-soegknap:hover,
button.tp-antal-knap, button.tp-antal-knap:hover,
button.tp-kurv-fjern, button.tp-kurv-fjern:hover,
button.tp-filterknap, button.tp-filterknap:hover {
	background: transparent;
	border-color: transparent;
}
/* Ikonknapper er ikke CTA'er og maa ikke arve dens hoejde og sperring.
   min-height: 0 fordi den samlede regel saetter 46 px paa `button`. */
button.tp-menuknap, button.tp-soegknap, button.tp-antal-knap,
button.tp-kurv-fjern, button.tp-kurv-luk, button.tp-kar-knap,
button.dropdown-toggle, button.tp-filterluk {
	min-height: 0; padding: 0; letter-spacing: normal; font-size: inherit;
	transition: color var(--overgang), border-color var(--overgang), background-color var(--overgang);
}
button.tp-filterknap { min-height: var(--cta-h); }
/* De runde ikonknapper -- krydset i kurven, krydset i filteret og
   karrusellens pile -- er ÉN knap i tre sammenhaenge. Maalt 18/9 var de
   40 px mod 38, --kant mod --kant-staerk, og de svarede forskelligt paa
   musen. Geometri og svar staar nu ét sted; kun baggrunden skiller, og den
   skiller med vilje: krydsene ligger paa et panel og skal loefte sig fra
   det, pilene ligger paa sidens egen bund. */
button.tp-kurv-luk, button.tp-filterluk, button.tp-kar-knap {
	width: 40px; height: 40px; flex: none;
	display: grid; place-items: center;
	border: 1px solid var(--kant-staerk); border-radius: 50%;
	color: var(--daempet);
	transition: color var(--overgang), border-color var(--overgang), background-color var(--overgang);
}
button.tp-kurv-luk:hover, button.tp-filterluk:hover, button.tp-kar-knap:hover {
	color: var(--messing); border-color: var(--messing);
}
button.tp-kurv-luk, button.tp-kurv-luk:hover { background: var(--bund); }
button.tp-filterknap { border-color: var(--kant-staerk); color: var(--ink); }
button.tp-filterknap:hover { border-color: var(--messing-dyb); color: var(--messing); }
button.tp-antal-knap:hover, button.tp-kurv-fjern:hover,
button.tp-menuknap:hover, button.tp-soegknap:hover { color: var(--messing); }
button.tp-kurv-fjern:hover { color: var(--rust); }


/* ==========================================================================
   Kategoriarkivet, facetterne og mobilens filterpanel er flyttet til arkiv.css
   Den fil indlaeses kun paa de sider der bruger den. Se inc-arkiv.php.
   ========================================================================== */

/* ==========================================================================
   Footer
   ========================================================================== */

.site-footer {
	/* Samme flade som headeren, saa siden er lukket i begge ender. */
	background: var(--flade);
	border-top: 1px solid var(--kant);
	/* Luften OVER koebsbaandet staar her, ikke paa baandet selv -- baandet er
	   det foerste i footeren. Tallet skal vaere det samme som baandets
	   margin-bottom (--r5 / --r4 paa mobil), saa baandet har lige meget luft
	   over sig og ned til logoet. Aendrer du det ene, saa aendr det andet. */
	padding-block: var(--r5) var(--r3);
	font-size: var(--t-m); color: var(--svag);
}
/* Ingen mobilundtagelse: --r5 baade over og under baandet, ogsaa paa telefon
   (Hasse 18/9). En mindre luft dernede fik baandet til at klaebe til
   footerens kant. */
.site-footer ul { list-style: none; margin: 0; padding: 0; }
.site-footer a { color: var(--daempet); }
.site-footer a:hover { color: var(--ink); }

/* Maerket faar venstre halvdel, linkene hoejre. Kolonnerne starter altsaa
   praecis paa midten og fordeler sig derfra ud mod hoejre kant. */
.tp-footer {
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
	/* Ingen kolonnemellemrum: et gap ville skubbe linkene til hoejre for
	   midten. Logoet er langt smallere end sin halvdel, saa der er luft nok. */
	gap: var(--r5) 0;
	align-items: start;
	padding-bottom: var(--r5);
}

.tp-footer-logo { display: block; }
.tp-footer-logo img {
	display: block;
	height: 88px; width: auto;
}

.tp-footer-kolonner {
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: var(--r5);
}
.tp-footer-kol { min-width: 0; }
.tp-footer-titel {
	margin: 0 0 var(--r2);
	font-size: var(--t-xs); font-weight: 700;
	letter-spacing: var(--sp-mikro); text-transform: uppercase;
	color: var(--messing);
}
.tp-footer-kol li + li { margin-top: .4rem; }
.tp-footer-kol a { display: block; }

.tp-footer-bund {
	border-top: 1px solid var(--kant);
	padding-top: var(--r3);
	font-size: var(--t-s); color: var(--svag);
	display: flex; flex-wrap: wrap; gap: var(--r2) var(--r4);
	align-items: center; justify-content: space-between;
}
.tp-footer-jura { display: flex; flex-wrap: wrap; gap: var(--r4); align-items: center; }
.tp-footer-jura a {
	color: var(--svag); text-decoration: none; font-size: var(--t-s);
}
/* Alle links i footeren lyser HVIDT op paa hover -- ikke messing. Messing er
   reserveret til cookieknappen ved siden af, saa den ene ting man kan aabne
   dernede skiller sig ud. Reglerne her er scopet til footeren og roerer
   ikke menubaandet, hvor messing stadig er hover-farven. */
.tp-footer-jura a:hover { color: var(--ink); }
/* Ikonknappen staar til sidst og skal flugte med teksten ved siden af, ikke
   med linjens bund. Stilen selv kommer fra pluginnet. */
.tp-footer-jura .tp-samtykke-genvej { align-self: center; }

@media (max-width: 819px) {
	.tp-footer {
		grid-template-columns: minmax(0, 1fr);
		gap: var(--r4);
	}
	.tp-footer-logo img { height: 64px; }
	.tp-footer-kolonner {
		grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
		gap: var(--r4);
	}
}

.screen-reader-text {
	position: absolute !important; width: 1px; height: 1px;
	padding: 0; margin: -1px; overflow: hidden;
	clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

@media (prefers-reduced-motion: reduce) {
	*, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; }
}

/* ==========================================================================
   HEADEREN — to bånd
   Baand 1: logo venstre · søgefelt centreret · kurv højre
   Baand 2: kategorier venstre · genveje højre
   ========================================================================== */

/* Tre spalter, ikke flex: med flex ville søgefeltet kun se centreret ud saa
   laenge logo og kurv tilfaeldigvis var lige brede. Grid'et holder midten
   fast, ogsaa naar kurvbeloebet vokser fra 0,00 til 2.275,00 kr. */
.site-header > .col-full {
	display: grid;
	grid-template-columns: 1fr auto 1fr;
	align-items: center;
	gap: var(--r4);
	padding-block: var(--r3);
}

.site-branding { justify-self: start; }
/*
 * Logoet skal beholde sit forhold naar vinduet bliver smallere.
 *
 * Fejlen var `height: 48px` sammen med WordPress' egen `img { max-width:
 * 100% }`. Headeren er et grid paa `1fr auto 1fr`, og den foerste spalte
 * kan blive smallere end logoet. Saa klemte max-width bredden ned mens
 * hoejden blev staaende paa 48 -- maalt ved 885 px: 185x48 i stedet for
 * 225x48, altsaa 4,68 i forhold tegnet som 3,84.
 *
 * Med baade width og height paa auto afgoer browseren stoerrelsen ud fra
 * max-width OG max-height og beholder forholdet. Logoet bliver altsaa
 * mindre i stedet for fladt.
 */
.site-branding img,
.custom-logo {
	display: block;
	width: auto; height: auto;
	max-width: 100%; max-height: 48px;
}

.site-search { justify-self: center; width: 420px; max-width: 100%; }

/* Burger og soegeknap hoerer mobilen til. Se tp_mobil_knapper().
   Skal staa i en min-width-forespoergsel og ikke som en almindelig regel:
   headerens desktopafsnit ligger LAENGERE NEDE i filen end
   @media (max-width: 819px), saa en regel uden forespoergsel her ville slaa
   mobilreglen uanset skaermbredde. Knapperne var usynlige paa 390 px. */
@media (min-width: 820px) {
	.tp-menuknap, .tp-soegknap { display: none; }
}
.site-header-cart { justify-self: end; }

/* --- Søgefeltet ---------------------------------------------------------- */

.site-search .widget { margin: 0; }
.site-search .aws-container { width: 100%; }
/* Feltet skal vaere lysere end baandet, ikke samme farve. Da headeren gik
   fra --bund til --flade, forsvandt feltets kant i fladen. */
.site-search .aws-search-form {
	display: flex; align-items: stretch;
	background: var(--felt);
	border: 1px solid var(--kant-staerk);
	border-radius: 3px;
	height: 40px;
	overflow: visible;
	position: relative;
}
.site-search .aws-wrapper { flex: 1 1 auto; display: flex; align-items: center; position: relative; }
.site-search .aws-search-label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }
.site-search input.aws-search-field {
	width: 100%; height: 100%;
	background: transparent; border: 0; border-radius: 0;
	color: var(--ink);
	padding: 0 12px;
	font: inherit; font-size: var(--t-l);
}
.site-search input.aws-search-field::placeholder { color: var(--svag); }
/* AWS har ".aws-container .aws-search-field:focus { background-color:#fff }".
   Tre klasser mod vores to -- feltet blev derfor HVIDT i det oejeblik man
   klikkede i det, midt i et moerkt baand. :focus skal med i vores selektor,
   ellers taber den uanset raekkefoelge. */
.site-search input.aws-search-field:focus {
	outline: none;
	background: transparent;
	color: var(--ink);
}
.site-search .aws-search-form:focus-within { border-color: var(--messing); }

.site-search .aws-search-clear {
	display: flex; align-items: center;
	padding: 0 6px; color: var(--svag); cursor: pointer;
}
.site-search .aws-search-clear:hover { color: var(--ink); }
.site-search .aws-search-btn {
	display: flex; align-items: center; justify-content: center;
	width: 44px; background: transparent; border: 0; cursor: pointer;
}
.site-search .aws-search-btn svg { width: 18px; height: 18px; fill: var(--daempet); }
.site-search .aws-search-btn:hover svg { fill: var(--ink); }
.site-search .aws-loader { position: absolute; right: 8px; }

/* --- Søgeresultatet, efter Nexoras opbygning -----------------------------
   Selektorerne er IKKE scopet under .site-search. Advanced Woo Search flytter
   resultatpanelet ud af formen og ned i footeren -- verificeret i browseren
   3/9, hvor panelets forælder var .storefront-handheld-footer-bar. Et scopet
   selektorsæt ramte derfor ingenting, og panelet stod lyst på en mørk side.

   Rækkens faktiske opbygning, aflæst i DOM'en:
     .aws_result_item
       a.aws_result_link_top      (dækker hele rækken)
       span.aws_result_image > img
       span.aws_result_content
         span.aws_result_head > span.aws_result_title  (<strong> om træfferne)
         span.aws_result_excerpt
       span.aws_result_price
   -------------------------------------------------------------------------- */

/* AWS' EGNE FARVER -- hvorfor alt herunder er scopet under .aws-search-result
   eller .aws-search-form, ogsaa hvor det ser overfloedigt ud:

   Pluginnet skriver naesten hver eneste regel med TO klasser
   (".aws-search-result .aws_result_item:hover"). En regel med én klasse taber
   uanset hvilken fil der indlaeses sidst -- specificitet slaar raekkefoelge.
   Vores selektorer maa derfor have samme vaegt som deres; saa afgoer
   raekkefoelgen, og tp-style er erklaeret afhaengig af aws-style i
   functions.php.

   Gennemgaaet mod common.min.css 3.70 den 6/9. Alt hvad pluginnet farver:
     felt paa fokus #fff · knap #ededed · panel #fff · raekkekant #ccc
     hover #f5f5f5 · overskrift #000 · rubrik/hierarki/term #aaa
     varenummer #222 · lager #7ad03a / #a44 · "se alle" #21759b
     forslagschip #ededed paa #222 · rullebjaelke #ededed/#d8d8d8
     spinner #ededed · overlay #fff
   -------------------------------------------------------------------------- */

/* Knappen. AWS giver den .aws-form-btn med baggrund #ededed -- det var den
   lyse firkant i hoejre ende af soegefeltet. */
.site-search .aws-search-form .aws-form-btn,
.site-search .aws-search-form .aws-form-btn:hover,
.site-search .aws-search-form .aws-form-btn:active {
	background: transparent;
	border: 0;
	margin: 0;
}
.site-search .aws-search-form .aws-search-btn_icon { color: var(--daempet); }
.site-search .aws-search-form .aws-form-btn:hover .aws-search-btn_icon { color: var(--ink); }
.site-search .aws-search-form .aws-search-clear { color: var(--svag); }
.site-search .aws-search-form .aws-search-clear:hover { color: var(--ink); }
/* Spinneren er fire kanter i #ededed med én i #555. Vendt om: moerk ring,
   messing paa den der roterer. */
.site-search .aws-search-form .aws-loader {
	border-color: var(--kant-staerk);
	border-left-color: var(--messing);
}

/* Panelet. Selektoren staar med klassen TO gange: AWS nulstiller selv
   radius i ".aws-container .aws-search-form *, .aws-search-result" (0,1,0),
   og en enkelt klasse ville afhaenge af hvilken fil der kom sidst.
   margin-top giver den luft ned fra feltet -- panelets `top` saettes inline
   af pluginnet og kan ikke roeres i CSS. Det skal se ud som forslagspanelet,
   for de to skifter plads for oejnene af brugeren. */
.aws-search-result.aws-search-result {
	margin-top: 6px;
	/* !important er ikke dovenskab: AWS skriver selv
	   "border-radius: 0 !important" i common.min.css (aflaest 20/9, 3.71),
	   og et !important kan kun slaas af et !important. Maalt foer og efter:
	   0 px mod 3 px. */
	border-radius: 3px !important;
}
.aws-search-result {
	background: var(--flade);
	border: 1px solid var(--kant-staerk);
	border-radius: 3px;
	box-shadow: 0 16px 38px rgba(0, 0, 0, .6);
	color: var(--ink);
	overflow: hidden;
}
.aws-overlay-mask { background: var(--bund); }
.aws_results,
.aws_result_scroll,
.aws_result_inner { background: transparent; }
.aws_result_scroll { max-height: 62vh; }
.aws-search-result .aws_result_scroll::-webkit-scrollbar,
.aws-search-result .aws_result_scroll::-webkit-scrollbar-track { background-color: var(--bund); }
.aws-search-result .aws_result_scroll::-webkit-scrollbar-thumb { background-color: var(--kant-staerk); }
.aws-search-result .aws_top_text { border-bottom-color: var(--kant); color: var(--daempet); }

/* Raekken. Baade kant og padding skal have to klasser -- AWS saetter dem i
   ".aws-search-result .aws_results .aws_result_item". */
.aws-search-result .aws_results .aws_result_item {
	position: relative;
	display: flex;
	align-items: center;
	gap: var(--r2);
	padding: 9px 12px;
	border-bottom: 1px solid var(--kant);
	background: transparent;
}
.aws-search-result .aws_results .aws_result_item:last-child { border-bottom: 0; }
.aws-search-result .aws_result_item:hover,
.aws-search-result .aws_result_item.hovered { background: var(--bund); }

/* Linket dækker hele rækken, men skal ikke ses. */
.aws_result_link_top {
	position: absolute; inset: 0;
	font-size: 0; color: transparent;
	z-index: 2;
}

.aws_result_image { flex: 0 0 auto; }
.aws_result_image img {
	width: 40px; height: 52px;
	object-fit: cover;
	background: var(--flade-dyb);
	border-radius: 2px;
	display: block;
}

.aws_result_content {
	min-width: 0; flex: 1 1 auto;
	display: flex; flex-direction: column; gap: 3px;
}
/* Prisen ligger INDE i .aws_result_content, efter uddraget -- ikke som
   soeskende til det. Derfor er content en kolonne, og prisen faar sin egen
   linje i stedet for at blive skubbet til hoejre med margin-left:auto,
   hvilket ikke virker i en blok. */
.aws-search-result .aws_result_head { display: block; min-width: 0; color: var(--ink); }
.aws_result_title {
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
	overflow: hidden;
	font-size: var(--t-m); font-weight: 600; line-height: 1.3;
	color: var(--ink);
}
/* AWS pakker træfferne i <strong>. Messing i stedet for fed-i-fed. */
.aws_result_title strong { color: var(--messing); font-weight: 600; }

/* Rubrik, hierarki og sogeforslag stod i #aaa paa hvid -- laeseligt der,
   men for svagt paa moerk flade. */
.aws-search-result .aws_result_head .aws_result_heading,
.aws-search-result .aws_result_head .aws_result_hierarchy,
.aws-search-result .aws_result_term { color: var(--svag); }
.aws-search-result .aws_result_sku { color: var(--daempet); }
.aws-search-result .aws_result_stock { color: #7fb46a; }
.aws-search-result .aws_result_stock.out { color: var(--rust); }

/* Uddraget er skjult med vilje. Hver eneste produktbeskrivelse begynder med
   den samme gradueringsliste ("Graduering (Rating) liste Damaged 1.1. Poor -
   Figuren er i stykker..."), saa uddraget var identisk paa alle traeffere og
   fortalte intet. Raekken er billede, navn og pris -- som hos Nexora. */
.aws-search-result .aws_result_excerpt { display: none; }

.aws_result_price {
	font-size: var(--t-m); font-weight: 700;
	font-variant-numeric: tabular-nums;
	color: var(--ink);
}
.aws_result_price del { display: none; }
.aws_result_price ins { text-decoration: none; }

/* Sogeforslag ("mente du ..."): chip i #ededed med #222 tekst. */
.aws-search-result a.aws_term_suggestion,
.aws-search-result .aws_term_suggestion { color: var(--ink); }
.aws-search-result a.aws_term_suggestion { background: var(--bund); border: 1px solid var(--kant); }
.aws-search-result a.aws_term_suggestion:hover { background-color: var(--kant); }

/* Fodrækken: "Se alle resultater". AWS' egen farve er WordPress-blaa.
   Begge selektorer med vilje: jeg har ikke kunnet faa AJAX-svaret ud af
   pluginnet uden en session, saa det er ikke verificeret om raekken ligger
   inde i .aws_results eller ved siden af. Den ene af de to rammer. */
.aws-search-result .aws_result_item.aws_search_more,
.aws-search-result .aws_results .aws_result_item.aws_search_more {
	border-top: 1px solid var(--kant-staerk);
	border-bottom: 0;
	background: var(--bund);
	justify-content: center;
	padding: 11px 12px;
}
.aws-search-result .aws_search_more a {
	position: static; font-size: var(--t-s); font-weight: 600;
	letter-spacing: var(--sp-knap); text-transform: uppercase;
	color: var(--messing);
}
/* Og her er den, der blev ved med at staa WordPress-blaa (#21759b):
   raekken ER selve linket -- <a class="aws_result_item aws_search_more"> --
   og ikke en raekke MED et link i. Aflaest i DOM'en 20/9; den gamle regel
   ovenfor ramte derfor ingenting. Begge bliver staaende: AWS har skiftet
   opbygning én gang, og den kan skifte igen. */
.aws-search-result a.aws_search_more,
.aws-search-result .aws_results a.aws_search_more {
	display: flex; justify-content: center;
	color: var(--messing);
	font-size: var(--t-s); font-weight: 600;
	letter-spacing: var(--sp-knap); text-transform: uppercase;
	text-decoration: none;
}
.aws-search-result a.aws_search_more:hover { color: var(--ink); }
.aws-search-result .aws_search_more a:hover { background: transparent; color: var(--messing-lys); }

.aws_no_result {
	padding: 16px 12px; font-size: var(--t-m); color: var(--daempet);
	background: transparent;
}

/* --- Kurven i bånd 1 ----------------------------------------------------- */

.site-header-cart { list-style: none; margin: 0; padding: 0; position: relative; }
.site-header-cart .cart-contents {
	display: inline-flex; align-items: center; gap: 9px;
	font-size: var(--t-l); color: var(--ink); position: relative;
}
.site-header-cart .cart-contents::before {
	content: ""; width: 18px; height: 18px; flex: 0 0 auto;
	background: currentColor;
	-webkit-mask: var(--ikon-kurv) center / contain no-repeat;
	mask: var(--ikon-kurv) center / contain no-repeat;
}
/* Maerket er en cirkel, ikke en pille. Storefront skriver "0 varer" i
   taelleren; vores egen storefront_cart_link() skriver kun tallet, saa
   min-width og height kan vaere ens. Se inc-kurv.php. */
.site-header-cart .count {
	position: absolute; top: -8px; left: 10px;
	background: var(--messing); color: var(--paa-messing);
	font-size: var(--t-xs); font-weight: 700; line-height: 1;
	width: 17px; height: 17px; border-radius: 50%;
	display: grid; place-items: center; padding: 0;
	font-variant-numeric: tabular-nums;
}
.site-header-cart .tp-belob { font-weight: 600; font-variant-numeric: tabular-nums; }

/* --- Bånd 2: genveje ----------------------------------------------------- */

.tp-genveje { display: flex; align-items: center; gap: var(--r4); margin-left: auto; }
.tp-genvej {
	/* Samme trin OG samme vaegt som kategorierne -- de staar i samme baand.
	   Vaegten laa foer kun paa .tp-genvej--ny, og en genvej ved siden af en
	   anden i to forskellige vaegte laeser som en fejl. .tp-nav-top > li > a
	   er 600; det er tallet der gaelder her. Klassen bliver staaende selv om
	   der lige nu kun er én genvej. */
	font-size: var(--t-s); font-weight: 600; letter-spacing: var(--sp-knap);
	text-transform: uppercase;
	color: var(--nav-ink); white-space: nowrap;
}
/* Messing, praecis som .main-navigation a:hover. Stod foer paa var(--ink),
   hvilket var en halv rettelse: Nyheder havde ligget i messing i HVILE og
   skilt sig ud fra resten af baandet, og da hviletilstanden blev rettet,
   fulgte hover med ned paa hvid. Resultatet var en genvej der lyste hvidt
   mens kategorierne ved siden af lyste messing. */
.tp-genvej:hover { color: var(--messing); }
.tp-genvej.tp-aktiv { color: var(--messing); }

@media (max-width: 819px) {
	.site-header > .col-full {
		grid-template-columns: 1fr auto;
		gap: var(--r2) var(--r3);
		row-gap: var(--r2);
	}
	.site-search { grid-column: 1 / -1; justify-self: stretch; width: 100%; order: 3; }
	.site-search .aws-search-result { min-width: 0; }
	.tp-genveje { gap: var(--r3); }
	.tp-genvej { font-size: var(--t-s); }
}

@media (max-width: 819px) {
	/* ----------------------------------------------------------------------
	   Mobilheaderen, efter Nexora: ét baand med burger, logo i midten, og
	   soeg og kurv til hoejre. Kategoribaandet er vaek; soegefeltet foldes ud
	   under headeren naar man trykker paa glasset.

	   Placeringen sker med grid-areas og ikke med raekkefoelgen i DOM'en.
	   Delene kommer fra fem forskellige hooks paa storefront_header, og
	   den raekkefoelge kan ikke laves om uden at kopiere header.php.
	   ---------------------------------------------------------------------- */

	.site-header > .col-full {
		grid-template-columns: auto 1fr auto auto;
		grid-template-areas:
			"menu logo soeg kurv"
			"form form form form";
		gap: var(--r2);
		padding-block: var(--r2);
	}
	.tp-menuknap { grid-area: menu; }
	.site-branding  { grid-area: logo; justify-self: start; }
	.tp-soegknap { grid-area: soeg; }
	.site-header-cart { grid-area: kurv; justify-self: end; }
	.site-search { grid-area: form; width: 100%; }

	.tp-menuknap, .tp-soegknap {
		display: flex; align-items: center; justify-content: center;
		width: 38px; height: 38px; padding: 0;
		background: none; border: 0; color: var(--nav-ink); cursor: pointer;
	}
	.tp-soegknap svg { width: 21px; height: 21px; display: block; }

	/* Burgeren er tre streger lavet af én kasse plus dens to pseudoelementer.
	   Ingen SVG: en 2 px streg tegner sig skarpere som en baggrund end som en
	   skaleret vektor. */
	.tp-burger, .tp-burger::before, .tp-burger::after {
		display: block; width: 21px; height: 2px;
		background: currentColor; border-radius: 1px;
	}
	.tp-burger { position: relative; }
	.tp-burger::before, .tp-burger::after { content: ""; position: absolute; left: 0; }
	.tp-burger::before { top: -6px; }
	.tp-burger::after  { top: 6px; }
	.tp-menuknap[aria-expanded="true"] { color: var(--messing); }

	.site-branding img, .custom-logo { max-height: 34px; }

	/* Beloebet fylder for meget ved siden af ikonet paa en telefon; maerket
	   med antallet siger det noedvendige. */
	.site-header-cart .tp-belob { display: none; }
	.site-header-cart .cart-contents::before { width: 22px; height: 22px; }
	.site-header-cart .count { top: -6px; left: 13px; }

	/* Soegefeltet er foldet sammen indtil glasset trykkes. */
	.site-search { display: none; }
	.tp-soeg-aaben .site-search { display: block; }
	.tp-soeg-aaben .tp-soegknap { color: var(--messing); }

	/* Kategoribaandet er helt tomt paa mobil: menuen er en skuffe, se
	   inc-mobilmenu.php og afsnittet "Mobilmenuen" nedenfor. */
	.storefront-primary-navigation { border-top: 0; }
	.storefront-primary-navigation > .col-full { display: block; padding: 0; }
	.menu-toggle { display: none; }
	.primary-navigation { display: none; }
	.tp-genveje { display: none; }
	.handheld-navigation { display: none; }

	/* Storefronts egen foldemekanik (.dropdown-toggle, ul ul.toggled-on) er
	   fjernet herfra 18/9 sammen med den gamle mobilmenu. Den byggede paa at
	   navigation.js naaede at indsaette knapperne; gjorde den ikke det, stod
	   alle 40 punkter aabne. Skuffen folder ikke -- den gaar ét niveau ind.

	/* Ingen text-transform her med vilje. Punkterne staar som de staar i
	   databasen, og der er de blandede: "Warhammer" mod "WARHAMMER AGE OF
	   SIGMAR". Tvang man versaler igennem, ville begge niveauer raabe;
	   navnene selv er det der skal rettes, og kategorier roeres ikke uden
	   Hasse siger til. */
}

/* --------------------------------------------------------------------------
   Menubaandet: hvad der faktisk er plads til

   Baandet holder ét baand ned til 820 px, hvor mobilheaderen overtager.
   Maalt 7/9 paa 1440, 1280, 1140, 1024, 900, 860 og 820 px: 45 px, altsaa
   én raekke, hele vejen.

   Det gaar op med fem kategorier og én genvej i versaler paa 14 px. Der laa
   to indsnaevrende forespoergsler her, som strammede mellemrum og sperring
   mellem 820 og 1079 px, fordi baandet braekkede i to raekker med syv
   punkter paa 15 px. Begge dele er vaek nu -- baade punktet og de stoerre
   bogstaver -- og forespoergslerne er derfor fjernet igen frem for at staa
   som uvirksom CSS.

   Kommer der punkter til, er det HER det braekker foerst. Maal paa 820 px.
   -------------------------------------------------------------------------- */

/* ==========================================================================
   Forsiden er flyttet til forside.css
   Den fil indlaeses kun paa de sider der bruger den. Se inc-forside.php.
   ========================================================================== */

/* ==========================================================================
   Footerens koeb-baand og nyhedsbrev

   Historien i tre trin, saa den ikke bliver gaaet om igen:

   1. Blokken var en centreret boks paa 46rem der svaevede oven over
      footeren. Den hverken flugtede med footerens spalter eller hang fast i
      noget, saa den laeste som en indstik-annonce der var blevet glemt.
   2. Den blev et baand med et foto til venstre. Baandet loeste
      indlejringen, men fotoet var et 150x238 udsnit af det nyeste
      produktfoto -- et billede der ikke er komponeret til den beskaering --
      og den lyse sandbaggrund sloges med den moerke footer.
   3. Nu: rent typografisk, centreret i baandet. Der er ingenting at slaas
      med. Hasse valgte den 8/9.

   Skal der en dag et billede paa igen, skal det vaere ét bredt foto
   komponeret til formaalet -- samme behandling som heroen -- og ikke et
   udsnit af et produktfoto.
   ========================================================================== */

.tp-koeb {
	/* Ingen egen margen foroven: afstanden op til footerens kant kommer fra
	   footerens padding-block-start, og de to tal skal vaere ens. */
	margin-block: 0 var(--r5);
	background: var(--felt);
	/* Hel kant og radius: fladen er lysere end footeren, saa den laeses
	   som et kort. Med kant kun foroven og forneden saa den ud til at vaere
	   klippet af i siderne. */
	border: 1px solid var(--kant);
	border-radius: var(--radius);
}
/* To spalter og lav hoejde (18/9). Den centrerede udgave var hoej og smal og
   tog en hel skaerm paa vej ned til footeren; nu laeses den paa tvaers:
   overskriften til venstre, det man skal goere til hoejre. */
.tp-koeb-inder {
	/* Ingen egen maksbredde: baandet ligger allerede inde i footerens
	   .col-full, som holder sidens ramme (--bredde). Men fladen er MOERKERE
	   end footeren, saa den laeses som et kort -- og et kort skal have luft
	   indenfor sin egen kant. Uden den vandrette padding stod teksten klods
	   op ad kanten, tydeligst paa mobil. */
	padding: var(--r5) var(--r4);
	display: grid;
	/* gap: 0 med vilje. Spalteskiftet skal ramme PRAECIS midten, saa hoejre
	   spalte starter samme sted som footerens "SHOP"-kolonne nedenunder.
	   Den vandrette padding er symmetrisk, saa midten af indholdsboksen er
	   stadig midten af kortet. Et gap ville skubbe skiftet til hoejre. */
	grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
	gap: 0;
	/* Toppen og ikke midten: "SAELG TIL OS" og broedteksten skal starte paa
	   samme linje. */
	align-items: start;
}
.tp-koeb-handling { border-left: 0; padding-left: 0; }
.tp-koeb-over {
	margin: 0 0 var(--r1);
	font-size: var(--t-xs); font-weight: 700;
	letter-spacing: var(--sp-mikro); text-transform: uppercase; color: var(--messing);
}
.tp-koeb h2 {
	margin: 0;
	font-family: var(--font-display); font-weight: 400;
	font-size: clamp(24px, 3.2vw, 40px); line-height: 1.02;
	text-transform: uppercase; color: var(--ink);
	/* Overskriften maa gerne braekke i to linjer: den skal fylde sin spalte,
	   ikke presses ned i én lang streg tekst. */
	max-width: 16ch;
}
.tp-koeb-handling {
	display: flex; flex-direction: column; align-items: flex-start;
	gap: var(--r4);
}
.tp-koeb-brod {
	margin: 0;
	color: var(--daempet); max-width: 52ch; font-size: var(--t-s);
}

/* .site-footer a saetter --daempet paa ALLE links i footeren, og den regel
   staar foer denne. Knappen er et <a>, saa teksten blev graa paa messing. */
.tp-koeb a.tp-knap--fyldt,
.tp-koeb a.tp-knap--fyldt:hover { color: var(--paa-messing); }

@media (max-width: 819px) {
	.tp-koeb-inder {
		grid-template-columns: minmax(0, 1fr);
		gap: var(--r4);
		padding: var(--r4) var(--r3);
	}
	.tp-koeb h2 { max-width: none; }
}

/* Nyhedsbrevets CSS er slettet 18/9 sammen med markup'en i inc-footer.php.
   Kommer det igen, kommer formen ogsaa igen -- der stod 30 linjer doed CSS
   tilbage ellers. */

/* ==========================================================================
   Indholdssider er flyttet til sider.css
   Den fil indlaeses kun paa de sider der bruger den. Se inc-sider.php.
   ========================================================================== */

/* ==========================================================================
   Ventetilstand ved AJAX (blockUI)
   WooCommerce og BeRocket laegger et hvidt slaer over det de er ved at
   opdatere -- kurvens totaler, kassens oversigt, produktgitteret naar
   filteret aendres. Paa et moerkt tema blinker det som et lyn. Farven saettes
   inline af jQuery blockUI, saa den kan kun overskrives med !important.
   ========================================================================== */

.blockUI.blockOverlay {
	background: #fff !important;
	opacity: .25 !important;
}

/* BeRocket bruger sit eget slaer over hele skaermen naar filteret hentes:
   .bapf_loader_page paa rgba(255,255,255,.5). Samme problem, egen klasse. */
.bapf_loader_page {
	background: rgba(255, 255, 255, .25) !important;
}

/* --------------------------------------------------------------------------
   Mobilheaderens ikoner paa samme linje
   Kurven er en <ul> med et listepunkt; linjeboksen gav den 7 px ekstra under
   linket, saa ikonet stod hoejere end soegeglasset. Flexboks paa baade listen
   og punktet fjerner luften.
   -------------------------------------------------------------------------- */

@media (max-width: 819px) {
	.site-header-cart,
	.site-header-cart > li {
		display: flex;
		align-items: center;
		margin: 0;
	}
	.site-header-cart > li { height: 38px; }
}

/* Tom paginering. To tilfaelde, samme udseende:
   - .tp-mere-tom er pladsholderen der udskrives naar der kun er én side, saa
     BeRocket har noget at erstatte efter en filtrering.
   - :empty er den samme kasse efter at BeRocket HAR erstattet indholdet --
     pluginnet skifter kun det indre, saa klassen fra svaret naar aldrig frem.
   Uden begge stod der en vandret streg og 40 px luft under et enkelt kort. */
.tp-mere-tom,
.tp-mere:empty {
	margin: 0; padding: 0; border: 0; gap: 0;
}

/* Filteret skal ikke glide paa plads naar dets egen hoejde er maalt om --
   kun naar det foelger headeren. Se tp_sidebar_klaeb_js(). */
#secondary.tp-klaeb-brat { transition: none !important; }

/* ==========================================================================
   Sidens ramme — regler der skal gaelde ALLE sider

   De tre blokke herunder stod i afsnittet om kategoriarkivet, fordi det var
   dér de blev skrevet. Da arkivet flyttede i sin egen fil 14/9, ville de
   have fulgt med -- og saa havde mobilmenuens punkter haft én afstand paa
   katalogsider og en anden alle andre steder. Det er praecis den slags
   forskel mellem sider vi er ude paa at undgaa.

   Afsnittet ligger til sidst i basen med vilje. Kommentaren i mobilblokken
   siger hvorfor: reglerne skal staa EFTER headerens desktopafsnit, ellers
   vinder desktopreglerne paa raekkefoelge uanset skaermbredde.
   ========================================================================== */

/* Margin-collapse: uden den her kryber foerste overskrifts margin ud gennem
   indholdsrammen og skubber hele siden ned. */
.site-content > .col-full { display: flow-root; }

/* Sidens store overskrift. Den staar her og ikke i arkiv.css, saa en
   kategoriside og enhver anden skabelon der bruger entry-title faar
   noejagtig samme overskrift. */
.woocommerce-products-header__title,
.site-content h1.entry-title {
	font-family: var(--font-display);
	font-weight: 400;
	font-size: clamp(30px, 5vw, 44px);
	line-height: .96;
	letter-spacing: var(--sp-anton);
	text-transform: uppercase;
	margin: 0 0 var(--r1);
	/* Billedet over navnet. Det stod foer paa hoejre kant, men den plads er nu
	   optaget af sortering og antal pr. side, og billedet blev klemt.
	   Har kategorien intet billede, staar navnet alene og kolonnen kollapser
	   uden at rykke noget. */
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: var(--r3);
}

@media (max-width: 819px) {
	/* Mobilheaderen ligger til sidst i filen, ikke her. Se "Mobilheaderen"
	   nederst: reglerne skal staa EFTER headerens desktopafsnit, ellers
	   vinder desktopreglerne paa raekkefoelge uanset skaermbredde. */
	.main-navigation ul ul {
		position: static; display: block; border: 0; box-shadow: none;
		padding-left: var(--r3); max-height: none; background: transparent;
	}
	.main-navigation a { padding-block: .45rem; }
}

/* ==========================================================================
   Produktkortet og produktgitteret — en faelles byggeklods

   Det samme kort staar tre steder: i kategorigitteret, i forsidens
   karruseller og i "relaterede varer" under produktsiden. Derfor hoerer det
   i BASEN.

   Det laa i arkiv.css indtil 14/9 og var dermed uden styling paa
   produktsiden, hvor arkiv.css ikke indlaeses -- de relaterede varer faldt
   tilbage til Storefronts egne kort. produkt.css skriver oven paa disse
   regler (`grid-template-columns: none` for at lave gitteret om til en
   rullende raekke), saa uden dem havde den intet at skrive oven paa.
   ========================================================================== */

/* --------------------------------------------------------------------------
   Produktgrid
   -------------------------------------------------------------------------- */

ul.products {
	list-style: none; margin: 0; padding: 0;
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: var(--r3);
}
@media (min-width: 560px)  { ul.products { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
/* Kolonneantallet foelger kortbredden, ikke skærmen for sin egen skyld.
   Produktfotoerne er 500 px brede filer, saa et kort over ca. 250 px tvinger
   browseren op paa 720 px-filen ved DPR 2. Femte kolonne kommer derfor foerst
   naar siden er bred nok til at kortene BLIVER under det -- ca. 240 px. */
@media (min-width: 820px)  { ul.products { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (min-width: 1400px) { ul.products { grid-template-columns: repeat(5, minmax(0, 1fr)); } }

ul.products li.product {
	position: relative;
	display: flex; flex-direction: column;
	background: var(--flade);
	border: 1px solid var(--kant);
	border-radius: var(--radius);
	overflow: hidden;
	transition: border-color var(--overgang);
}
ul.products li.product:hover { border-color: var(--kant-staerk); }

ul.products li.product > a.woocommerce-LoopProduct-link {
	display: flex; flex-direction: column; height: 100%;
}

/* Fotoet: 3:4 og cover, saa motivet fylder kassen. 93 % af billederne ER
   3:4 og beskaeres derfor slet ikke; de faa der ikke er, faar en smal
   beskaering i stedet for sorte bjaelker. */
ul.products li.product img {
	display: block; width: 100%;
	aspect-ratio: 3 / 4;
	object-fit: cover;
	background: var(--flade-dyb);
	margin: 0;
}

/* Variant 1 — stablet: navn, metadata, pris. Hver på sin linje.
   Prisen skubbes til bunden så den står i samme højde i alle kort. */
ul.products li.product .tp-tekst {
	display: flex; flex-direction: column; flex: 1;
	padding: var(--r2) .7rem .7rem;
}
ul.products li.product .woocommerce-loop-product__title {
	font-size: var(--t-m); font-weight: 600; line-height: 1.28;
	margin: 0; color: var(--ink);
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
	overflow: hidden;
}
ul.products li.product .tp-meta {
	font-size: var(--t-xs); line-height: 1.35; color: var(--svag);
	margin: .25rem 0 0;
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
	overflow: hidden;
}
ul.products li.product .price {
	margin: auto 0 0; padding-top: .55rem;
	font-size: var(--t-l); font-weight: 700;
	font-variant-numeric: tabular-nums;
	color: var(--ink);
}
ul.products li.product .price del { color: var(--svag); font-weight: 400; margin-right: .35em; }
ul.products li.product .price ins { text-decoration: none; }
/* "kr." har samme vaegt som tallet, og WooCommerce saetter selv et
   &nbsp; foran naar valutaen staar til hoejre med mellemrum. */
ul.products li.product .price .woocommerce-Price-currencySymbol { font-weight: inherit; }
.price .woocommerce-Price-currencySymbol { font-weight: inherit; }

.tp-udsolgt {
	margin: auto 0 0; padding-top: .55rem;
	font-size: var(--t-xs); font-weight: 600;
	letter-spacing: var(--sp-vid); text-transform: uppercase;
	color: var(--svag);
}

/* Køb-knappen fylder ikke i gitteret; kortet er et link til varen. */
ul.products li.product .button { display: none; }

ul.products li.product .onsale {
	position: absolute; top: var(--r1); left: var(--r1); z-index: 1;
	background: var(--rust); color: #fff;
	font-size: var(--t-xs); font-weight: 700; letter-spacing: var(--sp-mikro); text-transform: uppercase;
	padding: .15rem .4rem;
}

/* ==========================================================================
   Karrusellerne loeber ud over sidens kant

   Indholdet er bundet af --bredde, og en karrusel der stopper praecis dér
   ser klippet over ud: sidste kort staar helt, og saa er der ingenting.
   Loeber sporet i stedet ud til skaermkanten, kan man SE at der er mere --
   og det er hele pointen med en karrusel.

   BEGGE sider haenger ud, saa kortene ogsaa forsvinder ud over venstre
   skaermkant naar man ruller. Foerste kort staar stadig i ro praecis paa
   linje med overskriften over det -- det er det padding og scroll-padding
   sikrer.

   Tallet kommer fra --tp-udhaeng, som maales af tp_udhaeng_js() i
   functions.php. Det kan ikke skrives i ren CSS: margin og padding regner
   procenter mod det indeholdende blok, mens scroll-padding regner dem mod
   rullefeltet, og de tre skal vaere ens. Foerste forsoeg brugte procenter
   og gav scrollLeft 24 med foerste kort i x=0, mens overskriften stod i
   x=24. Andet forsoeg haengte kun ud til hoejre og loeste ikke venstre side.

   Uden JavaScript er vaerdien 0, og karrusellerne staar inde i containeren
   som foer.

   50vw taeller rullepanelet med -- 8-17 px mere end det synlige omraade --
   og uden en vagt giver det vandret rulning paa HELE siden. Den vagt er
   overflow-x: clip paa body.

   Clip og ikke hidden, og det er ikke en detalje: hidden ville goere body
   til en rulle-beholder, og saa holder kategorisidens klaebende filter op
   med at klaebe, fordi sticky saa maaler mod body i stedet for mod vinduet.
   Clip laver ingen rulle-beholder.

   Én regel er nok: der er kun én karrusel-implementering, og den bruges
   baade paa forsiden og paa produktsiden. Se inc-karrusel.php.
   ========================================================================== */

body { overflow-x: clip; }

.tp-kar-spor {
	margin-inline: calc(-1 * var(--tp-udhaeng, 0px));
	padding-inline: var(--tp-udhaeng, 0px);
	/* Samme tal som padding, ellers snapper foerste kort ud i skaermkanten. */
	scroll-padding-inline: var(--tp-udhaeng, 0px);
}

/* ==========================================================================
   Indtoning

   Smaa, lette bevaegelser naar et afsnit kommer ind i skaermen. Reglerne er
   bevidst snaevre:

   - Kun opacity og transform. De to er de eneste egenskaber browseren kan
     animere uden at regne layout om, saa effekten koster ingen genberegning
     og kan ikke flytte noget paa siden (CLS = 0).
   - Alt haenger paa html.tp-anim, som JavaScript saetter i <head>. Sker det
     ikke -- ingen IntersectionObserver, eller brugeren har bedt om mindre
     bevaegelse -- er der ingen regel der skjuler noget. Intet kan blive
     staaende usynligt.
   - Hero-FOTOET roeres ikke. Det er sidens LCP-element, og Chrome maaler
     LCP naar elementet males. En indtoning paa et element paa opacity: 0
     udskyder derfor maalingen med hele sin varighed. Teksten ovenpaa maa
     gerne tone ind; fotoet skal staa der med det samme.
   - 14 px og en halv sekund. Mere bliver til en praesentation.
   ========================================================================== */

html.tp-anim [data-tp-ind] {
	opacity: 0;
	transform: translateY(14px);
	transition: opacity .5s ease, transform .5s cubic-bezier(.22, .61, .36, 1);
}
html.tp-anim [data-tp-ind].tp-vist {
	opacity: 1;
	/* none og ikke translateY(0): en transform -- ogsaa en der ikke flytter
	   noget -- goer elementet til en indeholdende blok for position: fixed.
	   Den skal ikke blive haengende efter effekten. */
	transform: none;
}

/* Boernene toner ind som en boelge, men de faar deres klasse fra
   FORAELDEREN. Det er med vilje: saetter man observeren paa hvert kort, kan
   et kort der staar langt ude i karrusellens rulle aldrig blive set, og saa
   staar det usynligt indtil man ruller derhen. Her bliver hele sporet vist
   paa én gang, og forsinkelsen laver boelgen. */
html.tp-anim [data-tp-ind] .tp-kar-spor > *,
html.tp-anim [data-tp-ind] .tp-flise,
html.tp-anim ul.products[data-tp-ind] > li.product {
	opacity: 0;
	transform: translateY(10px);
	/* border-color skal STAA HER OGSAA. `transition` er en kortform og
	   erstatter hele egenskaben -- ikke kun de dele den naevner. Kortets egen
	   `transition: border-color .15s` laengere nede tabte derfor til denne
	   regel, som vejer mere, og kantens skift paa hover var uden overgang
	   fra den dag indtoningen kom ind. Maalt 18/9: transitionProperty stod
	   paa "opacity, transform" paa hvert eneste produktkort. */
	transition: opacity .45s ease, transform .45s cubic-bezier(.22, .61, .36, 1),
	            border-color var(--overgang), color var(--overgang);
}
html.tp-anim [data-tp-ind].tp-vist .tp-kar-spor > *,
html.tp-anim [data-tp-ind].tp-vist .tp-flise,
html.tp-anim ul.products[data-tp-ind].tp-vist > li.product {
	opacity: 1; transform: none;
}
/* Kun de foerste seks. Resten staar alligevel udenfor skaermen, og en
   forsinkelse paa et halvt sekund for kort nummer tolv ville betyde at man
   kunne naa at rulle hen til et tomt felt. */
html.tp-anim [data-tp-ind].tp-vist .tp-kar-spor > :nth-child(1),
html.tp-anim [data-tp-ind].tp-vist .tp-flise:nth-child(1),
html.tp-anim ul.products[data-tp-ind].tp-vist > li.product:nth-child(1) { transition-delay: .03s; }
html.tp-anim [data-tp-ind].tp-vist .tp-kar-spor > :nth-child(2),
html.tp-anim [data-tp-ind].tp-vist .tp-flise:nth-child(2),
html.tp-anim ul.products[data-tp-ind].tp-vist > li.product:nth-child(2) { transition-delay: .07s; }
html.tp-anim [data-tp-ind].tp-vist .tp-kar-spor > :nth-child(3),
html.tp-anim [data-tp-ind].tp-vist .tp-flise:nth-child(3),
html.tp-anim ul.products[data-tp-ind].tp-vist > li.product:nth-child(3) { transition-delay: .11s; }
html.tp-anim [data-tp-ind].tp-vist .tp-kar-spor > :nth-child(4),
html.tp-anim [data-tp-ind].tp-vist .tp-flise:nth-child(4),
html.tp-anim ul.products[data-tp-ind].tp-vist > li.product:nth-child(4) { transition-delay: .15s; }
html.tp-anim [data-tp-ind].tp-vist .tp-kar-spor > :nth-child(5),
html.tp-anim [data-tp-ind].tp-vist .tp-flise:nth-child(5),
html.tp-anim ul.products[data-tp-ind].tp-vist > li.product:nth-child(5) { transition-delay: .19s; }
html.tp-anim [data-tp-ind].tp-vist .tp-kar-spor > :nth-child(6),
html.tp-anim [data-tp-ind].tp-vist .tp-flise:nth-child(6),
html.tp-anim ul.products[data-tp-ind].tp-vist > li.product:nth-child(6) { transition-delay: .23s; }

/* Paa papir er der ingen der ruller. Uden denne ville alt det man ikke
   naaede at se paa skaermen blive printet som blanke felter. */
@media print {
	html.tp-anim [data-tp-ind],
	html.tp-anim [data-tp-ind] .tp-kar-spor > *,
	html.tp-anim [data-tp-ind] .tp-flise,
	html.tp-anim ul.products[data-tp-ind] > li.product {
		opacity: 1 !important; transform: none !important; transition: none !important;
	}
}

/* ==========================================================================
   Karrusellen — faelles for forsiden og produktsiden

   Laa i forside.css indtil 15/9. Produktsiden havde sin egen karrusel med
   egne klasser, og de to drev fra hinanden: forskelligt kort, forskellig
   skrift i titlen, forskellig stoerrelse paa overskriften, og kun den ene
   havde en progress-bjaelke. Nu er der én implementering, og den hoerer
   derfor i basen.
   ========================================================================== */

/* --- Karrusellen --------------------------------------------------------
   Rulning med scroll-snap frem for et bibliotek. En karrusel af denne slags
   er 30 linjer CSS; produktsiden slaeber i forvejen rundt paa 47 eksterne
   scripts, og det tal skal ned, ikke op.
   ------------------------------------------------------------------------ */

.tp-kar-knapper { display: flex; gap: var(--r2); }
.tp-kar-knap { cursor: pointer; }
button.tp-kar-knap, button.tp-kar-knap:hover { background: transparent; }
.tp-kar-knap[disabled] { opacity: .3; cursor: default; }
button.tp-kar-knap[disabled]:hover { border-color: var(--kant-staerk); color: var(--daempet); }
/* Pilen er en drejet vinkel, ikke en SVG -- to streger tegner sig skarpere
   som kanter end som en skaleret vektor. */
.tp-kar-pil {
	width: .42em; height: .42em; font-size: 20px;
	border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
	transform: translateX(-2px) rotate(-45deg);
}
.tp-kar-pil--v { transform: translateX(2px) rotate(135deg); }

.tp-kar { position: relative; }
.tp-kar-spor {
	display: flex; gap: var(--r3);
	overflow-x: auto; scroll-snap-type: x mandatory;
	scrollbar-width: none;
	padding-bottom: var(--r2);
}
.tp-kar-spor::-webkit-scrollbar { display: none; }
.tp-kar-spor > * { scroll-snap-align: start; }

/* position: relative er ikke pynt.
   WooCommerce laegger et <span class="screen-reader-text"> ind i prisen paa
   variantprodukter ("Prisen er mellem ..."). Det span er
   `position: absolute` uden top/left, saa det tager sin statiske placering --
   og uden en positioneret forfader inde i karrusellen bliver dets
   indeholdende blok siden selv. Saa slipper det UD af rulleboksen, og et
   1 px bredt, usynligt element 3.000 px ude gav hele siden vandret rulning.

   Maalt 7/9: document.scrollWidth 2.984 mod et vindue paa 1.440, og
   `contain: paint` paa sporet fjernede det -- hvilket netop peger paa noget
   der slipper ud af klipningen og ikke paa selve boksens bredde.

   Produktgitteret har altid haft position: relative paa kortet, og derfor er
   fejlen aldrig vist sig dér. */
.tp-kar-kort {
	position: relative;
	flex: 0 0 var(--kar-bredde, 220px);
	background: var(--flade); border: 1px solid var(--kant);
	border-radius: var(--radius); overflow: hidden;
	transition: border-color .15s ease;
}
.tp-kar-kort:hover { border-color: var(--kant-staerk); }
.tp-kar-kort > a { display: flex; flex-direction: column; height: 100%; }
.tp-kar-foto { display: block; }
.tp-kar-foto img {
	display: block; width: 100%;
	aspect-ratio: 3 / 4; object-fit: cover;
	background: var(--flade-dyb);
}
.tp-kar-navn {
	padding: var(--r2) var(--r2) 0;
	font-size: var(--t-m); font-weight: 600; line-height: 1.3; color: var(--ink);
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
	overflow: hidden;
}
.tp-kar-meta { padding: 2px var(--r2) 0; font-size: var(--t-s); color: var(--svag); }
.tp-kar-pris {
	margin-top: auto; padding: var(--r2);
	font-size: var(--t-m); font-weight: 700; color: var(--ink);
	font-variant-numeric: tabular-nums;
}
.tp-kar-pris del { color: var(--svag); font-weight: 400; margin-right: 5px; }
.tp-kar-pris ins { text-decoration: none; }

/* Kampagnefeltet foerst i sporet, som paa Nexoras karrusel. Alt det der
   gaelder BEGGE fremhaevede felter -- foto, tekstblok, titel, knap -- staar
   i afsnittet "Fremhaevede felter" laengere oppe. Her kun stoerrelsen, som
   er det eneste der skiller dem: megamenuens felt har et fast 3:4-forhold,
   sporets skal vaere praecis lige saa hoejt som produktkortene ved siden af. */
.tp-kar-promo {
	flex: 0 0 var(--kar-bredde, 220px);
	/* Baade billede og tekst er absolut placeret, saa feltet har intet
	   indhold i flowet. Hoejden kommer fra at sporet straekker sine
	   elementer. min-height er en bund hvis den straekning en dag falder
	   vaek -- den kan ikke give cirkulaer afhaengighed, netop fordi ingen af
	   boernene bidrager med hoejde. */
	min-height: 300px;
	border-radius: var(--radius);
}

.tp-kar-bjaelke {
	/* r4 og ikke r2: sporet har selv padding-bottom, saa bjaelken laa taet paa
	   kortene og laeste som en del af dem i stedet for som en maaler. */
	margin-top: var(--r4); height: 3px; border-radius: 2px;
	background: var(--kant); overflow: hidden;
}
.tp-kar-bjaelke span {
	display: block; height: 100%; width: 30%;
	background: var(--messing); border-radius: 2px;
	transition: transform .1s linear;
}
.tp-kar-fuld .tp-kar-bjaelke { display: none; }

@media (min-width: 560px)  { .tp-kar-spor { --kar-bredde: 240px; } }
@media (max-width: 559px)  { .tp-kar-spor { --kar-bredde: 62vw; } }

/* ==========================================================================
   Mobilmenuen — skuffen med drill-down (18/9)

   Markup og JS: inc-mobilmenu.php. Hvorfor den afloeste Storefronts
   .handheld-navigation staar i filens hoved.

   To ting at holde fast i:

   1. Panelerne ligger oven paa hinanden i ét rullefelt (.tp-mm-rulle), og
      kun ét er synligt. `hidden` fjerner de andre fra bade tegning OG
      tabulatorraekken -- en skjult menu maa ikke kunne tabbes ind i.
   2. Rullezonen er panelet, ikke siden. Derfor `overscroll-behavior:
      contain`: uden den ruller SIDEN videre naar man rammer bunden af
      menuen, og det var halvdelen af "den er buggy".
   ========================================================================== */

.tp-mm-skygge {
	position: fixed; inset: 0; z-index: 120;
	background: rgba(0, 0, 0, .55);
	opacity: 0; visibility: hidden;
	transition: opacity .2s ease, visibility .2s ease;
}
.tp-mm {
	position: fixed; inset: 0 auto 0 0; z-index: 121;
	width: min(360px, 88vw);
	display: flex; flex-direction: column;
	background: var(--flade);
	border-right: 1px solid var(--kant-staerk);
	box-shadow: 18px 0 46px rgba(0, 0, 0, .55);
	/* Samme grund som kurvskuffen: uden visibility maler skyggen en moerk
	   stribe langs venstre kant paa hver eneste side. */
	visibility: hidden;
	transform: translateX(-100%);
	/* visibility skal VENTE til skuffen er koert ud, ellers forsvinder den
	   med det samme og udgangen ses aldrig -- den animerede kun ind.
	   `0s linear .22s` er ikke en overgang, men en forsinkelse paa selve
	   skiftet. Aabner den, skifter den med det samme (delay 0 nedenfor). */
	transition: transform .22s ease, visibility 0s linear .22s;
}
.tp-mm-aaben .tp-mm-skygge { opacity: 1; visibility: visible; }
.tp-mm-aaben .tp-mm {
	transform: translateX(0); visibility: visible;
	transition: transform .22s ease, visibility 0s linear 0s;
}
.tp-mm-aaben, .tp-mm-aaben body { overflow: hidden; }

.tp-mm-top {
	display: flex; align-items: center; gap: var(--r2);
	padding: var(--r3);
	border-bottom: 2px solid var(--messing);
}
.tp-mm-titel {
	margin: 0; flex: 1 1 auto;
	font-family: var(--font-display); font-weight: 400;
	font-size: var(--t-panel); letter-spacing: var(--sp-anton); text-transform: uppercase;
	color: var(--ink);
}

.tp-mm-rulle {
	position: relative;
	flex: 1 1 auto; min-height: 0;
	overflow-y: auto; overscroll-behavior: contain;
	-webkit-overflow-scrolling: touch;
}
.tp-mm-panel {
	padding: var(--r2) 0 var(--r4);
	transform: translateX(14px); opacity: 0;
	transition: transform .18s ease, opacity .18s ease;
}
.tp-mm-panel.tp-mm-vist { transform: none; opacity: 1; }

.tp-mm-liste { list-style: none; margin: 0; padding: 0; }
.tp-mm-punkt {
	display: flex; align-items: stretch;
	border-bottom: 1px solid var(--kant);
}
.tp-mm-link {
	flex: 1 1 auto; min-width: 0;
	display: flex; align-items: center;
	/* 48 px: hele raekken er beroeringsmaalet, ikke kun teksten. */
	min-height: 48px; padding: .6rem var(--r3);
	color: var(--ink); font-size: var(--t-m); line-height: 1.25;
	text-decoration: none;
}
.tp-mm-link:hover, .tp-mm-link:focus-visible { color: var(--messing); }
/* Pilen er sin EGEN knap ved siden af linket, ikke en knap oven paa det.
   I den gamle menu laa .dropdown-toggle absolut oven i raekken, og et tryk
   i hoejre side aabnede baade kategorien og foldede den ud. */
.tp-mm-ind {
	flex: 0 0 auto;
	width: 52px; min-height: 48px;
	display: flex; align-items: center; justify-content: center;
	background: none; border: 0; border-left: 1px solid var(--kant);
	color: var(--daempet); cursor: pointer; padding: 0;
}
.tp-mm-ind:hover { color: var(--messing); }
.tp-mm-ind svg, .tp-mm-tilbage svg {
	display: block; flex: none; width: 18px; height: 18px;
	fill: none; stroke: currentColor; stroke-width: 1.5;
	stroke-linecap: round; stroke-linejoin: round;
}

.tp-mm-tilbage {
	/* justify-content og text-align eksplicit: basens knapregel centrerer,
	   og raekken skal flugte med menupunkterne under den. */
	display: flex; align-items: center; justify-content: flex-start;
	text-align: left; gap: var(--r2);
	width: 100%; min-height: 44px; padding: .5rem var(--r3);
	background: none; border: 0; border-bottom: 1px solid var(--kant);
	color: var(--daempet); cursor: pointer;
	font-size: var(--t-xs); font-weight: 700;
	letter-spacing: var(--sp-mikro); text-transform: uppercase;
}
.tp-mm-tilbage svg { transform: rotate(180deg); }
.tp-mm-tilbage:hover { color: var(--ink); }

.tp-mm-alle {
	display: block; padding: .7rem var(--r3);
	border-bottom: 1px solid var(--kant);
	color: var(--messing); font-size: var(--t-s); font-weight: 600;
}

/* Skuffen findes kun paa mobil. Over 820 px er menubaandet der, og en aaben
   skuffe ville laase siden op i en tilstand man ikke kan komme ud af. */
@media (min-width: 820px) {
	.tp-mm, .tp-mm-skygge { display: none; }
}
@media (prefers-reduced-motion: reduce) {
	.tp-mm, .tp-mm-skygge, .tp-mm-panel { transition: none; }
}

/* ==========================================================================
   Topbjaelken ved sideskift — se inc-loader.php

   To ting at holde fast i:

   1. Den animeres med transform: scaleX og ikke med width. En bredde faar
      browseren til at regne layout om paa hver frame; en transform tegnes
      af grafikkortet. Det er den samme regel som for indtoningen.
   2. Den ligger over HEADEREN (z-index 130 mod headerens klaebende lag og
      skuffernes 121). En bjaelke der forsvinder bag logoet er ingen bjaelke.
   ========================================================================== */

.tp-loader {
	position: fixed; inset: 0 0 auto 0; z-index: 130;
	height: 3px;
	pointer-events: none;
	opacity: 0;
	transition: opacity .18s ease;
}
.tp-loader-koerer .tp-loader { opacity: 1; }
/* Faerdig: bjaelken staar et oejeblik i fuld bredde og toner saa ud --
   uden det forsvinder den, praecis naar den naar kanten, og man naar ikke
   at se at den blev faerdig. */
.tp-loader-faerdig .tp-loader { opacity: 0; transition: opacity .3s ease .1s; }

.tp-loader-bjaelke {
	display: block; width: 100%; height: 100%;
	background: var(--messing);
	box-shadow: 0 0 10px rgba(200, 162, 74, .7);
	transform: scaleX(0); transform-origin: 0 50%;
	transition: transform .24s ease-out;
}

@media (prefers-reduced-motion: reduce) {
	.tp-loader-bjaelke { transition: none; }
}

/* ==========================================================================
   Forslag i soegefeltet — se inc-soeg.php

   Panelet er bygget som AWS' eget resultatpanel (samme flade, kant, skygge
   og bredde), fordi de to skifter plads for oejnene af brugeren: det ene
   lukker praecis naar det andet aabner. Ser de forskellige ud, laeser det
   som to ting i stedet for ét felt der svarer.
   ========================================================================== */

/* Vaerten skal vaere positioneret, ellers haenger panelet under HEADEREN og
   ikke under feltet -- maalt paa desktop: 1280 px bredt og 131 px nede, hvor
   feltet staar fra 431 til 807. AWS' eget resultatpanel flyttes ud af formen
   og placeres af pluginnet selv, saa det roeres ikke af denne linje. */
.site-search .aws-container { position: relative; }

.tp-soegforslag {
	position: absolute; top: calc(100% + 6px); left: 0; right: 0;
	z-index: 120;
	background: var(--flade);
	border: 1px solid var(--kant-staerk);
	border-radius: 3px;
	box-shadow: 0 16px 38px rgba(0, 0, 0, .6);
	padding: var(--r3);
	display: flex; flex-direction: column; gap: var(--r3);
}
.tp-soegforslag[hidden] { display: none; }

.tp-soegforslag-top { display: flex; align-items: baseline; justify-content: space-between; gap: var(--r2); }
.tp-soegforslag-titel {
	margin: 0 0 var(--r2);
	font-size: var(--t-xs); font-weight: 700;
	letter-spacing: .14em; text-transform: uppercase;
	color: var(--svag);
}
.tp-soegforslag-top .tp-soegforslag-titel { margin-bottom: 0; }
.tp-soegforslag-top + .tp-soegforslag-liste { margin-top: var(--r2); }
.tp-soegforslag-ryd {
	background: none; border: 0; padding: 0; min-height: 0;
	color: var(--svag); cursor: pointer;
	font-family: var(--font); font-size: var(--t-xs);
	letter-spacing: .06em; text-transform: none;
	text-decoration: underline; text-underline-offset: 3px;
}
/* To klasser med vilje: den globale `button:hover` (0,1,1) giver messing
   baggrund til alt der er en knap, og en enkelt klasse taber til den. */
.tp-soegforslag .tp-soegforslag-ryd:hover,
.tp-soegforslag .tp-soegforslag-ryd:focus-visible {
	background: none; border: 0;
	color: var(--ink);
}

.tp-soegforslag-liste { list-style: none; margin: 0; padding: 0; }
.tp-soegforslag-ord {
	display: flex; align-items: center; gap: var(--r2);
	min-height: 38px; padding: 0 var(--r1);
	color: var(--ink); font-size: var(--t-m);
}
/* Uret foran ordet: et tegn ville arve skriftens egen linje og sidde skaevt,
   og en SVG skal have maal i CSS (se lukkekrydset). Masken loeser begge
   dele og tager farve fra teksten. */
.tp-soegforslag-ord::before {
	content: ""; flex: none; width: 15px; height: 15px;
	background: var(--svag);
	-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 7v5l3 2'/%3E%3C/svg%3E") center / contain no-repeat;
	mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 7v5l3 2'/%3E%3C/svg%3E") center / contain no-repeat;
}
.tp-soegforslag-ord:hover { color: var(--messing); }
.tp-soegforslag-ord:hover::before { background: var(--messing); }

.tp-soegforslag-chips { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: var(--r2); }
.tp-soegforslag-chips a {
	display: inline-flex; align-items: center;
	min-height: 34px; padding: 0 .85rem;
	border: 1px solid var(--kant); border-radius: 999px;
	background: var(--bund);
	color: var(--daempet); font-size: var(--t-s);
}
.tp-soegforslag-chips a:hover { color: var(--ink); border-color: var(--kant-staerk); }
