/* ==========================================================================
   Aura Vanz Design — site stylesheet
   Ported from the Claude Design project "Aura Vanz Design homepage
   directions" (604de9c0-698b-4054-b155-014f89b0b92d): Home, Background,
   Services and the eight Interior style pages.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. Tokens
   -------------------------------------------------------------------------- */
:root {
  /* surfaces */
  --cream:        #F6F2EA;
  --cream-2:      #EFE9DD;
  --panel:        #FFFDF8;
  --media-bg:     #e7e3da;
  --dark:         #221E18;

  /* ink */
  --ink:          #221E18;
  --ink-strong:   #3b352c;
  --ink-soft:     #5c5346;
  --ink-mute:     #6b6255;
  --ink-faint:    #8a8073;
  --ink-faintest: #a49a89;

  /* accent */
  --gold:         #BF9403;
  --gold-dark:    #a8820a;
  --gold-pale:    #cbb98f;
  --navy:         #00477D;

  /* rules */
  --line:         rgba(34, 30, 24, .10);
  --line-strong:  rgba(34, 30, 24, .14);
  --line-hairline:rgba(34, 30, 24, .07);

  /* type
     Latin keeps the design's two faces — Cormorant Garamond for display, Jost
     for UI. Neither carries Chinese glyphs, so every Chinese character falls
     to --font-cjk instead: Noto Sans, in headings and body alike. Keep Noto
     *after* the Latin face in each stack or it will take over the Latin too. */
  --font-cjk:     'Noto Sans TC';
  /* Futura is not licensed as a web font here, so it renders only where the
     reader has it installed. Jost is the fallback — a Futura revival, already
     loaded. Append var(--font-cjk) after it wherever Chinese can appear. */
  --font-futura:  Futura, 'Futura PT', 'Jost';
  --font-display: 'Cormorant Garamond', var(--font-cjk), serif;
  /* the design declares two Jost stacks: the root/body one, and a shorter one
     on every element that names the font explicitly. Both are kept. */
  --font-ui:      'Jost', var(--font-cjk), system-ui, sans-serif;  /* inherited */
  --font-ui-ex:   'Jost', var(--font-cjk), sans-serif;             /* explicit  */

  /* motion */
  --ease:         cubic-bezier(.16, 1, .3, 1);

  /* layout */
  --gutter:       clamp(20px, 6vw, 96px);

  /* nav is transparent over the hero and solid once scrolled */
  --nav-fg:       #fff;
}

/* Simplified Chinese wants the SC glyph forms. aura.js stamps data-lang on
   <html>, so the whole page — headings included — re-resolves --font-cjk when
   the language switches. */
:root[data-lang="sc"] { --font-cjk: 'Noto Sans SC'; }

/* RedNote's wordmark is Simplified (小红书), so it is pinned to the SC face and
   reads identically on the Traditional and English pages.

   These have to restate the whole stack rather than just override --font-cjk:
   --font-ui-ex and --font-display are declared on :root, so the var(--font-cjk)
   inside them is already substituted by the time they inherit down here. Only
   the Chinese fallback differs from each element's normal stack — the Latin
   half stays Jost in the footer, Cormorant in the mobile menu, and the contact
   dropdown's Futura in the nav — that last one carries an extra .nav-panel so
   it outranks the dropdown rule whatever the source order. */
.nav-panel .panel-link.rednote { font-family: var(--font-futura), 'Noto Sans SC', sans-serif; }
.footer__social-text.rednote   { font-family: 'Jost', 'Noto Sans SC', sans-serif; }
.mobile-link.rednote           { font-family: 'Cormorant Garamond', 'Noto Sans SC', serif; }

*, *::before, *::after { box-sizing: border-box; }

/* The page scrolls vertically only. Sealing both html and body matters: with
   overflow-x on body alone the value propagates to the viewport and body itself
   computes back to visible, which mobile Safari will still let you pan. Nothing
   should be relying on this — it is the backstop, not the fix — so anything
   that genuinely sticks out past the viewport is dealt with at the source. */
html, body {
  max-width: 100%;
  overflow-x: hidden;
  overscroll-behavior-x: none;
}

html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }

body {
  margin: 0;
  min-height: 100vh;
  width: 100%;
  position: relative;
  background: var(--cream);
  color: var(--ink);
  font-family: var(--font-ui);
  -webkit-font-smoothing: antialiased;
}

a { color: var(--gold); }
a:hover { color: var(--gold-dark); }

img { max-width: 100%; }

:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: 3px;
}

/* Parked with clip rather than left:-9999px — an off-canvas box still counts
   toward the document's scrollable width in some engines. */
.skip-link {
  position: absolute;
  left: 0;
  top: 0;
  z-index: 200;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  background: var(--ink);
  color: var(--cream);
  padding: 12px 20px;
  font-size: 13px;
  letter-spacing: .14em;
  text-transform: uppercase;
  text-decoration: none;
  white-space: nowrap;
}
.skip-link:focus {
  width: auto;
  height: auto;
  overflow: visible;
  clip: auto;
  clip-path: none;
  color: var(--cream);
}

