/* =============================================================
   VzdelAI — Layout & Component CSS
   -------------------------------------------------------------
   Tento súbor obsahuje VŠETKY layoutové, komponentové a
   responzívne pravidlá. Brand tokens (farby, fonty, premenné)
   sú v <style> bloku v index.html — design system.

   Štruktúra (vyhľadaj komentárové banery):
     1. Reset, body, scroll-padding
     2. Skip link (a11y)
     3. Layout shell — .vz-container, .vz-section
     4. Hero — .vz-hero, animované blobs, neural lines
     5. Nav — .vz-nav-row, .vz-nav-links, mobilné menu
     6. Karty a gridy — .vz-grid-3, .vz-card-pad
     7. Activities row — .vz-activity-row hover
     8. Outputs grid — 12-col, .vz-output-card
     9. Consortium — .vz-partner-card, .vz-partner-media
    10. Stats band — .vz-stat-card, layered background
    11. Footer — .vz-footer-top, .vz-funding-grid
    12. Roadmap rail (HowItWorks) — .vz-roadmap-*
    13. News (zatiaľ nepoužité) — .vz-news-card
    14. Tweaks panel overrides
    15. Fluid typography clamps
    16. RESPONZIVITA — media queries (zoskupené na konci)
   ============================================================= */

  html, body { margin: 0; padding: 0; }
  /* ====== BULLETPROOF HORIZONTAL CONTAINMENT ======
     Three layers, because mobile browsers handle each one slightly
     differently and any one of them can leak:
       1. html + body — clip + force width 100%
       2. #root       — same, clips the React tree
       3. overscroll-behavior-x — kills the rubber-band "swipe" gesture
          mobile browsers do even when there's no real content to scroll
          (the slight left/right wobble users feel is this bounce,
          not actual horizontal overflow).
     Use `overflow-x: clip` where supported (no scroll container, so
     position: fixed nav still resolves to viewport); fall back to
     `hidden` for older browsers. */
  html, body, #root {
    width: 100%;
    max-width: 100%;
    overflow-x: hidden;
    overflow-x: clip;
  }
  html, body {
    overscroll-behavior-x: none;
  }
  body { background: #fff; position: relative; }
  html {
    scroll-behavior: smooth;
    scroll-padding-top: 96px;
  }
  /* Sections, main and #root must never exceed the viewport width.
     Without these, a single child with a runaway width (forgotten
     `width: ###px`, a `white-space: nowrap` long string, an SVG with
     too-large intrinsic size) can push the whole page horizontally. */
  #root, main, section, footer, header { max-width: 100%; }
  section[id] { scroll-margin-top: 96px; }
  @media (max-width: 900px) {
    html { scroll-padding-top: 80px; }
    section[id] { scroll-margin-top: 80px; }
  }
  @media (prefers-reduced-motion: reduce) {
    html { scroll-behavior: auto; }
  }

  /* ───── Section sizing — full viewport per section, no snap ───── */
  /* Snap was removed because it fights JS anchor offset; min-height alone
     guarantees one-section-per-viewport when anchor-clicked.
     Content is top-aligned (justify-content: flex-start) so the section heading
     starts at a consistent vertical position across all sections, regardless of
     how much content sits below it. Hero + Stats are explicitly centered. */
  .vz-snap {
    min-height: 100vh;
    min-height: 100svh;
    display: flex;
    flex-direction: column;
    justify-content: flex-start;
  }
  /* Hero centered */
  .vz-hero.vz-snap {
    min-height: 100vh;
    min-height: 100svh;
    justify-content: center;
  }
  .vz-stats-snap { justify-content: center; }
  footer.vz-snap { min-height: auto; }

  /* Disable the full-viewport "one section per screen" snap on:
       • any portrait orientation (iPad Pro 1024×1366, Surface Pro 7
         912×1368, etc. — sections were designed for a typical desktop
         height ~800–1080px and look hollow on tall portrait screens)
       • any landscape viewport narrower than ~1280px (small laptops
         and tablets where forcing 100vh leaves big gaps)
     True wide desktops (≥1280px landscape) keep the dramatic snap.
     The Hero is excluded — it intentionally fills the viewport on
     every device because that's its visual identity. */
  @media (max-width: 1279px), (orientation: portrait) {
    .vz-snap:not(.vz-hero) { min-height: auto; }
  }

  /* ───── Scroll reveal ───── */
  /* Reveals only inline TEXT intros (eyebrow, heading, lead paragraph)
     inside each section — sections themselves stay static so big blocks
     don't pop in as one chunk. Stagger via inline --reveal-delay. */
  .vz-reveal {
    opacity: 0;
    transform: translateY(14px);
    transition: opacity 520ms cubic-bezier(.2,.7,.2,1),
                transform 520ms cubic-bezier(.2,.7,.2,1);
    transition-delay: var(--reveal-delay, 0ms);
    will-change: opacity, transform;
  }
  .vz-reveal.is-visible {
    opacity: 1;
    transform: translateY(0);
  }
  @media (prefers-reduced-motion: reduce) {
    .vz-reveal { opacity: 1; transform: none; transition: none; }
  }

  /* ───── Hero — animated background layer ───── */
  .vz-hero-fx {
    position: absolute; inset: 0;
    pointer-events: none;
    overflow: hidden;
  }
  /* Slow drifting glow blobs */
  .vz-hero-blob {
    position: absolute; border-radius: 50%;
    filter: blur(72px);
    opacity: 0.55;
    will-change: transform;
  }
  .vz-hero-blob.b1 {
    width: 520px; height: 520px;
    background: radial-gradient(circle, rgba(179,98,255,0.85) 0%, rgba(179,98,255,0) 70%);
    top: -160px; left: -120px;
    animation: vzDrift1 22s ease-in-out infinite alternate;
  }
  .vz-hero-blob.b2 {
    width: 620px; height: 620px;
    background: radial-gradient(circle, rgba(109,79,232,0.75) 0%, rgba(109,79,232,0) 70%);
    bottom: -200px; right: -160px;
    animation: vzDrift2 26s ease-in-out infinite alternate;
  }
  .vz-hero-blob.b3 {
    width: 380px; height: 380px;
    background: radial-gradient(circle, rgba(56,189,248,0.45) 0%, rgba(56,189,248,0) 70%);
    top: 30%; left: 40%;
    animation: vzDrift3 30s ease-in-out infinite alternate;
  }
  @keyframes vzDrift1 {
    0%   { transform: translate(0, 0) scale(1); }
    100% { transform: translate(180px, 80px) scale(1.15); }
  }
  @keyframes vzDrift2 {
    0%   { transform: translate(0, 0) scale(1); }
    100% { transform: translate(-160px, -100px) scale(1.1); }
  }
  @keyframes vzDrift3 {
    0%   { transform: translate(0, 0) scale(1); opacity: 0.4; }
    100% { transform: translate(-220px, 140px) scale(1.25); opacity: 0.7; }
  }

  /* Animated wave at bottom of hero */
  .vz-hero-wave path {
    animation: vzWaveShift 14s ease-in-out infinite alternate;
    transform-origin: center;
  }
  .vz-hero-wave path:nth-child(2) {
    animation-duration: 18s;
    animation-direction: alternate-reverse;
  }
  @keyframes vzWaveShift {
    0%   { transform: translateX(0); }
    100% { transform: translateX(-40px); }
  }

  /* Floating data nodes — abstract neural lines */
  .vz-hero-node {
    position: absolute;
    width: 6px; height: 6px;
    border-radius: 50%;
    background: rgba(255,255,255,0.85);
    box-shadow: 0 0 18px rgba(179,98,255,0.9), 0 0 4px rgba(255,255,255,0.6);
    will-change: transform, opacity;
  }
  .vz-hero-node.n1 { top: 22%; left: 12%; animation: vzFloat 9s ease-in-out infinite; }
  .vz-hero-node.n2 { top: 55%; left: 78%; animation: vzFloat 11s ease-in-out infinite reverse; }
  .vz-hero-node.n3 { top: 38%; left: 62%; animation: vzFloat 13s ease-in-out infinite; }
  .vz-hero-node.n4 { top: 72%; left: 22%; animation: vzFloat 10s ease-in-out infinite reverse; }
  .vz-hero-node.n5 { top: 18%; left: 88%; width: 4px; height: 4px; animation: vzFloat 12s ease-in-out infinite; }
  .vz-hero-node.n6 { top: 82%; left: 52%; width: 4px; height: 4px; animation: vzFloat 14s ease-in-out infinite reverse; }
  @keyframes vzFloat {
    0%, 100% { transform: translate(0, 0); opacity: 0.5; }
    50%      { transform: translate(20px, -28px); opacity: 1; }
  }

  /* Connecting lines — draw in/out */
  .vz-hero-line {
    stroke: rgba(255,255,255,0.18);
    stroke-width: 1;
    fill: none;
    stroke-dasharray: 4 6;
    animation: vzDash 18s linear infinite;
  }
  @keyframes vzDash {
    to { stroke-dashoffset: -200; }
  }

  @media (prefers-reduced-motion: reduce) {
    .vz-hero-blob, .vz-hero-node,
    .vz-hero-wave path, .vz-hero-line { animation: none !important; }
  }

  /* Section divider — subtle gradient line between two same-bg sections */
  .vz-divider {
    height: 1px;
    background: linear-gradient(90deg,
      transparent 0%,
      rgba(15, 10, 51, 0.06) 20%,
      rgba(109, 79, 232, 0.18) 50%,
      rgba(15, 10, 51, 0.06) 80%,
      transparent 100%);
    margin: 0;
  }
  #root h1, #root h2, #root h3, #root h4, #root h5, #root h6, #root p { margin: 0; }
  *, *::before, *::after { box-sizing: border-box; }
  img, svg { max-width: 100%; height: auto; }

  /* =========================================================
     RESPONSIVE BREAKPOINTS
     - mobile small:  ≤ 480px
     - mobile:        ≤ 640px
     - tablet:        ≤ 900px
     - desktop:       ≤ 1200px
     - large:         > 1200px
     ========================================================= */

  /* Container — fluid padding */
  .vz-container {
    max-width: 1240px;
    margin: 0 auto;
    padding: 0 32px;
  }
  @media (max-width: 900px) { .vz-container { padding: 0 24px; } }
  @media (max-width: 480px) { .vz-container { padding: 0 20px; } }

  /* Section vertical rhythm */
  .vz-section { padding: 128px 0; }
  @media (max-width: 1200px) { .vz-section { padding: 104px 0; } }
  @media (max-width: 900px)  { .vz-section { padding: 80px 0; } }
  @media (max-width: 640px)  { .vz-section { padding: 64px 0; } }
  /* Snap sections center their content; padding 0 so the section start
     equals the top of the viewport (no padding band visible above content). */
  .vz-snap.vz-section { padding: 96px 0; }
  @media (max-width: 1200px) { .vz-snap.vz-section { padding: 80px 0; } }
  @media (max-width: 900px)  { .vz-snap.vz-section { padding: 64px 0; } }

  /* Grid utilities — collapse on small screens.
     `minmax(0, 1fr)` (instead of plain `1fr`) lets columns shrink below
     their min-content width. Without it, a single long word or a child
     with a fixed width can push the column wider than the viewport and
     re-introduce horizontal scroll. */
  .vz-grid-3 { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 24px; }
  .vz-grid-4 { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 24px; }
  .vz-grid-5 { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); }
  .vz-grid-12 { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: 24px; }
  .vz-grid-2-asym { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr); gap: 96px; align-items: start; }
  .vz-grid-2-eq   { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 96px; align-items: start; }
  .vz-grid-footer { display: grid; grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1.2fr); gap: 48px; }

  @media (max-width: 1200px) {
    .vz-grid-2-asym { gap: 64px; }
    .vz-grid-2-eq   { gap: 64px; }
    .vz-grid-footer { gap: 40px; grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr); }
  }
  @media (max-width: 900px) {
    .vz-grid-3 { grid-template-columns: minmax(0, 1fr); gap: 16px; }
    .vz-grid-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
    .vz-grid-5 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .vz-grid-12 > * { grid-column: span 12 !important; }
    .vz-grid-2-asym { grid-template-columns: minmax(0, 1fr); gap: 48px; }
    .vz-grid-2-eq   { grid-template-columns: minmax(0, 1fr); gap: 48px; }
    .vz-grid-footer { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 40px; }
    /* Disable sticky sidebars on tablet/mobile */
    .vz-sticky-side { position: static !important; top: auto !important; }
    /* Drop arrow connectors between How-it-works steps */
    .vz-step-connector { display: none !important; }
    /* Stat band — drop left dividers when stacked */
    .vz-stat { border-left: none !important; padding: 0 !important; }
    .vz-stat + .vz-stat { border-top: 1px solid rgba(255,255,255,0.14); padding-top: 24px !important; margin-top: 24px; }
  }
  @media (max-width: 640px) {
    .vz-grid-4 { grid-template-columns: minmax(0, 1fr); }
    .vz-grid-5 { grid-template-columns: minmax(0, 1fr); }
    .vz-grid-footer { grid-template-columns: minmax(0, 1fr); gap: 32px; }
    /* Consortium strip — when stacked, draw top borders */
    .vz-consortium-cell { border-left: none !important; border-top: 1px solid var(--border); }
    .vz-consortium-cell:first-child { border-top: none; }
  }

  /* Fluid type — clamp() so headings shrink smoothly.
     Mins are tuned so the longest Slovak words (e.g.
     "Personalizovaný", "Modernizácia") fit at 320px wide
     without breaking mid-word. */
  .vz-fluid-h1   { font-size: clamp(28px, 7vw, 80px); }
  .vz-fluid-h2   { font-size: clamp(26px, 5vw, 56px); }
  .vz-fluid-h2-s { font-size: clamp(24px, 4.2vw, 48px); }
  .vz-fluid-h3   { font-size: clamp(18px, 2.4vw, 24px); }
  .vz-fluid-body { font-size: clamp(15px, 1.4vw, 19px); }
  .vz-fluid-stat-lg { font-size: clamp(40px, 6vw, 72px); }
  .vz-fluid-stat-sm { font-size: clamp(32px, 4.4vw, 48px); }

  /* Hero vertical rhythm — squish on mobile */
  .vz-hero { padding: 120px 0 144px; }
  @media (max-width: 1200px) { .vz-hero { padding: 104px 0 120px; } }
  @media (max-width: 900px)  { .vz-hero { padding: 88px 0 96px; } }
  @media (max-width: 640px)  { .vz-hero { padding: 72px 0 72px; } }

  /* Nav — height + drop secondary links on mobile.
     `min-width: 0` on the flex container allows children to shrink past
     their min-content width (otherwise a long brand label would push the
     row wider than the viewport). */
  .vz-nav-row { height: 80px; display: flex; align-items: center; gap: 32px; min-width: 0; }
  @media (max-width: 1100px) { .vz-nav-row { height: 64px; gap: 10px; } }

  .vz-nav-brand { min-width: 0; }
  /* On very tight phones (< 380px) hide the "VzdelAI" wordmark so the
     logo icon + CTA + hamburger all fit comfortably. The icon alone is
     enough brand recognition. */
  @media (max-width: 380px) {
    .vz-nav-brand-text { display: none; }
  }

  .vz-nav-links { display: flex; gap: 32px; margin-left: auto; }
  .vz-nav-links a { white-space: nowrap; }
  @media (max-width: 1280px) { .vz-nav-links { gap: 22px; } }
  @media (max-width: 1100px) { .vz-nav-links { display: none; } }

  /* CTA pill — visible on every screen size. Below 1100px push it next
     to the hamburger via margin-left: auto. Below 480px swap the long
     "Kontaktovať tím" label for the short "Kontakt" so it always fits. */
  .vz-nav-cta { padding: 12px 22px; white-space: nowrap; flex-shrink: 0; }
  @media (max-width: 1100px) {
    .vz-nav-cta { margin-left: auto; padding: 10px 16px; font-size: 13px !important; }
  }
  @media (max-width: 480px) {
    .vz-nav-cta { padding: 9px 14px; font-size: 12.5px !important; }
  }
  /* Responsive label swap — full text on desktop, short on narrow phones. */
  .vz-nav-cta-short { display: none; }
  @media (max-width: 480px) {
    .vz-nav-cta-full { display: none; }
    .vz-nav-cta-short { display: inline; }
  }

  /* Mobile menu trigger — only on small screens. Sits at the right edge
     after the CTA (no margin-left: auto needed because CTA already has it). */
  .vz-nav-menu-btn { display: none; flex-shrink: 0; }
  @media (max-width: 1100px) {
    .vz-nav-menu-btn { display: inline-grid; }
  }

  /* Hamburger drawer items — responsive font + padding so links stay
     comfortable to tap on every device, never disproportionately huge. */
  .vz-nav-drawer-link {
    font-size: 17px;
    padding: 14px 0;
    line-height: 1.3;
  }
  @media (max-width: 480px) {
    .vz-nav-drawer-link { font-size: 15.5px; padding: 12px 0; }
  }
  @media (max-width: 380px) {
    .vz-nav-drawer-link { font-size: 14.5px; padding: 11px 0; }
  }

  /* Contact form — pad less on small screens */
  .vz-form-card { padding: 40px; }
  @media (max-width: 640px) { .vz-form-card { padding: 24px; } }
  .vz-form-card input,
  .vz-form-card textarea {
    text-overflow: ellipsis;
  }
  .vz-form-card input::placeholder,
  .vz-form-card textarea::placeholder {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    opacity: 1;
    color: var(--vz-ink-40);
  }
  .vz-form-card textarea::placeholder { white-space: normal; }
  @media (max-width: 480px) {
    .vz-form-card input,
    .vz-form-card textarea {
      font-size: 15px !important;
    }
  }

  /* Validation states */
  .vz-form-card .vz-input.has-error {
    border-color: var(--vz-danger) !important;
    box-shadow: 0 0 0 3px rgba(211, 58, 75, 0.12);
  }
  .vz-form-card .vz-input.has-error:focus-visible {
    border-color: var(--vz-danger) !important;
    box-shadow: 0 0 0 3px rgba(211, 58, 75, 0.22);
  }
  .vz-form-error-msg {
    display: block;
    margin-top: 6px;
    font-size: 13px;
    line-height: 1.4;
    color: var(--vz-danger);
    font-weight: 500;
    animation: vz-form-fade-in 220ms ease-out;
  }

  /* Feedback panels (success / error) */
  .vz-form-feedback {
    padding: 16px 18px;
    border-radius: 12px;
    font-size: 14.5px;
    line-height: 1.55;
    border: 1px solid transparent;
    outline: none;
    animation: vz-form-fade-in 280ms ease-out;
  }
  .vz-form-feedback:focus-visible {
    outline: 2px solid var(--vz-violet);
    outline-offset: 3px;
  }
  .vz-form-feedback.is-success {
    background: rgba(31, 157, 110, 0.10);
    color: #0F6B49;
    border-color: rgba(31, 157, 110, 0.30);
  }
  .vz-form-feedback.is-error {
    background: rgba(211, 58, 75, 0.08);
    color: #9B2333;
    border-color: rgba(211, 58, 75, 0.28);
  }

  @keyframes vz-form-fade-in {
    from { opacity: 0; transform: translateY(-4px); }
    to   { opacity: 1; transform: translateY(0); }
  }

  /* Card padding */
  .vz-card-pad { padding: 32px; }
  @media (max-width: 640px) { .vz-card-pad { padding: 24px; } }

  /* === Activities list — minimal lined rows with hover === */
  .vz-activity-row:hover {
    background-color: var(--vz-mist);
  }
  .vz-activity-row:hover .vz-activity-code { color: var(--vz-violet-700); }
  .vz-activity-row:hover .vz-activity-owner {
    background-color: #fff;
    border-color: var(--vz-violet-200, #DCD0FF) !important;
    color: var(--vz-violet-700) !important;
  }
  @media (max-width: 900px) {
    .vz-activity-row {
      grid-template-columns: auto 1fr !important;
      grid-template-rows: auto auto !important;
      gap: 10px 16px !important;
      padding: 18px 8px !important;
    }
    .vz-activity-row .vz-activity-title {
      grid-column: 1 / -1;
      font-size: 17px !important;
    }
    .vz-activity-row .vz-activity-owner {
      grid-column: 2 / -1; justify-self: end;
    }
  }
  @media (max-width: 560px) {
    /* Na úzkych obrazovkách už titulok zalamuje na 2-3 riadky, takže
       owner pill umiestnime na vlastný riadok a span-neme ho cez oba
       stĺpce (1 / -1). Bez tohto by pill ostal v 2. stĺpci a vizuálne
       odsadený o šírku kódu — vyzeralo by to "vystrelené" doprava. */
    .vz-activity-row .vz-activity-owner {
      grid-column: 1 / -1;
      justify-self: start;
    }
  }

  /* === Footer — clean, integrated funding === */
  .vz-footer-top {
    display: grid;
    grid-template-columns: minmax(280px, 1fr) minmax(0, 2fr);
    gap: 72px;
    align-items: start;
  }
  .vz-footer-funding { min-width: 0; }
  .vz-funding-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 28px;
    align-items: start;
  }
  .vz-funding-item {
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 14px;
    align-items: center;
  }
  .vz-funding-media {
    width: 100%;
    aspect-ratio: 16 / 9;
    background: #fff;
    border-radius: 12px;
    padding: 14px 20px;
    display: grid; place-items: center;
    overflow: hidden;
    box-shadow: 0 6px 18px -10px rgba(0,0,0,0.45);
    transition: transform 240ms ease, box-shadow 240ms ease;
  }
  .vz-funding-item:hover .vz-funding-media {
    transform: translateY(-2px);
    box-shadow: 0 10px 24px -10px rgba(0,0,0,0.55);
  }
  .vz-funding-media > img {
    max-width: 100%;
    max-height: 100%;
    width: auto; height: auto;
    object-fit: contain;
    display: block;
  }
  .vz-funding-caption {
    font-size: 12px;
    line-height: 1.45;
    color: rgba(255,255,255,0.62);
    letter-spacing: 0.01em;
    text-wrap: pretty;
    text-align: center;
  }
  .vz-footer-legal {
    padding-bottom: 32px;
    font-size: 12.5px;
    line-height: 1.55;
    color: rgba(255,255,255,0.52);
    text-align: center;
    max-width: 1200px;
    margin: 0 auto;
    text-wrap: balance;
  }
  @media (max-width: 1100px) {
    .vz-footer-top {
      grid-template-columns: 1fr;
      gap: 48px;
    }
    .vz-funding-media { aspect-ratio: 16 / 9; }
  }
  @media (max-width: 720px) {
    .vz-funding-grid {
      grid-template-columns: 1fr 1fr;
      gap: 20px;
    }
    .vz-funding-item:last-child { grid-column: 1 / -1; max-width: 50%; }
  }
  @media (max-width: 480px) {
    .vz-funding-grid {
      grid-template-columns: 1fr;
      gap: 24px;
    }
    .vz-funding-item:last-child { max-width: 100%; }
    .vz-funding-media { aspect-ratio: 2 / 1; }
  }

  /* === Outputs section — cards with hover, responsive collapse === */
  .vz-output-card {
    transition: transform 240ms ease, box-shadow 240ms ease, border-color 240ms ease;
  }
  .vz-output-card:hover {
    transform: translateY(-2px);
    border-color: var(--vz-violet-200, #DCD0FF) !important;
    box-shadow: 0 12px 28px -16px rgba(96, 64, 224, 0.22);
  }
  .vz-output-card.is-feature { padding-left: 36px; }
  @media (max-width: 640px) {
    .vz-output-card.is-feature { padding-left: 28px; }
  }
  @media (max-width: 1100px) {
    .vz-outputs-grid > * { grid-column: span 6 !important; }
  }
  @media (max-width: 720px) {
    .vz-outputs-grid > * { grid-column: span 12 !important; }
    .vz-output-card h3 { font-size: 20px !important; }
  }

  /* === Consortium section — lead card + 2x2 partner grid === */
  /* Media: fixed aspect ratio so swapping placeholder for <img> keeps layout */
  .vz-partner-media {
    position: relative;
    width: 100%;
    aspect-ratio: 3 / 2;
    background: #fff;
    border: 1px solid var(--border);
    border-radius: 12px;
    overflow: hidden;
    flex: 0 0 auto;
    display: block;
    text-decoration: none;
    cursor: pointer;
    transition: transform 240ms ease, box-shadow 240ms ease, border-color 240ms ease;
  }
  .vz-partner-media:hover {
    transform: translateY(-1px);
    box-shadow: 0 10px 24px -14px rgba(96, 64, 224, 0.30);
  }
  .vz-partner-media:focus-visible {
    outline: 2px solid var(--vz-violet);
    outline-offset: 3px;
  }
  .vz-partner-media > img {
    position: absolute;
    inset: 10px 14px;
    width: calc(100% - 28px);
    height: calc(100% - 20px);
    object-fit: contain;
    object-position: center;
    display: block;
  }
  .vz-partner-lead .vz-partner-media > img {
    inset: 4px 8px;
    width: calc(100% - 16px);
    height: calc(100% - 8px);
  }
  .vz-partner-media.is-fill > img {
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
  }
  .vz-partner-media-overlay {
    position: absolute; top: 8px; right: 8px;
    width: 26px; height: 26px;
    display: grid; place-items: center;
    background: rgba(255,255,255,0.92);
    border: 1px solid var(--vz-violet-200, #DCD0FF);
    color: var(--vz-violet);
    border-radius: 999px;
    opacity: 0;
    transform: translateY(-2px);
    transition: opacity 200ms ease, transform 200ms ease;
    pointer-events: none;
  }
  .vz-partner-media:hover .vz-partner-media-overlay,
  .vz-partner-media:focus-visible .vz-partner-media-overlay {
    opacity: 1;
    transform: translateY(0);
  }
  .vz-partner-placeholder {
    position: absolute; inset: 0;
    display: grid; place-items: center;
    color: var(--vz-violet);
    background:
      radial-gradient(circle at 30% 20%, rgba(96,64,224,0.10), transparent 60%),
      radial-gradient(circle at 80% 90%, rgba(96,64,224,0.08), transparent 55%),
      var(--vz-mist);
  }
  .vz-partner-grid-bg {
    position: absolute; inset: 0;
    width: 100%; height: 100%;
    color: rgba(96, 64, 224, 0.18);
    pointer-events: none;
  }
  .vz-partner-initials {
    position: relative; z-index: 1;
    font-family: var(--font-display);
    font-weight: 700;
    font-size: clamp(22px, 3vw, 32px);
    letter-spacing: -0.03em;
    color: var(--vz-violet);
    background: rgba(255,255,255,0.85);
    padding: 10px 18px;
    border-radius: 999px;
    border: 1px solid var(--vz-violet-200, #DCD0FF);
    backdrop-filter: blur(2px);
    -webkit-backdrop-filter: blur(2px);
  }

  .vz-partner-role {
    display: inline-flex; align-items: center; gap: 8px;
    font-size: 11px; letter-spacing: 0.2em; text-transform: uppercase;
    color: var(--vz-ink-50, var(--vz-ink-60));
    font-weight: 600;
  }
  .vz-partner-dot {
    width: 6px; height: 6px; border-radius: 50%;
    background: var(--vz-violet); flex: 0 0 auto;
  }
  .vz-partner-name {
    font-family: var(--font-display);
    font-weight: 800;
    font-size: clamp(24px, 2.6vw, 32px);
    line-height: 1.1; letter-spacing: -0.02em;
    color: var(--vz-ink);
    margin: 14px 0 6px;
  }
  .vz-partner-name-sm {
    font-size: 22px;
    margin: 12px 0 4px;
  }
  .vz-partner-fullname {
    font-size: 14px; line-height: 1.5;
    color: var(--vz-ink-70, var(--vz-ink-60));
    margin-bottom: 10px;
  }
  .vz-partner-desc {
    font-size: 14.5px; line-height: 1.6;
    color: var(--vz-ink-60);
    margin: 0;
    white-space: pre-line; /* zachová \n zlomy v desc texte */
  }

  /* Lead partner — compact hero card, no left accent */
  .vz-partner-lead {
    display: grid;
    grid-template-columns: minmax(0, 200px) 1fr;
    gap: 28px;
    align-items: center;
    padding: 24px;
    background: linear-gradient(135deg, #fff 0%, var(--vz-mist) 100%);
    border: 1px solid var(--vz-violet-200, #DCD0FF);
    border-radius: 18px;
    margin-bottom: 24px;
    position: relative;
    transition: transform 240ms ease, box-shadow 240ms ease, border-color 240ms ease;
  }
  .vz-partner-lead:hover {
    transform: translateY(-2px);
    box-shadow: 0 18px 40px -22px rgba(96, 64, 224, 0.28);
  }
  .vz-partner-lead-body {
    min-width: 0;
  }

  /* Industry partners — 2×2 */
  .vz-partner-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 20px;
  }
  .vz-partner-card {
    display: flex;
    flex-direction: column;
    padding: 28px 24px;
    background: #fff;
    border: 1px solid var(--border);
    border-radius: 16px;
    text-align: center;
    align-items: center;
    transition: transform 240ms ease, box-shadow 240ms ease, border-color 240ms ease;
  }
  .vz-partner-card .vz-partner-media {
    max-width: 200px;
  }
  .vz-partner-card:hover {
    transform: translateY(-2px);
    border-color: var(--vz-violet-200, #DCD0FF);
    box-shadow: 0 14px 32px -20px rgba(96, 64, 224, 0.22);
  }
  .vz-partner-card-body {
    padding-top: 18px;
    width: 100%;
  }
  .vz-partner-card .vz-partner-role {
    justify-content: center;
  }

  /* Tablet */
  @media (max-width: 900px) {
    .vz-partner-lead {
      grid-template-columns: 1fr;
      gap: 20px;
      padding: 20px;
      text-align: center;
      justify-items: center;
    }
    .vz-partner-lead .vz-partner-media {
      max-width: 280px;
    }
    .vz-partner-lead .vz-partner-role {
      justify-content: center;
    }
  }
  /* Mobile */
  @media (max-width: 640px) {
    .vz-partner-grid {
      grid-template-columns: 1fr;
      gap: 16px;
    }
    .vz-partner-card { padding: 20px; }
    .vz-partner-name { font-size: 22px; }
    .vz-partner-name-sm { font-size: 20px; }
  }

  /* === Stats section — animated dark backdrop + cards === */
  .vz-stats-bg {
    position: absolute; inset: 0; pointer-events: none;
    overflow: hidden;
  }
  .vz-stats-grid-overlay {
    position: absolute; inset: 0;
    background-image:
      radial-gradient(circle, rgba(255,255,255,0.06) 1px, transparent 1.2px);
    background-size: 32px 32px;
    mask-image: radial-gradient(ellipse 70% 60% at 50% 40%, #000 30%, transparent 100%);
    -webkit-mask-image: radial-gradient(ellipse 70% 60% at 50% 40%, #000 30%, transparent 100%);
    opacity: 0.7;
  }
  .vz-stats-blob {
    position: absolute; border-radius: 50%;
    filter: blur(8px);
    will-change: transform;
  }
  .vz-stats-blob-1 {
    top: -20%; right: -8%;
    width: 560px; height: 560px;
    background: radial-gradient(circle, rgba(179,98,255,0.20) 0%, transparent 65%);
    animation: vzStatsDrift1 22s ease-in-out infinite;
  }
  .vz-stats-blob-2 {
    bottom: -25%; left: -10%;
    width: 480px; height: 480px;
    background: radial-gradient(circle, rgba(94,160,255,0.16) 0%, transparent 65%);
    animation: vzStatsDrift2 28s ease-in-out infinite;
  }
  .vz-stats-blob-3 {
    top: 38%; left: 42%;
    width: 320px; height: 320px;
    background: radial-gradient(circle, rgba(124,78,255,0.12) 0%, transparent 70%);
    animation: vzStatsDrift3 18s ease-in-out infinite;
  }
  @keyframes vzStatsDrift1 {
    0%,100% { transform: translate(0,0) scale(1); }
    50%     { transform: translate(-40px, 30px) scale(1.06); }
  }
  @keyframes vzStatsDrift2 {
    0%,100% { transform: translate(0,0) scale(1); }
    50%     { transform: translate(50px, -30px) scale(1.08); }
  }
  @keyframes vzStatsDrift3 {
    0%,100% { transform: translate(0,0) scale(1); opacity: 0.55; }
    50%     { transform: translate(30px, -20px) scale(1.12); opacity: 0.75; }
  }
  @media (prefers-reduced-motion: reduce) {
    .vz-stats-blob { animation: none !important; }
  }
  .vz-stats-grid {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 16px;
  }
  @media (max-width: 1100px) {
    .vz-stats-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
  }
  @media (max-width: 560px) {
    .vz-stats-grid { grid-template-columns: 1fr; gap: 14px; }
  }
  .vz-stat-card {
    position: relative;
    padding: 32px 28px 28px;
    border-radius: 18px;
    background: linear-gradient(180deg, rgba(255,255,255,0.04) 0%, rgba(255,255,255,0.015) 100%);
    border: 1px solid rgba(255,255,255,0.10);
    backdrop-filter: blur(2px);
    -webkit-backdrop-filter: blur(2px);
    transition: transform 360ms cubic-bezier(0.16,1,0.3,1), border-color 280ms ease, background 280ms ease;
    overflow: hidden;
  }
  .vz-stat-card:hover {
    transform: translateY(-4px);
    border-color: rgba(179,98,255,0.32);
    background: linear-gradient(180deg, rgba(255,255,255,0.06) 0%, rgba(124,78,255,0.04) 100%);
  }
  .vz-stat-card-glow {
    position: absolute; inset: -1px; border-radius: 18px; pointer-events: none;
    background: radial-gradient(circle at 30% 0%, rgba(179,98,255,0.18) 0%, transparent 55%);
    opacity: 0; transition: opacity 320ms ease;
  }
  .vz-stat-card:hover .vz-stat-card-glow { opacity: 1; }
  .vz-stat-card-idx {
    position: absolute; top: 18px; right: 22px;
    font-family: var(--font-mono);
    font-size: 11px; letter-spacing: 0.22em;
    color: rgba(255,255,255,0.55);
    font-weight: 600;
  }
  .vz-stat-card-num {
    font-family: var(--font-display); font-weight: 800;
    line-height: 1; letter-spacing: -0.03em;
    white-space: nowrap;
    background: var(--grad-ai);
    -webkit-background-clip: text; background-clip: text;
    -webkit-text-fill-color: transparent; color: transparent;
    margin-bottom: 18px;
    /* One size for all stat numbers; tuned so the longest ("8,98M €") fits in a 4-col card at 1100px */
    font-size: clamp(40px, 4.6vw, 56px);
  }
  .vz-stat-card-label {
    font-family: var(--font-mono);
    font-size: 12px; letter-spacing: 0.22em; text-transform: uppercase;
    color: rgba(255,255,255,0.78); margin-bottom: 10px; font-weight: 500;
  }
  .vz-stat-card-sub {
    font-size: 13px; line-height: 1.5;
    color: rgba(255,255,255,0.50);
  }
  @media (max-width: 560px) {
    .vz-stat-card { padding: 26px 22px 22px; }
  }

  /* Roadmap (How it works) — static rail, subtle motion.
     Animate ONLY opacity, never translateY. The 4 steps share a
     stagger delay (0/120/240/360ms) so during the first ~360ms a
     vertical translate would catch each bubble at a different Y
     and the row looks like a staircase. Opacity-only stagger keeps
     the bubbles rock-solid on the rail at every animation frame. */
  @keyframes vzRoadmapStepIn {
    from { opacity: 0; }
    to { opacity: 1; }
  }
  @keyframes vzRoadmapShimmer {
    0%   { transform: translateX(-100%); }
    100% { transform: translateX(350%); }
  }
  .vz-roadmap-shimmer {
    animation: vzRoadmapShimmer 4.5s cubic-bezier(0.4, 0, 0.6, 1) infinite;
  }
  /* Force every step to anchor at the top of its grid cell. Without
     this, depending on each step's content height (e.g. step 01 has
     a 2-line title "Analýza materiálov" while 03 has a 1-line title)
     the grid's default `align-items: stretch` can cause sub-pixel
     misalignment of the bubbles across browsers. */
  .vz-roadmap-row { align-items: start; }
  .vz-roadmap-step { align-self: start; }
  .vz-roadmap-bubble { flex-shrink: 0; }
  /* Hover lift uses `scale` only — no translateY — so the bubble's
     layout position (and thus the dashed track underneath) stays
     locked even mid-transition when the user moves the mouse off. */
  .vz-roadmap-step:hover .vz-roadmap-bubble {
    transform: scale(1.06);
    box-shadow: 0 12px 28px rgba(124, 78, 255, 0.22);
  }
  @media (prefers-reduced-motion: reduce) {
    .vz-roadmap-shimmer { animation: none; }
    .vz-roadmap-step { animation: none !important; }
  }
  @media (max-width: 900px) {
    .vz-roadmap-row { grid-template-columns: 1fr !important; gap: 40px !important; }
    .vz-roadmap-track { display: none !important; }
  }

  /* Audience intro grid — heading + supporting copy */
  @media (max-width: 900px) {
    .vz-intro-grid { grid-template-columns: 1fr !important; gap: 32px !important; }
    .vz-intro-meta { grid-template-columns: 1fr !important; gap: 20px !important; }
  }
  @media (max-width: 640px) {
    .vz-intro-meta { grid-template-columns: 1fr !important; }
  }

  /* =========================================================
     SAFETY NET — long URLs / inline code / unbroken strings
     can't push a column wider than the viewport. Uses the
     gentle `break-word` (only breaks if no other break point
     fits) instead of `anywhere` so normal Slovak words like
     "Personalizovaný" never get split mid-word.
     Headings rely on text-wrap: balance + reduced clamp mins
     instead — they should never be broken inside a word.
     ========================================================= */
  p, li,
  .vz-prose, .vz-fluid-body,
  .vz-partner-desc, .vz-partner-fullname, .vz-funding-caption,
  .vz-stat-card-sub, .vz-stat-card-label,
  .vz-form-feedback, .vz-form-error-msg {
    overflow-wrap: break-word;
  }

  /* =========================================================
     MICRO-BREAKPOINT — very small phones (≤ 380px)
     iPhone SE / Galaxy A series / older Androids. Tightens
     padding so cards keep usable inner width.
     ========================================================= */
  @media (max-width: 380px) {
    .vz-container { padding: 0 16px; }
    .vz-section { padding: 56px 0; }
    .vz-snap.vz-section { padding: 56px 0; }
    .vz-card-pad { padding: 20px; }
    .vz-form-card { padding: 20px; }
    .vz-partner-card { padding: 18px; }
    .vz-partner-lead { padding: 18px; }
    .vz-hero { padding: 64px 0 64px; }
    /* Buttons / CTA — wrap on their own row instead of overflowing */
    .vz-hero a[href^="#"] { width: 100%; text-align: center; }
    /* Stat numbers — keep inside the card */
    .vz-stat-card { padding: 22px 18px 18px; }
    .vz-stat-card-num { font-size: 40px; }
  }

  /* =========================================================
     ULTRA-WIDE — large desktop monitors, TVs, 4K
     Gentle scaling: wider container + a touch more rhythm.
     Type already scales via clamp(), so we don't override that.
     ========================================================= */
  @media (min-width: 1700px) {
    .vz-container { max-width: 1440px; padding: 0 48px; }
    .vz-section { padding: 160px 0; }
    .vz-snap.vz-section { padding: 120px 0; }
  }
  @media (min-width: 2400px) {
    .vz-container { max-width: 1600px; padding: 0 64px; }
    .vz-section { padding: 192px 0; }
    .vz-snap.vz-section { padding: 144px 0; }
  }
