/* ZS R3 GRAFT "HELD" (r3-graft-held.css): components taken from direction B "The Held World" (the Premium opening and the photographic grammar), re-implemented under
   the prefix r3p- so they never collide with the base's r3- names (B's tree used r3-poster, r3-sheet, r3-dock ... with other meanings).
   Opt-in: loaded only by pages that use it, AFTER r3-tokens.css (and r3-graft-held.js after r3-core.js). Reads the base tokens; works in both themes.
   Spec, markup contracts and the verification numbers: evidence/r3/final/BIBLE_R3.md sections g, h, i. Sources of the ideas: evidence/r3/directions/B (BIBLE.md 9.1-9.5, tree dirB).

   THE RULES THIS FILE ENFORCES (panel 1, blind panel of 7)
   - CLEAN PLATE: no object of a photograph ever crosses a headline letter, at any width from 320 to 2560 (B's depth sandwich put the candles in front of "värld" and
     hid the "l" at 2560). The headline sits in the plate's own black floor, in a zone computed from the photograph's geometry (BIBLE g1); verified by pixel test.
   - NO HARD ROUNDED EDGE where a sheet meets a photo or a plane (tone rule): a sheet is a feathered dip to the floor + the normal oklab plane blend, not a rounded card edge.
   - Every hidden start state hangs on html.lib-on; html.no-motion and no-JS show the complete composed page; films never load on phones; every autoplaying thing has a
     visible pause control; off-screen sticky bars are inert (base .r3-dock).

   CONTENTS  1 tokens  2 CLEAN-PLATE HERO (+ ticket, landscape-phone two columns)  3 clean-plate beat  4 held plate + SHEET + gold HINGE  5 APERTURE film opener
             6 film + credit (opaque caption) + pause  7 ATMOS (blurred photograph behind a showcase)  8 DOCK modifier  9 BELT (moving gallery + pause)  10 CLOSE (cream card on a photograph)
             11 static / reduced-motion answers */

/* ================================ 1. TOKENS ================================ */
:root {
  --r3p-gold: #DCBC7E;                 /* gold on dark photographic surfaces, both themes (the theme's own --gold is deeper in the light theme) */
  --r3p-ink: #F3F0EA; --r3p-ink-2: #D9D3C8;
  --r3p-dip: 56px;                     /* the feathered dip where a sheet rises over a photograph */
  --r3p-glass: rgba(12, 12, 15, .72);
}
@media (min-width: 768px) { :root { --r3p-dip: 72px; } }

/* ================================ 2. CLEAN-PLATE HERO ================================ */
/* One photograph (the candle table) whose own black floor holds the type. Overlay layout from 1024 px (and on landscape phones): the stage is the photograph at its own
   3:2 shape, as wide as the window but never wider than 1920 px (the source) nor taller than the window (150svh), centred on the floor tone, and every text zone is
   positioned in units of the STAGE WIDTH (--u = 1 % of it), so the relation between type and objects is the same at every size. Zones (candle table, 3:2 master):
     candles x 48.5-56 %, y 25-55 %      glasses x 43-46 % (y 46-62 %) and x 62-70 % (y 53-65 %)      table x 12-84 %, y 53-93 %      black: everything else
   -> headline: x 6-46 %, y 14-40 %; lead under it (x < 40 %, y < 54 %); ticket: x 66-95 %, y < 48 % (landscape phones: x 58-96 %).
   Below 1024 px the layout stacks (copy, photograph, lead + ticket); the photograph's black top overlaps the copy block by 9 vw (its first object starts 17 % down), so the
   headline never meets an object there either.
     <section class="r3p-hero band-dark"> <div class="r3p-hero__stage">
        <div class="r3p-hero__copy"> <a class="r3p-hero__back">.. <p class="r3a-kicker">.. <h1 class="r3p-hero__h1"> <span class="r3p-hero__l">En egen</span> <span class="r3p-hero__l">visuell <em>värld.</em></span></h1> </div>
        <picture class="r3p-hero__plate"> <source media="(max-width: 767px) and (orientation: portrait)" srcset=".."> <img ..> </picture>
        <p class="r3p-hero__lead r3-lead">..</p> </div> <picture class="r3p-hero__plate">..</picture> <p class="r3p-hero__lead r3p-hero__lead--flow r3-lead">.. (the same sentence)</p>
        <div class="r3p-hero__ticket r3p-ticket"> price + note + button + link </div> </div></section> */
