/*
Theme Name: AliceAI Learning
Theme URI: https://aliceai.fi
Author: AliceAI Learning
Author URI: https://aliceai.fi
Description: Custom-koodattu lohkoteema (FSE) AliceAI Learning -sivustolle. Katso specs/suunnitelma.md.
Requires at least: 6.6
Tested up to: 7.0
Requires PHP: 7.4
Version: 0.2.0
Text Domain: aliceai
*/

/* -------------------------------------------------------------------------
   Tämä tiedosto sisältää vain sen, mitä theme.json ei osaa ilmaista:
   siirtymät, hover-tilat, pseudo-elementit, sticky-header, listamerkit.
   Kaikki värit/spacing tulevat theme.json:n preset-muuttujista.
   ------------------------------------------------------------------------- */

:root {
	--aliceai-gutter: clamp(1.25rem, 5vw, 3.5rem);
	--aliceai-band: clamp(3.5rem, 3rem + 5vw, 7.5rem);
	--aliceai-ease: cubic-bezier(0.22, 0.61, 0.36, 1);
}

/* --- 0. Pitkien sanojen katkaisu ---------------------------------------- */

/* ⚠️ Suomi tuottaa yhdyssanoja, jotka eivät mahdu kapealle näytölle.
   "Maanpuolustuskorkeakoulu" on h2-koossa (1,9rem @ 390px) 398px leveä 350px:n
   palstassa — se työnsi koko sivulle 28px vaakavierityksen (mitattu 2026-08-24
   Puolustusala-sivulta). Vika ei näy työpöytäleveydellä lainkaan.

   `overflow-wrap: break-word` katkaisee sanan vasta kun se ei muuten mahdu, eli
   se ei vaikuta mihinkään muuhun.

   `hyphens: auto` tekee katkaisusta siistin tavuviivalla. Se on käytössä vasta
   2026-08-24 alkaen, koska se VAATII oikean `lang`-attribuutin: sivuston kieli
   oli siihen asti `en_US`, jolloin Chrome tavutti suomen sanat englannin
   säännöillä ja katkaisi otsikot väärästä kohdasta. Nyt `WPLANG` on `fi` ja
   `<html lang="fi">`.
   ⚠️ Jos sivustosta tehdään kaksikielinen, tavutus seuraa `lang`-attribuuttia
   automaattisesti — mutta vain jos jokainen kieliversio saa oman oikean `lang`
   -arvonsa. Tarkista se lokalisointivaiheessa (suunnitelma osa 10).

   ⚠️ Tavutus on tarkoituksella VAIN leipätekstissä, ei otsikoissa. Isossa
   näyttökoossa tavuviiva on kookas ja rikkoo otsikon rytmin; otsikoille riittää
   `overflow-wrap` turvaverkoksi. Mitattu 2026-08-24. */
h1, h2, h3, h4, h5, h6,
p, li, summary, figcaption {
	overflow-wrap: break-word;
}

p, li, summary, figcaption {
	hyphens: auto;
}

/* --- 1. Osiot ---------------------------------------------------------- */

/* WP antaa jokaiselle .wp-site-blocksin lapselle margin-block-start:
   var(--wp--style--block-gap) (= 24px). Ylätasolla lapsia ovat vain header,
   main ja footer, joiden pitää olla kiinni toisissaan — muuten tumman
   CTA-palkin ja tumman footerin väliin jää valkoinen raita, ja headerin alle
   toinen. Ytimen sääntö on :where()-kääritty (spesifisyys 0,0,0), joten tämä
   voittaa sen ilman !importantia. */
.wp-site-blocks > * {
	margin-block-start: 0;
}

/* Lyhyillä sivuilla (esim. 404) footer jäi kellumaan keskelle ruutua ja sen
   alle jäi valkoinen kaista. Flex-sarake ylätasolla työntää footerin aina
   vähintään ruudun alareunaan. Lapset ovat header/main/footer, jotka kaikki
   venyvät täyteen leveyteen, joten alignfull-logiikka ei muutu. */
.wp-site-blocks {
	display: flex;
	flex-direction: column;
	min-height: 100vh;
}

.wp-site-blocks > main {
	flex: 1 0 auto;
}

/* Jokainen täysleveä osio saa saman pystyrytmin ja reunapehmusteen ilman,
   että sitä tarvitsee toistaa jokaisessa lohkomerkinnässä. */
.aliceai-band {
	padding-top: var(--aliceai-band);
	padding-bottom: var(--aliceai-band);
	padding-left: var(--aliceai-gutter);
	padding-right: var(--aliceai-gutter);
}

.aliceai-band--tight {
	padding-top: clamp(2rem, 1.5rem + 2vw, 3.5rem);
	padding-bottom: clamp(2rem, 1.5rem + 2vw, 3.5rem);
}

/* Täysleveiden osioiden väliin jäi 24px valkoinen rako, jolloin vuorottelevat
   taustapalkit eivät koskettaneet toisiaan vaan kellui­vat valkoisella. Syy on
   ytimen sääntö `:root :where(.is-layout-constrained) > *`, joka antaa jokaiselle
   lapselle margin-block-start: var(--wp--preset--spacing--30). Sen spesifisyys on
   (0,1,0), joten pelkkä `.aliceai-band` ei riitä varmuudella — kaksiosainen
   selektori (0,2,0) voittaa latausjärjestyksestä riippumatta. */
.wp-block-post-content > .aliceai-band,
.wp-block-post-content > .aliceai-band + .aliceai-band,
/* Järjestelmätemplaateissa (404, haku, arkistot, single) palkit ovat suoraan
   <main>:n lapsia eivätkä post-contentin sisällä, joten yllä oleva selektori ei
   kata niitä. Ilman tätä sama 24px valkoinen raita ilmestyi jokaisen palkin
   väliin — havaittu 2026-08-23, kun templaatit tuotiin design-systeemiin. */
main > .aliceai-band,
main > .aliceai-band + .aliceai-band {
	margin-block-start: 0;
}

/* Sama rako oli myös heron ja sisällön välissä (front-page.html). Nyt se ei
   näy, koska sisällön ensimmäinen osio on valkoinen — mutta jos jollain
   sivulla ensimmäinen osio on tumma, raita paljastuisi. */
main > .wp-block-post-content {
	margin-block-start: 0;
}

/* Kaksi peräkkäistä osiota tuottaa edellisen alapehmusteen JA seuraavan
   yläpehmusteen — työpöydällä yhteensä jopa 15rem tyhjää, mikä luki
   keskeneräisenä eikä ilmavana. Rajapinnassa riittää yksi rytmi, joten
   seuraavan osion yläpehmuste puolitetaan. Ensimmäinen osio (heron jälkeen)
   säilyttää täyden rytmin, koska sen yläpuolella ei ole toista palkkia. */
.aliceai-band + .aliceai-band {
	padding-top: calc(var(--aliceai-band) * 0.55);
}

/* --- 2. Kortit --------------------------------------------------------- */

.is-style-card,
.aliceai-card {
	position: relative;
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--20);
	transition: transform 200ms var(--aliceai-ease), box-shadow 200ms var(--aliceai-ease);
}

/* Kortti on flex-säiliö, joten välit tulevat gapista. WP:n flow-layout lisää
   lisäksi jokaiselle lapselle margin-block-start: var(--wp--style--block-gap),
   jolloin todellinen väli on gap + 24px ja kortit lukevat löysinä. Luokka on
   tuplattu, jotta spesifisyys (0,2,0) voittaa ytimen .is-layout-flow > *
   -säännön (0,1,0) latausjärjestyksestä riippumatta. */
.is-style-card.is-style-card > *,
.aliceai-card.aliceai-card > * {
	margin-block-start: 0;
	margin-block-end: 0;
}

/* Ikonisiru saa hieman ilmaa alleen, muuten se liimautuu otsikkoon. */
.is-style-card > .aliceai-icon-chip,
.aliceai-card > .aliceai-icon-chip {
	margin-block-end: var(--wp--preset--spacing--10);
}

/* Kortit venyvät samankorkuisiksi ja niiden nuolilinkki ankkuroituu pohjaan,
   jolloin "Tutustu →" -linkit osuvat samalle riville. Sääntö koskee VAIN
   linkkiä — jos se koskisi mitä tahansa viimeistä lasta, lyhyemmän otsikon
   kortissa leipäteksti valuisi kortin pohjaan. */
.wp-block-columns .is-style-card > .aliceai-arrow-link:last-child,
.wp-block-columns .is-style-card > .wp-block-buttons:last-child,
.wp-block-columns .aliceai-card > .aliceai-arrow-link:last-child {
	margin-top: auto;
	padding-top: var(--wp--preset--spacing--20);
}

/* Kuvakortin sisäryhmä venyy, jotta linkki asettuu kortin pohjalle. */
.aliceai-imagecard > .wp-block-group {
	display: flex;
	flex-direction: column;
	flex: 1;
}

.aliceai-imagecard > .wp-block-group > .aliceai-arrow-link:last-child {
	margin-top: auto;
	padding-top: var(--wp--preset--spacing--20);
}

.is-style-card:hover,
.aliceai-card:hover {
	transform: translateY(-4px);
	box-shadow: var(--wp--preset--shadow--card-medium);
}

/* Ikonisiru: pyöristetty pastellineliö ikonin taustalla. */
.aliceai-icon-chip img,
.aliceai-icon-chip .wp-block-image img {
	display: block;
	width: 52px;
	height: 52px;
}

/* Numeroitu askelmerkki + askelten välinen yhdysviiva.
   Merkille annetaan kiinteä 44x44 px koko kahdesta syystä: (1) ilman
   rajattua leveyttä 999px:n pyöristys venyy koko sarakkeen levyiseksi
   palkiksi ympyrän sijaan, (2) kiinteä koko antaa yhdysviivalle tarkan
   pystykeskikohdan (22px) ilman arvailua. */
.aliceai-step-number {
	position: relative;
	z-index: 1;
	width: 44px;
	height: 44px;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 0 !important;
}

.aliceai-step-number p {
	margin: 0;
}

/* Pystysuuntainen askellista (Palvelu-sivun 5 vaihetta). Vaakarivi ei toimi
   viidellä askeleella: 1160px:n palstassa sarakkeista tulisi n. 200px leveitä ja
   teksti murtuisi. Numerosiru on flex-rivin lapsi, joten sen on pakko olla
   `flex: 0 0 auto` — muuten 44px:n ympyrä litistyy soikioksi pitkän tekstin
   vieressä. Yhdysviiva kulkee sirusta seuraavaan riviin asti. */
.aliceai-steplist-row {
	position: relative;
	align-items: flex-start;
}

.aliceai-steplist-row > .aliceai-step-number {
	flex: 0 0 auto;
}

.aliceai-steplist-row:not(:last-child)::after {
	content: "";
	position: absolute;
	left: 21px;
	top: 44px;
	bottom: calc(-1 * var(--wp--preset--spacing--40));
	width: 2px;
	background: linear-gradient(
		180deg,
		var(--wp--preset--color--turquoise) 0%,
		var(--wp--preset--color--forest-green-20) 100%
	);
}

.aliceai-steps .wp-block-column {
	position: relative;
}

.aliceai-steps .wp-block-column:not(:last-child)::after {
	content: "";
	position: absolute;
	top: 22px;
	left: 56px;
	right: calc(-1 * var(--wp--preset--spacing--40));
	height: 2px;
	background: linear-gradient(
		90deg,
		var(--wp--preset--color--turquoise) 0%,
		var(--wp--preset--color--forest-green-20) 100%
	);
}

@media (max-width: 781px) {
	.aliceai-steps .wp-block-column::after {
		display: none;
	}
}

