:root{
  --bg:#eceef0; --card:#fff; --ink:#111; --muted:#5f6368; --line:#e2e4e7;
  --black:#0d0d0f; --radius:28px;
  --shadow:0 1px 2px rgba(0,0,0,.04),0 12px 32px -12px rgba(0,0,0,.12);
  --font:"Plus Jakarta Sans",Inter,system-ui,-apple-system,"Segoe UI",sans-serif;
}
*{box-sizing:border-box;margin:0}
html{scroll-behavior:smooth;scroll-padding-top:84px}
body{font-family:var(--font);background:var(--bg);color:var(--ink);line-height:1.65;-webkit-font-smoothing:antialiased}
ul{list-style:none;padding:0}
a{color:inherit}
:focus-visible{outline:3px solid #6b7280;outline-offset:3px;border-radius:8px}
.skip{position:absolute;left:-999px;top:8px;background:#000;color:#fff;padding:8px 14px;border-radius:10px;z-index:20}
.skip:focus{left:8px}

/* navigasi */
.nav{position:sticky;top:12px;z-index:10;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;
  max-width:1080px;margin:12px auto 0;padding:10px 12px 10px 22px;width:calc(100% - 24px);
  background:rgba(255,255,255,.85);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  border-radius:999px;box-shadow:var(--shadow)}
.brand{font-weight:800;text-decoration:none;letter-spacing:-.02em}
.menu{display:flex;gap:4px}
.menu a{text-decoration:none;font-size:.92rem;font-weight:500;color:var(--muted);padding:8px 14px;border-radius:999px;transition:background .2s,color .2s}
.menu a:hover{background:var(--ink);color:#fff}
.menu-btn{display:none;font:inherit;font-weight:600;font-size:.9rem;background:var(--ink);color:#fff;border:0;border-radius:999px;padding:8px 18px;cursor:pointer}

main{max-width:1080px;margin:0 auto;padding:0 12px}
.section{padding-top:72px}
.title{font-size:clamp(1.6rem,3.5vw,2.1rem);letter-spacing:-.03em;margin-bottom:8px}
.sub{color:var(--muted);margin-bottom:20px}
.title+.grid{margin-top:20px}

/* kartu */
.card{background:var(--card);border-radius:var(--radius);padding:28px;box-shadow:var(--shadow);transition:transform .25s ease,box-shadow .25s ease}
.card p+p{margin-top:12px}
.card h3{font-size:1.05rem;letter-spacing:-.01em;margin-bottom:6px}
.card p{color:var(--muted)}
.card:hover{transform:translateY(-3px);box-shadow:0 1px 2px rgba(0,0,0,.05),0 18px 36px -14px rgba(0,0,0,.2)}

/* kartu hitam glossy */
.glossy{position:relative;overflow:hidden;color:#fff;
  background:radial-gradient(120% 90% at 85% 0%,#2b2b30 0%,#121214 45%,#050506 100%)}
.glossy::before{content:"";position:absolute;inset:0;pointer-events:none;border-radius:inherit;
  background:linear-gradient(115deg,rgba(255,255,255,.14) 0%,rgba(255,255,255,0) 38%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.22),inset 0 0 0 1px rgba(255,255,255,.05)}
.glossy::after{content:"";position:absolute;top:-60%;left:-40%;width:35%;height:220%;pointer-events:none;
  background:linear-gradient(90deg,transparent,rgba(255,255,255,.09),transparent);transform:rotate(20deg);transition:left .9s ease}
.glossy:hover::after{left:110%}
.glossy p,.glossy h2,.glossy h1{position:relative}
.glossy p{color:#c9cacd}
.dark-soft{background:#f7f8f9;box-shadow:inset 0 0 0 1px var(--line)}

/* hero */
.hero{display:grid;grid-template-columns:1.7fr 1fr;gap:16px;padding-top:28px}
.hero-main{padding:clamp(28px,5vw,56px);display:flex;flex-direction:column;align-items:flex-start;justify-content:center;min-height:380px}
.hello{font-size:1rem;margin-bottom:4px}
h1{font-size:clamp(2.4rem,7vw,4.4rem);letter-spacing:-.045em;line-height:1.05;margin-bottom:18px}
.lead{max-width:46ch;margin-bottom:28px}
.hero-side h2{font-size:1.05rem;margin-bottom:14px}
.plain li{padding:12px 0;border-top:1px solid var(--line);font-weight:600}
.btn{position:relative;display:inline-block;text-decoration:none;font-weight:700;background:#fff;color:var(--ink);padding:13px 26px;border-radius:999px;transition:transform .2s,background .2s}
.btn:hover{transform:translateY(-2px);background:#e9eaec}

/* grid */
.grid{display:grid;gap:16px}
.two{grid-template-columns:1.6fr 1fr}
.skills{grid-template-columns:repeat(3,1fr)}
.tile{font-weight:700;font-size:1.1rem;text-align:center;padding:36px 16px}
.tile:hover{background:var(--black);color:#fff}
.hobbies{grid-template-columns:repeat(auto-fit,minmax(190px,1fr))}
.projects{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
.tag{display:inline-block;font-size:.8rem;font-weight:600;background:var(--bg);color:var(--ink);padding:4px 12px;border-radius:999px;margin-bottom:12px}
.project .btn{margin-top:16px;background:var(--ink);color:#fff}
.project .btn:hover{background:#333}

/* kontak */
.contact{padding:clamp(28px,5vw,52px)}
.contact h2{font-size:clamp(1.6rem,3.5vw,2.1rem);letter-spacing:-.03em;margin-bottom:8px}
.links{position:relative;display:flex;flex-wrap:wrap;gap:10px;margin-top:22px}
.links a{text-decoration:none;font-weight:600;padding:11px 22px;border-radius:999px;background:rgba(255,255,255,.1);box-shadow:inset 0 0 0 1px rgba(255,255,255,.18);transition:background .2s,color .2s}
.links a:hover{background:#fff;color:var(--ink)}
.footer{text-align:center;color:var(--muted);font-size:.88rem;padding:56px 12px 36px}

/* responsif */
@media (max-width:820px){
  .hero,.two{grid-template-columns:1fr}
  .skills{grid-template-columns:repeat(2,1fr)}
  .hero-main{min-height:320px}
  .menu-btn{display:block}
  .nav{border-radius:26px}
  .menu{display:none;width:100%;flex-direction:column;padding:10px 0 4px}
  .menu.open{display:flex}
  .menu a{padding:12px 14px}
}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{transition:none!important;animation:none!important;scroll-behavior:auto!important}
}

/* ===== v2: ikon, foto, animasi ===== */
.ic{width:1.15em;height:1.15em;flex:none;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;vertical-align:-.2em}
.card{transform:perspective(900px) rotateX(var(--rx,0deg)) rotateY(var(--ry,0deg)) translateY(var(--ty,0px))}
.card:hover{--ty:-3px;transform:perspective(900px) rotateX(var(--rx,0deg)) rotateY(var(--ry,0deg)) translateY(-3px)}

/* latar bergerak pelan */
.bg{position:fixed;inset:0;z-index:-1;overflow:hidden;pointer-events:none}
.bg i{position:absolute;width:46vmax;height:46vmax;border-radius:50%;filter:blur(70px);opacity:.7;will-change:transform}
.bg i:nth-child(1){left:-12vmax;top:-10vmax;background:radial-gradient(#fff,transparent 70%);animation:drift 22s ease-in-out infinite alternate}
.bg i:nth-child(2){right:-14vmax;bottom:-12vmax;background:radial-gradient(#cfd2d6,transparent 70%);animation:drift 28s ease-in-out infinite alternate-reverse}
@keyframes drift{to{transform:translate3d(8vmax,6vmax,0) scale(1.15)}}

.progress{position:fixed;top:0;left:0;right:0;height:3px;background:var(--ink);transform:scaleX(var(--p,0));transform-origin:0 50%;z-index:30}

/* nav */
.brand{display:flex;align-items:center;gap:10px}
.brand img{width:32px;height:32px;border-radius:50%;object-fit:cover;box-shadow:0 0 0 2px #fff,0 0 0 3px var(--line);transition:transform .4s}
.brand:hover img{transform:rotate(-12deg) scale(1.1)}
.menu a.active{background:var(--ink);color:#fff}

/* hero */
.hero{grid-template-columns:1.5fr 1fr;align-items:stretch}
.hero-side{display:grid;gap:16px;grid-template-rows:auto 1fr}
.hero-main>*{animation:rise .8s cubic-bezier(.2,.7,.2,1) both}
.hero-main>:nth-child(2){animation-delay:.1s}.hero-main>:nth-child(3){animation-delay:.2s}
.hero-main>:nth-child(4){animation-delay:.3s}.hero-main>:nth-child(5){animation-delay:.4s}
.hero-side>*{animation:pop .9s cubic-bezier(.2,.8,.2,1) both .25s}
.hero-side>:nth-child(2){animation-delay:.4s}
@keyframes rise{from{opacity:0;transform:translateY(24px)}}
@keyframes pop{from{opacity:0;transform:scale(.94) translateY(16px)}}
.typed-line{font-weight:600;font-size:clamp(1rem,2.4vw,1.25rem);color:#fff!important;margin-bottom:14px;min-height:1.7em}
.caret{display:inline-block;width:2px;height:1.1em;background:#fff;margin-left:3px;vertical-align:-.15em;animation:blink 1s steps(1) infinite}
@keyframes blink{50%{opacity:0}}
.btn .ic{transition:transform .25s}
.btn:hover .ic{transform:translateX(4px)}
.btn:active{transform:scale(.97)}

.avatar-card{padding:14px}
.avatar-wrap{position:relative;border-radius:20px;overflow:hidden;aspect-ratio:1;animation:float 6s ease-in-out infinite}
.avatar-wrap img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .6s}
.avatar-card:hover .avatar-wrap img{transform:scale(1.07) rotate(-1.5deg)}
@keyframes float{50%{transform:translateY(-8px)}}
.focus .plain li{display:flex;align-items:center;gap:12px;transition:padding-left .25s}
.focus .plain li:hover{padding-left:8px}
.focus .ic{transition:transform .3s}.focus .plain li:hover .ic{transform:rotate(-10deg) scale(1.2)}

/* marquee */
.marquee{overflow:hidden;margin-top:28px;border-radius:999px;background:var(--black);color:#fff;padding:14px 0;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent)}
.track{display:flex;width:max-content;animation:scroll 30s linear infinite}
.marquee:hover .track{animation-play-state:paused}
.track span{display:flex;align-items:center;gap:10px;padding:0 26px;font-weight:600;white-space:nowrap}
@keyframes scroll{to{transform:translateX(-50%)}}

/* about, skill, hobi, proyek */
.about{display:flex;gap:20px;align-items:flex-start}
.about-img{width:96px;height:96px;border-radius:24px;object-fit:cover;flex:none;transition:transform .4s}
.about:hover .about-img{transform:rotate(-4deg) scale(1.05)}
.tile{display:flex;flex-direction:column;align-items:center;gap:12px}
.tile .ic{width:30px;height:30px}
.tile:hover .ic,.bubble:hover .ic,.card:hover .bubble .ic{animation:wiggle .6s ease}
@keyframes wiggle{25%{transform:rotate(-14deg) scale(1.15)}60%{transform:rotate(10deg) scale(1.15)}}
.bubble{display:inline-grid;place-items:center;width:46px;height:46px;border-radius:16px;background:var(--black);color:#fff;margin-bottom:14px;transition:transform .3s,border-radius .3s}
.hobby:hover .bubble{transform:translateY(-3px) rotate(-6deg);border-radius:50%}
.project .bubble{margin-bottom:16px}
.project .tag{margin-left:10px}
.links a{display:inline-flex;align-items:center;gap:10px}

/* reveal saat scroll (tetap terlihat kalau JS mati) */
.js [data-reveal]{opacity:0;translate:0 28px;transition:opacity .7s ease var(--d,0s),translate .7s cubic-bezier(.2,.7,.2,1) var(--d,0s),transform .25s ease,box-shadow .25s ease,background .2s,color .2s}
.js [data-reveal].in{opacity:1;translate:0 0}

/* kilau mengikuti kursor */
.glossy::before{background:radial-gradient(280px circle at var(--mx,75%) var(--my,10%),rgba(255,255,255,.13),transparent 65%),linear-gradient(115deg,rgba(255,255,255,.12) 0%,rgba(255,255,255,0) 38%)}

@media (max-width:820px){
  .hero{grid-template-columns:1fr}
  .hero-side{grid-template-columns:1fr 1fr;grid-template-rows:auto}
  .about{flex-direction:column}
  .marquee{margin-top:20px}
}
@media (max-width:520px){
  .hero-side{grid-template-columns:1fr}
  .avatar-card{max-width:260px;margin:0 auto;width:100%}
}
@media (prefers-reduced-motion:reduce){
  .js [data-reveal]{opacity:1;translate:none}
  .track,.bg i,.avatar-wrap,.caret{animation:none!important}
  .hero-main>*,.hero-side>*{animation:none!important}
}
.proj-top{display:flex;align-items:center;margin-bottom:12px}
.proj-top .bubble,.proj-top .tag{margin:0}
.proj-top .tag{margin-left:12px}
