/* ============================================================================
   HOLDING (codename) . the parent company site.
   Rewritten 2026-09-08 against design/DIFFERENTIATION.md, which recorded the
   founder's verdict that the eight homepages read as clones. This one was the
   worst case: it ran Inter at display AND at body, so it had no typographic
   identity at all, and its ground sat inside the same #F0F0EC to #FCFCFB band
   as four of its siblings. Everything visible here is new. Everything
   invisible is untouched.

   THE POSITION.
   Seven of the eight sites in this house sell something to somebody. This one
   sells nothing. It is an invisible parent (decisions D3) that nevertheless
   publishes a real corporate site (D3a), on the Inditex model. The register
   for that is not a product brand. It is a law firm, an old investment house,
   an annual report: austere, high contrast, generously spaced, and set in big
   confident display type that is used four or five times on the whole page.

   WHY THE MARK HAS NO COLOUR, AND THE INTERFACE HAS ONE.
   Revised 2026-09-14 with design/COLOUR.md. The original argument here was
   that the parent takes no hue at all, because the other seven differentiate
   with hue and a parent that joins that argument loses it. Half of that
   survives and it is the important half: THE MARK IS INK. A holding company
   that owns five loud brands should not compete with them, and "vivid" now
   describes the work rather than the wardrobe.
   What changed is the interface. A page with buttons and links still needs one
   colour to say which thing is the action, and doing that with weight alone
   left the two calls to action on the order page indistinguishable from the
   prose around them. So there is one violet, at three values, and it appears
   on a button and in a link and nowhere else. Rules, weight, scale and white
   space still carry the hierarchy; the violet only marks the exits.

   WHY TRUE WHITE.
   #FFFFFF is the only near-pure white in the eight. Five grounds previously sat
   between #F0F0EC and #FCFCFB and were indistinguishable from each other. Paper
   white with a 18:1 ink on it, next to a warm cream and a grey plaster and two
   near-blacks, is legible as a different company from a thumbnail. There is one
   inverted band on the page and it is the only dark thing here.

   NEUTRALS. One hue, 265, chroma held near zero, so the greys read as one
   family rather than as five picks from a slider. Cool rather than warm because
   warm paper is already spoken for by plant-pots, ceramics and lights.

   CONTRAST, measured against #FFFFFF unless noted. Floors: body 7.0,
   secondary and tertiary 4.5.
     ink       #15161B  18.06:1
     ink-2     #4A4C53   8.57:1   (7.87:1 on surface-2) . clears the body floor
     ink-3     #62646C   5.90:1   (5.42:1 on surface-2)
     ink-4     #9A9CA3   2.74:1   non-text marks only, never running text
     rule      #E1E1E5   1.30:1   hairlines, exempt
     on surface-inv: ink 16.87:1, ink-2 9.62:1, ink-3 5.77:1
   Never #000 and never #FFF for text, in either direction.

   TYPEFACES.
     display  Instrument Serif, 400 and nothing else. A high contrast display
              serif with real presence above about 60px and visible modulation
              in the stroke, which is exactly what a wordmark-free institutional
              page needs. It is deployed sparingly: the headline, the section
              heads, the four ledger numerals, the lead statements, the seven
              register names, the wordmark, the clause numerals and the two
              addresses. It never sets running text, and below 20px it does
              not appear at all.
     body     Libre Franklin, 400 and 500. A workhorse American grotesque with
              a taller, squarer, more opinionated skeleton than Inter, and,
              crucially, it is not Inter, which six of the eight sites were
              running. It carries every word of body copy, every label and all
              the UI.
     mono     none loaded. Six siblings set their micro-labels in Geist Mono.
              Monospace reads as software and as a spec sheet, and this company
              ships neither. The labels here are Libre Franklin caps at 0.18em,
              which is the letterhead convention, not the terminal one. The
              token stays defined as a system stack so nothing can break, and
              the page never invokes it.
     Two weights plus one display cut, which is the house maximum.

   TYPE SCALE. Only the top rung moves. --t-display becomes fluid and roughly
   1.5x the house value, because an austere page with four headlines on it needs
   those headlines to be an event. The whole-pixel line-height rule still holds
   for every fixed reading rung; it cannot hold for a fluid display size and
   that is the accepted trade. Everything from --t-h1 down is the house ramp
   unchanged.

   RADIUS. System A, sharp. --r-0: 0 everywhere. A rounded corner is an opinion,
   and this entity is deliberately not offering one.

   Overridden here: palette, both typefaces, the display rung and the radius
   tier. Not overridden, and not overridable: the spacing scale, the grid, the
   breakpoints, the motion durations and curves, the reduced-motion handling.
   Those five are the house, and they are why this page and a bright toy
   catalogue are recognisably built by the same shop.
   ========================================================================= */