/* ⚠️ Query Loop kääri jokaisen postin omaan <li>-elementtiinsä. Ruudukko
   venyttää <li>:n rivin korkuiseksi, mutta kortti sen sisällä jää oman
   sisältönsä korkuiseksi — vierekkäiset kortit ovat siis eri korkuisia, vaikka
   <li>:t ovat samankorkuisia eikä sitä huomaa mittaamalla <li>:tä. Mitattu
   2026-08-24 Ajankohtaista-listauksesta: <li> 550/550/550, kortti 550/522/353.
   Flex + width:100% venyttää kortin täyteen korkeuteen. */
.wp-block-post-template > li {
	display: flex;
}

.wp-block-post-template > li > .is-style-card {
	width: 100%;
}

/* --- 3. Checklist ------------------------------------------------------ */

ul.is-style-checklist {
	list-style: none;
	padding-left: 0;
	margin-left: 0;
}

ul.is-style-checklist li {
	position: relative;
	padding-left: 2rem;
	margin-bottom: 0.6rem;
}

ul.is-style-checklist li::before {
	content: "";
	position: absolute;
	left: 0;
	top: 0.35em;
	width: 1.25rem;
	height: 1.25rem;
	border-radius: 999px;
	background-color: var(--wp--preset--color--forest-green);
	/* valkoinen ✓ ympyrän sisällä */
	-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Ccircle cx='10' cy='10' r='10'/%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 20 20'%3E%3Ccircle cx='10' cy='10' r='10'/%3E%3C/svg%3E") center / contain no-repeat;
}

ul.is-style-checklist li::after {
	content: "";
	position: absolute;
	left: 0.3rem;
	top: 0.62em;
	width: 0.65rem;
	height: 0.38rem;
	border-left: 2px solid #fff;
	border-bottom: 2px solid #fff;
	transform: rotate(-45deg);
}

/* Tummalla taustalla merkki kääntyy turkoosiksi. */
.has-navy-background-color ul.is-style-checklist li::before,
.has-deep-teal-gradient-background ul.is-style-checklist li::before,
.aliceai-band--dark ul.is-style-checklist li::before {
	background-color: var(--wp--preset--color--turquoise);
}

.has-navy-background-color ul.is-style-checklist li::after,
.has-deep-teal-gradient-background ul.is-style-checklist li::after,
.aliceai-band--dark ul.is-style-checklist li::after {
	border-color: var(--wp--preset--color--navy);
}

/* --- 4. Eyebrow -------------------------------------------------------- */

p.is-style-eyebrow {
	font-size: 0.8rem;
	font-weight: 700;
	letter-spacing: 0.09em;
	text-transform: uppercase;
	color: var(--wp--preset--color--forest-green);
	margin-bottom: 0.75rem;
}

/* Lyhyt viiva tunnisteen eteen. Käyttää inline-flexiä eikä ::before-blokkia,
   jotta keskitetty eyebrow pysyy keskitettynä viivoineen. */
p.is-style-eyebrow {
	display: flex;
	align-items: center;
	gap: 0.6rem;
}

p.is-style-eyebrow::before {
	content: "";
	flex: 0 0 auto;
	width: 22px;
	height: 2px;
	border-radius: 2px;
	background: currentColor;
	opacity: 0.55;
}

p.is-style-eyebrow.has-text-align-center {
	justify-content: center;
}

/* Gradienttipalkin vaaleimmassa päässä (#1B5766) täysi turkoosi jää 3,75:1
   kontrastiin — alle WCAG AA:n pienelle tekstille. turquoise-60 pysyy yli 4,5:1
   koko gradientin matkalla. */
.aliceai-band--dark p.is-style-eyebrow,
.has-navy-background-color p.is-style-eyebrow {
	color: var(--wp--preset--color--turquoise-60);
}

/* --- 5. Hero ----------------------------------------------------------- */

.aliceai-hero {
	position: relative;
	min-height: clamp(560px, 72vh, 720px);
	isolation: isolate;
}

/* Gradienttiverho kuvan päällä: teksti pysyy luettavana vasemmalla, valokuva
   näkyy oikealla. Toteutettu pseudo-elementtinä eikä Cover-lohkon omalla
   overlaylla, koska WP:n .has-*-background-color -luokat tulevat !important
   -määreellä eikä niitä voi ylikirjoittaa mediakyselyssä. */
.aliceai-hero::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 1;
	/* ⚠️ Verhon voimakkuus on mitoitettu KIRKKAAMMAN kuvan mukaan. Kun hero
	   sai toisen, vaaleamman valokuvan (terveydenhuolto), eyebrow putosi
	   3,97:1 kontrastiin eli alle AA:n — puolustuskuvan päällä sama arvo oli
	   4,64. Jos lisäät heroon uuden kuvan, MITTAA kontrasti sen päältä
	   erikseen; tumman kuvan perusteella säädetty verho ei riitä vaalealle. */
	background: linear-gradient(
		90deg,
		rgba(5, 22, 38, 0.97) 0%,
		rgba(5, 22, 38, 0.94) 38%,
		rgba(5, 22, 38, 0.78) 66%,
		rgba(5, 22, 38, 0.24) 100%
	);
}

.aliceai-hero > .wp-block-cover__inner-container {
	position: relative;
	z-index: 2;
	width: 100%;
	max-width: 1160px;
	margin-inline: auto;
}

/* Heron sisältö rajataan CSS:llä eikä Cover-lohkon constrained-layoutilla,
   koska WP generoi constrained-lapsille `margin-left:auto !important`, jota ei
   voi ylikirjoittaa spesifisyydellä — teksti keskittyisi vasemman sijaan. */
.aliceai-hero-copy {
	max-width: 660px;
}

/* Leveämpi tekstipalsta pitkälle otsikolle. 660px:n palstassa Palvelu-sivun
   53-merkkinen h1 kietoutui neljälle riville ja työnsi napit alle taitteen
   1000px:n näkymässä. Modifier on tarkoituksella opt-in: kapea palsta on
   oletus, koska lyhyt otsikko näyttää siinä paremmalta. */
.aliceai-hero-copy--wide {
	max-width: 820px;
}

.aliceai-hero p.is-style-eyebrow {
	color: var(--wp--preset--color--turquoise);
}

@media (max-width: 781px) {
	.aliceai-hero::before {
		background: linear-gradient(180deg, rgba(5, 22, 38, 0.84) 0%, rgba(5, 22, 38, 0.96) 55%);
	}
}

/* --- 5b. Vaihtuva herokuva (ristihäivytys) ------------------------------ */

/* 2026-08-20: jaettu kahden kuvan hero kokeiltiin ja hylättiin — käyttäjä piti
   yhden kuvan versiosta enemmän. Nyt yksi kuva kerrallaan, ja kuva vaihtuu
   pehmeästi puolustusalan ja terveydenhuollon välillä. Sommittelu, typografia,
   värit ja napit ovat samat kuin alkuperäisessä yhden kuvan herossa.

   Kuvat ovat kuvalohkoina (eivät Cover-lohkon taustana), koska Cover osaa vain
   yhden taustakuvan ja koska näin kummallakin on oma alt-teksti ja oma rajaus. */
/* ⚠️ Luokka on TUPLATTU tarkoituksella (0,2,0). Lohkoeditorin kanvaasissa
   ydin antaa jokaiselle lohkolle `.block-editor-block-list__block {
   position: relative }`, joka on samaa spesifisyyttä (0,1,0) ja latautuu
   teeman jälkeen — eli voittaa. Ilman tuplausta heron diat eivät asetu
   päällekkäin editorissa vaan pinoutuvat, jolloin hero oli 2868px korkea ja
   teksti 2400px alempana. Sama ansa kuin navigaation `color: inherit`,
   ks. CLAUDE.md. Julkisella puolella tuplaus ei muuta mitään. */
.aliceai-hero-slides.aliceai-hero-slides {
	position: absolute;
	inset: 0;
	z-index: 0;
	margin: 0;
	/* Pakollinen: hidas lähennys skaalaa kuvaa 5 %, ja ilman rajausta se
	   vuotaa heron yli ja tuottaa koko sivulle vaakavierityksen. */
	overflow: hidden;
}

.aliceai-hero-slide.aliceai-hero-slide {
	position: absolute;
	inset: 0;
	margin: 0;
	opacity: 0;
	transition: opacity 1200ms var(--aliceai-ease);
}

.aliceai-hero-slide.is-active {
	opacity: 1;
}

.aliceai-hero-slide img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

/* Rajaus per kuva: puolustuskuvassa kohde on oikealla, terveydenhuoltokuva on
   pystykuva jonka henkilöt ovat ylemmpänä keskellä. */
/* Rajaus per KUVA, ei diajärjestyksen mukaan.
   ⚠️ Aiemmin nämä olivat `:nth-child(1)` ja `:nth-child(2)`, mikä oletti että
   diat ovat samassa järjestyksessä joka sivulla. Näin ei ole: etusivulla ja
   Toimialoilla puolustuskuva on ensin, Palvelulla terveydenhuoltokuva. Palvelun
   herossa kuvat saivat siis toistensa rajaukset. Tiedostonimeen sidottu
   valitsin ei voi mennä väärin, vaikka järjestys vaihtuisi.

   Pystyankkurit on mitattu, ei arvattu: hero on hyvin leveä suhteessa
   korkeuteensa (min-height 560–720px), joten `cover` rajaa rajusti ylhäältä ja
   alhaalta — 2000×670 ikkunassa puolustuskuvasta näkyy pystysuunnassa vain
   n. 52 %. Keskitettynä se osui kohtaan 24–76 %, ja kohteen kasvot (9–33 %)
   jäivät kokonaan rajauksen ulkopuolelle. Mitattu 2026-08-24.
   **Jos vaihdat herokuvan, mittaa kasvojen kohta uudestaan.** */
/* ⚠️ Valitsin on `$=` (loppuliite), EI `*=`. Kun heroon tuli lisää kuvia
   (2026-08-25), `[src*="hero-terveydenhuolto"]` olisi osunut myös uusiin
   `hero-terveydenhuolto-*.webp`-tiedostoihin ja antanut niille alkuperäisen
   pystykuvan rajauksen. Loppuliitehaku osuu tasan yhteen tiedostoon. */
.aliceai-hero-slide img[src$="hero-puolustus.webp"] {
	object-position: 62% 18%;
}

.aliceai-hero-slide img[src$="hero-puolustus-mobiili.webp"] {
	object-position: 58% 40%;
}

.aliceai-hero-slide img[src$="hero-puolustus-kartta.webp"] {
	object-position: 62% 50%;
}

/* ⚠️ Tämä kuva vaihdettiin 2026-08-24 peilaamattomaan versioon (sote_2.png).
   Vanha oli peilattu niin, että hoitaja oli VASEMMALLA eli tekstipalstan alla.
   Rajaus on siksi mitattu kokonaan uudestaan: kohteet vaihtoivat puolta. */
.aliceai-hero-slide img[src$="hero-terveydenhuolto-kahvipoyta.webp"] {
	object-position: 62% 38%;
}

.aliceai-hero-slide img[src$="hero-terveydenhuolto-puhelin.webp"] {
	object-position: 68% 14%;
}

.aliceai-hero-slide img[src$="hero-terveydenhuolto-kaytava.webp"] {
	object-position: 62% 22%;
}

.aliceai-hero-slide img[src$="hero-terveydenhuolto-vuode.webp"] {
	object-position: 66% 38%;
}

/* Hyvin hidas lähennys aktiivisessa kuvassa. Pitää heron elävänä ilman että
   mikään nykii; liike on niin hidasta ettei sitä huomaa katsomatta. */
@media (prefers-reduced-motion: no-preference) {
	.aliceai-hero-slide img {
		transform: scale(1.05);
		transition: transform 9000ms linear;
	}

	.aliceai-hero-slide.is-active img {
		transform: scale(1);
	}
}

/* Sisältö keskitetään 1160px:n palstaan kuten ennenkin. Aiemmin tämän teki
   Cover-lohkon oma inner-container; nyt se on oma kääreensä. */
