/*
 * Forsidens sektioner for shop.habe.dk.
 *
 * Adskilt fra site.css (rammen: sidehoved, navigation, sidefod) og fra
 * style.css (tokens og komponentregler), fordi forsiden er den eneste side
 * med disse sektioner. Ligger den for sig, kan den indlæses betinget senere
 * uden at resten af sitet skal pilles ved.
 *
 * Ingen !important og ingen hex-værdier: farverne kommer fra tokens i
 * style.css, så en tonejustering kun skal laves ét sted. Eneste undtagelse er
 * ikonerne under .habe-service — se kommentaren der.
 *
 * Målene herunder er hentet ud af designreferencen (design/HABE Forside.dc.html)
 * med getBoundingClientRect ved 1440 px, ikke skønnet. Står der 104 px i en
 * clamp, er det fordi referencen måler 104 px dér.
 *
 * Markuppen kommer fra Gutenberg, så vores klasser står side om side med
 * .wp-block-*. Derfor er selektorerne herunder ofte to klasser dybe: Gutenberg
 * skriver sine layout-regler i et <style> i <head>, og det kan stå EFTER vores
 * stilark. Én klasse ville give uafgjort på specificitet og et resultat der
 * afhænger af indlæsningsrækkefølgen.
 */

:root {
	/*
	 * Georgia er et MIDLERTIDIGT valg og IKKE brandets officielle font. Den
	 * står her som dokumenteret pladsholder, indtil licensen til den rigtige
	 * serif er på plads — så skal kun denne ene linje rettes.
	 */
	--habe-serif: Georgia, "Times New Roman", serif;

	/*
	 * Én luftvariabel frem for et tal pr. sektion. Skalerer med skærmen, så
	 * rytmen holder fra 375 til 1440 px uden et media query pr. trin.
	 *
	 * 52 px ved 1440 px. Referencen ligger på 48-58 px mellem sektionerne —
	 * ikke de 72 px vi havde før, som gjorde siden mærkbart længere end
	 * designet og skubbede produktgitteret under folden.
	 */
	--habe-forside-luft: clamp(2rem, 3.6vw, 3.25rem);
}

/*
 * Vandret overløb er den hyppigste mobilfejl og er usynlig på desktop. Grid- og
 * flex-børn får som udgangspunkt min-width:auto og nægter at krympe under deres
 * indhold — derfor nulstilles det her ét sted frem for sektion for sektion.
 */
.habe-hero,
.habe-service,
.habe-kat,
.habe-kampagne,
.habe-produkter,
.habe-redaktion {
	max-width: 100%;
}

.habe-hero__tekst,
.habe-hero__foto,
.habe-service__punkt,
.habe-kat__punkt,
.habe-kampagne__felt,
.habe-redaktion__felt {
	min-width: 0;
}

/* --------------------------------------------------------------- knapper */

.habe-knapper {
	display: flex;
	flex-wrap: wrap;
	gap: 0.75rem;
	margin-block: 0;
}

.habe-knap {
	margin: 0;
}

/*
 * Tre klasser dybt, fordi Blocksy selv farver .wp-block-button .wp-block-button__link
 * ud fra Customizerens knapfarve. To klasser ville give uafgjort.
 */
.habe-knapper .habe-knap .wp-block-button__link {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	/* 46 px: over de 44 px WCAG 2.5.8 kræver, også når teksten kun er én linje. */
	min-height: 2.875rem;
	padding: 0.8125rem 1.375rem;
	background-color: var(--habe-blaek);
	color: var(--habe-hvid);
	border: 1px solid var(--habe-blaek);
	/* Skarpe hjørner. Cirklen i logoet er identitetens eneste runding. */
	border-radius: 0;
	font-size: 0.78125rem;
	font-weight: 600;
	letter-spacing: 0.12em;
	text-transform: uppercase;
	text-decoration: none;
	line-height: 1.2;
	transition: background-color 0.2s ease, color 0.2s ease;
}

/*
 * Pilen er et tegn og ikke et ikonbillede, fordi den skal skifte farve sammen
 * med knappen ved hover. En data-URI kan ikke læse currentColor, og to
 * baggrundsbilleder (ét pr. tilstand) ville skulle rettes hver gang farven gør.
 */
.habe-knapper .habe-knap .wp-block-button__link::after {
	content: "\2192";
	margin-inline-start: 0.75em;
	/* Pilen er optisk mindre end versalerne; 1.15em stiller dem på linje. */
	font-size: 1.15em;
	letter-spacing: 0;
	line-height: 1;
}

.habe-knapper .habe-knap .wp-block-button__link:hover,
.habe-knapper .habe-knap .wp-block-button__link:focus-visible {
	background-color: var(--habe-hvid);
	color: var(--habe-blaek);
}

/* ------------------------------------------------------------------ hero */

/*
 * Heroen er alignfull i Gutenberg. Referencen lader den kølige flade gå helt
 * ud til kanten; holdt inde i indholdsbredden mistede den den vægt, den skal
 * have som sidens eneste kampagneflade over folden.
 */
.habe-hero {
	/* Servicebjælken støder op til heroen i referencen — ingen luft imellem. */
	margin-block-end: 0;
	/* Pile og prikker placeres i forhold til hele heroen. */
	position: relative;
	/*
	 * Grid, fordi alle slides skal ligge i SAMME celle. Absolut placerede
	 * slides ville ingen højde have, og heroen ville falde sammen til
	 * kontrollernes højde. Her bestemmer den højeste slide højden, og et
	 * skift kan ikke flytte noget under den.
	 */
	display: grid;
	/* Kontrollerne sidder tæt på kanten; intet af dem må kunne give vandret overløb. */
	overflow: hidden;
	/*
	 * Fotofeltets højde når heroen er stablet (≤781 px). Den står her og ikke
	 * i media query'et, fordi BÅDE fotofeltet og de to kontroller regner med
	 * den: pilene skal centreres på fotoet og prikkerne stå ved dets underkant.
	 * Tre steder med det samme tal er tre steder at glemme det ene.
	 */
	--habe-hero-foto-h: clamp(13.75rem, 62vw, 26.25rem);
	/*
	 * Fladen ligger på SEKTIONEN, ikke på tekstkolonnen: den skal fortsætte
	 * ind under fotoets venstre kant, hvor overgangen tones ud (se __foto::after).
	 *
	 * Én tone og ikke en rampe fra --habe-dis. Referencen ligger på #aeb7bc hele
	 * vejen (±5 i hver kanal), og en rampe gjorde venstre kant næsten hvid — så
	 * mistede heroen den vægt, der adskiller den fra den lyse servicebjælke
	 * lige under.
	 */
	background-color: var(--habe-graablaa);
}

.habe-hero .habe-hero__rk {
	/*
	 * Gap nulstilles: de to halvdele skal støde op til hinanden, så fladen bag
	 * teksten og fotoet læses som ét felt.
	 */
	gap: 0;
	align-items: stretch;
	/* 518 px ved 1440 px, som referencen. */
	min-height: clamp(18.75rem, 36vw, 33.75rem);
}

