:root{--ink:#0B1F3A;--teal:#0FB5A6;--amber:#F2A900;--coral:#E5484D;--paper:#F7F9FC;--wash:#EAF2FB;--line:#DCE4F0;--muted:#5A6B85;--white:#fff;--ink2:#12294A;--maxw:1120px;--shadow:0 10px 40px rgba(11,31,58,.08);--shadow-sm:0 4px 18px rgba(11,31,58,.06)}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--paper);color:var(--ink);font-family:Inter,system-ui,sans-serif;line-height:1.6;-webkit-font-smoothing:antialiased;overflow-x:hidden}a{color:inherit;text-decoration:none}img{max-width:100%;display:block}.wrap{max-width:var(--maxw);margin:0 auto;padding:0 24px}.mono{font-family:IBM Plex Mono,monospace}.eyebrow{font-family:IBM Plex Mono,monospace;font-size:13px;letter-spacing:.12em;text-transform:uppercase;color:var(--teal);font-weight:600}h1,h2,h3{font-family:Space Grotesk,sans-serif;line-height:1.08;letter-spacing:-.02em;margin:0}.hl{color:var(--teal)}.am{color:var(--amber)}section{position:relative}.nav{position:sticky;top:0;z-index:50;background:#f7f9fcd1;backdrop-filter:saturate(140%) blur(10px);-webkit-backdrop-filter:saturate(140%) blur(10px);border-bottom:1px solid var(--line)}.nav .inner{max-width:var(--maxw);margin:0 auto;padding:12px 24px;display:flex;align-items:center;gap:16px}.brand{display:flex;align-items:center;gap:10px}.chip{width:34px;height:34px;border-radius:9px;background:var(--ink);display:flex;align-items:center;justify-content:center}.chip svg{width:19px;height:19px}.brand .wm{font-family:Space Grotesk;font-weight:700;font-size:19px;letter-spacing:-.02em}.brand .role{font-family:IBM Plex Mono;font-size:11px;color:var(--muted);border-left:1px solid var(--line);padding-left:10px;margin-left:2px}.links{margin-left:auto;display:flex;align-items:center;gap:26px}.links a{font-size:15px;font-weight:500;color:var(--ink2)}.links a:not(.btn):hover{color:var(--teal)}.btn{background:var(--ink);color:#fff;padding:10px 18px;border-radius:10px;font-weight:600;font-size:14px;border:none;cursor:pointer;transition:transform .15s ease,background .2s ease;display:inline-block}.btn:hover{background:var(--ink2);transform:translateY(-1px)}.btn.teal{background:var(--teal)}.btn.teal:hover{background:#0da093}.btn.ghost{background:transparent;color:var(--ink);border:1.5px solid var(--line)}.btn.ghost:hover{background:#fff;border-color:var(--teal);color:var(--teal)}.navtoggle{display:none;margin-left:auto;background:none;border:1.5px solid var(--line);border-radius:9px;width:42px;height:38px;cursor:pointer;color:var(--ink)}.navtoggle svg{width:20px;height:20px;vertical-align:middle}.hero{padding:clamp(48px,8vw,96px) 0 clamp(40px,6vw,72px);background:radial-gradient(circle at 1px 1px,rgba(90,107,133,.16) 1px,transparent 0) 0 0/22px 22px,linear-gradient(180deg,#fff,var(--paper) 70%)}.hero .inner{max-width:var(--maxw);margin:0 auto;padding:0 24px;display:grid;grid-template-columns:1.15fr .85fr;gap:clamp(28px,5vw,64px);align-items:center}.hero h1{font-size:clamp(2.15rem,5.4vw,3.9rem);margin:16px 0 0}.hero .sub{margin-top:20px;max-width:36ch;font-size:clamp(1rem,1.7vw,1.18rem);color:var(--muted)}.cta{margin-top:30px;display:flex;flex-wrap:wrap;gap:12px}.cta .btn{padding:13px 22px;font-size:15px}.meta-row{margin-top:26px;display:flex;align-items:center;gap:14px;flex-wrap:wrap;font-family:IBM Plex Mono;font-size:13px;color:var(--muted)}.pin{display:inline-flex;align-items:center;gap:7px}.pin .d{width:8px;height:8px;border-radius:50%;background:var(--teal);box-shadow:0 0 0 4px #0fb5a626}.portrait{position:relative}.frame{position:relative;border-radius:20px;overflow:hidden;box-shadow:var(--shadow);border:1px solid var(--line);background:#fff}.frame img{width:100%;aspect-ratio:4/5;object-fit:cover}.cmk{position:absolute;width:16px;height:16px;border:2px solid var(--teal);z-index:2}.cmk.tl{top:-6px;left:-6px;border-right:0;border-bottom:0}.cmk.br{bottom:-6px;right:-6px;border-left:0;border-top:0}.runner{position:absolute;right:-14px;bottom:-22px;width:min(300px,84%);background:var(--ink);color:#dfe8f5;border-radius:12px;padding:12px 14px;box-shadow:0 16px 40px #0b1f3a47;font-family:IBM Plex Mono;font-size:12px;line-height:1.7}.runner .bar{display:flex;gap:6px;margin-bottom:8px}.runner .bar i{width:9px;height:9px;border-radius:50%;background:#33507c;display:block}.runner .bar i:first-child{background:#ff5f57}.runner .bar i:nth-child(2){background:#febc2e}.runner .bar i:nth-child(3){background:#28c840}.runner .p{color:var(--teal)}.runner .cmd{color:#8fa6c9}.runner .pass{color:#28c840}.runner b{color:#fff}.stack{border-top:1px solid var(--line);border-bottom:1px solid var(--line);background:#fff}.stack .inner{max-width:var(--maxw);margin:0 auto;padding:18px 24px;display:flex;flex-wrap:wrap;align-items:center;gap:12px 22px}.stack .lbl{font-family:IBM Plex Mono;font-size:12px;color:var(--muted);letter-spacing:.08em;text-transform:uppercase}.stack .tags{display:flex;flex-wrap:wrap;gap:10px}.tag{font-family:IBM Plex Mono;font-size:13px;font-weight:500;color:var(--ink2);background:var(--wash);border:1px solid var(--line);padding:6px 12px;border-radius:999px}.sec{padding:clamp(56px,8vw,96px) 0}.head{max-width:640px;margin-bottom:44px}.head h2{font-size:clamp(1.7rem,3.6vw,2.5rem);margin-top:12px}.head p{margin:14px 0 0;color:var(--muted)}.about-grid{display:grid;grid-template-columns:1.3fr .7fr;gap:clamp(28px,5vw,56px)}.about-grid p{font-size:clamp(1.02rem,1.7vw,1.16rem);margin:0 0 18px}.stats{display:flex;gap:26px;flex-wrap:wrap;margin-top:8px}.stat .num{font-family:Space Grotesk;font-weight:700;font-size:2rem;color:var(--ink);line-height:1}.stat .lab{font-family:IBM Plex Mono;font-size:12px;color:var(--muted);margin-top:6px}.focus{background:#fff;border:1px solid var(--line);border-radius:16px;padding:24px;box-shadow:var(--shadow-sm)}.focus h3{font-size:16px;font-family:IBM Plex Mono;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.08em;margin-bottom:14px}.focus ul{list-style:none;margin:0;padding:0;display:grid;gap:13px}.focus li{display:flex;gap:11px;align-items:flex-start;font-size:15px}.ck{width:20px;height:20px;flex:none;border-radius:6px;background:#0fb5a624;display:flex;align-items:center;justify-content:center;margin-top:1px}.ck svg{width:12px;height:12px}.skills{background:#fff;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}.skillgrid{display:grid;grid-template-columns:repeat(2,1fr);gap:20px}.skillcard{border:1px solid var(--line);border-radius:16px;padding:26px;background:var(--paper);transition:transform .18s ease,box-shadow .18s ease}.skillcard:hover{transform:translateY(-3px);box-shadow:var(--shadow)}.skillcard .ic{width:44px;height:44px;border-radius:11px;background:var(--ink);display:flex;align-items:center;justify-content:center;margin-bottom:16px}.skillcard .ic svg{width:23px;height:23px}.skillcard.tl .ic{background:var(--teal)}.skillcard.am .ic{background:var(--amber)}.skillcard h3{font-size:1.18rem;margin-bottom:6px}.skillcard .k{font-family:IBM Plex Mono;font-size:12px;color:var(--muted);letter-spacing:.06em;margin-bottom:14px}.chips{display:flex;flex-wrap:wrap;gap:8px}.chips span{font-size:13.5px;font-weight:500;background:#fff;border:1px solid var(--line);padding:6px 12px;border-radius:8px}.project{display:grid;grid-template-columns:1.05fr .95fr;gap:clamp(24px,4vw,52px);align-items:center;padding:clamp(28px,4vw,44px) 0;border-top:1px dashed var(--line)}.project:first-of-type{border-top:0}.project.flip .shot{order:2}.pnum{font-family:IBM Plex Mono;font-size:13px;color:var(--teal);letter-spacing:.1em}.project h3{font-size:clamp(1.4rem,2.6vw,1.9rem);margin:8px 0 4px}.project .site{font-family:IBM Plex Mono;font-size:12.5px;color:var(--muted);word-break:break-word}.project p{color:var(--muted);margin:16px 0 18px}.ptags{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:20px}.ptags span{font-size:12.5px;font-family:IBM Plex Mono;color:var(--ink2);background:var(--wash);border:1px solid var(--line);padding:5px 11px;border-radius:999px}.plink{display:inline-flex;align-items:center;gap:8px;font-weight:600;color:var(--ink);font-size:15px}.plink svg{width:16px;height:16px;transition:transform .15s ease}.plink:hover{color:var(--teal)}.plink:hover svg{transform:translate(2px,-2px)}.plink.disabled{color:var(--muted);cursor:default}.shot{border-radius:14px;overflow:hidden;border:1px solid var(--line);box-shadow:var(--shadow);background:#fff}.shot .bar{display:flex;align-items:center;gap:7px;padding:10px 14px;background:#eef2f8;border-bottom:1px solid var(--line)}.shot .bar i{width:11px;height:11px;border-radius:50%;background:#cfd8e6;display:block}.shot .bar i:first-child{background:#ff5f57}.shot .bar i:nth-child(2){background:#febc2e}.shot .bar i:nth-child(3){background:#28c840}.shot .bar .u{margin-left:10px;font-family:IBM Plex Mono;font-size:12px;color:var(--muted);background:#fff;border:1px solid var(--line);border-radius:6px;padding:4px 12px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.shot img{width:100%;display:block}.approach{background:var(--ink);color:#eaf1fb}.approach .eyebrow{color:var(--teal)}.approach h2{color:#fff}.approach .head p{color:#a9bad6}.steps{display:grid;grid-template-columns:repeat(4,1fr);gap:20px;margin-top:8px}.step{background:var(--ink2);border:1px solid #22406b;border-radius:16px;padding:24px}.step .n{font-family:IBM Plex Mono;font-size:13px;color:var(--teal);letter-spacing:.1em}.step h3{font-size:1.15rem;margin:12px 0 8px;color:#fff}.step p{font-size:14px;color:#a9bad6;margin:0}.contact{text-align:center}.contact h2{font-size:clamp(1.9rem,4.5vw,3rem);max-width:16ch;margin:14px auto 0}.contact p{color:var(--muted);margin:16px auto 0;max-width:46ch}.contact .cta{justify-content:center}.cloc{margin-top:22px;font-family:IBM Plex Mono;font-size:13px;color:var(--muted)}footer{border-top:1px solid var(--line);background:#fff}footer .inner{max-width:var(--maxw);margin:0 auto;padding:26px 24px;display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;font-size:13.5px;color:var(--muted)}footer .mono b{color:var(--ink)}.reveal{opacity:0;transform:translateY(18px);transition:opacity .6s ease,transform .6s ease}.reveal.in{opacity:1;transform:none}:focus-visible{outline:3px solid rgba(15,181,166,.55);outline-offset:2px;border-radius:6px}@media (max-width:900px){.hero .inner{grid-template-columns:1fr;gap:40px}.portrait{max-width:420px}.about-grid,.skillgrid{grid-template-columns:1fr}.project{grid-template-columns:1fr;gap:22px}.project.flip .shot{order:0}.steps{grid-template-columns:repeat(2,1fr)}.links{position:fixed;inset:56px 0 auto 0;flex-direction:column;align-items:stretch;gap:0;background:#fff;border-bottom:1px solid var(--line);padding:8px 20px 18px;transform:translateY(-140%);transition:transform .28s ease;box-shadow:var(--shadow)}.links.open{transform:none}.links a{padding:14px 4px;border-bottom:1px solid var(--line);font-size:16px}.links .btn{margin-top:12px;text-align:center;border-bottom:none}.navtoggle{display:block}}@media (max-width:560px){.steps{grid-template-columns:1fr}.brand .role{display:none}.runner{right:0;width:82%}.stack .inner{gap:10px}.stats{gap:20px}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}.reveal{opacity:1;transform:none;transition:none}.btn:hover,.skillcard:hover{transform:none}}
