:root{--bg: #0d1117;--panel: #151b23;--border: #232b36;--border-hover: #3a4a5c;--panel-alpha: rgba(21, 27, 35, .85);--bg-alpha: rgba(13, 17, 23, .6);--text: #e6edf3;--muted: #8b96a5;--faint: #5a6472;--accent: #45d6a8;--danger: #d64545;--danger-text: #ff8080;--font-sans: "Noto Sans TC", system-ui, sans-serif;--font-mono: "IBM Plex Mono", monospace;--r-panel: 10px;--r-cta: 12px;--r-btn: 6px;--r-tag: 5px;--r-pill: 999px;--pad-x: 56px;--pad-x-sm: 24px;--gap-grid: 16px;--t-fast: .15s ease;--t-border: .2s}@keyframes blink{0%,49%{opacity:1}50%,to{opacity:0}}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--bg);color:var(--text);font-family:var(--font-sans)}a{color:inherit;text-decoration:none;transition:opacity var(--t-fast)}a:hover{opacity:.85}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.btn-outline-accent{padding:8px 18px;border:1px solid var(--accent);color:var(--accent);border-radius:var(--r-btn)}.btn-primary{padding:13px 26px;background:var(--accent);color:var(--bg);font-size:15px;font-weight:700;border-radius:var(--r-btn);border:none;font-family:inherit;cursor:pointer;transition:filter var(--t-fast),opacity var(--t-fast)}.btn-primary:hover{filter:brightness(1.08)}.btn-secondary{padding:13px 26px;border:1px solid var(--border);color:var(--text);font-size:15px;border-radius:var(--r-btn);background:var(--bg-alpha)}#cvStars{position:fixed;top:0;left:0;width:100vw;height:100vh;pointer-events:none}nav{position:relative;z-index:2;display:flex;align-items:center;justify-content:space-between;padding:20px var(--pad-x);border-bottom:1px solid var(--border)}nav .brand{font:500 14px var(--font-mono);color:var(--accent)}nav .links{display:flex;gap:30px;align-items:center;font:400 13px var(--font-mono);color:var(--muted)}.hero{position:relative;min-height:680px}#cvWave{position:absolute;inset:0;width:100%;height:100%}.hero-inner{position:relative;z-index:2;padding:88px var(--pad-x) 0;pointer-events:none;max-width:760px}.kicker{font:400 13px var(--font-mono);color:var(--accent);margin-bottom:16px}h1{margin:0 0 16px;font-size:54px;font-weight:900;line-height:1.15;min-height:130px}#cursor{display:inline-block;width:.55em;height:1em;background:var(--accent);transform:translateY(.12em);animation:blink 1s step-end infinite}.hero-inner p{margin:0 0 28px;font-size:16px;line-height:1.8;color:var(--muted);max-width:44ch}.hero-actions{display:flex;gap:14px;margin-bottom:30px;pointer-events:auto}.chips{display:flex;gap:8px;flex-wrap:wrap}.chip{font:400 12px var(--font-mono);padding:6px 12px;border:1px solid var(--border);border-radius:var(--r-pill);color:var(--muted);background:var(--bg-alpha)}.fade{opacity:0;transform:translateY(24px);transition:opacity .8s ease,transform .8s ease}.fade.in{opacity:1;transform:translateY(0)}.stats{position:relative;z-index:2;display:grid;grid-template-columns:repeat(3,1fr);gap:var(--gap-grid);padding:24px var(--pad-x) 56px}.stat{background:var(--panel-alpha);border:1px solid var(--border);border-radius:var(--r-panel);padding:24px 28px}.stat .num{font:600 32px var(--font-mono);color:var(--accent)}.stat .lbl{font-size:13px;color:var(--muted);margin-top:4px}section{position:relative;z-index:2;padding:32px var(--pad-x) 56px}.sec-mark{font:400 13px var(--font-mono);color:var(--accent);margin-bottom:8px}h2{margin:0 0 32px;font-size:28px;font-weight:700}.grid2{display:grid;grid-template-columns:1fr 1fr;gap:var(--gap-grid)}.grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--gap-grid)}.card{background:var(--panel-alpha);border:1px solid var(--border);border-radius:var(--r-panel);padding:28px;transition:border-color var(--t-border)}.card:hover{border-color:var(--border-hover)}.card-head{display:flex;align-items:center;gap:14px;margin-bottom:12px}.badge{font:600 12px var(--font-mono);color:var(--bg);background:var(--accent);padding:4px 8px;border-radius:var(--r-tag)}h3{margin:0;font-size:18px;font-weight:700}.card p{margin:0 0 14px;font-size:14px;line-height:1.75;color:var(--muted)}.bullets{display:flex;flex-direction:column;gap:6px}.bullets div{display:flex;gap:8px;align-items:baseline;font-size:13px;color:var(--muted)}.bullets span{color:var(--accent);font-family:var(--font-mono)}.galaxy{position:relative;height:560px;margin:8px 0 40px;padding:0}#cvGalaxy{position:absolute;inset:0;width:100%;height:100%}.galaxy-inner{position:relative;z-index:2;text-align:center;padding-top:96px;pointer-events:none}.galaxy-inner .sec-mark{margin-bottom:14px}.galaxy-inner h2{margin:0 0 16px;font-size:38px;font-weight:900}.galaxy-inner p{margin:0 auto;font-size:15px;line-height:1.8;color:var(--muted);max-width:52ch}.work{padding-top:0}.proj{background:var(--panel-alpha);border:1px solid var(--border);border-radius:var(--r-panel);overflow:hidden;display:flex;flex-direction:column;transition:border-color var(--t-border);padding:0}.proj:hover{border-color:var(--border-hover)}.thumb{height:170px;display:flex;align-items:center;justify-content:center;background:repeating-linear-gradient(45deg,#0d1117 0 12px,#141b24 12px 24px);color:var(--faint);font:400 11px var(--font-mono)}.thumb img{width:100%;height:100%;object-fit:cover;object-position:top center;display:block}.proj-body{padding:20px;display:flex;flex-direction:column;gap:10px;flex:1}.proj h3{font-size:16px}.proj p{margin:0;font-size:13px;line-height:1.7;color:var(--muted);flex:1}.tags{display:flex;gap:6px;flex-wrap:wrap}.tag{font:400 11px var(--font-mono);padding:4px 9px;background:var(--bg);border:1px solid var(--border);border-radius:var(--r-tag);color:var(--muted)}.proj a{font:500 13px var(--font-mono);color:var(--accent)}.contact{position:relative;z-index:2;margin:0 var(--pad-x);border:1px solid var(--border);border-radius:var(--r-cta);padding:44px 48px;display:flex;justify-content:space-between;align-items:center;gap:40px;background:var(--panel-alpha)}.contact h2{margin:0 0 10px;font-size:26px}.contact .row{display:flex;gap:26px;font:400 13px var(--font-mono);color:var(--muted);flex-wrap:wrap}.contact-form-wrap{position:relative;z-index:2;margin:16px var(--pad-x) 56px;border:1px solid var(--border);border-radius:var(--r-cta);padding:32px 48px 36px;background:var(--panel-alpha)}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--gap-grid)}.form-group{display:flex;flex-direction:column;gap:8px}.form-group--full{grid-column:1 / -1}.form-group label{font:400 12px var(--font-mono);color:var(--muted)}.form-group input,.form-group select,.form-group textarea{width:100%;padding:11px 13px;background:var(--bg);border:1px solid var(--border);border-radius:var(--r-btn);color:var(--text);font-family:var(--font-sans);font-size:14px;transition:border-color var(--t-fast);outline:none}.form-group textarea{resize:vertical;min-height:110px}.form-group input:focus,.form-group select:focus,.form-group textarea:focus{border-color:var(--accent)}.form-group select{cursor:pointer}.form-group option{background:var(--panel);color:var(--text)}.form-actions{margin-top:20px}.btn-primary:disabled{opacity:.55;cursor:default;filter:none}footer{position:relative;z-index:2;padding:22px var(--pad-x);font:400 12px var(--font-mono);color:var(--faint)}.notification{position:fixed;top:24px;right:24px;padding:14px 22px;border-radius:var(--r-btn);border:1px solid var(--border);background:var(--panel);color:var(--text);font:500 13px var(--font-mono);z-index:10000;transform:translate(140%);transition:transform var(--t-fast)}.notification.is-visible{transform:translate(0)}.notification-success{border-color:var(--accent);color:var(--accent)}.notification-error{border-color:var(--danger);color:var(--danger-text)}@media (max-width: 768px){nav,section,.stats,footer{padding-left:var(--pad-x-sm);padding-right:var(--pad-x-sm)}.hero-inner{padding-left:var(--pad-x-sm);padding-right:var(--pad-x-sm)}nav .links{gap:16px;font-size:12px}.btn-outline-accent{padding:7px 12px}.grid2,.grid3,.stats{grid-template-columns:1fr}h1{font-size:36px;min-height:90px}.galaxy-inner h2{font-size:28px}.contact{margin:0 var(--pad-x-sm);flex-direction:column;align-items:flex-start;padding:32px 28px}.contact-form-wrap{margin-left:var(--pad-x-sm);margin-right:var(--pad-x-sm);padding:28px 24px 32px}.form-grid{grid-template-columns:1fr}}@media (prefers-reduced-motion: reduce){html{scroll-behavior:auto}#cursor{animation:none}.fade{opacity:1;transform:none;transition:none}}