.visually-hidden {
  position: absolute;
  width: 1px; height: 1px;
  margin: -1px; padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}

/* --------------------------------------------------------------------------
   2. Navigation
   -------------------------------------------------------------------------- */
.nav {
  position: fixed;
  inset: 0 0 auto 0;
  z-index: 100;
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  padding: 20px var(--gutter);
  background: transparent;
  border-bottom: 1px solid transparent;
  color: var(--nav-fg);
  transition:
    padding .5s var(--ease),
    background .5s ease,
    color .5s ease,
    border-color .5s ease;
}

.nav.is-solid {
  --nav-fg: var(--ink);
  padding: 12px var(--gutter);
  background: rgba(246, 242, 234, .9);
  -webkit-backdrop-filter: blur(16px);
  backdrop-filter: blur(16px);
  border-bottom-color: rgba(34, 30, 24, .08);
}

.nav__group {
  display: flex;
  align-items: center;
}
.nav__group--left  { gap: 34px; }
.nav__group--right { gap: 20px; justify-content: flex-end; }

.nav__logo {
  grid-column: 2;
  justify-self: center;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 26px;
  letter-spacing: .05em;
  line-height: 1;
  white-space: nowrap;
  text-decoration: none;
  color: var(--nav-fg);
  transition: color .5s ease;
}
.nav__logo:hover { color: var(--nav-fg); }

/* -- dropdown trigger -- */
.nav-item { position: relative; }

.nav-item__btn {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 8px 0;
  background: none;
  border: none;
  color: inherit;
  font-family: var(--font-ui-ex);
  font-size: 12px;
  letter-spacing: .14em;
  text-transform: uppercase;
  cursor: pointer;
  transition: color .25s ease;
}
.nav-item__btn:hover,
.nav-item.is-open > .nav-item__btn { color: var(--gold); }

.nav-item__caret { font-size: 9px; opacity: .7; }

/* -- dropdown panel -- */
.nav-panel {
  position: absolute;
  top: calc(100% + 16px);
  left: 0;
  min-width: 210px;
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 10px;
  border-radius: 2px;
  background: var(--panel);
  border: 1px solid var(--line-hairline);
  box-shadow: 0 24px 60px -24px rgba(34, 30, 24, .4);
  color: var(--ink);
  opacity: 0;
  visibility: hidden;
  transform: translateY(10px);
  transition: opacity .35s ease, transform .35s ease, visibility .35s;
  z-index: 120;
}
.nav-item.is-open > .nav-panel {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}

.nav-panel--wide  { min-width: 320px; }
.nav-panel--right { left: auto; right: 0; min-width: 230px; }

/* the contact dropdown is set in Futura; Chinese still falls to --font-cjk */
.nav-panel--right .panel-link {
  font-family: var(--font-futura), var(--font-cjk), sans-serif;
}

.nav-panel__grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 2px;
}

.panel-link {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 10px;
  padding: 9px 12px;
  border-radius: 2px;
  color: var(--ink);
  text-decoration: none;
  font-family: var(--font-ui-ex);
  font-size: 13.5px;
  letter-spacing: .02em;
  transition: background .25s ease, color .25s ease, padding-left .25s ease;
}
.panel-link:hover,
.panel-link:focus-visible {
  background: #F3EEE2;
  color: var(--gold);
  padding-left: 18px;
}
.panel-link.is-active {
  background: #F3EEE2;
  color: var(--gold);
}
.panel-link__icon { opacity: .4; }

/* The WeChat row is a <button> so it can own the flyout; strip the UA button
   chrome (border, background, cursor, shrink-to-fit width) so it is
   indistinguishable from the <a> rows above it. */
button.panel-link {
  width: 100%;
  margin: 0;
  background: none;
  border: none;
  cursor: pointer;
}

/* -- WeChat flyout inside the contact panel -- */
.qr-flyout { position: relative; }

.qr-card {
  position: absolute;
  background: #fff;
  box-shadow: 0 10px 30px rgba(0, 0, 0, .08);
  border: 1px solid var(--line-hairline);
  padding: 10px;
  border-radius: 2px;
  width: 170px;
  opacity: 0;
  visibility: hidden;
  transition: opacity .35s var(--ease), transform .35s var(--ease), visibility .35s;
  pointer-events: none;
  z-index: 130;
}
.qr-card img { width: 150px; height: 150px; display: block; }
.qr-card__label {
  margin-top: 8px;
  font-family: var(--font-ui-ex);
  font-weight: 600;
  font-size: 10px;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--ink-faint);
  text-align: center;
}

/* menu variant: slides in from the right edge of the panel */
.qr-card--menu {
  right: calc(100% + 12px);
  bottom: -10px;
  transform: translateX(8px);
}
.qr-flyout.is-open > .qr-card--menu {
  opacity: 1;
  visibility: visible;
  transform: translateX(0);
}