.habe-hero .habe-hero__tekst {
	display: flex;
	flex-direction: column;
	justify-content: center;
	padding-block: clamp(2.5rem, 5vw, 4.5rem);
	/* Samme venstremargen som referencens 64,8 px ved 1440 px. */
	padding-inline: clamp(1.25rem, 4.5vw, 4.5rem);
	/* Teksten står PÅ sektionens flade; en egen baggrund ville give en kant. */
	background-color: transparent;
	/*
	 * Den dæmpede tekstfarve er for lys mod --habe-graablaa (3,9:1, under
	 * WCAG 1.4.3). På den kølige hero bruges den fulde tekstfarve i stedet.
	 */
	color: var(--beautyshop-tekst);
	/* Referencens tekstspalte er 640 px bred, uanset hvor bred skærmen bliver. */
	max-inline-size: 40rem;
}

/*
 * Gutenbergs flow-layout lægger margin-block-start på hvert søskendeelement.
 * Det nulstilles, så afstandene herunder er de eneste der gælder — ellers
 * lægges de to sæt oven i hinanden.
 */
.habe-hero .habe-hero__tekst > * {
	margin-block: 0;
}

.habe-hero .habe-hero__over {
	font-size: 0.8125rem;
	font-weight: 500;
	letter-spacing: 0.42em;
	text-transform: uppercase;
	color: var(--beautyshop-tekst);
}

/*
 * Tekstoverskrift på en slide. BABOR-sliden bruger navnetrækket som billede
 * (se .habe-hero__navnetraek), men en kampagne for et mærke uden logografik
 * skal kunne sætte sin overskrift som tekst — derfor bliver reglen stående.
 */
.habe-hero .habe-hero__titel {
	/* Serif kun til de store redaktionelle overskrifter — se --habe-serif. */
	font-family: var(--habe-serif);
	font-weight: 400;
	font-size: clamp(3.5rem, 7.5vw, 6.5rem);
	line-height: 1.05;
	letter-spacing: 0.1em;
	margin-block-start: 1.125rem;
	color: var(--beautyshop-tekst);
}

.habe-hero .habe-hero__under {
	margin-block-start: 0.875rem;
	font-size: clamp(0.875rem, 1.4vw, 1.1875rem);
	font-weight: 500;
	letter-spacing: 0.28em;
	text-transform: uppercase;
	color: var(--beautyshop-tekst);
}

/*
 * Den tynde streg under "RESULTS. BEAUTY. YOU." er ren dekoration og hører
 * derfor ikke i indholdet — et tomt <div> i Gutenberg ville en redaktør før
 * eller siden slette ved et uheld.
 */
.habe-hero .habe-hero__under::after {
	content: "";
	display: block;
	width: 13.125rem;
	max-width: 100%;
	height: 1px;
	margin-block-start: 1rem;
	background-color: var(--habe-skifer);
}

.habe-hero .habe-hero__brod {
	margin-block-start: 1.625rem;
	font-size: 0.9375rem;
	/* 340 px som referencen — brødteksten må ikke nå ind under fotoet. */
	max-width: 21.25rem;
	line-height: 1.6;
	color: var(--beautyshop-tekst);
}

.habe-hero .habe-knapper--hero {
	margin-block-start: 1.875rem;
}

.habe-hero .habe-knapper--hero .habe-knap .wp-block-button__link {
	/* Heroens CTA er referencens største knap: 15/26 px padding, 13 px tekst. */
	padding: 0.9375rem 1.625rem;
	font-size: 0.8125rem;
	letter-spacing: 0.14em;
}

.habe-hero .habe-hero__foto {
	position: relative;
	padding: 0;
	overflow: hidden;
}

/*
 * Blød overgang mellem tekstfladen og fotoet. Uden den står fotoets venstre
 * kant som en lodret streg midt i heroen; med den glider de to halvdele
 * sammen til én flade, sådan som referencen gør det.
 */
.habe-hero .habe-hero__foto::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 1;
	pointer-events: none;
	background-image: linear-gradient(90deg, var(--habe-graablaa) 0%, transparent 26%);
}

/*
 * Figuren tages ud af flowet og spændes ud i kolonnen. Det er den eneste måde
 * at give <img> en HELT bestemt højde at fylde ud — en procenthøjde mod en
 * flex-strakt forælder er ikke garanteret på tværs af browsere.
 */
.habe-hero .habe-hero__billede {
	position: absolute;
	inset: 0;
	margin: 0;
}

.habe-hero .habe-hero__billede img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	/* Referencens udsnit: modellens ansigt i øverste tredjedel, ikke midt i. */
	object-position: 62% 22%;
}

/* ----------------------------------------------------------- hero-slider */

/*
 * Én slide = én gruppeblok med klassen habe-hero__slide. Alle slides ligger i
 * samme grid-celle og krydsfader med opacity.
 *
 * visibility følger med opacity af to grunde: et element med opacity:0 er
 * stadig klikbart og stadig med i tabulatorrækkefølgen, så uden den kunne man
 * tabbe ned i en skjult slides CTA og lande et sted man ikke kan se. Og
 * skærmlæseren ville læse alle slides op efter hinanden.
 */
.habe-hero .habe-hero__slide {
	grid-area: 1 / 1;
	/*
	 * Gutenbergs flow-layout lægger 24 px over hvert søskendeelement. Slide 2
	 * ligger i SAMME grid-celle som slide 1, så de 24 px blev ikke til luft
	 * mellem dem, men til en grå stribe under hele heroen.
	 */
	margin-block: 0;
	opacity: 0;
	visibility: hidden;
	/*
	 * Synligheden slukkes FØRST når fadet er slut (0s forsinket 550 ms) —
	 * ellers ville sliden forsvinde brat i stedet for at tone ud.
	 */
	transition: opacity 550ms ease, visibility 0s linear 550ms;
}

/*
 * Grid strækker SLIDEN til rækkens højde, men ikke dens indhold. Uden denne
 * højde ville en kort slide efterlade en grå strimmel under fotoet, fordi
 * rækken kun er så høj som sin egen min-height.
 *
 * height og ikke flex: rækken centrerer sig selv med margin-inline:auto, og
 * en auto-margen på tværs af en flex- eller grid-akse slår stretch fra. Så
 * ville kolonnerne skrumpe ind til deres indhold midt på siden — hvilket er
 * præcis det, der skete første gang.
 */
.habe-hero .habe-hero__slide > .habe-hero__rk {
	height: 100%;
}

/*
 * To tilstande, og rækkefølgen mellem dem er hele pointen:
 *
 *   - Uden JavaScript findes .er-aktiv ikke, og habe-hero--js sættes aldrig.
 *     Da viser vi den første slide og bygger ingen kontroller — en pil der
 *     ikke virker er værre end ingen pil.
 *   - Med JavaScript overtager .er-aktiv. Havde vi ladet :first-child gælde
 *     samtidig, ville slide 1 blive liggende synlig under alle de andre.
 */
.habe-hero:not(.habe-hero--js) > .habe-hero__slide:first-child,
.habe-hero.habe-hero--js > .habe-hero__slide.er-aktiv {
	opacity: 1;
	visibility: visible;
	transition-delay: 0s;
}

