/* wentaoyao.com — v8 design system (light, monochrome, Apple-informed).
   Tokens: see /workspace/crit/apple-web-notes.md. Base unit 4px; gutter 24; radii 4·8·16·28·capsule,
   nested radius = outer − padding; continuous corners via corner-shape where supported. */
:root{
  /* colour: monochrome neutrals (apple.com) */
  --bg:#ffffff;--bg2:#f5f5f7;--ink:#1d1d1f;--ink2:#424245;--muted:#6e6e73;--dim:#86868b;--line:#d2d2d7;--hair:rgba(0,0,0,.08);
  /* type */
  --sans:-apple-system,BlinkMacSystemFont,"SF Pro Text","SF Pro Display","Segoe UI",Inter,Roboto,"Helvetica Neue","PingFang SC","Hiragino Sans GB","Microsoft YaHei",Arial,sans-serif;
  --mono:ui-monospace,"SF Mono",SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace;
  /* spacing scale (4px base) */
  --s1:4px;--s2:8px;--s3:12px;--s4:16px;--s5:24px;--s6:32px;--s7:48px;--s8:64px;--s9:96px;--s10:128px;
  --gutter:24px;--m:48px;--max:1068px;--prose:692px;--nav-h:48px;
  /* radii */
  --r-xs:4px;--r-sm:8px;--r-md:16px;--r-lg:28px;--r-pill:999px;--card-pad:12px;
  /* motion */
  --ease:cubic-bezier(.25,.1,.25,1);--t-fast:200ms;--t-med:360ms;
}
@media (max-width:900px){:root{--m:32px}}
@media (max-width:560px){:root{--m:20px}}

*{box-sizing:border-box;margin:0;padding:0}
html{background:var(--bg);-webkit-text-size-adjust:100%}
body{color:var(--ink);background:transparent;font:400 17px/1.47 var(--sans);letter-spacing:-.022em;
  -webkit-font-smoothing:antialiased;min-height:100vh;min-height:100svh;overflow-x:hidden;position:relative}
/* animated halftone field (halftone.js) sits behind everything; a fixed veil keeps text legible */
#ht{position:fixed;inset:0;width:100vw;height:100vh;display:block;z-index:0}
body::after{content:"";position:fixed;inset:0;pointer-events:none;z-index:0;
  background:radial-gradient(80% 70% at 0% 0%,rgba(255,255,255,.45),transparent 60%),
    radial-gradient(ellipse 110% 90% at 60% 55%,transparent 55%,rgba(255,255,255,.7) 100%)}
body.sub::after{background:radial-gradient(90% 70% at 0% 0%,rgba(255,255,255,.55),transparent 60%),
  linear-gradient(180deg,rgba(255,255,255,.2),rgba(255,255,255,.62) 40%,rgba(255,255,255,.78))}
