/* SAMSUNG konferencijų centras — production stylesheet.
   Layout language from the approved samsungkc.vercel.app demo; colour and the
   notched image frame come from the client's 2026 Tech Zity presentation
   (wine #251216, rust #A53E00, sage #D0DFDD). --volt/--sky/--navy are kept as
   token names so existing markup keeps working; their values are brand colours. */

/* ---- Fonts (self-hosted, client brand) ---- */
@font-face { font-family: "Deacon"; src: url("/assets/fonts/Deacon-Bold.woff2") format("woff2"); font-weight: 600 800; font-style: normal; font-display: swap; }
@font-face { font-family: "NHaas"; src: url("/assets/fonts/NHaasGroteskDSPro-55Rg.woff2") format("woff2"); font-weight: 400; font-style: normal; font-display: swap; }
@font-face { font-family: "NHaas"; src: url("/assets/fonts/NHaasGroteskDSPro-56It.woff2") format("woff2"); font-weight: 400; font-style: italic; font-display: swap; }
@font-face { font-family: "NHaas"; src: url("/assets/fonts/NHaasGroteskDSPro-75Bd.woff2") format("woff2"); font-weight: 700; font-style: normal; font-display: swap; }

/* ---- Tokens ----
   Brand palette lifted from the 2026 Tech Zity presentation:
   wine #251216 (surfaces), rust #A53E00 (accent), sage #D0DFDD (panels). */
:root {
  --wine: #251216;
  --rust: #A53E00;
  --sage: #D0DFDD;
  --volt: #A53E00;
  --volt-deep: #7E2F00;
  --sky: #E07A3C;
  --vermillion: #F04800; /* Tech Zity brand accent — see CLAUDE.md co-brand zoning */
  --ink: #1E1013;
  --snow: #F7F3F2;
  --navy: #251216;
  --steel: #6B5A5E;
  --line: rgba(107, 90, 94, .22);
  /* Vienas „muted ant tamsaus“ tokenas smulkiam tekstui ant --ink/--wine/--navy:
     .55 duoda 6,15:1 ant ink ir 6,06:1 ant wine (išmatuota) — A11Y-02. */
  --muted-on-dark: rgba(255, 255, 255, .55);
  --font-display: "Deacon", "NHaas", system-ui, sans-serif;
  --font-body: "NHaas", system-ui, -apple-system, "Segoe UI", sans-serif;
  --font-mono: ui-monospace, "Cascadia Mono", "SF Mono", Consolas, monospace;
  --wrap: 1400px;
  --pad: clamp(1.25rem, 4vw, 2.5rem);
  color-scheme: only light;

  /* ---- Type scale ----
     Before this block the page carried four h2 sizes, eight h3 sizes and twelve
     distinct mono label sizes (.58rem–.8rem), all authored per component. The
     roles below are what those sizes actually meant; every component now picks
     a step instead of inventing one. Adding a size means adding a role here,
     not a number in a component. */
  --fs-title-sm: 1.125rem;  /* dense grids: 4-up cards, how-steps, survived */
  --fs-title-md: 1.25rem;   /* standard card title: supplier, venue, signal stage */
  --fs-title-lg: 1.5rem;    /* feature card / table column head */
  /* Fluid siblings, for titles that share a column with body copy and have to
     shrink with it. Replaces six near-identical hand-rolled clamps. */
  --fs-title-fluid: clamp(1.2rem, 2vw, 1.55rem);
  --fs-title-fluid-lg: clamp(1.3rem, 2.4vw, 1.9rem);
  --fs-display-md: clamp(1.35rem, 2.6vw, 2rem);

  /* Numbers read as numbers, not as titles — kept on their own ramp. */
  --fs-stat-sm: 1.35rem;
  --fs-stat-md: 1.9rem;
  --fs-stat-lg: clamp(2.6rem, 4vw, 3.6rem);

  /* Mono micro-labels. --fs-label-xs is the floor: 11.2px is the smallest size
     that still reads at .14em tracking. Nothing below it, on any viewport. */
  --fs-label-xs: .7rem;
  --fs-label-sm: .75rem;
  --fs-label-md: .82rem;
  --fs-mono-body: .9rem;   /* mono used as readable text: contact lines, prices */
  --ls-label-tight: .08em;
  --ls-label: .14em;
  --ls-label-wide: .2em;

  /* ---- Spacing scale ----
     Replaces 19 ad-hoc margin-top values that lived in template style="…"
     attributes. Utility classes .mt-1….mt-7 below expose these to markup so a
     spacing decision is a token choice, not a free-form number in a .njk. */
  --sp-1: .5rem;
  --sp-2: .75rem;
  --sp-3: 1rem;
  --sp-4: 1.5rem;
  --sp-5: 2rem;
  --sp-6: 3rem;
  --sp-7: 4.5rem;

  /* ---- Radius scale ---- (was .35 / .4 / .5 / .75 / .9 / 1 / 1.75rem) */
  --r-sm: .4rem;
  --r-md: .75rem;
  --r-lg: 1rem;
  --r-sheet: 1.75rem;
  /* Mygtukų apvalinimas — viena vieta visam puslapiui (žr. Buttons bloką).
     Pilna piliulė: 999px, kad kraštas liktų pusapskritimis bet kokiame aukštyje
     (44 / 48 / 56px) ir nereikėtų derinti radiuso po vieną dydį. */
  --r-btn: 999px;
}

/* Spacing utilities — the only sanctioned way to set vertical rhythm in markup. */
.mt-1 { margin-top: var(--sp-1); }
.mt-2 { margin-top: var(--sp-2); }
.mt-3 { margin-top: var(--sp-3); }
.mt-4 { margin-top: var(--sp-4); }
.mt-5 { margin-top: var(--sp-5); }
.mt-6 { margin-top: var(--sp-6); }
.mt-7 { margin-top: var(--sp-7); }
.mt-0 { margin-top: 0; }

/* ---- Reset / base ---- */
*, *::before, *::after { box-sizing: border-box; }
html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; background: var(--ink); }
body {
  margin: 0; font-family: var(--font-body); background: #fff; color: var(--ink);
  line-height: 1.65; font-weight: 400; -webkit-font-smoothing: antialiased;
}
img, video, svg { max-width: 100%; height: auto; }
picture { display: contents; }
a { color: inherit; }
h1, h2, h3, h4, p, figure, ul { margin: 0; }
ul { padding: 0; list-style: none; }
button { font: inherit; background: none; border: 0; cursor: pointer; color: inherit; padding: 0; }
input, textarea { font: inherit; min-height: 44px; }
::selection { background: var(--volt); color: #fff; }
a:focus-visible, button:focus-visible, input:focus-visible, textarea:focus-visible { outline: 2px solid var(--volt); outline-offset: 3px; }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; }
}

.skip-link { position: absolute; left: -999px; top: 0; z-index: 100; background: var(--volt); color: #fff; padding: .7rem 1.2rem; }
.skip-link:focus { left: 0; }
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }

/* ---- Layout utilities ---- */
.wrap { max-width: var(--wrap); margin-inline: auto; padding-inline: var(--pad); }
/* The negative pull is what puts the rounded corners OVER the section above, so
   the cut exposes that section's colour. It must be calc() — `-var(…)` is not
   valid CSS, and when it silently fell back to 0 every sheet stopped overlapping
   and the corners started cutting through to the white page background. */