.aliceai-hero-inner {
	position: relative;
	z-index: 2;
	width: 100%;
	max-width: 1160px;
	margin-inline: auto;
}

/* Luottamusrivi heron alaosassa. */
.aliceai-trust-row ul {
	display: flex;
	flex-wrap: wrap;
	gap: 0.5rem 2rem;
	margin: 0;
}

.aliceai-trust-row ul li {
	margin-bottom: 0;
	font-size: 0.95rem;
}

/* --- 5c. Filtteripillerit (listaussivut) -------------------------------- */

/* Rivi tulee ytimen `core/terms-query` + `core/term-template` -lohkoista, eli
   pillerit ovat taksonomian termejä eivätkä kovakoodattua tekstiä. Kun
   ylläpitäjä lisää aiheen wp-adminissa, pilleri ilmestyy itsestään.

   Ytimen tuottama rakenne:
     <ul class="wp-block-term-template">
       <li class="wp-block-term term-{id} {taksonomia}">
         <p class="wp-block-term-name"><a href="…">Nimi</a></p>

   "Näytä kaikki" ei ole termi, joten se on erillinen kappale samassa
   flex-kääreessä (.aliceai-filtteri-kaikki). */

.aliceai-filtterit {
	margin-bottom: var(--wp--preset--spacing--50);
}

/* Ydin antaa listalle luettelomerkit ja sisennyksen — molemmat pois. */
.aliceai-filtterit ul.wp-block-term-template {
	list-style: none;
	margin: 0;
	padding: 0;
}

.aliceai-filtterit .wp-block-term-name,
.aliceai-filtterit .aliceai-filtteri-kaikki {
	margin: 0;
}

.aliceai-filtterit .wp-block-term-name a,
.aliceai-filtterit .aliceai-filtteri-kaikki a {
	display: inline-block;
	padding: 0.55rem 1.15rem;
	border: 1px solid var(--wp--preset--color--navy-20);
	border-radius: 999px;
	background: var(--wp--preset--color--white);
	color: var(--wp--preset--color--ink);
	font-size: 0.78rem;
	font-weight: 700;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	text-decoration: none;
	transition: background-color 180ms var(--aliceai-ease),
		border-color 180ms var(--aliceai-ease), color 180ms var(--aliceai-ease);
}

.aliceai-filtterit .wp-block-term-name a:hover,
.aliceai-filtterit .aliceai-filtteri-kaikki a:hover {
	border-color: var(--wp--preset--color--forest-green);
	background: var(--wp--preset--color--forest-green);
	color: var(--wp--preset--color--white);
	text-decoration: none;
}

/* Aktiivinen pilleri. `aria-current` tulee ui.js:stä eikä luokasta:
   .is-active on jo varattu heron dioille, ja aria-current kertoo saman asian
   myös ruudunlukijalle. Ilman JS:ää rivi toimii yhä linkkeinä — korostus vain
   puuttuu, ja sivun otsikko kertoo silti missä ollaan. */
.aliceai-filtterit a[aria-current="page"] {
	border-color: var(--wp--preset--color--forest-green);
	background: var(--wp--preset--color--forest-green);
	color: var(--wp--preset--color--white);
}

/* ⚠️ Piilota koko rivi, jos suodattimia on alle kaksi — yksi vaihtoehto ei ole
   valinta, ja "Näytä kaikki" yksinään näyttäisi rikkinäiseltä. Kun `hideEmpty`
   karsii kaikki termit, `term-template` ei renderöi <ul>:ää lainkaan, joten
   molempia sääntöjä tarvitaan. */
.aliceai-filtterit:not(:has(.wp-block-term-template li)),
.aliceai-filtterit:has(.wp-block-term-template li:only-child) {
	display: none;
}

/* --- 6. Logopalkki ----------------------------------------------------- */

/* Kumppanien oikeat logot (2026-09-10). Rivi oli aiemmin nimiä hiusreunaisina
   siruina, koska logoja ei ollut — se merkintä on korvattu kuvilla.

   ⚠️ TÄYDET VÄRIT, EI HARMAASÄVYÄ (käyttäjän päätös 2026-09-10). Harmaasävy
   olisi rauhoittanut rivin, mutta osa organisaatioista kieltää logonsa
   värimuutokset. Jos linjaus joskus muuttuu, se on yksi rivi:
       .aliceai-logo-rail img { filter: grayscale(1) opacity(.6); }

   ⚠️ EI HOVER-EFEKTIÄ. Logot eivät ole linkkejä, joten hover lupaisi
   klikattavuutta jota ei ole. Vanhassa sirurivissä hover oli, koska siru
   näytti painikkeelta. */

.aliceai-logo-rail figure {
	margin: 0;
}

.aliceai-logo-rail img {
	display: block;
	width: auto;
	max-width: 150px;
	object-fit: contain;
}

/* ⚠️ OPTINEN TASAPAINO: logon korkeus seuraa sen kuvasuhdetta.

   Pelkkä yhteinen `max-height` on logoriveissä tavallinen mutta väärä:
   kuvasuhteet vaihtelevat 1,05:stä (Savas, lähes neliö) 4,24:ään (Esperi,
   hyvin leveä), joten samalla korkeudella Esperi peittäisi nelinkertaisen
   pinta-alan ja lukisi tärkeimpänä kumppanina. Leveä logo saa siksi
   matalamman korkeuden, jolloin pinta-alat ovat suunnilleen samat ja rivi
   lukee tasa-arvoisena.

   Sidottu tiedostonimen LOPPULIITTEESEEN ($=), ei osaosumaan (*=) — sama
   konventio kuin herokuvien rajauksessa, ks. CLAUDE.md. Osaosuma hajoaisi
   heti kun tiedostoja tulee lisää samalla alulla.

   Jos lisäät logon, mittaa sen kuvasuhde ja valitse korkeus tästä:
       suhde > 3,5 → 30px   ·   2,6–3,5 → 38px   ·   1,9–2,6 → 44px
       1,3–1,9    → 50px   ·   alle 1,3 → 54px                        */
.aliceai-logo-rail img[src$="logo-esperi.webp"]  { max-height: 30px; }
.aliceai-logo-rail img[src$="logo-mpkk.webp"]    { max-height: 44px; }
.aliceai-logo-rail img[src$="logo-savonia.webp"] { max-height: 44px; }
.aliceai-logo-rail img[src$="logo-robotai.webp"] { max-height: 44px; }
.aliceai-logo-rail img[src$="logo-lyhty.webp"]   { max-height: 50px; }
.aliceai-logo-rail img[src$="logo-yhkodit.webp"] { max-height: 50px; }
.aliceai-logo-rail img[src$="logo-savas.webp"]   { max-height: 54px; }
.aliceai-logo-rail img[src$="logo-laurea.svg"]   { max-height: 54px; }

/* Kapeilla näytöillä rivi kietoutuu monelle riville — pienempi väli ja
   maltillisempi koko, jottei se vie koko ruutua. */
@media (max-width: 600px) {
	.aliceai-logo-rail {
		gap: var(--wp--preset--spacing--30) var(--wp--preset--spacing--40);
	}

	.aliceai-logo-rail img {
		max-width: 108px;
	}

	.aliceai-logo-rail img[src$="logo-esperi.webp"]  { max-height: 24px; }
	.aliceai-logo-rail img[src$="logo-mpkk.webp"],
	.aliceai-logo-rail img[src$="logo-savonia.webp"],
	.aliceai-logo-rail img[src$="logo-robotai.webp"] { max-height: 34px; }
	.aliceai-logo-rail img[src$="logo-lyhty.webp"],
	.aliceai-logo-rail img[src$="logo-yhkodit.webp"] { max-height: 38px; }
	.aliceai-logo-rail img[src$="logo-savas.webp"],
	.aliceai-logo-rail img[src$="logo-laurea.svg"]   { max-height: 42px; }
}

/* --- 6b. Tunnusluvut ---------------------------------------------------- */

/* Käytössä patternissa stat-row.php. Luku on iso ja Grotesk, selite pieni ja
   vaimea — kontrasti niiden välillä tekee rivistä graafisen ilman kuvia.
   Ylärajaviiva sitoo sarakkeet yhteen ruudukoksi. */
.aliceai-stat {
	border-top: 2px solid var(--wp--preset--color--turquoise);
	padding-top: var(--wp--preset--spacing--20);
}

.aliceai-stat-value {
	font-family: var(--wp--preset--font-family--grotesk);
	font-size: clamp(2.5rem, 1.6rem + 3vw, 3.75rem);
	font-weight: 600;
	line-height: 1;
	letter-spacing: -0.03em;
	color: var(--wp--preset--color--forest-green);
	margin: 0 0 0.35rem;
}

.aliceai-band--dark .aliceai-stat-value {
	color: var(--wp--preset--color--turquoise);
}

/* --- 7. Kuvat ---------------------------------------------------------- */

.aliceai-media img {
	border-radius: 20px;
	box-shadow: var(--wp--preset--shadow--card-medium);
}

.aliceai-media--flush img {
	box-shadow: none;
}

/* Kuvakortti, jossa kuva täyttää kortin yläosan.

   ⚠️ Pehmuste on PAKKO nollata. Ydin antaa jokaiselle taustavärilliselle
   ryhmälle oletuspehmusteen säännöllä `:where(.wp-block-group.has-background)
   { padding: 1.25em 2.375em }`. Kortilla on tausta, joten se osui myös tähän:
   kuva jäi 290px levyiseksi 371px kortissa eikä yltänyt reunaan, ja teksti sai
   pehmusteen kahdesti (kortilta 40px + sisäryhmältä 40px). Mitattu 2026-08-23.
   Sääntö on `:where()`-kääritty eli spesifisyydeltään (0,0,0), joten pelkkä
   luokka riittää sen kumoamiseen. Pehmuste kuuluu tässä kortissa
   sisäryhmälle — vain niin kuva voi olla reunasta reunaan. */
.aliceai-imagecard {
	overflow: hidden;
	padding: 0;
}

.aliceai-imagecard img {
	width: 100%;
	/* ⚠️ 20/9 rajasi liikaa. Molemmat toimialakuvat ovat 1200×800 (3:2), joten
	   564px levyisessä kortissa 20/9 näytti niistä pystysuunnassa vain 67,5 %
	   ja leikkasi 16,3 % sekä ylhäältä että alhaalta: terveydenhuoltokuvan
	   kummankin henkilön päälaki ja puolustuskuvan baretti jäivät pois
	   (mitattu 2026-09-06). 16/10 näyttää 93,75 % eli rajaus on enää häivytys.

	   Ankkuri 30 % siirtää jäljelle jäävän 6 %:n leikkauksen alareunaan, jossa
	   on molemmissa kuvissa vain lattiaa tai maastoa. Sama arvo kelpaa
	   kummallekin, koska kuvat ovat samankokoiset ja rajattu samalla tavalla —
	   jos kortin kuva vaihdetaan, mittaa uudestaan (kaava CLAUDE.md:ssä) ja
	   sido tarvittaessa tiedostonimeen LOPPULIITTEELLÄ ($=), ei osaosumalla. */
	aspect-ratio: 16 / 10;
	object-position: 50% 30%;
	height: auto;
	object-fit: cover;
	display: block;
	transition: transform 600ms var(--aliceai-ease);
}

/* Henno brändivihreä kalvo toimialakorttien valokuvien päälle: sitoo eri
   valokuvat samaan sävymaailmaan ja erottaa ne listauskorttien
   dokumentaarisemmista nostokuvista.

   ⚠️ Rajattu tarkoituksella pois listauskorteista (--tall). Ne ovat blogin ja
   asiakastarinoiden nostokuvia, joissa kalvo lukisi virheenä. Listauksissa
   kuva tulee wp:post-featured-image -lohkosta, mutta Terveydenhuolto-sivun
   tarinakortit käyttävät wp:image-lohkoa, joten pelkkä .wp-block-image
   -rajaus ei riittäisi — siksi :not(). */