::selection{background:var(--ink);color:#fff}
a{color:inherit}
code,kbd,pre,.code{font-family:var(--mono);font-size:.88em;letter-spacing:0}
:focus-visible{outline:2px solid var(--ink);outline-offset:3px;border-radius:var(--r-xs)}

/* ---------- page frame: 1068 content column with 48/32/20 margins ---------- */
.page{position:relative;z-index:1;min-height:100vh;min-height:100svh;display:flex;flex-direction:column;padding:0 var(--m)}
.page>*{width:100%;max-width:var(--max);margin-left:auto;margin-right:auto}
.page>main{flex:1 0 auto}

/* ---------- header: sticky, floating liquid-glass capsules (brand + nav) ---------- */
.top{position:sticky;top:0;z-index:20;height:calc(var(--nav-h) + var(--s4));padding-top:var(--s3);
  display:flex;align-items:center;justify-content:space-between;gap:var(--s4)}
.brand{display:inline-flex;align-items:center;gap:var(--s3);text-decoration:none;color:var(--ink);height:44px;padding:0 var(--s4) 0 var(--s3);
  border-radius:var(--r-pill);font:600 17px/1 var(--sans);letter-spacing:-.022em}
.brand .mark{display:block;height:20px;width:auto}
.nav{display:flex;align-items:center;gap:var(--s1);padding:var(--s1);border-radius:var(--r-pill);height:44px}
.nav a{display:inline-flex;align-items:center;height:36px;padding:0 var(--s4);border-radius:var(--r-pill);text-decoration:none;
  font:400 14px/1 var(--sans);letter-spacing:-.016em;color:var(--ink2);transition:background-color var(--t-fast) var(--ease),color var(--t-fast) var(--ease)}
.nav a:hover{color:var(--ink);background:rgba(255,255,255,.55)}
.nav a[aria-current="page"]{background:rgba(255,255,255,.9);color:var(--ink);font-weight:600;box-shadow:0 1px 2px rgba(0,0,0,.08),inset 0 0 0 1px rgba(0,0,0,.04)}


/* ---------- liquid glass, light monochrome (controls + floating surfaces) ----------
   Layers: backdrop (blur + saturate; glass.js swaps in an SVG refraction filter on Chromium) ·
   translucent white body · 1px gradient rim (::before) · cursor-following specular sheen (::after) ·
   soft neutral drop shadow for depth. The halftone moves underneath and shows through. */
.glass{
  --glass-blur:3;--glass-depth:30;--lx:30%;--ly:0%;
  position:relative;isolation:isolate;
  background:linear-gradient(180deg,rgba(255,255,255,.46),rgba(255,255,255,.16) 48%,rgba(255,255,255,.28));
  -webkit-backdrop-filter:blur(5px) saturate(160%);backdrop-filter:blur(5px) saturate(160%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.95),inset 0 -1px 0 rgba(0,0,0,.035),
    inset 0 0 0 1px rgba(255,255,255,.28),inset 0 0 24px rgba(255,255,255,.3),
    0 1px 2px rgba(0,0,0,.06),0 18px 44px -16px rgba(0,0,0,.18)}
.glass::before{content:"";position:absolute;inset:0;border-radius:inherit;padding:1px;pointer-events:none;
  background:linear-gradient(150deg,rgba(255,255,255,1),rgba(255,255,255,.35) 22%,rgba(0,0,0,.05) 50%,rgba(255,255,255,.45) 72%,rgba(0,0,0,.12));
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude}
.glass::after{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;z-index:-1;
  background:radial-gradient(120% 80% at var(--lx) var(--ly),rgba(255,255,255,.55),transparent 55%),
    linear-gradient(180deg,rgba(255,255,255,.35),transparent 30%)}
.nav,.brand{--glass-depth:18}
.card.glass:hover,.pn a.glass:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,.95),inset 0 -1px 0 rgba(0,0,0,.035),
    inset 0 0 0 1px rgba(255,255,255,.28),inset 0 0 24px rgba(255,255,255,.3),0 2px 4px rgba(0,0,0,.06),0 28px 56px -20px rgba(0,0,0,.24)}
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){.glass{background:rgba(255,255,255,.9)}}

/* arrow nudge */
.arw{display:inline-block;transition:transform var(--t-fast) var(--ease)}
a:hover .arw{transform:translateX(2px)}

/* ---------- type primitives ---------- */
.eyebrow,.lab{font:600 12px/1.33 var(--sans);letter-spacing:-.01em;color:var(--muted)}
.lab{display:flex;gap:var(--s2);margin-bottom:var(--s3)}
.lab i{font-style:normal;color:var(--dim);font-weight:400;font-variant-numeric:tabular-nums}
.px{display:none}

/* ---------- home hero (layout A: left-aligned big name) ---------- */
.hero{position:relative;isolation:isolate;padding:var(--s9) 0 var(--s8)}
/* faint grey halftone, only behind the name, fading out downward */
.hero .eyebrow{margin-bottom:var(--s5)}
.name{font-weight:700;font-size:clamp(64px,11.1vw,160px);line-height:.92;letter-spacing:-.03em;color:var(--ink);margin-left:-.04em}
.name .ln{display:block}
.lede{max-width:var(--prose);margin-top:var(--s7)}
.lede p{font-size:21px;line-height:1.38;letter-spacing:.011em;color:var(--ink)}
.lede p b{font-weight:600}
.lede p.sub{margin-top:var(--s3);font-size:17px;line-height:1.47;letter-spacing:-.022em;color:var(--muted)}
.hero>*{animation:fade var(--t-med) var(--ease) both}
.hero>.name{animation-delay:60ms}.hero>.lede{animation-delay:120ms}
@keyframes fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}

