
:root{
  --bg:#e7e4dc; --panel:#fffdf7; --ink:#1a1a1a; --teal:#297e78;
  --muted:#6f6a60; --hair:#d8d2c4; --soft:#efeadd;
  --mono:ui-monospace,"SF Mono","Cascadia Code",Menlo,Consolas,monospace;
  --sh:6px 6px 0 var(--ink); --sh-sm:3px 3px 0 var(--ink);
  --h0:#e3ddcf; --h1:#cfe9e5; --h2:#8fccc5; --h3:#4fa49b; --h4:#297e78;
}
*{box-sizing:border-box}
html{background:var(--bg)}
body{margin:0;font-family:var(--mono);color:var(--ink);line-height:1.55;
  font-size:14px;-webkit-text-size-adjust:100%}
a{color:var(--teal);text-decoration:underline;text-underline-offset:2px}
a:hover{background:var(--teal);color:var(--panel);text-decoration:none}
::selection{background:var(--ink);color:var(--panel)}
h1,h2,h3{font-weight:700;line-height:1.2;margin:0 0 .6rem}
h1{font-size:1.5rem} h2{font-size:1.15rem} h3{font-size:1rem}
p{margin:0 0 .8rem}
hr{border:0;border-top:2px solid var(--ink);margin:1.5rem 0}
small{color:var(--muted)}
code{background:var(--soft);padding:.05rem .3rem;border:1px solid var(--hair)}
.muted{color:var(--muted)}
.accent{color:var(--teal)}
.mono{font-family:var(--mono)}

.wrap{max-width:1000px;margin:0 auto;padding:0 1.25rem}
.stack>*+*{margin-top:1rem}

/* header */
header.site{border-bottom:2px solid var(--ink);background:var(--panel)}
header.site .row{display:flex;align-items:center;gap:1rem;height:58px}
.brand{display:flex;align-items:baseline;gap:.55rem;font-weight:700;
  font-size:1.05rem;text-decoration:none;color:var(--ink);white-space:nowrap}
.brand:hover{background:transparent;color:var(--ink)}
.brand .hub{color:var(--teal)}
.nav{display:flex;align-items:center;gap:1rem;margin-left:auto;flex-wrap:wrap}
.nav a{color:var(--ink);text-decoration:none}
.nav a:hover{background:var(--teal);color:var(--panel)}
.searchbox input{width:230px}

/* layout helpers */
main{padding:2rem 0 4rem}
.row{display:flex;align-items:center;gap:1rem}
.between{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}
.spread{display:flex;gap:2rem;flex-wrap:wrap}
.col{flex:1;min-width:0}
.grid{display:grid;gap:1rem}
.center{text-align:center}

/* panel / card */
.panel{background:var(--panel);border:2px solid var(--ink);box-shadow:var(--sh);
  padding:1.25rem 1.4rem}
.panel.tight{padding:.9rem 1rem;box-shadow:var(--sh-sm)}

/* buttons */
.btn{display:inline-block;font-family:var(--mono);font-size:.9rem;cursor:pointer;
  background:var(--panel);color:var(--ink);border:2px solid var(--ink);
  box-shadow:var(--sh-sm);padding:.45rem .9rem;text-decoration:none;
  transition:transform .04s,box-shadow .04s}