/* footer variant: pops above the icon */
.qr-card--pop {
  left: 50%;
  bottom: calc(100% + 16px);
  width: 174px;
  padding: 12px;
  border-radius: 10px;
  border: none;
  box-shadow: 0 26px 60px -22px rgba(34, 30, 24, .5);
  transform: translateX(-50%) translateY(8px);
  z-index: 30;
}
.qr-flyout.is-open > .qr-card--pop {
  opacity: 1;
  visibility: visible;
  transform: translateX(-50%) translateY(0);
}
.qr-card--pop .qr-card__label { text-align: center; }

/* The WeChat icon is the last item in a centred row, so a 174px card centred on
   it hangs past the right edge on a phone — and a visibility:hidden box still
   counts toward the document width, which is what let the page pan sideways.
   Anchor it to the icon's right edge on narrow screens. */
@media (max-width: 599px) {
  .qr-card--pop {
    left: auto;
    right: 0;
    transform: translateX(0) translateY(8px);
  }
  .qr-flyout.is-open > .qr-card--pop { transform: translateX(0) translateY(0); }
}

/* -- language switch -- */
.lang {
  display: flex;
  align-items: center;
  gap: 2px;
  margin-left: 8px;
}
.lang__btn {
  padding: 4px 6px;
  background: none;
  border: none;
  cursor: pointer;
  color: inherit;
  opacity: .7;
  font-family: var(--font-ui-ex);
  font-size: 12px;
  font-weight: 400;
  letter-spacing: .08em;
  transition: color .25s ease, opacity .25s ease;
}
.lang__btn[aria-pressed="true"] {
  color: var(--gold);
  opacity: 1;
  font-weight: 600;
}

/* -- hamburger -- */
.hamburger {
  display: none;
  grid-column: 3;
  justify-self: end;
  flex-direction: column;
  gap: 5px;
  padding: 6px 0;
  background: none;
  border: none;
  color: var(--nav-fg);
  cursor: pointer;
}
.hamburger span {
  display: block;
  width: 22px;
  height: 1.5px;
  background: currentColor;
}
.hamburger span:last-child { width: 14px; align-self: flex-end; }

/* --------------------------------------------------------------------------
   3. Mobile menu
   -------------------------------------------------------------------------- */
.mobile-menu {
  position: fixed;
  inset: 0;
  z-index: 95;
  display: flex;
  flex-direction: column;
  overflow-y: auto;
  padding: 110px clamp(28px, 8vw, 64px) 40px;
  background: rgba(246, 242, 234, .98);
  -webkit-backdrop-filter: blur(20px);
  backdrop-filter: blur(20px);
  opacity: 0;
  visibility: hidden;
  transform: translateY(-12px);
  transition: opacity .5s ease, transform .5s var(--ease), visibility .5s;
}
/* When open the overlay sits above the fixed nav so its own close button is
   reachable; the nav's hamburger is hidden to avoid two stacked controls. */
.mobile-menu.is-open {
  z-index: 105;
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}

.mobile-menu__close {
  position: absolute;
  top: 34px;
  right: 28px;
  background: none;
  border: none;
  color: var(--ink);
  font-family: var(--font-ui-ex);
  font-size: 12px;
  letter-spacing: .14em;
  text-transform: uppercase;
  cursor: pointer;
}

.mobile-group {
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.mobile-group + .mobile-group { margin-top: 22px; }

.mobile-group__title {
  margin: 0 0 4px;
  font-family: var(--font-display);
  font-size: 13px;
  font-weight: 400;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--gold);
}

.mobile-link {
  color: var(--ink);
  text-decoration: none;
  font-family: var(--font-display);
  font-size: 26px;
  line-height: 1.5;
  letter-spacing: .01em;
}
.mobile-link:hover { color: var(--gold); }

.mobile-qr {
  width: 140px;
  height: 140px;
  margin-top: 8px;
  border-radius: 8px;
  display: block;
}

.mobile-lang {
  display: flex;
  gap: 14px;
  margin-top: 34px;
}
.mobile-lang .lang__btn {
  padding: 8px 16px;
  border: 1px solid rgba(34, 30, 24, .2);
  border-radius: 2px;
  color: var(--ink);
  opacity: 1;
  font-size: 13px;
}
.mobile-lang .lang__btn[aria-pressed="true"] {
  border-color: var(--gold);
  color: var(--gold);
}

/* --------------------------------------------------------------------------
   4. Hero — shared
   -------------------------------------------------------------------------- */
.hero {
  position: relative;
  height: clamp(520px, 92vh, 940px);
  overflow: hidden;
  display: flex;
  align-items: flex-end;
}

/* the Interior style pages and the home page run a taller hero */
.hero--tall { height: clamp(560px, 100vh, 1000px); }

.hero__parallax {
  position: absolute;
  inset: -8% 0;
  will-change: transform;
}

.hero__zoom {
  position: absolute;
  inset: 0;
  animation: heroZoom 24s ease-in-out infinite alternate;
}

