

:root { --ink:#152720; --muted:#637069; --line:#dce3df; --paper:#f7f8f5; --white:#fff; --green:#136c4a; --mint:#dcefe5; }
* { box-sizing:border-box; }
html { scroll-behavior:smooth; scroll-padding-top:90px; }
body { margin:0; background:var(--paper); color:var(--ink); font-family:Inter,"PingFang SC","Microsoft YaHei",Arial,sans-serif; }
a { color:inherit; text-decoration:none; }
.shell { width:min(1120px, calc(100% - 48px)); margin-inline:auto; }
.nav-wrap { position:sticky; top:0; z-index:20; background:rgba(247,248,245,.9); border-bottom:1px solid rgba(220,227,223,.85); backdrop-filter:blur(14px); }
.nav { height:74px; display:flex; align-items:center; justify-content:space-between; }
.monogram { display:grid; place-items:center; width:38px; height:38px; border:1px solid var(--ink); border-radius:50%; font-family:Georgia,serif; font-size:14px; font-weight:700; }
.nav-links { display:flex; gap:34px; font-size:14px; color:#4f5c56; }
.nav-links a:hover { color:var(--green); }
.nav-cta { padding:10px 17px; border:1px solid #bbc6c0; border-radius:999px; font-size:13px; }
.hero { min-height:660px; display:grid; grid-template-columns:1.25fr .75fr; grid-template-rows:1fr auto; column-gap:110px; align-items:center; padding-top:78px; padding-bottom:40px; }
.eyebrow { display:flex; align-items:center; gap:10px; color:var(--green); font-size:13px; font-weight:700; letter-spacing:.09em; text-transform:uppercase; }
.eyebrow span { width:26px; height:1px; background:var(--green); }
.hero h1 { margin:24px 0 0; font-family:Georgia,"Songti SC",serif; font-size:clamp(70px,9vw,118px); line-height:.95; letter-spacing:-.055em; font-weight:500; }
.hero h2 { margin:20px 0 0; color:var(--green); font-size:clamp(23px,2.6vw,34px); font-weight:500; letter-spacing:.04em; }
.intro { max-width:640px; margin:28px 0 0; color:#53615a; font-size:18px; line-height:1.9; }
.hero-actions { display:flex; gap:12px; margin-top:34px; }
.button { display:inline-flex; align-items:center; gap:22px; padding:14px 22px; border-radius:4px; font-size:14px; font-weight:600; }
.button.primary { background:var(--green); color:white; }.button.secondary { border:1px solid #b9c3be; }
.portrait { position:relative; justify-self:end; width:min(100%,330px); aspect-ratio:4/5; display:flex; flex-direction:column; align-items:center; justify-content:center; overflow:hidden; border-radius:180px 180px 12px 12px; background:linear-gradient(145deg,#dce8df,#edf1ed); border:1px solid #d1dad5; color:#708078; }
.portrait:before,.portrait:after { content:""; position:absolute; border:1px solid rgba(19,108,74,.14); border-radius:50%; }.portrait:before{width:270px;height:270px}.portrait:after{width:210px;height:210px}
.portrait-mark { z-index:1; display:grid; place-items:center; width:110px;height:110px;border-radius:50%;background:#f7faf7;border:1px solid #cad7d0;font-family:Georgia,"Songti SC",serif;font-size:54px;color:var(--green); }
.portrait p { z-index:1; margin:22px 0 4px; font-weight:700; color:#43534b; }.portrait span { z-index:1; font-size:12px; padding:4px 9px; border-radius:20px; background:#fff9da; color:#79690d; }
.hero-meta { grid-column:1/-1; display:grid; grid-template-columns:repeat(3,1fr); padding-top:31px; border-top:1px solid var(--line); }
.hero-meta div { display:flex; justify-content:space-between; padding-right:55px; font-size:13px; }.hero-meta span { color:#7a867f; }.hero-meta strong { font-weight:600; }
.section { padding-top:112px; padding-bottom:112px; border-top:1px solid var(--line); }
.section-title { display:flex; align-items:baseline; gap:18px; margin-bottom:58px; }.section-title span { color:var(--green); font-size:12px; font-weight:800; letter-spacing:.13em; text-transform:uppercase; }.section-title h2 { margin:0; font-family:Georgia,"Songti SC",serif;font-size:37px;font-weight:500; }
.about-grid { display:grid; grid-template-columns:1fr 1fr; gap:100px; }.lead { margin:0;font-family:Georgia,"Songti SC",serif;font-size:30px;line-height:1.6; }.about-body p { margin:0 0 22px;color:#56635c;font-size:16px;line-height:2; }
.timeline { border-top:1px solid var(--ink); }.job { display:grid;grid-template-columns:230px 1fr;gap:34px;padding:43px 0;border-bottom:1px solid var(--line); }.job time { color:var(--green);font-size:14px;font-weight:700; }.job h3 { margin:0;font-size:20px; }.role { margin:8px 0 20px;color:#718078;font-size:14px; }.job ul,.project ul { margin:0;padding:0;list-style:none; }.job li { position:relative;margin:8px 0;padding-left:16px;color:#59665f;line-height:1.75; }.job li:before { content:"";position:absolute;left:0;top:.75em;width:4px;height:4px;border-radius:50%;background:var(--green); }
.edu-card { display:flex;align-items:center;gap:22px;padding:32px;border:1px solid var(--line);background:white; }.edu-icon { display:grid;place-items:center;width:60px;height:60px;border-radius:50%;background:var(--mint);color:var(--green);font-family:Georgia,"Songti SC",serif;font-size:24px; }.edu-card h3 { margin:0 0 7px;font-size:20px; }.edu-card p { margin:0;color:var(--muted); }.missing { margin-left:auto;text-align:right; }.missing span,.placeholder strong { display:inline-block;padding:4px 8px;background:#fff6c8;color:#71610a;font-size:12px;font-weight:700; }.missing p { margin-top:6px;font-size:13px; }
.skills-grid { display:grid;grid-template-columns:repeat(2,1fr); }.skill { min-height:180px;padding:30px;border-top:1px solid var(--line); }.skill:nth-child(odd) { border-right:1px solid var(--line); }.skill span { color:#8a958f;font-family:Georgia,serif;font-size:12px; }.skill h3 { margin:18px 0 11px;font-size:17px; }.skill p { margin:0;color:#647169;line-height:1.75;font-size:14px; }
.projects-section { width:100%;max-width:none;background:var(--ink);color:#f6f8f6; }.projects-section .section-title span { color:#7fc8a5; }.project-list { display:grid;grid-template-columns:repeat(3,1fr);gap:18px; }.project { display:flex;flex-direction:column;min-height:560px;padding:30px;background:#1d332b;border:1px solid #30473e;border-radius:6px;transition:transform .25s,background .25s; }.project:hover { transform:translateY(-5px);background:#223b32; }.project-top { display:flex;justify-content:space-between;gap:14px;align-items:center; }.project-index { color:#80bba0;font-family:Georgia,serif; }.project-tag { color:#a9b8b0;font-size:11px;text-align:right; }.project h3 { margin:48px 0 13px;font-family:Georgia,"Songti SC",serif;font-size:30px;font-weight:500; }.project-desc { margin:0 0 30px;color:#b9c6c0;font-size:14px;line-height:1.8; }.project-details { display:grid;gap:24px; }.project h4 { margin:0 0 9px;color:#7fc8a5;font-size:12px; }.project li { margin:6px 0;color:#cbd4cf;font-size:12px;line-height:1.55; }.project a { margin-top:auto;padding-top:25px;border-top:1px solid #3c5149;color:#dce8e1;font-size:13px;display:flex;justify-content:space-between; }
.contact { padding-top:120px;padding-bottom:120px; }.contact h2 { margin:24px 0;font-family:Georgia,"Songti SC",serif;font-size:clamp(46px,7vw,82px);font-weight:500;letter-spacing:-.04em; }.contact>p:not(.eyebrow) { max-width:600px;color:#627068;font-size:16px;line-height:1.8; }.contact-grid { display:grid;grid-template-columns:repeat(4,1fr);gap:1px;margin-top:65px;background:var(--line);border:1px solid var(--line); }.contact-grid>* { min-height:116px;padding:22px;background:var(--paper);display:flex;flex-direction:column;justify-content:space-between; }.contact-grid span { color:#7a867f;font-size:12px; }.contact-grid strong { font-size:14px;overflow-wrap:anywhere; }.contact-grid a:hover strong { color:var(--green); }
footer { border-top:1px solid var(--line); }.footer,.footer{} footer>div { min-height:80px;display:flex;align-items:center;justify-content:space-between;font-size:12px;color:#7b8780; } footer strong { color:#3f4e46; }
@media (max-width:850px) { .hero { grid-template-columns:1fr .48fr;column-gap:40px; }.about-grid{gap:50px}.project-list{grid-template-columns:1fr}.project{min-height:auto}.contact-grid{grid-template-columns:1fr 1fr} }
@media (max-width:640px) { .shell{width:min(100% - 32px,1120px)}.nav{height:64px}.nav-links{overflow-x:auto;gap:20px;margin:0 16px}.nav-links a:nth-child(2),.nav-links a:nth-child(3){display:none}.nav-cta{display:none}.hero{min-height:auto;grid-template-columns:1fr;padding-top:52px}.hero h1{font-size:72px}.intro{font-size:16px}.portrait{grid-row:2;width:190px;justify-self:start;margin-top:48px}.hero-meta{grid-row:3;margin-top:45px;grid-template-columns:1fr;gap:14px}.hero-meta div{padding-right:0}.section{padding-top:80px;padding-bottom:80px}.section-title{margin-bottom:40px}.section-title h2{font-size:31px}.about-grid{grid-template-columns:1fr;gap:34px}.lead{font-size:25px}.job{grid-template-columns:1fr;gap:16px}.edu-card{align-items:flex-start;flex-wrap:wrap}.missing{width:100%;margin:8px 0 0;text-align:left}.skills-grid{grid-template-columns:1fr}.skill:nth-child(odd){border-right:0}.project{padding:24px}.project h3{margin-top:34px}.contact-grid{grid-template-columns:1fr}.contact h2{font-size:48px}footer>div{align-items:flex-start;flex-direction:column;justify-content:center;gap:8px}.hero-actions{flex-wrap:wrap} }
@media (prefers-reduced-motion: reduce) { html{scroll-behavior:auto}.project{transition:none} }

.nav { gap: 12px; }
.monogram, .fitness-nav, .nav-cta { flex-shrink: 0; }
.fitness-nav, .button.fitness-button {
  background: var(--green);
  color: var(--white);
}
.fitness-nav {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding-inline: 16px;
  border-radius: 999px;
  font-size: 14px;
  font-weight: 700;
  white-space: nowrap;
}
.hero-actions { flex-wrap: wrap; }

@media (max-width: 850px) {
  .nav-links { gap: 16px; }
}

@media (max-width: 640px) {
  html { scroll-padding-top: 122px; }
  .nav {
    height: auto;
    min-height: 64px;
    flex-wrap: wrap;
    row-gap: 0;
    padding-top: 8px;
  }
  .nav-links {
    order: 1;
    flex: 0 0 100%;
    flex-wrap: wrap;
    gap: 0 16px;
    margin: 0;
    overflow: visible;
  }
  .nav-links a { display: inline-flex; align-items: center; min-height: 44px; }
  .fitness-button { order: -1; }
}

.gomoku-nav { flex-shrink:0; display:inline-flex; align-items:center; min-height:44px; padding:0 12px; white-space:nowrap; font-weight:700; color:var(--green); }
.nav-links { min-width:0; }
@media (max-width: 850px) {
  .nav-cta { display:none; }
}
@media (max-width: 640px) {
  .nav { display:grid; grid-template-columns:1fr auto auto; gap:0 8px; }
  .nav-links { grid-column:1/-1; grid-row:2; flex-wrap:nowrap; overflow-x:auto; gap:16px; }
  .nav-links a { white-space:nowrap; }
}

.resume-home { padding-top:calc(75px + env(safe-area-inset-top, 0px)); }
.resume-home .nav-wrap {
 position:fixed; inset:0 0 auto; padding-top:env(safe-area-inset-top, 0px);
 background:#f7f8f5;
}
@media (max-width:640px) {
 .resume-home { padding-top:calc(97px + env(safe-area-inset-top, 0px)); }
}

.resume-home .nav-wrap { background:var(--paper, #f7f8f5); backdrop-filter:none; }
.resume-home .nav-wrap::before {
 content:""; position:absolute; inset:auto 0 100%; height:140px;
 background:inherit; pointer-events:none;
}
.resume-home .gomoku-nav, .resume-home .fitness-nav {
 display:inline-flex; align-items:center; min-height:44px; padding:0 12px;
 background:transparent; color:var(--green); border-radius:0;
 font-size:14px; font-weight:700; white-space:nowrap;
}

.resume-home .nav { display:flex; flex-wrap:nowrap; height:74px; min-height:0; padding-top:0; gap:8px; }
.resume-home .nav-links { order:0; flex:0 1 auto; display:flex; align-items:center; flex-wrap:nowrap; gap:clamp(4px,2vw,24px); margin:0; overflow-x:auto; }
.resume-home .nav-links a { display:inline-flex; flex-shrink:0; align-items:center; min-height:44px; padding:0 4px; color:inherit; font-size:14px; font-weight:500; }
.resume-home .nav-links a:hover { color:var(--green); }
@media (max-width:640px) {
 .resume-home { padding-top:calc(57px + env(safe-area-inset-top, 0px)); }
 .resume-home .nav { height:56px; }
}

.gomoku{min-height:100vh;padding:28px;background:#eff3ef;color:#18251f;font-family:Inter,"PingFang SC",sans-serif}.back{display:inline-block;margin:0 0 24px;color:#176743}.game-shell{max-width:1050px;margin:auto;background:#fff;border:1px solid #d8e1db;border-radius:16px;padding:clamp(20px,5vw,48px);box-shadow:0 20px 55px #19312112}.game-head{display:flex;justify-content:space-between;gap:20px;align-items:start}.game-head p{margin:0;color:#1a704b;font-size:12px;letter-spacing:.14em;font-weight:800}.game-head h1{font-family:Georgia,"Songti SC",serif;margin:10px 0;font-size:clamp(34px,5vw,52px);font-weight:500}.room-pill{padding:10px 14px;border-radius:99px;background:#e7f3ec;color:#176743;font-size:13px}.lobby{display:flex;align-items:end;gap:10px;margin-top:26px;padding:15px;border:1px solid #dce4df;border-radius:10px;background:#f8faf8}.lobby label{display:grid;gap:6px;font-size:12px;color:#65736a}.lobby input,.join input{height:39px;padding:0 11px;border:1px solid #bfcac3;border-radius:5px;background:#fff;font-size:14px}.lobby button{height:39px;border:0;border-radius:5px;padding:0 14px;background:#176743;color:#fff;font-weight:700;cursor:pointer}.lobby .outline{background:#fff;color:#176743;border:1px solid #176743}.join{display:flex;gap:8px;margin-left:auto}.notice{min-height:24px;color:#607068;font-size:14px}.game-grid{display:grid;grid-template-columns:minmax(0,620px) 1fr;gap:35px;align-items:start}.board{aspect-ratio:1;display:grid;grid-template-columns:repeat(15,1fr);padding:8px;background:#d5a55c;border:8px solid #9c6d31;box-shadow:inset 0 0 20px #77532155}.cell{position:relative;border:0;background:linear-gradient(#6b4c292e 1px,transparent 1px),linear-gradient(90deg,#6b4c292e 1px,transparent 1px);background-size:100% 100%;cursor:pointer}.cell:after{content:"";position:absolute;width:76%;height:76%;left:12%;top:12%;border-radius:50%;transform:scale(0);transition:transform .14s}.cell.black:after,.cell.white:after{transform:scale(1)}.cell.black:after{background:radial-gradient(circle at 32% 28%,#59615e,#0e1210 68%);box-shadow:1px 2px 4px #4c311c}.cell.white:after{background:radial-gradient(circle at 32% 28%,#fff,#d9dfda 68%);box-shadow:1px 2px 4px #4c311c}aside{border-top:2px solid #176743;padding-top:16px}aside h2{margin:0 0 20px;font-family:Georgia,"Songti SC",serif;font-size:25px}.players{border-block:1px solid #dce4df;padding:10px 0}.players p{display:flex;align-items:center;gap:9px}.stone{display:inline-block;width:13px;height:13px;border-radius:50%}.black-dot{background:#172019}.white-dot{background:#fff;border:1px solid #95a39a}.hint{font-size:13px;line-height:1.7;color:#65736a}@media(max-width:760px){.game-head{display:block}.room-pill{display:inline-block;margin-top:6px}.lobby,.join{display:grid;grid-template-columns:1fr;margin:0;align-items:stretch}.lobby{margin-top:20px}.game-grid{grid-template-columns:1fr;gap:24px}.gomoku{padding:16px}.game-shell{padding:20px}.board{border-width:5px;padding:5px}}

/* A playable point is an intersection: center every cell on its crosshair. */
.cell {
  background: linear-gradient(90deg, transparent calc(50% - .5px), #6b4c292e calc(50% - .5px), #6b4c292e calc(50% + .5px), transparent calc(50% + .5px));
}

.cell::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: calc(50% - .5px);
  height: 1px;
  background: #6b4c292e;
  pointer-events: none;
}

.cell.last-move::after{outline:3px solid #f7d04b;outline-offset:2px}.cell.winning::after{animation:win-pulse .72s ease-in-out infinite alternate;outline:3px solid #ffea7a;outline-offset:3px}.result{color:#b43c15;animation:result-flash .7s ease-in-out infinite alternate}.chat{margin-top:25px}.chat h3{margin:0 0 8px;font-size:15px}.messages{height:160px;overflow:auto;padding:9px;background:#f4f7f4;border:1px solid #dce4df;border-radius:6px}.messages p{margin:0 0 8px;font-size:13px;line-height:1.45}.messages p.mine{text-align:right;color:#176743}.messages b{display:block;font-size:11px;color:#7a867f}.messages span{font-size:13px;color:#839087}.chat form{display:flex;gap:7px;margin-top:8px}.chat input{min-width:0;flex:1;height:35px;padding:0 9px;border:1px solid #bfcac3;border-radius:5px}.chat button{border:0;border-radius:5px;padding:0 11px;background:#176743;color:#fff;font-weight:700}.hint{margin-top:18px}@keyframes win-pulse{to{transform:scale(1.12);filter:brightness(1.35);box-shadow:0 0 14px #ffce3e}}@keyframes result-flash{to{color:#ef6a2d;transform:scale(1.04)}}
.restart-game{width:100%;margin:14px 0 2px;height:39px;border:0;border-radius:5px;background:#176743;color:#fff;font-weight:700;cursor:pointer}.cell:nth-child(49),.cell:nth-child(57),.cell:nth-child(113),.cell:nth-child(169),.cell:nth-child(177){background:radial-gradient(circle at center,#503717 0 3px,transparent 3.5px),linear-gradient(90deg,transparent calc(50% - .5px),#6b4c292e calc(50% - .5px),#6b4c292e calc(50% + .5px),transparent calc(50% + .5px))}
.ai-picker{display:flex;align-items:center;gap:8px;margin:12px 0;color:#52635a;font-size:13px}.ai-picker span{font-weight:700;color:#176743}.ai-picker button{border:1px solid #176743;border-radius:99px;background:#fff;color:#176743;padding:6px 10px;font-size:12px;cursor:pointer}.ai-picker button:last-child{background:#176743;color:#fff}

.ai-picker { flex-wrap: wrap; }
.lobby input, .join input { min-width: 0; }

@media (max-width: 480px) {
  .gomoku { padding: 12px; }
  .game-shell { padding: 12px; }
  .game-grid { grid-template-columns: minmax(0, 1fr); }
  .board { width: 100%; }
}

.game-nav { position:sticky; top:0; z-index:10; display:flex; flex-wrap:wrap; justify-content:space-between; gap:4px 16px; max-width:1050px; margin:0 auto 12px; padding:4px 10px; background:#eff3ef; border-bottom:1px solid #dce4df; }
.game-nav a { display:inline-flex; align-items:center; min-height:44px; color:#176743; font-weight:700; }
.game-grid > *, .lobby > *, .join { min-width:0; }
.chat form input { width:100%; }
.messages p { overflow-wrap:anywhere; }