/* ---------------------------------------------------------------------------
   THE PALETTE. FOUR VALUES, AND IT IS NOT SETTLED.

   The founder is still choosing between four palettes, so all four values live
   here and nowhere else. Swapping a palette on this site means editing these
   four lines. Every rule below, and every page-level style block, reaches them
   by name; if a swap ever needs a second edit somewhere, that somewhere is the
   bug.

     --logo     the mark, and only the mark
     --primary  primary button fill, active states
     --deep     secondary button, hover, and any reversed ground
     --safe     links, and every piece of text under 24px

   Why there are four and not one, per design/COLOUR.md. The parent is
   achromatic in the logo, because a holding company that owns five loud brands
   should not compete with them; the interface still needs a colour it can put
   on a button, and --safe exists because five of the eight primaries in the
   house fail 4.5:1 on white. This brand's --safe happens to equal its
   --primary, which clears 7.10:1, but the token is still spelled out so that a
   palette change cannot quietly take a link below the floor.

   CONTRAST, RE-MEASURED 2026-09-14 on the repainted grounds. These numbers
   supersede any table further up this file that still names an old ground.
   Floors: body 7.0, secondary and tertiary 4.5.

                          on #FFFFFF   on --surface-2 #F5F5F7
     ink      #15161B       18.06            16.59
     ink-2    #4A4C53        8.57             7.87
     ink-3    #62646C        5.90             5.42
     ink-4    #9A9CA3        2.74             2.52   non-text marks only
     rule     #E1E1E5        1.30             1.20   hairlines, exempt
     --safe   #6D28D9        7.10             6.53
     --deep   #5B21B6        8.98             8.25
     --on-fill on --primary 6.61, on --deep 8.34, on --ink 15.91
   ------------------------------------------------------------------------ */
@layer tokens {
  :root {
    --logo:    #15161B;   /* ink. The mark wears black; the objects are vivid. */
    --primary: #6D28D9;
    --deep:    #5B21B6;
    --safe:    #6D28D9;   /* 7.10:1 on white                                  */

    /* Three values derived from the four above, in the same block so that a
       palette swap is still one edit. They exist because a button label is
       text under 24px sitting on a COLOURED ground, which is a different
       measurement from text on white and the only one the four cannot answer
       by themselves. Measured: --on-fill on --primary is 6.61:1 and on --deep
       is 8.34:1, so this brand's button can take the vivid value directly. */
    --fill:    var(--primary);
    --fill-h:  var(--deep);
    --on-fill: #F2F2F5;   /* the same near-white as --ink-on-inv. Never #fff. */

    /* The mark as typographic furniture, for brandmark.css. Copied from
       design/logos/mark-masks.css, which is generated. */
    --mark-mask: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%2211 6 14 16%22 role=%22img%22 aria-label=%22a hexagon%22%3E %3Cg fill=%22%23000%22%3E %3Cpolygon points=%2224,14.5 21,20 15,20 12,14.5 15,9 21,9%22/%3E %3C/g%3E %3C/svg%3E");
  }
}

@layer tokens {
  :root {
    --surface:      #FFFFFF;  /* true white. The only one in the eight.      */
    --surface-2:    #F5F5F7;  /* row hover and the base of every media box   */
    --surface-inv:  #101116;  /* one band on the page, and nothing else      */
    --rule:         #E1E1E5;  /* hairlines. Earned, not drawn.               */
    --ink:          #15161B;  /* body and display. Never #000.               */
    --ink-2:        #4A4C53;  /* secondary copy. Clears 7:1, so it can run.  */
    --ink-3:        #62646C;  /* labels, metadata, captions                  */
    --ink-4:        #9A9CA3;  /* marks and disabled. Never running text.     */
    --ink-on-inv:   #F2F2F5;  /* on surface-inv. Never pure white.           */
    --ink-2-on-inv: #B7B9C0;
    --ink-3-on-inv: #8C8E96;
    --rule-on-inv:  #2C2D33;

    /* The accent slot used to be spent on nothing. It now carries the one
       hue the palette gives this brand, and it carries it by reference: the
       text cut is --safe because most accented things here are captions and
       link text, and the fill cut is --primary, which lives on buttons. The
       mark stays ink, so "vivid" still describes the work and not the
       wardrobe. */
    --accent:       var(--safe);
    --accent-h:     var(--deep);
    --focus:        var(--safe);

    --font-display: "Instrument Serif", "Times New Roman", Times, serif;
    --font-body:    "Libre Franklin", "Helvetica Neue", Helvetica, Arial, sans-serif;
    --font-mono:    ui-monospace, "SF Mono", Menlo, monospace;  /* never used */

    --w-display: 400;         /* Instrument Serif ships one weight */

    /* the only rung of the house ramp this brand moves */
    --t-display:  clamp(3rem, 0.9rem + 8.4vw, 6.75rem);
    --lh-display: 0.94;
    --tr-display: -0.022em;

    --r-0: 0; --r-pill: 999px;
  }

  @media (min-width: 768px) {
    :root { --t-display: clamp(4rem, 0.9rem + 8.4vw, 6.75rem) }
  }
}

@layer components {
  /* The masthead lockup: mark left, name right, sitting on one line. The mark
     is inline SVG rather than an <img> so it takes --logo and --deep straight
     off this file, and there is no second asset for a reversed ground. Sized
     in em so it tracks whatever the masthead sets the wordmark at. */
  .wordmark { display: inline-flex; align-items: center; gap: 0.44em }
  .wordmark .wm-mark { width: 1.3em; height: 1.3em; flex: none }
  .wordmark .wm-name { font: inherit }
}

/* ============================================================================
   THE SHOP. Added 2026-09-20 with the products rebuild.

   Everything below is site chrome and commerce furniture, and it lives HERE
   rather than in a page's own <style> block for one reason: the founder
   reported that the navigation changed design the moment he left the home
   page. It had two definitions. Now it has one, this one, and every page on
   this site - the forty that web/scripts/build-catalog.py writes and the three
   that are hand written - takes its masthead, its footer and its buttons from
   this file.

   THE PAGE ORDER THESE STYLES ASSUME. Showcase banner, then the products, then
   the information. That is the founder's rule for every product-related page:
   "before the user gets to the product, we already lost them." The .showcase
   block is built for a photograph or a video that does not exist yet, so it
   renders a labelled placeholder at the right shape and swaps to the real
   thing on a data edit.

   Two narrow-width idioms are deliberate everywhere below: every grid floor is
   minmax(min(Npx, 100%), 1fr) so a track can shrink below its floor instead of
   pushing the page sideways at 320px, and nothing that is a whole sentence is
   nowrap.
   ========================================================================= */