.hero__img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.hero__scrim {
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: linear-gradient(
    180deg,
    rgba(20, 16, 12, .34) 0%,
    rgba(20, 16, 12, .08) 38%,
    rgba(20, 16, 12, .60) 100%
  );
}
/* the style pages sit a touch lighter over their hero render */
.hero__scrim--light {
  background: linear-gradient(
    180deg,
    rgba(20, 16, 12, .30) 0%,
    rgba(20, 16, 12, .05) 35%,
    rgba(20, 16, 12, .55) 100%
  );
}

.hero__body {
  position: relative;
  max-width: 1120px;
  padding: 0 var(--gutter) clamp(56px, 10vh, 116px);
  color: #fff;
  pointer-events: none;
}

.hero__kicker {
  margin: 0;
  font-family: var(--font-ui-ex);
  font-size: clamp(10px, 1.1vw, 13px);
  letter-spacing: .42em;
  text-transform: uppercase;
  opacity: .9;
  animation: heroRise 1.1s var(--ease) both;
}

.hero__title {
  margin: 14px 0 0;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(52px, 10vw, 140px);
  line-height: .92;
  letter-spacing: .02em;
  animation: heroRise 1.2s var(--ease) .12s both;
}

.hero__sub {
  margin: 16px 0 0;
  max-width: 820px;
  font-family: var(--font-display);
  font-style: italic;
  font-size: clamp(19px, 2.5vw, 36px);
  opacity: .96;
  animation: heroRise 1.2s var(--ease) .28s both;
}
/* style pages carry a slightly smaller strapline over a narrower measure */
.hero__sub--compact {
  max-width: 760px;
  font-size: clamp(18px, 2.4vw, 34px);
  margin-top: 14px;
  opacity: .95;
}

/* a single hairline that grows out of the hero's bottom-right corner */
.hero__rule {
  position: absolute;
  right: var(--gutter);
  bottom: 34px;
  width: 1px;
  height: 46px;
  background: linear-gradient(#fff, transparent);
  animation: lineGrow 1.4s ease .6s both;
  pointer-events: none;
}

@keyframes heroZoom {
  from { transform: scale(1); }
  to   { transform: scale(1.14); }
}
@keyframes heroRise {
  from { opacity: 0; transform: translateY(26px); }
  to   { opacity: 1; transform: translateY(0); }
}
@keyframes lineGrow {
  from { height: 0; }
  to   { height: 46px; }
}
@keyframes floatCue {
  0%, 100% { transform: translateY(0); opacity: .7; }
  50%      { transform: translateY(8px); opacity: 1; }
}

/* --------------------------------------------------------------------------
   5. Sections — shared
   -------------------------------------------------------------------------- */
.section__head {
  display: flex;
  align-items: baseline;
  gap: 16px;
  margin-bottom: clamp(40px, 6vh, 68px);
}

.section__num {
  font-family: var(--font-display);
  font-size: clamp(28px, 3vw, 40px);
  color: var(--gold);
  line-height: 1;
}

.section__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(34px, 5vw, 72px);
  line-height: 1;
}

/* small uppercase eyebrow used above most section headings */
.kicker {
  margin: 0;
  font-family: var(--font-ui-ex);
  font-size: 12px;
  letter-spacing: .36em;
  text-transform: uppercase;
  color: var(--gold);
}
.kicker--mute {
  letter-spacing: .28em;
  color: var(--ink-faint);
}

/* scroll reveal — JS adds .is-visible; see prefers-reduced-motion below */
[data-reveal] {
  opacity: 0;
  transform: translateY(30px);
}
[data-reveal].is-visible {
  opacity: 1;
  transform: translateY(0);
}

/* --------------------------------------------------------------------------
   6. Media — shared image frames
   -------------------------------------------------------------------------- */
.media {
  overflow: hidden;
  background: var(--media-bg);
}
.media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 1.2s var(--ease);
}
.media:hover img { transform: scale(1.05); }

.media--16x9 { aspect-ratio: 16 / 9; }
.media--16x10 { aspect-ratio: 16 / 10; }
.media--4x3  { aspect-ratio: 4 / 3; }

/* --------------------------------------------------------------------------
   7. Home — hero slideshow
   -------------------------------------------------------------------------- */
.hero--home {
  align-items: center;
  justify-content: center;
}

.slideshow { position: absolute; inset: 0; }

.slideshow__slide {
  position: absolute;
  inset: 0;
  opacity: 0;
  transition: opacity 1.6s ease;
  animation: heroZoom 22s ease-in-out infinite alternate;
}
.slideshow__slide.is-active { opacity: 1; }

.slideshow__slide img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.hero__body--center {
  text-align: center;
  padding: 0 24px;
  max-width: none;
}

.hero__brand {
  margin: 14px 0 0;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(58px, 12vw, 168px);
  line-height: .92;
  letter-spacing: .01em;
  animation: heroRise 1.2s var(--ease) .12s both;
}

.hero__tag {
  margin: 12px 0 0;
  font-family: var(--font-display);
  font-style: italic;
  font-size: clamp(16px, 2.2vw, 30px);
  opacity: .94;
  animation: heroRise 1.2s var(--ease) .28s both;
}

