@charset "UTF-8";body > #page > #header[role=banner]{display:none}:root{--width:80rem;--margin:6.25rem;--padding:1rem}@media (max-width:1000px){:root{--margin:1rem}}@media (max-width:600px){:root{--margin:1rem}}*{box-sizing:border-box;margin:0}html{font-size:16px;scroll-behavior:smooth}body{overflow-x:hidden}body.prevent-scroll{overflow:hidden}.component a{text-decoration:none}.underline{text-decoration:underline}.mw{max-width:var(--width);width:100%;margin-left:auto;margin-right:auto}.mw-200{max-width:12.5rem}@media (min-width:calc(1000px + 1px)){.mw-200-d{max-width:12.5rem}}.mw-210{max-width:13.125rem}@media (min-width:calc(1000px + 1px)){.mw-210-d{max-width:13.125rem}}.mw-220{max-width:13.75rem}@media (min-width:calc(1000px + 1px)){.mw-220-d{max-width:13.75rem}}.mw-230{max-width:14.375rem}@media (min-width:calc(1000px + 1px)){.mw-230-d{max-width:14.375rem}}.mw-240{max-width:15rem}@media (min-width:calc(1000px + 1px)){.mw-240-d{max-width:15rem}}.mw-250{max-width:15.625rem}@media (min-width:calc(1000px + 1px)){.mw-250-d{max-width:15.625rem}}.mw-260{max-width:16.25rem}@media (min-width:calc(1000px + 1px)){.mw-260-d{max-width:16.25rem}}.mw-270{max-width:16.875rem}@media (min-width:calc(1000px + 1px)){.mw-270-d{max-width:16.875rem}}.mw-280{max-width:17.5rem}@media (min-width:calc(1000px + 1px)){.mw-280-d{max-width:17.5rem}}.mw-290{max-width:18.125rem}@media (min-width:calc(1000px + 1px)){.mw-290-d{max-width:18.125rem}}.mw-300{max-width:18.75rem}@media (min-width:calc(1000px + 1px)){.mw-300-d{max-width:18.75rem}}.mw-310{max-width:19.375rem}@media (min-width:calc(1000px + 1px)){.mw-310-d{max-width:19.375rem}}.mw-320{max-width:20rem}@media (min-width:calc(1000px + 1px)){.mw-320-d{max-width:20rem}}.mw-330{max-width:20.625rem}@media (min-width:calc(1000px + 1px)){.mw-330-d{max-width:20.625rem}}.mw-340{max-width:21.25rem}@media (min-width:calc(1000px + 1px)){.mw-340-d{max-width:21.25rem}}.mw-350{max-width:21.875rem}@media (min-width:calc(1000px + 1px)){.mw-350-d{max-width:21.875rem}}.mw-360{max-width:22.5rem}@media (min-width:calc(1000px + 1px)){.mw-360-d{max-width:22.5rem}}.mw-370{max-width:23.125rem}@media (min-width:calc(1000px + 1px)){.mw-370-d{max-width:23.125rem}}.mw-380{max-width:23.75rem}@media (min-width:calc(1000px + 1px)){.mw-380-d{max-width:23.75rem}}.mw-390{max-width:24.375rem}@media (min-width:calc(1000px + 1px)){.mw-390-d{max-width:24.375rem}}.mw-400{max-width:25rem}@media (min-width:calc(1000px + 1px)){.mw-400-d{max-width:25rem}}.mw-410{max-width:25.625rem}@media (min-width:calc(1000px + 1px)){.mw-410-d{max-width:25.625rem}}.mw-420{max-width:26.25rem}@media (min-width:calc(1000px + 1px)){.mw-420-d{max-width:26.25rem}}.mw-430{max-width:26.875rem}@media (min-width:calc(1000px + 1px)){.mw-430-d{max-width:26.875rem}}.mw-440{max-width:27.5rem}@media (min-width:calc(1000px + 1px)){.mw-440-d{max-width:27.5rem}}.mw-450{max-width:28.125rem}@media (min-width:calc(1000px + 1px)){.mw-450-d{max-width:28.125rem}}.mw-460{max-width:28.75rem}@media (min-width:calc(1000px + 1px)){.mw-460-d{max-width:28.75rem}}.mw-470{max-width:29.375rem}@media (min-width:calc(1000px + 1px)){.mw-470-d{max-width:29.375rem}}.mw-480{max-width:30rem}@media (min-width:calc(1000px + 1px)){.mw-480-d{max-width:30rem}}.mw-490{max-width:30.625rem}@media (min-width:calc(1000px + 1px)){.mw-490-d{max-width:30.625rem}}.mw-500{max-width:31.25rem}@media (min-width:calc(1000px + 1px)){.mw-500-d{max-width:31.25rem}}.mw-510{max-width:31.875rem}@media (min-width:calc(1000px + 1px)){.mw-510-d{max-width:31.875rem}}.mw-520{max-width:32.5rem}@media (min-width:calc(1000px + 1px)){.mw-520-d{max-width:32.5rem}}.mw-530{max-width:33.125rem}@media (min-width:calc(1000px + 1px)){.mw-530-d{max-width:33.125rem}}.mw-540{max-width:33.75rem}@media (min-width:calc(1000px + 1px)){.mw-540-d{max-width:33.75rem}}.mw-550{max-width:34.375rem}@media (min-width:calc(1000px + 1px)){.mw-550-d{max-width:34.375rem}}.mw-560{max-width:35rem}@media (min-width:calc(1000px + 1px)){.mw-560-d{max-width:35rem}}.mw-570{max-width:35.625rem}@media (min-width:calc(1000px + 1px)){.mw-570-d{max-width:35.625rem}}.mw-580{max-width:36.25rem}@media (min-width:calc(1000px + 1px)){.mw-580-d{max-width:36.25rem}}.mw-590{max-width:36.875rem}@media (min-width:calc(1000px + 1px)){.mw-590-d{max-width:36.875rem}}.mw-600{max-width:37.5rem}@media (min-width:calc(1000px + 1px)){.mw-600-d{max-width:37.5rem}}.mw-610{max-width:38.125rem}@media (min-width:calc(1000px + 1px)){.mw-610-d{max-width:38.125rem}}.mw-620{max-width:38.75rem}@media (min-width:calc(1000px + 1px)){.mw-620-d{max-width:38.75rem}}.mw-630{max-width:39.375rem}@media (min-width:calc(1000px + 1px)){.mw-630-d{max-width:39.375rem}}.mw-640{max-width:40rem}@media (min-width:calc(1000px + 1px)){.mw-640-d{max-width:40rem}}.mw-650{max-width:40.625rem}@media (min-width:calc(1000px + 1px)){.mw-650-d{max-width:40.625rem}}.mw-660{max-width:41.25rem}@media (min-width:calc(1000px + 1px)){.mw-660-d{max-width:41.25rem}}.mw-670{max-width:41.875rem}@media (min-width:calc(1000px + 1px)){.mw-670-d{max-width:41.875rem}}.mw-680{max-width:42.5rem}@media (min-width:calc(1000px + 1px)){.mw-680-d{max-width:42.5rem}}.mw-690{max-width:43.125rem}@media (min-width:calc(1000px + 1px)){.mw-690-d{max-width:43.125rem}}.mw-700{max-width:43.75rem}@media (min-width:calc(1000px + 1px)){.mw-700-d{max-width:43.75rem}}.mw-710{max-width:44.375rem}@media (min-width:calc(1000px + 1px)){.mw-710-d{max-width:44.375rem}}.mw-720{max-width:45rem}@media (min-width:calc(1000px + 1px)){.mw-720-d{max-width:45rem}}.mw-730{max-width:45.625rem}@media (min-width:calc(1000px + 1px)){.mw-730-d{max-width:45.625rem}}.mw-740{max-width:46.25rem}@media (min-width:calc(1000px + 1px)){.mw-740-d{max-width:46.25rem}}.mw-750{max-width:46.875rem}@media (min-width:calc(1000px + 1px)){.mw-750-d{max-width:46.875rem}}.mw-760{max-width:47.5rem}@media (min-width:calc(1000px + 1px)){.mw-760-d{max-width:47.5rem}}.mw-770{max-width:48.125rem}@media (min-width:calc(1000px + 1px)){.mw-770-d{max-width:48.125rem}}.mw-780{max-width:48.75rem}@media (min-width:calc(1000px + 1px)){.mw-780-d{max-width:48.75rem}}.mw-790{max-width:49.375rem}@media (min-width:calc(1000px + 1px)){.mw-790-d{max-width:49.375rem}}.mw-800{max-width:50rem}@media (min-width:calc(1000px + 1px)){.mw-800-d{max-width:50rem}}.mw-810{max-width:50.625rem}@media (min-width:calc(1000px + 1px)){.mw-810-d{max-width:50.625rem}}.mw-820{max-width:51.25rem}@media (min-width:calc(1000px + 1px)){.mw-820-d{max-width:51.25rem}}.mw-830{max-width:51.875rem}@media (min-width:calc(1000px + 1px)){.mw-830-d{max-width:51.875rem}}.mw-840{max-width:52.5rem}@media (min-width:calc(1000px + 1px)){.mw-840-d{max-width:52.5rem}}.mw-850{max-width:53.125rem}@media (min-width:calc(1000px + 1px)){.mw-850-d{max-width:53.125rem}}.mw-860{max-width:53.75rem}@media (min-width:calc(1000px + 1px)){.mw-860-d{max-width:53.75rem}}.mw-870{max-width:54.375rem}@media (min-width:calc(1000px + 1px)){.mw-870-d{max-width:54.375rem}}.mw-880{max-width:55rem}@media (min-width:calc(1000px + 1px)){.mw-880-d{max-width:55rem}}.mw-890{max-width:55.625rem}@media (min-width:calc(1000px + 1px)){.mw-890-d{max-width:55.625rem}}.mw-900{max-width:56.25rem}@media (min-width:calc(1000px + 1px)){.mw-900-d{max-width:56.25rem}}.mw-910{max-width:56.875rem}@media (min-width:calc(1000px + 1px)){.mw-910-d{max-width:56.875rem}}.mw-920{max-width:57.5rem}@media (min-width:calc(1000px + 1px)){.mw-920-d{max-width:57.5rem}}.mw-930{max-width:58.125rem}@media (min-width:calc(1000px + 1px)){.mw-930-d{max-width:58.125rem}}.mw-940{max-width:58.75rem}@media (min-width:calc(1000px + 1px)){.mw-940-d{max-width:58.75rem}}.mw-950{max-width:59.375rem}@media (min-width:calc(1000px + 1px)){.mw-950-d{max-width:59.375rem}}.mw-960{max-width:60rem}@media (min-width:calc(1000px + 1px)){.mw-960-d{max-width:60rem}}.mw-970{max-width:60.625rem}@media (min-width:calc(1000px + 1px)){.mw-970-d{max-width:60.625rem}}.mw-980{max-width:61.25rem}@media (min-width:calc(1000px + 1px)){.mw-980-d{max-width:61.25rem}}.mw-990{max-width:61.875rem}@media (min-width:calc(1000px + 1px)){.mw-990-d{max-width:61.875rem}}.mw-1000{max-width:62.5rem}@media (min-width:calc(1000px + 1px)){.mw-1000-d{max-width:62.5rem}}.mw-1010{max-width:63.125rem}@media (min-width:calc(1000px + 1px)){.mw-1010-d{max-width:63.125rem}}.mw-1020{max-width:63.75rem}@media (min-width:calc(1000px + 1px)){.mw-1020-d{max-width:63.75rem}}.mw-1030{max-width:64.375rem}@media (min-width:calc(1000px + 1px)){.mw-1030-d{max-width:64.375rem}}.mw-1040{max-width:65rem}@media (min-width:calc(1000px + 1px)){.mw-1040-d{max-width:65rem}}.mw-1050{max-width:65.625rem}@media (min-width:calc(1000px + 1px)){.mw-1050-d{max-width:65.625rem}}.pad{padding-left:var(--padding) !important;padding-right:var(--padding) !important}@media (max-width:1000px){.pad{padding-left:var(--padding) !important;padding-right:var(--padding) !important}}@media (max-width:600px){.pad{padding-left:var(--padding) !important;padding-right:var(--padding) !important}}.fw{width:100%}.center{text-align:center}button{cursor:pointer}.noselect{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.noscroll{-ms-overflow-style:none;scrollbar-width:none}.noscroll::-webkit-scrollbar{display:none}@media (max-width:1000px){.desktop{display:none !important}}@media (min-width:calc(1000px + 1px)){.mobile{display:none !important}}.fw{width:100%}.flex{display:flex;justify-content:center;align-items:center}.flex-c{display:flex;justify-content:center;align-items:center;flex-direction:column}.auto{margin-left:auto;margin-right:auto}.align-start{align-items:flex-start}.align-end{align-items:flex-end}.align-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-between{justify-content:space-between}.justify-evenly{justify-content:space-evenly}.upper{text-transform:uppercase}.component{position:relative}.component:empty{display:none}.component-error code{padding:0.1875rem 0.3125rem 0.125rem;background:rgba(0, 0, 0, 0.07);margin-top:0.5rem;font-weight:400 !important}/* ============================================================================ BETTRWEB — theme globals (design tokens, grid, base styles, primitives). Single source of truth:design-system.md (repo root). Compiled by bettrlite:reset → plugin style → THIS (twice:compiled + raw for mixins/@extend) → components → theme style.scss. ========================================================================== */ /* LEGACY COMPAT:hero / not_found / post_content still reference these two. Remove together with those components' rebuild. */
/* ---- Self-hosted fonts:PP Neue Montreal (design-system §2.1) -------------- The design uses exactly two styles:Medium 500 (~everything) and Book 400 (footer contact values). Book registers at 400 (the slot the design references);Regular is parked at 450 so the two 400-embedded files never collide. */
@font-face{font-family:"PP Neue Montreal";font-style:normal;font-weight:100;font-display:swap;src:url("/wp-content/themes/dev/fonts/PPNeueMontreal-Thin.woff2") format("woff2")}@font-face{font-family:"PP Neue Montreal";font-style:italic;font-weight:100;font-display:swap;src:url("/wp-content/themes/dev/fonts/PPNeueMontreal-ThinItalic.woff2") format("woff2")}@font-face{font-family:"PP Neue Montreal";font-style:normal;font-weight:300;font-display:swap;src:url("/wp-content/themes/dev/fonts/PPNeueMontreal-Light.woff2") format("woff2")}@font-face{font-family:"PP Neue Montreal";font-style:normal;font-weight:400;font-display:swap;src:url("/wp-content/themes/dev/fonts/PPNeueMontreal-Book.woff2") format("woff2")}@font-face{font-family:"PP Neue Montreal";font-style:normal;font-weight:450;font-display:swap;src:url("/wp-content/themes/dev/fonts/PPNeueMontreal-Regular.woff2") format("woff2")}@font-face{font-family:"PP Neue Montreal";font-style:italic;font-weight:450;font-display:swap;src:url("/wp-content/themes/dev/fonts/PPNeueMontreal-Italic.woff2") format("woff2")}@font-face{font-family:"PP Neue Montreal";font-style:normal;font-weight:500;font-display:swap;src:url("/wp-content/themes/dev/fonts/PPNeueMontreal-Medium.woff2") format("woff2")}@font-face{font-family:"PP Neue Montreal";font-style:normal;font-weight:700;font-display:swap;src:url("/wp-content/themes/dev/fonts/PPNeueMontreal-Bold.woff2") format("woff2")}@font-face{font-family:"PP Neue Montreal";font-style:italic;font-weight:700;font-display:swap;src:url("/wp-content/themes/dev/fonts/PPNeueMontreal-BoldItalic.woff2") format("woff2")}:root{--width:90rem;--padding:2rem;--color-black:#141414;--color-white:#ffffff;--color-grey:#515151;--color-orange:#ff3b14;/* LEGACY COMPAT remaps (hero / not_found / post_content still reference the old Wine Collectors names;remapped onto the BETTRWEB palette so nothing renders off-brand while those components await their rebuild). */ --green:var(--color-black);--verde:var(--color-white);--gold:var(--color-orange);--red:var(--color-orange);--mint:var(--color-white);--font-h:"PP Neue Montreal", system-ui, sans-serif;--font-b:"PP Neue Montreal", system-ui, sans-serif;--grid-columns:12;--grid-gutter:1rem;--grid-margin:2rem;--cols:var(--grid-columns);--gutter:var(--grid-gutter);--margin:var(--grid-margin);/* Header offset — MUST equal the rendered .component-header height, because 13 sections use it as their fixed-header padding-top. Derived, not guessed:block padding ×2 + the TALLEST bar child + the 1px bottom rule. The tallest child is the "Sazināties" button (38px) on desktop and the burger (44px) once the nav collapses — NOT the 26px logo (the old 90px value assumed the logo and left the header overlapping content by 13px). Keep --header-pad in sync with .header__bar padding-block;the bar reads this same variable so the two cannot drift apart again. */ --header-pad:32px;--header-control-h:38px;--header-h:calc(var(--header-pad) * 2 + var(--header-control-h) + 1px);--text-h1:clamp(40px, 2.1vw + 32px, 80px);--text-h2:clamp(30px, 0.94vw + 30px, 48px);--text-h3:clamp(20px, 0.2vw + 20px, 24px);--text-lg:clamp(18px, 0.1vw + 18px, 20px);--text-nav:18px;--text-body:clamp(16px, 0.1vw + 16px, 18px);--text-sm:16px;--text-xs:14px;--track-1:-0.01em;--track-2:-0.02em;--space-1:1rem;--space-2:2rem;--space-3:3rem;--space-4:4rem;--space-6:6rem;--section-pad:var(--space-6);--ease-osmo:cubic-bezier(0.625, 0.05, 0, 1);/* Underlined-link convention (client fix 2026-08-11):PP Neue Montreal's embedded underline metrics place a `from-font` underline INSIDE the glyph box (strike-through look), so every text underline uses an explicit offset + 1px hairline instead — matches the Figma clean 1px line below the baseline. skip-ink:none keeps the line continuous. */ --underline-offset:0.15em;--t-display:var(--text-h1);--t-h2:var(--text-h2);--t-h3:var(--text-h3);--t-lead:var(--text-body);--t-body:var(--text-body);--t-small:var(--text-xs);/* Header shrinks with the nav:below $tablet the bar padding drops and the 44px burger becomes the tallest child, so the offset must follow. */}@media (min-width:1440px){:root{--grid-margin:3rem}}@media (max-width:1023px){:root{--header-pad:24px;--header-control-h:44px}}@media (max-width:767px){:root{--grid-columns:4;--padding:1.25rem;--header-pad:20px}}html{font-size:16px;scroll-behavior:auto;/* clip (not hidden):hidden creates a scroll container that breaks position:sticky descendants;clip doesn't. */ overflow-x:hidden;overflow-x:clip;/* Native scrollbar fully hidden — the fixed grey pill (.scroll-indicator, JS-driven, ported from wine-collectors) replaces it. */ scrollbar-width:none}::-webkit-scrollbar{display:none;width:0}body{font-family:var(--font-b);font-weight:500;font-size:var(--text-body);line-height:1.5;letter-spacing:var(--track-1);color:var(--color-white);background:var(--color-black);overflow-x:hidden;overflow-x:clip;position:relative;width:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}main[data-barba=container]{position:relative;z-index:1}/* Headings — sentence case (no auto-uppercase;.u-caps is the only caps utility, reserved for card meta / legal lines). All Medium 500. */
h1, h2, h3, h4, h5, h6{font-family:var(--font-h);font-weight:500;font-style:normal;margin:0}h1{font-size:var(--text-h1);line-height:1;letter-spacing:var(--track-2)}h2{font-size:var(--text-h2);line-height:1.2;letter-spacing:var(--track-1)}h3{font-size:var(--text-h3);line-height:1.2;letter-spacing:var(--track-1)}p{margin:0}p + p{margin-top:9px}a{color:inherit}em, i, .italic{font-style:italic}::selection{background:var(--color-orange);color:var(--color-white)}.t-h1, .t-display{font-size:var(--text-h1);font-weight:500;line-height:1;letter-spacing:var(--track-2)}.t-h2{font-size:var(--text-h2);font-weight:500;line-height:1.2;letter-spacing:var(--track-1)}.t-h3{font-size:var(--text-h3);font-weight:500;line-height:1.2;letter-spacing:var(--track-1)}.t-lg, .t-lead{font-size:var(--text-lg);font-weight:500;line-height:1.2;letter-spacing:var(--track-1)}.t-body{font-size:var(--text-body);font-weight:500;line-height:1.5;letter-spacing:var(--track-1)}.t-sm{font-size:var(--text-sm);font-weight:500;line-height:1.5;letter-spacing:var(--track-1)}.t-xs, .t-small, .t-meta{font-size:var(--text-xs);font-weight:500;line-height:1;letter-spacing:var(--track-1)}.u-caps{text-transform:uppercase}/* ---- Grid (design-system §3 — non-negotiable) -------------------------------- 12 columns (4 on mobile), 1rem gutters, fluid side margins. Components place content with grid-column — no arbitrary flexbox positioning. */
.grid{display:grid;grid-template-columns:repeat(var(--grid-columns), minmax(0, 1fr));column-gap:var(--grid-gutter);padding-inline:var(--grid-margin);position:relative}.grid-overlay{position:fixed;inset:0;z-index:9998;pointer-events:none;display:none;grid-template-columns:repeat(var(--grid-columns), minmax(0, 1fr));column-gap:var(--grid-gutter);padding-inline:var(--grid-margin)}.grid-overlay span{background:rgba(255, 59, 20, 0.06);outline:1px solid rgba(255, 59, 20, 0.18);height:100%}body.show-grid .grid-overlay{display:grid}/* ---- Custom scroll indicator (native scrollbar hidden above) ------------------ Ported from wine-collectors (same JS driver, brand colors swapped:grey #515151 thumb on the transparent/near-black canvas, no accent — orange is reserved for the one hover moment per view). JS (initWCScrollIndicator) sizes the thumb and translates it;fades in on scroll activity, out after 900ms idle. z-index 1500:above content + header, below the transition curtain (10000) and grid overlay (9998... below grid overlay too). */
.scroll-indicator{position:fixed;top:0;right:5px;width:6px;height:44px;border-radius:999px;background:var(--color-grey);z-index:1500;pointer-events:none;opacity:0;transition:opacity 0.2s ease;will-change:transform, opacity}.scroll-indicator.is-visible{opacity:1}/* ---- Pill button (design-system §5.1, Figma 129:13403) ----------------------- Reusable:.btn-pill anywhere (header CTA, section CTAs). Dark-surface default (white);.btn-pill--dark derived for white surfaces (no on-white button exists in Figma — flagged for design review). Hover:white → orange (border+text+arrow via currentColor), gap 4→8px. */
.btn-pill,
.wc-btn{display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:6px 11px 6px 15px;border:1px solid currentColor;border-radius:100px;background:transparent;color:var(--color-white);font-family:var(--font-b);font-weight:500;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-2);white-space:nowrap;text-decoration:none;cursor:pointer;transition:color 0.3s var(--ease-osmo), gap 0.3s var(--ease-osmo)}@media (hover:hover) and (pointer:fine){.btn-pill:hover, .wc-btn:hover{color:var(--color-orange);gap:8px}}.btn-pill--dark{color:var(--color-black)}/* 24px icon box;the real Figma arrow vector (12.36×19.14 up-arrow) rotated 90° reads as the right-pointing 24px arrow. fill/stroke = currentColor so the hover recolor needs no second file. */
.btn-pill__icon{width:24px;height:24px;flex:none;display:flex;align-items:center;justify-content:center}.btn-pill__icon svg{display:block;width:12.4px;height:19.2px;transform:rotate(90deg)}/* ---- Inline text link (design-system §5.3) ------------------------------------ "Uzzināt vairāk" / "Apskatīt visus" pattern:white, no underline;hover = orange + underline. 20px inside list rows (.link--lg), 18px elsewhere. */
.link{font-weight:500;font-size:var(--text-nav);line-height:1.5;letter-spacing:var(--track-1);color:inherit;text-decoration:none;transition:color 0.3s var(--ease-osmo)}.link--lg{font-size:var(--text-lg);line-height:1.2}@media (hover:hover) and (pointer:fine){.link:hover{color:var(--color-orange);text-decoration:underline;text-underline-offset:var(--underline-offset);text-decoration-thickness:1px;text-decoration-skip-ink:none}}/* Section-top underlined link (Figma "Apskatīt visus" / "Atsauksmes" / "Vairāk par mums":18px, white, underlined by default;hover → orange). `a.link-u` is needed to out-rank the plugin's `.component a{text-decoration:none}` (equal specificity, later source order). */
a.link-u,
.link-u{font-weight:500;font-size:var(--text-nav);line-height:1.5;letter-spacing:var(--track-1);color:inherit;text-decoration:underline;text-underline-offset:var(--underline-offset);text-decoration-thickness:1px;text-decoration-skip-ink:none;transition:color 0.3s var(--ease-osmo)}@media (hover:hover) and (pointer:fine){a.link-u:hover{color:var(--color-orange)}}/* ---- Animated underline sweep (§5.2 header-nav language, shared) -------------- The hover underline convention for single-line links:a 1px currentColor line sweeps in from the LEFT (scaleX 0 → 1, 0.3s house osmo ease). Extracted from the header menu item (client fix 2026-08-12) so footer/service/legal links share one mechanism instead of instant text-decoration flips. Include sweep-underline on the link (or its label span), then trigger with `&::after{transform:scaleX(1)}` from the hover/active rule. NOT for:permanent underlines (.link-u, footer contact values, active filter — those stay static), or links that can WRAP to multiple lines (a pseudo-element underline only draws under the element box, so it breaks on wrapped lines — those keep static text-decoration, see footer mobile). */ .hairline{border:0;height:1px;background:var(--color-grey)}.rotating-badge{position:absolute;width:110px;height:110px;z-index:5}.rotating-badge__ring{width:100%;height:100%;will-change:transform}@media (max-width:699px){.rotating-badge{display:none}}/* ---- Accordion primitive (Figma BUJ sekcija 156:8171 + service single 181:8667 — the two accordion usages share one mechanic) -------------------- Rows on #515151 hairlines, 24px Medium question, right-side icon (chevron in the BUJ spec, plus in the service-single spec — .acc__icon--plus). Height animation is GSAP-owned (initAccordions, components/faq/index.js);CSS only defines states + the reduced-motion/no-JS fallback. Answer typography is DERIVED (Figma shows only closed rows) — 18px Book on 66% width — flagged for design review. */
.acc{display:flex;flex-direction:column;width:100%}.acc__item{border-bottom:1px solid var(--color-grey)}.acc__item:first-child{border-top:1px solid var(--color-grey)}.acc__head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-1);width:100%;padding:var(--space-2) 0;background:none;border:0;color:inherit;font-family:var(--font-h);text-align:left;cursor:pointer}.acc__title{position:relative;font-size:var(--text-h3);font-weight:500;line-height:1.2;letter-spacing:var(--track-1);/* Orange dot after the label on hover — the nav-item language (header__link::after):10px circle, 8px right of the text, eased scale + fade. Absolutely positioned so it never shifts the row. */}.acc__title::after{content:"";position:absolute;left:calc(100% + 8px);top:50%;width:10px;height:10px;border-radius:50%;background:var(--color-orange);transform:translateY(-50%) scale(0.4);opacity:0;transition:opacity 0.3s var(--ease-osmo), transform 0.3s var(--ease-osmo)}.acc__icon{flex:none;display:flex;align-items:center;justify-content:center;width:20px;height:20px;transition:transform 0.5s var(--ease-osmo)}.acc__icon svg{display:block;fill:currentColor}.acc__item.is-open .acc__icon--chevron{transform:rotate(180deg)}.acc__item.is-open .acc__icon--plus{transform:rotate(45deg)}.acc__panel{overflow:hidden}.acc__panel[hidden]{display:none}.acc__body{padding-bottom:var(--space-2);max-width:66%;font-size:var(--text-body);font-weight:500;line-height:1.5;letter-spacing:var(--track-1)}@media (max-width:767px){.acc__body{max-width:100%}}/* Hover reveals the orange dot after the title (client 2026-08-15 — replaces the old red text-colour change, which the client didn't want). */
@media (hover:hover) and (pointer:fine){.acc__head:hover .acc__title::after{opacity:1;transform:translateY(-50%) scale(1)}}@media (prefers-reduced-motion:reduce){.acc__icon{transition:none}}/* ---- Accent dot (Figma Ellipse 14 — 24px orange circle preceding display copy in the CTA + service intro;the sanctioned one-orange-moment) -------- */
.accent-dot{display:inline-block;width:24px;height:24px;border-radius:50%;background:var(--color-orange);flex:none}/* ---- Contact-form validation message (shared primitive) ----------------------- Both contact forms carry the .contact__field class (components/contact's dark placeholder rows AND contact_page's light label rows — the kontakti markup stacks .cp__field on top), so this lives here like the .acc primitive. The message (.contact__error, injected by initContactForm) sits ABSOLUTE just below the field's underline — showing/hiding never shifts the layout — 14px orange, fading/rising in 0.3s osmo while the underline flips orange in sync (is-invalid). No Figma spec for form errors (design-system §5 "no form fields exist in Figma") — derived;FLAGGED for design review. */
.contact__field{position:relative}.contact__error{position:absolute;left:0;top:calc(100% + 5px);font-size:var(--text-xs);font-weight:500;line-height:1;letter-spacing:var(--track-1);color:var(--color-orange);opacity:0;transform:translateY(-4px);transition:opacity 0.3s var(--ease-osmo), transform 0.3s var(--ease-osmo);pointer-events:none}.contact__field.is-invalid .contact__error{opacity:1;transform:none}@media (prefers-reduced-motion:reduce){.contact__error{transition:none}}/* ---- Contact-form attachments (shared primitive) ------------------------------ File-upload row for both contact forms (services CTA on dark, kontakti on light) — same underline-row language as the text fields:"Pielikumi" label + hint left, "Pievienot failu" trigger (the Figma plus glyph, same vector as the service-single accordion) right, all on one hairline row. Selected files stack as rows above the underline;drag-and-drop highlights the row with a dashed hairline + orange accent (the sanctioned hover-orange). Everything currentColor so the dark/light surfaces both work. No Figma spec for file fields (design-system §5:none exist) — DERIVED from the underline-row + accordion primitives;FLAGGED for design review. */
.contact__attach{display:flex;flex-direction:column;border-bottom:1px solid currentColor;padding-bottom:7px;transition:border-color 0.3s var(--ease-osmo);/* Drag-over:dashed hairline + the orange accent (subtle — border+trigger only, no fills;orange discipline §1). Two-class specificity so it out-ranks the component sheets' .contact__field border rules. */}.contact__attach.is-invalid, .contact__attach:focus-within{border-bottom-color:var(--color-orange)}.contact__attach.is-dragover{border-bottom-style:dashed;border-bottom-color:var(--color-orange)}.contact__attach.is-dragover .contact__attach-trigger{color:var(--color-orange)}.contact__attach-row{display:flex;align-items:baseline;justify-content:space-between;gap:var(--space-1);flex-wrap:wrap}.contact__attach-label{font-weight:500;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-1)}.contact__attach-hint{font-size:var(--text-xs);opacity:0.5;white-space:nowrap}/* The real <input type=file> stays in the DOM, focusable, visually hidden (sr-only recipe — NOT display:none) inside the trigger label;clicking or activating the trigger opens the native picker. Two-class specificity out-ranks the component sheets' `.contact__field input` sizing rules. */
.contact__attach .contact__attach-input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.contact__attach-trigger{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-weight:500;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-1);color:inherit;transition:color 0.3s var(--ease-osmo);/* Keyboard focus on the hidden input lights the trigger like every other focusable (mirrors the global:focus-visible outline). */}.contact__attach-trigger:has(.contact__attach-input:focus-visible){outline:2px solid var(--color-orange);outline-offset:3px}@media (hover:hover) and (pointer:fine){.contact__attach-trigger:hover{color:var(--color-orange)}}.contact__attach-plus{flex:none;display:flex;align-items:center;justify-content:center;width:15px;height:15px}.contact__attach-plus svg{display:block;width:100%;height:100%;fill:currentColor}/* Selected-files list:each file is a row (hairline-separated, echoing the underline language) — truncated name left, size + remove "×" right. Rows animate in/out with the house 0.3s osmo fade/rise (JS toggles .is-in / .is-leaving);reduced-motion renders instantly. */
.contact__attach-list{list-style:none;margin:12px 0 0;padding:0;display:flex;flex-direction:column}.contact__attach-list[hidden]{display:none}.contact__attach-item{display:flex;align-items:center;gap:var(--space-1);padding:8px 0;border-top:1px dashed color-mix(in srgb, currentColor 25%, transparent);font-size:var(--text-xs);line-height:1.5;letter-spacing:var(--track-1);opacity:0;transform:translateY(6px);transition:opacity 0.3s var(--ease-osmo), transform 0.3s var(--ease-osmo)}.contact__attach-item.is-in{opacity:1;transform:none}.contact__attach-item.is-leaving{opacity:0;transform:translateY(-4px)}.contact__attach-name{font-weight:500;min-width:0;overflow:hidden;white-space:nowrap}.contact__attach-size{margin-left:auto;flex:none;font-weight:400;opacity:0.5}.contact__attach-remove{flex:none;display:flex;align-items:center;justify-content:center;width:24px;height:24px;margin-right:-4px;padding:0;background:none;border:0;color:inherit;font-family:var(--font-b);font-weight:400;font-size:18px;line-height:1;cursor:pointer;transition:color 0.3s var(--ease-osmo)}@media (hover:hover) and (pointer:fine){.contact__attach-remove:hover{color:var(--color-orange)}}@media (prefers-reduced-motion:reduce){.contact__attach, .contact__attach-item{transition:none}}/* Sending state (files can take seconds):the pill's label swaps to "Sūta..." (JS) and the arrow pulses subtly while disabled. DERIVED (no Figma loading spec) — FLAGGED for design review. */
.btn-pill.loading{cursor:progress}.btn-pill.loading .btn-pill__icon svg{animation:bw-send-pulse 1.1s var(--ease-osmo) infinite alternate}@keyframes bw-send-pulse{from{opacity:1}to{opacity:0.3}}@media (prefers-reduced-motion:reduce){.btn-pill.loading .btn-pill__icon svg{animation:none;opacity:0.5}}.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}a:focus-visible,
button:focus-visible{outline:2px solid var(--color-orange);outline-offset:3px}.wc-anchor{position:absolute;top:0;left:0;width:1px;height:1px}/* ---- Honeypot (spam trap, shared by every form) -------------------------- A real field to a bot, invisible and unreachable to a person:off-canvas rather than display:none (which naive scrapers skip), out of the tab order, aria-hidden so screen readers never announce it, and autocomplete off so no browser ever fills it on someone's behalf. Any value arriving in it means the sender was not a person — submissions.php drops those. */
.hp-field{position:absolute;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden;opacity:0;pointer-events:none}/* ---- Hero WebGL slider canvas (components/hero/index.js) ----------------- Sits above the DOM slide stack inside .hero__media / .sh__media (the imgs stay as the LCP/SEO source and the CSS-crossfade fallback). Removed by JS on context loss / reduced motion / no WebGL. */
.hero-gl{position:absolute;inset:0;width:100%;height:100%;display:block;pointer-events:none}/* ============================================================================ BETTRWEB — theme globals (design tokens, grid, base styles, primitives). Single source of truth:design-system.md (repo root). Compiled by bettrlite:reset → plugin style → THIS (twice:compiled + raw for mixins/@extend) → components → theme style.scss. ========================================================================== */ /* LEGACY COMPAT:hero / not_found / post_content still reference these two. Remove together with those components' rebuild. */
/* ---- Self-hosted fonts:PP Neue Montreal (design-system §2.1) -------------- The design uses exactly two styles:Medium 500 (~everything) and Book 400 (footer contact values). Book registers at 400 (the slot the design references);Regular is parked at 450 so the two 400-embedded files never collide. */
@font-face{font-family:"PP Neue Montreal";font-style:normal;font-weight:100;font-display:swap;src:url("/wp-content/themes/dev/fonts/PPNeueMontreal-Thin.woff2") format("woff2")}@font-face{font-family:"PP Neue Montreal";font-style:italic;font-weight:100;font-display:swap;src:url("/wp-content/themes/dev/fonts/PPNeueMontreal-ThinItalic.woff2") format("woff2")}@font-face{font-family:"PP Neue Montreal";font-style:normal;font-weight:300;font-display:swap;src:url("/wp-content/themes/dev/fonts/PPNeueMontreal-Light.woff2") format("woff2")}@font-face{font-family:"PP Neue Montreal";font-style:normal;font-weight:400;font-display:swap;src:url("/wp-content/themes/dev/fonts/PPNeueMontreal-Book.woff2") format("woff2")}@font-face{font-family:"PP Neue Montreal";font-style:normal;font-weight:450;font-display:swap;src:url("/wp-content/themes/dev/fonts/PPNeueMontreal-Regular.woff2") format("woff2")}@font-face{font-family:"PP Neue Montreal";font-style:italic;font-weight:450;font-display:swap;src:url("/wp-content/themes/dev/fonts/PPNeueMontreal-Italic.woff2") format("woff2")}@font-face{font-family:"PP Neue Montreal";font-style:normal;font-weight:500;font-display:swap;src:url("/wp-content/themes/dev/fonts/PPNeueMontreal-Medium.woff2") format("woff2")}@font-face{font-family:"PP Neue Montreal";font-style:normal;font-weight:700;font-display:swap;src:url("/wp-content/themes/dev/fonts/PPNeueMontreal-Bold.woff2") format("woff2")}@font-face{font-family:"PP Neue Montreal";font-style:italic;font-weight:700;font-display:swap;src:url("/wp-content/themes/dev/fonts/PPNeueMontreal-BoldItalic.woff2") format("woff2")}:root{--width:90rem;--padding:2rem;--color-black:#141414;--color-white:#ffffff;--color-grey:#515151;--color-orange:#ff3b14;/* LEGACY COMPAT remaps (hero / not_found / post_content still reference the old Wine Collectors names;remapped onto the BETTRWEB palette so nothing renders off-brand while those components await their rebuild). */ --green:var(--color-black);--verde:var(--color-white);--gold:var(--color-orange);--red:var(--color-orange);--mint:var(--color-white);--font-h:"PP Neue Montreal", system-ui, sans-serif;--font-b:"PP Neue Montreal", system-ui, sans-serif;--grid-columns:12;--grid-gutter:1rem;--grid-margin:2rem;--cols:var(--grid-columns);--gutter:var(--grid-gutter);--margin:var(--grid-margin);/* Header offset — MUST equal the rendered .component-header height, because 13 sections use it as their fixed-header padding-top. Derived, not guessed:block padding ×2 + the TALLEST bar child + the 1px bottom rule. The tallest child is the "Sazināties" button (38px) on desktop and the burger (44px) once the nav collapses — NOT the 26px logo (the old 90px value assumed the logo and left the header overlapping content by 13px). Keep --header-pad in sync with .header__bar padding-block;the bar reads this same variable so the two cannot drift apart again. */ --header-pad:32px;--header-control-h:38px;--header-h:calc(var(--header-pad) * 2 + var(--header-control-h) + 1px);--text-h1:clamp(40px, 2.1vw + 32px, 80px);--text-h2:clamp(30px, 0.94vw + 30px, 48px);--text-h3:clamp(20px, 0.2vw + 20px, 24px);--text-lg:clamp(18px, 0.1vw + 18px, 20px);--text-nav:18px;--text-body:clamp(16px, 0.1vw + 16px, 18px);--text-sm:16px;--text-xs:14px;--track-1:-0.01em;--track-2:-0.02em;--space-1:1rem;--space-2:2rem;--space-3:3rem;--space-4:4rem;--space-6:6rem;--section-pad:var(--space-6);--ease-osmo:cubic-bezier(0.625, 0.05, 0, 1);/* Underlined-link convention (client fix 2026-08-11):PP Neue Montreal's embedded underline metrics place a `from-font` underline INSIDE the glyph box (strike-through look), so every text underline uses an explicit offset + 1px hairline instead — matches the Figma clean 1px line below the baseline. skip-ink:none keeps the line continuous. */ --underline-offset:0.15em;--t-display:var(--text-h1);--t-h2:var(--text-h2);--t-h3:var(--text-h3);--t-lead:var(--text-body);--t-body:var(--text-body);--t-small:var(--text-xs);/* Header shrinks with the nav:below $tablet the bar padding drops and the 44px burger becomes the tallest child, so the offset must follow. */}@media (min-width:1440px){:root{--grid-margin:3rem}}@media (max-width:1023px){:root{--header-pad:24px;--header-control-h:44px}}@media (max-width:767px){:root{--grid-columns:4;--padding:1.25rem;--header-pad:20px}}html{font-size:16px;scroll-behavior:auto;/* clip (not hidden):hidden creates a scroll container that breaks position:sticky descendants;clip doesn't. */ overflow-x:hidden;overflow-x:clip;/* Native scrollbar fully hidden — the fixed grey pill (.scroll-indicator, JS-driven, ported from wine-collectors) replaces it. */ scrollbar-width:none}::-webkit-scrollbar{display:none;width:0}body{font-family:var(--font-b);font-weight:500;font-size:var(--text-body);line-height:1.5;letter-spacing:var(--track-1);color:var(--color-white);background:var(--color-black);overflow-x:hidden;overflow-x:clip;position:relative;width:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}main[data-barba=container]{position:relative;z-index:1}/* Headings — sentence case (no auto-uppercase;.u-caps is the only caps utility, reserved for card meta / legal lines). All Medium 500. */
h1, h2, h3, h4, h5, h6{font-family:var(--font-h);font-weight:500;font-style:normal;margin:0}h1{font-size:var(--text-h1);line-height:1;letter-spacing:var(--track-2)}h2{font-size:var(--text-h2);line-height:1.2;letter-spacing:var(--track-1)}h3{font-size:var(--text-h3);line-height:1.2;letter-spacing:var(--track-1)}p{margin:0}p + p{margin-top:9px}a{color:inherit}em, i, .italic{font-style:italic}::selection{background:var(--color-orange);color:var(--color-white)}.t-h1, .t-display{font-size:var(--text-h1);font-weight:500;line-height:1;letter-spacing:var(--track-2)}.t-h2{font-size:var(--text-h2);font-weight:500;line-height:1.2;letter-spacing:var(--track-1)}.t-h3{font-size:var(--text-h3);font-weight:500;line-height:1.2;letter-spacing:var(--track-1)}.t-lg, .t-lead{font-size:var(--text-lg);font-weight:500;line-height:1.2;letter-spacing:var(--track-1)}.t-body{font-size:var(--text-body);font-weight:500;line-height:1.5;letter-spacing:var(--track-1)}.t-sm{font-size:var(--text-sm);font-weight:500;line-height:1.5;letter-spacing:var(--track-1)}.t-xs, .t-small, .t-meta{font-size:var(--text-xs);font-weight:500;line-height:1;letter-spacing:var(--track-1)}.u-caps{text-transform:uppercase}/* ---- Grid (design-system §3 — non-negotiable) -------------------------------- 12 columns (4 on mobile), 1rem gutters, fluid side margins. Components place content with grid-column — no arbitrary flexbox positioning. */
.grid{display:grid;grid-template-columns:repeat(var(--grid-columns), minmax(0, 1fr));column-gap:var(--grid-gutter);padding-inline:var(--grid-margin);position:relative}.grid-overlay{position:fixed;inset:0;z-index:9998;pointer-events:none;display:none;grid-template-columns:repeat(var(--grid-columns), minmax(0, 1fr));column-gap:var(--grid-gutter);padding-inline:var(--grid-margin)}.grid-overlay span{background:rgba(255, 59, 20, 0.06);outline:1px solid rgba(255, 59, 20, 0.18);height:100%}body.show-grid .grid-overlay{display:grid}/* ---- Custom scroll indicator (native scrollbar hidden above) ------------------ Ported from wine-collectors (same JS driver, brand colors swapped:grey #515151 thumb on the transparent/near-black canvas, no accent — orange is reserved for the one hover moment per view). JS (initWCScrollIndicator) sizes the thumb and translates it;fades in on scroll activity, out after 900ms idle. z-index 1500:above content + header, below the transition curtain (10000) and grid overlay (9998... below grid overlay too). */
.scroll-indicator{position:fixed;top:0;right:5px;width:6px;height:44px;border-radius:999px;background:var(--color-grey);z-index:1500;pointer-events:none;opacity:0;transition:opacity 0.2s ease;will-change:transform, opacity}.scroll-indicator.is-visible{opacity:1}/* ---- Pill button (design-system §5.1, Figma 129:13403) ----------------------- Reusable:.btn-pill anywhere (header CTA, section CTAs). Dark-surface default (white);.btn-pill--dark derived for white surfaces (no on-white button exists in Figma — flagged for design review). Hover:white → orange (border+text+arrow via currentColor), gap 4→8px. */
.btn-pill,
.wc-btn{display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:6px 11px 6px 15px;border:1px solid currentColor;border-radius:100px;background:transparent;color:var(--color-white);font-family:var(--font-b);font-weight:500;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-2);white-space:nowrap;text-decoration:none;cursor:pointer;transition:color 0.3s var(--ease-osmo), gap 0.3s var(--ease-osmo)}@media (hover:hover) and (pointer:fine){.btn-pill:hover, .wc-btn:hover{color:var(--color-orange);gap:8px}}.btn-pill--dark{color:var(--color-black)}/* 24px icon box;the real Figma arrow vector (12.36×19.14 up-arrow) rotated 90° reads as the right-pointing 24px arrow. fill/stroke = currentColor so the hover recolor needs no second file. */
.btn-pill__icon{width:24px;height:24px;flex:none;display:flex;align-items:center;justify-content:center}.btn-pill__icon svg{display:block;width:12.4px;height:19.2px;transform:rotate(90deg)}/* ---- Inline text link (design-system §5.3) ------------------------------------ "Uzzināt vairāk" / "Apskatīt visus" pattern:white, no underline;hover = orange + underline. 20px inside list rows (.link--lg), 18px elsewhere. */
.link{font-weight:500;font-size:var(--text-nav);line-height:1.5;letter-spacing:var(--track-1);color:inherit;text-decoration:none;transition:color 0.3s var(--ease-osmo)}.link--lg{font-size:var(--text-lg);line-height:1.2}@media (hover:hover) and (pointer:fine){.link:hover{color:var(--color-orange);text-decoration:underline;text-underline-offset:var(--underline-offset);text-decoration-thickness:1px;text-decoration-skip-ink:none}}/* Section-top underlined link (Figma "Apskatīt visus" / "Atsauksmes" / "Vairāk par mums":18px, white, underlined by default;hover → orange). `a.link-u` is needed to out-rank the plugin's `.component a{text-decoration:none}` (equal specificity, later source order). */
a.link-u,
.link-u{font-weight:500;font-size:var(--text-nav);line-height:1.5;letter-spacing:var(--track-1);color:inherit;text-decoration:underline;text-underline-offset:var(--underline-offset);text-decoration-thickness:1px;text-decoration-skip-ink:none;transition:color 0.3s var(--ease-osmo)}@media (hover:hover) and (pointer:fine){a.link-u:hover{color:var(--color-orange)}}/* ---- Animated underline sweep (§5.2 header-nav language, shared) -------------- The hover underline convention for single-line links:a 1px currentColor line sweeps in from the LEFT (scaleX 0 → 1, 0.3s house osmo ease). Extracted from the header menu item (client fix 2026-08-12) so footer/service/legal links share one mechanism instead of instant text-decoration flips. Include sweep-underline on the link (or its label span), then trigger with `&::after{transform:scaleX(1)}` from the hover/active rule. NOT for:permanent underlines (.link-u, footer contact values, active filter — those stay static), or links that can WRAP to multiple lines (a pseudo-element underline only draws under the element box, so it breaks on wrapped lines — those keep static text-decoration, see footer mobile). */ .hairline{border:0;height:1px;background:var(--color-grey)}.rotating-badge{position:absolute;width:110px;height:110px;z-index:5}.rotating-badge__ring{width:100%;height:100%;will-change:transform}@media (max-width:699px){.rotating-badge{display:none}}/* ---- Accordion primitive (Figma BUJ sekcija 156:8171 + service single 181:8667 — the two accordion usages share one mechanic) -------------------- Rows on #515151 hairlines, 24px Medium question, right-side icon (chevron in the BUJ spec, plus in the service-single spec — .acc__icon--plus). Height animation is GSAP-owned (initAccordions, components/faq/index.js);CSS only defines states + the reduced-motion/no-JS fallback. Answer typography is DERIVED (Figma shows only closed rows) — 18px Book on 66% width — flagged for design review. */
.acc{display:flex;flex-direction:column;width:100%}.acc__item{border-bottom:1px solid var(--color-grey)}.acc__item:first-child{border-top:1px solid var(--color-grey)}.acc__head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-1);width:100%;padding:var(--space-2) 0;background:none;border:0;color:inherit;font-family:var(--font-h);text-align:left;cursor:pointer}.acc__title{position:relative;font-size:var(--text-h3);font-weight:500;line-height:1.2;letter-spacing:var(--track-1);/* Orange dot after the label on hover — the nav-item language (header__link::after):10px circle, 8px right of the text, eased scale + fade. Absolutely positioned so it never shifts the row. */}.acc__title::after{content:"";position:absolute;left:calc(100% + 8px);top:50%;width:10px;height:10px;border-radius:50%;background:var(--color-orange);transform:translateY(-50%) scale(0.4);opacity:0;transition:opacity 0.3s var(--ease-osmo), transform 0.3s var(--ease-osmo)}.acc__icon{flex:none;display:flex;align-items:center;justify-content:center;width:20px;height:20px;transition:transform 0.5s var(--ease-osmo)}.acc__icon svg{display:block;fill:currentColor}.acc__item.is-open .acc__icon--chevron{transform:rotate(180deg)}.acc__item.is-open .acc__icon--plus{transform:rotate(45deg)}.acc__panel{overflow:hidden}.acc__panel[hidden]{display:none}.acc__body{padding-bottom:var(--space-2);max-width:66%;font-size:var(--text-body);font-weight:500;line-height:1.5;letter-spacing:var(--track-1)}@media (max-width:767px){.acc__body{max-width:100%}}/* Hover reveals the orange dot after the title (client 2026-08-15 — replaces the old red text-colour change, which the client didn't want). */
@media (hover:hover) and (pointer:fine){.acc__head:hover .acc__title::after{opacity:1;transform:translateY(-50%) scale(1)}}@media (prefers-reduced-motion:reduce){.acc__icon{transition:none}}/* ---- Accent dot (Figma Ellipse 14 — 24px orange circle preceding display copy in the CTA + service intro;the sanctioned one-orange-moment) -------- */
.accent-dot{display:inline-block;width:24px;height:24px;border-radius:50%;background:var(--color-orange);flex:none}/* ---- Contact-form validation message (shared primitive) ----------------------- Both contact forms carry the .contact__field class (components/contact's dark placeholder rows AND contact_page's light label rows — the kontakti markup stacks .cp__field on top), so this lives here like the .acc primitive. The message (.contact__error, injected by initContactForm) sits ABSOLUTE just below the field's underline — showing/hiding never shifts the layout — 14px orange, fading/rising in 0.3s osmo while the underline flips orange in sync (is-invalid). No Figma spec for form errors (design-system §5 "no form fields exist in Figma") — derived;FLAGGED for design review. */
.contact__field{position:relative}.contact__error{position:absolute;left:0;top:calc(100% + 5px);font-size:var(--text-xs);font-weight:500;line-height:1;letter-spacing:var(--track-1);color:var(--color-orange);opacity:0;transform:translateY(-4px);transition:opacity 0.3s var(--ease-osmo), transform 0.3s var(--ease-osmo);pointer-events:none}.contact__field.is-invalid .contact__error{opacity:1;transform:none}@media (prefers-reduced-motion:reduce){.contact__error{transition:none}}/* ---- Contact-form attachments (shared primitive) ------------------------------ File-upload row for both contact forms (services CTA on dark, kontakti on light) — same underline-row language as the text fields:"Pielikumi" label + hint left, "Pievienot failu" trigger (the Figma plus glyph, same vector as the service-single accordion) right, all on one hairline row. Selected files stack as rows above the underline;drag-and-drop highlights the row with a dashed hairline + orange accent (the sanctioned hover-orange). Everything currentColor so the dark/light surfaces both work. No Figma spec for file fields (design-system §5:none exist) — DERIVED from the underline-row + accordion primitives;FLAGGED for design review. */
.contact__attach{display:flex;flex-direction:column;border-bottom:1px solid currentColor;padding-bottom:7px;transition:border-color 0.3s var(--ease-osmo);/* Drag-over:dashed hairline + the orange accent (subtle — border+trigger only, no fills;orange discipline §1). Two-class specificity so it out-ranks the component sheets' .contact__field border rules. */}.contact__attach.is-invalid, .contact__attach:focus-within{border-bottom-color:var(--color-orange)}.contact__attach.is-dragover{border-bottom-style:dashed;border-bottom-color:var(--color-orange)}.contact__attach.is-dragover .contact__attach-trigger{color:var(--color-orange)}.contact__attach-row{display:flex;align-items:baseline;justify-content:space-between;gap:var(--space-1);flex-wrap:wrap}.contact__attach-label{font-weight:500;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-1)}.contact__attach-hint{font-size:var(--text-xs);opacity:0.5;white-space:nowrap}/* The real <input type=file> stays in the DOM, focusable, visually hidden (sr-only recipe — NOT display:none) inside the trigger label;clicking or activating the trigger opens the native picker. Two-class specificity out-ranks the component sheets' `.contact__field input` sizing rules. */
.contact__attach .contact__attach-input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.contact__attach-trigger{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-weight:500;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-1);color:inherit;transition:color 0.3s var(--ease-osmo);/* Keyboard focus on the hidden input lights the trigger like every other focusable (mirrors the global:focus-visible outline). */}.contact__attach-trigger:has(.contact__attach-input:focus-visible){outline:2px solid var(--color-orange);outline-offset:3px}@media (hover:hover) and (pointer:fine){.contact__attach-trigger:hover{color:var(--color-orange)}}.contact__attach-plus{flex:none;display:flex;align-items:center;justify-content:center;width:15px;height:15px}.contact__attach-plus svg{display:block;width:100%;height:100%;fill:currentColor}/* Selected-files list:each file is a row (hairline-separated, echoing the underline language) — truncated name left, size + remove "×" right. Rows animate in/out with the house 0.3s osmo fade/rise (JS toggles .is-in / .is-leaving);reduced-motion renders instantly. */
.contact__attach-list{list-style:none;margin:12px 0 0;padding:0;display:flex;flex-direction:column}.contact__attach-list[hidden]{display:none}.contact__attach-item{display:flex;align-items:center;gap:var(--space-1);padding:8px 0;border-top:1px dashed color-mix(in srgb, currentColor 25%, transparent);font-size:var(--text-xs);line-height:1.5;letter-spacing:var(--track-1);opacity:0;transform:translateY(6px);transition:opacity 0.3s var(--ease-osmo), transform 0.3s var(--ease-osmo)}.contact__attach-item.is-in{opacity:1;transform:none}.contact__attach-item.is-leaving{opacity:0;transform:translateY(-4px)}.contact__attach-name{font-weight:500;min-width:0;overflow:hidden;white-space:nowrap}.contact__attach-size{margin-left:auto;flex:none;font-weight:400;opacity:0.5}.contact__attach-remove{flex:none;display:flex;align-items:center;justify-content:center;width:24px;height:24px;margin-right:-4px;padding:0;background:none;border:0;color:inherit;font-family:var(--font-b);font-weight:400;font-size:18px;line-height:1;cursor:pointer;transition:color 0.3s var(--ease-osmo)}@media (hover:hover) and (pointer:fine){.contact__attach-remove:hover{color:var(--color-orange)}}@media (prefers-reduced-motion:reduce){.contact__attach, .contact__attach-item{transition:none}}/* Sending state (files can take seconds):the pill's label swaps to "Sūta..." (JS) and the arrow pulses subtly while disabled. DERIVED (no Figma loading spec) — FLAGGED for design review. */
.btn-pill.loading{cursor:progress}.btn-pill.loading .btn-pill__icon svg{animation:bw-send-pulse 1.1s var(--ease-osmo) infinite alternate}@keyframes bw-send-pulse{from{opacity:1}to{opacity:0.3}}@media (prefers-reduced-motion:reduce){.btn-pill.loading .btn-pill__icon svg{animation:none;opacity:0.5}}.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}a:focus-visible,
button:focus-visible{outline:2px solid var(--color-orange);outline-offset:3px}.wc-anchor{position:absolute;top:0;left:0;width:1px;height:1px}/* ---- Honeypot (spam trap, shared by every form) -------------------------- A real field to a bot, invisible and unreachable to a person:off-canvas rather than display:none (which naive scrapers skip), out of the tab order, aria-hidden so screen readers never announce it, and autocomplete off so no browser ever fills it on someone's behalf. Any value arriving in it means the sender was not a person — submissions.php drops those. */
.hp-field{position:absolute;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden;opacity:0;pointer-events:none}/* ---- Hero WebGL slider canvas (components/hero/index.js) ----------------- Sits above the DOM slide stack inside .hero__media / .sh__media (the imgs stay as the LCP/SEO source and the CSS-crossfade fallback). Removed by JS on context loss / reduced motion / no WebGL. */
.hero-gl{position:absolute;inset:0;width:100%;height:100%;display:block;pointer-events:none}/* About teaser (Figma 129:12903) — heading 1/3 + credit, portrait 5/3 (~square, bottom-cropped), body 9/4 with 9px paragraph rhythm. About uses the −2% H2 tracking in Figma;standardized to −1% per §8.4 ruling. */
.component-about{padding-top:var(--space-3);padding-bottom:var(--section-pad)}.component-about .about__left{grid-column:1/span 3;display:flex;flex-direction:column;justify-content:space-between;gap:var(--space-3)}.component-about .about__credit{font-size:var(--text-body);line-height:1.5}.component-about .about__portrait{grid-column:5/span 3;position:relative;overflow:hidden;background:#1d1d1d;/* Height = max(Figma ~1:1, the row) — client 2026-08-12. The grid is fluid but the type is not, so below 1920 the body column wraps to MORE lines while the photo shrinks with its three columns. An aspect-locked square therefore floated short and left a hole that grew as the viewport narrowed:12px at 1920 (Figma), 83px at 1728, 185px at 1512, 255px at 1280 — read as "the image column is narrower than Figma". Grid stretch now sizes the box to the row;::before keeps the square as the FLOOR so ultrawide, where the copy runs shorter than the photo is wide, never goes landscape. */}.component-about .about__portrait::before{content:"";display:block;aspect-ratio:800/802}.component-about .about__portrait img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;/* 2026-08-10 "squeezed portrait" fix:the Figma MCP export had vertically STRETCHED the 800:802 fill to 683×1024, so any crop of it showed a distorted face. The asset is now un-stretched to 683×685 (true 800:802) and re-uploaded, so cover ≈ 1:1 with no real crop;object-position kept for any future taller source. */ object-position:50% 25%;display:block}.component-about .about__right{grid-column:9/span 4;display:flex;flex-direction:column;justify-content:space-between;align-items:flex-end;/* No gap:this column is the row's height driver, so a gap here does not just space the link, it makes the whole block taller than the photo. Figma puts the link at y=432 — flush against the body's last line box (the 1.5 half-leading gives the ~9px optical gap). The old 48px gap pushed the row to 505 against Figma's 459. */ gap:0}.component-about .about__body{font-size:var(--text-body);line-height:1.5}@media (max-width:1023px){.component-about .about__left{grid-column:1/-1;gap:var(--space-2)}.component-about .about__portrait{grid-column:1/span 6;margin-top:var(--space-3)}.component-about .about__right{grid-column:7/-1;margin-top:var(--space-3)}}@media (max-width:767px){.component-about .about__left, .component-about .about__portrait, .component-about .about__right{grid-column:1/-1}.component-about .about__portrait{margin-top:var(--space-2)}.component-about .about__right{margin-top:var(--space-2);align-items:flex-start;/* Stacked full-width:nothing shares this row, so the gap costs no alignment and the link needs the breathing room back. */ gap:var(--space-3)}}/* Clients logo band (Figma 129:11702) — heading row, then hairline-separated rows of 120×48 monochrome logo cells with 48px-tall vertical dividers. */
.component-clients{padding-top:var(--space-3);padding-bottom:var(--section-pad)}.component-clients .clients__grid{row-gap:var(--space-4)}.component-clients .clients__heading{grid-column:1/span 3;grid-row:1;align-self:center}.component-clients .clients__lede{grid-column:7/span 3;grid-row:1;align-self:center;font-weight:400;font-size:var(--text-body);line-height:1.5}.component-clients .clients__link{grid-column:12/span 1;grid-row:1;justify-self:end;align-self:center;white-space:nowrap}.component-clients .clients__band{grid-column:1/-1;grid-row:2;display:flex;flex-direction:column}.component-clients .clients__row{display:flex;align-items:center;gap:24px;padding-block:var(--space-3);border-top:1px solid var(--color-grey)}.component-clients .clients__row:last-child{border-bottom:1px solid var(--color-grey)}.component-clients .clients__cell{flex:none;width:120px;height:48px;display:flex;align-items:center;justify-content:center}.component-clients .clients__cell img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain;display:block}.component-clients .clients__sep{flex:1 0 0;min-width:1px;align-self:stretch;position:relative}.component-clients .clients__sep::after{content:"";position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);width:1px;height:48px;background:var(--color-grey)}@media (max-width:767px){.component-clients{/* Stacked header (client 2026-08-11:lede was crushed against the link) — lede full-width, link on its own row below. */ /* 3-up rows, hairline after EVERY logo row (client 2026-08-11/12):left logo flush to the container's left edge, middle centered, right logo flush right — edges anchor the clean look. Zero gaps so each cell's border-bottom forms one continuous line;consecutive .clients__row containers flow seamlessly. NOTE:hidden .clients__sep spans interleave the cells in the DOM, so cell positions are nth-child 1,3,5,7,9,11 → per-3 pattern = 6n+1 / 6n+3 / 6n+5. */}.component-clients .clients__grid{row-gap:var(--space-2)}.component-clients .clients__heading{grid-column:1/-1}.component-clients .clients__lede{grid-column:1/-1;grid-row:2}.component-clients .clients__link{grid-column:1/-1;grid-row:3;justify-self:start}.component-clients .clients__band{grid-row:4;border-top:1px solid var(--color-grey)}.component-clients .clients__row{display:grid;grid-template-columns:repeat(3, 1fr);gap:0;padding-block:0;border-top:0}.component-clients .clients__row:last-child{border-bottom:0}.component-clients .clients__sep{display:none}.component-clients .clients__cell{width:100%;height:72px;border-bottom:1px solid var(--color-grey)}.component-clients .clients__cell img{max-width:96px;max-height:36px}.component-clients .clients__cell:nth-child(6n+1){justify-content:flex-start}.component-clients .clients__cell:nth-child(6n+3){justify-content:center}.component-clients .clients__cell:nth-child(6n+5){justify-content:flex-end}}/* Feature comparison table (DERIVED — no Figma frame;FLAGGED). Hairline rows in the services-row language at a denser table rhythm:feature col 1–3, values 4–6 / 7–9 / 10–12. The <table> stays semantic;rows become 12-col grids. */
.component-compare{padding-block:var(--section-pad);/* Row = its own 12-col grid, tracks matching the parent (services-row trick). Denser 20px table rhythm on the shared hairlines. */ /* Mobile — derived from the 4-col grid (FLAGGED):header row hides, each row stacks — feature full-width, then one line per plan with the plan name in the muted voice. */}.component-compare .compare__grid{row-gap:var(--space-4)}.component-compare .compare__heading{grid-column:1/span 3;grid-row:1}.component-compare .compare__lede{grid-column:7/span 3;grid-row:1;align-self:center;font-weight:400;font-size:var(--text-body);line-height:1.5}.component-compare .compare__table{grid-column:1/-1;grid-row:2;display:block;border-collapse:collapse}.component-compare .compare__table thead, .component-compare .compare__table tbody{display:contents}.component-compare .compare__row{display:grid;grid-template-columns:repeat(var(--grid-columns), minmax(0, 1fr));column-gap:var(--grid-gutter);padding-block:20px;border-top:1px solid var(--color-grey)}.component-compare .compare__row:last-child{border-bottom:1px solid var(--color-grey)}.component-compare tbody .compare__row:last-child{border-bottom:1px solid var(--color-grey)}.component-compare .compare__feature{grid-column:1/span 3;text-align:left;font-weight:500;font-size:var(--text-sm);line-height:1.4;letter-spacing:var(--track-1);padding:0}.component-compare .compare__col,
.component-compare .compare__value{text-align:left;font-weight:500;font-size:var(--text-sm);line-height:1.4;letter-spacing:var(--track-1);padding:0}.component-compare .compare__col:nth-child(2), .component-compare .compare__value:nth-child(2){grid-column:4/span 3}.component-compare .compare__col:nth-child(3), .component-compare .compare__value:nth-child(3){grid-column:7/span 3}.component-compare .compare__col:nth-child(4), .component-compare .compare__value:nth-child(4){grid-column:10/span 3}.component-compare .compare__col{display:flex;flex-direction:column;gap:2px}.component-compare .compare__col-price{font-size:var(--text-xs);color:rgba(255, 255, 255, 0.5)}.component-compare .compare__value--muted .compare__value-text{color:rgba(255, 255, 255, 0.5)}.component-compare .compare__value-label{display:none}@media (max-width:767px){.component-compare .compare__grid{row-gap:var(--space-2)}.component-compare .compare__heading{grid-column:1/-1}.component-compare .compare__lede{grid-column:1/-1;grid-row:2}.component-compare .compare__table{grid-row:3;margin-top:var(--space-1)}.component-compare .compare__row--head{display:none}.component-compare .compare__row{grid-template-columns:1fr;row-gap:8px;padding-block:var(--space-1)}.component-compare .compare__feature{grid-column:1/-1;margin-bottom:2px}.component-compare .compare__value{grid-column:1/-1 !important;display:grid;grid-template-columns:minmax(0, 2fr) minmax(0, 3fr);column-gap:var(--grid-gutter);align-items:start}.component-compare .compare__value-label{display:block;font-size:var(--text-xs);color:rgba(255, 255, 255, 0.5)}}/* Contact CTA + form (Figma 129:14642 / 150:7561) — dot heading col 1–3, form block col 4–9 (its own 6-col sub-grid), "Saziņai" col 11–12. Section rhythm:top spacing comes from the section above (the Figma archive butts this straight against the services list's 96px), 48px bottom before the footer. */
.component-contact{padding-bottom:var(--space-3);/* Display heading with the 24px orange dot hanging at the text start (Figma 129:14658:dot absolute at 0/5, text indented one dot+gap). */ /* Mobile — derived from the 4-col grid (no Figma mobile frame;flagged):dot heading, then form, then contact column, all full-width. */}.component-contact .contact__aside-heading{grid-column:1/span 3;position:relative;max-width:290px}.component-contact .contact__aside-heading .accent-dot{position:absolute;left:0;/* Centered on the first LINE BOX, not a fixed offset. The dot is a constant 24px while .t-h2 scales clamp(30px .. 48px), so the old flat 5px only read as centered at the mobile floor and sat ~12px high by 48px. (1.2em line box - 24px dot) / 2 — the 0.6em is half of .t-h2's line-height:1.2, so this tracks the clamp. */ top:calc(0.6em - 12px)}.component-contact .contact__aside-heading .contact__aside-text{display:block;text-indent:40px}.component-contact .contact__main{grid-column:4/span 6;display:grid;grid-template-columns:repeat(6, minmax(0, 1fr));column-gap:var(--grid-gutter);row-gap:40px}.component-contact .contact__heading{grid-column:1/-1}.component-contact .contact__form{grid-column:1/-1;display:grid;grid-template-columns:repeat(6, minmax(0, 1fr));column-gap:var(--grid-gutter);row-gap:40px}.component-contact .contact__field{display:block;border-bottom:1px solid var(--color-white);padding-bottom:7px;transition:border-color 0.3s var(--ease-osmo)}.component-contact .contact__field input{display:block;width:100%;background:none;border:0;outline:0;padding:0;color:var(--color-white);font-family:var(--font-b);font-weight:500;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-1)}.component-contact .contact__field input::placeholder{color:var(--color-white);opacity:1}.component-contact .contact__field:focus-within{border-bottom-color:var(--color-orange)}.component-contact .contact__field.is-invalid{border-bottom-color:var(--color-orange)}.component-contact .contact__field--half{grid-column:span 3}.component-contact .contact__field--full{grid-column:1/-1}.component-contact .contact__submit{grid-column:1/-1;justify-self:end}.component-contact .contact__status{grid-column:1/-1;font-size:var(--text-sm)}.component-contact .contact__status[hidden]{display:none}.component-contact .contact__aside-contact{grid-column:11/span 2}.component-contact .contact__label{font-size:var(--text-sm);line-height:0.75;opacity:0.5;margin-bottom:12px}.component-contact .contact__list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}.component-contact .contact__list li{display:flex;align-items:flex-start;gap:24px;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-1)}.component-contact .contact__key{font-weight:500;min-width:70px;flex:none}.component-contact .contact__value{font-weight:400;color:inherit;text-decoration:none}.component-contact .contact__value--link{border-bottom:1px solid var(--color-white);padding-bottom:2px;transition:color 0.3s var(--ease-osmo), border-color 0.3s var(--ease-osmo)}@media (hover:hover) and (pointer:fine){.component-contact .contact__value--link:hover{color:var(--color-orange);border-bottom-color:var(--color-orange)}}@media (max-width:767px){.component-contact .contact__grid{row-gap:var(--space-3)}.component-contact .contact__aside-heading{grid-column:1/-1;max-width:none}.component-contact .contact__main{grid-column:1/-1;row-gap:var(--space-2)}.component-contact .contact__form{row-gap:var(--space-2)}.component-contact .contact__field--half{grid-column:1/-1}.component-contact .contact__aside-contact{grid-column:1/-1;grid-row:auto}}/* Kontakti page section (Figma 122:11376 — WHITE surface, the page runs body.page-theme-light so text/borders inherit #141414):page-top hairline, heading + Saziņai/Rekvizīti groups col 1–3, "Sūti mums ziņu" + underline form col 6/span 5 (its own 6-col sub-grid, 40px row rhythm). */
.component-contact_page{padding-top:var(--header-h);padding-bottom:var(--section-pad);/* Field row:visible Medium label + input on one underlined line (the Figma "Vārds* | Jānis Paraugs" pattern). */ /* Mobile — derived from the 4-col grid (no Figma mobile frame;FLAGGED for design review):heading + groups, then the form, all full-width. */}.component-contact_page .cp__grid{row-gap:var(--space-4)}.component-contact_page .cp__rule{grid-column:1/-1;grid-row:1;height:1px;background:rgba(20, 20, 20, 0.15)}.component-contact_page .cp__aside{grid-column:1/span 3;grid-row:2;display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-2)}.component-contact_page .cp__groups{display:flex;flex-direction:column;gap:var(--space-2)}.component-contact_page .cp__label{font-size:var(--text-sm);line-height:0.75;opacity:0.5;margin-bottom:12px}.component-contact_page .cp__list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}.component-contact_page .cp__list li{display:flex;align-items:flex-start;gap:24px;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-1)}.component-contact_page .cp__key{font-weight:500;width:70px;/* Figma:values start at x=94 (70px key + 24px gap);"Juridiskā adrese" wraps to two lines inside it */ flex:none}.component-contact_page .cp__value{font-weight:400;color:inherit;text-decoration:none}.component-contact_page .cp__value--link{border-bottom:1px solid var(--color-black);padding-bottom:2px;transition:color 0.3s var(--ease-osmo), border-color 0.3s var(--ease-osmo)}.component-contact_page .cp__main{grid-column:6/span 5;grid-row:2;display:grid;grid-template-columns:repeat(6, minmax(0, 1fr));column-gap:var(--grid-gutter);row-gap:40px;align-content:start}.component-contact_page .cp__form-heading{grid-column:1/-1;line-height:1.2}.component-contact_page .cp__form{grid-column:1/-1;display:grid;grid-template-columns:repeat(6, minmax(0, 1fr));column-gap:var(--grid-gutter);row-gap:40px}.component-contact_page .cp__field{display:flex;align-items:baseline;gap:24px;border-bottom:1px solid var(--color-black);padding-bottom:7px;transition:border-color 0.3s var(--ease-osmo)}.component-contact_page .cp__field:focus-within, .component-contact_page .cp__field.is-invalid{border-bottom-color:var(--color-orange)}.component-contact_page .cp__field-label{flex:none;font-weight:500;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-1);white-space:nowrap}.component-contact_page .cp__field input{flex:1;min-width:0;background:none;border:0;outline:0;padding:0;color:inherit;font-family:var(--font-b);font-weight:400;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-1)}.component-contact_page .cp__field input::placeholder{color:inherit;opacity:1}.component-contact_page .cp__field--half{grid-column:span 3}.component-contact_page .cp__field--full{grid-column:1/-1}.component-contact_page .cp__submit{grid-column:1/-1;justify-self:end}.component-contact_page .cp__status{grid-column:1/-1;font-size:var(--text-sm)}.component-contact_page .cp__status[hidden]{display:none}@media (hover:hover) and (pointer:fine){.component-contact_page .cp__value--link:hover{color:var(--color-orange);border-bottom-color:var(--color-orange)}}@media (max-width:767px){.component-contact_page .cp__grid{row-gap:var(--space-3)}.component-contact_page .cp__aside{grid-column:1/-1}.component-contact_page .cp__main{grid-column:1/-1;grid-row:3;row-gap:var(--space-2)}.component-contact_page .cp__form{row-gap:var(--space-2)}.component-contact_page .cp__field--half{grid-column:1/-1}}/* Mobile:the page-top hairline duplicates the header's own bottom border (client 2026-08-11) — drop it. */
@media (max-width:767px){.component-contact_page .cp__rule{display:none}}/* BUJ / FAQ section (Figma 156:8171) — 96px section padding, heading + Book lede col 1–3, chevron accordion col 7–12. Accordion base = .acc primitive (globals.scss). */
.component-faq{padding-block:var(--section-pad)}.component-faq .faq__intro{grid-column:1/span 3;display:flex;flex-direction:column;gap:var(--space-2)}.component-faq .faq__lede{font-weight:400;font-size:var(--text-body);line-height:1.5}.component-faq .faq__list{grid-column:7/span 6}@media (max-width:767px){.component-faq .faq__grid{row-gap:var(--space-2)}.component-faq .faq__intro{grid-column:1/-1;gap:var(--space-1)}.component-faq .faq__list{grid-column:1/-1}}/* ============================================================================ BETTRWEB footer — Figma 104:11140 + design-system §3/§4. Full-width 1px top rule, 48px padding, 12-col grid:row 1 — logo col 1 · contact col 6–8 · services col 9–11 row 2 — legal band:© col 1 · company col 6 · reg nr col 9 · privacy col 12 Labels white @50%;contact values in Book 400 with 1px white underline. ========================================================================== */
footer{position:relative;z-index:0}.component-footer{background:var(--color-black);color:var(--color-white);border-top:1px solid var(--color-grey);padding-block:var(--space-3)}/* NOTE:bettrlite's selector-token substitution only fires on a bare ".component-footer{" rule — use .component-footer for any compound selector. */
.footer__grid{row-gap:var(--space-3);grid-template-rows:auto auto;align-items:start}.footer__logo{grid-column:1/4;grid-row:1;display:inline-flex;line-height:0;width:fit-content}.footer__logo img{display:block;width:194px;height:auto}.footer__label{font-weight:500;font-size:var(--text-sm);line-height:1;letter-spacing:var(--track-1);opacity:0.5;margin:0 0 12px}.footer__contact{grid-column:6/9;grid-row:1}.footer__contact-list{display:flex;flex-direction:column;gap:8px;margin:0;padding:0;list-style:none}.footer__contact-list li{display:flex;align-items:baseline;gap:24px}.footer__key{min-width:70px;font-weight:500;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-1)}.footer__value{font-weight:400;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-1);color:var(--color-white);text-decoration:none}.footer__value--link{border-bottom:1px solid var(--color-white);padding-bottom:2px;transition:color 0.3s var(--ease-osmo), border-color 0.3s var(--ease-osmo)}@media (hover:hover) and (pointer:fine){.footer__value--link:hover{color:var(--color-orange);border-bottom-color:var(--color-orange)}a.footer__value:not(.footer__value--link):hover{color:var(--color-orange)}}.footer__services{grid-column:9/12;grid-row:1}.footer__services-cols{display:flex;gap:var(--space-3)}.footer__services-list{display:flex;flex-direction:column;gap:8px;margin:0;padding:0;list-style:none}.footer__services-list li{font-weight:500;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-1);white-space:nowrap}/* Hover underline = the shared LEFT-sweep (globals sweep-underline, §5.2 header language) instead of the old instant text-decoration flip (client fix 2026-08-12). */
.footer__service-link{display:inline-block;color:var(--color-white);text-decoration:none;transition:color 0.3s var(--ease-osmo);position:relative}.footer__service-link::after{content:"";position:absolute;left:0;right:0;bottom:-2px;height:1px;background:currentColor;transform:scaleX(0);transform-origin:left center;transition:transform 0.3s var(--ease-osmo)}@media (hover:hover) and (pointer:fine){.footer__service-link:hover{color:var(--color-orange)}.footer__service-link:hover::after{transform:scaleX(1)}}/* Mobile:these labels may WRAP (white-space back to normal below) — a pseudo underline breaks on wrapped lines, so fall back to the static one. */
@media (max-width:767px){.footer__service-link::after{content:none}}@media (max-width:767px) and (hover:hover) and (pointer:fine){.footer__service-link:hover{text-decoration:underline;text-underline-offset:var(--underline-offset);text-decoration-thickness:1px;text-decoration-skip-ink:none}}.footer__legal{grid-row:2;font-weight:500;font-size:var(--text-xs);line-height:1;letter-spacing:var(--track-1);margin:0;white-space:nowrap}.footer__legal a{display:inline-block;color:var(--color-white);text-decoration:none;transition:color 0.3s var(--ease-osmo);/* shared LEFT-sweep hover underline (globals sweep-underline);.footer__legal is white-space:nowrap at every breakpoint, so the single-line requirement always holds */ position:relative}.footer__legal a::after{content:"";position:absolute;left:0;right:0;bottom:-2px;height:1px;background:currentColor;transform:scaleX(0);transform-origin:left center;transition:transform 0.3s var(--ease-osmo)}@media (hover:hover) and (pointer:fine){.footer__legal a:hover{color:var(--color-orange)}.footer__legal a:hover::after{transform:scaleX(1)}}.footer__legal--copy{grid-column:1/3}.footer__legal--company{grid-column:6/8}.footer__legal--reg{grid-column:9/11}.footer__legal--privacy{grid-column:12/13;justify-self:end}/* ---- Tablet / mobile (derived — no Figma mobile design;FLAGGED for design review). Stack:logo, contact, services, legal lines. ---------------- */
@media (max-width:1023px){.footer__contact{grid-column:1/7}.footer__services{grid-column:7/13}.footer__logo{grid-column:1/-1;grid-row:1}.footer__contact, .footer__services{grid-row:2}.footer__grid{grid-template-rows:auto auto auto}.footer__legal{grid-row:3}.footer__legal--copy{grid-column:1/4}.footer__legal--company{grid-column:4/7}.footer__legal--reg{grid-column:7/10}.footer__legal--privacy{grid-column:10/13}}@media (max-width:767px){.footer__grid{grid-template-rows:none;row-gap:var(--space-2)}.footer__logo, .footer__contact, .footer__services, .footer__legal{grid-column:1/-1;grid-row:auto;justify-self:start}.footer__services-cols{flex-direction:column;gap:8px}.footer__services-list li{white-space:normal}.footer__legal--copy{margin-top:var(--space-1)}}/* ============================================================================ BETTRWEB header — design-system §5.7 + Figma 129:11663 (homepage spec). Grid-placed:logo col 1, nav from col 6 (42px gaps), pill CTA col 12. Variants (modifier on the section, set by the `style` ACF select):- .header--transparent (default):over the homepage hero (the hero owns the legibility gradient, not the header). Turns solid dark on scroll. - .header--dark:always #141414. - .header--white:always #fff, black content + black logo. .is-page-solid (functions.php, non-front pages) forces the solid state. ========================================================================== */
.component-header{position:fixed;top:0;left:0;right:0;z-index:1000;color:var(--color-white);background:transparent;border-bottom:1px solid transparent;transition:background-color 0.35s var(--ease-osmo), color 0.35s var(--ease-osmo), border-color 0.35s var(--ease-osmo), transform 0.35s var(--ease-osmo);will-change:transform;/* scrolled / forced solid state (transparent variant only — dark and white variants are already solid) */}.component-header.is-solid{background:var(--color-black);border-bottom-color:rgba(255, 255, 255, 0.08)}.component-header.is-hidden{transform:translateY(-100%)}.header--dark{background:var(--color-black)}.header--white{background:var(--color-white);color:var(--color-black)}.header--white.is-solid{background:var(--color-white);border-bottom-color:rgba(20, 20, 20, 0.1)}/* ---- Bar:12-col grid row, 32px block padding (§4:header 32px top/bottom, side margins from the grid) ------------------------------------------------ */
.header__bar{align-items:center;/* Reads the same token the rest of the site offsets by (globals.scss --header-h), so the rendered bar and the fixed-header padding of every section stay locked together. Change the padding there, not here. */ padding-block:var(--header-pad)}.header__logo{grid-column:1/4;grid-row:1;display:flex;align-items:center;line-height:0}.header__logo-img{display:block;width:200px;height:auto}.header__logo-img--black{display:none}.header--white .header__logo-img--white{display:none}.header--white .header__logo-img--black{display:block}.header__nav{grid-column:6/12;grid-row:1;justify-self:start;display:flex;align-items:center;gap:42px}/* Menu item (§5.2, Figma 129:13414):18px / 500 / lh 1 / −1%, sentence case. Hover/active:1px underline (currentColor) sweeping in from the left + 10px orange dot 6px right of the label. The dot is absolutely positioned (deviation from Figma's in-flow dot) so neighbouring items never shift. */
.header__link{position:relative;display:inline-flex;align-items:center;padding:6px 0;font-weight:500;font-size:var(--text-nav);line-height:1;letter-spacing:var(--track-1);color:currentColor;text-decoration:none}.header__link::after{content:"";position:absolute;left:calc(100% + 6px);top:50%;width:10px;height:10px;border-radius:50%;background:var(--color-orange);transform:translateY(-50%) scale(0.4);opacity:0;transition:opacity 0.3s var(--ease-osmo), transform 0.3s var(--ease-osmo)}.header__link-label{display:inline-block;/* 1px underline sweep in the item's text color — the shared site-wide mechanism (globals.scss sweep-underline;extracted from here) */ position:relative}.header__link-label::after{content:"";position:absolute;left:0;right:0;bottom:-2px;height:1px;background:currentColor;transform:scaleX(0);transform-origin:left center;transition:transform 0.3s var(--ease-osmo)}@media (hover:hover) and (pointer:fine){.header__link:hover::after{opacity:1;transform:translateY(-50%) scale(1)}.header__link:hover .header__link-label::after{transform:scaleX(1)}}.header__link.is-active::after{opacity:1;transform:translateY(-50%) scale(1)}.header__link.is-active .header__link-label::after{transform:scaleX(1)}.header__end{grid-column:11/13;grid-row:1;justify-self:end;display:flex;align-items:center;gap:24px}.header__lang{position:relative}.header__lang-trigger{display:flex;align-items:center;gap:0.35em;background:none;border:0;padding:0.25em 0;font-family:var(--font-b);font-weight:500;font-size:var(--text-sm);letter-spacing:var(--track-1);color:currentColor;opacity:0.6;cursor:pointer;transition:opacity 0.3s var(--ease-osmo)}.header__lang-trigger::after{content:"";width:0;height:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:4px solid currentColor;transition:transform 0.3s var(--ease-osmo)}@media (hover:hover) and (pointer:fine){.header__lang-trigger:hover{opacity:1}}.header__lang.open .header__lang-trigger{opacity:1}.header__lang.open .header__lang-trigger::after{transform:rotate(180deg)}.header__lang-panel{position:absolute;top:calc(100% + 0.75rem);left:50%;transform:translateX(-50%) translateY(-6px);min-width:4rem;width:max-content;background:var(--color-black);border:1px solid var(--color-grey);padding:0.5rem;display:flex;flex-direction:column;gap:0.15rem;opacity:0;visibility:hidden;transition:opacity 0.3s var(--ease-osmo), transform 0.3s var(--ease-osmo), visibility 0s linear 0.3s}.header__lang-panel a{display:block;text-align:center;padding:0.4em 0.75em;font-weight:500;font-size:var(--text-sm);letter-spacing:var(--track-1);color:var(--color-white);text-decoration:none;transition:color 0.2s var(--ease-osmo)}.header__lang-panel a[aria-current=true]{text-decoration:underline;text-underline-offset:3px}.header__lang-panel a[aria-disabled=true]{opacity:0.45;cursor:default}@media (hover:hover) and (pointer:fine){.header__lang-panel a:not([aria-disabled=true]):hover{color:var(--color-orange)}}.header__lang.open .header__lang-panel{opacity:1;visibility:visible;transform:translateX(-50%) translateY(0);transition:opacity 0.3s var(--ease-osmo), transform 0.3s var(--ease-osmo), visibility 0s}.header__cta{flex-shrink:0}.header__burger{display:none;grid-column:-2/-1;grid-row:1;justify-self:end;align-items:center;justify-content:center;flex-direction:column;gap:6px;width:44px;height:44px;background:none;border:0;cursor:pointer;/* buttons do NOT inherit color (UA buttontext = black) — the lines use currentColor, so without this the burger was black on dark headers */ color:inherit}.header__burger span{display:block;width:24px;height:1.5px;background:currentColor;transition:transform 0.3s var(--ease-osmo)}body.nav-open .header__burger span:nth-child(1){transform:translateY(3.75px) rotate(45deg)}body.nav-open .header__burger span:nth-child(2){transform:translateY(-3.75px) rotate(-45deg)}/* ---- Mobile fullscreen overlay (derived — no Figma mobile design;FLAGGED for design review). #141414, large sentence-case items, same underline + orange-dot active language, pill CTA + language row at the bottom. -------- */
.header__overlay{position:fixed;inset:0;z-index:999;background:var(--color-black);color:var(--color-white);display:flex;flex-direction:column;justify-content:space-between;padding:calc(var(--header-h) + var(--space-2)) var(--grid-margin) var(--space-2);transform:translateY(-100%);visibility:hidden;transition:transform 0.5s var(--ease-osmo), visibility 0s linear 0.5s}body.nav-open .header__overlay{transform:translateY(0);visibility:visible;transition:transform 0.5s var(--ease-osmo), visibility 0s}/* Menu open → the whole header bar goes dark regardless of page theme or header variant (client 2026-08-11:the white kontakti header strip sitting on the dark overlay looked bad;ditto black-on-black close icon). Wins over .header--white / solid-state rules by specificity. */
html body.nav-open .component-header.component-header{background:var(--color-black);color:var(--color-white);border-color:transparent}html body.nav-open .component-header .header__logo-img--black{display:none}html body.nav-open .component-header .header__logo-img--white{display:block}.header__overlay-list{display:flex;flex-direction:column;gap:0.75rem;margin:0;padding:0;list-style:none}.header__overlay-list .header__link{font-size:var(--text-h2);letter-spacing:var(--track-1);padding:2px 0}.header__overlay-list .header__link::after{width:8px;height:8px;left:calc(100% + 8px)}.header__overlay-foot{display:flex;align-items:center;justify-content:space-between;gap:var(--space-1);border-top:1px solid var(--color-grey);padding-top:var(--space-1)}.header__overlay-lang{display:flex;align-items:center;gap:1rem}.header__overlay-lang a{font-weight:500;font-size:var(--text-sm);letter-spacing:var(--track-1);color:var(--color-white);opacity:0.6;text-decoration:none;padding:0.4em 0}.header__overlay-lang a.is-current{opacity:1;text-decoration:underline;text-underline-offset:3px}.header__overlay-lang a[aria-disabled=true]{opacity:0.45}@media (max-width:1023px){.header__nav{display:none}.header__end{display:none}.header__burger{display:flex}.header__logo{grid-column:1/3}.header__logo-img{width:160px}}@media (max-width:767px){.header__logo{grid-column:1/4}.header__burger{grid-column:4/5}}/* Logged-in WP admin bar (fixed, 32px desktop / 46px tablet) — offset both fixed layers. Scoped ≥600px:below that WP makes the bar absolute. */
@media (min-width:600px){body.admin-bar .component-header{top:var(--wp-admin--admin-bar--height, 32px)}body.admin-bar .header__overlay{top:var(--wp-admin--admin-bar--height, 32px)}}/* BETTRWEB hero (Figma 97:9646) — full-bleed photo slider, dark gradient at the top for the transparent header (§1), bottom-anchored grid content. */
.component-hero{position:relative;height:100svh;min-height:700px;overflow:hidden;background:var(--color-black);/* Legibility overlays (design-system §1):header gradient at the top plus an eased bottom scrim so the white H1/label hold up on bright slides (client 2026-08-15 — white-on-white on light hero images). Multi-stop = no visible band edge;tinted with the brand near-black. */}.component-hero .hero__media{position:absolute;inset:0;z-index:0}.component-hero .hero__slide{position:absolute;inset:0;opacity:0;/* Crossfade + gentle zoom-settle (motion pass):the incoming slide eases from a 1.045 scale down to rest while it fades in — the same 1.06→1 "image settles" language as the entrance/scroll reveals. Opacity and transform only (compositor-friendly). */ transform:scale(1.045);transition:opacity 1.2s var(--ease-osmo), transform 1.8s var(--ease-osmo)}.component-hero .hero__slide.is-active{opacity:1;transform:scale(1)}.component-hero .hero__slide img{width:100%;height:100%;object-fit:cover;display:block}.component-hero .hero__gradient{position:absolute;inset:0;z-index:1;pointer-events:none;background:linear-gradient(to bottom, rgba(0, 0, 0, 0.25) 0%, rgba(0, 0, 0, 0) 50%), linear-gradient(to top, rgba(20, 20, 20, 0.65) 0%, rgba(20, 20, 20, 0.52) 15%, rgba(20, 20, 20, 0.36) 32%, rgba(20, 20, 20, 0.2) 48%, rgba(20, 20, 20, 0.08) 62%, rgba(20, 20, 20, 0) 78%)}.component-hero .hero__grid{position:relative;z-index:2;height:100%;align-content:end;padding-bottom:var(--space-3);row-gap:var(--space-1)}.component-hero .hero__label{grid-column:1/span 2;align-self:end;font-size:var(--text-nav);line-height:1;letter-spacing:var(--track-1);white-space:nowrap}.component-hero .hero__title{grid-column:6/span 5;align-self:end}.component-hero .hero__indicator{grid-column:12/span 1;align-self:end;justify-self:end;display:flex;gap:4px;align-items:center;padding:0}.component-hero .hero__dash{width:15px;height:2px;padding:3px 0;background:none;border:0;cursor:pointer;background-clip:content-box;background-color:var(--color-grey);transition:background-color 0.4s var(--ease-osmo)}.component-hero .hero__dash.is-active{background-color:var(--color-white)}@media (prefers-reduced-motion:reduce){.component-hero .hero__slide{transition:none;transform:none}}@media (max-width:767px){.component-hero{min-height:560px}.component-hero .hero__grid{grid-template-rows:auto auto;row-gap:var(--space-2)}.component-hero .hero__title{grid-row:1;grid-column:1/-1}.component-hero .hero__label{grid-row:2;grid-column:1/span 2}.component-hero .hero__indicator{grid-row:2;grid-column:3/span 2}}/* Info columns (DERIVED — no Figma frame;FLAGGED). Hairline-topped columns of 4:white title, muted body copy. */
.component-info_columns{padding-block:var(--section-pad)}.component-info_columns .info-columns__grid{row-gap:var(--space-4)}.component-info_columns .info-columns__heading{grid-column:1/span 3;grid-row:1}.component-info_columns .info-columns__list{grid-column:1/-1;list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(var(--grid-columns), minmax(0, 1fr));column-gap:var(--grid-gutter)}.component-info_columns .info-columns__item{grid-column:span 4;border-top:1px solid var(--color-grey);padding-top:var(--space-1)}.component-info_columns .info-columns__title{font-size:var(--text-body);line-height:1.5;letter-spacing:var(--track-1);margin-bottom:8px}.component-info_columns .info-columns__text{font-size:var(--text-body);line-height:1.5;color:rgba(255, 255, 255, 0.5)}@media (max-width:767px){.component-info_columns .info-columns__grid{row-gap:var(--space-2)}.component-info_columns .info-columns__heading{grid-column:1/-1}.component-info_columns .info-columns__list{grid-template-columns:1fr;row-gap:var(--space-2)}.component-info_columns .info-columns__item{grid-column:1/-1}}/* 404 (Figma 181:9065) — full-viewport dark section, transparent header above (functions.php is_404 exemption), standard footer below. "404" col 1 left / "lapa nav atrasta" col 11–12 right, both 48px, vertically centered. Background:CSS recreation of the annotated unicorn.studio red/orange gradient scene (see index.php flag) — layered radial blobs in the brand orange + deep-red derivatives on #141414, heavily blurred, drifting on a slow loop. */
.component-not_found{background:var(--color-black)}.nf__section{position:relative;height:100svh;min-height:700px;overflow:hidden;display:flex;align-items:stretch}.nf__bg{position:absolute;inset:0;overflow:hidden;background:radial-gradient(120% 90% at 70% 100%, rgba(80, 20, 5, 0.55) 0%, rgba(20, 20, 20, 0) 60%), var(--color-black)}.nf__blob{position:absolute;border-radius:50%;filter:blur(90px);will-change:transform}/* Dominant vivid red-orange mass, center-left (the frame's red fills most of the left two-thirds at high saturation) */
.nf__blob--1{width:80vw;height:130vh;left:-5vw;top:-15vh;background:radial-gradient(50% 50% at 50% 50%, rgba(230, 45, 10, 0.95) 0%, rgba(210, 40, 10, 0.5) 45%, rgba(210, 40, 10, 0) 72%);animation:nf-drift-1 26s ease-in-out infinite alternate}.nf__blob--2{width:65vw;height:90vh;left:25vw;top:30vh;background:radial-gradient(50% 50% at 50% 50%, rgba(150, 25, 5, 0.85) 0%, rgba(150, 25, 5, 0) 70%);animation:nf-drift-2 32s ease-in-out infinite alternate}.nf__blob--3{width:50vw;height:90vh;right:-12vw;top:0;background:radial-gradient(50% 50% at 50% 50%, rgba(115, 50, 18, 0.6) 0%, rgba(115, 50, 18, 0) 70%);animation:nf-drift-3 38s ease-in-out infinite alternate}.nf__blob--4{width:34vw;height:55vh;left:16vw;top:8vh;background:radial-gradient(50% 50% at 50% 50%, rgba(255, 96, 40, 0.9) 0%, rgba(255, 96, 40, 0) 68%);animation:nf-drift-1 22s ease-in-out infinite alternate-reverse}@keyframes nf-drift-1{from{transform:translate(0, 0) scale(1)}to{transform:translate(6vw, 8vh) scale(1.15)}}@keyframes nf-drift-2{from{transform:translate(0, 0) scale(1)}to{transform:translate(-8vw, -6vh) scale(1.1)}}@keyframes nf-drift-3{from{transform:translate(0, 0) scale(1.05)}to{transform:translate(-5vw, 10vh) scale(0.95)}}@media (prefers-reduced-motion:reduce){.nf__blob{animation:none}}.nf__grid{position:relative;z-index:1;width:100%;align-content:center}.nf__code,
.nf__label{grid-row:1;align-self:center;font-size:var(--text-h2);font-weight:500;line-height:1;letter-spacing:var(--track-1);color:var(--color-white)}.nf__code{grid-column:1/span 2}.nf__label{grid-column:9/-1;justify-self:end;text-align:right;white-space:nowrap}/* Mobile — derived from the 4-col grid (no Figma mobile frame;FLAGGED for design review):same centered row, "404" left / label right. */
@media (max-width:767px){.nf__section{min-height:100svh}.nf__code{grid-column:1/span 1}.nf__label{grid-column:2/-1}}/* Landing-page intro (DERIVED — no Figma frame;FLAGGED). Statement-pattern page top:header offset, full hairline, muted label col 1–3, display title col 6–11, Book lede col 6–9. */
.component-page_intro{padding-top:var(--header-h);padding-bottom:var(--space-3);/* client 2026-08-12:title moved to the LEFT column (under the label), lede keeps the right column. Rows are label-aware (client 2026-08-11, Care pages ship without the label):title/lede default to row 2 and only drop to row 3 when a label precedes them — otherwise the empty label track would double the 64px row-gap. */}.component-page_intro .page-intro__grid{row-gap:var(--space-4)}.component-page_intro .page-intro__rule{grid-column:1/-1;grid-row:1;height:1px;background:var(--color-grey)}.component-page_intro .page-intro__label{grid-column:1/span 3;grid-row:2;font-size:var(--text-body);font-size:var(--text-h3);font-weight:500;line-height:1.2;letter-spacing:var(--track-1);opacity:0.5}.component-page_intro .page-intro__title{grid-column:1/span 7;grid-row:2;font-size:var(--text-h2);line-height:1.15;letter-spacing:var(--track-1)}.component-page_intro .page-intro__lede{grid-column:9/span 4;grid-row:2;align-self:start;font-weight:400;font-size:var(--text-body);line-height:1.5}.component-page_intro .page-intro__label ~ .page-intro__title{grid-row:3}.component-page_intro .page-intro__label ~ .page-intro__lede{grid-row:3}@media (max-width:767px){.component-page_intro .page-intro__grid{row-gap:var(--space-2)}.component-page_intro .page-intro__label{grid-column:1/-1}.component-page_intro .page-intro__title{grid-column:1/-1;grid-row:2}.component-page_intro .page-intro__lede{grid-column:1/-1;grid-row:3}.component-page_intro .page-intro__label ~ .page-intro__title{grid-row:3}.component-page_intro .page-intro__label ~ .page-intro__lede{grid-row:4}}/* Mobile:page-top hairline duplicates the header's bottom border — hidden on mobile, site-wide convention. */
@media (max-width:767px){.component-page_intro .page-intro__rule{display:none}}/* Pricing plans (DERIVED — no Figma frame;FLAGGED). Heading row, then three hairline-topped columns of 4;[index] row, h3 name, muted description, display price, muted billing, feature list. Badge = nav-active voice with the 10px orange dot. */
.component-plans{padding-block:var(--section-pad);/* Badge — nav-active language (§5.2):label + 10px orange dot. FLAGGED:a second static orange moment on the page (contact CTA carries the other), separated by several viewports. */ /* Mobile — derived from the 4-col grid (FLAGGED):stacked full-width plans, 48px between. */}.component-plans .plans__grid{row-gap:var(--space-4)}.component-plans .plans__heading{font-size:clamp(28px, 0.7vw + 26px, 36px);grid-column:1/span 3;grid-row:1}.component-plans .plans__list{grid-column:1/-1;grid-row:2;list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(var(--grid-columns), minmax(0, 1fr));column-gap:var(--grid-gutter)}.component-plans .plans__item{grid-column:span 4;border-top:1px solid var(--color-grey);padding-top:var(--space-1);display:flex;flex-direction:column}.component-plans .plans__top{display:flex;align-items:center;justify-content:space-between;min-height:24px;margin-bottom:var(--space-2)}.component-plans .plans__index{font-size:var(--text-lg);letter-spacing:var(--track-1)}.component-plans .plans__badge{display:inline-flex;align-items:center;gap:6px;font-size:var(--text-sm);letter-spacing:var(--track-1)}.component-plans .plans__badge .accent-dot{width:10px;height:10px}.component-plans .plans__name{margin-bottom:4px}.component-plans .plans__desc{color:rgba(255, 255, 255, 0.5);font-size:var(--text-body);line-height:1.5}.component-plans .plans__price{margin-top:var(--space-2);display:flex;align-items:baseline;gap:2px;font-size:var(--text-h2);font-weight:500;line-height:1;letter-spacing:var(--track-1)}.component-plans .plans__currency{font-size:var(--text-h3);align-self:flex-start;margin-top:0.2em}.component-plans .plans__period{font-size:var(--text-body);color:rgba(255, 255, 255, 0.5);margin-left:4px}.component-plans .plans__billing{margin-top:var(--space-1);font-size:var(--text-xs);line-height:1.4;color:rgba(255, 255, 255, 0.5)}.component-plans .plans__features{list-style:none;margin:var(--space-2) 0 0;padding:0;display:flex;flex-direction:column;gap:10px;font-size:var(--text-sm);line-height:1.4;letter-spacing:var(--track-1)}.component-plans .plans__note{grid-column:1/-1;grid-row:3;font-size:var(--text-xs);color:rgba(255, 255, 255, 0.5)}@media (max-width:767px){.component-plans .plans__grid{row-gap:var(--space-2)}.component-plans .plans__heading{grid-column:1/-1}.component-plans .plans__list{grid-template-columns:1fr;row-gap:var(--space-3)}.component-plans .plans__item{grid-column:1/-1}}/* Portfolio grid (Figma 97:9662, §5.6). NOTE the 32px column gap — the intentional §8.7 exception to the 16px gutter (pairs sit 2 gutters apart);48px vertical rhythm between card rows. */
.component-portfolio{padding-bottom:var(--section-pad);/* Single scale target for the hover zoom AND the reveal settle — the img and the (optional) hover video ride inside it together, so the video mirrors the image scale exactly and the initDataAnimate GSAP↔CSS ownership handoff stays one-element simple (index.js). */ /* Hover video:layered over the cover, hidden until it actually plays (JS adds .is-playing on the `playing` event — the cover stays visible while the clip buffers, never a black flash). Opacity-only transition:the transform lives on .portfolio__zoom so GSAP can suspend/own the scale without killing this fade. 0.3s house osmo. */ /* Caption (§5.6, verified against the Figma variants 2026-08-12):Default 32:8579 = 2-item justify-between → tags flush at the card's VERY right edge (the old markup reserved a ghost slot for the hidden "Apskatīt", pushing the tags inboard — the client-reported issue). Variant2 104:10953 (hover) = 3-item justify-between → the tags sit at the justified MIDDLE, "Apskatīt" takes the right edge. The justify-between distribution is built from two flex SPACERS so the state change can actually tween:spacer 1 always grows (name … rest);spacer 2 grows only on hover (flex-grow is animatable → the tags glide left to the middle), while the "Apskatīt" column widens 0fr→1fr. */ /* "Apskatīt" (Variant2):underlined, caption color (= white on the dark surfaces where cards render, per §5.6/currentColor). Default state is ZERO width (grid-template-columns 0fr) so it occupies nothing;card hover animates the column to 1fr — a real width tween (house osmo ease). Hidden without hover support (touch) — the card is a link. */}.component-portfolio .portfolio__grid{column-gap:32px;row-gap:var(--space-3)}.component-portfolio .portfolio__heading{grid-column:1/span 6;align-self:center}.component-portfolio .portfolio__all{grid-column:12/span 1;justify-self:end;align-self:center;white-space:nowrap}.component-portfolio .portfolio__card{grid-column:span 6;display:flex;flex-direction:column;gap:var(--space-1);text-decoration:none;color:inherit}.component-portfolio .portfolio__card--feature{grid-column:1/-1}.component-portfolio .portfolio__image{display:block;aspect-ratio:2000/1333;overflow:hidden;background:#1d1d1d}.component-portfolio .portfolio__zoom{display:block;position:relative;width:100%;height:100%;transition:transform 0.8s var(--ease-osmo)}.component-portfolio .portfolio__zoom img{width:100%;height:100%;object-fit:cover;display:block}.component-portfolio .portfolio__video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0;pointer-events:none;transition:opacity 0.3s var(--ease-osmo)}.component-portfolio .portfolio__video.is-playing{opacity:1}.component-portfolio .portfolio__caption{display:flex;align-items:center;font-size:var(--text-sm);line-height:1.1;letter-spacing:-0.01em}.component-portfolio .portfolio__caption-spacer{flex:1 1 var(--space-1)}.component-portfolio .portfolio__caption-spacer--end{flex:0 1 0px;transition:flex-grow 0.4s var(--ease-osmo)}.component-portfolio .portfolio__category{opacity:0.2}.component-portfolio .portfolio__view{display:none}.component-portfolio .portfolio__view-inner{display:block;overflow:hidden;min-width:0;white-space:nowrap;text-align:right;text-decoration:underline;text-underline-offset:var(--underline-offset);text-decoration-thickness:1px;text-decoration-skip-ink:none}@media (hover:hover) and (pointer:fine){.component-portfolio .portfolio__view{display:grid;grid-template-columns:0fr;opacity:0;transform:translateX(4px);transition:grid-template-columns 0.4s var(--ease-osmo), opacity 0.3s var(--ease-osmo), transform 0.4s var(--ease-osmo)}.component-portfolio .portfolio__card:hover .portfolio__caption-spacer--end{flex-grow:1}.component-portfolio .portfolio__card:hover .portfolio__view{grid-template-columns:1fr;opacity:1;transform:translateX(0)}.component-portfolio .portfolio__card:hover .portfolio__zoom{transform:scale(1.03)}}@media (prefers-reduced-motion:reduce){.component-portfolio .portfolio__view, .component-portfolio .portfolio__caption-spacer--end, .component-portfolio .portfolio__zoom, .component-portfolio .portfolio__video{transition:none}}@media (max-width:767px){.component-portfolio .portfolio__grid{column-gap:var(--grid-gutter);row-gap:var(--space-2)}.component-portfolio .portfolio__heading{grid-column:1/span 3}.component-portfolio .portfolio__all{grid-column:4/span 1}.component-portfolio .portfolio__card, .component-portfolio .portfolio__card--feature{grid-column:1/-1}.component-portfolio .portfolio__caption{flex-wrap:wrap;row-gap:4px;/* client 2026-08-11:16px read too large on mobile cards;then taken further to 12px on request */ font-size:12px}}/* ============================================================================ ARCHIVE MODE — the /portfolio/ page (Figma 129:13504). Page-top section:offset under the fixed header, inset hairline at the very top, 64px rhythm (hairline → heading row → cards → between card rows), "Filtrēt" toggle + category filter row (row itself DERIVED — flagged). ========================================================================== */
.component-portfolio.portfolio--archive{padding-top:var(--header-h);/* View toggle:Saraksts / Kanva (DERIVED — no Figma frame;flagged). Nav-item active language (§5.2 / the drawer terms):active = static underline + 10px orange dot (padding reserves the slot — no shift), hover = sweep underline. Sits right of the heading, before "Filtrēt" (cols 9–11, justify-end;the DOM order keeps sparse auto-placement on the heading row). */ /* it's a <button class="link-u"> — strip the UA button chrome the link-u voice doesn't reset */ /* Mobile (derived — no Figma mobile frame):4-col grid, stacked cards, tighter 32px rhythm. FLAGGED for design review. */ /* CANVAS MODE (is-canvas, toggled by index.js):the section becomes a 100svh flex column — heading row (hairline + heading + toggles) on top, the canvas filling the rest. List cards hide;the empty row stays available (zero-match filter state). Page scroll is locked via html.bw-canvas-lock (below) — the footer being unreachable is the mode's contract. */}.component-portfolio.portfolio--archive .portfolio__grid--archive{row-gap:var(--space-4)}.component-portfolio.portfolio--archive .portfolio__rule{grid-column:1/-1;grid-row:1;height:1px;background:var(--color-grey)}.component-portfolio.portfolio--archive .portfolio__filter-toggle{background:none;border:0;padding:0;cursor:pointer;font-family:var(--font-b)}.component-portfolio.portfolio--archive .portfolio__modes{grid-column:9/span 3;justify-self:end;align-self:center;display:flex;align-items:center;gap:var(--space-1);white-space:nowrap}.component-portfolio.portfolio--archive .portfolio__mode{position:relative;display:inline-flex;align-items:center;padding:3px 0 3px 22px;background:none;border:0;cursor:pointer;font-family:var(--font-b);font-weight:500;font-size:var(--text-nav);line-height:1.2;letter-spacing:var(--track-1);color:inherit}.component-portfolio.portfolio--archive .portfolio__mode::before{content:"";position:absolute;left:0;top:50%;width:10px;height:10px;border-radius:50%;background:var(--color-orange);transform:translateY(-50%) scale(0.4);opacity:0;transition:opacity 0.3s var(--ease-osmo), transform 0.3s var(--ease-osmo)}.component-portfolio.portfolio--archive .portfolio__mode-label{position:relative}.component-portfolio.portfolio--archive .portfolio__mode-label::after{content:"";position:absolute;left:0;right:0;bottom:-2px;height:1px;background:currentColor;transform:scaleX(0);transform-origin:left center;transition:transform 0.3s var(--ease-osmo)}@media (hover:hover) and (pointer:fine){.component-portfolio.portfolio--archive .portfolio__mode:hover .portfolio__mode-label::after{transform:scaleX(1)}}.component-portfolio.portfolio--archive .portfolio__mode.is-active::before{opacity:1;transform:translateY(-50%) scale(1)}.component-portfolio.portfolio--archive .portfolio__mode.is-active .portfolio__mode-label{text-decoration:underline;text-underline-offset:var(--underline-offset);text-decoration-thickness:1px;text-decoration-skip-ink:none}.component-portfolio.portfolio--archive .portfolio__mode.is-active .portfolio__mode-label::after{display:none}.component-portfolio.portfolio--archive .portfolio__modes[hidden]{display:none}.component-portfolio.portfolio--archive .portfolio__card.is-filtered-out{display:none}.component-portfolio.portfolio--archive .portfolio__empty{grid-column:1/-1;display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--space-1) var(--space-2);padding-block:var(--space-3)}.component-portfolio.portfolio--archive .portfolio__empty[hidden]{display:none}.component-portfolio.portfolio--archive .portfolio__empty-text{font-weight:500;font-size:var(--text-body);line-height:1.5;letter-spacing:var(--track-1);opacity:0.5;margin:0}.component-portfolio.portfolio--archive .portfolio__empty-clear{background:none;border:0;padding:0;cursor:pointer;font-family:var(--font-b);color:inherit}@media (max-width:767px){.component-portfolio.portfolio--archive{padding-top:calc(var(--header-h) + var(--space-2));/* Galerija view removed on mobile (client 2026-08-11 — hard to use). With the toggle gone, .portfolio__all auto-places Atlasīt onto the heading line (col 4, right side — compact). */}.component-portfolio.portfolio--archive .portfolio__grid--archive{row-gap:var(--space-2)}.component-portfolio.portfolio--archive .portfolio__modes{display:none}.component-portfolio.portfolio--archive .portfolio__filter-toggle{align-self:center}}.component-portfolio.portfolio--archive.is-canvas{height:100svh;display:flex;flex-direction:column;padding-bottom:0;overflow:clip;position:relative;/* Heading row floats ABOVE the full-bleed canvas;pointer-events off on the row itself so drags can start anywhere, re-enabled on the interactive bits (client feedback 2026-08-11:canvas must not be cut by the heading section). */}.component-portfolio.portfolio--archive.is-canvas .portfolio__grid--archive{flex:0 0 auto;position:relative;z-index:3;pointer-events:none}.component-portfolio.portfolio--archive.is-canvas .portfolio__grid--archive a,
.component-portfolio.portfolio--archive.is-canvas .portfolio__grid--archive button{pointer-events:auto}.component-portfolio.portfolio--archive.is-canvas .portfolio__card{display:none}/* Page-scroll lock while the canvas view is active. A CLASS (not an inline style) on purpose:the filter drawer's own open/close cycle sets and then CLEARS inline documentElement overflow — clearing must not unlock the canvas mode underneath. */
html.bw-canvas-lock{overflow:hidden}/* ============================================================================ FILTER DRAWER (derived design — no Figma frame;flagged). TOP-LEVEL selectors on purpose:index.js re-parents the overlay + drawer to <body> at init (the plugin's main[data-barba] carries position:relative + z-index:1 — a stacking context that would trap the fixed drawer under the z-1000 header), so they are NOT descendants of .component-portfolio at runtime. Right-side #141414 panel, ~4 grid columns wide at desktop (4 cols + side margin ≈ 31vw at 1920/1440, clamped), full-screen on mobile. Left hairline (§1 grey), dimmed overlay behind. Slide-in = transform only, 0.6s house osmo;overlay fades 0.4s. z-index above the header (1000) so the fixed bar dims too;below the barba transition curtain (10000). JS toggles .is-open on both + [hidden] for a11y/no-JS. ========================================================================== */
.portfolio__overlay{position:fixed;inset:0;z-index:1190;background:rgba(0, 0, 0, 0.55);opacity:0;transition:opacity 0.4s var(--ease-osmo)}.portfolio__overlay.is-open{opacity:1}.portfolio__drawer{position:fixed;top:0;right:0;bottom:0;z-index:1200;width:clamp(400px, 31vw, 600px);max-width:100%;display:flex;flex-direction:column;padding:var(--space-2) var(--space-3) var(--space-3);background:var(--color-black);color:var(--color-white);border-left:1px solid var(--color-grey);transform:translateX(100%);transition:transform 0.6s var(--ease-osmo);overflow-y:auto;overscroll-behavior:contain}.portfolio__drawer.is-open{transform:translateX(0)}/* [hidden]'s UA display:none loses to the author display:flex above — restate it (JS un-hides, forces a reflow, then adds .is-open so the slide actually transitions). Same for the flex empty-state row. */
.portfolio__drawer[hidden],
.portfolio__empty[hidden]{display:none}.portfolio__drawer-head{display:flex;align-items:center;justify-content:space-between;min-height:calc(var(--header-h) - 2 * var(--space-2))}.portfolio__drawer-title{font-weight:500;font-size:var(--text-nav);line-height:1;letter-spacing:var(--track-1)}.portfolio__drawer-close{display:grid;place-items:center;width:40px;height:40px;margin-right:-12px;background:none;border:0;padding:0;cursor:pointer;color:inherit;transition:color 0.3s var(--ease-osmo), transform 0.4s var(--ease-osmo)}.portfolio__drawer-groups{display:flex;flex-direction:column;gap:var(--space-3);margin-top:var(--space-3)}.portfolio__drawer-label{display:block;font-weight:500;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-1);opacity:0.5;margin-bottom:12px}.portfolio__drawer-terms{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}/* Term item — the nav-item language (§5.2):18px Medium, sweep-underline hover, active = 10px orange dot (left, in the drawer's list context) + static underline. Multi-select buttons, aria-pressed = state. */
.portfolio__term{position:relative;display:inline-flex;align-items:center;align-self:flex-start;padding:3px 0 3px 22px;background:none;border:0;cursor:pointer;font-family:var(--font-b);font-weight:500;font-size:var(--text-nav);line-height:1.2;letter-spacing:var(--track-1);color:inherit;text-align:left}.portfolio__term::before{content:"";position:absolute;left:0;top:50%;width:10px;height:10px;border-radius:50%;background:var(--color-orange);transform:translateY(-50%) scale(0.4);opacity:0;transition:opacity 0.3s var(--ease-osmo), transform 0.3s var(--ease-osmo)}.portfolio__term-label{position:relative}.portfolio__term-label::after{content:"";position:absolute;left:0;right:0;bottom:-2px;height:1px;background:currentColor;transform:scaleX(0);transform-origin:left center;transition:transform 0.3s var(--ease-osmo)}@media (hover:hover) and (pointer:fine){.portfolio__term:hover .portfolio__term-label::after{transform:scaleX(1)}}/* Faceted availability (2026-08):term would yield zero results — muted, inert (DERIVED styling — drawer has no Figma frame;flagged). JS also guards keyboard clicks via the is-disabled class + aria-disabled. */
.portfolio__term.is-disabled{opacity:0.3;pointer-events:none;cursor:default}.portfolio__term.is-disabled .portfolio__term-label::after{display:none}.portfolio__term-count{margin-left:8px;font-size:var(--text-xs);opacity:0.5}.portfolio__term.is-active::before{opacity:1;transform:translateY(-50%) scale(1)}.portfolio__term.is-active .portfolio__term-label{text-decoration:underline;text-underline-offset:var(--underline-offset);text-decoration-thickness:1px;text-decoration-skip-ink:none}.portfolio__term.is-active .portfolio__term-label::after{display:none}.portfolio__drawer-foot{display:flex;align-items:baseline;justify-content:space-between;gap:var(--space-1);margin-top:auto;padding-top:var(--space-3)}.portfolio__drawer-clear{background:none;border:0;padding:0;cursor:pointer;font-family:var(--font-b);font-weight:500;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-1);color:inherit;text-decoration:underline;text-underline-offset:var(--underline-offset);text-decoration-thickness:1px;text-decoration-skip-ink:none;transition:color 0.3s var(--ease-osmo), opacity 0.3s var(--ease-osmo)}.portfolio__drawer-clear:disabled{opacity:0.35;cursor:default;pointer-events:none}@media (hover:hover) and (pointer:fine){.portfolio__drawer-clear:hover{color:var(--color-orange)}.portfolio__drawer-close:hover{color:var(--color-orange);transform:rotate(90deg)}}.portfolio__drawer-count{font-weight:500;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-1);opacity:0.5;white-space:nowrap}@media (prefers-reduced-motion:reduce){.portfolio__overlay, .portfolio__drawer, .portfolio__drawer-close, .portfolio__term::before{transition:none}}@media (max-width:767px){.portfolio__drawer{width:100%;border-left:0;padding:var(--space-2)}}/* ============================================================================ INFINITE DRAGGABLE CANVAS — the "Kanva" view (OSMO "Infinite Draggable Grid (Masonry)"). CSS concepts from the resource (full-size wrapper, overflow clip, grab/grabbing cursor, opacity-0 while status=loading with a 0.5s fade, absolute collection/list, absolute fixed-width items, user-select none, will-change, backface hidden, object-fit cover + pointer-events none imgs) — class names/tokens adapted to the house system. Item sizing ADAPTED for our 3:2 covers:26em (416px) wide, 0.75em padding ≈ 3–4 columns at 1440;17em on mobile. ========================================================================== */
.pcanvas{/* Full-bleed:fills the entire 100svh section, running underneath the fixed site header and the overlaid heading row (client feedback 2026-08-11 — no abrupt cut at the heading). */ position:absolute;inset:0;z-index:1;overflow:clip;cursor:grab;touch-action:none;user-select:none;-webkit-user-select:none;opacity:1;transition:opacity 0.5s var(--ease-osmo);/* Top scrim so the header + heading row stay legible over drifting cards — brand black fading out, no interaction cost. */}.pcanvas::after{content:"";position:absolute;top:0;left:0;right:0;height:24rem;background:linear-gradient(to bottom, rgba(20, 20, 20, 0.97) 0%, rgba(20, 20, 20, 0.85) 40%, rgba(20, 20, 20, 0) 100%);pointer-events:none;z-index:2}.pcanvas[hidden]{display:none}.pcanvas[data-infinite-grid-status=loading]{opacity:0}.pcanvas[data-infinite-grid-status=dragging]{cursor:grabbing}.pcanvas__collection{position:absolute;top:0;left:0;will-change:transform}.pcanvas__list{position:absolute;inset:0;list-style:none;margin:0;padding:0;will-change:transform}.pcanvas__item{position:absolute;top:0;left:0;width:28em;padding:1.5em;will-change:transform}.pcanvas__card{display:block;text-decoration:none;color:inherit;user-select:none;-webkit-user-select:none;-webkit-user-drag:none;will-change:transform;backface-visibility:hidden}.pcanvas__cover{display:block;aspect-ratio:2000/1333;overflow:hidden;background:#1d1d1d}.pcanvas__cover img{width:100%;height:100%;object-fit:cover;display:block;pointer-events:none}/* Name caption (DERIVED — card-caption voice §5.6, quieter:14px caps at 50%;reveals on card hover on fine pointers, always on for touch. Opacity-only so the measured item height never changes. FLAGGED. */
.pcanvas__name{display:block;margin-top:8px;font-weight:500;font-size:var(--text-xs);line-height:1.1;letter-spacing:-0.01em;opacity:0.5}@media (hover:hover) and (pointer:fine){.pcanvas__name{opacity:0;transition:opacity 0.3s var(--ease-osmo)}.pcanvas__card:hover .pcanvas__name{opacity:0.5}}@media (max-width:767px){.pcanvas__item{width:18em;padding:1em}}/* Reduced motion:no canvas at all — the toggle disappears, list only (index.js also refuses to init the canvas). */
@media (prefers-reduced-motion:reduce){.component-portfolio.portfolio--archive .portfolio__modes{display:none}.pcanvas{display:none}}/* Mobile:page-top hairline duplicates the header's bottom border (client 2026-08-11, kontakti precedent) — hidden on mobile. */
@media (max-width:767px){.component-portfolio .portfolio__rule{display:none}}/* BETTRWEB post_content — long-form legal/editorial pages (privacy policy). Light surface (page-theme-light pages). No entrance animations — a legal doc has no business animating line by line, so the sitewide fade-in is neutralized below. */
.component-post_content{padding:calc(var(--header-h) + 5rem) 0 6.25rem;background:var(--color-white);color:var(--color-black)}@media (max-width:767px){.component-post_content{padding:calc(var(--header-h) + 2.5rem) 0 4rem}}.component-post_content.fade-in,
.component-post_content [data-animate]{opacity:1;transform:none}.component-post_content > .inner{max-width:50rem;margin-inline:auto;padding-inline:var(--grid-margin)}.component-post_content .content h1{font-size:var(--text-h2);font-weight:500;line-height:1.2;letter-spacing:var(--track-1);margin:0 0 2.5rem}.component-post_content .content h2,
.component-post_content .content h3{font-size:var(--text-h3);font-weight:500;line-height:1.2;letter-spacing:var(--track-1);margin:3rem 0 1rem}.component-post_content .content p{margin:0 0 1rem;line-height:1.6;letter-spacing:var(--track-1)}.component-post_content .content ol,
.component-post_content .content ul{margin:0 0 1.5rem;padding-left:1.5rem}.component-post_content .content ol li,
.component-post_content .content ul li{margin-bottom:0.55rem;line-height:1.6}.component-post_content .content ol ol,
.component-post_content .content ol ul,
.component-post_content .content ul ol,
.component-post_content .content ul ul{margin:0.55rem 0 0}.component-post_content .content a{color:inherit;text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:var(--underline-offset, 0.15em);transition:color 0.3s var(--ease-osmo)}.component-post_content .content a:hover{color:var(--color-orange)}.component-post_content .content table{width:100%;border-collapse:collapse;margin:0 0 1.5rem}.component-post_content .content table td,
.component-post_content .content table th{border:1px solid var(--color-grey);padding:0.6rem 0.8rem;text-align:left;line-height:1.5}/* ============================================================================ "Saņemt piedāvājumu" intake flow — one question per viewport. DERIVED (no Figma frame for this page):built from the established grid, type scale, pill button and underline-row language. FLAGGED for design review. Surface is the house dark #141414 (inherited from body) so arriving from a service single reads as a continuation. The ONE orange moment per view is the visitor's own selection — chips fill orange when chosen, and the progress line tracks in orange. Nothing else on the page competes. Layout:fixed-header offset, a thin progress bar row, then a stage that holds exactly one visible step. Inactive steps carry the `hidden` attribute (JS-driven), so only one is ever in flow — the stage's min-height keeps short steps filling the viewport without absolute positioning, which would clip the taller ones. ========================================================================== */
.component-quote{padding-top:var(--header-h);padding-bottom:var(--space-3);--quote-label-w:120px;/* 8rem ≈ the bar row + section padding, so a short step still centres in what is left of the viewport. */ /* Step content starts at column 6 — the same column the header nav starts on (design-system §5.7), so the flow sits on the site's existing vertical. The progress bar above stays full width. */ /* Narrower than the question it sits under:across the full 7 columns this is a single ~110-character line, well past a comfortable measure. */ /* ---- Answer list -------------------------------------------------------- Client 2026-08-12:the wrapping pill chips read as tag soup once a step had seven of them, so answers are a vertical list of real checkboxes (multi-select) / radios (single). The native input is hidden but still focusable — .quote__opt-box is the thing you see, and it mirrors the input's:checked and:focus-visible states. Rows are full-width and clickable end to end, capped at the same 640px measure as the fields. */ /* Hidden, not display:none — it must stay focusable and reachable by the radio group's arrow keys. */ /* Radios are round and carry a dot instead of a tick — the shape is the affordance that says "one of these", before anyone reads the question. */ /* Checked — the sanctioned single orange moment, spent on the visitor's own answer (same role the chips' fill used to play). */ /* Group-level message for the answer-list steps. The shared .contact__error primitive is absolutely positioned against a .contact__field, which chip groups do not have, so this one sits in flow. */ /* ---- Calendar ---------------------------------------------------------- Custom rather than <input type="date">, whose native popup renders in the OS chrome and OS language and reads as a foreign object here. Sharp hairline box (not a rounded card) to sit with the grid/editorial language;days pick up the same orange the chips use, so selection reads the same way everywhere in the flow. */ /* Free-text field behind "Cits pakalpojums", on the same rhythm as the calendar behind "Konkrēts datums". */ /* Step 4 puts the calendar BESIDE the answers (client 2026-08-12) — the right two thirds of the row were empty, and below-the-list pushed the buttons a long way down. align-items:start keeps the list at the top of the row rather than centring it against the taller calendar. */ /* Beside the list there is no gap to collapse, so the reveal animates only height + opacity (the JS tweens marginTop too — here it is already 0). */ /* Reuses the real Figma arrow vector (.btn-pill__icon rotates it to point right);the prev button spins the same file the other way. */ /* One column, stacked (client 2026-08-12) — the flow shows one question at a time, so splitting three short fields across two columns just made the eye zig-zag. Capped at the same 640px measure the goal textarea uses so a phone number does not get an 870px underline. */ /* Field row:visible Medium label LEFT, the value typed to its right on the same underlined line — the established house pattern, lifted from components/contact_page (.cp__field, Figma 122:11435 "Vārds* | Jānis Paraugs"). Recoloured for this dark surface;everything else matches, so the two forms read as the same object. */ /* The goal step's label is screen-reader-only (its question is the label), so the textarea owns the whole row and baseline alignment has nothing to align to. The 640px measure comes from its --fields parent. */ /* Fixed label column (client 2026-08-12):sized to the label, every value would start at a different x — "Vārds*" is 46px and "Mājaslapa, ja ir" is 99px — so the typed text stepped in and out down the form. One width for all of them puts every input on the same vertical line. --quote-label-w must clear the LONGEST label in the flow;at 16px Medium the current longest is "Mājaslapa, ja ir" (99px), so 120px leaves room for the copy pass. Check this if a label gets longer:the value is nowrap, so an oversized one would run into its own input. */ /* Shared globals primitive puts .contact__error just under the underline;the underline itself flips orange here (contact's own rule is scoped to its component). */}.component-quote .quote__bar{row-gap:var(--space-1);padding-top:var(--space-3)}.component-quote .quote__title{grid-column:1/span 6;font-size:var(--text-xs);font-weight:500;line-height:1;letter-spacing:var(--track-1);opacity:0.5}.component-quote .quote__count{grid-column:11/span 2;justify-self:end;font-size:var(--text-xs);font-weight:500;line-height:1;letter-spacing:var(--track-1);font-variant-numeric:tabular-nums}.component-quote .quote__count-sep{display:inline-block;padding-inline:5px;opacity:0.5}.component-quote .quote__track{grid-column:1/-1;position:relative;height:1px;background:rgba(255, 255, 255, 0.15)}.component-quote .quote__track-fill{position:absolute;top:0;bottom:0;left:0;width:0;background:var(--color-orange);transition:width 0.6s var(--ease-osmo)}.component-quote .quote__stage{display:grid;align-content:center;min-height:calc(100svh - var(--header-h) - 8rem)}.component-quote .quote__step{grid-area:1/1}.component-quote .quote__step[hidden]{display:none}.component-quote .quote__inner{row-gap:var(--space-2);align-content:start}.component-quote .quote__q{grid-column:6/span 7}.component-quote .quote__q--sub{margin-top:var(--space-2);opacity:0.5}.component-quote .quote__hint{grid-column:6/span 5;margin-top:calc(var(--space-2) * -1 + 12px);font-size:var(--text-body);line-height:1.5;opacity:0.5}.component-quote .quote__body{grid-column:6/span 7}.component-quote .quote__opts{display:flex;flex-direction:column;max-width:640px}.component-quote .quote__opt{display:flex;align-items:center;gap:16px;padding-block:11px;cursor:pointer}.component-quote .quote__opt-input{position:absolute;width:1px;height:1px;opacity:0;margin:0;pointer-events:none}.component-quote .quote__opt-box{position:relative;flex:none;width:20px;height:20px;border:1px solid rgba(255, 255, 255, 0.35);border-radius:4px;display:flex;align-items:center;justify-content:center;color:var(--color-white);transition:background-color 0.25s var(--ease-osmo), border-color 0.25s var(--ease-osmo)}.component-quote .quote__opt-box svg{width:12px;height:10px;opacity:0;transform:scale(0.7);transition:opacity 0.2s var(--ease-osmo), transform 0.25s var(--ease-osmo)}.component-quote .quote__opt-input[type=radio] + .quote__opt-box{border-radius:50%}.component-quote .quote__opt-input[type=radio] + .quote__opt-box::after{content:"";width:8px;height:8px;border-radius:50%;background:var(--color-white);transform:scale(0);transition:transform 0.25s var(--ease-osmo)}.component-quote .quote__opt-label{font-weight:500;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-1);transition:color 0.25s var(--ease-osmo)}.component-quote .quote__opt-input:checked + .quote__opt-box{background:var(--color-orange);border-color:var(--color-orange)}.component-quote .quote__opt-input:checked + .quote__opt-box svg{opacity:1;transform:none}.component-quote .quote__opt-input:checked + .quote__opt-box::after{transform:scale(1)}.component-quote .quote__opt-input:focus-visible + .quote__opt-box{outline:2px solid var(--color-orange);outline-offset:3px}@media (hover:hover) and (pointer:fine){.component-quote .quote__opt:hover .quote__opt-box{border-color:var(--color-orange)}.component-quote .quote__opt:hover .quote__opt-label{color:var(--color-orange)}}.component-quote .quote__error{margin-top:var(--space-2);font-size:var(--text-xs);font-weight:500;line-height:1;letter-spacing:var(--track-1);color:var(--color-orange);opacity:0;transform:translateY(-4px);transition:opacity 0.3s var(--ease-osmo), transform 0.3s var(--ease-osmo)}.component-quote .quote__error.is-on{opacity:1;transform:none}.component-quote .quote__other{margin-top:var(--space-3);max-width:640px}.component-quote .quote__body--timeline{display:flex;align-items:flex-start;gap:var(--space-4)}.component-quote .quote__body--timeline .quote__opts{flex:none;max-width:none}.component-quote .quote__date{margin-top:var(--space-3)}.component-quote .quote__body--timeline .quote__date{margin-top:0}.component-quote .quote__cal{width:100%;max-width:336px;border:1px solid rgba(255, 255, 255, 0.15)}.component-quote .quote__cal-head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-1);padding:12px 12px 12px 16px;border-bottom:1px solid rgba(255, 255, 255, 0.15)}.component-quote .quote__cal-title{font-size:var(--text-sm);font-weight:500;line-height:1;letter-spacing:var(--track-1)}.component-quote .quote__cal-nav{display:flex;border:0;background:none;padding:0;color:var(--color-white);opacity:0.5;cursor:pointer;transition:color 0.3s var(--ease-osmo), opacity 0.3s var(--ease-osmo)}.component-quote .quote__cal-nav[disabled]{opacity:0.15;cursor:default}.component-quote .quote__cal-nav--prev .btn-pill__icon svg{transform:rotate(270deg)}@media (hover:hover) and (pointer:fine){.component-quote .quote__cal-nav:not([disabled]):hover{color:var(--color-orange);opacity:1}}.component-quote .quote__cal-dow,
.component-quote .quote__cal-grid{display:grid;grid-template-columns:repeat(7, minmax(0, 1fr))}.component-quote .quote__cal-dow{padding:12px 8px 4px}.component-quote .quote__cal-dow span{text-align:center;font-size:var(--text-xs);font-weight:500;line-height:1;letter-spacing:var(--track-1);opacity:0.5}.component-quote .quote__cal-grid{padding:4px 8px 12px;gap:2px}.component-quote .quote__cal-day{aspect-ratio:1;display:flex;align-items:center;justify-content:center;border:0;border-radius:100px;background:transparent;color:var(--color-white);font-family:var(--font-b);font-weight:500;font-size:var(--text-xs);line-height:1;letter-spacing:var(--track-1);cursor:pointer;transition:background-color 0.25s var(--ease-osmo), color 0.25s var(--ease-osmo);/* Today reads as a hairline ring;the filled state is reserved for the actual pick so the two never look alike. */}.component-quote .quote__cal-day[disabled]{opacity:0.2;cursor:default}.component-quote .quote__cal-day.is-today{box-shadow:inset 0 0 0 1px rgba(255, 255, 255, 0.35)}.component-quote .quote__cal-day.is-picked{background:var(--color-orange);box-shadow:none}@media (hover:hover) and (pointer:fine){.component-quote .quote__cal-day:not([disabled]):not(.is-picked):hover{background:rgba(255, 255, 255, 0.1)}}.component-quote .quote__body--fields{display:grid;grid-template-columns:minmax(0, 1fr);row-gap:40px;max-width:640px}.component-quote .quote__field{display:flex;align-items:baseline;gap:24px;border-bottom:1px solid rgba(255, 255, 255, 0.35);padding-bottom:7px;transition:border-color 0.3s var(--ease-osmo);/* No min-height and no manual resize:[data-quote-grow] sets the height from scrollHeight, so the box is exactly as tall as its content and the caret sits on the underline from the first keystroke. */}.component-quote .quote__field:focus-within{border-bottom-color:var(--color-orange)}.component-quote .quote__field input,
.component-quote .quote__field textarea{flex:1;min-width:0;background:none;border:0;outline:0;padding:0;color:var(--color-white);font-family:var(--font-b);font-weight:400;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-1)}.component-quote .quote__field input::placeholder,
.component-quote .quote__field textarea::placeholder{color:var(--color-white);opacity:0.3}.component-quote .quote__field textarea{resize:none;overflow:hidden;min-height:1.5em}.component-quote .quote__field--area{align-items:flex-start}.component-quote .quote__label{flex:none;width:var(--quote-label-w);font-weight:500;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-1);white-space:nowrap}.component-quote .quote__field.is-invalid{border-bottom-color:var(--color-orange)}.component-quote .quote__nav{grid-column:6/span 7;display:flex;align-items:center;gap:var(--space-2);margin-top:var(--space-1)}.component-quote .quote__back{border:0;background:none;padding:0;color:var(--color-white);font-family:var(--font-b);font-weight:500;font-size:var(--text-sm);line-height:1.5;letter-spacing:var(--track-1);opacity:0.5;cursor:pointer;transition:color 0.3s var(--ease-osmo), opacity 0.3s var(--ease-osmo)}@media (hover:hover) and (pointer:fine){.component-quote .quote__back:hover{color:var(--color-orange);opacity:1}}.component-quote .quote__status{grid-column:6/span 7;margin-top:var(--space-1);font-size:var(--text-sm);color:var(--color-orange)}.component-quote .quote__noscript{padding-block:var(--space-4)}.component-quote .quote__noscript p{grid-column:1/span 8}@media (max-width:1023px){.component-quote .quote__q{grid-column:1/-1}.component-quote .quote__hint, .component-quote .quote__body, .component-quote .quote__nav, .component-quote .quote__status{grid-column:1/-1}}@media (max-width:767px){.component-quote{padding-bottom:var(--space-2);/* No forced viewport height on mobile:the on-screen keyboard shrinks svh mid-interaction and a centred step would jump under the caret. */ /* The 336px calendar cannot sit beside the answers in a 311px column, so step 4 stacks again and the gap above it comes back. Stretch, not flex-start:in a column the desktop's start-alignment would shrink the calendar to its content width (233px) instead of the column. */}.component-quote .quote__bar{padding-top:var(--space-2)}.component-quote .quote__title{grid-column:1/span 3}.component-quote .quote__count{grid-column:4}.component-quote .quote__stage{min-height:0;padding-block:var(--space-4)}.component-quote .quote__inner{row-gap:var(--space-2)}.component-quote .quote__nav{flex-wrap:wrap;gap:var(--space-1) var(--space-2)}.component-quote .quote__body--timeline{flex-direction:column;align-items:stretch;gap:0}.component-quote .quote__body--timeline .quote__date{margin-top:var(--space-3)}}@media (prefers-reduced-motion:reduce){.component-quote .quote__track-fill, .component-quote .quote__opt-box, .component-quote .quote__opt-box svg, .component-quote .quote__opt-box::after, .component-quote .quote__opt-label, .component-quote .quote__field, .component-quote .quote__back{transition:none}}/* Atsauksmes page (DERIVED — no Figma frame;FLAGGED for design review). Page-top = the statement/portfolio-archive pattern:header offset, full hairline, 64px rhythm down to the heading row and the list. Review rows sit on #515151 hairlines like the services rows / clients band:attribution col 1–4 (name white, role/company in the muted 50% voice, small logo cell), quote col 6–11 at a derived 24→32px display size, 64px row padding. */
.component-reviews{padding-top:var(--header-h);padding-bottom:var(--section-pad);/* Row = its own 12-col grid;tracks match the parent because it spans all 12 columns (same trick as the services rows). */ /* Full row height (the quote sets it) as a flex column so the optional project link can pin to the BOTTOM-left, level with the quote's last line (client 2026-08-12 — was a fixed margin under the logo). */ /* Small logo cell — clients-band sizing halved (max 32px tall), white monochrome SVGs from the canon set only. */ /* Optional portfolio-project link — bottom-left of the attribution column (client 2026-08-11). .link-u carries the link language (18px nav size, static underline, orange hover — the "Vairāk par mums" convention). */ /* Mobile — derived from the 4-col grid (no Figma mobile frame;FLAGGED):heading, lede, then rows stack quote-first with the attribution below. */}.component-reviews .reviews__grid{row-gap:var(--space-4)}.component-reviews .reviews__rule{grid-column:1/-1;grid-row:1;height:1px;background:var(--color-grey)}.component-reviews .reviews__heading{grid-column:1/span 3;grid-row:2;align-self:center}.component-reviews .reviews__lede{grid-column:7/span 3;grid-row:2;align-self:center;font-weight:400;font-size:var(--text-body);line-height:1.5}.component-reviews .reviews__list{grid-column:1/-1;grid-row:3;list-style:none;margin:0;padding:0}.component-reviews .reviews__item{border-top:1px solid var(--color-grey)}.component-reviews .reviews__item:last-child{border-bottom:1px solid var(--color-grey)}.component-reviews .reviews__row{margin:0;display:grid;grid-template-columns:repeat(var(--grid-columns), minmax(0, 1fr));column-gap:var(--grid-gutter);padding-block:var(--space-4);/* 64px — more generous than the 48px
services rows;quotes need the air (DERIVED) */}.component-reviews .reviews__who{grid-column:1/span 4;grid-row:1;align-self:stretch;display:flex;flex-direction:column;align-items:flex-start}.component-reviews .reviews__name{font-size:var(--text-body)}.component-reviews .reviews__meta{color:rgba(255, 255, 255, 0.5);font-size:var(--text-body);line-height:1.5;margin-top:2px}.component-reviews .reviews__logo{display:block;margin-top:var(--space-2)}.component-reviews .reviews__logo img{display:block;width:auto;height:auto;max-width:120px;max-height:32px;object-fit:contain}.component-reviews .reviews__project{display:inline-block;/* pushed to the row's bottom edge (level with the quote's end);min 32px breathing room from the logo/role above */ margin-top:auto;padding-top:var(--space-2)}.component-reviews .reviews__quote{grid-column:6/span 6;grid-row:1;margin:0}.component-reviews .reviews__quote p{/* Derived quote scale:24px @375 → 32px @1920. Long quotes → the ~2:1 end of the headline-to-body ratio rule (§2.2). */ font-size:clamp(24px, 0.63vw + 20px, 32px);font-weight:500;line-height:1.3;letter-spacing:var(--track-1)}@media (max-width:767px){.component-reviews .reviews__grid{row-gap:var(--space-2)}.component-reviews .reviews__heading{grid-column:1/-1}.component-reviews .reviews__lede{grid-column:1/-1;grid-row:3}.component-reviews .reviews__list{grid-row:4;margin-top:var(--space-1)}.component-reviews .reviews__row{grid-template-columns:1fr;row-gap:var(--space-2);padding-block:var(--space-2)}.component-reviews .reviews__quote{grid-column:1/-1;grid-row:1}.component-reviews .reviews__who{grid-column:1/-1;grid-row:2}.component-reviews .reviews__logo{margin-top:var(--space-1)}.component-reviews .reviews__project{margin-top:var(--space-1)}}/* Mobile:page-top hairline duplicates the header's bottom border (client 2026-08-11, kontakti precedent) — hidden on mobile, site-wide convention. */
@media (max-width:767px){.component-reviews .reviews__rule{display:none}}/* Services list (Figma 104:10341, §5.4) — 96px section padding, 64px heading → list gap, rows on shared #515151 hairlines. */
.component-services{padding-block:var(--section-pad);/* Row = its own 12-col grid;tracks match the parent because it spans the full content width (same gutters, no extra padding). */ /* Title stops at col 5 so it can never run under the [index] now that the index sits in col 6 (it used to span 1/6 while the index started at 7). Current titles are nowhere near that wide;this only decides where a long one wraps. */ /* Client fix 2026-08-12:[index] moves col 7 -> col 6 so it lands on the same vertical as the header nav (header/style.scss .header__nav is 6 / 12, design-system §5.7) and the section lede above it. Figma 104:10401 draws it in col 7;the client marked the col-6 alignment on the /pakalpojumi/ screenshot and it now reads as one continuous edge down the page. Applies to BOTH surfaces — the row is not archive-aware. */ /* Hover (Figma 104:10401 Variant2 104:10402):white bg fades in from the bottom, title + index flip to #141414, link goes orange + underlined (§5.3 hover language) — one accent moment per view. Client fix 2026-08-11:the Variant2 64px hover padding-inline IS applied now — as transforms (title in from the left edge, link in from the right;the middle [index] column stays put, which is exactly where symmetric 64px padding leaves it on the 12-col grid), so nothing reflows and the white sheet still spans the full row width. Same 0.5s osmo timing as the sheet rise;CSS transitions interpolate from the current value, so mid-animation hover-out reverses without jitter. */ /* ---- ARCHIVE MODE (Figma 129:14189, /pakalpojumi/) --------------------- Page starts under the fixed header:full-width hairline, 64px to the H1, then the same rows. Everything else is deliberately IDENTICAL to the homepage rendering (client 2026-08-12:"unite them so they use the same block") — the lede's col 7 placement was drift and is gone, so it inherits the shared 6 / span 6 above;only the Book 400 weight below still differs, and that one is Figma-sourced. */ /* ---- Image preview cursor follower (OSMO resource) --------------------- Rides ON TOP of the white-rise row hover — nothing above changes. The per-row .services__visual is only a hidden clone source:display:none + loading=lazy means the browser never fetches it (mobile = zero extra bytes);initServicesFollower() (index.js) flips the imgs to eager only when the desktop guards pass. Everything below is gated to hover-capable fine pointers ≥992px (the resource's own breakpoint) AND prefers-reduced-motion:no-preference — reduced motion gets NO follower, no dim, just the normal row hover, matching the JS init's guards. */}.component-services .services__grid{row-gap:var(--space-4)}.component-services .services__heading{grid-column:1/span 3;grid-row:1}.component-services .services__lede{grid-column:6/span 6;grid-row:1;font-size:var(--text-body);line-height:1.5}.component-services .services__list{grid-column:1/-1;grid-row:2;display:flex;flex-direction:column}.component-services .services__row{position:relative;display:grid;grid-template-columns:repeat(var(--grid-columns), minmax(0, 1fr));column-gap:var(--grid-gutter);align-items:center;padding-block:var(--space-3);border-top:1px solid var(--color-grey);text-decoration:none;color:inherit;/* Hover surface (Figma Variant2 104:10402 = the HOVER state, client- confirmed 2026-08-10):a white sheet rises from the row's bottom edge. Absolutely positioned to the padding box, so the 1px #515151 row borders stay visible above/below it while it's up. */}.component-services .services__row:last-child{border-bottom:1px solid var(--color-grey)}.component-services .services__row::before{content:"";position:absolute;inset:0;background:var(--color-white);transform:scaleY(0);transform-origin:50% 100%;transition:transform 0.5s var(--ease-osmo);pointer-events:none}.component-services .services__title,
.component-services .services__index,
.component-services .services__link{position:relative}.component-services .services__title{grid-column:1/span 5;align-self:start;transition:color 0.5s var(--ease-osmo), transform 0.5s var(--ease-osmo)}.component-services .services__index{grid-column:6/span 1;font-size:var(--text-lg);line-height:1.2;letter-spacing:var(--track-1);transition:color 0.5s var(--ease-osmo)}.component-services .services__link{grid-column:12/span 1;justify-self:end;white-space:nowrap;transition:color 0.5s var(--ease-osmo), transform 0.5s var(--ease-osmo);/* hover underline = the shared LEFT-sweep (globals sweep-underline) instead of the old instant text-decoration flip (client fix 2026-08-12);single-line (nowrap) so the pseudo underline is safe */ position:relative}.component-services .services__link::after{content:"";position:absolute;left:0;right:0;bottom:-2px;height:1px;background:currentColor;transform:scaleX(0);transform-origin:left center;transition:transform 0.3s var(--ease-osmo)}@media (hover:hover) and (pointer:fine){.component-services{/* 4-col mobile layout (rare hover-capable narrow viewport):the link sits at the LEFT edge on its own row there, so both items shift inward from the left;24px keeps the compressed grid from clipping. */}.component-services .services__row:hover::before{transform:scaleY(1)}.component-services .services__row:hover .services__title, .component-services .services__row:hover .services__index{color:var(--color-black)}.component-services .services__row:hover .services__title{transform:translateX(64px)}.component-services .services__row:hover .services__link{transform:translateX(-64px);color:var(--color-orange)}.component-services .services__row:hover .services__link::after{transform:scaleX(1)}}@media (hover:hover) and (pointer:fine) and (max-width:767px){.component-services .services__row:hover .services__title{transform:translateX(24px)}.component-services .services__row:hover .services__link{transform:translateX(24px)}}@media (prefers-reduced-motion:reduce){.component-services .services__row::before, .component-services .services__title, .component-services .services__index, .component-services .services__link, .component-services .services__link::after{transition:none}}.component-services.services--archive{padding-top:var(--header-h);/* Mobile:the hairline is hidden (rule at the bottom of this file), so the explicit row numbers above must go too — a display:none element is not a grid item, but the row-2/3/4 placements kept an empty track 1 alive and its row-gap pushed the H1 down 32px for nothing (measured 2026-08-12). Auto placement gives the same visual order and hands the rest back to the shared mobile block below, so the two surfaces stay identical here as well. */}.component-services.services--archive .services__rule{grid-column:1/-1;grid-row:1;height:1px;background:var(--color-grey)}.component-services.services--archive .services__heading{grid-row:2}.component-services.services--archive .services__lede{grid-row:2;/* Book — Figma 129:14196. The only surviving homepage/archive difference;design-system §2 otherwise reserves Book 400 for footer contact values, so this is flagged for the client. */ font-weight:400}.component-services.services--archive .services__list{grid-row:3}@media (max-width:767px){.component-services.services--archive .services__heading, .component-services.services--archive .services__lede, .component-services.services--archive .services__list{grid-row:auto}}@media (max-width:767px){.component-services .services__heading{grid-column:1/-1}.component-services .services__lede{grid-column:1/-1;grid-row:auto}.component-services .services__grid{row-gap:var(--space-2)}.component-services .services__list{grid-row:auto;margin-top:var(--space-2)}.component-services .services__row{padding-block:var(--space-2);row-gap:12px}.component-services .services__title{grid-column:1/span 3}.component-services .services__index{grid-column:4/span 1;justify-self:end}.component-services .services__link{/* client 2026-08-11:no "Uzzināt vairāk" on mobile — the whole row is the link */ display:none}}.component-services .services__visual{display:none}.component-services .services__cursor{display:none;position:fixed;top:0;left:0;/* Above all section content incl. the white hover sheet;below the fixed header (1000, header/style.scss) — the preview sliding UNDER the header near the viewport top is the intended stacking — and far below the barba curtain (10000) / cursor (10010). */ z-index:900;pointer-events:none}@media (hover:hover) and (pointer:fine) and (min-width:992px) and (prefers-reduced-motion:no-preference){.component-services{/* Clones stack absolutely inside the inner;GSAP drives yPercent for the directional masked in/out. display:block out-ranks the clone's inherited .services__visual display:none (that rule is only for the in-row clone SOURCE). */ /* "Apskatīt" label — resource's "View case" pill:white pill (design-system §5 pill radius primitive), 14px, dead-centre of the preview and carrying the same arrow as the header CTA (client 2026-08-12;it used to sit bottom-anchored and arrow-less). FLAGGED for design review (no Figma spec for this element). Centring is on BOTH axes against .services__cursor, whose box is exactly the preview's box:.services__cursor-inner is the only in-flow child (the label itself is absolute), so the fixed wrap shrink-wraps to the inner's 24em × 1.5 aspect. The inner's scale(0.4 -> 1) is a transform, so it never changes that box. */ /* Non-hovered rows dim to 0.5 (the resource's .preview-item:not(:hover) rule). Applied to the row's CONTENT children, not the row itself:the [data-animate] reveal deliberately leaves inline opacity:1 on the row (see initDataAnimate's clearProps note) which would out-rank a row-level rule, and a CSS opacity transition on the row would rubber-band the GSAP reveal fade. Children are GSAP-free. */}.component-services .services__cursor{display:block}.component-services .services__cursor-inner{position:relative;width:24em;aspect-ratio:1.5;overflow:hidden;/* Scale/fade in while the collection is hovered — the resource's body:has([data-follower-collection]:hover) mechanism, scoped to the component's own wrap ancestor (see the:has rule below). */ transform:scale(0.4);opacity:0;transition:transform 0.4s var(--ease-osmo), opacity 0.3s var(--ease-osmo)}.component-services .services__cursor [data-follower-visual]{display:block;position:absolute;inset:0}.component-services .services__cursor [data-follower-visual] img{display:block;width:100%;height:100%;object-fit:cover}.component-services .services__cursor-label{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%) scale(0.6);opacity:0;display:inline-flex;align-items:center;gap:4px;background:var(--color-white);color:var(--color-black);font-size:var(--text-xs);line-height:1;padding:8px 10px 8px 14px;border-radius:100px;white-space:nowrap;transition:transform 0.4s var(--ease-osmo), opacity 0.3s var(--ease-osmo);/* The shared .btn-pill__icon box is 24px, sized for the header's 16px CTA;on this 14px label it would tower over the text. */}.component-services .services__cursor-label .btn-pill__icon{width:16px;height:16px}.component-services .services__cursor-label .btn-pill__icon svg{width:8.3px;height:12.8px}.component-services .services__grid:has(.services__list:hover) .services__cursor-inner{transform:scale(1);opacity:1}.component-services .services__grid:has(.services__list:hover) .services__cursor-label{transform:translate(-50%, -50%) scale(1);opacity:1}.component-services .services__row .services__title, .component-services .services__row .services__index, .component-services .services__row .services__link{transition:color 0.5s var(--ease-osmo), transform 0.5s var(--ease-osmo), opacity 0.3s var(--ease-osmo)}.component-services .services__list:has(.services__row:hover) .services__row:not(:hover) .services__title, .component-services .services__list:has(.services__row:hover) .services__row:not(:hover) .services__index, .component-services .services__list:has(.services__row:hover) .services__row:not(:hover) .services__link{opacity:0.5}}/* Mobile:page-top hairline duplicates the header's bottom border (client 2026-08-11, kontakti precedent) — hidden on mobile. */
@media (max-width:767px){.component-services .services__rule{display:none}}/* Label/value hairline rows + optional note block (DERIVED — no Figma frame;FLAGGED). Services-row rhythm at 32px padding:label col 1–6 white, value col 9–12 muted. Note:heading col 1–3, copy col 6–11 muted. */
.component-spec_rows{padding-block:var(--section-pad)}.component-spec_rows .spec-rows__grid{row-gap:var(--space-4)}.component-spec_rows .spec-rows__heading{grid-column:1/span 3;grid-row:1}.component-spec_rows .spec-rows__list{grid-column:1/-1;list-style:none;margin:0;padding:0}.component-spec_rows .spec-rows__row{display:grid;grid-template-columns:repeat(var(--grid-columns), minmax(0, 1fr));column-gap:var(--grid-gutter);padding-block:var(--space-2);border-top:1px solid var(--color-grey)}.component-spec_rows .spec-rows__row:last-child{border-bottom:1px solid var(--color-grey)}.component-spec_rows .spec-rows__label{grid-column:1/span 6;font-size:var(--text-lg);line-height:1.4;letter-spacing:var(--track-1)}.component-spec_rows .spec-rows__value{grid-column:9/span 4;font-size:var(--text-body);line-height:1.5;color:rgba(255, 255, 255, 0.5)}.component-spec_rows .spec-rows__note{grid-column:1/-1;display:grid;grid-template-columns:repeat(var(--grid-columns), minmax(0, 1fr));column-gap:var(--grid-gutter);margin-top:var(--space-2)}.component-spec_rows .spec-rows__note-heading{grid-column:1/span 3;font-size:var(--text-body);line-height:1.5;letter-spacing:var(--track-1)}.component-spec_rows .spec-rows__note-text{grid-column:6/span 6;font-size:var(--text-body);line-height:1.5;color:rgba(255, 255, 255, 0.5)}@media (max-width:767px){.component-spec_rows .spec-rows__grid{row-gap:var(--space-2)}.component-spec_rows .spec-rows__heading{grid-column:1/-1}.component-spec_rows .spec-rows__row{grid-template-columns:1fr;row-gap:6px;padding-block:var(--space-1)}.component-spec_rows .spec-rows__label{grid-column:1/-1}.component-spec_rows .spec-rows__value{grid-column:1/-1}.component-spec_rows .spec-rows__note{grid-template-columns:1fr;row-gap:var(--space-1);margin-top:var(--space-1)}.component-spec_rows .spec-rows__note-heading, .component-spec_rows .spec-rows__note-text{grid-column:1/-1}}/* Par mums manifest (Figma 181:10303) — page starts under the fixed header:full-width hairline, 64px down to the heading row;heading col 1–3 at 50% opacity, display-size statement copy col 6/span 5, 16px paragraph gap, 96px bottom padding. Same page-top pattern as services--archive / portfolio--archive. */
.component-statement{padding-top:var(--header-h);padding-bottom:var(--section-pad);/* Statement copy — body text at display size (48px), 1.15 leading, 16px between paragraphs (Figma 181:10309 mb-16;overrides the global 9px p+p rhythm via the flex gap). */ /* Muted phrase — [kvadrātiekavas] in the textarea (Figma:#515151 inline span "mazāk trokšņa, vairāk jēgas"). FLAG:design-system §1 reserves grey for hairlines;this inline use is straight from the frame. */ /* Mobile — derived from the 4-col grid (no Figma mobile frame;FLAGGED for design review):heading, then copy, both full-width. */}.component-statement .statement__grid{row-gap:var(--space-4)}.component-statement .statement__rule{grid-column:1/-1;grid-row:1;height:1px;background:var(--color-grey)}.component-statement .statement__heading{grid-column:1/span 3;grid-row:2;align-self:start;font-size:var(--text-h2);font-weight:500;line-height:1;letter-spacing:var(--track-1);opacity:0.5}.component-statement .statement__copy{grid-column:6/span 5;grid-row:2;display:flex;flex-direction:column;gap:var(--space-1);font-size:var(--text-h2);font-weight:500;line-height:1.15;letter-spacing:var(--track-1)}.component-statement .statement__copy p + p{margin-top:0}.component-statement .statement__muted{color:var(--color-grey)}@media (max-width:767px){.component-statement .statement__grid{row-gap:var(--space-2)}.component-statement .statement__heading{grid-column:1/-1}.component-statement .statement__copy{grid-column:1/-1;grid-row:3}}/* Mobile:page-top hairline duplicates the header's bottom border (client 2026-08-11, kontakti precedent) — hidden on mobile. */
@media (max-width:767px){.component-statement .statement__rule{display:none}}/* Thank-you page (/paldies/) — no Figma frame (FLAGGED for design review):derived from the 404's vertically-centered full-viewport composition under the solid header + the statement/archive page-top hairline. Display heading col 1, Book muted body line, pill CTA + sweep-underline text link. Standard footer follows the section. */
.component-thanks{background:var(--color-black);/* Page-top hairline (same pattern as statement / services--archive / portfolio--archive:full content width, under the fixed header). */ /* Content block — vertically centered in the remaining viewport, like the 404's centered row. section-pad keeps breathing room on short viewports where centering would crowd the hairline/footer. */ /* Mobile — derived from the 4-col grid (no Figma mobile frame;FLAGGED for design review):everything full-width, same centered stack. .thanks__actions MUST be reset with the rest:the grid is 4 columns here, so its desktop `6 / -1` fell outside it, and the browser answered by adding implicit columns — which is why the CTA sat squeezed beside the lede instead of under it (client 2026-08-12). */}.component-thanks .thanks__section{min-height:100svh;padding-top:var(--header-h);display:flex;flex-direction:column}.component-thanks .thanks__rule{grid-column:1/-1;height:1px;background:var(--color-grey)}.component-thanks .thanks__grid{flex:1;align-content:center;padding-block:var(--section-pad)}.component-thanks .thanks__heading{grid-column:6/span 7}.component-thanks .thanks__lede{grid-column:6/span 5;margin-top:var(--space-2);font-size:var(--text-body);font-weight:400;line-height:1.5;letter-spacing:var(--track-1);color:var(--color-white)}.component-thanks .thanks__actions{grid-column:6/-1;margin-top:var(--space-3);display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2)}@media (max-width:767px){.component-thanks .thanks__heading, .component-thanks .thanks__lede, .component-thanks .thanks__actions{grid-column:1/-1}}/* Mobile:page-top hairline duplicates the header's bottom border (client 2026-08-11, kontakti precedent) — hidden on mobile. */
@media (max-width:767px){.component-thanks .thanks__rule{display:none}}/* ============================================================================ BETTRWEB — theme style.scss (compiled LAST, after all components). Page-transition chrome + component base. ========================================================================== */
/* ---- Component base --------------------------------------------------------- Every builder section renders as <section class="component component-X">. Sections own their backgrounds;the barba container itself is opaque so nothing shows through gaps during transitions. */
.component:not(.component-header){/* header is position:fixed (its own scss compiles BEFORE this file — equal specificity would let this rule win, hence the:not) */ position:relative}main[data-barba=container]{background:var(--color-black);/* Empty-main artifact fix:with no components the fixed header used to overlap the footer at the very top of the page. A sane minimum keeps skeleton pages readable until their content is built. */ min-height:calc(100svh - 322px)}.component:empty{display:none}/* ============================================================================ LIGHT PAGE THEME — body.page-theme-light (portfolio singles, Figma 117:11207:the WHOLE page is white, header + footer included). Server-set in functions.php (body_class) for first paint;barba.js's applyThemeFrom() re-syncs the class from the incoming container's data-page-theme on every client-side navigation (at the curtain-covered moment, so the outgoing dark page never flashes white). ========================================================================== */
body.page-theme-light{background:var(--color-white);color:var(--color-black);/* Header → white variant (§5.7 White, Figma 83:6927):white bar, black logo + nav. is-solid (always on — singles are non-front pages) keeps the white surface with a subtle dark rule. */ /* Footer flipped onto white (Figma 122:11329):black text, inverted lockup, dark hairlines. Hovers stay orange. */}body.page-theme-light main[data-barba=container]{background:var(--color-white);color:var(--color-black)}body.page-theme-light .component-header{color:var(--color-black);background:var(--color-white);/* pill CTA:the mixin hardcodes white — flip to the derived on-white variant (§5.1 flag:no on-white button exists in Figma) */}body.page-theme-light .component-header.is-solid{background:var(--color-white);border-bottom-color:rgba(20, 20, 20, 0.08)}body.page-theme-light .component-header .header__logo-img--white{display:none}body.page-theme-light .component-header .header__logo-img--black{display:block}body.page-theme-light .component-header .header__lang-panel{background:var(--color-white);border-color:rgba(20, 20, 20, 0.15)}body.page-theme-light .component-header .header__lang-panel a{color:var(--color-black)}body.page-theme-light .component-header .btn-pill{color:var(--color-black)}@media (hover:hover) and (pointer:fine){body.page-theme-light .component-header .btn-pill:hover{color:var(--color-orange)}}body.page-theme-light .component-footer{background:var(--color-white);color:var(--color-black);border-top-color:rgba(20, 20, 20, 0.15)}body.page-theme-light .component-footer .footer__logo img{filter:invert(1)}body.page-theme-light .component-footer .footer__value,
body.page-theme-light .component-footer .footer__service-link,
body.page-theme-light .component-footer .footer__legal a{color:var(--color-black)}body.page-theme-light .component-footer .footer__value--link{border-bottom-color:var(--color-black)}/* ============================================================================ Portfolio single (Figma 2098:3402 "Portfolio - single - new", client relayout 2026-08-13 — supersedes the 117:11207 three-row stack) — white page, ONE content row:the whole text column (title, meta, description, back link) in cols 1–4, the 3:2 cover in cols 6–12, column 5 empty. 96px from the top hairline to the content, 96px bottom padding. ========================================================================== */
.component-portfolio_single{padding-top:var(--header-h);padding-bottom:var(--section-pad);/* Text column (Figma 2098:3406) — cols 1–4 (597px @1920). Height comes from the cover beside it (grid stretch), and space-between then pins the back link to the bottom so it aligns with the cover's bottom edge. */ /* Title + meta group (Figma 2098:3407) — 64px between them. width:100% is load-bearing:the parent is align-items:flex-start (so the back link stays its own width rather than stretching into a full-width underline), which would otherwise shrink-wrap this block to its content and squeeze the meta list to ~414px of the column's 597px — wrapping values that have room to fit. */ /* Meta list (Figma 2098:3409) — a flat stack of rows, each a fixed 120px label + a flexible value, 16px both between rows and between the two columns. The 16px row rhythm the client asked for on 2026-08-13 is now the design's own spacing, so this is no longer a deviation. BOTH label and value are Medium 500;the value is separated by dropping it to 40% opacity rather than to Book 400 (client 2026-08-13 — reads cleaner and more modern than a weight change). */ /* Media column (Figma 2098:3424 for the cover) — cols 6–12, beside the text column rather than full-bleed below it. With a lone cover its 3:2 height sets the row height, which is what gives .ps__col something to distribute against;with a gallery it grows into a scrolling stack (see .has-gallery). */ /* Description (Figma 2098:3422) — now inside the text column, so it is placed by the flex parent, not the page grid. 18px Medium, tight 1.2 leading (deliberately tighter than the 1.5 body voice). */ /* ---- Gallery mode (the-brandidentity.com product-page pattern) ---------- Only when the project HAS extra shots. The text column stops stretching (sticky needs a content-height box — a stretched grid item is as tall as the row and has nothing to stick against) and pins under the fixed header while the media stack scrolls past it. Trade-off, deliberate:dropping the stretch also drops space-between, so the back link no longer bottom-aligns with the cover. That alignment is a Figma detail worth keeping when there is nothing to scroll, which is exactly why this is scoped to .has-gallery rather than applied to every project. */ /* ≤1023px — stack (derived;no Figma frame below 1920, FLAGGED for design review). Side-by-side stops working well before the mobile breakpoint:at 900px the 4-column text column is only ~268px, which wraps the 48px title to shreds and leaves ~130px for a meta value. So the whole row stacks as soon as the nav collapses. The text column dissolves (display:contents) so its children become grid items in their own right and the media block can sit between the meta and the description — leaving the column intact would push the images below the back link. This is why .ps__col carries no data-animate:a contents box generates no frame, so GSAP could not transform it. Placement is by `order`, not explicit grid-row, because the media block is one item here regardless of how many shots it holds — explicit rows would need renumbering per gallery length. Nothing may set grid-row in this branch or auto-placement stops honouring order. */ /* ≤767px — 4-col grid, tighter rhythm, and the meta rows stack label over value:a shared label column wide enough for "Specifikācija" (96px) would eat a third of the 311px line and push every value to 3 lines. Stacking gives the value the full width. Note both flex shorthands must be reset — under flex-direction:column a `flex:0 0 120px` basis would set the label's HEIGHT. */}.component-portfolio_single .ps__grid{row-gap:var(--space-6)}.component-portfolio_single .ps__rule{grid-column:1/-1;grid-row:1;height:1px;background:rgba(20, 20, 20, 0.15)}.component-portfolio_single .ps__col{grid-column:1/5;grid-row:2;display:flex;flex-direction:column;align-items:flex-start;justify-content:space-between;/* MINIMUM gap only:space-between spreads the real gaps (~80px in Figma) whenever there is slack, so this is invisible on short projects and only bites once a long description fills the column. Kept at 32px rather than 64px so a ~110-word description still fits inside the cover's 3:2 height at 1920 and the back link keeps its bottom alignment with the image. */ gap:var(--space-2)}.component-portfolio_single .ps__head{display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-4);width:100%}.component-portfolio_single .ps__title{max-width:100%}.component-portfolio_single a.ps__back{font-weight:500;font-size:var(--text-nav);line-height:1.5;letter-spacing:var(--track-1);color:inherit;opacity:0.5;text-decoration:underline;text-underline-offset:var(--underline-offset);text-decoration-thickness:1px;text-decoration-skip-ink:none;transition:opacity 0.3s var(--ease-osmo), color 0.3s var(--ease-osmo)}.component-portfolio_single .ps__meta{display:flex;flex-direction:column;gap:var(--space-1);margin:0;width:100%;font-size:var(--text-nav);line-height:1.5;letter-spacing:var(--track-1)}.component-portfolio_single .ps__meta .ps__meta-row{display:flex;align-items:flex-start;gap:var(--space-1);width:100%}.component-portfolio_single .ps__meta dt{flex:0 0 120px;font-weight:500;margin:0}.component-portfolio_single .ps__meta dd{flex:1 1 0;min-width:0;font-weight:500;opacity:0.4;margin:0;transition:opacity 0.3s var(--ease-osmo)}.component-portfolio_single a.ps__visit{font-weight:500;color:inherit;text-decoration:underline;text-underline-offset:var(--underline-offset);text-decoration-thickness:1px;text-decoration-skip-ink:none;transition:color 0.3s var(--ease-osmo)}.component-portfolio_single .ps__media{grid-column:6/-1;grid-row:2;display:flex;flex-direction:column;gap:var(--grid-gutter);min-width:0}.component-portfolio_single .ps__cover,
.component-portfolio_single .ps__shot{aspect-ratio:2000/1333;overflow:hidden;background:#ececec}.component-portfolio_single .ps__cover img,
.component-portfolio_single .ps__shot img{width:100%;height:100%;object-fit:cover;display:block}.component-portfolio_single .ps__description{font-weight:500;font-size:var(--text-nav);line-height:1.2;letter-spacing:var(--track-1);width:100%}.component-portfolio_single.has-gallery .ps__col{align-self:start;position:sticky;top:calc(var(--header-h) + var(--space-2));justify-content:flex-start;gap:var(--space-4)}@media (hover:hover) and (pointer:fine){.component-portfolio_single{/* The 40% sits on the <dd>, so the link cannot raise its own opacity — lift the whole row's value instead, which also brings the underline up with it. */}.component-portfolio_single a.ps__back:hover{opacity:1;color:var(--color-orange)}.component-portfolio_single .ps__meta dd:has(a.ps__visit:hover){opacity:1}.component-portfolio_single a.ps__visit:hover{color:var(--color-orange)}}@media (max-width:1023px){.component-portfolio_single{}.component-portfolio_single .ps__grid{row-gap:var(--space-4)}.component-portfolio_single .ps__col{display:contents}.component-portfolio_single.has-gallery .ps__col{position:static}.component-portfolio_single .ps__rule{grid-row:auto;order:0}.component-portfolio_single .ps__head{grid-column:1/-1;grid-row:auto;order:1;gap:var(--space-2)}.component-portfolio_single .ps__media{grid-column:1/-1;grid-row:auto;order:2}.component-portfolio_single .ps__description{grid-column:1/-1;order:3}.component-portfolio_single a.ps__back{grid-column:1/-1;order:4}}@media (max-width:767px){.component-portfolio_single{}.component-portfolio_single .ps__grid{row-gap:var(--space-2)}.component-portfolio_single .ps__meta .ps__meta-row{flex-direction:column;gap:0}.component-portfolio_single .ps__meta dt{flex:0 0 auto}.component-portfolio_single .ps__meta dd{flex:0 0 auto}}.component-portfolio_nav{padding-bottom:var(--space-4)}.component-portfolio_nav .pn__grid{row-gap:var(--space-4)}.component-portfolio_nav .pn__rule{grid-column:1/-1;grid-row:1;height:1px;background:rgba(20, 20, 20, 0.15)}.component-portfolio_nav a.pn__link{grid-row:2;color:inherit;text-decoration:none;transition:color 0.3s var(--ease-osmo)}.component-portfolio_nav .pn__link--prev{grid-column:1/6;justify-self:start}.component-portfolio_nav .pn__link--next{grid-column:8/-1;justify-self:end;text-align:right}@media (hover:hover) and (pointer:fine){.component-portfolio_nav a.pn__link:hover{color:var(--color-orange)}}@media (max-width:767px){.component-portfolio_nav{padding-bottom:var(--space-2)}.component-portfolio_nav .pn__grid{row-gap:var(--space-2)}.component-portfolio_nav a.pn__link{font-size:var(--text-h3)}.component-portfolio_nav .pn__link--prev{grid-column:1/3}.component-portfolio_nav .pn__link--next{grid-column:3/-1}}/* ============================================================================ Service single (Figma "Pakalpojumi single" 150:7550) — dark page. Sections below are template-level (single-service.php), not builder components;portfolio/clients/faq/contact are re-rendered builder components and keep their own styles. ========================================================================== */
/* ---- Hero (181:8629/181:8631):full-bleed photo, 900px (min 700), bottom- anchored — label col 1, 120px display title col 6/span 4, pause glyph col 12. Transparent header sits above (functions.php exemption). ------------- */
.component-service_hero{position:relative;height:900px;min-height:700px;max-height:100svh;overflow:hidden;background:var(--color-black);/* Legibility overlays (design-system §1):header gradient + eased bottom scrim for the H1/label on bright slides (client 2026-08-15, matches .hero__gradient on the homepage hero). */ /* 120px display (Figma 181:8633) — one size above the 80px H1 scale;fluid down to phone. FLAG:not in the design-system type table (§2.2), taken directly from the frame. */ /* Dash pagination — shown only when the hero has 2+ slides (mirrors .hero__indicator / .hero__dash on the homepage) */}.component-service_hero .sh__media{position:absolute;inset:0;z-index:0}.component-service_hero .sh__media img{width:100%;height:100%;object-fit:cover;display:block}.component-service_hero .sh__slide{position:absolute;inset:0;opacity:0;transform:scale(1.045);transition:opacity 1.2s var(--ease-osmo), transform 1.8s var(--ease-osmo)}.component-service_hero .sh__slide.is-active{opacity:1;transform:scale(1)}.component-service_hero .sh__gradient{position:absolute;inset:0;z-index:1;pointer-events:none;background:linear-gradient(to bottom, rgba(0, 0, 0, 0.25) 0%, rgba(0, 0, 0, 0) 50%), linear-gradient(to top, rgba(20, 20, 20, 0.65) 0%, rgba(20, 20, 20, 0.52) 15%, rgba(20, 20, 20, 0.36) 32%, rgba(20, 20, 20, 0.2) 48%, rgba(20, 20, 20, 0.08) 62%, rgba(20, 20, 20, 0) 78%)}.component-service_hero .sh__grid{position:relative;z-index:2;height:100%;align-content:end;padding-bottom:var(--space-3);row-gap:var(--space-1)}.component-service_hero .sh__label{grid-column:1/span 2;align-self:end;font-size:var(--text-nav);line-height:1;letter-spacing:var(--track-1);white-space:nowrap}.component-service_hero .sh__title{grid-column:6/span 4;align-self:end;font-size:clamp(48px, 6.25vw, 120px);font-weight:500;line-height:1;letter-spacing:var(--track-2)}.component-service_hero .sh__indicator{grid-column:12/span 1;align-self:end;justify-self:end;display:flex;gap:4px;align-items:center;padding:0}.component-service_hero .sh__dash{width:15px;height:2px;padding:3px 0;background:none;border:0;cursor:pointer;background-clip:content-box;background-color:var(--color-grey);transition:background-color 0.4s var(--ease-osmo)}.component-service_hero .sh__dash.is-active{background-color:var(--color-white)}@media (max-width:767px){.component-service_hero{height:80svh;min-height:560px}.component-service_hero .sh__label{grid-column:1/span 3}.component-service_hero .sh__title{grid-column:1/-1;grid-row:1}.component-service_hero .sh__indicator{display:none}.component-service_hero .sh__grid{row-gap:var(--space-2)}}/* ---- Intro + info accordion (181:8661):orange-dot 48px lede + pill CTA col 1–4 (CTA pinned to the accordion's bottom edge), plus-icon accordion col 6–12. 144px top / 96px bottom padding. --------------------------------- */
.component-service_intro{padding-top:144px;padding-bottom:var(--section-pad)}.component-service_intro .si__aside{grid-column:1/span 4;display:flex;flex-direction:column;align-items:flex-start;justify-content:space-between;gap:var(--space-3)}.component-service_intro .si__intro{position:relative}.component-service_intro .si__intro .accent-dot{position:absolute;left:0;/* Line-box centered — see components/contact/style.scss for the full note. Same 24px dot against the same clamped .t-h2. */ top:calc(0.6em - 12px)}.component-service_intro .si__intro .si__intro-text{display:block;text-indent:40px}.component-service_intro .si__accordion{grid-column:6/span 7}@media (max-width:767px){.component-service_intro{padding-top:var(--section-pad)}.component-service_intro .si__grid{row-gap:var(--space-3)}.component-service_intro .si__aside{grid-column:1/-1;gap:var(--space-2)}.component-service_intro .si__accordion{grid-column:1/-1}}/* ---- Capability columns (181:8765):hairline, then three 24px label/text columns — 1/span 4, 6/span 3, 10/span 3;labels at 50% opacity. ----------- */
.component-service_columns{padding-top:var(--space-3);padding-bottom:var(--section-pad);/* Linked entries ("Label | /url" lines → subservice singles):the house single-line link language — sweep-underline + orange hover (§5.2), same treatment as .footer__service-link. Labels here are short (single-line even on mobile), so no wrapped-underline fallback. */}.component-service_columns .sc__grid{row-gap:var(--space-4)}.component-service_columns .sc__rule{grid-column:1/-1;grid-row:1;height:1px;background:var(--color-grey)}.component-service_columns .sc__col{grid-row:2;display:flex;flex-direction:column;gap:10px}.component-service_columns .sc__col--1{grid-column:1/span 4}.component-service_columns .sc__col--2{grid-column:6/span 3}.component-service_columns .sc__col--3{grid-column:10/span 3}.component-service_columns .sc__label{font-size:var(--text-h3);line-height:1.2;letter-spacing:var(--track-1);opacity:0.5;font-weight:500}.component-service_columns .sc__text{font-size:var(--text-h3);line-height:1.2;letter-spacing:var(--track-1);font-weight:500}.component-service_columns .sc__link{display:inline-block;color:inherit;text-decoration:none;transition:color 0.3s var(--ease-osmo);position:relative}.component-service_columns .sc__link::after{content:"";position:absolute;left:0;right:0;bottom:-2px;height:1px;background:currentColor;transform:scaleX(0);transform-origin:left center;transition:transform 0.3s var(--ease-osmo)}@media (hover:hover) and (pointer:fine){.component-service_columns .sc__link:hover{color:var(--color-orange)}.component-service_columns .sc__link:hover::after{transform:scaleX(1)}}@media (max-width:767px){.component-service_columns .sc__grid{row-gap:var(--space-2)}.component-service_columns .sc__col, .component-service_columns .sc__col--1, .component-service_columns .sc__col--2, .component-service_columns .sc__col--3{grid-column:1/-1;grid-row:auto}}/* When Lenis is active, disable native CSS smooth-scroll so the browser's smooth behaviour doesn't fight Lenis's per-frame scroll (jitter). */
html.lenis,
html.lenis body{height:auto}.lenis.lenis-smooth{scroll-behavior:auto}.lenis.lenis-smooth [data-lenis-prevent]{overscroll-behavior:contain}.lenis.lenis-stopped{overflow:hidden}.lenis:not(.lenis-autoToggle).lenis-stopped{overflow:auto !important}/* ---- Barba page transition chrome (theme part:parts/transition.php) --------- Osmo curved wipe. The panel rests at top:100% (just below the viewport);barba.js tweens yPercent 0 -> -100 (covered) -> -200 (cleared above). The -top / -bottom children sit flush against the panel's edges and each clip an oversized circle, so scaling them on Y bulges the leading/trailing edge into a curve instead of a hard horizontal line. Brand ORANGE with a white wordmark:black-on-black read as invisible against the site's #141414 base surface, so the wipe now uses the same pure-brand field as the entrance loader (§1's sanctioned full-orange context) and the two moments speak with one voice. z-index 10000 keeps it above every component but below the loader (10005) and the custom cursor (10010). */
.transition{z-index:10000;pointer-events:none;position:fixed;inset:0;overflow:clip}.transition__panel{/* currentColor drives the panel AND both .transition__panel-circle curves, so the whole wipe recolors from this one declaration. */ color:var(--color-orange);background-color:currentColor;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:absolute;top:100%;left:0}.transition__panel-top{transform-origin:bottom;flex-flow:column;align-items:center;width:100%;height:0%;display:flex;position:absolute;bottom:calc(100% - 1px);left:0;overflow:hidden}.transition__panel-bottom{transform-origin:top;flex-flow:column;justify-content:flex-end;align-items:center;width:100%;height:0%;display:flex;position:absolute;top:calc(100% - 1px);left:0;overflow:hidden}.transition__panel-circle{aspect-ratio:auto;background-color:currentColor;border-radius:50%;width:125%;height:500%;position:absolute}/* Sized to match the loader wordmark (frame 83:6792) so the entrance flow and the page transitions speak with one mark. overflow:hidden is the mask the staggered letter reveal slides through. */
.transition__logo{color:var(--color-white);opacity:0;width:clamp(180px, 20vw, 384px);display:flex;position:absolute;top:50%;left:50%;overflow:hidden;transform:translate(-50%, -50%)}.transition__logo svg{display:block;width:100%;height:auto}/* ---- Race-proof barba enter hiding (see barba.js "RACE-PROOF ENTER HIDING") ----------------------------------------------------------------- Layer 1:html.is-transitioning is added synchronously in barba's `before` hook — before the incoming container can exist — so the sibling rule guarantees the incoming <main> (always the LATER sibling under sync:true) never paints visible. GSAP's inline autoAlpha owns the container from the leave/enter timelines (inline styles override these un-!important rules). Layer 2:.is-entering (stamped on the incoming container in beforeEnter) keeps its reveal targets hidden until afterEnter's initDataAnimate() has committed inline initial states;the classes lift two rAFs later. Neither class is ever added under reduced-motion / automation. */
html.is-transitioning main[data-barba=container] ~ main[data-barba=container]{visibility:hidden}main[data-barba=container].is-entering [data-animate]{opacity:0}/* ---- Race-proof HARD-LOAD hiding (client fix 2026-08-12) -------------------- Same structural principle as the barba layers above, for full page loads (F5 / direct URL):app.js — the script that JS-hides [data-animate] targets — is enqueued AFTER <main>, so on a hard refresh the browser can paint the content fully visible, hide it when app.js executes, then animate it in (pop → hide → reveal). html.bw-preanim is stamped by parts/transition.php's SYNCHRONOUS inline script, which the parser runs BEFORE <main> exists — so no frame can ever paint a target un-netted. Lifted by initDataAnimate() (theme index.js) two rAFs after the inline initial states commit;the inline script arms a 4s failsafe so nothing can stay hidden if the JS stack dies. The class is impossible to apply for noscript users (only that inline script stamps it) and is never added under automation / reduced motion (instant paths untouched). */
html.bw-preanim main[data-barba=container] [data-animate]{opacity:0}/* ---- Entrance flow loader (Figma 2065:1885 — parts/transition.php) ---------- Full-viewport orange brand field above everything except the cursor (wipe panel 10000 < loader 10005 < cursor 10010). v1.11.1:this is now PURELY the pre-paint cover — it holds the screen from first paint (the wipe panel rests below the fold at CSS `top:100%` and so cannot), until barba.js poses the panel over it and drops it in the same frame. Its old wordmark child and its own flat lift moved to the panel, which is why there is nothing left inside it. .is-skipped is the automation / reduced-motion / repeat-visit instant state (inline script in the part). */
.loader{position:fixed;inset:0;z-index:10005;background:var(--color-orange)}.loader.is-skipped{display:none}/* ---- Masked line reveal (hero display headings) ------------------------------ bw_mask_lines() wraps each heading line:the outer span clips, the inner span slides up from yPercent 110 (wcHeroReveal, theme index.js). Pure block spans — with JS off (or reduced motion) the lines simply render. */
.mask-line{display:block;overflow:hidden}.mask-line__inner{display:block}/* Mobile:page-top hairline duplicates the header's bottom border (client 2026-08-11, kontakti precedent) — hidden on mobile. */
@media (max-width:767px){.ps__rule{display:none}}/* ---- Focused task surfaces (the "Saņemt piedāvājumu" intake flow) ------------ Pages built on the quote component render without the site footer, so the flow is one viewport and nothing below invites abandoning a half-finished question. Done in CSS, keyed off the CURRENT barba container, rather than by skipping Bettrlite::footer() in footer.php:barba swaps only <main>, so a footer omitted server-side would stay missing for the rest of the session once the visitor navigated away (client report 2026-08-12). During a `sync` transition both containers are briefly present and the rule keeps the footer hidden until the flow container is gone, which is what we want anyway. Targets the <footer> ELEMENT, not .component-footer:the component is a <section> nested inside it, so it is not a sibling of <main>. */
main[data-barba=container]:has(.component-quote) ~ footer{display:none}