/*
 * Fotoet skal helt ud til højre kant, som i referencen.
 *
 * Den fælles regel nederst i filen giver alle sektionsrækker den samme
 * sideafstand, så teksten flugter med sidehovedet. Det er rigtigt til venstre,
 * men til højre efterlod den en grå strimmel mellem fotoet og kanten — og
 * "næste"-pilen kom til at stå i strimlen i stedet for på fotoet.
 *
 * Tre klasser dybt med vilje: den fælles regel er to klasser og står SENERE i
 * filen. Ved uafgjort vinder den sidste, så undtagelsen skal have en klasse mere.
 *
 * Kun side om side. Stablet ville et foto i fuld bredde mod en tekst med
 * sideafstand se ud som en fejl.
 */
@media (min-width: 782px) {
	.habe-hero .habe-hero__slide > .habe-hero__rk {
		padding-inline-end: 0;
	}
}

/*
 * BABOR-navnetrækket er et BILLEDE — aldrig en skrift. Det er brandets
 * logografik, og en "lignende" font er en forvanskning af et varemærke.
 * PHP-modulet løfter billedblokken op i sidens <h1>, så overskriften er
 * navnetrækket og alt-teksten bærer ordet.
 */
.habe-hero .habe-hero__navnetraek {
	margin-block: 1.5rem 0;
	/* Blokken kan være både <h1> og <p>; ingen af delene skal arve tekststil. */
	line-height: 0;
}

.habe-hero .habe-hero__navnetraek img {
	display: block;
	/* 240-370 px som referencen, men aldrig bredere end tekstspalten. */
	width: min(100%, clamp(15rem, 26vw, 23.125rem));
	height: auto;
}

/*
 * Udsnittet er en egenskab ved det ENKELTE foto, ikke ved heroen. Derfor en
 * modifikatorklasse redaktionen kan sætte i blok-editorens "Yderligere
 * CSS-klasse" frem for en regel pr. slide her i filen.
 */
.habe-hero .habe-hero__billede.is-fokus-hoejre img {
	object-position: 100% 30%;
}

/* ---------------------------------------------------- sliderens kontroller */

/*
 * Pilene bygges af JavaScript og findes derfor kun når der ER noget at bladre
 * i. Reglerne herunder rammer ikke noget, før der er mindst to slides.
 */
.habe-hero .habe-hero__pil {
	position: absolute;
	top: 50%;
	z-index: 5;
	transform: translateY(-50%);
	display: flex;
	align-items: center;
	justify-content: center;
	/* 40 px cirkel som referencen. Trykfladen udvides nedenfor til 44 px. */
	width: 2.5rem;
	height: 2.5rem;
	padding: 0;
	border: 0;
	border-radius: 50%;
	/*
	 * Knappen er en anelse gennemsigtig, så fotoet under den anes — og bliver
	 * helt hvid ved hover. Første erklæring er faldbagsværdi for browsere
	 * uden color-mix; de får en uigennemsigtig knap, ikke en usynlig.
	 */
	background-color: var(--habe-hvid);
	background-color: color-mix(in srgb, var(--habe-hvid) 92%, transparent);
	color: var(--habe-blaek);
	box-shadow: 0 2px 10px var(--beautyshop-kant);
	box-shadow: 0 2px 10px color-mix(in srgb, var(--habe-blaek) 16%, transparent);
	cursor: pointer;
	transition: background-color 0.2s ease;
}

/*
 * WCAG 2.5.5 vil have 44x44 px. Cirklen SKAL være 40 px i designet, så
 * trykfladen lægges udenom med et pseudoelement i stedet for at gøre knappen
 * større — et pseudoelement tæller med i knappens klikområde, men tegner
 * ingenting.
 */
.habe-hero .habe-hero__pil::before {
	content: "";
	position: absolute;
	inset: -0.125rem;
	border-radius: 50%;
}

.habe-hero .habe-hero__pil:hover {
	background-color: var(--habe-hvid);
}

.habe-hero .habe-hero__pil--forrige {
	inset-inline-start: 0.875rem;
}

.habe-hero .habe-hero__pil--naeste {
	inset-inline-end: 0.875rem;
}

.habe-hero .habe-hero__prikker {
	position: absolute;
	inset-block-end: 0;
	inset-inline-start: 50%;
	z-index: 5;
	transform: translateX(-50%);
	display: flex;
	/* Ingen gap: luften mellem prikkerne er knappernes egen bredde. */
	gap: 0;
}

/*
 * Prikken er 9 px, men trykfladen er 24x44 px.
 *
 * 44x44 pr. prik ville sprede dem 54 px fra hinanden og ødelægge rækken —
 * referencen har 22-23 px mellem centrene. 24 px bredde rammer designet og
 * holder sig samtidig over WCAG 2.5.8's minimum på 24x24 px. Højden er de
 * fulde 44 px, fordi der er plads til den nedad.
 */
.habe-hero .habe-hero__prik {
	display: flex;
	align-items: flex-end;
	justify-content: center;
	width: 1.5rem;
	height: 2.75rem;
	/* Prikkens underkant lander 16 px over heroens bund, som i referencen. */
	padding: 0 0 1rem;
	border: 0;
	background: none;
	cursor: pointer;
}

.habe-hero .habe-hero__prik::before {
	content: "";
	width: 0.5625rem;
	height: 0.5625rem;
	border-radius: 50%;
	/* Kanten holder prikken synlig, også hvor fotoet under den er lyst. */
	border: 1px solid var(--habe-graagroen);
	border: 1px solid color-mix(in srgb, var(--habe-blaek) 30%, transparent);
	background-color: var(--habe-graablaa);
	background-color: color-mix(in srgb, var(--habe-hvid) 45%, transparent);
	transition: background-color 0.2s ease;
}

.habe-hero .habe-hero__prik.er-aktiv::before {
	background-color: var(--habe-hvid);
}

/*
 * Fokusringen sættes eksplicit, selv om style.css har en fælles regel: den
 * rammer :where(button), og :where() har ingen specificitet. Én dag hvor
 * Blocksy sætter outline:none på knapper i en sektion, forsvinder den — og
 * en slider man ikke kan se fokus i, kan ikke betjenes med tastatur.
 *
 * Ingen border-radius her: outline følger knappens egen form, og en radius
 * ville gøre pilens cirkel til en afrundet firkant så længe den har fokus.
 */
.habe-hero .habe-hero__pil:focus-visible,
.habe-hero .habe-hero__prik:focus-visible {
	outline: var(--beautyshop-focus-outline);
	outline-offset: 2px;
}

/*
 * Crossfade er bevægelse. Har brugeren bedt om mindre af den, skifter sliden
 * øjeblikkeligt — og autoplay slås fra i JavaScript, så billedet kun skifter
 * når man selv klikker.
 */
@media (prefers-reduced-motion: reduce) {
	.habe-hero .habe-hero__slide {
		transition: none;
	}
}

/* Stablet: kontrollerne følger med op på fotoet, som er øverst. */
@media (max-width: 781px) {
	.habe-hero .habe-hero__pil {
		top: calc(var(--habe-hero-foto-h) / 2);
	}

	.habe-hero .habe-hero__prikker {
		/* Knappen er 44 px høj; dens underkant skal flugte med fotoets. */
		inset-block-end: auto;
		top: calc(var(--habe-hero-foto-h) - 2.75rem);
	}
}