.r3p-hero { --u: 1vw; position: relative; isolation: isolate; background: var(--r3-floor); color: var(--r3p-ink); overflow: clip; }
@supports (width: 1cqw) { .r3p-hero { --u: 1cqw; } .r3p-hero__stage { container-type: inline-size; } }
.r3p-hero__stage { --r3p-wedge: max(var(--gutter, 32px), calc((100vw - var(--wrap, 1320px)) / 2)); --r3p-sl: calc((100vw - min(100vw, 1920px, 150vh)) / 2);
  position: relative; width: 100%; max-width: 1920px; margin-inline: auto; display: flex; flex-direction: column; }
.r3p-hero__plate { display: block; margin: calc(var(--u) * -9) 0 0; position: relative; z-index: 1; order: 4; }
.r3p-hero__plate img { display: block; width: 100%; height: auto; aspect-ratio: 3 / 2; object-fit: cover; object-position: 50% 0; }
/* the plate's sides melt into the floor (its black is the page ink, baked; this is the belt-and-braces so no rectangle can ever show) */
.r3p-hero__plate { -webkit-mask-image: linear-gradient(90deg, transparent 0, #000 7%, #000 93%, transparent 100%); mask-image: linear-gradient(90deg, transparent 0, #000 7%, #000 93%, transparent 100%); }
@media (max-width: 767px) and (orientation: portrait) { .r3p-hero__plate { -webkit-mask-image: none; mask-image: none; } }
/* stacked (default, < 1024 px): the copy's children are flex items in reading order; the photograph's black top sits under the headline */
.r3p-hero__copy { display: contents; }
.r3p-hero__back { order: 1; align-self: flex-start; display: inline-flex; align-items: center; gap: .5em; min-height: 44px; margin: calc(var(--r3p-nav-off, 0px) + 12px) var(--gutter, 16px) 4px; position: relative; z-index: 2; color: var(--r3p-ink-2); font: 500 .9375rem/1 var(--r3-f-text); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: .3em; text-decoration-color: rgba(243, 240, 234, .3); }
.r3p-hero__back:hover { color: var(--r3p-ink); }
.r3p-hero .r3a-kicker { order: 2; margin: 0 var(--gutter, 16px) .5em; position: relative; z-index: 2; color: var(--r3p-gold); }
.r3p-hero .r3a-kicker b { color: var(--r3p-gold); }
.r3p-hero__h1 { order: 3; margin: 0 var(--gutter, 16px); position: relative; z-index: 2; font: 600 var(--r3-t-h1)/.9 var(--r3-f-serif); letter-spacing: -.02em; font-variant-numeric: lining-nums; color: var(--r3p-ink); text-wrap: balance; }
.r3p-hero__l { display: block; }
.r3p-hero__h1 em { font-style: normal; color: var(--r3p-gold); }
.r3p-hero__lead { display: none; margin: 0; max-width: 34em; color: var(--r3p-ink-2); }          /* the lead INSIDE the copy block: desktop overlay only */
.r3p-hero__lead--flow { display: block; order: 5; margin: 16px var(--gutter, 16px) 0; position: relative; z-index: 2; }   /* the lead AFTER the photograph: stacked layouts and landscape phones (the same sentence; the other copy is display:none) */
.r3p-hero__ticket { order: 6; position: relative; z-index: 2; margin: 18px var(--gutter, 16px) 0; padding-bottom: 0; }
.r3p-hero__stage { padding-bottom: 28px; }
@media (min-width: 768px) and (max-width: 1023px) {
  .r3p-hero__back, .r3p-hero .r3a-kicker, .r3p-hero__h1, .r3p-hero__lead--flow, .r3p-hero__ticket { margin-inline: var(--gutter, 24px); }
  .r3p-hero__ticket { max-width: 440px; }
}
@media (max-width: 767px) and (orientation: portrait) { .r3p-hero__plate img { aspect-ratio: 10 / 11; max-height: min(58vh, 560px); } }
@supports (height: 1svh) { @media (max-width: 767px) and (orientation: portrait) { .r3p-hero__plate img { max-height: min(58svh, 560px); } } }
/* OVERLAY layout: desktop >= 1024 px, and landscape phones (short + wide) */
@media (min-width: 1024px), (max-height: 520px) and (orientation: landscape) and (min-width: 560px) {
  .r3p-hero__stage { display: block; width: min(100%, 1920px, 150vh); padding-bottom: 0; }
  .r3p-hero__plate { margin: 0; }
  .r3p-hero__plate img { aspect-ratio: 3 / 2; max-height: none; }
  .r3p-hero__copy { display: block; position: absolute; z-index: 2; left: min(calc(var(--u) * 6), calc(var(--r3p-wedge) - var(--r3p-sl))); top: calc(var(--r3p-nav-off, 0px) + var(--u) * 2.4); width: calc(var(--u) * 41); }
  .r3p-hero__back, .r3p-hero .r3a-kicker, .r3p-hero__h1, .r3p-hero__lead { margin-inline: 0; }
  .r3p-hero__back { margin-top: 0; }
  .r3p-hero__h1 { font-size: calc(var(--u) * 8.4); }
  .r3p-hero__ticket { position: absolute; left: auto; right: min(calc(var(--u) * 5), calc(var(--r3p-wedge) - var(--r3p-sl))); top: calc(var(--r3p-nav-off, 0px) + var(--u) * 2.4); width: max(calc(var(--u) * 29), 360px); margin: 0; }
}
@media (min-width: 1024px) {
  .r3p-hero__lead { display: block; width: calc(var(--u) * 34); margin: calc(var(--u) * 1.6) 0 0; font-size: max(.9375rem, calc(var(--u) * 1.3)); }
  .r3p-hero__lead--flow { display: none; }
}
@supports (height: 1svh) { @media (min-width: 1024px), (max-height: 520px) and (orientation: landscape) and (min-width: 560px) { .r3p-hero__stage { width: min(100%, 1920px, 150svh); } } }
@supports (height: 1svh) { .r3p-hero__stage { --r3p-sl: calc((100vw - min(100vw, 1920px, 150svh)) / 2); } }   /* FXF 7: same unit as the width above (vh jumps with a phone's address bar, svh does not) */
/* landscape phones: compact copy, a compact ticket in the right-hand black; the lead sits below the fold (price + the ask are inside the fold at 667x375 and 844x390) */
@media (max-height: 520px) and (orientation: landscape) and (min-width: 560px) and (max-width: 1023px) {
  .r3p-hero__back { display: none; }
  .r3p-hero .r3a-kicker { font-size: .8125rem; letter-spacing: .3em; margin-bottom: .3em; }
  .r3p-hero__h1 { font-size: calc(var(--u) * 8.8); }
  .r3p-hero__lead--flow { margin: 12px var(--gutter, 24px) 0; }
  .r3p-hero__ticket { right: calc(var(--u) * 3); width: calc(var(--u) * 40); top: calc(var(--r3p-nav-off, 0px) + var(--u) * 2); }
}

/* the ticket: price + the one ask on dark glass over the photograph (never over a running film). Premium carries a gold edge. */
.r3p-ticket { display: grid; gap: 12px; align-content: start; padding: clamp(16px, 2vw, 24px); border-radius: 18px; background: var(--r3p-glass); border: 1px solid rgba(220, 188, 126, .4); color: var(--r3p-ink);
  -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px); }
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) { .r3p-ticket { background: rgba(12, 12, 15, .88); } }
.r3p-ticket .r3-price__n { color: var(--r3p-ink); } .r3p-ticket .r3-price__u, .r3p-ticket .r3-price__note { color: var(--r3p-ink-2); }
.r3p-ticket .r3-price__note { margin: -2px 0 2px; }
.r3p-ticket .r3-btn { width: 100%; }
.r3p-ticket .r3-link { justify-self: start; color: var(--r3p-ink); text-decoration-color: rgba(243, 240, 234, .4); }
@media (min-width: 768px) and (max-width: 1023px) { .r3p-ticket .r3-btn { --fs: 1rem; --px: 18px; } }
@media (max-height: 520px) and (orientation: landscape) {
  .r3p-ticket { gap: 6px; padding: 10px 12px; border-radius: 14px; }
  .r3p-ticket .r3-price { --r3-price-fs: 2.25rem; }
  .r3p-ticket .r3-btn { --h: 44px; --fs: .8125rem; --px: 10px; }
  .r3p-ticket .r3-btn .r3-btn__arr { display: none; }
  .r3p-ticket .r3-price__u { font-size: .875rem; }                       /* FXF 7: the unit is never below 14 px on a phone (it was 12 px) */
  .r3p-ticket .r3-price__note { font-size: .8125rem; margin: 0; }          /* and the note under it 13 px (it was 11 px) */
  .r3p-ticket .r3-link { display: none; }
}

