:root{--bg:#f9fafb;--card:#fff;--soft:#f3f4f6;--line:#d0d5dc;--muted:#606877;--text:#1d2939;--dark:#0f1829;--side:#e4e7ec}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:20px}body{margin:0;background:var(--bg);color:var(--text);font-family:Inter,"Noto Sans TC",sans-serif}.sidebar{position:fixed;inset:0 auto 0 0;width:265px;padding:34px 28px;background:var(--side);border-right:1px solid var(--line);display:flex;flex-direction:column;z-index:10}.brand{position:absolute;top:22px;left:22px;width:36px;height:36px;border-radius:10px;background:var(--dark);color:white;text-decoration:none;display:grid;place-items:center;font:10px "IBM Plex Mono"}.sidebar>img{width:132px;height:132px;object-fit:cover;object-position:center 14%;border-radius:20px;margin:35px auto 18px;border:7px solid #f9fafb;box-shadow:0 12px 35px #1d29391a}.side-name{text-align:center;display:flex;flex-direction:column;gap:5px}.side-name strong{font-size:16px}.side-name span{font-size:11px;color:var(--muted)}nav{display:flex;flex-direction:column;margin:28px 0 18px;border-top:1px solid var(--line)}nav a{padding:12px 5px;border-bottom:1px solid var(--line);text-decoration:none;text-align:center;color:var(--muted);font:500 12px "IBM Plex Mono";text-transform:uppercase;letter-spacing:.045em;transition:.2s}nav a:hover,nav a.active{color:var(--dark);background:#ffffff88}.lang{align-self:center;display:flex;gap:8px;align-items:center;background:white;border:1px solid var(--line);border-radius:99px;padding:7px 10px;color:var(--muted);font:9px "IBM Plex Mono";cursor:pointer}.lang i{height:9px;width:1px;background:var(--line)}.lang .active{color:var(--dark)}.side-links{margin-top:auto;display:flex;justify-content:center;gap:11px}.side-links a{font:10px "IBM Plex Mono";color:var(--muted)}.mobile-head{display:none}main{margin-left:265px}.resume-section{min-height:60vh;border-bottom:1px solid var(--line);display:flex;align-items:center}.section-inner{width:min(1050px,calc(100% - 80px));margin:auto;padding:95px 0}.intro{min-height:100vh}.intro-grid{display:grid;grid-template-columns:1fr 280px;gap:65px;align-items:center}.eyebrow,.label,.section-title span,.entry time,.current span{font:500 11px "IBM Plex Mono";letter-spacing:.08em;color:var(--muted)}h1{font-size:clamp(52px,7vw,90px);line-height:.95;letter-spacing:-.065em;margin:24px 0}h1 small{display:block;font-size:.28em;letter-spacing:.12em;color:#9aa3b1;margin-top:16px}.contact-line{font-size:14px;color:var(--muted)}.contact-line a{color:var(--text)}.summary{font-size:18px;line-height:1.75;max-width:760px;color:#495565;margin:28px 0}.intro figure{margin:0;background:#d0d5dc;padding:10px;border:1px solid #9aa3b1;border-radius:22px;box-shadow:0 15px 40px #1d293916}.intro figure img{display:block;width:100%;height:420px;object-fit:cover;object-position:center 17%;border-radius:13px}.buttons{display:flex;gap:9px}.buttons a{height:50px;min-width:155px;padding:0 16px;border-radius:12px;display:flex;align-items:center;justify-content:space-between;gap:20px;text-decoration:none;font-size:12px;font-weight:600;border:1px solid var(--line);background:white;transition:.2s}.buttons .primary{background:var(--dark);color:white;border-color:var(--dark)}.buttons a:hover{transform:scaleX(1.04);box-shadow:0 12px 28px #1d29391f}.buttons b{font-size:16px;font-weight:400}.current{display:flex;gap:25px;align-items:center;margin-top:55px;padding-top:20px;border-top:1px solid var(--line)}.current p{font-size:13px;color:var(--muted)}.section-title{display:flex;align-items:baseline;gap:18px;margin-bottom:55px}.section-title h2{font-size:clamp(35px,4vw,52px);letter-spacing:-.045em;margin:0}.entry{display:grid;grid-template-columns:1fr 175px;gap:50px;padding:38px 0;border-top:1px solid var(--line)}.entry:first-of-type{border-top:1px solid var(--dark)}.entry h3{font-size:24px;letter-spacing:-.025em;margin:0 0 9px}.entry .subtitle{font-size:16px;line-height:1.55;color:var(--muted);margin:0 0 22px}.entry ul{margin:0;padding-left:22px;max-width:800px}.entry li{padding:5px 0 5px 6px;font-size:15px;line-height:1.8;color:#495565}.entry time{text-align:right;line-height:1.5}.featured{background:var(--soft);padding:35px;border-radius:16px;border:1px solid var(--line);margin-bottom:10px}.label{color:#344154;margin-bottom:15px}.chips{display:flex;flex-wrap:wrap;gap:6px;margin:20px 0}.chips span{font:8px "IBM Plex Mono";padding:7px 9px;background:white;border:1px solid var(--line);border-radius:7px}.artifact-row{display:grid;grid-template-columns:repeat(3,1fr);border-top:1px solid var(--line)}.artifact-row span{padding:12px 8px 0;font:8px "IBM Plex Mono";color:var(--muted)}.document-open,.link-row a{border:1px solid var(--line);background:white;border-radius:10px;padding:12px 14px;margin-top:17px;display:flex;justify-content:space-between;width:100%;color:var(--muted);font:9px "IBM Plex Mono";cursor:pointer;text-decoration:none}.document-open:hover,.link-row a:hover{border-color:var(--dark);color:var(--dark)}.gallery{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin-top:20px}.gallery.four{grid-template-columns:repeat(4,1fr)}.gallery.one{grid-template-columns:minmax(0,430px)}.gallery button{padding:0;border:1px solid var(--line);background:var(--soft);border-radius:10px;overflow:hidden;height:190px;cursor:pointer}.gallery img{display:block;width:100%;height:100%;object-fit:cover;transition:.35s}.gallery button:hover img{transform:scale(1.035)}.link-row{display:flex;gap:8px}.link-row>*{flex:1}.skill-grid{display:grid;grid-template-columns:1fr 1fr;border-top:1px solid var(--dark)}.skill-grid div{padding:27px 25px 27px 0;border-bottom:1px solid var(--line)}.skill-grid div:nth-child(odd){border-right:1px solid var(--line)}.skill-grid div:nth-child(even){padding-left:25px}.skill-grid h3{font-size:14px}.skill-grid p{font-size:11px;line-height:1.7;color:var(--muted)}.award-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}.award-grid button{padding:0;border:1px solid var(--line);background:white;border-radius:14px;overflow:hidden;text-align:left;cursor:pointer}.award-grid img{display:block;width:100%;height:240px;object-fit:contain;background:var(--soft)}.award-grid span{display:block;padding:15px;font-size:11px}.viewer{width:min(1100px,calc(100% - 30px));height:min(850px,calc(100% - 30px));padding:0;border:1px solid #606877;border-radius:17px;background:var(--dark);overflow:hidden}.viewer::backdrop{background:#020713c9;backdrop-filter:blur(7px)}.viewer>div{width:100%;height:100%;display:grid;place-items:center}.viewer img{max-width:100%;max-height:100%;object-fit:contain}.viewer iframe{width:100%;height:100%;border:0;background:white}.close{position:absolute;right:12px;top:12px;z-index:2;width:38px;height:38px;border-radius:50%;border:1px solid #ffffff66;background:#0f1829dd;color:white;font-size:22px;cursor:pointer}body>footer{margin-left:265px;padding:22px 40px;display:flex;justify-content:space-between;font:8px "IBM Plex Mono";color:var(--muted)}body>footer a{color:inherit}
@media(max-width:850px){html{scroll-padding-top:65px}.sidebar{transform:translateX(-100%);transition:.3s;width:260px}.sidebar.open{transform:none;box-shadow:10px 0 40px #02071333}.mobile-head{display:flex;position:sticky;top:0;z-index:8;height:62px;padding:0 16px;align-items:center;justify-content:space-between;background:#f9fafbea;border-bottom:1px solid var(--line);backdrop-filter:blur(14px)}.mobile-head a{text-decoration:none;font-size:13px;font-weight:600}.menu{border:1px solid var(--line);background:white;border-radius:8px;padding:8px 11px;font:9px "IBM Plex Mono"}main,body>footer{margin-left:0}.section-inner{width:calc(100% - 32px);padding:70px 0}.intro{min-height:auto}.intro-grid{grid-template-columns:1fr}.intro figure{grid-row:1;width:min(100%,360px)}.intro figure img{height:390px}.entry{grid-template-columns:1fr;gap:16px}.entry time{text-align:left;grid-row:1}.featured{padding:24px}.gallery.four{grid-template-columns:repeat(2,1fr)}.award-grid{grid-template-columns:1fr}.award-grid img{height:220px}}
@media(max-width:520px){h1{font-size:49px}.contact-line{line-height:1.7}.buttons{flex-direction:column}.buttons a{width:100%}.current{display:block}.entry h3{font-size:19px}.artifact-row{grid-template-columns:1fr}.gallery,.gallery.four{grid-template-columns:1fr}.gallery button{height:230px}.skill-grid{grid-template-columns:1fr}.skill-grid div:nth-child(odd){border-right:0}.skill-grid div:nth-child(even){padding-left:0}.link-row{flex-direction:column}}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*{transition:none!important}}
.certificate-grid{grid-template-columns:repeat(3,1fr)}.certificate-grid button{display:flex;flex-direction:column;min-height:245px;transition:transform .25s,border-color .25s,box-shadow .25s}.certificate-grid button:hover{transform:translateY(-3px);border-color:var(--muted);box-shadow:0 12px 30px #1d293912}.certificate-grid .pdf-card{justify-content:space-between;padding:22px;background:linear-gradient(145deg,#fff,#f3f4f6)}.pdf-card>b{width:58px;height:72px;display:grid;place-items:center;border:1px solid var(--line);border-radius:7px;background:white;color:var(--muted);font:500 10px "IBM Plex Mono";box-shadow:5px 5px 0 var(--line)}.pdf-card>span{padding:0;font-size:12px;line-height:1.55}.private-card{min-height:245px;padding:22px;border:1px dashed var(--line);border-radius:14px;background:var(--soft);display:flex;flex-direction:column;justify-content:space-between}.private-card>b{font-size:48px;color:#9aa3b1}.private-card>span{font-size:12px;font-weight:600;line-height:1.5}.private-card>small{font-size:9px;line-height:1.55;color:var(--muted)}
@media(max-width:1050px){.certificate-grid{grid-template-columns:repeat(2,1fr)}}
@media(max-width:520px){.certificate-grid{grid-template-columns:1fr}}
.certificate-grid .pdf-card{padding:0;justify-content:flex-start;background:white}.certificate-grid .pdf-card img{width:100%;height:240px;object-fit:contain;background:var(--soft)}.certificate-grid .pdf-card>span{margin-top:auto;width:100%;padding:15px}
.entry time{font-size:14px;font-weight:500;letter-spacing:.055em}