/* -------------------------------------------------------------- service */

/*
 * Servicebjælken er alignfull, fordi referencens lyse bånd går fra kant til
 * kant. Indholdet holdes inde på 1440 px, så det flugter med resten af siden.
 */
.habe-service {
	margin-block-end: clamp(1.75rem, 3.5vw, 3.25rem);
	padding: clamp(1.25rem, 2.5vw, 1.875rem) clamp(1rem, 4vw, 3.5rem);
	background-color: var(--beautyshop-flade);
}

/*
 * Grid frem for Gutenbergs flex. WordPress' core-CSS tvinger
 * .wp-block-column { flex-basis: 100% !important } under 782 px, og den kan
 * ikke overskrives uden selv at bruge !important. Grid-børn ignorerer
 * flex-basis, så vi får styringen tilbage uden at bryde reglen.
 *
 * auto-fit frem for et fast kolonnetal: felterne falder selv fra 4 til 2 til 1,
 * og min(100%, 13.75rem) forhindrer at sporet bliver bredere end skærmen ved
 * 375 px — det er dér repeat(auto-fit, minmax(220px, 1fr)) normalt giver
 * vandret overløb.
 */
.habe-service .habe-service__rk {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 13.75rem), 1fr));
	gap: 1.25rem clamp(1rem, 3vw, 3rem);
	max-inline-size: 90rem;
	margin-inline: auto;
}

/*
 * Ikonet står til VENSTRE for teksten, ikke over den. To rækker og to spor:
 * ikonet spænder over begge rækker, så titel og undertekst står tæt sammen
 * uden at ikonet flytter sig, når underteksten brækker på en smal skærm.
 */
.habe-service .habe-service__punkt {
	display: grid;
	grid-template-columns: 1.875rem 1fr;
	grid-template-rows: auto auto;
	column-gap: 0.875rem;
	align-content: center;
	text-align: start;
	padding: 0;
}

.habe-service .habe-service__punkt > * {
	margin-block: 0;
}

/*
 * Ikonerne tegnes som inline SVG frem for at hente fire filer: fire ekstra
 * HTTP-kald for fire streger er ikke pengene værd, og en data-URI kan ikke
 * fejle med 404.
 *
 * Stregfarven står som rå hex (%231d1d1b = --habe-blaek). Det er IKKE en
 * forglemmelse: var() slår ikke igennem inde i en data-URI, fordi SVG'en
 * parses som sit eget dokument uden adgang til sidens custom properties.
 * Ændres --habe-blaek, skal de fire %231d1d1b herunder rettes med.
 */
.habe-service__punkt::before {
	content: "";
	grid-column: 1;
	grid-row: 1 / span 2;
	align-self: center;
	width: 1.875rem;
	height: 1.875rem;
	background-repeat: no-repeat;
	background-position: center;
	background-size: contain;
}

.habe-service__punkt.is-ikon-lastbil::before {
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231d1d1b' stroke-width='1.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M1.8 5.4h11.4v10.9H1.8z'/%3E%3Cpath d='M13.2 9.1h4.2l4 3.9v3.3h-8.2z'/%3E%3Ccircle cx='7' cy='18.3' r='1.9'/%3E%3Ccircle cx='17.4' cy='18.3' r='1.9'/%3E%3C/svg%3E");
}

.habe-service__punkt.is-ikon-maerkat::before {
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231d1d1b' stroke-width='1.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12.4 2.6h8.4a.6.6 0 0 1 .6.6v8.4l-9.5 9.5a1.6 1.6 0 0 1-2.3 0l-6.7-6.7a1.6 1.6 0 0 1 0-2.3z'/%3E%3Ccircle cx='17.4' cy='6.6' r='1.4'/%3E%3C/svg%3E");
}

.habe-service__punkt.is-ikon-pakke::before {
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231d1d1b' stroke-width='1.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.9 7.9v8.2a1.3 1.3 0 0 1-.7 1.2l-7.6 4.1a1.3 1.3 0 0 1-1.2 0l-7.6-4.1a1.3 1.3 0 0 1-.7-1.2V7.9a1.3 1.3 0 0 1 .7-1.2l7.6-4.1a1.3 1.3 0 0 1 1.2 0l7.6 4.1a1.3 1.3 0 0 1 .7 1.2z'/%3E%3Cpath d='M3.3 7.2 12 12l8.7-4.8M12 21.7V12M7.6 4.5l8.8 4.8'/%3E%3C/svg%3E");
}

.habe-service__punkt.is-ikon-hjerte::before {
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231d1d1b' stroke-width='1.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.4 5.7a5 5 0 0 0-7.1 0L12 7l-1.3-1.3a5 5 0 1 0-7.1 7.1l1.3 1.3L12 21.2l7.1-7.1 1.3-1.3a5 5 0 0 0 0-7.1z'/%3E%3C/svg%3E");
}

.habe-service .habe-service__titel {
	grid-column: 2;
	align-self: end;
	font-size: 0.875rem;
	font-weight: 600;
	line-height: 1.3;
	color: var(--beautyshop-tekst);
}

.habe-service .habe-service__tekst {
	grid-column: 2;
	align-self: start;
	margin-block-start: 0.125rem;
	font-size: 0.8125rem;
	line-height: 1.4;
	color: var(--beautyshop-tekst-daempet);
}

/* ---------------------------------------------------------- kategorier */

.habe-kat {
	margin-block-end: var(--habe-forside-luft);
}

/*
 * Cirklerne har FAST diameter (104 px på desktop, som referencen) og fordeles
 * med space-between. Før var de 1fr hver og voksede til 125 px ved 1440 px —
 * de tog dermed mere plads end designet gav dem og skubbede kampagnefelterne
 * ned.
 *
 * Grid og ikke flex, af samme grund som .habe-service__rk: core tvinger
 * flex-basis:100% !important på .wp-block-column under 782 px, og så ville
 * hver cirkel fylde en hel række. Grid-børn ignorerer flex-basis.
 *
 * Rækken scroller vandret på alle bredder, sådan som referencen gør. På smalle
 * skærme er det den eneste måde at holde cirklerne store nok til at motivet
 * kan ses.
 */
.habe-kat .habe-kat__rk {
	display: grid;
	grid-auto-flow: column;
	grid-auto-columns: minmax(4.75rem, max-content);
	justify-content: space-between;
	gap: clamp(0.875rem, 2vw, 1.75rem);
	overflow-x: auto;
	/* contain: en scroll til enden må ikke føre videre til hele siden. */
	overscroll-behavior-x: contain;
	scroll-snap-type: x proximity;
	scroll-padding-inline: 0.25rem;
	/* Luft til fokusringen, som ellers klippes af overflow. */
	padding-block: 0.25rem 0.5rem;
}

.habe-kat .habe-kat__punkt {
	padding: 0;
	scroll-snap-align: start;
}

.habe-kat__link {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 0.75rem;
	min-width: 4.75rem;
	text-decoration: none;
	color: var(--beautyshop-tekst);
}