@layer components {

/* --- small type --------------------------------------------------------- */
.mono {
  font-family: var(--font-body); font-size: var(--t-micro); line-height: var(--lh-micro);
  letter-spacing: 0.18em; text-transform: uppercase; font-weight: var(--w-medium);
  color: var(--ink-3);
}
.mono a { color: inherit }
.p { margin-top: var(--sp-4); color: var(--ink-2); max-width: var(--max-text) }
.lede {
  margin-top: var(--sp-5); font-size: var(--t-body-lg); line-height: var(--lh-body-lg);
  color: var(--ink-2); max-width: 48ch;
}
.fineprint {
  grid-column: 1 / -1; margin-top: var(--sp-5); max-width: var(--max-text);
  font-size: var(--t-caption); line-height: 1.35rem; color: var(--ink-3);
}
.intro { grid-column: 1 / -1 }

/* --- buttons ------------------------------------------------------------ */
.btn {
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid var(--ink); background: transparent; color: var(--ink);
  font: inherit; font-size: var(--t-caption); letter-spacing: 0.06em;
  text-transform: uppercase; text-decoration: none;
  padding: calc(var(--sp-3) + 1px) var(--sp-5) var(--sp-3);
  transition: background var(--dur-1) var(--ease-standard),
              color var(--dur-1) var(--ease-standard),
              border-color var(--dur-1) var(--ease-standard);
}
.btn:hover { background: var(--ink); color: var(--btn-over, var(--on-fill)) }
.btn-primary { background: var(--fill); border-color: var(--fill); color: var(--on-fill) }
.btn-primary:hover { background: var(--fill-h); border-color: var(--fill-h); color: var(--on-fill) }
.btn-sm { padding: var(--sp-2) var(--sp-4) }
.cta {
  display: flex; flex-wrap: wrap; gap: var(--sp-3); margin-top: var(--sp-6);
  align-items: center;
}
.cta small {
  flex-basis: 100%; max-width: 52ch; font-size: var(--t-caption); line-height: 1.25rem;
  color: var(--ink-3);
}

/* --- the masthead. One definition, every page. -------------------------- */
.nav {
  position: sticky; top: 0; z-index: 20; background: var(--surface);
  border-bottom: 1px solid var(--ink);
}
.launch-copy{display:block!important}.launch-copy p{max-width:60ch;margin:16px 0}.launch-copy li{margin:12px 0}.launch-hero.section{padding-block:24px 48px}.launch-hero .feature{padding-block:0;margin-top:0}.launch-hero .feature-body h1{margin-bottom:20px}.launch-hero .feature-body p{margin-block:16px}
.nav-in {
  max-width: var(--max-content); margin-inline: auto;
  padding: var(--sp-3) var(--margin);
  display: flex; align-items: center; flex-wrap: nowrap; gap: var(--sp-3) var(--sp-5);
}
.wordmark {
  font-family: var(--font-display); font-weight: var(--w-display); font-size: var(--t-h4);
  line-height: 1.6rem; letter-spacing: 0.005em; color: inherit; text-decoration: none;
  margin-right: auto;
}
.wordmark span { color: var(--ink-3) }
.nav .wordmark { flex: none }
.nav-customize { white-space: nowrap }
@media (max-width: 599px) {
  .nav-in { padding: 8px 12px; gap: 8px 16px; min-height: 60px; flex-wrap:wrap }
  .nav .wordmark { flex-basis:100% }
  .nav-in > a:not(.wordmark) { font-size:14px }
  .nav .wordmark { font-size: 20px; line-height: 1; gap: 5px }
  .nav .wm-mark { width: 22px; height: 22px }
  .nav .browse > summary, .nav .nav-customize {
    min-height: 44px; padding: 8px; font-size: 11px; letter-spacing: 0;
    text-transform: none;
  }
}

/* The category menu. A <details>, so it opens, closes, takes the keyboard and
   lists real links with no JavaScript at all. site.js only adds
   click-outside-to-close and Escape. */
.browse { flex: none }
.browse > summary {
  list-style: none; cursor: pointer; display: inline-flex; align-items: center;
  gap: 0.5em; padding: var(--sp-2) var(--sp-4); border: 1px solid var(--ink);
  font-size: var(--t-caption); letter-spacing: 0.06em; text-transform: uppercase;
  font-weight: var(--w-medium);
  transition: background var(--dur-1) var(--ease-standard),
              color var(--dur-1) var(--ease-standard);
}
.browse > summary::-webkit-details-marker { display: none }
.browse > summary::marker { content: "" }
.browse > summary:hover { background: var(--ink); color: var(--on-fill) }
.browse-x {
  width: 0.5rem; height: 0.5rem; border-right: 1.5px solid currentColor;
  border-bottom: 1.5px solid currentColor; transform: translateY(-2px) rotate(45deg);
  transition: transform var(--dur-2) var(--ease-standard);
}
.browse[open] > summary { background: var(--ink); color: var(--on-fill) }
.browse[open] .browse-x { transform: translateY(1px) rotate(-135deg) }
.browse > summary.is-here { box-shadow: inset 0 -3px 0 var(--accent) }

/* Full-bleed panel. It hangs off .nav, which is sticky and therefore the
   containing block, so at 320px it is exactly the width of the viewport and
   cannot push the page sideways. */
.browse-panel {
  position: absolute; left: 0; right: 0; top: 100%;
  background: var(--surface); border-bottom: 1px solid var(--ink);
  box-shadow: 0 18px 40px -28px rgb(21 22 27 / 0.45);
  max-height: calc(100svh - 100%); overflow-y: auto; overscroll-behavior: contain;
}
.browse-cols {
  max-width: var(--max-content); margin-inline: auto;
  padding: var(--sp-6) var(--margin) var(--sp-7);
  display: grid; gap: var(--sp-6) var(--gutter);
  grid-template-columns: repeat(auto-fit, minmax(min(190px, 100%), 1fr));
}
.browse-h {
  font-size: var(--t-micro); line-height: var(--lh-micro); letter-spacing: 0.18em;
  text-transform: uppercase; font-weight: var(--w-medium); color: var(--ink-3);
  border-bottom: 1px solid var(--rule); padding-bottom: var(--sp-3);
}
.browse-col ul { margin: var(--sp-3) 0 0; padding: 0; list-style: none }
.browse-col li + li { margin-top: var(--sp-1) }
.browse-col a {
  display: block; padding: var(--sp-2) 0; text-decoration: none; color: var(--ink);
  font-size: var(--t-sm); line-height: var(--lh-sm);
}
.browse-col a:hover { color: var(--accent); text-decoration: underline }

.nav-links { display: flex; flex-wrap: wrap; gap: var(--sp-2) var(--sp-5) }
.nav-links a {
  font-size: var(--t-caption); letter-spacing: 0.04em; color: var(--ink-2);
  text-decoration: none; padding-block: var(--sp-1);
  border-bottom: 1px solid transparent;
  transition: border-color var(--dur-1) var(--ease-standard),
              color var(--dur-1) var(--ease-standard);
}
.nav-links a:hover, .nav-links a[aria-current] { color: var(--ink); border-bottom-color: var(--accent) }
/* Under 560px the four secondary labels would take a row of their own beside a
   button that has nowhere to go. They are in the menu panel as well, so this
   hides the row rather than losing them. */
@media (max-width: 559px) { .nav-links { display: none } }

/* --- the showcase banner ------------------------------------------------
   The first thing on every product-related page: the object in a room. Text
   over media, on a scrim heavy enough that a photograph cannot take the
   headline below its contrast floor. */
.showcase {
  position: relative; isolation: isolate; background: var(--surface-inv);
  --ink: var(--ink-on-inv); --ink-2: var(--ink-2-on-inv); --ink-3: var(--ink-3-on-inv);
  --rule: var(--rule-on-inv); --btn-over: #101116; --focus: var(--ink-on-inv);
  color: var(--ink);
}
.showcase-media { position: absolute; inset: 0; z-index: 0; overflow: hidden }
.showcase-media > * { width: 100%; height: 100%; object-fit: cover }
.showcase-media::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(180deg, rgb(16 17 22 / 0.94), rgb(16 17 22 / 0.88));
}
@media (min-width: 900px) {
  .showcase-media::after {
    background: linear-gradient(90deg, rgb(16 17 22 / 0.95) 0%, rgb(16 17 22 / 0.88) 52%,
                rgb(16 17 22 / 0.70) 100%);
  }
}
.showcase-body {
  position: relative; z-index: 1; max-width: var(--max-content); margin-inline: auto;
  padding: var(--sp-8) var(--margin);
}
.showcase-hero .showcase-body { padding-block: var(--sp-9) }
@media (min-width: 900px) {
  .showcase-body { padding-block: var(--sp-9) }
  .showcase-hero .showcase-body { padding-block: var(--sp-10) }
  .showcase-in { max-width: 44rem }
}
/* The house h1 rung is 72px above 768px, which is right for a page whose headline IS the
   page. Here the slogan is the headline and the h1 is the sentence under it, so both are
   set explicitly and the h1 sits a rung below the slogan.

   THE LINE-HEIGHTS BELOW ARE A FLOOR, NOT A PREFERENCE. Instrument Serif's ascent plus
   descent measures 1.29 em, so anything under that makes the wrapped lines of a headline
   physically collide -- these were 1.08 and 1.24 and both overlapped, measured on the ink
   with the font loaded. Because these rules set a clamp() size and a fixed line-height
   they bypass --lh-h1 entirely, so raising the token did not reach them. Do not take any
   of them below 1.29. */