.hero__cue {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 34px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
  color: #fff;
  pointer-events: none;
}
.hero__cue-label {
  font-family: var(--font-ui-ex);
  font-size: 10px;
  letter-spacing: .3em;
  text-transform: uppercase;
  animation: floatCue 2.4s ease-in-out infinite;
}
.hero__cue-line {
  width: 1px;
  height: 46px;
  background: linear-gradient(#fff, transparent);
  animation: lineGrow 1.4s ease .6s both;
}

/* --------------------------------------------------------------------------
   8. Home — about
   -------------------------------------------------------------------------- */
.about {
  position: relative;
  padding: clamp(90px, 14vh, 180px) var(--gutter);
}

.about__kicker { margin-bottom: clamp(24px, 4vh, 48px); }

.about__cols {
  display: flex;
  flex-wrap: wrap;
  gap: clamp(30px, 6vw, 90px);
  align-items: flex-start;
}

.about__text {
  flex: 1 1 380px;
  min-width: min(100%, 340px);
}

.about__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(40px, 6.5vw, 104px);
  line-height: .98;
  letter-spacing: .005em;
  white-space: pre-line;
  will-change: transform;
}

.about__body {
  max-width: 560px;
  margin: clamp(28px, 4vh, 52px) 0 0;
  font-size: clamp(15px, 1.4vw, 19px);
  line-height: 1.9;
  font-weight: 300;
  color: var(--ink-soft);
  text-wrap: pretty;
}

.stats {
  display: flex;
  flex-wrap: wrap;
  gap: clamp(30px, 5vw, 68px);
  margin-top: clamp(40px, 6vh, 72px);
}

.stat__num {
  font-family: var(--font-display);
  font-size: clamp(44px, 5vw, 72px);
  line-height: 1;
  color: var(--navy);
}

.stat__label {
  margin: 6px 0 0;
  font-size: 12px;
  letter-spacing: .2em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

.about__aside {
  flex: 0 1 440px;
  min-width: min(100%, 300px);
  align-self: stretch;
}

.about__media {
  position: relative;
  height: clamp(420px, 62vh, 680px);
  will-change: transform;
}
.about__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.about__note {
  margin-top: 28px;
  padding-left: 22px;
  border-left: 1px solid #d8cdb9;
}

.about__note-title {
  margin: 0;
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 400;
  font-size: clamp(18px, 1.8vw, 24px);
  color: var(--ink);
}

.about__note-body {
  max-width: 380px;
  margin: 8px 0 0;
  font-size: 14px;
  line-height: 1.8;
  font-weight: 300;
  color: var(--ink-mute);
  text-wrap: pretty;
}

/* --------------------------------------------------------------------------
   9. Home — portfolio carousel
   -------------------------------------------------------------------------- */
.portfolio {
  position: relative;
  background: var(--dark);
}

.portfolio__head {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  gap: 24px;
  padding: clamp(70px, 10vh, 120px) var(--gutter) clamp(28px, 4vh, 48px);
}

.portfolio__title {
  margin: 10px 0 0;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(38px, 5.5vw, 84px);
  line-height: 1;
  color: var(--cream);
}

.portfolio__arrows { display: flex; gap: 12px; }

.arrow-btn {
  width: 52px;
  height: 52px;
  border-radius: 50%;
  border: 1px solid rgba(246, 242, 234, .3);
  background: none;
  color: var(--cream);
  font-family: var(--font-ui-ex);
  font-size: 20px;
  line-height: 1;
  cursor: pointer;
  transition: background .3s, border-color .3s, color .3s;
}
.arrow-btn:hover,
.arrow-btn:focus-visible {
  background: var(--gold);
  border-color: var(--gold);
  color: var(--ink);
}

.carousel {
  position: relative;
  height: clamp(460px, 74vh, 800px);
  overflow: hidden;
}

.slide {
  position: absolute;
  inset: 0;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity 1.1s var(--ease), visibility 1.1s;
}
.slide.is-active {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
}

.slide__stage {
  position: absolute;
  inset: 0;
  overflow: hidden;
}

.slide__zoom {
  position: absolute;
  inset: 0;
  transform: scale(1);
  transition: transform 7s ease-out;
}
.slide.is-active .slide__zoom { transform: scale(1.06); }

.slide__zoom img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.slide__scrim {
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: linear-gradient(
    90deg,
    rgba(20, 16, 12, .60) 0%,
    rgba(20, 16, 12, .10) 45%,
    rgba(20, 16, 12, 0) 70%
  );
}

.slide__inset {
  position: absolute;
  right: clamp(18px, 5vw, 80px);
  top: clamp(24px, 5vh, 60px);
  width: clamp(120px, 20vw, 250px);
  height: clamp(150px, 28vh, 320px);
  border: 5px solid var(--dark);
  background: var(--dark);
  box-shadow: 0 40px 70px -30px rgba(0, 0, 0, .7);
}
.slide__inset img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.slide__caption {
  position: absolute;
  left: var(--gutter);
  bottom: clamp(40px, 8vh, 80px);
  max-width: min(90%, 620px);
  color: var(--cream);
  pointer-events: none;
}

.slide__meta {
  display: flex;
  align-items: center;
  gap: 14px;
  font-family: var(--font-ui-ex);
  font-size: 12px;
  letter-spacing: .28em;
  text-transform: uppercase;
  color: var(--gold);
}
.slide__meta-rule {
  width: 26px;
  height: 1px;
  background: var(--gold);
  display: inline-block;
}

.slide__name {
  margin: 12px 0 0;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(34px, 5vw, 76px);
  line-height: 1;
}

.slide__link {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  margin-top: 22px;
  padding-bottom: 6px;
  border-bottom: 1px solid rgba(246, 242, 234, .4);
  color: var(--cream);
  text-decoration: none;
  font-size: 13px;
  letter-spacing: .16em;
  text-transform: uppercase;
  pointer-events: auto;
  transition: color .3s, border-color .3s;
}
.slide__link:hover,
.slide__link:focus-visible {
  color: var(--gold);
  border-bottom-color: var(--gold);
}

.dots {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: clamp(26px, 4vh, 44px) var(--gutter);
}

.dot {
  width: 8px;
  height: 8px;
  padding: 0;
  border: none;
  border-radius: 20px;
  background: rgba(246, 242, 234, .28);
  cursor: pointer;
  transition: width .45s ease, background .45s ease;
}
.dot[aria-current="true"] {
  width: 30px;
  background: var(--gold);
}

/* --------------------------------------------------------------------------
   10. Services page
   -------------------------------------------------------------------------- */
.services {
  padding: clamp(80px, 13vh, 170px) var(--gutter) clamp(40px, 6vh, 70px);
}

.services__grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 340px), 1fr));
  gap: 2px;
  background: var(--line);
  border: 1px solid var(--line);
}

