:root{color-scheme:light;--font-sans: "IBM Plex Sans", "IBM Plex Sans TC", ui-sans-serif, system-ui, "PingFang TC", "Noto Sans TC", "Microsoft JhengHei", sans-serif;--font-serif: "IBM Plex Serif", "Noto Serif TC", Georgia, "Songti TC", serif;--font-mono: "IBM Plex Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;--paper: #ffffff;--card: #ffffff;--card-2: #f7f8f7;--ink: #1b1f23;--ink-2: #3f464e;--muted: #69727a;--line: #e6e5e1;--rail: #ccd4d5;--accent: #1f5162;--accent-2: #4c828f;--accent-ink: #163d49;--accent-wash: #eef3f4;--ongoing: #a96a2b;--shadow: 0 1px 2px rgba(20, 30, 35, .05), 0 10px 30px rgba(20, 30, 35, .08);--rail-x: 70px;--content-x: 90px}@media (prefers-color-scheme: dark){:root:not([data-theme="light"]){color-scheme:dark;--paper: #121517;--card: #191d20;--card-2: #1e2327;--ink: #e8e7e3;--ink-2: #bcc1c6;--muted: #8b949b;--line: #2a3035;--rail: #394349;--accent: #77b6c6;--accent-2: #5b96a4;--accent-ink: #a8d3dd;--accent-wash: #1b2e34;--ongoing: #d7a468;--shadow: 0 1px 2px rgba(0, 0, 0, .35), 0 8px 26px rgba(0, 0, 0, .4)}}:root[data-theme="dark"]{color-scheme:dark;--paper: #121517;--card: #191d20;--card-2: #1e2327;--ink: #e8e7e3;--ink-2: #bcc1c6;--muted: #8b949b;--line: #2a3035;--rail: #394349;--accent: #77b6c6;--accent-2: #5b96a4;--accent-ink: #a8d3dd;--accent-wash: #1b2e34;--ongoing: #d7a468;--shadow: 0 1px 2px rgba(0, 0, 0, .35), 0 8px 26px rgba(0, 0, 0, .4)}*,*::before,*::after{box-sizing:border-box}body{margin:0;background:var(--paper);color:var(--ink);font:400 16px/1.55 var(--font-sans);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}h1,h2,h3{text-wrap:balance}a{color:var(--accent-ink)}strong,b{font-weight:700;color:var(--ink)}:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:3px}.wrap{position:relative;z-index:1;max-width:760px;margin:0 auto;padding:44px 24px 64px}#bg-fx{position:fixed;inset:0;width:100%;height:100%;z-index:0;pointer-events:none;opacity:0;animation:bg-fx-in 1.8s ease-out forwards}@keyframes bg-fx-in{to{opacity:.72}}@media (prefers-reduced-motion: reduce){#bg-fx{display:none}}.skip-link{position:absolute;left:-9999px}.skip-link:focus{left:12px;top:12px;z-index:50;padding:8px 12px;background:var(--card);border:1px solid var(--line);border-radius:8px}.controls{position:fixed;top:14px;right:14px;z-index:30;display:flex;flex-direction:column;align-items:flex-end;gap:8px}.ctrl-btn{min-width:38px;height:38px;display:flex;align-items:center;justify-content:flex-end;padding:0;border:1px solid var(--line);border-radius:9px;background:var(--card);color:var(--ink-2);cursor:pointer;box-shadow:var(--shadow);overflow:hidden;white-space:nowrap;transition:color .15s, border-color .15s}.ctrl-btn:hover{color:var(--accent);border-color:var(--rail)}.ctrl-btn .icon{width:18px}.ctrl-btn>.icon,.ctrl-btn>.theme-toggle__icon{flex:0 0 18px;margin:0 10px}.ctrl-btn__label{max-width:0;opacity:0;overflow:hidden;font-size:13px;line-height:1;letter-spacing:.01em;transition:max-width 0.24s cubic-bezier(0.4, 0, 0.2, 1),opacity 0.16s ease,padding-left 0.24s cubic-bezier(0.4, 0, 0.2, 1)}.ctrl-btn:hover .ctrl-btn__label,.ctrl-btn:focus-visible .ctrl-btn__label{max-width:12em;opacity:1;padding-left:12px}.to-top{position:fixed;right:14px;bottom:14px;z-index:30;opacity:0;transform:translateY(8px);pointer-events:none;transition:opacity .16s ease, transform .16s ease, color .15s, border-color .15s}.to-top.is-shown{opacity:1;transform:none;pointer-events:auto}.to-top .icon{width:18px}.theme-toggle__icon{width:18px;display:none}.theme-toggle__icon--moon{display:block}@media (prefers-color-scheme: dark){:root:not([data-theme="light"]) .theme-toggle__icon--moon{display:none}:root:not([data-theme="light"]) .theme-toggle__icon--sun{display:block}}:root[data-theme="dark"] .theme-toggle__icon--moon{display:none}:root[data-theme="dark"] .theme-toggle__icon--sun{display:block}:root[data-theme="light"] .theme-toggle__icon--sun{display:none}:root[data-theme="light"] .theme-toggle__icon--moon{display:block}.icon{width:100%;height:auto;display:block}.icon--dot{width:8px;height:8px;border-radius:50%;background:currentColor}.toc-toggle{display:none;position:fixed;top:14px;left:14px;z-index:30}.toc-toggle .icon{width:18px}.toc{display:none}@media (min-width: 1200px){.toc{display:block;position:fixed;top:50%;left:max(24px, calc((100vw - 760px) / 2 - 176px));transform:translateY(-50%);z-index:20;max-height:90vh;overflow:auto}}@media (max-width: 1199.98px){.toc-toggle{display:grid}.toc{display:block;position:fixed;top:60px;left:14px;z-index:29;max-width:min(72vw, 258px);max-height:calc(100vh - 80px);overflow:auto;padding:10px 15px 12px;background:var(--card);border:1px solid var(--line);border-radius:12px;box-shadow:var(--shadow);visibility:hidden;opacity:0;transform:translateY(-6px);pointer-events:none;transition:opacity .14s, transform .14s, visibility .14s}.toc.is-open{visibility:visible;opacity:1;transform:none;pointer-events:auto}.toc__link{padding-top:6px;padding-bottom:6px}}.toc__list{list-style:none;margin:0;padding:0;display:grid;gap:1px;border-left:2px solid var(--line)}.toc__item{display:flex}.toc__link{display:flex;align-items:center;gap:9px;width:100%;padding:4px 0 4px 14px;margin-left:-2px;border-left:2px solid transparent;color:var(--muted);text-decoration:none;transition:color .15s, border-color .15s}.toc__dot{flex:none;width:5px;height:5px;border-radius:50%;background:var(--rail);transition:background .15s, transform .15s}.toc__label{display:flex;flex-direction:column;line-height:1.25;font:500 12px/1.25 var(--font-sans);letter-spacing:.02em}.toc__label-zh{font-size:10px;font-weight:400;color:var(--muted)}.toc__link:hover{color:var(--ink-2)}.toc__link:hover .toc__dot{background:var(--accent-2)}.toc__link.is-active{color:var(--accent-ink);border-left-color:var(--accent)}.toc__link.is-active .toc__dot{background:var(--accent);transform:scale(1.6)}.toc__link.is-active .toc__label-zh{color:var(--accent-2)}:where(header, section)[id]{scroll-margin-top:24px}@media (prefers-reduced-motion: no-preference){html{scroll-behavior:smooth}}.profile{display:grid;grid-template-columns:minmax(0, 1fr) auto;grid-template-areas:"head head" "bio  photo" "meta meta";gap:18px 32px;align-items:start;padding-bottom:24px;border-bottom:1px solid var(--line)}.profile__head{grid-area:head}.profile__bio{grid-area:bio}.profile__photo{grid-area:photo;align-self:start}.profile__meta{grid-area:meta;margin-top:4px;display:grid;grid-template-columns:1fr 1fr;gap:16px 44px}.profile__eyebrow{margin:0 0 10px;font:500 11px/1 var(--font-mono);letter-spacing:.18em;text-transform:uppercase;color:var(--accent)}.profile__name{margin:0;font-family:var(--font-serif);font-weight:500;font-size:44px;line-height:1.1;letter-spacing:.01em}.profile__name-zh{font-size:24px;font-weight:400;color:var(--muted);margin-left:10px}.profile__tagline{margin:10px 0 0;font:400 15px/1.5 var(--font-mono);color:var(--muted)}.profile__bio{margin:0;max-width:58ch;color:var(--ink-2)}.profile__bio p{margin:0}.profile__bio p+p{margin-top:.5em}.profile__photo img{display:block;width:150px;height:150px;object-fit:cover;border-radius:14px;border:1px solid var(--line)}.profile__photo--empty{width:150px;height:150px;display:grid;place-items:center;border-radius:14px;border:1px dashed var(--rail);font:400 12px/1.5 var(--font-mono);color:var(--muted);text-align:center}.profile__label{margin:0 0 9px;font-family:var(--font-serif);font-size:17px;font-weight:500}.profile__label span{font-family:var(--font-sans);font-size:13px;color:var(--muted);margin-left:8px}.kv{display:grid;grid-template-columns:84px 1fr;gap:6px 18px;margin:0}.kv dt{font:500 12px/1.7 var(--font-mono);color:var(--muted)}.kv dd{margin:0;color:var(--ink-2)}.kv--wide{grid-template-columns:128px 1fr}.exlist{list-style:none;margin:0;padding:0;display:grid;gap:5px;color:var(--ink-2)}.exlist li{position:relative;padding-left:15px}.exlist li::before{content:"";position:absolute;left:1px;top:.62em;width:4px;height:4px;border-radius:50%;background:var(--accent)}.skills__grid{display:grid;gap:8px}.skillgroup__name{margin:0;font:600 13.5px/1.5 var(--font-sans);letter-spacing:.01em;color:var(--accent-ink)}.skillgroup__list{gap:2px}.skillgroup__list li{line-height:1.3;font-size:14px}.skillgroup__list li::before{top:.55em}.contacts{list-style:none;margin:0;padding:0;display:grid;gap:8px}.contacts li{display:flex;align-items:center;gap:10px}.contacts__icon{display:inline-flex;width:18px;flex:none;color:var(--muted)}.contacts a{color:var(--accent-ink);text-decoration:none;border-bottom:1px solid var(--rail);transition:border-color .15s}.contacts a:hover{border-color:var(--accent)}.tl{margin-top:38px}.tl__title{margin:0 0 14px;font-family:var(--font-serif);font-weight:500;font-size:27px;line-height:1.3;letter-spacing:.01em}.tl__title span{margin-left:12px;font-family:var(--font-sans);font-size:15px;font-weight:500;color:var(--muted)}.tl__note{margin:-4px 0 15px;max-width:60ch;font-size:13px;color:var(--muted)}.tl__note a{color:var(--accent-ink)}.tl__subtitle{margin:-6px 0 15px;font-size:13px;color:var(--muted)}.tl__subtitle a{color:var(--accent-ink)}.tl__body{position:relative;padding-left:var(--content-x);padding-top:6px}.tl__body::before{content:"";position:absolute;left:var(--rail-x);top:10px;bottom:10px;width:2px;border-radius:2px;background:var(--rail)}.tl__year{position:relative;padding:13px 0 15px}.tl__body>.tl__year{border-bottom:1px solid var(--line)}.tl__body>.tl__year:first-child{padding-top:3px}.tl__body>.tl__year:last-child{padding-bottom:0;border-bottom:0}.tl__year--cont{padding-bottom:9px}.tl__mark{position:absolute;left:calc(6px - var(--content-x));top:13px;width:calc(var(--content-x) - 44px);text-align:right;font:500 12px/1.5 var(--font-mono);letter-spacing:.02em;color:var(--muted)}.tl__body>.tl__year:first-child .tl__mark{top:4px}.tl__year--cont .tl__mark{opacity:.5}.tl__year--undated .tl__mark{opacity:.5}.tl__slot{position:relative;min-height:14px}.tl__seg{position:absolute;left:calc(var(--rail-x) - var(--content-x) - 3px + var(--lane, 0) * 12px);top:-12px;bottom:-24px;width:6px;border-radius:3px;background:var(--accent)}.tl__seg--alt{background:var(--accent-2)}.tl__seg--stub{top:-24px;bottom:auto;height:52px}.tl__seg--open::after,.tl__seg--end::after{content:"";position:absolute;left:50%;transform:translateX(-50%)}.tl__seg--open::after{top:-5px;width:14px;height:14px;border-radius:50%;border:3px solid var(--ongoing);background:var(--paper)}.tl__seg--end::after{top:-3px;width:10px;height:10px;border-radius:50%;background:var(--accent)}.tl__seg--end.tl__seg--alt::after{background:var(--accent-2)}.tl__echo{display:flex;flex-wrap:wrap;align-items:baseline;gap:2px 8px;margin:0;padding:3px 0 3px calc(var(--lane, 0) * 18px);font-size:13px;font-style:italic;color:var(--muted)}.tl__echo-title,.tl__echo-org{min-width:0}.tl__echo-mark{font-style:normal;font-size:15px;line-height:1;color:var(--accent)}.tl__echo--alt .tl__echo-mark{color:var(--accent-2)}.tl__echo-title{font-style:normal;font-weight:500;color:var(--ink-2)}.tl__echo-org{font-style:normal}.tl__entry{position:relative;background:var(--card);border:1px solid var(--line);border-radius:10px;padding:12px 17px 13px;box-shadow:var(--shadow)}.tl__entry+.tl__entry{margin-top:9px}.tl__echo+.tl__entry{margin-top:7px}.tl__node{position:absolute;left:calc(var(--rail-x) - var(--content-x) - 6px + var(--lane, 0) * 12px);top:20px;width:12px;height:12px;border-radius:50%;background:var(--accent);box-shadow:0 0 0 4px var(--paper)}.tl__entry--ongoing .tl__node{background:var(--ongoing)}.tl__entry--alt .tl__node{background:var(--accent-2)}.tl__entry--highlight{box-shadow:inset 3px 0 0 var(--accent),var(--shadow)}.tl__entry--highlight .tl__entry-title{color:var(--accent-ink)}.tl__entry--highlight .tl__node{background:var(--accent)}.tl__entry-head{display:flex;align-items:baseline;gap:4px 12px}.tl__entry-headline{flex:1 1 auto;min-width:0;display:flex;flex-wrap:wrap;align-items:baseline;gap:1px 8px}.tl__entry-title{margin:0;font-size:17px;font-weight:600;letter-spacing:.01em}.tl__entry-org{font-size:14px;color:var(--muted)}.daterange{flex:0 0 auto;font:500 12.5px/1.6 var(--font-mono);color:var(--ink-2);font-variant-numeric:tabular-nums;white-space:nowrap}.daterange__now{color:var(--ongoing)}.daterange__sep{color:var(--muted)}.daterange--period{font-family:var(--font-sans);color:var(--muted)}.tl__entry-body{margin:6px 0 0;font-size:14.5px;color:var(--ink-2)}.tl__entry-body p{margin:0}.tl__entry-body p+p{margin-top:.5em}.tl__entry-body a{color:var(--accent-ink)}.tl__entry-ref{margin:7px 0 0;font:400 12.5px/1.5 var(--font-mono);color:var(--muted)}.tl__entry-link{margin:8px 0 0;font-size:13px;word-break:break-all}.tl__entry--point{background:transparent;border:0;border-radius:0;box-shadow:none;padding:2px 0}.tl--point .tl__entry+.tl__entry{margin-top:1px}.tl--point .tl__echo+.tl__entry{margin-top:1px}#certificates .tl__entry--point{padding:0}#certificates .tl__entry+.tl__entry,#certificates .tl__echo+.tl__entry{margin-top:1.2px}.tl__entry--point .tl__entry-title{font-size:15px}.tl__entry--point .tl__entry-org{font-size:13px}.tl__entry--point .tl__node{width:9px;height:9px;top:10px;background:var(--rail)}.tl__entry--point .tl__entry-body{font-size:13.5px;margin-top:3px;line-height:1.4}#practice .tl__entry-title{font-size:15px}#practice .tl__entry-body{font-size:14px}.tl--point .tl__body>.tl__year{padding:6px 0 6px}.tl--point .tl__body>.tl__year:first-child{padding-top:3px}.block{margin-top:38px}.subsec+.subsec{margin-top:22px}.subsec__heading{margin:0 0 8px;font-family:var(--font-serif);font-size:17px;font-weight:500}.subsec__note{margin:0 0 14px;font-size:12.5px;line-height:1.55;color:var(--muted)}.subsec__note a{color:var(--accent-ink)}.grp{margin-top:13px}.grp:first-of-type{margin-top:0}.grp__name{margin:0 0 5px;font:500 12px/1.5 var(--font-mono);letter-spacing:.02em;color:var(--muted)}.grp__list{list-style:none;margin:0;padding:2px 0 2px 14px;border-left:2px solid var(--line)}.grp__list li{padding:3px 0;font-size:14px;line-height:1.2}.grp__title{font-weight:500}.grp__org{color:var(--muted);font-size:13px}.grp__via{color:var(--muted);font-size:13px}.grp__via a{color:var(--accent-ink)}.site-foot{margin-top:40px;padding-top:16px;border-top:1px solid var(--line);font-size:12.5px;color:var(--muted)}.site-foot p{margin:0}.site-foot a{color:var(--muted)}@media (max-width: 560px){:root{--content-x: 82px;--rail-x: 60px}.wrap{padding:40px 18px 56px}.profile{grid-template-columns:1fr;grid-template-areas:"head" "photo" "bio" "meta";justify-items:start;gap:18px}.profile__meta{grid-template-columns:1fr;gap:18px}.profile__name{font-size:34px}.profile__name-zh{font-size:20px}.profile__photo img,.profile__photo--empty{width:116px;height:116px}.tl__title{font-size:23px}.tl__entry-head{display:flex;flex-direction:column;align-items:flex-start;gap:2px}.tl__entry-headline{width:100%}.daterange{margin-top:3px}.kv{grid-template-columns:72px 1fr}.kv--wide{grid-template-columns:92px 1fr}}@media (prefers-reduced-motion: reduce){*{transition:none !important;animation:none !important}}@media print{:root,:root[data-theme="dark"],:root[data-theme="light"]{color-scheme:light;--paper: #fff;--card: #fff;--card-2: #fff;--ink: #000;--ink-2: #1c1c1c;--muted: #555;--line: #c9c9c9;--rail: #a7b1b1;--accent: #1f5162;--accent-2: #4c828f;--accent-ink: #1f5162;--ongoing: #7c4f20;--shadow: none}html{-webkit-print-color-adjust:exact;print-color-adjust:exact}html,body{background:#fff}.controls,.skip-link,.toc,.toc-toggle,.to-top,.site-foot,#bg-fx{display:none !important}body{font-size:10.5pt;line-height:1.5}.wrap{max-width:none;padding:0}.tl{margin-top:16pt}.tl__title{font-size:15pt;break-after:avoid}.tl__subtitle,.tl__note{break-after:avoid}.tl__body{position:static;padding:0}.tl__body::before{content:none}.tl__year{display:flex;align-items:flex-start;gap:12px;position:static;padding:7pt 0 8pt}.tl--point .tl__body>.tl__year{padding:4pt 0 5pt}.tl__mark{position:static;flex:0 0 46px;width:auto;margin-top:1.5pt;text-align:right}.tl__slot{position:static;flex:1 1 auto;min-width:0;border-left:1.5px solid var(--rail);padding-left:16px}.tl__seg{display:none !important}.tl__node{left:-23px;top:12px}.tl__entry--point .tl__node{left:-21px;top:10px}.tl__year,.tl__slot{break-inside:auto}.tl__entry,.tl__echo{break-inside:avoid}.tl__entry{box-shadow:none;border:1px solid #d3d3d3}.tl__entry--point{border:0;border-bottom:1px solid #d3d3d3}.tl__entry--highlight{box-shadow:inset 3px 0 0 var(--accent)}a{color:inherit;text-decoration:none;border:0 !important}@page{margin:14mm 16mm}}