/* ================================ 3. CLEAN-PLATE BEAT (G-113) ================================ */
/* Desktop, motion on: the hero pins for a runway while the copy clears and the bare table holds; --r3p-p (0..1) is written by r3-graft-held.js ([data-r3p-pin]).
     <div class="r3p-clear" data-r3p-pin data-r3p-run="48"> <section class="r3p-hero">..</section> <div class="r3p-clear__run"></div> </div>
   Static / no-JS / phones: the composed hero in flow, no runway. */
.r3p-clear__run { display: none; }
@media (min-width: 1024px) and (min-height: 600px) {
  html.lib-on .r3p-clear.is-live > .r3p-hero { position: sticky; top: 0; }
  html.lib-on .r3p-clear.is-live .r3p-clear__run { display: block; height: var(--r3p-run, 48svh); }
  .r3p-clear.is-live { --c1: clamp(0, (var(--r3p-p, 0) - .14) / .2, 1); --c2: clamp(0, (var(--r3p-p, 0) - .3) / .2, 1); }
  .r3p-clear.is-live .r3p-hero__ticket, .r3p-clear.is-live .r3p-hero__lead { opacity: calc(1 - var(--c1)); transform: translate3d(0, calc(var(--c1) * -16px), 0); will-change: opacity, transform; }
  .r3p-clear.is-live .r3p-hero__copy { opacity: calc(1 - var(--c2)); transform: translate3d(0, calc(var(--c2) * -22px), 0); will-change: opacity, transform; }
  .r3p-clear.is-cleared .r3p-hero__ticket { pointer-events: none; }
  .r3p-clear.is-live .r3p-hero__ticket:focus-within, .r3p-clear.is-live .r3p-hero__copy:focus-within { opacity: 1; transform: none; pointer-events: auto; }
}