/*
 * Både width og height sættes eksplicit. aspect-ratio alene er ikke pålideligt
 * her: kombineret med loading="lazy" kan billedet måle 0 px, inden filen er
 * hentet, og efterlade et tomt hul i rækken.
 */
.habe-kat__billede {
	display: block;
	width: clamp(4.5rem, 7.2vw, 6.5rem);
	height: clamp(4.5rem, 7.2vw, 6.5rem);
	border-radius: 50%;
	object-fit: cover;
	background-color: var(--beautyshop-flade);
	transition: box-shadow 0.2s ease;
}

/*
 * Den niende cirkel, Tilbud, har ingen fotokilde i designpakken — referencen
 * tegner den som et %-tegn på den samme lyse flade. Den løses derfor i tekst
 * og ikke med et billede: så er der intet motiv at rettighedsafklare, og
 * tegnet skalerer skarpt på alle skærme.
 */
.habe-kat__billede--procent {
	display: flex;
	align-items: center;
	justify-content: center;
	font-family: var(--habe-serif);
	font-size: clamp(1.75rem, 3vw, 2.5rem);
	line-height: 1;
	color: var(--beautyshop-tekst);
}

.habe-kat__link:hover .habe-kat__billede,
.habe-kat__link:focus-visible .habe-kat__billede {
	/* En 1 px ring, ikke en skygge — identiteten er flad. */
	box-shadow: 0 0 0 1px var(--habe-graagroen);
}

.habe-kat__navn {
	font-size: 0.8125rem;
	letter-spacing: 0.04em;
	line-height: 1.3;
	text-align: center;
	color: var(--beautyshop-tekst);
}

.habe-kat__link:hover .habe-kat__navn {
	text-decoration: underline;
	text-underline-offset: 0.25em;
}

/* --------------------------------------------------------------- kampagne */

.habe-kampagne {
	margin-block-end: var(--habe-forside-luft);
}

.habe-kampagne .habe-kampagne__rk {
	gap: clamp(1rem, 2vw, 1.75rem);
	/* stretch, så de to felter bliver lige høje uanset hvem der har mest tekst. */
	align-items: stretch;
}

/*
 * Fotoet ligger BAG teksten i samme felt, ikke over eller under den. Sådan
 * gør referencen, og det er forskellen mellem et kampagnefelt og to stablede
 * blokke: felterne var 581 px høje, referencens er 346 px.
 */
.habe-kampagne .habe-kampagne__felt {
	position: relative;
	display: flex;
	flex-direction: column;
	justify-content: center;
	overflow: hidden;
	padding: clamp(1.5rem, 3vw, 3rem);
	min-height: clamp(17.5rem, 24vw, 22.5rem);
}

/*
 * z-index på teksten er nødvendig: billedfiguren er absolut placeret og ville
 * ellers male hen over sine ikke-placerede søskende, uanset rækkefølgen i
 * markuppen.
 */
.habe-kampagne .habe-kampagne__felt > * {
	position: relative;
	z-index: 1;
	margin-block: 0;
	/*
	 * Teksten skal blive på sin halvdel og ikke løbe ind i motivet. Målt på
	 * referencen fylder tekstspalten 45 % af feltets indholdsboks — både ved
	 * 1440 og ved 1024 px. Et fast rem-tal ramte kun den ene bredde og lod
	 * overskriften stå på to linjer i stedet for tre ved 1024 px.
	 * max(): under ca. 800 px ville 45 % blive smallere end de 176 px,
	 * "DER GØR EN" kræver på én linje.
	 */
	max-inline-size: min(100%, max(11rem, 45%));
}

.habe-kampagne__felt--lys {
	/*
	 * Kølig gradient, ikke en flad tone: referencen lader feltet blive mørkere
	 * mod motivet, så packshotet ikke står på en synlig kant.
	 */
	background-image: linear-gradient(100deg, var(--habe-dis) 0%, var(--habe-dis) 55%, var(--habe-graablaa) 100%);
	color: var(--beautyshop-tekst);
}

.habe-kampagne__felt--moerk {
	background-color: var(--habe-blaek);
	color: var(--habe-hvid);
}

/* Det mørke felt er smallere, men giver teksten en større andel — 54 % målt
   på referencen mod det lyse felts 45 %. */
.habe-kampagne .habe-kampagne__felt--moerk > * {
	max-inline-size: min(100%, max(10rem, 54%));
}

.habe-kampagne .habe-kampagne__titel {
	font-family: var(--habe-serif);
	font-weight: 400;
	font-size: clamp(1.5rem, 2.4vw, 2.125rem);
	line-height: 1.2;
	letter-spacing: 0.02em;
	color: inherit;
}

.habe-kampagne .habe-kampagne__felt > p {
	margin-block-start: 0.875rem;
	font-size: 0.875rem;
	line-height: 1.55;
}

/*
 * Den dæmpede tone ligger på 3,9:1 mod gradientens mørke ende og falder under
 * WCAG 1.4.3. Brødteksten står derfor i den fulde tekstfarve her.
 */
.habe-kampagne__felt--lys > p {
	color: var(--beautyshop-tekst);
}

/*
 * --habe-graablaa er for lys til lille tekst på hvid (WCAG 1.4.3), men på den
 * mørke flade er forholdet omvendt og rigeligt. Derfor kun her.
 */
.habe-kampagne__felt--moerk > p {
	color: var(--habe-graablaa);
}

.habe-kampagne .habe-knapper {
	margin-block-start: 1.375rem;
}

/* Omvendt knap: den mørke fyldte knap ville forsvinde i den mørke flade. */
.habe-kampagne__felt--moerk .habe-knapper .habe-knap .wp-block-button__link {
	background-color: transparent;
	color: var(--habe-hvid);
	border-color: var(--habe-hvid);
}

.habe-kampagne__felt--moerk .habe-knapper .habe-knap .wp-block-button__link:hover,
.habe-kampagne__felt--moerk .habe-knapper .habe-knap .wp-block-button__link:focus-visible {
	background-color: var(--habe-hvid);
	color: var(--habe-blaek);
}

/*
 * Fokusringen kommer fra style.css og er tegnet i blækfarve. På den mørke
 * flade ville den være usynlig — og en fokusmarkering man ikke kan se, er
 * ingen fokusmarkering (WCAG 2.4.7). Derfor vendes kun farven her.
 */
.habe-kampagne__felt--moerk .habe-knapper .habe-knap .wp-block-button__link:focus-visible {
	outline-color: var(--habe-hvid);
}

/*
 * Motivet spændes ud i feltets højre side. Både inset-block og width er
 * definitive mål — figuren har ingen egen højde at falde tilbage på, og et
 * lazy-loaded billede uden definitiv højde måler 0 px, indtil filen er hentet.
 */
.habe-kampagne .habe-kampagne__billede {
	position: absolute;
	inset-block: 0;
	inset-inline-end: 0;
	width: 52%;
	max-inline-size: none;
	margin: 0;
	z-index: 0;
	overflow: hidden;
}

.habe-kampagne .habe-kampagne__felt--moerk .habe-kampagne__billede {
	width: 62%;
}

