/* 개편 미리보기(_preview/renewal) CSS 사본 + HZ 추가분 */
/* ==========================================================================
   styles.css — Dawn Sourcing, SITE-WIDE stylesheet.

   2026-08-31: rebuilt on the new home's design language (site/DESIGN-HOME.md).
   Until today this file carried the old "Field QC Dossier" look — cream paper,
   IBM Plex Mono labels, 2px radius, a paper-grain overlay — while the rebuilt
   home ran on home.css. A visitor clicking out of the home landed on what read
   as a different company, which is the whole reason this file changed.

   Division of labour now:
     styles.css (this file) = tokens, base type, chrome (header/footer/WeChat),
                              shared primitives, and every subpage component.
     home.css               = home-only components. It carries NO tokens and no
                              chrome — those live here, and the home links both.
   Change a token here and the whole site moves. That is the point.
   ========================================================================== */
:root{
  --paper:#fff;
  --ink:oklch(0.19 0.012 250);
  --ink-60:oklch(0.19 0.012 250 / 0.62);
  --ink-38:oklch(0.19 0.012 250 / 0.38);
  --blaze:oklch(0.58 0.192 40);          /* white-on-blaze buttons need 4.5:1 */
  --blaze-ink:oklch(0.52 0.185 40);      /* same hue, AA on white for small text */
  --rule:oklch(0.90 0.004 250);
  --maxw:1180px;
  --gut:clamp(20px,5vw,44px);
  --disp:"Archivo",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;
  --body:"Archivo",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;
  --ease:cubic-bezier(.22,1,.36,1);

  /* Compatibility aliases. ~130 component rules across nine pages still name the
     old tokens; pointing them at the new values migrates all of them at once and
     keeps this diff to the foundation instead of every line in the file.
     New code should use --ink-60 / --rule / --blaze-ink. */
  --ink-70:var(--ink-60);
  --hairline:var(--rule);
  --stamp-green:var(--blaze-ink);   /* two colours only — green is not a third */
  --mono:var(--body);               /* no second family; labels are Archivo caps */
}
*,*::before,*::after{box-sizing:border-box}
*{margin:0;padding:0}
[hidden]{display:none !important}
html{scroll-behavior:auto;-webkit-text-size-adjust:100%}
body{
  background:var(--paper); color:var(--ink); font-family:var(--body); font-weight:400;
  /* 2026-09-01 density pass (user: "한눈에 들어오게 — 해상도는 낮추지 말고").
     The floor stays at 1rem = 16px: below that iOS Safari zooms on form focus
     and the phone stops being readable. What came down is the line-height and
     the ceiling — 18.2px body at 1.6 was setting a 29px line, and nine pages of
     that is where the scroll went. */
  font-size:clamp(1rem,.96rem + .2vw,1.08rem); line-height:1.52;
  -webkit-font-smoothing:antialiased; overflow-x:hidden;
}
img{max-width:100%;height:auto;display:block}
a{color:inherit}
a[style*="color:var(--blaze)"]{color:var(--ink) !important;text-decoration:underline;text-decoration-color:var(--blaze);text-decoration-thickness:2px;text-underline-offset:3px}
.wrap{max-width:var(--maxw); margin-inline:auto; padding-inline:var(--gut)}
/* `.mono` is a label, not a typeface, and it is used ~90 times across the
   subpages. Redefining it here — instead of renaming every call site — turns
   all of them into the house uppercase Archivo label in one move. */
.mono{font-family:var(--body); text-transform:uppercase; letter-spacing:.10em; font-size:.75rem; font-weight:600}
.rule{border:0; border-top:1px solid var(--rule)}
.blaze{color:var(--ink);text-decoration:underline;text-decoration-color:var(--blaze);text-decoration-thickness:.1em;text-underline-offset:.08em}
h1,h2,h3{
  font-family:var(--disp); font-weight:700; font-stretch:112%;
  line-height:1.03; letter-spacing:-.02em;
  font-variation-settings:"wdth" 112,"wght" 700;
  text-wrap:balance;
}
/* Display scale, 2026-09-01 density pass. The old ceilings (h1 4.15rem = 66px,
   h2 2.85rem = 46px at 1280) meant a three-line H1 ate 205px — a quarter of the
   viewport before a single fact appeared. These still read as display type at
   every width; they just stop being the reason a section needs two screens.
   The phone floors came down with them (h1 36.8 -> 31.2, h2 29.6 -> 24px) but
   stay well above the body, which is the ratio the 2026-08-31 note was
   protecting — that fix was about the phone looking like a shrunken desktop,
   not about any particular rem value. */
h1{font-size:clamp(1.7rem,1rem + 2.9vw,3.2rem); font-weight:800; font-variation-settings:"wdth" 112,"wght" 800}
h2{font-size:clamp(1.2rem,.85rem + 2.05vw,2.2rem); margin-bottom:.38em}
h3{font-size:clamp(1.08rem,1rem + .26vw,1.2rem); line-height:1.22}
p{max-width:68ch}
.btn{
  display:inline-block; padding:15px 30px; border:1.5px solid var(--blaze);
  background:var(--blaze); color:#fff; text-decoration:none;
  font-family:var(--disp); font-weight:700; font-stretch:106%;
  font-size:.95rem; letter-spacing:.01em; border-radius:0;
  transition:background .22s var(--ease),color .22s var(--ease);
}
.btn:hover{background:transparent; color:var(--blaze-ink)}
.btn:disabled{cursor:not-allowed; opacity:.58}
/* both legacy modifiers now resolve to the one house button — a page cannot
   introduce a second button style just by picking a different class */
