/* ==========================================================================
   style.css — shared base styles for every page.
   Load order on each page: Bootstrap -> style.css -> enhancements.css
   (Everything lives in external files so the CSP can drop 'unsafe-inline'.)
   ========================================================================== */

:root{
  --bg:#0A0B0D;
  --surface:#141619;
  --surface-2:#1B1E23;
  --border:#262A31;
  --border-strong:#34393F;
  --text:#E9E7E2;
  --text-dim:#A8B0B7;      /* slightly lighter so it stays clearly above --text-faint */
  --text-faint:#838B94;    /* was #5C636B (~3:1); now ~5:1 on --surface, passes WCAG AA */
  --green:#6FCF97;
  --amber:#E0A458;
  --red:#B9614F;
  --blue:#7CA6D8;
  --mono: 'JetBrains Mono', ui-monospace, monospace;
  --sans: 'IBM Plex Sans', -apple-system, sans-serif;
  --maxw: 1080px;
}

/* ---------- reset + base (identical on every page) ---------- */
*{box-sizing:border-box; margin:0; padding:0;}
html{scroll-behavior:smooth;}
body{
  background:var(--bg);
  color:var(--text);
  font-family:var(--sans);
  line-height:1.6;
  font-size:16px;
  -webkit-font-smoothing:antialiased;
  min-height:100vh;
  display:flex;
  flex-direction:column;
}
main{flex:1;}
a{color:inherit; text-decoration:none;}
::selection{background:var(--green); color:#0A0B0D;}
[hidden]{display:none !important;}
:focus-visible{outline:2px solid var(--green); outline-offset:2px;}

.wrap{max-width:var(--maxw); margin:0 auto; padding:0 32px; width:100%;}

.grid-bg{
  position:fixed; inset:0; z-index:-1; opacity:0.5;
  background-image:
    linear-gradient(var(--border) 1px, transparent 1px),
    linear-gradient(90deg, var(--border) 1px, transparent 1px);
  background-size:64px 64px;
  -webkit-mask-image: radial-gradient(ellipse 80% 50% at 50% 0%, #000 20%, transparent 70%);
          mask-image: radial-gradient(ellipse 80% 50% at 50% 0%, #000 20%, transparent 70%);
}

/* ---------- nav (mobile behaviour lives in enhancements.css) ---------- */
header{
  position:sticky; top:0; z-index:50;
  background:rgba(10,11,13,0.85);
  backdrop-filter:blur(8px);
  border-bottom:1px solid var(--border);
}
nav{
  display:flex; align-items:center; justify-content:space-between;
  padding:18px 0;
}
.logo{
  font-family:var(--mono); font-weight:600; font-size:15px; color:var(--text);
  display:flex; align-items:center; gap:8px;
}
.logo .dot{width:8px; height:8px; border-radius:50%; background:var(--green); display:inline-block;}
.navlinks{display:flex; gap:28px; font-family:var(--mono); font-size:13px; color:var(--text-dim);}
.navlinks a{transition:color .15s ease;}
.navlinks a:hover, .navlinks a.active{color:var(--green);}
.navlinks .branch{
  color:var(--text-faint); border:1px solid var(--border); border-radius:4px;
  padding:3px 10px; font-size:12px;
}

/* ---------- typography + section scaffolding ---------- */
section{padding:80px 0;}
.section-head{display:flex; align-items:baseline; gap:14px; margin-bottom:44px;}
.section-num{font-family:var(--mono); font-size:13px; color:var(--text-faint);}
h2{font-family:var(--mono); font-size:24px; font-weight:600; margin:0;}
.section-rule{flex:1; height:1px; background:var(--border);}
.section-cta{margin-top:28px;}

.hero-mini{padding:72px 0 0;}
.eyebrow{
  font-family:var(--mono); font-size:12px; color:var(--green);
  letter-spacing:0.04em; margin-bottom:18px; display:flex; align-items:center; gap:10px;
}
.eyebrow::before{content:''; width:18px; height:1px; background:var(--green); display:inline-block;}
h1{
  font-family:var(--mono); font-weight:600; font-size:clamp(28px,4.2vw,42px);
  line-height:1.15; letter-spacing:-0.01em; margin-bottom:16px;
}
h1 .accent{color:var(--green);}
.subhead{color:var(--text-dim); font-size:17px; max-width:560px; margin-bottom:0;}

/* ---------- buttons (Bootstrap .btn themed through its own CSS variables,
   so Bootstrap's blue hover/active colours can't leak through) ---------- */
.btn{
  font-family:var(--mono); font-size:13px; padding:11px 20px; border-radius:6px;
  border:1px solid var(--border-strong); transition:all .15s ease;
  display:inline-flex; align-items:center; gap:8px;
  cursor:pointer; background:transparent;
}
.btn-primary{
  --bs-btn-color:#0A0B0D; --bs-btn-bg:var(--green); --bs-btn-border-color:var(--green);
  --bs-btn-hover-color:#0A0B0D; --bs-btn-hover-bg:var(--green); --bs-btn-hover-border-color:var(--green);
  --bs-btn-active-color:#0A0B0D; --bs-btn-active-bg:var(--green); --bs-btn-active-border-color:var(--green);
  background:var(--green); color:#0A0B0D; border-color:var(--green); font-weight:600;
}
.btn-primary:hover{opacity:0.88;}
.btn-secondary{
  --bs-btn-color:var(--text); --bs-btn-bg:transparent; --bs-btn-border-color:var(--border-strong);
  --bs-btn-hover-color:var(--text); --bs-btn-hover-bg:var(--surface); --bs-btn-hover-border-color:var(--text-dim);
  --bs-btn-active-color:var(--text); --bs-btn-active-bg:var(--surface); --bs-btn-active-border-color:var(--text-dim);
  color:var(--text); background:transparent;
}
.btn-secondary:hover{border-color:var(--text-dim); background:var(--surface);}

/* ---------- shared card chrome ---------- */
.card-tab{
  display:flex; align-items:center; justify-content:space-between;
  padding:12px 18px; background:var(--surface-2); border-bottom:1px solid var(--border);
  font-family:var(--mono); font-size:12.5px; color:var(--text-dim);
}
.card-status{color:var(--green);}

.card, .project-card{
  background:var(--surface); border:1px solid var(--border); border-radius:10px;
  overflow:hidden; height:100%;
}
.card{transition:border-color .15s ease, transform .15s ease;}
.card:hover{border-color:var(--border-strong); transform:translateY(-2px);}
.card-body{padding:20px 18px 22px;}
.card-title{font-family:var(--mono); font-size:16px; font-weight:600; margin-bottom:10px; color:var(--text);}
.card-desc{color:var(--text-dim); font-size:14px; margin-bottom:18px;}
.tags{display:flex; flex-wrap:wrap; gap:7px; margin-bottom:18px;}
.tag{
  font-family:var(--mono); font-size:11.5px; padding:3px 9px; border-radius:4px;
  background:var(--surface-2); color:var(--text-dim); border:1px solid var(--border);
}
/* diffstat: both items are features, so both are "+" (green / blue) */
.diffstat{font-family:var(--mono); font-size:12.5px; margin-bottom:16px;}
.diffstat .add{color:var(--green);}
.diffstat .add-alt{color:var(--blue); margin-left:10px;}
.card-links{display:flex; gap:16px; font-family:var(--mono); font-size:12.5px;}
.card-links a{
  color:var(--text-dim); border-bottom:1px solid transparent; display:inline-block;
  transition:color .15s ease, border-color .15s ease;
}
.card-links a:hover{color:var(--green); border-color:var(--green);}

/* ---------- home: hero ---------- */
.hero{padding:96px 0 72px;}
.hero h1{font-size:clamp(34px,5vw,56px); line-height:1.12; margin-bottom:20px;}
.hero .subhead{font-size:18px; margin-bottom:36px;}
.hero-ctas{display:flex; gap:14px; margin-bottom:56px; flex-wrap:wrap;}

/* ---------- home: terminal ---------- */
.terminal{
  background:var(--surface); border:1px solid var(--border); border-radius:10px;
  overflow:hidden; max-width:640px;
}
.term-bar{
  display:flex; align-items:center; gap:8px; padding:12px 16px;
  background:var(--surface-2); border-bottom:1px solid var(--border);
}
.term-dot{width:10px; height:10px; border-radius:50%;}
.term-dot-red{background:var(--red);}
.term-dot-amber{background:var(--amber);}
.term-dot-green{background:var(--green);}
.term-body{
  font-family:var(--mono); font-size:13.5px; padding:20px 22px; color:var(--text-dim);
  min-height:120px;
}
.term-body .prompt{color:var(--green);}
.term-line{margin-bottom:6px; min-height:1.6em;}
.term-out{color:var(--text);}
/* typing animation helpers (see initTerminalTyping in script.js) */
.term-line.is-pending{visibility:hidden;}
.term-rest{visibility:hidden;}
.cursor{display:inline-block; width:8px; height:15px; background:var(--green); vertical-align:middle; animation:blink 1s step-end infinite;}
.cursor.is-typing{animation:none;}
@keyframes blink{50%{opacity:0;}}
@media (prefers-reduced-motion:reduce){.cursor{animation:none;}}

/* ---------- photo frame (home + about) ---------- */
.photo-frame{
  border:1px solid var(--border); border-radius:10px; overflow:hidden;
  background:var(--surface);
}
.hero .photo-frame{max-width:340px;}
.photo-frame .card-tab{padding:12px 16px; font-size:12px;}
.photo-wrap{
  aspect-ratio:4/5; width:100%; background:var(--surface-2);
  display:flex; align-items:center; justify-content:center;
  position:relative; overflow:hidden;
}
.photo-frame img{width:100%; height:100%; object-fit:cover; display:block;}
.photo-caption{
  font-family:var(--mono); font-size:11.5px; color:var(--text-faint);
  text-align:center; padding:10px 12px; border-top:1px solid var(--border);
}

/* ---------- about text + fact list ---------- */
.about-body p{color:var(--text-dim); margin-bottom:18px; max-width:600px;}
.about-body p:last-child{margin-bottom:0;}
.about-body strong{color:var(--text); font-weight:500;}

.facts{font-family:var(--mono); font-size:13px;}
.fact-row{
  display:flex; justify-content:space-between; gap:16px; padding:12px 0;
  border-bottom:1px solid var(--border); color:var(--text-dim);
}
.fact-row span:last-child{color:var(--text); text-align:right;}
/* boxed variant used on about.html */
.facts-card{
  margin-top:28px; border:1px solid var(--border); border-radius:10px;
  background:var(--surface); overflow:hidden;
}
.facts-card .fact-row{padding:14px 20px;}
.facts-card .fact-row:last-child{border-bottom:none;}
.facts-card .fact-row span:first-child{color:var(--text-faint);}

/* ---------- skills ---------- */
.skills-groups{display:grid; grid-template-columns:repeat(auto-fit,minmax(210px,1fr)); gap:24px;}
@media (max-width:800px){ .skills-groups{grid-template-columns:1fr;} }
.skill-group{border:1px solid var(--border); border-radius:10px; padding:22px;}
.skill-group-head{
  font-family:var(--mono); font-size:12px; color:var(--text-faint); margin-bottom:14px;
  display:flex; align-items:center; gap:8px;
}
.skill-group-head::before{content:'$'; color:var(--green);}
.skill-list{display:flex; flex-wrap:wrap; gap:8px;}
.skill-chip{
  font-family:var(--mono); font-size:13px; padding:5px 11px; border-radius:5px;
  background:var(--surface); border:1px solid var(--border); color:var(--text);
}

/* ---------- interests carousel + collapse ---------- */
.interest-slide{
  background:var(--surface); border:1px solid var(--border); border-radius:10px;
  padding:40px; min-height:180px; display:flex; flex-direction:column; justify-content:center;
}
.interest-slide .slide-eyebrow{font-family:var(--mono); font-size:12px; color:var(--green); margin-bottom:10px;}
.interest-slide h3{font-family:var(--mono); font-size:20px; font-weight:600; margin-bottom:10px;}
.interest-slide p{color:var(--text-dim); max-width:520px; margin:0;}
.carousel-indicators [data-bs-target]{
  background-color:var(--border-strong); width:8px; height:8px; border-radius:50%; opacity:1;
}
.carousel-indicators .active{background-color:var(--green);}
.carousel-control-prev, .carousel-control-next{width:5%; opacity:0.6;}
.carousel-control-prev:hover, .carousel-control-next:hover{opacity:1;}
.carousel-control-prev-icon, .carousel-control-next-icon{
  filter: invert(1) grayscale(1) brightness(1.6);
  width:1.6rem; height:1.6rem;
}
.carousel-toggle{
  position:absolute; top:14px; right:14px; z-index:5;
  font-family:var(--mono); font-size:12px; line-height:1; padding:7px 11px; border-radius:5px; cursor:pointer;
  color:var(--text-dim); background:var(--surface-2); border:1px solid var(--border-strong);
  transition:color .15s ease, border-color .15s ease;
}
.carousel-toggle:hover{color:var(--green); border-color:var(--green);}

.collapse-trigger{
  width:100%; text-align:left; display:flex; align-items:center; justify-content:space-between;
}
.collapse-trigger .chevron{transition:transform .2s ease; font-family:var(--mono);}
.collapse-trigger[aria-expanded="true"] .chevron{transform:rotate(180deg);}
.hobbies-panel{
  border:1px solid var(--border); border-radius:10px; padding:22px; margin-top:14px;
  background:var(--surface);
}
.hobbies-panel ul{list-style:none; display:grid; grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); gap:10px;}
.hobbies-panel li{display:flex; gap:10px; align-items:baseline; color:var(--text-dim); font-size:14.5px;}
.hobbies-panel li::before{content:'▸'; color:var(--green); font-family:var(--mono); flex-shrink:0;}

/* ---------- contact ---------- */
.contact-box{
  border:1px solid var(--border); border-radius:10px; padding:44px;
  display:flex; align-items:center; justify-content:space-between; gap:32px; flex-wrap:wrap;
  background:var(--surface);
}
.contact-box h3{font-family:var(--mono); font-size:22px; font-weight:600; margin-bottom:10px;}
.contact-box p{color:var(--text-dim); max-width:420px;}
.contact-links{display:flex; gap:14px; flex-wrap:wrap;}

.form-box{
  border:1px solid var(--border); border-radius:10px; padding:36px 40px;
  background:var(--surface); margin:32px 0;
}
.form-box .card-tab{margin:-36px -40px 28px; border-radius:10px 10px 0 0;}
.form-box .form-label{font-family:var(--mono); font-size:12px; color:var(--text-faint); margin-bottom:8px;}
.form-box .form-control{
  font-family:var(--sans); font-size:14.5px; color:var(--text);
  background:var(--surface-2); border:1px solid var(--border);
  border-radius:6px; padding:11px 14px;
  transition:border-color .15s ease, background .15s ease, box-shadow .15s ease;
}
.form-box .form-control::placeholder{color:var(--text-faint);}
.form-box .form-control:hover{border-color:var(--border-strong);}
.form-box .form-control:focus{
  outline:none; border-color:var(--green); background:var(--surface);
  box-shadow:0 0 0 3px rgba(111,207,151,0.15); color:var(--text);
}
.form-box textarea.form-control{resize:vertical; min-height:130px;}
.form-actions{display:flex; align-items:center; gap:16px; margin-top:24px; flex-wrap:wrap;}
.form-note{font-family:var(--mono); font-size:12px; color:var(--text-faint);}
.clipboard-buffer{position:fixed; left:-9999px; top:0; opacity:0;}

.channel{
  border:1px solid var(--border); border-radius:10px; padding:22px;
  background:var(--surface); transition:border-color .15s ease, transform .15s ease;
}
.channel:hover{border-color:var(--border-strong); transform:translateY(-2px);}
.channel-head{
  display:flex; align-items:center; gap:10px; margin-bottom:12px;
  font-family:var(--mono); font-size:13px; color:var(--text-faint);
}
.channel-head svg{width:18px; height:18px; flex-shrink:0; color:var(--text-dim);}
.channel:hover .channel-head svg{color:var(--green);}
.channel-value{font-family:var(--mono); font-size:14.5px; color:var(--text); word-break:break-word;}
.channel-link{
  display:inline-block; margin-top:14px; font-family:var(--mono); font-size:12.5px; color:var(--text-dim);
  border-bottom:1px solid transparent; transition:color .15s ease, border-color .15s ease;
}
.channel-button{background:none; border:0; border-bottom:1px solid transparent; padding:0; cursor:pointer;}
.channel:hover .channel-link{color:var(--green); border-color:var(--green);}
.channel-note{margin-top:14px; font-family:var(--mono); font-size:12.5px; color:var(--text-faint);}

.socials-label{font-family:var(--mono); font-size:12px; color:var(--text-faint); margin:40px 0 14px;}
.socials-row{display:flex; gap:14px;}
.social-icon{
  width:44px; height:44px; border:1px solid var(--border); border-radius:8px;
  display:flex; align-items:center; justify-content:center; background:var(--surface);
  transition:border-color .15s ease, transform .15s ease, background .15s ease;
}
.social-icon svg{width:20px; height:20px; color:var(--text-dim); transition:color .15s ease;}
.social-icon:hover{border-color:var(--green); transform:translateY(-2px); background:var(--surface-2);}
.social-icon:hover svg{color:var(--green);}

/* ---------- projects page cards ---------- */
.project-card{
  position:relative;
  transition:transform .2s ease, border-color .2s ease, box-shadow .2s ease;
}
.project-card::after{
  content:''; position:absolute; inset:0; border-radius:10px;
  background:radial-gradient(320px circle at 50% 0%, rgba(111,207,151,0.10), transparent 60%);
  opacity:0; transition:opacity .25s ease; pointer-events:none;
}
.project-card:hover{
  transform:translateY(-4px); border-color:var(--green); box-shadow:0 12px 28px rgba(0,0,0,0.35);
}
.project-card:hover::after{opacity:1;}
.project-card .card-body{display:flex; flex-direction:column; height:100%;}
.project-card .card-title{transition:color .2s ease;}
.project-card:hover .card-title{color:var(--green);}
.project-card .card-desc{flex-grow:1; margin-bottom:16px;}
.project-card .tags{margin-bottom:16px;}
.project-card .tag{transition:border-color .2s ease, color .2s ease;}
.project-card:hover .tag{border-color:var(--border-strong); color:var(--text);}
.project-card:hover .card-links a{color:var(--green); border-color:var(--green);}

/* ---------- footer ---------- */
footer{
  border-top:1px solid var(--border); padding:28px 0; margin-top:40px;
  font-family:var(--mono); font-size:12px; color:var(--text-faint);
}
footer .wrap{display:flex; justify-content:space-between; flex-wrap:wrap; gap:10px;}

/* ---------- small screens ---------- */
@media (max-width:760px){
  .form-box{padding:28px 22px;}
  .form-box .card-tab{margin:-28px -22px 24px;}
  .contact-box{padding:32px 24px;}
}