/* ================================ 4. HELD PLATE + SHEET + HINGE (G-02, W-13, W-51) ================================ */
/* The plate is held (sticky) while the sheet rises over it. The sheet is NOT a rounded card (panel 12): it is a feathered DIP to the floor tone over the plate (a transparent-to-void
   block, --r3p-dip tall, so no edge pixel exists), followed by a normal .r3-plane that starts from the void (void: no blend; cream in the light theme: the warm oklab bloom).
   One containing block; the hinge numeral lives in the wrapper:
     <div class="r3p-hold"> <div class="r3p-hold__plate"> <figure class="r3-photo">..</figure> </div> <div class="r3p-hold__run"></div>
        <div class="r3p-sheet"> <p class="r3p-hinge" aria-hidden="true">01</p> <div class="r3p-sheet__dip" aria-hidden="true"></div>
           <section class="r3-plane r3-from-void" data-plane="void"> ...copy... </section> </div> </div>                                                          */
.r3p-hold { position: relative; }
.r3p-hold__plate { position: sticky; top: 0; z-index: 0; height: 100vh; min-height: 480px; margin: 0; overflow: clip; background: var(--r3-floor); }
@supports (height: 1svh) { .r3p-hold__plate { height: 100svh; } }
.r3p-hold__plate > .r3-photo, .r3p-hold__plate > picture, .r3p-hold__plate > img { position: absolute; inset: 0; width: 100%; height: 100%; }
.r3p-hold__plate > .r3-photo { background: transparent; }
.r3p-hold__run { height: var(--r3p-hold-run, 0px); }
.r3p-hold__plate .r3p-dimmer { position: absolute; inset: 0; z-index: 3; background: #0C0C0F; opacity: calc(var(--r3p-cover, 0) * .55); pointer-events: none; }
@media (max-height: 500px) { .r3p-hold__plate { position: relative; height: 70vh; min-height: 0; } }
@supports (height: 1svh) { @media (max-height: 500px) { .r3p-hold__plate { height: 70svh; } } }   /* FXF 7 */
.r3p-sheet { position: relative; z-index: 2; margin-top: calc(var(--r3p-dip) * -1); }
.r3p-sheet__dip { height: var(--r3p-dip); background: linear-gradient(180deg, rgba(12, 12, 15, 0), #0C0C0F); pointer-events: none; }
/* the hinge: a gold Cormorant numeral on the seam. It lies in the dip and the first rows of the plane (dark in both themes), so it is always the light gold (#DCBC7E on dark: 10.7:1). */
.r3p-hinge { position: absolute; left: var(--r3-edge, 16px); top: 0; z-index: 3; margin: 0; transform: translateY(-34%); pointer-events: none; font: 600 clamp(6.4rem, 3rem + 10vw, 12.5rem)/1 var(--r3-f-serif); letter-spacing: -.03em; font-variant-numeric: lining-nums; color: var(--r3p-gold); }
@media (min-width: 1024px) { .r3p-hinge { left: max(var(--gutter, 32px), calc((100vw - var(--wrap, 1320px)) / 2)); } }

/* ================================ 5. APERTURE FILM OPENER (G-03, W-05, template 53 porthole) ================================ */
/* A round window holding the film grows to the full frame while "Filmiskt" and "bildspråk" part around it. Runway 250 % of the window height, clip-path only (no layout
   property animates). --r3p-p is written by r3-graft-held.js. Static, phones, tablets and short windows: the film plate as a 16:10 (4:5 on phones) still with the headline on its foot.
     <section class="r3p-aperture band-dark" data-r3p-pin data-r3p-run="150"> <div class="r3p-aperture__stage"> <div class="r3p-aperture__film"> <figure class="r3-photo r3p-film">..</figure> </div>
        <h2 class="r3p-aperture__h"><span>Filmiskt</span> <span>bildspråk</span></h2> <span class="r3p-aperture__ring"></span> <div class="r3p-aperture__meta"> credit + pause </div> </div></section> */
.r3p-aperture { position: relative; background: var(--r3-floor); color: var(--r3p-ink); --o: clamp(0, (var(--r3p-p, 1) - .04) / .5, 1); --e: calc(var(--o) * var(--o) * (3 - 2 * var(--o))); }
.r3p-aperture__stage { position: relative; isolation: isolate; overflow: clip; aspect-ratio: 4 / 5; max-height: 80vh; background: var(--r3-floor); }
@supports (height: 1svh) { .r3p-aperture__stage { max-height: 80svh; } }
@media (min-width: 768px) { .r3p-aperture__stage { aspect-ratio: 16 / 10; max-height: none; } }
.r3p-aperture__film { position: absolute; inset: 0; z-index: 1; }
.r3p-aperture__film > .r3-photo, .r3p-aperture__film > .r3p-film { position: absolute; inset: 0; height: 100%; background: transparent; }
.r3p-aperture__stage::after { content: ""; position: absolute; inset: 0; z-index: 2; pointer-events: none; background: linear-gradient(0deg, rgba(12, 12, 15, .92) 0, rgba(12, 12, 15, .8) 26%, rgba(12, 12, 15, .46) 48%, rgba(12, 12, 15, .12) 70%, rgba(12, 12, 15, 0) 86%); }
.r3p-aperture__ring { display: none; }
.r3p-aperture__h { position: absolute; left: var(--gutter, 16px); right: var(--gutter, 16px); bottom: clamp(40px, 9vw, 120px); z-index: 4; margin: 0; max-width: 11em; font: 600 clamp(3rem, 1.2rem + 6.6vw, 7.5rem)/.92 var(--r3-f-serif); letter-spacing: -.02em; color: var(--r3p-ink); text-wrap: balance; font-variant-numeric: lining-nums; }
.r3p-aperture__h span { display: inline; } .r3p-aperture__h span + span { color: var(--r3p-gold); }
.r3p-aperture__meta { position: absolute; left: var(--gutter, 16px); right: var(--gutter, 16px); top: calc(var(--nav-h, 68px) + 12px); z-index: 5; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; pointer-events: none; }
.r3p-aperture__meta > * { pointer-events: auto; }
@media (min-width: 1024px) and (min-height: 600px) {
  html.lib-on .r3p-aperture.is-live { height: calc(100svh + var(--r3p-run, 150svh)); }
  html.lib-on .r3p-aperture.is-live .r3p-aperture__stage { position: sticky; top: 0; height: 100vh; height: 100svh; aspect-ratio: auto; max-height: none; }
  html.lib-on .r3p-aperture.is-live .r3p-aperture__film { clip-path: circle(calc(var(--r3p-r0, 17vmin) + var(--e) * 115vmax) at 50% 50%); }
  html.lib-on .r3p-aperture.is-live { --t: clamp(0, 1 - var(--e) * 5.6, 1); }
  html.lib-on .r3p-aperture.is-live .r3p-aperture__film > .r3-photo, html.lib-on .r3p-aperture.is-live .r3p-aperture__film > .r3p-film { transform: translate3d(0, calc(var(--t) * -10%), 0) scale(calc(1.18 - var(--e) * .18)); transform-origin: 50% 55%; }
  html.lib-on .r3p-aperture.is-live .r3p-aperture__stage::after { opacity: 0; }
  html.lib-on .r3p-aperture.is-live .r3p-aperture__ring { display: block; position: absolute; z-index: 2; left: 50%; top: 50%; width: calc(var(--r3p-r0, 17vmin) * 2); height: calc(var(--r3p-r0, 17vmin) * 2); margin: calc(var(--r3p-r0, 17vmin) * -1) 0 0 calc(var(--r3p-r0, 17vmin) * -1); border-radius: 50%; box-shadow: 0 0 0 1px rgba(220, 188, 126, .6), 0 0 80px 8px rgba(220, 188, 126, .12); opacity: calc(1 - var(--e) * 3); pointer-events: none; }
  html.lib-on .r3p-aperture.is-live .r3p-aperture__h { position: absolute; inset: 0; max-width: none; z-index: 3; font-size: clamp(2.6rem, 1rem + 6.4vw, 8rem); }
  html.lib-on .r3p-aperture.is-live .r3p-aperture__h span { position: absolute; top: 50%; white-space: nowrap; line-height: .9; }
  html.lib-on .r3p-aperture.is-live .r3p-aperture__h span:first-child { right: calc(50% + var(--r3p-r0, 17vmin) + 1.2rem); transform: translate(calc(var(--e) * -34vw), -50%); opacity: calc(1 - var(--e) * 1.5); }
  html.lib-on .r3p-aperture.is-live .r3p-aperture__h span + span { left: calc(50% + var(--r3p-r0, 17vmin) + 1.2rem); transform: translate(calc(var(--e) * 34vw), -50%); opacity: calc(1 - var(--e) * 1.5); }
  html.lib-on .r3p-aperture.is-live .r3p-aperture__meta { opacity: clamp(0, (var(--e) - .55) * 3, 1); }
}

/* ================================ 6. FILM + OPAQUE CAPTION + PAUSE ================================ */
/* poster first; r3-graft-held.js fetches the film only near view, only >= 768 px, only with motion on and no Save-Data (never on phones); the pause control appears once it plays */
.r3p-film > img, .r3p-film > picture, .r3p-film > video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.r3p-film > video { opacity: 0; transition: opacity .9s var(--r3-ease); }
.r3p-film > video.is-playing { opacity: 1; }
.r3p-film__btn { position: relative; min-height: 44px; padding: 0 16px; border-radius: 999px; background: #0C0C0F; border: 1px solid rgba(243, 240, 234, .3); color: var(--r3p-ink); font: 600 .8125rem/1 var(--r3-f-text); cursor: pointer; }
.r3p-film__btn:hover { border-color: rgba(243, 240, 234, .6); }
.r3p-film__btn[hidden] { display: none; }
/* the caption is OPAQUE (never glass over a film: paint cost, noise, contrast that depends on the picture); it keeps the "påhittat" wording */
.r3p-credit { display: inline-flex; align-items: center; max-width: 100%; margin: 0; padding: 8px 14px; border-radius: 999px; background: #0C0C0F; border: 1px solid rgba(243, 240, 234, .16); color: var(--r3p-ink); font: 500 .8125rem/1.3 var(--r3-f-text); }

/* ================================ 7. ATMOS: a blurred photograph of the same project behind a showcase (W-100, W-34) ================================ */
/* The plate is a pre-blurred 480 px derivative (r3-g-atmos-*.webp, 1-3 KB) scaled up, so no live blur filter. It is a plane's background: the plane's own blend shows at
   the top and bottom (the layer is masked out there), so no edge.   <section class="r3-plane r3-tone-void r3p-atmos" data-plane="void"> <div class="r3p-atmos__bg"><img src=".." alt=""></div> ... */
.r3p-atmos { position: relative; isolation: isolate; }
.r3p-atmos__bg { position: absolute; inset: 0; z-index: -2; overflow: clip; pointer-events: none;
  -webkit-mask-image: linear-gradient(180deg, transparent 0, #000 var(--r3-fade), #000 calc(100% - var(--r3-fade)), transparent 100%); mask-image: linear-gradient(180deg, transparent 0, #000 var(--r3-fade), #000 calc(100% - var(--r3-fade)), transparent 100%); }
.r3p-atmos__bg img { display: block; width: 100%; height: 100%; object-fit: cover; transform: scale(1.15); }
.r3p-atmos__bg::after { content: ""; position: absolute; inset: 0; background: rgba(12, 12, 15, var(--r3p-atmos-dim, .5)); }

/* ================================ 8. DOCK modifier (Premium: gold ask) ================================ */
/* the dock itself is the base .r3-dock (price + ask, inert while off screen, two rows below 381 px so the full label is never clipped). On the Premium page add .r3p-dock. */
.r3p-dock .r3-btn { background: #DCBC7E; color: #141317; }
.r3p-dock .r3-btn:hover { background: #E7CB93; }
[data-theme="light"] .r3p-dock .r3-btn { background: #141317; color: #F4F1EB; }

/* ================================ 9. BELT: the moving gallery with a visible pause (W-82, Growth's one moving element) ================================ */
/* a slow marquee (60 s per loop). It pauses on hover/focus-within, off screen, and through its own visible control (WCAG 2.2.2); the control is always shown while motion is on.
   Static (no motion): a plain scrollable strip.  <div class="r3p-belt" id="belt"> <ul class="r3p-belt__track"> <li><figure>..</figure></li> x2 (duplicate aria-hidden) </ul> </div>
   <button class="r3p-belt__btn" data-r3p-belt-toggle aria-controls="belt" data-pause="Pausa galleriet" data-play="Spela galleriet"> */   /* FXF 4: the label names the action; no aria-pressed */
.r3p-belt { position: relative; overflow: hidden; }
.r3p-belt__track { display: flex; gap: 16px; width: max-content; margin: 0; padding: 0; list-style: none; animation: r3p-belt 60s linear infinite; will-change: transform; }
.r3p-belt__track > * { flex: none; margin: 0; }
.r3p-belt__track figure { margin: 0; width: clamp(150px, 15vw, 230px); aspect-ratio: 4 / 5; border-radius: 12px; overflow: hidden; }
.r3p-belt__track img { display: block; width: 100%; height: 100%; object-fit: cover; }
@keyframes r3p-belt { to { transform: translate3d(calc(-50% - 8px), 0, 0); } }
.r3p-belt:hover .r3p-belt__track, .r3p-belt:focus-within .r3p-belt__track, .r3p-belt.is-paused .r3p-belt__track, .r3p-belt.is-offscreen .r3p-belt__track { animation-play-state: paused; }
.r3p-belt__btn { min-height: 44px; padding: 0 18px; border-radius: 999px; border: 1px solid var(--line); background: transparent; color: var(--ink); font: 600 .875rem/1 var(--r3-f-text); cursor: pointer; }
.r3p-belt__btn:hover { border-color: var(--ink-2); }
.r3p-belt__btn[hidden] { display: none; }
.no-motion .r3p-belt { overflow-x: auto; scrollbar-width: thin; } .no-motion .r3p-belt__track { animation: none; } .no-motion .r3p-belt__track [aria-hidden="true"] { display: none; }
@media (prefers-reduced-motion: reduce) { .r3p-belt__track { animation: none; } .r3p-belt { overflow-x: auto; } .r3p-belt__track [aria-hidden="true"] { display: none; } .r3p-belt__btn { display: none; } }

/* ================================ 10. CLOSE: the cream card on a photograph (W-86, W-107) ================================ */
/* The page ends inside a photograph that frames the ask: the bistro terrace for Growth, the same candle table for Premium (a bookend). The photograph's top melts INTO the plane
   above (mask, no edge); the cream card is a floating object with a soft shadow (it is not a section edge). Phones: photograph above, card overlapping it by 40 px.
     <section class="r3p-close" style="--r3p-close-top: ..."> <div class="r3p-close__photo r3-photo r3-soft-top">..</div> <div class="r3p-close__card r3-tone-paper"> ask </div> </section> */
.r3p-close { position: relative; isolation: isolate; display: grid; grid-template-columns: minmax(0, 1fr); background: var(--r3p-close-top, var(--bg)); }
.r3p-close__photo { position: relative; height: clamp(300px, 56vw, 520px); }
.r3p-close__card { position: relative; z-index: 2; margin: -40px var(--gutter, 16px) 0; padding: clamp(24px, 4vw, 44px); border-radius: 24px; background: var(--r3-c-paper); color: #141317; box-shadow: 0 30px 70px -26px rgba(0, 0, 0, .7); }
@media (min-width: 900px) {
  .r3p-close { min-height: clamp(560px, 86vh, 860px); align-items: center; padding-block: clamp(64px, 10vh, 120px); }
  .r3p-close__photo { position: absolute; inset: 0; height: auto; z-index: -1; }
  .r3p-close__card { width: min(100%, 40rem); margin: 0 max(var(--gutter, 32px), calc((100vw - var(--wrap, 1320px)) / 2)) 0 auto; }
}
@supports (height: 1svh) { @media (min-width: 900px) { .r3p-close { min-height: clamp(560px, 86svh, 860px); padding-block: clamp(64px, 10svh, 120px); } } }

/* ================================ 11. STATIC / REDUCED-MOTION ANSWERS ================================ */
.no-motion .r3p-clear > .r3p-hero { position: relative !important; } .no-motion .r3p-clear__run { display: none !important; }
.no-motion .r3p-clear .r3p-hero__copy, .no-motion .r3p-clear .r3p-hero__ticket, .no-motion .r3p-clear .r3p-hero__lead { opacity: 1 !important; transform: none !important; }
.no-motion .r3p-aperture { height: auto !important; } .no-motion .r3p-aperture .r3p-aperture__stage { position: relative !important; height: auto !important; }
.no-motion .r3p-aperture .r3p-aperture__film { clip-path: none !important; } .no-motion .r3p-aperture .r3p-aperture__film > * { transform: none !important; }
.no-motion .r3p-hold__plate { position: relative; height: auto; min-height: 0; aspect-ratio: 16 / 10; } .no-motion .r3p-hold__run { display: none; }
.no-motion .r3p-film > video { transition: none; }
@media (prefers-reduced-motion: reduce) { .r3p-clear .r3p-hero__copy, .r3p-clear .r3p-hero__ticket, .r3p-clear .r3p-hero__lead { opacity: 1 !important; transform: none !important; } .r3p-film > video { transition: none; } }