/*
 * Blødt skæl mellem tekstflade og motiv, som i heroen. z-index er nødvendig,
 * fordi ::before står før <img> i træet og ellers ville blive malet under det.
 */
.habe-kampagne .habe-kampagne__billede::before {
	content: "";
	position: absolute;
	inset-block: 0;
	inset-inline-start: 0;
	width: 42%;
	z-index: 1;
	pointer-events: none;
}

.habe-kampagne__felt--lys .habe-kampagne__billede::before {
	background-image: linear-gradient(90deg, var(--habe-dis) 0%, transparent 100%);
}

.habe-kampagne__felt--moerk .habe-kampagne__billede::before {
	background-image: linear-gradient(90deg, var(--habe-blaek) 0%, transparent 100%);
}

.habe-kampagne .habe-kampagne__billede img {
	position: absolute;
	inset: 0;
	display: block;
	width: 100%;
	height: 100%;
	/*
	 * cover, ikke contain: de nye motiver er beskårne kampagnefotos i næsten
	 * samme format som feltet, så der er under 5 % at skære af. Den tidligere
	 * contain-undtagelse for det lyse felt var nødvendig, dengang motivet var
	 * et rent packshot i 988x1000 — den er væk med billedet.
	 */
	object-fit: cover;
}

.habe-kampagne .habe-kampagne__felt--moerk .habe-kampagne__billede img {
	/* Ansigtet ligger til venstre i kildefilen og ville ellers blive beskåret. */
	object-position: 30% center;
}

/* -------------------------------------------------------------- produkter */

.habe-produkter {
	margin-block-end: var(--habe-forside-luft);
}

/*
 * Referencen har ingen streg under sektionsoverskriften og skriver den med
 * store og små bogstaver. Versalerne og linjen gjorde overskriften tungere end
 * produkterne, som er det man skal se her.
 */
.habe-produkter .habe-sektionshoved {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 0.5rem 1.5rem;
	margin-block-end: clamp(1.125rem, 2vw, 1.75rem);
	padding-block-end: 0;
	border-block-end: 0;
}

.habe-produkter .habe-sektionshoved h2 {
	margin: 0;
	font-size: clamp(1.25rem, 1.8vw, 1.5rem);
	font-weight: 700;
	letter-spacing: 0.01em;
	text-transform: none;
	color: var(--beautyshop-tekst);
}

.habe-sektionshoved__link {
	margin: 0;
}

.habe-sektionshoved__link a {
	display: inline-flex;
	align-items: center;
	/* 44 px klikområde selv om teksten kun er 14 px høj (WCAG 2.5.8). */
	min-height: 2.75rem;
	font-size: 0.875rem;
	font-weight: 400;
	letter-spacing: 0;
	text-transform: none;
	color: var(--beautyshop-tekst);
	/*
	 * Understregning også uden hover: linket må ikke kun skille sig ud på
	 * farve (WCAG 1.4.1). Det er en bevidst afvigelse fra referencen, som
	 * lader linket stå uden nogen anden markør end pilen.
	 */
	text-decoration: underline;
	text-underline-offset: 0.35em;
	text-decoration-thickness: 1px;
}

.habe-sektionshoved__link a::after {
	content: "\2192";
	margin-inline-start: 0.5rem;
	text-decoration: none;
}

.habe-sektionshoved__link a:hover {
	color: var(--beautyshop-tekst-daempet);
}

/*
 * WooCommerce' blok-grid er flex med max-width i procent pr. kort. Vi erstatter
 * den med grid, så kolonnetallet styres ét sted og sidste række ikke strækkes.
 *
 * Selektoren er bevidst tung. WooCommerce sætter selv
 * .wc-block-grid.has-5-columns .wc-block-grid__products { display: block }
 * under 480 px — tre klasser, altså uafgjort med to af vores. Ved uafgjort
 * afgør indlæsningsrækkefølgen, og blok-stilarket kan ende efter vores.
 * ul-elementet i selektoren er det der bryder den uafgjorthed uden !important.
 */
.habe-produktgitter.wc-block-grid ul.wc-block-grid__products {
	display: grid;
	/*
	 * Sporbredden og ikke kolonnetallet er det faste, præcis som i referencen:
	 * 150-226 px pr. kort. Et fast repeat(5) med et brud ved 1200 px gav tre
	 * 295 px brede kort ved 1024 px, hvor referencen viser fem — og skubbede
	 * alt under produkterne næsten 800 px ned.
	 *
	 * min(100%, ...) er gulvet der holder sporet inde på skærmen ved 375 px;
	 * uden det giver minmax() vandret overløb, så snart minimumsbredden er
	 * større end containeren.
	 */
	grid-template-columns: repeat(auto-fill, minmax(min(100%, clamp(9.375rem, 15.5vw, 14.125rem)), 1fr));
	gap: clamp(0.875rem, 1.8vw, 1.625rem);
	margin: 0;
	padding: 0;
	list-style: none;
}

.habe-produktgitter.wc-block-grid ul.wc-block-grid__products > li.wc-block-grid__product {
	display: flex;
	flex-direction: column;
	width: auto;
	max-width: none;
	min-width: 0;
	margin: 0;
	padding: 0;
	/*
	 * WooCommerce laver mellemrummet mellem kortene med en GENNEMSIGTIG kant
	 * (0 8px 16px), ikke med padding. Den skal nulstilles med: ellers er
	 * kortets billedfelt 16 px smallere end kortet, og der står 16 px tom luft
	 * under hver knap, som vores gap i forvejen har sørget for.
	 */
	border: 0;
	text-align: start;
}

.habe-produktgitter.wc-block-grid .wc-block-grid__product-link {
	display: block;
	/* Uden dette krymper WooCommerce linket, og billedfeltet bliver 16 px
	   smallere end kortet — synligt som en hvid kant langs den grå flade. */
	width: 100%;
	max-width: none;
	text-decoration: none;
	color: inherit;
}

.habe-produktgitter.wc-block-grid .wc-block-grid__product-image {
	display: block;
	margin: 0 0 0.75rem;
	/* Hvid, ikke tonet — se begrundelsen ved --beautyshop-vareflade i style.css. */
	background-color: var(--beautyshop-vareflade);
}

.habe-produktgitter.wc-block-grid .wc-block-grid__product-image img {
	display: block;
	width: 100%;
	/* 7:6 som referencens billedfelt — lavere end kvadratet, vi havde før. */
	aspect-ratio: 7 / 6;
	/*
	 * contain, ikke cover: varefotoene spænder fra høje flakoner til flade
	 * æsker, og cover ville skære de smalle midt over. Samme valg som i
	 * style.css for kataloggitteret, og derfor også en bevidst afvigelse fra
	 * referencen, hvis mockup-motiver alle havde samme format.
	 */
	object-fit: contain;
}

.habe-produktgitter.wc-block-grid .wc-block-grid__product-title {
	margin: 0 0 0.375rem;
	font-size: 0.875rem;
	font-weight: 500;
	line-height: 1.4;
	color: var(--beautyshop-tekst);
	text-decoration: none;
}