.aliceai-imagecard:not(.aliceai-imagecard--tall) .wp-block-image {
	position: relative;
}

.aliceai-imagecard:not(.aliceai-imagecard--tall) .wp-block-image::after {
	content: "";
	position: absolute;
	inset: 0;
	pointer-events: none;
	/* forest-green #1B5766 */
	background-color: rgba(27, 87, 102, 0.16);
	transition: background-color 600ms var(--aliceai-ease);
}

/* Hoverissa kalvo kevenee samaan tahtiin kuvan zoomin kanssa. */
.aliceai-imagecard:not(.aliceai-imagecard--tall):hover .wp-block-image::after {
	background-color: rgba(27, 87, 102, 0.06);
}

/* Listauskortti (blogi, asiakastarinat, molemmat termiarkistot).

   ⚠️ Sama luokka palvelee kahta eri kokoista korttia. Toimialakortti on
   kaksipalstainen ja n. 560px leveä, jolloin 20/9 antaa 252px korkean kuvan —
   sopiva panoraama. Listaukset ovat KOLMEN palstan ruudukossa ja n. 370px
   leveitä, jolloin samasta suhteesta tulee vain 167px korkea kaistale:
   asiakastarinoiden ihmiskuvista näkyisi käytännössä pelkkä vyötärö.
   3/2 on sama suhde kuin valokuvissa itsessään, joten rajaus jää kevyeksi.

   Luokka kuuluu NELJÄÄN listaustemplaattiin, jotka muodostavat kaksi paria
   (home ↔ category, archive-tarina ↔ taxonomy-toimiala). Jos muutat toista,
   muuta myös sen pari — ks. CLAUDE.md "Listaussivuja on NELJÄ". */
.aliceai-imagecard--tall img {
	aspect-ratio: 3 / 2;
}

/* Kuva zoomaa hitaasti kortin sisällä. Kortilla on jo overflow: hidden,
   joten rajaus hoituu itsestään. */
.aliceai-imagecard:hover img {
	transform: scale(1.045);
}

/* --- 8. Lainaus -------------------------------------------------------- */

.aliceai-quote::before {
	content: "\201D";
	display: block;
	font-family: var(--wp--preset--font-family--grotesk);
	font-size: 6.5rem;
	line-height: 0.55;
	color: var(--wp--preset--color--turquoise);
	opacity: 0.5;
	margin-bottom: 0.25rem;
}

/* Kortin sisällä lainausmerkki on ::before eli flex-säiliön ENSIMMÄINEN lapsi,
   jolloin se asettuisi tunnisteen ("Ammattilaisen kokemus") yläpuolelle. Tunniste
   kuuluu ylimmäksi, joten se nostetaan orderilla merkin edelle. Toimii vain koska
   .is-style-card on flex — jos kortti muuttuu joskus flow-layoutiksi, tämä lakkaa
   vaikuttamasta eikä riko mitään. */
.is-style-card.aliceai-quote > .is-style-eyebrow {
	order: -1;
}

/* Näkyvä paikkamerkki: sisältö puuttuu vielä (esim. keräämättä oleva asiakaslainaus).
   Sama periaate kuin ui-*.svg-havainnekuvissa — kerrotaan hillitysti, ettei kohta ole
   valmis, jotta sivu ei näytä rikkinäiseltä vaan keskeneräiseltä tarkoituksella. */
.aliceai-placeholder-note {
	margin-top: auto;
	padding-top: var(--wp--preset--spacing--20);
	border-top: 1px dashed var(--wp--preset--color--navy-20);
	font-style: italic;
	opacity: 0.85;
}

/* --- 8b. UKK-lohko (core/details) -------------------------------------- */

/* Selaimen oletusmerkki on musta kolmio, joka lukee yhtä vanhanaikaisena kuin
   alleviivattu sininen linkki. Piilotetaan se ja piirretään oma chevron oikeaan
   reunaan. `list-style: none` hoitaa Firefoxin, ::-webkit-details-marker
   WebKitin — molemmat tarvitaan. */
.wp-block-details > summary {
	position: relative;
	list-style: none;
	cursor: pointer;
	padding-right: 2.25rem;
	font-family: var(--wp--preset--font-family--grotesk);
	font-weight: 600;
	color: var(--wp--preset--color--ink);
	transition: color 160ms var(--aliceai-ease);
}

.wp-block-details > summary::-webkit-details-marker {
	display: none;
}

.wp-block-details > summary:hover {
	color: var(--wp--preset--color--forest-green);
}

/* Chevron: kaksi reunaa neliöstä, käännettynä 45°. Keskitys tehdään
   translatella ja kierto lisätään samaan transformiin — erillinen rotate
   kumoaisi keskityksen. */
.wp-block-details > summary::after {
	content: "";
	position: absolute;
	right: 0.35rem;
	top: 50%;
	width: 9px;
	height: 9px;
	border-right: 2px solid var(--wp--preset--color--forest-green);
	border-bottom: 2px solid var(--wp--preset--color--forest-green);
	transform: translateY(-70%) rotate(45deg);
	transition: transform 200ms var(--aliceai-ease);
}

.wp-block-details[open] > summary::after {
	transform: translateY(-30%) rotate(225deg);
}

/* ⚠️ UKK-vastauksen rivinpituus. Palkki on 812px leveä, mikä antaa 17px:n
   tekstillä n. 93 merkkiä riville — tavoite on 45–75. Mitattuna 2026-09-09
   pisimmät vastaukset olivat 97–102 merkkiä.

   Rajaus tehdään VASTAUKSELLE, ei palkille: laatikon leveys kuuluu sivun
   rytmiin ja sen kaventaminen muuttaisi kolmen sivun ulkoasua. `ch` on
   nollan leveys eli se seuraa fonttikokoa itsestään, joten sääntö pysyy
   voimassa vaikka typografiaa säädettäisiin.

   Koskee myös tulevia UKK-kohtia — tätä ei tarvitse toistaa sivukohtaisesti. */
.wp-block-details > :not(summary) {
	max-width: 68ch;
}

/* ⚠️ Keskitetty pikkuprintti oli koko sivuston pisin rivi: 118 merkkiä.
   Yhdistelmä on pahin mahdollinen — sivuston PIENIN tekstikoko (14px)
   sivuston LEVEIMMÄSSÄ mitassa (860px). Kaava on merkkiä/rivi ≈
   leveys × 0,115 × (17 ÷ fonttikoko), joten 14px:llä sama leveys tuottaa
   noin 20 % enemmän merkkejä kuin 17px:llä.

   Näitä kappaleita on koko sivustolla tasan yksi (etusivun huomautus
   "Hyödyt organisaatiolle" -korttien alla), mutta sääntö kirjoitetaan
   luokalle eikä sivulle, jotta seuraava vastaava saa saman kohtelun. */
.wp-block-post-content p.has-small-font-size.has-text-align-center {
	max-width: 68ch;
	margin-inline: auto;
}

@media (prefers-reduced-motion: reduce) {
	.wp-block-details > summary::after {
		transition: none;
	}
}

/* Keskeneräinen osio: sivun rakenne on olemassa, mutta teksti puuttuu vielä.
   Katkoviiva ja vaimea pinta erottavat sen valmiista sisällöstä yhdellä
   silmäyksellä, jottei kukaan luule sitä julkaisukelpoiseksi. Sama periaate
   kuin .aliceai-placeholder-note ja ui-*.svg-havainnekuvat: kerrotaan
   hillitysti mutta selvästi, ettei kohta ole valmis.

   ⚠️ Tämän luokan esiintyminen sivulla tarkoittaa, ettei sivua saa viedä
   tuotantoon sellaisenaan. Ks. specs/suunnitelma.md osa 7. */
.aliceai-tbd {
	border: 2px dashed var(--wp--preset--color--forest-green-20);
	border-radius: 20px;
	background: transparent;
}

.aliceai-tbd .aliceai-tbd-label {
	display: inline-flex;
	align-items: center;
	gap: 0.5rem;
	padding: 0.3rem 0.85rem;
	border-radius: 999px;
	background: var(--wp--preset--color--forest-green);
	color: #fff;
	font-family: var(--wp--preset--font-family--grotesk);
	font-size: 0.7rem;
	font-weight: 700;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	width: fit-content;
	margin: 0;
}

/* Kaksi eri tilannetta, sama ulkoasu mutta eri merkitys — pidä ne erillään:

   .aliceai-tbd            = SIVU on kesken, teksti puuttuu. Ei tuotantoon.
   .aliceai-tbd--empty     = sivu on valmis, mutta SISÄLTÖÄ ei ole vielä
                             (0 asiakastarinaa, 0 blogipostausta). Tämä on
                             normaali tyhjä tila ja katoaa itsestään, kun
                             sisältöä lisätään — ei estä julkaisua.

   Ero on tärkeä, koska `specs/tools/tilanne.sh` raportoi ne eri tavalla. */

/* Puuttuvien osioiden lista: numeroimaton, mutta jokainen rivi erottuu
   omakseen ohuella viivalla. Ei ✓-listaa — nämä eivät ole saavutuksia. */
.aliceai-tbd ul {
	margin: 0;
	padding: 0;
	list-style: none;
}

.aliceai-tbd ul li {
	padding: 0.6rem 0;
	border-top: 1px solid var(--wp--preset--color--navy-20);
	color: var(--wp--preset--color--navy-70);
}

.aliceai-tbd ul li:first-child {
	border-top: 0;
}

/* --- 8c. Lomakkeet (WPForms Lite) -------------------------------------- */

/* WPForms tuo oman tyylitiedostonsa, jonka nappi on oletuksena kirkkaan
   sininen ja kentät geneerisiä. Tässä ne tuodaan design-systeemiin.

   ⚠️ Väreihin EI kosketa omilla väri-säännöillä. Pluginin oma valitsin on
   `div.wpforms-container-full button[type="submit"]:not(:hover):not(:active)`
   (spesifisyys 0,4,2), joten tavallinen `.wpforms-container button` (0,2,1)
   häviää — ja !important-kilpajuoksu olisi hauras. Plugin lukee värit
   CSS-muuttujista, joten oikea tapa on asettaa muuttujat. Mitattu 2026-08-24
   selaimesta: laskettu arvo oli sininen vaikka oma sääntö oli olemassa.

   ⚠️ Valitsimet ja muuttujat ovat pluginin omia. Jos lomake-plugin vaihdetaan,
   tämä osio pitää kirjoittaa uusiksi — tietoinen riippuvuus, ks. suunnitelma osa 7. */

.wpforms-container {
	margin: 0;

	/* Pluginin omat teemamuuttujat -> teeman tokenit. */
	--wpforms-button-background-color: var(--wp--preset--color--forest-green);
	--wpforms-button-background-color-alt: var(--wp--preset--color--forest-green);
	--wpforms-button-text-color: #fff;
	--wpforms-button-text-color-alt: #fff;
	--wpforms-button-border-radius: 10px;
	--wpforms-button-border-size: 0px;
	/* Mitattu sivuston sisältönapista (.wp-block-button__link): 17px / paino 600
	   / padding 14.45px 29.75px. Lomakenapin pitää olla sama, ei "melkein sama". */
	--wpforms-button-size-font-size: 17px;
	--wpforms-button-size-padding-h: 29.75px;
	--wpforms-button-size-height: 3.05rem;

	--wpforms-field-border-color: var(--wp--preset--color--navy-20);
	--wpforms-field-border-radius: 10px;
	--wpforms-field-border-size: 1px;
	--wpforms-field-background-color: #fff;
	--wpforms-field-text-color: var(--wp--preset--color--ink);
	--wpforms-field-size-font-size: 1rem;
	--wpforms-field-size-padding-h: 0.9rem;

	--wpforms-label-color: var(--wp--preset--color--ink);
	--wpforms-label-sublabel-color: var(--wp--preset--color--navy-70);
	--wpforms-label-error-color: #B3261E;
}

