/* sasha rovelle mockups v3
   Every px value below is a Didier Dubot KR mobile measurement
   (docs/research/08-didierdubot-mobile-metrics.md, "DD" + section number).
   Differences from DD: serif wordmark (Newsreader; all other text is DD's
   Pretendard), pure #000 ink, product, hero video, legal blocks.
   Mapping table: design/DESIGN.md section 4. */

/* ---------- 1. tokens ---------- */
:root {
  /* color: 2 base colors + DD-measured greys only (DD 2-2) */
  --ink: #000000;
  --bg: #FFFFFF;
  --grey-text: #6E6E6E;     /* DD footer legal text, 5.1:1 */
  --grey-strong: #3E3A39;   /* DD footer accordion text, PDP accordion line, 11.0:1 */
  --grey-bar: #9E9EA0;      /* DD footer policy divider bar (not used for text: 2.7:1) */
  --line-block: #D4D4D8;    /* DD footer accordion block bottom line */
  --line-table: #D6D3D1;    /* DD info table row line */
  --line-drawer: #DDDDDD;   /* DD nav drawer utility top line */
  --surface-img: #F5F5F5;   /* DD product image bg, info table label cell */
  --surface-footer: #F7F7F7;/* DD inner-page footer bg */
  --surface-panel: #FAFAF9; /* DD accordion open panel bg */
  --dot: rgba(62, 58, 57, 0.6); /* DD card swipe dot */
  --dot-on-dark: rgba(255, 255, 255, 0.6); /* same dot on a dark slide (v4 fix: black dots vanish on the videos, p3, p4) */

  /* type (founder 2026-10-14 21:40): serif for the wordmark only, everything else DD's Pretendard (DD 2-1) */
  --f-body: "Pretendard Variable", Pretendard, -apple-system, system-ui, "Apple SD Gothic Neo", "Malgun Gothic", sans-serif;
  --f-wm: "Newsreader", "Times New Roman", serif;
  --w-light: 300;           /* DD body w300 (DD 2-1) */
  --w-medium: 500;          /* DD product name, spec line, active tab, first policy link */
  --w-bold: 700;            /* DD [business info] link w700 (DD 10) */
  --ls: -0.65px;            /* DD body tracking, inherited everywhere (DD 2-1) */

  /* spacing: 8px grid (v4) */
  --sp-1: 8px;              /* label -> control, button pair, card gaps */
  --sp-2: 16px;             /* rows inside a group, horizontal gutter */
  --sp-4: 32px;             /* between groups */
  --gutter: 16px;

  /* control system v4 (founder 2026-10-14: every box unified, legible, minimal) */
  --ctl-h: 48px;            /* inputs, segmented options, colour pills, checkbox rows (an input sharing a row with a button takes --btn-h) */
  --btn-h: 52px;            /* primary + secondary buttons */
  --btn-r: 26px;            /* button pill radius = btn-h / 2 */
  --acc-h: 56px;            /* accordion rows */
  --box: 18px;              /* checkbox square */
  --chev: 14px;             /* accordion chevron */
  --ctl-px: 16px;

  /* fixed stack (DD 3, 4) */
  --bar-h: 32px;
  --hdr-h: 48px;
  --top-stack: 80px;
}

/* ---------- 2. base ---------- */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body {
  margin: 0;
  background: var(--bg);
  color: var(--ink);
  font-family: var(--f-body);
  font-size: 13px;
  line-height: 19.5px;
  font-weight: var(--w-light);
  letter-spacing: var(--ls);
  font-optical-sizing: auto;
  font-synthesis: none;
  word-break: keep-all;
  overflow-wrap: break-word;
  overflow-x: hidden;
}
h1, h2, p, ul, ol, figure { margin: 0; padding: 0; }
ul, ol { list-style: none; }
a { color: inherit; text-decoration: none; }
img, video, svg { display: block; max-width: 100%; }
button, input, select { font: inherit; letter-spacing: inherit; color: inherit; }
button { background: none; border: 0; padding: 0; cursor: pointer; }
:focus-visible { outline: 1px solid currentColor; outline-offset: 2px; }
.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}
.skip {
  position: absolute; left: 16px; top: -100px; z-index: 60;
  padding: 8px 12px; background: var(--bg); color: var(--ink);
}
.skip:focus { top: 40px; }