.sheet { border-radius: var(--r-sheet) var(--r-sheet) 0 0; margin-top: calc(var(--r-sheet) * -1); position: relative; z-index: 1; }
.section { padding-block: clamp(5rem, 10vw, 9rem); }
.section-tight { padding-block: clamp(3.5rem, 7vw, 6rem); }
.bg-white { background: #fff; }
.bg-snow { background: var(--snow); }
.bg-ink { background: var(--ink); color: #fff; }
.bg-navy { background: var(--navy); color: #fff; }

/* ---- Typography ---- */
.display-xl { font-family: var(--font-display); font-size: clamp(2.9rem, 7.6vw, 7rem); line-height: 1.0; letter-spacing: -0.02em; font-weight: 700; }
.display-lg { font-family: var(--font-display); font-size: clamp(2.1rem, 4.8vw, 4.2rem); line-height: 1.05; letter-spacing: -0.015em; font-weight: 700; }
.display-md { font-family: var(--font-display); font-size: var(--fs-display-md); line-height: 1.16; letter-spacing: -0.01em; font-weight: 700; }
.eyebrow { font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-wide); text-transform: uppercase; font-weight: 500; }
.eyebrow-volt { color: var(--volt); }
.eyebrow-sky { color: var(--sky); }
.eyebrow-steel { color: var(--steel); }
.mono-line { font-family: var(--font-mono); font-size: var(--fs-label-xs); letter-spacing: var(--ls-label-wide); text-transform: uppercase; }
.lead { color: var(--steel); max-width: 34rem; }
.stat-huge { font-family: var(--font-display); font-size: clamp(3rem, 6.8vw, 6.2rem); line-height: .95; letter-spacing: -0.02em; font-weight: 700; font-variant-numeric: tabular-nums; }
.cap-num { font-variant-numeric: tabular-nums; }

/* ---- Buttons — VIENA sistema visame puslapyje ------------------------------
   Istorija: 2026-08 klientas prašė vieno mygtukų stiliaus („Mygtukai nevienodi“),
   tada TZ „dobilo“ forma buvo išimta, 2026-08-31 grąžinta kontūru — ir tos pačios
   dienos vakare išimta GALUTINAI (user directive: „change the clover button to the
   normal rounded corner buttons on all of the site“). Mygtukas dabar yra paprastas
   suapvalintų kampų stačiakampis. Kartu iškrito visas .tz-btn / .tz-btn-shape
   sluoksnis, jį piešęs main.js blokas ir anti-blyksnio eilutė base.njk <head>e:
   piešti nebėra ko, tad ir laukti nebėra ko, o mygtukas atrodo vienodai su JS ir be jo.

   Kas liko nepakitę: permatomas fonas, spalvota linija kaip visa mygtuko riba,
   užpildas tik per hover. Viena geometrija, vienas šriftas ir svoris, trys dydžiai
   (sm / md / lg) ir trys lygiai:
     .btn-primary                 — sky linija 1,5px (pagrindinis veiksmas)
     .btn-ghost / .btn-ghost-dark — sage linija    (antrinis)
     .btn-dl / .contact-chip      — neutrali linija (tretinis: atsisiuntimai, kontaktai)
   Hierarchija neša DU signalus: spalvą IR linijos storį (žr. daltonizmo taisyklę
   CLAUDE.md — nė viena būsena neperduodama vien spalva).

   Kontrastas ant tamsaus (visi .btn gyvena tamsiuose paviršiuose): sky ant wine
   5,96:1 ✓ — rust (--volt) čia netiktų, jis ant wine krenta. Hover užpildai
   nešasi --ink tekstą (vermillion su ink 4,95:1 ✓, sage su ink ✓); baltas ant
   vermillion draudžiamas.

   Apvalinimas — bendras --r-btn tokenas (viršuje, prie kitų --r-*): PILIULĖ, 999px
   (user directive „the buttons need to be more rounded"). Keisti jį ten, ne po
   vieną klasę: galerijos 2 mygtukai (galerija2.css) ir „⋮" ima tą patį. */
.btn, .btn-dl, .contact-chip {
  --btn-line: currentColor;
  --btn-fill: transparent;
  --btn-sw: 1px;
  position: relative; z-index: 0;
  display: inline-flex; align-items: center; justify-content: center; gap: .55rem;
  font-family: var(--font-body); font-weight: 600; font-size: .95rem; line-height: 1.2;
  letter-spacing: .005em; text-align: center; text-decoration: none;
  background: var(--btn-fill);
  border: var(--btn-sw) solid var(--btn-line); border-radius: var(--r-btn);
  min-height: 48px; padding: .78rem 1.6rem;
  cursor: pointer;
  transition: background-color .2s ease, color .2s ease, border-color .2s ease;
}
.btn svg, .btn-dl svg, .contact-chip svg { flex-shrink: 0; }
/* Dydžiai — vienintelė leidžiama mygtukų skalė. Mažiausias yra 44px: tai grindys
   liečiamam taikiniui visuose pločiuose, įskaitant 320px. */
.btn-sm, .btn-nav, .btn-dl, .contact-chip { min-height: 44px; padding: .6rem 1.15rem; font-size: .875rem; }
.btn-lg { min-height: 56px; padding: 1rem 2rem; font-size: 1.02rem; }
/* Lygis 1 — sky linija, storesnė. Hover vermillion PRIVALO nešti --ink tekstą:
   baltas ant vermillion yra 3,4:1 ir CLAUDE.md jį draudžia; su ink gaunam 4,95:1. */
.btn-primary { --btn-line: var(--sky); --btn-sw: 1.5px; color: var(--sky); }
.btn-primary:hover { --btn-line: var(--vermillion); --btn-fill: var(--vermillion); color: var(--ink); }
/* Lygis 2 — sage. */
.btn-ghost, .btn-ghost-dark { --btn-line: var(--sage); color: var(--sage); }
.btn-ghost:hover, .btn-ghost-dark:hover { --btn-line: var(--sage); --btn-fill: var(--sage); color: var(--ink); }
/* Lygis 3 — neutrali linija. Ta pati geometrija, du paviršiai: .btn-dl šviesiame
   fone, .contact-chip tamsiame (navy CTA juosta, kontaktų puslapis). */
/* --line (.22 alfa) buvo per silpnas, kai linija tapo visa mygtuko riba —
   todėl čia --steel. */
.btn-dl { --btn-line: var(--steel); color: var(--ink); }
.btn-dl:hover { --btn-line: var(--ink); --btn-fill: var(--sage); }
.contact-chip { --btn-line: rgba(255, 255, 255, .38); color: #fff; }
.contact-chip:hover { --btn-line: #fff; --btn-fill: rgba(255, 255, 255, .1); }
.btn[disabled], .btn-dl[disabled] { opacity: .6; cursor: default; }
/* Fokusas — paprastas outline. Tamsiuose paviršiuose rust žiedas dingtų,
   todėl ten jis baltas. */
.btn:focus-visible, .btn-dl:focus-visible, .contact-chip:focus-visible {
  outline: 2px solid var(--volt); outline-offset: 3px;
}
.hero .btn:focus-visible, .site-nav .btn:focus-visible, .cta-band .btn:focus-visible,
.contact-section .btn:focus-visible, .bg-ink .btn:focus-visible, .bg-navy .btn:focus-visible,
.contact-chip:focus-visible { outline-color: #fff; }
.link-volt { color: var(--volt); font-weight: 500; text-decoration: none; }
.link-volt:hover { color: var(--vermillion); text-decoration: underline; text-underline-offset: 4px; }
/* On wine/ink panels rust fails AA, so the accent link switches to --sky there. */
.link-sky, .link-volt.link-sky { color: var(--sky); }

/* ---- Nav ----
   Always --ink (#1E0F14), at every scroll position and on every page. The old
   transparent-at-top / white-on-scroll pair meant the bar changed colour and the
   mark inverted mid-scroll; it is now one constant surface, which is also why the
   TZE mark can keep a single invert.

   The row never collapses to a burger. .nav-links is the flow row — it holds as
   many items as fit and main.js moves the remainder into .nav-more-menu. */
.site-nav { position: fixed; top: 0; left: 0; right: 0; z-index: 50; background: var(--ink); }
.nav-inner { height: 4.5rem; display: flex; align-items: center; justify-content: space-between; gap: 1rem; }
@media (min-width: 768px) { .nav-inner { height: 5rem; gap: 1.5rem; } }

/* Brand: one mark, Tech Zity Events, leading home. The height lives on the <img>,
   not the anchor, so the 44px tap target added in the mobile block below enlarges
   the hit area without scaling the artwork. The mark is dark artwork and the bar
   is now permanently dark, so the invert is unconditional. */
.nav-brand { display: flex; align-items: flex-end; min-width: 0; flex: 0 0 auto; }
.nav-operator { display: flex; align-items: flex-end; flex-shrink: 0; }
.nav-tze { display: block; height: 1.6rem; width: auto; filter: invert(1); transition: opacity .2s ease; }
.nav-operator:hover .nav-tze { opacity: .68; }
@media (min-width: 768px) { .nav-tze { height: 1.85rem; } }
/* Below 360px the mark would squeeze the overflow button under its 44px tap target. */
@media (max-width: 359px) { .nav-tze { height: 1.35rem; } }

/* The flow row. overflow: hidden keeps a too-wide row from pushing the tail off
   the bar while JS is still measuring, and is what scrollWidth is compared against. */
.nav-links {
  display: flex; align-items: center; gap: 1.4rem;
  flex: 1 1 auto; min-width: 0; overflow: hidden; white-space: nowrap;
}
@media (min-width: 1200px) { .nav-links { gap: 2.1rem; } }
/* Phones get the "⋮" only — main.js reads this display:none and puts every item
   in the menu rather than leaving one stranded link on the bar. */
@media (max-width: 700px) { .nav-links { display: none; } }
.nav-link { font-size: .9rem; color: rgba(255, 255, 255, .9); text-decoration: none; flex: 0 0 auto; transition: opacity .2s ease; }
.nav-link:hover { opacity: .7; }
.nav-link.is-current { text-decoration: underline; text-underline-offset: 6px; text-decoration-thickness: 2px; }
.nav-ext { color: rgba(255, 255, 255, .7); }

/* Tail: never flows. The language switch is two characters and always earns its
   place; the CTA gives way only when the bar cannot hold it (below). */
.nav-tail { display: flex; align-items: center; gap: .9rem; flex: 0 0 auto; }
/* Kalbos jungiklis. Kliento pastaba: „labai išsišoka EN/LT mygtukas“ — jis buvo
   įrėminta dėžutė, stovinti per 0,6rem nuo CTA dėžutės, tad juostos gale stovėjo
   dvi konkuruojančios dėžės ir mažesnioji atrodė kaip nepavykęs mygtukas.
   Dabar tai TYLI nuoroda: rėmelio ir fono nėra, ji gyvena tame pačiame ritme kaip
   .nav-link, tik mono ir su platesniu raidžių tarpu, kad dvi didžiosios raidės
   skaitytųsi kaip jungiklis, o ne kaip santrumpa turinyje. Vienintelė dėžutė
   juostos gale lieka CTA. Liečiamas plotas 44×44 lieka per ::after. */
.nav-lang {
  font-family: var(--font-mono); font-size: var(--fs-label-md);
  letter-spacing: var(--ls-label); text-transform: uppercase;
  color: rgba(255, 255, 255, .72); border: 0; border-radius: 0;
  padding: .32rem .35rem; position: relative;
}
.nav-lang:hover { color: #fff; opacity: 1; }
/* Ant --ink juostos rust fokuso žiedas (bendras a:focus-visible) beveik dingsta. */
.site-nav .nav-link:focus-visible, .site-nav .nav-more-btn:focus-visible { outline-color: #fff; }
/* 44×44 lietimo plotas per pseudo-elementą (kaip .foot-mark::after) — piešinys
   lieka toks pat, auga tik hit area. Galioja visuose pločiuose, mobile blokas
   failo gale .nav-lang neliečia (MOB-01). */
.nav-lang::after { content: ""; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width: max(100%, 44px); height: 44px; }
.nav-cta { flex: 0 0 auto; }
@media (max-width: 560px) { .nav-cta { display: none; } }

/* The "⋮" overflow trigger — three stacked dots. */
/* Tas pats apvalinimas kaip visi mygtukai — dabar, kai mygtukai yra piliulės,
   apvalus hover diskas su CTA šalia jo nebesikerta. */
.nav-more-btn { width: 44px; height: 44px; display: grid; place-items: center; color: #fff; border-radius: var(--r-btn); flex: 0 0 auto; }
/* `display: grid` above is an author rule and outranks the UA stylesheet's
   [hidden] { display: none }, so the button has to hide itself explicitly —
   otherwise it stays on the bar at 1440 pointing at an empty menu. */
.nav-more-btn[hidden] { display: none; }
.nav-more-btn:hover { background: rgba(255, 255, 255, .1); }
.nav-more-btn[aria-expanded="true"] { background: rgba(255, 255, 255, .14); }
.nav-more-dots { display: grid; gap: 3px; }
.nav-more-dots i { display: block; width: 4px; height: 4px; border-radius: 50%; background: currentColor; }

/* The bar and the page behind it are both --ink, so the panel needs a shadow to
   read as a layer rather than as text spilling onto the page. Full width while
   the bar is narrow; a panel hung under the button once there is room for one. */
.nav-more-menu {
  background: var(--ink); border-top: 1px solid rgba(255, 255, 255, .12);
  padding: .75rem var(--pad) 1.25rem; display: flex; flex-direction: column; gap: .15rem;
  box-shadow: 0 26px 50px -12px rgba(0, 0, 0, .75);
}
@media (min-width: 701px) {
  .nav-more-menu {
    position: absolute; right: var(--pad); top: 100%; min-width: 15rem; width: auto;
    border: 1px solid rgba(255, 255, 255, .14); border-radius: 0 0 var(--r-md) var(--r-md);
    padding: .6rem 1.25rem 1rem;
  }
}
.nav-more-menu[hidden] { display: none; }
.nav-more-menu a { color: #fff; text-decoration: none; padding: .7rem 0; font-size: 1.05rem; display: flex; align-items: center; min-height: 44px; }
.nav-more-menu a:hover { color: var(--sky); }
/* CTA klonas meniu viduje yra .btn.btn-ghost, bet `.nav-more-menu a` (0,1,1)
   nurungia `.btn-ghost` (0,1,0): tekstas tapdavo baltas ant sage, o dydis ir
   paddingai — meniu eilutės, ne mygtuko. Čia grąžinama bendra mygtukų sistema
   (md dydis, žr. mygtukų bloką); selektorius su `a` — (0,2,1) po :hover eilute,
   kad nurungtų ir sky hover spalvą. Mygtukas dabar permatomas, tad ramybėje
   tekstas yra sage (kaip pačiame .btn-ghost), o hover'e — ink ant sage užpildo;
   abi eilutės turi būti (0,2,1), kitaip meniu `a:hover` jas nurungia. */
.nav-more-menu a.nav-more-cta {
  margin-top: .6rem; align-self: flex-start; color: var(--sage);
  min-height: 48px; padding: .78rem 1.6rem; font-size: .95rem; font-weight: 600;
}
.nav-more-menu a.nav-more-cta:hover { color: var(--ink); }

/* ---- Hero (home) ---- */
.hero { min-height: 100svh; overflow: hidden; position: relative; z-index: 0; display: flex; align-items: flex-end; }
.hero-media { position: fixed; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: center 42%; z-index: 0; }
.hero-media img, .hero-media picture img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: center 42%; }

/* ---- Hero film — five frames, five camera moves, cut through the TZ mark ----
   position: fixed keeps Rule 10's stationary hero: the film sits still in the
   viewport while the page scrolls over it. Only .is-on is painted, so four of the
   five shots cost nothing between cuts. Every transform is written by JS; nothing
   here animates on its own, which is what keeps the no-JS and reduced-motion paths
   showing one clean frame. */
.hero-film { position: fixed; inset: 0; z-index: 0; overflow: hidden; background: #14090b; }
/* The video and its poster share one box. object-position sits slightly above centre
   so the stage stays in frame when a tall viewport crops the sides. */
.hero-video {
  display: block; width: 100%; height: 100%;
  object-fit: cover; object-position: center 42%;
}

/* Grain — kept from the film: it is what stops a clean 4K render from reading as a
   render. One tile, composited drift, no repaint. */
.hf-grain {
  position: absolute; inset: -25%; z-index: 4; pointer-events: none;
  opacity: 0; mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)' opacity='.5'/%3E%3C/svg%3E");
}
.hero-film.is-playing .hf-grain { opacity: .13; animation: hf-drift 1.1s steps(4) infinite; }
@keyframes hf-drift {
  0%   { transform: translate3d(0, 0, 0); }
  25%  { transform: translate3d(-2%, 1%, 0); }
  50%  { transform: translate3d(1%, -2%, 0); }
  75%  { transform: translate3d(-1%, -1%, 0); }
  100% { transform: translate3d(0, 0, 0); }
}
@media (prefers-reduced-motion: reduce) {
  .hero-film .hf-grain { animation: none !important; opacity: 0 !important; }
}

/* Warm grade — keeps the amber stage lighting alive (client correction #3) */
.hero-grade { position: fixed; inset: 0; z-index: 0; pointer-events: none; background: #FF9A3C; mix-blend-mode: soft-light; opacity: .16; }
/* Two scrims, not one. The vertical gradient was tuned when the hero was a single
   dark hall; the film also passes through a sunlit aerial and a daylit courtyard,
   where bottom-left copy landed on white roofs. The horizontal scrim holds the text
   side dark at every frame — measured, not eyeballed: worst-case contrast across all
   five shots is checked in the hero test. */
.hero-shade {
  position: fixed; inset: 0; z-index: 0; pointer-events: none;
  background:
    /* Local scrim under the copy. Darkening the whole frame far enough to carry
       small text over shot 5's white walls made every frame muddy and still fell
       short, so the density sits only where the words are. It belongs here rather
       than on .hero-content::before because GSAP transforms .hero-content, and a
       transformed ancestor turns position:fixed into position:absolute — which
       clipped the gradient into a visible rectangle across the picture. */
    radial-gradient(82% 92% at 0% 66%, rgba(20, 8, 11, .95) 0%, rgba(20, 8, 11, .84) 34%, rgba(20, 8, 11, .48) 62%, rgba(20, 8, 11, 0) 90%),
    linear-gradient(100deg, rgba(20, 8, 11, .48) 0%, rgba(20, 8, 11, .26) 32%, rgba(20, 8, 11, 0) 68%),
    linear-gradient(180deg, rgba(20, 8, 11, .28) 0%, rgba(20, 8, 11, .18) 32%, rgba(20, 8, 11, .58) 72%, rgba(20, 8, 11, .86) 100%);
}
.hero-content { position: relative; z-index: 10; width: 100%; max-width: var(--wrap); margin-inline: auto; padding: 9rem var(--pad) 4.5rem; }
@media (min-width: 768px) { .hero-content { padding-bottom: 6rem; } }
/* Adreso eilute dabar sedi PO hero tekstu (zr. page-home.njk), tad jai reikia
   savo tarpo nuo pastraipos virsuje; .hero-ctas toliau turi savo 2.25rem. */
.hero-content .eyebrow { color: rgba(255, 255, 255, .92); margin-top: 1.5rem; }
/* Lockup: zodinis zenklas (rastras) + prierasas tekstu, kad EN gautu vertima.
   Kiekvienas lockup'o vidinis matmuo cia yra ZENKLO RASALO AUKSCIO dalis, ne
   ekrano ar drobes dalis. Tai ne stiliaus pasirinkimas: 2026-08 Samsung brand
   review atmete kliento LED paketa butent uz priesinga konstrukcija — parastes
   ten buvo aprasytos kaip drobes dalys, o pats zenklas padidintas tipografijos
   koeficientu 1,18, todel zenklas paaugo 18 %, o apsaugine zona susitrauke lygiai
   tiek pat. Anksciau ta pati klaida buvo ir cia: zenklas augo pagal min(486px,
   67.7vw), o prierasas pagal clamp(...4.4vw...) — dvi skirtingos kreives, tad
   lockup'o proporcijos plauke su ekrano ir nesutapo su patvirtintomis nei viename
   plotyje.
   Santykiai ismatuoti is kliento patvirtinto logo.png (= PI-006452 pateikimas);
   scripts/check-lockup.mjs permatuoja atvaizduota puslapi ir neleidzia build'o,
   jei bent vienas nuslysta:
     failas 3330x511, rasalas 3329x509  -> rasalo aukstis = plotis * 509/3330
     S (pirmos raides plotis)           = 0,6758 x rasalo aukscio
     prieraso kepurines virsus          = 0,3713 x rasalo aukscio zemiau zenklo
     prieraso kepurines aukstis         = 0,3261 x rasalo aukscio
     apsaugine zona                     >= 2,0 S aplink lockup'a (Samsung „two S
                                          figures", patikra_zenklas.py REQ=2.0)
   Deacon metrikos kepurines auksciui perskaiciuoti i font-size, ismatuotos
   narsykleje: kepurine 0,709 em; esant line-height:1 kepurines virsus yra
   0,157 em (34 px) — 0,168 em (19 px) zemiau eilutes deztes virsaus. Skirtumas
   yra Chrome teksto metriku apvalinimas mazuose dydziuose, ne tikras dreifas,
   tad imamas vidurys 0,1626 — taip paklaida issiskirsto i +-0,7 % vietoj
   -1,1 % / +0,3 %. 0,0971 apacioje — prieraso nusileidziancios raides (j, ų),
   kurios isleidzia rasala zemiau eilutes deztes; be jos apsaugine zona apacioje
   butu matuojama nuo deztes, ne nuo rasalo. */
.hero-lockup {
  --mark-w: min(486px, 67.7vw);
  --mark-h: calc(var(--mark-w) * 509 / 3330);
  --mark-s: calc(var(--mark-h) * 0.6758);
  --sub-size: calc(var(--mark-h) * 0.3261 / 0.709);
  display: flex; flex-direction: column; align-items: center;
  width: var(--mark-w); margin: 0;
  padding-top: calc(var(--mark-s) * 2);
  padding-bottom: calc(var(--mark-s) * 2 + var(--sub-size) * 0.0971);
}
/* Jokio filtro ant zenklo. Balta ateina is pacios bylos — zr. page-home.njk. */
.hero-logo { width: var(--mark-w); height: auto; }
.hero-logo-sub { margin-top: calc(var(--mark-h) * 0.3713 - var(--sub-size) * 0.1626 - var(--mark-w) / 3330); font-family: var(--font-display); font-weight: 700; font-size: var(--sub-size); line-height: 1; letter-spacing: .01em; color: #fff; }
/* Apsaugine zona po lockup'u turi buti lockup'o, o ne kaimyno atsakomybe:
   .hero-sub margin-top yra 1.75rem, o @media zemiau — 1.25rem, tad atimtis is
   padding-bottom mobiliajame duotu 1,64 S vietoj 2,0 S. Nunulinam kaimyno
   marga (specifiskumas 0,2,0 nugali abi .hero-sub taisykles, nes @media
   specifiskumo neprideda) ir visa zona laikom cia. */
.hero-lockup + .hero-sub { margin-top: 0; }
.hero-sub { margin-top: 1.75rem; max-width: 36rem; color: rgba(255, 255, 255, .85); font-size: 1.05rem; line-height: 1.7; }
.hero-ctas { margin-top: 2.25rem; display: flex; flex-wrap: wrap; align-items: center; gap: 1rem; }
.hero-trust { margin-top: 2.5rem; font-family: var(--font-mono); font-size: var(--fs-label-sm); color: rgba(255, 255, 255, .6); letter-spacing: var(--ls-label); }
.hero-fade { opacity: 0; transition: opacity .7s ease; }
.video-toggle { position: absolute; z-index: 10; bottom: 1.5rem; right: 1.5rem; width: 44px; height: 44px; display: none; place-items: center; border-radius: 999px; border: 1px solid rgba(255, 255, 255, .35); color: rgba(255, 255, 255, .75); transition: color .2s ease, border-color .2s ease; }
.video-toggle:hover { color: #fff; border-color: #fff; }
@media (min-width: 768px) { .video-toggle { display: grid; } }
.hero ~ * { position: relative; z-index: 1; }
.hidden { display: none !important; }

/* ---- Page hero (subpages) — ONE component, two variants ----
   Written to match macros.njk `pageHeader`. The spine (crumbs → meta → eyebrow →
   h1 → tagline → lead) is spaced here, so a page never sets header spacing itself.
   `.page-hero` is the flat panel; `.page-hero-media` puts a photograph behind the
   same spine. Everything else is a tone swap. */
.page-hero { background: var(--ink); color: #fff; padding: 9.5rem 0 4.5rem; position: relative; z-index: 0; }
.page-hero-navy { background: var(--navy); }
.page-hero-wine { background: var(--wine); }

.ph-content > .crumbs { margin-bottom: var(--sp-4); }
.ph-meta { font-family: var(--font-mono); font-size: var(--fs-label-md); letter-spacing: var(--ls-label); color: rgba(255, 255, 255, .75); }
.ph-content > .eyebrow { display: block; }
.ph-title { margin-top: var(--sp-3); }
.ph-content > .tech-tagline { margin-top: var(--sp-2); }
.page-hero .lead { color: rgba(255, 255, 255, .65); margin-top: var(--sp-4); max-width: 40rem; }

/* Photographic variant. min-height, the scrim and the bottom-aligned content are
   what used to be duplicated across .hall-hero and .gas-hero. */
.page-hero-media { padding: 0; display: flex; align-items: flex-end; min-height: 62svh; overflow: hidden; }
.page-hero-media .ph-media { position: absolute; inset: 0; }
.page-hero-media .ph-media img { width: 100%; height: 100%; object-fit: cover; object-position: center; }
/* Two scrims, same reasoning as the home hero. The vertical one alone leaves the
   breadcrumbs and the mono meta line — the smallest type on the page — sitting at
   ~35 % density over whatever the photo puts at 17 % height; on hall A that is a
   sunlit timber ceiling and they measured under 3:1. The horizontal scrim holds
   the text column dark without flattening the picture. */
.page-hero-media::after {
  content: ""; position: absolute; inset: 0;
  background:
    linear-gradient(95deg, rgba(20, 8, 11, .78) 0%, rgba(20, 8, 11, .5) 30%, rgba(20, 8, 11, 0) 62%),
    linear-gradient(180deg, rgba(20, 8, 11, .45) 0%, rgba(20, 8, 11, .1) 45%, rgba(20, 8, 11, .8) 100%);
}
.page-hero-media .ph-content { position: relative; z-index: 2; width: 100%; padding-top: 8.5rem; padding-bottom: 3.5rem; }
.page-hero-media .lead { color: rgba(255, 255, 255, .78); }
/* Over a photograph the .55 crumbs measured under 4.5:1 even through the scrim. */
.page-hero-media .crumbs { color: rgba(255, 255, 255, .8); }
/* The header sits flush on the panel that continues it (contact page). */
.page-hero-flush { padding-bottom: 0; }
.page-hero-center { min-height: 70svh; display: flex; align-items: center; }
.contact-section { color: #fff; padding-block: 3.5rem clamp(5rem, 9vw, 8rem); }
.contact-section .lead { color: rgba(255, 255, 255, .7); }

/* ---- Types line ---- */
/* Marquee ticker (Tech Zity signature). Two identical groups of five copies; the track
   slides by exactly -50 %, which is one whole group, so the seam never shows. The
   duration is tuned to the group width, not to the copy count: one group is about
   4 500 px, and 100 s gives the same 45 px/s the two-copy version had. Vertical padding
   sits on the wrapper so the horizontal padding can act as the gap between copies. */
.types-line-wrap { padding: 1rem 0 3rem; }
.marquee { overflow: hidden; }
.marquee-track { display: flex; width: max-content; animation: tz-marquee 100s linear infinite; }
.marquee-group { display: flex; flex: 0 0 auto; }
.types-line { flex: 0 0 auto; white-space: nowrap; font-family: var(--font-mono); font-size: var(--fs-label-xs); letter-spacing: var(--ls-label-wide); color: var(--steel); text-transform: uppercase; margin: 0; }
/* Siūlės skirtukas (vd-04): kopijos gale trūko „|", tad ritmas lūžte lūžo kas
   ~900px į dvigubą tuštumą. Skirtukas — CSS turinys, ne šablono tekstas (ta pati
   sutartis kaip poraštės „·"): 1ch padding'ai atkartoja vidinių „ | " tarpus. */
.types-line::after { content: "|"; padding-inline: 1ch; }
@keyframes tz-marquee { from { transform: translateX(0); } to { transform: translateX(-50%); } }
@media (prefers-reduced-motion: reduce) {
  .marquee-track { animation: none; width: 100%; justify-content: center; }
  .marquee-track .marquee-group:last-child { display: none; }
  .marquee-group .types-line:not(:first-child) { display: none; }
  .marquee-group { width: 100%; justify-content: center; }
  .types-line { padding-inline: var(--pad); white-space: normal; text-align: center; }
  /* Statinėje vienos kopijos eilutėje uodegos skirtukas nereikalingas. */
  .types-line::after { content: none; }
}

/* ---- Section headers ---- */
.sec-head { max-width: 48rem; }
.sec-head .eyebrow { margin-bottom: 1.25rem; display: block; }
.sec-head .lead { margin-top: 1.5rem; }

/* ---- Grids / media ---- */
.grid-2 { display: grid; gap: 3rem; align-items: center; }
.grid-2 > * { min-width: 0; }
@media (min-width: 768px) { .grid-2 { grid-template-columns: 1fr 1fr; gap: 6rem; } }
.grid-3 { display: grid; gap: 1.5rem; }
@media (min-width: 640px) { .grid-3 { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1024px) { .grid-3 { grid-template-columns: repeat(3, 1fr); } }
.media-frame { overflow: hidden; position: relative; border-radius: var(--r-sm); }
.media-frame img { display: block; width: 100%; height: 100%; object-fit: cover; }
.media-h-lg img { height: clamp(16rem, 30vw, 22rem); }

/* ---- Renginių formatai (pradinis puslapis) ----
   Klientas: „norisi, kad visi formatai tilptų ekrane ir nereikėtų scrollinti“.
   Buvo .grid-3 + .m-carousel — telefone tai horizontaliai braukiama juosta, tad
   dešinėje kortelės likdavo nukirstos. Čia jokio overflow: vienas tinklelis nuo
   320 px iki 2560 px, tik keičiasi stulpelių skaičius (1 → 2 nuo 480 px → 3 nuo
   960 px). Šeši formatai = 3 × 2 be našlaičių eilutės.
   Kadras kompaktiškesnis nei buvęs .media-h-lg (352 px aukščio 1440 px lange),
   tad abi eilutės telpa į vieną ekraną; santykis 16/10 — tas pats kaip
   .pcard-media, todėl abi pradinio puslapio kortelių sekcijos turi vienodą
   kadro proporciją ir vienodą pavadinimo dydį (--fs-title-fluid). */
/* 3rem viršuje — tas pats tarpas nuo sekcijos antraštės, kokį turi .wc-grid ir
   .pcards, kad visos trys pradinio puslapio kortelių sekcijos gultų ant to paties
   ritmo (klientas: „viskas turi būti sulygiuota“). */
.fmt-grid { list-style: none; margin: 3rem 0 0; padding: 0; display: grid; gap: 1.5rem 1.25rem; grid-template-columns: 1fr; }
/* 380 px, ne 480: telefone du stulpeliai yra tai, kas atstoja dingusią braukomą
   juostą — šeši sukrauti vienas ant kito kadrai pradiniam puslapiui pridėdavo
   ~1 500 px slinkimo (dėl to juosta ir buvo). Po 380 px stulpelis siauresnis nei
   ~150 px, tad ten grįžtama į vieną koloną. */
@media (min-width: 380px) { .fmt-grid { grid-template-columns: repeat(2, 1fr); gap: 1.75rem 1.5rem; } }
@media (min-width: 960px) { .fmt-grid { grid-template-columns: repeat(3, 1fr); gap: 2.25rem 2rem; } }
/* Grid item'o numatytas min-width:auto yra ilgo nelaužomo žodžio (pvz. „Konferencijos“
   siaurame stulpelyje) kelias išplėsti stulpelį plačiau nei 1fr — būtent taip
   kortelė ir „išlenda“ pro dešinį kraštą. */
.fmt-card { min-width: 0; }
.fmt-media { overflow: hidden; border-radius: var(--r-sm); aspect-ratio: 16 / 10; }
.fmt-media img { display: block; width: 100%; height: 100%; max-width: 100%; object-fit: cover; }
.fmt-title { margin-top: .9rem; font-family: var(--font-display); font-size: var(--fs-title-fluid); line-height: 1.2; letter-spacing: -0.02em; color: var(--ink); }
.fmt-note { margin-top: .45rem; font-size: .9rem; line-height: 1.55; color: var(--steel); }
.fmt-extra { margin-top: 2rem; font-size: .9rem; line-height: 1.6; color: var(--steel); }

/* ---- Stat cards ---- */

/* ---- Tables ----
   The price table used to be 1343px of content in a 1318px window, so it scrolled
   even on a 1440 desktop — and it did that silently, clipping "Montažas" through
   the middle of a glyph. Two fixes: the edge fade says "there is more", and the
   space column is sticky so the row you are reading stays identified while you
   scroll to its price.
   2026-08-15 re-measured: at 1440 the table now fits exactly (1318 = 1318) and no
   longer scrolls, so neither the fade nor the pin is visible there. Both still
   earn their place from ~1024 to ~1360 — and below 900px the pin is switched off,
   see the block under .table-hint. */
.table-scroll { overflow-x: auto; border: 1px solid var(--line); background: #fff; }
/* The fade lives on a wrapper, NOT on the scroller. An absolutely positioned
   child of a scroll container is laid out against the padding box anchored at
   the CONTENT origin, so `right: 0` lands at content-x = clientWidth and then
   scrolls away with the content — at scrollLeft 260 the fade appeared 260px in
   from the right edge, as a pale vertical stripe down the middle of the table
   cutting the "Para" figures in half. The wrapper does not scroll, so `right: 0`
   there means the right edge of what you can actually see. */
.table-frame { position: relative; }
.table-frame.is-scrollable::after {
  content: ""; position: absolute; top: 0; right: 0; bottom: 0; width: 2.75rem;
  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, .96));
  pointer-events: none; z-index: 3;
}
.spec-table { width: 100%; min-width: 880px; border-collapse: collapse; font-size: .9rem; text-align: left; }
.spec-table th, .spec-table td { padding: .9rem 1.15rem; white-space: nowrap; }
.spec-table th[scope="row"] {
  position: sticky; left: 0; z-index: 2; background: #fff;
  box-shadow: 1px 0 0 var(--line);
}
.spec-table thead th:first-child { position: sticky; left: 0; z-index: 3; background: #fff; box-shadow: 1px 0 0 var(--line); }
.spec-table tbody tr.row-strong th[scope="row"] { background: #F8F8FA; }
.spec-table thead { font-family: var(--font-mono); font-size: var(--fs-label-xs); text-transform: uppercase; letter-spacing: var(--ls-label-wide); color: var(--steel); border-bottom: 1px solid var(--line); }
.spec-table thead th { font-weight: 500; }
.spec-table tbody tr { border-top: 1px solid var(--line); transition: background-color .2s ease; }
.spec-table tbody tr:hover { background: rgba(165, 62, 0, .05); }
.spec-table tbody tr.row-strong { background: rgba(245, 246, 248, .7); font-weight: 600; }
.spec-table .row-link { color: inherit; text-decoration: none; font-weight: 500; }
.spec-table .row-link:hover { color: var(--volt); }
.table-note { margin-top: 1rem; font-size: .78rem; color: var(--steel); }
/* Shown by default so it survives without JS; main.js hides it when the table fits. */
.table-hint { font-size: .85rem; color: var(--steel); }

/* ── Kainų lentelė siaurame lange: „Erdvė" stulpelis atlimpa ────────────────
   Išmatuota Playwright'u (2026-08-15, /kainos/ pirmoji lentelė):

     langas   matomas plotis   prilipęs stulpelis   lieka duomenims
     320px    278px            259px (93 %)         19px
     390px    348px            259px (74 %)         45px
     700px    642px            259px (40 %)         339px
     900px    826px            259px (31 %)         523px
     1024px   942px            259px (27 %)         683px
     1440px   1318px           267px                lentelė telpa, neslenka

   Viena kainos skiltis yra ~169px. Telefone prilipęs stulpelis palikdavo 45px
   (320px — 19px), t. y. nė vieno skaičiaus nesimatydavo iki galo: slenki, o
   po vardo stulpeliu tik baltas kraštas ir persišviečiantis blukinimas. Todėl
   iki 899px stulpelis atlimpa — mainai sąmoningi: slinkdamas nustoji matyti
   eilutės vardą, bet atgauni visą langą (2 kainų skiltis vietoj nulio).

   Nuo 900px stulpelis lieka prilipęs: ten jis užima ≤31 % lango, duomenims
   lieka 523px+, o lentelė vis dar netelpa (1024px trūksta 338px, 1280px —
   82px), tad prilipęs vardas tikrai padeda. Ties 1440px lentelė jau telpa
   (1318 = 1318), tad ten prilipimo apskritai nesimato — dėl to ir nėra prasmės
   jo išimti visiems pločiams.

   Kartu siaurinam vidinius tarpus — kuo siauresnė lentelė, tuo daugiau skilčių
   telpa į vieną žvilgsnį (1272px → 1194px, t. y. viena kainos skiltis daugiau). */
@media (max-width: 899px) {
  .spec-table th[scope="row"],
  .spec-table thead th:first-child { position: static; box-shadow: none; }
  /* Vardo laužymas per eilutes buvo išbandytas ir atmestas: `white-space: normal`
     + max-width nusuko stulpelį nuo 248px iki 218px (−30px), bet lentelę paaugino
     nuo 625px iki 728px (+103px). Ženkliukas „Dažnas pasirinkimas" yra 191px
     nowrap mono teksto, tad siauriau stulpelis vis tiek nenusileidžia — mainai
     nevertingi, todėl skaičiai IR vardai lieka vienoje eilutėje. */
  .spec-table th, .spec-table td { padding: .8rem .8rem; }
  /* 2,75rem blukinimo ant 348px lango yra 13 % ekrano, o nuslinkus į galą jis
     amžinai uždengia paskutinę („Montažas") skiltį. Siaurinam. */
  .table-frame.is-scrollable::after { width: 1.5rem; }
}
/* MOB-06: siaurame lange pradinėje būsenoje matomi tik ERDVĖ ir PLOTAS, visos
   kainos — už ~830px slinkties. Po erdvės pavadinimu rodoma „nuo X € / diena“
   sub-eilutė, kad pirmame žvilgsnyje būtų bent viena kaina. Desktope paslėpta —
   ten kainų skiltys ir taip matomos. */
.spec-table .row-from { display: none; }
@media (max-width: 899px) {
  .spec-table .row-from { display: block; font-family: var(--font-mono); font-size: .8rem; font-weight: 600; color: var(--volt); margin-top: .25rem; white-space: nowrap; }
}

/* ---- Check / service lists ---- */
.dash-list { display: grid; gap: .9rem; color: var(--steel); font-size: .95rem; }
.dash-list li { display: flex; gap: .8rem; }
.dash-list li::before { content: "—"; color: var(--volt); flex-shrink: 0; }

/* ---- Calculator ---- */
.calc-bar { display: flex; flex-direction: column; gap: 1rem; margin-top: 2.5rem; }
@media (min-width: 1024px) { .calc-bar { flex-direction: row; align-items: flex-end; } }
/* Mode tabs as visible pill buttons (client correction #8) */
.mode-tabs { display: flex; flex-wrap: wrap; gap: .5rem; }
.mode-tab { color: var(--ink); border: 1px solid rgba(30, 16, 19, .35); border-radius: 999px; padding: .55rem 1.1rem; min-height: 44px; font-weight: 500; font-size: .88rem; transition: color .2s ease, border-color .2s ease, background-color .2s ease; }
.mode-tab:hover { border-color: var(--ink); }
.mode-tab[aria-pressed="true"] { color: #fff; background: var(--ink); border-color: var(--ink); }
/* Audience size filter chips (client correction #9) */
.size-chips { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; }
.size-chip { border: 1px solid rgba(165, 62, 0, .5); color: var(--volt); border-radius: 999px; padding: .55rem 1.1rem; min-height: 44px; font-weight: 500; font-size: .88rem; transition: all .2s ease; }
.size-chip:hover { border-color: var(--volt); background: rgba(165, 62, 0, .06); }
.size-chip[aria-pressed="true"] { background: var(--volt); color: #fff; border-color: var(--volt); }
.guest-wrap { display: flex; align-items: center; gap: .8rem; }
.guest-wrap label { font-size: .9rem; color: var(--steel); white-space: nowrap; }
/* A rectangle with an underline, not a pill: sitting among the three round size chips,
   the pill shape made this input read as a fourth, disabled filter (correction #9). */
.guest-field { border: 0; border-bottom: 2px solid rgba(30, 16, 19, .35); border-radius: 0; background: transparent; padding: .4rem .3rem; font-family: var(--font-mono); width: 4.5rem; font-size: var(--fs-mono-body); color: var(--ink); transition: border-color .2s ease; }
.guest-field:focus-visible, .guest-field:hover { border-bottom-color: var(--volt); outline: none; }
.chip-sep { flex: none; align-self: center; width: 1px; height: 1.4rem; background: rgba(30, 16, 19, .18); margin-inline: .35rem; }
.guest-label { align-self: center; font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-tight); text-transform: uppercase; color: var(--steel); }
.guest-field:focus { border-color: var(--volt); outline: none; box-shadow: 0 0 0 3px rgba(165, 62, 0, .18); }
.config-hint { margin-top: 1rem; font-size: .95rem; color: var(--ink); font-weight: 500; }

/* ---- Scrollytelling halls ---- */
.hall-viewer-grid { display: flex; flex-direction: column; }
@media (min-width: 768px) { .hall-viewer-grid { display: grid; gap: 3rem; grid-template-columns: minmax(340px, 42%) 1fr; } }
.hall-steps-wrap { position: relative; order: 2; padding-left: 1.5rem; }
@media (min-width: 768px) { .hall-steps-wrap { order: 1; padding-left: 2rem; } }
.hall-progress { position: absolute; left: 0; top: 1rem; bottom: 1rem; width: 2px; background: var(--line); }
/* Selektorius pagal klasę, ne pagal id: šablonai (page-gastroles.njk) rašo
   <span class="scrolly-progress-fill">, o #hallProgressFill puslapiuose neliko —
   juosta buvo be stiliaus, todėl nematoma. */
.hall-progress .scrolly-progress-fill { position: absolute; top: 0; left: 0; width: 100%; height: 0%; background: var(--volt); display: block; }
/* Shorter steps — less scrolling (client correction #27) */
.hall-step { padding: clamp(2rem, 7vh, 3.5rem) 0; display: flex; flex-direction: column; align-items: flex-start; }
.hall-step:first-child { padding-top: 1.25rem; }
/* .55, ne .35: pritemdytas žingsnis vis tiek matomas ekrane ir turi likti
   perskaitomas (≥3:1 antraštėms) — A11Y-07. */
.js-focus .hall-step { opacity: .55; transition: opacity .4s ease; }
.js-focus .hall-step.step-active { opacity: 1; }
.hall-step .hall-meta { font-family: var(--font-mono); font-size: var(--fs-label-sm); color: var(--steel); letter-spacing: var(--ls-label); }
.hall-step h3 { margin-top: 1rem; }
.hall-step .hall-desc { margin-top: 1.25rem; color: var(--steel); max-width: 24rem; font-size: .9rem; line-height: 1.6; }
.hall-step .hall-cap { font-size: clamp(3.4rem, 5vw, 4.6rem); font-weight: 700; letter-spacing: -0.03em; margin-top: 2.2rem; color: var(--volt); line-height: 1; font-family: var(--font-display); }
.hall-step .hall-caplabel { font-size: .78rem; color: var(--steel); margin-top: .5rem; }
.hall-step .hall-price { margin-top: 1.75rem; font-size: .9rem; font-weight: 500; }
.hall-step .hall-price span { color: var(--steel); font-weight: 400; }
.hall-step .hall-more { margin-top: 1.1rem; font-size: .88rem; }
/* width:100% is load-bearing — the mobile layout is a column flex container, where
   align-self:start collapses the cross axis and the absolutely-positioned layers
   leave nothing to size against, so the sticky media renders 0px wide. */
.hall-stack { position: relative; width: 100%; overflow: hidden; border-radius: var(--r-lg); order: 1; position: sticky; top: 4.5rem; align-self: start; z-index: 10; background: var(--snow); height: clamp(340px, 52vh, 600px); }
@media (min-width: 768px) { .hall-stack { order: 2; top: 6rem; } }
@media (max-width: 767px) { .hall-stack { height: 34svh; } }
.hall-pic-layer { position: absolute; inset: 0; opacity: 0; }
.hall-pic-layer.is-active { opacity: 1; }
.hall-pic-layer img { width: 100%; height: 100%; object-fit: cover; }
.hall-rail { position: absolute; left: 1rem; bottom: 1rem; display: flex; flex-wrap: wrap; gap: .5rem; z-index: 10; }
/* Tekstas .9 ir fonas .65 — kad neaktyvus mygtukas laikytų ≥4,5:1 net virš
   visiškai baltos nuotraukos (išmatuota kompozitu: 5,4:1) — A11Y-03. */
.rail-btn { font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-tight); min-width: 48px; min-height: 36px; padding: .35rem .6rem; color: rgba(255, 255, 255, .9); border: 1px solid rgba(255, 255, 255, .28); background: rgba(8, 13, 22, .65); backdrop-filter: blur(8px); transition: color .2s ease, border-color .2s ease, background-color .2s ease, opacity .2s ease; }
.rail-btn.active { color: var(--ink); background: #fff; border-color: #fff; }
.hall-counter { position: absolute; top: 1rem; right: 1rem; z-index: 10; font-family: var(--font-mono); font-size: var(--fs-label-xs); letter-spacing: var(--ls-label-wide); color: #fff; background: rgba(37, 18, 22, .75); padding: .35rem .8rem; border-radius: 999px; backdrop-filter: blur(4px); }
/* .rec-badge ištrintas 2026-09-04: paskutinis jo vartotojas buvo /technologijos/
   matrica (žr. .hmx-col.fit žemiau). */

/* .hall-card šeima išimta (ds-11): „spaces hub" puslapio nebėra — grep per
   šablonus ir _site nerado nė vieno vartojimo, o negyvos .fit/.dim būsenos
   klaidino auditą. Talpų būsenas neša .gal-index-card / .gp-room / .hmx-*. */

/* ---- Tech section ---- */

/* ---- Facts list ---- */
/* .facts-list išimtas: vienintelis jo vartotojas buvo /technologijos/ biudžeto
   sekcija, o ten trys skirtingi sąrašai suvienodinti į .tsheet (kliento pastaba
   „viena tema, trys skirtingos lentelės“). Techninių duomenų eilutės dabar yra
   tokios pat kaip įskaičiuotų ir nuomojamų. */

/* ---- Story arc ---- */
.arc-step { margin-top: clamp(3rem, 7vw, 5rem); }
.arc-label { display: inline-flex; align-items: center; gap: .8rem; font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-wide); text-transform: uppercase; color: var(--steel); }
.arc-label::before { content: ""; width: 2.4rem; height: 2px; background: var(--volt); }
.arc-grid { display: grid; gap: 1.25rem; margin-top: 1.5rem; }
@media (min-width: 768px) { .arc-grid { grid-template-columns: repeat(2, 1fr); } }
.arc-grid.arc-4 { grid-template-columns: repeat(2, 1fr); }
@media (min-width: 1024px) { .arc-grid.arc-4 { grid-template-columns: repeat(4, 1fr); } }
.arc-grid .media-frame img { height: clamp(12rem, 24vw, 18rem); }
.arc-grid.arc-1 { grid-template-columns: 1fr; }
.arc-grid.arc-1 .media-frame img { height: clamp(16rem, 42vw, 34rem); }
.arc-caption { margin-top: 1.1rem; color: var(--steel); font-size: .92rem; max-width: 44rem; }

/* ---- Timeline ---- */
.tz-timeline { display: grid; gap: 1px; background: var(--line); border: 1px solid var(--line); }
@media (min-width: 1024px) { .tz-timeline { grid-template-columns: repeat(5, 1fr); } }
.tz-item { background: #fff; padding: 1.75rem 1.5rem; }
.tz-item .tz-year { font-family: var(--font-mono); font-size: var(--fs-label-sm); color: var(--steel); letter-spacing: var(--ls-label); }
/* Location identity: official logo + that location's brand colour as a top rule.
   Colour map is Tech Zity's own (campus cover); all five read ≥4.5:1 against ink. */
/* Each card links out to that location's page on techzity.com. */
.tz-item { position: relative; display: block; text-decoration: none; color: inherit; transition: background-color .25s ease, transform .25s ease; }
.tz-item:hover { background: var(--snow); }
.tz-item.tz-highlight:hover { background: #2A1A1E; }
.tz-item .tz-go { position: absolute; top: 1.1rem; right: 1.2rem; font-size: .9rem; color: var(--steel); opacity: 0; transition: opacity .25s ease, transform .25s ease; }
.tz-item:hover .tz-go, .tz-item:focus-visible .tz-go { opacity: 1; transform: translate(2px, -2px); }
.tz-item.tz-highlight .tz-go { color: rgba(255, 255, 255, .6); }
.tz-item::before { content: ""; position: absolute; inset: 0 0 auto 0; height: 3px; background: var(--tz-loc, transparent); }
.tz-logo { display: block; height: 1.3rem; width: auto; margin-top: .7rem; }
.tz-item.tz-highlight .tz-logo { filter: invert(1); }
.tz-c-arts    { --tz-loc: #D0D8D8; } /* Jagged Ice */
.tz-c-park    { --tz-loc: #F898A0; } /* Marvelous */
.tz-c-loft    { --tz-loc: #F04800; } /* Vermillion */
.tz-c-vilnius { --tz-loc: #D0B8B0; } /* Clam Shell */
.tz-item .tz-was { font-size: .85rem; color: var(--steel); margin-top: .35rem; }
.tz-item .tz-badge { display: inline-block; margin-top: .9rem; font-family: var(--font-mono); font-size: var(--fs-label-xs); letter-spacing: var(--ls-label); text-transform: uppercase; border: 1px solid var(--volt); color: var(--volt); padding: .25rem .6rem; }
.tz-item.tz-highlight { background: var(--ink); color: #fff; }
.tz-item.tz-highlight .tz-was { color: rgba(255, 255, 255, .55); }
.tz-item.tz-highlight .tz-badge { background: var(--volt); color: #fff; }

/* ---- Partners ----
   Kliento pastaba: „Visiškai nėra lygiavimo; kai tiek nedaug teksto ir
   informacijos, užimama per daug vietos.“ Blokas nebėra balta kortelė su savo
   clamp(1.75–3rem) vidiniu padding'u — tas padding'as stumdavo partnerio tekstą
   į vidų, tad jo kairysis kraštas nesutapdavo nei su sekcijos antrašte, nei su
   tiekėjų tinkleliu virš jo. Dabar blokas guli tiesiai ant .wrap tinklelio, o
   grupę žymi plona viršutinė linija. Kartu dingsta ~6rem tuščios erdvės
   kiekvienam blokui.

   Vertikalus ritmas — vienas dydis viršuje ir tarp blokų, tad tarpas atitinka
   turinio kiekį, o ne kortelės apdailą. */
.partner-block { margin-top: clamp(1.75rem, 3.5vw, 2.75rem); border-top: 1px solid var(--line); padding-top: clamp(1.75rem, 3.5vw, 2.75rem); }
/* Etiketė („MAITINIMAS“, „TECHNINIS APTARNAVIMAS“…) — VIRŠ vardo, ne šalia jo
   baseline'u: anksčiau ji kabojo prie didelio vardo ir kiekvienam partneriui
   atsidurdavo kitoje vietoje. Dabar visų trijų etiketė ir vardas prasideda nuo
   to paties kairiojo krašto ir tos pačios bazinės linijos. */
.partner-head { display: grid; gap: .5rem; justify-items: start; }
.partner-role { font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-wide); text-transform: uppercase; color: var(--volt); }
/* Tekstas ir nuotrauka lygiuojami viršumi (align-items: start), o teksto matas
   vienodas visiems partneriams — taip pat ir tam, kuris nuotraukos neturi
   (be .has-media blokas lieka vienu stulpeliu, bet pastraipos plotis tas pats). */
.partner-body { display: grid; gap: 2rem; margin-top: 1.4rem; align-items: start; }
@media (min-width: 768px) {
  .partner-block.has-media .partner-body { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 3.5rem; }
}
.partner-copy { max-width: 34rem; }
.partner-desc { color: var(--steel); }
/* Vienodas optinis nuotraukos aukštis visiems blokams — proporcijos, ne
   originalūs failų dydžiai (object-fit: cover ateina iš .media-frame). */
.partner-media img { aspect-ratio: 4 / 3; height: auto; }
.pl-title { font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label); text-transform: uppercase; color: var(--steel); margin-bottom: .9rem; }

/* ---- CTA band ---- */
.cta-band { background: var(--navy); color: #fff; padding-block: clamp(5rem, 9vw, 8rem); position: relative; overflow: hidden; }
.cta-band::before { content: ""; position: absolute; inset: 0; opacity: .3; pointer-events: none; background: radial-gradient(55% 75% at 78% 15%, rgba(165, 62, 0, .5), transparent 65%); }
.cta-inner { position: relative; display: grid; gap: 2.5rem; }
@media (min-width: 900px) { .cta-inner { grid-template-columns: 1fr auto; align-items: center; } }
.cta-sub { margin-top: 1.3rem; color: rgba(255, 255, 255, .7); max-width: 30rem; }
.cta-actions { display: flex; flex-wrap: wrap; gap: 1rem; }

/* ---- Contact page ---- */
/* Trys vaikai: intro (lead) · #forma (užklausa) · contact-side (portretas, chips,
   adresas). Telefone natūrali DOM tvarka deda formą iškart po intro (MOB-11);
   darbalaukyje forma eina į dešinį stulpelį per abu kairiuosius blokus. */
.contact-grid { display: grid; gap: 3.5rem; }
/* DU STULPELIAI TIK NUO 1080px (anksčiau 900px). Riba paimta ne iš oro: kairysis
   stulpelis turi sutalpinti portretą ŠALIA kortelės nė vieno iš jų nespaudžiant
   (219 + 16 + 288 = 523px), o ties 900px jam tekdavo 386–446px. Užsakovo sąlyga
   yra „if both elements don't fit to the width, don't shrink the photo, just do
   the under" — tad kol netelpa, puslapis lieka vienastulpelis ir portretas su
   kortele stovi PO forma per visą plotį. Ties 1080px kairė gauna 542px. */
@media (min-width: 1080px) {
  /* auto 1fr: formos (span 1/3) aukštis atitenka ANTRAI eilutei — kitaip jis
     ištampytų pirmą ir tarp lead bei portreto atsivertų properša. */
  .contact-grid { grid-template-columns: 1fr 1fr; grid-template-rows: auto 1fr; row-gap: 0; }
  .contact-grid > #forma { grid-column: 2; grid-row: 1 / 3; }
  .contact-grid > .contact-intro, .contact-grid > .contact-side { grid-column: 1; }
  /* Atstumas tarp lead ir portreto lieka toks, koks buvo (person-block margin 2rem). */
}
/* 1080–1339px kairysis stulpelis pasiima daugiau: 1fr 1fr ties 1080px duoda jam
   472px, o portretui su kortele reikia 523px. 1,12fr su siauresniu tarpu duoda
   542px. Formai lieka 426px — jos poriniai laukai (163px) su ilgiausiu vietos
   ženklu „vardas@imone.lt" telpa (atsarga 10,4px). Nuo 1340px vietos užtenka ir
   be to, tad grįžta simetrija. */
@media (min-width: 1080px) and (max-width: 1339px) {
  .contact-grid { grid-template-columns: 1.12fr .88fr; column-gap: 2rem; }
}
/* Inkaras iš CTA nuorodų — forma sustoja po fiksuotu nav'u (kr-03). */
#forma { scroll-margin-top: 6.5rem; min-width: 0; }
.contact-lines { margin-top: 2.25rem; display: grid; gap: .8rem; font-family: var(--font-mono); font-size: var(--fs-mono-body); }
.contact-lines a { color: inherit; text-decoration: none; }
.contact-lines a:hover { text-decoration: underline; text-underline-offset: 4px; }
.contact-muted { color: rgba(255, 255, 255, .55); }
.booking-form { background: rgba(255, 255, 255, .05); border: 1px solid rgba(255, 255, 255, .12); padding: clamp(1.75rem, 4vw, 2.5rem); backdrop-filter: blur(4px); }
.form-row { display: grid; gap: 1.25rem; }
@media (min-width: 640px) { .form-row { grid-template-columns: 1fr 1fr; } }
/* 1080–1249px forma jau stovi siaurame dešiniame stulpelyje (426–500px), tad
   poroje laukui lieka ~163px, o EN vietos ženklas „name@company.com" reikalauja
   181px — išmatuota −18,6px ties 1080px, ir jis išnyksta tik ties ~1166px.
   Vienas stulpelis grąžina laukui visą stulpelio plotį. Riba 1249px palikta su
   atsarga (EN prošvaisa ties 1250px — 18,4px); matuoti reikia EN, ne LT, nes
   lietuviškas „vardas@imone.lt" yra siauresnis ir telpa anksčiau. */
@media (min-width: 1080px) and (max-width: 1249px) { .form-row { grid-template-columns: 1fr; } }

.form-field { margin-top: 1.25rem; }
.form-row .form-field { margin-top: 0; }
.form-field label { display: block; font-size: .88rem; color: rgba(255, 255, 255, .75); margin-bottom: .5rem; }
.form-field .req { color: var(--sky); }
.form-field input, .form-field textarea { width: 100%; background: rgba(255, 255, 255, .08); border: 1px solid rgba(255, 255, 255, .2); padding: .8rem 1rem; color: #fff; border-radius: 0; }
.form-field input::placeholder, .form-field textarea::placeholder { color: rgba(255, 255, 255, .3); }
.form-field input:focus, .form-field textarea:focus { border-color: rgba(255, 255, 255, .6); outline: none; }
.form-field input:user-invalid, .form-field textarea:user-invalid { border-color: #FFB4B4; }
/* Nepavykus submit'ui main.js pažymi blogus laukus aria-invalid (INT-07).
   Antras, nespalvinis signalas — storesnis rėmelis (daltonizmo taisyklė). */
.form-field input[aria-invalid="true"], .form-field textarea[aria-invalid="true"] { border: 2px solid #FFB4B4; }
.form-error { display: none; margin-top: 1rem; font-size: .88rem; color: #FFB4B4; }
.form-error.show { display: block; }
.form-success { display: none; margin-top: 1rem; font-size: .88rem; color: rgba(255, 255, 255, .85); }
.form-success.show { display: block; }
.form-hp { position: absolute; left: -9999px; opacity: 0; pointer-events: none; }
.booking-form .btn { width: 100%; justify-content: center; margin-top: 1.75rem; }
.booking-form .btn[disabled] { opacity: .6; cursor: default; }

/* ---- Hall detail page ---- */
/* .hall-hero / .hh-* folded into .page-hero-media — see the page hero block. */
.cap-strip { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1px; background: var(--line); border: 1px solid var(--line); }
@media (min-width: 900px) { .cap-strip { grid-template-columns: repeat(6, 1fr); } }
.cap-cell { background: #fff; padding: 1.4rem 1.2rem; }
.cap-cell .cc-num { font-family: var(--font-display); font-size: var(--fs-stat-md); font-weight: 700; line-height: 1; color: var(--volt); }
.cap-cell .cc-label { font-size: .78rem; color: var(--steel); margin-top: .45rem; }
.hall-nav-row { display: flex; flex-wrap: wrap; gap: .6rem; }
.hall-nav-chip { font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-tight); border: 1px solid var(--line); padding: .55rem .95rem; text-decoration: none; color: var(--steel); transition: color .2s ease, border-color .2s ease; }
.hall-nav-chip:hover { color: var(--ink); border-color: var(--ink); }
.hall-nav-chip.is-current { color: #fff; background: var(--ink); border-color: var(--ink); }

/* ---- Floor plans ---- */
.plans-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1.25rem; }
.plan-card { background: #fff; border: 1px solid var(--line); padding: .8rem; }
.plan-card figcaption { font-family: var(--font-mono); font-size: var(--fs-label-xs); text-transform: uppercase; letter-spacing: var(--ls-label-wide); color: var(--steel); margin-top: .8rem; }

/* ---- Footer ---- */
/* The home hero paints a position:fixed image. Sections inside <main> are lifted above
   it by `.hero ~ *`, but the footer sits outside <main>, so it needs its own stacking
   context — otherwise the fixed hero covers it at the bottom of the page. */
.site-footer { position: relative; z-index: 1; background: var(--ink); color: rgba(255, 255, 255, .65); padding: 4rem 0 2rem; }
.foot-top { display: grid; gap: 2.5rem; }
@media (min-width: 700px)  { .foot-top { grid-template-columns: repeat(2, 1fr); } }
/* Planšetėje penki elementai dviejose kolonose sudėdavo brandą (3 eilutės) greta
   „Turinio“ (9 nuorodos) — dešinėje po brandu likdavo ~120px tuštumos, o po jos
   likusios kolonos griūdavo netolygiai. Brandas užima visą eilutę, tad keturios
   etikečių kolonos susistoja 2×2 ir kiekviena pora prasideda tame pačiame lygyje. */
@media (min-width: 700px) and (max-width: 1179.98px) {
  .foot-brand { grid-column: 1 / -1; max-width: 34rem; }
}
/* 2026-09-06: penkios kolonos prasideda nuo 1180px, ne 1000px. Riba išmatuota, ne
   parinkta iš akies: ties 1000px etikečių stulpeliui tenka 135px, ir ilgiausia
   eilutė — LT „Pardavimų vadovė, TechZity Events" — lūžta į dvi. Dvieilis įrašas
   suvalgo DU --foot-row žingsnius, tad visos po jo einančios kontaktų eilutės
   atsistoja per vieną žemiau nei gretimų stulpelių, ir stulpelis skaitosi kaip
   nuslinkęs. Bisekcija (1000 / 1080 / 1140 / 1180 / 1220 / 1260 / 1280, LT ir EN):
   pirmas plotis, kuriame nė vienas stulpelis nelūžta, yra 1180. Žemiau jo dirba
   jau esamas 2×2 išdėstymas, kuriame poros lygiuojasi (išmatuota ties 1000, 1100
   ir 1179 — nė vienos skylės, antraštės sutampa). Trumpinant tekstus riba gali
   nusileisti — permatuoti bisekcija, ne spėti. */
@media (min-width: 1180px) { .foot-top { grid-template-columns: 1.7fr 1fr 1fr 1.15fr 1fr; gap: 2rem; } }
/* Penkiose kolonose brandas stovi greta etikečių stulpelių, tad jo tekstas privalo
   prasidėti TOJE PAČIOJE eilutėje kaip „Pradžia“ / „Visas centras“. Ženklas (28px)
   su oru netelpa į 32,88px etikečių juostą, todėl jis pakabinamas virš tinklelio —
   viršuje lieka 45px poraštės padding'o, o tagline atsistoja lygiai ant 1-os eilutės.
   Žemiau 1180px brandas yra atskira eilutė virš stulpelių: lygiuoti nėra su kuo,
   ir pakaba tik suvalgytų viršutinį padding'ą. */
@media (min-width: 1180px) {
  .foot-marks { margin-top: calc(var(--foot-head-band) - var(--foot-mark-h) - var(--foot-mark-gap)); }
}
.foot-marks { display: flex; align-items: flex-end; margin-bottom: var(--foot-mark-gap); }
/* 44px hit area via a pseudo-element, so the artwork keeps its own height. */
.foot-mark { position: relative; display: block; flex-shrink: 0; }
.foot-mark::after { content: ""; position: absolute; left: 0; right: 0; top: 50%; transform: translateY(-50%); height: 44px; }
/* Tarpą po ženklu neša TIK .foot-marks margin-bottom (anksčiau jis susiliedavo
   su tagline margin-top ir tikroji reikšmė buvo „didesnysis iš dviejų“ — su tuo
   tinklelio neskaičiuosi). Eilutės žingsnis — --foot-row, kad apvyniota antraštė
   nenustumtų po ja einančio adreso nuo gretimų stulpelių eilučių. */
.foot-tagline { margin-top: 0; font-size: 1.05rem; line-height: var(--foot-row); color: #fff; font-weight: 500; letter-spacing: -0.01em; }
.foot-line { margin-top: 0; font-size: .88rem; line-height: var(--foot-row); }
/* Poraštės „muted“ alfa .55: išmatuota 6,15:1 ant --ink (buvo .4 → 3,81:1) — A11Y-01.
   Smulkūs dydžiai — per --fs-label-sm tokeną, ne literalus .74/.76 (ds-06). */
.foot-head { font-family: var(--font-mono); font-size: var(--fs-label-xs); text-transform: uppercase; letter-spacing: var(--ls-label-wide); color: rgba(255, 255, 255, .55); margin-bottom: .9rem; }
/* --foot-row — poraštės eilutės žingsnis: buvusi eilutės dėžė (.9rem × 1.65)
   PLIUS buvęs tarpas tarp eilučių (.4rem). Ritmą dabar neša line-height, o ne
   margin, ir tai ne kosmetika: su margin'u tarpas pridedamas kartą EILUTEI, o
   apvyniotai eilutei reikia dviejų žingsnių — todėl „Gastrolės · Baltas Dažnis ·
   361 FORMA“ (2 eilutės) nustumdavo po savęs einančią nuorodą 6,4px nuo tinklelio.
   Su line-height kiekviena teksto eilutė, apvyniota ar ne, yra lygiai vienas
   žingsnis, tad stulpeliai lieka sulygiuoti nepriklausomai nuo teksto ilgio. */
.foot-col { font-size: .9rem; }
.site-footer {
  --foot-row: calc(.9rem * 1.65 + .4rem);
  /* Etikečių juosta (.foot-head dėžė + jos margin-bottom) — 32,88px. Ji laiko
     pirmąją stulpelių eilutę, tad brandas turi žinoti jos aukštį, kad atsistotų
     ant to paties tinklelio. */
  --foot-head-band: calc(var(--fs-label-xs) * 1.65 + .9rem);
  --foot-mark-h: 1.75rem;
  --foot-mark-gap: 1.5rem;
}
.foot-col p { margin-top: 0; line-height: var(--foot-row); }
.foot-col a { color: inherit; text-decoration: none; display: inline-block; margin-top: 0; line-height: var(--foot-row); }
.foot-col a:hover { color: #fff; }
.foot-col nav a, nav.foot-col a { display: block; }
/* On a phone each of these links is a 44px tap target on its own line, which ran
   the two link lists to ~490px and ~340px of near-empty column — the label is
   one short word in a 350px-wide box. Two up halves the height and uses the
   space that was empty to its right. The heading keeps the full width. */
/* 699.98, ne 700: `max-width: 700px` ir `min-width: 700px` abu galioja ties lygiai
   700px, tad telefono dviejų pastulpelių taisyklė įsijungdavo KARTU su planšetės
   2 stulpelių tinkleliu ir tame viename plotyje poraštės eilutės nesutapdavo
   (išmatuota 2026-09-06: skylės Turinyje, Erdvėse ir Kontaktuose). */
@media (max-width: 699.98px) {
  nav.foot-col { display: grid; grid-template-columns: 1fr 1fr; column-gap: 1rem; align-content: start; }
  nav.foot-col .foot-head { grid-column: 1 / -1; }
}
.foot-col p > a { margin-top: 0; }
/* Pareigos — vienintelė eilutė su mažesniu šriftu. Line-height jai NEnustatom:
   .foot-col p jau davė --foot-row, o dėžė turi likti pilno žingsnio, kitaip po
   jomis einantis telefonas nusėstų 2,6px aukščiau nei gretimo stulpelio ta pati
   eilutė ir visas kontaktų stulpelis nuslinktų nuo bendro tinklelio. */
.foot-muted { color: rgba(255, 255, 255, .55); font-size: .8rem; }
/* 2026-09-06 user directive: „sulygiuok tekstą tarp stulpelių — eilutės tarp
   stulpelių nesutampa vertikaliai". Socialiniai NEBETURI tuščios eilutės virš
   savęs. Tinklelis ir anksčiau buvo bendras (visos eilutės ant 30,15px žingsnio),
   bet ta viena pauzė buvo VIENINTELĖ skylė iš keturių stulpelių: Kontaktai nuo 5
   eilutės eidavo per vieną žemiau nei Turinys / Erdvės / Partneriai, ir stulpelis
   skaitėsi kaip nuslinkęs. Dabar kiekviena eilutė turi tą patį kaimyną šone.
   Bloko vientisumą kontaktuose toliau neša SPALVA (pareigos ir pastaba — .55
   alfa), kaip aprašyta žemiau; pauzės nebeliko.
   .foot-outlink savo margin-top prarado: `.foot-col a` (0,1,1) nugalėdavo
   `.foot-outlink` (0,1,0), tad „Kitos erdvės ↗" tuščios eilutės NIEKADA ir
   negavo — taisyklė buvo negyva, todėl ištrinta, o ne pataisyta. */
.foot-socials { display: flex; gap: 1.2rem; margin-top: 0; }
.foot-note { font-size: var(--fs-label-sm); color: rgba(255, 255, 255, .55); margin-top: 0; line-height: var(--foot-row); }
/* Kontaktų stulpelis anksčiau turėjo savo, siauresnį ritmą (`:has(.foot-socials) p`
   → .15rem), kad vardas / pareigos / telefonas / paštas skaitytųsi kaip vieno
   žmogaus blokas. Kaina buvo per didelė: keturios kolonos stovi greta, tad du
   skirtingi ritmai reiškia, kad kontaktų eilutės nesutampa su gretimų stulpelių
   eilutėmis NĖ VIENOJE vietoje, o pati antraštė „KONTAKTAI“ pakildavo 4px virš
   kitų trijų (.15rem vs .4rem prieš ją). Dabar visi stulpeliai eina vienu
   --foot-row tinkleliu; bloko vientisumą kontaktuose neša ne mažesnis tarpas, o
   spalva (pareigos ir pastaba — .55 alfa). Tuščios eilutės prieš socialinius
   nebėra nuo 2026-09-06 — žr. .foot-socials komentarą aukščiau. */

/* Antraštė yra ne eilutė sąraše, o etiketė virš jo: ji išlaiko savo ankštą
   eilutės dėžę (1,65) ir savo margin-bottom, kitaip --foot-row išpūstų etikečių
   juostą 11,6px ir visi keturi stulpeliai nusėstų žemiau be jokios priežasties.
   `.foot-col .foot-head` (0,2,0) nugali `.foot-col p` (0,1,1); tarpo VIRŠ savęs
   antraštė neturi — vienintelis tarpas tarp jos ir turinio yra margin-bottom. */
.foot-col .foot-head { margin-top: 0; line-height: 1.65; }
/* Telefonas ir paštas telefone stoja į VIENĄ eilutę.
   Kodėl ne tiesiog mažesnis tarpas: abi nuorodos yra 44px liečiami taikiniai, tad
   viena po kita jos negali stovėti arčiau nei 44px (išmatuota: 46,4px → 44,0px
   nuėmus paskutinį .15rem tarpą, ir tai jau grindys — likę 20px yra pati hit area,
   ne tarpas). Vienintelis būdas juos suartinti nemažinant taikinio — pastatyti
   šalia: y ašyje atstumo nebelieka visai, o abu taikiniai lieka 44px aukščio ir
   99–144px pločio.
   Telpa: 99,4 + 144,4 + skirtukas su tarpais (~19px) = 263px prie 280px stulpelio
   siauriausiame palaikomame 320px lange (LT ir EN — numeris ir paštas yra duomenys,
   jie abiejose kalbose tie patys).
   Kaip: stulpelis tampa flex ir visi jo vaikai lieka per visą plotį — išskyrus šitą
   porą. Flex, o ne inline-block, dėl dviejų dalykų: tarp flex elementų nelieka HTML
   tarpo teksto mazgo (skirtuko tarpai iš abiejų pusių vienodi), ir eilutės riba eina
   per VISĄ elementą, tad siaurėjant paštas nusileidžia visas, o ne lūžta per vidurį
   (dar ir white-space: nowrap tam pačiam).
   Skirtukas „·" yra CSS turinys, ne šablono tekstas: markup'as ir kalbos failai
   nėra šito failo reikalas, o taškas yra grafika, ne žodis.
   Naršyklėje be :has() lieka senasis vertikalus sąrašas — niekas nelūžta. */
/* 699.98 dėl tos pačios priežasties kaip nav.foot-col aukščiau: ties lygiai 700px
   šitas telefono išdėstymas veikdavo kartu su planšetės 2 stulpelių tinkleliu, ir
   kontaktų stulpelis (flex, telefonas · paštas vienoje eilutėje) gaudavo kitą
   ritmą nei greta stovintys Partneriai. */
@media (max-width: 699.98px) {
  .foot-col:has(.foot-socials) { display: flex; flex-wrap: wrap; }
  .foot-col:has(.foot-socials) > * { flex: 0 0 100%; }
  .foot-col:has(.foot-socials) > p:has(> a[href^="tel:"]),
  .foot-col:has(.foot-socials) > p:has(> a[href^="mailto:"]) {
    flex: 0 0 auto; margin-top: 0; white-space: nowrap;
  }
  .foot-col:has(.foot-socials) > p:has(> a[href^="tel:"])::after {
    content: "·"; margin: 0 .45rem; color: rgba(255, 255, 255, .35);
  }
}
.foot-bot { margin-top: 3.5rem; padding-top: 1.5rem; border-top: 1px solid rgba(255, 255, 255, .1); display: flex; flex-direction: column; gap: .5rem; justify-content: space-between; font-size: var(--fs-label-sm); color: rgba(255, 255, 255, .55); }
@media (min-width: 768px) { .foot-bot { flex-direction: row; } }
/* „Privatumo politika“ — interaktyvi, todėl šviesesnė už aplinkinį tekstą (13,4:1)
   ir su matomu pabraukimu, ne vien spalva (A11Y-01 + daltonizmo taisyklė). */
.foot-bot a { color: rgba(255, 255, 255, .85); text-decoration: underline; text-underline-offset: 3px; }
.foot-bot a:hover { color: #fff; }

/* ---- Privacy prose ---- */
.prose { max-width: 44rem; }
.prose h2 { font-family: var(--font-display); font-size: var(--fs-title-lg); margin: 2.2rem 0 .8rem; }
.prose p { margin-top: .9rem; color: #3d4148; }

/* ---- Breadcrumb ---- */
/* align-items: center is load-bearing on a phone: the links there are given a
   44px tap height, the current-page <span> is not, and without it the span sat
   at the top of its line box while the links centred in theirs — which read as
   the last crumb having jumped onto the wrong line. */
.crumbs { font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label); text-transform: uppercase; color: rgba(255, 255, 255, .55); display: flex; flex-wrap: wrap; align-items: center; gap: .6rem; margin-bottom: 1.6rem; }
.crumbs a { color: inherit; text-decoration: none; }
.crumbs a:hover { color: #fff; }
.crumbs .sep { opacity: .5; }

/* ---- 2026-07 corrections layer ---- */

/* Accessibility: darker steel for small text (WCAG AA), states not colour-only */
:root { --steel: #666D78; }
.hall-step .hall-cap { font-size: clamp(2.6rem, 4vw, 3.6rem); margin-top: 1.4rem; }
/* .rail-btn.rail-fit/.rail-dim taisyklės išimtos (INT-05): selektorius
   [data-scrolly="halls"] .rail-btn niekur neegzistavo, tad klasės buvo negyvos.
   Talpos būsenas neša .gal-index-card / .gp-room / .hmx-* (žr. CLAUDE.md). */

/* Pricing table emphasis (correction #12) */
.spec-table td.col-para, .spec-table th.col-para { background: rgba(165, 62, 0, .07); font-weight: 600; }
.spec-table td, .spec-table th { text-align: left; }
.spec-table td.num, .spec-table th.num { text-align: right; font-variant-numeric: tabular-nums; }
/* `.pop-badge` („DAŽNAS PASIRINKIMAS") taisyklės ištrintos 2026-08-31 kartu su
   pačiu ženkliuku — kliento apžvalga: „kol neturim normalaus proof, kas ką
   normaliai renkasi". Kartu iškrito ir jos vieta kainų lentelėje (po
   pavadinimu, ne šalia jo, nes prilipęs stulpelis kiekvieną ženkliuko simbolį
   mokėjo kainų duomenų simboliu) bei abu `.gal-index-card` kampai. */

/* Included grid redesign (correction #13) */
.included-grid { display: grid; gap: 1px; background: var(--line); border: 1px solid var(--line); }
@media (min-width: 640px) { .included-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1024px) { .included-grid { grid-template-columns: repeat(4, 1fr); } }
.included-cell { background: #fff; padding: 1.4rem 1.3rem; font-size: .92rem; display: flex; gap: .7rem; align-items: flex-start; }
.included-cell::before { content: "✓"; color: var(--volt); font-weight: 700; flex-shrink: 0; }
.dl-row { display: flex; flex-wrap: wrap; gap: .8rem; margin-top: 1.75rem; }
/* .btn-dl geometrija, tipografija ir spalvos gyvena bendrame mygtukų bloke failo
   viršuje: atsisiuntimas yra to paties mygtuko TRETINIS (kontūrinis) lygis, ne
   atskira mygtukų rūšis. Čia nieko nebeliko — anksčiau čia stovėjęs 999px pill
   su sage užpildu buvo viena iš trijų nesuderintų mygtukų formų. */

/* Sustainability / BREEAM (correction #7) */
.sust-band { display: grid; gap: 2rem; align-items: center; border: 1px solid var(--line); background: #fff; padding: clamp(1.75rem, 4vw, 3rem); }
@media (min-width: 900px) { .sust-band { grid-template-columns: auto 1fr; gap: 3rem; } }
.sust-band img { width: clamp(96px, 12vw, 140px); height: auto; }
.oldnew-grid { display: grid; gap: 1.25rem; }
@media (min-width: 768px) { .oldnew-grid { grid-template-columns: 1fr 1fr; } }
.oldnew-tag { font-family: var(--font-mono); font-size: var(--fs-label-xs); letter-spacing: var(--ls-label-wide); text-transform: uppercase; color: var(--steel); margin-bottom: .6rem; display: block; }

/* Floor plans (correction #15) */
/* VIENO stulpelio tinklelis visuose pločiuose (2026-09-01 vakaras). Anksčiau nuo
   1024px buvo du stulpeliai: 2 aukšto lapas (4,6:1; iki 2026-09-01 nakties
   3,9:1, kol kontūre buvo laiptų į restoraną iškyša) pusėje pločio išeidavo
   ~600px, o jo 13px užrašai — ~6px. Dabar a2 kortelė yra pilno pločio
   (1278px SVG prie 1440px lango ⇒ 1,28px vienetui), o kiemo (og) kortelė — irgi
   pilno pločio, tik jos SVG ribojamas (žr. `.fp-svg.fp-site`). `fp-solo`
   klasės nebėra: vienam stulpeliui ji nieko nereiškė. */
.fp-grid { display: grid; gap: 1.5rem; }
/* Laiptų ženklas — ir salės puslapio, ir istorijos, ir „Galerijos 2" plane:
   pakopos plonos ir pilkos, eigos linija su rodykle tamsesnė ir storesnė
   (kitaip rodyklė pradingsta tarp pakopų). Liftas — kryžmas per dėžę; jis
   liko tik galerijos 1 a. lape (2 aukšte klientas jį išbraukė). */
.fp-steps { fill: none; stroke: #8E7F83; stroke-width: .9; }
.fp-walk { fill: none; stroke: #251216; stroke-width: 1.4; stroke-linejoin: round; stroke-linecap: round; }
.hp-steps { fill: none; stroke: var(--line); stroke-width: 1; }
.fp-card { background: #fff; border: 1px solid var(--line); padding: 1.25rem; }
.fp-title { font-family: var(--font-mono); font-size: var(--fs-label-xs); text-transform: uppercase; letter-spacing: var(--ls-label-wide); color: var(--steel); margin-bottom: 1rem; }
.fp-svg { width: 100%; height: auto; display: block; }
/* Kiemo (og) lapas (1000 × 709, 1,41:1) per visą 1278px plotį būtų 906px aukščio,
   todėl jo SVG ribojamas iki 56rem (896px ⇒ 0,896px vienetui) ir centruojamas.
   `max-width` ant SVG, ne `width` ant kortelės: kortelė lieka pilno pločio ir
   lygiuojasi su 2 aukšto kortele, o SVG viduje turi savo plotį (nėra
   shrink-to-fit grandinės, kuri kadaise duodavo 300px numatytąjį SVG). */
.fp-svg.fp-site { max-width: 56rem; margin-inline: auto; }
/* Užrašai lape yra viewBox vienetais, o vienetas virsta pikseliais pagal
   ATVAIZDUOJAMĄ plotį. a2 lapas prie 1440px yra 1278px (1,28px/vnt.), kiemo —
   896px (0,896px/vnt.), tad tas pats 13px šriftas ekrane būtų 16,6px ir 11,6px.
   Daugiklis 1,45 (= 1,28 / 0,896) sulygina: 19px ⇒ 17,0px, 44px ⇒ 39,4px.
   Tas pats daugiklis privalo galioti ir eilučių tarpams šablone (26/30 vietoj
   18/20) — keičiant vieną, keisti abu. */
.fp-site .fp-label { font-size: 44px; }
.fp-site .fp-sub { font-size: 19px; }
.fp-site .fp-steps { stroke-width: 1.3; }
.fp-site .fp-walk { stroke-width: 2; }
.fp-label { font-family: var(--font-display); font-size: 30px; font-weight: 700; }
.fp-sub { font-family: var(--font-mono); font-size: 13px; }
/* Vakarinis (BC) užkulisis yra 14 m² — lape 46 × 64 vnt. „Užkulisiai" 13px yra
   78 vnt., tad net pasuktas 90° netelpa į 64. 9,5px duoda 57 vnt. — didžiausias
   dydis, kuris telpa (išmatuota naršyklėje, ne apskaičiuota). Klasė TIK šitai
   vienai etiketei; kitur .fp-sub lieka 13px. */
.fp-xxs { font-size: 9.5px; }
.fp-muted { fill: var(--steel); }
.fp-hall { transition: opacity .2s ease; cursor: pointer; }
.fp-svg a:hover .fp-hall, .fp-svg a:focus-visible .fp-hall { opacity: .82; stroke-width: 3; }

/* Map (correction #19) */
.map-card { background: #251216; border-radius: var(--r-lg); overflow: hidden; }
.map-actions { padding: 1.1rem 1.5rem; background: #251216; border-top: 1px solid rgba(255, 255, 255, .08); }
/* Schemos vidus (.map-svg, .map-name, .map-dist, .map-skc, .map-addr, .map-tag,
   .map-list) gyvena „Atvykimo schema" bloke prie kontaktų sekcijos — ten pat, kur
   ir jos lūžio taškai. Čia jų nedubliuoti: dublikatas failo viduryje tyliai
   pralaimėtų vėlesnei taisyklei. */

/* Phone/email contact bar (services-style, correction #4 section 1).
   .contact-chip nebėra atskira „pill“ rūšis — tai bendros mygtukų sistemos
   tretinis (kontūrinis) lygis tamsiame paviršiuje; visa jo išvaizda gyvena
   mygtukų bloke failo viršuje. .copy-btn ir `.contact-chip button` taisyklės
   išimtos: tokių elementų markup'e nėra (kopijavimo mygtukas PATS yra chipsas). */
.contact-bar { display: flex; flex-wrap: wrap; gap: .8rem; }

/* Footer TZ Events logo */
.foot-tze { display: block; height: 1.75rem; width: auto; filter: invert(1); }
.foot-mark:hover img { opacity: .72; }
/* line-height: 1 — ne stilius, o tinklelio sąlyga. Kodo žymė yra kito šrifto
   inline dėžė toje pačioje eilutėje; su paveldėtu --foot-row jos bazinė linija
   nesutampa su eilutės strutu, dviejų dėžių sąjunga išauga iki 31,2px ir VISAS
   erdvių stulpelis pamažu nuslenka nuo gretimų (po 1px eilutei). Su 1 žymės dėžė
   telpa į strutą ir eilutė lieka lygiai vienas žingsnis. */
.foot-code { font-family: var(--font-mono); font-size: var(--fs-label-sm); line-height: 1; color: rgba(255, 255, 255, .4); }

/* Nav external link — the bar is always dark now, so there is no light variant. */
.nav-ext { font-size: .85rem; }

/* ---- Tech Zity dobilas ----
   2026-08-31 kliento apžvalga: „kadangi atsisakėm šių dobiliukų, tai padarom
   nuotraukas, jog susivienodintų visame psl." Nuotraukų kaukės (`.tz-frame`,
   `.tz-frame-panel`, `.tz-frame-tall`) ištrintos: pradinio puslapio kortelės,
   salių galerijos, „Gastrolių" kadrai ir kontaktų portretas dabar yra paprasti
   stačiakampiai. Priežastis, kodėl jie ir negalėjo „susivienodinti": figūra
   piešiama su `preserveAspectRatio='none'` ir tempiama per kadrą, tad įpjovų
   gylis buvo kadro proporcijos funkcija — 16/10 kortelė, kvadratas ir portretas
   gaudavo tris skirtingas formas (portretui net prireikė atskiro `-tall`
   varianto).

   Dobilas svetainėje lieka DVIEJOSE vietose, ir nė viena jo forma nebetempia:
   galerijos skaitymo juostos žymos (fiksuotas 12 × 9 px) ir nuotraukos perėjimo
   kaukė (`--tz-mask-fit`, `xMidYMid meet` — figūra įrašoma į kadrą nekeisdama
   proporcijų). Mygtukų dobilo nėra nuo 2026-08-31 ryto, „KAS KUR" kortelių — nuo
   to paties vakaro, kontaktų sage skydo (`--tz-mask-person`) — nuo 2026-09-07. */
:root {
  --tz-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1000 1000' preserveAspectRatio='none'%3E%3Cpath d='M130 33L487 33L487 155L494 162L506 162L513 155L513 33L869 33L957 458L957 489L876 495L876 505L957 511L957 542L869 967L513 967L513 845L506 838L494 838L487 845L487 967L130 967L43 542L43 511L124 505L124 495L43 489L43 458Z' fill='%23000'/%3E%3C/svg%3E");
/* Tas pats dobilas, tik KONTŪRU — mažoms žymoms, kur reikia tuščiaviduro ženklo
   (galerijos skaitymo juosta). viewBox praplėstas −30…1030, kad 120 vnt. linija
   (60 į abi puses nuo kelio) tilptų ir nebūtų nukirpta; kelias figūroje siekia
   43…957 × 33…967, tad atsargos užtenka. Storis vienetais, ne `vector-effect` —
   pastarasis SVG-kaip-paveikslėlyje ne visur veikia, o nulūžtų į nematomą liniją. */
  --tz-mask-line: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-30 -30 1060 1060' preserveAspectRatio='none'%3E%3Cpath d='M130 33L487 33L487 155L494 162L506 162L513 155L513 33L869 33L957 458L957 489L876 495L876 505L957 511L957 542L869 967L513 967L513 845L506 838L494 838L487 845L487 967L130 967L43 542L43 511L124 505L124 495L43 489L43 458Z' fill='none' stroke='%23000' stroke-width='120'/%3E%3C/svg%3E");
/* Ta pati figūra, bet `xMidYMid meet`: SVG įrašomas į kadrą IŠLAIKANT
   proporcijas, tad įpjovų gylis nebepriklauso nuo kadro formos. Naudoja
   nuotraukų perėjimo kaukė, kurios dėžė kinta su langu. `meet`, ne `slice`:
   pastarasis apkarpytų šoninius dobilo iškirpimus, o būtent jie ir yra ženklas. */
  --tz-mask-fit: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1000 1000' preserveAspectRatio='xMidYMid meet'%3E%3Cpath d='M130 33L487 33L487 155L494 162L506 162L513 155L513 33L869 33L957 458L957 489L876 495L876 505L957 511L957 542L869 967L513 967L513 845L506 838L494 838L487 845L487 967L130 967L43 542L43 511L124 505L124 495L43 489L43 458Z' fill='%23000'/%3E%3C/svg%3E");
}
/* ---- Client visuals layer (2026-07 round 2) ---- */

/* Gallery grid + lightbox */
.gal-grid { display: grid; gap: 1rem; }
@media (min-width: 700px) { .gal-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1100px) { .gal-grid.gal-3 { grid-template-columns: repeat(3, 1fr); } }
.gal-item { position: relative; display: block; border: 0; padding: 0; width: 100%; overflow: hidden; border-radius: var(--r-sm); background: var(--snow); cursor: zoom-in; }
.gal-item img { display: block; width: 100%; height: clamp(13rem, 26vw, 20rem); object-fit: cover; transition: transform .5s ease; }
.gal-item:hover img { transform: scale(1.04); }
.gal-item::after { content: ""; position: absolute; inset: 0; background: linear-gradient(180deg, transparent 60%, rgba(20, 8, 11, .38)); opacity: 0; transition: opacity .3s ease; }
.gal-item:hover::after, .gal-item:focus-visible::after { opacity: 1; }
.gal-zoom { position: absolute; right: .8rem; bottom: .8rem; width: 34px; height: 34px; display: grid; place-items: center; border-radius: 999px; background: rgba(37, 18, 22, .6); color: #fff; opacity: 0; transition: opacity .3s ease; backdrop-filter: blur(4px); }
.gal-item:hover .gal-zoom, .gal-item:focus-visible .gal-zoom { opacity: 1; }
.gal-tall img { height: clamp(18rem, 38vw, 30rem); }

/* Viena eilutė, kiek nuotraukų bebūtų (2026-08-31 user directive: „make them
   rectangular and smaller so that they would fit in single row"). Salių puslapiuose
   kadrų yra 2–4, tad fiksuotas stulpelių skaičius vieną salę palikdavo su kabančia
   antra eilute (3 kadrai = 2 + 1). `grid-auto-flow: column` + `grid-auto-columns`
   dalija eilutę po lygiai nepriklausomai nuo kiekio; `grid-template-columns: none`
   privalomas, nes ankstesnė 2-stulpelių taisyklė kitaip lieka galioti.
   Du sprendimai, be kurių eilutė lūžta:
   1) stulpelio VIRŠUTINĖ riba (19rem) — be jos dviejų kadrų salė (D) gaudavo po 654px
      pločio kadrą 184px aukščio juostoje, t. y. 3,5:1 skiautę; su riba visų salių
      kadrai yra to paties dydžio, kad ir kiek jų būtų. `minmax(0, …)` leidžia jiems
      trauktis siauresniame lange, tad horizontalaus scroll nėra.
   2) aukštį neša `aspect-ratio`, ne fiksuotas clamp — kitaip 4 kadrai ties 900px
      susispaustų iki beveik kvadrato. 5/3 laikosi visur.
   Iki 700px eilutės nėra — keturios nuotraukos telefone būtų po 70px; ten lieka
   įprastas stulpelis. */
@media (min-width: 700px) {
  .gal-grid.gal-row {
    grid-template-columns: none; grid-auto-flow: column;
    grid-auto-columns: minmax(0, 19rem); justify-content: start; gap: .75rem;
  }
  .gal-grid.gal-row .gal-item { aspect-ratio: 5 / 3; }
  .gal-grid.gal-row .gal-item img { height: 100%; }
}

/* ---- Photo slider ----
   A scroll-snap track, not a JS-driven stage: it swipes on a phone, scrolls on a
   trackpad and tabs through with a keyboard before main.js touches it. No photograph
   is cropped: the slide takes the photo's own aspect ratio (`--gal-ar`, written by
   macros.njk from the item's w/h), so `contain` has nothing left to letterbox.
   A fixed square stage was the earlier answer, but it left dead box below a 3:2
   shot — and the hover dim (`.gal-item::after`, inset 0) plus the zoom button sat
   on that dead strip instead of on the photo. `align-self: start` keeps a slide at
   its own height if a gallery ever mixes ratios; `aspect-ratio: 1` stays the
   fallback for items that come without w/h. */
.gal-slider { position: relative; }
.gal-track {
  /* 100 %, not a peeking 86 %: a track that cannot scroll far enough to left-align
     its last slide leaves that slide's dot permanently unreachable. */
  display: grid; grid-auto-flow: column; grid-auto-columns: 100%; gap: 1rem;
  overflow-x: auto; scroll-snap-type: x mandatory; overscroll-behavior-x: contain;
  scrollbar-width: none; -webkit-overflow-scrolling: touch;
}
.gal-track::-webkit-scrollbar { display: none; }
.gal-track:focus-visible { outline: 2px solid var(--rust); outline-offset: 4px; }
@media (min-width: 700px) { .gal-track { grid-auto-columns: calc(50% - .5rem); } }
.gal-track > .gal-item { scroll-snap-align: start; aspect-ratio: var(--gal-ar, 1); align-self: start; background: transparent; min-width: 0; }
.gal-track > .gal-item img { height: 100%; object-fit: contain; }

/* Controls stay out of the photographs: an overlaid arrow on a 320 px screen either
   covers the subject or misses the 44 px tap target.
   The [hidden] repeats below are not noise — `display: flex/grid` here is an author
   rule and outranks the UA stylesheet's [hidden] { display: none }, so without them
   the controls show up before main.js has wired them to anything. */
.gal-slider-nav { display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin-top: 1rem; }
.gal-slider-nav[hidden] { display: none; }
.gal-dots { display: flex; align-items: center; gap: .5rem; }
.gal-dot { width: 44px; height: 44px; padding: 0; border: 0; background: none; cursor: pointer; display: grid; place-items: center; }
.gal-dot[hidden] { display: none; }
.gal-dot::after { content: ""; width: 8px; height: 8px; border-radius: 999px; background: var(--line); transition: background .25s ease, transform .25s ease; }
.gal-dot:hover::after { background: var(--steel); }
.gal-dot[aria-current="true"]::after { background: var(--wine); transform: scale(1.5); }
.gal-dot:focus-visible { outline: 2px solid var(--rust); outline-offset: -6px; border-radius: 999px; }
.gal-arrows { display: flex; gap: .5rem; }
.gal-arrow {
  width: 44px; height: 44px; display: grid; place-items: center; cursor: pointer;
  border: 1px solid var(--line); border-radius: 999px; background: #fff; color: var(--ink);
  transition: border-color .25s ease, background .25s ease, opacity .25s ease;
}
.gal-arrow:hover:not(:disabled) { border-color: var(--wine); background: var(--snow); }
.gal-arrow:disabled { opacity: .3; cursor: default; }
/* Four 44 px dots and two 44 px arrows need 288 px of row; a 320 px screen has 238
   inside the card. Nothing shrinks below the tap target — the row wraps instead. */
@media (max-width: 440px) {
  .gal-slider-nav { flex-wrap: wrap; justify-content: center; gap: .25rem; }
  .gal-arrows { order: -1; }
}

.lb { position: fixed; inset: 0; z-index: 200; background: rgba(20, 8, 11, .95); display: flex; align-items: center; justify-content: center; padding: clamp(1rem, 4vw, 3rem); }
.lb[hidden] { display: none; }
.lb-fig { margin: 0; max-width: min(1500px, 96vw); max-height: 100%; display: flex; flex-direction: column; gap: 1rem; }
.lb-fig img { max-width: 100%; max-height: 78vh; object-fit: contain; border-radius: var(--r-sm); }
.lb-cap { color: rgba(255, 255, 255, .75); font-size: .9rem; text-align: center; }
.lb-count { font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label); color: rgba(255, 255, 255, .45); text-align: center; }
.lb-btn { position: absolute; top: 50%; transform: translateY(-50%); width: 52px; height: 52px; display: grid; place-items: center; border-radius: 999px; background: rgba(255, 255, 255, .1); color: #fff; transition: background-color .2s ease; }
.lb-btn:hover { background: rgba(255, 255, 255, .22); }
.lb-prev { left: clamp(.5rem, 2vw, 2rem); }
.lb-next { right: clamp(.5rem, 2vw, 2rem); }
.lb-close { position: absolute; top: clamp(.75rem, 2vw, 1.5rem); right: clamp(.75rem, 2vw, 1.5rem); width: 46px; height: 46px; display: grid; place-items: center; border-radius: 999px; background: rgba(255, 255, 255, .1); color: #fff; }
.lb-close:hover { background: rgba(255, 255, 255, .22); }

/* Venue strip (lobbies, entrance, courtyard) */
.venue-strip { display: grid; gap: 1.25rem; }
@media (min-width: 900px) { .venue-strip { grid-template-columns: repeat(3, 1fr); } }
.venue-card { background: transparent; overflow: visible; }
.venue-card img { display: block; width: 100%; height: clamp(12rem, 22vw, 16rem); object-fit: cover; }
.venue-card .vc-body { padding: 1.2rem .2rem 0; }
.venue-card h3 { font-family: var(--font-display); font-size: var(--fs-title-md); }
.venue-card p { margin-top: .45rem; font-size: .88rem; color: var(--steel); }

/* Supplier directory */
.sup-grid { display: grid; gap: 1px; background: var(--line); border: 1px solid var(--line); }
@media (min-width: 700px) { .sup-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1200px) { .sup-grid { grid-template-columns: repeat(4, 1fr); } }
.sup-card { background: #fff; padding: 1.5rem 1.4rem; display: flex; flex-direction: column; gap: .55rem; }
.sup-cat { font-family: var(--font-mono); font-size: var(--fs-label-xs); letter-spacing: var(--ls-label); text-transform: uppercase; color: var(--volt); }
.sup-name { font-family: var(--font-display); font-size: var(--fs-title-md); font-weight: 700; }
.sup-spec { font-size: .85rem; color: var(--steel); flex: 1; }
.sup-links { display: flex; flex-direction: column; gap: .3rem; font-family: var(--font-mono); font-size: var(--fs-label-md); margin-top: .4rem; }
.sup-links a { color: var(--ink); text-decoration: none; }
.sup-links a:hover { color: var(--volt); text-decoration: underline; text-underline-offset: 3px; }
.sup-fee { font-size: .7rem; margin-top: .55rem; display: inline-flex; align-items: center; gap: .35rem; color: var(--steel); }
.sup-fee.is-free { color: #2E6B4F; }
.sup-fee::before { content: "•"; }
/* Tiekėjo kontaktai telefone: tel. / paštas / svetainė / „Meniu ir kainos →" yra
   viena grupė, bet mobiliame bloke kiekviena nuoroda gauna 44px liečiamą plotą,
   tad eilutės ėjo po 48,8px (44 + .3rem tarpas) — 190px keturioms 21px eilutėms.
   44px yra grindys ir jų neliečiam (žr. CLAUDE.md), todėl išimam viską, kas
   PRIDĖTA aplink jas: tarpą tarp nuorodų, atitraukimą nuo aprašo ir nuo mokesčio
   eilutės. 190px → 176px, o grupė prilimpa prie savo kortelės teksto.
   Toliau siaurinti be markup'o keitimo negalima: keturi nepersidengiantys 44px
   taikiniai = 176px, taškas. */
@media (max-width: 700px) {
  .sup-links { gap: 0; margin-top: .1rem; }
  .sup-fee { margin-top: .2rem; }
  .sup-card { gap: .45rem; }
}

/* External catering fee table */
.fee-table { width: 100%; min-width: 30rem; border-collapse: collapse; font-size: .9rem; background: #fff; border: 1px solid var(--line); }
.fee-table th, .fee-table td { padding: .85rem 1.1rem; text-align: left; border-top: 1px solid var(--line); }
.fee-table thead th { border-top: 0; font-family: var(--font-mono); font-size: var(--fs-label-xs); letter-spacing: var(--ls-label); text-transform: uppercase; color: var(--steel); font-weight: 500; }
.fee-table td.num, .fee-table th.num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
/* The two column headers are long mono strings; left unwrapped they claimed most of
   the table and broke "Kavos pertraukėlės / užkandžiai" over three lines. Fixed
   layout hands the labels half the width and lets the headers wrap instead. */
.fee-table-catering { min-width: 0; table-layout: fixed; }
.fee-table-catering th:first-child { width: 48%; }
.fee-table-catering thead th.num { white-space: normal; }
.fee-table-catering tbody th { font-weight: 400; }

.tag-cloud { display: flex; flex-wrap: wrap; gap: .55rem; margin-top: 1.75rem; }
.tag-cloud span { border: 1px solid var(--line); border-radius: 999px; padding: .45rem 1rem; font-size: .85rem; color: var(--ink); }

/* ---- Kontaktų asmuo: portretas ir PAPRASTAS tekstas ----
   2026-09-07 user directive pažodžiui: „šitas šviesus dobilas kontaktų formoje
   turi būti panaikintas ir informacija apie asmenį turi būti parašyta paprastu
   tekstu, kuris derintųsi prie dizaino ir niekaip kitaip neiškraipytas".
   Tai atšaukia 2026-08-31 „the card of eimantas budrys has to be a clover":
   ištrinti sage skydas, `--tz-mask-person` kaukė, `aspect-ratio: 371/327`,
   procentinės paraštės, `.pi-body` centravimo apvalkalas ir 0,761 stulpelių
   dalyba (ji laikė kortelės ir portreto apatines linijas vienoje aukštyje, dabar
   lyginti nebėra su kuo). Grąžinti — tik iš git istorijos iki 2026-09-07.
   Tekstas dera su tuo, kas jau stovi šiame tamsiame puslapyje, o ne sugalvotas:
   vardas — display šriftu, sniego spalva kaip antraštės; pareigos — sage; trys
   kontaktų eilutės — tokios pat kaip `.contact-lines` kairiajame stulpelyje
   (mono, be pabraukimo, pabraukimas per hover, tas pats .8rem tarpas).
   Nuo 630px portretas kairėje (15rem, kliento „photos need to stay on the left"),
   tekstas dešinėje per jo vidurį; siauriau — vienas po kitu 20rem takelyje. */
.person-block { display: grid; gap: 1.25rem; margin-top: 2rem; align-items: center; }
@media (min-width: 630px) {
  .person-block { grid-template-columns: minmax(0, 15rem) 1fr; gap: 1.5rem; max-width: 46rem; }
}
@media (min-width: 1080px) { .person-block { max-width: 36rem; } }
@media (max-width: 629px) {
  .person-block { grid-template-columns: minmax(0, 20rem); justify-content: center; }
}
.person-photo { position: relative; aspect-ratio: 120 / 139; align-self: start; overflow: hidden; border-radius: var(--r-md); }
.person-photo img { display: block; width: 100%; height: 100%; object-fit: cover; object-position: center 18%; }
.person-info { align-self: center; min-width: 0; }
.pi-name { font-family: var(--font-display); font-size: var(--fs-title-md); font-weight: 700; letter-spacing: .01em; }
.pi-role { margin-top: .35rem; font-weight: 600; font-size: .92rem; color: var(--sage); }
.pi-lines { margin-top: 1.1rem; display: grid; gap: .8rem; font-family: var(--font-mono); font-size: var(--fs-mono-body); }
.pi-lines a { color: inherit; text-decoration: none; }
.pi-lines a:hover { text-decoration: underline; text-underline-offset: 4px; }
/* Telefone eilutės yra 44px liečiami taikiniai (mobilus sluoksnis failo gale) —
   oras tarp jų ateina iš pačios hit area, tinklelio tarpas jį tik dubliuotų. */
@media (max-width: 700px) { .pi-lines { gap: 0; } }

/* Real plan figures */
.realplan-grid { display: grid; gap: 1.25rem; margin-top: 1.25rem; }
@media (min-width: 1000px) { .realplan-grid { grid-template-columns: 1fr 1fr; align-items: stretch; } }
.realplan { background: #fff; border: 1px solid var(--line); padding: 1rem; display: flex; flex-direction: column; }
.realplan img { display: block; width: 100%; max-height: 24rem; object-fit: contain; background: var(--wine); margin: auto; }
.realplan figcaption { font-family: var(--font-mono); font-size: var(--fs-label-xs); text-transform: uppercase; letter-spacing: var(--ls-label); color: var(--steel); margin-top: .8rem; }

/* ================= MOBILE OPTIMISATION =================
   Measured on a 390×844 / DPR3 iPhone profile. Three goals: legible utility type
   (nothing under ~12.5px), tap targets that reach 44px, and less scrolling — the
   client's own feedback was that the page ran too long. Kept last in the file so
   it wins over the section blocks above without needing !important. */
@media (max-width: 700px) {

  /* --- Legibility: raise the floor on small utility type --- */
  .eyebrow { font-size: .82rem; letter-spacing: .14em; }
  .mono-line { font-size: .8rem; letter-spacing: .12em; }
  /* doubled class selectors so these beat the two-class rules defined above */
  .sup-cat.sup-cat, .oldnew-tag.oldnew-tag, .fp-title.fp-title,
  .pl-title.pl-title, .foot-head.foot-head, .arc-label.arc-label, .partner-role.partner-role,
  .f-label.f-label,
  .tz-badge.tz-badge, .tz-year.tz-year { font-size: .8rem; letter-spacing: .12em; }
  .spec-table thead, .fee-table thead th { font-size: .8rem; letter-spacing: .1em; }
  .cc-label.cc-label,
  .hall-meta.hall-meta, .ph-meta.ph-meta, .crumbs, .crumbs span, .hall-nav-chip.hall-nav-chip,
  .foot-note.foot-note, .foot-line.foot-line, .foot-bot.foot-bot, .table-note, .sup-fee.sup-fee,
  .hall-counter.hall-counter, .plan-card figcaption, .hall-caplabel.hall-caplabel,
  .realplan figcaption, .arc-caption { font-size: .84rem; }
  .hall-step .hall-meta, .hall-step .hall-caplabel { font-size: .84rem; }
  .rail-btn { font-size: .82rem; letter-spacing: .03em; }
  .sup-links, .contact-lines, .pi-lines, .types-line { font-size: .9rem; letter-spacing: .06em; }
  .lead, .partner-desc, .cta-sub, .hero-sub { font-size: 1rem; }
  .hall-desc, .sup-spec, .venue-card p { font-size: .95rem; }
  .hero-trust { font-size: .82rem; }
  .tag-cloud span { font-size: .9rem; }

  /* --- Tap targets --- */
  .link-volt, .row-link, .sup-links a, .contact-lines a, .pi-lines a,
  .foot-col a, .hall-more a, .hall-nav-chip, .btn-dl, .fs-contact a {
    display: inline-flex; align-items: center; min-height: 44px;
  }
  /* Ir plotis ≥44 — chip „A“ buvo 41,3 px (A11Y-06). */
  .hall-nav-chip { min-width: 44px; justify-content: center; }
  .crumbs a { display: inline-flex; align-items: center; min-height: 44px; }
  .crumbs { gap: .2rem .6rem; }
  .nav-operator { min-height: 44px; display: flex; align-items: flex-end; }
  .nav-links { gap: 1.1rem; }
  .rail-btn { min-height: 44px; padding: .5rem .85rem; }
  .mode-tab, .size-chip { padding-inline: 1rem; }
  .foot-bot a { display: inline-flex; align-items: center; min-height: 44px; }

  /* --- Overlaid hero text needs a heavier scrim on a small bright photo --- */
  .page-hero-media::after {
    background: linear-gradient(180deg, rgba(20, 8, 11, .58) 0%, rgba(20, 8, 11, .42) 32%, rgba(20, 8, 11, .9) 100%);
  }
  .page-hero-media .ph-meta { color: rgba(255, 255, 255, .92); }
  .page-hero-media .crumbs { color: rgba(255, 255, 255, .9); }
  .page-hero-media { min-height: 70svh; }

  /* --- Less scrolling --- */
  .section { padding-block: clamp(3.25rem, 9vw, 5rem); }
  .section-tight { padding-block: clamp(2.5rem, 7vw, 3.5rem); }
  .hero-content { padding-top: 7rem; padding-bottom: 3.25rem; }
  .page-hero { padding: 7.5rem 0 3rem; }
  .page-hero-media .ph-content { padding-top: 6.5rem; padding-bottom: 2.5rem; }
  .hall-step { padding-block: 1.6rem; }
  .hall-step:first-child { padding-top: 1rem; }
  .hall-step .hall-cap { margin-top: 1rem; }
  .hall-step .hall-price { margin-top: 1rem; }
  .arc-step { margin-top: 2.5rem; }
  /* Blokas nebėra kortelė — telefone lieka tik ritmas, jokio šoninio padding'o,
     kad partnerio tekstas liktų ant to paties .wrap krašto kaip antraštė. */
  .partner-block { margin-top: 1.75rem; padding-top: 1.75rem; }
  .partner-body { margin-top: 1.1rem; gap: 1.5rem; }
  .media-h-lg img { height: 13rem; }
  .gal-item img, .gal-tall img { height: 12.5rem; }
  .gal-track > .gal-item img { height: 100%; }
  .venue-card img { height: 11.5rem; }
  .arc-grid .media-frame img, .arc-grid.arc-1 .media-frame img { height: 11.5rem; }
  .hero-sub { margin-top: 1.25rem; }
  .hero-ctas { margin-top: 1.5rem; gap: .75rem; }
  .hero-trust { margin-top: 1.5rem; }
  .cta-inner { gap: 1.75rem; }
  .foot-top { gap: 1.75rem; }
  .site-footer { padding-top: 3rem; }
  .foot-bot { margin-top: 2rem; }
  .sust-band { padding: 1.5rem 1.25rem; }

  /* --- Full-width buttons read better than a lone pill --- */
  .hero-ctas .btn, .cta-actions .btn { width: 100%; justify-content: center; }
  .cta-actions { gap: .75rem; }
  .btn-lg { padding: .95rem 1.6rem; }

  /* The scroll fade is now global — see the table block. */
}

@media (max-width: 420px) {
  .display-xl { font-size: clamp(2.4rem, 11vw, 3.2rem); }
  .display-lg { font-size: clamp(1.9rem, 8.4vw, 2.6rem); }
  .cap-strip { grid-template-columns: repeat(2, 1fr); }
}

/* Framed sticky stack: keep the controls inside the mask's cut corners */
.stack-framed { background: var(--wine); }
.stack-framed .hall-rail { left: 15%; bottom: 5%; }
.stack-framed .hall-counter { right: 7%; top: 7%; }

/* ---- "Why choose" list — label column in rust, as in the deck ---- */
.why-grid { display: grid; gap: 2.5rem; align-items: center; }
@media (min-width: 900px) { .why-grid { grid-template-columns: 1fr minmax(0, 22rem); gap: 3.5rem; } }
.why-list { display: grid; gap: 1.4rem; }
.why-row { display: grid; gap: .25rem; }
@media (min-width: 640px) { .why-row { grid-template-columns: 13rem 1fr; gap: 1.5rem; align-items: baseline; } }
.why-label { font-weight: 700; color: var(--rust); font-size: 1rem; }
@media (min-width: 640px) { .why-label { text-align: right; } }
.why-text { color: var(--ink); font-size: 1rem; line-height: 1.6; }
.bg-ink .why-text, .bg-navy .why-text { color: rgba(255, 255, 255, .82); }
.why-photo img { width: 100%; height: clamp(18rem, 40vw, 30rem); object-fit: cover; display: block; }

/* ---- Campus ecosystem chips ---- */

/* Illustrative grids become swipeable on mobile — six stacked cards added ~1500px
   of scrolling on the home page for content that reads fine as a carousel. */
@media (max-width: 700px) {
  .m-carousel {
    display: flex; overflow-x: auto; gap: 1rem;
    scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch;
    scrollbar-width: none; margin-inline: calc(var(--pad) * -1);
    padding-inline: var(--pad); padding-bottom: .5rem;
  }
  .m-carousel::-webkit-scrollbar { display: none; }
  .m-carousel > * { flex: 0 0 80%; scroll-snap-align: center; margin-top: 0 !important; }
  .m-carousel-hint {
    display: block; margin-top: .9rem; font-family: var(--font-mono);
    font-size: .78rem; letter-spacing: .1em; text-transform: uppercase; color: var(--steel);
  }
}
@media (min-width: 701px) { .m-carousel-hint { display: none; } }

/* Framed sticky stack on small screens: the six rail chips have to fit one row
   inside the mask, so they get compact metrics that override the mobile block. */
@media (max-width: 700px) {
  .stack-framed .hall-rail { left: 13%; bottom: 6%; gap: .3rem; flex-wrap: nowrap; }
  .stack-framed .rail-btn { min-width: 0; min-height: 44px; padding: .3rem .5rem; font-size: .7rem; letter-spacing: 0; }
  /* Floor-plan hall rects are SVG links — they cannot take a min-height, so below
     700px the plan renders at its natural size inside a horizontal scroller. That
     keeps every hall rect above the 44px tap target instead of shrinking with the
     viewport. Same pattern as .table-scroll. */
  /* Slenkasi TIK brėžinys, ne visa kortelė: `overflow-x` ant `.fp-card` nustumdavo
     ir jos antraštę („2 AUKŠTAS — …" pasislinkdavo kartu su planu ir jos pradžia
     iškrisdavo iš kadro), nes antraštė yra tame pačiame konteineryje. */
  /* min-width: 0 — be jo tinklelio elementas užsiaugina savo min-content plotį
     (SVG turi `min-width: 30rem`), takelis išsitempia iki 480px, ir scrolleris
     lieka be ko slinkti: `clientWidth` sutampa su `scrollWidth`. Anksčiau to
     nebūdavo tik todėl, kad `overflow-x: auto` stovėjo ant pačios kortelės. */
  .fp-card { overflow-x: visible; min-width: 0; }
  .fp-scroll { overflow-x: auto; min-width: 0; }
  /* Galioja ir kiemo (og) lapui: 30rem (480px) duoda 0,48px vienetui, tad D
     paviljonas yra 60 × 192px lietimo taikinys, o 19px užrašai — 9px. Be
     minimumo 350px lange lapas būtų 241px aukščio, o užrašai 6,6px. */
  .fp-svg { min-width: 30rem; }
  /* .7rem = tokenų grindys (--fs-label-xs, 11.2px) — .68rem jas pažeidė (ds-06). */
  .stack-framed .hall-counter { right: 6%; top: 6%; font-size: var(--fs-label-xs); padding: .25rem .6rem; }
}

/* ==========================================================================
   GALLERY (/erdves/) — dark wine gallery with a two-way floor plan.
   Photos carry no notched frame here (client correction): the transition is the
   same scale-out/scale-in as the home scrollytelling, but full-bleed.
   Accent text on wine uses --sky, not --rust: rust on wine fails AA.
   ========================================================================== */
/* The gallery header is the same component on wine. The sheet below it is also
   wine, so `.sheet`'s rounded top corners would show the white page through as
   two notches, and its -1.75rem lift would pull the control bar into the lead.
   Same tone, so: no radius, no lift. */
.gal-hero { padding-bottom: clamp(2rem, 4vw, 3rem); }
.gal-hero + .sheet { border-radius: 0; margin-top: 0; }
.gal-eyebrow { color: var(--sky); font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-wide); }
.gal-title { color: #fff; margin-top: 1.25rem; }
.gal-lead { color: rgba(208, 223, 221, .74); margin-top: 1.4rem; }
.gal-hint { margin-top: 2.5rem; font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label); color: rgba(208, 223, 221, .55); }

.gal-sheet { background: var(--wine); color: var(--sage); }
/* Sits inside .gal-sticky so seating layout + guest count stay on screen. */
/* Full-width sticky control bar above the gallery grid. --gal-bar is the height the
   media column has to clear so the two never overlap. */
/* Registruotas, kad būtų animuojamas: telefone main.js perjungia jį tarp išmatuoto
   aukščio ir 0 (juostos pasitraukimas, žr. mobilų bloką), o su @property tas skydo
   pakilimas yra perėjimas, ne šuolis. Nepalaikančioje naršyklėje reikšmė veikia kaip
   ir anksčiau, tik be perėjimo. */
@property --gal-bar { syntax: "<length>"; inherits: true; initial-value: 0px; }
.gal-viewer { --gal-bar: 7rem; } /* fallback; main.js measures the real height */
.gal-config { position: sticky; top: 4.5rem; z-index: 12; background: var(--wine); overflow-x: clip;
  margin-bottom: 1.4rem; padding: .85rem 0 .9rem; border-bottom: 1px solid rgba(208, 223, 221, .18); }
/* One line: labels sit inline with their controls and the whole strip scrolls
   sideways if it runs out of room, so the plan keeps its share of the screen. */
.gal-config-row { display: flex; align-items: center; flex-wrap: nowrap; gap: 1rem; min-width: 0; overflow-x: auto; scrollbar-width: none; padding-bottom: .2rem; }
.gal-config-row::-webkit-scrollbar { display: none; }
/* Scroll affordance (MOB-04): scrollbar paslėptas sąmoningai, tad kai juosta
   netelpa, dešinį kraštą žymi wine gradiento blukinimas — ta pati sutartis kaip
   .table-frame.is-scrollable. Klasę uždeda tas pats main.js matuoklis. */
.gal-config.is-scrollable::after {
  content: ""; position: absolute; top: .55rem; right: 0; height: 3rem; width: 3rem;
  background: linear-gradient(90deg, rgba(37, 18, 22, 0), var(--wine) 80%);
  pointer-events: none; z-index: 3;
}
/* Hint eilutė + nuoroda į užklausos formą vienoje eilėje (kr-03). */
.gal-config-hint-row { display: flex; align-items: baseline; justify-content: space-between; gap: .3rem 1.25rem; flex-wrap: wrap; }
.gal-config-hint-row .gal-config-hint { flex: 1 1 16rem; }
.gal-config-enquire { display: inline-flex; align-items: center; min-height: 44px; color: var(--sky); font-size: .85rem; font-weight: 600; text-decoration: none; white-space: nowrap; }
.gal-config-enquire:hover { text-decoration: underline; text-underline-offset: 4px; }
.gal-config-field { display: flex; align-items: center; gap: .65rem; flex: 0 0 auto; min-width: 0; }
.gal-config-sep { flex: 0 0 auto; width: 1px; align-self: stretch; background: rgba(208, 223, 221, .18); }
.gal-config-label { flex: 0 0 auto; white-space: nowrap; font-family: var(--font-mono); font-size: var(--fs-label-xs); letter-spacing: var(--ls-label); color: rgba(208, 223, 221, .6); }
.gal-config-hint { margin-top: .9rem; font-size: .85rem; line-height: 1.5; color: var(--sage); min-height: 1.5em; }
/* Lipnus mobile CTA gyvena tik mobile bloke žemiau; visur kitur jo nėra. */
.gal-cta-float { display: none; }

/* Tabs/chips are authored for light sheets — restate them on wine. */
.gal-config .mode-tabs, .gal-config .size-chips { flex-wrap: nowrap; }
/* ≥900px pelė neturi kaip pasiekti paslėpto horizontalaus scroll (scrollbar
   išjungtas sąmoningai, MOB-04), todėl svečių įvedimo laukas likdavo už
   dešiniojo krašto. Darbalaukyje juosta lūžta į antrą eilutę — sticky aukštį
   main.js išsimatuoja pats (--gal-bar), o krašto fade užgęsta savaime, nes
   matuoklis nebemato scrollWidth > clientWidth. Mobile elgsena nesikeičia. */
@media (min-width: 900px) {
  .gal-config-row { flex-wrap: wrap; overflow-x: visible; }
  .gal-config .mode-tabs, .gal-config .size-chips { flex-wrap: wrap; }
}
.gal-config .mode-tab, .gal-config .size-chip { flex: 0 0 auto; padding: .4rem .8rem; font-size: .8rem; }
.gal-config .mode-tab { color: var(--sage); border-color: rgba(208, 223, 221, .34); }
.gal-config .mode-tab:hover { border-color: var(--sage); }
.gal-config .mode-tab[aria-pressed="true"] { background: var(--sage); border-color: var(--sage); color: var(--wine); }
.gal-config .size-chip { color: var(--sky); border-color: rgba(224, 122, 60, .55); }
.gal-config .size-chip:hover { background: rgba(224, 122, 60, .12); border-color: var(--sky); }
.gal-config .size-chip[aria-pressed="true"] { background: var(--rust); border-color: var(--rust); color: #fff; }
/* Rectangle with an underline, not a pill. Among three round size chips the pill made
   this input read as a fourth, disabled filter (client correction #9). */
/* 1rem (16px), ne .85rem: iOS Safari auto-zoom'ina fokusuojant bet kurį input
   <16px — sticky juostoje tai išmuša visą scrollytelling (MOB-05). */
.gal-config .guest-field { flex: 0 0 auto; background: transparent; border: 0; border-bottom: 2px solid rgba(208, 223, 221, .35); color: #fff; border-radius: 0; padding: .4rem .3rem; min-height: 44px; width: 4.5rem; font-size: 1rem; text-align: center; }
.gal-config .guest-field::placeholder { color: rgba(208, 223, 221, .4); }
.gal-config .guest-field:hover { border-bottom-color: rgba(208, 223, 221, .6); }
.gal-config .guest-field:focus { border-bottom-color: var(--sky); outline: none; box-shadow: 0 2px 0 0 var(--sky); }
/* On the dark config bar the shared --steel is too dark to read (2.6:1). */
.gal-config .guest-label, .gal-config .chip-sep { color: rgba(208, 223, 221, .62); }
.gal-config .chip-sep { background: rgba(208, 223, 221, .22); }

/* ---- viewer grid ----
   Scoped to .gal-viewer on purpose. Unscoped, these two lines redefined EVERY
   .gal-grid on the site: from 900 px up the partner, gastronomy and hall grids
   silently became "320 px + rest" with a 3.5rem gap, so their tiles were equal
   below 900, lopsided between 900 and 1100, and equal again above it. */
/* Ši paraštė guli PO --gal-tail atsarga ir nieko nelaiko — grynas tarpas prieš
   „TOLIAU“ sekciją, kurios pačios padding-top yra 0 (.gal-index-sheet užlipa ant
   šitos 28px per .sheet margin-top). Todėl 3rem čia buvo dviguba tuštuma. */
/* overflow-anchor: none — kliento pastaba #4. Kai svečių filtras uždeda
   `display: none` keliems žingsniams, Chrome „scroll anchoring" pats pastumia
   slinktį (išmatuota: −183px vienu paspaudimu), ir tai vyksta TOJE PAČIOJE
   layout'o fazėje, kurioje mes matuojame inkarą — mūsų grąžinimą jis paskui
   atšaukdavo. Naršyklės automatika čia nereikalinga: inkarą laikom patys
   (anchorRead/anchorRestore main.js), ir tik mes žinom, KURIS žingsnis yra
   skaitomas. */
.gal-viewer { padding-bottom: 1.5rem; overflow-anchor: none; }
.gal-viewer .gal-grid { display: flex; flex-direction: column; }
@media (min-width: 900px) { .gal-viewer .gal-grid { display: grid; gap: 3.5rem; grid-template-columns: minmax(320px, 38%) 1fr; } }

/* --gal-tail — tuščia atsarga po paskutiniu žingsniu.
   ISTORIJA: kol main.js skaitymo linija buvo plokšti 0,55 lango, atsarga buvo
   nešanti konstrukcija — be ~290px paskutinis žingsnis nespėdavo tos linijos
   pasiekti, ir 16-oji nuotrauka niekada neužsidėdavo. 2026-08-15 lineY() jau
   skaičiuoja liniją nuo prilipusio skydo apačios (p.bottom + (h − p.bottom) ×
   0,55), tad linija stovi daug žemiau ir žingsnis ją kerta anksčiau.
   PERMATUOTA (Playwright, po 30–40px, 1440×900, 1440×700, 1024×760, 390×844,
   320×700, juosta ir atversta, ir pasitraukusi): visi 16 žingsnių aktyvuojasi ir
   nuotrauka matoma net prie --gal-tail: 0. Grindų nebėra — atsarga nebeperka
   teisingumo, ji perka tik paskutinės nuotraukos „pastovėjimą“ ekrane.
   Tas pastovėjimas trumpiausias siaurame aukštame lange 1440×700, kur jis lygus
   pačiai atsargai 1:1 (376px → 360px, 160 → 160, 40 → 40). Vidutinis žingsnis
   gauna ~47px, tad 4vh+6rem (≈124–132px) palieka paskutinei nuotraukai maždaug
   tris eilinio žingsnio dozes ir nuima 244px tuščio vyno prieš „TOLIAU“. */
/* 2026-08-31 (kliento pastaba #2 — „puslapis pradeda judėti žemyn, kai dar ne
   visas tekstas aiškiai praeina"): atsarga pakelta nuo 4vh+6rem (~130px) iki
   ~26vh. Atsarga YRA paskutinio žingsnio skaitymo laikas: kol ji nesibaigė,
   `.gal-sticky` dar prilipęs ir nuotrauka stovi vietoje. Su senąja verte
   paskutinis parašas kirsdavo skaitymo liniją beveik tuo pačiu metu, kai
   skydas jau pradėdavo slinkti pro viršų. */
/* 2026-08-31, ta pati pastaba antru ratu („šitos fotkės VIS DAR skrolinasi į
   apačią be strigimo") — 26vh nepakako, ir dabar aišku kodėl. `fitTail()` rašo
   `max(šitos grindys, poreikis)`, o poreikis prie 1440×900 buvo 167px, t. y.
   MAŽESNIS už 234px grindis: skaičiuojama reikšmė iš viso nedalyvavo, viską
   lėmė šita eilutė. Todėl pakelti reikėjo abu galus — `fitTail()` gavo `dwell`
   dėmenį (žr. main.js), o grindys keliamos 26vh → 34vh. Išmatuota 1440×900:
   251px prieš 306px, tad paskutinė nuotrauka pastovi ~72px ilgiau nei anksčiau.
   Lubos 22rem saugo aukštus langus nuo tuščio vyno juostos prieš „TOLIAU". */
/* --gal-tail-css yra GRINDYS; tikrąją reikšmę main.js `fitTail()` perrašo į
   max(šitų grindų, išmatuoto poreikio) inline stiliumi, nes poreikis priklauso
   nuo prilipusio skydo aukščio, kuris kinta su kalba, langu ir aukšto planu. */
.gal-steps { position: relative; order: 2; padding-left: 1.5rem; min-width: 0; --gal-rail: 1.5rem; --gal-rail-in: 9px; --gal-tail-css: clamp(11rem, 34vh, 22rem); --gal-tail: var(--gal-tail-css); padding-bottom: var(--gal-tail); }
@media (min-width: 900px) { .gal-steps { order: 1; padding-left: 2rem; --gal-rail: 2rem; } }
/* Juosta baigiasi ties turiniu, ne ties atsargos apačia — kitaip ji nubrėžia
   tuščią stulpelį ir tas tarpas atrodo kaip dar viena sekcija. */
/* --gal-rail-in: juosta pastumta 9px nuo `.wrap` krašto SĄMONINGAI.
   Ties 0 juostos linija sutapdavo su prilipusios `.gal-config` kairiu kraštu, o
   žymos aplink ją yra platesnės už pačią liniją ir kyšo į KAIRĘ: aktyvi dobilo
   žyma −7,5px (12px × 1,25 / 2), skaitymo linijos brūkšnys −6px. Ta kyšanti dalis
   likdavo už juostos fono, tad slenkant ženklai švysčiodavo VIRŠ konfigūracijos
   juostos (kliento pastaba). 9px > 7,5px — visos žymos telpa į juostos foną ir
   dingsta po ja. Keičiant žymos dydį ar `scale` — permatuoti ir šitą skaičių. */
.gal-progress { position: absolute; left: var(--gal-rail-in); top: 1rem; bottom: calc(var(--gal-tail) + 1rem); width: 2px; background: rgba(208, 223, 221, .2); }
.gal-progress .scrolly-progress-fill { display: block; width: 100%; background: var(--sky); height: 0; }
/* P27 „mažiau scrollinti": antraštiniai žingsniai sudarė 69 % galerijos slinkimo.
   Mažinam tarpus ir antraštės dydį — nuotrauka ir planas nekeičiami.
   3,5vh (31,5px iš abiejų pusių) reiškė 63px tuštumos tarp dviejų vienos eilutės
   parašų — tekstas atrodė išbarstytas. 2,4vh duoda 43px: ritmas susitraukia,
   bet vienas žingsnis vis dar turi ~67px slinkimo, tad nuotraukos nesikeičia
   serijomis. */
/* 2026-08-31 („increase the scroll distance between photos a bit"): 2,4vh davė
   ~43px tarp dviejų žingsnių — nuotraukos keisdavosi beveik viena po kitos.
   6,6vh duoda ~119px, tad kiekvienas kadras gauna daugiau slinkimo, o P27 ritmas
   (antraštės nedidinamos, planas nekeičiamas) lieka.
   Paraštė gyvena kintamajame, nes ties ja stovi ŽYMA — žr. .gal-step::before. */
.gal-step { --gal-step-pad: clamp(2.6rem, 6.6vh, 4rem); padding: var(--gal-step-pad) 0; }

/* Vien parašo žingsniai (šablono `{% else %}` šaka — vienas <p class="gal-step-caption">)
   yra vienos eilutės, ~24px teksto. Su bendru žingsnio padding'u jie stovėjo po 67px
   vienas nuo kito — parašas plaukiojo tuštumoje. Antraštiniai blokai (eyebrow + display
   + tekstas + .gal-meta) tokio tarpo nusipelno, parašai — ne, todėl atskiriam juos
   `:has()` (nepalaikančioje naršyklėje lieka bendra reikšmė — nieko nesulūžta).

   Žingsnio aukštis YRA slinkimo atstumas, per kurį ta nuotrauka spėja pasirodyti.
   Grindys — 44px: išmatuota Playwright'u (skenuota po 40px ties 1440×900, 1440×700,
   1024×760 ir 390×844), kad ties 40px žingsniai jau pradeda kristi po vieną.
   Bet 47px (senasis .7rem) buvo grindys, ne norma: būtent šitie parašo žingsniai
   rodo TAS PAČIAS erdves kitu paros metu, ir prašuoliuoti juos buvo per lengva
   („the in-between pictures are easy to miss", 2026-08-31). 2,8rem duoda ~113px —
   trigubai daugiau slinkimo negu antraštinis kaimynas jų kainuoja, tad tarpinis
   kadras spėja būti pamatytas. Mažinti žemiau 44px reikštų prarasti nuotraukas. */
.gal-step:has(> .gal-step-caption) { --gal-step-pad: 2.8rem; }

/* ---- Kodėl čia NĖRA `min-height` -----------------------------------------
   2026-08-31 vakaras, du žingsniai. Pirmas: „the single scroll skips a photo…
   make it even more deliberate" — trumpi parašo žingsniai (113–149px) kainavo
   mažiau nei vieną ratuko spragtelėjimą, nes scroll-snap perjungia praėjus pusę
   atstumo iki kitos stotelės, o tas atstumas yra žingsnio AUKŠTIS. Tada čia
   stovėjo `min-height: clamp(18rem, 40vh, 28rem)` ir tarpai suvienodėjo ties
   348–470px. Antras: „the gaps shown are too big, theyre huge, shrink them" —
   po vienos eilutės parašu likdavo ~300px tuštumos.

   Abu norai vienu metu per CSS neišsprendžiami: kol slinkimo kaina YRA tarpas,
   didesnė kaina reiškia didesnę tuštumą. Kurį laiką kaina buvo iškelta į ratuko
   kaupiklį (main.js „spragtukas"), bet 2026-08-25 operatorius jo atsisakė —
   slinkimas per galeriją turi būti laisvas, be perėmimo (žr. main.js „Laisvas
   slinkimas"). Tarpai lieka ankstesniame, jau suderintame ritme (žr. P27
   komentarą aukščiau). Nekišti `min-height` atgal: jis grąžins tuštumą po
   vienos eilutės parašais, o dabar, kai niekas slinkimo neperima, jokios
   „kainos" tuo ir nepakeisi. */
/* .55, ne .32: pritemdyti žingsniai lieka viewport'e kartu su aktyviu, todėl
   turi likti perskaitomi (A11Y-07). Aktyvus vis tiek aiškiai išsiskiria. */
.js-focus .gal-step { opacity: .55; transition: opacity .4s ease; }
.js-focus .gal-step.step-active { opacity: 1; }
.gal-step-eyebrow { font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label); color: var(--sky); }
.gal-step-title { color: #fff; margin-top: .7rem; font-size: var(--fs-display-md); }
.gal-step-body { margin-top: .8rem; color: rgba(208, 223, 221, .78); font-size: .95rem; line-height: 1.65; max-width: 30rem; }
.gal-step-caption { color: rgba(208, 223, 221, .66); font-size: .92rem; line-height: 1.6; max-width: 28rem; }
.gal-step-more { margin-top: .9rem; font-size: .9rem; }
.gal-step-more .link-volt { color: var(--sky); }
.gal-meta { display: flex; flex-wrap: wrap; gap: .9rem 1.5rem; margin-top: 1.1rem; }
.gal-meta-item dt { font-family: var(--font-mono); font-size: var(--fs-label-xs); letter-spacing: var(--ls-label); color: rgba(208, 223, 221, .55); }
.gal-meta-item dd { margin: .2rem 0 0; font-family: var(--font-display); font-size: var(--fs-stat-sm); color: #fff; letter-spacing: -0.02em; }

/* ---- Skaitymo linija ir žingsnių žymos (kliento pastaba #1) -----------------
   „Ne visur vienodas indikatorius prie teksto, kodėl tekstas ir nuotrauka
   keičiasi žemiau nei yra linija?"

   Priežastis: buvo DVI skirtingos linijos. Juostos užpildą varė atskiras
   ScrollTrigger (`top 60%` → `bottom 60%`), o žingsnį ir nuotrauką perjungdavo
   main.js `lineY()` (0,55 lango, o telefone dar žemiau — nuo prilipusio skydo
   apačios). Todėl matoma linija ir tikroji riba stovėdavo skirtingose vietose.

   Dabar užpildo ilgį rašo tas pats `lineY()`, tad užpildo GALAS visada stovi
   ties ta pačia riba, kurią kerta žingsnio viršus. Riba turi matomą žymeklį
   (brūkšnys + taškas), o KIEKVIENAS žingsnis gauna vienodą kvadratėlį ties savo
   viršumi — t. y. ties savo perjungimo tašku. Iki šiol jokios žymos nebuvo, tik
   permatomumas, ir „indikatorius" atrodė skirtingas ties antraštiniais ir ties
   parašo žingsniais.

   Daltonizmas: aktyvumas neneša vien spalvos — kvadratėlis užsipildo (plotas)
   ir paauga (forma), o žingsnio tekstas lieka pilno ryškumo (šviesa). */
.gal-progress .scrolly-progress-fill { position: relative; }
.gal-progress .scrolly-progress-fill::after {
  content: ""; position: absolute; left: -6px; bottom: -1px; width: 14px; height: 2px; background: #fff;
}
.gal-progress .scrolly-progress-fill::before {
  content: ""; position: absolute; left: -4px; bottom: -5px; width: 10px; height: 10px;
  border-radius: 50%; background: var(--sky); border: 2px solid var(--wine);
}
.gal-step { position: relative; }
/* Žyma yra TZ DOBILAS, ne kvadratėlis (2026-08-31 user directive „can the tag be
   a clover to match the design"). Ta pati `--tz-mask` figūra, kuria svetainėje
   rėminamos nuotraukos ir per kurią atsiveria galerijos kadras — tik 12×9 px.
   Šitame dydyje dobilo įpjovos yra submikroninės (80 vnt. ≈ 1 px), tad skaitosi
   siluetas: nuožulnūs šonai, ne logotipas. Todėl žyma sąmoningai gulsčia (12×9) —
   taip ji nešioja ženklo proporciją, o ne virsta apvaliu tašku.

   DU sluoksniai vietoj vieno, nes su viena kauke tektų rinktis: arba tuščiaviduris
   ženklas (pro jį prasišviečia juostos linija), arba pilnas (dingsta ramybės/
   aktyvumo skirtumas). ::before yra PLOKŠTELĖ (pilnas dobilas, wine) — ji uždengia
   po ja einančią liniją; ::after — KONTŪRAS. Spalvos lieka CSS'e, nes forma ateina
   per `mask`, o ne per įpieštą fill (ta pati sutartis kaip mygtukų dobile).

   Daltonizmas nepakito: aktyvumas ir toliau neša du nespalvinius signalus —
   plokštelė užsipildo (plotas) ir visa žyma paauga (dydis). */
.gal-step::before, .gal-step::after {
  content: ""; position: absolute;
  left: calc(var(--gal-rail, 1.5rem) * -1 + var(--gal-rail-in, 9px) - 5px);
  top: calc(var(--gal-step-pad, 2.6rem) + var(--gal-step-mark, .62rem) - 4.5px);
  width: 12px; height: 9px;
  -webkit-mask-size: 100% 100%; mask-size: 100% 100%;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  transition: background-color .25s ease, transform .25s ease;
}
/* Žyma stovi ne ties žingsnio DĖŽĖS viršumi, o ties jo pirmos teksto eilutės
   VIDURIU. Trys dėmenys, ir kiekvienas turi savo priežastį:
     --gal-step-pad   — tas pats skaičius, kurį žingsnis turi kaip padding-top
                        (dėžės viršus yra iki 3rem VIRŠ teksto, todėl matuojant nuo
                        jo perjungimas įvykdavo, kai tekstas dar buvo po linija);
     --gal-step-mark  — pusė pirmos eilutės line-height'o. Eilutės viršus dar nėra
                        „ties tekstu": prie 1,6 tarpo tarp eilutės viršaus ir raidžių
                        lieka ~5px pusinio tarpo, ir akis tą matė kaip žymą virš
                        teksto. Reikšmę įrašo main.js (`markOffset`) inline stiliumi
                        — IŠMATUOTĄ, ne atspėtą, tad ji galioja bet kokiam šriftui ir
                        bet kokiam mobiliam perrašymui; čia paliktas tik atsarginis
                        .62rem tam atvejui, kai JS neįvyko;
     −4,5px           — pusė 9px aukščio žymos, kad ji būtų CENTRUOTA ant ribos.
   JS pusėje ta pati riba skaičiuojama iš tų pačių dėmenų (`stepTop` main.js), tad
   žyma, progreso juostos galas ir perjungimas yra vienas ir tas pats taškas.
   Skaitymo linijos taškas irgi centruotas ant savo ribos (`bottom: -5px`). */
.gal-step::before {
  background: var(--wine);
  -webkit-mask-image: var(--tz-mask); mask-image: var(--tz-mask);
}
.gal-step::after {
  background: rgba(208, 223, 221, .45);
  -webkit-mask-image: var(--tz-mask-line); mask-image: var(--tz-mask-line);
}
.gal-step.step-active::before,
.gal-step.step-active::after { background: var(--sky); transform: scale(1.25); }

/* ---- Kadro parašas ir skaitliukas: „kodėl nuotrauka pasikeitė?" -------------
   Kliento pastaba #3: „Nuotrauka slenkant puslapį turi keistis vėliau; galbūt
   tai turėtų būti labiau išryškinta, nes dabar neaišku, kodėl nuotrauka
   pasikeičia."

   Parašas iki šiol gyveno tik kairiame teksto stulpelyje — akis, žiūrinti į
   nuotrauką, pasikeitimo paaiškinimo nematė. Dabar tas pats parašas (jokio
   naujo teksto: imamas iš `data-lb-cap`) rodomas ant paties kadro kartu su
   numeriu, ir kiekvieno perjungimo metu įvažiuoja iš naujo — pasikeitimas turi
   ir judesio, ir teksto, ir skaičiaus signalą, ne vien kitą vaizdą.
   Statiškai (be judesio nuostatos) lieka teksto + skaičiaus pasikeitimas. */
.gal-cap {
  position: absolute; left: 0; right: 0; bottom: 0; z-index: 9;
  display: flex; align-items: baseline; gap: .7rem;
  padding: 2.2rem .9rem .85rem; padding-right: 3.8rem;
  background: linear-gradient(180deg, rgba(20, 9, 11, 0), rgba(20, 9, 11, .86) 46%);
  color: #fff; font-size: .88rem; line-height: 1.45; pointer-events: none;
}
.gal-cap-n { flex: 0 0 auto; font-family: var(--font-mono); font-size: .75rem; letter-spacing: var(--ls-label-wide); color: var(--sky); }
.gal-cap-t { min-width: 0; }
@media (prefers-reduced-motion: no-preference) {
  .gal-cap.is-new .gal-cap-n, .gal-cap.is-new .gal-cap-t { animation: galCapIn .42s cubic-bezier(.22, .8, .3, 1) both; }
  .gal-cap.is-new .gal-cap-t { animation-delay: .05s; }
  .gal-counter.is-new { animation: galCountPop .42s ease both; }
}
@keyframes galCapIn { from { opacity: 0; transform: translateY(9px); } to { opacity: 1; transform: none; } }
@keyframes galCountPop { 0% { transform: scale(1); } 34% { transform: scale(1.2); } 100% { transform: scale(1); } }

/* ---- Salės faktai po kadru (kliento pastaba #5 — pasakyta du kartus) --------
   „Turi keistis ir salių informacija galerijoje."

   Iki šiol išdėstymo mygtukai keisdavo tik salių rodyklės korteles trimis
   ekranais žemiau ir vieną eilutę po valdymo juosta. Dabar erdvės vardas,
   plotas ir PASIRINKTO išdėstymo talpa stovi po pačiu kadru — ten, kur žiūri
   akis, ir iš karto šalia valdiklių (kliento pastaba #6 apie valdiklių vietą).
   Skaičiai imami iš halls.json per window.__HALLS__; jei tam išdėstymui salė
   skaičiaus neturi, rodoma gallery.json `planLabels.capsUnknown` formuluotė —
   nieko neprasimanoma.
   min-height — kad perrašius tekstą nešoktų maketas. */
.gal-facts {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: .25rem 1.1rem;
  margin-top: .9rem; padding: .7rem .85rem; min-height: 4.6rem;
  border: 1px solid rgba(208, 223, 221, .2); background: rgba(208, 223, 221, .05);
}
/* Vardas — visa eilutė. Jei jis dalintųsi eilute su plotu ir talpa, ilgesnis
   vardas („Oranžerija + Kiemas D") lūžtų į dvi eilutes ir skydo aukštis kistų
   nuo žingsnio prie žingsnio — o nuo skydo aukščio priklauso ir atsargos
   matematika (fitTail), ir dokumento aukštis. Pastovus aukštis > tankumas. */
.gal-facts-name { flex: 1 0 100%; min-width: 0; font-family: var(--font-display); font-size: 1.05rem; line-height: 1.2; color: #fff; letter-spacing: -0.02em; }
.gal-facts-area { flex: 0 0 auto; font-family: var(--font-mono); font-size: .78rem; letter-spacing: var(--ls-label); color: rgba(208, 223, 221, .72); }
.gal-facts-cap { flex: 0 0 auto; font-family: var(--font-display); font-size: 1.45rem; line-height: 1; color: var(--sky); letter-spacing: -0.02em; }
.gal-facts-cap.is-soft { font-size: .88rem; font-family: var(--font-body); color: rgba(208, 223, 221, .8); }
.gal-facts-mode { flex: 1 0 100%; font-family: var(--font-mono); font-size: .75rem; letter-spacing: var(--ls-label); text-transform: uppercase; color: rgba(208, 223, 221, .65); }
@media (prefers-reduced-motion: no-preference) {
  .gal-facts.is-new { animation: galCapIn .34s ease both; }
}
/* Telefone skydas (nuotrauka + faktai + planas) yra prilipęs ir atima iš lango
   tiek, kiek užima — todėl čia faktai suspaudžiami į vieną vingiuojančią eilutę,
   o parašo juostos gradientas plonesnis. Skydo aukščio matematika (--gal-bar,
   skaitymo linija nuo skydo apačios) nuo to nesikeičia: main.js matuoja jį
   gyvai, ne pagal įrašytą skaičių. */
@media (max-width: 899px) {
  /* Viena eilutė be dėžutės: prilipęs skydas telefone jau atima nav + juostą +
     34svh kadrą + planą, ir kiekvienas pridėtas pikselis ateina iš skaitomo
     teksto. Plotas čia išimtas sąmoningai — jis yra to paties žingsnio
     .gal-meta eilutėje, o dubliuoti jį už 26px nevertėtų. */
  .gal-facts { margin-top: .5rem; padding: .4rem 0 0; min-height: 0; gap: 0 .7rem; border: 0; border-top: 1px solid rgba(208, 223, 221, .2); background: none; }
  .gal-facts-name { flex: 0 1 auto; font-size: .92rem; }
  .gal-facts-area { display: none; }
  .gal-facts-cap { font-size: 1.05rem; }
  .gal-facts-mode { flex: 0 1 auto; align-self: center; }
  .gal-cap { padding: 1.5rem .7rem .6rem; padding-right: 3.4rem; font-size: .82rem; }
  .gp-legend { margin-top: .6rem; gap: .25rem .8rem; }
}
/* Iki 700px planas gyvena horizontaliame scrolleryje (gp-svg min-width 36rem),
   tad legenda ten nuslinktų kartu su brėžiniu. Tą pačią informaciją telefone
   neša .gal-facts eilutė, kuri stovi UŽ scrollerio ribų. */
@media (max-width: 700px) { .gp-legend { display: none; } }

/* ---- Plano legenda (kliento pastaba #8 — „kodėl paryškintos dvi erdvės?") ---
   Plane vienu metu gali degti kelios patalpos: „B+C" sekcija paryškina abi
   sales. Iki šiol tai nebuvo niekur pasakyta. Legenda tą būseną įvardija, o
   #gpLegendHere gauna dabartinės sekcijos pavadinimą, tad dvigubas
   paryškinimas turi vardą. „Telpa jūsų grupei" eilutė su ✓ iš legendos
   išimta (2026-08-31 user directive), kartu ir .gp-legend-glyph.
   Trečia dalis (#gpLegendCaps) pasako, kokio išdėstymo skaičiai stovi
   dėžutėse — etiketės iš dėžučių išimtos, nes ties „prie stalelių" jos
   netilpdavo ir užlipdavo viena ant kitos (kliento pastaba #10). */
.gp-legend { display: flex; flex-wrap: wrap; gap: .35rem 1.15rem; margin-top: .85rem; font-family: var(--font-mono); font-size: .75rem; letter-spacing: var(--ls-label-tight); color: rgba(208, 223, 221, .74); }
.gp-legend-item { display: inline-flex; align-items: center; gap: .4rem; min-width: 0; }
.gp-legend-swatch { flex: 0 0 auto; width: .7rem; height: .7rem; background: var(--rust); border: 2px solid var(--sky); }
.gp-legend-caps { color: var(--sage); }

/* ---- sticky media ---- */
/* align-self: start is for the desktop grid only — in the mobile column flex it
   controls the cross axis and shrinks the column to the rail's max-content width.
   overflow-x: clip contains the sideways-scrolling control strip; `clip` is the only
   value that pairs with overflow-y: visible and does not break position: sticky. */
.gal-sticky { order: 1; position: sticky; top: calc(4.5rem + var(--gal-bar)); z-index: 10; min-width: 0; overflow-x: clip; }
@media (min-width: 900px) { .gal-sticky { order: 2; top: calc(5.5rem + var(--gal-bar)); align-self: start; } }
/* ---- Skydas privalo tilpti į langą -----------------------------------------
   Iki šiol .gal-sticky aukštis buvo trijų dalių suma (nuotrauka 46vh + faktai +
   planas). Išmatuota 1440×900: skydas 801px, o vietos nuo lipdymo ribos iki lango
   apačios — 629px, tad aukšto planas kyšojo 172px už krašto (1440×700 — 238px).
   Kaip tik planas ir atsakinėja į išdėstymo bei dalyvių pasirinkimą (✓ ir
   pritemdymas ant salių), taigi nematoma likdavo būtent ta dalis, dėl kurios
   mygtukai spaudžiami.
   Dabar skydas turi lubas, o po jomis yra stulpelis: faktų juosta ir planas
   nesitraukia, o nuotrauka pasiima tai, kas lieka. `min-height` — grindys, po
   kurių nuotrauka nebėra nuotrauka; labai žemuose languose skydas vėl gali
   nurėžti plano kraštą, bet daug vėliau nei anksčiau. */
@media (min-width: 900px) {
  .gal-sticky { display: flex; flex-direction: column;
    max-height: calc(100svh - 5.5rem - var(--gal-bar) - 1.25rem); }
  /* Vietos atiduoda pirmiausia nuotrauka — jos clamp(300px, 46vh, 540px) lieka
     norimu dydžiu, tik dabar traukiasi. 180px yra grindys: žemiau nuotrauka
     nebėra nuotrauka. */
  .gal-sticky .gal-stack { flex: 0 1 auto; min-height: 180px; }
  .gal-sticky .gal-facts { flex: 0 0 auto; }
  /* Antra atiduoda brėžinio dėžė. Nukerpama nebus: .gp-svg jau turi
     max-height: 100%, tad viewBox tiesiog sumažinamas. Legenda ir pastaba
     nesitraukia — jos ir taip vienos eilutės. */
  .gal-sticky .gal-plan-wrap { flex: 0 1 auto; min-height: 0; display: flex; }
  .gal-sticky .gal-plan-wrap > .gp { flex: 1 1 auto; min-width: 0; min-height: 0; display: flex; flex-direction: column; }
  .gal-sticky .gp-sheets { flex: 0 1 auto; min-height: 5rem; }
  .gal-sticky .gp-legend, .gal-sticky .gp-note { flex: 0 0 auto; }
}
@media (min-width: 768px) { .gal-config { top: 5rem; } }
/* Nuo 768px nav'as yra 5rem, tad ir juosta lipdoma ties 5rem — o skydas iki šiol
   liko ties 4.5rem ir 768–899px ruože prilipdavo 8px per aukštai: viršutinė
   nuotraukos juostelė stovėjo už juostos (išmatuota: skydo viršus 172,1 vs juostos
   apačia 180,2). Juostai pasitraukus tie 8px atsidurdavo po nav'u. */
@media (min-width: 768px) and (max-width: 899px) { .gal-sticky { top: calc(5rem + var(--gal-bar)); } }
/* --r-sm, ne --r-lg: visos kitos svetainės nuotraukų dėžės (.media-frame,
   .gal-item, .fmt-media, .pcard-media) yra --r-sm, ir galerijos kadras buvo
   vienintelis su 1rem kampu — kliento pastaba „skiriasi nuotraukų rėmeliai,
   palyginus su kitais puslapiais". */
.gal-stack { position: relative; width: 100%; overflow: hidden; border-radius: var(--r-sm); background: #14090b; height: clamp(300px, 46vh, 540px); }
@media (max-width: 899px) { .gal-stack { height: 38svh; } }
.gal-layer { position: absolute; inset: 0; opacity: 0; }
/* Be JS skydas buvo juoda dėžė — pirmas kadras matomas grynu CSS; JS pasižymi
   html.js ir toliau viską valdo per is-active (UX-smulk). Pirmas sluoksnis DOM
   apačioje, tad aktyvusis jį pilnai uždengia — kryžminio blyksnio nėra. */
html:not(.js) .gal-layer:first-child { opacity: 1; }
/* Filtered out by the guest-count picker — removed from the sequence entirely. */
.gal-step.is-out, .gal-layer.is-out { display: none; }
.gal-layer.is-active { opacity: 1; }
.gal-mask { position: absolute; inset: 0; }
.gal-layer img { width: 100%; height: 100%; object-fit: cover; }

/* ---- The photo change opens through the Tech Zity clover ----
   Instead of a cross-fade, the incoming photo is revealed inside the brand mark,
   which grows from the middle of the frame until its notches leave the edges.
   The mark lives in the MOTION only: nothing here applies at rest, so a photo is
   a plain rectangle the moment the tween ends (and always, without JS).

   Growth is driven by counter-scale in main.js — .gal-mask scales up while the
   <img> inside scales down by exactly the same factor, so the photo stands still
   and only the window grows. Both are transforms, so they stay on the compositor;
   animating mask-size instead would repaint the whole 806×540 layer every frame. */
.gal-layer.is-opening {
  z-index: 3;
  /* On the UNSCALED parent, so the rim keeps one width from 10% to 160%. Without
     it the clover edge disappears wherever the two photos are equally bright. */
  filter: drop-shadow(0 0 8px rgba(0, 0, 0, .55));
}
.gal-layer.is-closing { z-index: 2; }
/* --tz-mask-fit, ne --tz-mask: kadro dėžė kinta su langu (56vw × 46vh), tad
   tempiama figūra keitė formą kiekviename plotyje. `xMidYMid meet` įrašo dobilą
   į dėžę nekeisdamas proporcijų — ženklas atrodo vienodai visur, o tai ir buvo
   kliento prašymas išlaikyti proporcijas. */
.gal-layer.is-opening .gal-mask {
  -webkit-mask-image: var(--tz-mask-fit);
  mask-image: var(--tz-mask-fit);
  -webkit-mask-size: 100% 100%;
  mask-size: 100% 100%;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-position: center;
  mask-position: center;
  will-change: transform;
}
.gal-layer.is-opening img { will-change: transform; }
.gal-counter { position: absolute; top: 1rem; right: 1rem; z-index: 10; font-family: var(--font-mono); font-size: var(--fs-label-xs); letter-spacing: var(--ls-label-wide); color: #fff; background: rgba(20, 9, 11, .6); padding: .35rem .8rem; border-radius: 999px; backdrop-filter: blur(4px); }
/* Zoom mygtukas apačioje dešinėje (counteris — viršuje): atidaro aktyvų kadrą
   lightbox'e. 44px taikinys visuose pločiuose. */
.gal-stack-zoom { position: absolute; right: .9rem; bottom: .9rem; z-index: 10; display: inline-flex; align-items: center; justify-content: center; min-width: 44px; min-height: 44px; background: rgba(20, 9, 11, .6); color: var(--sage); border: 1px solid rgba(208, 223, 221, .35); border-radius: 999px; cursor: zoom-in; backdrop-filter: blur(4px); transition: background .2s ease, border-color .2s ease; }
.gal-stack-zoom:hover { background: rgba(20, 9, 11, .85); border-color: var(--sage); }
.gal-stack-zoom:focus-visible { outline: 2px solid var(--sky); outline-offset: 2px; }

/* ---- floor plan ---- */
.gal-plan-wrap { margin-top: 1.1rem; }
/* Fiksuoto aukščio dėžė visiems trims brėžiniams. Trys aukštai turi skirtingus
   viewBox santykius (1000×420 / 1000×300 / 1000×240), tad be jos kiekvienas
   automatinis aukšto perjungimas keitė prilipusio skydo aukštį — o su juo ir
   dokumento aukštį, ScrollTrigger ribas bei slinkties inkarą. Būtent tai ir
   buvo dalis „nelogiško šokinėjimo". */
.gp-sheets { height: clamp(7rem, 21vh, 12.5rem); display: flex; align-items: center; justify-content: center; }
/* width: auto (ne 100%): su `width: 100%` Chromium tik apkarpo AUKŠTĮ per
   max-height, o dėžė lieka viso stulpelio pločio — brėžinys joje guli
   letterbox'u, ir viskas, kas viewBox'e už lango krašto (a1 kontūro ir kiemo
   juostos galai, 2026-09-02), matosi paraštėse. Su `width: auto` dėžė
   skaičiuojama iš apkarpyto aukščio per santykį (išmatuota 1440×900: og 196,
   a1 200, a2 633 px) ir viewBox'as kerpa tiksliai ties langu. */
.gp-svg { display: none; width: auto; max-width: 100%; height: auto; max-height: 100%; margin-inline: auto; }
.gp-svg.is-active { display: block; }
/* --gp-k: kiekvienas lapas ekrane susitraukia savaip (og 2,7× labiau už a2, nes
   `.gp-sheets` riboja aukštį, o proporcijos tikros ir skirtingos). Todėl VISI
   šrifto ir linijos dydžiai brėžinyje dauginami iš lapo daugiklio — kitaip og
   užrašai išeina 4–5 px, o sienų linijos 0,4 px. Reikšmę įrašo šablonas iš
   planGeometry (k — iš tikro mastelio etaloninėje 600 × 200 px dėžėje,
   normuota į a2; žr. build-plan-geometry.mjs). */
.gp-shell { fill: none; stroke: rgba(208, 223, 221, .3); stroke-width: calc(2px * var(--gp-k, 1)); }
.gp-rect { fill: rgba(208, 223, 221, .07); stroke: rgba(208, 223, 221, .3); stroke-width: calc(1.5px * var(--gp-k, 1)); transition: fill .3s ease, stroke .3s ease; }
.gp-svc { fill: rgba(208, 223, 221, .03); stroke-dasharray: calc(5px * var(--gp-k, 1)) calc(4px * var(--gp-k, 1)); }
/* Laiptų ženklas: pakopos + eigos linija su rodykle (2026-09-01 vakaras, „improve
   the displayed stairs image"). Pakopos dabar tankios (0,42 m) ir plonos — jos
   tik tekstūra; ženklą „laiptais" padaro `.gp-walk` rodyklė, todėl ji ryškesnė
   ir su apvaliais galais, kad galvutė nesusilietų su pakopomis. Lifto dėžutės
   (`.gp-lift`) nebėra nė viename lape (a2 — 2026-09-01, a1 — 2026-09-02,
   kliento kryžiai), taisyklė ištrinta kartu. */
.gp-steps { fill: none; stroke: rgba(208, 223, 221, .38); stroke-width: calc(.9px * var(--gp-k, 1)); }
.gp-walk { fill: none; stroke: rgba(208, 223, 221, .78); stroke-width: calc(1.5px * var(--gp-k, 1)); stroke-linecap: round; stroke-linejoin: round; }
.gp-stage { fill: rgba(208, 223, 221, .2); stroke: none; pointer-events: none; } /* virš salės, tad skaidri lietimui */
.gp-outdoor { fill: rgba(224, 122, 60, .07); stroke-dasharray: calc(6px * var(--gp-k, 1)) calc(5px * var(--gp-k, 1)); }
.gp-code { font-family: var(--font-display); font-size: calc(34px * var(--gp-k, 1)); fill: #fff; text-anchor: middle; letter-spacing: -0.02em; }
.gp-code.gp-sm { font-size: calc(19px * var(--gp-k, 1)); }
/* Kontekstinės patalpos pavadinimas (kiemo lapo 1A patalpos, 2026-09-04): tas pats
   display šriftas, bet prislopintas — baltas jis ginčytųsi su „Oranžerija". */
.gp-code.gp-muted { fill: rgba(208, 223, 221, .8); }
.gp-area { font-family: var(--font-mono); font-size: calc(15px * var(--gp-k, 1)); fill: rgba(208, 223, 221, .72); text-anchor: middle; letter-spacing: var(--ls-label-tight); }
.gp-area.gp-xs { font-size: calc(12px * var(--gp-k, 1)); }
.gp-stage-t { fill: rgba(37, 18, 22, .85); pointer-events: none; }
/* .gp-link / .gp-go ištrinti kartu su brėžinio nuoroda į Gastroles: restoranas
   nebėra išimtis, o punktyrinis rėmelis ir „Atidaryti ↗" buvo vieninteliai jos
   ženklai (2026-08-31). Visi paspaudžiami kambariai dabar atrodo vienodai. */
.gp-clickable { cursor: pointer; }
.gp-clickable:hover .gp-rect { fill: rgba(208, 223, 221, .16); stroke: var(--sage); }
.gp-room:focus-visible { outline: 2px solid var(--sky); outline-offset: 2px; }
.gp-room.fit .gp-rect { stroke: var(--sky); stroke-width: calc(3.5px * var(--gp-k, 1)); fill: rgba(224, 122, 60, .16); }
.gp-room.dim { opacity: .3; }
.gp-room.is-current .gp-rect { fill: var(--rust); stroke: var(--sky); stroke-width: calc(2.5px * var(--gp-k, 1)); }
.gp-room.is-current .gp-area { fill: rgba(255, 255, 255, .9); }
.gp-room.is-current { opacity: 1; }
.gp-cam { transition: transform .5s cubic-bezier(.4, 0, .2, 1); }
/* SVG elementams UA „[hidden]" taisyklė negalioja — be šito žymeklis matomas
   dar prieš JS jį pastatant (UX-smulk). */
.gp-cam[hidden] { display: none; }
.gp-cam-dot { fill: var(--sky); stroke: var(--wine); stroke-width: 2.5; }
.gp-cam-cone { fill: rgba(224, 122, 60, .3); }
.gp-note { margin-top: .9rem; font-size: .78rem; line-height: 1.55; color: rgba(208, 223, 221, .62); }

/* ---- hall index ---- */
/* scroll-margin-top — ta pati 5.5rem sutartis kaip #planas / #kronika: sekcija
   nesulipa su nav'u, kai į ją atveda filtras (main.js revealIndex) arba nuoroda. */
.gal-index-sheet { background: var(--wine); color: var(--sage); padding-bottom: 4rem; scroll-margin-top: 5.5rem; }
/* ---- Filtro kartotė ties rezultatais (žr. page-spaces.njk) ----
   Ta pati `.gal-config` juosta, tik nebelipni: čia ji jau STOVI prie kortelių,
   tad lipdyti nėra prie ko. Mobiliojo pasitraukimo `.is-tucked` jos nepasiekia —
   main.js juostos ieško tik `.gal-viewer` viduje. `position: relative` reikalingas
   `is-scrollable` krašto blukinimui, kurį pirmoji juosta gauna iš sticky.
   Dviguba specifika (.gal-config.gal-config-inline) sąmoninga: mobile blokas
   puslapio gale eina vėliau ir `.gal-config` paraštes bei paddingą perrašytų. */
.gal-config.gal-config-inline { position: relative; top: auto; z-index: auto;
  margin: 2.25rem 0 0; padding: 1rem 0; border-top: 1px solid rgba(208, 223, 221, .18); }
.gal-config.gal-config-inline .gal-config-hint { margin-top: .75rem; min-height: 1.5em; }
/* Juostoje virš galerijos eilutė slenka į šoną sąmoningai: ten kiekvienas
   pikselis atimamas iš skaitomo teksto (MOB-04). Čia to spaudimo nėra — juosta
   stovi eilėje virš kortelių, tad grupės lūžta į eilutes ir MATOSI visos. Telefone
   šoninė slinktis reikštų, kad „Dalyvių skaičius" lustų iš viso nesimato.
   Kiekvienas laukas paima visą eilutę, tad skirtukas tarp jų nebeturi ką skirti. */
.gal-config.gal-config-inline .gal-config-row { flex-wrap: wrap; overflow-x: visible; gap: .9rem 1rem; }
.gal-config.gal-config-inline .gal-config-field { flex: 1 1 100%; flex-wrap: wrap; }
.gal-config.gal-config-inline .mode-tabs,
.gal-config.gal-config-inline .size-chips { flex-wrap: wrap; }
.gal-config.gal-config-inline .gal-config-sep { display: none; }
.gal-index-title { color: #fff; margin-top: 1rem; }
.gal-index { display: grid; gap: 1rem; margin-top: 2.25rem; grid-template-columns: 1fr; }
@media (min-width: 620px) { .gal-index { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1000px) { .gal-index { grid-template-columns: repeat(3, 1fr); } }
/* 2026-08-31 (user directive „make the border of the photos more rounded"):
   kortelė vėl suapvalinta. Nuotrauka išbėga iki kortelės krašto, tad viena be
   kitos apvalinti nepavyksta — kortelė ima --r-lg, nuotraukos viršutiniai
   kampai tą patį minus rėmelio 2px, kad linija eitų lygiagrečiai. */
.gal-index-card { position: relative; display: flex; flex-direction: column; gap: .3rem; padding: 1.5rem; border: 2px solid rgba(208, 223, 221, .22); border-radius: var(--r-lg); text-decoration: none; background: rgba(208, 223, 221, .04); transition: border-color .25s ease, background-color .25s ease, opacity .25s ease; }
/* Kortelės nuotrauka išbėga iki krašto (neigiamos paraštės = kortelės padding),
   kad tekstinė dalis liktų ant ramaus fono (UX-svarb-4). */
.gal-index-photo { display: block; margin: -1.5rem -1.5rem .65rem; aspect-ratio: 16 / 10; overflow: hidden; background: #14090b; border-radius: calc(var(--r-lg) - 2px) calc(var(--r-lg) - 2px) 0 0; }
.gal-index-photo img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .35s ease; }
.gal-index-card:hover .gal-index-photo img { transform: scale(1.03); }
.gal-index-card:hover { border-color: var(--sage); background: rgba(208, 223, 221, .09); }
/* A11y: the "fits your guest count" state must not rely on colour alone —
   a ✓ glyph and a heavier border carry it for colour-blind users (P24). */
.gal-index-card.fit { border-color: var(--sky); border-width: 2px; background: rgba(224, 122, 60, .1); }
.gal-index-card.fit .gal-index-code::after { content: " ✓"; font-weight: 700; }
.gal-index-card.dim { opacity: .38; }
.gal-index-code { font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-wide); color: var(--sky); }
.gal-index-name { font-family: var(--font-display); font-size: var(--fs-title-md); color: #fff; letter-spacing: -0.02em; }
.gal-index-area { font-size: .85rem; color: rgba(208, 223, 221, .6); }
.gal-index-cap { margin-top: .5rem; font-family: var(--font-display); font-size: var(--fs-stat-md); color: var(--sky); line-height: 1.1; }
.gal-index-cap [data-caplabel] { display: block; font-family: var(--font-body); font-size: .75rem; color: rgba(208, 223, 221, .55); margin-top: .25rem; }
/* .66: sage .5 ant wine davė 4,10:1; .66 → 6,23:1 (A11Y-02). */
.gal-index-sheet .table-note { color: rgba(208, 223, 221, .66); margin-top: 1.5rem; }

/* 2026-08-31 (user directive „can they also be a bit smaller so that they would
   all fit on screen at the same time"): nuo 1000px, kur tinklelis yra 3×2,
   kortelė suspausta tiek, kad abi eilutės matytųsi vienu metu 1440×900 lange.
   Traukiami tik tarpai, nuotraukos aukštis ir statistikos skaičius — šriftų
   grindys nejudinamos, o žemiau 1000px (1–2 stulpeliai) kortelė lieka tokia,
   kokia buvo, nes ten spaudimo aukščiui nėra. */
@media (min-width: 1000px) {
  .gal-index { gap: .8rem; margin-top: 1.75rem; }
  .gal-index-card { padding: 1.1rem; gap: .25rem; }
  .gal-index-photo { margin: -1.1rem -1.1rem .55rem; aspect-ratio: 21 / 9; border-radius: calc(var(--r-lg) - 2px) calc(var(--r-lg) - 2px) 0 0; }
  .gal-index-cap { margin-top: .35rem; font-size: var(--fs-stat-sm); }
  .gal-index-cap [data-caplabel] { margin-top: .15rem; }
}

@media (max-width: 899px) {
  /* The sticky panel must be opaque and full-bleed — the steps scroll underneath it. */
  /* The steps scroll UNDER this panel, so the first line of text used to arrive
     ~30px below its edge and read as stuck to it. */
  /* Skydo apatinis padding'as YRA tarpas tarp aukšto plano ir skaitomo teksto:
     tekstas slenka PO skydu, tad matomas tarpas visuose slinkimo taškuose lygus
     šitam padding'ui (išmatuota: plano apačia → skydo kraštas buvo 13,6px, o iki
     pirmos teksto eilutės — 43px). 1,5rem duoda ~53px: pastatas ir tekstas nustoja
     kabėti vienas ant kito. Žingsnių tarpų NELIEČIAM — jie jau prie savo grindų
     (žr. .gal-step:has(> .gal-step-caption)).
     Saugu ir scrollytelling'ui: main.js skaitymo liniją skaičiuoja nuo skydo
     apačios (line = p.bottom + (h − p.bottom) × 0,55), tad aukštesnis skydas
     nuleidžia liniją žemyn ir paskutinį žingsnį pasiekti tik lengviau. */
  .gal-sticky { background: var(--wine); margin-inline: calc(var(--pad) * -1); padding: .55rem var(--pad) 1.5rem; margin-bottom: 2rem; box-shadow: 0 14px 22px -14px rgba(0, 0, 0, .75); }
  /* Telefone skydas žemas ir lieka ekrane ilgiau, tad paskutinė nuotrauka čia
     rodoma dosniausiai: prie 320×700 net su 40px atsarga ji matoma 400px slinkimo
     (žr. .gal-steps komentarą). Todėl atsarga čia dar mažesnė nei darbalaukyje —
     34vh (238–287px) telefone buvo tiesiog tuščias vyno ekranas.
     Vertė duodama per --gal-tail, kad juostos apačia (.gal-progress) žinotų
     tikrą atsargą ir čia. */
  .gal-steps { --gal-tail-css: clamp(7rem, 20vh, 12rem); }
  .gal-stack { height: 34svh; }
  .gp-note { display: none; }
    /* The plan is the navigation on mobile — the 14-button rail would cost a whole row. */
    .gal-plan-wrap { margin-top: .8rem; }
  .gal-viewer { --gal-bar: 6.9rem; }
  .gal-config { margin-bottom: .85rem; padding: .7rem 0 .75rem; }
  .gal-config-row { gap: .7rem; }
  /* 3em = dvi eilutės. Rezultato eilutė telefone kartais telpa į vieną, kartais
     lūžta į dvi; kai lūždavo, augdavo VISOS juostos aukštis, o su juo ir --gal-bar,
     ir prilipęs skydas — puslapis pašokdavo po kiekvieno išdėstymo paspaudimo
     (kliento pastaba #4). Fiksuota vieta 19px kainuoja mažiau nei šuolis.
     Nuo 2026-09-04 eilutė vardija VISAS juostos erdves (nuo 2026-09-06 — dydžio
     juostos, ne „telpa"); kad ilgiausiu atveju
     (6 erdvės) ji čia tilptų į dvi eilutes ir 320–390 px pločiu, lipnioje
     juostoje main.js rašo tik salių kodus ([data-hint-short]); pilni vardai —
     .gal-config-inline ir /technologijos/ .config-hint, kurie nėra lipnūs. */
  .gal-config-hint { margin-top: .6rem; font-size: .8rem; min-height: 3em; }
  .gal-config .guest-field { width: 5rem; }
  /* --- Juostos pasitraukimas slenkant žemyn (main.js uždeda .is-tucked) ---
     Telefone konfigūratorius (režimų tabai + dydžio lustai + svečių laukelis +
     užuominos eilutė ≈ 100px prie 390px) atima ketvirtį lango. Slenkant žemyn
     main.js uždeda .is-tucked, ir juosta pakyla LYGIAI savo aukščiu:
     translateY(-100%) — ne fiksuotas skaičius ir ne var(), nes matuoti nėra ko,
     100% jau YRA juostos aukštis, koks jis bebūtų kalboje ar lange.
     Kur ji nueina: juosta lipdoma ties 4.5rem, tad pasitraukusi jos apačia atsiremia
     tiksliai į nav'o apačią (72px), o nav'as nepermatomas ir z-50 > juostos z-12 —
     nieko neuždengia ir niekur nekyšo. Aukščio NEKEIČIAM (display/height/scale):
     main.js juostos aukštį matuoja iš to paties elemento, ir suplota juosta
     grįžtų be aukščio.
     Kas atsitinka su skyle: skydas lipdomas ties calc(4.5rem + var(--gal-bar)),
     tad main.js pasitraukusiai juostai rašo --gal-bar: 0 — skydas pats pakyla po
     nav'u ir atlaisvinta vieta atitenka tekstui. Kad tai būtų slydimas, o ne
     šuolis, --gal-bar registruotas per @property (žr. .gal-viewer aukščiau) ir
     turi tokį patį perėjimą kaip juostos transform: tos pačios 0,3s ir ta pati
     kreivė, uždedamos tą patį kadrą, tad juosta ir skydas juda kaip vienas
     daiktas ir tarp jų neatsiveria properša nė vienoje judesio akimirkoje.
     Naršyklėje be @property perėjimo tiesiog nėra — skydas pakyla iš karto, kaip
     ir buvo numatyta atsarginiam variantui.
     Fokuso saugiklis čia nereikalingas: main.js pats grąžina juostą per
     pointerdown/focusin/input ir kol svečių laukelis fokusuotas. */
  .gal-config.is-tucked { transform: translateY(-100%); pointer-events: none; }
  /* Juostai pasitraukus vienintelis CTA neišnyksta: „+" brolis pasirodo apačioje.
     Rust + baltas — tas pats derinys kaip .size-chip[aria-pressed] (kontrastas
     patikrintas ten). Vermillion čia draustinas (baltas tekstas ant jo — ne). */
  .gal-cta-float { position: fixed; left: 50%; bottom: max(1rem, env(safe-area-inset-bottom)); z-index: 40; display: inline-flex; align-items: center; min-height: 44px; padding: .55rem 1.15rem; background: var(--rust); color: #fff; font-size: .9rem; font-weight: 600; text-decoration: none; border-radius: 999px; box-shadow: 0 6px 20px rgba(0, 0, 0, .35); opacity: 0; visibility: hidden; pointer-events: none; transform: translateX(-50%) translateY(14px); }
  .gal-config.is-tucked + .gal-cta-float { opacity: 1; visibility: visible; pointer-events: auto; transform: translateX(-50%) translateY(0); }
  @media (prefers-reduced-motion: no-preference) {
    .gal-config { transition: transform .3s cubic-bezier(.4, 0, .2, 1); }
    .gal-viewer { transition: --gal-bar .3s cubic-bezier(.4, 0, .2, 1); }
    /* Šuolio metu juosta grįžta be perėjimo — kitaip šuolis taikosi į geometriją,
       kuri dar 300ms juda po jo (žr. `is-instant` main.js). */
    .gal-viewer.is-instant, .gal-viewer.is-instant .gal-config { transition: none; }
    .gal-cta-float { transition: opacity .3s ease, transform .3s ease, visibility 0s .3s; }
    .gal-config.is-tucked + .gal-cta-float { transition: opacity .3s ease, transform .3s ease, visibility 0s; }
  }
  .gp-code { font-size: calc(26px * var(--gp-k, 1)); }
  .gp-code.gp-sm { font-size: calc(15px * var(--gp-k, 1)); }
  .gp-area { font-size: calc(13px * var(--gp-k, 1)); }
  .gp-area.gp-xs { font-size: calc(11px * var(--gp-k, 1)); }
  .gal-step { --gal-step-pad: 2.6rem; }
  .gal-meta { gap: 1.25rem; }
  .gal-meta-item dd { font-size: 1.25rem; }
  }

/* Aukštų planas telefone (MOB-03): SVG kambariai yra role=button taikiniai, o
   viewBox 1000 susitraukęs iki ~350px duoda 11–35px taikinius. Tas pats receptas
   kaip .fp-card — planas rodomas natūralesnio dydžio horizontaliame scrolleryje,
   o siauriems kambariams šablonas prideda permatomus hit-rect'us (gp-hit). */
@media (max-width: 700px) {
  .gal-plan-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  /* Brėžinys matuojamas AUKŠČIU, ne pločiu (2026-08-31). Anksčiau čia buvo
     `min-width: 36rem` + `height: auto`, t. y. dėžė augo ir traukėsi kartu su
     brėžiniu: og 1000×420 duodavo 242px, a2 1000×240 — 138px. Telefone skydas
     stovi VIRŠ teksto, tad kiekvienas aukšto perjungimas pastumdavo visą teksto
     stulpelį ~104px, o tai keisdavo, kuris žingsnis laiko skaitymo liniją — ir
     istorija imdavo virpėti tarp dviejų sekcijų (išmatuota 390×844: restoranas ⇄
     B/C, nuotrauka mirksėdavo pirmyn atgal, o paspaudus restoraną brėžinyje
     nusileisdavo ties B/C). Vienodas aukštis nutraukia tą grįžtamąjį ryšį.
     Taikiniai nenukenčia: prie ~177px aukščio og išeina ~421px, a1 ~590px,
     a2 ~738px pločio — visi ne siauresni už senąjį 36rem a1 planą, o siauriausi
     kambariai (a1/a2) net paplatėja. Horizontalus scrolleris lieka. */
  /* Dėžės aukštis — pastovus 10,8rem, ne `21vh`: brėžinio plotis dabar seka aukštį,
     o taikinio grindys yra 44px. 10,8rem × a1 santykio (1000×300) duoda būtent tuos
     576px (36rem), su kuriais a1 kambariai buvo išmatuoti ties 44–46px; nuo lango
     aukščio priklausantis vh trumpesniame telefone (360×740) juos nutempdavo iki
     40px. `min-width` lieka dėl to paties: platesnėje dėžėje žemesnis brėžinys tiesiog
     centruojasi, o dėžės aukštis nuo to nepasikeičia. */
  /* overflow: hidden — dėžė tampa PROGRAMIŠKAI slenkama (main.js centrePlan
     centruoja paryškintą patalpą). Ne `auto`: pirštu brėžinio tempti nereikia,
     o horizontalus touch scroll prilipusiame skyde kirstųsi su galerijos
     vertikalia slinktimi. */
  .gp-sheets { height: 10.8rem; justify-content: flex-start; overflow: hidden; scroll-behavior: auto; }
  /* 2026-09-01: `min-width: 36rem` pakeistas į `aspect-ratio` + `max-width: 36rem`.
     Kol visi trys lapai buvo panašių proporcijų, min-width veikė. Dabar jie tikri
     ir skirtingi (og 1,47 · a1 2,03 · a2 3,91), o `width: auto` flex eilutėje
     nusileidžia iki min-width — tad žemesnis brėžinys atsistodavo LETTERBOX'u 576px
     dėžėje ir prasidėdavo ties 112px, t. y. dešinė jo pusė iškrisdavo už 350px
     lango. Su aspect-ratio elemento dėžė sutampa su brėžiniu: a1 išeina 351px,
     og 254px — abu telpa visi. a2 (676px) atsiremia į tuos pačius 36rem ir elgiasi
     lygiai taip, kaip anksčiau: horizontalus scrolleris, prasidedantis nuo kairės. */
  .gp-svg { height: 100%; width: auto; aspect-ratio: var(--gp-ar, 1000 / 300); max-width: 36rem; margin-inline: 0; flex: 0 0 auto; }
}

/* ---- "Kodėl rinktis" — five reasons, from the 2026 client deck ---- */
.wc-grid { list-style: none; margin: 3rem 0 0; padding: 0; display: grid; gap: 2rem 2.5rem; grid-template-columns: 1fr; }
@media (min-width: 620px)  { .wc-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1000px) { .wc-grid { grid-template-columns: repeat(3, 1fr); gap: 2.75rem 3rem; } }
.wc-item { position: relative; padding-top: 1.4rem; border-top: 1px solid var(--line); }
.wc-num { font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-wide); color: var(--volt); }
.wc-label { font-family: var(--font-display); font-size: var(--fs-title-fluid); letter-spacing: -0.02em; margin-top: .7rem; color: var(--ink); }
/* text-wrap: balance — „Kodėl rinktis" punktų parašai yra 2–3 eilučių blokai, o
   godus laužymas juos palikdavo labai nelygius: ties 1440px eilučių ilgių skirtumas
   siekė 310px, ir 003 („Greta Vilniaus centro") šalia pilnų 001/002 pirmų eilučių
   atrodė pastumtas, nors jo dėžė stovi lygiai (išmatuota: stulpeliai 736/736/736px,
   tarpai 97/97, visos kairiosios briaunos sutampa). `&nbsp;` čia nepadeda — pirma
   eilutė JAU užpildyta iki galo, o nedylantis tarpas gali ją tik sutrumpinti.
   Su balance skirtumas krenta iki 12px, o eilučių SKAIČIUS nesikeičia nė viename
   plotyje (390/700/1000/1280/1440/1920) — tad blokų aukštis ir tinklelis nejuda.
   Senos naršyklės savybės nepažįsta ir laužo kaip anksčiau. */
.wc-text { margin-top: .7rem; font-size: .95rem; line-height: 1.65; color: var(--steel); max-width: 26rem; text-wrap: balance; }

/* ---- Page cards — one doorway per page, on the home page ----
   Tech Zity vocabulary already established elsewhere on the site: the 001-style
   numbering the gallery uses for its chapters and the notched mark around the
   image. The arrow stays in the rust family (ds-05): vermillion is TZ zonos
   spalva ir namų turinyje nevartojama — hover signalą neša poslinkis + gilesnis
   rust. The whole card is one link, so the tap target is the card. */
.pcards { list-style: none; margin: 3rem 0 0; padding: 0; display: grid; gap: 2rem; grid-template-columns: 1fr; }
@media (min-width: 700px)  { .pcards { grid-template-columns: repeat(2, 1fr); gap: 2.25rem; } }
@media (min-width: 1100px) { .pcards { grid-template-columns: repeat(3, 1fr); gap: 2.5rem 2.25rem; } }
/* Klientas: „001 GALERIJA“ / „002 KAINOS“ kortelės nukirstos dešiniajame krašte.
   Grid item'o numatytas min-width yra `auto`, ne 0 — tad kortelė, kurios turinys
   (ilgas nelaužomas žodis, paveikslas) platesnis už 1fr, išplečia savo stulpelį
   ir visa eilutė išlenda pro konteinerio kraštą. Su min-width:0 stulpelis lieka
   1fr, o turinys prisitaiko; max-width ant paveikslo — antra užtvara tam pačiam. */
.pcard { min-width: 0; }

.pcard-link { display: flex; flex-direction: column; height: 100%; text-decoration: none; color: inherit; }
/* Stačiakampis su --r-sm kampu, be kaukės (2026-08-31 user directive „make the
   photos not clover outlined but rounded squared like everywhere else in the
   page, keep the same structure"). Tas pats spindulys kaip visose kitose
   svetainės nuotraukų dėžėse (.media-frame, .fmt-media, .gal-item, .gal-stack,
   .round-item) — „KAS KUR" kadras buvo paskutinis su dobilo kauke, tad kartu
   iškrito ir jį piešęs tokenas. `aspect-ratio: 16 / 10` lieka: jis daro visas
   korteles vienodo dydžio nepriklausomai nuo šaltinio proporcijų. */
.pcard-media { position: relative; overflow: hidden; aspect-ratio: 16 / 10;
  border-radius: var(--r-sm); }
.pcard-media img { display: block; width: 100%; height: 100%; max-width: 100%; object-fit: cover; transition: transform .5s ease; }
.pcard-link:hover .pcard-media img,
.pcard-link:focus-visible .pcard-media img { transform: scale(1.04); }

.pcard-body { padding-top: 1.4rem; display: flex; flex-direction: column; flex: 1; }
.pcard-n { font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-wide); text-transform: uppercase; color: var(--steel); }
.pcard-n span { color: var(--volt); margin-right: .5rem; }
.pcard-title { font-family: var(--font-display); font-size: var(--fs-title-fluid); letter-spacing: -0.02em; line-height: 1.2; margin-top: .75rem; color: var(--ink); }
.pcard-text { margin-top: .7rem; font-size: .92rem; line-height: 1.6; color: var(--steel); }
.pcard-cta { margin-top: auto; padding-top: 1.1rem; font-size: .9rem; font-weight: 600; color: var(--ink); }
.pcard-cta span { display: inline-block; margin-left: .3rem; color: var(--volt); transition: transform .25s ease, color .25s ease; }
.pcard-link:hover .pcard-cta span,
.pcard-link:focus-visible .pcard-cta span { transform: translateX(.35rem); color: var(--volt-deep); }

/* ---- "Getting here": distance schematic + Google map, side by side in the navy section ---- */
.contact-maps { padding-bottom: clamp(4rem, 8vw, 7rem); }
/* Under 1080 px `.contact-grid` stacks, so "Atvykimas" lands flush against the
   form's bottom border. Two columns leave the left one ending high enough that
   the gap is already there — hence the max-width bound. */
@media (max-width: 1079px) { .contact-maps { margin-top: 3rem; } }
.gmap-heading { color: var(--muted-on-dark); margin-bottom: 1.25rem; }
/* Dvi kolonos — tik nuo 1200px. Ties 900px stulpelis būdavo ~394px, o schemos
   viewBox (560) jame susitraukdavo iki 0,70 mastelio: 8,4px tekstas. Nuo 1200px
   stulpelis yra ≥540px (mastelis ≥0,96), o siauriau schema eina per visą plotį,
   ribojamą 46rem, kad neišsipūstų iki 2× mastelio. Trumpiausia grandis dabar —
   11,8px ties 1200px, virš 11,4px grindų. */
.maps-2up { display: grid; gap: 1.75rem; align-items: start; max-width: 46rem; }
@media (min-width: 1200px) { .maps-2up { grid-template-columns: 1fr 1fr; gap: 2.5rem; max-width: none; } }
.maps-col { min-width: 0; }
.gmap-frame { position: relative; width: 100%; aspect-ratio: 21 / 10; border-radius: var(--r-md); overflow: hidden; background: #14090b; }
@media (max-width: 1199px) { .gmap-frame { aspect-ratio: 4 / 3; } }
.gmap-frame iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; display: block; filter: saturate(.85) contrast(1.05); }
.gmap-cap { margin-top: .75rem; font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label); text-transform: uppercase; color: var(--muted-on-dark); }

/* ---- Atvykimo schema (partials/map.njk) ----
   2026-08-31 (user directive „bring back the old map"): grąžinta senoji plati
   900×430 schema, tad grįžo ir jai skirti dydžiai (17 / 13 / 22px viewBox
   vienetais — prie 1440px stulpelis ~660px, mastelis ~0,73). Tarpinės 560×372
   „kortelės" versijos taisyklės (15 / 12,5 / 19px + dvi etikečių kolonos)
   atšauktos; šios eilutės perrašo bendrąsias .map-* prie ~1098.
   Nuo 2026-08-31 schema yra TIKRA OSM gatvių geometrija, tad aureolė aplink glifus
   nebe patogumas, o būtinybė: po kiekvienu parašu praeina bent viena gatvė.
   Klasių liko trys. .map-addr / .map-tag ištrintos kartu su senąja išgalvota schema;
   .map-street / .map-ring gyveno vieną dieną ir iškeliavo su gatvių vardais, šiaurės
   rodykle bei mastelio juostele (tos pačios dienos vakaro user directive). */
.map-svg { width: 100%; height: auto; display: block; }
/* Aureolė aplink kiekvieną glifą: kur linija atsiduria po tekstu, raidės lieka
   ant vientiso vyno fono. */
.map-name, .map-dist, .map-skc {
  paint-order: stroke; stroke: #251216; stroke-width: 3.5px; stroke-linejoin: round;
}
.map-name { fill: #fff; font-family: var(--font-body); font-size: 17px; font-weight: 700; }
.map-dist { fill: rgba(255, 255, 255, .62); font-family: var(--font-mono); font-size: 13px; }
.map-skc  { fill: #fff; font-family: var(--font-display); font-size: 22px; font-weight: 700; letter-spacing: .04em; }
/* Google kadras šalia — to paties aukščio kaip schema. 900/430 ≈ 21/10, o tai
   jau yra .gmap-frame bazinė reikšmė, tad atskiro ≥1200px perrašymo nebereikia:
   3/2 buvo skirtas 560×372 kortelei ir dabar dvi kolonas išlygintų kreivai. */
/* Tekstinis schemos atitikmuo. Nuo 600px jis nukirptas (ne display:none), tad
   lieka prieinamumo medyje kaip SVG turinio pakaitalas; iki 599px schema
   traukiasi į neįskaitomą dydį, todėl ji slepiama, o sąrašas tampa turiniu. */
.map-list { list-style: none; margin: 0; padding: 0; position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
@media (max-width: 599px) {
  .map-svg { display: none; }
  .map-list { position: static; width: auto; height: auto; overflow: visible; clip: auto; white-space: normal; padding: 1.35rem 1.25rem 1.5rem; }
  /* Kiekvienas įrašas — dvi eilutės (vardas / atstumas), kaip ir schemos blokai.
     Vienoje eilutėje „Pietinis aplinkkelis 2 min automobiliu" ties 320px vis tiek
     lūžtų, o dalis įrašų liktų vienaeilė — sąrašas atrodytų nelygus. */
  .map-list li { padding: .7rem 0; border-top: 1px solid rgba(255, 255, 255, .12); }
  .map-list li:first-child { border-top: 0; padding-top: 0; }
  .mli-name { display: block; font-family: var(--font-body); font-size: .95rem; font-weight: 700; color: #fff; }
  .mli-dist { display: block; margin-top: .25rem; font-family: var(--font-mono); font-size: .82rem; line-height: 1.45; color: rgba(255, 255, 255, .7); }
  .mli-venue .mli-name { font-family: var(--font-display); letter-spacing: .04em; }
}

/* ================================================================
   /istorija/ — the Lelija history lesson.
   Sekcijos: bendra `.page-hero` antraštė su trimis skaičiais · „ta pati salė"
   nuotraukų eilutė · kronika (laiko juosta) · 2023 m. nuotraukų eilutė · plano
   perjungiklis (1940↔2026) · kaip veikė · šviesa + kas išliko · „Lelija" šiandien
   · Tech Zity juosta.

   2026-08 kliento apžvalga (#1–#4) perrašė čia keturis dalykus:
     1. antraštė — savadarbė „plokštė" pakeista bendru pageHeader;
     2. nuotraukos — `.band-3up` pilno pločio juostos pakeistos `.hist-shots`
        eilutėmis su `.media-frame` ir parašu VIRŠ kadro;
     3. kronika — rudo/vyno `.chron-war` juostos nebėra;
     4. 1944–45 — nebe vienas išryškintas įrašas, o du eiliniai taškai (2026-08-31):
        be inversijos, be pull-quote, be `.is-war` rėmelio ir taškelio.
   Sekcijų h2 dabar `display-lg`, kaip visame likusiame puslapyje (buvo
   `display-md` — atskiras, tik šio puslapio, tipografijos žingsnis).
   ================================================================ */

/* ---- Chronicle: a dated rail. Ordered list so it reads without CSS. ---- */
.chron { list-style: none; margin: clamp(2.5rem, 6vw, 4rem) 0 0; padding: 0; }
.chron-item:last-child { padding-bottom: 0; }
.chron-item::before {
  content: ""; position: absolute; left: -5px; top: .45rem;
  width: 9px; height: 9px; border-radius: 50%; background: var(--volt);
}
/* 1944–45 karo įrašai nebeturi JOKIO išryškinimo (2026-08-31 user directive,
   paskutinis žingsnis kelyje tamsi juosta → tylūs signalai → nieko). Nebėra nei
   `.is-war` rėmelio/taškelio, nei `.chron-pull` — visi kronikos taškai piešiami
   viena taisykle. Vermillion iš kronikos dingo visai; jei prireiktų grąžinti
   akcentą, jis privalo turėti nespalvinį signalą (CLAUDE.md daltonizmo taisyklė). */
.chron-date { font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label); text-transform: uppercase; color: var(--steel); }
.chron-title { font-family: var(--font-display); font-size: var(--fs-title-fluid); letter-spacing: -0.02em; margin-top: .5rem; }
.chron-text { margin-top: .8rem; color: var(--steel); max-width: 40rem; line-height: 1.7; }
/* No 13rem date column any more — the date and the title share one flex line
   (.chron-head), which makes every node about a third shorter. Nuo 2026-08
   .chron-head yra VISŲ įrašų, taip pat ir karo, pirmas vaikas — karo juostos,
   kuri turėjo savo antraštę, nebėra. */

/* ---- Plan toggle: same footprint, two programmes ----
   No JS → both eras stack. main.js adds .hp-live to switch. */
.hp-tabs { display: none; }
.hp.hp-live .hp-tabs { display: inline-flex; gap: 0; border: 1px solid var(--line); border-radius: 999px; padding: .3rem; background: #fff; }
.hp-tab {
  min-height: 44px; padding: .5rem 1.15rem; border-radius: 999px;
  font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label);
  text-transform: uppercase; color: var(--steel);
  transition: background-color .22s ease, color .22s ease;
}
.hp-tab.is-on { background: var(--ink); color: #fff; }
.hp-stage { margin-top: 1.5rem; }
.hp-era + .hp-era { margin-top: 2.5rem; }
/* Both eras occupy the SAME grid cell, so the stage is always as tall as the
   taller one and switching moves nothing below it. display:none used to shrink
   the document by 25-75px mid-click, which reads as the page jumping. */
.hp.hp-live .hp-stage { display: grid; align-items: start; }
.hp.hp-live .hp-era { grid-area: 1 / 1; margin-top: 0; visibility: hidden; opacity: 0; pointer-events: none; transition: opacity .28s ease; }
.hp.hp-live .hp-era.is-on { visibility: visible; opacity: 1; pointer-events: auto; }
.hp-era-label { font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-wide); text-transform: uppercase; color: var(--steel); margin-bottom: .8rem; }
.hp.hp-live .hp-era-label { display: none; }
.hp-svg { display: block; width: 100%; height: auto; }
.hp-shell { fill: none; stroke: var(--line); stroke-width: 2; }
/* Zonos piešiamos vien linija — jokių spalvotų užpildų (2026-08-31 user directive).
   Skirtumą tarp zonų neša tekstas („siuvimo skyrius" / „bendra patalpa", salės kodas),
   ne fonas, tad nė viena būsena nepriklauso nuo spalvos. */
.hp-rect { fill: none; stroke: var(--line); stroke-width: 1.5; }
.hp-name { font-family: var(--font-body); font-size: 17px; font-weight: 700; fill: var(--ink); text-anchor: middle; }
.hp-name.hp-sm { font-size: 14px; }
.hp-code { font-family: var(--font-display); font-size: 34px; font-weight: 700; fill: var(--ink); text-anchor: middle; }
.hp-meta { font-family: var(--font-mono); font-size: 13px; fill: var(--steel); text-anchor: middle; }
.hp-dim  { font-family: var(--font-mono); font-size: 13px; fill: var(--steel); text-anchor: middle; letter-spacing: var(--ls-label); }
/* Vakarinis (BC) užkulisis istorijos 2026 plane — ta pati 14 m² patalpa kaip salės
   kortelėje: 46 × 64 vnt. Dvigubas selektorius, kad įveiktų ir mobilųjį
   `.hp-meta { font-size: 19px }` bloką žemiau — 19 vnt. duotų 114 vnt. plotį į
   64 vnt. zoną. 10 vnt. = 60 vnt., telpa abiejuose plotukuose. */
.hp-meta.hp-xxs { font-size: 10px; }
.hp-cap { margin-top: 1rem; color: var(--steel); font-size: .95rem; max-width: 42rem; }
.hp-honesty { margin-top: 1.5rem; padding-top: 1rem; border-top: 1px solid var(--line); font-size: .82rem; line-height: 1.6; color: var(--steel); max-width: 46rem; }
@media (max-width: 640px) {
  .hp-name { font-size: 26px; } .hp-name.hp-sm { font-size: 21px; }
  .hp-meta { font-size: 19px; } .hp-dim { font-size: 18px; }
  .hp-code { font-size: 46px; }
}

/* ---- How it worked (dark section, B&W reconstructions) ---- */
/* the 1947 step has no image on purpose — there was no factory floor yet */

/* ---- Reconstruction figures: never mistaken for archival records ---- */
.rek { margin: 1.75rem 0 0; }
.rek img { display: block; width: 100%; height: auto; filter: grayscale(1) contrast(1.06); border-radius: var(--r-sm); }
.rek-cap { margin-top: .7rem; font-family: var(--font-mono); font-size: var(--fs-label-xs); letter-spacing: var(--ls-label-tight); line-height: 1.5; color: var(--steel); }
.hist-how .rek-cap { color: rgba(255, 255, 255, .45); }
.rek-note { margin-top: clamp(2.5rem, 6vw, 4rem); padding-top: 1.25rem; border-top: 1px solid rgba(255, 255, 255, .14); font-size: .82rem; line-height: 1.6; color: rgba(255, 255, 255, .5); max-width: 44rem; }

/* ---- What survived ---- */
.surv-grid { display: grid; gap: 1.75rem; grid-template-columns: 1fr; }
@media (min-width: 620px)  { .surv-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1024px) { .surv-grid { grid-template-columns: repeat(4, 1fr); gap: 2rem; } }
.surv-card { min-width: 0; }
.surv-card .media-frame img { height: clamp(11rem, 18vw, 14rem); }
.surv-title { font-family: var(--font-display); font-size: var(--fs-title-sm); letter-spacing: -0.01em; margin-top: 1rem; }
.surv-text { margin-top: .5rem; font-size: .92rem; line-height: 1.6; color: var(--steel); }

/* ---- Lelija today + the Lilium line ---- */
.hist-lilium {
  margin-top: 2rem; padding-left: 1.4rem; border-left: 3px solid var(--vermillion);
  font-family: var(--font-display); font-size: var(--fs-title-fluid);
  line-height: 1.32; letter-spacing: -0.015em; color: #fff;
}

/* ---- Three facts for your opening remarks ---- */
.hist-sources { margin-top: clamp(2.5rem, 6vw, 3.5rem); font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-tight); line-height: 1.7; color: var(--steel); }

/* ---- Tech Zity strip, compressed on this page ---- */
.tz-slim .tz-item { padding: 1.25rem 1.1rem; }
.tz-slim .tz-logo { height: 1.05rem; }
.tz-slim .tz-badge { margin-top: .7rem; }
.hall-history { margin-top: clamp(2.5rem, 5vw, 3.5rem); padding-top: 1.5rem; border-top: 1px solid var(--line); }

/* survived: two verified photos, then a text list for the claims we cannot show */
.surv-photos { display: grid; gap: 1.75rem; grid-template-columns: 1fr; }
@media (min-width: 900px) { .surv-photos { grid-template-columns: repeat(3, 1fr); gap: 2.5rem; } }
.surv-photos .media-frame img { height: clamp(8rem, 24vw, 20rem); }
/* Parašas eina VIRŠ kadro (kliento apžvalga #2: „visur kitur tekstas eina virš
   nuotraukos"), todėl tarpas — po juo, ne virš jo, o kadrai lygiuojami per
   `margin-top: auto`, kaip .hist-shots. */
.surv-photos figure { display: flex; flex-direction: column; }
.surv-photos .media-frame { margin-top: auto; }
.surv-cap { margin-bottom: .75rem; font-size: .85rem; line-height: 1.55; color: var(--steel); }
.surv-card { padding-top: 1.2rem; border-top: 1px solid var(--line); }
.surv-n { font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-wide); color: var(--volt); }
.surv-title { margin-top: .6rem; }
/* a plain small note — .mono-line uppercases, which is unreadable for a sentence */

/* ================================================================
   Puslapio antraštė — nebe savadarbė „plokštė".
   2026-08 kliento apžvalga #1: istorijos puslapis atrodė kaip kitas produktas.
   Antraštė dabar yra bendras `.page-hero` (macros.njk pageHeader), tas pats
   kaip /kainos/, /technologijos/, /partneriai/ ir salių puslapiuose, tad
   .hist-plate / .plate-top / .plate-addr / .plate-range / .plate-h1 taisyklės
   ištrintos kartu su markup'u. Liko tik trys skaičiai, kurie gyvena to paties
   stuburo apačioje.
   Laiko juosta („arc“) buvo išimta 2026-08-10 (user); kaip grąžinti — commit
   c4f0786 ir history.json plate._arcNote.
   ================================================================ */

/* ---- Trys skaičiai antraštės stuburo apačioje ----
   max-width 40rem = tas pats matas kaip `.page-hero .lead`, tad skaičių eilutė
   lygiuojasi su antrašte, o ne plaukioja per visą 1400px plotį (apžvalga #1).
   Skaičius neša --sky, ne --vermillion: --sky jau yra šio puslapio akcentas ant
   tamsaus (.eyebrow-sky, .how-n) ir duoda 6,16:1 ant --ink (vermillion — 4,95:1). */
.plate-stats { list-style: none; margin: var(--sp-5) 0 0; padding: var(--sp-5) 0 0; border-top: 1px solid rgba(255, 255, 255, .16); display: grid; gap: 1.25rem 2rem; grid-template-columns: repeat(3, 1fr); max-width: 40rem; }
.plate-stats li { min-width: 0; }
.plate-stat-n { display: block; font-family: var(--font-display); font-weight: 700; font-size: var(--fs-stat-md); line-height: 1; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; }
.plate-stat-n.is-hot { color: var(--sky); }
.plate-stat-l { display: block; margin-top: .5rem; font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-tight); line-height: 1.5; color: var(--muted-on-dark); overflow-wrap: break-word; }
/* Trys stulpeliai po ~72px 320px lange nesutalpina „suprojektuotų“, tad siauram
   ekranui eilutė virsta stulpeliu — jokio horizontalaus scroll. */
@media (max-width: 559px) {
  .plate-stats { grid-template-columns: 1fr; gap: 1.1rem; }
  .plate-stat-n { font-size: var(--fs-stat-sm); }
}

/* ---- Nuotraukų eilutės: svetainės rėmelis, parašas VIRŠ kadro ----
   Buvo `.band-3up` — pilno pločio vyno juosta su ženkliukais UŽDĖTAIS ant
   nuotraukų. Kliento apžvalga #2: nuotraukų stilius turi sutapti su visu likusiu
   puslapiu. Dabar tai `.wrap` tinklelyje esanti eilutė su tuo pačiu
   `.media-frame` (--r-sm spindulys, object-fit: cover) kaip /technologijos/
   `.tproof` ar pradinio puslapio scenarijai, o parašas eina virš kadro. */
.hist-shots { display: grid; gap: 1.5rem; grid-template-columns: 1fr; }
@media (min-width: 620px) { .hist-shots { grid-template-columns: repeat(3, 1fr); gap: 1.75rem; } }
@media (min-width: 1024px) { .hist-shots { gap: 2rem; } }
/* Parašas virš kadro reiškia, kad viena- ir dvieilis parašas nustumtų kadrus į
   skirtingą aukštį. Figūra yra flex stulpelis, o rėmelis pasiima `margin-top:
   auto`, tad visi kadrai lygiuojasi apačioje — o kadangi jų aukštis vienodas,
   lygiuojasi ir viršus. Jokio subgrid ir jokio spėjamo min-height. */
.hist-shots figure { margin: 0; min-width: 0; display: flex; flex-direction: column; }
.hist-cap { margin-bottom: .75rem; font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label); text-transform: uppercase; color: var(--steel); }
.hist-shots .media-frame { margin-top: auto; }
.hist-shots .media-frame img { height: clamp(11rem, 22vw, 17rem); }

/* ---- chronicle: date and title on one line, tighter rhythm ---- */
/* --chron-rail — atstumas nuo laiko juostos linijos iki teksto. Karo juostos,
   kuri iš jo skaičiuodavo dešinę įtrauką, nebėra (apžvalga #3), bet kintamasis
   lieka: iš jo gyvena visų įrašų kairė įtrauka. */
.chron-item { position: relative; --chron-rail: 1.6rem; padding: 0 0 1.4rem var(--chron-rail); border-left: 1px solid var(--line); scroll-margin-top: 6.5rem; }
.chron-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: .3rem 1.1rem; }
.chron-title { margin-top: 0; font-size: var(--fs-title-fluid); }
.chron-text { margin-top: .6rem; }

/* ---- how it worked: four tight blocks, dark ---- */
.how-grid { list-style: none; margin: clamp(2rem, 4vw, 2.75rem) 0 0; padding: 0; display: grid; gap: 1.75rem 2rem; }
@media (min-width: 620px)  { .how-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1100px) { .how-grid { grid-template-columns: repeat(4, 1fr); gap: 2.25rem; } }
.how-step { min-width: 0; padding-top: 1.1rem; border-top: 1px solid rgba(255, 255, 255, .16); }
.how-n { font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-wide); color: var(--sky); }
.how-n span { color: rgba(255, 255, 255, .45); margin-left: .7rem; letter-spacing: .1em; }
.how-title { font-family: var(--font-display); font-size: var(--fs-title-sm); line-height: 1.25; letter-spacing: -0.01em; color: #fff; margin-top: .6rem; }
.how-text { margin-top: .6rem; font-size: .9rem; line-height: 1.6; color: rgba(255, 255, 255, .6); }
.how-step .rek { margin-top: .9rem; }

/* ---- merged light + survived ---- */
.surv-lead { margin-top: clamp(2.25rem, 5vw, 3rem); font-size: 1rem; color: var(--steel); max-width: 40rem; }
.surv-grid { margin-top: 1.5rem; }
@media (min-width: 620px)  { .surv-grid { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 1024px) { .surv-grid { grid-template-columns: repeat(3, 1fr); } }

/* ---- BREEAM inside the dark closing band ---- */
.breeam-dark { display: grid; gap: 1.25rem; align-items: start; border: 1px solid rgba(255, 255, 255, .16); padding: clamp(1.4rem, 3vw, 2rem); }
@media (min-width: 520px) { .breeam-dark { grid-template-columns: auto 1fr; gap: 1.75rem; } }
.breeam-dark img { width: clamp(72px, 9vw, 104px); height: auto; filter: invert(1); }
.hist-today .hist-sources { margin-top: clamp(2.25rem, 5vw, 3rem); color: var(--muted-on-dark); }

/* anchor targets clear the fixed nav */
#planas, #kronika { scroll-margin-top: 5.5rem; }

/* Tech Zity juosta yra paskutinė šviesi sekcija prieš tamsų CTA, o `.sheet`
   dar užtraukia jį 1,75rem aukštyn — todėl 2026-ųjų kortelė atsiduria beveik
   ant „Klientų renginiai". Apačiai duodam pilną `.section` orą.
   Turi būti PO mobile bloko (~777 eil.), kitaip `.section-tight` perrašo. */
.hist-track { padding-block-end: clamp(5.5rem, 10vw, 9rem); }
@media (max-width: 700px) { .hist-track { padding-block-end: clamp(4rem, 9vw, 5.5rem); } }

/* the new mono classes must not ship at .7rem on a phone */
@media (max-width: 700px) {
  .plate-stat-l.plate-stat-l,
  .hist-cap.hist-cap, .how-n.how-n { font-size: .78rem; letter-spacing: .1em; }
}

/* the location cards and the evidence photos pair up even on a narrow phone —
   they are a year + a logo, and two images, so neither needs a full line */
@media (min-width: 360px) { .tz-slim { grid-template-columns: repeat(2, 1fr); } }
/* Penkios kortelės dviejuose stulpeliuose palieka pusę paskutinės eilutės tuščią,
   o tinklelio fonas ten prasišviečia kaip pilkas langelis. Penktoji (Vilnius,
   tamsioji) užima visą eilutę — tinklelis baigiasi pilna eile. */
@media (min-width: 360px) and (max-width: 1023px) { .tz-slim .tz-item:last-child { grid-column: 1 / -1; } }
/* Both survived grids hold exactly three items. These two rules used to set them
   two-up unconditionally — and being later in the file than the 3-up media
   queries above, they won at every width. That left one orphan in each grid on
   desktop, and made every photo box ~650px wide while its `sizes` still claimed
   30vw, so the browser fetched the 480px source into it. Two-up is what a phone
   wants, so it is scoped to a phone. */
@media (max-width: 899px) { .surv-photos { grid-template-columns: 1fr 1fr; gap: 1rem; } }
/* Ta pati byla ir su .m-carousel: juosta gyvena `@media (max-width: 700px)` bloke
   aukščiau, o šitos dvi .surv-photos taisyklės yra ŽEMIAU faile ir tokio pat svorio
   (0,1,0) — medijos užklausa svorio neprideda, tad tinklelis laimėdavo ir telefone
   liko dviejų stulpelių tinklelis su `overflow-x: auto`, be jokio braukimo.
   Dviguba klasė (0,2,0) grąžina juostai jos pačios išdėstymą — tik telefone, tik
   šitam tinkleliui.
   Nuotraukų kraštinės skiriasi (1600×1069, 1600×1067, 1600×1200), todėl kadrui
   duodam vieną santykį, o ne aukštį: `.surv-photos .media-frame img` clamp'as
   telefone atsiremdavo į savo 8rem grindis (128px) po ~280px pločio skaidre —
   3:2 nuotrauka virsdavo 2,2:1 juostele. aspect-ratio 3/2 su object-fit: cover
   (jau paveldėtu) duoda vienodą kadrą visuose pločiuose: 320px ir 390px lange
   skaidrės lieka tokios pat proporcijos, tad juosta neatrodo dantyta. */
@media (max-width: 700px) {
  .surv-photos.m-carousel { display: flex; grid-template-columns: none; gap: 1rem; }
  .surv-photos.m-carousel .media-frame img { height: auto; aspect-ratio: 3 / 2; }
}
@media (min-width: 480px) and (max-width: 619px) {
  .how-grid { grid-template-columns: repeat(2, 1fr); }
  .surv-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 1024px) { .tz-slim { grid-template-columns: repeat(5, 1fr); } }

/* Below 700px the 1000-unit plan viewBox renders its labels at ~6px, so each era
   shows the same zones as an HTML list instead. Identical strings, no new pairs. */
.hpm { display: none; list-style: none; margin: 0; padding: 0; }
@media (max-width: 699px) {
  .hp-svg { display: none; }
  .hpm { display: grid; gap: 2px; }
  .hpm-row { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: .2rem .8rem; padding: .7rem .85rem; border-left: 3px solid transparent; }
  .hpm-row b { font-size: .95rem; font-weight: 700; }
  .hpm-row span { font-family: var(--font-mono); font-size: var(--fs-label-md); color: var(--steel); }
  /* Be spalvotų fonų, kaip ir SVG variante — eilutes skiria tik hairline. */
  .hpm-sew, .hpm-hall, .hpm-shared, .hpm-svc { background: none; border-left-color: var(--line); }
}

/* ================================================================
   /technologijos/ — the kit annotated on the room, then compared
   hall by hall. No area hero: that metric belongs to /kainos/.
   ================================================================ */
.tech-hero { padding-bottom: clamp(3rem, 6vw, 5rem); }
/* Header variant with a supporting visual (macros.njk pageHeader `split`). */
.ph-split { display: grid; gap: clamp(2rem, 5vw, 4rem); align-items: start; }
@media (min-width: 960px) { .ph-split { grid-template-columns: 1fr 1.15fr; gap: clamp(2.5rem, 5vw, 4.5rem); } }
.ph-split > * { min-width: 0; }
/* The client's own line, sitting where it did in their deck: under the headline,
   in the accent, before the specifics start. */
.tech-tagline { margin-top: .9rem; font-family: var(--font-display); font-weight: 700; font-size: var(--fs-title-fluid); letter-spacing: -0.01em; color: var(--sky); }
.tkeys { list-style: none; margin: clamp(1.75rem, 4vw, 2.5rem) 0 0; padding: 0; display: grid; gap: .75rem; }
@media (min-width: 560px) { .tkeys { grid-template-columns: repeat(3, 1fr); gap: 1.5rem; } }
.tkeys li { display: flex; align-items: baseline; justify-content: space-between; gap: .8rem; border-top: 1px solid rgba(255, 255, 255, .18); padding-top: .7rem; }
@media (min-width: 560px) { .tkeys li { display: block; } }
.tk-n { display: block; font-family: var(--font-display); font-weight: 700; font-size: clamp(1.9rem, 3.4vw, 2.6rem); line-height: 1; letter-spacing: -0.03em; color: var(--sky); }
.tk-l { display: block; margin-top: .35rem; font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-tight); line-height: 1.45; color: rgba(255, 255, 255, .55); }

/* the annotated frame: pins on the picture, legend always visible below */
.tshot { margin: 0; }
.tshot-media { position: relative; border-radius: var(--r-sm); overflow: hidden; }
.tshot-media img { display: block; width: 100%; height: auto; }
/* Rust, ne vermillion: /technologijos/ yra SAMSUNG turinio zona (žr. CLAUDE.md
   zonavimą), o baltas tekstas ant vermillion apskritai draudžiamas — ant rust
   jis matuojasi 6,4:1 (ds-02, ds-05). */
/* Skaitmens centravimas apskritime (kliento pastaba). Anksčiau ženkliukas paveldėjo
   body `line-height: 1.65`, todėl eilutės dėžė buvo 1,65em aukščio, o skaitmuo joje
   sėdėdavo virš centro. Išmatuota Playwright'u (deviceScaleFactor 10, baltų pikselių
   gabaritas 26px apskritime):
       grid + place-items:center, line-height 1.65  →  0,85px per aukštai
       flex + center,             line-height 1     →  0,15px (12px šriftu)
   `line-height: 1` half-leading'ą padalija simetriškai, tad skaitmuo atsiduria ten,
   kur jį em kvadrate padėjo šrifto autorius — nepriklausomai nuo to, kuris mono
   šriftas sistemoje laimėjo. `tabular-nums` + `letter-spacing: 0` saugo, kad 1/2/3/4
   nesislankiotų horizontaliai (tracking'as pridėtų tarpą PO paskutinio glifo). */
.hs-dot {
  position: absolute; left: var(--x); top: var(--y); transform: translate(-50%, -50%);
  width: 26px; height: 26px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  line-height: 1; letter-spacing: 0; text-indent: 0; font-variant-numeric: tabular-nums;
  background: var(--rust); color: #fff;
  font-family: var(--font-mono); font-size: var(--fs-label-sm); font-weight: 700;
  box-shadow: 0 0 0 3px rgba(37, 18, 22, .55);
}
.hs-legend { list-style: none; margin: 1.25rem 0 0; padding: 0; display: grid; gap: .55rem; }
@media (min-width: 640px) { .hs-legend { grid-template-columns: 1fr 1fr; gap: .6rem 1.5rem; } }
.hs-legend li { display: flex; align-items: baseline; gap: .6rem; font-size: .85rem; line-height: 1.45; color: rgba(255, 255, 255, .68); }
/* Ta pati centravimo sutartis kaip .hs-dot — legendos skaitmuo ir ženkliukas ant
   nuotraukos privalo atrodyti vienodai. Bazinės linijos lygiavimas su etikete
   išlieka: flex konteinerio baseline yra jo pirmo elemento (skaitmens) baseline. */
.hs-n {
  flex-shrink: 0; width: 18px; height: 18px; border-radius: 50%;
  background: var(--rust); color: #fff;
  font-family: var(--font-mono); font-size: var(--fs-label-xs);
  display: flex; align-items: center; justify-content: center;
  line-height: 1; letter-spacing: 0; font-variant-numeric: tabular-nums;
}
.tshot-cap { margin-top: 1rem; color: var(--muted-on-dark); }

/* the comparison matrix */
.tech-config { margin-top: clamp(1.75rem, 4vw, 2.5rem); }
.config-hint { margin-top: .9rem; font-size: .88rem; color: var(--steel); }
/* Nuoroda iš filtro eilutės į užklausos formą (kr-03). */
.config-cta { margin-top: .2rem; font-size: .9rem; }
.hmx-scroll { margin-top: 1.75rem; overflow-x: auto; -webkit-overflow-scrolling: touch; }
.hmx-scroll:focus-visible { outline: 2px solid var(--volt); outline-offset: 3px; }
/* Lygiavimas (kliento pastaba: „Lentelėje prastas lygiavimas — tiek vertikaliai,
   tiek horizontaliai“). Trys priežastys buvo išmatuojamos:
     1. `table-layout: auto` — stulpelių plotį lėmė ilgiausias tekstas, todėl „C“
        antraštė laužėsi kitaip nei „B“ ir jos turinys nusėsdavo kitame aukštyje;
     2. `thead th { vertical-align: bottom }` — antraštės lygiavosi apačiomis, tad
        nuotraukų viršus kiekviename stulpelyje buvo skirtingame aukštyje;
     3. `.rec-badge` sraute — .hidden yra display:none, tad ženkliuko atsiradimas
        pakeisdavo vieno stulpelio antraštės aukštį (ženkliuko nuo 2026-09-04
        nebėra išvis — žr. .hmx-col.fit).
   Dabar: fiksuotas stulpelių tinklelis, antraštės lygiuojamos viršumi, kiekviena
   antraštės pakopa turi savo vietą. */
.hmx { width: 100%; border-collapse: collapse; table-layout: fixed; min-width: 61rem; }
.hmx th, .hmx td { text-align: left; vertical-align: top; padding: .9rem 1rem; border-bottom: 1px solid var(--line); }
.hmx thead th { border-bottom: 1px solid var(--ink); vertical-align: top; }
.hmx-corner { width: 11rem; font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-wide); text-transform: uppercase; color: var(--steel); }
.hmx-col { width: 10rem; }
.hmx-head { display: block; text-decoration: none; color: inherit; }
.hmx-thumb { display: block; position: relative; }
.hmx-head img { display: block; width: 100%; max-width: 190px; height: 92px; object-fit: cover; border-radius: var(--r-sm); }
.hmx-code { display: block; margin-top: .6rem; line-height: 1.1; font-family: var(--font-display); font-size: var(--fs-title-lg); font-weight: 700; letter-spacing: -0.02em; }
/* min-height = dvi eilutės: „Oranžerija + Kiemas“ ir „Mažoji salė C“ laužiasi, o
   „Didžioji salė“ — ne; be rezervuotos vietos plotas ir talpa vieno stulpelio
   antraštėje nusileisdavo eilute žemiau nei kaimyno. */
.hmx-name { display: block; margin-top: .2rem; font-size: .88rem; line-height: 1.3; min-height: 2.6em; color: var(--ink); }
.hmx-area, .hmx-cap { display: block; font-family: var(--font-mono); font-size: var(--fs-label-sm); line-height: 1.4; color: var(--steel); margin-top: .15rem; }
.hmx-cap { min-height: 2.8em; }
.hmx-head:hover .hmx-code { color: var(--volt); }
.hmx tbody th { font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-tight); text-transform: uppercase; line-height: 1.4; color: var(--steel); font-weight: 400; }
/* `table-layout: fixed` nebeplečia stulpelio pagal ilgiausią žodį, tad ilgi kodai
   („MXW2/BETA58“) privalo turėti leidimą lūžti — kitaip jie išlįstų iš langelio. */
.hmx tbody td { font-size: .9rem; line-height: 1.5; overflow-wrap: anywhere; }
/* „—“ visuose stulpeliuose stovi toje pačioje vietoje: langeliai lygiuoti viršumi,
   ženklas — pirmas turinys, ta pati eilutės aukštis kaip teksto. */
.hmx-dash { display: inline-block; line-height: 1.5; color: var(--steel); }
.hmx-rowcode { display: none; }
.hmx-col.dim, .hmx td.dim { opacity: .42; }
/* Telpantis stulpelis — tie patys trys signalai kaip .gal-index-card.fit
   (2026-09-04 „padaryti kaip galerijoje"): ✓ prie kodo (nespalvinis), volt
   kodas, sky rėmelis ant nuotraukos. Ženkliuko „Rekomenduojama" nebėra —
   telpa dažniausiai kelios, ir nė viena iš jų nėra „ta". ✓ pusės dydžio, kad
   „B+C ✓" tilptų į 10rem stulpelį ir glifas nesvertų daugiau už raidę. */
.hmx-col.fit .hmx-code { color: var(--volt); }
.hmx-col.fit .hmx-code::after { content: " ✓"; font-size: .55em; vertical-align: .2em; }
.hmx-col.fit .hmx-head img { outline: 2px solid var(--sky); outline-offset: -2px; }
/* Trys išnašos yra VIENAS blokas, ne trys atskiri sakiniai. Anksčiau tarpą tarp jų
   skaičiavo du dalykai iš karto — grid `gap: .5rem` PLIUS kiekvienos `.table-note`
   paveldėtas `margin-top: 1rem` (427 eil.) — todėl vienos eilutės išnašos stovėjo
   po 44px viena nuo kitos, o pirmoji — 37px nuo lentelės briaunos. Margin nunulinam,
   tarpą palieka tik gap. */
.hmx-notes { margin-top: 1.1rem; display: grid; gap: .4rem; }
.hmx-notes .table-note { margin-top: 0; }
/* Sekcija baigiasi smulkiu pilku šriftu, todėl pilna 6rem apačia atrodė kaip tuščias
   ekranas iki tamsaus AVoIP bloko. Mobiliajame (≤700px) galioja mažesnė bendroji
   reikšmė — jos neliečiam. */
@media (min-width: 701px) {
  .section-tight:has(> .wrap > .hmx-notes) { padding-bottom: clamp(2.5rem, 4.5vw, 4rem); }
}
@media (max-width: 700px) { .hmx-corner { width: 8rem; } .hmx th, .hmx td { padding: .75rem .8rem; } }

/* the signal chain */
.sig { list-style: none; margin: clamp(2rem, 4vw, 2.75rem) 0 0; padding: 0; display: grid; gap: 1px; background: rgba(255, 255, 255, .14); border: 1px solid rgba(255, 255, 255, .14); }
@media (min-width: 820px) { .sig { grid-template-columns: repeat(3, 1fr); } }
/* flex + margin-top:auto ant .sig-count: aprašymai skirtingo ilgio (03 telpa į
   vieną eilutę, 01 ir 02 — į dvi), tad be to statistika kiekvienoje dėžutėje
   sėdėtų kitame aukštyje ir skiriamosios linijos nesutaptų. Grid elementai ir
   taip tempiami iki vienodo aukščio, todėl užtenka nustumti bloką į apačią —
   jokių fiksuotų aukščių ar px derinimo. */
.sig-stage { background: var(--ink); padding: clamp(1.4rem, 3vw, 2rem); min-width: 0; display: flex; flex-direction: column; }
.sig-hub { background: #2A1A1E; }
.sig-n { font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-wide); color: var(--sky); }
.sig-name { font-family: var(--font-display); font-size: var(--fs-title-md); letter-spacing: -0.01em; color: #fff; margin-top: .6rem; }
.sig-body { margin-top: .6rem; font-size: .9rem; line-height: 1.6; color: rgba(255, 255, 255, .62); }
/* Skaičius gyvena PAČIAME etapo kvadratėlyje (2026-09-06): atskiros .sig-counts
   juostos po grandine nebėra. Plona linija virš jo atskiria statistiką nuo
   aprašymo nekuriant naujos dėžės — tinklelio tarpai `.sig` neša patys. */
.sig-count { margin-top: auto; padding-block-start: 1.25rem; padding-top: 1.1rem; border-top: 1px solid rgba(255, 255, 255, .14); }
/* --sky, kaip tk-n ir sig-n toje pačioje sekcijoje: vermillion SAMSUNG zonoje
   nevartojamas (ds-05). */
.sig-c-n { display: block; font-family: var(--font-display); font-weight: 700; font-size: clamp(1.7rem, 3.4vw, 2.6rem); line-height: 1; letter-spacing: -0.03em; color: var(--sky); }
.sig-c-l { display: block; margin-top: .4rem; font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-tight); line-height: 1.45; color: rgba(255, 255, 255, .5); }

/* the four building-wide facts — deliberately lighter than the matrix */
.tstrip { list-style: none; margin: clamp(2.5rem, 5vw, 3.5rem) 0 0; padding: 0; display: grid; gap: 1.5rem; }
@media (min-width: 560px)  { .tstrip { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1024px) { .tstrip { grid-template-columns: repeat(4, 1fr); gap: 2rem; } }
.tstrip li { min-width: 0; padding-top: 1.1rem; border-top: 1px solid rgba(255, 255, 255, .16); }
.ts-n { font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-wide); color: rgba(255, 255, 255, .38); }
.ts-v { font-family: var(--font-display); font-weight: 700; font-size: var(--fs-stat-sm); letter-spacing: -0.02em; color: #fff; margin-top: .5rem; }
.ts-note { margin-top: .45rem; font-size: .85rem; line-height: 1.55; color: rgba(255, 255, 255, .6); }

/* proof photographs */
.tproof { margin: 0; min-width: 0; }
.tproof .media-frame img { height: clamp(12rem, 26vw, 20rem); }
.tproof figcaption { margin-top: .8rem; font-size: .92rem; line-height: 1.55; color: var(--steel); }
/* ── „Kas jau kainoje, o kas — atskirai“ — VIENA lentelė ─────────────────────
   Kliento pastaba: „NUOMOJAMAS PAPILDOMAI: viena tema, trys skirtingos lentelės.
   Reikia kažkaip jas suvienodinti.“ Sekcijoje stovėjo trys komponentai iš eilės:
   .dash-list (brūkšniai, be dešiniojo stulpelio), .rent-list (kaina į dešinę,
   display šriftu) ir .facts-list (mono etiketė kairėje, 16rem tinklelis). Trys
   ritmai, trys tipografijos, trys skirtingi kairieji kraštai — o tema viena.

   .tsheet yra vienas sąrašas: viena briauna aplink visą sekciją, vienodos eilutės,
   du stulpeliai visur (kairėje — KAS, dešinėje — KIEK arba KOKIA), vienodos linijos
   ir vienodos grupių antraštės (žr. `.fs-sub, .tsheet-head` bendrą tipografiją —
   dėl to visi šio puslapio lentelių pavadinimai dabar yra to paties šrifto ir
   dydžio, kaip prašė klientas).
   Dešiniojo stulpelio reikšmės būna dviejų rūšių ir tik tiek jos ir skiriasi:
   duomenų žetonas (kaina, „Įskaičiuota“) — mono, ir proza (faktų reikšmės) — tekstinis
   šriftas. Kainos ateina iš pricing.json su `eur` sutartimi ir NBSP prieš €. */
.tsheet { border: 1px solid var(--line); background: #fff; }
.tsheet-head:first-child { border-top: 0; }
.tsheet-rows { list-style: none; margin: 0; padding: 0; }
.tsheet-row { display: grid; gap: .3rem 2rem; align-items: start; padding: .95rem 1.25rem; border-top: 1px solid var(--line); }
@media (min-width: 720px) { .tsheet-row { grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr); } }
.tsheet-l { min-width: 0; font-size: .95rem; line-height: 1.55; color: var(--ink); overflow-wrap: anywhere; }
.tsheet-v { min-width: 0; font-size: .95rem; line-height: 1.55; color: var(--steel); overflow-wrap: anywhere; }
.tsheet-num, .tsheet-tag { font-family: var(--font-mono); font-size: var(--fs-mono-body); font-variant-numeric: tabular-nums; }
.tsheet-num { color: var(--ink); font-weight: 600; }
.tsheet-note { margin: 0; padding: .85rem 1.25rem; border-top: 1px solid var(--line); font-size: .82rem; line-height: 1.5; color: var(--steel); }

@media (max-width: 700px) {
  .tk-l.tk-l, .ts-n.ts-n, .sig-n.sig-n, .sig-c-l.sig-c-l, .hmx-area, .hmx-cap { font-size: .76rem; letter-spacing: .09em; }
}
/* .rent-list / .rent-l / .rent-p ir .tbudget-in išimti kartu su trijų lentelių
   išdėstymu — jų vietą užėmė .tsheet (žr. bloką aukščiau). */

/* ── Faktų lapas organizatoriams (korekcija #28) ─────────────────────────────
   Skaitomas per 30 sekundžių ir spausdinamas. Todėl: tanki lentelė vienodo
   pločio skaitmenimis, apibrėžčių sąrašai vietoje pastraipų, ir @media print
   blokas failo gale, kuris palieka tik šią sekciją. */
.factsheet .fs-head { position: relative; }
/* Spausdinimo mygtukas yra .btn-dl — bendros mygtukų sistemos tretinis lygis
   (kontūras šviesiame fone). Nieko savo išvaizdos jis nebeturi; čia lieka tik
   atstumas ir žymeklis. */
.fs-print { margin-top: 1.75rem; cursor: pointer; font-family: var(--font-body); }
/* Kliento bendra pastaba: „Visur pavadinimai turi būti rašomi vienodu šriftu ir
   dydžiu.“ Šiame puslapyje lentelių/sąrašų pavadinimai buvo dviejų rūšių —
   .display-md (biudžeto sekcija) ir .fs-sub (faktų lapas). Dabar abi vietos ima
   TĄ PAČIĄ tipografiją iš vienos deklaracijos; skiriasi tik dėžutės tarpai, nes
   .tsheet-head gyvena lentelės viduje, o .fs-sub — virš jos. Sekcijų antraštės
   (h2) visos ir taip yra .display-lg — jų neliečiam. */
.fs-sub, .tsheet-head {
  font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label);
  text-transform: uppercase; color: var(--steel); font-weight: 400;
}
.fs-sub {
  margin: clamp(2.25rem, 4vw, 3rem) 0 1.1rem; padding-bottom: .7rem;
  border-bottom: 1px solid var(--line);
}
.tsheet-head { margin: 0; padding: 1.05rem 1.25rem .9rem; border-top: 1px solid var(--line); background: var(--snow); }
.fs-table { width: 100%; min-width: 46rem; border-collapse: collapse; font-size: .9rem; }
.fs-table th, .fs-table td { padding: .7rem .85rem; border-bottom: 1px solid var(--line); }
.fs-table thead th {
  font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label);
  text-transform: uppercase; color: var(--steel); font-weight: 400; text-align: right;
  border-bottom-width: 2px;
}
.fs-table thead th:first-child { text-align: left; }
.fs-table tbody th { text-align: left; font-weight: 500; white-space: nowrap; }
.fs-n { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.fs-code {
  display: inline-block; min-width: 2.9rem; margin-right: .5rem;
  font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label-tight); color: var(--volt);
}
/* The lounges and the restaurant are not rented on their own, so they read quieter. */
.fs-extra th, .fs-extra td { color: var(--steel); }

.fs-groups { display: grid; gap: clamp(1.75rem, 3vw, 2.5rem); margin-top: 1.5rem; }
@media (min-width: 700px)  { .fs-groups { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1100px) { .fs-groups { grid-template-columns: repeat(4, 1fr); } }
.fs-group { min-width: 0; }
.fs-glabel {
  font-family: var(--font-mono); font-size: var(--fs-label-sm); letter-spacing: var(--ls-label);
  text-transform: uppercase; color: var(--volt); margin-bottom: .9rem;
}
.fs-dl { margin: 0; }
.fs-dl dt { font-size: .78rem; color: var(--steel); margin-top: .95rem; }
.fs-dl dt:first-child { margin-top: 0; }
.fs-dl dd { margin: .2rem 0 0; font-size: .92rem; line-height: 1.5; }

.fs-foot { display: grid; gap: clamp(1.75rem, 3vw, 2.5rem); margin-top: clamp(2.5rem, 5vw, 3.5rem); padding-top: clamp(1.75rem, 3vw, 2.25rem); border-top: 1px solid var(--line); }
/* Kai prieš skirtuko liniją stovi išnaša („Įranga pagal sales — lentelėje…"),
   56px + 36px paliko ją kaboti tuštumos viduryje. Prie išnašos liniją prisitraukiam;
   `.fs-foot` savo padding-top nekeičia, tad tekstas po linija kvėpuoja kaip anksčiau. */
.fs-note-spec + .fs-foot { margin-top: clamp(1.5rem, 2.6vw, 2rem); }
.factsheet .fs-note-spec { margin-top: .75rem; }
@media (min-width: 800px) { .fs-foot { grid-template-columns: 1.4fr 1fr; } }
.fs-foot > * { min-width: 0; }
/* Abu poraštės stulpeliai yra VIENAS komponentas dviem egzemplioriais. Anksčiau
   kairė buvo ženklinamas sąrašas su 1,1rem įtrauka, dešinė — pastraipų krūva be
   įtraukos ir su kitokiu line-height; šalia vienas kito jie skaitėsi kaip du
   nesusiję blokai. Dabar abu: ta pati `.fs-glabel` antraštė, plokščias kairysis
   kraštas, tas pats eilutės ritmas ir ta pati skirianti linija tarp eilučių. */
/* `:not(.fs-glabel)` yra esmė, ne atsargumas: abiejų stulpelių antraste yra
   `<p class="fs-glabel">`, tad plikas `.fs-contact p` (0,1,1) nugalėdavo
   `.fs-glabel` (0,1,0) ir dešinės pusės antraštė krisdavo iš mono etiketės į
   0,92rem tekstą — dėl to „Techniniai klausimai" ir „Derinama pagal renginį"
   atrodė kaip du skirtingi lygiai. */
.fs-tbd ul { margin: 0; padding: 0; list-style: none; }
.fs-tbd li,
.fs-contact p:not(.fs-glabel) {
  margin: 0; padding: .55rem 0; font-size: .92rem; line-height: 1.55;
  border-top: 1px solid var(--line);
}
/* `p.fs-name`, ne `.fs-name`: `:not(.fs-glabel)` prideda savo argumento svorį,
   tad eilučių taisyklė yra (0,2,1) — plikas `.fs-contact .fs-name` (0,2,0) jos
   nenugalėtų ir dešinės pusės pirmoji eilutė liktų su linija bei 8,8px įtrauka,
   t. y. 9px žemiau už kairės. */
.fs-tbd li:first-child,
.fs-contact p.fs-name { border-top: 0; padding-top: 0; }
.fs-name { font-weight: 700; }
.fs-role, .fs-addr { color: var(--steel); }

/* ── Paveldo + komplekso juosta (korekcijos #4 ir #20) ───────────────────────
   Vienas tamsus ruožas su dviem mintimis: pastatas ir miestelis. Dvi kolonos
   plačiame ekrane, viena po kitos siaurame. Sąmoningai be nuotraukų — juostos
   darbas yra pasakyti du faktus ir praleisti toliau, o ne sulaikyti. */
.hc-band { background: var(--ink); color: #fff; padding-block: clamp(3rem, 7vw, 5rem); }
.hc-band .wrap { display: grid; gap: clamp(2.5rem, 5vw, 4rem); }
@media (min-width: 900px) and (max-width: 1099px) {
  /* Two up, certificate below: at this width three columns leave the headline no room. */
  .hc-band .wrap { grid-template-columns: 1fr 1fr; gap: clamp(2.5rem, 4vw, 3.5rem); align-items: start; }
  .hc-breeam { grid-column: 1 / -1; }
}
@media (min-width: 1100px) {
  .hc-band .wrap { grid-template-columns: 1.05fr 1fr 1fr; gap: clamp(2.5rem, 3.5vw, 3.5rem); align-items: start; }
  /* Trys stulpeliai lygiuojasi EILUTĖMIS, ne tik viršumi (2026-09-07 user directive
     „kad visi trys tekstai būtų gražiai sulyginti"). Kiekvienas stulpelis turi tuos
     pačius keturis vaikus — eyebrow · antraštė · tekstas · uodega (nuoroda /
     skaičiai / BREEAM ženklas) — tad `subgrid` paduoda jiems bendras eilutes.
     Be to pirmojo stulpelio antraštė lūžta į DVI eilutes, ir jo tekstas nusėsdavo
     31px žemiau kaimynų; su subgrid eilutės aukštį lemia aukščiausias narys, tad
     visi trys prasideda kartu.
     Naršyklėse be subgrid `grid-template-rows` reikšmė ignoruojama ir lieka
     ankstesnė elgsena — nieko nesugriūva. */
  .hc-band .wrap { grid-template-rows: repeat(4, auto); }
  .hc-heritage, .hc-campus, .hc-breeam { display: grid; grid-template-rows: subgrid; grid-row: span 4; align-content: start; }
}
@media (min-width: 900px) {
  .hc-campus, .hc-breeam { padding-left: clamp(1.75rem, 3vw, 2.75rem); border-left: 1px solid rgba(255, 255, 255, .14); }
}
.hc-band > .wrap > * { min-width: 0; }
.hc-title { color: #fff; margin-top: 1rem; }
/* Sized to the column, not the page: at display-lg the second line broke after
   "2026 m." and left "kūrybiškumas." alone on a third. Stepped down again when the
   certificate became a third column and the headline lost a third of its width. */
.hc-heritage .hc-title { font-size: var(--fs-display-md); line-height: 1.06; text-wrap: balance; }
/* breeam-alpha.png is the mark with its white plate turned into transparency, so a
   single invert paints the ink white and nothing boxes it in. The original breeam.png
   has no alpha at all — inverted, it put a black square on the wine band. */
/* margin-TOP, ne bottom: ženklas nuo 2026-09-07 stovi po tekstu (žr. page-home.njk).
   `display: block` — kitaip inline paveikslėlis pasiimtų bazinės linijos tarpą ir
   apatinis tarpas skirtųsi nuo nurodyto. */
.hc-badge { width: clamp(64px, 7vw, 84px); height: auto; filter: invert(1); display: block; margin-top: 1.6rem; }
.hc-breeam .eyebrow { margin-bottom: 0; }
/* .7rem override išimtas: jis buvo derintas prie ženklo, stovėjusio viršuje. Dabar
   visi trys stulpeliai naudoja tą patį `.hc-title { margin-top: 1rem }`, tad ir
   antraštės lygiuojasi, ne tik eyebrow eilutės. */
.hc-sub { margin-top: 1.15rem; max-width: 32rem; color: rgba(255, 255, 255, .7); font-size: 1rem; line-height: 1.65; }
.hc-link { margin-top: 1.5rem; }
.hc-link a { color: var(--sky); }
/* Two by two at every width. Four across only worked while the campus owned half the
   band; in a third of it the numbers collided. */
.hc-stats { list-style: none; margin: 2rem 0 0; padding: 0; display: grid; grid-template-columns: repeat(2, 1fr); gap: 1.4rem 1.5rem; }
.hc-stats li { min-width: 0; padding-top: .9rem; border-top: 1px solid rgba(255, 255, 255, .16); }
.hc-v { display: block; font-family: var(--font-display); font-weight: 700; font-size: clamp(1.35rem, 2.6vw, 1.85rem); letter-spacing: -0.02em; line-height: 1; color: #fff; white-space: nowrap; }
.hc-u { font-size: .62em; color: rgba(255, 255, 255, .6); }
.hc-n { display: block; margin-top: .5rem; font-size: .82rem; line-height: 1.45; color: rgba(255, 255, 255, .58); }

/* ── Mobilaus teksto grindys (kliento korekcija #30) ─────────────────────────
   Išmatuota, ne nuspėta: 390 px pločiu 45 selektoriai renderinosi mažiau nei
   12,5 px, smulkiausias 9,6 px. Dvi grindys, nes tekstas čia yra dviejų rūšių —
   skaitomas tekstas, kurį žmogus tikrai skaito, ir mono mikro-etiketės, kurias
   dizainas naudoja kaip struktūrą.
     · skaitomas tekstas  ≥ 12,5 px (.79rem)
     · mono etiketės ir skaitmenys ženkliukuose ≥ 11,5 px (.72rem)
   Klasės dubliuotos, nes ankstesnės taisyklės yra dviejų klasių ir kitaip
   nugalėtų. Blokas TURI likti failo gale — žr. CLAUDE.md „CSS spąstai“.
   scripts/check-mobile-type.mjs neleidžia buildo, jei grindys pažeidžiamos. */
@media (max-width: 700px) {
  /* skaitomas tekstas */
  .hist-sources.hist-sources, .gmap-cap.gmap-cap, .hp-tab.hp-tab,
  .chron-date.chron-date, .gal-counter.gal-counter,
  .spec-table thead th, .price-table thead th, .hall-table thead th,
  .fee-table thead th, .gal-meta-item dt, dt { font-size: .79rem; }

  /* mono mikro-etiketės ir skaitmenys ženkliukuose */
  .gal-config-label.gal-config-label, .foot-code.foot-code,
  .pcard-n.pcard-n, .hmx-corner.hmx-corner, .hp-era-label.hp-era-label,
  .plate-addr.plate-addr, .plate-range.plate-range, .plate-stat-l.plate-stat-l,
  .gp-area.gp-area, .hs-n.hs-n, .hs-dot.hs-dot { font-size: .72rem; }
}

/* ── Vienos nuotraukos galerija (vd-12) ──────────────────────────────────────
   Mažųjų salių (B/C) galerijoje yra viena vizualizacija — dviejų stulpelių
   tinklelis palikdavo tuščią dešinę pusę. Vienam kadrui duodamas pilnas plotis
   ir aukštesnis slotas (macros.njk gallery prideda .gal-1, kai items == 1). */
.gal-grid.gal-1 { grid-template-columns: 1fr; }
.gal-grid.gal-1 .gal-item img { height: clamp(16rem, 38vw, 26rem); }

/* ── Vienijantis šiltas grade šaltiems kadrams (ds-08) ───────────────────────
   Kanvos matavimas (R−B): bd-2 −37, statyba-0745 −8,6, lelija-vidus −8,
   kiemas-2 −0,7 — visi krito iš šiltos svetainės tonacijos (aplinkiniai kadrai
   +13…+64). Švelnus saturate+sepia priartina prie bendro grade'o jų neperrašant;
   taikoma per src atributą, kad nereikėtų keisti duomenų schemos. */
img[src*="/bd-2-"], img[src*="/statyba-0745-"],
img[src*="/lelija-vidus-"], img[src*="/kiemas-2-"] {
  filter: saturate(.95) sepia(.06);
}

/* ── Oranžerijos hero scrim (vd-10) ──────────────────────────────────────────
   Vienintelis hero, kur antraštė gula ant balto skaidraus tento — bendras
   dviejų gradientų scrim jos nebeišlaikydavo. Stipresnė versija tik šiam
   puslapiui (hall-detail prideda klasę pagal hall.id): tekstinė kairė ir apačia
   tamsinamos tiek, kad balta antraštė matuotųsi ≥4,5:1 ir ant tento. Dvi klasės
   nurungia mobile bloko vienos klasės perrašymą be !important. */
.page-hero-media.ph-scrim-strong::after {
  background:
    /* Lokalus radialas po antraštės juosta (ta pati logika kaip home hero):
       tankis tik ten, kur guli žodžiai — visos nuotraukos nemurzinam. Išmatuota
       Playwright bloko semplavimu: be radialo šviesiausias 16px blokas po
       „Kiemas" davė 2,5:1, su juo ≥4,5:1. */
    radial-gradient(80% 72% at 22% 34%, rgba(20, 8, 11, .9) 0%, rgba(20, 8, 11, .78) 42%, rgba(20, 8, 11, .46) 68%, rgba(20, 8, 11, 0) 92%),
    linear-gradient(95deg, rgba(20, 8, 11, .92) 0%, rgba(20, 8, 11, .74) 34%, rgba(20, 8, 11, .22) 70%, rgba(20, 8, 11, 0) 92%),
    linear-gradient(180deg, rgba(20, 8, 11, .5) 0%, rgba(20, 8, 11, .3) 45%, rgba(20, 8, 11, .88) 100%);
}

/* Inkarų taikiniai sustoja po fiksuotu nav'u — ta pati sutartis kaip #planas. */
#faktu-lapas { scroll-margin-top: 5.5rem; }

/* ── Spausdinimas ────────────────────────────────────────────────────────────
   Dvi pakopos (kr-01):
   1. BENDRA bazė visiems puslapiams — be nav/poraštės/video/animacijų, baltas
      fonas, juodas tekstas, lentelės be scroll. Anksčiau čia buvusi globali
      taisyklė „main > *:not(#faktu-lapas)“ spausdino TUŠČIĄ lapą visuose
      puslapiuose, kuriuose faktų lapo nėra (31 iš 32).
   2. TIK technologijų puslapyje (body.page-tech, žr. frontmatter bodyClass)
      spaudinys susiaurinamas iki faktų lapo — organizatorius spausdina lapą
      arba išsaugo jį PDF ir persiunčia technikos komandai. */
@media print {
  /* 1 · bendra bazė */
  .site-nav, .site-footer, .video-toggle, .fs-print, .skip-link,
  .hero-film, .hero-grade, .hero-shade, .hero-media,
  .nav-more-menu, .hall-rail, .gal-config, .gal-cta-float, .gal-stack-zoom, .gal-slider-nav { display: none !important; }
  .reveal, .reveal-stagger, .reveal-stagger > * { opacity: 1 !important; transform: none !important; }
  /* GSAP pradinės būsenos ir scrollytelling pritemdymas — spaudinyje viskas matoma. */
  .js-focus .gal-step, .js-focus .hall-step, .gal-index-card.dim { opacity: 1 !important; }
  .hero-content, .hero-content > * { opacity: 1 !important; transform: none !important; }
  /* Prilipdyti skydai spaudinyje tampa srauto dalimi — kitaip dengia turinį. */
  .gal-sticky, .hall-stack, .site-nav { position: static !important; }
  /* main > * pagauna ir <header class="page-hero"> — jis ne section. */
  body, main, main > *, section, .sheet, .page-hero { background: #fff !important; }
  main, main * { color: #000 !important; }
  .page-hero { padding-top: 2rem; }
  a { text-decoration: none; color: #000; }
  .table-scroll { overflow: visible !important; }
  .spec-table, .fs-table, .hmx, .fee-table { min-width: 0; }
  .table-frame.is-scrollable::after { display: none; }
  @page { margin: 14mm; }

  /* 2 · faktų lapas — tik /technologijos/ ir /en/technology/ */
  body.page-tech main > *:not(#faktu-lapas) { display: none !important; }
  body.page-tech #faktu-lapas { padding: 0 !important; background: #fff !important; }
  body.page-tech #faktu-lapas .wrap { max-width: none; padding: 0; }
  .fs-table { font-size: 9.5pt; }
  .fs-table th, .fs-table td { padding: .32rem .4rem; }
  .fs-groups { grid-template-columns: repeat(2, 1fr) !important; gap: 1rem 1.5rem; }
  .fs-foot { grid-template-columns: 1.4fr 1fr !important; }
}