/* ---------- info strip (content layer: solid, no glass) ---------- */
.panel{display:grid;grid-template-columns:1.4fr 1fr 1fr;border-radius:var(--r-lg)}
.cell{padding:var(--s5);min-width:0}
.cell+.cell{border-left:1px solid var(--line)}
.val{font-size:17px;line-height:1.47;color:var(--ink);word-break:break-word}
.val.code{font-family:var(--mono);font-size:14px;line-height:1.5;letter-spacing:0;color:var(--ink2)}
.val .cmd{color:var(--ink)}
.val a{text-decoration:none;color:var(--ink);background:linear-gradient(currentColor,currentColor) 0 100%/0 1px no-repeat;
  transition:background-size var(--t-med) var(--ease);padding-bottom:2px}
.val a:hover{background-size:100% 1px}

/* ---------- featured cards: r 28, padding 12, thumb r 16 (= 28 − 12) ---------- */
.feat{margin-top:var(--s9)}
.feat-h{display:flex;align-items:baseline;justify-content:space-between;gap:var(--s4);margin-bottom:var(--s5)}
.feat-h .lab{margin:0}
.more{font-size:14px;letter-spacing:-.016em;color:var(--ink);text-decoration:none}
.more:hover{text-decoration:underline;text-underline-offset:3px}
.cards{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--gutter)}
.card{display:flex;flex-direction:column;text-decoration:none;color:inherit;
  border-radius:var(--r-lg);padding:var(--card-pad);transition:transform var(--t-med) var(--ease),box-shadow var(--t-med) var(--ease)}