/* ---------- 3. notice bar (DD 3: fixed, 32px, inverse, 13px w300) ---------- */
.notice {
  position: fixed; top: 0; left: 0; right: 0; z-index: 50;
  display: block;
  height: var(--bar-h);
  padding: 0 32px;
  background: var(--ink);
  color: var(--bg);
  font-size: 13px;
  line-height: 32px;
  text-align: center;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* ---------- 4. header (DD 4: 48px, padding 10px 16px, space-between) ---------- */
.hdr {
  position: fixed; top: var(--bar-h); left: 0; right: 0; z-index: 50;
  height: var(--hdr-h);
  padding: 10px 16px;
  display: grid; grid-template-columns: 1fr auto 1fr; align-items: center;  /* founder 2026-10-14: wordmark centered */
  background: var(--bg);
  color: var(--ink);
}
.hdr > * { grid-row: 1; }  /* one row: without this the wordmark (column 2, placed first) leaves gnb + icons on row 2 at >= 1024px */
.hdr--over { background: transparent; color: var(--bg); }
.hdr--over.is-solid,
.nav-open .hdr { background: var(--bg); color: var(--ink); }
.top-spacer { height: var(--top-stack); }

/* wordmark: ink box 120 x 13 = DD logo.svg box 119 x 13 (DD 4) */
.wm {
  display: block;
  grid-column: 2; justify-self: center;
  width: auto;
  height: auto;
  line-height: 1;
  font-family: var(--f-wm);
  font-weight: 400;
  font-size: 20px;  /* founder 2026-10-14: slightly larger than DD 17.2px */
  font-variation-settings: "opsz" 72;
  letter-spacing: 2.2px;
  white-space: nowrap;
}
.wm span { position: relative; top: 1px; }
.hdr .wm { position: relative; }
.hdr .wm::after { content: ""; position: absolute; left: 0; right: 0; top: -15.5px; bottom: -15.5px; }  /* 44px hit, box stays 120 x 13 */

.hdr-icons { grid-column: 3; justify-self: end; display: flex; align-items: center; gap: 12px; }
/* desktop-only inline nav + utility labels (DD 8-9 desktop header); hidden below 1024px */
.gnb, .hdr-util { display: none; }
.gnb { grid-column: 1; justify-self: start; }
.bag { position: relative; display: block; width: 28px; height: 20px; margin-right: 0; }
/* mobile: burger sits left of the centered wordmark, bag right (founder 2026-10-14) */
@media (max-width: 1023px) {
  .hdr .burger { position: absolute; left: 16px; top: 50%; margin-top: -10px; }
}
.bag svg { width: 20px; height: 20px; }
.bag-count { position: absolute; top: -6px; left: 21px; font-size: 12px; line-height: 12px; }
/* hit area 44px tall, visual 20px (DD): bag 52x44, burger 44x44; the empty search slot keeps them apart */
.bag::after, .burger::after { content: ""; position: absolute; inset: -12px; }
.burger { position: relative; display: block; width: 20px; height: 20px; }
.burger i {
  position: absolute; left: 0; width: 20px; height: 1px; background: currentColor;
  transition: transform 100ms, opacity 100ms, top 100ms;
}
.burger i:nth-child(1) { top: 4px; }
.burger i:nth-child(2) { top: 50%; }
.burger i:nth-child(3) { top: 16px; }
.nav-open .burger i:nth-child(1) { top: 50%; transform: rotate(135deg); }
.nav-open .burger i:nth-child(2) { opacity: 0; }
.nav-open .burger i:nth-child(3) { top: 50%; transform: rotate(45deg); }

/* ---------- 5. nav drawer (DD 5) ---------- */
.nav-open { overflow: hidden; }
.nav-drawer {
  position: fixed; inset: 0; z-index: 40;
  display: flex; flex-direction: column;
  padding: 68px 16px 0;          /* DD pt-10 + mt-7 */
  background: var(--bg);
  overflow-y: auto;
}
.nav { padding: 16px 0; }
.nav-group + .nav-group { margin-top: 40px; }
.nav-group a { display: block; padding: 10px 0; font-size: 15px; line-height: 22.5px; font-weight: 500; }
.nav-util {
  position: sticky; bottom: 0;
  margin-top: auto;
  padding: 20px 0;
  border-top: 1px solid var(--line-drawer);
  background: var(--bg);
  display: grid; grid-template-columns: 1fr 1fr; column-gap: 10px;
}
.nav-util a { display: flex; align-items: center; gap: 12px; height: 40px; font-size: 13px; }
.nav-util svg { width: 22px; height: 22px; }

/* ---------- 6. video hero (DD 6-3 + task spec) ---------- */
.hero {
  position: relative;
  height: 100vh;
  height: 100svh;
  overflow: hidden;
  background: var(--ink);
}
.hero-video, .hero-poster { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
/* poster <img> sits under the video; until the video is actually playing (or whenever it is paused)
   the video is hidden so the poster shows instead of the near-black first frame */
.hero.is-paused .hero-video { opacity: 0; }

/* ---------- 6-1. home product panel (DD 6-1 100dvh full-bleed panel, 6-2 "between" text block) ---------- */
.panel-link {
  position: relative; display: block;
  height: 100vh; height: 100svh; min-height: 560px;
  overflow: hidden;
  color: var(--bg);              /* DD 6-2: white text on the image */
}
.panel-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }  /* DD bg-cover; white-silver video (v4), centred */
.panel-txt {
  position: absolute; left: 0; right: 0; bottom: 48px;   /* DD 6-2 */
  padding: 0 36px;
  display: flex; justify-content: space-between; align-items: flex-end; gap: 16px;
}
.panel-left, .panel-eyebrow, .panel-title, .panel-price, .panel-more { display: block; }
.panel-eyebrow { font-size: 12px; line-height: 18px; }                          /* founder 2026-10-14: small English eyebrow (DD eyebrow w300) */
.panel-title { margin-top: 2px; font-size: 22px; line-height: 28px; font-weight: 400; }  /* founder: concise English title, smaller than DD 30/36 w400 */
.panel-price { margin-top: 6px; font-size: 13px; line-height: 20px; }
.panel-more { flex: 0 0 auto; font-size: 14px; line-height: 20px; font-weight: 200; text-decoration: underline; text-underline-offset: 2px; }  /* DD 6-2 link 14/20 w200 underline */

/* ---------- 7. product card (DD 7-2) ---------- */
.card { display: block; }
.card-img { aspect-ratio: 5 / 6; background: var(--surface-img); overflow: hidden; }
.card-img img { width: 100%; height: 100%; object-fit: cover; }
.card-txt { padding: 16px 8px; }
.card-name {
  font-size: 13px; line-height: 19.5px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;  /* one line, ellipsis (DD 7-2, v4) */
  margin-bottom: 10px;
}
.card-price { font-size: 13px; line-height: 19.5px; font-weight: 600; }
.card-prelaunch { font-weight: 400; }  /* pre-launch label (2026-10-15 founder): name weight, not price weight */

/* ---------- 8. PDP gallery (DD 8-2: height = innerHeight - 260) ---------- */
.gallery-wrap { position: relative; }
.gallery {
  display: flex;
  height: calc(100vh - 260px);
  height: calc(100svh - 260px);
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scrollbar-width: none;
  background: var(--surface-img);
}
.gallery::-webkit-scrollbar { display: none; }
.slide { flex: 0 0 100%; scroll-snap-align: start; background: var(--surface-img); }
.slide img, .slide video { width: 100%; height: 100%; object-fit: cover; }
/* product photos (assets/product): object-position keeps the pendant in frame in every crop
   (gallery 375x552 and 700x770, card 5:6, thumbs 1:1 / 5:6) */
img[src$="p1-tray.jpg"] { object-position: 52% 58%; }
img[src$="p2-closeup.jpg"] { object-position: 70% 50%; }
.slide img[src$="p3-glass.jpg"] { object-position: 90% 58%; }
img[src$="p4-fur.jpg"] { object-position: 100% 100%; }
.gallery-dots {
  position: absolute; left: 0; right: 0; bottom: 12px;
  display: flex; justify-content: center; gap: 8px;
}
.gallery-dots i { width: 4px; height: 4px; border-radius: 9999px; background: var(--dot); }
.gallery-dots i.is-active { background: var(--ink); }
/* dark slide under the dots (data-tone="dark": both videos, p3-glass, p4-fur): white dots, palette stays black / white */
.gallery-dots.on-dark i { background: var(--dot-on-dark); }
.gallery-dots.on-dark i.is-active { background: var(--bg); }

/* ---------- 9. buy box (DD 8-4 sizes) ---------- */
.buy { margin: 16px 16px 0; scroll-margin-top: calc(var(--top-stack) + 16px); }
.pdp-name { font-size: 15px; line-height: 24px; font-weight: var(--w-medium); }  /* v4: 15/24 w500 */
.pdp-price { font-size: 15px; line-height: 24px; font-weight: 400; }               /* v4: 15/24 w400 */
.pdp-spec { margin-top: var(--sp-2); font-size: 13px; line-height: 20px; font-weight: 400; }  /* v4 meta line 13/20 w400 */
.pdp-spec + .pdp-spec { margin-top: 0; }                                            /* second meta line ("chain 42cm") stacks */
.opts { margin-top: var(--sp-4); display: grid; row-gap: var(--sp-2); }             /* group 32, rows 16 */

/* option group: label 14/20 above, controls 8px below (colour pills, waitlist tabs) */
.opt-group { margin: 0; padding: 0; border: 0; min-width: 0; }
.opt-label { float: left; width: 100%; padding: 0; margin-bottom: var(--sp-1); font-size: 14px; line-height: 20px; font-weight: 400; }
.opt-label + * { clear: both; }

/* checkbox row (consents): real 44px row, 18px box, 1px #000, label centred on the box */
.check { display: flex; align-items: center; gap: 8px; min-height: var(--ctl-h); font-size: 14px; line-height: 20px; font-weight: 400; cursor: pointer; }
.check input { position: absolute; opacity: 0; width: 1px; height: 1px; margin: 0; }
.check-box { position: relative; flex: 0 0 var(--box); width: var(--box); height: var(--box); border: 1px solid var(--ink); background: var(--bg); }
.check input:checked + .check-box::after { content: ""; position: absolute; inset: 4px; background: var(--ink); }
.check input:focus-visible + .check-box { outline: 1px solid var(--ink); outline-offset: 2px; }

/* ---------- 10. buttons (v4: one height 52px, pill radius 26px, 15px w500) ---------- */
.btn {
  display: flex; align-items: center; justify-content: center;
  width: 100%;
  height: var(--btn-h); padding: 0 var(--ctl-px);
  border-radius: var(--btn-r);
  font-size: 15px; line-height: 20px; font-weight: var(--w-medium);
  cursor: pointer;
}
.btn-primary { background: var(--ink); color: var(--bg); }
.btn-secondary { border: 1px solid var(--ink); background: var(--bg); color: var(--ink); }
.btn-disabled, .btn[disabled] { background: #DBDBDB; color: var(--bg); cursor: default; }
.btn-secondary[disabled] { border-color: #DBDBDB; }  /* DD 8-8 disabled colour, no black ring around the grey fill */
.buy-ctas { margin-top: var(--sp-4); display: grid; gap: var(--sp-1); }
.opts .buy-ctas { margin-top: var(--sp-2); }  /* 16 row gap + 16 = 32 group gap from the colour group */

/* sticky buy bar (DD 8-7 layout; v4: 52px button + 8px above and below = 68px) */
.buybar {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 30;
  height: 68px; padding: var(--sp-1) var(--gutter);
  transition: transform 200ms;
}
.buybar.is-hidden { transform: translateY(100%); }
.buybar-sep { width: 1px; height: 14px; margin: 0 12px; background: var(--bg); }
.page-pdp .site-footer { padding-bottom: 68px; }  /* sticky bar reserve inside the #F7F7F7 footer surface */

/* ---------- 11. inputs (cart / checkout / waitlist; DD has no form page) ----------
   v4 control system: input = segmented option = colour pill = checkbox row = 48px, pill radius,
   1px #000, 16px side padding, text and label 14/20 w400 */
.field { display: grid; gap: var(--sp-1); }
.field-label { font-size: 14px; line-height: 20px; font-weight: 400; }
.input {
  display: block; width: 100%; min-width: 0;
  height: var(--ctl-h); padding: 0 var(--ctl-px);
  border: 1px solid var(--ink); border-radius: 9999px;
  background: var(--bg); color: var(--ink);
  font-size: 14px; line-height: 20px; font-weight: 400;
  -webkit-appearance: none; appearance: none;
}
.ctl-row { display: flex; gap: var(--sp-1); }                /* input + secondary button on one line (coupon, address) */
.ctl-row .btn { width: auto; flex: 0 0 auto; height: var(--btn-h); }  /* every button is 52px (v4 fix): the row is one 52px line */
.ctl-row .input { height: var(--btn-h); }                     /* input beside a button matches it */
.stack { display: flex; flex-direction: column; gap: 32px; }

/* ---------- 12. accordion (DD 8-5) ---------- */
.acc { margin: var(--sp-4) var(--gutter) 0; }   /* v4: group gap 32 */
.acc-btn {
  width: 100%; height: var(--acc-h);
  display: flex; justify-content: space-between; align-items: center;
  border-bottom: 1px solid var(--ink);
  font-size: 14px; line-height: 20px; font-weight: 400; text-align: left;
}
.acc-btn svg { width: var(--chev); height: var(--chev); transition: transform 100ms; }
.ft-acc-btn svg { width: 20px; height: 20px; transition: transform 100ms; }
.acc-btn[aria-expanded="true"] svg { transform: rotate(180deg); }
.acc-panel { padding: 16px; background: var(--surface-panel); font-size: 12px; line-height: 16px; }
.info-table { width: 100%; border-collapse: collapse; background: var(--bg); font-size: 12px; line-height: 16px; }
.info-table tr { border-top: 1px solid var(--line-table); }
.info-table tr:last-child { border-bottom: 1px solid var(--line-table); }
.info-table th { width: 25%; padding: 12px 4px; background: var(--surface-img); font-weight: var(--w-light); text-align: center; vertical-align: middle; }
.info-table td { padding: 12px 0 12px 16px; vertical-align: middle; }
.acc-list li + li { margin-top: 8px; }
.acc-link { position: relative; display: inline-block; margin-top: 8px; padding: 4px 0; text-decoration: underline; text-underline-offset: 2px; }
.acc-link::after { content: ""; position: absolute; left: -4px; right: -4px; top: -10px; bottom: -10px; }  /* 44px hit, visual unchanged */

/* ---------- 13. progress steps (order status; DD has none, uses DD tab metrics 8-5) ---------- */
.steps { display: grid; gap: 0; }
.step { display: flex; justify-content: space-between; padding: 8px 0; font-size: 13px; line-height: 19.5px; border-bottom: 1px solid var(--line-table); }
.step[aria-current="step"] { font-weight: var(--w-medium); }  /* DD active tab w500 */

/* ---------- 14. footer (DD 10) ---------- */
.site-footer { margin-top: 32px; background: var(--bg); }
.page-inner .site-footer { background: var(--surface-footer); }
.ft-acc { padding: 24px 16px 16px; border-bottom: 1px solid var(--line-block); color: var(--grey-strong); }
.ft-acc-btn { position: relative; width: 100%; height: 36px; display: flex; justify-content: space-between; align-items: center; font-size: 14px; line-height: 20px; font-weight: 400; color: var(--grey-strong); }
.ft-acc-btn svg { transition-duration: 300ms; }
.ft-acc-btn::before { content: ""; position: absolute; left: 0; right: 0; top: -8px; bottom: 0; }   /* 44px hit, row stays 36px */
.ft-acc-btn ~ .ft-acc-btn::before { top: 0; bottom: -8px; }
.ft-acc-btn[aria-expanded="true"] svg { transform: rotate(180deg); }
.ft-acc-panel li { padding-left: 4px; font-size: 13px; line-height: 36px; border-bottom: 1px solid var(--surface-panel); }
.ft-legal { padding: 16px 16px 32px; font-size: 12px; line-height: 16px; color: var(--grey-text); }
.ft-policy { display: flex; align-items: center; gap: 10px; padding: 8px 0; margin-bottom: 28px; font-size: 13px; line-height: 19.5px; color: var(--grey-strong); }
.ft-policy a:first-child { font-weight: var(--w-medium); }  /* DD 10 first policy link w500 */
.ft-policy a { position: relative; white-space: nowrap; }  /* v6: a policy link never splits (ja 320 "riyou kiya / ku") */
.ft-policy a::after { content: ""; position: absolute; left: -5px; right: -5px; top: -12.25px; bottom: -12.25px; }  /* 44px hit (row 19.5 + 8 pad above, 28 below) */
.ft-bar { width: 1px; height: 14px; background: var(--grey-bar); }
.ft-wm { width: 112px; height: 12.2px; line-height: 12.2px; font-size: 16.05px; letter-spacing: 1.83px; margin-bottom: 32px; color: var(--ink); }
.ft-biz { font-size: 11px; line-height: 16px; font-weight: 200; }  /* DD 10 11/16 w200 */
.ft-biz b { font-weight: var(--w-bold); }
.ft-biz a { position: relative; white-space: nowrap; }  /* v6: [verify] links move to the next line whole (ko 375/390 "[gaip sasil / hwagin]") */
.ft-biz a::after { content: ""; position: absolute; left: -4px; right: -4px; top: -6.5px; bottom: -6.5px; }  /* 24px hit (digest R26); 44px would cover the next legal lines */
.ft-copy { margin-top: 16px; font-size: 12px; line-height: 16px; }
.ft-sns { margin-top: 24px; display: flex; gap: 16px; color: var(--grey-strong); }
.ft-sns a { position: relative; display: block; }
.ft-sns a::after { content: ""; position: absolute; inset: -10px; }  /* 44px hit, icon 24px */
.ft-sns svg { width: 24px; height: 24px; }

/* ---------- 15. site state switch (mockup: ?state=waitlist) ---------- */
body[data-state="waitlist"] [data-state-only="open"] { display: none; }
body:not([data-state="waitlist"]) [data-state-only="waitlist"] { display: none; }

/* ---------- 16. inner pages (about, guide, shop, waitlist, cart, checkout, order status) ---------- */
/* any in-page anchor target clears the fixed stack (80px mobile, 109px desktop) + 16px */
:target { scroll-margin-top: calc(var(--top-stack) + 16px); }

/* 16-1. Latin page title = DD 5 nav level-1 label 15/22.5 w500, py 10px (row 42.5px), gutter 16px (DD 2-3) */
.page-title { padding: 10px 16px; font-size: 15px; line-height: 22.5px; font-weight: 500; }

/* 16-2. tab row = DD 7-1 category tabs: container 4px 10px 12px, 13px, gap 24px, py 8px.
   4px side padding with -4px margin widens the tap target to 31px without moving glyphs (digest R26) */
.tabs, .guide-tabs {
  display: flex; gap: 24px;
  padding: 4px 10px 12px;
  overflow-x: auto; white-space: nowrap; scrollbar-width: none;
}
.tabs::-webkit-scrollbar, .guide-tabs::-webkit-scrollbar { display: none; }
.tabs a, .guide-tabs a { position: relative; padding: 8px 4px; margin: 0 -4px; font-size: 13px; line-height: 19.5px; }
.tabs a::after, .guide-tabs a::after { content: ""; position: absolute; left: 0; right: 0; top: -4px; bottom: -4px; }  /* 43.5px hit inside the 4px / 12px container padding */

/* 16-3. 2-column grid = DD 7-2: padding-x 8px, row + column gap 8px.
   Home (v4): six cards right under the hero, 32px above and below, no visible title */
.home-grid { padding: var(--sp-4) 0; }
.grid-2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; padding: 0 8px; }  /* minmax(0) so a nowrap name cannot widen a track: 175.5px at 375 */
.grid-2 .card-img svg { width: 100%; height: 100%; }

/* 16-4. guide */
.guide-sec { scroll-margin-top: calc(var(--top-stack) + 16px); }
.guide-mto { margin: 24px 16px 0; font-size: 13px; line-height: 20px; }  /* + card text 26px = ~48px visual gap */
.guide-policy { margin: 48px 16px 0; }
.guide-lookup { margin-top: 32px; }

/* 16-5. waitlist: DD 8-4 info block margin 32px 16px, 40px below the price block;
   contact tabs = control system: two 42px secondary pills, the checked one filled #000 */
.wl { margin: 32px 16px 0; }
.wl-form, .wl-done { margin-top: 40px; }
.wl-tabs { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-1); }
.pills { display: grid; gap: var(--sp-1); }              /* PDP colour pills: one per row (the white label is too long for half width) */
.wl-tab, .pill { position: relative; display: block; cursor: pointer; }
.wl-tab input, .pill input { position: absolute; opacity: 0; width: 1px; height: 1px; margin: 0; }
.wl-tab span, .pill span {
  display: flex; align-items: center; justify-content: center;
  height: var(--ctl-h); padding: 0 var(--ctl-px);
  border: 1px solid var(--ink); border-radius: 9999px;
  font-size: 14px; line-height: 20px; font-weight: 400; white-space: nowrap;
}
.wl-tab input:checked + span, .pill input:checked + span { background: var(--ink); color: var(--bg); }
.wl-tab input:focus-visible + span, .pill input:focus-visible + span { outline: 1px solid var(--ink); outline-offset: 2px; }
.wl-consents { display: grid; gap: 0; }                  /* 44px checkbox rows stack */
.wl-consent { display: flex; justify-content: space-between; align-items: center; gap: 8px; }
.wl-consents .acc-panel { margin-top: 8px; }             /* DD 8-5 open panel reused */
/* text buttons (view x3, delete): 13/19.5 underline, no padding; hit area 44px tall via ::after (header icon pattern) */
.wl-view, .co-view, .cart-del { position: relative; flex: 0 0 auto; padding: 0; font-size: 13px; line-height: 19.5px; text-decoration: underline; text-underline-offset: 2px; }
.wl-view::after, .co-view::after, .cart-del::after { content: ""; position: absolute; left: -12px; right: -12px; top: -12.25px; bottom: -12.25px; }  /* 19.5 + 24.5 = 44px */

/* 16-6. cart: DD 8-4 block margin, DD 8-6 heading 16/24 mb 16, DD 8-8 drawer preview row */
.cart { margin: 32px 16px 0; }
.cart-title { font-size: 15px; line-height: 24px; font-weight: var(--w-medium); margin-bottom: 16px; }  /* v4: = .pdp-name 15/24 w500 */
.cart-item {
  display: grid; grid-template-columns: 25% minmax(0, 1fr); column-gap: 20px;
  padding: 16px 0;
  border-top: 1px solid var(--line-table); border-bottom: 1px solid var(--line-table);
}
.cart-thumb { aspect-ratio: 1 / 1; background: var(--surface-img); overflow: hidden; }
.cart-thumb img { width: 100%; height: 100%; object-fit: cover; }
.cart-meta { display: flex; flex-direction: column; min-width: 0; }
.cart-name { font-size: 14px; line-height: 20px; font-weight: 400; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cart-opt { font-size: 13px; line-height: 19.5px; }
.cart-line { display: flex; justify-content: space-between; align-items: baseline; margin-top: auto; padding-top: 8px; }
.cart-price { font-size: 14px; line-height: 20px; }      /* DD 8-8 preview price 14 w300 */
.cart-code { margin-top: 32px; }
.cart-sum { margin: 32px 0 0; }
.cart-sum div { display: flex; justify-content: space-between; padding: 8px 0; }
.cart-sum dt, .cart-sum dd { margin: 0; }
.cart-sum .cart-total { margin-top: 8px; padding-top: 16px; border-top: 1px solid var(--line-table); font-size: 14px; line-height: 20px; }
.cart-total dd { font-weight: 600; }                      /* DD 7-2 card price w600 */

/* 16-7. checkout */
.co { padding: 0 16px; }
.co-title { margin-top: 32px; font-size: 15px; line-height: 24px; font-weight: var(--w-medium); }  /* v4: = .pdp-name 15/24 w500 */
.co-mode { display: flex; gap: 24px; margin: 8px 0 32px; font-size: 13px; line-height: 19.5px; }  /* DD 7-1 tabs */
.co-mode a { position: relative; padding: 8px 0; color: var(--ink); }  /* pure black; the inactive tab is w300, the active w500 (weight only) */
.co-mode a::after { content: ""; position: absolute; left: -12px; right: -12px; top: -4px; bottom: -4px; }  /* 43.5px hit */
.co-mode a[aria-current] { color: var(--ink); font-weight: var(--w-medium); }  /* DD 7-1 active tab w500 */
.co-group { margin: 0; padding: 0; border: 0; min-width: 0; }
/* DD 8-5 accordion row without chevron; float lets a <legend> lay out like a block */
.co-h { float: left; width: 100%; height: var(--acc-h); padding: 0; display: flex; align-items: center; border-bottom: 1px solid var(--ink); font-size: 14px; line-height: 20px; font-weight: 400; }  /* v4 accordion row 56 */
.co-h + * { clear: both; }
h2.co-h { float: none; }  /* v6: only the <legend> needs the float; on ko the next sibling (foreign-only note) is hidden, so the widget never cleared and slid under the heading */
.co-fields { display: grid; gap: 16px; padding-top: 16px; }  /* DD 8-8 option row 16px */
.co-widget { margin-top: 16px; padding: 64px 16px; background: var(--surface-img); font-size: 12px; line-height: 16px; text-align: center; }
.co-line { display: flex; gap: 16px; align-items: flex-start; }
.co-line .card-img { flex: 0 0 25%; }                      /* DD 8-8 preview thumb 25% */
.co-meta { flex: 1; min-width: 0; }
.co-name { font-size: 14px; line-height: 20px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.co-price { margin-top: 10px; font-size: 14px; line-height: 16px; }
.co-rows { margin: 0; }
.co-rows div { display: flex; justify-content: space-between; padding: 8px 0; }
.co-rows dd { margin: 0; }
.co-rows .co-total { margin-top: 8px; padding-top: 16px; border-top: 1px solid var(--ink); font-size: 14px; line-height: 16px; }  /* DD 8-8 TOTAL 14px; line #000 like the PDP accordion */
.co-total dd { font-weight: 600; }
.co-consent { display: grid; gap: 0; }                     /* 44px checkbox rows stack */
.co-crow { display: flex; justify-content: space-between; align-items: center; gap: 16px; }
.co-note { padding-left: 26px; font-size: 12px; line-height: 16px; }  /* 18px box + 8px gap: aligns with the label text column */

/* 16-8. order status (also the guard for lookup / complete): DD 8-9 480px column */
.os { max-width: 480px; margin: 0 auto; }
.os-sec { margin: 32px 16px 0; }                           /* DD 8-4 info block margin */
.os-img { margin-top: 32px; }                              /* full-bleed stage image, .card-img 5:6 */
.os-track { position: relative; display: block; padding: 4px 0; margin: -4px 0; text-decoration: underline; text-underline-offset: 2px; }  /* 24px hit area */

/* 44px hit on the tracking link (row is 44px: 12px cell padding around 19.5px) */
.os-track::after { content: ""; position: absolute; left: 0; right: 0; top: -10px; bottom: -10px; }

/* ---------- 17. tablet + desktop (>= 768px) ---------- */
/* DD 8-9 info column 480px is the width of every single-column page */
@media (min-width: 768px) {
  .guide { max-width: 480px; margin: 0 auto; }
  .wl { max-width: 480px; margin: 32px auto 0; }
  .cart { max-width: 480px; margin: 32px auto 0; }
  .co { max-width: 512px; margin: 0 auto; }               /* 480 content + 16px padding */
  .about { max-width: 480px; margin: 0 auto; }
  .about .page-title { padding-left: 0; padding-right: 0; }
  .pdp-info { max-width: 512px; margin: 0 auto; }          /* 768-1023: stacked PDP, 480 content */
}

/* ---------- 18. desktop (>= 1024px): DD 8-9 desktop metrics ---------- */
@media (min-width: 1024px) {
  /* fixed stack: notice ~38px + header 71px = 109px [CSS]; DD desktop header is white on inner pages */
  :root { --bar-h: 38px; --hdr-h: 71px; --top-stack: 109px; }
  .notice { line-height: 38px; }

  /* header: wordmark 160 x 17 at x = 80 [CSS]; inline nav 13px w400 ls -0.4px [CSS].
     nav starts 60px after the wordmark, items 40px apart, right edge 60px [screenshot pdp-1440-fold] */
  .hdr { padding: 0 60px 0 80px; justify-content: flex-start; }
  .hdr .wm { width: 160px; height: 17px; line-height: 17px; font-size: 22.93px; letter-spacing: 2.61px; }  /* x 4/3 of the 120 x 13 box */
  .hdr .wm { left: -10px; }  /* (60 - 80) / 2: centre on the viewport, not on the asymmetric 80 / 60 content box */
  .hdr .wm span { top: 2.8px; margin-left: -0.8px; }
  .gnb { display: flex; gap: 40px; }  /* founder 2026-10-14: gnb on the left 80px axis */
  .gnb a, .hdr-util { display: block; padding: 4px 0; font-size: 13px; line-height: 19.5px; font-weight: 400; letter-spacing: -0.4px; }
  .hdr-icons { margin-left: auto; gap: 40px; }
  .burger, .nav-drawer { display: none; }
  .bag { margin-right: 0; }
  /* desktop: header always solid white (DD desktop header); avoids white wordmark on the bright, cropped video */
  .hdr--over { background: var(--bg); color: var(--ink); }

  /* PDP: gallery block 780px incl. 40px side padding (image x = 40, 700 wide), 770px tall [CSS 780x770];
     info column x = 846, 480px wide [CSS] -> gap 66px, right margin 114px */
  .pdp { display: grid; grid-template-columns: minmax(0, 1fr) 480px; column-gap: 66px; padding-right: 114px; align-items: start; }
  .gallery-wrap { position: sticky; top: var(--top-stack); padding: 0 40px; }
  .gallery { height: calc(100vh - 130px); height: calc(100svh - 130px); }
  .pdp-info { max-width: none; margin: 0; }
  .buy { margin: 32px 0 0; }
  .acc { margin: 24px 0 0; }
  .buybar { display: none; }
  .page-pdp .site-footer { padding-bottom: 0; }

  /* footer: DD desktop footer not measured; side padding follows the header axes (80 left, 60 right) */
  .ft-acc { padding-left: 80px; padding-right: 60px; }
  .ft-legal { padding-left: 80px; padding-right: 60px; }

  /* home + shop grid: 3 columns on desktop (6 cards = 2 full rows), same DD 7-2 gutters [no DD desktop PLP measurement] */
  .shop .grid-2, .home-grid .grid-2 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .home-grid { padding: var(--sp-4) 52px var(--sp-4) 72px; }  /* + grid 8px = images on the 80 / 60 header axes */

  /* home panel: stays full-bleed; DD desktop home not measured -> 48px insets */
  .panel-txt { bottom: 48px; padding: 0 48px; }
  .shop { padding: 0 52px 0 72px; }          /* + grid 8px = images on the 80 / 60 header axes */
  .shop .page-title { padding-left: 8px; padding-right: 8px; }
}

/* ---------- 19. i18n (DESIGN.md 19; docs/design/i18n-architecture.md 4, 12) ---------- */
/* 19-1. "SR Latin": Latin, digits, punctuation and the KRW sign only, from the same Pretendard
   Variable subset files the dynamic-subset CSS uses (same URLs = same cache, no second copy).
   ja / zh stacks put it first so 10K, 42cm and 389,000 look identical in every locale, while kana,
   hanzi and full-width punctuation fall through to Noto: Pretendard itself also carries
   Korean-style kana / hanja, so "Pretendard Variable" first would mix glyph designs */
@font-face { font-family: "SR Latin"; font-style: normal; font-display: swap; font-weight: 45 920; src: url("https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/packages/pretendard/dist/web/variable/woff2-dynamic-subset/PretendardVariable.subset.91.woff2") format("woff2-variations"); unicode-range: U+0020-0022, U+0027-002A, U+002C-003B, U+003F, U+0041-005D, U+0061-007B, U+007D, U+00A0-00A1, U+00AB, U+00AD-00AE, U+00B7, U+00BB, U+00BF, U+2013-2014, U+201C-201D; }
@font-face { font-family: "SR Latin"; font-style: normal; font-display: swap; font-weight: 45 920; src: url("https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/packages/pretendard/dist/web/variable/woff2-dynamic-subset/PretendardVariable.subset.88.woff2") format("woff2-variations"); unicode-range: U+0026, U+002B, U+003E, U+0040, U+007E; }
@font-face { font-family: "SR Latin"; font-style: normal; font-display: swap; font-weight: 45 920; src: url("https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/packages/pretendard/dist/web/variable/woff2-dynamic-subset/PretendardVariable.subset.87.woff2") format("woff2-variations"); unicode-range: U+0023, U+0025, U+005F, U+00A9; }
@font-face { font-family: "SR Latin"; font-style: normal; font-display: swap; font-weight: 45 920; src: url("https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/packages/pretendard/dist/web/variable/woff2-dynamic-subset/PretendardVariable.subset.86.woff2") format("woff2-variations"); unicode-range: U+003C-003D, U+2026; }
@font-face { font-family: "SR Latin"; font-style: normal; font-display: swap; font-weight: 45 920; src: url("https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/packages/pretendard/dist/web/variable/woff2-dynamic-subset/PretendardVariable.subset.81.woff2") format("woff2-variations"); unicode-range: U+0024, U+0060; }
@font-face { font-family: "SR Latin"; font-style: normal; font-display: swap; font-weight: 45 920; src: url("https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/packages/pretendard/dist/web/variable/woff2-dynamic-subset/PretendardVariable.subset.89.woff2") format("woff2-variations"); unicode-range: U+007C; }
@font-face { font-family: "SR Latin"; font-style: normal; font-display: swap; font-weight: 45 920; src: url("https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/packages/pretendard/dist/web/variable/woff2-dynamic-subset/PretendardVariable.subset.85.woff2") format("woff2-variations"); unicode-range: U+005E; }
@font-face { font-family: "SR Latin"; font-style: normal; font-display: swap; font-weight: 45 920; src: url("https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/packages/pretendard/dist/web/variable/woff2-dynamic-subset/PretendardVariable.subset.75.woff2") format("woff2-variations"); unicode-range: U+20A9; }
@font-face { font-family: "SR Latin"; font-style: normal; font-display: swap; font-weight: 45 920; src: url("https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/packages/pretendard/dist/web/variable/woff2-dynamic-subset/PretendardVariable.subset.82.woff2") format("woff2-variations"); unicode-range: U+00D7; }
@font-face { font-family: "SR Latin"; font-style: normal; font-display: swap; font-weight: 45 920; src: url("https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/packages/pretendard/dist/web/variable/woff2-dynamic-subset/PretendardVariable.subset.71.woff2") format("woff2-variations"); unicode-range: U+2018-2019; }

/* 19-1b. "SR Latin Local" (v6): the same code points from a system Latin face, for a phone or an
   artifact page where cdn.jsdelivr.net is blocked. Without it the Latin, digits, the middle dot,
   hyphen, (c) and the KRW sign fall through to Hiragino / PingFang / Noto CJK: a full-width middle
   dot, an en-dash-long hyphen, a heavy won sign. When "SR Latin" loads it wins (it is listed first) */
@font-face { font-family: "SR Latin Local"; font-style: normal; font-weight: 100 900; src: local("Helvetica Neue"), local("HelveticaNeue"), local("Segoe UI"), local("Arial"); unicode-range: U+0020-007E, U+00A0-00A1, U+00A9, U+00AB, U+00AD-00AE, U+00B7, U+00BB, U+00BF, U+00D7, U+2013-2014, U+2018-2019, U+201C-201D, U+2026, U+20A9; }

/* 19-2. lang stacks. <html lang> is set by i18n.js before first paint; Noto Sans JP / SC
   (300 / 400 / 500, Google Fonts) is requested only on its own locale. Newsreader stays on .wm */
html:lang(ja) body      { font-family: "SR Latin", "SR Latin Local", "Noto Sans JP", "Hiragino Sans", "Hiragino Kaku Gothic ProN", "Yu Gothic", sans-serif; line-break: strict; }
html:lang(zh-Hans) body { font-family: "SR Latin", "SR Latin Local", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif; }
/* ja / zh: no negative tracking (-0.65px is tuned for Hangul), no keep-all (it blocks breaks
   between ideographs -> overflow at 375), line-height 1.6+ on every text block.
   Excluded: rows whose px line-height IS the DD box (notice 32, footer list 36, wordmark, bag count) */
html:lang(ja), html:lang(zh) { --ls: 0; }
html:lang(ja) body, html:lang(zh) body { word-break: normal; overflow-wrap: anywhere; line-height: 1.7; }
html:lang(ja) body *:not(.notice):not(.wm):not(.wm *):not(.ft-acc-panel li):not(.bag-count):not(:is(.panel-txt *, .nav-group a, .tabs a, .guide-tabs a, .co-mode a, .step, .step *, .lang-list a, .lang-list a *, .lang-region, .btn, .btn *, .acc-btn, .acc-btn *, .co-h, .ft-acc-btn, .ft-acc-btn *, .card-name, .card-price, .cart-sum, .cart-sum *, .co-rows, .co-rows *, .field-label, .opt-label, .cart-name, .cart-price, .co-name, .co-price, .ft-copy, .os-track, .acc-link)),
html:lang(zh) body *:not(.notice):not(.wm):not(.wm *):not(.ft-acc-panel li):not(.bag-count):not(:is(.panel-txt *, .nav-group a, .tabs a, .guide-tabs a, .co-mode a, .step, .step *, .lang-list a, .lang-list a *, .lang-region, .btn, .btn *, .acc-btn, .acc-btn *, .co-h, .ft-acc-btn, .ft-acc-btn *, .card-name, .card-price, .cart-sum, .cart-sum *, .co-rows, .co-rows *, .field-label, .opt-label, .cart-name, .cart-price, .co-name, .co-price, .ft-copy, .os-track, .acc-link)) { line-height: 1.6; }
/* v6: the 1.6 is for running text (p, li, table cells, consent labels, legal lines). One-line rows whose
   px line-height IS the DD box keep it (excluded above): home panel text (its 1.6 split the title and
   "shop" baselines), drawer links, tabs, order steps, language list, buttons, accordion and checkout
   heads, card name / price, field and option labels, cart / checkout item name and price, links,
   copyright, bag and checkout summary rows (these two inherit body, so pin ko's 19.5px) */
html:lang(ja) :is(.cart-sum, .co-rows), html:lang(zh) :is(.cart-sum, .co-rows) { line-height: 19.5px; }
/* English islands kept in English on every page (notice bar "Launching 10.21", nav shop / about /
   guide, Customer Center, Shopping Info): the ko / en face and tracking, so they look identical */
html:lang(ja) [lang="en"]:not([data-lang-target], .lang-suggest), html:lang(zh) [lang="en"]:not([data-lang-target], .lang-suggest) { font-family: var(--f-body); letter-spacing: -0.65px; }
html:lang(ja) :is(em, i, cite), html:lang(zh) :is(em, i, cite) { font-style: normal; }
/* Korean fallback islands (key not yet translated, i18n.js marks them lang="ko") */
html:lang(ja) [lang="ko"], html:lang(zh) [lang="ko"] { font-family: "SR Latin", "Pretendard Variable", "Apple SD Gothic Neo", sans-serif; word-break: keep-all; letter-spacing: -0.65px; }
/* ja product name: words are separated by half-width spaces (i18n-glossary.md 2-1), so break only
   there; overflow-wrap: anywhere (inherited) still breaks a word longer than the line */
html:lang(ja) .pdp-name { word-break: keep-all; }
/* home / shop card names: a translated name may take two lines instead of the one-line ellipsis
   (which would cut off the metal); ja wraps only at the half-width spaces (glossary 2-1).
   v6: was ja only, now every foreign locale */
html:not(:lang(ko)) .card-name { white-space: normal; }
html:lang(ja) .card-name { word-break: keep-all; }
/* keep prices on one baseline across the row when one name takes two lines */
html:not(:lang(ko)) .card { display: flex; flex-direction: column; }
html:not(:lang(ko)) .card-txt { flex: 1 0 auto; display: flex; flex-direction: column; }
html:not(:lang(ko)) .card-price { margin-top: auto; }
/* the Korean HTML is hidden for the few ms until the dictionary lands (i18n.js, 3s safety) */
html.i18n-pending body { visibility: hidden; }

/* 19-3. switcher triggers: drawer row 3 (= .nav-util a: 40px, 13px, 22px icon, gap 12),
   footer line between .ft-acc and .ft-legal, desktop header text (= .hdr-util) */
.nav-lang { display: flex; align-items: center; gap: 12px; height: 40px; font-size: 13px; text-align: left; }
.nav-lang .lang-globe { flex: 0 0 22px; width: 22px; height: 22px; }
.ft-lang { padding: 12px 16px 0; }
.ft-lang-btn { position: relative; display: inline-flex; align-items: center; gap: 4px; height: 32px; font-size: 13px; line-height: 19.5px; color: var(--grey-strong); }
.ft-lang-btn::after { content: ""; position: absolute; left: -8px; right: -8px; top: -6px; bottom: -6px; }  /* 44px hit */
.ft-lang-btn .lang-chev { width: var(--chev); height: var(--chev); }
.ft-lang-btn[aria-expanded="true"] .lang-chev { transform: rotate(180deg); }
.ft-lang + .ft-legal { padding-top: 8px; }
.hdr-lang { white-space: nowrap; }

/* 19-4. list: bottom sheet < 1024, small dialog >= 1024. No title, close x, 5 fixed rows of
   --ctl-h, 13px self-names, current row underlined + check + aria-current, one muted region line */
.lang-open { overflow: hidden; }
.lang-sheet { position: fixed; inset: 0; z-index: 70; }
.lang-scrim { position: absolute; inset: 0; background: rgba(0, 0, 0, 0.4); }
.lang-panel {
  position: absolute; left: 0; right: 0; bottom: 0;
  padding: 8px var(--gutter) calc(24px + env(safe-area-inset-bottom));
  background: var(--bg); color: var(--ink);
}
.lang-x { position: relative; display: block; width: 20px; height: 20px; margin: 4px 0 4px auto; }
.lang-x::after, .lang-suggest-x::after { content: ""; position: absolute; inset: -12px; }  /* 44px hit */
.lang-x svg, .lang-suggest-x svg { width: 20px; height: 20px; }
.lang-list a {
  display: flex; align-items: center; justify-content: space-between;
  height: var(--ctl-h);
  font-size: 13px; line-height: 19.5px; font-weight: 400; letter-spacing: 0;
}
.lang-list a[aria-current="true"] span { text-decoration: underline; text-underline-offset: 3px; }
.lang-check { width: var(--chev); height: var(--chev); }
.lang-region { margin-top: 8px; padding-top: 16px; border-top: 1px solid var(--line-table); font-size: 12px; line-height: 16px; color: var(--grey-text); }
/* each self-name in its own script's face, on every page */
.lang-list a:lang(ko) span, .lang-name:lang(ko) { font-family: "SR Latin", "Pretendard Variable", "Apple SD Gothic Neo", sans-serif; }
.lang-list a:lang(ja) span, .lang-name:lang(ja) { font-family: "SR Latin", "Noto Sans JP", "Hiragino Sans", sans-serif; }
.lang-list a:lang(zh-Hans) span, .lang-name:lang(zh-Hans) { font-family: "SR Latin", "Noto Sans SC", "PingFang SC", sans-serif; }

/* 19-5. suggestion line: bottom, one line, non-blocking, in the suggested language.
   Sits on top of the PDP sticky buy bar (68px) while that bar is showing */
.lang-suggest {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 35;
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
  height: 44px; padding: 0 var(--gutter) env(safe-area-inset-bottom);
  border-top: 1px solid var(--ink);
  background: var(--bg); color: var(--ink);
  font-size: 13px; line-height: 19.5px; letter-spacing: 0;
  transition: bottom 200ms;
}
.lang-suggest a { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; text-decoration: underline; text-underline-offset: 2px; }
.lang-suggest:lang(ja) { font-family: "SR Latin", "Noto Sans JP", "Hiragino Sans", sans-serif; }
.lang-suggest:lang(zh-Hans) { font-family: "SR Latin", "Noto Sans SC", "PingFang SC", sans-serif; }
.lang-suggest-x { position: relative; flex: 0 0 20px; width: 20px; height: 20px; }
.page-pdp .lang-suggest { bottom: 68px; }
.page-pdp:has(.buybar.is-hidden) .lang-suggest { bottom: 0; }
.has-lang-suggest .site-footer { padding-bottom: 44px; }
.page-pdp.has-lang-suggest .site-footer { padding-bottom: 112px; }

@media (min-width: 1024px) {
  .ft-lang { padding-left: 80px; padding-right: 60px; }
  .lang-panel {
    left: 50%; right: auto; top: 50%; bottom: auto;
    width: 360px; padding: 8px 24px 24px;
    transform: translate(-50%, -50%);
  }
  .page-pdp .lang-suggest { bottom: 0; }
  .page-pdp.has-lang-suggest .site-footer { padding-bottom: 44px; }
}

/* 19-6. foreign-only legal lines (spec 6-8, i18n-architecture.md 15-2): shipping scope and currency
   under the PDP price, above the cart CTA and the checkout payment widget; the translation notice at
   the top of the PDP information block and the checkout consent block, under the cart CTA.
   The Korean page does not carry them */
html:lang(ko) [data-foreign-only] { display: none; }
.legal-note { font-size: 12px; line-height: 16px; }
.acc > .legal-note { margin-bottom: 16px; }
.co-h + .legal-note { padding-top: 16px; }  /* padding: a margin on the element that clears the floated .co-h is eaten by clearance */
.co-consent > .legal-note { margin-bottom: 8px; }
.cart > .legal-note { margin-top: 16px; }
.cart > .legal-note + .legal-note { margin-top: 0; }
/* v7 locale context (DESIGN.md 26): phone / address scope notes sit inside .field (8px grid gap);
   the waitlist phone note follows the phone input and hides with it on the email tab */
#wl-phone[hidden] + .legal-note { display: none; }
.wl-consents > .legal-note { margin-bottom: 8px; }
.acc-panel > .legal-note { margin-bottom: 8px; }

/* 19-7. i18n polish (v6, DESIGN.md 24). Per-locale line-fit fixes measured with
   design/tools/i18n-overflow-scan.mjs at 320 / 375 / 390 / 430, webfonts on and off.
   Nothing in this block matches html:lang(ko): the Korean page keeps its DD metrics */
/* cart + checkout product name: two lines instead of an ellipsis that hid "necklace" (en 320, ja all) */
html:not(:lang(ko)) :is(.cart-name, .co-name) { white-space: normal; text-wrap: balance; }
html:lang(ja) :is(.cart-name, .co-name) { word-break: keep-all; }
/* checkout notes: each wraps to 2 lines in translation, so give the two notes a gap or they read as one paragraph */
html:not(:lang(ko)) .co-note + .co-note { margin-top: 4px; }
/* home panel title: ja breaks at the space, never inside a katakana word */
html:lang(ja) .panel-title { word-break: keep-all; }
/* PDP / order-status product name: no single word left alone on the second line */
html:not(:lang(ko)) .pdp-name { text-wrap: balance; }
/* running text: no one-word / two-character last line (Chrome 117+, Safari 26+; ignored elsewhere) */
html:not(:lang(ko)) :is(.acc-panel p, .acc-list li, .info-table td, .co-note, .legal-note, .ft-biz p, .guide-mto) { text-wrap: pretty; }
/* product-notice + order-status label column (th 25% leaves 56-73px of text): ja / zh labels break
   only at phrase boundaries (punctuation or a U+200B hint in the dictionary value), never inside a
   word, and the column is wide enough for the longest phrase: ja "afutaa saabisu" = 8 em, zh 6 em */
html:lang(ja) .info-table th, html:lang(zh) .info-table th { padding-left: 2px; padding-right: 2px; word-break: keep-all; }
html:lang(ja) .info-table th { width: calc(8em + 4px); }
@media (max-width: 374px) {
  html:lang(ja) .info-table th { font-size: 11px; }          /* one step down: 92px column at 320 */
  html:lang(zh) .info-table th { width: calc(6em + 6px); }   /* 78px: 25% would be 64px at 320 */
}
@media (max-width: 359px) {
  /* footer policy row: three ja links need ~300px of the 288px line at 320; one step down (13 -> 12px) */
  html:lang(ja) .ft-policy { font-size: 12px; }
  /* home panel title: ja "nekkuresu . howaito" (215px at 22px) + "shop" need 248px; one step down keeps one line */
  html:lang(ja) .panel-title { font-size: 20px; line-height: 26px; }
  /* guide tabs: the en third tab ended 4.6px past the 320 screen edge (fonts off) */
  html:lang(en) .guide-tabs { gap: 16px; }
}

/* ---------- 20. account pages (docs/design/account-pages-spec.md 3, DESIGN.md 27) ----------
   The control system as it is: .co column + .co-title, .field / .input 48, .ctl-row 52, .btn 52,
   .check 48 / box 18, .co-crow + .co-view text buttons (13/19.5, 44 hit), .acc-btn 56, .co-h 56,
   .co-note / .legal-note 12/16. New here: spacing on the 8px grid, the 77px thumbnail (= cart
   thumb at 375), the error / status lines and the postcode layer. No new colours or sizes */
/* logged-in / logged-out chrome: the header, drawer and footer login slot (spec 2) */
body[data-auth="in"] [data-auth-only="out"],
body:not([data-auth="in"]) [data-auth-only="in"] { display: none; }
.ac-form, .ac-block { margin-top: var(--sp-4); }
.ac-fields { padding-top: 0; }
.ac-submit { margin-top: var(--sp-4); }
.ac-links { margin-top: var(--sp-2); }
.ac-guest, .ac-delete { margin-top: 24px; }
a.co-view { display: inline-block; }
.co-view[disabled] { color: #DBDBDB; cursor: default; }   /* DD 8-8 disabled colour */
/* hint / error / status lines: no red in the palette, so an error = 12/16 w500 #000 + aria-invalid */
.ac-hint, .ac-err { font-size: 12px; line-height: 16px; }
.ac-err { font-weight: var(--w-medium); }
.ac-form-err { margin-top: var(--sp-2); }
.ac-status { font-size: 13px; line-height: 19.5px; }     /* = .wl-done */
.ac-status:focus, .ac-done .co-title:focus { outline: none; }
/* signup head: coupon line 13/19.5 8px under the title, terms 12/16 4px under it (spec 4-5) */
.ac-coupon-line { margin-top: var(--sp-1); font-size: 13px; line-height: 19.5px; }
.ac-coupon-line + .legal-note { margin-top: 4px; }
/* show / hide text button inside the password input, timer inside the code input */
.ac-pw, .ac-code { position: relative; }
.ac-code { flex: 1 1 auto; min-width: 0; }
.ac-pw .input, .ac-code .input { padding-right: 56px; }
.ac-pw-toggle, .ac-timer { position: absolute; right: var(--ctl-px); top: 50%; transform: translateY(-50%); }
.ac-timer { font-size: 13px; line-height: 19.5px; font-variant-numeric: tabular-nums; pointer-events: none; }
.ctl-row > .co-view { align-self: center; margin-left: var(--sp-1); }
/* address row: under 400px the read-only address takes the whole line and "find address" goes under it
   (full-width secondary button), so "[06236] Seoul ... 123" is not cut (22.9px at 320, ja 375) */
@media (max-width: 399px) {
  .ac-addr-row { flex-wrap: wrap; }
  .ac-addr-row .input { flex: 1 1 100%; height: var(--ctl-h); }
  .ac-addr-row .btn { flex: 1 1 100%; }
}
/* zh check labels and 12/16 notes: no trimming of a line-end full-width bracket (text-spacing-trim),
   so a line that does not fit wraps instead of pushing its closing bracket into the gutter
   (zh 320: consent.age 4.9px, coupon expiry 3.4px). The bracket groups in consent.age and
   coupons.valid_until are held together with U+2060 in the dictionary value, so the break falls
   before the opening bracket */
html:lang(zh) :is(.check, .legal-note) { text-spacing-trim: space-all; }
@media (max-width: 359px) {
  /* ja phone row: "ninshou koodo wo soushin" leaves the number 7.6px too narrow at 320, so the
     send button goes under the number (as the address row). Not once verified (button hidden) */
  html:lang(ja) .ctl-row:has(> [data-otp-send]:not([hidden])) { flex-wrap: wrap; }
  html:lang(ja) .ctl-row:has(> [data-otp-send]:not([hidden])) > .input { flex: 1 1 100%; height: var(--ctl-h); }
  html:lang(ja) .ctl-row > [data-otp-send] { flex: 1 1 100%; }
  /* ja delete confirm: the question on its own line, delete / cancel under it */
  html:lang(ja) [data-addr-confirm] { flex-wrap: wrap; row-gap: 0; }
  html:lang(ja) [data-addr-confirm] > span { flex: 1 1 100%; }
}
/* consent block (spec 6): master row, 1px #000 rule (8 above / below), notice row without a box */
.ac-consent { display: grid; margin-top: var(--sp-4); }
.ac-consent > .legal-note:first-of-type { margin-bottom: var(--sp-1); }
.ac-rule { width: 100%; margin: var(--sp-1) 0; border: 0; border-top: 1px solid var(--ink); }
.ac-notice { display: flex; align-items: center; min-height: var(--ctl-h); padding-left: 26px; font-size: 14px; line-height: 20px; font-weight: 400; }
.ac-consent .acc-panel { margin-bottom: var(--sp-1); }
.ac-consent .acc-panel p + p { margin-top: var(--sp-1); }
.ac-ch { display: flex; flex-wrap: wrap; column-gap: 24px; padding-left: 26px; }
.ac-consent > .ac-err { margin-top: var(--sp-1); }
.ac-scope { display: grid; gap: var(--sp-1); margin-bottom: var(--sp-2); }
/* signup done: the coupon moment = one row like a coupon-page row */
.ac-coupon-card { padding: var(--sp-2) 0; border-top: 1px solid var(--line-table); border-bottom: 1px solid var(--line-table); }
.ac-coupon-done { font-size: 14px; line-height: 20px; font-weight: var(--w-medium); }
.ac-coupon-done + .legal-note { margin-top: 4px; }
.ac-done .buy-ctas { margin-top: var(--sp-4); }
/* my page: current order, menu rows 56 with a -90deg chevron 14 */
.ac-current { display: flex; gap: var(--sp-2); align-items: flex-start; }
.ac-thumb { flex: 0 0 77px; width: 77px; aspect-ratio: 1 / 1; background: var(--surface-img); overflow: hidden; }
.ac-thumb img { width: 100%; height: 100%; object-fit: cover; }
.ac-meta { display: flex; flex-direction: column; flex: 1 1 auto; min-width: 0; }
.ac-name { font-size: 14px; line-height: 20px; font-weight: 400; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ac-step { font-size: 13px; line-height: 20px; font-weight: var(--w-medium); }
.ac-opt { font-size: 13px; line-height: 19.5px; }
.ac-price { font-size: 13px; line-height: 19.5px; font-weight: 600; }
/* foreign product name: two lines instead of an ellipsis that hid "necklace" (= cart / checkout, styles 19-7) */
html:not(:lang(ko)) .ac-name { white-space: normal; text-wrap: balance; }
html:lang(ja) .ac-name { word-break: keep-all; }
.ac-meta > .co-view { align-self: flex-start; margin-top: var(--sp-1); }
.ac-menu a, .ac-menu-row {
  display: flex; justify-content: space-between; align-items: center; gap: var(--sp-2);
  height: var(--acc-h); border-bottom: 1px solid var(--ink);
  font-size: 14px; line-height: 20px; font-weight: 400;
}
.ac-chev { flex: 0 0 var(--chev); width: var(--chev); height: var(--chev); transform: rotate(-90deg); }
.ac-row-note { margin-top: var(--sp-1); }   /* order complete: coupon line under the sign-up row (spec 4-14) */
.ac-menu-end { display: flex; align-items: center; gap: var(--sp-1); font-size: 13px; line-height: 19.5px; }
/* lists: orders / addresses / coupons, rows 16 0 with the DD table line */
.ac-list { border-top: 1px solid var(--line-table); }
.ac-row { padding: var(--sp-2) 0; border-bottom: 1px solid var(--line-table); }
.ac-order { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--sp-1); }   /* minmax(0): a nowrap name cannot widen the row (ja 375 overflowed by 77px) */
.ac-order-top { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: baseline; column-gap: var(--sp-2); font-size: 13px; line-height: 19.5px; }
/* the step may shrink / wrap and drops under the date (still right-aligned) when both do not fit:
   ja "Naver Smart Store . otodoke kanryou" ran 55px past the 320 screen (v8 recheck) */
.ac-order-top .ac-step { flex: 0 1 auto; min-width: 0; margin-left: auto; line-height: 19.5px; text-align: right; }
.ac-nowrap { white-space: nowrap; }   /* order number never splits at the hyphen */
.ac-order-body { display: flex; gap: var(--sp-2); }
.ac-addr p { font-size: 13px; line-height: 19.5px; }
.ac-addr .ac-addr-name { font-size: 14px; line-height: 20px; font-weight: 400; }
.ac-tag { margin-left: var(--sp-1); font-size: 13px; line-height: 19.5px; font-weight: var(--w-medium); }
.ac-actions { display: flex; align-items: center; gap: 24px; margin-top: var(--sp-1); }   /* 24 apart: the 44px hit areas do not overlap */
.ac-coupon-top { display: flex; justify-content: space-between; gap: var(--sp-2); font-size: 14px; line-height: 20px; }
.ac-coupon-name { font-weight: var(--w-medium); }
.ac-coupon-amt { flex: 0 0 auto; font-weight: 600; }
.ac-coupon-top + .legal-note { margin-top: 4px; }
.ac-coupon-end { display: flex; justify-content: space-between; gap: var(--sp-2); }
.ac-coupon-state { flex: 0 0 auto; font-weight: var(--w-medium); }
/* profile */
.ac-value { font-size: 14px; line-height: 20px; font-weight: 400; }
.ac-value-row { display: flex; justify-content: space-between; align-items: center; gap: var(--sp-2); }
.ac-sub-fields { padding-top: 0; }
.ac-pw-panel { padding-top: var(--sp-2); }
.ac-mk { display: grid; padding-top: var(--sp-1); }
.ac-mk + .co-note { padding-left: 26px; }
/* withdraw: five notice lines 12/16, 8 apart, no bullets (spec 4-15) */
.ac-notes { display: grid; gap: var(--sp-1); }
/* postcode layer: < 1024 full-screen white layer + 56 header, >= 1024 480 x 600 dialog (spec 3, 11-1) */
.ac-layer-open { overflow: hidden; }
.ac-layer { position: fixed; inset: 0; z-index: 80; }
.ac-layer-scrim { position: absolute; inset: 0; background: rgba(0, 0, 0, 0.4); }
.ac-layer-panel { position: absolute; inset: 0; display: flex; flex-direction: column; background: var(--bg); }
.ac-layer-head {
  flex: 0 0 var(--acc-h); display: flex; justify-content: space-between; align-items: center;
  padding: 0 var(--gutter); border-bottom: 1px solid var(--ink);
  font-size: 14px; line-height: 20px; font-weight: 400;
}
.ac-layer-head .lang-x { margin: 0; }
.ac-layer-body { position: relative; flex: 1 1 auto; min-height: 0; overflow: hidden; }
@media (min-width: 1024px) {
  .ac-layer-panel { left: 50%; top: 50%; right: auto; bottom: auto; width: 480px; height: 600px; transform: translate(-50%, -50%); }
}

/* keep last: [hidden] beats component display rules of equal specificity */
[hidden] { display: none; }
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { transition: none; animation: none; scroll-behavior: auto; }
}