.habe-produktgitter.wc-block-grid .wc-block-grid__product-link:hover .wc-block-grid__product-title {
	text-decoration: underline;
	text-underline-offset: 0.2em;
}

.habe-produktgitter.wc-block-grid .wc-block-grid__product-price {
	/*
	 * WooCommerces blokstilark centrerer prisen. text-align:start på <li>
	 * arves ikke hertil, fordi elementet selv får en værdi — derfor sættes den
	 * eksplicit, så pris, navn og knap flugter i venstre kant som i referencen.
	 */
	text-align: start;
	/* WooCommerce centrerer prisen med margin-inline:auto — den skal nulstilles,
	   ikke kun tekstjusteringen. */
	margin-inline: 0;
	/* margin-block-end:auto skubber knappen ned, så alle kort flugter forneden. */
	margin-block-start: 0;
	margin-block-end: auto;
	padding-block-end: 0.875rem;
	font-size: 0.9375rem;
	font-weight: 700;
	color: var(--beautyshop-tekst);
}

.habe-produktgitter.wc-block-grid .wc-block-grid__product-add-to-cart {
	margin: 0;
}

/*
 * Kurv-knappen er tonet ned til en outline. Fyldt sort fem gange på række ville
 * trække blikket væk fra varerne, som er det man skal se her.
 */
.habe-produktgitter.wc-block-grid .wc-block-grid__product-add-to-cart .wp-block-button__link {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	min-height: 2.75rem;
	padding: 0.6rem 0.75rem;
	background-color: transparent;
	color: var(--beautyshop-tekst);
	border: 1px solid var(--beautyshop-tekst);
	border-radius: 0;
	font-size: 0.6875rem;
	font-weight: 600;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	text-decoration: none;
	line-height: 1.2;
	transition: background-color 0.2s ease, color 0.2s ease;
}

.habe-produktgitter.wc-block-grid .wc-block-grid__product-add-to-cart .wp-block-button__link:hover,
.habe-produktgitter.wc-block-grid .wc-block-grid__product-add-to-cart .wp-block-button__link:focus-visible {
	background-color: var(--beautyshop-tekst);
	color: var(--habe-hvid);
}

/* -------------------------------------------------------------- redaktion */

.habe-redaktion {
	margin-block-end: var(--habe-forside-luft);
}

.habe-redaktion .habe-redaktion__rk {
	gap: clamp(1rem, 2vw, 1.75rem);
	align-items: stretch;
}

/*
 * Samme opbygning som kampagnefelterne: motiv bag teksten i højre side. Før
 * lå billedet over overskriften i 3:2, og de to felter blev 591 px høje mod
 * referencens 317 px.
 */
.habe-redaktion .habe-redaktion__felt {
	position: relative;
	display: flex;
	flex-direction: column;
	justify-content: center;
	align-items: flex-start;
	overflow: hidden;
	padding: clamp(1.5rem, 3vw, 3rem);
	min-height: clamp(16.25rem, 22vw, 20.625rem);
	/*
	 * Referencen bruger to næsten ens lyse toner (#eef1f2 og #e3e0dd). Der
	 * findes ingen varm grå i tokenlisten, og nye hex-værdier er ikke tilladt,
	 * så begge felter står på --beautyshop-flade. Skal den varme tone med,
	 * kræver det et nyt token i style.css.
	 */
	background-color: var(--beautyshop-flade);
}

.habe-redaktion .habe-redaktion__felt > * {
	position: relative;
	z-index: 1;
	margin-block: 0;
	/* 51 % af indholdsboksen, målt på referencen — se kampagnefelterne. */
	max-inline-size: min(100%, max(11rem, 51%));
}

.habe-redaktion .habe-redaktion__billede {
	position: absolute;
	inset-block: 0;
	inset-inline-end: 0;
	width: 48%;
	max-inline-size: none;
	margin: 0;
	z-index: 0;
	overflow: hidden;
}

/*
 * Referencen giver det højre felts motiv lidt mere plads end det venstre
 * (52 % mod 48 %), fordi portrættet skal kunne ses uden at ansigtet beskæres.
 */
.habe-redaktion .habe-redaktion__rk > :last-child .habe-redaktion__billede {
	width: 52%;
}

.habe-redaktion .habe-redaktion__billede::before {
	content: "";
	position: absolute;
	inset-block: 0;
	inset-inline-start: 0;
	width: 42%;
	z-index: 1;
	pointer-events: none;
	background-image: linear-gradient(90deg, var(--beautyshop-flade) 0%, transparent 100%);
}