.wpforms-field {
	padding: 0 0 var(--wp--preset--spacing--30) 0;
}

.wpforms-field-label {
	font-family: var(--wp--preset--font-family--grotesk);
	font-size: 0.95rem;
	font-weight: 600;
	color: var(--wp--preset--color--ink);
	margin-bottom: 0.4rem;
}

.wpforms-required-label {
	color: var(--wp--preset--color--forest-green);
}

.wpforms-field-description {
	font-size: 0.85rem;
	color: var(--wp--preset--color--navy-70);
	margin-top: 0.35rem;
}

.wpforms-container input[type="text"],
.wpforms-container input[type="email"],
.wpforms-container input[type="tel"],
.wpforms-container select,
.wpforms-container textarea {
	width: 100%;
	padding: 0.7rem 0.9rem;
	border: 1px solid var(--wp--preset--color--navy-20);
	border-radius: 10px;
	background: #fff;
	font-family: var(--wp--preset--font-family--inter);
	font-size: 1rem;
	color: var(--wp--preset--color--ink);
	transition: border-color 160ms var(--aliceai-ease), box-shadow 160ms var(--aliceai-ease);
}

.wpforms-container input[type="text"]:focus,
.wpforms-container input[type="email"]:focus,
.wpforms-container input[type="tel"]:focus,
.wpforms-container select:focus,
.wpforms-container textarea:focus {
	outline: none;
	border-color: var(--wp--preset--color--forest-green);
	/* Näkyvä fokusrengas myös näppäimistökäyttäjälle — pelkkä reunavärin
	   vaihto ei riitä saavutettavuudessa. */
	box-shadow: 0 0 0 3px rgba(27, 87, 102, 0.18);
}

.wpforms-container textarea {
	/* ⚠️ Tämä on LATTIA, joka voittaa pluginin oman koon. Plugin antaa
	   textarealle korkeuden kenttäkohtaisesta size-asetuksesta
	   (large ≈ 220px, medium ≈ 120px). Niin kauan kuin tämä oli 150px,
	   size: medium ei näkynyt mitenkään — laatikko jäi 150px:ään.
	   Jos madallat kenttiä builderissa, tarkista tämä luku. */
	min-height: 120px;
	resize: vertical;
}

/* Pudotusvalikko. Selaimen oma nuoli piilotetaan ja tilalle piirretään sama
   chevron kuin UKK-lohkossa (§8b), jotta kenttä on samannäköinen kuin muut
   ja kaikissa selaimissa. Korkeus tulee pluginin muuttujasta, jotta valikko
   on tasan tekstikenttien korkuinen. */
.wpforms-container select {
	height: var(--wpforms-field-size-input-height);
	padding-right: 2.6rem;
	appearance: none;
	-webkit-appearance: none;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5 6 6.5l5-5' fill='none' stroke='%23374551' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right 1rem center;
	background-size: 12px 8px;
	cursor: pointer;
}

/* Väri tulee yllä olevista muuttujista. Tässä vain se, mitä muuttujat eivät
   kata: paino ja hover-liike.

   HUOM tuplattu luokka: pluginin oma sääntö on
   `div.wpforms-container-full button[type="submit"]` (0,2,2), joten pelkkä
   `.wpforms-container button[type="submit"]` (0,1,2) häviää ja nappi jää
   painoon 500. Tuplaus nostaa spesifisyyden (0,3,2):een — sama tekniikka kuin
   navigaatiolinkeissä (ks. HEADER-osio). Mitattu selaimesta 2026-08-24. */
.wpforms-container.wpforms-container button[type="submit"] {
	font-weight: 600;
	cursor: pointer;
	transition: transform 180ms var(--aliceai-ease), box-shadow 180ms var(--aliceai-ease);
}

.wpforms-container.wpforms-container button[type="submit"]:hover {
	transform: translateY(-1px);
	box-shadow: var(--wp--preset--shadow--card-soft);
}

.wpforms-container.wpforms-container button[type="submit"]:focus-visible {
	outline: 3px solid var(--wp--preset--color--turquoise);
	outline-offset: 2px;
}

/* Virheilmoitukset luettaviksi: pluginin oletuspunainen ei täytä AA:ta
   valkoisella pohjalla pienessä koossa. */
.wpforms-container .wpforms-error {
	color: #B3261E;
	font-size: 0.85rem;
	margin-top: 0.35rem;
}

.wpforms-container input.wpforms-error,
.wpforms-container select.wpforms-error,
.wpforms-container textarea.wpforms-error {
	border-color: #B3261E;
}

/* Vahvistuslaatikko. Pluginin sääntö on
   `div.wpforms-container-full .wpforms-confirmation-container-full` (0,2,1), ja
   koska pluginin CSS latautuu teeman jälkeen, sama spesifisyys häviää
   latausjärjestyksessä. Luokka on siksi tuplattu -> (0,3,1). Pluginin
   vaaleanvihreä ei kuulu palettiin. Mitattu selaimesta 2026-08-24. */
div.wpforms-container-full .wpforms-confirmation-container-full.wpforms-confirmation-container-full {
	padding: var(--wp--preset--spacing--40);
	border: 1px solid var(--wp--preset--color--forest-green);
	border-radius: 20px;
	background: var(--wp--preset--color--forest-green-10);
	color: var(--wp--preset--color--ink);
}

.wpforms-confirmation-container-full p {
	margin: 0;
}

@media (prefers-reduced-motion: reduce) {
	.wpforms-container.wpforms-container button[type="submit"]:hover {
		transform: none;
	}
}

/* --- 8d. Oikeudelliset sivut (tietosuojaseloste, evästekäytäntö) -------- */

/* Pitkä, numeroitu asiakirja luetaan eri tavalla kuin markkinointisivu:
   otsikoiden pitää erottua selvästi ja tekstin pysyä yhtenä sarakkeena.
   Väljempi otsikkoväli tekee 15 osiosta selattavan. */

.aliceai-legal h2 {
	margin-top: var(--wp--preset--spacing--60);
	padding-top: var(--wp--preset--spacing--40);
	border-top: 1px solid var(--wp--preset--color--navy-20);
}

.aliceai-legal h3 {
	margin-top: var(--wp--preset--spacing--40);
}

.aliceai-legal ul,
.aliceai-legal ol {
	padding-left: 1.3rem;
}

.aliceai-legal li {
	margin-bottom: 0.4rem;
}

/* Taulukko: käsittelyn tarkoitukset ja oikeusperusteet. Kapea palsta ja
   pitkä teksti -> vaakavieritys omassa säiliössään, jottei koko sivu ala
   vierimään sivusuunnassa mobiilissa. */
.aliceai-legal-table {
	overflow-x: auto;
	margin-block: var(--wp--preset--spacing--40);
}

.aliceai-legal-table table {
	border-collapse: collapse;
	min-width: 34rem;
}

.aliceai-legal-table th,
.aliceai-legal-table td {
	padding: 0.7rem 0.9rem;
	border: 1px solid var(--wp--preset--color--navy-20);
	text-align: left;
	vertical-align: top;
	font-size: 0.95rem;
	color: var(--wp--preset--color--navy-70);
}

.aliceai-legal-table th {
	background: var(--wp--preset--color--mist);
	font-family: var(--wp--preset--font-family--grotesk);
	font-weight: 600;
	color: var(--wp--preset--color--ink);
}

/* --- 9. Napit ja linkit ----------------------------------------------- */

.wp-element-button,
/* ⚠️ Otsikoiden rivitys oli satunnaista: selain katkaisee rivin siitä mihin
   sana sattuu mahtumaan, jolloin viimeiselle riville jää helposti yksi sana
   ("Ratkaisu ammattilaisen ja organisaation / tarpeisiin"). `balance` jakaa
   rivit tasaisesti, mikä on juuri lyhyissä otsikoissa selvä parannus.

   Rajattu otsikoihin tarkoituksella: `balance` on selaimissa rajattu noin
   kuuteen riviin, ja leipätekstissä se olisi sekä tehoton että hidas. */
:where(h1, h2, h3, h4, .wp-block-post-title) {
	text-wrap: balance;
}

.wp-block-button__link {
	transition: background-color 180ms var(--aliceai-ease), color 180ms var(--aliceai-ease),
		transform 180ms var(--aliceai-ease), box-shadow 180ms var(--aliceai-ease);
}

.wp-block-button__link:hover {
	transform: translateY(-1px);
	box-shadow: 0 6px 16px rgba(27, 87, 102, 0.28);
}

.is-style-outline .wp-block-button__link:hover {
	box-shadow: none;
}

/* ⚠️ Ulkoreunallinen nappi oli 2px matalampi kuin täytetty, joten vierekkäin
   ne eivät olleet samalla viivalla (mitattu: 57px vs. 55px).

   Syy ei ole reunaviiva vaan se, että ytimen sääntö
       :root :where(.wp-block-button.is-style-outline > .wp-block-button__link)
   ylikirjoittaa theme.jsonin pehmusteen omalla arvollaan 0.667em/1.333em —
   siis PIENEMMÄLLÄ kuin teeman 0.85em/1.75em. Ero on siksi sekä pysty- että
   vaakasuunnassa, ei pelkkä reunan paksuus.

   Palautetaan teeman pehmuste ja vähennetään siitä reunaviivan 2px, jolloin
   ulkomitat ovat täsmälleen samat. Spesifisyys (0,3,0) voittaa ytimen
   `:root :where(…)` -säännön (0,1,0). */
.wp-block-button.is-style-outline > .wp-block-button__link,
.wp-block-button .wp-block-button__link.is-style-outline {
	padding: calc(0.85em - 2px) calc(1.75em - 2px);
}

/* Nuolilinkin nuoli liikkuu hoverissa. */
.aliceai-arrow-link a::after,
a.aliceai-arrow::after {
	content: " \2192";
	display: inline-block;
	transition: transform 180ms var(--aliceai-ease);
}

.aliceai-arrow-link a:hover::after,
a.aliceai-arrow:hover::after {
	transform: translateX(4px);
}

/* --- 10. Saavutettavuus ------------------------------------------------ */

:where(a, button, .wp-block-button__link, summary):focus-visible {
	outline: 3px solid var(--wp--preset--color--turquoise);
	outline-offset: 2px;
	border-radius: 4px;
}

/* Maalattu teksti brändiväreihin — pieni yksityiskohta, mutta selaimen
   oletussininen rikkoo paletin joka kerta kun joku kopioi tekstiä. */
::selection {
	background-color: var(--wp--preset--color--turquoise-60);
	color: var(--wp--preset--color--navy);
}

/* Ankkurilinkit eivät jää sticky-headerin alle. */
html {
	scroll-padding-top: 120px;
}

/* --- 11. Scroll-reveal (vain jos käyttäjä ei ole estänyt animaatioita) -- */