.service {
  background: var(--cream);
  padding: clamp(30px, 4vw, 52px);
}

.service__no {
  font-family: var(--font-display);
  font-size: clamp(20px, 2vw, 26px);
  color: var(--gold);
  line-height: 1;
}

.service__title {
  margin: 14px 0 0;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(23px, 2.3vw, 32px);
  color: var(--ink);
}

.service__body {
  margin: 14px 0 0;
  font-size: 15px;
  line-height: 1.85;
  font-weight: 300;
  color: var(--ink-mute);
  text-wrap: pretty;
}

.process {
  padding: clamp(50px, 8vh, 90px) var(--gutter) clamp(50px, 7vh, 80px);
  background: var(--cream-2);
}

.process__list {
  display: flex;
  flex-direction: column;
  list-style: none;
  margin: 0;
  padding: 0;
}

.step {
  display: flex;
  flex-wrap: wrap;
  gap: clamp(16px, 4vw, 64px);
  padding: clamp(26px, 3.5vh, 40px) 0;
  border-top: 1px solid var(--line-strong);
}

.step__num {
  flex: 0 0 auto;
  min-width: 80px;
  font-family: var(--font-display);
  font-size: clamp(40px, 4.5vw, 68px);
  line-height: .9;
  color: var(--gold);
}

.step__title {
  flex: 1 1 300px;
  margin: 0;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(24px, 2.8vw, 40px);
  line-height: 1.1;
  color: var(--ink);
}

.step__body {
  flex: 1 1 380px;
  max-width: 600px;
  margin: 0;
  font-size: clamp(14px, 1.1vw, 17px);
  line-height: 1.95;
  font-weight: 300;
  color: var(--ink-soft);
  text-wrap: pretty;
}

.why {
  padding: clamp(70px, 10vh, 130px) var(--gutter) clamp(80px, 11vh, 140px);
}

.why__grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
  gap: clamp(28px, 4vw, 64px);
}

.reason__rule {
  width: 44px;
  height: 1px;
  margin-bottom: 24px;
  background: var(--gold);
}

.reason__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(24px, 2.4vw, 34px);
  color: var(--ink);
}

.reason__body {
  margin: 14px 0 0;
  font-size: 15px;
  line-height: 1.85;
  font-weight: 300;
  color: var(--ink-mute);
  text-wrap: pretty;
}

.why__cta {
  text-align: center;
  margin-top: clamp(56px, 8vh, 100px);
}

