      /* ============================================================
         MAŠINA — nf design tokens (canonical)
         File: generatemasina/assets/css/tokens.css
         Namespace: --nf-  (single dash, networkfailure)

         Source of truth for the design system. theme.json declares
         editor presets that resolve to these tokens via var().
         Enqueue early (functions.php) and load into the editor with
         add_editor_style().

         Palette: v4 "Boje 2" (2026-07-02) — 12 colors, light + dark.
         Simplified from 21. Merged tokens are kept as :root aliases
         so var() references resolve without migration.

         ------------------------------------------------------------
         TABLE OF CONTENTS
           1  @layer order
           2  TOKENS                         @layer nf.tokens
              2.1  Color — light  (:root)
              2.2  Color — dark   (html.dark-mode)
              2.3  Typography — families & weights
              2.4  Typography — fluid scale
              2.5  Spacing
              2.6  Border width
              2.7  Layout / grid
              2.8  Radius
              2.9  Shadows
           3  BASE ELEMENTS                  unlayered — must beat GP/core
              3.1  Misc
           4  COMPONENTS                     unlayered
              4.1  Theme toggle
              4.2  Site logo
              4.3  Header shell
              4.4  Primary nav + utils
              4.5  Header dropdown (D3.3)
              4.6  Footer (D4) — GP Footer Block Element
              4.7  SINGLE POST — Vesti (D5)
              4.8  LIST MODULE — Najnovije (D5, sidebar column)
              4.9  LIST MODULE — Srodni članci (related, main column)
              4.10  SHARE PANEL — single post ([masina_share])
              4.11  Stav — author box (component)
              4.12  Stav — sidebar placement (author box + Najnovije)
              4.13  Video single — hero embed
              4.14  Video — play overlay on thumbnails
              4.15  Blog uživo — live single
              4.16  Cards — category / tag / author archives + search
              4.17  Author archive — profile block
              4.18  Search results
              4.18b Search No Results
              4.29  Alignwide / alignfull containment — single article body


           5  DARK MODE — component overrides  unlayered
           6  LINKS & content anchors          unlayered
         ------------------------------------------------------------

         CASCADE NOTE (why base/components are NOT layered):
         Layered styles always lose to unlayered ones, regardless of
         specificity. WordPress global-styles-inline-css and GP are
         unlayered. Only the token DECLARATIONS live in @layer nf.tokens
         (nothing competes on --nf-* names). Base/component rules stay
         unlayered so their :root-prefix specificity fixes still beat
         core. Full-file layer refactor is a separate gated pass.
         ============================================================ */

      /* ============================================================
         1  @layer ORDER
         Reserved now; only nf.tokens is populated (Option 1).
      ============================================================ */
      @layer nf.tokens, nf.base, nf.components, nf.overrides;

      /* ============================================================
         2  TOKENS  —  @layer nf.tokens
      ============================================================ */
      @layer nf.tokens {
          /* ----------------------------------------------------------
           2.1  COLOR — light (:root). Flips in dark via html.dark-mode.
        ---------------------------------------------------------- */
          :root {
              /* Surface */
              --nf-surface-page: #fefdfa; /* page background */
              --nf-surface-warm: #f0ebe1; /* warm sections, footer, inline CTA */
              /* Merged in v4 — kept as aliases (pure-white removed; inputs → page/warm) */
              --nf-surface-pure-white: var(--nf-surface-page);
              --nf-surface-input: var(--nf-surface-page);
              --nf-surface-input-warm: var(--nf-surface-warm);
              --nf-surface-placeholder: #c2c2c2; /* input placeholder text; non-flipping (designer) */

              /* Text */
              --nf-color-text-heading: #2d2a2a; /* headings AND excerpts/descriptions */
              --nf-color-text-quote: #868686; /* quotes, author names, meta */
              --nf-color-text-on-color: #fefdfa; /* text/icons on brand/accent fills — DOES NOT flip */

              /* Merged in v4 — aliases resolve at use-time, flip with targets */
              --nf-color-text-secondary: var(--nf-color-text-heading);
              --nf-color-text-caption: var(--nf-color-text-heading);
              --nf-color-text-inverse: var(
                  --nf-color-text-quote
              ); /* deprecated; coltitle now uses quote directly */
              --nf-color-text-primary: var(--nf-color-text-heading);
              --nf-color-text-muted: var(--nf-color-text-quote);

              /* Border — v4 collapses to one color; default darkens to match medium */
              --nf-border-default: #c2c2c2;
              --nf-border-medium: var(--nf-border-default);

              /* Brand */
              --nf-color-brand-primary: #f94538;
              --nf-color-brand-blue-soft: #4491b7;
              --nf-color-brand-blue-deep: #2426b4;
              --nf-color-brand-blue-accent: var(
                  --nf-color-brand-blue-deep
              ); /* merged; alias only */

              /* Accent — error / alert / notice */
              --nf-accent-red-soft: #fef2f2;
              --nf-accent-red-border: #ffe2e2;
              --nf-accent-red-strong: #c10007;

              /* UI */
              --nf-ui-control: var(--nf-color-text-quote); /* merged; alias only */
          }

          /* ----------------------------------------------------------
           2.2  COLOR — dark (html.dark-mode, nf class switch).
           Only tokens that DIFFER from :root are redeclared.
           Non-flipping tokens (text-on-color) are intentionally absent.
           Blues do NOT flip in dark (designer, 2026-08); light values carry over.
           blue-deep is fill-only in dark — as text on surface-page it is 1.7:1.
        ---------------------------------------------------------- */
          html.dark-mode {
              --nf-surface-page: #1a1a1a;
              --nf-surface-warm: #2e2e2e;

              --nf-color-text-heading: #f0ebe1; /* secondary/caption/primary aliases inherit */
              --nf-color-text-quote: #d5d2d2; /* inverse/muted aliases inherit */

              --nf-border-default: #727272; /* medium alias inherits */

              --nf-color-brand-primary: #fa5c51;

              --nf-accent-red-strong: #f94538;
              --nf-accent-red-soft: #f0ebe1;
              --nf-accent-red-border: #c2c2c2;
          }

          /* ----------------------------------------------------------
           2.3  TYPOGRAPHY — families & weights
           Families self-hosted by GP Local Font Library; the fallback
           chain (source of truth) lives here, not in GP.
        ---------------------------------------------------------- */
          :root {
              --nf-font-display: "Zilla Slab", "Zilla Fallback", Georgia, serif;
              --nf-font-ui: "Rethink Sans", "Rethink Fallback", system-ui, -apple-system, sans-serif;

              --nf-fw-regular: 400;
              --nf-fw-medium: 500;
              --nf-fw-semibold: 600;
              --nf-fw-bold: 700;
          }

          /* ============================================================
              §2.4  FLUID TYPE SCALE — GENERATED from masina_sizes.csv
              Do NOT hand-edit the clamps. Edit the CSV, run
              `python3 fluid_type.py masina_sizes.csv`, paste the output
              over this block wholesale (see tools/design-tokens/README).
              Anchors 375→1134px, root 16px. Flat rows (min==max) emit a
              fixed rem. Everything below this comment is regenerable;
              §2.41 header geometry is NOT — keep it out of the paste span.
              ============================================================ */
              :root {
              --nf-fs-display: clamp(2.5rem, 1.5119rem + 4.2161vw, 4.5rem);
              --nf-lh-display: 1.05;
              --nf-track-display: -0.025em;
              --nf-fs-h1-live: clamp(2.125rem, 1.5692rem + 2.3715vw, 3.25rem);
              --nf-lh-h1-live: 1.1;
              --nf-track-h1-live: -0.025em;
              --nf-fs-h1-article: clamp(1.75rem, 1.4721rem + 1.1858vw, 2.3125rem);
              --nf-lh-h1-article: 1.1892;
              --nf-track-h1-article: -0.0135em;
              --nf-fs-h2: clamp(1.625rem, 1.4397rem + 0.7905vw, 2rem);
              --nf-lh-h2: 1.2;
              --nf-track-h2: 0em;
              --nf-fs-stav-title: clamp(1.5625rem, 1.4081rem + 0.6588vw, 1.875rem);
              --nf-lh-stav-title: 1.2;
              --nf-track-stav-title: 0em;
              --nf-fs-h3: clamp(1.3125rem, 1.2199rem + 0.3953vw, 1.5rem);
              --nf-lh-h3: 1.3333;
              --nf-track-h3: 0em;
              --nf-fs-alt-card-title: clamp(1rem, 0.9074rem + 0.3953vw, 1.1875rem);
              --nf-lh-alt-card-title: 1.35;
              --nf-track-alt-card-title: 0em;
              --nf-fs-article-h2: clamp(1.0625rem, 1.0316rem + 0.1318vw, 1.125rem);
              --nf-lh-article-h2: 1.4444;
              --nf-track-article-h2: 0em;
              --nf-fs-h4: 1.0625rem;
              --nf-lh-h4: 1.3889;
              --nf-track-h4: 0em;
              --nf-fs-body-large: clamp(1.1875rem, 1.1257rem + 0.2635vw, 1.3125rem);
              --nf-lh-body-large: 1.409;
              --nf-track-body-large: 0em;
              --nf-fs-footer-link: clamp(1rem, 0.9691rem + 0.1318vw, 1.0625rem);
              --nf-lh-footer-link: 1.3235;
              --nf-track-footer-link: 0em;
              --nf-fs-footer-social: clamp(1rem, 0.9691rem + 0.1318vw, 1.0625rem);
              --nf-lh-footer-social: 1.5;
              --nf-track-footer-social: 0em;
              --nf-fs-body-base: clamp(0.875rem, 0.7824rem + 0.3953vw, 1.0625rem);
              --nf-lh-body-base: 1.4118;
              --nf-track-body-base: -0.01em;
              --nf-fs-caption: 0.875rem;
              --nf-lh-caption: 1.4286;
              --nf-track-caption: 0em;
              --nf-fs-quote: clamp(1.125rem, 1.0632rem + 0.2635vw, 1.25rem);
              --nf-lh-quote: 1.2;
              --nf-track-quote: 0em;
              --nf-fs-dropdown-link: clamp(1.125rem, 1.0632rem + 0.2635vw, 1.25rem);
              --nf-lh-dropdown-link: 1.4;
              --nf-track-dropdown-link: 0em;
              --nf-fs-section-name: clamp(1.125rem, 1.0632rem + 0.2635vw, 1.25rem);
              --nf-lh-section-name: 1.4;
              --nf-track-section-name: 0em;
              --nf-fs-nav: clamp(1.0625rem, 1.0316rem + 0.1318vw, 1.125rem);
              --nf-lh-nav: 1.3333;
              --nf-track-nav: 0em;
              --nf-fs-author: 1rem;
              --nf-lh-author: 1.27;
              --nf-track-author: 0em;
              --nf-fs-button: 1rem;
              --nf-lh-button: 1.0063;
              --nf-track-button: 0.0156em;
              --nf-fs-dates: 0.875rem;
              --nf-lh-dates: 1.3;
              --nf-track-dates: 0em;
              --nf-fs-label-base: 0.75rem;
              --nf-lh-label-base: 1.3333;
              --nf-track-label-base: 0.02em;
              --nf-fs-label-category: clamp(0.6875rem, 0.6566rem + 0.1318vw, 0.75rem);
              --nf-lh-label-category: normal;
              --nf-track-label-category: 0.02em;
              --nf-fs-tags: clamp(1rem, 0.9382rem + 0.2635vw, 1.125rem);
              --nf-lh-tags: 1.4444;
              --nf-track-tags: 0em;
              --nf-fs-excerpt: clamp(1.0625rem, 1.0007rem + 0.2635vw, 1.1875rem);
              --nf-lh-excerpt: 1.4118;
              --nf-track-excerpt: -0.01em;
              --nf-fs-card-title: 1.125rem;
              --nf-lh-card-title: 1.35;
              --nf-track-card-title: 0em;
              --nf-fs-card-title-sm: 1rem;
              --nf-lh-card-title-sm: 1.35;
              --nf-track-card-title-sm: -0.02em;
              --nf-fs-card-author: 0.75rem;
              --nf-lh-card-author: 1.375;
              --nf-track-card-author: 0.023em;
              --nf-fs-h1-article-large: clamp(1.75rem, 1.3794rem + 1.581vw, 2.5rem);
              --nf-lh-h1-article-large: 1.25;
              --nf-track-h1-article-large: -0.0135em;
              --nf-fs-lead: clamp(1.1875rem, 1.0022rem + 0.7905vw, 1.5625rem);
              --nf-lh-lead: 1.44;
              --nf-track-lead: 0em;
              --nf-fs-cta-title: clamp(1.25rem, 1.0647rem + 0.7905vw, 1.625rem);
              --nf-lh-cta-title: 1.26;
              --nf-track-cta-title: -0.01em;
              --nf-fs-cta-text: clamp(1.0625rem, 0.9699rem + 0.3953vw, 1.25rem);
              --nf-lh-cta-text: 1.4;
              --nf-track-cta-text: 0em;

              /* ============================================================
              §2.41 HEADER GEOMETRY — NOT generated; hand-maintained.
              Kept out of §2.4's paste span so a scale regen never touches
              it. Figma "Header - FINALE": 162/118/140 nominal; rendered
              totals 164/120/142 incl. the two 1px band borders. Derived
              tokens recompute from the two base values, so a breakpoint
              override only restates top-h / bottom-h. Consumed by §4.3
              (band heights, sticky dock offset) and the overlay clamp.
               ============================================================ */
              --nf-header-top-h: 108px;
              --nf-header-bottom-h: 54px;
              --nf-header-logo-w: 218px;
              --nf-header-h: calc(
                      var(--nf-header-top-h) + var(--nf-header-bottom-h) + 2px
                  );
              --nf-header-dock: calc(
                      var(--nf-header-top-h) + 1px
                  ); /* two-tier sticky: how far the shell rides up */
              --nf-overlay-offset: calc(
                      var(--nf-header-h) + var(--wp-admin--admin-bar--height, 0px)
                  ); /* dropdown max-height offset (see §4.5) — conservative: budgets
                        the FULL header, though once scrolled only the docked band is
                        above the panel. Panels clamp ~109px short when scrolled; safe,
                        not optimal. Revisit if short-viewport scrolled panels feel
                        cramped. */

              /* ============================================================
              §2.42 TEMPORARY TOKEN OVERRIDES — hand-maintained, outside
              §2.4's paste span. Each entry restates a GENERATED token and
              must be deleted once masina_sizes.csv carries the value.
              Same :root as §2.4, later declaration → wins.
              ============================================================ */
              /* TODO post-launch: set the `dates` row in masina_sizes.csv to
                 12/12, regenerate, delete this line. Designer ruling
                 2026-08-22: dates are a flat 12px at every breakpoint.
                 Generated value is 0.875rem (14px). */
              --nf-fs-dates: 0.75rem;
              }

          /* ============================================================
              §2.41b HEADER GEOMETRY — responsive. Hand-maintained, outside
              §2.4's paste span. Tablet from the Figma "Header - FINALE"
              doc; mobile measured off the frame screenshot 2026-08-22 —
              the doc's 100/40 is a misread, the frame is 54/43 (~99px
              total). Designer-confirmed 2026-08-22. All three tokens are
              restated per breakpoint rather than cascaded, so each block
              reads on its own. --nf-header-h, --nf-header-dock and the
              overlay clamp all recompute from these.
              ============================================================ */
          @media (max-width: 1024px) {
              :root {
                  --nf-header-top-h: 75px;
                  --nf-header-bottom-h: 43px;
                  --nf-header-logo-w: 137px;
              }
          }
          @media (max-width: 767px) {
              :root {
                  --nf-header-top-h: 54px;
                  --nf-header-bottom-h: 43px;
                  --nf-header-logo-w: 128px;
              }
          }

          /* ----------------------------------------------------------
           2.5  SPACING — rem (px-named for predictability)
        ---------------------------------------------------------- */
          :root {
              --nf-space-4: 0.25rem;
              --nf-space-8: 0.5rem;
              --nf-space-12: 0.75rem;
              --nf-space-16: 1rem;
              --nf-space-20: 1.25rem;
              --nf-space-24: 1.5rem;
              --nf-space-32: 2rem;
              --nf-space-36: 2.25rem;
              --nf-space-40: 2.5rem;
              --nf-space-48: 3rem;
              --nf-space-64: 4rem;
              --nf-space-80: 5rem;
              --nf-space-112: 7rem;
          }

          /* ----------------------------------------------------------
           2.6  BORDER WIDTH — px (hairlines shouldn't sub-pixel scale).
           Named -bw- to avoid colliding with the --nf-border-* colors.
        ---------------------------------------------------------- */
          :root {
              --nf-bw-thin: 1px;
              --nf-bw-medium: 2px;
              --nf-bw-thick: 4px;
          }

          /* ----------------------------------------------------------
           2.7  LAYOUT / GRID
        ---------------------------------------------------------- */
          :root {
              --nf-content-max: 1280px; /* GP container width */
              --nf-measure: 35em; /* = designer's 58ch of Zilla (701.56px at
                                             1280, body-large 20px). em, not ch: ch
                                             resolves against the fallback font during
                                             the swap window and the whole reading
                                             column re-clamps when the webfont lands. */
              --nf-measure-wide: 44.75em; /* = 74ch, same conversion */
              --nf-lh-article-body: 1.38; /* TODO: fold into masina_sizes.csv */
              --nf-page-max: 1440px; /* full-bleed sections out to here */
              --nf-gutter: clamp(1rem, 0.0482rem + 4.0609vw, 3.7031rem); /* new per designer's revision) */
              --nf-gutter-mob: 1rem; /* 16px */
              --nf-logo-h: 2.466rem; /* 218×39.46 desktop; reduce on mobile in D3.4 */
              /* --nf-overlay-offset lives in §2.41, derived from --nf-header-h.
                 A hardcoded 164px duplicate sat here and, loading later at equal
                 specificity, silently won — so the derived token was dead and any
                 edit to it did nothing. Removed 2026-08-22. */
          }

          /* Dead below 1025 now the 767 value is the stale
          @media (max-width: 1024px) {
              :root {
                  --nf-overlay-offset: calc(
                      120px + var(--wp-admin--admin-bar--height, 0px)
                  );
              }
          }
          @media (max-width: 767px) {
              :root {
                  --nf-overlay-offset: calc(
                      142px + var(--wp-admin--admin-bar--height, 0px)
                  );
              }
          }
          */

          /* ----------------------------------------------------------
           2.8  BORDER RADIUS
        ---------------------------------------------------------- */
          :root {
              --nf-radius-chip: 20px;
              --nf-radius-pill: 100px;
              --nf-radius-circle: 9999px;
          }

          /* ----------------------------------------------------------
           2.9  SHADOWS
        ---------------------------------------------------------- */
          :root {
              --nf-shadow-subtle:
                  0 1px 1.5px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(0, 0, 0, 0.1);
              --nf-shadow-elevated:
                  0 20px 25px -5px rgba(0, 0, 0, 0.1),
                  0 8px 10px -6px rgba(0, 0, 0, 0.1);
              --nf-shadow-dropdown: 0 25px 50px -12px rgba(0, 0, 0, 0.25); /* Figma shadow-2xl */
          }
      } /* end @layer nf.tokens */

      /* ============================================================
         3  BASE ELEMENTS  (unlayered — must beat GP/core)
         The :root prefixes below reach (0,0,2,0) to win specificity
         ties against WordPress global-styles-inline-css and GP's own
         sheets, which load after tokens.css. These MUST stay unlayered.
      ============================================================ */

      html body {
          background-color: var(--nf-surface-page);
          color: var(--nf-color-text-primary);
          font-family: var(--nf-font-display);
          font-size: var(
              --nf-fs-body-base
          ); /* baseline; entry-content p overrides to body-large */
          line-height: var(--nf-lh-body-base);
          letter-spacing: var(--nf-track-body-base);
      }

      h1,
      h2,
      h3,
      h4,
      h5,
      h6,
      .entry-title,
      .entry-title a {
          font-family: var(--nf-font-display);
          color: var(
              --nf-color-text-heading
          ); /* explicit → flips via token, not inheritance */
      }

      /* GP article container: :root prefix wins the tie against GP's own
         .inside-article rule (loads after tokens.css). article bg = page.
         INTERIM — remove when GP Elements/templates carry surface tokens (~D5). */
      :root .separate-containers .inside-article {
          background-color: var(--nf-surface-page);
          color: var(--nf-color-text-primary);
          padding-inline: 0;
      }

      :root body.page #page {
          max-width: none;
          width: 100%;
          margin-inline: 0;
      }
      :root body.page .site-main {
          width: min(100% - (2 * var(--nf-gutter)), var(--nf-content-max));
          max-width: none;
          padding-inline: 0;
      }
      :root body.page #main {
          margin-inline: auto;
      }
      :root #page { overflow-x: clip;
      }

      /* UI font (Rethink Sans) on buttons — the one base override of inherited
         Zilla. :root prefix beats global-styles-inline-css button presets. */
      :root button,
      :root input[type="button"],
      :root input[type="submit"],
      :root input[type="reset"],
      :root .wp-element-button,
      :root .wp-block-button__link,
      :root .wp-block-search__button {
          font-family: var(--nf-font-ui);
          font-size: var(--nf-fs-button);
          font-weight: var(--nf-fw-medium);
          line-height: var(--nf-lh-button);
          letter-spacing: var(--nf-track-button);
      }

      /* Buttons — one visual contract: core, GB (.masina-btn), .wp-element-button.
         Normal: brand-primary / on-color.  Hover: text-heading / surface-page.
         The light↔dark swap is automatic — all four tokens flip under
         html.dark-mode, so no dark-mode rule is needed.
         ⚠ Core sets .wp-block-button__link:not(.has-background) at (0,2,0),
         tying :root .wp-block-button__link and winning on load order. Matching
         :not(.has-background) lifts us to (0,3,0) and breaks the tie by
         specificity. GB buttons render as bare <a class="gb-text gb-text-HASH">
         with no shared button class, so they are opt-in via .masina-btn added
         in the editor (Advanced → Additional CSS class). Hover replaces the old
         filter:brightness — the designer specified a colour swap, not a darken. */
      :root .wp-block-button__link:not(.has-background),
      :root .wp-block-button__link,
      :root .wp-element-button,
      :root a.masina-btn {
          background-color: var(--nf-color-brand-primary);
          color: var(--nf-color-text-on-color);
      }
      :root .wp-block-button__link:not(.has-background):hover,
      :root .wp-block-button__link:not(.has-background):focus-visible,
      :root .wp-block-button__link:hover,
      :root .wp-block-button__link:focus-visible,
      :root .wp-element-button:hover,
      :root .wp-element-button:focus-visible,
      :root a.masina-btn:hover,
      :root a.masina-btn:focus-visible {
          background-color: var(--nf-color-text-heading);
          color: var(--nf-surface-page);
      }

      /* .masina-btn carries the full pill shape, not just the colour
         contract */
      :root a.masina-btn {
          display: inline-flex;
          align-items: center;
          justify-content: center;
          padding: 0.625rem 1.1875rem;          /* matches .masina-donate */
          border-radius: var(--nf-radius-pill);
          font-family: var(--nf-font-ui);
          font-weight: var(--nf-fw-medium);
          font-size: var(--nf-fs-button);
          line-height: var(--nf-lh-button);
          letter-spacing: var(--nf-track-button);
          text-decoration: none;
      }

      /* Component copy never soft-hyphenates — card excerpts, the Blog uživo lead, and
         quote leads all inherit hyphens:auto from .entry-content p (they render inside
         the Home page content). Card excerpt / hero lead ARE the <p>; the quote lead is
         inner <p>s that match .entry-content p directly, so reach those too. */
      :root .masina-card__excerpt,
      :root .masina-hero-live__excerpt,
      :root .masina-quote__text,
      :root .masina-quote__text p {
          -webkit-hyphens: none;
          hyphens: none;
      }

      /* Article body copy → fluid body-large (18→20px) */
      .entry-content p {
          font-size: var(--nf-fs-body-large);
          line-height: var(--nf-lh-article-body);
          letter-spacing: var(--nf-track-body-large);
          font-weight: var(--nf-fw-medium);
          max-width: var(--nf-measure);
          text-wrap: pretty;
          -webkit-hyphens: auto;
          hyphens: auto;
      }

      /* --- Measure: cap the reading column so long lines don't outrun the
         paragraph width. Headings included — below 900 the article column has
         no sidebar and an uncapped h2 hangs well past the body text. Images,
         embeds and galleries are deliberately excluded and stay full-column. */
      .entry-content :is(ul, ol, dl, blockquote, figcaption),
      .entry-content :is(h2, h3, h4) {
          max-width: var(--nf-measure);
      }
      .entry-content :is(pre, .wp-block-preformatted, .wp-block-code) {
          max-width: var(--nf-measure-wide);
      }
      :is(.masina-single__title, .entry-content h3) {
          text-wrap: balance;
      }

      /* Quote + preformatted: same warm callout box; differ only in left-border
         color (designer). Quote = brand red; preformatted = heading token
         (#2D2A2A / #F0EBE1). :root prefix beats core/GP box + border defaults. */
      :root .wp-block-quote,
      :root .wp-block-preformatted {
          background-color: var(--nf-surface-warm);
          border-left: var(--nf-bw-thick) solid var(--nf-color-brand-primary);
          padding: var(--nf-space-16) var(--nf-space-24);
      }
      :root .wp-block-preformatted {
          border-left-color: var(--nf-color-text-heading);
      }

      /* Color tokens to GP sidebars — :root prefix beats GP's own sidebar
         bg (ties on specificity, loads after tokens.css). Mirrors the
         :root .separate-containers .inside-article fix in §3. */
      :root .sidebar .widget {
          background-color: transparent;
      }
      :root .separate-containers .inside-right-sidebar,
      :root .separate-containers .inside-left-sidebar {
          background-color: transparent;
      }
      /* Color tokens to GP Page Header */
      .page-header {
          background-color: var(--nf-surface-page) !important;
          color: var(--nf-color-text-primary);
      }

      /* Content-link conventions live in §6 (Links). The old blanket
         .entry-content a rule was removed — it out-specified component
         anchors (.masina-donate, tags) that sit inside content. */

      /* Form fields */
      input[type="text"],
      input[type="email"],
      input[type="search"],
      input[type="url"],
      input[type="tel"],
      input[type="number"],
      input[type="password"],
      textarea,
      select {
          background-color: var(--nf-surface-input);
          color: var(--nf-color-text-heading);
          border: var(--nf-bw-thin) solid var(--nf-border-default);
      }

      input::placeholder,
      textarea::placeholder {
          color: var(--nf-surface-placeholder);
      }

      /* --- Search-input clear button (WebKit/Blink only) ---
      The UA glyph is a fat X in the OS accent color and can't be styled,
      so appearance:none removes it and a masked SVG replaces it. Covers
      the header's inline search as well as the search-page form: both are type="search", both get the same treatment. Firefox renders no clear button at all — unchanged, not a regression. */
      :root .masina-searchform__input::-webkit-search-cancel-button,
      :root .masina-inlinesearch__input::-webkit-search-cancel-button {
          -webkit-appearance: none;
          appearance: none;
          width: 0.85em; /* TUNE */
          height: 0.85em;
          cursor: pointer;
          background-color: var(--nf-color-brand-primary);
          -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 3.5 12.5 12.5M12.5 3.5 3.5 12.5' stroke='%23000' stroke-width='1.25' stroke-linecap='round' fill='none'/%3E%3C/svg%3E")
              center / contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 3.5 12.5 12.5M12.5 3.5 3.5 12.5' stroke='%23000' stroke-width='1.25' stroke-linecap='round' fill='none'/%3E%3C/svg%3E")
              center / contain no-repeat;
      }

      /* 3.1  Misc */

      /* Video Play Button for LLV */
      .lazy-load-div:before {
          font-size: 7.5rem !important;
          text-shadow: 0px 0px 60px rgba(0, 0, 0, 0.8);
          color: var(--nf-color-brand-primary);
      }

      /* Image captions !!!CATCH ALL */
      .entry-content figcaption,
      .featured-caption {
          text-align: left;
      }
      :root .wp-block-image figcaption {
          text-align: left;
      }

      /* Text select color */
      ::selection {
          color: var(--nf-color-text-on-color);
          background: var(--nf-color-brand-primary);
      }

      /* ============================================================
         4  COMPONENTS  (unlayered)
      ============================================================ */

      /* ------------------------------------------------------------
         4.1  Theme toggle
         Colors reference the semantic token layer, so the button
         themes itself via html.dark-mode. The .dark-mode rules below
         control icon visibility/transform only (not color).
      ------------------------------------------------------------ */
      button.theme-toggle {
          position: relative;
          display: flex;
          align-items: center;
          justify-content: center;
          width: 20px;
          height: 20px;
          padding: 0;
          border: 1px solid var(--nf-color-text-primary);
          border-radius: 50%;
          background: transparent;
          color: var(--nf-color-text-primary);
          cursor: pointer;
          overflow: hidden;
          -webkit-appearance: none;
          appearance: none;
          flex: 0 0 auto;
      }
      .theme-toggle:hover {
          box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
          transform: scale(1.05);
      }
      .theme-toggle:active {
          transform: scale(0.95);
      }
      .theme-toggle:focus-visible {
          outline: 2px solid var(--nf-color-text-primary);
          outline-offset: 2px;
      }

      /* Icon containers */
      .theme-icon {
          position: absolute;
          display: flex;
          align-items: center;
          justify-content: center;
          width: 100%;
          height: 100%;
          transition: opacity 0.2s ease;
      }
      .theme-icon svg {
          width: 20px;
          height: 20px;
          transition: fill 0.2s ease;
      }

      /* Swap: sun in DARK, moon in LIGHT — the icon shows the mode you'd switch TO, per editorial decision (2026-08-24). Visibility/transform only; SVGs use currentColor and inherit the button's text-primary token. */
      .theme-icon-moon {
          opacity: 1;
          transform: rotate(0deg) scale(1);
      }
      .theme-icon-sun {
          opacity: 0;
          transform: rotate(-30deg) scale(0.8);
      }
      .dark-mode .theme-icon-sun {
          opacity: 1;
          transform: rotate(0deg) scale(1);
      }
      .dark-mode .theme-icon-moon {
          opacity: 0;
          transform: rotate(30deg) scale(0.8);
      }
      /* Restore hover redden over the JS-pinned inline fill.
         CSS !important beats the inline style the toggle sets on flip;
         only applies on hover/focus, so the resting inline fill is untouched. */
      .theme-toggle:hover .theme-icon svg,
      .theme-toggle:focus-visible .theme-icon svg {
          fill: var(--nf-color-brand-primary) !important;
      }

      /* ------------------------------------------------------------
         4.2  Site logo — light/dark asset swap on .dark-mode.
         line-height:0 + symmetric inline-flex = identical box height.
      ------------------------------------------------------------ */
      .site-logo {
          display: inline-flex;
          align-items: center;
          line-height: 0;
      }
      .site-logo svg {
          display: block;
          height: var(--nf-logo-h);
          width: auto;
      }
      .site-logo .logo-light,
      .site-logo .logo-dark {
          display: inline-flex;
      }
      .site-logo .logo-dark {
          display: none;
      }
      .dark-mode .site-logo .logo-light {
          display: none;
      }
      .dark-mode .site-logo .logo-dark {
          display: inline-flex;
      }

      /* Logo Size on snaller screns - !!!CHECK */

      @media (max-width: 767px) {
          :root {
              --nf-logo-h: 2rem;
          }
      }
      /* ------------------------------------------------------------
         4.3  Header shell (plain-HTML Site Header element)
         Two-tier sticky: the shell sticks with a NEGATIVE offset equal to
         the top band's height, so the logo row slides off above the viewport
         and the utils/nav band docks at top. (Sticky on the band itself
         cannot work — a sticky element never leaves its parent's box.)
         Geometry comes from the §2 --nf-header-* tokens; nothing here
         restates a Figma number.
      ------------------------------------------------------------ */
      .masina-header {
          position: sticky;
          top: calc(var(--wp-admin--admin-bar--height, 0px) - var(--nf-header-dock));
          z-index: 100;
          background: var(--nf-surface-page);
          transition: transform 0.18s ease-out;
      }
      /* WP switches the admin bar to position:absolute below 600px (it scrolls
         away) but still publishes --wp-admin--admin-bar--height: 46px — so the
         offset must not be applied here, or the dock lands 46px short. */
      @media (max-width: 600px) {
          .masina-header {
              top: calc(-1 * var(--nf-header-dock));
          }
      }
      /* Header Smart Sticky - the current solution */
      .masina-header--peek {
          transform: translateY(var(--nf-header-dock));
      }
      /* Paired with snippet 39 (PARKED 2026-07-22): hide-on-scroll was
         superseded by the two-tier dock. Rule kept so reactivating the
         snippet is a one-switch change. */
      .masina-header--hidden {
          transform: translateY(-100%);
      }

      /* full-width bands; visible row divider = top band's bottom border */
      .masina-header__top {
          border-bottom: 1px solid var(--nf-border-medium);
      }
      .masina-header__bottom {
          background: var(--nf-surface-page);
          border-bottom: 1px solid var(--nf-border-medium);
      }

      /* shared band layout (load-bearing: flex + centering + gutters) */
      .masina-header__top-inner,
      .masina-header__bottom-inner {
          width: min(100% - (2 * var(--nf-gutter)), var(--nf-content-max));
          max-width: none;
          padding-inline: 0;
          margin-inline: auto;
          display: flex;
          align-items: center;
          justify-content: space-between;
      }
      .masina-header__bottom-inner {
          gap: var(--nf-space-36); /* hold a gap before the nav */
      }

      /* band heights — explicit (content-derived heights drifted ~30px) */
      .masina-header__top-inner {
          height: var(--nf-header-top-h);
      }
      .masina-header__bottom-inner {
          height: var(--nf-header-bottom-h);
      }


      /* logo scale (SVG is viewBox-only, 970:176 — explicit width is
         load-bearing, not cosmetic; without it the SVG fills the band) */
      .masina-header__top-inner .site-logo svg {
          width: var(--nf-header-logo-w);
          height: auto;
          display: block; /* kills the inline baseline gap under the SVG */
      }

      /* Donirajte (pill) */
      .masina-donate {
          display: inline-flex;
          align-items: center;
          background: var(--nf-color-brand-primary);
          color: var(
              --nf-color-text-on-color
          ); /* v4: on-brand text stays light in dark */
          font-family: var(--nf-font-ui);
          font-weight: 500;
          font-size: var(--nf-fs-button);
          line-height: var(--nf-lh-button);
          letter-spacing: var(--nf-track-button);
          padding: 0.625rem 1.1875rem; /* 10 / 19 */
          border-radius: 999px;
          text-decoration: none;
      }
      .masina-donate:hover,
            .masina-donate:focus-visible {
                background: var(--nf-color-text-heading);
                color: var(--nf-surface-page);
            }

      /* Old hover style kept here as the designer may want it back
      .masina-donate:hover {
          filter: brightness(0.94);
          color: var(--nf-color-text-on-color);
      }*/

      /* ------------------------------------------------------------
         4.4  Primary nav + utils cluster
      ------------------------------------------------------------ */
      .masina-header__utils {
          display: flex;
          align-items: center;
          gap: var(--nf-space-12);
          flex-shrink: 0;
      }

      /* separator: 1px, header ink. The frame draws it in the same ink as the
         burger and EN (#2d2a2a), not the grey meta token — a 1px hairline at
         50% grey read as faint, which is what the old 1.5px width was
         compensating for. Fractional widths round to 1 or 2 device px depending
         on subpixel position, so the two separators disagreed and swapped with
         zoom. 14px is an optical correction from the frame's 16: at full ink a
         16px rule reads heavier than the frame's grey one. */
      .masina-header__sep {
          display: inline-block;
          flex: 0 0 auto;
          width: 1px;
          height: 14px;
          background: var(--nf-color-text-heading);
      }

      /* inline icons — currentColor follows the trigger, so hover + dark reach it */
      .masina-icon {
          display: inline-flex;
          color: inherit;
      }
      .masina-icon svg {
          display: block;
      }
      .masina-icon--search svg {
          width: 18px;
          height: 18px;
      }
      /* header icons follow currentColor → hover-redden and flip with theme */
      .masina-icon svg [stroke]:not([stroke="none"]),
      .masina-icon svg[stroke]:not([stroke="none"]) {
          stroke: currentColor;
      }
      .masina-icon svg [fill]:not([fill="none"]),
      .masina-icon svg[fill]:not([fill="none"]) {
          fill: currentColor;
      }

      .masina-menu-trigger,
      .masina-search-trigger {
          display: inline-flex;
          align-items: center;
          gap: var(--nf-space-8);
          background: none;
          border: 0;
          padding: 0;
          cursor: pointer;
          color: var(--nf-color-text-heading);
      }
      /* "Vidi još": typography lives in the :root rule below (GP's :root button
         rule beats a bare class); only the uncontested bits sit here. */
      .masina-menu-trigger {
          white-space: nowrap;
          transition: color 0.2s ease; /* eye-tuned: label + bars fade together */
      }
      .masina-menu-trigger:focus-visible,
      .masina-search-trigger:focus-visible {
          outline: 2px solid var(--nf-color-text-primary);
          outline-offset: 2px;
      }

      /* UI/Nav type stack, asserted above the :root button base rule
         (--nf-font-ui) that the label would otherwise inherit. */
      :root .masina-header__utils .masina-menu-trigger {
          font-family: var(--nf-font-display);
          font-weight: 500;
          font-size: var(--nf-fs-nav);
          line-height: var(--nf-lh-nav);
      }

      /* GP paints the trigger var(--base-2) (#fff) on :focus. The overlay returns
         focus to the trigger on close, so it sits focused-not-hovered = white-on-
         white until the next blur. Cover :focus:not(:focus-visible) with heading at
         utils specificity to beat GP; keyboard focus still reddens below. */
      :root .masina-header__utils .masina-menu-trigger:focus:not(:focus-visible),
      :root .masina-header__utils .masina-search-trigger:focus:not(:focus-visible) {
          color: var(--nf-color-text-heading);
      }

      /* language switch — UI/Nav style, same ink as nav links */
      .masina-lang {
          font-family: var(--nf-font-display);
          font-weight: 500;
          font-size: var(--nf-fs-nav);
          line-height: var(--nf-lh-nav);
          letter-spacing: var(--nf-track-nav);
          color: var(--nf-color-text-heading);
          text-decoration: none;
          white-space: nowrap;
          transition: color 0.15s ease;
      }
      :root .masina-header__utils .masina-lang:hover,
      :root .masina-header__utils .masina-lang:focus-visible {
          color: var(--nf-color-brand-primary);
      }
      :root .masina-header__utils .masina-lang:focus:not(:focus-visible) {
          color: var(--nf-color-text-heading);
      }

      /* utils buttons: :root prefix strips GP button chrome + sets hover color */
      :root .masina-header__utils .masina-menu-trigger,
      :root .masina-header__utils .masina-search-trigger,
      :root .masina-header__utils .theme-toggle {
          background: none;
      }
      :root .masina-header__utils .masina-menu-trigger:hover,
      :root .masina-header__utils .masina-menu-trigger:focus-visible,
      :root .masina-header__utils .masina-search-trigger:hover,
      :root .masina-header__utils .masina-search-trigger:focus-visible,
      :root .masina-header__utils .theme-toggle:hover,
      :root .masina-header__utils .theme-toggle:focus-visible {
          background: none;
          color: var(--nf-color-brand-primary);
      }

      /* primary nav — horizontal scroll strip when it can't fit: scrolls
         internally, never widens the page (no global overflow-x:hidden needed). */
      .masina-nav {
          min-width: 0;
          overflow-x: auto;
          overscroll-behavior-x: contain;
          scrollbar-width: none;
      }
      .masina-nav::-webkit-scrollbar {
          display: none;
      }
      .masina-nav ul {
          display: flex;
          align-items: center;
          flex-wrap: nowrap;
          gap: var(--nf-space-36);
          margin: 0;
          padding: 0;
          list-style: none;
      }
      .masina-nav a {
          font-family: var(--nf-font-display);
          font-weight: 500;
          font-size: var(--nf-fs-nav);
          line-height: var(--nf-lh-nav);
          letter-spacing: var(--nf-track-nav);
          color: var(--nf-color-text-heading);
          text-decoration: none;
          white-space: nowrap;
      }
      .masina-nav a:hover {
          color: var(--nf-color-brand-primary); /* provisional, designer-pending */
      }

      /* ------------------------------------------------------------
         4.4b  Hamburger "Spin" — SVG-stroke rebuild (from jonsuh, MIT)
         Bars are SVG strokes = identical rendering model to the header
         icons → uniform weight at every DPR/zoom/engine. The CSS-box
         version failed because each bar pixel-snapped independently.
         Line y-coords (1.5 / 7.5 / 13.5 in a 16x15 viewBox) are
         half-integers so 1px strokes land on whole pixel rows at 1x —
         CSS height MUST equal viewBox height or they rescale fractional.
         State = trigger's [aria-expanded]; stroke rides currentColor.
      ------------------------------------------------------------ */
      .masina-burger {
          display: block;
          width: 16px;
          height: 15px;
          flex: 0 0 auto;
          overflow: visible;
      }
      .masina-burger line {
          stroke: currentColor;
          stroke-width: 1;
          stroke-linecap: round;
          transform-box: fill-box;
          transform-origin: center;
      }
      .masina-burger__botwrap {
          transform-box: fill-box;
          transform-origin: center;
      }

      /* closed-state (reverse) clocks */
      .masina-burger__top {
          transition:
              transform 0.1s 0.25s ease-in,
              opacity 0.1s ease-in;
      }
      .masina-burger__mid {
          transition: transform 0.22s cubic-bezier(0.55, 0.055, 0.675, 0.19);
      }
      .masina-burger__botwrap {
          transition: transform 0.1s 0.25s ease-in;
      }
      .masina-burger__bot {
          transition: transform 0.22s cubic-bezier(0.55, 0.055, 0.675, 0.19);
      }

      /* open state: top folds in + fades, mid spins 225deg (overshoot past 180
         is what reads as the gear-spin), bottom folds then lands at 135 → X */
      .masina-menu-trigger[aria-expanded="true"] .masina-burger__top {
          transform: translateY(6px);
          opacity: 0;
          transition:
              transform 0.1s ease-out,
              opacity 0.1s 0.12s ease-out;
      }
      .masina-menu-trigger[aria-expanded="true"] .masina-burger__mid {
          transform: rotate(225deg);
          transition: transform 0.22s 0.12s cubic-bezier(0.215, 0.61, 0.355, 1);
      }
      .masina-menu-trigger[aria-expanded="true"] .masina-burger__botwrap {
          transform: translateY(-6px);
          transition: transform 0.1s ease-out;
      }
      .masina-menu-trigger[aria-expanded="true"] .masina-burger__bot {
          transform: rotate(135deg);
          transition: transform 0.22s 0.12s cubic-bezier(0.215, 0.61, 0.355, 1);
      }

      /* ------------------------------------------------------------
         4.4c  Utils cluster — responsive (frames: desktop full,
         tablet/mobile = burger | theme | EN, search in dropdown only)
         MUST stay after 4.4: these display rules beat 4.4's by load
         order only (media queries add no specificity).
      ------------------------------------------------------------ */
      .masina-header__sep--lang {
          display: none; /* desktop: no sep before EN */
      }
      @media (max-width: 1024px) {
          .masina-menu-trigger__label {
              display: none;
          }
          .masina-search-trigger,
          .masina-inlinesearch {
              display: none; /* search = dropdown field <=tablet */
          }
          .masina-header__sep--lang {
              display: inline-block;
          }
      }
      @media (max-width: 767px) {
          .masina-nav {
              display: none;
          }
      }

      /* ------------------------------------------------------------
         4.5  Header dropdown (D3 Step 3, revised 2026-07-22)
         GB Pro Anchored Overlay Panel, content = one wp:html block.
         GB panel settings (not CSS): Type Anchored · Trigger Click ·
         Position to Parent .masina-header__bottom · Placement Bottom
         Start · Width Full · Animation In "Fade In" 400ms (no
         animation-out exists in GB — close is instant by design) ·
         zero the panel container padding + bg so .masina-dropdown
         owns every visual.

         Dark mode: no overrides here by design — every value is a
         token. Two intentional inversions to eyeball in dark:
           · mission text = on-color (light) on brand-primary block
           · "Analiza" tag = surface-page text on text-heading pill
      ------------------------------------------------------------ */

      /* panel shell + viewport clamp + page dim, one rule */
      .masina-dropdown {
          width: 100%;
          background: var(--nf-surface-page);
          border-bottom: var(--nf-bw-thick) solid var(--nf-color-brand-primary);
          max-height: calc(100vh - var(--nf-overlay-offset));
          max-height: calc(100dvh - var(--nf-overlay-offset));
          overflow: hidden auto;
          overscroll-behavior: contain;
          /* page dim below the panel: offset-down + equal spread paints only
             beneath the panel's bottom edge, and rides GB's opacity fade (same
             node tree) — frame-synced with the panel, vanishes on close. A
             separate backdrop element could never sync with GB's JS clock. */
          box-shadow: 0 100vmax 0 100vmax rgba(0, 0, 0, 0.45);
      }
      .masina-dropdown__inner {
          width: min(100% - (2 * var(--nf-gutter)), var(--nf-content-max));
          margin-inline: auto;
          padding-block: var(--nf-space-64) var(--nf-space-48);
      }

      /* grid: one reflow point via grid-template-areas */
      .masina-dropdown__grid {
          display: grid;
          grid-template-columns: 1fr 1fr 1fr;
          grid-template-areas: "cats feat mission";
          gap: var(--nf-space-48);
          align-items: start;
      }
      .masina-dropdown__col--cats {
          grid-area: cats;
      }
      .masina-dropdown__col--feat {
          grid-area: feat;
      }
      .masina-dropdown__col--mission {
          grid-area: mission;
      }

      /* column titles (Article-H2) — v4: quote grey (confirmed vs Figma).
         Desktop shows all three; tablet loses "Kategorije" (search takes its
         slot); mobile loses all three. Hidden, not removed — screen readers
         keep the column structure. */
      .masina-dropdown__coltitle {
          margin: 0 0 var(--nf-space-24);
          padding-bottom: var(--nf-space-12);
          border-bottom: var(--nf-bw-thin) solid var(--nf-border-default);
          font-family: var(--nf-font-display);
          font-weight: var(--nf-fw-bold);
          font-size: var(--nf-fs-article-h2);
          line-height: var(--nf-lh-article-h2);
          color: var(--nf-color-text-quote);
      }
      @media (max-width: 1024px) {
          .masina-dropdown__col--cats .masina-dropdown__coltitle {
              display: none;
          }
      }
      @media (max-width: 767px) {
          .masina-dropdown__inner {
              padding: var(--nf-space-24) 0 var(--nf-space-40);   /* vertical only; the horizontal gutter already comes from the base width:min(100% − 2·gutter) */
          }
      }

      /* Kategorije list */
      .masina-dropdown__cats {
          list-style: none;
          margin: 0;
          padding: 0;
          display: flex;
          flex-direction: column;
          gap: var(--nf-space-16);
      }
      .masina-dropdown__cat {
          display: inline-flex;
          align-items: center;
          font-family: var(--nf-font-display);
          font-weight: var(--nf-fw-medium);
          font-size: var(--nf-fs-dropdown-link);
          line-height: var(--nf-lh-dropdown-link);
          color: var(--nf-color-text-heading);
          text-decoration: none;
      }
      .masina-dropdown__cat:hover,
      .masina-dropdown__cat:focus-visible {
          color: var(--nf-color-brand-primary);
      }
      /* Dropdown Desktop Second Menu */
      .masina-dropdown__cats--desktop { display: none; }
      @media (min-width: 1025px) {
          .masina-dropdown__cats--desktop { display: flex; }
          .masina-dropdown__cats--compact { display: none; }
      }
      /* GP sets a:focus/:active { color: var(--contrast) } (#222, non-flipping),
         which beats our base color and, because the overlay focus-traps onto the
         first item on open, paints it black-on-black in dark. Pin non-keyboard
         focus + active to the heading token; keyboard focus stays red above. */
      .masina-dropdown__cat:focus:not(:focus-visible),
      .masina-dropdown__cat:active {
          color: var(--nf-color-text-heading);
      }
      .masina-dropdown__cat:hover,
      .masina-dropdown__cat:focus-visible {
          color: var(--nf-color-brand-primary);
      }
      .masina-dropdown__cat:focus-visible {
          outline: 2px solid var(--nf-color-text-primary);
          outline-offset: 2px;
      }
      /* Izdvajamo card — flex column so the CTA pins to the bottom (designer
         rev 2026-07-22: both cards' buttons on one baseline). Children that
         shouldn't stretch across the column carry align-self: flex-start. */
      .masina-dropdown__card {
          background: var(--nf-surface-pure-white); /* alias → page in v4 */
          border: var(--nf-bw-thin) solid var(--nf-border-default);
          padding: var(--nf-space-32); /* = mission padding (designer rev) */
          display: flex;
          flex-direction: column;
      }
      .masina-dropdown__tag {
          display: inline-block;
          align-self: flex-start;
          margin-bottom: var(--nf-space-16);
          padding: var(--nf-space-4) var(--nf-space-12);
          border-radius: var(--nf-radius-pill);
          background: var(--nf-color-text-heading);
          color: var(--nf-surface-page); /* inverts with theme by design */
          font-family: var(--nf-font-ui);
          font-weight: var(--nf-fw-bold);
          font-size: var(--nf-fs-label-base);
          line-height: var(--nf-lh-label-base);
          letter-spacing: var(--nf-track-label-base);
          text-transform: uppercase;
      }
      .masina-dropdown__cardtitle {
          display: block; /* <h3>; link injected via {{post_title link:post}} */
          margin: 0 0 var(--nf-space-12);
          font-family: var(--nf-font-display);
          font-weight: var(--nf-fw-bold);
          font-size: var(
              --nf-fs-dropdown-link
          ); /* no dedicated card-title token yet; mint --nf-fs-card-title in D6 */
          line-height: 1.25;
      }
      .masina-dropdown__cardtitle:hover,
      .masina-dropdown__cardtitle a:hover {
          color: var(--nf-color-brand-primary);
      }
      .masina-dropdown__cardtitle a {
          color: var(--nf-color-text-heading);
          text-decoration: none;
      }
      .masina-dropdown__excerpt {
          display: -webkit-box;
          -webkit-line-clamp: 4;
          -webkit-box-orient: vertical;
          overflow: hidden;
      }
      .masina-dropdown__more {
          display: inline-flex;
          align-items: center;
          gap: var(--nf-space-8);
          margin-top: auto; /* pins to card bottom */
          align-self: flex-start;
          padding-top: var(--nf-space-16); /* minimum gap above (auto carries none) */
          font-family: var(--nf-font-ui);
          font-weight: var(--nf-fw-bold);
          font-size: var(--nf-fs-label-base);
          letter-spacing: var(--nf-track-label-base);
          text-transform: uppercase;
          color: var(--nf-color-brand-primary);
          text-decoration: none;
      }
      /* hover → primary text (designer); beats GP a:hover --contrast */
      .masina-dropdown__more:hover,
      .masina-dropdown__more:focus-visible {
          color: var(--nf-color-text-primary);
      }

      /* Izdvajamo query wrappers must fill the feat column — GB Looper's grid
         default collapses a single card to min-content (words break one-per-line). */
      .masina-dropdown__col--feat .gb-query,
      .masina-dropdown__col--feat .gb-looper,
      .masina-dropdown__col--feat .gb-loop-item,
      .masina-dropdown__col--feat .gb-query-no-results {
          display: contents;
      }

      /* Naša misija */
      .masina-dropdown__mission {
          position: relative; /* anchor for blur + z-index children */
          overflow: hidden;
          padding: var(--nf-space-32);
          background: var(--nf-color-brand-primary);
          display: flex;
          flex-direction: column;
      }
      .masina-dropdown__mission > * {
          position: relative;
          z-index: 1; /* sit above the blur */
      }
      /* NOTE: same specificity (0,1,0) as the rule above — must stay AFTER it
         or the blur loses position:absolute and joins the flex flow. */
      .masina-dropdown__mission-blur {
          position: absolute;
          z-index: 0;
          right: -20px;
          bottom: -20px;
          width: 160px;
          height: 160px;
          border-radius: var(--nf-radius-circle);
          background: var(--nf-color-brand-primary);
          filter: blur(64px);
          opacity: 0.5;
          display: none; /* desktop hidden; shown <=tablet */
      }
      .masina-dropdown__missiontitle {
          margin: 0 0 var(--nf-space-16);
          font-family: var(--nf-font-display);
          font-weight: var(--nf-fw-bold);
          font-size: var(--nf-fs-h3);
          line-height: var(--nf-lh-h3);
          color: var(--nf-color-text-on-color); /* v4: light on brand block */
      }
      .masina-dropdown__missiondesc {
          margin: 0 0 var(--nf-space-32); /* was 16 — floor under the auto-pushed btn */
          font-family: var(--nf-font-display);
          font-size: var(--nf-fs-body); /* Body/Base 17 */
          font-weight: 500; /* eye-tuned vs frame; doc says Regular — designer flag */
          line-height: 1.6;
          color: var(--nf-color-text-on-color);
      }
      .masina-dropdown__missionbtn {
          display: inline-flex;
          align-items: center;
          gap: var(--nf-space-8);
          margin-top: auto; /* pins to card bottom */
          align-self: flex-start;
          padding: var(--nf-space-12) var(--nf-space-24);
          border-radius: var(--nf-radius-pill);
          background: var(
              --nf-color-text-on-color
          ); /* v4: light pill stays light in dark */
          color: var(--nf-color-brand-primary);
          font-family: var(--nf-font-ui);
          font-weight: var(--nf-fw-bold);
          font-size: var(--nf-fs-button);
          text-decoration: none;
      }

      /* Focus rings for the dropdown panel. A colour change alone leaves the UA
         default ring painting on top — only setting `outline` replaces it.
         Mirrors the header trigger pattern in §4.4. */
      .masina-dropdown__cat:focus-visible,
      .masina-dropdown__cardtitle a:focus-visible,
      .masina-dropdown__more:focus-visible,
      .masina-dropdown__missionbtn:focus-visible {
          outline: 2px solid var(--nf-color-text-primary);
          outline-offset: 2px;
      }

      /* shared arrow mask (more + mission button) */
      .masina-dropdown__more::after,
      .masina-dropdown__missionbtn::after {
          content: "";
          width: 12px;
          height: 12px;
          flex: 0 0 auto;
          background: currentColor;
          -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 11 11'%3E%3Cpath stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.333' d='M.667 5.333H10M5.335.667 10 5.333 5.335 10'/%3E%3C/svg%3E")
              center/contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 11 11'%3E%3Cpath stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.333' d='M.667 5.333H10M5.335.667 10 5.333 5.335 10'/%3E%3C/svg%3E")
              center/contain no-repeat;
      }

      /* search field (<=tablet) — lives inside the cats column so it takes the
         "Kategorije" title's slot on tablet and tops the stack on mobile.
         Vertical rhythm mirrors .masina-dropdown__coltitle so the two hairlines
         land on one line across the gutter. */
      .masina-dropdown__search {
          display: none; /* desktop hidden */
          align-items: center;
          gap: var(--nf-space-12);
          margin-bottom: var(--nf-space-24); /* = coltitle margin */
          padding-bottom: 0.2rem; /* literal: token space-4 misaligns the hairline vs coltitle by <1px; token candidate if recurring */
          border-bottom: var(--nf-bw-thin) solid var(--nf-border-default);
      }
      .masina-dropdown__search-input {
          flex: 1;
          background: transparent;
          border: 0;
          font-family: var(--nf-font-display);
          font-size: var(--nf-fs-nav);
          color: var(--nf-color-text-heading);
      }
      .masina-dropdown__search-input:focus {
          outline: none;
      }
      /* GP input chrome strip — bg/border/padding must be asserted at :root
         weight or GP's :root input[type="search"] rule wins (grey filled box,
         20px vertical padding, non-flipping text colour). */
      :root .masina-dropdown .masina-dropdown__search-input {
          background: transparent;
          border: 0;
          padding: var(--nf-space-4) 0;
          color: var(--nf-color-text-heading);
      }
      .masina-dropdown__search-btn {
          display: inline-flex;
          padding: 0;
          background: none;
          border: 0;
          cursor: pointer;
          color: var(--nf-color-text-heading);
          order: -1; /* icon before input (Figma) */
      }
      .masina-dropdown__search-btn svg {
          width: 18px;
          height: 18px;
      }
      /* GB's focus trap force-focuses this button on open (it ignores
         tabindex="-1" — that only removes it from Tab order, not from
         programmatic focus), and GP paints button:focus as a filled box.
         Pin bg + colour; the button is mouse-only, Enter submits the form. */
      :root .masina-dropdown .masina-dropdown__search-btn:focus,
      :root .masina-dropdown .masina-dropdown__search-btn:focus-visible {
          outline: none;
          background: none;
          color: var(--nf-color-text-heading);
      }
      :root .masina-dropdown .masina-dropdown__search-btn:hover {
          background: none;
          color: var(--nf-color-brand-primary);
      }

      /* desktop equal-height columns */
      @media (min-width: 1025px) {
          .masina-dropdown__grid {
              align-items: stretch;
          }
          .masina-dropdown__col--feat,
          .masina-dropdown__col--mission {
              display: flex;
              flex-direction: column;
          }
          .masina-dropdown__col--feat .masina-dropdown__card {
              flex: 1;
          }
          .masina-dropdown__mission {
              flex: 1;
          }
      }

      /* TABLET: cats left (full height), feat top-right, mission bottom-right */
      @media (max-width: 1024px) {
          .masina-dropdown__search {
              display: flex;
          }
          .masina-dropdown__mission-blur {
              display: block;
          }
          .masina-dropdown__grid {
              grid-template-columns: 1fr 1fr;
              grid-template-areas:
                  "cats feat"
                  "cats mission";
              gap: var(--nf-space-40);
          }
      }

      /* Full height at <=1024 (designer). Height comes from the overlay box —
         GB sets .gb-overlay's top from the live header and bottom:0 gives the
         exact remainder — NOT from --nf-overlay-offset, whose responsive
         branches are tombstoned in §2 as stale.
         Equal cards reuse the >=1025 pattern (stretch + flex column + flex:1)
         over 1fr row tracks. */
      @media (max-width: 1024px) {
          .gb-overlay.gb-overlay--anchored {
              bottom: 0;
          }
          .gb-overlay.gb-overlay--anchored .gb-overlay__content {
              height: 100%;
              max-height: 100%;
          }
          .masina-dropdown {
              height: 100%;
              max-height: none;
          }
          .masina-dropdown__inner {
              min-height: 100%;
              display: flex;
              flex-direction: column;
          }
          .masina-dropdown__grid {
              flex: 1;
              min-height: 0;
              align-items: stretch;
              grid-template-rows: minmax(0, 1fr) minmax(0, 1fr);
          }
          .masina-dropdown__col--feat,
          .masina-dropdown__col--mission {
              display: flex;
              flex-direction: column;
          }
          .masina-dropdown__col--feat .masina-dropdown__card {
              flex: 1;
          }
          .masina-dropdown__mission {
              flex: 1;
          }
      }

      @media (max-width: 767px) {
          .masina-dropdown__grid {
              grid-template-rows: auto minmax(0, 1fr) minmax(0, 1fr);
          }
      }

      /* MOBILE: single column — search, then cats, feat, mission */
      @media (max-width: 767px) {
          .masina-dropdown__inner {
              padding-block: var(--nf-space-24) var(--nf-space-40);
          }
          .masina-dropdown__grid {
              grid-template-columns: 1fr;
              grid-template-areas:
                  "cats"
                  "feat"
                  "mission";
              gap: var(--nf-space-32);
          }
      }

      /* ------------------------------------------------------------
         4.5c  Inline header search (desktop) — in-flow flex child right
         of the search icon; the expanding field pushes theme/EN toward
         the nav (nav absorbs the squeeze via its overflow strip).
         The form node is BUILT BY SNIPPET 38, not authored in markup:
         the GP Site Header element's render pipeline strips <form> and
         <input> from wp:html. State = .is-open.
      ------------------------------------------------------------ */
      .masina-inlinesearch {
          max-width: 0;
          overflow: hidden;
          margin: 0 0 0 calc(-1 * var(--nf-space-12)); /* cancel the flex gap slot when closed */
          background: var(--nf-surface-page);
          transition:
              max-width 0.25s ease,
              margin-left 0.25s ease;
      }
      .masina-inlinesearch.is-open {
          max-width: min(320px, 30vw);
          margin-left: 0;
          border-bottom: var(--nf-bw-thin) solid var(--nf-color-text-heading);
      }
      /* fixed intrinsic width: only the clip window animates, so the text
         inside never reflows mid-transition */
      .masina-inlinesearch__input {
          width: min(320px, 30vw);
          padding: 0;
          line-height: var(--nf-lh-nav);
          background: transparent;
          border: 0;
          font-family: var(--nf-font-display);
          font-size: var(--nf-fs-nav);
          color: var(--nf-color-text-heading);
      }
      /* GP chrome strip — padding here is load-bearing: GP's 20px vertical
         padding made the input the row's tallest child and grew the band. */
      :root .masina-header__utils .masina-inlinesearch__input {
          background: transparent;
          border: 0;
          padding: 0;
          color: var(--nf-color-text-heading);
      }
      .masina-inlinesearch__input:focus {
          outline: none;
      }
      /* ------------------------------------------------------------
         4.6  Footer (D4) — GP Footer Block Element
         Fully tokenized (designer footer-context.md). NO dark-specific
         rules: every value is a semantic token that flips via
         html.dark-mode. bg = surface-warm; all text = text-heading;
         CTA text = on-color (non-flip, on brand fill); lines =
         border-default. One reflow via grid-template-areas.
         Selectors scoped through .masina-footer so GB's .gb-text /
         .gb-element base classes can't out-specify us.
      ------------------------------------------------------------ */

      .masina-footer {
          background: var(--nf-surface-warm);
          color: var(--nf-color-text-heading);
      }
      .masina-footer .masina-footer__inner {
          width: min(100% - (2 * var(--nf-gutter)), var(--nf-content-max));
          max-width: none;
          padding-block: var(--nf-space-80) var(--nf-space-48);
          padding-inline: 0;
          margin-inline: auto;
          display: flex;
          flex-direction: column;
          gap: var(--nf-space-64);
      }
      /* --- TOP: logo · description · CTA --- */
      .masina-footer .masina-footer__top {
          display: flex;
          flex-direction: column;
          align-items: flex-start;
          gap: var(--nf-space-24);
      }
      /* footer logo larger than header's --nf-logo-h; reuses .site-logo swap */
      .masina-footer .masina-footer__logo .site-logo svg {
          height: clamp(2.75rem, 2.4rem + 1.5vw, 3.5rem);
      }
      .masina-footer .masina-footer__desc {
          max-width: 46ch;
          margin: 0;
          font-family: var(--nf-font-display);
          font-size: var(--nf-fs-body-large);
          line-height: var(--nf-lh-body-large);
          color: var(--nf-color-text-heading);
      }

      /* CTA pill — brand fill, on-color text (does NOT flip), arrow */
      .masina-footer .masina-footer__cta {
          display: inline-flex;
          align-items: center;
          gap: var(--nf-space-12);
          padding: var(--nf-space-16) var(--nf-space-32);
          background: var(--nf-color-brand-primary);
          color: var(--nf-color-text-on-color);
          font-family: var(--nf-font-ui);
          font-weight: var(--nf-fw-bold);
          font-size: var(--nf-fs-button);
          line-height: var(--nf-lh-button);
          letter-spacing: var(--nf-track-button);
          text-transform: uppercase;
          text-decoration: none;
          border-radius: var(--nf-radius-pill);
      }

    .masina-footer .masina-footer__cta:hover,
    .masina-footer .masina-footer__cta:focus-visible {
        background: var(--nf-color-text-heading);
        color: var(--nf-surface-page);
            }

      /* Old hover style kept here as the designer may want it back
      .masina-footer .masina-footer__cta:hover,
      .masina-footer .masina-footer__cta:focus-visible {
          color: var(
              --nf-color-text-on-color
          );
          filter: brightness(0.94);
      }*/
      .masina-footer .masina-footer__cta-icon {
          width: 18px;
          height: 18px;
          display: block;
          flex-shrink: 0;
      }

      /* --- COLUMNS: cats · social · newsletter --- */
      .masina-footer .masina-footer__cols {
          display: grid;
          grid-template-columns: 1fr 1fr 1.4fr;
          grid-template-areas: "cats social news";
          gap: var(--nf-space-48);
          align-items: start;
      }
      .masina-footer .masina-footer__col--cats {
          grid-area: cats;
      }
      .masina-footer .masina-footer__col--social {
          grid-area: social;
      }
      .masina-footer .masina-footer__col--news {
          grid-area: news;
      }

      /* column heading + underline divider */
      .masina-footer .masina-footer__heading {
          margin: 0 0 var(--nf-space-24);
          padding-bottom: var(--nf-space-16);
          border-bottom: var(--nf-bw-thin) solid var(--nf-border-default);
          font-family: var(--nf-font-ui);
          font-weight: var(--nf-fw-bold);
          font-size: var(--nf-fs-label-base);
          line-height: var(--nf-lh-label-base);
          letter-spacing: var(--nf-track-label-base);
          text-transform: uppercase;
          color: var(--nf-color-text-heading);
      }

      /* category links — Rethink regular */
      .masina-footer .masina-footer__links {
          list-style: none;
          margin: 0;
          padding: 0;
          display: flex;
          flex-direction: column;
          gap: var(--nf-space-16);
      }
      .masina-footer .masina-footer__links a {
          font-family: var(
              --nf-font-display
          ); /* was --nf-font-ui — designer: Zilla Slab */
          font-weight: var(--nf-fw-regular);
          font-size: var(--nf-fs-footer-link);
          line-height: var(--nf-lh-footer-link);
          color: var(--nf-color-text-heading);
          text-decoration: none;
      }
      .masina-footer .masina-footer__links a:hover,
      .masina-footer .masina-footer__links a:focus-visible {
          color: var(
              --nf-color-brand-primary
          ); /* provisional — designer-pending, matches nav */
      }

      /* social links — Zilla italic + external arrow, space-between */
      .masina-footer .masina-footer__social {
          list-style: none;
          margin: 0;
          padding: 0;
          display: flex;
          flex-direction: column;
          gap: var(--nf-space-16);
      }
      .masina-footer .masina-footer__social a {
          display: flex;
          align-items: center;
          justify-content: space-between;
          gap: var(--nf-space-16);
          font-family: var(--nf-font-display);
          font-style: italic;
          font-weight: var(--nf-fw-regular);
          font-size: var(--nf-fs-footer-social);
          line-height: var(--nf-lh-footer-social);
          color: var(--nf-color-text-heading);
          text-decoration: none;
      }
      .masina-footer .masina-footer__social a:hover,
      .masina-footer .masina-footer__social a:focus-visible {
          color: var(--nf-color-brand-primary);
      }
      .masina-footer .masina-footer__ext-icon {
          display: inline-flex;
          flex-shrink: 0;
          color: inherit;
      }
      .masina-footer .masina-footer__ext-icon svg {
          width: 14px;
          height: 14px;
          display: block;
          stroke: currentColor;
      }

      /* newsletter */
      .masina-footer .masina-footer__news-desc {
          margin: 0 0 var(--nf-space-32);
          font-family: var(--nf-font-display);
          font-size: var(--nf-fs-body-large);
          line-height: var(--nf-lh-body-large);
          color: var(--nf-color-text-heading);
      }
      .masina-footer .masina-footer__news-form {
          display: flex;
          align-items: center;
          gap: var(--nf-space-12);
          padding-bottom: var(--nf-space-12);
          border-bottom: var(--nf-bw-thin) solid var(--nf-border-default);
      }
      /* scope beats the §3 input[type=email] base (bg/border) without !important */
      .masina-footer .masina-footer__news-input {
          flex: 1;
          min-width: 0;
          padding: var(--nf-space-8) 0;
          background: transparent;
          border: 0;
          font-family: var(--nf-font-display);
          font-size: var(--nf-fs-body-large);
          line-height: var(--nf-lh-body-large);
          color: var(--nf-color-text-heading);
      }
      .masina-footer .masina-footer__news-input:focus {
          outline: none;
      }
      /* placeholder = heading tone (not the grey §3 default), flips with mode */
      .masina-footer .masina-footer__news-input::placeholder {
          color: var(--nf-color-text-heading);
          opacity: 0.75;
      }
      /* GP's input:focus paints background: var(--base-2) at (0,0,2,1); our base
         rule didn't cover :focus. (0,0,3,0) beats it — no :root prefix needed. */
      .masina-footer .masina-footer__news-input:focus,
      .masina-footer .masina-footer__news-input:hover {
          background-color: transparent;
          color: var(--nf-color-text-heading);
          outline: none;
      }

      .gb-overlay[role="dialog"] {
          box-shadow: none;
          overflow: visible; /* was hidden auto — stop clipping the panel's shadow */
          max-height: none; /* clamp moves down to the panel */
      }
      .masina-footer .masina-footer__news-btn {
          display: inline-flex;
          flex-shrink: 0;
          padding: 0;
          background: none;
          border: 0;
          cursor: pointer;
          color: var(--nf-color-text-heading);
      }
      .masina-footer .masina-footer__news-btn:hover,
      .masina-footer .masina-footer__news-btn:focus-visible {
          color: var(--nf-color-brand-primary);
      }
      .masina-footer .masina-footer__news-btn svg {
          width: 20px;
          height: 20px;
          display: block;
          stroke: currentColor;
      }
      /* --- TEMP: newsletter form hidden until the real form is wired.
      Ghost button links to the standalone signup page meanwhile.
      Form stays in the DOM (display:none) — we need it back soon. --- */
      .masina-footer .masina-footer__news-form {
          display: none;
      }
    .masina-footer .masina-footer__news-link {
          display: inline-flex;
          align-items: center;
          gap: var(--nf-space-8);
          padding: 0.625rem 1.1875rem;   /* matches .masina-donate */
          background: transparent;
          border: var(--nf-bw-thin) solid var(--nf-color-text-primary);
          border-radius: var(--nf-radius-pill);
          color: var(--nf-color-text-primary);
          font-family: var(--nf-font-ui);
          font-weight: var(--nf-fw-medium);
          font-size: var(--nf-fs-button);
          line-height: var(--nf-lh-button);
          letter-spacing: var(--nf-track-button);
          text-decoration: none;
      }
      :root .masina-footer .masina-footer__inner .masina-footer__news-link:hover,
      :root .masina-footer .masina-footer__inner .masina-footer__news-link:focus-visible {
          background: var(--nf-color-text-heading);
          color: var(--nf-surface-page);
		  text-decoration: none;
      }
      .masina-footer .masina-footer__news-link svg {
          width: 18px;
          height: 18px;
          display: block;
          stroke: currentColor;
      }
      /* Footer links - TEMP - will consolidate with all links */
      .masina-footer .masina-footer__col--cats a:hover {
	  text-decoration: underline;
      }
      .masina-footer .masina-footer__social a:hover {
	  text-decoration: underline;
      }
      .masina-footer__cta:hover {
	  text-decoration: none;
      }



      /* --- BOTTOM: copyright · legal links --- */
      .masina-footer .masina-footer__bottom {
          display: flex;
          align-items: center;
          justify-content: space-between;
          gap: var(--nf-space-24);
          padding-top: var(--nf-space-32);
          border-top: var(--nf-bw-thin) solid var(--nf-border-default);
      }
      .masina-footer .masina-footer__copy {
          margin: 0;
          font-family: var(--nf-font-display);
          font-style: italic;
          font-size: var(--nf-fs-caption);
          line-height: var(--nf-lh-caption);
          color: var(--nf-color-text-heading);
      }
      .masina-footer .masina-footer__legal {
          list-style: none;
          margin: 0;
          padding: 0;
          display: flex;
          align-items: center;
          flex-wrap: wrap;
          gap: var(--nf-space-32);
      }
      .masina-footer .masina-footer__legal a {
          font-family: var(--nf-font-ui);
          font-weight: var(--nf-fw-medium);
          font-size: var(--nf-fs-caption);
          line-height: var(--nf-lh-caption);
          color: var(--nf-color-text-heading);
          text-decoration: none;
      }
      .masina-footer .masina-footer__legal a:hover,
      .masina-footer .masina-footer__legal a:focus-visible {
          color: var(--nf-color-brand-primary);
      }

      /* --- TABLET: cats+social top, newsletter full-width below --- */
      @media (max-width: 1024px) {
          .masina-footer .masina-footer__cols {
              grid-template-columns: 1fr 1fr;
              grid-template-areas:
                  "cats social"
                  "news news";
              gap: var(--nf-space-48) var(--nf-space-40);
          }
      }

      /* --- MOBILE: single column; CTA full-width; bottom centers, legal UPPER 2-up --- */
      @media (max-width: 767px) {
          .masina-footer .masina-footer__inner {
              padding-block: var(--nf-space-48) var(--nf-space-40);
              gap: var(--nf-space-48);
          }
          .masina-footer .masina-footer__cols {
              grid-template-columns: 1fr;
              grid-template-areas:
                  "cats"
                  "social"
                  "news";
              gap: var(--nf-space-40);
          }
          .masina-footer .masina-footer__cta {
              width: 100%;
              justify-content: center;
          }
          .masina-footer .masina-footer__bottom {
              flex-direction: column;
              align-items: center;
              text-align: center;
              gap: var(--nf-space-24);
          }
          .masina-footer .masina-footer__copy {
              text-align: center;
          }
          .masina-footer .masina-footer__legal {
              justify-content: center;
              gap: var(--nf-space-24) var(--nf-space-32);
          }
          .masina-footer .masina-footer__legal a {
              font-weight: var(--nf-fw-bold);
              font-size: var(--nf-fs-label-base);
              letter-spacing: var(--nf-track-label-base);
              text-transform: uppercase;
          }
      }

      /* ============================================================
         4.7  SINGLE POST — Vesti (D5)   [consolidated]

         Two related rules live OUTSIDE this section (don't move them here):
           · §3  .entry-content p           → add  font-weight: var(--nf-fw-medium);
           · §6  .tags-links a (tag block)  → add  text-underline-offset: 0.3em;
         §6 loads after §4.7, so a tag underline-offset placed here would lose to
         §6's shared 0.18em on .tags-links a. Keep it in §6, after that rule.
      ============================================================ */

      /* --- Layout shell --------------------------------------- */
      .masina-single {
          --_main: 734px;
          --_aside: 296px;
          --_gap: var(--nf-space-40);
          box-sizing: border-box;
          /* Same shape as every other container, capped at the article+aside
             block rather than at --nf-content-max. Below the cap the element is
             viewport-width and the gutter IS the padding, so its left edge
             tracks the header exactly; above it, it centres — which is how the
             Vest frame draws it (block ~1050 at ~189 in 1440).
             Replaces the Block A pin: padding no longer participates. */
          width: min(
              100% - (2 * var(--nf-gutter)),
              calc(var(--_main) + var(--_aside) + var(--_gap))
          );
          max-width: none;
          padding-inline: 0;
          margin-inline: auto;
      }
      @media (min-width: 768px) {
          .masina-single {
              --_pad: 2rem; /* .masina-single pinned to its pre-migration value: its max-width feeds the
                 1134 fluid-type anchor, and the article-column alignment is still open
                 with the designer (answer 5). Do not let it read the clamp until both
                 are settled. */
          }
      }

      /* --- Column structure ----------------------------------- */
      /* Tablet (768–1024): one column, order main → Srodni → Najnovije.
         Mobile (≤767): header/cols/main collapse to display:contents (mobile block
         below) so every leaf shares one flex context and `order` can drop the lead
         below the hero without duplicating the ACF field. Desktop (≥1025): grid. */
      .masina-single__cols {
          display: flex;
          flex-direction: column;
      }
      .masina-single__main {
          order: 1;
      }
      .masina-single__related {
          order: 2;
      }
      .masina-single__aside {
          order: 3;
      }
      /*  Aside is a fixed track, not minmax: with both flexible the sidebar
        shrinks to ~226px at 900 and breaks the 300px ad slot. The article
        column takes the squeeze instead (489 at 900, 603 at 1024, 734 from
        ~1170 up).*/
      @media (min-width: 900px) {
          .masina-single__cols {
              display: grid;
              grid-template-columns: minmax(0, var(--_main)) var(--_aside);
              column-gap: var(--_gap);
              align-items: start;
              border-top: var(--nf-bw-thin) solid var(--nf-border-default);
              padding-top: var(--nf-space-16);
          }
          .masina-single__main {
              grid-column: 1;
              grid-row: 1;
          }
          .masina-single__aside {
              grid-column: 2;
              grid-row: 1;
              position: sticky;
              top: 11rem;
          }
          .masina-single__related {
              grid-column: 1;
              grid-row: 2;
          }
      }

      /* --- Meta row (cat = §6 red · | · Dates) ---------------- */
      /* One wrapping flex line for the whole row. .cat-links is display:contents so
         its <a>s and its inline .masina-single__sep spans become items of the meta
         row itself. Without it the category list is a SINGLE flex item: it wraps
         internally, and the trailing sep + date get parked beside that block at its
         first baseline instead of continuing after the last category (visible on
         mobile at 3+ categories). Scoped to __meta — card/related/live .cat-links
         keep their own box. Row gap eye-tuned; the 8px column gap reads loose
         between stacked meta lines. */
      .masina-single__meta {
          display: flex;
          flex-wrap: wrap;
          align-items: baseline;
          gap: var(--nf-space-4) var(--nf-space-8);
          margin-bottom: var(--nf-space-16);
      }
      .masina-single__meta .cat-links {
          display: contents;
      }
      .masina-single__meta .cat-links a {
          font-family: var(--nf-font-ui);
          font-size: var(--nf-fs-label-base);
          font-weight: var(--nf-fw-bold);
          line-height: var(--nf-lh-label-base);
          letter-spacing: var(--nf-track-label-base);
          text-transform: uppercase;
      }
      .masina-single__sep::before {
          content: "|";
          color: var(--nf-color-text-quote);
      }
      .masina-single__date {
          font-family: var(--nf-font-ui);
          font-size: var(--nf-fs-dates);
          line-height: var(--nf-lh-dates);
          letter-spacing: var(--nf-track-dates);
      }
      :root .masina-single__date {
          color: #9a9a9a; /* #3 lighter grey — interim, confirm hex (AA: open dec. #1) */
          text-transform: uppercase;
      }

      /* --- Title --------------------------------------------- */
      .masina-single__title {
          font-size: var(--nf-fs-h1-article-large);
          line-height: var(--nf-lh-h1-article-large);
          letter-spacing: var(--nf-track-h1-article-large);
          font-weight: var(--nf-fw-semibold);
          margin: 0 0 var(--nf-space-16);
      }

      /* --- Lead / podnaslov ---------------------------------- */
      /* max-width in ch, not --_main: capping at the article column reopens the
         right-hand gap this revision exists to close (tested 2026-08-05). ch tracks
         the fluid --nf-fs-lead, so the measure holds a constant character count
         across breakpoints, and goes inert below ~1000px where the container is
         already narrower. ~78 real characters in Zilla. Designer-approved value. */
      .masina-single__lead {
          font-size: var(--nf-fs-lead);
          line-height: var(--nf-lh-lead);
          font-weight: var(--nf-fw-medium);
          color: var(--nf-color-text-heading);
          max-width: 67ch;
          margin: 0 0 var(--nf-space-20);
      }
      /* --- Byline -------------------------------------------- */
      .masina-single__byline {
          font-size: var(--nf-fs-author);
          line-height: var(--nf-lh-author);
          font-weight: var(--nf-fw-semibold);
          color: var(--nf-color-text-quote);
          margin-bottom: var(--nf-space-24);
      }
      .masina-single__byline .author.url.fn {
          text-decoration: none; /* no underline per screenshots */
      }

      /* --- Featured hero ------------------------------------- */
      .masina-single__hero {
          margin: 0 0 var(--nf-space-32);
      }
      .masina-single__heroimg {
          margin: 0;
      }
      .masina-single__heroimg img {
          display: block;
          width: 100%;
          height: auto; /* natural ratio — crop removed 2026-07-18 (designer) */
      }
      .masina-single__herofoot {
          display: flex;
          align-items: center; /* Podeli centers with caption */
          justify-content: space-between;
          align-content: center;
          gap: var(--nf-space-16);
          padding-block: var(--nf-space-16);
          /* caption hairline — all breakpoints; sits on the hero band so it renders
             directly under the caption/share row everywhere */
          border-bottom: var(--nf-bw-thin) solid var(--nf-border-default);
      }
      /* Podeli stays pinned right when the caption is empty (lone flex child
         under space-between would otherwise sit left — e.g. Video posts). */
      .masina-single__herofoot > :last-child {
          margin-left: auto;
      }
      .featured-caption {
          font-style: italic;
          font-size: var(--nf-fs-body-base);
          color: var(--nf-color-text-quote);
          text-align: left;
      }

      /* --- Drop Cap Style ------------- */

      :root .masina-single .entry-content > p:first-of-type::first-letter,
      .has-drop-cap:not(:focus)::first-letter {
          font-size: 3.05em;   /* = 64px at the 21px article body */
          font-weight: 500;
          float: left;
          line-height: 0.8;
          margin-right: 0.25em;
      }


      /* --- In-body subheads (H2 per screenshots) ------------- */
      .entry-content h2 {
          font-size: var(--nf-fs-h2);
          line-height: var(--nf-lh-h2);
          letter-spacing: var(--nf-track-h2);
          font-weight: var(--nf-fw-semibold);
          margin: var(--nf-space-40) 0 var(--nf-space-16);
      }

      /* --- Article body rhythm (embeds lacked the margin images have) --- */
      .entry-content > *:not([class*="align"]) {
          margin-block: 0;
      }
      .entry-content > *:not([class*="align"]) + *:not([class*="align"]) {
          margin-block-start: var(--nf-space-24);
      }
      .entry-content > [class*="align"] {
          margin-block: var(--nf-space-24);
      }

      /* --- Tags row ------------------------------------------ */
      /* Bracketed by hairlines top + bottom. Podeli aligns to the LAST tag row when
         tags wrap (last baseline). Tags ride the dedicated fluid token (16→18px). */
      .masina-single__tagsrow {
          display: flex;
          align-items: last baseline;
          justify-content: space-between;
          gap: var(--nf-space-24);
          margin-top: var(--nf-space-40);
          padding-top: var(--nf-space-32);
          padding-bottom: var(--nf-space-32);
          border-top: var(--nf-bw-thin) solid var(--nf-border-default);
          border-bottom: var(--nf-bw-thin) solid var(--nf-border-default);
      }
      /* GP out-specifies plain .tags-links (0,1,0). Scope + :root → (0,3,0). */
      :root .masina-single__tagsrow .tags-links {
          display: flex;
          flex-wrap: wrap;
          align-items: baseline;
          gap: var(--nf-space-8) var(--nf-space-16);
          font-family: var(--nf-font-display);
      }
      .tags-links a {
          font-size: var(--nf-fs-tags);
          line-height: var(--nf-lh-tags);
          font-weight: var(--nf-fw-bold);
          /* red underline + its 0.3em offset live in §6 (loads after this section) */
      }

      /* --- Share pill (visual only until the share thread) --- */
      .masina-single__sharebtn {
          display: inline-flex;
          align-items: center;
          gap: var(--nf-space-8);
          font-family: var(--nf-font-ui);
          font-size: var(--nf-fs-button);
          font-weight: var(--nf-fw-medium);
          line-height: var(--nf-lh-button);
          letter-spacing: var(--nf-track-button);
          color: var(--nf-color-text-heading);
          background: transparent;
          border: var(--nf-bw-thin) solid var(--nf-border-default);
          border-radius: var(--nf-radius-pill);
          padding: var(--nf-space-8) var(--nf-space-16);
          cursor: pointer;
      }
      .masina-single__sharebtn:hover,
      .masina-single__sharebtn:focus-visible {
          border-color: var(--nf-color-text-quote);
      }
      .masina-single__sharebtn svg {
          flex: none;
      }

      /* Analiza single — category chain blue. tag-analiza comes from post_class()
         on the loop wrapper (an ancestor of .masina-single, NOT on it). Scoped to
         __meta so Najnovije/Srodni cards under the same wrapper stay red.
         (0,3,1) beats §6 html.light-mode .cat-links a (0,2,2) on specificity.
         blue-soft does not flip in dark; #4491b7 carries over at 5.4:1. */
      .tag-analiza .masina-single__meta .cat-links a,
      .tag-analiza .masina-single__meta .cat-links a:hover,
      .tag-analiza .masina-single__meta .cat-links a:focus-visible {
          color: var(--nf-color-brand-blue-soft);
      }

      /* --- Mobile (≤767) ------------------------------------- */
      /* Flatten the two DOM branches (header vs cols>main) into one flex context so
         the lead moves below the hero. Final order:
         meta → H1 → byline → hero → lead → body → tags → Srodni → Najnovije. */
      @media (max-width: 767px) {
          .masina-single {
              display: flex;
              flex-direction: column;
          }
          .masina-single__header,
          .masina-single__cols,
          .masina-single__main {
              display: contents;
          }

          .masina-single__meta {
              order: 1;
          }
          .masina-single__title {
              order: 2;
          }
          .masina-single__byline {
              order: 3;
          }
          .masina-single__hero {
              order: 4;
              margin-bottom: var(--nf-space-20);
          }
          .masina-single__lead {
              order: 5;
              margin: 0 0 var(--nf-space-16);
              padding-bottom: var(--nf-space-20);
              border-bottom: var(--nf-bw-thin) solid var(--nf-border-default);
          }
          :root .masina-single .entry-content {
              order: 6;
              margin-top: 0;
          }
          .masina-single__tagsrow {
              order: 7;
              gap: var(--nf-space-16);
          }
          .masina-single__related {
              order: 8;
          }
          .masina-single__aside {
              order: 9;
          }

          /* Podeli stays top-right of the last tag row; tags wrap on the left */
          .masina-single__tagsrow .tags-links {
              flex: 1 1 auto;
              min-width: 0;
          }
          .masina-single__tagsrow .masina-single__sharebtn {
              flex: 0 0 auto;
          }

          .featured-caption {
              font-size: var(--nf-fs-caption);
          }
      }

      /* ============================================================
         4.8  LIST MODULE — Najnovije (D5, sidebar column)   [consolidated]
         Container-query-first. Separators = border-top on each card
         (immune to GB's per-item wrapper; first card's top = under-head line).

         Includes the ANALIZA/STAV card variant. The card styles itself from its
         own content: masina_lead_category_cb emits .masina-flag--{slug} in place
         of the category link when the post carries the tag, and :has() drives the
         rest. Every loop on the site inherits this — NO per-loop query changes.
      ============================================================ */

      .masina-najnovije {
          container-type: inline-size;
          container-name: najnovije;
      }

      /* --- Section head — shared Najnovije + Srodni ------------ */
      .masina-najnovije__head,
      .masina-related__head {
          display: flex;
          align-items: center;
          font-family: var(--nf-font-ui);
          font-size: var(--nf-fs-section-name);
          line-height: var(--nf-lh-section-name);
          font-weight: var(--nf-fw-semibold);
          color: var(--nf-color-text-heading);
          margin: 0;
          padding-bottom: var(--nf-space-16);
      }
      /* Brand diaeresis dots (masked SVG — crisp, flips via background-color) */
      .masina-najnovije__head::after,
      .masina-related__head::after {
          content: "";
          margin-left: auto;
          width: 1.15em;
          height: 0.5em;
          background-color: var(--nf-color-brand-primary);
          -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 19 8'%3E%3Ccircle cx='4' cy='4' r='4'/%3E%3Ccircle cx='15' cy='4' r='4'/%3E%3C/svg%3E")
              center / contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 19 8'%3E%3Ccircle cx='4' cy='4' r='4'/%3E%3Ccircle cx='15' cy='4' r='4'/%3E%3C/svg%3E")
              center / contain no-repeat;
      }
      /* Desktop: Srodni's wide head puts dots beside the title; Najnovije keeps
         them far-right in the 296px sidebar (margin-left:auto above). */
      @media (min-width: 1025px) {
          .masina-related__head::after {
              margin-left: var(--nf-space-12);
          }
      }
      @media (max-width: 1025px) {
          .masina-najnovije__head {
              padding-top: var(--nf-space-20);
          }
      }

      /* --- List / looper -------------------------------------- */
      /* 1 col; 2×2 only when the aside goes full-width (tablet).
         Grid + meta-pin on the LOOPER; __list stays a plain block. */
      .masina-najnovije__list {
          display: block;
      }
      .masina-najnovije__loop {
          display: grid;
          grid-template-columns: 1fr;
      }
      @container najnovije (min-width: 34rem) {
          .masina-najnovije__loop {
              grid-template-columns: 1fr 1fr;
              column-gap: var(--nf-space-32);
          }
          .masina-najnovije__loop > * {
              display: flex; /* the loop-item wrapper becomes a column… */
              flex-direction: column;
          }
          .masina-najnovije .masina-card {
              display: flex;
              flex-direction: column;
              height: 100%; /* …so the card can fill the grid cell's height */
          }
          .masina-najnovije .masina-card__meta {
              margin-top: auto; /* meta sinks to the bottom */
          }
      }
      /* Last card bottom border */
      @media (min-width: 1025px) {
          .masina-najnovije__loop:last-child {
              border-bottom: var(--nf-bw-thin) solid var(--nf-border-default);
          }
      }

      /* --- Card ----------------------------------------------- */
      /* border-top gives between-item lines + the under-head divider */
      .masina-najnovije .masina-card {
          padding-block: var(--nf-space-16);
          border-top: var(--nf-bw-thin) solid var(--nf-border-default);
      }
      .masina-card__title {
          font-family: var(--nf-font-display);
          font-size: var(--nf-fs-h4);
          line-height: var(--nf-lh-h4);
          font-weight: var(--nf-fw-semibold);
          margin: 0 0 var(--nf-space-8);
      }
      /* Title link fills the heading box. Inline anchors only take hover over the
         font content area, so the leading between lines (18px font in 25px LH) is
         dead space → hover drops out between lines. Applies to all card loops. */
      .masina-card__title a {
          display: block;
      }
      .masina-card__meta {
          display: flex;
          align-items: baseline;
          gap: var(--nf-space-8);
      }
      .masina-najnovije .cat-links a {
          font-family: var(--nf-font-ui);
          font-size: var(--nf-fs-label-category);
          font-weight: var(--nf-fw-bold);
          letter-spacing: var(--nf-track-label-category);
          text-transform: uppercase;
      }
      .masina-card__date {
          font-family: var(--nf-font-ui);
          font-size: var(--nf-fs-dates);
          line-height: var(--nf-lh-dates);
          letter-spacing: var(--nf-track-dates);
      }
      :root .masina-card__date {
          color: #9a9a9a;
      } /* interim — matches the single meta date; AA open decision #1 */
      .masina-card__date::before {
          content: "|";
          margin-inline-end: var(--nf-space-8);
          color: var(--nf-color-text-quote);
      }

      /* Flagged cards carry dots after the category, so the date's "|" reads as a second separator. Both meta containers, all loops. */
      .masina-card__meta:has([class*="masina-flag--"]) .masina-card__date::before,
      .masina-card__label:has([class*="masina-flag--"]) .masina-card__date::before {
          content: none;
      }

      .masina-flag--blog-uzivo.is-live::before {
          animation: nf-blink 1.6s ease-in-out infinite; /* TUNE */
      }
      @media (prefers-reduced-motion: reduce) {
          .masina-flag--blog-uzivo.is-live::before {
              animation: none;
          }
      }

      /* --- ANALIZA / STAV card variant ------------------------ */
      /* Flag label — blue in ALL loops (Najnovije, Srodni, home cards, archives).
         (0,3,1) clears §6's html.light-mode/.dark-mode .cat-links a at (0,2,2),
         so it holds in both modes; blue-soft does not flip in dark; #4491b7 carries over at 5.4:1. */
      :root .cat-links a.masina-flag--analiza,
      :root .cat-links a.masina-flag--analiza:hover,
      :root .cat-links a.masina-flag--analiza:focus-visible {
          color: var(--nf-color-brand-blue-soft);
      }

      /* Flag = text + dots on one centred line. inline-flex, NOT vertical-align:
         middle — that aligns to x-height and sits visibly low under uppercase text
         (and drifts as the dot box grows). Baseline with the date still holds:
         an inline-flex box reports the baseline of its first item (the text). */
      .masina-flag--analiza {
          display: inline-flex;
          align-items: center;
          gap: 0.5em;
      }
      /* Blue dots — same masked SVG as the section heads, recoloured. */
      .masina-flag--analiza::after {
          content: "";
          flex: none;
          width: 1.75em;
          height: 1em;
          background-color: var(--nf-color-brand-blue-soft);
          -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 19 8'%3E%3Ccircle cx='4' cy='4' r='4'/%3E%3Ccircle cx='15' cy='4' r='4'/%3E%3C/svg%3E")
              center / contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 19 8'%3E%3Ccircle cx='4' cy='4' r='4'/%3E%3Ccircle cx='15' cy='4' r='4'/%3E%3C/svg%3E")
              center / contain no-repeat;
      }

      /* Blue rule — Najnovije only. Full card height (separator to separator).
         A pseudo-element rather than border-left, so it doesn't corner-join with
         the card's border-top separator. */
      .masina-najnovije .masina-card:has(.masina-flag--analiza) {
          position: relative;
          padding-left: var(--nf-space-16);
      }
      .masina-najnovije .masina-card:has(.masina-flag--analiza)::before {
          content: "";
          position: absolute;
          left: 0;
          top: var(--nf-space-16); /* = .masina-card padding-block → stops short */
          bottom: var(--nf-space-16); /*   of both hairlines, spans title→meta      */
          width: 3px;
          background: var(--nf-color-brand-blue-soft);
      }

      /* Stav flag — red dots, same two-dot mask. Category keeps brand red. */
      .masina-flag--stav {
          display: inline-flex;
          align-items: center;
          gap: 0.5em;
      }
      .masina-flag--stav::after {
          content: "";
          flex: none;
          width: 1.75em;
          height: 1em;
          background-color: var(--nf-color-brand-primary);
          -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 19 8'%3E%3Ccircle cx='4' cy='4' r='4'/%3E%3Ccircle cx='15' cy='4' r='4'/%3E%3C/svg%3E")
              center / contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 19 8'%3E%3Ccircle cx='4' cy='4' r='4'/%3E%3Ccircle cx='15' cy='4' r='4'/%3E%3C/svg%3E")
              center / contain no-repeat;
      }

      /* Blog uživo flag — pair + offset single, matching the archive title band.
         Split across two pseudo-elements so the last dot can animate alone: ::after carries the static pair, ::before the single, pushed to the end with order. A true three-dot wave would need real elements in the markup — the callback would have to emit them.
         The dot is static by default and animates only under .is-live, which masina-live-blog.js adds when the post is inside the freshness window.
         Client-side by design: a PHP freshness test would be frozen into page-cached HTML and keep blinking after the window closed. */
      .masina-flag--blog-uzivo {
          display: inline-flex;
          align-items: center;
          gap: 0.5em;
      }
      .masina-flag--blog-uzivo::after {
          content: "";
          flex: none;
          order: 2;
          width: 1.75em; /* viewBox 19x8 — same pair as Analiza/Stav */
          height: 1em;
          background-color: var(--nf-color-brand-primary);
          -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 19 8'%3E%3Ccircle cx='4' cy='4' r='4'/%3E%3Ccircle cx='15' cy='4' r='4'/%3E%3C/svg%3E")
              center / contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 19 8'%3E%3Ccircle cx='4' cy='4' r='4'/%3E%3Ccircle cx='15' cy='4' r='4'/%3E%3C/svg%3E")
              center / contain no-repeat;
      }
      .masina-flag--blog-uzivo::before {
          content: "";
          flex: none;
          order: 3;
          width: .75em;
          height: .75em;
      /* + the 0.5em flex gap = clearance to the pair. TUNE */
          margin-inline-start: 0.35em;
          border-radius: 50%;
          background-color: var(--nf-color-brand-primary);
      }
      @keyframes nf-blink {
          50% {
              opacity: 0.15;
          }
      }

      /* ============================================================
         4.9  LIST MODULE — Srodni članci (related, main column)   [consolidated]
         Container-query-first:
         • narrow  → vertical card, horizontal scroll, excerpt hidden, 6 cards
         • ≥34rem  → horizontal card (image | body), stacked, excerpt, 3 cards
         Reuses §4.8 .masina-card__* globals + the shared head/dots (§4.8).
         Layout on the LOOPER (its children are the loop-items).

         ⚠ Query fetches 6 posts; the wide state hides items 4–6 in CSS. The count
         is a server-side arg and cannot vary by breakpoint.
      ============================================================ */

      .masina-related {
          container-type: inline-size;
          container-name: related;
      }

      /* Section head — symmetric band (the shared §4.8 rule gives padding-bottom
         only, and this head sits directly under the tags-row hairline). */
      .masina-related__head {
          padding-top: var(--nf-space-24);
          padding-bottom: var(--nf-space-4);
      }

      /* --- Looper = layout owner ------------------------------ */
      /* Narrow default: horizontal scroll. Scrollbar is token-driven → flips in
         dark for free. NOTE: padding-bottom lives HERE, before the @container that
         zeroes it — container queries add no specificity, so a later unscoped rule
         would win and put a phantom 16px gap under the wide layout. */
      .masina-related__loop {
          display: flex;
          gap: var(--nf-space-24);
          overflow-x: auto;
          scroll-snap-type: x mandatory;
          -webkit-overflow-scrolling: touch;
          padding-bottom: var(--nf-space-16);
          scrollbar-width: thin;
          scrollbar-color: var(--nf-color-brand-primary) var(--nf-border-default);
      }
      .masina-related__loop::-webkit-scrollbar {
          height: 6px;
      }
      .masina-related__loop::-webkit-scrollbar-track {
          background: var(--nf-border-default);
      }
      .masina-related__loop::-webkit-scrollbar-thumb {
          background: var(--nf-color-brand-primary);
          border-radius: var(--nf-radius-pill);
      }
      .masina-related__loop > * {
          flex: 0 0 82%;
          max-width: 320px;
          scroll-snap-align: start;
      }

      /* --- Card — narrow default: vertical (image top), no excerpt --- */
      .masina-card--related {
          display: block;
      }
      .masina-card__media {
          display: block;
          margin: 0;
      }
      .masina-card__media img {
          display: block;
          width: 100%;
          aspect-ratio: 8 / 5;
          object-fit: cover;
      }
      .masina-card--related .masina-card__body {
          display: flex;
          flex-direction: column;
          height: 100%;
          padding-top: var(--nf-space-12);
      }
      .masina-card--related .masina-card__meta {
          margin-top: auto; /* pin to bottom (see OPEN A/B in the handover) */
      }
      .masina-card__excerpt {
          display: none;
      }

      /* Title → Alternative-Card-Title (overrides §4.8 h4).
         Negative margin-top cancels the line box's top half-leading so the optical
         gap above the title matches the padding below it. */
      .masina-related .masina-card__title {
          font-size: var(--nf-fs-alt-card-title);
          line-height: var(--nf-lh-alt-card-title);
          margin-top: calc((1 - var(--nf-lh-alt-card-title)) * 0.5em);
      }

      /* Category → Label/Category (§4.8's sizing is najnovije-scoped) */
      .masina-related .cat-links a {
          font-family: var(--nf-font-ui);
          font-size: var(--nf-fs-label-category);
          font-weight: var(--nf-fw-bold);
          letter-spacing: var(--nf-track-label-category);
          text-transform: uppercase;
      }

      /* --- Wide container (≥34rem): horizontal card, excerpt shown --- */
      @container related (min-width: 34rem) {
          .masina-related__loop {
              display: block;
              overflow: visible;
              padding-bottom: 0;
          }
          .masina-related__loop > * {
              flex: none;
              max-width: none;
              padding-block: var(--nf-space-24);
          }
          .masina-related__loop > * + * {
              border-top: var(--nf-bw-thin) solid var(--nf-border-default);
          }
          /* the slider shows all 6; stacked layout shows 3 */
          .masina-related__loop > *:nth-child(n + 4) {
              display: none;
          }

          /* align-items: stretch (not start) + the image-fill rules below let the
             image grow to the body's height. Kills the dead space under short
             images when a title runs to 4 lines — no truncation, even spacing.
             ⚠ Consequence: image aspect ratio now VARIES per card. Flagged to the
             designer (open decision). */
          .masina-card--related {
              display: grid;
              grid-template-columns: 1fr 1fr; /* bias 1.1fr 1fr for a wider image */
              gap: var(--nf-space-24);
              align-items: stretch;
          }
          /* Bottom-align the meta with the image edge. The label's line box carries
                 the font's descent below the last baseline; the image ends on a hard
                 edge. Pull the descent off so the two bottoms read level. Wide state
                 only — the slider has no image edge to align to. */
          .masina-card--related .masina-card__meta {
                  line-height: 1;
                  margin-bottom: -0.18em; /* TUNE: Rethink Sans descent */
              }

          .masina-card--related .masina-card__body {
              padding-top: 0;
          }
          .masina-card__excerpt {
              display: -webkit-box;
              -webkit-line-clamp: 3;
              -webkit-box-orient: vertical;
              overflow: hidden;
              margin: var(--nf-space-8) 0 var(--nf-space-12);
              font-size: var(--nf-fs-body-base);
              line-height: var(--nf-lh-body-base);
              color: var(--nf-color-text-heading);
          }
      }

      /* slider state only — the narrow head is a lone line and reads top-heavy */
      @container related (max-width: 34rem) {
          .masina-related__head {
              padding-top: var(--nf-space-16);
              padding-bottom: var(--nf-space-16);
          }
      }

      /* ============================================================
         4.10  SHARE PANEL — single post ([masina_share])

         Popover, not a modal: no focus trap. Behaviour (toggle / Escape /
         click-away / focus-return / copy / navigator.share) lives in the
         FluentSnippets JS on wp_footer (priority 20).
      ============================================================ */

      /* CRITICAL: [hidden] is only a UA display:none — any author `display` rule on
         the panel beats it and the panel renders open. This must stay. */
      .masina-share__panel[hidden] {
          display: none;
      }

      .masina-share {
          position: relative;
          display: inline-block;
      }

      /* the flex child in herofoot/tagsrow is .masina-share (the wrapper), not the
         button — the shortcode brings its own wrapper */
      .masina-single__herofoot .masina-share,
      .masina-single__tagsrow .masina-share {
          flex: 0 0 auto;
      }

      /* --- Panel --------------------------------------------- */
      /* Absolutely positioned: an `overflow: hidden/auto` on any ancestor will clip
         it (and its shadow) — same trap that ate the header dropdown's box-shadow. */
      .masina-share__panel {
          position: absolute;
          top: calc(100% + var(--nf-space-8));
          right: 0;
          z-index: 30;
          min-width: 220px;
          padding: var(--nf-space-8) var(--nf-space-16);
          background: var(--nf-surface-page);
          border: var(--nf-bw-thin) solid var(--nf-border-default);
          box-shadow: var(--nf-shadow-dropdown);
      }
      .masina-share__list {
          list-style: none;
          margin: 0;
          padding: 0;
      }
      .masina-share__list > li + li {
          border-top: var(--nf-bw-thin) solid var(--nf-border-default);
      }

      /* --- Rows (footer-social styling: Zilla italic) --------- */
      .masina-share__link {
          display: flex;
          align-items: center;
          justify-content: space-between;
          gap: var(--nf-space-16);
          width: 100%;
          padding: var(--nf-space-12) 0;
          font-family: var(--nf-font-display);
          font-style: italic;
          font-weight: var(--nf-fw-regular);
          font-size: var(--nf-fs-footer-social);
          line-height: var(--nf-lh-footer-social);
          color: var(--nf-color-text-heading);
          text-align: left;
          text-decoration: none;
          background: none;
          border: 0;
          cursor: pointer;
      }
      .masina-share__link:hover,
      .masina-share__link:focus-visible {
          color: var(--nf-color-brand-primary);
      }

      /* --- Outbound arrow (anchors only; buttons carry no arrow) --- */
      /* mirrors .masina-footer__ext-icon — same SVG, same 14px/stroke treatment */
      .masina-share__ext-icon {
          display: inline-flex;
          flex-shrink: 0;
          color: inherit;
      }
      .masina-share__ext-icon svg {
          width: 14px;
          height: 14px;
          display: block;
          stroke: currentColor;
      }

      /* --- Button rows (Aplikacije… / Kopiraj link) ----------- */
      /* GP declares its own button styling and out-specifies the plain
         .masina-share__link rule above — the <a> rows are fine, only the <button>
         rows break. Confirmed GP-owned here: background, font-family, font-weight,
         font-size, line-height. If another property looks wrong on THESE TWO ROWS
         ONLY, add it to this reset rather than hunting elsewhere.
         ⚠ Do not remove the :root prefix — it is what wins the tie. */
      :root .masina-share__list button.masina-share__link,
      :root .masina-share__list button.masina-share__link:hover,
      :root .masina-share__list button.masina-share__link:focus,
      :root .masina-share__list button.masina-share__link:focus-visible,
      :root .masina-share__list button.masina-share__link:active {
          background: none;
          background-color: transparent;
          border: 0;
          box-shadow: none;
          font-family: var(--nf-font-display);
          font-style: italic;
          font-weight: var(--nf-fw-regular);
          font-size: var(--nf-fs-footer-social);
          line-height: var(--nf-lh-footer-social);
          padding: var(--nf-space-12) 0;
      }
      :root .masina-share__list button.masina-share__link {
          color: var(--nf-color-text-heading);
      }
      :root .masina-share__list button.masina-share__link:hover,
      :root .masina-share__list button.masina-share__link:focus-visible {
          color: var(--nf-color-brand-primary);
      }

      /* Buttons can't inherit §6's `html body a:hover` underline (they aren't <a>),
         so it's declared here to match the six anchor rows. Values mirror §6's
         global hover exactly — if §6 changes, change these with it.
         ⚠ INTERIM: designer is revisiting global link hover. Revisit when settled. */
      :root .masina-share__list button.masina-share__link:hover,
      :root .masina-share__list button.masina-share__link:focus-visible {
          color: var(--nf-color-brand-primary);
          text-decoration-line: underline;
          text-decoration-color: var(--nf-color-brand-primary);
          text-decoration-thickness: 1px;
          text-underline-offset: 0.16em;
          text-decoration-skip-ink: auto;
      }

      /* Copied state: neutral, NOT the hover red. Must beat the :hover/:focus-visible
         rule above — the button retains hover/focus after the click. */
      :root .masina-share__list button.masina-share__copy.is-copied,
      :root .masina-share__list button.masina-share__copy.is-copied:hover,
      :root .masina-share__list button.masina-share__copy.is-copied:focus,
      :root .masina-share__list button.masina-share__copy.is-copied:focus-visible {
          color: var(--nf-color-text-primary);
      }


      /* ===== §4.11  Stav — author box (component) ===================== */
      /* [masina_author_box] — CAP coauthors: round photo, name, bio, red dots.
         Vertical stack per frame. Photo 76/99/92 (mobile/tablet/desktop). */
      .masina-author-box {
          position: relative;
      }
      .masina-author {
          display: flex;
          flex-direction: column;
          gap: var(--nf-space-12);
      }
      .masina-author + .masina-author {
          margin-top: var(--nf-space-16);
      }
      .masina-author__text {
          min-width: 0; /* long bios wrap instead of overflowing */
      }
      .masina-author__photo {
          flex: none;
          display: block;
          width: 76px; /* mobile base */
          height: 76px;
          border-radius: 50%;
          overflow: hidden;
      }
      .masina-author__photo img {
          display: block;
          width: 100%;
          height: 100%;
          object-fit: cover;
          border-radius: 50%;
      }
      .masina-author__name {
          display: inline-block;
          font-family: var(--nf-font-display);
          font-weight: var(--nf-fw-bold);
          font-size: 1.125rem; /* 18px flat — candidate --nf-fs-author-name (CSV) */
          line-height: 1.3;
          color: var(--nf-color-text-heading);
      }
      .masina-author__bio {
          margin: 0.25em 0 0;
          font-family: var(--nf-font-display);
          font-weight: var(--nf-fw-regular);
          font-size: var(--nf-fs-body-base);
          line-height: var(--nf-lh-body-base);
          color: var(--nf-color-text-heading);
      }
      /* Group 2 red dots — top-right, same two-dot mask as the flags. */
      .masina-author-box::after {
          content: "";
          position: absolute;
          top: 0;
          right: 0;
          width: 19px;
          height: 8px;
          background-color: var(--nf-color-brand-primary);
          -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 19 8'%3E%3Ccircle cx='4' cy='4' r='4'/%3E%3Ccircle cx='15' cy='4' r='4'/%3E%3C/svg%3E")
              center / contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 19 8'%3E%3Ccircle cx='4' cy='4' r='4'/%3E%3Ccircle cx='15' cy='4' r='4'/%3E%3C/svg%3E")
              center / contain no-repeat;
      }
      @media (min-width: 768px) and (max-width: 1024px) {
          .masina-author__photo {
              width: 99px;
              height: 99px;
          }
      }
      @media (min-width: 1025px) {
          .masina-author__photo {
              width: 92px;
              height: 92px;
          }
      }

      /* ===== §4.12  Stav — sidebar placement (author box + Najnovije) == */
      /* Box + Najnovije share the col-2 wrapper (.masina-single__sidebar in the
         Stav template) so they stack in one sticky column, independent of the
         tall main column. Scoped to .tag-stav via post_class(). */

      /* 768–1024: single column, and __main flattened so the author box can sit
         between the hero and the body (frame 1196:1060). __main is otherwise one
         block — hero, body and tags move together and the box can't get inside.
         Also forces one column across 900–1024, where §4.7's base grid would
         otherwise apply; Stav's two-column layout starts at 1025. */
      @media (min-width: 768px) and (max-width: 1024px) {
	   :root .tag-stav .masina-author {
              flex-direction: row;
              align-items: flex-start;
              gap: var(--nf-space-20);
          }
          .tag-stav .masina-single__cols {
              display: flex;
              flex-direction: column;
          }
          .tag-stav .masina-single__main,
          .tag-stav .masina-single__sidebar {
              display: contents;
          }
          .tag-stav .masina-single__hero {
              order: 1;
          }
          .tag-stav .masina-author-box {
              order: 2;
			  margin-block: var(--nf-space-24);
              padding-bottom: var(--nf-space-24);
              border-bottom: var(--nf-bw-thin) solid var(--nf-border-default);
          }
          .tag-stav .entry-content {
              order: 3;
          }
          .tag-stav .masina-single__tagsrow {
              order: 4;
          }
          .tag-stav .masina-single__related {
              order: 5;
          }
          .tag-stav .masina-single__aside {
              order: 6;
          }
	    .tag-stav .masina-single__lead {
              margin-bottom: 0;
          }
          .tag-stav .masina-author-box {
              order: 2;
              margin-block: 0;
              padding-block: var(--nf-space-24);
              border-bottom: var(--nf-bw-thin) solid var(--nf-border-default);
          }
          .tag-stav .masina-author-box::after {
              top: var(--nf-space-24);
          }
	.tag-stav .masina-single__hero {
              margin-bottom: 0;
          }
      }
      /* ≥1025: wrapper is col-2, stretched to full row height (grid has
         align-items:start, so without stretch the aside has no room to
         travel). Author box scrolls away; Najnovije pins via the BASE
         .masina-single__aside sticky rule — no override needed here. */
      @media (min-width: 1025px) {
          .tag-stav .masina-single__sidebar {
              grid-column: 2;
              grid-row: 1;
              align-self: stretch;
              display: flex;
              flex-direction: column;
              gap: var(--nf-space-64);
          }
          .tag-stav .masina-author-box {
              margin-block: 0;
          }
      }

      /* ≤767: base branch flattens everything (orders 1-9); sidebar wrapper must
         flatten here too, and Stav elements take slots in the BASE sequence:
         ...byline(3) → box(3, DOM-after byline) → hero(4)... → body(6) → tags(7)
         → Srodni(8) → Najnovije(9). */
      @media (max-width: 767px) {
          .tag-stav .masina-single__sidebar {
              display: contents;
          }
          .tag-stav .masina-author-box {
              order: 5;
              margin-block: 0;
              padding-block: var(--nf-space-24);
              border-bottom: var(--nf-bw-thin) solid var(--nf-border-default);
              /* entry-content's first child has no top margin (§4.7 reset), so the
                 box supplies the gap to the body itself. Not part of the symmetric
                 padding above/below the hairline. */
              margin-bottom: var(--nf-space-16);
          }
          .tag-stav .masina-author-box::after {
              top: var(--nf-space-24);
          }
          .tag-stav .masina-single__lead {
              margin-bottom: 0;
          }
      }

      /* ===== §4.13  Video single — hero embed ========================= */
      /* [masina_video_hero] fills the hero slot; LLV facade supplies its own
         16:9 sizing + play button. Only the figure margin needs normalising.
         (Width/aspect guards removed 2026-07-18 — matched LLV defaults; re-add
         if LLV markup changes.) */
      .masina-video-hero {
          margin: 0;
      }

      /* ===== §4.14  Video — play overlay on thumbnails ================ */
      /* Two paths, because only one card renderer carries post identity:
         · .gb-loop-item.category-video — archive/Home loop, post_class() on the
           loop item, card nested inside. Srodni's loop item renders as a bare
           <div class="gb-loop-item"> with NO post classes, so it cannot match here.
         · .masina-card--video — explicit marker added by snippet 79 (Srodni, via
           render_block) and by masina_hero_card() in snippet 69 (hero).
         ⚠ Do NOT revert to `article.category-video ...` — post_class() also puts
         category-video on the SINGLE's own <article>, which wraps the Srodni
         module, lighting every related card regardless of its own category.
         Triangle = masked SVG, recolours via token (dark-mode-correct).
         box-shadow doesn't work on masked elements — drop-shadow filter. */
      :root .gb-loop-item.category-video .masina-card__media,
      :root .masina-card--video .masina-card__media {
          position: relative;
      }
      :root .gb-loop-item.category-video .masina-card__media::after,
      :root .masina-card--video .masina-card__media::after {
          content: "";
          position: absolute;
          inset: 0;
          margin: auto;
          width: 17%;
          max-width: 58px;
          aspect-ratio: 106 / 121;
          background-color: var(--nf-color-brand-primary);
          -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 106 121'%3E%3Cpath d='M0 0 L106 60.5 L0 121 Z'/%3E%3C/svg%3E")
              center / contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 106 121'%3E%3Cpath d='M0 0 L106 60.5 L0 121 Z'/%3E%3C/svg%3E")
              center / contain no-repeat;
          pointer-events: none;
          opacity: 0.7;
          filter: drop-shadow(0 0 30px rgba(0, 0, 0, 0.8));
          transition: opacity 0.2s ease;
      }
      :root .gb-loop-item.category-video:hover .masina-card__media::after,
      :root .masina-card--video:hover .masina-card__media::after {
          opacity: 1;
      }

      /* Cap is a token so large-card contexts raise it rather than each one
         hardcoding a number. Base = grid card; large contexts opt in below.
         ⚠ §4.22.4 sets max-width: 120px directly on the Video section's lead
         card — that predates this token and should be folded into it at the
         next pass rather than left as a parallel mechanism. */
      :root .gb-loop-item.category-video .masina-card__media::after,
      :root .masina-card--video .masina-card__media::after {
          max-width: var(--nf-play-cap, 58px);
      }

      /* Large-card contexts: Home hero centre + Video/category archive hero. */
      :root .masina-hero-card--centre.masina-card--video .masina-card__media,
      :root .masina-hero-card--centre .masina-card__media-slot .masina-card__media {
          --nf-play-cap: 120px;
      }

      /* GP dynamic content templates (category/tag archives) also carry
         post_class() but are not .gb-loop-item. Same per-card identity,
         different wrapper class.
         ⚠ body:not(.single) is load-bearing: GP uses dynamic-content-template
         for SINGLES too, so unscoped this matches the single's own <article>
         — which wraps the Srodni module — and lights every related card.
         Same ancestor trap as the old `article.category-video`. */
      :root body:not(.single) .dynamic-content-template.category-video .masina-card__media {
          position: relative;
      }
      :root body:not(.single) .dynamic-content-template.category-video .masina-card__media::after {
          content: "";
          position: absolute;
          inset: 0;
          margin: auto;
          width: 17%;
          max-width: var(--nf-play-cap, 58px);
          aspect-ratio: 106 / 121;
          background-color: var(--nf-color-brand-primary);
          -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 106 121'%3E%3Cpath d='M0 0 L106 60.5 L0 121 Z'/%3E%3C/svg%3E")
              center / contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 106 121'%3E%3Cpath d='M0 0 L106 60.5 L0 121 Z'/%3E%3C/svg%3E")
              center / contain no-repeat;
          pointer-events: none;
          opacity: 0.7;
          filter: drop-shadow(0 0 30px rgba(0, 0, 0, 0.8));
          transition: opacity 0.2s ease;
      }
      :root body:not(.single) .dynamic-content-template.category-video:hover .masina-card__media::after {
          opacity: 1;
      }


      /* Archive hero card — .masina-card__media-slot marks the lead card in the
         category/tag archive template. Same 120px cap as the Home hero centre. */
      :root .masina-card__media-slot .masina-card__media {
          --nf-play-cap: 120px;
      }


      /* ================= */

      /* ===== §4.15  Blog uživo — live single ========================== */
      /* Scope: .category-blog-uzivo (post_class on the loop wrapper — an
         ancestor of .masina-single, NOT body; page bg climbs via :has()).
         Snippets: entry patterns v3 + timeline/anchors/updated/embed filter
         (fluent-snippet-storage/37-blog-uzivo-timeline.php).
         Srodni removed from this template (designer, 2026-07-20).
         Open (designer batch): morebtn final treatment, 3-dot card flag,
         quote signature style, chip radius token candidate (4px literal). */

      /* --- Page frame --- */
      html body:has(.category-blog-uzivo .masina-single) {
          background-color: var(--nf-surface-warm);
      }

      /* Added in 4.15 revision 05-08-2026.  */
      .category-blog-uzivo .masina-single {
          --_lb-rail: 280px;
          --_lb-card: 700px;
          --_lb-gap: var(--nf-space-48);
      }
      @media (min-width: 1025px) {
          .category-blog-uzivo .masina-single__cols {
              grid-template-columns: var(--_lb-rail) minmax(0, var(--_lb-card));
              column-gap: var(--_lb-gap);
              /* Cap the grid at its own content width so the border-top stops
                 where the columns do — it painted 21px proud on each side. */
              max-width: calc(var(--_lb-rail) + var(--_lb-card) + var(--_lb-gap));
              margin-inline: auto;
              padding-top: var(--nf-space-48);
          }
      }

      /* --- Hero (centered on warm) --- */
      .category-blog-uzivo .masina-single__header {
          max-width: 760px;
          margin-inline: auto;
          text-align: center;
      }
      .category-blog-uzivo .masina-single__title {
          font-size: var(--nf-fs-h1-live);
          line-height: var(--nf-lh-h1-live);
          letter-spacing: var(--nf-track-h1-live);
      }
      .category-blog-uzivo .masina-single__lead {
          font-size: var(--nf-fs-body-large);
          line-height: var(--nf-lh-body-large);
      color: var(--nf-color-text-heading);
          max-width: 650px;
          margin-inline: auto;
      }

      /* :root = load-order armor; fit-content + auto margins keep the pill
         intact even if a mobile rule forces block/width on the paragraph. */
      :root .masina-live__badge {
          display: inline-flex;
          align-items: center;
          width: fit-content;
          margin-inline: auto;
          gap: var(--nf-space-8);
          font-family: var(--nf-font-ui);
          font-size: var(--nf-fs-label-base);
          font-weight: var(--nf-fw-bold);
          line-height: var(--nf-lh-label-base);
          letter-spacing: var(--nf-track-label-base);
          text-transform: uppercase;
          color: var(--nf-color-text-on-color);
          background: var(--nf-color-brand-primary);
          padding: var(--nf-space-4) var(--nf-space-12);
          border-radius: var(--nf-radius-pill);
          margin-bottom: var(--nf-space-24);
      }

      /* Three-dot motif per the frame, matching the loop-card flag (§4.8):
         static pair + a single dot that animates alone. Negative order puts both
         pseudo-elements ahead of the anonymous text run, which sits at order 0. */
      .masina-live__badge::before {
          content: "";
          flex: none;
          order: -2;
          width: 1.75em; /* viewBox 19x8 — same pair as the card flag. TUNE */
          height: 1em;
          background-color: currentColor;
          -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 19 8'%3E%3Ccircle cx='4' cy='4' r='4'/%3E%3Ccircle cx='15' cy='4' r='4'/%3E%3C/svg%3E")
              center / contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 19 8'%3E%3Ccircle cx='4' cy='4' r='4'/%3E%3Ccircle cx='15' cy='4' r='4'/%3E%3C/svg%3E")
              center / contain no-repeat;
      }
      .masina-live__badge::after {
          content: "";
          flex: none;
          order: -1;
          width: 0.75em; /* TUNE against the pair */
          height: 0.75em;
          border-radius: var(--nf-radius-circle);
          background: currentColor;
	  margin-left: .4em;
      }
      .masina-live__badge.is-live::after {
          animation: masina-live-pulse 1.5s ease-in-out infinite;
      }
      @media (prefers-reduced-motion: reduce) {
          .masina-live__badge.is-live::after {
              animation: none;
          }
      }
      @keyframes masina-live-pulse {
          0%,
          100% {
              opacity: 1;
          }
          50% {
              opacity: 0.25;
          }
      }

      .masina-live__updatedrow {
          margin-top: var(--nf-space-16);
          margin-bottom: var(--nf-space-32);
      }
      .masina-live__updated {
          display: inline-flex;
          align-items: center;
          gap: var(--nf-space-8);
          font-family: var(--nf-font-ui);
          font-size: var(--nf-fs-dates);
          line-height: var(--nf-lh-dates);
          letter-spacing: var(--nf-track-dates);
          color: var(--nf-color-text-quote);
      }
      .masina-live__updated::before,
      .masina-live-tl__head::before {
          content: "";
          width: 14px;
          height: 14px;
          flex: none;
          background-color: currentColor;
          -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14' fill='none'%3E%3Ccircle cx='7' cy='7' r='6' stroke='%23000' stroke-width='1.5'/%3E%3Cpath d='M7 3.8V7l2.3 1.4' stroke='%23000' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E")
              center / contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14' fill='none'%3E%3Ccircle cx='7' cy='7' r='6' stroke='%23000' stroke-width='1.5'/%3E%3Cpath d='M7 3.8V7l2.3 1.4' stroke='%23000' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E")
              center / contain no-repeat;
      }

      /* --- Cols: dark rule under hero (≥768; <768 it rides the rail,
         because display:contents boxes paint no borders), live grid ≥1025 --- */
      .category-blog-uzivo .masina-single__cols {
          border-top: var(--nf-bw-medium) solid var(--nf-color-text-heading);
          padding-top: var(--nf-space-32);
      }
      @media (min-width: 1025px) {
          .category-blog-uzivo .masina-single__cols {
              grid-template-columns: 280px minmax(0, 700px);
              justify-content: center;
              column-gap: var(--nf-space-48);
              padding-top: var(--nf-space-48);
          }
          /* item stretches to row height (grid is align-items:start);
             sticky rides the INNER nav → releases at the card's bottom */
          .category-blog-uzivo .masina-live__rail {
              grid-column: 1;
              grid-row: 1;
              align-self: stretch;
          }
          .category-blog-uzivo .masina-live-tl {
              position: sticky;
              top: 8rem;
          }
          .category-blog-uzivo .masina-single__main {
              grid-column: 2;
          }
      }

      /* 900–1024: §4.7's two-track grid still applies, but Blog uživo has no
         __aside — the empty 296px track pushes the rail sideways. Collapse to
         one column; the rail is already a horizontal strip here. */
      @media (min-width: 900px) and (max-width: 1024px) {
          .category-blog-uzivo .masina-single__cols {
                 grid-template-columns: minmax(0, var(--_lb-card));
                 max-width: var(--_lb-card);
                 margin-inline: auto;
          }
          .category-blog-uzivo .masina-live__rail {
                 grid-column: 1;
                 grid-row: 1;
          }
          .category-blog-uzivo .masina-single__main {
                 grid-column: 1;
                 grid-row: 2;
          }
       }

      /* --- Timeline rail --- */
      .masina-live-tl__head {
          display: flex;
          align-items: center;
          gap: var(--nf-space-8);
          font-family: var(--nf-font-ui);
          font-size: var(--nf-fs-label-base);
          font-weight: var(--nf-fw-bold);
          line-height: var(--nf-lh-label-base);
          letter-spacing: var(--nf-track-label-base);
          text-transform: uppercase;
          color: var(--nf-color-text-heading);
          margin-bottom: var(--nf-space-24);
      }
      .masina-live-tl__head::before {
          color: var(--nf-color-brand-primary);
      }
      .masina-live-tl__list {
          list-style: none;
          margin: 0;
          padding: 0;
          position: relative;
          /* Scrollbar hidden in both orientations — the fade mask carries the
             affordance. Matches .masina-nav; the Srodni slider keeps a styled
             bar instead, because it's content rather than navigation. */
          scrollbar-width: none;
      }
      .masina-live-tl__list::-webkit-scrollbar {
          display: none;
      }
      .masina-live-tl__item a {
          display: block;
          text-decoration: none;
      }
      .masina-live-tl__time {
          display: block;
          font-family: var(--nf-font-ui);
          font-size: var(--nf-fs-label-base);
          font-weight: var(--nf-fw-bold);
          letter-spacing: var(--nf-track-label-base);
          color: var(--nf-color-text-quote);
          margin-bottom: var(--nf-space-4);
      }
      .masina-live-tl__item.is-active .masina-live-tl__time {
          color: var(--nf-color-brand-primary);
      }
      .masina-live-tl__label {
          display: block;
          font-family: var(--nf-font-display);
          font-weight: var(--nf-fw-semibold);
          font-size: var(--nf-fs-author);
          line-height: var(--nf-lh-author);
          color: var(--nf-color-text-heading);
      }
      .masina-live-tl__item {
          position: relative;
      }
      .masina-live-tl__item::before {
          content: "";
          position: absolute;
          width: 10px;
          height: 10px;
          box-sizing: border-box;
          border-radius: var(--nf-radius-circle);
          background: var(--nf-color-text-heading);
          border: 2px solid var(--nf-surface-warm);
      }
      .masina-live-tl__item.is-active::before {
          background: var(--nf-color-brand-primary);
      }

      /* desktop: vertical line (per-item segments — they must scroll with
         their dots), internal scroll ≈5 entries, fade pinned to scroll box */
      @media (min-width: 1025px) {
          .masina-live-tl__list {
              padding-left: var(--nf-space-20);
              padding-right: var(--nf-space-16);
              max-height: 34rem;
              overflow-y: auto;
              padding-bottom: var(--nf-space-32);
              -webkit-mask: linear-gradient(
                  to bottom,
                  #000 calc(100% - 56px),
                  transparent
              );
              mask: linear-gradient(to bottom, #000 calc(100% - 56px), transparent);
          }
          .masina-live-tl__item + .masina-live-tl__item {
              margin-top: var(--nf-space-24);
          }
          .masina-live-tl__item::before {
              left: -20px;
              top: 4px;
              z-index: 1; /* dot above line */
          }
          .masina-live-tl__item::after {
              content: "";
              position: absolute;
              left: -16px;
              top: 6px;
              bottom: calc(-1 * var(--nf-space-24));
              width: 2px;
              background: var(--nf-border-default);
          }
          .masina-live-tl__item:last-child::after {
              bottom: 6px;
          }
      }
      /* <1025: horizontal scroll strip under hero */
      @media (max-width: 1024px) {
          .masina-live__rail {
              margin-bottom: var(--nf-space-32);
          }
          .masina-live-tl__list {
              display: flex;
              overflow-x: auto;
              -webkit-overflow-scrolling: touch;
              padding-top: var(--nf-space-16);
          }
          .masina-live-tl__item {
              flex: 0 0 auto;
              width: 240px;
              padding-right: var(--nf-space-24);
              border-top: 2px solid var(--nf-border-default);
              padding-top: var(--nf-space-16);
          }
          .masina-live-tl__item::before {
              top: -6px;
              left: 0;
          }
      }

      /* --- <768: slot live elements into the base display:contents
         reorder (unordered flex children sort at 0, before title/lead) --- */
      @media (max-width: 767px) {
          .category-blog-uzivo .masina-live__badge {
              order: 1;
          }
          /* title keeps base order:2 */
          .category-blog-uzivo .masina-single__lead {
              order: 3;
              border-bottom: 0; /* dark rail rule replaces the base hairline */
              padding-bottom: 0;
          }
          .category-blog-uzivo .masina-live__updatedrow {
              order: 4;
          }
          .category-blog-uzivo .masina-live__rail {
              order: 5;
              border-top: var(--nf-bw-medium) solid var(--nf-color-text-heading);
              padding-top: var(--nf-space-16);
          }
          .category-blog-uzivo .masina-live__card {
              order: 6;
          }
      }

      /* --- Content card --- */
      .masina-live__card {
          --_pad: var(--nf-space-40);
          position: relative;
          background: var(--nf-surface-page);
          border-top: var(--nf-bw-thick) solid var(--nf-color-brand-primary);
          box-shadow: var(--nf-shadow-subtle);
          padding: var(--nf-space-32) var(--_pad) var(--nf-space-40);
      }
      @media (max-width: 767px) {
          .masina-live__card {
              --_pad: var(--nf-space-20);
          }
      }
      .masina-live__share {
          position: absolute;
          top: var(--nf-space-32);
          right: var(--_pad);
      }
      /* deliberate design exception: no outline on Podeli here */
      .category-blog-uzivo .masina-single__sharebtn {
          border: 0;
          padding: 0;
          border-radius: 0;
      }

      /* --- Entries --- */
      /* GP's .entry-content top margin (2em ≈ 34px) pushes the first chip down
         while the absolutely-positioned Podeli stays pinned to the card padding.
         Zero it here: the card's own padding-top already provides the spacing,
         and it lets the chip and share sit on one line.
         :root prefix = (0,3,0) to clear §4.7's :root .masina-single .entry-content. */
      :root .masina-live__card .entry-content {
          margin-top: 0;
      }
      /* Match the chip's box height so the two centre against each other rather
         than aligning at their top edges (16px text vs a 24px padded chip). */
      .masina-live__share {
          display: flex;
          align-items: center;
          height: calc(
              var(--nf-fs-label-base) * var(--nf-lh-label-base) + 2 * var(--nf-space-4)
          );
      }

      .masina-live__card .entry-content > .masina-live__entry {
          padding-block: var(--nf-space-32);
      }
      .masina-live__card .entry-content > .masina-live__entry:first-child {
          padding-top: 0;
      }
      .masina-live__card .entry-content > .masina-live__entry:last-child {
          padding-bottom: 0;
      }
      .masina-live__card .masina-live__entry + .masina-live__entry {
          border-top: var(--nf-bw-thin) solid var(--nf-border-default);
      }
      .masina-live__entry[id] {
          scroll-margin-top: 9rem;
      }

      /* entry body → Body/Base (designer, 2026-07-20); direct-child
         selectors keep chips, bylines, and blockquote text out of scope */
      .masina-live__card .masina-live__content > p,
      .masina-live__card .masina-live__entry > p:not(.masina-live__time),
      .masina-live__card .wp-block-embed__wrapper > p:not(.masina-single__byline) {
          font-size: var(--nf-fs-body-base);
          line-height: var(--nf-lh-body-base);
      }

      /* card scope (0,2,0): base .entry-content p (0,1,1) outranks
         single-class rules — chip is a <p> */
      .masina-live__card .masina-live__time {
          position: relative;
          display: inline-flex;
          font-family: var(--nf-font-ui);
          font-size: var(--nf-fs-label-base);
          font-weight: var(--nf-fw-bold);
          line-height: var(--nf-lh-label-base);
          letter-spacing: var(--nf-track-label-base);
          color: var(--nf-surface-page); /* flips in dark; on-color would not */
          background: var(--nf-color-text-heading);
          padding: var(--nf-space-4) var(--nf-space-12);
          border-radius: 4px; /* no token; radius-chip (20px) too round here */
          margin: 0 0 var(--nf-space-16);
      }
      .masina-live__entry.is-latest .masina-live__time {
          background: var(--nf-color-brand-primary);
          color: var(--nf-color-text-on-color);
      }
      .masina-live__entry.is-latest .masina-live__time::after {
          content: "Najnovije";
          position: absolute;
          left: 100%;
          top: 50%;
          translate: 0 -50%;
          margin-left: var(--nf-space-12);
          color: var(--nf-color-brand-primary);
          text-transform: uppercase;
          white-space: nowrap;
      }

      .masina-live__card .masina-live__title {
          font-family: var(--nf-font-display);
          font-weight: var(--nf-fw-semibold);
          font-size: var(--nf-fs-stav-title);
          line-height: var(--nf-lh-stav-title);
          letter-spacing: var(--nf-track-stav-title);
          color: var(--nf-color-text-heading);
          margin: 0 0 var(--nf-space-16);
      }

      /* --- Embed entry parts (entry-native; iframe replaced in PHP) --- */
      .masina-live__postcard {
          margin: 0;
      }
      .masina-live__card .masina-live__embedby {
          margin: 0 0 var(--nf-space-16);
      }
      .masina-live__embedimg {
          margin: 0 0 var(--nf-space-16);
      }
      .masina-live__embedimg img {
          display: block;
          width: 100%;
          height: auto;
      }
      .masina-live__card .masina-live__embedcap {
          font-size: var(--nf-fs-caption);
          line-height: var(--nf-lh-caption);
          font-style: italic;
          color: var(--nf-color-text-quote);
          margin-top: var(--nf-space-8);
      }
      /* interim: default pill + arrow (designer batch: final treatment) */
      .masina-live__morebtn {
          display: inline-flex;
          align-items: center;
          gap: var(--nf-space-8);
          margin-top: var(--nf-space-16);
          font-family: var(--nf-font-ui);
          font-size: var(--nf-fs-button);
          font-weight: var(--nf-fw-medium);
          line-height: var(--nf-lh-button);
          letter-spacing: var(--nf-track-button);
          color: var(--nf-color-text-heading);
          border: var(--nf-bw-thin) solid var(--nf-border-default);
          border-radius: var(--nf-radius-pill);
          padding: var(--nf-space-8) var(--nf-space-16);
          text-decoration: none;
      }
      .masina-live__morebtn::after {
          content: "";
          width: 14px;
          height: 14px;
          background-color: currentColor;
          -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14' fill='none'%3E%3Cpath d='M2 7h10M8 3l4 4-4 4' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")
              center / contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14' fill='none'%3E%3Cpath d='M2 7h10M8 3l4 4-4 4' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")
              center / contain no-repeat;
      }
      .masina-live__morebtn:hover {
          border-color: var(--nf-color-text-quote);
      }

      /* ===== §4.15b  Blog uživo — Srodni placement + section rules =====
         Srodni was believed removed from this template, so §4.15 never
         placed it. Restored 2026-08-22 (editors' request, designer
         conceded); the module had in fact been in template 61910 all
         along, hidden by the old single-tier related query.
      ================================================================ */

      /* §4.7 gives .masina-single__related grid-column:1, which on a normal
         single is the 700px article column but on Blog uživo is the 280px
         timeline rail. At 280px the @container related (min-width:34rem) wide
         layout can never match, so the module falls back to its narrow scroll
         strip. Spanning both tracks restores a ~1028px container. (0,2,0)
         clears §4.7's (0,1,0). 900–1024 needs nothing: the live grid is
         already single-column at --_lb-card (700px), over the 34rem
         threshold. Below 900 the display:contents reorder applies and the
         narrow slider is correct. */
      @media (min-width: 1025px) {
          .category-blog-uzivo .masina-single__related {
              grid-column: 1 / -1;
              grid-row: 2;
          }
      }

      /* Empty tags row = a double hairline. .masina-single__tagsrow carries
         both border-top and border-bottom (§4.7). On Vesti the row always has
         content between them — tag pills plus .masina-single__sharebtn. Blog
         uživo keeps share inside .masina-live__card, so the row holds only
         [masina_tags], which returns '' when the post has no non-flag tags,
         leaving two bare rules. Scoped to blog-uzivo DELIBERATELY: a global
         :not(:has(.tags-links)) would also hide the share button on any
         untagged Vesti/Video/Stav post. */
      .category-blog-uzivo .masina-single__tagsrow:not(:has(.tags-links)) {
          display: none;
      }

      /* Section rules around Srodni. They sit on __related rather than __head
         so they span both live grid tracks — on __head the top rule would stop
         at the head's own box. padding-top is an explicit 0: staging carried
         space-40 here and it opened a large gap under the rule. Nothing else
         in the file sets padding on __related, so this records the decision
         rather than overriding anything. space-64 above separates the section
         from the content. */
      .category-blog-uzivo .masina-single__related {
          margin-top: var(--nf-space-64);
          border-top: var(--nf-bw-thin) solid var(--nf-border-default);
          padding-top: 0;
          border-bottom: var(--nf-bw-thin) solid var(--nf-border-default);
      }


      /* ===== §4.16  Cards — category / tag / author archives + search ===
         Scope: body.archive and body.search. Blog home unaffected.
         Cards are rendered by the "Taxonomy Archives v1" Content Template
         (element 62097) inside GP's native loop, so each card sits in an
         <article> carrying post_class() — .tag-analiza is the hook for the
         Analiza variant, no conditional blocks needed.

         Shared rules use :is(.archive, .search) — SAME specificity as a single
         class, so nothing re-ties. NOTE the descendant space: written glued
         (":is(...).site-main") it means "element that is BOTH", which never
         matches and silently kills the whole card system. NOTE card-level rules
         also carry .masina-section for Home sections, and that layout-level rules
         deliberately don't.

         Archive-only rules keep the bare .archive scope: everything involving
         the hero (:first-of-type), the divider POSITION arithmetic (row
         positions shift by one without a hero — see §4.18), and .page-header.

         Grid geometry: vertical dividers are ::before in the column gap; row
         hairlines are ::after drawn ABOVE each article (so the final row never
         has a trailing line whatever its card count, and infinite-scroll
         batches bring their own). Divider visibility is switched per
         breakpoint at IDENTICAL specificity — switches resolve by source
         order, so keep them in order.
      ================================================================= */

      :root :is(.archive, .search) #page {
          max-width: none;
          width: 100%;
          margin-inline: 0;
      }
      /* --- Shell: the gutter box. GP's #page cap is neutralised above, so this
         measures against the viewport. #main is load-bearing — GP zeroes the
         inline margins at <=768 via an ID rule (1,0,0) that a :root prefix
         cannot beat; do not simplify it back to .site-main, since desktop looks
         correct either way and only tablet and below break.
         padding-inline: 0 is explicit, not absent — GP's own container padding
         returns the moment the declaration is dropped. --- */
      :root :is(.archive, .search) .site-main {
          --nf-arch-colgap: 2rem; /* TUNE */
          --nf-arch-rowgap: 2rem; /* TUNE */
          width: min(100% - (2 * var(--nf-gutter)), var(--nf-content-max));
          max-width: none;
          padding-inline: 0;
          margin-inline: auto;
          display: grid;
          grid-template-columns: repeat(4, minmax(0, 1fr));
          column-gap: var(--nf-arch-colgap);
          row-gap: var(--nf-arch-rowgap);
          /* Half the row gap. Named so the load-more hairline reads the same knob as
             the per-row ones. Declared HERE, not on article::after — the nav that
             wraps the load-more button has to inherit it too. */
          --nf-arch-hairline-gap: calc(0.5 * var(--nf-arch-rowgap));
      }
      /* GP zeroes the inline margins at <=768 via an ID rule (1,0,0), which a
         :root prefix cannot beat. ONLY the margin needs the ID — putting the
         rest of the shell behind #main lifts it to (1,3,0) and the per-breakpoint
         grid overrides below silently stop applying. */
      :root :is(.archive, .search) #main.site-main {
          margin-inline: auto;
      }

      :root :is(.archive, .search) .site-main > *:not(article) {
          grid-column: 1 / -1;
      }
      :root :is(.archive, .search) .site-main > article {
          position: relative; /* divider anchor */
          margin: 0; /* GP's article margin would inflate the row gap one-sided */
      }
      /* The Content Template emits an empty <p> after .masina-card. Its 1.5em
         bottom margin inflated each article, and the tallest article sets the row
         height — so the surplus showed up as bottom slack on every card in the row.
         Direct child only: the card's own paragraphs are nested deeper and already
         carry margin: 0. */
      :root :is(.archive, .search) .site-main > article > p {
          margin: 0;
      }

      :root .archive:not(.search) .site-main > article:first-of-type {
          grid-column: 1 / -1;
      }

      /* --- Vertical dividers: defined once, switched per breakpoint --- */
      :root :is(.archive, .search) .site-main > article::before {
          content: "";
          position: absolute;
          top: 0;
          bottom: 0;
          left: calc(-0.5 * var(--nf-arch-colgap));
          width: 1px;
          background: var(--nf-border-default);
          display: none;
      }
      /* desktop 4-col: hero occupies position 1, so first-in-row is 4n+2 */
      :root
          .archive
          .site-main
          > article:not(:first-of-type):not(:nth-of-type(4n + 2))::before {
          display: block;
      }

      /* --- Row hairlines (above each article) --- */
      :root :is(.archive, .search) .site-main > article::after {
          content: "";
          position: absolute;
          top: calc(var(--nf-arch-hairline-gap) - var(--nf-arch-rowgap));
          left: calc(-0.5 * var(--nf-arch-colgap));
          right: calc(-0.5 * var(--nf-arch-colgap));
          height: 1px;
          background: var(--nf-border-default);
      }
      /* hero: .page-header's border-bottom already draws the line above it */
      :root .archive:not(.search) .site-main > article:first-of-type::after {
          display: none;
      }
      /* clamp the outer edges: first-in-row 4n+2, last-in-row 4n+1 */
      :root .archive .site-main > article:nth-of-type(4n + 2)::after {
          left: 0;
      }
      :root .archive .site-main > article:nth-of-type(4n + 1)::after {
          right: 0;
      }

      /* --- Title band: name left, dots right (not on author archives) ---
         Negative bottom margin shrinks the header's grid-row margin box to
         compensate the row-gap: net title -> hero distance = space-24.
         Author archives get their own centred layout in §4.17. */
      :root .archive:not(.author):not(.search) .page-header {
          display: flex;
          align-items: center;
          justify-content: space-between;
          border-bottom: 1px solid var(--nf-border-default);
          padding: 0 0 var(--nf-space-16); /* TUNE */
          margin: 0;
          margin-bottom: calc(
              var(--nf-space-24) - var(--nf-arch-rowgap)
          ); /* TUNE net gap */
      }
      :root .archive .page-header .page-title {
          font-size: var(--nf-fs-h2);
          line-height: var(--nf-lh-h2);
          letter-spacing: var(--nf-track-h2);
          color: var(--nf-color-text-heading);
          margin: 0;
          text-align: left;
      }
      /* Dots: masked SVG, same pattern as the flags (pair + offset single). */
      :root .archive:not(.author):not(.search) .page-header::after {
          content: "";
          flex: none;
          font-size: 0.75rem; /* TUNE — dot diameter = 1em */
          width: 4.625em; /* viewBox 37x8 */
          height: 1em;
          background-color: var(--nf-color-brand-primary); /* TUNE if pair differs */
          -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 37 8'%3E%3Ccircle cx='4' cy='4' r='4'/%3E%3Ccircle cx='15' cy='4' r='4'/%3E%3Ccircle cx='33' cy='4' r='4'/%3E%3C/svg%3E")
              center / contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 37 8'%3E%3Ccircle cx='4' cy='4' r='4'/%3E%3Ccircle cx='15' cy='4' r='4'/%3E%3Ccircle cx='33' cy='4' r='4'/%3E%3C/svg%3E")
              center / contain no-repeat;
      }

      /* --- Card base --- */
      :root :is(.archive, .search, .masina-section) .masina-card {
          display: flex;
          flex-direction: column;
          gap: var(--nf-space-8); /* TUNE */
          height: 100%;
      }
      :root :is(.archive, .search, .masina-section) .masina-card__media-slot {
          margin-bottom: var(--nf-space-8); /* TUNE */
      }
      :root :is(.archive, .search, .masina-section) .masina-card__media img {
          display: block;
          width: 100%;
          height: auto;
          aspect-ratio: 3 / 2; /* TUNE — squareness ruling pending */
          object-fit: cover;
      }

      /* Meta row: category [+ flag] | date. Mirrors .masina-card__meta from
             §4.8 (Najnovije) rather than redefining it — the date component,
             including the "|" separator ::before, is already global.
             baseline, not center: the Analiza flag is inline-flex and reports
             its text baseline, so caps align across all three items.
             wrap for narrow mobile, where ANALIZA + dots + date can exceed the
             column. */
          :root :is(.archive, .search, .masina-section) .masina-card__label {
              display: flex;
              align-items: baseline;
              flex-wrap: wrap;
              column-gap: var(--nf-space-8);
          }
      /* Tombstone: archive/search/home card dates used to be forced to
         --nf-fs-label-category (clamp 11→12px) + 0.02em tracking, so they sat
         smaller than the Najnovije/Srodni 14px date. Superseded 2026-08-22 —
         --nf-fs-dates is a flat 12px everywhere, so this override's only
         remaining effect was an 11px date below 1134px, i.e. the inconsistency
         it now looks like it was fixing. text-transform:uppercase is already
         supplied by §4.19's :is() rule. Do not restore. */

      /* --- Label: shared typography; red default, blue Analiza flag.
         Flag dots are em-sized, so the 12px font sizes them to match. --- */
      :root :is(.archive, .search, .masina-section) .masina-card__label a {
          font-family: var(--nf-font-ui);
          font-weight: var(--nf-fw-bold);
          font-size: var(--nf-fs-label-category);
          line-height: var(--nf-lh-label-category);
          letter-spacing: var(--nf-track-label-category);
          text-transform: uppercase;
          color: var(--nf-color-brand-primary);
          text-decoration: none;
      }
      :root :is(.archive, .search, .masina-section) .masina-card__label a.masina-flag--analiza {
          color: var(--nf-color-brand-blue-soft);
      }

      /* Unified title hover — house convention - all cards. Najnovije rows have no overlay → direct hover. */
      :root .masina-card__title a:hover,
      :root .masina-card__title a:focus-visible,
      :root :is(.archive, .search, .masina-section) .masina-card__title a:hover,
      :root :is(.archive, .search, .masina-section) .masina-card__title a:focus-visible,
      :root .masina-hero-row__title a:hover,
      :root .masina-hero-row__title a:focus-visible {
          color: var(--nf-color-brand-primary);
          text-decoration-line: underline;
          text-decoration-color: var(--nf-color-brand-primary);
          text-decoration-thickness: 1px;
          text-underline-offset: 0.16em;
          text-decoration-skip-ink: auto;
      }

      /* Thumbnail → title hover, explicit. */
      :root .masina-hero .masina-card:has(.masina-card__media:hover) .masina-card__title a {
          color: var(--nf-color-brand-primary);
          text-decoration-line: underline;
          text-decoration-color: var(--nf-color-brand-primary);
          text-decoration-thickness: 1px;
          text-underline-offset: 0.16em;
          text-decoration-skip-ink: auto;
      }


      /* --- Title --- */
      :root :is(.archive, .search, .masina-section) .masina-card__title {
          font-family: var(--nf-font-display);
          font-size: var(--nf-fs-card-title);
          line-height: var(--nf-lh-card-title);
          letter-spacing: var(--nf-track-card-title);
          font-weight: var(--nf-fw-semibold);
          margin: 0;
      }
      :root :is(.archive, .search, .masina-section) .masina-card__title a {
          color: var(--nf-color-text-heading);
          text-decoration: none;
      }

      /* --- Excerpt --- */
      :root :is(.archive, .search, .masina-section) .masina-card__excerpt {
          font-size: var(--nf-fs-body-base);
          line-height: var(--nf-lh-body-base);
          letter-spacing: var(--nf-track-body-base);
          color: var(--nf-color-text-heading);
          margin: 0;
          display: -webkit-box;
          -webkit-line-clamp: 3;
          -webkit-box-orient: vertical;
          overflow: hidden;
      }

      /* --- Read-more: hero only. The hero rule below turns it back on; the
         tablet/mobile blocks re-hide it. RESTORED after the batch-1 migration
         dropped it — without this every desktop card shows "Pročitaj ceo tekst".
         If the original carried type styling too, recover it from git.
         The hero rule below turns it back on; the
         tablet/mobile blocks re-hide it. --- */
      :root :is(.archive, .search, .masina-section) .masina-card__more {
          display: none;
          margin: 0; /* <p>'s 1.5em bottom margin held it ~36px off the image */
      }
      :root :is(.archive, .search, .masina-section) .masina-card__more a {
          display: inline;                              /* inline: flows after the …, and text-decoration underlines it (inline-flex would not) */
          font-family: var(--nf-font-ui);
          font-size: var(--nf-fs-button);
          font-weight: var(--nf-fw-medium);
          letter-spacing: var(--nf-track-button);
          text-transform: uppercase;
          color: var(--nf-color-text-heading);          /* keep the resting colour */
          text-decoration-line: underline;
          text-decoration-color: var(--nf-color-brand-primary);
          text-decoration-thickness: 1px;
          text-underline-offset: 0.16em;                /* house hover offset */
          padding-left: var(--nf-space-4);
      }
      :root :is(.archive, .search, .masina-section) .masina-card__more a:hover,
      :root :is(.archive, .search, .masina-section) .masina-card__more a:focus-visible {
          color: var(--nf-color-brand-primary);         /* all red: text + arrow (currentColor); the underline is already red */
      }
      :root :is(.archive, .search, .masina-section) .masina-card__more a::after {
          content: "";
          display: inline-block;                        /* was a flex item; now inline-block trailing the text */
          width: 0.7em;
          height: 0.7em;
          margin-left: var(--nf-space-8);
          vertical-align: middle;                       /* TUNE: arrow vs. caps height */
          background-color: currentColor;
          -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 11 11'%3E%3Cpath stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.333' d='M.667 5.333H10M5.335.667 10 5.333 5.335 10'/%3E%3C/svg%3E")
              center / contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 11 11'%3E%3Cpath stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.333' d='M.667 5.333H10M5.335.667 10 5.333 5.335 10'/%3E%3C/svg%3E")
              center / contain no-repeat;
      }
      /* No hover: lift the read-more above the card's stretched-link overlay
            (.masina-card__title a::after, z-index:1) — same escape the author/cat links
            already use — so it receives its own hover and click. */
      :root :is(.archive, .search, .masina-section) .masina-card__more a {
          position: relative;
          z-index: 2;
      }
      /* --- Byline: Analiza cards only (desktop + tablet) --- */
      :root :is(.archive, .search, .masina-section) .masina-card__byline {
          display: none;
          margin: 0;
      }
      :root :is(.archive, .search, .masina-section) article.tag-analiza .masina-card__byline {
          display: block;
          margin-top: auto; /* flex card: pins to bottom, rows stay aligned */
      }
      :root :is(.archive, .search, .masina-section) .masina-card__author,
      :root :is(.archive, .search, .masina-section) .masina-card__author a {
          font-family: var(--nf-font-display);
          font-style: italic;
          font-weight: var(--nf-fw-semibold);
          font-size: var(--nf-fs-card-author);
          line-height: var(--nf-lh-card-author);
          letter-spacing: var(--nf-track-card-author);
          text-transform: uppercase;
          color: var(--nf-color-text-quote);
          text-decoration: none;
      }

      /* --- Analiza variant: blue rail beside the TEXT only ---
         Designer revision: the rail starts at the "Analiza" label, not at the image
         top. No wrapper exists around the text blocks in the Content Template, so
         the card is a grid — 4px rail + content — and the rail is a ::before
         spanning the label row to the card bottom. Image spans both columns. */

      :root :is(.archive, .search, .masina-section) article.tag-analiza .masina-card {
              display: grid;
              grid-template-columns: 4px minmax(0, 1fr);
              grid-template-rows: auto auto auto auto minmax(0, 1fr);
              column-gap: var(--nf-space-16); /* TUNE — frame reads 19px */
              row-gap: var(--nf-space-8); /* TUNE */
              border-left: 0;
              padding-left: 0; /* TUNE — see decision 1 */
          }
          :root :is(.archive, .search, .masina-section) article.tag-analiza .masina-card > * {
              grid-column: 2;
          }
          :root :is(.archive, .search, .masina-section) article.tag-analiza .masina-card__media-slot {
              grid-column: 1 / -1;
              grid-row: 1;
          }
          :root :is(.archive, .search, .masina-section) article.tag-analiza .masina-card::before {
              content: "";
              grid-column: 1;
              grid-row: 2 / -1;
              margin-block-start: 0.45em; /* TUNE — drops the rail to label cap-height */
              background-color: var(--nf-color-brand-blue-soft);
          }
      :root :is(.archive, .search, .masina-section) article.tag-analiza .masina-card__media img {
              /* Frames measure 1.951 at 1440 (295x151.5) and 1.965 at 768
                 (334x170) — not a designed ratio: in Figma the cards in a row
                 bottom-align and the Analiza image absorbs the extra byline
                 line. CSS can't express that, so 2/1 is the nearest clean value
                 (~4px shorter at desktop). Confirmed with the designer. */
              aspect-ratio: 3 / 2;
      }


      /* --- Hero (first post, chronological) — archives only ---
         Fixed image ratio + clamped title so image and text end together;
         without both, a wide source or a long headline leaves a ragged edge. */
      :root .archive:not(.search) .site-main > article:first-of-type .masina-card {
          display: grid;
          grid-template-columns: repeat(2, minmax(0, 1fr));
          column-gap: var(--nf-arch-colgap);
          align-items: start;
          border-left: 0; /* neutralise the Analiza card variant */
          padding-left: 0;
      }
      :root
          .archive:not(.search)
          .site-main
          > article:first-of-type
          .masina-card__media-slot {
          grid-column: 1;
          grid-row: 1 / span 5;
          margin: 0;
      }
      :root
          .archive:not(.search)
          .site-main
          > article:first-of-type
          .masina-card__media
          img {
          aspect-ratio: 3 / 2; /* TUNE if frame crops */
          object-fit: cover;
      }
      :root
          .archive:not(.search)
          .site-main
          > article:first-of-type
          .masina-card__label {
          grid-column: 2;
          grid-row: 1;
      }
      :root
          .archive:not(.search)
          .site-main
          > article:first-of-type
          .masina-card__title {
          grid-column: 2;
          grid-row: 2;
          font-size: var(--nf-fs-h1-article);
          line-height: var(--nf-lh-h1-article);
          letter-spacing: var(--nf-track-h1-article);
          display: -webkit-box;
          -webkit-line-clamp: 4; /* TUNE */
          -webkit-box-orient: vertical;
          overflow: hidden;
      }
      :root
          .archive:not(.search)
          .site-main
          > article:first-of-type
          .masina-card__excerpt {
          grid-column: 2;
          grid-row: 3;
          font-size: var(--nf-fs-body-large);
          line-height: var(--nf-lh-body-large);
          letter-spacing: var(--nf-track-body-large);
          display: block;
          -webkit-line-clamp: unset;   /* drop the inherited 3-line clamp; wp_trim_words(30) is the real limit */
          overflow: hidden;            /* contained, but no vertical clip since height is unconstrained */
      }
      :root
          .archive:not(.search)
          .site-main
          > article:first-of-type
          .masina-card__byline {
          grid-column: 2;
          grid-row: 4;
      }
      :root :is(.archive, .search, .masina-section) .masina-card__more {
          display: inline;
      }
      /* Home cards: no read-more (reappeared via the .masina-section group after the archive-hero fix; not wanted on Home). */
      :root body.home .masina-card__more { display: none;
      }
      /* Analiza hero: bar moves onto the image, card-variant pull cancelled */
      :root
          .archive:not(.search)
          .site-main
          > article.tag-analiza:first-of-type
          .masina-card__media-slot {
          padding-left: 0; /* old value --nf-space-4 removed - no blue border in the new version */
      }
      /* Hero: the rail is drawn against the media slot, so kill the card rail
         rather than let it land in the hero's column 1. */
      :root
          .archive:not(.search)
          .site-main
          > article.tag-analiza:first-of-type
          .masina-card::before {
          display: none;
      }

      /* --- Load-more: closes the grid with the row hairline the ::after
         system deliberately omits (lines are drawn above articles, so the
         last row has none). Reuses --nf-arch-hairline-gap so it sits at the
         same distance as every other line.
         GP nests .load-more inside nav#nav-below.paging-navigation — the NAV
         is the grid item, so geometry hangs off whichever of the two is the
         direct child. margin:0 kills GP Premium's own, which would otherwise
         break the hairline arithmetic against the row gap.
         order:4 keeps the nav last on .search, where the searchbar is the first
          grid item in DOM order. Everything else defaults to order 0, so any value
          >0 works; 4 is chosen to survive a future ordered item. --- */

      :root :is(.archive, .search) .site-main > :is(.paging-navigation, .load-more) {
          position: relative;
          display: flex;
          justify-content: center;
          order: 4;
          margin: 0;
          padding-block-start: 0; /* TUNE */
      }
      :root
          :is(.archive, .search)
          .site-main
          > :is(.paging-navigation, .load-more)::before {
          content: "";
          position: absolute;
          left: 0;
          right: 0;
          top: calc(var(--nf-arch-hairline-gap) - var(--nf-arch-rowgap));
          height: 1px;
          background: var(--nf-border-default);
      }
      :root :is(.archive, .search) .site-main .load-more .button {
          font-family: var(--nf-font-ui);
          font-weight: var(--nf-fw-bold);
          /*font-size: var(--nf-fs-label-category);*/
          letter-spacing: var(--nf-track-label-category);
          text-transform: uppercase;
          color: var(--nf-surface-page);
          background-color: var(--nf-color-text-heading); /* was --nf-color-brand-primary */
          border-radius: 50px;
          padding: var(--nf-space-12) var(--nf-space-24); /* TUNE */
          text-decoration: none;
          margin-top: var(--nf-space-36);
          margin-bottom: var(--nf-space-36);
      }
      :root :is(.archive, .search) .site-main .load-more .button:hover,
      :root :is(.archive, .search) .site-main .load-more .button:focus-visible {
          background-color: var(--nf-color-brand-primary); /* was --nf-color-text-heading */
          color: var(--nf-color-text-on-color);
      }

      /* --- Hero: media fills the card height ---
         The card grid is align-items:start, so the slot keeps its intrinsic 3/2
         height and the text column can outrun it. Stretch the slot to its full grid
         area and let the image fill it. The 3/2 floor survives: during track sizing
         the area is indefinite, height:100% falls back to auto and aspect-ratio
         supplies the intrinsic contribution; in layout the area is definite, both
         axes are definite, aspect-ratio is ignored and object-fit:cover crops.
         Desktop only — the wrapper is load-bearing: at <=1024 the hero is
         flex-column and at <=767 a single-column grid, both of which need the
         intrinsic height. */
      @media (min-width: 1025px) {
          :root
              .archive:not(.search)
              .site-main
              > article:first-of-type
              .masina-card__media-slot {
              align-self: stretch;
              display: flex;
              flex-direction: column;
              min-height: 0;
          }
          :root
              .archive:not(.search)
              .site-main
              > article:first-of-type
              .masina-card__media-slot
              > * {
              flex: 1 1 auto;
              min-height: 0;
          }
          :root
              .archive:not(.search)
              .site-main
              > article:first-of-type
              .masina-card__media {
              display: block;
              height: 100%;
          }
          :root
              .archive:not(.search)
              .site-main
              > article:first-of-type
              .masina-card__media
              img {
              height: 100%;
          }
      }

      /* ── Placeholder featured image — Images thread, 2026-08-07 ───────────── */
      /* Borderless SVGs; border is CSS-side so it fits every slot ratio
         (hero, card, Analiza). ⚠ 2px light / 1px dark asymmetry is deliberate —
         pending designer confirmation. Dark-mode bottom hairline can render
         fractionally thinner: site-wide fractional-hairline behavior, accepted.
         ⚠ Open editor question: shown on archive cards AND single hero. If the
         verdict is single-only, add a display:none-on-cards variant here. */
      :root img.masina-thumb--placeholder {
          content: url("/wp-content/themes/generatemasina/assets/img/m-light.svg");
          object-fit: contain;
          background-color: var(--nf-color-surface-warm);
          border: 2px solid var(--nf-color-brand-primary);
      }
      html.dark-mode img.masina-thumb--placeholder {
          content: url("/wp-content/themes/generatemasina/assets/img/m-dark.svg");
          background-color: var(--nf-color-surface-page);
          border: 1px solid var(--nf-color-text-on-color);
      }

      /* ── Card stretched link — D6, 2026-08-09 ────────────────────────────── */
      /* The title link covers the whole card via ::after, so the media wrapper
         needs no anchor (kills the aria-hidden focusable warning site-wide).
         Byline and category links are lifted above the overlay or they become
         unclickable. Media markup: masina_card_media_cb, snippet 43.
         ⚠ That callback's `sizes` string is coupled to this grid's slot widths
         (357 @390 · 397 @900 · 296 @1440, 4-up from 1024). Change one, change both. */
      :root .masina-card {
          position: relative;
      }
      :root .masina-card__title a::after {
          content: "";
          position: absolute;
          inset: 0;
          z-index: 1;
      }
      :root .masina-card__author a,
      :root .masina-card .cat-links a {
          position: relative;
          z-index: 2;
      }

      /* --- Tablet: 2 columns --- */
      @media (max-width: 1024px) {
          :root :is(.archive, .search) .site-main {
              grid-template-columns: repeat(2, minmax(0, 1fr));
          }
          /* reset the desktop divider pattern, then switch on the 2-col one:
             first-in-row is every even position (hero occupies position 1) */
          :root
              .archive
              .site-main
              > article:not(:first-of-type):not(:nth-of-type(4n + 2))::before {
              display: none;
          }
          :root
              .archive
              .site-main
              > article:not(:first-of-type):not(:nth-of-type(2n))::before {
              display: block;
          }
          /* reset the desktop hairline clamps (4n+1/4n+2 mean other positions
             at two columns), then clamp for 2-col: first-in-row even, last odd */
          :root .archive .site-main > article:nth-of-type(4n + 2)::after,
          :root .archive .site-main > article:nth-of-type(4n + 1)::after {
              left: calc(-0.5 * var(--nf-arch-colgap));
              right: calc(-0.5 * var(--nf-arch-colgap));
          }
          :root .archive .site-main > article:nth-of-type(2n)::after {
              left: 0;
          }
          :root .archive .site-main > article:nth-of-type(2n + 1)::after {
              right: 0;
          }

          /* hero stacks. Switching to flex makes the desktop grid-column /
             grid-row declarations inert — no per-child resets needed. */
          :root
              .archive:not(.search)
              .site-main
              > article:first-of-type
              .masina-card {
              display: flex;
              flex-direction: column;
              gap: var(--nf-space-8); /* TUNE */
          }
          :root
              .archive:not(.search)
              .site-main
              > article:first-of-type
              .masina-card__more {
              display: inline;
          }
      }

      /* --- Mobile: 1 column, compact list card (thumb right, per frames) --- */
      @media (max-width: 767px) {
          :root :is(.archive, .search) .site-main {
              grid-template-columns: minmax(0, 1fr);
              --nf-arch-rowgap: 1.5rem; /* TUNE */
          }
          :root
              .archive
              .site-main
              > article:not(:first-of-type):not(:nth-of-type(2n))::before {
              display: none;
          }
          :root :is(.archive, .search) .site-main > article::after {
              left: 0;
              right: 0;
          }
          /* The 2-col clamps (@media <=1024) still match at <=767 and outrank
             the full-width reset above (0,4,2 vs 0,3,2), which reproduces the
             period-4 left/right stagger. Reset them at 2-col specificity: every
             article is 2n or 2n+1, so this restores full-width hairlines for all
             cards below the hero. */
          :root .archive .site-main > article:nth-of-type(2n)::after,
          :root .archive .site-main > article:nth-of-type(2n + 1)::after {
              left: 0;
              right: 0;
          }

      /* --- Card: full-width image above the text (frame revision) ---
              */
          :root :is(.archive, .search, .masina-section) .masina-card {
              display: grid;
              grid-template-columns: minmax(0, 1fr);
              row-gap: var(--nf-space-8); /* TUNE */
              align-items: start;
          }
          :root :is(.archive, .search, .masina-section) .masina-card__media-slot {
              grid-column: 1 / -1;
              grid-row: 1;
              margin: 0;
          }
          :root :is(.archive, .search, .masina-section) .masina-card__title {
              grid-column: 1;
              grid-row: 2;
          }
          :root :is(.archive, .search, .masina-section) .masina-card__label {
              grid-column: 1;
              grid-row: 3;
          }
          :root :is(.archive, .search, .masina-section) .masina-card__excerpt,
          :root :is(.archive, .search, .masina-section) .masina-card__byline {
              display: none; /* frames: no excerpt, no author on mobile */
          }

          /* Analiza inherits the rail structure from the shared rule */
          :root :is(.archive, .search, .masina-section) article.tag-analiza .masina-card__title {
              grid-column: 2;
              grid-row: 2;
          }
          :root :is(.archive, .search, .masina-section) article.tag-analiza .masina-card__label {
              grid-column: 2;
              grid-row: 3;
          }


          /* Hero: single column */
          :root
              .archive:not(.search)
              .site-main
              > article:first-of-type
              .masina-card__media-slot {
              grid-column: 1 / -1;
              grid-row: 1;
          }
          :root
              .archive:not(.search)
              .site-main
              > article:first-of-type
              .masina-card__label {
              grid-column: 1;
              grid-row: 2;
          }
          :root
              .archive:not(.search)
              .site-main
              > article:first-of-type
              .masina-card__title {
              grid-column: 1;
              grid-row: 3;
          }
          :root
              .archive:not(.search)
              .site-main
              > article:first-of-type
              .masina-card__excerpt {
              grid-column: 1;
              grid-row: 4;
          }

          /* Analiza's byline rule */
          :root :is(.archive, .search, .masina-section) article.tag-analiza .masina-card__byline {
              display: none;
          }
          /* hero keeps full-width image, label above title, excerpt visible */
          :root
              .archive:not(.search)
              .site-main
              > article:first-of-type
              .masina-card {
              grid-template-columns: minmax(0, 1fr);
              row-gap: var(--nf-space-8); /* TUNE */
          }
          :root
              .archive:not(.search)
              .site-main
              > article:first-of-type
              .masina-card__excerpt {
              display: block;
          }
          :root
              .archive:not(.search)
              .site-main
              > article:first-of-type
              .masina-card__media
              img {
          }

      /* ANALIZA MOBILE TITLE RAIL */
          :root :is(.archive, .search, .masina-section) article.tag-analiza .masina-card::before {
              grid-row: 2 / 4;
              align-self: stretch;
              font-size: var(--nf-fs-card-title);
              margin-block: 0.2em 0.25em; /* TUNE */
          }
      }


      /* ===== §4.17  Author archive — profile block ===================
         Styles GP's native author header (no shortcode needed):
           header.page-header > h1.page-title > img.avatar + span.vcard
                              > div.author-info   (omitted when bio empty
                                                   = Figma variant 2, free)
         Overrides the §4.16 .page-header flex row for .author only.
      ================================================================ */
      :root .archive.author .page-header {
          flex-direction: column;
          align-items: center;
          text-align: center;
          gap: var(--nf-space-12); /* TUNE */
          border-bottom: 0; /* frames: hairline only above the hero */
          padding: var(--nf-space-40) 0 var(--nf-space-48); /* TUNE */
          margin-bottom: calc(
              var(--nf-space-24) - var(--nf-arch-rowgap)
          ); /* TUNE net gap */
      }
      :root .archive.author .page-header .page-title {
          display: flex;
          flex-direction: column;
          align-items: center;
          gap: var(--nf-space-16); /* TUNE */
          font-size: var(--nf-fs-h2);
          line-height: var(--nf-lh-h2);
          letter-spacing: var(--nf-track-h2);
          font-weight: var(--nf-fw-semibold);
          color: var(--nf-color-text-heading);
          margin: 0;
      }
      :root .archive.author .page-header .avatar {
          width: 150px; /* TUNE — needs the GP size filter too, or it upscales */
          height: 150px;
          border-radius: 50%;
          object-fit: cover;
      }
      :root .archive.author .page-header .author-info {
          max-width: 58ch; /* TUNE */
          font-size: var(--nf-fs-body-base);
          line-height: var(--nf-lh-body-base);
          letter-spacing: var(--nf-track-body-base);
          color: var(--nf-color-text-quote);
      }
      @media (max-width: 767px) {
          :root .archive.author .page-header {
              padding: var(--nf-space-24) 0 var(--nf-space-32); /* TUNE */
          }
          :root .archive.author .page-header .page-title {
              font-size: 1.25rem; /* TUNE — frames say 20px; token candidate */
          }
          :root .archive.author .page-header .avatar {
              width: 100px; /* TUNE */
              height: 100px;
          }
      }

      :root .archive.author .page-header .author-info {
          margin-inline: auto;
      }

      :root .archive.author .page-header {
          border-bottom: 1px solid var(--nf-border-default);
      }

      /* ===== §4.18  Search results — grid deltas + search bar ========
         Shares §4.16's card system via :is(.archive, .search). No hero, so
         row positions shift by one: first-in-row 4n+1 / last-in-row 4n
         (vs 4n+2 / 4n+1 on archives). The search bar block is hooked
         generate_before_main_content (element 62167).
         NOTE card-level rules
         also carry .masina-section for Home sections, and that layout-level rules
         deliberately don't.
      ================================================================ */


      /* Hero: rail is drawn by the media-slot's border-right, so kill the
         card rail rather than let it land in the hero's column 1. */
      :root
          .archive:not(.search)
          .site-main
          > article.tag-analiza:first-of-type
          .masina-card::before {
          display: none;
      }

      /* --- Divider geometry (no hero) --- */
      :root .search .site-main > article:not(:nth-of-type(4n + 1))::before {
          display: block;
      }
      :root .search .site-main > article:nth-of-type(4n + 1)::after {
          left: 0;
      }
      :root .search .site-main > article:nth-of-type(4n)::after {
          right: 0;
      }
      /* Suppresses the first row's top hairline because the page header used to draw that line: */
      :root .search .site-main > article:nth-of-type(-n + 4)::after {
          display: none;
      }

      /* --- Search bar block --- */
      :root .search .masina-searchbar {
          margin-top: 0; /* was a pull-up under GP's page header, now gone */
          margin-bottom: var(--nf-space-40); /* keep clear of first card — TUNE */
      }

      :root .search .masina-searchform {
          display: flex;
          align-items: center;
          gap: var(--nf-space-8);
          border-bottom: 1px solid var(--nf-border-default);
          padding-bottom: var(--nf-space-8); /* TUNE */
          margin-bottom: var(--nf-space-24); /* TUNE */
      }
      :root .search .masina-searchform__input {
          flex: 1 1 auto;
          border: 0;
          background: transparent;
          padding: 0;
          font-family: var(--nf-font-display);
          font-size: var(--nf-fs-body-large);
          line-height: var(--nf-lh-body-large);
          color: var(--nf-color-text-heading);
      }
      :root .search .masina-searchform__input:focus {
          outline: 0;
      }
      :root .search .masina-searchform__btn {
          flex: none;
          display: inline-flex;
          border: 0;
          background: transparent;
          padding: 0;
          width: 1.25em;
          height: 1.25em;
          color: var(--nf-color-text-heading);
          cursor: pointer;
      }
      :root .search .masina-searchform__btn svg {
          width: 100%;
          height: 100%;
      }

      /* --- Hero form: the results heading IS the form. GP's search headline is
         gone (snippet 52), so .masina-searchbar is the first grid item and its
         old pull-up has nothing to pull against. The <h1> is the form's first
         flex child; the term lives only in the input, where it is editable.
         Sizes are token-driven — a hardcoded rem here broke the row at 415px. */
      :root .search .masina-searchform__title {
          flex: none;
          margin: 0;
          font-family: var(--nf-font-display);
          font-size: var(--nf-fs-h2);
          line-height: var(--nf-lh-h2);
          letter-spacing: var(--nf-track-h2);
          color: var(--nf-color-text-heading);
          padding-bottom: .07rem;  /* fix to align the title with the form input */

      }
      :root .search .masina-searchform__title label {
          cursor: text;
      }
      :root .search .masina-searchform--hero .masina-searchform__input {
          font-size: var(--nf-fs-h2);
          line-height: var(--nf-lh-h2);
          field-sizing: content; /* Chromium only — progressive enhancement */
          min-width: 0; /* the size attr's intrinsic width blocks flex-shrink */
          color: var(--nf-color-brand-primary);
      }
      /* Mobile: title takes its own row, input + magnifier share the next. TUNE */
      @media (max-width: 767px) {
          :root .search .masina-searchform--hero {
              flex-wrap: wrap;
          }
          :root .search .masina-searchform__title {
              flex: 1 0 100%;
          }
      }

      /* --- "Suzite pretragu..." label --- */
      :root .search .masina-searchbar__label,
      :root .search .masina-noresults__searchtitle {
          font-family: var(--nf-font-ui);
          font-weight: var(--nf-fw-bold);
          font-size: var(--nf-fs-label-category);
          letter-spacing: var(--nf-track-label-category);
          text-transform: uppercase;
          color: var(--nf-color-text-quote);
          margin: 0 0 var(--nf-space-12); /* TUNE */
      }

      /* --- Pills --- */
      :root .search .masina-searchfilters {
          display: flex;
          flex-wrap: wrap;
          gap: var(--nf-space-8); /* TUNE */
      }
      :root .search .masina-searchfilter {
          display: inline-flex;
          align-items: center;
          padding: var(--nf-space-4) var(--nf-space-12); /* TUNE */
          border: 1px solid var(--nf-border-default);
          border-radius: 999px;
          font-family: var(--nf-font-ui);
          font-weight: var(--nf-fw-bold);
          font-size: var(--nf-fs-label-category);
          letter-spacing: var(--nf-track-label-category);
          text-transform: uppercase;
          color: var(--nf-color-text-heading);
          text-decoration: none;
          transition:
              background-color 120ms,
              color 120ms,
              border-color 120ms;
      }
      :root .search .masina-searchfilter:hover,
      :root .search .masina-searchfilter:focus-visible {
          border-color: var(--nf-color-brand-primary);
          color: var(--nf-color-brand-primary);
      }
      :root .search .masina-searchfilter.is-active {
          background: var(--nf-color-brand-primary);
          border-color: var(--nf-color-brand-primary);
          color: var(--nf-color-text-on-color);
      }

      /* --- Tablet: restore hairlines for positions 3-4 --- */
      @media (max-width: 1024px) {
          :root .search .site-main > article:not(:nth-of-type(4n + 1))::before {
              display: none;
          }
          :root .search .site-main > article:not(:nth-of-type(2n + 1))::before {
              display: block;
          }
          :root .search .site-main > article:nth-of-type(4n + 1)::after,
          :root .search .site-main > article:nth-of-type(4n)::after {
              left: calc(-0.5 * var(--nf-arch-colgap));
              right: calc(-0.5 * var(--nf-arch-colgap));
          }
          :root .search .site-main > article:nth-of-type(2n + 1)::after {
              left: 0;
          }
          :root .search .site-main > article:nth-of-type(2n)::after {
              right: 0;
          }
          :root .search .site-main > article:nth-of-type(-n + 2)::after {
              display: none;
          }
          :root .search .site-main > article:nth-of-type(n + 3)::after {
              display: block;
          }
      }

      /* --- Mobile: single column --- */
      @media (max-width: 767px) {
          :root .search .site-main > article::before {
              display: none;
          }
          :root .search .site-main > article::after {
              left: 0;
              right: 0;
          }
          /* Mirror of the archive fix: the 2-col clamps (@media <=1024) still
             match at <=767 and outrank the reset above (0,4,2 vs 0,3,2). Reset
             them at 2-col specificity. left/right only — the -n+2 / n+3 display
             toggles below are untouched. */
          :root .search .site-main > article:nth-of-type(2n)::after,
          :root .search .site-main > article:nth-of-type(2n + 1)::after {
              left: 0;
              right: 0;
          }
          :root .search .site-main > article:first-of-type::after {
              display: none;
          }
          :root .search .site-main > article:nth-of-type(n + 2)::after {
              display: block;
          }
      }

      /* ===== §4.18b  Search: no results =====================
         Core adds body.search-no-results; everything scopes off it. GP renders no-results.php inside .site-main asand it inherits grid-column  from the §4.16 rule. Spacing eye-tuned, no frame - TUNE. */

      :root .search-no-results .masina-searchbar {
          display: none;
      }

      :root .search-no-results .no-results .inside-article {
          padding: 0; /* GP's separate-containers padding */
      }
      :root .search-no-results .no-results {
          padding-block: var(--nf-space-64) var(--nf-space-80); /* TUNE */
      }
      :root .search-no-results .no-results .entry-header {
          margin: 0 0 var(--nf-space-16); /* TUNE */
      }
      :root .search-no-results .no-results .entry-title {
          font-size: var(--nf-fs-h1-article);
          line-height: var(--nf-lh-h1-article);
          letter-spacing: var(--nf-track-h1-article);
          color: var(--nf-color-text-heading); /* TUNE — brand red is an option */
          margin: 0;
      }
      :root .search-no-results .no-results .entry-content > p {
          max-width: 52ch; /* TUNE */
          font-size: var(--nf-fs-body-large);
          line-height: var(--nf-lh-body-large);
          letter-spacing: var(--nf-track-body-large);
          color: var(--nf-color-text-primary);
          margin: 0 0 var(--nf-space-48); /* TUNE */
      }
      :root .search-no-results .masina-noresults__search {
          max-width: 36rem; /* TUNE */
      }
      :root .search-no-results .masina-noresults__searchtitle {
          font-family: var(--nf-font-ui);
          font-weight: var(--nf-fw-bold);
          font-size: var(--nf-fs-label-category);
          line-height: var(--nf-lh-label-category);
          letter-spacing: var(--nf-track-label-category);
          text-transform: uppercase;
          color: var(--nf-color-text-quote);
          margin: 0 0 var(--nf-space-12); /* TUNE */
      }

      /* Form at half width on desktop; full width below, where the column is
         already narrow. Cap sits on the wrapper so "Mašina pretraga" and the
         input's hairline end on the same edge. */
      @media (min-width: 1025px) {
          :root .search-no-results .masina-noresults__search {
              max-width: 50%; /* TUNE */
          }
      }

      /* Tombstone: .search .page-title .masina-search-term coloured the term inside
         GP's headline. The headline is gone (snippet 52) and the term now lives in
         the hero input. The 'Search Results for: %s' branch of the gettext filter is
         dead for the same reason — kept so the ENG mirror inherits the decision
         rather than rediscovering it. */


      /* ===== §4.19  Meta row — shared typography ====================== */
         /* Cross-component rules for the meta row (category · separator · date).
            Live here rather than in §4.7/§4.8/§4.15 because each applies to all
            three, and loading last means they win over the component rules they
            correct without needing extra specificity. */

      /* All Dates Uppercase */
            :root :is(.masina-single__date, .masina-card__date, .masina-live__updated) {
                text-transform: uppercase;
            }

      /* Vertical Separators (Meta) */

            :root :is(.masina-single__sep, .masina-card__date)::before {
                font-family: var(--nf-font-ui);
                font-size: var(--nf-fs-label-base);   /* 12px flat */
                line-height: var(--nf-lh-dates);
            }

    /* HOME PAGE SETTINGS BEFORE HOME SECTIONS */
        /* SMALLER TOP MARGIN ON HOME */
            .home.separate-containers .site-main {
                margin-top: 0px;
            }

    /* ================================================================
               §4.20  HOME — SECTION WRAPPER
               Title left, three-dot ornament right, hairline under. Same
               structure as the archive .page-header (§4.16) but its own type:
               UI/Section-Name. Three-dot mask is distinct from the two-dot
               diaeresis used by flags and sidebar heads (§4.8) — masked SVG so
               it recolours via background-color and stays crisp in both modes.
               Head is editable text in the section pattern; dots are CSS-only.
               max-width:none opts out of the §3 readability measure; §4.20
               loads after §3 so it wins without extra specificity (§4.19 note).
    ================================================================ */
            :root .masina-section {
                margin-block: var(--nf-space-48);
            }
            :root .masina-section__head {
                display: flex;
                align-items: center;
                justify-content: space-between;
                gap: var(--nf-space-16);
                max-width: none;
                margin: 0 0 var(--nf-space-24);
                padding-bottom: var(--nf-space-16);
                border-bottom: var(--nf-bw-thin) solid var(--nf-border-default);
                font-family: var(--nf-font-ui);
                font-size: var(--nf-fs-section-name);
                line-height: var(--nf-lh-section-name);
                letter-spacing: var(--nf-track-section-name);
                font-weight: var(--nf-fw-medium);
                color: var(--nf-color-text-heading);
            }
            /* Dots: same masked 3-dot SVG as the taxonomy archive band (§4.16) —
               pair + offset single, viewBox 37x8, diameter = 1em. (The 2-dot
               diaeresis is §4.8. Duplicated data-URI masks are a known future
               tidy — a whole-file change, deferred.) */
            :root .masina-section__head::after {
                content: "";
                flex: none;
                font-size: 0.75rem;
                width: 4.625em;
                height: 1em;
                background-color: var(--nf-color-brand-primary);
                -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 37 8'%3E%3Ccircle cx='4' cy='4' r='4'/%3E%3Ccircle cx='15' cy='4' r='4'/%3E%3Ccircle cx='33' cy='4' r='4'/%3E%3C/svg%3E")
                    center / contain no-repeat;
                mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 37 8'%3E%3Ccircle cx='4' cy='4' r='4'/%3E%3Ccircle cx='15' cy='4' r='4'/%3E%3Ccircle cx='33' cy='4' r='4'/%3E%3C/svg%3E")
                    center / contain no-repeat;
            }

            /* ================================================================
               §4.21  HOME — QUOTES (Stav / "Rekli su nam…" section)
               [masina_quotes] emits a FLAT list of .masina-quote articles;
               --lg spans two grid columns, --sm one. Column count changes per
               breakpoint, so one grid produces all three frames with no
               wrappers and no nth-child. Both variants carry the same fields —
               the --sm card hides the quote text and photo and italicises the
               title (Quote/Inline).
            ================================================================ */
            :root .masina-quotes {
                display: grid;
                grid-template-columns: repeat(2, 1fr);
                column-gap: var(--nf-space-32);
                row-gap: var(--nf-space-20);
            }
            @media (min-width: 1024px) {
                :root .masina-quotes {
                    grid-template-columns: repeat(4, 1fr);
                }
            }
            :root .masina-quote {
                display: grid;
                grid-template-columns: 1fr auto;
                grid-template-rows: auto auto 1fr auto;
                grid-template-areas:
                    "title   photo"
                    "speaker photo"
                    "text    photo"
                    "glyph   glyph";
                column-gap: var(--nf-space-16);
                grid-column: span 2;
                padding-bottom: var(--nf-space-24);
                border-bottom: var(--nf-bw-thin) solid var(--nf-border-default);
            }
            :root .masina-quote--sm {
                grid-column: span 1;
                border-bottom: 0;
                padding-bottom: 0;
            }
            /* vertical hairline between the two small cards */
            :root .masina-quote--sm + .masina-quote--sm {
                border-left: var(--nf-bw-thin) solid var(--nf-border-default);
                padding-left: var(--nf-space-24);
            }
            :root .masina-quote__title {
                grid-area: title;
                margin: 0 0 var(--nf-space-8);
                font-family: var(--nf-font-display);
                font-size: var(--nf-fs-stav-title);
                line-height: var(--nf-lh-stav-title);
                letter-spacing: var(--nf-track-stav-title);
                font-weight: 600;
            }
            :root .masina-quote__title a {
                color: var(--nf-color-text-heading);
                text-decoration: none;
            }
            :root .masina-quote--sm .masina-quote__title {
                font-size: var(--nf-fs-quote);
                font-style: italic;
            }
            :root .masina-quote__speaker {
                grid-area: speaker;
                font-family: var(--nf-font-display);
                font-size: var(--nf-fs-author);
                font-weight: 600;
                color: var(--nf-color-brand-blue-soft);
                text-decoration: none;
            }
            /* byline: same size in both variants; only colour and style differ */
            :root .masina-quote--sm .masina-quote__speaker {
                font-size: var(--nf-fs-author);
                font-style: italic;
                color: var(--nf-color-text-quote);
            }
            :root .masina-quote__text {
                grid-area: text;
                margin-top: var(--nf-space-8);
                font-size: var(--nf-fs-body-base);
                line-height: var(--nf-lh-body-base);
                color: var(--nf-color-text-quote);
            }
            :root .masina-quote__text > :first-child { margin-top: 0; }
            :root .masina-quote__text > :last-child  { margin-bottom: 0; }
            :root .masina-quote--sm .masina-quote__text {
                display: none;
            }
            :root .masina-quote__photo {
                grid-area: photo;
                align-self: start;
                width: 98px;
            }
            :root .masina-quote__photo img {
                display: block;
                width: 98px;
                height: 98px;
                border-radius: 50%;
                object-fit: cover;
            }
            :root .masina-quote--sm .masina-quote__photo {
                display: none;
            }
            :root .masina-quote__glyph {
                grid-area: glyph;
                display: none;
                align-self: end;
                width: 1.25em;
                height: 1em;
                font-size: 1.25rem;              /* TUNE — glyph height = 1em */
                background-color: var(--nf-color-text-heading);
                -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 25 20'%3E%3Cpath d='M2.757 19.773q-1.128.555-1.754-.246-.752-1.047.25-1.787a25 25 0 0 0 2.945-2.463q1.38-1.294 2.13-3.45.376-1.11.126-1.971-.189-.863-1.504-.986-2.13-.246-3.572-1.293Q0 6.53 0 4.435q0-1.724 1.316-3.08Q2.632 0 5.013 0 7.33 0 9.085 1.848t1.755 4.928q0 2.957-1.19 5.42a16.6 16.6 0 0 1-3.071 4.313 23.3 23.3 0 0 1-3.822 3.264m14.16 0q-1.127.555-1.754-.246-.752-1.047.25-1.787a25 25 0 0 0 2.945-2.463q1.38-1.294 2.13-3.45.377-1.11.126-1.971-.187-.863-1.504-.986-2.13-.246-3.571-1.293-1.38-1.047-1.379-3.142 0-1.724 1.316-3.08Q16.792 0 19.173 0q2.319 0 4.073 1.848T25 6.776q0 2.957-1.19 5.42a16.6 16.6 0 0 1-3.07 4.313 23.3 23.3 0 0 1-3.823 3.264'/%3E%3C/svg%3E")
                    center / contain no-repeat;
                mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 25 20'%3E%3Cpath d='M2.757 19.773q-1.128.555-1.754-.246-.752-1.047.25-1.787a25 25 0 0 0 2.945-2.463q1.38-1.294 2.13-3.45.376-1.11.126-1.971-.189-.863-1.504-.986-2.13-.246-3.572-1.293Q0 6.53 0 4.435q0-1.724 1.316-3.08Q2.632 0 5.013 0 7.33 0 9.085 1.848t1.755 4.928q0 2.957-1.19 5.42a16.6 16.6 0 0 1-3.071 4.313 23.3 23.3 0 0 1-3.822 3.264m14.16 0q-1.127.555-1.754-.246-.752-1.047.25-1.787a25 25 0 0 0 2.945-2.463q1.38-1.294 2.13-3.45.377-1.11.126-1.971-.187-.863-1.504-.986-2.13-.246-3.571-1.293-1.38-1.047-1.379-3.142 0-1.724 1.316-3.08Q16.792 0 19.173 0q2.319 0 4.073 1.848T25 6.776q0 2.957-1.19 5.42a16.6 16.6 0 0 1-3.07 4.313 23.3 23.3 0 0 1-3.823 3.264'/%3E%3C/svg%3E")
                    center / contain no-repeat;
            }
            :root .masina-quote--sm .masina-quote__glyph {
                display: block;
                margin-top: var(--nf-space-24);
            }

            /* Desktop: the last large quote sits bottom-left, level with the small pair,
               which carry no border/padding. Drop its bottom hairline + padding so the whole
               bottom row lines up a touch higher and the stray left-side hairline is gone.
               ":has(+ --sm)" = the large card directly before the small pair = bottom-left. */
            @media (min-width: 1024px) {
                :root .masina-quote:not(.masina-quote--sm):has(+ .masina-quote--sm) {
                    border-bottom: 0;
                    padding-bottom: 0;
                }
            }
            /* Section-splitting rule, desktop: one line down the middle —
               between the two large cards in row 1, and between the large card
               and the small pair in row 2. 4 equal columns + equal gaps → 50%
               is the centre of the middle gutter, no per-item arithmetic. The
               line between the two small cards is the --sm + --sm border-left. */
            @media (min-width: 1024px) {
                :root .masina-quotes {
                    position: relative;
                }
                :root .masina-quotes::after {
                    content: "";
                    position: absolute;
                    top: 0;
                    bottom: 0;
                    left: calc(50% - (var(--nf-bw-thin) / 2));
                    width: var(--nf-bw-thin);
                    background-color: var(--nf-border-default);
                }
            }

            /* Closing hairline, mobile: the small cards carry no border-bottom,
               so the section would end open. On the container, not the cards —
               the last row is two side-by-side items and one line spans both. */
            @media (max-width: 767px) {
                :root .masina-quotes {
                    padding-bottom: var(--nf-space-24);             /* TUNE */
                    border-bottom: var(--nf-bw-thin) solid var(--nf-border-default);
                }
            }

            /* ================================================================
               §4.22  HOME — SECTIONS (grid, dividers, video, mobile rows)
               Structure contract (see the section patterns):
                 <section class="masina-section">            [--video variant]
                   <h2 class="masina-section__head">          (§4.20)
                   <div class="masina-section__body">
                     …Looper carries .masina-section__grid → <article> loop items
               The grid lives on the Looper — the real parent of the loop items.
               No width formula here: #page/.site-main carry the gutter box (§3);
               a second formula inside an already-inset ancestor subtracts the
               gutter twice.
            ================================================================ */

            /* --- §4.22.1  Grid: 4-up desktop / 2-up tablet / 1-up mobile ---- */
            :root .masina-section__grid {
                display: grid;
                grid-template-columns: 1fr;
                column-gap: var(--nf-space-24);
                row-gap: var(--nf-space-20);
            }
            @media (min-width: 768px) {
                :root .masina-section__grid {
                    grid-template-columns: repeat(2, 1fr);
                }
            }
            @media (min-width: 1024px) {
                :root .masina-section__grid {
                    grid-template-columns: repeat(4, 1fr);
                }
            }
            @media (max-width: 768px) {
            :root .masina-section__grid {
                row-gap: var(--nf-space-16);
                }
            }

            /* --- §4.22.2  Vertical column dividers -------------------------
               Hairline centred in the gutter, drawn as ::before so it sits in
               the gap instead of indenting the card. Suppressed on the item
               that starts each visual row.
               ⚠ Standard and video suppress DIFFERENT items: the video lead
               spans columns 1–2, so its right-hand items sit in column 3 and
               are NOT row-starts despite their nth-child index. Getting this
               wrong loses the lead/right divider or draws a stray far-left line.
               ⚠ display:none does not auto-restore at a later breakpoint — every
               restore below is explicit. Switches resolve by source order at
               equal specificity; keep them in order.
               Column count per breakpoint must match §4.22.1. ---------------- */
            :root .masina-section__grid > article {
                position: relative;
            }
            @media (min-width: 768px) {
                :root .masina-section__grid > article::before {
                    content: "";
                    position: absolute;
                    top: 0;
                    bottom: 0;
                    left: calc(var(--nf-space-24) / -2);
                    width: var(--nf-bw-thin);
                    background-color: var(--nf-border-default);
                }
                /* standard, 2-up: rows start at 1, 3, 5… */
                :root .masina-section:not(.masina-section--video)
                    .masina-section__grid > article:nth-child(2n + 1)::before {
                    display: none;
                }
                /* video, 2-up: lead is a full row of its own, so rows start at
                   1, 2, 4 — the lead plus the even items. */
                :root .masina-section--video
                    .masina-section__grid > article:first-child::before,
                :root .masina-section--video
                    .masina-section__grid > article:nth-child(2n)::before {
                    display: none;
                }
            }
            @media (min-width: 1024px) {
                /* standard, 4-up: restore the odd items, suppress only 4n+1 */
                :root .masina-section:not(.masina-section--video)
                    .masina-section__grid > article:nth-child(2n + 1)::before {
                    display: block;
                }
                :root .masina-section:not(.masina-section--video)
                    .masina-section__grid > article:nth-child(4n + 1)::before {
                    display: none;
                }
                /* video, 4-up: lead in cols 1–2, items 2–5 in cols 3–4. Every
                   one carries a divider — item 2/4 draws the lead↔right split,
                   item 3/5 the split between the small cards. Only the lead is
                   suppressed (above). */
                :root .masina-section--video
                    .masina-section__grid > article:nth-child(2n)::before {
                    display: block;
                }
            }

            /* --- §4.22.3  (removed) ----------------------------------------
               Tablet horizontal row hairlines lived here. Deleted: the frames
               separate tablet rows by whitespace, not rules. Mobile row lines
               are §4.22.5; do not "restore" a tablet equivalent. -------------- */

            /* --- §4.22.4  Video variant ------------------------------------
               Desktop: lead spans 2 columns and 2 rows, the other four sit 2x2
               beside it. Tablet: lead is a full-width row, then 2x2 below.
               Mobile: lead keeps its media, the rest become list rows. ------ */
            @media (min-width: 1024px) {
                :root .masina-section--video .masina-section__grid > article:first-child {
                    grid-column: span 2;
                    grid-row: span 2;
                }
            }
            @media (min-width: 768px) and (max-width: 1023px) {
                :root .masina-section--video .masina-section__grid > article:first-child {
                    grid-column: span 2;
                }
            }
            :root .masina-section--video
                .masina-section__grid > article:first-child .masina-card__title {
                font-size: var(--nf-fs-h2);
                line-height: var(--nf-lh-h2);
            }
            /* Small video cards carry title + meta only; excerpt and byline
               belong to the lead alone. */
            :root .masina-section--video
                .masina-section__grid > article:not(:first-child) .masina-card__excerpt,
            :root .masina-section--video
                .masina-section__grid > article:not(:first-child) .masina-card__byline {
                display: none;
            }
            /* Play triangle sized to the slot; the lead's would otherwise scale
               with its much larger media box. */
            :root .masina-section--video
                   .masina-section__grid > article:first-child .masina-card__media {
                   --nf-play-cap: 120px;
               }

            /* --- §4.22.5  Mobile list rows ---------------------------------
               Below 768 the frames drop the thumbnail from the tail of each
               section: standard sections keep 2 full cards then list from card
               3; video keeps its lead then lists from card 2. Rows carry title
               + category only, a hairline above each, and a closing rule below
               the section's last card — which reads as the top rule of the next
               section's title.
               border-top, not -bottom: the last card never leaves a trailing
               line whatever the card count, and the line between the last full
               card and the first row comes for free.
               Rows are re-placed explicitly: §4.16's mobile card grid puts the
               title at row 2 and the label at row 3, so hiding the media slot
               zeroes track 1 but leaves its row-gap behind. ----------------- */
            @media (max-width: 767px) {
                :root .masina-section:not(.masina-section--video)
                    .masina-section__grid > article:nth-child(n + 3),
                :root .masina-section--video
                    .masina-section__grid > article:nth-child(n + 2) {
                    padding-top: var(--nf-space-16);                /* TUNE */
                    border-top: var(--nf-bw-thin) solid var(--nf-border-default);
                }
                :root .masina-section:not(.masina-section--video)
                    .masina-section__grid > article:nth-child(n + 3) .masina-card__media-slot,
                :root .masina-section--video
                    .masina-section__grid > article:nth-child(n + 2) .masina-card__media-slot {
                    display: none;
                }
                :root .masina-section:not(.masina-section--video)
                    .masina-section__grid > article:nth-child(n + 3) .masina-card__title,
                :root .masina-section--video
                    .masina-section__grid > article:nth-child(n + 2) .masina-card__title {
                    grid-row: 1;
                }
                :root .masina-section:not(.masina-section--video)
                    .masina-section__grid > article:nth-child(n + 3) .masina-card__label,
                :root .masina-section--video
                    .masina-section__grid > article:nth-child(n + 2) .masina-card__label {
                    grid-row: 2;
                }
                /* §4.16's Analiza rail spans grid-row 2/-1 to clear the image
                   row; with no image it must start at row 1 or it hangs one
                   track low. Applies to video rows too — small video cards can
                   be Analiza-tagged. */
                :root .masina-section:not(.masina-section--video)
                    .masina-section__grid > article:nth-child(n + 3).tag-analiza .masina-card::before,
                :root .masina-section--video
                    .masina-section__grid > article:nth-child(n + 2).tag-analiza .masina-card::before {
                    grid-row: 1 / -1;
                }
                :root .masina-section:not(.masina-section--video)
                    .masina-section__grid > article:nth-child(n + 3) :is(
                        .masina-card__excerpt, .masina-card__byline, .masina-card__more ),
                :root .masina-section--video
                    .masina-section__grid > article:nth-child(n + 2) :is(
                        .masina-card__excerpt, .masina-card__byline, .masina-card__more ) {
                    display: none;
                }
                /* Closing hairline, every section. */
                :root .masina-section .masina-section__grid > article:last-child {
                    padding-bottom: var(--nf-space-16);             /* TUNE */
                    border-bottom: var(--nf-bw-thin) solid var(--nf-border-default);
                }
            }

            /* --- §4.22.6  Mobile inter-section spacing --------------------- */
            @media (max-width: 767px) {
                /* Collapse the inter-section gap: the closing row hairline
                   (§4.22.5) and the next section's head hairline should frame
                   the title symmetrically, not sit 48px apart. */
                :root .masina-section {
                    margin-block: var(--nf-space-24);
                }
                /* Head: match the space above the title to the padding below it.
                   The negative margin is head-INTERNAL — it pulls the head toward
                   its own section's top, never across a section boundary — so it
                   cannot drag adjacent content. Safe. */
                :root .masina-section__head {
                    padding-top: var(--nf-space-4);
                    margin-top: -0.5rem;
                }
            }

            /* --- §4.22.7  Dates suppressed on Home -------------------------
               TEMPORARY — editorial decision pending. Scoped to section and hero
               wrappers so archives, search and singles keep their dates. Remove
               the block, not the tokens, if dates come back. ----------------- */
            :root :is(.masina-section, .masina-hero) .masina-card__date {
                display: none;
            }

            /* ===== §4.23  INLINE CTA (Newsletter / Donacije / Kampanja) =====
            ==================== */

            :root .masina-cta.cta--donacije,
            :root .masina-cta.cta--kampanja   { --cta-accent: var(--nf-color-brand-primary); }
            :root .masina-cta.cta--newsletter { --cta-accent: var(--nf-color-brand-blue-deep); }

            :root .masina-cta {
                display: grid;
                grid-template-columns: 1fr auto;
                grid-template-areas:
                    "body  body"
                    "dots  button";
                align-items: end;
                column-gap: var(--nf-space-16);
                row-gap: var(--nf-space-24);
                background: var(--nf-surface-warm);
                padding: var(--nf-space-32) var(--nf-space-40);
                border-radius: 0;
            }
            /* border: red variants only */
            :root .masina-cta--inpost.cta--donacije,
            :root .masina-cta--inpost.cta--kampanja {
                border: var(--nf-bw-thin) solid var(--cta-accent);
            }
            :root .masina-cta--strip { border: 0; }

            :root .masina-cta__body { grid-area: body; min-width: 0; }
            :root .masina-cta__title {
                margin: 0 0 var(--nf-space-12);
                font-family: var(--nf-font-display);
                font-weight: var(--nf-fw-bold);
                font-style: italic;
                font-size: var(--nf-fs-cta-title);
                line-height: var(--nf-lh-cta-title);
                letter-spacing: var(--nf-track-cta-title);
                color: var(--nf-color-text-heading);
            }
            :root .masina-cta__text {
                margin: 0;
                font-family: var(--nf-font-display);
                font-size: var(--nf-fs-cta-text);
                line-height: var(--nf-lh-cta-text);
                letter-spacing: var(--nf-track-cta-text);
                color: var(--nf-color-text-heading);
                -webkit-hyphens: none;
                hyphens: none;
            }
            :root .masina-cta__button.masina-btn {
                grid-area: button;
                justify-self: end;
                align-self: end;
                background-color: var(--cta-accent);
                color: var(--nf-color-text-on-color);
            }
            :root .masina-cta__dots {
                grid-area: dots;
                align-self: end;
                width: 3.1em;
                height: 0.65em;
                font-size: 1.15rem;
                background-color: var(--cta-accent);
                -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 37 8'%3E%3Ccircle cx='4' cy='4' r='4'/%3E%3Ccircle cx='15' cy='4' r='4'/%3E%3Ccircle cx='33' cy='4' r='4'/%3E%3C/svg%3E")
                    center left / contain no-repeat;
                mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 37 8'%3E%3Ccircle cx='4' cy='4' r='4'/%3E%3Ccircle cx='15' cy='4' r='4'/%3E%3Ccircle cx='33' cy='4' r='4'/%3E%3C/svg%3E")
                    center left / contain no-repeat;
            }

            /* Add back the border to the Newslleter variation */
            :root .masina-cta--inpost.cta--newsletter {
                border: var(--nf-bw-thin) solid var(--cta-accent);
            }

              /* --- MOBILE --- */
                @media (max-width: 767px) {
                :root .masina-cta {
                   padding: var(--nf-space-24) var(--nf-space-32);
                }
            }

            /* --- strip variant: full-width band --------- */
            :root .masina-cta--strip {
                display: block;
                border: 0;
                border-radius: 0;
                padding-block: var(--nf-space-24);
                padding-inline: 0;
                margin-inline: calc(50% - 50vw);
            }
            :root .masina-cta--strip .masina-cta__inner {
                width: min(100% - (2 * var(--nf-gutter)), var(--nf-content-max));
                max-width: none;
                margin-inline: auto;
                border-block: var(--nf-bw-thin) solid var(--nf-border-default);
                padding-block: var(--nf-space-32);   /* TUNE — space between hairline and content */
                display: grid;
                grid-template-columns: 1fr auto;
                grid-template-areas:
                    "body  body"
                    "dots  button";
                align-items: end;
                column-gap: var(--nf-space-16);
                row-gap: var(--nf-space-24);
            }

            /* strip newsletter uses blue-soft, not blue-deep */
            :root .masina-cta--strip.cta--newsletter {
                --cta-accent: var(--nf-color-brand-blue-soft);
            }

            :root .masina-cta--strip .masina-cta__title {
	           display: none;
            }


            /* ===== §4.24 HERO — STANDARD =========================== */

            /* ---- SHELL: 3 columns (296 / 624 / 296), centred dividers ---- */
            :root .masina-hero {
                display: grid;
                grid-template-columns: 296fr 624fr 296fr;
                column-gap: 0;
                align-items: start;
            }
            /* Divider = border on the left edge of centre & right */
            :root .masina-hero__left,
            :root .masina-hero__centre {
                padding-inline-end: var(--nf-space-16);   /* [TUNE] gutter half */
            }
            :root .masina-hero__centre,
            :root .masina-hero__right {
                padding-inline-start: var(--nf-space-16); /* [TUNE] gutter half */
                border-inline-start: var(--nf-bw-thin) solid var(--nf-border-default);
            }

            :root .masina-hero .masina-section__head {
                margin-bottom: var(--nf-space-16);
            }

            /* Dots size for the Hero - candidate for global setting */
            @media (min-width: 1024px) {
            :root .masina-hero .masina-section__head::after {
                content: "";
                flex: none;
                font-size: 0.6rem;
                width: 4.625em;
                height: 1em;
                }
            }


            /* Hero titles wrap normally — balance (tokens §measure) reads as ragged. */
            :root .masina-hero :is(.masina-card__title, .masina-hero-row__title, .masina-hero-live__title) {
                text-wrap: wrap;
            }

            /* ---- LEFT: "Najnovije" head + media-less list rows ---------- */
            /* The head reuses .masina-section__head tokens.css §4.20 */
            :root .masina-hero-row {
                padding-block: var(--nf-space-16);
                border-top: var(--nf-bw-thin) solid var(--nf-border-default);
            }
            :root .masina-hero-row:first-child {
                border-top: 0;
            }
            :root .masina-hero-row:last-child {
                border-bottom: var(--nf-bw-thin) solid var(--nf-border-default);
            }
            /* Title  */
            :root .masina-hero-row__title {
                margin: 0 0 var(--nf-space-8);
                font-family: var(--nf-font-display);
                font-size: var(--nf-fs-h4);
                line-height: var(--nf-lh-h4);
                font-weight: var(--nf-fw-medium);
            }
            :root .masina-hero-row__title a {
                display: block;
                color: var(--nf-color-text-heading);
                text-decoration: none;
            }
            /* Row label */
            :root .masina-hero-row__label a {
                font-family: var(--nf-font-ui);
                font-size: var(--nf-fs-label-category);
                line-height: var(--nf-lh-label-category);
                font-weight: var(--nf-fw-bold);
                letter-spacing: var(--nf-track-label-category);
                text-transform: uppercase;
                color: var(--nf-color-brand-primary);
                text-decoration: none;
            }
            :root .masina-hero-row__label a.masina-flag--analiza {
                color: var(--nf-color-brand-blue-soft);
            }

            /* ---- CENTRE: image-card, H2 headline, revealed excerpt ------ */
            :root .masina-hero-card .masina-card__body {
                padding-top: var(--nf-space-12);
            }
            /* Title → H2 32/22. Prefixed to (0,4,0) so it beats the parallel card-title
               rule (0,3,0) below */
            :root .masina-hero .masina-hero-card--centre .masina-card__title {
                font-family: var(--nf-font-display);
                font-size: var(--nf-fs-h2);
                line-height: var(--nf-lh-h2);
                letter-spacing: var(--nf-track-h2);
                font-weight: var(--nf-fw-semibold);
	            margin-top: var(--nf-space-8)
            }
            /* Excerpt is display:none globally — reveal + clamp for the centre slot only. */
            :root .masina-hero .masina-hero-card--centre .masina-card__excerpt {
                display: -webkit-box;
                -webkit-line-clamp: 3;
                -webkit-box-orient: vertical;
                overflow: hidden;
                margin: var(--nf-space-8) 0 0;
                font-family: var(--nf-font-display);
                font-size: var(--nf-fs-excerpt);
                line-height: var(--nf-lh-excerpt);
                color: var(--nf-color-text-heading);
            }

            /* ---- RIGHT: two stacked image-cards ------------------------- */
            :root .masina-hero__right {
                display: flex;
                flex-direction: column;
                gap: var(--nf-space-20);                  /* [TUNE] */
            }

            /* ---- ANALIZA treatment (image-card) --- */
            :root .masina-hero .masina-card:has(.masina-flag--analiza) .masina-card__body {
                position: relative;
                padding-left: var(--nf-space-12);
            }
            :root .masina-hero .masina-card:has(.masina-flag--analiza) .masina-card__body::before {
                content: "";
                position: absolute;
                left: 0;
                top: .9rem;                  /* = body padding-top → bar starts at the category, not the thumbnail gap */
                bottom: 0;
                width: 3px;                               /* [TUNE] 3 (site) vs 4 (context) */
                background: var(--nf-color-brand-blue-soft);
            }

            /* under-head line is the section head's own border-bottom; drop row 1's top */
            :root .masina-section__head + .masina-hero-row {
                border-top: 0;
	  padding-top: 0;
            }

            /* Tablet only (768–1024): kill the doubled hairline at the top of column 2. */
            @media (min-width: 768px) and (max-width: 1024px) {
                :root .masina-hero__left .masina-hero-row:nth-child(3) {
                    border-top: 0;
			  padding-top:0;
                }
            }

            /* Tablet only (768–1024): vertical divider between the two Najnovije columns. */
            @media (min-width: 768px) and (max-width: 1024px) {
                :root .masina-hero__left { position: relative; }
                :root .masina-hero__left::after {
                    content: "";
                    position: absolute;
                    left: 50%;
                    top: 4rem;          /* clears the one-line head; no space token reaches this height */
                    bottom: 0;
                    width: var(--nf-bw-thin);
                    background: var(--nf-border-default);
                    pointer-events: none;
                }
            }

            /* ---- ANALIZA treatment (media-less Najnovije row) */
            :root .masina-hero-row:has(.masina-flag--analiza) {
                position: relative;
                padding-left: var(--nf-space-16);
            }
            :root .masina-hero-row:has(.masina-flag--analiza)::before {
                content: "";
                position: absolute;
                left: 0;
                top: var(--nf-space-20);      /* = row padding-block → bar spans the text, clear of the between-row hairlines */
                bottom: var(--nf-space-16);
                width: 3px;                   /* match the hero image-card bar; global 3-vs-4 stays the flagged TUNE */
                background: var(--nf-color-brand-blue-soft);
            }
            /* Edge case: newest post = Analiza → it's the first row under the head, which
               has padding-top:0 (.masina-section__head + .masina-hero-row) Drop this rule if Analiza can never
               land first in the list. */
            :root .masina-section__head + .masina-hero-row:has(.masina-flag--analiza)::before {
                top: 0;
            }

            /* ============ TABLET  (≤1024): centre → right(2-up) → najnovije(2-col) ==== */
            @media (max-width: 1024px) {
                :root .masina-hero {
                    display: flex;
                    flex-direction: column;
                    gap: var(--nf-space-32);
                }
                /* dividers off */
                :root .masina-hero__left,
                :root .masina-hero__centre {
                    padding-inline-end: 0;
                }
                :root .masina-hero__centre,
                :root .masina-hero__right {
                    padding-inline-start: 0;
                    border-inline-start: 0;
                }
                :root .masina-hero__centre { order: 1; }
                :root .masina-hero__right {
                    order: 2;
                    flex-direction: row;
                    gap: var(--nf-space-32);
                }
                :root .masina-hero__right > .masina-card {
                    flex: 1;
                    min-width: 0;
                }
                :root .masina-hero__left {
                    order: 3;
                    display: grid;
                    grid-template-columns: 1fr 1fr;
                    column-gap: var(--nf-space-32);
                }
                :root .masina-section__head { grid-column: 1 / -1;
	            }
                :root .masina-hero-row:nth-last-child(2) {
                    border-bottom: var(--nf-bw-thin) solid var(--nf-border-default);
                }
            }


            /* ============ MOBILE  (≤767): single column, images kept ================= */
            @media (max-width: 767px) {
                :root .masina-hero__right {
                    flex-direction: column;
                    gap: 0;
                }
                :root .masina-hero__right > .masina-card + .masina-card {
                    border-top: var(--nf-bw-thin) solid var(--nf-border-default);
                    padding-top: var(--nf-space-24);
                }
                :root .masina-hero__left {
                    display: block;
                }
            }

            /* Mobile: the tablet col-1 closing line (:nth-last-child(2)) leaks down via the
               ≤1024 block and stacks with card 4's border-top → doubled hairline under card 3.
               Single-column mobile doesn't need it. Scoped to __left; Blog uživo __aside keeps its own. */
            @media (max-width: 767px) {
                :root .masina-hero__left .masina-hero-row:nth-last-child(2) {
                    border-bottom: 0;
                }
            }

            /* ============================================================
               PARALLEL card-label / card-title rules — hero reach for the built card-loop styling. RENDER-IDENTICAL to tokens.css 4081/4096/4106/4111.  ============================================================ */
            :root .masina-hero .masina-card__label {
                display: flex;
                align-items: baseline;
                flex-wrap: wrap;
                column-gap: var(--nf-space-8);
            }
            :root .masina-hero .masina-card__label a {
                font-family: var(--nf-font-ui);
                font-weight: var(--nf-fw-bold);
                font-size: var(--nf-fs-label-category);
                line-height: var(--nf-lh-label-category);
                letter-spacing: var(--nf-track-label-category);
                text-transform: uppercase;
                color: var(--nf-color-brand-primary);
                text-decoration: none;
	            margin-bottom: var(--nf-space-4);
            }
            :root .masina-hero .masina-card__label a.masina-flag--analiza {
                color: var(--nf-color-brand-blue-soft);
            }
            :root .masina-hero .masina-card__title {
                font-family: var(--nf-font-display);
                font-size: var(--nf-fs-card-title);
                line-height: var(--nf-lh-card-title);
                letter-spacing: var(--nf-track-card-title);
            }


            /* ===== §4.25 HERO — BLOG UŽIVO
            =========================== */

            /* ---- SHELL: flex-wrap — headline | figure | aside, timeline full-width below. ---- */
            :root .masina-hero--blog-uzivo {
                display: flex;
                flex-wrap: wrap;
                align-items: flex-start;
                column-gap: var(--nf-space-32);   /* [TUNE] */
                row-gap: var(--nf-space-32);      /* [TUNE] */
                width: 100%;
                min-width: 0;
            }
            :root .masina-hero__headline { flex: 341 1 0; min-width: 0; }   /* frame proportions via grow */
            :root .masina-hero__figure   { flex: 579 1 0; min-width: 0; }
            :root .masina-hero__aside    { flex: 296 1 0; min-width: 0; }
            :root .masina-hero__timeline {
                flex: 0 0 100%;
                width: 100%;
                min-width: 0;
                border-top: var(--nf-bw-thin) solid var(--nf-border-default);
                padding-top: var(--nf-space-32);
            }

            /* ---- HEADLINE: meta (dots / UŽIVO / date) ---- */
            :root .masina-hero-live__meta {
                display: flex;
                align-items: center;
                gap: var(--nf-space-8);
                margin-bottom: var(--nf-space-16);
            }
            /* Flag reused for its blink */
            :root .masina-hero-live__meta .masina-flag--blog-uzivo {
                color: var(--nf-color-brand-primary);
                font-family: var(--nf-font-ui);
                font-size: var(--nf-fs-label-base);
                font-weight: var(--nf-fw-bold);
                line-height: var(--nf-lh-label-base);
                letter-spacing: var(--nf-track-label-base);
                text-transform: uppercase;
                text-decoration: none;
            }
            :root .masina-hero-live__meta .masina-flag--blog-uzivo::after  { order: -2; } /* pair first  */
            :root .masina-hero-live__meta .masina-flag--blog-uzivo::before { order: -1; margin-inline-start: 0;
            }
            :root .masina-hero-live__date {
                font-family: var(--nf-font-ui);
                font-size: var(--nf-fs-dates);
                color: var(--nf-color-text-quote);
                text-transform: uppercase;
            }
            :root .masina-hero-live__date::before {
                content: "|";
                margin-inline-end: var(--nf-space-8);
                color: var(--nf-color-text-quote);
            }

            /* ---- HEADLINE: title + excerpt ---- */
            :root .masina-hero-live__title {
                margin: 0 0 var(--nf-space-16);
                font-family: var(--nf-font-display);
                font-size: var(--nf-fs-h2);
                line-height: var(--nf-lh-h2);
                letter-spacing: var(--nf-track-h2);
                font-weight: var(--nf-fw-semibold);
            }
            :root .masina-hero-live__title a {
                color: var(--nf-color-text-heading);
                text-decoration: none;
            }
            :root .masina-hero-live__title a:hover,
            :root .masina-hero-live__title a:focus-visible {
                color: var(--nf-color-brand-primary);
                text-decoration-line: underline;
                text-decoration-color: var(--nf-color-brand-primary);
                text-decoration-thickness: 1px;
                text-underline-offset: 0.16em;
            }
            :root .masina-hero-live__excerpt {
                margin: 0;
                font-family: var(--nf-font-display);
                font-size: var(--nf-fs-body-base);
                line-height: var(--nf-lh-body-base);
                color: var(--nf-color-text-heading);
            }

            /* ---- FIGURE: 8/5 like all heroes ---- */
            :root .masina-hero__figure .masina-card__media {
                display: block;
                width: 100%;
            }
            :root .masina-hero__figure img {
                display: block;
                width: 100%;
                aspect-ratio: 8 / 5; /* same ratio as Standard/Tema dana heroes */
                object-fit: cover;
            }

            /* ---- TEMA DANA pill — */
            :root .masina-hero__tema {
                display: inline-flex;
                align-items: center;
                gap: var(--nf-space-8);
                padding: 0 var(--nf-space-12);   /* [TUNE] */
	            margin-bottom: var(--nf-space-4);
                background: var(--nf-surface-warm);
                border-radius: var(--nf-radius-pill);
                font-family: var(--nf-font-ui);
                font-weight: var(--nf-fw-bold);
                font-size: var(--nf-fs-label-category);
                line-height: var(--nf-lh-label-category);
                letter-spacing: var(--nf-track-label-category);
                text-transform: uppercase;
            }
            :root .masina-hero__tema-name {
                color: var(--nf-color-text-heading);
            }
            :root .masina-hero__tema-tag {
                display: inline-flex;
                align-items: center;
                gap: var(--nf-space-8);
                color: var(--nf-color-brand-primary);
                text-decoration: none;
	            margin-top: var(--nf-space-4);
            }
            /* Separator */
            :root .masina-hero__tema-tag::before {
                content: "";
                width: var(--nf-bw-thin);
                height: .8em;
                background: var(--nf-border-default);
            }

            /* ---- TIMELINE STRIP ---- */
            :root .masina-live-tl--strip {
                display: block;
                width: 100%;
                min-width: 0;
                overflow-x: auto; /* the strip (nav) is the scroll container */
                scrollbar-width: none;
            }
            :root .masina-live-tl--strip::-webkit-scrollbar { display: none; }
            :root .masina-live-tl--strip .masina-live-tl__list {
                display: flex;
                flex-wrap: nowrap;
                overflow-y: visible;
                width: 100%;
                min-width: 0;
                max-height: none;
                margin: 0;
                padding: var(--nf-space-16) 0 0;
                scrollbar-width: none;
                -webkit-mask: none;
                mask: none;
            }
            :root .masina-live-tl--strip .masina-live-tl__item {
                flex: 0 0 auto;
                width: 15rem;                /* [TUNE] ~240px */
                margin-top: 0;
                padding-right: var(--nf-space-32);
                padding-top: var(--nf-space-16);
                border-top: var(--nf-bw-thin) solid var(--nf-color-brand-primary);
            }
            :root .masina-live-tl--strip .masina-live-tl__item::before {
                left: 0;
                top: -6px;
            }
            :root .masina-live-tl--strip .masina-live-tl__item::after { content: none; }  /* kill vertical rail line */
            :root .masina-live-tl--strip .masina-live-tl__time { text-transform: uppercase; }

            /* Timeline item hover/focus */
            :root .masina-live-tl--strip .masina-live-tl__item a:hover,
            :root .masina-live-tl--strip .masina-live-tl__item a:focus-visible {
                color: var(--nf-color-brand-primary);
                text-decoration: none;
            }
            :root .masina-live-tl--strip .masina-live-tl__item a:hover .masina-live-tl__time,
            :root .masina-live-tl--strip .masina-live-tl__item a:hover .masina-live-tl__label,
            :root .masina-live-tl--strip .masina-live-tl__item a:focus-visible .masina-live-tl__time,
            :root .masina-live-tl--strip .masina-live-tl__item a:focus-visible .masina-live-tl__label {
                color: var(--nf-color-brand-primary);
            }

            /* ---- ARROWS: below the strip, desktop/tablet only ---- */
            :root .masina-live-tl__nav {
                display: flex;
                justify-content: space-between;   /* far left / far right */
                margin-top: 0;
            }
            :root .masina-live-tl__arrow {
                width: 2rem;
                height: 2rem;
                flex: none;
                padding: 0;  /* clear GP <button> padding/min-width */
                min-width: 0;
                display: inline-flex;
                align-items: center;
                justify-content: center;
                border: var(--nf-bw-thin) solid var(--nf-border-default);
                border-radius: var(--nf-radius-circle);
                background: transparent;
                color: var(--nf-border-default);
                font-size: 1.5rem;
                line-height: 1;
                cursor: pointer;
            }
            :root .masina-live-tl__arrow:hover,
            :root .masina-live-tl__arrow:focus-visible {
                border-color: var(--nf-color-brand-primary);
                color: var(--nf-color-brand-primary);
            }

            /* ---- TABLET (≤1024): stack — central post (figure + headline) → timeline → Najnovije ---- */
            @media (max-width: 1024px) {
                :root .masina-hero--blog-uzivo {
                    flex-direction: column;
                    flex-wrap: nowrap;
                    align-items: stretch;
                    gap: var(--nf-space-32);
                }
                :root .masina-hero__figure   { order: 1; flex: none; }
                :root .masina-hero__headline { order: 2; flex: none; }
                :root .masina-hero__timeline { order: 3; flex: none; }
                :root .masina-hero__aside    { order: 4; flex: none; }
            }

            /* ---- MOBILE (≤767):  ---- */
            @media (max-width: 767px) {
                :root .masina-live-tl__nav { display: none; }
            }

            /* Blog uživo Najnovije */
            :root .masina-hero--blog-uzivo .masina-hero__aside .masina-hero-row:last-child {
                display: none;
            }
            :root .masina-hero--blog-uzivo .masina-hero__aside .masina-hero-row:nth-last-child(2) {
                border-bottom: var(--nf-bw-thin) solid var(--nf-border-default);
            }

            /* ----------------------------------------------------------
               4.29  ALIGNWIDE / ALIGNFULL CONTAINMENT — single article body
               GP expands .alignwide/.alignfull outward into .inside-article's
               40px padding. On a single with a sidebar that padding is the
               gap to the sidebar, so wide blocks overlap it. The reading
               column is measure-based by design and has no room to bleed —
               so wide alignment is contained to the content width here.
               Corpus-wide: applies to any wide-aligned block, not just embeds.
            ---------------------------------------------------------- */
            :root .single .entry-content .alignwide,
            :root .single .entry-content .alignfull {
                max-width: 100%;
                width: 100%;
                margin-left: 0;
                margin-right: 0;
            }


            /* ============================================================
               §4.26  STATIČNE STRANICE — static text pages
               Impressum · Kontakt · O nama · Donacije · Uslovi korišćenja ·
               Mašina njuzleter. Default GP page template, six contents.

               Scoped body.page:not(.home): the static FRONT page (Home) is also
               a .page, so a bare body.page would box the hero — :not(.home)
               keeps Home on the §3 base layout. (WooCommerce donation pages are
               also .page and will inherit this later — see note; may want a
               positive body class then.)

               Column from the 1440 frame: 842px centred (1440 − 2×299). Text
               column narrower (~70ch), left-aligned within it.
               ============================================================ */

            :root {
                --nf-page-measure: 842px;      /* [TUNE] frame column: H1 / dividers / CTA */
                --nf-page-measure-text: 63ch;  /* [TUNE] reading column: 65–75ch */
            }

            /* — Reading column: cap to 842 (overrides §3 body.page .site-main). */
            :root body.page:not(.home) .site-main {
                width: min(100% - (2 * var(--nf-gutter)), var(--nf-page-measure));
            }

            /* — Trim GP article top padding so H1↕separator is symmetric. */
            :root body.page:not(.home) .inside-article {
                padding-top: var(--nf-space-16);
            }

            /* — H1 (page title): Heading/H1-Article — Zilla SemiBold, 37px. */
            :root body.page:not(.home) .entry-title {
                font-size: var(--nf-fs-h1-article);
                line-height: var(--nf-lh-h1-article);
                letter-spacing: var(--nf-track-h1-article);
                font-weight: var(--nf-fw-semibold);
            }

            /* — Body copy: body-large, regular, ~70ch, no word-breaking. */
            :root body.page:not(.home) .entry-content p {
                font-size: var(--nf-fs-body-large);
                line-height: var(--nf-lh-body-large);
                letter-spacing: var(--nf-track-body-large);
                font-weight: var(--nf-fw-regular);
                color: var(--nf-color-text-heading);
                max-width: var(--nf-page-measure-text);
                text-wrap: pretty;
                -webkit-hyphens: none;
                hyphens: none;
            }

            /* — Lists: same measure, no hyphenation. */
            :root body.page:not(.home) .entry-content :is(ul, ol) {
                max-width: var(--nf-page-measure-text);
                -webkit-hyphens: none;
                hyphens: none;
            }

            /* — Section subheads: Heading/Article-H2 — Zilla SemiBold, 18px.
                 22px "Izdavač"-type heads still a [TUNE] pending markup. */
            :root body.page:not(.home) .entry-content :is(h2, h3) {
                font-size: var(--nf-fs-article-h2);
                line-height: var(--nf-lh-article-h2);
                letter-spacing: var(--nf-track-article-h2);
                font-weight: var(--nf-fw-semibold);
                color: var(--nf-color-text-heading);
                max-width: none;
            }

            /* — Section dividers (Option 1): core Separator = border/default
                 hairline, full column width (core defaults un-wide to 100px). */
            :root body.page:not(.home) .entry-content :is(.wp-block-separator, hr) {
                border: 0;
                border-top: var(--nf-bw-thin) solid var(--nf-border-default);
                height: 0;
                width: 100%;
                max-width: none;
                margin-block: var(--nf-space-32); /* [TUNE] frame rhythm */
                opacity: 1;
            }

            /* — O nama: award accent rails. .masina-awards is on each award
                 paragraph directly (no wrapper), so the rail sits on the class.
                 If later grouped in a container, change to .masina-awards > p.
                 Brand red is fixed (no dark-mode flip). */
            :root body.page:not(.home) .masina-awards {
                border-left: var(--nf-bw-medium) solid var(--nf-color-brand-primary);
                padding-left: var(--nf-space-16);
            }

            /* — Strip CTA on pages: re-cap inner to the page column so the band
                 aligns with body text (default --nf-content-max, 1280). */
            :root body.page:not(.home) .masina-cta--strip .masina-cta__inner {
                width: min(100% - (2 * var(--nf-gutter)), var(--nf-page-measure));
            }

            /* ============================================================
               §4.27  404 — full-bleed takeover (GP Hook Element, outside #page)
               Content + cogwheel side by side on desktop, stacked on mobile.
               Gear widget (© Garey Simpson) preserved — only scoped + tokenised
               (fill → brand, gear classes/keyframes namespaced to avoid leaks).
               All scoped to .error404 / .masina-404, inert everywhere else.
               ============================================================ */

            /* Hide default chrome; the hook renders its content outside #page. */
            :root .error404 #page, :root .error404 .masina-header__bottom-inner,
            :root .error404 .secondary-navigation,
            :root .error404 .main-navigation.has-branding .inside-navigation.grid-container {
                display: none;
            }


            /* Layout: stacked on mobile, side by side ≥768px. */
            :root .masina-404 {
                display: flex;
                flex-direction: column;
                align-items: stretch;              /* mobile: text flush-left, no centre indent (#3) */
                gap: var(--nf-space-32);
                padding-block: var(--nf-space-40); /* [TUNE] top/bottom breathing, no huge gap (#3) */
                padding-inline: var(--nf-gutter);
                box-sizing: border-box;
                overflow-x: clip;                  /* §3's #page guard is hidden on 404, so guard here */
            }
            @media (min-width: 768px) {
                :root .masina-404 {
                    flex-direction: row;
                    align-items: center;           /* columns vertically centred */
                    gap: var(--nf-space-64);
                }
                :root .masina-404__content,
                :root .masina-404 .cogwheel {
                    flex: 1 1 0;                   /* two approx-equal columns (#2) */
                    min-width: 0;                  /* allow shrink → kills the horizontal scroll (#1) */
                }
            }

            :root .masina-404__content {
                display: flex;
                flex-direction: column;
                gap: var(--nf-space-16);
                max-width: 34rem;
            }

            :root .masina-404__title {
                margin: 0;
                color: var(--nf-color-brand-primary);
                font-family: var(--nf-font-display);
                font-weight: var(--nf-fw-bold);
                font-size: clamp(3rem, 2.2rem + 4vw, 5.25rem); /* ~48–84px [TUNE] */
                line-height: 1.05;
            }

            :root .masina-404__tagline {
                margin: 0;
                color: var(--nf-color-text-heading);
                font-family: var(--nf-font-display);
                font-size: var(--nf-fs-h2);
                line-height: var(--nf-lh-h2);
            }

            :root .masina-404__codes,
            :root .masina-404__opcije {
                margin: 0;
                color: var(--nf-color-text-heading);
                font-size: var(--nf-fs-body-large);
                line-height: var(--nf-lh-body-large);
            }

            /* Opcije links — class on each <a> for separate control. */
            :root .masina-404__link {
                color: var(--nf-color-text-heading);
                text-decoration: none;
	    border-bottom: var(--nf-bw-medium) solid var(--nf-color-brand-primary);
            }
            :root .masina-404__link:hover,
            :root .masina-404__link:focus-visible {
                color: var(--nf-color-brand-primary);
                border-bottom: var(--nf-bw-medium) solid var(--nf-color-text-heading);
                text-decoration: none;
            }

            :root .error404 .page-hero {
                padding-top: 0;
                padding-left: 0;
            }

            /* COGWHEEL ANIMATION (Garey Simpson) */

            .cogwheel {
              height: 100%;
              display: -webkit-box;
              display: -webkit-flex;
              display: -ms-flexbox;
              display: flex;
              -webkit-box-pack: center;
              -webkit-justify-content: center;
              -ms-flex-pack: center;
              justify-content: center;
              -webkit-box-align: center;
              -webkit-align-items: center;
              -ms-flex-align: center;
              align-items: center; }

            .error404 .machine {
              width: 100vmin;
              fill: #f94538; }

            .error404 .small-shadow, .medium-shadow, .large-shadow {
              fill: #aaaaaa}

            .error404 .small {
              -webkit-animation: counter-rotation 2.5s infinite linear;
	   -moz-animation: counter-rotation 2.5s infinite linear;
	     -o-animation: counter-rotation 2.5s infinite linear;
	        animation: counter-rotation 2.5s infinite linear;
              -webkit-transform-origin: 100.136px 225.345px;
                  -ms-transform-origin: 100.136px 225.345px;
                      transform-origin: 100.136px 225.345px; }

            .error404 .small-shadow {
              -webkit-animation: counter-rotation 2.5s infinite linear;
	   -moz-animation: counter-rotation 2.5s infinite linear;
	     -o-animation: counter-rotation 2.5s infinite linear;
	        animation: counter-rotation 2.5s infinite linear;
              -webkit-transform-origin: 110.136px 235.345px;
                  -ms-transform-origin: 110.136px 235.345px;
                      transform-origin: 110.136px 235.345px; }

            .error404 .medium {
              -webkit-animation: rotation 3.75s infinite linear;
	   -moz-animation: rotation 3.75s infinite linear;
	     -o-animation: rotation 3.75s infinite linear;
	        animation: rotation 3.75s infinite linear;
              -webkit-transform-origin: 254.675px 379.447px;
                  -ms-transform-origin: 254.675px 379.447px;
                      transform-origin: 254.675px 379.447px; }

            .error404 .medium-shadow {
              -webkit-animation: rotation 3.75s infinite linear;
	   -moz-animation: rotation 3.75s infinite linear;
	     -o-animation: rotation 3.75s infinite linear;
	        animation: rotation 3.75s infinite linear;
              -webkit-transform-origin: 264.675px 389.447px;
                  -ms-transform-origin: 264.675px 389.447px;
                      transform-origin: 264.675px 389.447px; }

            .error404 .large {
              -webkit-animation: counter-rotation 5s infinite linear;
                 -moz-animation: counter-rotation 5s infinite linear;
	     -o-animation: counter-rotation 5s infinite linear;
                    	animation: counter-rotation 5s infinite linear;
              -webkit-transform-origin: 461.37px 173.694px;
                  -ms-transform-origin: 461.37px 173.694px;
                      transform-origin: 461.37px 173.694px; }

            .error404 .large-shadow {
              -webkit-animation: counter-rotation 5s infinite linear;
	   -moz-animation: counter-rotation 5s infinite linear;
	     -o-animation: counter-rotation 5s infinite linear;
	        animation: counter-rotation 5s infinite linear;
              -webkit-transform-origin: 471.37px 183.694px;
                  -ms-transform-origin: 471.37px 183.694px;
                      transform-origin: 471.37px 183.694px; }

            @-webkit-keyframes rotation {
                from {-webkit-transform: rotate(0deg);}
                to   {-webkit-transform: rotate(359deg);}
            }
            @-moz-keyframes rotation {
                from {-moz-transform: rotate(0deg);}
                to   {-moz-transform: rotate(359deg);}
            }
            @-o-keyframes rotation {
                from {-o-transform: rotate(0deg);}
                to   {-o-transform: rotate(359deg);}
            }
            @keyframes rotation {
                from {transform: rotate(0deg);}
                to   {transform: rotate(359deg);}
            }

            @-webkit-keyframes counter-rotation {
                from {-webkit-transform: rotate(359deg);}
                to   {-webkit-transform: rotate(0deg);}
            }
            @-moz-keyframes counter-rotation {
                from {-moz-transform: rotate(359deg);}
                to   {-moz-transform: rotate(0deg);}
            }
            @-o-keyframes counter-rotation {
                from {-o-transform: rotate(359deg);}
                to   {-o-transform: rotate(0deg);}
            }
            @keyframes counter-rotation {
                from {transform: rotate(359deg);}
                to   {transform: rotate(0deg);}
            }
            /* ==========END OF 404 PAGE ============= */

            /* ==========================================================
               4.28  COOKIE CONSENT — Pressidium / CookieConsent v2
               ==========================================================
               The library themes itself through --cc-* custom properties
               declared at :root in bundle.client.css. We remap them onto
               --nf- tokens rather than override its selectors, so the
               banner inherits the html.dark-mode flip for free.

               ⚠ Pressidium's own dark mode must stay OFF — it re-declares
                 every --cc-* under .c_darkmode and would beat this mapping.
               ⚠ :root:root = (0,2,0) to outrank the library's own :root.
                 The second half of the anchor is needed because Pressidium
                 prints <style id="pressidium-cc-styles"> declaring the full
                 --cc-* set on .pressidium-cc-theme, a class on #cm ITSELF.
                 A declaration on the element always beats an inherited one,
                 so :root:root alone is never consulted there.
               ⚠ ORDER IS LOAD-BEARING. The @media block is LAST on purpose.
                 Media queries add no specificity — a later unscoped rule at
                 equal specificity beats an earlier rule inside @media at
                 every viewport. Do not move it up.
               ========================================================== */


            /* ---------- 1 · Token mapping ---------- */

            :root:root,
            :root .pressidium-cc-theme {
                --cc-font-family: var(--nf-font-ui);
                --cc-font-size: 1rem;
                --cc-bg: var(--nf-surface-page);
                --cc-text: var(--nf-color-text-heading);
                --cc-border-radius: 0;
                --cc-btn-border-radius: var(--nf-radius-pill);

                --cc-btn-primary-bg: var(--nf-color-brand-primary);
                --cc-btn-primary-text: var(--nf-color-text-on-color);
                --cc-btn-primary-hover-bg: var(--nf-color-text-heading);
                --cc-btn-primary-hover-text: var(--nf-surface-page);

                --cc-btn-secondary-bg: var(--nf-color-text-heading);
                --cc-btn-secondary-text: var(--nf-surface-page);
                --cc-btn-secondary-hover-bg: var(--nf-color-brand-primary);
                --cc-btn-secondary-hover-text: var(--nf-color-text-on-color);

                --cc-toggle-bg-off: var(--nf-border-default);
                --cc-toggle-bg-on: var(--nf-color-brand-primary);
                --cc-toggle-bg-readonly: var(--nf-border-default);
                --cc-toggle-knob-bg: var(--nf-surface-page);
                --cc-toggle-knob-icon-color: var(--nf-color-text-on-color);

                --cc-block-text: var(--nf-color-text-heading);

                /* hover == base, literally. These two MUST stay identical —
                   any difference is the category-row colour flip. */
                --cc-cookie-category-block-bg: var(--nf-surface-warm);
                --cc-cookie-category-block-bg-hover: var(--nf-surface-warm);

                --cc-section-border: var(--nf-border-default);
                --cc-cookie-table-border: var(--nf-border-default);

                --cc-overlay-bg: #1a1a1a;
                --cc-overlay-opacity: 0.6;
                --cc-consent-modal-box-shadow: var(--nf-shadow-elevated);
                --cc-webkit-scrollbar-bg: var(--nf-border-default);
                --cc-webkit-scrollbar-bg-hover: var(--nf-color-text-quote);
            }


            /* ---------- 2 · Buttons ---------- */

            /* The library's own reset (.cc_div *) zeroes letter-spacing,
               text-transform and border-radius. Restore the site's button
               contract at (0,3,0). */
            :root .cc_div .c-bn {
                font-family: var(--nf-font-ui);
                font-size: var(--nf-fs-button);
                font-weight: var(--nf-fw-medium);
                line-height: var(--nf-lh-button);
                letter-spacing: var(--nf-track-button);
                text-transform: uppercase;
                border-radius: var(--nf-radius-pill);
                padding: 0.625rem 1.1875rem;
                flex: 0 0 auto;
                white-space: nowrap;
            }

            /* Uppercase must reach the label span: the library wraps labels
               in <span>, and .cc_div * sets text-transform:none on
               descendants, so uppercasing the button alone does nothing. */
            :root .cc_div .c-bn span {
                text-transform: uppercase;
                letter-spacing: var(--nf-track-button);
                font-size: 1em;
            }

            /* The library assigns the primary fill positionally via
               #c-bns button:first-child — which is now the injected
               Podešavanja button. Reassign explicitly, and set visual
               order here rather than moving DOM nodes. */
            :root #c-bns .masina-cookie-settings {
                order: 1;
                background: transparent;
                color: var(--nf-color-text-heading);
                border: var(--nf-bw-thin) solid var(--nf-border-default);
            }
            :root #c-bns .masina-cookie-settings:hover,
            :root #c-bns .masina-cookie-settings:focus-visible {
                background: var(--nf-color-text-heading);
                color: var(--nf-surface-page);
            }
            :root #c-bns #c-s-bn {
                order: 2;
                background: var(--nf-color-text-heading);
                color: var(--nf-surface-page);
            }
            :root #c-bns #c-s-bn:hover,
            :root #c-bns #c-s-bn:focus-visible {
                background: var(--nf-color-brand-primary);
                color: var(--nf-color-text-on-color);
            }
            :root #c-bns #c-p-bn {
                order: 3;
                background: var(--nf-color-brand-primary);
                color: var(--nf-color-text-on-color);
            }
            :root #c-bns #c-p-bn:hover,
            :root #c-bns #c-p-bn:focus-visible {
                background: var(--nf-color-text-heading);
                color: var(--nf-surface-page);
            }


            /* ---------- 3 · Headings and body copy ---------- */

            :root #c-ttl,
            :root #s-ttl {
                font-family: var(--nf-font-display);
                font-weight: var(--nf-fw-bold);
                color: var(--nf-color-text-heading);
            }


            /* ---------- 4 · Slim bar, desktop ----------
               Library defaults cap #c-inr at 32em and drop #c-bns onto its
               own row. Single consolidated padding declaration — there were
               three competing ones before. */

            :root #cm.bar {
                padding: var(--nf-space-24) var(--nf-space-32);
                border-top: var(--nf-bw-thin) solid var(--nf-color-text-heading);
            }
            :root #cm.bar #c-inr {
                max-width: var(--nf-content-max);
                display: flex;
                align-items: center;
                gap: var(--nf-space-48);
            }
            :root #cm.bar #c-inr-i {
                flex: 1 1 auto;
            }
            :root #cm.bar #c-bns {
                margin-top: 0;
                max-width: none;
                flex: 0 0 auto;
                gap: var(--nf-space-8);
            }
            :root #cm.bar #c-ttl {
                font-family: var(--nf-font-display);
                font-size: var(--nf-fs-h4);
                margin-bottom: var(--nf-space-12);
            }
            /* No max-width: the text block takes the width the buttons leave,
               which keeps the copy to two lines and the bar short. */
            :root #cm.bar #c-txt {
                font-family: var(--nf-font-display);
                font-size: var(--nf-fs-caption);
                line-height: var(--nf-lh-body-base);
                max-width: none;
            }


            /* ---------- 5 · Settings modal ----------
               Nothing in the modal animates and nothing moves on hover.
               Anchored on #s-cnt / #s-bl only — the earlier pin routed
               through .b-bn, which never matched, which is why the jitter
               survived two passes. :is() takes its highest-specificity
               argument, so these are (1,2,0): clears .cc_div .b-tl (0,2,0)
               and #s-bl .b-tl (1,1,0) without !important. */

            :root :is(#s-cnt, #s-bl) *,
            :root :is(#s-cnt, #s-bl) *::before,
            :root :is(#s-cnt, #s-bl) *::after {
                transition: none;
                animation: none;
            }

            /* font-size is a literal rem, not a token: a fluid clamp() then
               cannot be the moving part. .c-bl:hover .b-tl is in the list
               because the row, not the button, may carry the hover. */
            :root :is(#s-cnt, #s-bl) .b-tl,
            :root :is(#s-cnt, #s-bl) .b-tl:hover,
            :root :is(#s-cnt, #s-bl) .b-tl:focus,
            :root :is(#s-cnt, #s-bl) .b-tl:focus-visible,
            :root :is(#s-cnt, #s-bl) .b-tl:active,
            :root :is(#s-cnt, #s-bl) .act .b-tl,
            :root :is(#s-cnt, #s-bl) .act .b-tl:hover,
            :root :is(#s-cnt, #s-bl) .c-bl:hover .b-tl,
            :root :is(#s-cnt, #s-bl) .c-bl:hover .b-tl:hover {
                font-family: var(--nf-font-ui);
                font-size: 1rem;
                line-height: 1.4;
                font-weight: var(--nf-fw-medium);
                padding: 1rem 5rem 1rem 2.25rem;
                margin: 0;
                transform: none;
            }

            /* The label node inherits wholesale — same trap as .c-bn span. */
            :root :is(#s-cnt, #s-bl) .b-tl *,
            :root :is(#s-cnt, #s-bl) .b-tl:hover *,
            :root :is(#s-cnt, #s-bl) .c-bl:hover .b-tl * {
                font: inherit;
                letter-spacing: inherit;
            }

            /* Site focus ring instead of the browser's blue one. */
            :root :is(#s-cnt, #s-bl) .b-tl:focus-visible {
                outline: var(--nf-bw-thin) solid var(--nf-color-brand-primary);
                outline-offset: -3px;
            }
            :root :is(#s-cnt, #s-bl) .b-tl:focus:not(:focus-visible) {
                outline: none;
            }

            /* Chevron: non-flipping neutral. --nf-surface-placeholder is the
               one grey the system declares as deliberately non-flipping;
               --nf-border-default does flip (#c2c2c2 → #727272).
               Second pair is a fallback in case .b-bn never matches here. */
            :root .cc_div .b-bn .exp::before,
            :root .cc_div .act .b-bn .exp::before,
            :root :is(#s-cnt, #s-bl) .exp::before,
            :root :is(#s-cnt, #s-bl) .act .exp::before {
                border-color: var(--nf-surface-placeholder);
            }

            /* ---------- 6 · Video consent gate ----------
               Same button contract as the consent panels. Colours stay
               literal white — the gate always sits on a dark video still in
               both modes, so a flipping token would break it. Overrides the
               snippet's own inline <style> on specificity, so the gate
               snippet needs no edit. */

            :root .masina-vc__btn {
                font-family: var(--nf-font-ui);
                font-size: var(--nf-fs-button);
                font-weight: var(--nf-fw-medium);
                letter-spacing: var(--nf-track-button);
                text-transform: uppercase;
                border-radius: var(--nf-radius-pill);
                padding: 0.625rem 1.1875rem;
                white-space: nowrap;
                background: transparent;
                color: #fff;
                border: var(--nf-bw-thin) solid #fff;
            }
            :root .masina-vc__btn--accept {
                background: var(--nf-color-brand-primary);
                color: var(--nf-color-text-on-color);
                border-color: var(--nf-color-brand-primary);
            }

            /* ---------- 7 · Mobile ----------
               MUST REMAIN THE LAST BLOCK IN §4.28. See the header note.
               #c-inr-i's inline padding indents the copy to where the pill's
               straight edge begins (radius ≈ 24px on a ~47px button), so the
               text no longer starts inside the curve. --nf-space-24 is the
               knob if the designer wants it tighter or looser. */

            @media (max-width: 767px) {
                /* Back to stacked — the library already columns #c-bns below 688. */
                :root #cm.bar #c-inr {
                    display: block;
                }
                :root #cm.bar {
                    padding: var(--nf-space-32) var(--nf-space-20);
                }
                :root #cm.bar #c-inr-i {
                    padding-inline: var(--nf-space-24);
                }
                :root #cm.bar #c-ttl {
                    font-size: var(--nf-fs-h4);
                    margin-bottom: var(--nf-space-16);
                }
                :root #cm.bar #c-txt {
                    font-size: var(--nf-fs-body-base);
                    line-height: var(--nf-lh-body-large);
                    max-width: none;
                    margin-bottom: 0;
                }
                :root #cm.bar #c-bns {
                    margin-top: var(--nf-space-32);
                    display: flex;
                    flex-direction: column;
                    gap: var(--nf-space-12);
                }
                :root #cm.bar #c-bns .c-bn {
                    width: 100%;
                    flex: 0 0 auto;
                    padding: 0.875rem 1.1875rem;
                }
            }

            /* ==================== end 4.28 ==================== */

      /* ============================================================
         5  DARK MODE — component overrides (unlayered)
         Non-token, component-level dark rules. Token flips live in 2.2.
      ============================================================ */

      /* No dark-mode link blanket here by design. Components carry their own
         base color token (nav → text-heading, donate → on-color non-flip,
         missionbtn → brand-primary, dropdown __cat/__cardtitle/__more), which
         flips correctly on its own — so no opt-outs are needed, and dropdown
         anchors no longer get forced blue in dark. Content-link dark behavior
         is handled by the §6 conventions (tokens flip). If an uncovered link
         context needs a distinct dark color, add a scoped rule — do not
         reintroduce a blanket `html.dark-mode a`. */

      /* ============================================================
         6  LINKS & CONTENT ANCHORS  (unlayered)
         First-pass conventions (designer, 2026-07). Dark behavior is
         handled by flipping tokens, not a blanket rule (see §5).
         Note: paragraph rule is scoped to `p a`, so component anchors
         (.masina-donate, tags, buttons) that sit in content but not in a
         <p> are exempt. If GP out-specifies .entry-title a, :root-prefix it.
      ============================================================ */

      /* --- Text links: paragraph body, author byline, tag list ---
         Author link carries hCard classes on the anchor (author url fn);
         .byline is the wrapping span, so target the anchor directly. */

      html body a {
          color: var(--nf-color-text-primary);
          text-decoration: none;
      }
      html body a:hover {
          color: var(--nf-color-brand-primary);
          text-decoration-line: underline;
          text-decoration-color: var(--nf-color-brand-primary);
          text-decoration-thickness: 1px;
          text-underline-offset: 0.16em;
          text-decoration-skip-ink: auto;
      }
      /* keep the global hover-underline off pill/button anchors */
      .masina-donate:hover,
      .masina-dropdown__missionbtn:hover {
          text-decoration: none;
      }
      .entry-content p a,
      .author.url.fn,
      .tags-links a {
          color: var(--nf-color-text-primary);
          text-decoration-line: underline;
          text-decoration-color: var(--nf-color-brand-primary);
          text-decoration-thickness: 2px;
          text-underline-offset: 0.18em;
          text-decoration-skip-ink: auto;
      }
      .entry-content p a:hover,
      .entry-content p a:focus-visible,
      .author.url.fn:hover,
      .author.url.fn:focus-visible,
      .tags-links a:hover,
      .tags-links a:focus-visible {
          color: var(--nf-color-brand-primary);
          text-decoration-color: var(--nf-color-brand-primary);
      }

      .masina-single__byline .author.url.fn:hover {
          text-decoration-line: underline;
          text-decoration-color: var(--nf-color-brand-primary);
          text-decoration-thickness: 1px;
          text-underline-offset: 0.16em;
          text-decoration-skip-ink: auto;
      }
      /* paragraph links: heavier underline on hover */
      .entry-content p a:hover,
      .entry-content p a:focus-visible {
          text-decoration-thickness: 4px;
      }
      /* tags keep a hairline underline in both states */
      .tags-links a,
      .tags-links a:hover,
      .tags-links a:focus-visible {
          text-decoration-thickness: 1px;
          text-underline-offset: 0.3em; /* tags sit lower than paragraph/author links */
      }

      /* --- Category links --- */
      html.light-mode .cat-links a {
          color: var(--nf-color-brand-primary);
          text-decoration: none;
      }
      html.light-mode .cat-links a:hover,
      html.light-mode .cat-links a:focus-visible {
          color: var(--nf-color-text-quote);
      }
      html.dark-mode .cat-links a {
          color: var(--nf-color-text-primary);
          text-decoration: none;
      }
      html.dark-mode .cat-links a:hover,
      html.dark-mode .cat-links a:focus-visible {
          color: var(--nf-color-brand-primary);
      }

      /* --- Archive / entry titles ---
         :root prefix: GP emits its own .entry-title a color (loads after
         tokens.css, ties on specificity, wins on order) and it doesn't flip →
         black-on-black in dark. (0,0,2,1) beats it so the token flips through. */
      :root .entry-title a {
          color: var(--nf-color-text-primary);
          text-decoration: none;
      }
      :root .entry-title a:hover,
      :root .entry-title a:focus-visible {
          color: var(--nf-color-text-quote);
          text-decoration-line: underline;
          text-decoration-color: var(--nf-color-brand-primary);
          text-decoration-thickness: 1px;
          text-underline-offset: 0.16em;
          text-decoration-skip-ink: auto;
      }

      /* --- Entry meta / date ---
         INTERIM (designer): fixed #868686 in both modes — not tokenized because
         it's temporary (= text-quote's light value; swap to var(--nf-color-text-quote)
         when it's allowed to flip). :root beats GP's own .entry-meta color. Meta
         LINKS (.cat-links a, author) keep their own §6 conventions via specificity. */
      :root .entry-meta,
      :root .entry-date.published {
          color: #868686;
      }

/* ============================================================
   5  DARK MODE — component overrides (unlayered)
   Non-token, component-level dark rules. Token flips live in 2.2.
============================================================ */

/* No dark-mode link blanket here by design. Components carry their own
   base color token (nav → text-heading, donate → on-color non-flip,
   missionbtn → brand-primary, dropdown __cat/__cardtitle/__more), which
   flips correctly on its own — so no opt-outs are needed, and dropdown
   anchors no longer get forced blue in dark. Content-link dark behavior
   is handled by the §6 conventions (tokens flip). If an uncovered link
   context needs a distinct dark color, add a scoped rule — do not
   reintroduce a blanket `html.dark-mode a`. */

/* ============================================================
   6  LINKS & CONTENT ANCHORS  (unlayered)
   First-pass conventions (designer, 2026-07). Dark behavior is
   handled by flipping tokens, not a blanket rule (see §5).
   Note: paragraph rule is scoped to `p a`, so component anchors
   (.masina-donate, tags, buttons) that sit in content but not in a
   <p> are exempt. If GP out-specifies .entry-title a, :root-prefix it.
============================================================ */

/* --- Text links: paragraph body, author byline, tag list ---
   Author link carries hCard classes on the anchor (author url fn);
   .byline is the wrapping span, so target the anchor directly. */

html body a {
    color: var(--nf-color-text-primary);
    text-decoration: none;
}
html body a:hover {
    color: var(--nf-color-brand-primary);
    text-decoration-line: underline;
    text-decoration-color: var(--nf-color-brand-primary);
    text-decoration-thickness: 1px;
    text-underline-offset: 0.16em;
    text-decoration-skip-ink: auto;
}
/* keep the global hover-underline off pill/button anchors */
.masina-donate:hover,
.masina-dropdown__missionbtn:hover {
    text-decoration: none;
}
.entry-content p a,
.author.url.fn,
.tags-links a {
    color: var(--nf-color-text-primary);
    text-decoration-line: underline;
    text-decoration-color: var(--nf-color-brand-primary);
    text-decoration-thickness: 2px;
    text-underline-offset: 0.18em;
    text-decoration-skip-ink: auto;
}
.entry-content p a:hover,
.entry-content p a:focus-visible,
.author.url.fn:hover,
.author.url.fn:focus-visible,
.tags-links a:hover,
.tags-links a:focus-visible {
    color: var(--nf-color-brand-primary);
    text-decoration-color: var(--nf-color-brand-primary);
}

.masina-single__byline .author.url.fn:hover {
    text-decoration-line: underline;
    text-decoration-color: var(--nf-color-brand-primary);
    text-decoration-thickness: 1px;
    text-underline-offset: 0.16em;
    text-decoration-skip-ink: auto;
}
/* paragraph links: heavier underline on hover */
.entry-content p a:hover,
.entry-content p a:focus-visible {
    text-decoration-thickness: 4px;
}
/* tags keep a hairline underline in both states */
.tags-links a,
.tags-links a:hover,
.tags-links a:focus-visible {
    text-decoration-thickness: 1px;
    text-underline-offset: 0.3em; /* tags sit lower than paragraph/author links */
}

/* --- Category links --- */
html.light-mode .cat-links a {
    color: var(--nf-color-brand-primary);
    text-decoration: none;
}
html.light-mode .cat-links a:hover,
html.light-mode .cat-links a:focus-visible {
    color: var(--nf-color-text-quote);
}
html.dark-mode .cat-links a {
    color: var(--nf-color-text-primary);
    text-decoration: none;
}
html.dark-mode .cat-links a:hover,
html.dark-mode .cat-links a:focus-visible {
    color: var(--nf-color-brand-primary);
}

/* --- Archive / entry titles ---
   :root prefix: GP emits its own .entry-title a color (loads after
   tokens.css, ties on specificity, wins on order) and it doesn't flip →
   black-on-black in dark. (0,0,2,1) beats it so the token flips through. */
:root .entry-title a {
    color: var(--nf-color-text-primary);
    text-decoration: none;
}
:root .entry-title a:hover,
:root .entry-title a:focus-visible {
    color: var(--nf-color-text-quote);
    text-decoration-line: underline;
    text-decoration-color: var(--nf-color-brand-primary);
    text-decoration-thickness: 1px;
    text-underline-offset: 0.16em;
    text-decoration-skip-ink: auto;
}

/* --- Entry meta / date ---
   INTERIM (designer): fixed #868686 in both modes — not tokenized because
   it's temporary (= text-quote's light value; swap to var(--nf-color-text-quote)
   when it's allowed to flip). :root beats GP's own .entry-meta color. Meta
   LINKS (.cat-links a, author) keep their own §6 conventions via specificity. */
:root .entry-meta,
:root .entry-date.published {
    color: #868686;
}