.showcase h1 {
  max-width: 22ch; font-size: clamp(2rem, 1.4rem + 2.2vw, 3rem); line-height: 1.33;
  letter-spacing: -0.018em;
}
.showcase-hero h1 {
  max-width: 26ch; font-size: clamp(1.5rem, 1.05rem + 1.85vw, 2.25rem); line-height: 1.33;
  letter-spacing: -0.012em;
}
.showcase .lede { color: var(--ink-2-on-inv) }
.slogan {
  font-family: var(--font-display); font-weight: var(--w-display);
  font-size: clamp(2.25rem, 1.35rem + 3.6vw, 3.5rem); line-height: 1.33;
  letter-spacing: -0.02em; color: var(--ink-on-inv); max-width: 16ch;
  margin-bottom: var(--sp-5);
}
.showcase h1 + .lede { margin-top: var(--sp-5) }
.showcase .mono a { text-decoration: none; border-bottom: 1px solid var(--rule-on-inv) }

/* --- placeholders -------------------------------------------------------
   No photograph exists yet. A grey box with nothing in it reads as a bug, so
   each one says what it is going to show. When catalog.json gets a src, the
   build writes an <img> here instead and none of this applies. */
.ph {
  position: relative; overflow: hidden; aspect-ratio: 4 / 3; display: grid;
  align-content: end; padding: var(--sp-4); background: var(--surface-2);
  border: 1px solid var(--rule); --p1: #FAFAFB; --p2: #E6E6EA; --p3: #D5D5DB;
}
.ph::before {
  content: ""; position: absolute; inset: 0; z-index: 0;
  background:
    repeating-linear-gradient(0deg, rgb(21 22 27 / 0.055) 0 1px, transparent 1px 7px),
    linear-gradient(152deg, var(--p1) 0%, var(--p2) 58%, var(--p3) 100%);
}
.ph::after {
  content: ""; position: absolute; z-index: 0; inset: 18% 24% 26%;
  border: 1px solid rgb(21 22 27 / 0.16);
  background: linear-gradient(160deg, rgb(255 255 255 / 0.55), rgb(21 22 27 / 0.06));
}
.ph[data-tone="in-place"] { --p1: #F2F2F6; --p2: #DEDEE4; --p3: #C9C9D1 }
.ph[data-tone="detail"]   { --p1: #FBFBFC; --p2: #E9E7F1; --p3: #D6D2E6 }
.ph[data-tone="scale"]    { --p1: #F7F7F9; --p2: #E4E4E9; --p3: #CFCFD7 }
.ph[data-tone="set"]      { --p1: #FAFAFB; --p2: #EDEBF3; --p3: #DAD6E8 }
.ph-in { position: relative; z-index: 1; display: block }
.ph-view {
  display: block; font-size: var(--t-caption); line-height: 1rem; letter-spacing: 0.14em;
  text-transform: uppercase; font-weight: var(--w-medium); color: var(--ink-2);
}
.ph-cap {
  display: block; margin-top: var(--sp-2); font-size: var(--t-caption); line-height: 1.15rem;
  color: var(--ink-3); max-width: 34ch;
}
.showcase .ph {
  position: absolute; inset: 0; aspect-ratio: auto; border: 0; align-content: end;
  justify-items: end; padding: var(--sp-5);
}
/* The corner label sits on its own chip rather than straight on the picture. Over a scrim
   that fades to 0.70 at the right edge, a 12px label on an unknown photograph is somewhere
   between 4.3:1 and fine, and "somewhere between" is not a contrast decision. The chip makes
   the ground deterministic and still lets the photograph through everywhere else. */
.showcase .ph-in {
  text-align: right; max-width: 24rem; background: rgb(16 17 22 / 0.72);
  padding: var(--sp-2) var(--sp-3);
}
.showcase .ph-cap { display: none }
@media (max-width: 899px) { .showcase .ph-in { display: none } }

/* --- the media slider ---------------------------------------------------
   With no JavaScript this is a grid and every panel is on the page, which is a
   finished layout rather than a fallback. site.js adds .is-live, and then it
   is one panel at a time with dots, arrow keys, and auto-advance while the
   pointer is over it or the focus is inside it. */
/* 46rem, because a full-width 1200px panel at 4:3 is a 900px tall grey rectangle and
   the page below it disappears. The strip of brand cards is full width on purpose and
   carries its own class. */
.slider { grid-column: 1 / -1; max-width: 46rem; margin-top: var(--sp-5); position: relative }
.slides {
  margin: 0; padding: 0; list-style: none; display: grid; gap: var(--sp-4);
  grid-template-columns: repeat(auto-fit, minmax(min(210px, 100%), 1fr));
}
.slide { margin: 0; min-width: 0 }
[data-slider].is-live .slides {
  display: flex; gap: 0; overflow-x: auto; scroll-snap-type: x mandatory;
  scrollbar-width: none; -ms-overflow-style: none;
}
[data-slider].is-live .slides::-webkit-scrollbar { display: none }
[data-slider].is-live .slide { flex: 0 0 100%; scroll-snap-align: start }
[data-slider].is-live .slides:focus-visible { outline: 2px solid var(--focus); outline-offset: 3px }
.slider-dots { display: flex; flex-wrap: wrap; gap: var(--sp-1); margin-top: var(--sp-3) }
.slider-dot {
  appearance: none; background: none; border: 0; padding: var(--sp-2) var(--sp-1);
  cursor: pointer; line-height: 0;
}
.slider-dot i {
  display: block; width: 1.75rem; height: 3px; background: var(--rule);
  transition: background var(--dur-2) var(--ease-standard);
}
.slider-dot[aria-current="true"] i { background: var(--ink) }
.slider-dot:hover i { background: var(--ink-3) }
.slider-note {
  margin-top: var(--sp-3); font-size: var(--t-caption); line-height: 1.25rem;
  color: var(--ink-3);
}

/* --- section furniture -------------------------------------------------- */
.band-soft { background: var(--surface-2) }
.sh { grid-column: 1 / -1; max-width: var(--max-text) }
.sh h2 { margin-top: var(--sp-3) }
.hh { margin-top: var(--sp-7) }
.ticks { margin: var(--sp-5) 0 0; padding: 0; list-style: none; max-width: var(--max-text) }
.ticks li {
  position: relative; padding: var(--sp-3) 0 var(--sp-3) var(--sp-6);
  border-top: 1px solid var(--rule); color: var(--ink-2);
  font-size: var(--t-sm); line-height: var(--lh-sm);
}
.ticks li::before {
  content: ""; position: absolute; left: var(--sp-2); top: 1.35rem; width: 0.6rem;
  height: 0.3rem; border-left: 1.5px solid var(--accent);
  border-bottom: 1.5px solid var(--accent); transform: rotate(-45deg);
}

/* --- product cards ------------------------------------------------------ */
.pcards {
  grid-column: 1 / -1; display: grid; gap: var(--sp-6) var(--gutter); margin: var(--sp-6) 0 0;
  padding: 0; list-style: none;
  grid-template-columns: repeat(auto-fit, minmax(min(220px, 100%), 1fr));
}
.pcards-wide { grid-template-columns: repeat(auto-fit, minmax(min(260px, 100%), 1fr)) }
.pcard { margin: 0; min-width: 0 }
.pcard > a { display: block; text-decoration: none; color: inherit; height: 100% }
.pcard-media { display: block; margin-bottom: var(--sp-4) }
.pcard .ph { aspect-ratio: 4 / 3 }
.pcard-kicker {
  display: block; font-size: var(--t-micro); line-height: var(--lh-micro);
  letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-3);
}
.pcard strong {
  display: block; margin-top: var(--sp-2); font-family: var(--font-display);
  font-weight: var(--w-display); font-size: var(--t-h4); line-height: var(--lh-h4);
}
.pcard-sum {
  display: block; margin-top: var(--sp-2); font-size: var(--t-caption); line-height: 1.35rem;
  color: var(--ink-2);
}
.pcard > a:hover strong { color: var(--accent); text-decoration: underline }

/* --- the four featured blocks ------------------------------------------ */
.feature { margin-top: var(--sp-9); align-items: center; row-gap: var(--sp-6) }
.feature-media, .feature-body { grid-column: 1 / -1 }
@media (min-width: 900px) {
  .feature-media { grid-column: 1 / 7 }
  .feature-body  { grid-column: 8 / 13 }
  .feature-alt .feature-media { grid-column: 7 / 13; order: 2 }
  .feature-alt .feature-body  { grid-column: 1 / 6; order: 1 }
}
.feature-body h3 {
  margin-top: var(--sp-3); font-family: var(--font-display); font-weight: var(--w-display);
  font-size: var(--t-h2); line-height: var(--lh-h2); max-width: 18ch;
}
.feature-media .slider { margin-top: 0 }

/* --- category cards on the home page ----------------------------------- */
.ccards {
  grid-column: 1 / -1; margin-top: var(--sp-7); display: grid;
  gap: var(--sp-7) var(--gutter);
  grid-template-columns: repeat(auto-fit, minmax(min(280px, 100%), 1fr));
}
.ccard { min-width: 0 }
.ccard .slider { margin-top: 0; margin-bottom: var(--sp-4) }
.ccard h3 { font-family: var(--font-display); font-weight: var(--w-display) }
.ccard h3 a { text-decoration: none }
.ccard h3 a:hover { color: var(--accent); text-decoration: underline }
.ccard-lede {
  margin-top: var(--sp-3); font-size: var(--t-caption); line-height: 1.35rem;
  color: var(--ink-2);
}
.ccard-n, .cat-more { margin-top: var(--sp-3); font-size: var(--t-caption) }
.ccard-n a, .cat-more a { color: var(--accent) }

/* --- rooms and people cards -------------------------------------------- */
.wcards {
  grid-column: 1 / -1; margin: var(--sp-6) 0 0; padding: 0; list-style: none; display: grid;
  gap: var(--sp-4) var(--gutter);
  grid-template-columns: repeat(auto-fit, minmax(min(240px, 100%), 1fr));
}
.wcards li { margin: 0; min-width: 0 }
.wcards a {
  display: block; height: 100%; text-decoration: none; color: inherit;
  border: 1px solid var(--rule); padding: var(--sp-5);
  transition: border-color var(--dur-1) var(--ease-standard);
}
.wcards a:hover { border-color: var(--ink) }
.wcards strong {
  display: block; font-family: var(--font-display); font-weight: var(--w-display);
  font-size: var(--t-h4); line-height: var(--lh-h4);
}
.wcards span {
  display: block; margin-top: var(--sp-2); font-size: var(--t-caption); line-height: 1.35rem;
  color: var(--ink-2);
}

/* --- the lines ---------------------------------------------------------- */
.lcards {
  grid-column: 1 / -1; margin: var(--sp-7) 0 0; padding: 0; list-style: none; display: grid;
  gap: var(--sp-6) var(--gutter);
  grid-template-columns: repeat(auto-fit, minmax(min(250px, 100%), 1fr));
}
.lcard { margin: 0; min-width: 0; border-top: 1px solid var(--ink); padding-top: var(--sp-4) }
.lcard-what {
  font-size: var(--t-micro); line-height: var(--lh-micro); letter-spacing: 0.18em;
  text-transform: uppercase; color: var(--ink-3);
}
.lcard h3 {
  margin-top: var(--sp-3); font-family: var(--font-display); font-weight: var(--w-display);
}
.lcard h3 a { text-decoration: none }
.lcard h3 a:hover { color: var(--accent); text-decoration: underline }
.lcard-line {
  margin-top: var(--sp-3); font-size: var(--t-caption); line-height: 1.35rem;
  color: var(--ink-2);
}
.lcard-h {
  margin-top: var(--sp-5); font-size: var(--t-micro); line-height: var(--lh-micro);
  letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-3);
}
.lcard-items { margin: var(--sp-2) 0 0; padding: 0; list-style: none }
.lcard-items li {
  border-top: 1px solid var(--rule); padding: var(--sp-2) 0; font-size: var(--t-caption);
  line-height: 1.25rem; color: var(--ink-2);
}
.lcard-more { margin-top: var(--sp-4); font-size: var(--t-caption) }
.lcard-more a { color: var(--accent) }

/* --- the brands strip --------------------------------------------------- */
.strip { grid-column: 1 / -1; margin-top: var(--sp-7) }
.strip .slides { grid-template-columns: repeat(auto-fit, minmax(min(250px, 100%), 1fr)) }
.strip.is-live .slides { gap: var(--gutter); padding-bottom: var(--sp-2) }
.strip.is-live .slide { flex: 0 0 min(19rem, 84%) }  /* partial next card, on purpose */
.bcard { min-width: 0 }
.bcard a {
  display: block; height: 100%; text-decoration: none; color: inherit;
  border: 1px solid var(--rule); background: var(--surface); padding: var(--sp-5);
  transition: border-color var(--dur-1) var(--ease-standard);
}
.bcard a:hover { border-color: var(--ink) }
.bcard-what {
  display: block; font-size: var(--t-micro); line-height: var(--lh-micro);
  letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-3);
}
.bcard strong {
  display: block; margin-top: var(--sp-3); font-family: var(--font-display);
  font-weight: var(--w-display); font-size: var(--t-h3); line-height: var(--lh-h3);
}
.bcard-line, .bcard-shelf {
  display: block; margin-top: var(--sp-3); font-size: var(--t-caption); line-height: 1.35rem;
  color: var(--ink-2);
}
.bcard-shelf { color: var(--ink-3) }
.bcard-handle {
  display: block; margin-top: var(--sp-4); font-size: var(--t-caption); color: var(--accent);
}

/* --- category blocks on the products index ------------------------------ */
.cat-block { grid-column: 1 / -1; margin-top: var(--sp-9) }
.cat-head { max-width: var(--max-text); border-top: 1px solid var(--ink); padding-top: var(--sp-4) }
.cat-head h2 { font-family: var(--font-display); font-weight: var(--w-display) }
.cat-head h2 a { text-decoration: none }
.cat-head h2 a:hover { color: var(--accent); text-decoration: underline }
/* The family's own picture opens its block, then its products. Narrower than a product
   page's gallery because five of these stack down one page. */
.cat-block .slider { max-width: 34rem }

/* --- the make-yours block ----------------------------------------------- */
.banner {
  grid-column: 1 / -1; border: 1px solid var(--ink); padding: var(--sp-7) var(--sp-6);
  display: grid; gap: var(--sp-6) var(--gutter);
  grid-template-columns: repeat(auto-fit, minmax(min(280px, 100%), 1fr));
}
.banner h2 { margin-top: var(--sp-3); font-family: var(--font-display); font-weight: var(--w-display) }
.bpoints { margin: 0; padding: 0; list-style: none }
.bpoints li {
  border-top: 1px solid var(--rule); padding: var(--sp-3) 0; color: var(--ink-2);
  font-size: var(--t-caption); line-height: 1.35rem;
}

/* --- specs, clauses and routes ------------------------------------------ */
.spec, .routes, .terms {
  grid-column: 1 / -1; margin: var(--sp-6) 0 0; padding: 0; list-style: none;
}
.spec li, .routes li {
  border-top: 1px solid var(--rule); padding: var(--sp-4) 0; display: grid;
  gap: var(--sp-2) var(--gutter); color: var(--ink-2); font-size: var(--t-caption);
  line-height: 1.35rem;
}
@media (min-width: 768px) {
  .spec li { grid-template-columns: minmax(min(13rem, 100%), 1fr) 2fr; align-items: baseline }
  /* Two shapes of row share this list: a name and a line of copy, and a name, a line and a
     handle. :has counts the children so neither leaves an empty track. */
  .routes li { grid-template-columns: minmax(min(12rem, 100%), 1fr) 2fr; align-items: baseline }
  .routes li:has(> a) {
    grid-template-columns: minmax(min(12rem, 100%), 1fr) 2fr minmax(min(9rem, 100%), auto) }
  .routes li:has(> .mono) {
    grid-template-columns: minmax(min(10rem, 100%), 1fr) minmax(min(11rem, 100%), 1fr) 2fr }
}
.spec b, .routes b {
  font-family: var(--font-display); font-weight: var(--w-display); color: var(--ink);
  font-size: var(--t-body); line-height: var(--lh-body);
}
.routes a { color: var(--accent); text-decoration: none; border-bottom: 1px solid var(--rule) }
.routes a:hover { border-bottom-color: var(--accent) }
.terms li { border-top: 1px solid var(--rule); padding: var(--sp-6) 0 }
.terms h3 {
  font-family: var(--font-body); font-weight: var(--w-medium); font-size: var(--t-h4);
  line-height: var(--lh-h4);
}
.terms p { margin-top: var(--sp-3); color: var(--ink-2); max-width: 58ch }

/* --- where it is made --------------------------------------------------- */
.place { row-gap: var(--sp-7); align-items: center }
.place-body, .place-media { grid-column: 1 / -1 }
@media (min-width: 900px) {
  .place-body { grid-column: 1 / 6 }
  .place-media { grid-column: 7 / 13 }
}
.place-media .slider { margin-top: 0 }

/* --- the onward block --------------------------------------------------- */
.onward {
  grid-column: 1 / -1; display: grid; gap: var(--sp-5) var(--gutter);
  grid-template-columns: repeat(auto-fit, minmax(min(240px, 100%), 1fr));
  border-top: 1px solid var(--ink); padding-top: var(--sp-5);
}
.onward a { display: block; text-decoration: none; color: inherit }
.onward a strong {
  display: block; font-family: var(--font-display); font-weight: var(--w-display);
  font-size: var(--t-h4); line-height: var(--lh-h4);
}
.onward a p { margin-top: var(--sp-2); font-size: var(--t-caption); line-height: 1.25rem;
  color: var(--ink-3) }
.onward a:hover strong { color: var(--accent); text-decoration: underline }

/* --- the footer. One definition, every page. ---------------------------- */
.foot { background: var(--surface-2); border-top: 3px solid var(--ink); margin-top: 0 }
.foot-in {
  max-width: var(--max-content); margin-inline: auto;
  padding: var(--sp-8) var(--margin) var(--sp-9);
  display: grid; gap: var(--sp-7) var(--gutter);
  grid-template-columns: repeat(auto-fit, minmax(min(190px, 100%), 1fr));
}
.foot-brand { grid-column: 1 / -1 }
@media (min-width: 900px) { .foot-brand { grid-column: span 2 } }
.foot .wordmark { font-size: var(--t-h3); line-height: var(--lh-h3); margin-right: 0 }
.foot-slogan {
  margin-top: var(--sp-4); font-family: var(--font-display); font-weight: var(--w-display);
  font-size: var(--t-h4); line-height: var(--lh-h4); color: var(--ink);
}
.foot-note {
  margin-top: var(--sp-4); font-size: var(--t-caption); line-height: 1.35rem;
  color: var(--ink-2); max-width: 34ch;
}
.foot-h {
  font-size: var(--t-micro); line-height: var(--lh-micro); letter-spacing: 0.18em;
  text-transform: uppercase; color: var(--ink-3); border-bottom: 1px solid var(--rule);
  padding-bottom: var(--sp-3);
}
.foot ul { margin: var(--sp-3) 0 0; padding: 0; list-style: none }
.foot li { margin-top: var(--sp-2); font-size: var(--t-caption); line-height: 1.25rem }
.foot a { color: var(--ink); text-decoration: none }
.foot a:hover { color: var(--accent); text-decoration: underline }
.foot-group > summary { cursor: pointer; list-style: none }
.foot-group > summary::-webkit-details-marker { display: none }
.foot-group > summary::after { content: '+'; float: right; font-size: 18px }
.foot-group[open] > summary::after { content: '−' }
.foot-group > summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px }
@media (min-width: 700px) {
  .foot-group::details-content { content-visibility: visible; display: block }
  .foot-group:not([open]) > ul, .foot-group:not([open]) > p { display: block }
  .foot-group > summary::after { display: none }
}
@media (max-width: 699px) {
  .foot-in { grid-template-columns: minmax(0, 1fr); padding: 28px 20px; gap: 0 }
  .foot-products { order: 0; padding-bottom: 20px }
  .foot-products ul { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 16px }
  .foot li { margin-top: 0 }
  .foot li a { display: flex; align-items: center; min-height: 44px; padding: 7px 0; line-height: 1.35 }
  .foot-h { letter-spacing: 0; text-transform: none; font-size: 14px; color: var(--ink); padding-bottom: 10px }
  .foot-group { order: 1; border-top: 1px solid var(--rule) }
  .foot-group > summary { display: block; min-height: 52px; padding: 16px 0; border: 0 }
  .foot-group ul { margin: 0 0 12px }
  .foot-group .foot-note { margin: 0 0 16px }
  .foot-brand { order: 2; grid-column: 1; border-top: 1px solid var(--rule); padding-top: 24px; margin-top: 8px }
  .foot .wordmark { font-size: 26px }
  .foot-slogan { margin-top: 10px; font-size: 20px; line-height: 1.2 }
  .foot-note { margin-top: 12px; max-width: 42ch }
  .foot-brand .lang { margin-top: 16px }
}

/* --- motion ------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  .showcase video { display: none }
  [data-slider].is-live .slides { scroll-behavior: auto }
  .browse-x { transition: none }
}
}


/* ============================================================================
   DISPLAY LINE-HEIGHT, MEASURED RATHER THAN CHOSEN.

   The shared tokens set --lh-h1 to 4.75rem against a 4.5rem --t-h1, a ratio of
   1.056, and --lh-display to exactly the font size, a ratio of 1.00. That is
   tighter than these faces' own ascent plus descent, so the wrapped lines of a
   headline physically collided -- the founder photographed it.

   Instrument Serif stops colliding at 1.29, measured by binary search on the ink
   rects of a real two-line heading with the font loaded, not guessed and not
   taken from the font's bounding box. It is set to 1.33 here for a little
   air. Across the eight sites the needed ratio runs from 1.00 to 1.58, which is
   why this belongs per site and cannot be one global number.

   h3 is left alone: it already sits at 1.23 and was never the problem.
   ========================================================================= */
:root {
  --lh-h1:      calc(var(--t-h1) * 1.33);
  --lh-h2:      calc(var(--t-h2) * 1.33);
  --lh-display: calc(var(--t-display) * 1.33);
}