.card:hover{transform:translateY(-3px)}
.thumb{display:block;aspect-ratio:16/10;overflow:hidden;background:#e8e8ed;border-radius:var(--r-md)}
.thumb img{width:100%;height:100%;object-fit:cover;display:block;transition:transform var(--t-med) var(--ease)}
.card:hover .thumb img,.row:hover .thumb img{transform:scale(1.03)}
.ci{display:flex;flex-direction:column;gap:var(--s2);padding:var(--s4) var(--s3) var(--s3)}
.cy,.rn{font:400 12px/1.33 var(--sans);letter-spacing:-.01em;color:var(--muted);font-variant-numeric:tabular-nums}
.cy i,.rn i{font-style:normal;color:var(--dim);margin-right:var(--s2)}
.ct{font-weight:600;font-size:21px;line-height:1.19;letter-spacing:.011em;color:var(--ink)}
.cl{font-size:14px;line-height:1.43;letter-spacing:-.016em;color:var(--muted)}
.card:hover .ct .arw{transform:translateX(3px)}

/* ---------- inner pages ---------- */
.doc{padding:var(--s9) 0 0}
.dhead{max-width:880px}
.dhead .eyebrow{margin-bottom:var(--s3)}
.title{font-weight:600;font-size:56px;line-height:1.07;letter-spacing:-.005em;color:var(--ink);animation:fade var(--t-med) var(--ease) both}
.intro{margin-top:var(--s4);font-size:21px;line-height:1.38;letter-spacing:.011em;color:var(--ink2);max-width:var(--prose);
  animation:fade var(--t-med) 80ms var(--ease) both}

/* projects index */
.rows{list-style:none;margin-top:var(--s8);border-top:1px solid var(--line)}
.row{display:grid;grid-template-columns:200px 88px minmax(0,1fr) 32px;gap:var(--gutter);align-items:center;padding:var(--s5) 0;
  border-bottom:1px solid var(--line);text-decoration:none;color:inherit}
.row .thumb{border-radius:var(--r-md)}
.rt{display:flex;flex-direction:column;gap:var(--s1);min-width:0}
.rh{font-weight:600;font-size:21px;line-height:1.19;letter-spacing:.011em;color:var(--ink)}
.rl{font-size:17px;line-height:1.47;color:var(--muted);max-width:64ch}
.tags{font-size:12px;letter-spacing:-.01em;color:var(--dim);margin-top:var(--s1)}
.go{font-size:21px;color:var(--dim);transition:transform var(--t-fast) var(--ease),color var(--t-fast) var(--ease);justify-self:end}
.row:hover .go{color:var(--ink);transform:translateX(4px)}

/* project detail */
.crumb{display:flex;justify-content:space-between;font-size:14px;letter-spacing:-.016em;color:var(--muted);margin-bottom:var(--s7)}
.crumb a{color:var(--ink);text-decoration:none}.crumb a:hover{text-decoration:underline;text-underline-offset:3px}
.meta{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:var(--s5) var(--s7);margin-top:var(--s6);padding-top:var(--s5);border-top:1px solid var(--line)}
.meta dl{display:flex;flex-wrap:wrap;gap:var(--s4) var(--s7)}
.meta dt,.facts dt{font:600 12px/1.33 var(--sans);letter-spacing:-.01em;color:var(--muted)}
.meta dd{font-size:14px;line-height:1.43;letter-spacing:-.016em;color:var(--ink);margin-top:var(--s1)}
.pills{display:flex;flex-wrap:wrap;gap:var(--s2)}
.pills a{display:inline-flex;align-items:center;min-height:44px;padding:0 var(--s5);border-radius:var(--r-pill);text-decoration:none;
  font:400 14px/1 var(--sans);letter-spacing:-.016em;color:var(--ink);--glass-depth:16;transition:transform var(--t-fast) var(--ease)}
.pills a:hover{transform:translateY(-1px)}
.fig{margin:0}
.fig img{display:block;width:100%;height:auto;border-radius:var(--r-md);background:var(--bg2)}
.fig figcaption{font-size:12px;line-height:1.33;letter-spacing:-.01em;color:var(--muted);margin-top:var(--s3)}
.fig.cover{margin-top:var(--s7);max-width:var(--max)}
.fig.cover img{border-radius:var(--r-lg)}
.fig.cover.light{max-width:1000px}
.fig.cover.dark{max-width:760px}
.fig.cover.dark img{background:#0b0908}
.fig.cover.photo img{max-height:72vh;object-fit:cover}
.prose{max-width:var(--prose);margin:var(--s8) 0 0 clamp(0px,calc(100% - var(--prose) - 120px),264px);font-size:17px;line-height:1.47;color:var(--ink2)}
.prose>*+*{margin-top:var(--s5)}
.prose p b,.prose li b{color:var(--ink);font-weight:600}
.prose a,.more-p a{color:var(--ink);text-decoration:underline;text-decoration-color:var(--line);text-underline-offset:3px;transition:text-decoration-color var(--t-fast) var(--ease)}
.prose a:hover,.more-p a:hover{text-decoration-color:var(--ink)}
.bh{margin-top:var(--s8)!important;font-weight:600;font-size:28px;line-height:1.14;letter-spacing:.007em;color:var(--ink)}
.bh .lab{margin-bottom:var(--s2)}
.prose .bh:first-child{margin-top:0!important}
.bl{list-style:none;display:grid;gap:var(--s3)}
.bl li{position:relative;padding-left:var(--s5)}
.bl li::before{content:"";position:absolute;left:4px;top:.62em;width:6px;height:6px;border-radius:50%;background:var(--ink)}
.fig.narrow{max-width:560px}
.prose .fig{margin-top:var(--s6);margin-bottom:var(--s3)}
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:2px;background:rgba(255,255,255,.9);border-radius:var(--r-lg);overflow:hidden;margin-top:var(--s6)!important}
.stats div{background:rgba(245,245,247,.86);padding:var(--s5)}
.stats dt{font-weight:600;font-size:28px;line-height:1.14;letter-spacing:.007em;color:var(--ink)}
.stats dd{margin-top:var(--s2);font-size:14px;line-height:1.43;letter-spacing:-.016em;color:var(--muted)}
.src{font-size:12px;color:var(--muted);border-top:1px solid var(--line);padding-top:var(--s4);margin-top:var(--s8)!important}
.pn{display:grid;grid-template-columns:1fr 1fr;gap:var(--gutter);margin-top:var(--s9)}
.pn a{display:flex;flex-direction:column;gap:var(--s2);padding:var(--s5);border-radius:var(--r-lg);text-decoration:none;
  transition:transform var(--t-med) var(--ease)}
.pn a:hover{transform:translateY(-2px)}
.pn .next{text-align:right}
.pn .k{font-size:12px;letter-spacing:-.01em;color:var(--muted)}
.pn .t{font-weight:600;font-size:21px;line-height:1.19;letter-spacing:.011em;color:var(--ink)}

/* about */
.agrid{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);gap:var(--s8);align-items:start;margin-top:var(--s8)}
.facts{border-top:1px solid var(--line)}
.facts div{display:grid;grid-template-columns:120px 1fr;gap:var(--s4);padding:var(--s4) 0;border-bottom:1px solid var(--line)}
.facts dt{padding-top:4px}
.facts dd{font-size:17px;line-height:1.47;color:var(--ink)}
.cta{border-radius:var(--r-lg);display:flex;flex-direction:column;gap:var(--s5);padding:var(--s6)}
.cta-main{display:flex;flex-direction:column;gap:var(--s2);text-decoration:none}
.cta-main .k{font:600 12px/1.33 var(--sans);letter-spacing:-.01em;color:var(--muted)}
.cta-main .v{font-weight:600;font-size:40px;line-height:1.1;letter-spacing:0;color:var(--ink)}
.cta-links{display:flex;flex-wrap:wrap;gap:var(--s2) var(--s5);padding-top:var(--s4);border-top:1px solid var(--line)}
.cta-links a{font-size:14px;letter-spacing:-.016em;text-decoration:none;color:var(--ink)}
.cta-links a:hover{text-decoration:underline;text-underline-offset:3px}
.more-p{margin-top:var(--s8);max-width:var(--prose)}
.more-p p{font-size:17px;line-height:1.47;color:var(--ink2)}