@media (prefers-reduced-motion: no-preference) {
	html {
		scroll-behavior: smooth;
	}

	/* ⚠️ JOKAINEN piilottava sääntö on `.aliceai-js`-portin takana, ja niin
	   pitää olla jatkossakin. Luokan lisää functions.php:n inline-skripti
	   ennen ensimmäistä piirtoa. Ilman porttia sisältö jää pysyvästi
	   näkymättömäksi kaikkialla, missä ui.js ei aja:

	     · lohkoeditorissa (ui.js ei lataudu adminissa) — sivun muokkaaminen
	       näytti mahdottomalta, koska tekstin tilalla oli tyhjää. 2026-08-23.
	     · kävijällä, jonka selaimessa skripti ei lataudu tai kaatuu.

	   Portti tarkoittaa, että oletus on NÄKYVÄ ja piilotus on lisäominaisuus.

	   ⚠️ Osio ITSE ei liiku eikä häivy. Aiemmin `.aliceai-reveal` sai
	   translateY(18px):n, jolloin täysleveä värillinen palkki nousi
	   paikalleen ja sen alta välähti 18px valkoista — kahden vierekkäisen
	   taustapalkin sauma näytti rikkinäiseltä juuri sillä hetkellä kun
	   käyttäjä katsoi sitä. Nyt liikkuu vain sisältö, ja taustapinta pysyy
	   koko ajan paikallaan. */
	.aliceai-js .aliceai-reveal > *:not(.wp-block-columns):not(.wp-block-buttons) {
		opacity: 0;
		transform: translateY(18px);
		transition: opacity 600ms var(--aliceai-ease), transform 600ms var(--aliceai-ease);
	}

	.aliceai-js .aliceai-reveal.is-visible > *:not(.wp-block-columns):not(.wp-block-buttons) {
		opacity: 1;
		transform: none;
	}

	/* Porrastus: kortit ja napit tulevat esiin peräkkäin eivätkä yhtenä
	   palana. Indeksin asettaa ui.js (--reveal-i); min() rajaa viiveen
	   neljään askeleeseen, jottei kuudes kortti jää odottamaan puolta
	   sekuntia. */
	.aliceai-js .aliceai-reveal .wp-block-columns > .wp-block-column,
	.aliceai-js .aliceai-reveal .wp-block-buttons > .wp-block-button {
		opacity: 0;
		transform: translateY(14px);
		transition: opacity 550ms var(--aliceai-ease), transform 550ms var(--aliceai-ease);
		transition-delay: calc(min(var(--reveal-i, 0), 4) * 80ms);
	}

	.aliceai-js .aliceai-reveal.is-visible .wp-block-columns > .wp-block-column,
	.aliceai-js .aliceai-reveal.is-visible .wp-block-buttons > .wp-block-button {
		opacity: 1;
		transform: none;
	}
}

/* Liikkeen vähentäminen: kaikki koristeellinen siirtymä pois. Aiemmin tämä
   kattoi vain kolme hover-sääntöä, jolloin nuolet, someikonit ja alavalikot
   liikkuivat silti. */
@media (prefers-reduced-motion: reduce) {
	.is-style-card:hover,
	.aliceai-card:hover,
	.wp-block-button__link:hover,
	.aliceai-arrow-link a:hover::after,
	a.aliceai-arrow:hover::after,
	.aliceai-social:hover,
	.aliceai-imagecard:hover img,
	.aliceai-nav .wp-block-navigation-item:hover > .wp-block-navigation__submenu-icon,
	.aliceai-nav .wp-block-navigation-item:focus-within > .wp-block-navigation__submenu-icon,
	.aliceai-nav .wp-block-navigation-item:hover > .wp-block-navigation__submenu-container,
	.aliceai-nav .wp-block-navigation-item:focus-within > .wp-block-navigation__submenu-container {
		transform: none;
	}
}

/* Tummalla taustalla checklistin ✓ on turkoosi (hero, CTA-palkki). */
.aliceai-hero ul.is-style-checklist li::before,
.aliceai-trust-row ul.is-style-checklist li::before {
	background-color: var(--wp--preset--color--turquoise);
}

.aliceai-hero ul.is-style-checklist li::after,
.aliceai-trust-row ul.is-style-checklist li::after {
	border-color: var(--wp--preset--color--navy);
}

/* --- 12. Tummat palkit ------------------------------------------------- */

/* Taustakerros (lisätty 2026-08-20). Tummat palkit olivat isoja tyhjiä
   gradienttipintoja. Kerros tehdään pseudoelementeillä eikä background-
   ominaisuudella, koska WP:n gradienttiluokka
   (.has-deep-teal-gradient-background) tulee !important-määreellä eikä sitä
   voi laajentaa taustapinoon. isolation: isolate pitää z-index: -1:n palkin
   sisällä, jolloin kerros piirtyy palkin oman gradientin päälle mutta
   sisällön alle. Sama tekniikka on käytössä .aliceai-hero:ssa. */
.aliceai-band--dark {
	position: relative;
	isolation: isolate;
}

/* Ruudukko: 48px laatta, häivytetään reunoja kohti maskilla jottei laattojen
   raja näy kovana viivana.

   ⚠️ Tässä oli hetken aikaa brändin oma kudottu ristikkokuvio
   (`AliceAI_vector.pdf`:stä poimittuna), mutta se osoittautui taustana
   levottomaksi: kuvion vahvat kaaret kilpailivat tekstin kanssa toisin kuin
   neutraali suora ruudukko. Palattu ruudukkoon 2026-08-20 käyttäjän pyynnöstä.
   Brändikuvio ja sen poimintatapa löytyvät gitin historiasta (commit 428de5a),
   jos sille keksitään myöhemmin sopivampi paikka. */
.aliceai-band--dark::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: -1;
	pointer-events: none;
	background-image: url("assets/images/bg-grid.svg");
	background-size: 48px 48px;
	-webkit-mask-image: radial-gradient(110% 90% at 50% 0%, #000 20%, transparent 80%);
	mask-image: radial-gradient(110% 90% at 50% 0%, #000 20%, transparent 80%);
}

/* Sama tumma palkki ilman ruudukkoa. Käytössä Tutkimus- ja Tarinamme-sivujen
   heroissa, joissa ruudukko kilpaili keskitetyn otsikon kanssa (käyttäjän
   pyyntö 2026-09-06).

   ⚠️ Luokka --dark on PAKKO pitää mukana, vaikka ruudukko lähtee. Se ei ole
   pelkkä taustakerros: `.aliceai-band--dark p.is-style-eyebrow` antaa
   eyebrow'lle vaalean värin ja `.aliceai-band--dark a` linkeille turkoosin.
   Ilman sitä eyebrow jäisi tummaksi tummalla pohjalla — sama ansa, joka on
   kaatanut footerin linkit ja leipätekstin aiemmin. */
.aliceai-band--plain::before {
	background-image: none;
}

/* Hehku: kaksi pehmeää turkoosia valoa vastakkaisiin kulmiin. Antaa
   syvyyttä ilman että mikään yksittäinen muoto erottuu. */
.aliceai-band--dark::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: -1;
	pointer-events: none;
	background-image:
		radial-gradient(55% 75% at 12% -5%, rgba(53, 195, 196, 0.22), transparent 62%),
		radial-gradient(45% 65% at 98% 105%, rgba(53, 195, 196, 0.12), transparent 60%);
}

/* Linkin oletusväri (forest-green) katoaa tummalla taustalla, joten
   tummat palkit saavat oman linkkivärinsä. */
.aliceai-band--dark a:where(:not(.wp-block-button__link)) {
	color: var(--wp--preset--color--turquoise);
}

.aliceai-band--dark a:where(:not(.wp-block-button__link)):hover {
	color: var(--wp--preset--color--white);
}

/* Läpikuultavat kortit tummalla taustalla nousevat hieman hoverissa. */
.aliceai-band--dark .wp-block-column[style*="border-radius"] {
	transition: background-color 200ms var(--aliceai-ease), border-color 200ms var(--aliceai-ease);
}

.aliceai-band--dark .wp-block-column[style*="border-radius"]:hover {
	background-color: rgba(255, 255, 255, 0.04);
	border-color: rgba(255, 255, 255, 0.28) !important;
}

/* =========================================================================
   FOOTER — modernisoitu 2026-08-19, laajennettu 2026-08-20
   Aiempi versio kärsi samasta juurisyystä kuin header: linkit perivät
   theme.json:n sisältölinkkityylin (20px / 600 / forest-green). Tummalla
   navy-taustalla forest-green antoi kontrastiksi vain 2,60:1 — selvästi alle
   WCAG AA:n — ja iso lihava linkki söi sarakeotsikon hierarkian.

   2026-08-20: poistettu ylänurkkien 28px pyöristys. Footerin yläpuolella on
   tumma CTA-palkki, joten pyöristys leikkasi kahden tumman pinnan väliin
   valkoiset kiilat ja luki bugina, ei muotoiluna. Lisätty logo, slogan ja
   isompi pystyrytmi (mockup: specs/footer-mockup-2026-08-20.png).
   ========================================================================= */

.aliceai-footer {
	font-size: var(--wp--preset--font-size--small);
	border-radius: 0;
}

/* Logo on teemassa yksivärinen turkoosi wordmark läpinäkyvällä taustalla,
   joten valkoiseksi kääntäminen onnistuu suodattimella — erillistä vaaleaa
   logotiedostoa ei tarvita. brightness(0) litistää kaiken mustaksi, invert(1)
   kääntää sen valkoiseksi; alfakanava säilyy. */
.aliceai-footer-logo img {
	filter: brightness(0) invert(1);
	opacity: 0.95;
}

/* Sarakeotsikko on hiljainen tunniste, linkit ovat pääsisältöä. Aiemmin
   tämä oli päinvastoin: otsikot valkoisia ja linkit vaimeita. */
.aliceai-footer .aliceai-footer-label {
	font-family: var(--wp--preset--font-family--inter);
	font-size: 0.75rem;
	font-weight: 700;
	text-transform: uppercase;
	margin-bottom: var(--wp--preset--spacing--30);
}

.aliceai-footer .aliceai-footer-links p {
	margin: 0;
	line-height: 1.4;
}

/* Linkkien väri on pakko asettaa tässä: theme.json:n elements.link antaa
   forest-greenin, joka on tummalla taustalla lukukelvoton. navy-20 antaa
   noin 11:1 kontrastin. */
.aliceai-footer a:where(:not(.wp-element-button)) {
	font-size: inherit;
	font-weight: 400;
	color: var(--wp--preset--color--navy-20);
	transition: color 160ms var(--aliceai-ease);
}

.aliceai-footer a:where(:not(.wp-element-button)):hover {
	color: var(--wp--preset--color--white);
	text-decoration: none;
}

.aliceai-footer .aliceai-footer-links a {
	display: inline-block;
	padding-block: 0.3rem;
}

/* --- Someikonit -------------------------------------------------------- */

/* Ilman taustasirua, kuten mockupissa: pelkkä ikoni, joka kirkastuu
   hoverissa. Viivaikonit ovat valmiiksi vaaleita, joten riittää opacity. */
.aliceai-social {
	margin: 0;
	line-height: 0;
	opacity: 0.9;
	transition: opacity 180ms var(--aliceai-ease), transform 180ms var(--aliceai-ease);
}

.aliceai-social:hover {
	opacity: 1;
	transform: translateY(-2px);
}

.aliceai-social img {
	display: block;
	width: 20px;
	height: 20px;
	/* sama tekniikka kuin logolla: viivaikonit ovat yksivärisiä, joten ne
	   kääntyvät valkoisiksi suodattimella ilman erillistä tiedostoa */
	filter: brightness(0) invert(1);
}

/* --- Slogan ------------------------------------------------------------ */

/* Iso brändilause sarakkeiden alla. Tarkoituksella <p> eikä otsikko: se ei
   aloita uutta sisältöosiota, joten se ei kuulu asiakirjan otsikkorakenteeseen. */
.aliceai-footer-slogan {
	font-family: var(--wp--preset--font-family--grotesk);
	font-size: clamp(2rem, 1.25rem + 2.6vw, 3.25rem);
	font-weight: 500;
	line-height: 1.1;
	letter-spacing: -0.02em;
	margin: 0;
}

/* --- Alapalkki --------------------------------------------------------- */

.aliceai-footer-bottom {
	font-size: 0.8125rem;
}

.aliceai-footer-bottom p {
	margin: 0;
}

/* blockGap (4,5rem) on oikea väli sarakkeiden ja sloganin välillä, mutta
   liikaa erottimen ympärillä — siksi nämä kaksi asetetaan käsin. */