.habe-redaktion .habe-redaktion__billede img {
	position: absolute;
	inset: 0;
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.habe-redaktion .habe-redaktion__titel {
	font-family: var(--habe-serif);
	font-weight: 400;
	font-size: clamp(1.5rem, 2.3vw, 2.0625rem);
	line-height: 1.15;
	color: var(--beautyshop-tekst);
}

.habe-redaktion .habe-redaktion__felt > p {
	margin-block-start: 0.75rem;
	font-size: 0.875rem;
	line-height: 1.55;
	color: var(--beautyshop-tekst);
}

.habe-redaktion .habe-knapper {
	margin-block-start: 1.375rem;
}

/* ================================================================== 782 px */

/*
 * Gutenberg stabler selv kolonnerne her (flex-basis:100% !important i core).
 * Reglerne herunder retter kun det der IKKE følger med: højder, rækkefølge og
 * de tre steder hvor et motiv ligger bag teksten på desktop.
 */
@media (max-width: 781px) {
	.habe-hero .habe-hero__rk {
		min-height: 0;
	}

	.habe-hero .habe-hero__tekst {
		/* Fotoet øverst: billedet skal bære sektionen på en lille skærm. */
		order: 2;
		max-inline-size: none;
	}

	/*
	 * Stablet får fotofeltet en RIGTIG højde i stedet for et billedforhold.
	 *
	 * aspect-ratio slår ikke pålideligt igennem her, og rammer den ved siden
	 * af, måler et billede uden anden højdeangivelse 0 px — så står der et
	 * tomt felt øverst på forsiden. En højde i clamp kan ikke misforstås, og
	 * den giver samtidig pilene et fast midtpunkt at stå på (se
	 * --habe-hero-foto-h nedenfor).
	 */
	.habe-hero .habe-hero__foto {
		min-height: var(--habe-hero-foto-h);
	}

	/* Overgangen giver kun mening side om side. Stablet ville den lægge en
	   grå bjælke hen over fotoets venstre kant. */
	.habe-hero .habe-hero__foto::after {
		display: none;
	}

	/*
	 * Motivet flyttes tilbage over teksten i stedet for at ligge bag den. Ved
	 * 375 px ville en tekstspalte på 48 % være omkring 160 px bred — for smal
	 * til at overskriften kan brækkes læseligt.
	 */
	.habe-kampagne .habe-kampagne__felt,
	.habe-redaktion .habe-redaktion__felt {
		min-height: 0;
	}

	.habe-kampagne .habe-kampagne__felt > *,
	.habe-redaktion .habe-redaktion__felt > * {
		max-inline-size: none;
	}

	/*
	 * Bemærk selektorernes længde: media queries tæller ikke med i
	 * specificiteten, så de to felter der får en anden bredde på desktop
	 * (det mørke kampagnefelt og det højre redaktionsfelt) skal rammes lige
	 * så dybt her. Ellers bliver deres motiv stående på 62 % / 52 % af en
	 * stablet spalte, med en tom strimmel ved siden af.
	 */
	.habe-kampagne .habe-kampagne__billede,
	.habe-kampagne .habe-kampagne__felt--moerk .habe-kampagne__billede,
	.habe-redaktion .habe-redaktion__billede,
	.habe-redaktion .habe-redaktion__rk > :last-child .habe-redaktion__billede {
		position: static;
		width: 100%;
		margin-block-end: clamp(1rem, 3vw, 1.5rem);
	}

	.habe-kampagne .habe-kampagne__billede::before,
	.habe-redaktion .habe-redaktion__billede::before {
		display: none;
	}

	.habe-kampagne .habe-kampagne__billede img,
	.habe-redaktion .habe-redaktion__billede img {
		position: static;
		height: auto;
		/* Fladere end på desktop: stablet fylder 3:2 en halv skærm pr. felt. */
		aspect-ratio: 16 / 9;
	}

	/* Billedet står først i markuppen; teksten skal stadig kunne flugte. */
	.habe-redaktion .habe-redaktion__felt {
		justify-content: flex-start;
	}
}

/* ================================================================== 640 px */

/*
 * Servicebjælkens sideafstand alene. Kolonnetallet i produktgitteret styres af
 * sporbredden og behøver ikke et brud her.
 */
@media (max-width: 639px) {
	.habe-service {
		padding-inline: 1rem;
	}
}

/* ======================================================= reduceret bevægelse */

/*
 * style.css dæmper allerede animationer globalt. Her slås scroll-snap fra
 * oveni: et snap flytter viewporten uden at brugeren bad om det, og det er
 * netop den slags bevægelse folk med vestibulære lidelser slår fra.
 */
@media (prefers-reduced-motion: reduce) {
	.habe-kat .habe-kat__rk {
		scroll-snap-type: none;
	}
}


/* ---------------------------------------------------------------------------
 * MAKSIMAL INDHOLDSBREDDE
 *
 * Designoplægget er 1440 px bredt, og derover er der ingen reference. Uden et
 * loft fulgte indholdet skærmbredden: på en 2000 px skærm startede hero-teksten
 * 83 px fra kanten og servicebjælkens fire punkter blev trukket fra hinanden
 * over 1100 px. Proportionerne fra designet holdt kun ved præcis 1440.
 *
 * Loftet sættes på sektionernes INDRE rækker, ikke på sektionerne selv. Så
 * bliver de kølige og lyse bånd bag hero og servicebjælke ved med at gå fra
 * kant til kant — det er en bevidst del af designet — mens teksten og
 * billederne holder sig inden for den bredde de er tegnet til.
 *
 * Samme tal og samme sideafstand som .habe-indhold i site.css, så forsiden
 * flugter med sidehoved og sidefod. Står de to forskelligt, kan man se
 * springet netop dér hvor headeren slutter.
 * ------------------------------------------------------------------------- */

.habe-hero .habe-hero__rk,
.habe-service .habe-service__rk,
.habe-kat .habe-kat__rk,
.habe-kampagne .habe-kampagne__rk,
.habe-redaktion .habe-redaktion__rk,
.habe-produkter .habe-sektionshoved,
.habe-produkter .habe-produktgitter {
	max-width: 1440px;
	margin-inline: auto;
}

/*
 * SAMME sideafstand på alle rækker, ikke kun på de to fuldbredde-sektioner.
 *
 * Første forsøg lagde den kun på hero og servicebjælke, fordi de øvrige
 * sidder inde i temaets container. Men temaets container er bredere end vores
 * loft, så resultatet var at hero-indholdet stod smallere end
 * kategoricirklerne lige under — kanten flyttede sig midt på siden.
 *
 * Med samme loft og samme afstand flugter alle sektioner, uanset hvilken
 * container de ligger i.
 */
.habe-hero .habe-hero__rk,
.habe-service .habe-service__rk,
.habe-kat .habe-kat__rk,
.habe-kampagne .habe-kampagne__rk,
.habe-redaktion .habe-redaktion__rk,
.habe-produkter .habe-sektionshoved,
.habe-produkter .habe-produktgitter {
	padding-inline: clamp(1rem, 4vw, 3.5rem);
}

/*
 * Temaets container må ikke lægge sin egen afstand oveni vores. Kun på
 * forsiden, så butikkens øvrige sider er urørte.
 */
body.home .ct-container {
	max-width: none;
	padding-inline: 0;
}


/* ---------------------------------------------------------------------------
 * INGEN LUFT MELLEM NAVIGATION OG HERO
 *
 * Blocksy lægger lodret afstand på indholdscontaineren via attributten
 * data-vertical-spacing="top:bottom" (--theme-content-vertical-spacing, 50 px).
 * Det er rigtigt på en almindelig side, hvor indholdet skal have luft under
 * sidehovedet. På forsiden støder heroens flade derimod op til navigationen i
 * designet, og de 50 px blev en hvid stribe tværs over siden.
 *
 * Kun toppen fjernes. Bunden skal blive: den holder afstanden ned til
 * sidefoden, og uden den ville det sidste redaktionelle felt klistre til den
 * mørke flade.
 *
 * Kun på forsiden — butikkens øvrige sider skal beholde deres luft.
 * ------------------------------------------------------------------------- */

body.home [data-vertical-spacing*="top"] {
	padding-top: 0;
}

/*
 * WooCommerce udskriver en tom beskedcontainer på hver side. Den er uden
 * indhold her, men har margen, og den lagde sig oven i det vi lige fjernede.
 */
body.home .woocommerce-notices-wrapper:empty {
	margin: 0;
}


/* ---------------------------------------------------------------------------
 * HEROENS PANEL: GRADIENT I STEDET FOR FLAD TONE
 *
 * Designet har en gradient over panelet. Den blev bygget med en flad
 * --habe-graablaa, fordi de tre stop ikke fandtes som tokens. De gør de nu.
 *
 * Forskellen er ikke kun visuel. Mod den flade --habe-graablaa gav
 * --habe-skifer kun 3,87:1 og faldt igennem WCAG 1.4.3, så kicker og tagline
 * måtte sættes i næsten-sort. Mod gradientens mørkeste stop giver den 4,52:1
 * og består — altså kan designets egen dæmpede tone nu bruges.
 * ------------------------------------------------------------------------- */

.habe-hero {
	background-image: linear-gradient(
		175deg,
		var(--habe-panel-lys) 0%,
		var(--habe-panel-mel) 45%,
		var(--habe-panel-moerk) 100%
	);
}

/* Overgangen fra panel til foto skal starte i panelets MØRKESTE stop, ellers
   ses en lys kant hvor gradienten møder billedet. */
.habe-hero .habe-hero__foto::after {
	background-image: linear-gradient(90deg, var(--habe-panel-moerk) 0%, transparent 26%);
}

.habe-hero .habe-hero__over,
.habe-hero .habe-hero__under {
	color: var(--habe-skifer);
}