/* ---------- footer ---------- */
.foot{display:flex;justify-content:space-between;gap:var(--s4);flex-wrap:wrap;margin-top:var(--s9);padding:var(--s5) 0 var(--s6);
  border-top:1px solid var(--line);font-size:12px;line-height:1.33;letter-spacing:-.01em;color:var(--muted)}
.foot .fl{display:flex;gap:var(--s5)}
.foot a{text-decoration:none;color:var(--ink2)}
.foot a:hover{color:var(--ink);text-decoration:underline;text-underline-offset:3px}

/* ---------- continuous (Apple-like) corners where supported ----------
   Best fit to Figma 0.6 / iOS: radius × 1.2 with superellipse(1.3) (max error ≈ 0.005 r).
   Nested radius keeps inner = outer − padding in the scaled space. Capsules stay round.
   Unsupported browsers (Safari, Firefox stable) keep plain circular radii. */
@supports (corner-shape:round){
  .card,.panel,.cta,.pn a,.stats,.fig.cover img{border-radius:calc(var(--r-lg)*1.2);corner-shape:superellipse(1.3)}
  .card .thumb{border-radius:calc(var(--r-lg)*1.2 - var(--card-pad));corner-shape:superellipse(1.3)}
  .row .thumb,.fig img{border-radius:calc(var(--r-md)*1.2);corner-shape:superellipse(1.3)}
}

/* ---------- responsive ---------- */
@media (max-width:1000px){
  .row{grid-template-columns:160px minmax(0,1fr) 28px}
  .row .rn{display:none}
}
@media (max-width:900px){
  .panel{grid-template-columns:1fr 1fr}
  .cell:first-child{grid-column:1/-1}
  .cell:nth-child(2){border-left:0;border-top:1px solid var(--line)}
  .cell:nth-child(3){border-top:1px solid var(--line)}
  .cards{grid-template-columns:1fr 1fr}
  .cards .card:nth-child(3){display:none}
  .agrid{grid-template-columns:1fr}
  .prose{margin-left:0}
}
@media (max-width:560px){
  .brand .bn{display:none}
  .brand{padding:0 var(--s3)}
  .nav a{padding:0 var(--s3)}
  .hero{padding:var(--s8) 0 var(--s7)}
  .lede{margin-top:var(--s6)}
  .lede p{font-size:19px}
  .panel{grid-template-columns:1fr}
  .cell+.cell,.cell:nth-child(3){border-left:0;border-top:1px solid var(--line)}
  .cards{grid-template-columns:1fr}
  .cards .card:nth-child(3){display:flex}
  .doc{padding-top:var(--s8)}
  .title{font-size:40px;line-height:1.1;letter-spacing:0}
  .intro{font-size:19px}
  .row{grid-template-columns:96px minmax(0,1fr);gap:var(--s4);align-items:start}
  .row .thumb{border-radius:var(--r-sm)}
  .row .go{display:none}
  .rl{font-size:14px;line-height:1.43}
  .meta dl{gap:var(--s4) var(--s6)}
  .bh{font-size:24px}
  .pn{grid-template-columns:1fr}
  .pn .next{text-align:left}
  .facts div{grid-template-columns:88px 1fr}
  .cta{padding:var(--s5)}
  .cta-main .v{font-size:28px}
  .stats{grid-template-columns:1fr}
  .stats div{display:grid;grid-template-columns:104px 1fr;gap:var(--s3);align-items:baseline;padding:var(--s4)}
  .stats dt{font-size:21px}
  .stats dd{margin-top:0}
  .foot .fl{gap:var(--s4)}
}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation:none!important;transition:none!important}
  .card:hover .thumb img,.row:hover .thumb img{transform:none}
}