.aliceai-footer > .wp-block-separator {
	opacity: 0.35;
	border: 0;
	height: 1px;
	margin-block-start: var(--wp--preset--spacing--50);
	margin-block-end: 0;
}

.aliceai-footer > .aliceai-footer-bottom {
	margin-block-start: var(--wp--preset--spacing--30);
}

@media (max-width: 781px) {
	.aliceai-footer .wp-block-columns {
		gap: var(--wp--preset--spacing--40);
	}

	.aliceai-footer-bottom {
		gap: 0.5rem;
	}
}

/* =========================================================================
   HEADER — modernisoitu 2026-08-19, kelluva pilleri 2026-08-20
   Malli: specs/Näyttökuva 2026-08-18 kello 15.33.35.png
   Aiempi versio oli liian tiheä ja liian lihava: navigaatio peri
   theme.json:n linkkityylin (600) ja 1.125rem leipätekstikoon, jolloin
   valikko luki raskaana otsikkorivinä eikä kevyenä navigaationa.

   ⚠️ 2026-08-20: sticky ei toiminut lainkaan. `.aliceai-header` oli
   `position: sticky`, mutta se on `<header class="wp-block-template-part">`
   -kääreen sisällä, joka on vain headerin korkuinen (111px). Sticky-elementti
   ei voi poistua sisältävästä lohkostaan, joten header vieri pois heti.
   Mitattu: 2000px scrollin jälkeen headerin top oli -2000. JS lisäsi
   `.is-stuck`-luokan oikein, mutta sen varjoa ei nähnyt kukaan.
   Korjaus: sticky siirretty ULOMPAAN kääreeseen, joka on .wp-site-blocksin
   lapsi ja jonka sisältävä lohko on koko sivun korkuinen.
   ========================================================================= */

.wp-site-blocks > header.wp-block-template-part {
	position: sticky;
	top: 0;
	z-index: 50;
	/* flow-root estää sisemmän elementin marginaalien karkaamisen kääreestä
	   (pilleritilassa sisempi header käyttää marginaalia korkeuskompensointiin) */
	display: flow-root;
	transition: padding 260ms var(--aliceai-ease), margin 260ms var(--aliceai-ease);
}

.aliceai-header {
	background-color: var(--wp--preset--color--white);
	border-bottom: 1px solid var(--wp--preset--color--navy-10);
	transition:
		max-width 260ms var(--aliceai-ease),
		margin 260ms var(--aliceai-ease),
		padding 260ms var(--aliceai-ease),
		border-radius 260ms var(--aliceai-ease),
		border-color 220ms var(--aliceai-ease),
		background-color 220ms var(--aliceai-ease),
		box-shadow 220ms var(--aliceai-ease);
}

.aliceai-header .wp-block-site-logo img {
	display: block;
	height: auto;
}

/* --- Kelluva pilleri (työpöytä) ----------------------------------------- */

/* ⚠️ Nollasiirtymän matematiikka: kun header kutistuu pilleriksi, sen
   pystypadding pienenee 1rem → 0.55rem. Sticky-elementti on YHÄ normaalissa
   virrassa, joten pelkkä kutistuminen siirtäisi koko alla olevan sivun ylös
   sillä hetkellä kun luokka vaihtuu — näkyvänä nytkähdyksenä. Siksi sisempi
   header saa marginaalin 0.45rem, joka on täsmälleen se mitä padding menetti
   (0.55 + 0.45 = 1rem). Samoin kääreen padding-top: 10px kumotaan
   margin-bottom: -10px:llä. Nettokorkeus pysyy muuttumattomana.
   Jos muutat jompaakumpaa lukua, muuta myös sen paria. */
@media (min-width: 941px) {
	.wp-site-blocks > header.wp-block-template-part.is-stuck {
		padding: 10px var(--aliceai-gutter) 0;
		margin-bottom: -10px;
	}

	.is-stuck .aliceai-header {
		max-width: 1240px;
		margin-inline: auto;
		margin-block: 0.45rem;
		padding-top: 0.55rem !important;
		padding-bottom: 0.55rem !important;
		padding-left: 1.75rem !important;
		padding-right: 1.75rem !important;
		border-radius: 999px;
		border-bottom-color: transparent;
		background-color: rgba(255, 255, 255, 0.82);
		box-shadow: 0 10px 30px rgba(5, 22, 38, 0.12), 0 1px 2px rgba(5, 22, 38, 0.06);
	}

	@supports ((backdrop-filter: blur(2px)) or (-webkit-backdrop-filter: blur(2px))) {
		.is-stuck .aliceai-header {
			-webkit-backdrop-filter: blur(14px) saturate(160%);
			backdrop-filter: blur(14px) saturate(160%);
		}
	}

	/* Ilman backdrop-filteriä läpikuultava tausta jättäisi tekstin
	   lukukelvottomaksi vierivän sisällön päälle — silloin umpinainen. */
	@supports not ((backdrop-filter: blur(2px)) or (-webkit-backdrop-filter: blur(2px))) {
		.is-stuck .aliceai-header {
			background-color: var(--wp--preset--color--white);
		}
	}
}

/* Mobiilissa ei pilleriä: kosketuskäytössä reunasta reunaan on parempi,
   ja kapealla ruudulla pilleri söisi liikaa vaakatilaa. */
@media (max-width: 940px) {
	.is-stuck .aliceai-header {
		border-bottom-color: transparent;
		box-shadow: 0 1px 0 rgba(5, 22, 38, 0.06), 0 10px 28px rgba(5, 22, 38, 0.07);
	}
}

@media (prefers-reduced-motion: reduce) {
	.wp-site-blocks > header.wp-block-template-part,
	.aliceai-header {
		transition: none;
	}
}

/* --- Navigaation ylätaso ------------------------------------------------ */

/* Kevyempi kuin leipäteksti: 0.95rem / 500. Ylikirjoittaa theme.json:n
   elements.link-säännön (600), joka on tarkoitettu sisältölinkeille.

   HUOM tuplattu luokka selektorissa: WP-ydin pakottaa navigaatiolinkeille
   `color: inherit` selektorilla
   `.wp-block-navigation .wp-block-navigation-item__content.wp-block-navigation-item__content`
   (spesifisyys 0,3,0) nimenomaan estääkseen teemoja ylikirjoittamasta väriä.
   Ilman tuplausta oma sääntö (0,2,0) häviää ja linkit perivät leipätekstin
   värin. Tämä koskee KAIKKIA navigaation värisääntöjä alla. */
.aliceai-nav .wp-block-navigation-item__content.wp-block-navigation-item__content {
	font-size: 0.95rem;
	font-weight: 500;
	color: var(--wp--preset--color--navy-70);
	letter-spacing: 0;
	padding-block: 0.35rem;
	transition: color 160ms var(--aliceai-ease);
}

.aliceai-nav .wp-block-navigation-item__content.wp-block-navigation-item__content:hover,
.aliceai-nav .wp-block-navigation-item__content.wp-block-navigation-item__content:focus-visible {
	color: var(--wp--preset--color--forest-green);
	text-decoration: none;
}

/* Nykyinen sivu: tummempi ja hienovarainen alleviivaus. */
.aliceai-nav .current-menu-item > .wp-block-navigation-item__content.wp-block-navigation-item__content,
.aliceai-nav .current-menu-ancestor > .wp-block-navigation-item__content.wp-block-navigation-item__content {
	color: var(--wp--preset--color--ink);
	font-weight: 600;
}

.aliceai-nav > ul > .wp-block-navigation-item {
	position: relative;
}

.aliceai-nav > ul > .current-menu-item::after,
.aliceai-nav > ul > .current-menu-ancestor::after {
	content: "";
	position: absolute;
	left: 0;
	right: 0;
	bottom: -0.4rem;
	height: 2px;
	border-radius: 2px;
	background: var(--wp--preset--color--forest-green);
}

/* --- Pudotusvalikon nuoli ----------------------------------------------- */

/* ⚠️ Väli tulee MARGINAALISTA, ei paddingista, ja laatikko on täsmälleen
   SVG:n kokoinen. Aiemmin laatikko oli 10,2px leveä mutta sisälsi 11px SVG:n,
   joka ylivuoti oikealle, ja väli tehtiin 0.3rem vasemmalla paddingilla.
   Hoverin `rotate(180deg)` kiertää laatikon KESKIPISTEEN ympäri, jolloin
   ylivuoto heilahti vasemmalle ja nuoli meni 1,4px otsikkotekstin päälle.
   Kun laatikko vastaa SVG:tä, kierto on symmetrinen eikä liikuta mitään. */
.aliceai-nav .wp-block-navigation__submenu-icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	width: 11px;
	height: 11px;
	padding: 0;
	margin-left: 0.6rem;
	opacity: 0.45;
	transition: opacity 160ms var(--aliceai-ease), transform 200ms var(--aliceai-ease);
}

/* Nuolen pyörähdys hoverissa.

   Tässä on kaksi kiertoa päällekkäin, ja se on tarkoituksellista:
   WP-ydin kiertää SVG:n 180° **ilman siirtymää** (napsahtaa heti), ja tämä
   sääntö kiertää kääre-elementin 180° **200ms siirtymällä**. Yhteisvaikutus
   on pyörähdys: nuoli napsahtaa ensin ylös ja pyörähtää sitten pehmeästi
   takaisin alas. Pelkkä ytimen kierto ilman tätä = nuoli vain hyppää ylös
   ilman liikettä.

   ⚠️ Tämä toimii vain koska kääre on täsmälleen SVG:n kokoinen (ks. sääntö
   yllä). Jos kääre on kapeampi kuin SVG, kierto tapahtuu eri keskipisteestä
   kuin nuoli ja heilauttaa sen otsikkotekstin päälle — juuri näin kävi
   2026-08-20, kun väli tehtiin kääreen paddingilla. Älä palauta paddingia. */
.aliceai-nav .wp-block-navigation-item:hover > .wp-block-navigation__submenu-icon,
.aliceai-nav .wp-block-navigation-item:focus-within > .wp-block-navigation__submenu-icon {
	opacity: 1;
	transform: rotate(180deg);
}

.aliceai-nav .wp-block-navigation__submenu-icon svg {
	display: block;
	width: 11px;
	height: 11px;
}

/* --- Pudotusvalikko ----------------------------------------------------- */

/* WP:n oletus on terävä laatikko 1px mustalla reunuksella, joka periytyy
   emon taustavärin kautta — kirjoitetaan kaikki eksplisiittisesti. */
.aliceai-nav .wp-block-navigation__submenu-container {
	min-width: 232px;
	padding: 0.4rem;
	background-color: var(--wp--preset--color--white);
	border: 1px solid var(--wp--preset--color--navy-10);
	border-radius: 14px;
	box-shadow: 0 16px 40px -12px rgba(5, 22, 38, 0.22), 0 2px 8px rgba(5, 22, 38, 0.06);
	transform: translateY(6px);
	transition: opacity 180ms var(--aliceai-ease), transform 180ms var(--aliceai-ease);
}

/* Pieni väli emon ja valikon väliin ilman että hover katkeaa. */
.aliceai-nav .wp-block-navigation__submenu-container::before {
	content: "";
	position: absolute;
	left: 0;
	right: 0;
	top: -10px;
	height: 10px;
}

.aliceai-nav .has-child:hover > .wp-block-navigation__submenu-container,
.aliceai-nav .has-child:focus-within > .wp-block-navigation__submenu-container,
.aliceai-nav .has-child .wp-block-navigation-submenu__toggle[aria-expanded="true"] + .wp-block-navigation__submenu-container {
	transform: translateY(0);
}

.aliceai-nav .wp-block-navigation__submenu-container .wp-block-navigation-item__content.wp-block-navigation-item__content {
	display: block;
	padding: 0.6rem 0.85rem;
	border-radius: 9px;
	font-size: 0.925rem;
	font-weight: 500;
	color: var(--wp--preset--color--navy-70);
	transition: background-color 140ms var(--aliceai-ease), color 140ms var(--aliceai-ease);
}