.btn:hover{background:var(--ink);color:var(--panel)}
.btn:active{transform:translate(3px,3px);box-shadow:none}
.btn.primary{background:var(--teal);color:var(--panel);border-color:var(--ink)}
.btn.primary:hover{background:var(--ink)}
.btn.sm{padding:.25rem .6rem;font-size:.8rem;box-shadow:2px 2px 0 var(--ink)}
.btn.on{background:var(--teal);color:var(--panel)}
.btn.danger{background:#b3463a;color:var(--panel)}
.btn[disabled]{opacity:.5;cursor:default;box-shadow:none}

/* danger zone (e.g. delete repository) */
.danger-zone{border-color:#b3463a}
.danger-zone h2{color:#b3463a;margin-top:0}

/* forms */
.field{margin-bottom:.9rem}
label.lbl{display:block;font-size:.82rem;color:var(--muted);margin-bottom:.25rem}
input,textarea,select{font-family:var(--mono);font-size:.9rem;color:var(--ink);
  background:var(--panel);border:2px solid var(--ink);padding:.45rem .6rem;width:100%}
input:focus,textarea:focus,select:focus{outline:3px solid var(--teal);outline-offset:-1px}
textarea{resize:vertical;min-height:5rem}
.inline-form{display:inline}

/* flash messages */
.flash{border:2px solid var(--ink);padding:.6rem .9rem;margin-bottom:1.2rem;
  box-shadow:var(--sh-sm)}
.flash.err{background:#fbe9e6} .flash.ok{background:#e7f3f1}

/* pills / stats */
.pill{display:inline-flex;align-items:center;gap:.3rem;border:2px solid var(--ink);
  padding:.05rem .45rem;font-size:.78rem;background:var(--panel)}
.stat b{font-size:1rem}
.dot{color:var(--muted)}

/* repo list */
.repo-card{border:2px solid var(--ink);background:var(--panel);box-shadow:var(--sh-sm);
  padding:.9rem 1.1rem}
.repo-card .name{font-size:1.05rem;font-weight:700}
.repo-card .name a{text-decoration:none}
.repo-card .desc{color:var(--muted);margin:.3rem 0 .5rem}
.repo-card .meta{display:flex;gap:1.2rem;font-size:.8rem;color:var(--muted);flex-wrap:wrap}

/* repo header */
.repo-head .title{font-size:1.4rem;font-weight:700}
.repo-head .title a{text-decoration:none}

/* brief / intent */
.brief{white-space:pre-wrap;word-break:break-word;margin:0}
.entry{border-left:3px solid var(--teal);padding:.15rem 0 .15rem .8rem;margin:.1rem 0 1rem}
.entry .by{color:var(--muted);font-size:.78rem}

/* commit log */
.commit{display:flex;gap:.8rem;padding:.55rem 0;border-top:1px solid var(--hair)}
.commit:first-child{border-top:0}
.commit .msg{font-weight:700}
.commit .meta{color:var(--muted);font-size:.78rem}
.commit .sha{color:var(--teal)}

/* tabs */
.tabs{display:flex;gap:.4rem;border-bottom:2px solid var(--ink);margin-bottom:1.2rem}
.tabs a{text-decoration:none;color:var(--ink);padding:.4rem .8rem;border:2px solid transparent;
  border-bottom:0;position:relative;top:2px}
.tabs a:hover{background:var(--soft)}
.tabs a.active{border-color:var(--ink);background:var(--panel);font-weight:700}

/* ascii hero — the art MUST stay left-aligned internally so lines share one
   left origin and the figure renders undistorted; inline-block keeps the block
   itself centered within the hero. The font is sized to the *container* width
   (the longest line is 72 cols) so the figure always fits and never scrolls;
   overflow:hidden guarantees no scrollbar. The vw clamp is a fallback for
   browsers without container queries. */
.hero{container-type:inline-size}
.hero pre{margin:0;line-height:1.05;white-space:pre;text-align:left;
  display:inline-block;max-width:100%;overflow:hidden;color:var(--ink);
  font-size:clamp(4px,calc((100vw - 5rem)/88),11px)}
@supports (container-type:inline-size){
  .hero pre{font-size:min(11px,calc(100cqw / 48))}
}
.empty{text-align:center;color:var(--muted)}

/* heatmap — scale the whole 1-year grid to fit its container so the latest
   week (today, at the right edge) is always visible without horizontal scroll.
   max-width keeps cells from growing past their natural size on wide panels. */
.heatmap{overflow:hidden}
.heatmap svg{display:block;width:100%;max-width:795px;height:auto}
.legend{display:flex;align-items:center;gap:.35rem;font-size:.72rem;color:var(--muted);
  justify-content:flex-end;margin-top:.4rem}
.legend i{width:11px;height:11px;display:inline-block;border:1px solid var(--hair)}

/* misc */
.kv{display:grid;grid-template-columns:auto 1fr;gap:.2rem 1rem;font-size:.85rem}
.token{font-family:var(--mono);background:var(--ink);color:var(--panel);padding:.5rem .7rem;
  word-break:break-all;border:2px solid var(--ink)}
.token-input{flex:1;min-width:0;font-family:var(--mono);background:var(--ink);color:var(--panel);
  padding:.5rem .7rem;border:2px solid var(--ink);cursor:text}
.clone-input{flex:1;min-width:0;font-family:var(--mono);font-size:.9rem;background:transparent;
  border:0;color:var(--ink);padding:.2rem 0}
.clone-input:focus{outline:0}
.sep{color:var(--muted);margin:0 .3rem}
.right{margin-left:auto}
footer.site{border-top:2px solid var(--ink);padding:1.2rem 0;color:var(--muted);font-size:.8rem}
footer.site a{color:var(--muted)}

@media (max-width:680px){
  .searchbox{display:none}
  header.site .row{height:auto;padding:.6rem 0;flex-wrap:wrap}
  .panel{box-shadow:var(--sh-sm)}
  .spread{flex-direction:column}
}