.btn--blaze{background:var(--blaze); border-color:var(--blaze); color:#fff}
.btn--ghost{background:transparent; color:var(--blaze-ink); border-color:var(--blaze)}
.btn--ghost:hover{background:var(--blaze); color:#fff}
:focus-visible{outline:2px solid var(--blaze); outline-offset:2px}

/* ---- top bar --------------------------------------------------------------
   ONE header component for the whole site. Every page uses the same markup:
     <header class="top"> brand · <nav> · CTA </header>
   with the CTA OUTSIDE <nav> so the narrow-screen grid can keep it on the brand
   row while the links drop to a second row. There are no variants: the home's
   `top--onphoto` (white, floated over the hero photo) went out with the photo
   on 2026-09-01, so all ten pages now render this bar identically. */
.top{
  display:flex; align-items:center; justify-content:space-between; gap:24px;
  max-width:var(--maxw); margin:0 auto; padding:22px var(--gut);
  border-bottom:1px solid var(--rule); position:relative; z-index:3;
}
.top a{text-decoration:none}
.top__brand,.brand{
  font-family:var(--disp); font-weight:800; font-stretch:118%;
  font-size:1.06rem; letter-spacing:.005em; color:var(--ink); line-height:1;
}
.top__brand span,.brand small{
  display:block; font-family:var(--body); font-weight:500; font-stretch:100%;
  font-size:.74rem; letter-spacing:.13em; text-transform:uppercase;
  color:var(--ink-60); margin-top:6px;
}
.top nav{display:flex; align-items:center; gap:clamp(14px,2vw,28px); flex-wrap:wrap; justify-content:flex-end}
/* padding-block keeps every nav link at a >=24px hit area (WCAG 2.5.8) */
.top nav a{
  font-family:var(--body); font-weight:500; font-size:.855rem; letter-spacing:.01em;
  text-transform:none; margin-left:0; color:var(--ink-60);
  padding-block:8px; display:inline-block; transition:color .18s var(--ease);
}
.top nav a:hover{color:var(--ink)}
.top__cta{
  color:var(--ink); border:1.5px solid var(--ink); padding:9px 18px; border-radius:0;
  font-weight:600; font-size:.82rem; white-space:nowrap;
  transition:background .22s var(--ease),color .22s var(--ease),border-color .22s var(--ease);
}
.top__cta:hover{background:var(--ink); color:#fff}

/* home only: the bar floats on the hero photo, so it goes white and loses its rule */
/* ---- generic section ----
   Same vertical rhythm as the home. The subpages rule the bottom of a section
   and the home rules the top; either way a visitor sees one hairline between
   two blocks, never a band of colour. */
.sec{padding-block:clamp(34px,4.1vw,56px); border-bottom:1px solid var(--rule)}
.sec--tight{padding-block:clamp(26px,3.1vw,42px)}
.sec__k{color:var(--ink-60); margin-bottom:12px; display:block}
.sec__head{max-width:47rem}
.sec__head--wide{max-width:56rem}
.two{display:grid; grid-template-columns:1fr 1fr; gap:clamp(24px,3.4vw,48px); align-items:start}
@media(max-width:820px){.two{grid-template-columns:1fr; gap:24px}}
/* /about leadership on a phone: the portrait goes BESIDE the name, not above it.
   At 290px wide a 4:5 portrait is 362px, and there are two of them — the reader
   met two faces and a job title before a line of the story this page exists for.
   The photo spans name + role + the one-line pitch; the paragraphs that explain
   run full width underneath (hook beside the face, explanation under it). */
@media(max-width:560px){
  .bios .bio{display:grid; grid-template-columns:120px 1fr; column-gap:14px; align-items:start}
  .bios .bio img{grid-row:1/span 3; width:120px; max-width:none}
  .bios .bio h3{margin-top:0}
  .bios .bio p:nth-of-type(n+3){grid-column:1/-1}
}
.lede{font-size:clamp(1rem,.9rem + 0.55vw,1.22rem)}
.mech{list-style:none; margin-top:8px}
/* The dash is positioned, not a flex item. As `display:flex` this rule turned
   every inline <b>/<a> inside a bullet into its own flex column and chopped the
   sentence into pieces (caught on /about, 2026-08-31). */
/* 68ch is the same measure `p` gets. Without it these run the full 1092px column
   on /about — 105 characters a line, which is a paragraph you lose your place in. */
.mech li{position:relative; padding:11px 0 11px 28px; border-top:1px solid var(--rule); max-width:68ch}
.mech li::before{content:"—"; position:absolute; left:0; top:11px; color:var(--blaze); font-weight:700}
.cats__lede{margin-top:22px}
.more{color:var(--ink); text-decoration:underline; text-decoration-color:var(--blaze); text-decoration-thickness:2px; text-underline-offset:3px}
.more:hover{color:var(--ink); text-decoration-thickness:3px}

/* ---- us vs a typical agent (honest comparison, not icon cards) ---- */
.vs{margin-top:24px; border-top:2px solid var(--ink)}
.vs__row{display:grid; grid-template-columns:1fr 1fr; border-bottom:1px solid var(--hairline)}
.vs__cell{padding:13px clamp(14px,2.4vw,26px)}
.vs__cell:first-child{border-right:1px solid var(--hairline); color:var(--ink-70)}
.vs__row--head .vs__cell{padding-block:10px}
.vs__h{font-family:var(--mono); text-transform:uppercase; letter-spacing:.07em; font-size:.72rem; font-weight:600; display:block}
.vs__row--head .vs__cell:first-child .vs__h{color:var(--ink-70)}
.vs__row--head .vs__cell:last-child .vs__h{color:var(--ink)}
.vs__cell p{font-size:.92rem; line-height:1.5; margin:0}
.vs__cell:last-child p{font-weight:500}
@media(max-width:640px){.vs__cell{padding:14px 12px} .vs__cell p{font-size:.86rem}}

/* ---- founder note ---- */
.founder .two{align-items:start}
.founder p{font-size:clamp(1rem,.9rem + 0.6vw,1.35rem); line-height:1.5}
.founder .sig{font-family:var(--mono); text-transform:uppercase; letter-spacing:.07em; font-size:.72rem; font-weight:600; color:var(--ink-70); margin-top:20px}

/* ---- FAQ ---- */
.faq details{border-top:1px solid var(--hairline); padding:4px 0}
.faq details:last-of-type{border-bottom:1px solid var(--hairline)}
.faq summary{list-style:none; cursor:pointer; font-family:var(--disp); font-weight:700; font-size:clamp(1.02rem,.98rem + 0.3vw,1.18rem); padding:15px 40px 15px 0; position:relative}
.faq summary::-webkit-details-marker{display:none}
.faq summary::after{content:"+"; position:absolute; right:6px; top:14px; font-family:var(--mono); color:var(--blaze); font-size:1.3rem; transition:transform .2s}
.faq details[open] summary::after{transform:rotate(45deg)}
.faq p{padding:0 0 18px; color:var(--ink-70)}

/* ---- footer ----
   One footer for the whole site, markup and all: three columns of plain links
   over a legal line. The old flex/mono version is gone — a visitor moving from
   the home to a subpage should not see the footer change shape. */
.foot{border-top:1px solid var(--rule); padding-block:clamp(28px,3.2vw,44px)}
.foot__grid{display:grid; grid-template-columns:1.2fr 1fr 1fr; gap:clamp(20px,3vw,40px)}
.foot__brand{font-family:var(--disp); font-weight:800; font-stretch:118%; font-size:1.05rem}
.foot p,.foot li{color:var(--ink-60); font-size:.9em; line-height:1.5}
.foot ul{margin:0; padding:0; list-style:none}
.foot li a{display:inline-block; padding-block:4px}   /* tap target >=24px */
.foot a{color:var(--ink-60); text-decoration:none}
.foot a:hover{color:var(--blaze-ink)}
.foot__legal{margin-top:22px; padding-top:16px; border-top:1px solid var(--rule); color:var(--ink-60); font-size:.83em}
.foot__legal .nw{white-space:nowrap}
/* Two columns, not one, on the phone: stacked it ran 703px — most of a screen
   of nothing but links, and it is the last thing before the page ends. */
@media(max-width:860px){.foot__grid{grid-template-columns:1fr 1fr; gap:22px 20px}
  .foot__grid > :first-child{grid-column:1/-1}}
@media(max-width:400px){.foot__grid{grid-template-columns:1fr; gap:20px}}
/* run log folded into the case section — the buyer's story, then everything else we've run */
.runlog--inline{margin-top:26px; padding-top:18px; border-top:1px solid var(--hairline)}
.runlog--inline .runlog__note{margin-top:14px; font-size:.9rem; color:var(--ink-70); max-width:64ch}
.runlog--inline .runlog__disc{display:block; margin-top:8px; font-family:var(--mono); font-size:.75rem; text-transform:uppercase; letter-spacing:.06em}

/* ---- QC: protection ladder (baseline + at-cost add-ons) ---- */
.qc-stages{display:grid; grid-template-columns:repeat(4,1fr); gap:0; margin-top:22px; border:1px solid var(--hairline); border-radius:0; overflow:hidden}
.qc-stage{padding:20px 18px; border-left:1px solid var(--hairline)}
.qc-stage:first-child{border-left:0}
.qc-stage__k{font-family:var(--mono); font-size:.72rem; font-weight:600; letter-spacing:.06em; text-transform:uppercase; color:var(--ink)}
.qc-stage__n{font-family:var(--disp); font-weight:700; font-size:1.02rem; margin:6px 0 4px}
.qc-stage__d{font-size:.82rem; color:var(--ink-70); line-height:1.45; margin:0}
.qc-stage--base{background:oklch(0.19 0.012 250 / 0.04)}
.qc-stage--base .qc-stage__k{color:var(--stamp-green)}
/* bleeds past the card's 18px side padding — needs max-width:none, or the global
   img{max-width:100%} clamps it back to the content box while the negative margins
   still apply, leaving the photo shifted left with a 36px gap on the right */
.qc-stage__img{display:block; width:calc(100% + 36px); max-width:none; margin:-20px -18px 14px; aspect-ratio:4/3; object-fit:cover; border-bottom:1px solid var(--hairline)}
@media(max-width:820px){.qc-stages{grid-template-columns:1fr 1fr} .qc-stage{border-top:1px solid var(--hairline)} .qc-stage:nth-child(odd){border-left:0} .qc-stage:nth-child(1),.qc-stage:nth-child(2){border-top:0}}
/* Phone keeps the pair — it does NOT fall back to one full-bleed photo per row.
   Stacked, these four stages ran 3,011px on a 390px screen: three and a half
   screens to learn there are four checkpoints, and the 4:3 full-width photos
   were most of it. Two up with a square crop, the same four stages are ~740px.
   The four rows (photo, kicker, name, note) are shared through subgrid, so the
   pair reads across: one card wrapping a word must not shift its neighbour.
   Text-only .qc-stages (about/#visits has three and no photos) keep one column —
   this is the photo problem, not a card problem. The variant is a class, not
   :has(.qc-stage__img): the buyer we are aiming at reads this on a phone, and a
   class works on every one of them. */
@media(max-width:480px){
  .qc-stages:not(.qc-stages--photo){grid-template-columns:1fr}
  .qc-stages:not(.qc-stages--photo) .qc-stage{border-left:0; border-top:1px solid var(--hairline)}
  .qc-stages:not(.qc-stages--photo) .qc-stage:first-child{border-top:0}
  .qc-stages--photo .qc-stage{display:grid; grid-row:span 4; grid-template-rows:subgrid; padding:0 0 13px}
  /* the bleed trick is for a padded card; there is no side padding left to bleed past */
  .qc-stages--photo .qc-stage__img{width:100%; margin:0 0 10px; aspect-ratio:1/1}
  .qc-stages--photo .qc-stage__k,
  .qc-stages--photo .qc-stage__n,
  .qc-stages--photo .qc-stage__d{padding-inline:12px}
  .qc-stages--photo .qc-stage__n{margin:5px 0 3px}
  .qc-stages--photo .qc-stage__d{font-size:.88rem}
}
.qc-base{margin-top:18px; padding:13px 18px; border-left:3px solid var(--stamp-green); background:oklch(0.19 0.012 250 / 0.04)}
.qc-base p{margin:0} .qc-base b{font-family:var(--disp); font-weight:700}
.ladder{margin-top:20px; border-top:2px solid var(--ink)}
.ladder__tag{display:inline-block; font-family:var(--mono); font-size:.74rem; font-weight:600; letter-spacing:.07em; text-transform:uppercase; color:var(--ink-70); border:1.5px solid var(--hairline); border-radius:0; padding:3px 8px; margin:14px 0 2px}
.ladder__row{display:grid; grid-template-columns:38px minmax(0,32%) 1fr; align-items:center; border-bottom:1px solid var(--hairline)}
.ladder__dots{display:flex; gap:3px; padding-left:2px}
.ladder__dots i{display:block; width:6px; height:6px; border-radius:1px; background:var(--hairline); font-style:normal}
.ladder__dots i.on{background:var(--blaze)}
.ladder__cell{padding:11px clamp(14px,2.2vw,22px)}
.ladder__cell--name{border-right:1px solid var(--hairline); font-family:var(--disp); font-weight:700; font-size:.98rem}
.ladder__cell p{font-size:.9rem; color:var(--ink-70); margin:0; line-height:1.5}
.ladder__note{margin-top:13px; font-size:.92rem; line-height:1.45; max-width:66ch}
.ladder__note b{color:var(--ink); font-weight:600}
@media(max-width:560px){
  .ladder__row{grid-template-columns:26px 1fr}
  .ladder__cell--name{grid-column:2; border-right:0; border-bottom:1px solid var(--hairline)}
  .ladder__cell:not(.ladder__cell--name){grid-column:1/-1}
}
.qc-guide{list-style:none; margin-top:18px}
.qc-guide li{padding:10px 0; border-top:1px solid var(--hairline); display:grid; grid-template-columns:minmax(0,40%) 1fr; gap:14px; align-items:baseline}
.qc-guide li:last-child{border-bottom:1px solid var(--hairline)}
.qc-guide .when{font-family:var(--mono); font-size:.72rem; letter-spacing:.03em; text-transform:uppercase; color:var(--ink-70)}
.qc-guide .rec{font-weight:500; font-size:.94rem}
@media(max-width:560px){.qc-guide li{grid-template-columns:1fr; gap:4px}}
/* QC inline proof — real inspection loop + stills */
.qc-proof{margin:20px 0 4px; max-width:780px}
.qc-video{position:relative; border:1px solid var(--hairline); border-radius:0; overflow:hidden; background:var(--ink); aspect-ratio:16/9; margin:0}
.qc-video__el{display:block; width:100%; height:100%; object-fit:cover}
.qc-video__wm{position:absolute; top:9px; right:11px; font-family:var(--mono); font-size:.70rem; font-weight:600; letter-spacing:.12em; text-transform:uppercase; color:rgb(255 255 255 / 0.72); text-shadow:0 1px 3px oklch(0.19 0.012 250 / 0.6)}
.qc-cap{position:absolute; left:0; bottom:0; background:oklch(0.19 0.012 250 / 0.74); color:rgb(255 255 255 / 0.92); padding:7px 12px; font-family:var(--mono); font-size:.72rem; text-transform:uppercase; letter-spacing:.05em}
.qc-cap::before{content:"● "; color:var(--blaze)}
/* factory walk-through featured video + on-brand captions */
.fv-video{max-width:860px; margin:20px 0 0; aspect-ratio:16/9}
.fv-video video{display:block; width:100%; height:100%; object-fit:cover; background:var(--ink)}
video::cue{background:oklch(0.19 0.012 250 / 0.82); color:rgb(255 255 255 / 0.97); font-family:"Archivo", system-ui, sans-serif; line-height:1.35}
/* QC media — featured stage + thumbnail selector (click a thumb → swaps into stage) */
#qc-stage{position:absolute; inset:0}
#qc-stage video, #qc-stage .qc-stage__img{display:block; width:100%; height:100%; object-fit:cover}
.qc-thumbs{display:grid; grid-template-columns:repeat(4,1fr); gap:10px; margin-top:10px; max-width:780px}
.qc-thumb{position:relative; padding:0; border:1px solid var(--hairline); border-radius:0; overflow:hidden; background:var(--hairline); cursor:pointer; aspect-ratio:4/3; transition:border-color .15s, opacity .15s}
.qc-thumb img{width:100%; height:100%; object-fit:cover; display:block}
.qc-thumb:hover{opacity:.9}
.qc-thumb.is-active{border-color:var(--blaze); border-width:2px}
/* a text-shadow is not contrast: this glyph measured 1.35:1 over the photo, so the badge itself becomes the ink tile it sits on */
.qc-thumb__badge{position:absolute; left:50%; top:50%; transform:translate(-50%,-50%); display:grid; place-items:center; width:34px; height:34px; background:var(--ink); color:#fff; font-size:.9rem; pointer-events:none}
@media(max-width:560px){.qc-thumbs{gap:6px}}
:focus-visible{outline:3px solid var(--blaze); outline-offset:3px}

@media (prefers-reduced-motion: reduce){
  *{animation:none !important; transition:none !important}
  .hero h1 .u::after{transform:scaleX(1)}
  /* static ledger: no fill, stamp visible, stage unpinned, all rows shown */
  .chain__fill{display:none}
  .stamp--stage{opacity:1; transform:scale(1) rotate(-4deg)}
  .ledger__stage{position:static}
}

/* ============================================================
   MULTI-PAGE ADDITIONS (2026-07-12) — same tokens, new components
   for the site-wide nav, subpage intros, and the home hub links.
   No new colors/fonts introduced; reuses --ink/--blaze/--hairline etc.
   ============================================================ */

/* nav: current-page emphasis */
.top nav a[aria-current]{color:var(--ink); text-decoration:underline; text-underline-offset:5px; text-decoration-color:var(--rule)}

/* subpage intro (Quality/Factory/Make/About) — answer-first lede under an eyebrow + h1.
   The H1 minimum is deliberately high: every clamp on the old site bottomed out
   at 390px, which is what made the phone read as a shrunken desktop. */
.pagehero{padding-block:clamp(32px,4vw,56px); border-bottom:1px solid var(--rule)}
.pagehero__eyebrow{margin-bottom:12px; display:block; color:var(--ink-60)}
/* 22ch, not 18: the wider measure is what turns a three-line page title into
   two without touching the type size. */
.pagehero h1{font-size:clamp(1.6rem,1rem + 2.6vw,2.95rem); margin-bottom:.34em; max-width:30ch}
.pagehero p{color:var(--ink-60); font-size:clamp(1rem,.92rem + .4vw,1.16rem); max-width:66ch; line-height:1.5}
.pagehero p strong{color:var(--ink); font-weight:600}

/* what-we-make: bento category grid — 6 category cards + 2 real production stills,
   hand-placed (bespoke, per DESIGN.md), varied weight so it doesn't read as a
   mechanical 3-col icon grid. Photos are generic floor/rack shots, honestly
   captioned — never labeled as a specific category. */
.make-grid{display:grid; grid-template-columns:1fr; gap:10px; margin-top:22px}
/* Top-aligned, not centred: centring makes a row's titles sit at different
   heights whenever the two cards' bodies wrap to a different number of lines,
   so the grid only looks aligned until someone edits the copy. */
.make-card{border:1px solid var(--hairline); border-radius:0; padding:15px clamp(18px,2.4vw,26px); display:flex; flex-direction:column; justify-content:flex-start; min-height:82px}
.make-card__k{font-family:var(--disp); font-weight:700; font-size:1.05rem}
.make-card p{color:var(--ink-70); font-size:.86rem; margin:6px 0 0; max-width:34ch}
.make-card--lead{}
.make-card--lead .make-card__k{font-size:clamp(1.2rem,1rem + 0.6vw,1.5rem)}
.make-card--lead p{max-width:none; font-size:.92rem}
.make-photo{position:relative; border:1px solid var(--hairline); border-radius:0; overflow:hidden}
.make-photo img{width:100%; height:100%; object-fit:cover; display:block; aspect-ratio:3/4}
.make-hint{display:none}
/* Phone: the photo is the third item in source order, so in a single column it
   landed between two cards — tap the fifth category and the thing that changes
   is off-screen, which makes the whole interaction invisible. Pin it to the top
   of the stack instead: it stays in view for every card you tap, and the portrait
   crop goes landscape so it costs a third of the screen rather than half. */
@media(max-width:760px){
  .make-grid{display:flex; flex-direction:column}
  /* the twin shadow is load-bearing, not decoration: the first paints a solid
     10px band of paper under the pinned photo so a card scrolling underneath is
     cut off cleanly instead of half-showing, the second says "this is pinned".
     Doing it with padding would drag the absolutely-positioned caption off the
     image, which is why it is a shadow. */
  .make-photo{order:-1; position:sticky; top:8px; z-index:2; background:var(--paper);
    box-shadow:0 10px 0 var(--paper), 0 13px 14px oklch(0.19 0.012 250 / 0.10)}
  .make-photo img{aspect-ratio:16/9}
  .make-hint{display:block; margin:26px 0 0; font-size:.7rem; font-weight:600;
    letter-spacing:.07em; text-transform:uppercase; color:var(--ink-60)}
  .make-hint + .make-grid{margin-top:10px}
}
/* Visit gallery (/factory). Deliberately NOT .make-photo: that class turns sticky on a
   phone, which is right when the trigger is a tall list of cards and wrong here, where
   the stage and the whole thumbnail strip already fit one screen together. */
/* Capped at 880px: full column width makes the stage 619px tall on a desktop, which is
   most of the fold for one photograph out of sixteen. */
/* 860px, the same width as the walkthrough video directly below it: two 16:9
   blocks stacked on one page with right edges 20px apart read as a mistake. */
.visit__stage{position:relative; border:1px solid var(--hairline); overflow:hidden;
  margin-top:18px; max-width:860px}
.visit__stage img{display:block; width:100%; aspect-ratio:16/9; object-fit:cover}
.visit__thumbs{list-style:none; margin:7px 0 0; padding:0; max-width:860px;
  display:grid; grid-template-columns:repeat(8,1fr); gap:7px}
.visit__thumb{display:block; width:100%; padding:0; border:1px solid var(--hairline);
  background:none; border-radius:0; cursor:pointer; transition:border-color .18s cubic-bezier(0.22,1,0.36,1)}
/* 16:9, matching the stage. A square thumbnail centre-crops a different slice
   of the frame than the one it opens, which is exactly the "the enlargement is
   a different photo" complaint fixed on 2026-08-10 by matching both ratios. */
.visit__thumb img{display:block; width:100%; aspect-ratio:16/9; object-fit:cover}
.visit__thumb:hover{border-color:var(--ink)}
.visit__thumb.is-active{border-color:var(--blaze); border-width:2px}
@media(max-width:760px){ .visit__thumbs{grid-template-columns:repeat(4,1fr); gap:6px} }

/* desktop: bento — hand-placed named areas, only where there's room for the asymmetry to read */
@media(min-width:761px){
  /* Seven cards, four rows. The photo takes the right column for three of them and
     the last row mirrors the first (one card, then one spanning two) — a seventh
     card parked full-width under a finished 3x3 grid read as a stray band, not as
     part of the bento. */
  .make-grid{grid-template-columns:repeat(3,1fr);
    grid-template-areas:"c1 c1 pA" "c2 c3 pA" "c4 c5 pA" "c6 c7 c7"}
  .make-grid > :nth-child(1){grid-area:c1}
  .make-grid > :nth-child(2){grid-area:c2}
  .make-grid > :nth-child(3){grid-area:pA}
  .make-grid > :nth-child(4){grid-area:c3}
  .make-grid > :nth-child(5){grid-area:c4}
  .make-grid > :nth-child(6){grid-area:c5}
  .make-grid > :nth-child(7){grid-area:c6}
  .make-grid > :nth-child(8){grid-area:c7}
  .make-grid > :nth-child(8) p{max-width:52ch}
  .make-card--lead p{max-width:44ch}
}

/* ============================================================
   HOME REDESIGN — INFOGRAPHICS (2026-07-12b) — same tokens.
   Gap-flow diagram, condensed QC pipeline, reviews, invoice card,
   proof image pairing, founder portrait. No new colors/fonts.
   ============================================================ */

/* condensed QC pipeline (home) — real stills, IQC -> OQC */
.qcflow{display:flex; flex-wrap:wrap; gap:0; margin-top:20px; border-top:2px solid var(--ink)}
.qcflow__step{flex:1 1 140px; text-decoration:none; color:inherit; border-right:1px solid var(--hairline); border-bottom:1px solid var(--hairline); display:flex; flex-direction:column}
.qcflow__step:last-child{border-right:0}
.qcflow__step img{width:100%; aspect-ratio:4/3; object-fit:cover; display:block; border-bottom:1px solid var(--hairline)}
.qcflow__meta{padding:12px 14px}
.qcflow__k{color:var(--ink); display:block; margin-bottom:3px}
.qcflow__lbl{font-size:.82rem; font-weight:500}
.qcflow__step:hover img{opacity:.88}
@media(max-width:720px){.qcflow__step{flex:1 1 44%} .qcflow__step:nth-child(2n){border-right:0}}
/* Two up on the phone as well (was one per row below 420px, which turned four
   4:3 photos into 1,449px of scroll). Grid, not flex, so the photo row and the
   label row are shared: the labels are different lengths and ragged tiles read
   as four unrelated pictures instead of one checklist. */
@media(max-width:560px){
  .qcflow{display:grid; grid-template-columns:1fr 1fr}
  .qcflow__step{grid-row:span 2; display:grid; grid-template-rows:subgrid}
  .qcflow__step:nth-child(2n){border-right:0}
  .qcflow__step img{aspect-ratio:1/1}
  .qcflow__meta{padding:10px 12px}
}

/* track record — real audited company (bar chart + stats), Field-QC-Dossier palette */
.trackrec__grid{display:grid; grid-template-columns:1.05fr 1fr; gap:34px; margin-top:24px; align-items:end}
@media(max-width:760px){.trackrec__grid{grid-template-columns:1fr; gap:24px}}
.trackrec__chart{margin:0}
.trackrec__chart figcaption{color:var(--ink-70); margin-bottom:16px}
.bars{display:flex; align-items:flex-end; gap:16px; height:210px; border-bottom:2px solid var(--ink)}
.bar{flex:1; display:flex; flex-direction:column; align-items:center; justify-content:flex-end; height:100%}
.bar__v{font-family:var(--mono); font-size:.74rem; font-weight:600; color:var(--ink-70); margin-bottom:7px; white-space:nowrap}
.bar__fill{width:100%; max-width:70px; min-height:6px; border:1px solid var(--hairline); border-bottom:none;
  background:repeating-linear-gradient(45deg, var(--rule), var(--rule) 5px, transparent 5px, transparent 10px)}
.bar--now .bar__fill{background:var(--blaze); border-color:var(--blaze)}
.bar--now .bar__v{color:var(--ink); font-size:.82rem}
.bars__years{display:flex; gap:16px; margin-top:9px}
.bars__years span{flex:1; text-align:center; color:var(--ink-70)}
.trackrec__stats{list-style:none; margin:0; padding:0; display:grid; grid-template-columns:1fr 1fr; gap:16px 26px}
@media(max-width:420px){.trackrec__stats{grid-template-columns:1fr}}
.trackrec__stats li{border-top:2px solid var(--ink); padding-top:11px}
.trackrec__stats b{display:block; font-family:var(--disp); font-weight:800; font-size:clamp(1.5rem,1.2rem + 1.1vw,2rem); line-height:1; color:var(--ink)}
.trackrec__stats li:nth-child(1) b, .trackrec__stats li:nth-child(2) b{color:var(--ink)}
.trackrec__stats span{display:block; margin-top:9px; color:var(--ink-70); font-size:.88rem; line-height:1.4}
.trackrec__note{margin-top:20px; padding-top:14px; border-top:1px solid var(--hairline); max-width:74ch; color:var(--ink-70); font-size:.9rem; line-height:1.55}
.trackrec__note span{display:block; margin-top:5px; font-size:.78rem}

/* example at-cost invoice, paired with a finished-goods still */
.invoice-wrap{display:grid; grid-template-columns:1fr 1.2fr; gap:clamp(22px,3vw,36px); margin-top:22px; align-items:center}
.invoice-wrap img{width:100%; height:100%; max-height:320px; object-fit:cover; border:1px solid var(--hairline); border-radius:0; display:block}
.invoice{border:1px solid var(--hairline); border-radius:0; overflow:hidden}
.invoice__tag{background:var(--ink); color:var(--paper); padding:10px 16px; font-family:var(--mono); font-size:.73rem; text-transform:uppercase; letter-spacing:.07em}
.invoice__row{display:grid; grid-template-columns:1.1fr 1.3fr auto; gap:10px; padding:9px 16px; border-top:1px solid var(--hairline); align-items:baseline; font-size:.86rem}
.invoice__row--head{font-family:var(--mono); text-transform:uppercase; letter-spacing:.06em; font-size:.72rem; color:var(--ink-70); border-top:0}
.invoice__row--total{font-weight:700; background:oklch(0.19 0.012 250 / 0.04)}
.invoice__row--total span:last-child{font-family:var(--mono); font-size:.75rem; text-transform:uppercase; letter-spacing:.05em; color:var(--stamp-green)}
@media(max-width:760px){.invoice-wrap{grid-template-columns:1fr} .invoice-wrap img{max-height:220px}}
@media(max-width:480px){.invoice__row{grid-template-columns:1fr; gap:2px} .invoice__row--head{display:none}}

/* proof: MOQ one-liner */
.proof__moq{margin-top:18px; color:var(--ink-70)}

/* about: founder portrait */
.founder__portrait{width:100%; max-width:320px; aspect-ratio:4/5; object-fit:cover; border:1px solid var(--hairline); border-radius:0; display:block; margin-bottom:22px}
.founder__team{margin-top:14px; font-family:var(--mono); font-size:.7rem; text-transform:uppercase; letter-spacing:.06em; color:var(--ink-70)}

/* ── buyer's guide (/sourcing-agent) — AEO extraction surfaces ───────────────
   .capsule  = answer capsule (self-contained 1–2 sentence answer, link-free)
   .gt       = semantic comparison table (real <table> — LLM-extractable)      */
.capsule{border-left:3px solid var(--blaze); padding:14px 0 14px 18px; margin:20px 0 18px;
  font-size:clamp(1.02rem,0.98rem + 0.35vw,1.18rem); line-height:1.55; color:var(--ink); max-width:66ch}
.capsule strong{font-weight:600}
.pagehero--wide h1{max-width:34ch}
.pagehero .capsule{color:var(--ink)}

.gt-scroll{overflow-x:auto; margin-top:18px; -webkit-overflow-scrolling:touch}
.gt{border-collapse:collapse; width:100%; min-width:600px; border-top:2px solid var(--ink); font-size:.92rem}
.gt__cap{caption-side:top; text-align:left; font-family:var(--mono); font-size:.75rem; text-transform:uppercase;
  letter-spacing:.06em; color:var(--ink-70); padding-bottom:10px}
.gt th,.gt td{padding:10px clamp(10px,1.4vw,16px); border-bottom:1px solid var(--hairline);
  text-align:left; vertical-align:top; line-height:1.42}
.gt thead th{font-family:var(--mono); font-size:.7rem; text-transform:uppercase; letter-spacing:.07em;
  font-weight:600; color:var(--ink); border-bottom:2px solid var(--blaze)}
.gt tbody th{font-weight:600; color:var(--ink); width:22%}
.gt tbody td{color:var(--ink-70)}
.gt tbody tr:hover{background:oklch(0.19 0.012 250 / 0.03)}
/* a link that is the whole cell is a target, not an inline reference — WCAG
   2.5.8 wants >=24px and a bare row header link renders at 16 */
.gt th > a:only-child,.gt td > a:only-child{display:inline-block; padding-block:4px}
.gt__note{margin-top:12px; font-size:.86rem; line-height:1.45; color:var(--ink-70); max-width:70ch}
.gt__note a{color:var(--ink); text-decoration-color:var(--blaze); text-decoration-thickness:2px; text-underline-offset:3px}

/* Phone: a 600px-wide comparison table inside a 350px screen shows two columns
   and hides the rest behind a sideways scroll nobody discovers — on this table
   the hidden column is "What to watch", which is the reason the table exists.
   So below 700px (measured: the scroll starts at 666px and up, gutters included)
   each row becomes a block
   and every value carries its column name, injected from <thead> as data-label.
   The <table> stays a real table in the markup — display:block would drop the
   table semantics for screen readers, so the roles are written out explicitly. */
@media(max-width:700px){
  .gt-scroll{overflow-x:visible}
  .gt{display:block; min-width:0; border-top:0; font-size:.92rem; line-height:1.42}
  .gt thead{display:none}
  .gt tbody td[data-label]::before{content:attr(data-label); display:block; font-size:.72rem; letter-spacing:.04em; text-transform:uppercase; opacity:.62; margin-bottom:2px}
  .gt tbody{display:block}
  .gt tbody tr{display:block; border-top:2px solid var(--ink); padding:11px 0 3px}
  .gt tbody tr:hover{background:none}
  .gt tbody th,.gt tbody td{display:block; width:auto; padding:0 0 8px; border-bottom:0}
  .gt tbody th{font-family:var(--disp); font-size:1.02rem; line-height:1.22; padding-bottom:6px}
  .gt tbody td::before{
    content:attr(data-label); display:block; font-size:.68rem; font-weight:600;
    letter-spacing:.07em; text-transform:uppercase; color:var(--ink); margin-bottom:1px;
  }
  /* a <caption> in a display:block table keeps display:table-caption, gets wrapped
     in an anonymous table box and shrink-wraps — the title came out one word wide */
  .gt__cap{display:block; padding-bottom:6px}
}

.qc-guide--num li{grid-template-columns:minmax(0,38%) 1fr}
.qc-guide--num li span{font-family:var(--mono); font-size:.74rem; letter-spacing:.03em; color:var(--ink); font-weight:600}
.qc-guide--num li p{margin:0; font-size:.93rem; color:var(--ink-70); line-height:1.45}
@media(max-width:560px){.qc-guide--num li{grid-template-columns:1fr; gap:6px}}

/* guide hub + long-form field guides — metadata and evidence spacing only;
   layout, tables, lists and colors reuse the existing dossier components. */
.pagehero .guide-crumb{font-size:.74rem; line-height:1.4; color:var(--ink-70); margin:0 0 14px; max-width:none}
.guide-crumb a{color:inherit; text-decoration:none; border-bottom:1px solid var(--hairline)}
.guide-crumb a:hover{color:var(--ink); border-bottom-color:var(--blaze)}
.pagehero .guide-byline{font-size:.75rem; line-height:1.5; color:var(--ink-70); margin-top:24px; max-width:none}
.guide-byline a{color:var(--ink); text-underline-offset:3px}
.guide-step{margin-top:28px}
.guide-evidence{margin-top:30px}
.guide-evidence .make-photo img{aspect-ratio:16/9}
@media(max-width:820px){.guide-evidence{gap:28px}}

/* --- Guides: Buyer Decision Ledger (human-readable site map) --- */
.guide-hero{border-bottom:1px solid var(--hairline)}
.guide-hero__grid{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:clamp(28px,5vw,72px);align-items:stretch}
.guide-hero__intro{padding-block:clamp(34px,4.6vw,62px);align-self:center}
.guide-hero__intro .sec__k{color:var(--ink-70)}
.guide-hero__intro h1{font-size:clamp(1.6rem,1rem + 2.6vw,2.9rem);max-width:30ch;margin-bottom:.42em}  /* this H1 sits in a 5-of-12 grid track, so it cannot take the site scale: at 4.8rem/11ch it stacked into six lines */
.guide-hero__intro > p{color:var(--ink-70);font-size:clamp(1.02rem,.97rem + .35vw,1.2rem);line-height:1.58}
.guide-hero__intro > p strong{color:var(--ink);font-weight:600}
.guide-hero__intro .guide-hero__note{font-size:.73rem;color:var(--ink-70);margin-top:26px;line-height:1.5}
/* The decision ledger was the last dark block in the site's body. The rebuilt
   language has one background — white — and separates with hairlines, so the
   panel inverts: same rows, same blaze bar and arrow, ink on paper. */
.decision-ledger{background:var(--paper);color:var(--ink);align-self:stretch;margin-block:clamp(30px,4vw,54px);border:1px solid var(--ink)}
.decision-ledger__head{padding:clamp(16px,2.2vw,24px);border-bottom:1px solid var(--ink)}
.decision-ledger__head .mono{color:var(--ink-60)}
.decision-ledger__head h2{color:var(--ink);font-size:clamp(1.3rem,1.1rem + 1vw,2rem);margin:7px 0 0}
.decision-row{position:relative;display:grid;grid-template-columns:minmax(0,1fr) auto;column-gap:22px;padding:clamp(13px,1.7vw,20px) clamp(18px,2.4vw,26px);border-bottom:1px solid var(--rule);text-decoration:none;color:inherit;min-height:88px;transition:background .18s var(--ease)}
.decision-row:last-child{border-bottom:0}
.decision-row::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--blaze);transform:scaleY(0);transform-origin:center;transition:transform .22s var(--ease)}
.decision-row:hover,.decision-row:focus-visible{background:oklch(0.19 0.012 250 / 0.035)}
.decision-row:hover::before,.decision-row:focus-visible::before,.decision-row--featured::before{transform:scaleY(1)}
.decision-row__meta{grid-column:1;color:var(--ink-60);font-size:.7rem;line-height:1.5;margin-bottom:7px}
.decision-row__meta b{display:inline-block;margin-left:8px;padding:2px 6px;background:var(--blaze);color:#fff;font-size:.72rem;letter-spacing:.06em}
.decision-row__title{grid-column:1;font-family:var(--disp);font-stretch:112%;font-size:clamp(1.1rem,.95rem + .5vw,1.35rem);font-weight:700;line-height:1.18}
.decision-row__desc{grid-column:1;color:var(--ink-60);font-size:.9rem;line-height:1.48;margin-top:7px;max-width:54ch}
.decision-row__arrow{grid-column:2;grid-row:1/4;align-self:center;color:var(--blaze);font-size:1.25rem;transition:transform .18s var(--ease)}
.decision-row:hover .decision-row__arrow,.decision-row:focus-visible .decision-row__arrow{transform:translateX(5px)}
.guide-route .sec__k,.guide-method .sec__k{color:var(--ink-70)}
.guide-route__head{display:grid;grid-template-columns:minmax(0,.8fr) minmax(0,1.2fr);gap:clamp(28px,5vw,72px);align-items:end}
.guide-route__head h2{margin-bottom:0}
.guide-route__head > p{color:var(--ink-70);font-size:.96rem}
.journey-rail{list-style:none;display:grid;grid-template-columns:repeat(5,minmax(0,1fr));margin-top:34px;border-block:2px solid var(--ink)}
.journey-rail li{min-width:0;border-right:1px solid var(--hairline)}
.journey-rail li:last-child{border-right:0}
.journey-rail a{position:relative;display:flex;min-height:148px;padding:20px clamp(12px,1.8vw,22px);flex-direction:column;text-decoration:none;transition:background .18s cubic-bezier(.32,.72,0,1)}
.journey-rail a:hover,.journey-rail a:focus-visible{background:oklch(0.19 0.012 250 / .045)}
.journey-rail__n{color:var(--ink-70);font-size:.73rem;margin-bottom:auto}
.journey-rail strong{font-family:var(--disp);font-size:1.02rem;line-height:1.15;margin-top:20px}
.journey-rail small{display:block;color:var(--ink-70);font-size:.76rem;line-height:1.35;margin-top:6px}
.journey-rail li:not(:last-child) a::after{content:"→";position:absolute;right:-9px;top:22px;z-index:1;width:18px;text-align:center;background:var(--paper);font-family:var(--mono);font-size:.72rem;color:var(--ink-70)}
@media(max-width:900px){
  .guide-hero__grid{grid-template-columns:1fr;gap:0}
  .guide-hero__intro{padding-block:32px 24px}
  .guide-hero__intro h1{max-width:24ch}
  .decision-ledger{margin:0 0 42px}
  .guide-route__head{grid-template-columns:1fr;gap:12px}
  .journey-rail{grid-template-columns:1fr}
  .journey-rail li{border-right:0;border-bottom:1px solid var(--hairline)}
  .journey-rail li:last-child{border-bottom:0}
  .journey-rail a{min-height:0;display:grid;grid-template-columns:46px minmax(0,1fr);column-gap:14px;padding:17px 0}
  .journey-rail__n{grid-column:1;grid-row:1/3;margin:0;padding-top:2px}
  .journey-rail strong{grid-column:2;margin:0}
  .journey-rail small{grid-column:2}
  .journey-rail li:not(:last-child) a::after{content:"↓";right:auto;left:12px;top:auto;bottom:-10px}
}
@media(max-width:560px){
  .guide-hero__intro{padding-block:26px 20px}
  .decision-row{min-height:0;column-gap:14px;padding:13px 16px}
  .decision-row__desc{font-size:.8rem}
  .decision-row__meta b{display:block;width:max-content;margin:5px 0 0}
}

/* --- Long-form guide navigation and conversion context --- */
.guide-toc{position:sticky;top:0;z-index:20;background:rgb(255 255 255 / .96);border-block:1px solid var(--hairline);backdrop-filter:blur(10px)}
.guide-toc__inner{display:flex;align-items:center;gap:0;min-height:54px;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch}
.guide-toc__inner::-webkit-scrollbar{display:none}
.guide-toc__label{flex:0 0 auto;margin-right:18px;color:var(--ink-70);font-size:.72rem;letter-spacing:.07em;text-transform:uppercase}
.guide-toc a{display:inline-flex;align-items:center;min-height:44px;padding:0 13px;white-space:nowrap;color:var(--ink);font-family:var(--mono);font-size:.73rem;letter-spacing:.03em;text-decoration:none;border-left:1px solid var(--hairline)}
.guide-toc a:hover,.guide-toc a:focus-visible{color:var(--ink);background:oklch(0.19 0.012 250 / .04);text-decoration:underline;text-decoration-color:var(--blaze);text-underline-offset:4px}
.guide-toc + .sec,[data-track-engaged]{scroll-margin-top:72px}
.guide-inline-cta{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px 24px;align-items:center;margin-top:30px;padding:20px 22px;border:1px solid var(--ink);box-shadow:4px 4px 0 var(--ink);color:var(--ink);text-decoration:none;transition:transform .18s cubic-bezier(.32,.72,0,1),box-shadow .18s cubic-bezier(.32,.72,0,1)}
.guide-inline-cta .mono{grid-column:1;font-size:.72rem;color:var(--ink-70);letter-spacing:.06em;text-transform:uppercase}
.guide-inline-cta strong{grid-column:1;font-family:var(--disp);font-size:clamp(1rem,.92rem + .35vw,1.22rem);line-height:1.25}
.guide-inline-cta > span:last-child{grid-column:2;grid-row:1/3;color:var(--blaze);font-family:var(--mono);font-size:1.4rem}
.guide-inline-cta:hover,.guide-inline-cta:focus-visible{transform:translate(2px,2px);box-shadow:2px 2px 0 var(--ink)}
.inquiry-context{display:grid;grid-template-columns:auto minmax(0,1fr);gap:4px 18px;align-items:center;margin:24px 0 26px;padding:16px 18px;border-left:4px solid var(--blaze);background:rgb(255 255 255 / .08);color:var(--paper)}
.inquiry-context .mono{grid-row:1/3;color:rgb(255 255 255 / .68);font-size:.72rem;text-transform:uppercase;letter-spacing:.07em}
.inquiry-context strong{font-family:var(--disp);font-size:1rem;line-height:1.25}
.inquiry-context span:last-child{color:rgb(255 255 255 / .7);font-size:.82rem;line-height:1.4}
.form-privacy{margin:2px 0 0;color:rgb(255 255 255 / .7);font-size:.76rem;line-height:1.5}
.form-privacy a{color:var(--paper);text-underline-offset:3px}

/* --- Privacy / measurement note --- */
.privacy-grid{display:grid;grid-template-columns:minmax(0,.72fr) minmax(0,1.28fr);gap:clamp(32px,6vw,84px);align-items:start}
.privacy-index{position:sticky;top:26px;border-top:2px solid var(--ink)}
.privacy-index a{display:block;padding:13px 0;border-bottom:1px solid var(--hairline);font-family:var(--mono);font-size:.75rem;color:var(--ink);text-decoration:none}
.privacy-index a:hover,.privacy-index a:focus-visible{color:var(--ink);text-decoration:underline;text-decoration-color:var(--blaze);text-underline-offset:4px}
.privacy-copy > section{padding:0 0 34px;margin:0 0 34px;border-bottom:1px solid var(--hairline);scroll-margin-top:28px}
.privacy-copy > section:last-child{border-bottom:0;margin-bottom:0}
.privacy-copy h2{font-size:clamp(1.3rem,1.1rem + .8vw,1.9rem)}
.privacy-copy p,.privacy-copy li{color:var(--ink-70);line-height:1.62}
.privacy-copy strong{color:var(--ink)}
.privacy-callout{padding:18px 20px;border:1px solid var(--hairline);background:oklch(0.19 0.012 250 / 0.04)}
@media(max-width:760px){
  .guide-toc__label{position:sticky;left:0;z-index:1;margin:0;padding-right:15px;background:var(--paper)}
  .guide-inline-cta{margin-top:24px;padding:18px}
  .inquiry-context{grid-template-columns:1fr;gap:5px}
  .inquiry-context .mono{grid-row:auto}
  .privacy-grid{grid-template-columns:1fr}
  .privacy-index{position:static}
}
@media(prefers-reduced-motion:reduce){
  .decision-row,.decision-row::before,.decision-row__arrow,.journey-rail a,.guide-inline-cta{transition:none}
}

/* --- Case study sheet --- */
/* Case — 불량 도해: 좌 = 봉제 장력 불균일로 축이 틀어진 다리, 우 = 정상 */
.case__diag{display:grid; grid-template-columns:1fr 1fr; border:1px solid var(--hairline); margin-top:20px}
.case__fig{padding:22px 16px; text-align:center}
.case__fig + .case__fig{border-left:1px solid var(--hairline)}
.case__fig svg{height:170px; width:auto; display:block; margin:0 auto}
.case__fig svg .sh{fill:oklch(0.19 0.012 250 / 0.07); stroke:var(--ink); stroke-width:1.6}
.case__fig svg .seam{stroke:var(--ink-70); stroke-width:1.3}
.case__fig svg .drift{stroke:var(--blaze); stroke-width:1.6; stroke-dasharray:4 3}
.case__fig svg .ok{stroke:var(--stamp-green); stroke-width:1.6}
.case__fig figcaption{font-size:.8rem; line-height:1.45; color:var(--ink-70); margin-top:11px; max-width:34ch; margin-inline:auto}
.case__diag-k{display:block; color:var(--ink-70); font-size:.72rem; letter-spacing:.08em; margin-bottom:6px}
.case__stamp{display:block; width:fit-content; margin:0 auto 10px; border:1.5px solid var(--stamp-green); color:var(--stamp-green); border-radius:0; font-size:.72rem; letter-spacing:.12em; padding:4px 8px; transform:rotate(-4deg)}
@media (max-width:480px){
  .case__fig{padding:16px 10px}
  .case__fig svg{height:120px}
  .case__fig figcaption{font-size:.74rem}
}
/* /sourcing-agent — DUPRO 논증의 물증 인서트(홈 케이스의 도해를 재사용) */
.case__ev{margin-top:20px; border-top:1px solid var(--hairline); padding-top:15px}
.case__ev-k{display:block; color:var(--ink-70); margin-bottom:12px}
.case__ev > p{margin-bottom:18px}
.case__note{margin:20px 0 0;max-width:62ch;color:var(--ink-70)}
@media (max-width:900px){
  .case__attr{grid-template-columns:1fr}
  .case__grp--us .case__cells{height:auto}
}
@media (max-width:700px){
  .case__grp--prior .case__cells{grid-template-columns:1fr}
  .case__grp--prior .case__cells > li + li{border-left:0; border-top:1px dashed var(--hairline)}
}

/* --- Blog: published field notes and authenticated editorial previews --- */
.blog-shell{border-bottom:1px solid var(--hairline)}
.blog-feed{padding-block:clamp(24px,3.2vw,44px)}
.blog-feed__head{display:flex;align-items:end;justify-content:space-between;gap:20px;margin-bottom:22px}
.blog-feed__head h1{font-size:clamp(1.7rem,1.25rem + 1.4vw,2.35rem);margin:0}
.blog-feed__count{color:var(--ink-70)}
.blog-list{list-style:none;border-top:2px solid var(--ink)}
/* .22fr, not .32: on desktop the 16:9 thumbnail is the taller half of the row,
   so the preview column sets the height of every card in the list — at .32fr it
   was 260px wide / 146px tall and the index ran 8.5 screens. A 180px preview is
   still a preview. */
.blog-card{display:grid;grid-template-columns:minmax(150px,.22fr) minmax(0,1fr) auto;gap:clamp(16px,2.2vw,30px);align-items:start;padding:clamp(16px,2vw,22px) 0;border-bottom:1px solid var(--hairline)}
/* a post with no uploaded image keeps the two-column text layout */
.blog-card:not(:has(.blog-card__thumb)){grid-template-columns:minmax(0,1fr) auto}
.blog-card__thumb{display:block}
.blog-card__thumb img{display:block;width:100%;aspect-ratio:16/9;object-fit:cover;border:1px solid var(--hairline);border-radius:0}
.blog-card:has(a:hover) .blog-card__thumb img{border-color:var(--blaze)}
.blog-card h2{font-size:clamp(1.2rem,1.04rem + .75vw,1.6rem);margin:0 0 7px;line-height:1.16}
.blog-card h2 a{text-decoration:none}
.blog-card h2 a:hover{text-decoration:underline;text-decoration-color:var(--blaze);text-decoration-thickness:3px;text-underline-offset:5px}
/* two lines, clamped visually only — the full text stays in the DOM for the
   crawler. An index is for choosing, not for reading. */
/* 1rem, not .94: this is the only prose on the index and on a phone it was
   14.1px — below the 16px floor every other page on the site keeps. It is
   clamped to a few lines, so a larger size costs line height, not line count. */
.blog-card__summary{color:var(--ink-70);font-size:1rem;line-height:1.5;margin:0;max-width:64ch;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.blog-card__arrow{color:var(--blaze);font-family:var(--mono);font-size:1.15rem;padding-top:4px;transition:transform .18s cubic-bezier(.32,.72,0,1)}
.blog-card:has(a:hover) .blog-card__arrow{transform:translateX(5px)}
.blog-empty{padding:24px 0;border-block:1px solid var(--hairline);color:var(--ink-70)}

/* ---- blog index: two publishers, two weights (2026-09-01) ----
   The feed and the appendix are separate components on purpose; the rationale
   is in site/DESIGN.md. */
.blog-feed__sub{margin:-4px 0 2px;color:var(--ink-60)}

/* "Load more" is a <summary>, so it works with JavaScript off and every hidden
   card stays in the HTML for crawlers. Once opened there is nothing left to
   load, so the control removes itself rather than lying. */
.blog-more > summary{
  list-style:none;cursor:pointer;display:block;width:100%;
  padding:13px 0;border-bottom:1px solid var(--hairline);
  font-weight:600;font-size:.76rem;letter-spacing:.09em;text-transform:uppercase;
  color:var(--ink-60);transition:color .18s var(--ease);
}
.blog-more > summary::-webkit-details-marker{display:none}
.blog-more > summary::after{content:" +";color:var(--blaze)}
.blog-more > summary:hover{color:var(--ink)}
.blog-more[open] > summary{display:none}

.blog-aside{margin-top:clamp(26px,3.4vw,44px);padding-top:clamp(16px,2.2vw,26px);border-top:2px solid var(--ink)}
/* when it is the only section on the page it is the page, not an appendix */
.blog-aside--lead{margin-top:0;padding-top:0;border-top:0}
.blog-aside--lead h1{font-size:clamp(1.7rem,1.25rem + 1.4vw,2.35rem);margin:0 0 2px}
.blog-aside h2{font-size:clamp(1.08rem,1rem + .45vw,1.3rem);margin:0}
.blog-aside__note{color:var(--ink-60);font-size:.9rem;margin:5px 0 0;max-width:62ch}
.blog-aside__note strong{color:var(--ink);font-weight:600}
/* Appendix cards: same component, less of it — smaller preview, no excerpt. The
   excerpt is what makes a card look like the point of the page, and these are
   not the point of this page. */
.blog-list--aside{margin-top:12px}
.blog-list--aside .blog-card{grid-template-columns:92px minmax(0,1fr) auto;gap:14px;padding:10px 0;align-items:center}
.blog-list--aside .blog-card__thumb img{aspect-ratio:4/3}
.blog-list--aside .blog-card h2{font-size:clamp(1rem,.97rem + .18vw,1.08rem);margin:0}
.blog-list--aside .blog-card:not(:has(.blog-card__thumb)){grid-template-columns:minmax(0,1fr) auto}
@media(max-width:720px){
  .blog-list--aside .blog-card{grid-template-columns:76px minmax(0,1fr) auto;gap:12px;padding:9px 0}
  .blog-list--aside .blog-card__thumb{grid-column:1;grid-row:1}
  .blog-list--aside .blog-card__body{grid-column:2;grid-row:1}
  .blog-list--aside .blog-card__arrow{grid-column:3;grid-row:1}
}

.blog-article{padding-block:clamp(28px,4vw,54px);max-width:1000px}
.blog-article__head{display:grid;grid-template-columns:minmax(0,.28fr) minmax(0,.72fr);column-gap:clamp(24px,5vw,72px);padding-bottom:clamp(22px,3.4vw,40px);border-bottom:2px solid var(--ink)}
.blog-article__crumb{grid-column:1/-1;color:var(--ink-70);margin-bottom:clamp(18px,2.6vw,32px)}
.blog-article__crumb a{text-decoration:none;border-bottom:1px solid var(--hairline)}
.blog-article__meta{color:var(--ink-70);padding-top:7px}
.blog-article__meta time{display:block;color:var(--ink);margin-top:8px}
.blog-article__meta span{display:block;margin-top:8px}
.blog-article__meta a{text-decoration-color:var(--blaze);text-underline-offset:3px}
/* 2026-09-02: was 4.7rem / 15ch — 75px set in a 611px column, so a normal
   headline broke into FIVE lines of about ten characters. It was also 47%
   bigger than any other h1 on the site, which is the one thing a shared scale
   exists to prevent. Now the same expression as .pagehero h1, and a measure
   wide enough that a 45-character title lands in two lines. */
.blog-article__title h1{font-size:clamp(1.6rem,1rem + 2.6vw,2.95rem);max-width:26ch;line-height:1.07}
.blog-article__lede{color:var(--ink-70);font-size:clamp(1.02rem,.96rem + .4vw,1.25rem);line-height:1.58;margin-top:24px;max-width:58ch}
.blog-article__image{max-width:900px;margin:clamp(22px,3.2vw,36px) auto 0}
.blog-article__image img{display:block;width:100%;height:auto;aspect-ratio:16/9;object-fit:cover;border:1px solid var(--hairline)}
.blog-article__image figcaption{padding-top:9px;color:var(--ink-70);font-family:var(--mono);font-size:.75rem;line-height:1.5}
.blog-toc{max-width:760px;margin:clamp(22px,3.2vw,36px) auto 0;padding:15px 22px;border:1px solid var(--hairline);border-left:4px solid var(--blaze)}
.blog-toc > p{margin:0 0 12px;color:var(--ink-70)}
.blog-toc ol{columns:2;column-gap:34px;margin:0;padding-left:1.25em}
.blog-toc li{break-inside:avoid;margin:.45em 0;padding-left:.2em}
.blog-toc__level-3{margin-left:1em!important;color:var(--ink-70)}
.blog-toc a{text-decoration:none;border-bottom:1px solid var(--hairline)}
.blog-inline-cta{max-width:760px;margin:clamp(22px,3.2vw,36px) auto 0;padding:15px 22px;background:var(--ink);color:var(--paper);display:flex;align-items:center;justify-content:space-between;gap:24px}
.blog-inline-cta p{margin:0;max-width:52ch}
.blog-inline-cta a{color:var(--paper);text-decoration-color:var(--blaze);text-decoration-thickness:2px;text-underline-offset:4px;font-family:var(--mono);font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;flex:0 0 auto}
/* The one long-form reading surface on the site, so it gets the reading measure
   rather than the layout's: 760px at 17px ran ~90 characters a line. 700px at a
   slightly larger body lands at ~75, and the phone gains a point of size. */
.blog-prose{max-width:700px;margin:clamp(24px,3.6vw,44px) auto 0;font-size:clamp(1.05rem,1rem + .3vw,1.16rem);line-height:1.66}
.blog-prose > * + *{margin-top:1.25em}
.blog-prose h2{font-size:clamp(1.2rem,.85rem + 1.75vw,2rem);line-height:1.12;margin-top:1.5em;padding-top:.5em;border-top:1px solid var(--hairline)}
.blog-prose h3{font-size:clamp(1.14rem,1.05rem + .42vw,1.4rem);line-height:1.2;margin-top:1.3em}
.blog-prose ul,.blog-prose ol{padding-left:1.35em}
.blog-prose li + li{margin-top:.5em}
.blog-prose a{text-decoration-color:var(--blaze);text-decoration-thickness:2px;text-underline-offset:3px}
.blog-prose blockquote{border-left:3px solid var(--blaze);padding:12px 0 12px 20px;color:var(--ink-70)}
.blog-prose__big{font-size:1.22em;line-height:1.5}
.blog-prose__video{margin:clamp(20px,3vw,32px) 0;aspect-ratio:16/9;background:#000}
.blog-prose__video iframe{width:100%;height:100%;border:0;display:block}
.blog-prose__video--static{aspect-ratio:auto}
.blog-prose__video--static a{display:block;text-decoration:none}
.blog-prose__video--static img{width:100%;display:block}
.blog-prose__video-note{display:block;padding:10px 14px;font-size:.8rem;color:#f3f0e9;background:#23212b}
.blog-prose code{font-family:var(--mono);font-size:.88em;background:oklch(0.19 0.012 250 / .06);padding:.14em .35em;border-radius:0}
.blog-prose pre{overflow-x:auto;background:var(--ink);color:var(--paper);padding:18px 20px;border-radius:0;line-height:1.55}
.blog-prose pre code{background:transparent;padding:0;color:inherit}
.blog-prose__media{margin:clamp(20px,3vw,32px) 0}
/* Body photographs are phone shots, so a portrait one at full column width
   stands over 1,000px tall and pushes the first sentence of the article past
   two screens. Cap the HEIGHT — a portrait image gets narrower, never taller
   than half the viewport — and centre what is left. */
.blog-prose img{display:block;max-width:100%;height:auto;border:1px solid var(--hairline);
  max-height:min(58vh,520px);width:auto;margin-inline:auto}
/* auto, not 100%: with a height cap in play, forcing the width squashes a
   portrait photo instead of shrinking it. max-width still fills the column. */
.blog-prose__media img{width:auto;max-width:100%}

/* ---- collage: photographs written one after another ---------------------
   A run of two or more images is one group. Stacked full width they were the
   article: three phone shots in a row measured 1,400px on a 390px screen,
   which is a screen and a half of scrolling between two sentences. A lone
   photograph is NOT collaged — it keeps its own shape above.

   Three things at once, and all three were asked for:
     WHOLE      nothing is cropped (사용자: "안 잘리게 못해?")
     IN ORDER   left to right, as written (사용자: "순서 유지되게 좌우로")
     FLUSH      no hole under a short picture

   That is only possible if the layout knows each picture's proportions, which
   is why api/_cms.cjs reads them out of the file header and prints them as
   --ar. Then the classic justified row falls out of flexbox: basis AND grow
   both proportional to the aspect, so every picture in a row lands on the same
   height at its own true width, and the row fills the measure exactly.
   The ::after spacer soaks up the leftover on the LAST row — without it a
   single trailing picture grows to the full column, and a portrait shot at
   611px wide stands 815px tall.
   --row is the target row height, i.e. how much fits before wrapping; it is the
   only number to touch if the groups look too dense or too sparse.
   Without --ar (a file whose header could not be read) the group falls back to
   even columns below: still whole, still in order, only the flush edge lost. */
.blog-prose__collage{--cgap:clamp(6px,1vw,8px); --cap:2.8;
  display:flex;flex-wrap:wrap;column-gap:var(--cgap);margin:clamp(20px,3vw,32px) 0}
/* basis is a PERCENTAGE of the column, so a row holds --cap worth of aspect at
   every width — which is what lets api/_cms.cjs decide, once, whether a group
   fits on one row. grow is the aspect too: that is what puts every picture in a
   row on one height. */
.blog-prose__collage figure{margin:0 0 var(--cgap);min-width:0;
  flex:var(--ar,1.4) 1 calc(var(--ar,1.4) / var(--cap) * 100%)}
.blog-prose__collage img{display:block;width:100%;height:auto;max-height:none;margin:0}
/* soaks up most of the leftover on the LAST row so a trailing picture grows a
   little but never to the full column. Groups that fit on one row skip it. */
.blog-prose__collage::after{content:"";flex-grow:2}
.blog-prose__collage[data-fit="1"]::after{content:none}
@media(min-width:761px){.blog-prose__collage{--cap:3}}

.blog-prose__collage--even{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--cgap)}
.blog-prose__collage--even figure{margin:0}
.blog-prose__collage--even::after{content:none}

/* 블로그 사진 확대(탭하면 원본) · 직접 올린 영상 · 사진/영상 설명 */
.blog-prose__zoom{display:block;cursor:zoom-in}
.blog-prose__clip{margin:clamp(20px,3vw,32px) 0}
.blog-prose__clip video{display:block;width:100%;max-height:min(72vh,680px);background:#000}
.blog-prose figcaption,.blog-prose__caption{margin-top:8px;font-size:.84rem;line-height:1.45;color:var(--ink-70)}

/* Desktop: the head puts the meta in a 28% column and the title in the 72% one,
   so the body and the lead image take that same 72% column. Centring them
   instead gave the article three different left edges — title, image, text —
   none of which lined up with each other. Must sit after both base rules: the
   image's own `margin: … auto 0` would otherwise re-centre it. */
@media(min-width:761px){
  .blog-prose,.blog-article__image{
    margin-left:calc(28% + .72 * clamp(24px,5vw,72px)); margin-right:0; max-width:none}
}

.blog-prose table{width:100%;border-collapse:collapse;display:block;overflow-x:auto}
.blog-prose th,.blog-prose td{padding:11px 14px;border-bottom:1px solid var(--hairline);text-align:left;vertical-align:top}
.blog-prose th{font-family:var(--mono);font-size:.7rem;text-transform:uppercase;letter-spacing:.06em}
.blog-end{max-width:760px;margin:clamp(24px,3.6vw,44px) auto 0;padding-top:18px;border-top:2px solid var(--ink);display:flex;align-items:center;justify-content:space-between;gap:20px}
.blog-end p{color:var(--ink-70);margin:0}
.preview-banner{background:var(--ink);color:var(--paper);padding:10px 20px;text-align:center;font-family:var(--mono);font-size:.75rem;text-transform:uppercase;letter-spacing:.08em}

@media(max-width:720px){
  /* 2026-09-01: the thumbnail sits BESIDE the title, not above it. Full-bleed
     (the 2026-08-19 treatment) is a 219px 16:9 photo per card, and at 33
     published posts the index ran 14,170px — 16.8 phone screens to scan a list
     of links. Beside the words it is a 118px preview, the card is one glance,
     and the list is browsable again. Same move as `.area` and `.step` make on
     this width; the 3-column desktop card is untouched. */
  .blog-card{grid-template-columns:118px minmax(0,1fr) auto;gap:12px 14px;align-items:start}
  .blog-card__thumb{grid-column:1;grid-row:1}
  .blog-card__thumb img{aspect-ratio:4/3}
  .blog-card__body{grid-column:2;grid-row:1}
  .blog-card__arrow{grid-column:3;grid-row:1;align-self:center}
  /* a post with no photo would otherwise leave a dead 118px column */
  .blog-card:not(:has(.blog-card__thumb)){grid-template-columns:minmax(0,1fr) auto}
  .blog-card:not(:has(.blog-card__thumb)) .blog-card__body{grid-column:1}
  .blog-card:not(:has(.blog-card__thumb)) .blog-card__arrow{grid-column:2}
  /* 17.9px on a 390px screen against 16.1px body is not a title, it is body
     text that happens to be a link — and it was the only heading on the site
     below the phone h2 floor. The appendix variant keeps its quieter size
     (higher specificity, further down): there the point IS to be quiet. */
  .blog-card h2{font-size:clamp(1.2rem,1.1rem + .45vw,1.35rem);margin-bottom:5px}
  /* Three lines. A 220-character excerpt in a 186px column is eight lines, and
     eight lines x 33 posts is not an index — it is the articles, badly. Clamped
     visually only: the full text stays in the DOM, so the crawler and the
     meta description are unaffected. */
  .blog-card__summary{line-height:1.45;
    display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
  .blog-inline-cta{align-items:flex-start;flex-direction:column}
  .blog-toc ol{columns:1}
  .blog-end{align-items:flex-start;flex-direction:column}
}

/* 760, not 720. The article's two-column head and the rule that puts the body
   under the title are a PAIR — the body only has a left edge to line up with
   while the head is two columns. Split across 720/761 they left a 40px band of
   viewport widths with neither: measured at 721px the title started at x=244
   and its own first paragraph at x=36, 208px apart. That is the same defect the
   2026-09-02 pass fixed on desktop, surviving in the gap between two queries.
   Change this number and min-width:761px together, or the band comes back. */
@media(max-width:760px){
  .blog-article__head{grid-template-columns:1fr}
  .blog-article__meta{margin-bottom:20px}
  .blog-prose,.blog-article__image{margin-left:auto;margin-right:auto}
}

/* ============================================================
   DENSITY DIET (2026-08-17) — same tokens. Home consolidation:
   titles-only ledger rows, "how it starts" one-line strip.
   ============================================================ */
/* the brand is now a home link on every page — it must not read as underlined body text */
a.brand{text-decoration:none; color:inherit}
/* small green text on green-tinted panels needs a darker green to clear WCAG AA */
.qc-stage--base .qc-stage__k{color:var(--blaze-ink)}
.invoice__row--total span:last-child{color:var(--blaze-ink)}

/* Narrow header, same shape as the home's: brand and CTA share row 1, the
   section links drop to row 2 as an even 3-column grid. Left to wrap as a flex
   row the fifth link lands alone on a third line. */
@media(max-width:880px){
  .top{
    display:grid; grid-template-columns:1fr auto; align-items:center;
    gap:12px 16px; padding-block:14px;
  }
  .top__brand,.brand{padding-block:5px; grid-column:1; grid-row:1}
  .top nav{grid-column:1/-1; grid-row:2; justify-content:flex-start; gap:8px 16px}
  .top nav a{font-size:.79rem; padding-block:5px}
  .top__cta{grid-column:2; grid-row:1; font-size:.78rem; padding:8px 14px}
}
@media(max-width:620px){
  .top__brand span,.brand small{display:none}
  /* 3 + 2, not 4 + 1: as a wrapping flex row the fifth link drops alone */
  .top nav{display:grid; grid-template-columns:repeat(3,1fr); column-gap:12px; row-gap:0}
}

/* /make: category cards select the still (2026-08-17) — active card owns the blaze */
.make-card[data-img]{cursor:pointer; transition:border-color .18s cubic-bezier(0.22,1,0.36,1)}
.make-card[data-img]:hover{border-color:var(--ink)}
.make-card.is-active{border-color:var(--blaze); border-width:2px; background:transparent}

/* ========== WeChat float ==================================================
   Recorded exception to "no third-party links" (DESIGN.md, 2026-08-24).
   The reveal contract is display:none -> display:block on :hover / :focus-within
   / .is-open, and it is CSS-driven so the panel still works with JS off.
   verify-wechat.py asserts computed `display`, so opacity/visibility is NOT an
   acceptable substitute, and the pinned class is `is-open` (set by track.js).
   Touch never gets the panel — it would eat the single tap that opens the app —
   so the ID rides inside the tag there instead.
   ========================================================================== */
.wx{
  position:fixed;right:clamp(12px,2.4vw,24px);bottom:clamp(12px,2.4vw,24px);z-index:60;
  display:inline-flex;align-items:center;gap:0;
  background:var(--ink);color:#fff;text-decoration:none;
  font-family:var(--disp);font-weight:600;font-size:.7rem;letter-spacing:.1em;text-transform:uppercase;
  transition:transform .18s var(--ease);
}
.wx:hover,.wx:focus-visible{transform:translateY(-2px)}
.wx:focus-visible{outline:2px solid var(--blaze);outline-offset:2px}
.wx__label{padding:10px 12px}
.wx__label::before{content:"";display:inline-block;width:2px;height:10px;margin-right:8px;background:var(--blaze);vertical-align:-1px}
.wx__idm{
  padding:10px 12px;border-left:1px solid rgb(255 255 255/.28);
  letter-spacing:.02em;text-transform:none;font-weight:500;white-space:nowrap;
}
.wx__panel{
  display:none;position:absolute;right:0;bottom:calc(100% + 10px);
  width:212px;padding:14px;background:#fff;color:var(--ink);
  border:1px solid var(--ink);
  text-transform:none;letter-spacing:normal;font-weight:400;
}
.wx__qr{width:100%;height:auto;border:1px solid var(--rule)}
.wx__id{display:block;margin-top:10px;font-size:.72rem;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-60)}
.wx__id b{color:var(--ink);text-transform:none;letter-spacing:0}
.wx__note{display:block;margin-top:6px;font-size:.74rem;color:var(--ink-60);line-height:1.45}
@media (hover:hover) and (pointer:fine){
  .wx__idm{display:none}                       /* the panel already shows the ID */
  .wx:hover .wx__panel,
  .wx:focus-within .wx__panel,
  .wx.is-open .wx__panel{display:block}
}
@media (prefers-reduced-motion:reduce){
  .wx{transition:none}
  .wx:hover,.wx:focus-visible{transform:none}
}
@media print{.wx{display:none}}


/* ─── Keyword service pages (/custom-clothing-manufacturer, 2026-09-21) ──────────
   Three small additions, each kept out of the component it resembles:
   `.artfig` is deliberately NOT `.make-photo` — that class pins itself at <=760px,
   which is right on /make where a tall card list drives it and wrong inside running
   copy. `ol.mech` turns the existing dash list into a numbered sequence instead of
   introducing a second list component. `.toc` is the table of contents the site had
   no page long enough to need until now. */
.artfig{position:relative; border:1px solid var(--rule); overflow:hidden; margin:20px 0 0; max-width:780px}
/* height:auto is load-bearing — the width/height attributes (kept so the layout
   never jumps while the photo loads) map to a presentational height, and a
   definite height beats aspect-ratio: without this the 3:2 band renders at the
   file's own ratio and a 1200x800 photo stands 800px tall. */
.artfig img{width:100%; height:auto; display:block; object-fit:cover; aspect-ratio:3/2}
ol.mech{counter-reset:mech}
ol.mech li{counter-increment:mech; padding-left:42px}
ol.mech li::before{content:counter(mech,decimal-leading-zero); font-family:var(--mono);
  font-size:.74rem; font-weight:700; letter-spacing:.06em; color:var(--blaze-ink); top:13px}
.toc{border-top:1px solid var(--rule); border-bottom:1px solid var(--rule);
  padding:14px 0; margin-top:20px; max-width:68ch}
.toc__k{font-family:var(--mono); text-transform:uppercase; letter-spacing:.07em;
  font-size:.7rem; font-weight:600; color:var(--ink-60)}
.toc ol{list-style:none; margin:6px 0 0; padding:0; columns:2; column-gap:30px}
.toc li{break-inside:avoid; margin:0}
.toc a{display:inline-block; padding-block:5px; font-size:.92rem; color:var(--ink); text-decoration:none}
.toc a:hover{text-decoration:underline; text-decoration-color:var(--blaze);
  text-decoration-thickness:.1em; text-underline-offset:.08em}
@media(max-width:560px){.toc ol{columns:1}}

/* A paragraph that IS a link is not a prose link — it is a target, and at body
   size it is a 19px one. Same fix the footer WhatsApp link got on 2026-09-01. */
.linkline{margin-top:14px}
.linkline a{display:inline-block; padding-block:6px}

/* ========== Chrome v2 (2026-09-26, Dawn Sourcing rebuild) ==================
   Four-column footer with a plain company line, a one-row scrolling nav on
   phones (two rows of links was costing a fifth of the first screen), and a
   sticky quote bar on phones in place of the WeChat float, which covered
   body text and asked US buyers for an app most of them do not use. */
.foot__grid{grid-template-columns:1.5fr 1fr 1fr 1.2fr}
@media(max-width:860px){.foot__grid{grid-template-columns:1fr 1fr}}
@media(max-width:400px){.foot__grid{grid-template-columns:1fr}}
.foot li{overflow-wrap:anywhere}
.foot__about{margin-top:10px; max-width:42ch}
.foot__h{font-weight:700; color:var(--ink) !important; font-size:.8rem !important; text-transform:uppercase; letter-spacing:.08em; margin-bottom:6px}
.foot__hours{margin-top:4px}
.qbar{display:none}
@media(max-width:620px){
  .top{grid-template-columns:1fr auto; padding-block:10px}
  .top nav{display:flex; flex-wrap:nowrap; overflow-x:auto; gap:18px; margin-inline:calc(var(--gut) * -1); padding-inline:var(--gut);
    scrollbar-width:none; -webkit-mask-image:linear-gradient(90deg,#000 88%,transparent)}
  .top nav::-webkit-scrollbar{display:none}
  .top nav a{white-space:nowrap; font-size:.82rem}
  .qbar{display:flex; position:fixed; left:0; right:0; bottom:0; z-index:40; justify-content:center; align-items:baseline; gap:10px;
    padding:13px 16px calc(13px + env(safe-area-inset-bottom)); background:var(--blaze); color:#fff; text-decoration:none;
    font-family:var(--disp); font-weight:700; font-size:1rem; box-shadow:0 -2px 12px rgb(0 0 0 / .12)}
  .qbar span{font-weight:500; font-size:.8rem; opacity:.9}
  body{padding-bottom:58px}
}

/* company fact list (about) */
.facts-list{margin-top:18px; border-top:2px solid var(--ink); max-width:860px}
.facts-list div{display:grid; grid-template-columns:11em 1fr; gap:12px; padding:9px 0; border-bottom:1px solid var(--rule); font-size:.95rem}
.facts-list dt{color:var(--ink-60)}
.facts-list dd{font-weight:600}
@media(max-width:520px){.facts-list div{grid-template-columns:1fr; gap:2px}}

/* /make garment grid (2026-09-26) */
.garments{display:grid; grid-template-columns:repeat(auto-fill,minmax(250px,1fr)); gap:14px; margin-top:20px}
.garments article{border-top:2px solid var(--ink); padding-top:10px}
.garments h3{font-size:1.05rem; margin-bottom:4px}
.g-price{font-weight:700; font-size:.92rem; color:var(--blaze-ink); margin-bottom:6px}
.garments p{font-size:.92rem}

/* legal pages */
.legal{max-width:760px; padding-block:clamp(28px,4vw,56px)}
.legal h1{margin:8px 0 14px}
.legal h2{font-size:1.2rem; margin:28px 0 8px}
.legal p,.legal li{margin-bottom:8px}
.legal ul{padding-left:1.2em}
.legal a{text-decoration-color:var(--blaze); text-underline-offset:3px}
.updated{margin-top:10px; font-size:.85rem; color:var(--ink-60)}

/* ===== Round-2 QA fixes (2026-09-26) ===================================== */
/* Captions sit under the photo as a plain sentence, never over it (they covered
   video controls on /factory and half the photo on phones). */
.qc-cap{position:static; display:block; background:none; color:var(--ink-60); padding:7px 0 0;
  font-family:var(--body); font-size:.85rem; text-transform:none; letter-spacing:0}
.qc-cap::before{content:none}
.artfig,.make-photo{overflow:visible}
/* .make-photo used to pin itself on phones for the old /make card picker; it is
   now only an evidence photo on about / sourcing-agent / the verify guide. */
@media(max-width:760px){.make-photo{position:static !important; order:0 !important; box-shadow:none !important}}
/* mobile table labels: readable size, full ink */
@media(max-width:700px){
  .gt tbody td::before,.gt tbody td[data-label]::before{font-size:.76rem; opacity:1; color:var(--ink)}
  .gt tbody td{color:var(--ink)}
  /* price table: FOB and DDP side by side, like the home page */
  #prices .gt tbody tr{display:grid; grid-template-columns:1fr 1fr; column-gap:14px}
  #prices .gt tbody th{grid-column:1/-1}
  #prices .gt tbody td:last-child{font-weight:700}
}
/* sticky quote bar: keep the last content clear of it on notched phones too */
@media(max-width:620px){body{padding-bottom:calc(58px + env(safe-area-inset-bottom))}}
.license{margin-top:22px; max-width:640px}
.license img{width:100%; border:1px solid var(--rule)}
.license figcaption{font-size:.85rem; color:var(--ink-60); margin-top:6px}

/* Round-3 fix: video captions sit below the frame (the stage used to cover them) */
.qc-video{aspect-ratio:auto; overflow:visible; background:none; border:0}
#qc-stage{position:relative; inset:auto; aspect-ratio:16/9; overflow:hidden; background:var(--ink); border:1px solid var(--hairline)}
.fv-video{aspect-ratio:auto}
.fv-video video{aspect-ratio:16/9; height:auto}

/* 언어 전환 (EN · ES · PT · 日本語) — 머리글 오른쪽, 문의 버튼 앞 */
.top__end{display:flex; align-items:center; gap:clamp(10px,1.6vw,18px)}
.lang{display:flex; align-items:center; gap:2px}
.lang a{font-size:.72rem; font-weight:600; letter-spacing:.04em; color:var(--ink-60); padding:8px 5px; line-height:1; white-space:nowrap}
/* 한국어판: 단어 중간에서 줄이 바뀌지 않게(Fred #5154) */
html[lang="ko"] body{word-break:keep-all; overflow-wrap:break-word}
.lang a:hover{color:var(--ink)}
.lang a[aria-current]{color:var(--ink); text-decoration:underline; text-decoration-color:var(--blaze); text-decoration-thickness:2px; text-underline-offset:4px}
.foot small{font-size:.8em; color:var(--ink-60)}
@media(max-width:880px){ .top__end{grid-column:2; grid-row:1} }
@media(max-width:620px){ .top__end{gap:6px} .lang a{padding:8px 3px; font-size:.68rem} }
.lang__s{display:none}
@media(max-width:620px){ .lang__l{display:none} .lang__s{display:inline} }
/* 언어 버튼이 5개가 된 뒤(2026-10-09) 좁은 폰에서 머리글 첫 줄이 넘친다 → 아래 고정 막대(.qbar)가 같은 견적 버튼이라 머리글 버튼만 숨긴다 */
@media(max-width:420px){ .top__cta{display:none} }

/* /products — 생산 실적 카드. 이미지는 고객 상품이 아닌 유사 상품이라 모든 카드에 표시를 얹는다 */
.made__note{margin-top:18px;padding:12px 16px;border-left:3px solid var(--blaze);background:oklch(0.19 0.012 250 / .04);font-size:.92rem;color:var(--ink-70)}
.made__cat{padding-block:clamp(28px,4vw,48px)}
.made__cat + .made__cat{padding-top:0}
.made__grid{list-style:none;padding:0;margin:18px 0 0;display:grid;grid-template-columns:repeat(auto-fill,minmax(168px,1fr));gap:clamp(12px,1.6vw,20px)}
.made__card{margin:0}
.made__img{position:relative;aspect-ratio:1;background:#eceae6;border:1px solid var(--hairline);overflow:hidden}
.made__img img,.made__ph{display:block;width:100%;height:100%;object-fit:cover}
.made__badge{position:absolute;left:0;right:0;bottom:0;padding:5px 8px;background:rgb(20 20 24 / .62);color:#fff;font-size:.66rem;line-height:1.3;letter-spacing:.02em}
.made__card figcaption{margin-top:8px;font-size:.9rem;font-weight:600;line-height:1.35}
@media(max-width:620px){.made__grid{grid-template-columns:repeat(2,1fr)}}

/* 홈: 프로필 아래 "무엇을 만드나" 미리보기 → /products */
.made-prev{border-top:1px solid var(--rule)}
.made-prev__eyebrow{color:var(--blaze);font-size:.74rem;letter-spacing:.12em;text-transform:uppercase;font-weight:700}
.made-prev h2{margin-top:8px}
.made-prev .lede{margin-top:10px;max-width:62ch}
.made-prev__grid{grid-template-columns:repeat(4,1fr)}
.made-prev__grid .made__card{display:block;text-decoration:none;color:inherit}
.made-prev__grid .made__card:hover .made__img{border-color:var(--ink)}
.made__name{display:block;margin-top:8px;font-size:.9rem;font-weight:600;line-height:1.35}
.made-prev__chips{list-style:none;padding:0;margin:22px 0 0;display:flex;flex-wrap:wrap;gap:8px}
.made-prev__chips a{display:inline-block;padding:7px 12px;border:1px solid var(--hairline);font-size:.82rem;text-decoration:none;color:var(--ink)}
.made-prev__chips a:hover{border-color:var(--ink)}
.made-prev__cta{margin-top:24px;display:flex;flex-wrap:wrap;align-items:center;gap:12px 20px}
.made-prev__note{font-size:.8rem;color:var(--ink-60)}
@media(max-width:620px){.made-prev__grid{grid-template-columns:repeat(2,1fr)}}

/* ---- 대화하기 버튼 (dock.js) : 오른쪽 아래 고정, 폰에서는 주황 견적 바 위 ---- */
.dock{position:fixed;right:clamp(12px,2.4vw,24px);bottom:clamp(12px,2.4vw,24px);z-index:60;font-family:var(--body)}
.dock__btn{display:inline-flex;align-items:center;gap:8px;padding:12px 16px;border:0;border-radius:999px;background:#1f8f4e;color:#fff;
  font:600 .88rem/1 var(--body);cursor:pointer;box-shadow:0 6px 20px rgb(0 0 0 / .18);transition:transform .18s var(--ease)}
.dock__btn svg{width:20px;height:20px}
.dock__btn:hover{transform:translateY(-2px)}
.dock__btn:focus-visible,.dock__row:focus-visible,.dock__x:focus-visible{outline:2px solid var(--blaze);outline-offset:2px}
.dock.is-open .dock__btn{background:var(--ink)}
.dock__panel{position:absolute;right:0;bottom:calc(100% + 10px);width:min(340px,calc(100vw - 24px));max-height:min(78vh,620px);overflow:auto;
  background:#fff;color:var(--ink);border:1px solid var(--ink);box-shadow:0 12px 34px rgb(0 0 0 / .18)}
.dock__head{display:flex;justify-content:space-between;gap:10px;padding:14px 16px;border-bottom:1px solid var(--hairline)}
.dock__head b{display:block;font-size:.98rem}
.dock__head small{display:block;margin-top:3px;font-size:.76rem;color:var(--ink-60);line-height:1.4}
.dock__x{border:0;background:none;font-size:1.5rem;line-height:1;cursor:pointer;color:var(--ink-60);padding:0 4px;align-self:flex-start}
.dock ul{list-style:none;margin:0;padding:6px 0}
.dock__row{display:flex;align-items:center;gap:12px;width:100%;padding:11px 16px;border:0;background:none;text-align:left;color:inherit;text-decoration:none;cursor:pointer;font:inherit}
.dock__row:hover{background:oklch(0.19 0.012 250 / .05)}
.dock__ic{flex:none;display:grid;place-items:center;width:38px;height:38px;border-radius:50%;color:#fff;background:var(--ink)}
.dock__ic svg{width:21px;height:21px}
.dock__row--whatsapp .dock__ic{background:#25d366}
.dock__row--wechat .dock__ic{background:#07c160}
.dock__row--line .dock__ic{background:#06c755}
.dock__row--call .dock__ic{background:var(--blaze)}
.dock__txt b{display:block;font-size:.92rem}
.dock__txt small{display:block;font-size:.76rem;color:var(--ink-60);margin-top:2px}
.dock__wcpanel{padding:4px 16px 14px 66px}
.dock__wcpanel img{width:160px;height:160px;border:1px solid var(--hairline);display:block}
.dock__wcpanel p{margin-top:8px;font-size:.8rem}
.dock__copy{margin-left:6px;padding:3px 8px;border:1px solid var(--ink);background:#fff;font:600 .72rem var(--body);cursor:pointer}
@media(max-width:620px){
  .dock{bottom:calc(64px + env(safe-area-inset-bottom))}
  .dock__btn{padding:11px 14px;font-size:.82rem}
}
@media print{.dock{display:none}}

/* ---- 화상 상담 예약 (booking.js) : 문의 페이지 #call ---- */
.book{margin-top:clamp(40px,6vw,72px);padding-top:clamp(28px,4vw,40px);border-top:1px solid var(--rule);max-width:860px}
.book .lede{margin-top:10px}
.book__box{margin-top:22px}
.book__loc{display:block;max-width:420px;font-weight:600;font-size:.9rem}
.book__loc select{display:block;width:100%;margin-top:6px;padding:10px 12px;border:1px solid var(--ink);background:#fff;font:inherit;font-weight:400}
.book__other{margin-top:6px;font-size:.8rem;color:var(--ink-60)}
.book__h{margin-top:20px;font-weight:600;font-size:.9rem}
.book__days,.book__times{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}
.book__days button,.book__times button{padding:9px 12px;border:1px solid var(--hairline);background:#fff;font:500 .86rem var(--body);cursor:pointer;color:var(--ink)}
.book__days button:hover,.book__times button:hover{border-color:var(--ink)}
.book__days button[aria-pressed="true"]{background:var(--ink);color:#fff;border-color:var(--ink)}
.book__times button{min-width:88px}
.book__chosen{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;padding:14px 16px;border-left:3px solid var(--blaze);background:oklch(0.19 0.012 250 / .04)}
.book__chosen small{display:block;color:var(--ink-60);font-size:.78rem}
.book__chosen b{display:block;margin-top:3px}
.book__change{border:1px solid var(--ink);background:#fff;padding:7px 12px;font:600 .8rem var(--body);cursor:pointer}
.book__form{margin-top:18px}
.book__none,.book__loading{color:var(--ink-60)}

/* 보장 3줄 띠(offer3) — 홈·견적·Teardown 맨 위, Fred #5469 */
.offer3{background:oklch(0.97 0.012 40); border-bottom:1px solid var(--rule)}
.offer3__in{list-style:none; margin-block:0; padding-block:12px; display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:10px 28px; counter-reset:o3}
.offer3__in li{counter-increment:o3; position:relative; padding-left:30px; font-size:.9rem; line-height:1.45}
.offer3__in li::before{content:counter(o3); position:absolute; left:0; top:1px; width:21px; height:21px; border-radius:50%; background:var(--blaze); color:#fff; font-weight:700; font-size:.78rem; display:grid; place-items:center}
.offer3__in b{display:block; font-weight:700}
.offer3__in span{color:var(--ink-60)}
.offer3__in a{color:var(--blaze-ink); font-weight:700; white-space:nowrap}
@media(max-width:760px){
  .offer3__in{grid-template-columns:1fr; gap:7px; padding-block:10px}
  .offer3__in li{font-size:.86rem}
  .offer3__in b{display:inline}
  .offer3__in span{display:none}
  .offer3__in li:first-child span{display:inline}
  .offer3__in li:first-child b::after{content:" —"}
}
.teardown .opt{font-weight:400; color:var(--ink-60)}
.teardown .contact__side p{font-size:.95rem; margin:0}

/* home.css — home-only components (2026-09-26 rebuild). Tokens and chrome live
   in styles.css. Order of the page is the order a US buyer asks questions in:
   what is this and is it for me (hero, fit), what does it cost (make), how does
   it run (process), how do I know it will be right (quality, cases), who is
   behind it (people), then the form. */

.sec{padding-block:clamp(40px,6vw,84px)}
.sec--alt{background:oklch(0.975 0.004 80)}
.answer{font-size:1.08em; max-width:70ch; margin-bottom:clamp(18px,2.4vw,28px)}
.small{font-size:.88rem; color:var(--ink-60); margin-top:14px; max-width:90ch}
.small a,.link{color:var(--ink); text-decoration:underline; text-decoration-color:var(--blaze); text-decoration-thickness:2px; text-underline-offset:3px; font-weight:600}

/* 01 hero */
.hero{padding-block:clamp(22px,4vw,56px) clamp(28px,4vw,56px); border-bottom:1px solid var(--rule)}
.hero__grid{display:grid; grid-template-columns:minmax(0,1.08fr) minmax(0,1fr); gap:clamp(24px,4vw,56px); align-items:center}
.hero__kicker{color:var(--blaze-ink)}
.hero h1{margin:10px 0 16px; font-size:clamp(1.75rem,1rem + 2.6vw,3rem)}
.hero__lede{font-size:clamp(1.02rem,.96rem + .3vw,1.16rem); color:var(--ink-60); max-width:58ch}
.facts{list-style:none; display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:0; margin:22px 0; border-top:2px solid var(--ink); border-bottom:1px solid var(--rule)}
.facts li{padding:12px 12px 12px 0}
.facts li+li{padding-left:12px; border-left:1px solid var(--rule)}
.facts b{display:block; font-family:var(--disp); font-stretch:110%; font-size:clamp(1.05rem,.9rem + .6vw,1.35rem); font-weight:800}
.facts span{font-size:.8rem; color:var(--ink-60); line-height:1.3; display:block}
.hero__cta{display:flex; flex-wrap:wrap; align-items:center; gap:14px 24px}
.hero__promise{margin-top:14px; font-size:1rem; border-left:3px solid var(--blaze); padding-left:10px}
.hero__who{margin-top:14px; font-size:.9rem; color:var(--ink-60)}
.hero__img img{width:100%; height:auto; aspect-ratio:4/3; object-fit:cover}
.hero__img figcaption{font-size:.8rem; color:var(--ink-60); margin-top:6px}
@media(max-width:880px){
  .hero__grid{grid-template-columns:1fr}
  .hero__img{margin-inline:calc(var(--gut) * -1)}
  .hero__img img{aspect-ratio:16/9}
  .hero__img figcaption{padding-inline:var(--gut)}
}
@media(max-width:560px){
  .facts{grid-template-columns:1fr 1fr}
  .facts li:nth-child(3){padding-left:0; border-left:0}
  .facts li:nth-child(n+3){border-top:1px solid var(--rule)}
  .hero__cta .btn{flex:1 1 100%; text-align:center}
}

/* 02 proof */
.proof{background:var(--ink); color:#fff}
.proof__grid{display:grid; grid-template-columns:repeat(4,1fr); gap:clamp(12px,2vw,28px); padding-block:clamp(18px,2.4vw,28px)}
.proof p{font-size:.88rem; color:rgb(255 255 255 / .74); max-width:none}
.proof b{display:block; color:#fff; font-family:var(--disp); font-stretch:115%; font-weight:800; font-size:clamp(1.5rem,1.1rem + 1.4vw,2.3rem); line-height:1.05}
@media(max-width:720px){.proof__grid{grid-template-columns:1fr 1fr}}

/* 03 fit */
.fit{display:grid; grid-template-columns:1fr 1fr; gap:clamp(16px,3vw,32px)}
.fit__col{border-top:2px solid var(--ink); padding-top:14px}
.fit__col--no{border-top-color:var(--rule)}
.fit h3{margin-bottom:10px}
.fit ul{display:grid; gap:8px; padding-left:1.1em}
.fit__col--yes li::marker{content:"✓  "; color:var(--blaze-ink); font-weight:700}
.fit__col--no li::marker{content:"—  "; color:var(--ink-38)}
.fit__note{margin-top:14px; font-size:.92rem}
.fit__note a{text-decoration-color:var(--blaze); text-underline-offset:3px}
@media(max-width:720px){.fit{grid-template-columns:1fr}}

/* tables */
.tbl{overflow-x:auto}
table.price,table.qc{border-collapse:collapse; width:100%; font-size:.96rem}
.price caption{caption-side:top; text-align:left; font-size:.85rem; color:var(--ink-60); padding-bottom:8px}
.price th,.price td,.qc th,.qc td{padding:11px 12px; border-bottom:1px solid var(--rule); text-align:left; vertical-align:top}
.price thead th,.qc thead th{border-bottom:2px solid var(--ink); font-size:.8rem; text-transform:uppercase; letter-spacing:.06em}
.price tbody th,.qc tbody th{font-weight:600}
.price td{font-variant-numeric:tabular-nums; white-space:nowrap}
.price td:last-child{font-weight:700}
@media(max-width:560px){
  .price thead,.qc thead{display:none}
  .price tr,.qc tr{display:grid; grid-template-columns:1fr 1fr; border-bottom:1px solid var(--rule); padding-block:8px}
  .price tbody th,.qc tbody th{grid-column:1/-1; border:0; padding:4px 0}
  .price td,.qc td{border:0; padding:2px 0}
  .price td::before,.qc td::before{content:attr(data-label); display:block; font-size:.78rem; color:var(--ink); text-transform:uppercase; letter-spacing:.05em}
}

/* 05 steps */
.steps{list-style:none; display:grid; grid-template-columns:repeat(5,minmax(0,1fr)); gap:clamp(12px,1.6vw,20px)}
.steps img{width:100%; aspect-ratio:3/2; object-fit:cover; margin-bottom:10px; background:var(--rule)}
.steps h3{font-size:1rem; margin-bottom:6px}
.steps p{font-size:.9rem; color:var(--ink-60)}
@media(max-width:1000px){.steps{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:640px){
  .steps{grid-template-columns:1fr; gap:16px}
  .steps li{display:grid; grid-template-columns:110px 1fr; gap:4px 14px; align-items:start}
  .steps img{grid-row:1 / span 2; margin:0}
}

/* 06 quality */
.qgrid{display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1.1fr); gap:clamp(20px,4vw,48px); align-items:start}
@media(max-width:880px){.qgrid{grid-template-columns:1fr}}
.qc td:last-child{font-weight:600}

/* 07 cases */
.cases{display:grid; grid-template-columns:1fr 1fr; gap:clamp(18px,3vw,36px)}
.case img{width:100%; aspect-ratio:4/3; object-fit:cover; margin-bottom:12px}
.case .mono{color:var(--blaze-ink); margin-bottom:6px}
.case h3{margin-bottom:8px}
.case p{font-size:.95rem}
@media(max-width:720px){.cases{grid-template-columns:1fr}}

/* 08 people */
.people{display:grid; grid-template-columns:1fr 1fr 1.25fr; gap:clamp(16px,3vw,32px); align-items:start; margin-bottom:18px}
.person img{width:100%; aspect-ratio:1/1; object-fit:cover; object-position:top; margin-bottom:10px}
.person h3 span{font-weight:500; color:var(--ink-60); font-size:.85em; margin-left:6px}
.person p{font-size:.92rem; color:var(--ink-60); margin-top:6px}
.company{border-top:2px solid var(--ink)}
.company div{display:grid; grid-template-columns:9.5em 1fr; gap:10px; padding:9px 0; border-bottom:1px solid var(--rule); font-size:.92rem}
.company dt{color:var(--ink-60)}
.company dd{font-weight:600}
@media(max-width:880px){.people{grid-template-columns:1fr 1fr}.company{grid-column:1/-1}}
@media(max-width:480px){.company div{grid-template-columns:1fr; gap:2px}}

/* 09 faq */
.faq-wrap{max-width:860px}
.faq-wrap details{border-bottom:1px solid var(--rule)}
.faq-wrap summary{cursor:pointer; list-style:none; padding:16px 32px 16px 0; font-family:var(--disp); font-weight:700; font-size:1.06rem; position:relative}
.faq-wrap summary::-webkit-details-marker{display:none}
.faq-wrap summary::after{content:"+"; position:absolute; right:4px; top:12px; font-size:1.4rem; color:var(--blaze-ink)}
.faq-wrap details[open] summary::after{content:"–"}
.faq-wrap details p{padding-bottom:16px; color:var(--ink-60)}

/* 10 quote */
.quote{background:var(--ink); color:#fff}
.quote__grid{display:grid; grid-template-columns:minmax(0,.8fr) minmax(0,1.2fr); gap:clamp(20px,4vw,56px); align-items:start}
.quote p{color:rgb(255 255 255 / .78)}
.quote a{color:#fff; text-decoration-color:var(--blaze)}
.quote .rfq label{color:#fff}
.quote .rfq input,.quote .rfq select,.quote .rfq textarea{border-color:transparent}
.quote .rfq__status.is-err,.quote .rfq label b{color:oklch(0.78 0.14 50)}
.quote .rfq__fit{color:var(--ink)}
.quote .rfq__done{border-color:#fff}
@media(max-width:880px){.quote__grid{grid-template-columns:1fr}}
@media(max-width:560px){
  .people{grid-template-columns:1fr; gap:18px}
  .person{display:grid; grid-template-columns:96px 1fr; gap:14px; align-items:start}
  .person img{margin:0}
  .person h3 span{display:block; margin:2px 0 0}
}

/* hero team (2026-09-26): the two people, first thing on the page */
.hero__team{border-top:2px solid var(--ink); padding-top:12px}
.hero__kr{display:flex; align-items:center; gap:8px; font-weight:700; font-size:.95rem; margin-bottom:12px}
.hero__kr img{border:1px solid var(--rule)}
.hero__faces{display:grid; grid-template-columns:1fr 1fr; gap:12px}
.hero__faces img{width:100%; aspect-ratio:4/5; object-fit:cover; object-position:top}
.hero__faces figcaption{font-size:.84rem; color:var(--ink-60); margin-top:6px; line-height:1.35}
.hero__faces figcaption b{display:block; color:var(--ink); font-size:1rem}
.hero__std{margin-top:12px; font-size:.95rem; font-weight:600; max-width:48ch}
@media(max-width:880px){.hero__faces img{aspect-ratio:1/1}}
.qfig{margin:14px 0 12px}
.qfig figcaption{font-size:.8rem; color:var(--ink-60); margin-top:6px}
.people .person{border-top:2px solid var(--ink); padding-top:10px}

/* leader cards in the hero (2026-09-26, owner's layout: photo + flag, name, role, line, fact rows) */
.leader__photo{position:relative}
.leader__photo img:first-child{width:100%; aspect-ratio:4/5; object-fit:cover; object-position:top; background:var(--rule)}
.leader__flag{position:absolute; right:0; bottom:0; width:36px; height:auto; border:3px solid #fff; border-width:3px 0 0 3px}
.leader figcaption{margin-top:10px}
.leader__name{display:block; font-family:var(--disp); font-stretch:110%; font-weight:800; font-size:1.2rem; line-height:1.1}
.leader__role{display:block; margin-top:4px; font-size:.72rem; font-weight:700; letter-spacing:.08em; text-transform:uppercase; color:var(--blaze-ink)}
.leader__line{display:block; margin-top:6px; font-size:.95rem; line-height:1.35}
.leader__facts{list-style:none; margin-top:8px; border-top:1px solid var(--rule)}
.leader__facts li{padding:6px 0; border-bottom:1px solid var(--rule); font-size:.86rem; color:var(--ink-60); line-height:1.3}
@media(max-width:880px){.leader__photo img:first-child{aspect-ratio:1/1}}
@media(max-width:420px){.leader__name{font-size:1.05rem}.leader__line{font-size:.88rem}.leader__facts li{font-size:.8rem}}
.hero__faces .leader__line{color:var(--ink)}

/* round-4 fixes */
@media(max-width:560px){.people .person{display:block}}
.hero__mini{display:none}
@media(max-width:880px){
  .hero__mini{display:flex; flex-wrap:wrap; gap:10px 18px; margin:-4px 0 14px}
  .hero__mini span{display:flex; align-items:center; gap:7px; font-size:.85rem; color:var(--ink-60)}
  .hero__mini img:first-child{width:44px; height:44px; border-radius:50%; object-fit:cover; object-position:top}
  .hero__mini b{color:var(--ink)}
  .hero__mini .f{border:1px solid var(--rule)}
}
.hero__faces .leader__flag{width:36px; height:auto; aspect-ratio:auto; object-fit:fill}

/* 같이 일하는 회사 카드(10/12). 우리가 쓴 사실 카드 — 별점·인용 없음 */
.clients{display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:clamp(14px,2vw,22px); margin-top:12px}
.clients__where{font-size:.8rem; text-transform:uppercase; letter-spacing:.1em; font-weight:700; color:var(--blaze-ink); margin-top:26px}
.client{background:var(--paper); border:1px solid var(--rule); border-radius:14px; padding:clamp(18px,2vw,24px); display:flex; flex-direction:column}
.client__stat{font-family:var(--disp); font-stretch:115%; font-weight:800; font-size:clamp(1.2rem,1rem + .8vw,1.6rem); line-height:1.12; margin-bottom:10px; color:var(--ink)}
.client > p:not(.client__stat){font-size:.95rem; color:var(--ink-60); flex:1}
.client footer{display:flex; align-items:center; gap:12px; border-top:1px solid var(--rule); margin-top:18px; padding-top:14px}
.client__ini{flex:none; width:40px; height:40px; border-radius:50%; background:oklch(0.96 0.004 80); border:1px solid var(--rule); display:grid; place-items:center; font-size:.74rem; font-weight:700; letter-spacing:.02em}
.client footer b{display:block; font-size:.95rem; line-height:1.2}
.client footer small{display:block; font-size:.8rem; color:var(--ink-60)}
.clients__note{margin-top:6px}
.clients__more{margin-top:14px; font-size:.95rem; color:var(--ink-60)}
@media(max-width:1000px){.clients{grid-template-columns:1fr 1fr}}
@media(max-width:600px){.clients{grid-template-columns:1fr}}

/* Inquiry form + /contact layout. Loaded only by pages that carry a form. */
.contact{padding-block:clamp(28px,4vw,56px) clamp(40px,6vw,80px)}
.contact__intro{max-width:760px; margin-bottom:clamp(22px,3vw,36px)}
.contact__intro h1{margin:8px 0 12px}
.lede{font-size:1.1em; color:var(--ink-60); max-width:60ch}
.contact__grid{display:grid; grid-template-columns:minmax(0,1.5fr) minmax(0,1fr); gap:clamp(24px,4vw,56px); align-items:start}
@media(max-width:880px){.contact__grid{grid-template-columns:1fr}}

.rfq{display:grid; gap:16px}
.rfq__row{display:grid; grid-template-columns:1fr 1fr; gap:16px}
@media(max-width:560px){.rfq__row{grid-template-columns:1fr}}
.rfq label{display:block; font-weight:600; font-size:.92rem}
.rfq label > input,.rfq label > select,.rfq label > textarea{display:block; margin-top:6px}
.rfq__row{align-items:end}
.rfq label b{color:var(--blaze-ink)}
.rfq input,.rfq select,.rfq textarea{
  font:inherit; font-weight:400; font-size:1rem; color:var(--ink); background:#fff;
  border:1.5px solid var(--rule); border-radius:0; padding:12px 13px; width:100%;
}
.rfq textarea{resize:vertical; min-height:140px}
.rfq input:focus,.rfq select:focus,.rfq textarea:focus{outline:none; border-color:var(--ink)}
.rfq [aria-invalid=true]{border-color:var(--blaze)}
.rfq .btn{justify-self:start; cursor:pointer; font-size:1rem}
@media(max-width:560px){.rfq .btn{justify-self:stretch; text-align:center}}
.rfq__hp{position:absolute !important; left:-9999px; width:1px; height:1px; overflow:hidden}
.rfq__fit{background:oklch(0.97 0.02 60); border-left:3px solid var(--blaze); padding:10px 14px; font-size:.92rem; max-width:none}
.rfq__note{font-size:.86rem; color:var(--ink-60)}
.rfq__status{font-size:.95rem; min-height:1.4em}
.rfq__status.is-err{color:var(--blaze-ink); font-weight:600}
.rfq__done{border:1.5px solid var(--ink); padding:clamp(20px,3vw,32px)}
.rfq__done h2{margin-bottom:10px}
.rfq__ref{margin-top:10px; color:var(--ink-60); font-size:.9rem}

.contact__side{border-top:2px solid var(--ink); padding-top:18px}
.contact__side h2{font-size:1.05rem; margin:22px 0 10px}
.who{display:flex; gap:14px; align-items:center}
.who img{width:72px; height:72px; object-fit:cover; border-radius:50%}
.who figcaption{font-size:.92rem; color:var(--ink-60)}
.who figcaption b{display:block; color:var(--ink); font-size:1rem}
.next{padding-left:1.2em; display:grid; gap:9px; font-size:.95rem}
.next b{font-weight:700}
.alt{list-style:none; display:grid; gap:6px; font-size:.95rem}
.alt a{text-decoration:underline; text-decoration-color:var(--blaze); text-underline-offset:3px}
.addr{margin-top:16px; font-size:.85rem; color:var(--ink-60)}
.promise-line{margin-top:8px; font-size:.95rem; border-left:3px solid var(--blaze); padding-left:10px}
.moq-line{margin-top:10px; font-size:.95rem; border-left:3px solid var(--blaze); padding-left:10px}
/* 첫 상품 무료 샘플 신청 (#1640) */
.fsample{margin-top:clamp(40px,6vw,72px);padding-top:clamp(28px,4vw,40px);border-top:1px solid var(--rule);max-width:860px;scroll-margin-top:90px}
.fsample .lede{margin-top:10px}
.fsample__small{margin-top:8px;color:var(--ink-60);font-size:.92rem}
.rfq--fs{margin-top:20px}
.rfq--fs textarea{min-height:0}
.rfq .rfq__check{display:flex; gap:10px; align-items:flex-start; font-weight:500}
.rfq .rfq__check input{width:18px; height:18px; padding:0; margin-top:3px; flex:none; accent-color:var(--ink)}

/* 개편 미리보기 전용 — build_renewal_preview.py 가 파일 안에 넣는다 */
.rn-banner{position:sticky;top:0;z-index:60;background:#222;color:#fff;font:600 13px/1.4 system-ui,'Malgun Gothic',sans-serif;padding:7px 16px;text-align:center}
.rn-form{border:1px solid var(--rule);border-radius:12px;padding:16px;background:#fff;max-width:560px}
.rn-form fieldset{border:0;margin:0;padding:0;display:grid;gap:6px}
.rn-form label{font-weight:600;font-size:.92rem;margin-top:4px}
.rn-form input,.rn-form select{width:100%;font:inherit;padding:11px 12px;border:1px solid var(--ink-38);border-radius:8px;background:#fff;min-width:0}
.rn-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:6px}
.rn-row input{flex:1 1 220px}
.rn-row .btn{flex:0 0 auto;white-space:nowrap}
.rn-steps{display:flex;gap:6px;list-style:none;margin:0 0 10px;padding:0;font-size:.78rem;color:var(--ink-60)}
.rn-steps li{flex:1;border-top:3px solid var(--rule);padding-top:4px}
.rn-steps li.on{border-color:var(--blaze);color:var(--ink);font-weight:700}
.rn-known{margin:0 0 4px;font-size:.92rem}
.rn-link{background:none;border:0;padding:4px;color:var(--blaze-ink);text-decoration:underline;cursor:pointer;font:inherit;font-size:.9rem}
.rn-status{margin:8px 0 0;font-size:.9rem;color:var(--blaze-ink);min-height:1em}
.rn-privacy{margin:8px 0 0;font-size:.78rem;color:var(--ink-60)}
.rn-done p{margin:0}
.rn-log{padding:24px 16px 120px;font:13px/1.5 ui-monospace,Consolas,monospace}
.rn-log h2{font:700 15px system-ui,'Malgun Gothic',sans-serif}
@media(max-width:600px){
  .rn-offer{font-size:.92rem;margin-bottom:12px}
  .rn-form{padding:12px}
  .rn-row .btn{width:100%}
}
.rn-form [hidden]{display:none !important}
.rn-form .rn-steps{margin-bottom:6px}
.rn-form [data-step="1"] label{font-size:.85rem;margin-top:0}
.rn-log li{overflow-wrap:anywhere}

/* 2판: 첫 화면 = 질문형 제목 → 오퍼 → 영상 자리 → 큰 버튼 (가운데 정렬 한 줄기) */
.rn-hero{padding-block:clamp(20px,3vw,44px) clamp(28px,4vw,56px);text-align:center}
.rn-hero__in{display:flex;flex-direction:column;align-items:center}
.rn-hero h1{font-size:clamp(1.65rem,1rem + 2.4vw,2.75rem);line-height:1.12;max-width:22ch;margin:6px 0 14px}
.rn-offer{margin:0 0 6px;color:var(--ink-60);max-width:60ch;font-size:clamp(1rem,.95rem + .25vw,1.12rem)}
.rn-offer b{color:var(--ink)}
.rn-proof{margin:0 0 18px;font-size:clamp(1rem,.95rem + .3vw,1.15rem)}
.rn-proof b{font-weight:800;color:var(--blaze-ink)}
.rn-video{position:relative;width:min(100%,720px);aspect-ratio:16/9;background:#1d1d1d;border-radius:10px;display:grid;place-items:center;overflow:hidden;margin:0 0 20px}
@media(min-width:900px){.rn-video{width:clamp(604px,52vw,720px)}}
.rn-video__play{width:76px;height:76px;border-radius:50%;background:var(--blaze);position:relative}
.rn-video__play::after{content:"";position:absolute;left:31px;top:23px;border-left:22px solid #fff;border-top:15px solid transparent;border-bottom:15px solid transparent}
.rn-video__label{position:absolute;bottom:12px;left:0;right:0;color:#cfcfcf;font-size:.82rem}
.rn-btn{background:var(--blaze);border-color:var(--blaze);color:#fff}
.rn-btn--big{font-size:clamp(1.05rem,1rem + .3vw,1.2rem);padding:16px 36px;min-width:min(100%,360px)}
.rn-hero__note{margin:10px 0 0;font-size:.85rem;color:var(--ink-60)}
.rn-topcta{background:var(--blaze);border-color:var(--blaze);color:#fff}
.rn-topcta:hover{background:var(--ink);border-color:var(--ink)}
.rn-proofbar p{margin:0;padding-block:clamp(14px,2vw,22px);text-align:center;font-size:clamp(1rem,.95rem + .3vw,1.2rem)}
.rn-proofbar b{font-size:1.3em}
.rn-get{list-style:none;padding:0;margin:18px 0 0;display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
.rn-get li{background:#fff;border:1px solid var(--rule);border-radius:12px;padding:18px;display:grid;gap:6px}
.rn-get b{font-size:1.15rem}
.rn-get span{color:var(--ink-60)}
.rn-cta{display:flex;flex-direction:column;align-items:center;gap:6px;margin-top:clamp(22px,3vw,36px)}
.rn-cta__note{margin:0;font-size:.85rem;color:var(--ink-60)}
.rn-formsec__in{max-width:640px}
.rn-formsec .rn-form{max-width:none}
.rn-founders{margin:18px 0 24px;max-width:720px}
.rn-final{text-align:center}
@media(max-width:720px){.rn-get{grid-template-columns:1fr}}
@media(max-width:600px){
  .rn-hero{padding-top:14px}
  .rn-hero .hero__kicker{display:none}
  .rn-video__play{width:58px;height:58px}
  .rn-video__play::after{left:23px;top:17px;border-left-width:17px;border-top-width:12px;border-bottom-width:12px}
  .rn-btn--big{width:100%}
}
/* 2판: 메뉴 버튼 글자가 길어 메뉴가 두 줄로 접히던 것 → 넓은 화면에선 한 줄, 첫 화면은 화면 높이에 맞춤 */
@media(min-width:1000px){
  .top{padding-block:14px}
  .top nav{flex-wrap:nowrap;gap:clamp(12px,1.4vw,22px)}
  .top nav a{white-space:nowrap}
  .rn-hero .hero__kicker{display:none}
  .rn-hero h1{max-width:28ch;font-size:clamp(1.9rem,1rem + 1.6vw,2.5rem);margin-top:0}
  .rn-video{width:min(720px,max(604px,calc((100svh - 480px) * 1.778)))}
}
@media(min-width:1000px){.rn-hero{padding-top:16px;padding-bottom:28px}.rn-hero h1{margin-bottom:10px}.rn-proof{margin-bottom:12px}.rn-video{margin-bottom:14px}.rn-btn--big{padding-block:14px}}

/* 2판-b: 영상이 세로 쇼츠(9:16) → 데스크톱 2단(왼쪽 영상, 오른쪽 제목·버튼), 폰은 제목 → 영상 → 버튼 */
.rn-video{width:min(72vw,300px);aspect-ratio:9/16;background:#1d1d1d;border-radius:12px;overflow:hidden;display:block;margin:4px 0 18px}
.rn-video iframe{width:100%;height:100%;border:0;display:block}
@media(min-width:900px){
  .rn-hero{text-align:left}
  .rn-hero__in{display:grid;grid-template-columns:auto minmax(0,1fr);grid-template-areas:"vid head" "vid act";column-gap:clamp(32px,4vw,64px);align-items:center;justify-content:center;max-width:1100px}
  .rn-hero__head{grid-area:head;align-self:end}
  .rn-hero__act{grid-area:act;align-self:start}
  .rn-video{grid-area:vid;height:min(640px,calc(100svh - 170px));width:auto;margin:0}
  .rn-hero h1{max-width:18ch}
  .rn-hero .rn-btn--big{min-width:0}
}
@media(max-width:899px){.rn-video{width:min(64vw,250px)}}
.rn-video__thumb{position:relative;display:grid;place-items:center;width:100%;height:100%}
.rn-video__thumb img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.rn-video__thumb .rn-video__play{position:relative;z-index:1}
.rn-video__thumb .rn-video__label{z-index:1}

/* 2판-c: Fred 직접 지시(10/12) — 호르모지 홈 실측(폭 1280) 글꼴·크기, 색은 우리 주황 그대로 */
body,.rn-hero,.sec,.proof{font-family:'Poppins',var(--body),sans-serif}
body{font-size:16px;line-height:24px}
.sec p,.sec li,.sec dd,.sec dt,.sec td,.sec th,.sec summary{font-family:'Poppins',var(--body),sans-serif}
.rn-hero h1{font-family:'Poppins',sans-serif;font-weight:800;font-size:40px;line-height:46px;text-transform:uppercase;letter-spacing:0;font-stretch:100%}
@media(min-width:900px){.rn-hero h1{max-width:20ch}}
.rn-offer,.rn-proof{font-family:'Poppins',sans-serif;font-weight:400;font-size:18px;line-height:27px}
.rn-proof b,.rn-offer b{font-weight:700}
.sec h2,.rn-final h2{font-family:'Poppins',sans-serif;font-weight:800;text-transform:uppercase;font-size:30px;line-height:36px;letter-spacing:0;font-stretch:100%}
.sec h3{font-family:'Poppins',sans-serif;font-weight:700;font-stretch:100%}
.client__stat{font-family:'Poppins',sans-serif;font-weight:800;font-stretch:100%}
.rn-btn{font-family:'Poppins',sans-serif;font-weight:700;font-size:20px;line-height:1;border-radius:100px;min-height:55px;width:min(100%,420px);display:inline-flex;align-items:center;justify-content:center;padding:0 28px;text-transform:none}
.rn-btn--big{font-size:20px;padding:0 28px;min-width:0}
.rn-topcta{font-family:'Poppins',sans-serif;font-weight:700;border-radius:100px}
.qbar{font-family:'Poppins',sans-serif}
.rn-form .btn{font-family:'Poppins',sans-serif;font-weight:700;border-radius:100px}
@media(max-width:600px){
  .rn-hero h1{font-size:29px;line-height:35px}
  .sec h2,.rn-final h2{font-size:24px;line-height:30px}
  .rn-offer,.rn-proof{font-size:16px;line-height:24px}
}
/* 고객 카드 5장 */
@media(min-width:1000px){.rn-clients5{grid-template-columns:repeat(5,1fr)}}
/* 창업자: 사진 두 장 가운데, 회사 정보 표는 콘텐츠 폭 전체로 가로 펼침 */
#people .rn-founders{margin-inline:auto}
#people .people{display:block}
#people .company{display:grid;grid-template-columns:repeat(3,1fr);column-gap:clamp(16px,3vw,40px);border-top:2px solid var(--ink)}
#people .company div{grid-template-columns:1fr;gap:2px}
@media(max-width:880px){#people .company{grid-template-columns:1fr 1fr}}
@media(max-width:560px){#people .company{grid-template-columns:1fr}}
.sec .answer,.sec .lede{font-size:16px;line-height:24px}
@media(max-width:600px){.rn-hero__act{width:100%}.rn-btn--big{width:100%}}
#people .company div{align-content:start} @media(min-width:1000px){.rn-clients5 .client__stat{font-size:1.4rem;line-height:1.2}}
/* 폰 첫 화면에 큰 버튼이 보이게 영상 높이를 화면 높이에 맞춰 줄인다(매니저 10/12) */
@media(max-width:899px){.rn-video{height:clamp(200px,calc(100svh - 630px),444px);width:auto;margin-bottom:14px}}

/* ---- HZ 새 판 추가분 (웹제작팀원 2026-10-12) ---- */
/* [자리] 표시: 회의 #4 결론 뒤 채울 문구. 배포 전에 .ph가 하나라도 남으면 build_home.py가 경고한다 */
.ph{outline:2px dashed #d39b00; outline-offset:2px; background:#fff3c4; color:#5a4300; border-radius:3px; padding:0 .2em}
.btn .ph{background:transparent; color:inherit; outline-color:#ffd65a}
.foot__grid{grid-template-columns:1.5fr 1fr 1fr 1fr 1.2fr}
@media(max-width:1000px){.foot__grid{grid-template-columns:1fr 1fr 1fr}.foot__grid > :first-child{grid-column:1/-1}}
@media(max-width:600px){.foot__grid{grid-template-columns:1fr 1fr}}
.rn-hint{font-size:.85rem; color:var(--ink-2, #555); margin:6px 0 10px}
.rn-check{display:flex; gap:8px; align-items:flex-start; font-size:.9rem; margin:12px 0}
.rn-check input{width:auto; flex:0 0 auto; margin-top:4px; padding:0}
.rn-form input[type=file]{width:100%; padding:10px 0}
.rn-form select,.rn-form input:not([type=checkbox]):not([type=file]){width:100%; max-width:100%; box-sizing:border-box}
.rn-err{color:#b00020; font-size:.85rem}
.hz-log{padding:24px 16px 120px; font:13px/1.5 ui-monospace,Consolas,monospace}
.hz-log h2{font:700 15px system-ui,'Malgun Gothic',sans-serif}
.hz-log li{overflow-wrap:anywhere}
.hz-consent{position:fixed; left:12px; right:12px; bottom:76px; z-index:9999; max-width:620px; margin:0 auto; display:flex; flex-wrap:wrap; align-items:center; gap:8px 10px; padding:12px 14px; background:#1c1c1c; color:#f4f4f4; font:14px/1.45 system-ui,sans-serif; border-radius:10px; box-shadow:0 6px 24px rgba(0,0,0,.25)}
.hz-consent p{flex:1 1 100%; margin:0}
.hz-consent a{color:inherit}
.hz-consent button{flex:1 1 0; min-width:96px; font:inherit; padding:8px 12px; border-radius:6px; border:1px solid #f4f4f4; background:transparent; color:inherit; cursor:pointer}
html,body{overflow-x:hidden}
/* 10-14 HZ(Fred 승인): 견적 구역 가운데 정렬. 상자 2개는 버튼과 같은 중심선, 폰에서는 위아래로 쌓여도 가운데 */
#get h2,#get .answer{text-align:center;margin-left:auto;margin-right:auto}
#get .rn-get{grid-template-columns:repeat(2,minmax(0,1fr));max-width:760px;margin-left:auto;margin-right:auto}
@media(max-width:720px){#get .rn-get{grid-template-columns:1fr;max-width:480px}}
/* 10-14 HZ(Fred 승인): 첫 화면 영상은 그림 먼저, 누르면 그 자리에서 재생 */
button.rn-video__thumb{border:0;padding:0;margin:0;background:#1d1d1d;cursor:pointer;font:inherit;color:inherit}
button.rn-video__thumb:focus-visible{outline:3px solid var(--blaze);outline-offset:-3px}
button.rn-video__thumb:hover .rn-video__play{transform:scale(1.06)}
/* 10-14 HZ: 견적 버튼 글자가 두 줄로 꺾여도 가운데(375px 폭 등) */
.rn-btn{text-align:center;line-height:1.15;padding-block:10px}
.rn-cta{text-align:center}