.btn {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  padding: 16px 34px;
  background: var(--ink);
  color: var(--cream);
  text-decoration: none;
  font-family: var(--font-ui-ex);
  font-size: 13px;
  letter-spacing: .18em;
  text-transform: uppercase;
  transition: background .3s;
}
.btn:hover,
.btn:focus-visible { background: #3a332a; color: var(--cream); }
.btn__arrow { font-size: 16px; }

/* --------------------------------------------------------------------------
   11. Background page
   -------------------------------------------------------------------------- */
.intro {
  padding: clamp(80px, 13vh, 170px) var(--gutter) clamp(30px, 5vh, 60px);
}

.intro__inner {
  max-width: 1040px;
  margin: 0 auto;
  text-align: center;
}

.intro__kicker { margin-bottom: clamp(22px, 3vh, 36px); }

.intro__body {
  margin: 0;
  font-family: var(--font-display);
  font-size: clamp(21px, 2.5vw, 33px);
  line-height: 1.7;
  color: var(--ink-strong);
  text-wrap: pretty;
}

/* the Interior style pages open on a slightly tighter version of the same
   centred statement before their first chapter */
.intro--style {
  padding: clamp(80px, 13vh, 160px) var(--gutter) clamp(20px, 3vh, 40px);
}
.intro--style .intro__inner  { max-width: 1000px; }
.intro--style .intro__kicker { margin-bottom: clamp(20px, 3vh, 34px); }
.intro--style .intro__body {
  font-size: clamp(20px, 2.4vw, 31px);
  line-height: 1.72;
}

.coverage {
  padding: clamp(50px, 8vh, 96px) var(--gutter) clamp(40px, 6vh, 70px);
  background: var(--cream-2);
}

.coverage__head {
  display: flex;
  flex-wrap: wrap;
  gap: clamp(24px, 5vw, 80px);
  align-items: flex-start;
  margin-bottom: clamp(40px, 6vh, 68px);
}

.coverage__lead { flex: 1 1 340px; }

.coverage__title {
  margin: 14px 0 0;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(36px, 5vw, 76px);
  line-height: 1.02;
  white-space: pre-line;
}

.coverage__body {
  flex: 1 1 380px;
  max-width: 620px;
  margin: 0;
  font-size: clamp(14px, 1.15vw, 17px);
  line-height: 2;
  font-weight: 300;
  color: var(--ink-soft);
  text-wrap: pretty;
}

.coverage__grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 340px), 1fr));
  gap: clamp(18px, 3vw, 40px);
}

.project__name {
  margin: 20px 0 0;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(24px, 2.4vw, 34px);
  color: var(--ink);
}

.project__body {
  margin: 10px 0 0;
  font-size: 15px;
  line-height: 1.85;
  font-weight: 300;
  color: var(--ink-mute);
  text-wrap: pretty;
}

.coverage__close {
  max-width: 820px;
  margin: clamp(40px, 6vh, 64px) auto 0;
  text-align: center;
  font-family: var(--font-display);
  font-style: italic;
  font-size: clamp(18px, 1.9vw, 25px);
  line-height: 1.7;
  color: var(--ink-soft);
  text-wrap: pretty;
}

.strengths {
  padding: clamp(70px, 10vh, 130px) var(--gutter) clamp(80px, 11vh, 140px);
}

.strengths__head {
  text-align: center;
  margin-bottom: clamp(48px, 7vh, 84px);
}

.strengths__title {
  margin: 16px 0 0;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(38px, 5.5vw, 88px);
  line-height: 1;
}

.strengths__list {
  display: flex;
  flex-direction: column;
  gap: clamp(40px, 7vh, 90px);
}

.strength {
  display: flex;
  flex-wrap: wrap;
  gap: clamp(24px, 4vw, 64px);
  align-items: center;
}
/* second row reverses so the image lands on the right at desktop widths and
   still stacks image-last on narrow screens */
.strength--reverse { flex-wrap: wrap-reverse; }

.strength__media {
  flex: 1 1 440px;
  min-width: min(100%, 320px);
}

.strength__text { flex: 1 1 380px; }

.strength__num {
  font-family: var(--font-display);
  font-size: clamp(40px, 4vw, 62px);
  line-height: 1;
  color: var(--gold);
}

.strength__title {
  margin: 14px 0 0;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(28px, 3.2vw, 46px);
  line-height: 1.1;
}

.strength__body {
  max-width: 560px;
  margin: 18px 0 0;
  font-size: clamp(14px, 1.1vw, 17px);
  line-height: 2;
  font-weight: 300;
  color: var(--ink-soft);
  text-wrap: pretty;
}

/* --------------------------------------------------------------------------
   12. Interior style pages — chapters + gallery
   -------------------------------------------------------------------------- */
.chapter {
  padding: clamp(50px, 8vh, 90px) var(--gutter) clamp(40px, 6vh, 70px);
}
.chapter--first { padding-top: clamp(80px, 13vh, 170px); }
.chapter--last  { padding-bottom: clamp(70px, 10vh, 120px); }
.chapter--tint  { background: var(--cream-2); }
/* pages that open with an intro statement need less air above chapter 01 */
.chapter--after-intro { padding-top: clamp(40px, 6vh, 80px); }

.chapter__head {
  display: flex;
  flex-wrap: wrap;
  gap: clamp(24px, 5vw, 80px);
  align-items: flex-start;
  margin-bottom: clamp(36px, 5vh, 60px);
}

.chapter__lead { flex: 1 1 340px; }

.chapter__eyebrow {
  display: flex;
  align-items: baseline;
  gap: 16px;
}

.chapter__num {
  font-family: var(--font-display);
  font-size: clamp(28px, 3vw, 40px);
  line-height: 1;
  color: var(--gold);
}

