/* Booker Liao — CV. Hand-written, no framework. */
:root{
  --bg:#000;
  --tile:#0a0a0a;
  --tile-2:#050505;
  --line:rgba(187,187,187,.15);
  --line-strong:rgba(187,187,187,.32);
  --fg:#fff;
  --fg-2:#c9c9c9;      /* secondary, ≥ 4.5:1 on #0a0a0a */
  --fg-3:#9a9a9a;      /* tertiary, ≥ 4.5:1 on #0a0a0a */
  --green:#31ee33;
  --radius:14px;
  --gap:14px;
  --pad:28px;
  --display:"Instrument Sans","Inter",system-ui,sans-serif;
  --body:"Inter",system-ui,-apple-system,"Segoe UI",sans-serif;
  --cjk:"PingFang TC","Noto Sans TC","Microsoft JhengHei","Heiti TC",sans-serif;
  --ease:cubic-bezier(.2,.7,.2,1);
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth;background:var(--bg)}
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}
body{background:var(--bg);color:var(--fg);font-family:var(--body);font-size:15px;line-height:1.5;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
html[lang="zh-TW"] body{font-family:"Inter",var(--cjk),system-ui,sans-serif;line-height:1.7}
html[lang="zh-TW"] .display,html[lang="zh-TW"] .h2,html[lang="zh-TW"] h3,html[lang="zh-TW"] .label em{font-family:var(--display),var(--cjk)}
::selection{background:#fff;color:#000}
img{display:block;max-width:100%}
a{color:inherit;text-decoration:none}
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
:focus-visible{outline:2px solid #fff;outline-offset:3px;border-radius:6px}
.skip{position:absolute;left:-999px;top:8px;z-index:100;background:#fff;color:#000;padding:8px 12px;border-radius:8px}
.skip:focus{left:8px}
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* Scrollbars belong to the design too */
*{scrollbar-width:thin;scrollbar-color:rgba(187,187,187,.3) transparent}
::-webkit-scrollbar{width:8px;height:8px}
::-webkit-scrollbar-thumb{background:rgba(187,187,187,.3);border-radius:8px;border:2px solid var(--tile)}
::-webkit-scrollbar-track{background:transparent}

/* ---------- Board ---------- */
.board{
  display:grid;
  grid-template-columns:repeat(12,minmax(0,1fr));
  gap:var(--gap);
  max-width:1240px;
  margin:0 auto;
  padding:var(--gap) var(--gap) 40px;
}
.tile{
  position:relative;
  background:var(--tile);
  border:1px solid var(--line);
  border-radius:var(--radius);
  padding:var(--pad);
  overflow:hidden;
  isolation:isolate;
}
/* cursor-following light on the border and inside the tile */
.tile::before{
  content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;z-index:0;
  background:radial-gradient(420px circle at var(--mx,50%) var(--my,50%),rgba(255,255,255,.06),transparent 45%);
  opacity:0;transition:opacity .4s var(--ease)
}
.tile::after{
  content:"";position:absolute;inset:-1px;border-radius:inherit;pointer-events:none;z-index:1;
  padding:1px;
  background:radial-gradient(360px circle at var(--mx,50%) var(--my,50%),rgba(255,255,255,.55),transparent 42%);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude;
  opacity:0;transition:opacity .4s var(--ease)
}
.board.lit .tile:hover::before,.board.lit .tile:hover::after{opacity:1}
.tile>*{position:relative;z-index:2}

.h2{font-family:var(--display);font-weight:600;font-size:26px;letter-spacing:-.01em;line-height:1.1;text-transform:uppercase;margin-bottom:18px}
h3{font-family:var(--display);font-weight:600;font-size:16px;line-height:1.3}
p{color:var(--fg-2)}

/* ---------- Nav ---------- */
html.no-nav .nav{display:none}
.nav{
  grid-column:1/-1;position:sticky;top:var(--gap);z-index:50;
  display:flex;align-items:center;justify-content:space-between;gap:16px;
  padding:14px 22px;
  background:rgba(10,10,10,.82);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);
  overflow:visible
}
.nav::before,.nav::after{display:none}
.brand{display:flex;align-items:baseline;gap:12px;font-family:var(--display);font-weight:700;font-size:16px;letter-spacing:.02em}
.brand-zh{font-family:var(--cjk);font-weight:600;font-size:14px;color:var(--fg-2);letter-spacing:.2em}
.brand em{font-style:italic;font-weight:500;margin-right:1px}
.nav-links{display:flex;gap:28px;font-family:var(--display);font-weight:500;font-size:13px;letter-spacing:.06em;text-transform:uppercase}
.nav-links a{color:var(--fg-2);transition:color .2s}
.nav-links a:hover{color:#fff}
.nav-tools{display:flex;align-items:center;gap:10px}
.lang{display:flex;background:var(--tile-2);border:1px solid var(--line);border-radius:999px;padding:3px}
.lang button{font-family:var(--display);font-weight:600;font-size:12px;letter-spacing:.04em;padding:6px 11px;border-radius:999px;color:var(--fg-2);transition:background .25s var(--ease),color .25s}
.lang button[lang="zh-TW"]{font-family:var(--cjk)}
.lang button:hover{color:#fff}
.lang button[aria-pressed="true"]{background:#fff;color:#000}
.print{font-family:var(--display);font-weight:600;font-size:12px;letter-spacing:.04em;padding:8px 13px;border:1px solid var(--line-strong);border-radius:999px;color:var(--fg-2);transition:border-color .2s,color .2s}
.print:hover{color:#fff;border-color:#fff}

/* ---------- Row 1 ---------- */
.name{grid-column:span 5;display:flex;flex-direction:column;justify-content:flex-end;min-height:420px}
.display{font-family:var(--display);font-weight:700;text-transform:uppercase;line-height:.92;letter-spacing:-.025em;font-size:clamp(52px,6.2vw,88px);text-wrap:balance}
.display .name-en{display:flex;flex-direction:column}
.display .name-zh{display:none;font-family:var(--cjk);font-weight:700;letter-spacing:.04em;line-height:1.05}
html[lang="zh-TW"] .display .name-en{display:none}
html[lang="zh-TW"] .display .name-zh{display:block}
.name-sub{margin-top:14px;font-family:var(--display);font-weight:500;font-size:14px;letter-spacing:.22em;color:var(--fg-2);display:flex;gap:14px}
.name-sub-zh{font-family:var(--cjk);letter-spacing:.3em}
html[lang="zh-TW"] .name-sub-zh{display:none}
html:not([lang="zh-TW"]) .name-sub-en{display:none}
.role{margin-top:10px;font-size:15px;color:var(--fg-2)}
.status{display:inline-flex;align-items:center;gap:10px;margin-top:18px;align-self:flex-start;font-family:var(--display);font-weight:600;font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:#fff;border:1px solid var(--line-strong);border-radius:999px;padding:8px 14px 8px 12px}
.dot{width:8px;height:8px;border-radius:50%;background:var(--green);box-shadow:0 0 0 3px rgba(49,238,51,.18)}
.ai-line{display:flex;align-items:baseline;flex-wrap:wrap;gap:0 10px;margin-top:14px;font-family:var(--display);font-size:14px;color:#fff}
.ai-line svg{width:14px;height:14px;align-self:center;color:#fff;flex:none}
.ai-line>span{font-weight:600;letter-spacing:.02em}
.ai-line em{font-style:normal;font-weight:500;font-size:13px;color:var(--fg-3)}
.ai-line em::before{content:"";display:inline-block;width:18px;height:1px;background:var(--line-strong);vertical-align:middle;margin-right:10px}
.how-chips{margin-top:16px}
.skill-list li.lead h3{color:#fff}
.skill-list li.lead{counter-increment:none}
.skill-list li.lead::before{content:"AI";color:#fff}

.photo{grid-column:span 3;padding:0;min-height:420px}
.photo img{width:100%;height:100%;object-fit:cover;object-position:50% 28%;transform:scale(1.02);transition:transform .9s var(--ease)}
.photo:hover img{transform:scale(1.06)}
.photo figcaption{position:absolute;left:0;right:0;bottom:0;display:flex;justify-content:space-between;align-items:flex-end;padding:14px 16px;font-family:var(--display);font-weight:600;font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:#fff;background:linear-gradient(to top,rgba(0,0,0,.72),rgba(0,0,0,0));text-shadow:0 1px 2px rgba(0,0,0,.6)}

.experience{grid-column:span 4;grid-row:span 2;display:flex;flex-direction:column;padding-bottom:0}
.experience .scroll{overflow-y:auto;flex:1 1 auto;max-height:640px;padding-right:12px;padding-bottom:28px;
  -webkit-mask-image:linear-gradient(#000 calc(100% - 56px),transparent);mask-image:linear-gradient(#000 calc(100% - 56px),transparent)}
.job{padding:18px 0;border-top:1px solid var(--line)}
.job:first-child{border-top:0;padding-top:0}
.job h3{font-size:17px;margin-bottom:3px}
.job .org{font-family:var(--display);font-style:italic;font-weight:500;font-size:14px;color:var(--fg-2)}
.job .when{font-size:12px;letter-spacing:.04em;color:var(--fg-3);margin:2px 0 8px}
.job p:not(.org):not(.when){font-size:14px}
.job ul{margin:8px 0 0;padding-left:16px;font-size:13.5px;line-height:1.5;color:var(--fg-2)}
.job li{margin:4px 0;padding-left:2px}
.job li::marker{color:var(--fg-3)}

/* ---------- Row 2 ---------- */
.intro{grid-column:span 5;display:flex;align-items:center}
.intro p{font-size:16px;line-height:1.6;color:var(--fg-2);text-wrap:pretty}
.email{grid-column:span 3;display:flex;flex-direction:column;justify-content:space-between;min-height:220px;transition:background .3s var(--ease)}
.email:hover{background:#111}
.email .lead{font-size:14px;color:var(--fg-2);max-width:12ch}
.email .arrow{position:absolute;top:24px;right:24px;width:30px;height:30px;color:#fff;transition:transform .45s var(--ease)}
.email:hover .arrow{transform:translate(4px,-4px)}
.email .big{font-family:var(--display);font-weight:600;font-size:28px;letter-spacing:-.01em;text-transform:uppercase;line-height:1}
.email .addr{font-size:12px;color:var(--fg-3);margin-top:8px;overflow-wrap:anywhere}

/* ---------- Work ---------- */
.label{grid-column:span 4;display:flex;flex-direction:column;justify-content:center;gap:12px;min-height:100px;margin:0}
.label h2{margin:0}
.label em{font-family:var(--display);font-style:italic;font-weight:600;font-size:28px;letter-spacing:-.01em;text-transform:uppercase;line-height:1.1}
.label p{font-size:14px;color:var(--fg-2);max-width:30ch}
.work{grid-column:span 4;padding:0;min-height:320px;display:block;background:var(--tile-2);color:inherit}
a.work{cursor:pointer}
.work .arrow{position:absolute;top:18px;right:18px;z-index:5;width:36px;height:36px;padding:8px;border-radius:50%;border:1px solid var(--line-strong);color:#fff;background:rgba(10,10,10,.7);transition:transform .45s var(--ease),background .3s,border-color .3s}
.work:hover .arrow{background:#fff;color:#000;border-color:#fff;transform:translate(2px,-2px)}
.work .soon{font-family:var(--display);font-weight:600;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--fg-2);border:1px solid var(--line-strong);border-radius:999px;padding:7px 11px;white-space:nowrap}
.w-name{font-family:var(--display);font-weight:600;font-size:22px;letter-spacing:-.01em;color:#fff;display:block}
.w-kind{font-family:var(--display);font-style:italic;font-weight:500;font-size:13px;color:var(--fg-2);display:block;margin-top:2px}
.w-text{font-size:14px;line-height:1.55;color:var(--fg-2);display:block}
.chips{list-style:none;display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0}
.chips li{font-family:var(--display);font-weight:600;font-size:11.5px;letter-spacing:.02em;color:#fff;background:#161616;border:1px solid var(--line-strong);border-radius:999px;padding:6px 10px;white-space:nowrap}
/* frames */
.frame-web{display:block;border-radius:10px 10px 0 0;background:#161616;border:1px solid var(--line-strong);overflow:hidden;box-shadow:0 30px 60px -24px rgba(0,0,0,.9)}
.frame-web .bar{display:flex;align-items:center;gap:6px;height:26px;padding:0 10px;background:#1d1d1d;border-bottom:1px solid var(--line)}
.frame-web .bar i{width:8px;height:8px;border-radius:50%;background:#3a3a3a}
.frame-web .bar b{margin-left:8px;font:500 11px/1 Inter,sans-serif;color:#8a8a8a;letter-spacing:.02em}
.frame-web img{width:100%;height:auto;display:block}
.frame-phone{display:block;width:200px;border-radius:30px;background:#000;border:6px solid #1a1a1a;box-shadow:0 0 0 1px var(--line-strong),0 30px 60px -22px rgba(0,0,0,.95);overflow:hidden}
.frame-phone img{width:100%;height:auto;display:block}
.frame-land{display:block;border-radius:10px;border:1px solid var(--line);overflow:hidden;background:#000;box-shadow:0 30px 60px -24px rgba(0,0,0,.9)}
.frame-land img{width:100%;height:auto;display:block}
/* case tiles: copy + device composition */
.work.case{display:grid;overflow:hidden}
.work.case .case-copy{position:relative;z-index:2;display:flex;flex-direction:column;gap:10px;padding:28px}
.work.case .case-copy .w-text{margin-top:4px;max-width:40ch}
.work.case .case-copy .chips{margin-top:10px}
.work.case .case-media{position:relative;z-index:1;display:block}
.work.case .frame-web{position:absolute;left:0;top:34px;width:100%}
.work.case .frame-phone.over{position:absolute;width:150px;height:72%;left:-48px;bottom:-24px;border-radius:24px;z-index:2;transition:transform .7s var(--ease)}
.work.case .frame-phone.over img{width:100%;height:100%;object-fit:cover;object-position:top}
.work.case .frame-web{transition:transform .7s var(--ease)}
.work.case:hover .frame-web{transform:translateY(-8px)}
.work.case:hover .frame-phone.over{transform:translateY(-16px)}
.work.case.wide{grid-column:span 8;grid-template-columns:minmax(0,5fr) minmax(0,7fr);min-height:400px}
.work.case.wide .case-media{min-height:400px;padding-right:0}
.work.case.wide .frame-web{left:40px;top:40px;width:calc(100% - 40px);border-radius:10px 0 0 0}
.work.case.half{grid-column:span 6;grid-template-rows:auto 1fr;min-height:560px}
.work.case.half .case-media{min-height:280px;margin:8px 0 0 40px}
.work.case.half .frame-web{left:0;top:16px;width:100%;border-radius:10px 0 0 0}
/* app tiles */
.work.app{grid-column:span 3;min-height:430px}
.work.app .media{position:absolute;inset:0;display:flex;justify-content:center;align-items:flex-start;padding:26px 24px 0;overflow:hidden;transition:filter .6s var(--ease),transform .6s var(--ease)}
.work.app .media .frame-phone{width:min(100%,196px)}
.work.app .media .frame-land{margin-top:110px;width:100%}
.work.app .media .app-icon{position:absolute;top:84px;left:24px;width:40px;height:40px;border-radius:10px;box-shadow:0 10px 24px -10px rgba(0,0,0,.9)}
.work.app .cap{position:absolute;left:0;right:0;bottom:0;z-index:3;display:flex;align-items:flex-end;justify-content:space-between;gap:10px;padding:70px 18px 18px;background:linear-gradient(to top,rgba(5,5,5,.98) 0,rgba(5,5,5,.85) 50%,transparent)}
.work.app .cap-txt{display:flex;flex-direction:column;gap:2px;min-width:0}
.work.app .cap .w-name{font-size:18px}
.work.app .cap .chips{margin-top:8px}
.work.app .cap .chips li{font-size:10.5px;padding:5px 8px}
.work.app .cap .arrow,.work.app .cap .soon{position:static;flex:none}
.work.app .desc{position:absolute;left:18px;right:18px;top:26px;z-index:2;opacity:0;transform:translateY(8px);transition:opacity .4s var(--ease),transform .45s var(--ease)}
.work.app .desc .w-text{color:#fff}
.work.app:hover .media,.work.app:focus-visible .media{filter:blur(8px) brightness(.3);transform:scale(1.03)}
.work.app:hover .desc,.work.app:focus-visible .desc{opacity:1;transform:none}
/* automation tile */
.work.auto{grid-column:1/-1;display:grid;grid-template-columns:minmax(0,4fr) minmax(0,5fr) minmax(0,3fr);gap:0;min-height:300px;overflow:hidden}
.work.auto .case-copy{display:flex;flex-direction:column;gap:10px;padding:28px}
.work.auto .case-copy .chips{margin-top:10px}
.work.auto .auto-code{display:flex;align-items:center;padding:28px 10px 28px 0}
.work.auto pre{font:13px/1.7 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;color:#d6d6d6;white-space:pre;background:#0e0e0e;border:1px solid var(--line);border-radius:10px;padding:18px 20px;width:100%;overflow:hidden}
.work.auto .c{color:#7f7f7f}
.work.auto .auto-media{position:relative;display:block;overflow:hidden}
.work.auto .auto-media .frame-phone{position:absolute;left:50%;top:28px;transform:translateX(-50%);width:180px}
.work.auto .case-copy .soon{align-self:flex-start;margin-top:auto}
.work::before,.work::after{z-index:6}


/* two phones (Blackjack) */
.work.app .media .duo{position:absolute;inset:0;display:block}
.work.app .media .duo .frame-phone{position:absolute;width:150px}
.work.app .media .duo .back{left:12%;top:58px;transform:rotate(-6deg);opacity:.85}
.work.app .media .duo .front{right:10%;top:22px;width:168px;z-index:2}
/* automation tile: copy + phone */
.work.auto{grid-template-columns:minmax(0,7fr) minmax(0,5fr)}
.work.auto .auto-media .frame-phone{width:200px;top:26px}

/* ---------- Toolbox marquee ---------- */
.toolbox{grid-column:span 7;display:flex;flex-direction:column;justify-content:center;gap:12px}
.toolbox .h2{margin-bottom:6px}
.marquee{overflow:hidden;-webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent)}
.track{display:flex;gap:12px;width:max-content;animation:slide 48s linear infinite}
.track.reverse{animation-direction:reverse;animation-duration:56s}
.marquee:hover .track{animation-play-state:paused}
@keyframes slide{to{transform:translateX(-50%)}}
.tool{display:flex;align-items:center;gap:10px;height:64px;padding:0 18px 0 14px;background:var(--tile-2);border:1px solid var(--line);border-radius:12px;white-space:nowrap;font-family:var(--display);font-weight:600;font-size:14px}
.tool img{width:26px;height:26px;filter:invert(1);opacity:.92}
.tool .fallback{display:none;width:26px;height:26px;border-radius:7px;background:#1a1a1a;color:#fff;font-size:11px;font-weight:700;line-height:26px;text-align:center}
.tool.noicon img{display:none}.tool.noicon .fallback{display:block}

/* ---------- Expertise / contact / how / edu ---------- */
.skills{grid-column:span 5}
.skill-list{list-style:none;counter-reset:s}
.skill-list li{padding:16px 0;border-top:1px solid var(--line);counter-increment:s;display:grid;grid-template-columns:30px 1fr;column-gap:10px}
.skill-list li:first-child{border-top:0;padding-top:0}
.skill-list li::before{content:counter(s,decimal-leading-zero);font-family:var(--display);font-weight:600;font-size:12px;color:var(--fg-3);padding-top:4px;letter-spacing:.04em}
.skill-list h3{font-size:16px;margin-bottom:4px;grid-column:2}
.skill-list p{grid-column:2;font-size:14px}
.col{display:flex;flex-direction:column;gap:var(--gap)}
.col-a{grid-column:span 4}
.col-b{grid-column:span 5}
.avail{display:flex;align-items:center;gap:12px;padding:18px var(--pad);font-family:var(--display);font-weight:600;font-size:13px;letter-spacing:.06em;color:#fff}
.form{display:flex;flex-direction:column;flex:1}
.form label{font-size:13px;color:var(--fg-2);margin:12px 0 6px}
.form label:first-of-type{margin-top:0}
.form input,.form textarea{width:100%;background:var(--tile-2);border:1px solid var(--line);border-radius:10px;padding:11px 12px;color:#fff;font:inherit;transition:border-color .2s}
.form input::placeholder,.form textarea::placeholder{color:#8f8f8f}
.form input:focus,.form textarea:focus{outline:0;border-color:#fff}
.form textarea{resize:vertical;min-height:120px}
.form .submit{margin-top:16px;background:#fff;color:#000;font-family:var(--display);font-weight:600;font-size:14px;padding:12px 16px;border-radius:10px;transition:transform .3s var(--ease),background .2s}
.form .submit:hover{background:#eaeaea;transform:translateY(-1px)}
.form .note{font-size:12px;color:var(--fg-3);margin-top:12px}
.form .alt{display:flex;flex-direction:column;gap:4px;margin-top:auto;padding-top:18px;font-size:13px}
.form .alt a{color:var(--fg-2);border-bottom:1px solid transparent;transition:color .2s,border-color .2s;align-self:flex-start}
.form .alt a:hover{color:#fff;border-color:#fff}
.how p{font-size:15px;line-height:1.6}
.sig{margin-top:22px;font-family:"Instrument Sans",cursive;font-style:italic;font-weight:500;font-size:30px;letter-spacing:-.02em;color:#fff;opacity:.9}
.edu dl{display:flex;flex-direction:column}
.edu dl>div{display:flex;justify-content:space-between;gap:16px;padding:12px 0;border-top:1px solid var(--line)}
.edu dl>div:first-child{border-top:0;padding-top:0}
.edu dt{font-family:var(--display);font-weight:600;font-size:15px}
.edu dd{font-size:13px;color:var(--fg-3);white-space:nowrap}

/* ---------- Numbers / footer ---------- */
.numbers{grid-column:span 3;display:flex;flex-direction:column}
.num-grid{display:grid;grid-template-columns:1fr;gap:var(--gap);flex:1}
.num-grid>div{padding:22px 24px;justify-content:flex-end;background:var(--tile-2);border:1px solid var(--line);border-radius:12px;display:flex;flex-direction:column;gap:6px}
.num-grid b{font-family:var(--display);font-weight:700;font-size:56px;line-height:1;letter-spacing:-.03em;font-variant-numeric:tabular-nums}
.num-grid span{font-size:14px;color:var(--fg-2)}
.foot{grid-column:1/-1;display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;padding:20px var(--pad)}
.foot p{font-size:13px;color:var(--fg-2)}
.foot .kbd{font-size:12px;color:var(--fg-3)}
.social{display:flex;gap:10px}
.social a{display:grid;place-items:center;width:52px;height:52px;border:1px solid var(--line);border-radius:12px;background:var(--tile-2);color:var(--fg-2);transition:color .2s,border-color .2s,transform .3s var(--ease)}
.social a:hover{color:#fff;border-color:var(--line-strong);transform:translateY(-2px)}
.social svg{width:22px;height:22px}

/* ---------- Reveal + language crossfade ---------- */
/* JS marks only the tiles that start below the fold with .pending; nothing is ever hidden without it */
.reveal.pending{opacity:0;transform:translateY(22px)}
.reveal.pending.in{opacity:1;transform:none;transition:opacity .8s var(--ease),transform .8s var(--ease);transition-delay:calc(var(--i,0) * 45ms)}
.swapping [data-i18n],.swapping [data-i18n-html]{animation:fadeswap .36s var(--ease)}
@keyframes fadeswap{0%{opacity:0;transform:translateY(4px)}100%{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){
  .reveal.pending{opacity:1;transform:none;transition:none}
  .track{animation:none}
  .swapping [data-i18n]{animation:none}
  .photo img,.work .media,.email .arrow{transition:none}
}

/* ---------- Responsive ---------- */
@media (max-width:1100px){
  .name{grid-column:span 6}.photo{grid-column:span 6}
  .experience{grid-column:span 12;grid-row:auto}
  .intro{grid-column:span 8}.email{grid-column:span 4}
  .label{grid-column:span 12;min-height:80px}
  .work.case.wide,.work.case.half{grid-column:span 12}.work.case.half{min-height:520px}
  .work.app{grid-column:span 6}
  .work.auto{grid-template-columns:1fr 1fr}
  .toolbox{grid-column:span 12}
  .col-b{grid-column:span 12}.col-a{grid-column:span 6}.skills{grid-column:span 6}
  .numbers{grid-column:span 12}.num-grid{grid-template-columns:repeat(3,1fr)}
}
@media (max-width:720px){
  :root{--pad:22px;--gap:12px}
  .board{padding:12px 12px 28px}
  .nav{padding:12px 14px;flex-wrap:wrap;top:8px}
  .nav-links{display:none}
  .brand-zh{display:none}
  .nav-tools{margin-left:auto}
  .name,.photo,.experience,.intro,.email,.label,.work,.work.wide,.toolbox,.skills,.col-a,.col-b,.numbers,.foot{grid-column:1/-1}
  .name{min-height:0;padding-top:40px}
  .display{font-size:clamp(48px,15vw,72px)}
  .photo{min-height:0;aspect-ratio:4/5}
  .experience .scroll{max-height:520px}
  .work.case.wide,.work.case.half,.work.app,.work.auto{grid-column:1/-1;min-height:0}
  .work.case.wide{grid-template-columns:1fr}
  .work.case .case-media,.work.case.wide .case-media,.work.case.half .case-media{min-height:230px;margin:0 0 0 24px}
  .work.case.wide .frame-web,.work.case.half .frame-web{left:0;top:10px;width:100%}
  .work.case .frame-phone.over{width:120px;height:70%;left:-20px;bottom:-24px}
  .work.case .case-copy{padding:22px}
  .work.app{display:flex;flex-direction:column}
  .work.app .media{position:relative;height:250px;flex:none;padding:18px 18px 0}
  .work.app .media .frame-phone{width:150px}
  .work.app .cap{position:static;padding:16px 18px 18px;background:none}
  .work.app .desc{position:static;opacity:1;transform:none;padding:0 18px 18px;order:3}
  .work.app .desc .w-text{color:var(--fg-2)}
  .work.app:hover .media,.work.app:focus-visible .media{filter:none;transform:none}
  .work.auto{grid-template-columns:1fr}.work.auto .auto-media{position:relative;height:240px;order:-1}
  .work.app .media .duo .back{left:6%;top:40px}.work.app .media .duo .front{right:6%;top:14px;width:150px}
  .print{display:none}
  .num-grid{grid-template-columns:1fr}
  .num-grid b{font-size:44px}
  .foot{justify-content:center;text-align:center}
}

/* ---------- Print: a proper CV on paper ---------- */
@media print{
  @page{size:A4;margin:14mm}
  html,body{background:#fff;color:#111}
  body{font-size:10pt;line-height:1.38}
  .board{display:block;max-width:none;padding:0}
  .tile{background:#fff;border:0;border-radius:0;padding:0;margin:0 0 9mm;overflow:visible;break-inside:avoid;opacity:1;transform:none}
  .tile::before,.tile::after{display:none}
  .nav,.skip,.marquee,.sig,.kbd,.social,.email,.work .arrow,.status .dot,.avail,.form input,.form textarea,.form .submit,.form .note,.form label,.photo figcaption,.work .media,.work .desc{display:none!important}
  .reveal{opacity:1!important;transform:none!important;transition:none!important}
  .job:last-child{display:none}
  .intro p{font-size:10pt}
  .experience,.skills,.toolbox,.how,.intro{break-inside:auto}
  .col-a,.col-b{display:block}
  p,.intro p,.how p,.job p,.job .org,.job .when,.num-grid span,.foot p,.work .w-kind,.work .w-text,.edu dd,.skill-list p{color:#222}
  .job .when,.edu dd,.num-grid span{color:#555}
  .label{break-after:avoid}
  .h2{font-size:13pt;margin-bottom:4mm;border-bottom:1px solid #111;padding-bottom:1.5mm}
  .name{min-height:0;display:block}
  .display{font-size:30pt;line-height:1;color:#000}
  .name-sub,.role{color:#333}
  .status{border:0;padding:0;margin-top:2mm;color:#333}
  .board{position:relative}
  .name{min-height:44mm;padding-right:42mm}
  .photo{position:absolute;top:0;right:0;width:34mm;margin:0;aspect-ratio:4/5;min-height:0}
  .photo img{transform:none;border-radius:2mm}
  .experience .scroll{max-height:none;overflow:visible;padding:0;mask-image:none;-webkit-mask-image:none}
  .job{border-top:1px solid #ddd;padding:3mm 0}
  .job ul{color:#222;font-size:9.5pt;margin-top:1.5mm}
  .job li{margin:1mm 0}
  .label{min-height:0}.label em{font-size:13pt;border-bottom:1px solid #111;display:block;padding-bottom:1.5mm}
  .work,.work.tall,.work.wide{min-height:0!important;display:inline-block;width:47%;vertical-align:top;cursor:auto;break-inside:avoid;margin:0 2% 4mm 0;padding-left:0}
  .work .cap{position:static;padding:0;background:none;display:block}
  .work .cap-txt{display:block}
  .work .arrow,.work .soon{display:none}
  .label p{display:none}
  .work .w-name{font-size:11.5pt;color:#000}
  .toolbox .sr-only{position:static;width:auto;height:auto;clip:auto;white-space:normal;display:flex;flex-wrap:wrap;gap:2mm 4mm;list-style:none;color:#333}
  .skill-list li{border-top:1px solid #ddd}
  .skill-list li::before{color:#666}
  .form .alt{display:block;padding:0}
  .form .alt a{display:inline-block;margin-right:6mm;color:#000}
  .form .alt a::after{content:""}
  .edu dl>div{border-top:1px solid #ddd}
  .num-grid>div{border:0;padding:0;background:#fff}
  .num-grid b{font-size:20pt;color:#000}
  .foot{display:block;margin-top:6mm;padding-top:3mm;border-top:1px solid #ddd}
  a[href^="http"]::after{content:" (" attr(href) ")";font-size:8.5pt;color:#555}
}