.aliceai-nav .wp-block-navigation__submenu-container .wp-block-navigation-item__content.wp-block-navigation-item__content:hover {
	background-color: var(--wp--preset--color--mist);
	color: var(--wp--preset--color--forest-green);
}

/* --- Oikean reunan utility-ryhmä ---------------------------------------- */

.aliceai-header-utils {
	gap: 1.5rem !important;
}

.aliceai-lang,
.aliceai-login {
	margin: 0;
	font-size: 0.9rem;
}

.aliceai-lang a,
.aliceai-login a {
	font-weight: 500;
	color: var(--wp--preset--color--navy-50);
	transition: color 160ms var(--aliceai-ease);
}

.aliceai-lang a:hover,
.aliceai-login a:hover {
	color: var(--wp--preset--color--ink);
	text-decoration: none;
}

.aliceai-login a {
	color: var(--wp--preset--color--navy-70);
}

/* Maapallo-ikoni kielivalitsimen eteen ja pieni nuoli perään — tehdään
   pseudo-elementeillä, jotta merkintä pysyy siistinä. */
.aliceai-lang a::before {
	content: "";
	display: inline-block;
	width: 15px;
	height: 15px;
	margin-right: 0.4rem;
	vertical-align: -2px;
	background-color: currentColor;
	-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M3 12h18M12 3a15 15 0 0 1 0 18 15 15 0 0 1 0-18'/%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='black' stroke-width='2'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M3 12h18M12 3a15 15 0 0 1 0 18 15 15 0 0 1 0-18'/%3E%3C/svg%3E") center / contain no-repeat;
}

/* ⚠️ NUOLI POISTETTU 2026-09-09. Kielivalitsin oli aiemmin paikkamerkki, joka
   näytti pudotusvalikolta, ja alaspäin osoittava nuoli kuului siihen. Nyt se on
   YKSI vaihtolinkki: nuoli lupaisi valikon, jota ei aukea — ja klikattava
   elementti, joka ei tee lupaamaansa, on pahempi kuin koristeeton linkki.
   Maapallo-ikoni jää: se kertoo mistä on kyse ilman lupausta. */

/* --- Headerin CTA-nappi: pilleri, kompakti ------------------------------ */

.aliceai-header-cta .wp-block-button__link {
	border-radius: 999px;
	font-size: 0.9rem;
	padding: 0.72em 1.5em;
	white-space: nowrap;
}

/* --- Header mobiilissa --------------------------------------------------- */

@media (max-width: 940px) {
	/* ⚠️ ÄLÄ PIILOTA KIELIVALITSINTA. Tässä luki aiemmin
	   `.aliceai-header-utils > p { display: none }`, mikä oli tehty vanhoille
	   paikkamerkeille ("Suomi", "Kirjaudu sisään"). Kun valitsin muuttui
	   toimivaksi, sääntö piilotti sen mobiilissa — eikä kieltä voinut vaihtaa
	   millään: valitsin ei ole navigaatiolohkossa, joten se ei ole myöskään
	   hampurilaisvalikossa. CTA:lla on vaihtoehtoinen reitti (hero ja jokaisen
	   sivun CTA-palkki), kielenvaihdolla ei ole. */
	.aliceai-header-utils > p:not(.aliceai-lang) {
		display: none;
	}

	/* Valitsin kapeaksi: pelkkä lyhenne, ei ylimääräistä pehmustetta. */
	.aliceai-header .aliceai-lang {
		margin: 0;
		font-size: 0.82rem;
		font-weight: 600;
	}

	/* Hampurilaisvalikko napin viereen oikeaan reunaan. Ilman tätä
	   space-between jättää sen roikkumaan keskelle headeria. */
	.aliceai-header .aliceai-header-utils {
		order: 2;
		margin-left: auto;
	}

	.aliceai-header .aliceai-nav {
		order: 3;
	}

	.aliceai-nav .wp-block-navigation__responsive-container-open {
		padding: 0.35rem;
		color: var(--wp--preset--color--navy-70);
	}

	.aliceai-nav .wp-block-navigation__responsive-container-open svg {
		width: 28px;
		height: 28px;
	}
}

@media (max-width: 600px) {
	.aliceai-header {
		padding-left: var(--wp--preset--spacing--20) !important;
		padding-right: var(--wp--preset--spacing--20) !important;
	}

	.aliceai-header-cta .wp-block-button__link {
		padding: 0.6em 0.95em;
		font-size: 0.82rem;
	}

	.wp-block-site-logo img {
		max-width: 112px;
	}
}

/* ⚠️ Kapeimmat puhelimet: header ei skaalaudu kielen mukaan.
   Suomeksi headerissa oli 390px:ssä vain 16px pelivaraa, joten englanninkielinen
   CTA ("Book an assessment" vs. "Varaa kartoitus", +36px) työnsi
   hampurilaisnapin 8px ulos ruudusta ja koko sivulle tuli vaakavieritys.
   Mitattu 2026-09-08 kaikilla englanninkielisillä sivuilla; suomeksi 0px.

   ⚠️ Tämä ei ole englannin ongelma vaan mitoituksen: mikä tahansa pidempi
   nappiteksti tekisi saman. Jos vaihdat headerin CTA:n tekstiä kummallakaan
   kielellä, mittaa uudelleen:
       node specs/tools/mittaa.mjs <url>   → "mobiili 390px vaakaylivuoto: 0" */
@media (max-width: 480px) {
	.aliceai-header-cta .wp-block-button__link {
		padding: 0.6em 0.8em;
		font-size: 0.78rem;
	}

	.wp-block-site-logo img {
		max-width: 96px;
	}
}

/* ⚠️ 320px (iPhone SE 1. sukupolvi ja vanhemmat): header ei mahdu millään
   kutistuksella. Logo + kielivalitsin + kirjautuminen + CTA + hampurilaisnappi
   vaativat enemmän kuin 320px antaa — suomeksi ylivuoto oli 7px ja englanniksi
   39px (mitattu 2026-09-08). Suomen ylivuoto oli olemassa jo ennen
   englanninkielistä versiota, eli 320px ei ole koskaan toiminut.

   CTA piilotetaan, koska se on ainoa poistettavissa oleva elementti: logon,
   navigaation ja hampurilaisnapin on jäätävä. Kartoituskeskusteluun pääsee yhä
   jokaisen sivun CTA-palkista ja footerista, joten mitään ei katoa
   saavuttamattomiin. */
/* ⚠️ MOBIILISSA HEADERISSA ON LOGO, KIELIVALITSIN JA VALIKKO — EI CTA:TA.
   Aiemmin CTA oli mukana ja sitä kutistettiin portaittain, mutta se ei kestä
   tekstin pituuden muutoksia: oikoluku vaihtoi englanninkielisen CTA:n
   "Book an assessment" → "Book a needs assessment", jolloin utils-ryhmä kasvoi
   111 px → 177 px ja header vuoti ulos ruudusta useilla leveyksillä. Suomeksi
   headerissa on tarkoituksella LYHYT muoto ("Varaa kartoitus" esiintyy koko
   sivustolla vain siinä), eikä englannissa ole vastaavaa eroa.

   Kutistuskierre ratkaistiin rakenteella: CTA pois mobiilista kokonaan.

   Perustelu on epäsymmetrinen tarkoituksella:
   - CTA:lla on vaihtoehtoinen reitti — heron painike näkyy ilman vieritystä ja
     jokaisella sivulla on oma CTA-palkkinsa.
   - Kielenvaihdolla EI ole vaihtoehtoista reittiä: valitsin ei ole
     navigaatiolohkossa, joten se ei ole myöskään hampurilaisvalikossa. Jos se
     piilotetaan, kieltä ei voi vaihtaa mobiilissa lainkaan.

   Sivutuotteena header kestää nyt minkä tahansa nappitekstin kummallakin
   kielellä — mitattu 0 px ylivuoto leveyksillä 320–1440. */
@media (max-width: 600px) {
	/* ⚠️ Tuplattu luokka on pakollinen. Ytimen lohkokirjaston CSS latautuu
	   style.css:n JÄLKEEN, ja sen `.wp-block-button { display: … }` on samaa
	   spesifisyyttä (0,1,0) — myöhempi voittaa, joten yksinkertainen
	   `.aliceai-header-cta { display: none }` EI tehnyt mitään (mitattu:
	   getComputedStyle antoi yhä `block`). Sama kuvio kuin navigaatiossa ja
	   herokuvan asemoinnissa, ks. CLAUDE.md. */
	.aliceai-header-cta.aliceai-header-cta {
		display: none;
	}
}

/* Mobiilin ylivuotovalikko: sama typografia kuin työpöydällä, ei WP:n
   oletusarvoista jättikokoa. */
.aliceai-nav .wp-block-navigation__responsive-container.is-menu-open {
	padding: var(--wp--preset--spacing--50) var(--wp--preset--spacing--40);
	background-color: var(--wp--preset--color--white);
}

.aliceai-nav .is-menu-open .wp-block-navigation-item__content.wp-block-navigation-item__content {
	font-size: 1.15rem;
	font-weight: 600;
	color: var(--wp--preset--color--ink);
}

.aliceai-nav .is-menu-open .wp-block-navigation__submenu-container {
	min-width: 0;
	padding: 0;
	border: 0;
	border-radius: 0;
	box-shadow: none;
	transform: none;
}

.aliceai-nav .is-menu-open .wp-block-navigation__submenu-container .wp-block-navigation-item__content.wp-block-navigation-item__content {
	font-size: 1rem;
	font-weight: 500;
	color: var(--wp--preset--color--navy-70);
	padding-left: 0;
}

/* Navigaation vaihtokohta hampurilaisvalikkoon: ytimen 600px → 1024px.

   ⚠️ Sivustolla oli 124–275px vaakavieritys leveyksillä 561–959px, eli KAIKILLA
   iPadeilla pystyasennossa (mitattu 2026-09-08). Syy: WP:n navigaatiolohko
   vaihtaa hampurilaiseen vasta 600px:ssä, mutta tämä vaakanavi tarvitsee noin
   960px (8 valikkokohtaa + kielivalitsin + Kirjaudu sisään + CTA-nappi).
   Välissä header rivittyi, ytimen overflow-wrap tavutti valikkonimet
   ("Etusi-vu", "Oppi-misrat-kaisu"), CTA hyppäsi logon viereen, ja piilotetut
   alavalikkopaneelit — jotka ovat display:flex; visibility:hidden eivätkä
   display:none — kasvattivat scrollWidthiä.

   Vika ei näy kummassakaan totutussa testileveydessä: 390px:ssä on jo
   hampurilainen ja 1600px:ssä on tilaa. Siksi se oli katveessa. Ks. CLAUDE.md.

   1024px eikä 960px, koska mitattu murtumakohta on 940–960px — 64px
   liikkumavaraa, jottei yksi uusi valikkokohta riko tätä heti uudestaan.
   Raja on 1023.98px, joten iPad vaakatasossa (1024px) säilyttää vaakanavin.

   Ytimen säännöt ovat @media (min-width:600px) -lohkossa spesifisyydellä
   (0,3,0) ja (0,2,0); .aliceai-nav-etuliite nostaa nämä (0,4,0):ään ja
   (0,3,0):ään, joten ne voittavat latausjärjestyksestä riippumatta.

   Sulkunappi ei tarvitse omaa sääntöä: ytimen sääntö, joka piilottaa sen,
   sisältää :not(.is-menu-open) eikä siis osu auki olevaan valikkoon. */
@media (max-width: 1023.98px) {
	.aliceai-nav .wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) {
		display: none;
	}

	.aliceai-nav .wp-block-navigation__responsive-container-open:not(.always-shown) {
		display: flex;
	}
}