.chapter__label {
  font-family: var(--font-ui-ex);
  font-size: 12px;
  letter-spacing: .28em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

.chapter__title {
  margin: 14px 0 0;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(38px, 5.5vw, 84px);
  line-height: 1;
  white-space: pre-line;
}
/* a couple of chapters carry a longer title and step down a size */
.chapter__title--sm { font-size: clamp(34px, 5vw, 76px); }

/* Sets the Latin run inside a Chinese heading in Futura, on the Chinese pages
   only — the English headings are left in Cormorant. Used for the "SPA" in
   Style A chapter 3 (如 SPA 般的洗滌體驗), whose only Latin is that word.
   Futura is not licensed as a web font here, so it renders only where the
   reader has it installed (macOS does); everywhere else this lands on Jost,
   a Futura revival that the site already loads. The Chinese is untouched —
   no Latin face carries it, so it still resolves through --font-cjk. */
:root[data-lang="tc"] .latin-futura,
:root[data-lang="sc"] .latin-futura {
  font-family: Futura, 'Futura PT', 'Jost', var(--font-cjk), sans-serif;
}

.chapter__body {
  flex: 1 1 380px;
  /* the heading column is usually the taller of the two, which left the
     paragraph floating with dead space beneath it; sit it on the row's
     baseline instead so it reads as leading into the gallery below */
  align-self: flex-end;
  max-width: 620px;
  margin: 0;
  font-size: clamp(14px, 1.15vw, 17px);
  line-height: 2;
  font-weight: 300;
  color: var(--ink-soft);
  text-wrap: pretty;
}

.gallery {
  display: flex;
  flex-wrap: wrap;
  gap: clamp(12px, 1.6vw, 22px);
  margin: 0;
  padding: 0;
  list-style: none;
}

.gallery__item {
  flex: 1 1 380px;
  min-width: min(100%, 300px);
}
.gallery__item--full { flex: 1 1 100%; min-width: 100%; }

/* --------------------------------------------------------------------------
   13. Footer / contact
   -------------------------------------------------------------------------- */
.footer {
  position: relative;
  padding: clamp(80px, 12vh, 150px) var(--gutter) clamp(44px, 5vh, 66px);
  background: var(--cream-2);
  color: var(--ink-soft);
  text-align: center;
}

.footer__identity {
  display: flex;
  flex-direction: column;
  align-items: center;
}

.footer__logo {
  width: clamp(120px, 13vw, 168px);
  height: auto;
  display: block;
}

.footer__place {
  margin: clamp(20px, 3vh, 30px) 0 0;
  font-family: var(--font-display);
  font-style: italic;
  font-size: clamp(17px, 1.9vw, 26px);
  color: var(--ink-faint);
}

.footer__contacts {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: 10px clamp(16px, 3vw, 34px);
  margin-top: clamp(20px, 3vh, 28px);
  font-family: var(--font-ui-ex);
  font-size: 13px;
  letter-spacing: .05em;
}
/* the address and the two numbers are plain text, not links — they inherit
   --ink-soft from .footer */

.footer__dot {
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: var(--gold-pale);
}

.footer__social {
  display: flex;
  justify-content: center;
  align-items: center;
  gap: clamp(26px, 4vw, 54px);
  margin-top: clamp(40px, 6vh, 72px);
}
.footer__social a {
  display: inline-flex;
  align-items: center;
  color: var(--ink-soft);
  text-decoration: none;
  transition: color .3s;
}
.footer__social a:hover,
.footer__social a:focus-visible { color: var(--gold); }

.footer__social-text {
  font-family: var(--font-ui-ex);
  font-weight: 600;
  font-size: 16px;
  letter-spacing: .02em;
}

.footer__icon-btn {
  padding: 0;
  background: none;
  border: none;
  cursor: pointer;
  color: inherit;
  display: inline-flex;
  transition: color .3s;
}
.footer__icon-btn:hover,
.footer__icon-btn:focus-visible { color: var(--gold); }

.footer__legal {
  margin: clamp(46px, 6vh, 72px) 0 0;
  padding-top: 26px;
  border-top: 1px solid var(--line);
  font-family: var(--font-ui-ex);
  font-size: 12px;
  letter-spacing: .08em;
  color: var(--ink-faintest);
}

/* --------------------------------------------------------------------------
   14. Responsive
   -------------------------------------------------------------------------- */
@media (max-width: 899px) {
  .nav__group { display: none; }
  .hamburger  { display: flex; }
  .nav.is-menu-open { --nav-fg: var(--ink); }
  .nav.is-menu-open .hamburger { display: none; }

  .portfolio__head { flex-direction: column; align-items: flex-start; }
  .slide__inset { display: none; }
}

@media (min-width: 900px) {
  .mobile-menu { display: none; }
}

/* --------------------------------------------------------------------------
   15. Reduced motion
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }

  .hero__zoom,
  .slideshow__slide,
  .hero__cue-label,
  .hero__cue-line,
  .hero__rule { animation: none; }

  .hero__kicker,
  .hero__title,
  .hero__brand,
  .hero__sub,
  .hero__tag { animation: none; }

  .slide.is-active .slide__zoom { transform: none; }

  [data-reveal] { opacity: 1; transform: none; }

  *, *::before, *::after {
    transition-duration: .01ms !important;
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
  }
}
