/* ============================================================
   Aaron Lei — Geist 設計系統 / light · dark
   由 <html data-theme> 切換。
   ============================================================ */

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}
body{margin:0;background:var(--bg);color:var(--ink);
  font-family:"Geist","Noto Sans TC",-apple-system,sans-serif;line-height:1.65;
  -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
  transition:background .4s ease,color .4s ease,border-color .4s ease}
img{max-width:100%;display:block}
a{color:inherit}
h1,h2,h3,h4{margin:0;font-weight:650;letter-spacing:-.03em;line-height:1.1}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:3px}

:root{
  --mono:"Geist Mono",ui-monospace,monospace;
  --shell:1180px;
  --pad:clamp(1.1rem,4vw,2.2rem);
  --radius:8px;
  --radius-lg:12px;
}
[data-theme="light"]{
  --bg:#ffffff;--surface:#fafafa;--surface-2:#f4f4f4;
  --ink:#0a0a0a;--muted:#666666;--faint:#999999;
  --line:#eaeaea;--line-strong:#0a0a0a;--accent:#0070f3;
  --code-bg:#0a0a0a;--code-ink:#ededed;
}
[data-theme="dark"]{
  --bg:#000000;--surface:#0c0c0c;--surface-2:#141414;
  --ink:#ededed;--muted:#a1a1a1;--faint:#707070;
  --line:#242424;--line-strong:#ededed;--accent:#3291ff;
  --code-bg:#0c0c0c;--code-ink:#ededed;
}

/* ---------- header ---------- */
.site{max-width:var(--shell);margin:0 auto;padding:0 var(--pad)}
.topbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:1rem 0;
  position:sticky;top:0;z-index:30;background:color-mix(in srgb,var(--bg) 84%,transparent);
  backdrop-filter:saturate(1.4) blur(14px);border-bottom:1px solid var(--line)}
.brand{display:flex;align-items:center;gap:.55rem;text-decoration:none;font-weight:680;letter-spacing:-.02em;font-size:1.05rem}
.brand .dot{width:11px;height:11px;background:var(--ink);border-radius:3px}
nav.main{display:flex;gap:.1rem;align-items:center;flex-wrap:wrap}
nav.main a{text-decoration:none;color:var(--muted);font-size:.92rem;padding:.45rem .7rem;border-radius:8px;transition:.18s}
nav.main a:hover{color:var(--ink);background:var(--surface)}
nav.main a.is-current{color:var(--ink)}
.headright{display:flex;align-items:center;gap:.6rem}
.themeswitch{display:inline-flex;height:36px;padding:0;gap:0;background:transparent;border:1px solid var(--line);
  border-radius:8px;overflow:hidden}
.themeswitch button{font:inherit;cursor:pointer;border:0;background:transparent;color:var(--muted);
  width:36px;height:36px;padding:0;border-radius:0;transition:.18s;display:flex;align-items:center;justify-content:center}
.themeswitch button+button{border-left:1px solid var(--line)}
.themeswitch button:hover{color:var(--ink);background:var(--surface)}
.themeswitch button[aria-pressed="true"]{background:var(--surface-2);color:var(--ink)}
.themeswitch svg{width:14px;height:14px;display:block}

.site-main{min-height:60vh}

/* ---------- generic ---------- */
.section{padding:clamp(2.2rem,6vw,4.5rem) 0}
.eyebrow{font-family:var(--mono);font-size:.78rem;letter-spacing:.04em;color:var(--muted)}
.cat{display:inline-block;font-family:var(--mono);font-size:.74rem;color:var(--accent);text-decoration:none}
.cat:hover{text-decoration:underline;text-underline-offset:3px}
.tag{display:inline-block;font-family:var(--mono);font-size:.74rem;color:var(--muted);
  border:1px solid var(--line);padding:.16rem .5rem;border-radius:5px;text-decoration:none;transition:.18s}
.tag:hover{border-color:var(--line-strong);color:var(--ink)}
.meta{font-family:var(--mono);font-size:.78rem;color:var(--muted);display:flex;gap:.7rem;align-items:center;flex-wrap:wrap}
.text-link{color:var(--accent);text-decoration:none;font-size:.9rem;font-family:var(--mono)}
.text-link:hover{text-decoration:underline;text-underline-offset:3px}
.btn{display:inline-flex;align-items:center;gap:.5rem;text-decoration:none;font-weight:560;font-size:.92rem;
  padding:.7rem 1.3rem;border-radius:8px;background:var(--ink);color:var(--bg);border:1px solid var(--ink);transition:.22s}
.btn:hover{transform:translateY(-1px);opacity:.9}
.btn.ghost{background:transparent;color:var(--ink);border-color:var(--line-strong)}
.empty-state{padding:4rem 0;color:var(--muted);text-align:center}

/* ---------- home hero ---------- */
.hero{padding:clamp(2.6rem,8vw,6rem) 0 clamp(1.4rem,4vw,3rem)}
.hero h1{font-size:clamp(2.6rem,7vw,5rem);max-width:16ch}
.hero p{font-size:clamp(1.1rem,2.2vw,1.4rem);color:var(--muted);max-width:50ch;margin:1.3rem 0 0}
.hero .cta{display:flex;gap:.7rem;margin-top:1.9rem;flex-wrap:wrap}

.feedhead{display:flex;align-items:baseline;justify-content:space-between;gap:1rem;margin-bottom:1.5rem}
.feedhead h2{font-size:clamp(1.5rem,3vw,2rem)}

/* ---------- card grid ---------- */
.cards{display:grid;gap:0;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));
  border:1px solid var(--line);border-radius:var(--radius-lg);overflow:hidden;background:var(--line)}
.card{background:var(--bg);padding:1.5rem;display:flex;flex-direction:column;gap:.6rem;
  text-decoration:none;color:inherit;outline:.5px solid var(--line);transition:background .2s}
.card:hover{background:var(--surface)}
.card .thumb{aspect-ratio:16/9;border-radius:var(--radius);background:var(--surface-2) center/cover no-repeat;
  margin:-.2rem 0 .4rem;border:1px solid var(--line)}
.card .catrow{display:flex;gap:.5rem;align-items:center;flex-wrap:wrap}
.card h3{font-size:1.28rem;line-height:1.22}
.card p{color:var(--muted);font-size:.94rem;margin:0;flex:1}
.card .meta{margin-top:.3rem}

/* stretched-link：整張卡片/列可點進文章，但分類/標籤是獨立可點連結 */
.card,.row{position:relative}
.card h3 a,.row h3 a{color:inherit;text-decoration:none}
.card h3 a::after,.row h3 a::after{content:"";position:absolute;inset:0;z-index:1}
.card:hover h3 a,.row:hover h3 a{color:var(--ink)}
.card .catrow,.row .catrow,.row .tags{position:relative;z-index:2}

/* ---------- page head ---------- */
.pagehead{padding:clamp(2.4rem,7vw,4.5rem) 0 clamp(1.3rem,3vw,2.2rem);border-bottom:1px solid var(--line)}
.pagehead .eyebrow{margin-bottom:.6rem;display:block}
.pagehead h1{font-size:clamp(2.2rem,5vw,3.4rem)}
.pagehead p{color:var(--muted);margin:.9rem 0 0;max-width:56ch;font-size:1.05rem}
.pagehead .page-prose{margin-top:1rem}

/* category filter chips */
.chips{display:flex;gap:.5rem;flex-wrap:wrap;margin:1.6rem 0 0}
.chip{font-family:var(--mono);font-size:.82rem;text-decoration:none;color:var(--muted);
  border:1px solid var(--line);padding:.38rem .8rem;border-radius:6px;transition:.18s}
.chip .n{color:var(--faint);margin-left:.35rem}
.chip.on,.chip:hover{background:var(--ink);color:var(--bg);border-color:var(--ink)}
.chip.on .n,.chip:hover .n{color:color-mix(in srgb,var(--bg) 60%,transparent)}

/* ---------- list rows ---------- */
.rows{display:flex;flex-direction:column}
.row{display:grid;grid-template-columns:1fr auto;gap:.4rem 1.4rem;align-items:start;
  padding:1.5rem 0;border-bottom:1px solid var(--line);text-decoration:none;color:inherit;transition:padding .2s}
.row.has-thumb{grid-template-columns:auto 1fr auto}
.row:hover{padding-left:.5rem}
.row .rowthumb{width:140px;aspect-ratio:16/10;border-radius:var(--radius);grid-row:span 2;
  background:var(--surface-2) center/cover no-repeat;border:1px solid var(--line)}
.row .body{min-width:0}
.row .catrow{display:flex;gap:.6rem;align-items:center;margin-bottom:.3rem;flex-wrap:wrap}
.row h3{font-size:1.32rem;line-height:1.25}
.row p{color:var(--muted);margin:.35rem 0 .5rem;font-size:.94rem;max-width:62ch}
.row .tags{display:flex;gap:.4rem;flex-wrap:wrap}
.row .when{font-family:var(--mono);color:var(--faint);font-size:.8rem;white-space:nowrap;padding-top:.25rem}

/* ---------- taxonomy overview ---------- */
.taxgrid{display:grid;gap:0;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));
  border:1px solid var(--line);border-radius:var(--radius-lg);overflow:hidden;background:var(--line)}
.taxcell{background:var(--bg);padding:1.4rem 1.5rem;text-decoration:none;color:inherit;
  outline:.5px solid var(--line);display:flex;flex-direction:column;gap:.3rem;transition:background .2s}
.taxcell:hover{background:var(--surface)}
.taxcell .name{font-size:1.25rem;font-weight:650;letter-spacing:-.02em;display:flex;align-items:center;gap:.5rem}
.taxcell .name .hash{font-family:var(--mono);color:var(--accent);font-weight:400}
.taxcell .count{font-family:var(--mono);font-size:.8rem;color:var(--faint)}
.taxcell .desc{color:var(--muted);font-size:.9rem}
.cloud{display:flex;flex-wrap:wrap;gap:.6rem;margin-top:.5rem}
.cloud a{text-decoration:none;color:var(--ink);font-family:var(--mono);border:1px solid var(--line);
  padding:.45rem .9rem;border-radius:8px;transition:.18s;display:inline-flex;gap:.4rem;align-items:baseline}
.cloud a:hover{border-color:var(--line-strong)}
.cloud a .n{font-size:.78rem;color:var(--faint)}

/* ---------- single ---------- */
.article{max-width:680px;margin:0 auto;padding:clamp(2.4rem,7vw,4.5rem) 0}
.article .ahead{margin-bottom:2rem}
.article .ahead .catrow{display:flex;gap:.6rem;align-items:center;margin-bottom:.8rem;flex-wrap:wrap}
.article h1{font-size:clamp(2.1rem,5vw,3.2rem);line-height:1.08;margin:.4rem 0 1rem}
.article .ahead .meta{margin-top:.9rem}
.article .lede{font-size:1.18rem;color:var(--muted);margin:0 0 .5rem;line-height:1.6}
.post-hero{margin:2rem 0;border-radius:var(--radius-lg);overflow:hidden;border:1px solid var(--line)}
.post-hero img{width:100%;aspect-ratio:16/9;object-fit:cover}

.prose{font-size:1.12rem;line-height:1.85}
.prose>p:first-child{margin-top:0}
.prose p{margin:1.4rem 0}
.prose h2{font-size:1.55rem;margin:2.4rem 0 .9rem}
.prose h3{font-size:1.22rem;margin:1.9rem 0 .7rem}
.prose blockquote{margin:1.8rem 0;padding-left:1.3rem;border-left:2px solid var(--line-strong);color:var(--muted)}
.prose :not(pre)>code{font-family:var(--mono);font-size:.86em;background:var(--surface);padding:.12em .4em;border-radius:5px;border:1px solid var(--line)}
.prose a{color:var(--accent);text-underline-offset:3px}
.prose ul,.prose ol{padding-left:1.3rem;margin:1.2rem 0}
.prose li{margin:.45rem 0}
.prose img{border-radius:var(--radius)}
.prose-figure{margin:1.8rem 0}
.prose-figure img{border:1px solid var(--line);border-radius:var(--radius-lg);width:100%}
.prose-figure figcaption{font-family:var(--mono);font-size:.78rem;color:var(--faint);margin-top:.5rem;text-align:center}

/* code blocks (render hook wraps highlight in .code-block) */
.code-block{margin:1.6rem 0;border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;background:var(--code-bg)}
.code-block-header{display:flex;align-items:center;justify-content:space-between;padding:.5rem .9rem;
  border-bottom:1px solid color-mix(in srgb,var(--code-ink) 14%,transparent);background:color-mix(in srgb,var(--code-bg) 70%,#000)}
.code-block-lang{font-family:var(--mono);font-size:.74rem;color:#9aa;letter-spacing:.04em;text-transform:uppercase}
.code-block-copy{font:inherit;font-family:var(--mono);font-size:.74rem;cursor:pointer;color:#ccd;
  background:transparent;border:1px solid color-mix(in srgb,var(--code-ink) 20%,transparent);
  border-radius:5px;padding:.2rem .55rem;transition:.18s}
.code-block-copy:hover{color:#fff;border-color:color-mix(in srgb,var(--code-ink) 45%,transparent)}
.code-block-copy[data-copy-state="done"]{color:#5ad}
.code-block .highlight{margin:0}
.code-block pre{margin:0;padding:1.1rem 1.2rem;overflow:auto;background:var(--code-bg)!important;color:var(--code-ink)}
.code-block pre code{font-family:var(--mono);font-size:.86rem;background:none;border:0;padding:0}

.posttags{display:flex;gap:.5rem;flex-wrap:wrap;align-items:center;margin:2.2rem 0;padding-top:1.8rem;border-top:1px solid var(--line)}
.postnav{display:grid;grid-template-columns:1fr 1fr;gap:0;margin-top:2.2rem;border:1px solid var(--line);border-radius:var(--radius-lg);overflow:hidden;background:var(--line)}
.postnav a{background:var(--bg);padding:1.3rem;text-decoration:none;color:inherit;transition:background .2s}
.postnav a:hover{background:var(--surface)}
.postnav .dir{font-family:var(--mono);font-size:.76rem;color:var(--faint)}
.postnav .pt{margin-top:.35rem;font-weight:600;font-size:1.02rem;letter-spacing:-.01em}
.postnav a.next{text-align:right}
.postnav .is-empty{background:var(--bg)}

/* ---------- archive ---------- */
.archive{padding:clamp(2rem,5vw,3.2rem) 0}
.yeargroup{margin-bottom:2.4rem}
.yeargroup h2{font-family:var(--mono);font-size:1.25rem;color:var(--muted);margin-bottom:.5rem;font-weight:500}
.alist{display:flex;flex-direction:column}
.aitem{display:flex;gap:1.1rem;align-items:baseline;padding:.8rem 0;border-bottom:1px solid var(--line);text-decoration:none;color:inherit;transition:.18s}
.aitem:hover{color:var(--accent);padding-left:.4rem}
.aitem .d{font-family:var(--mono);font-size:.82rem;color:var(--faint);width:3.5rem;flex:none}
.aitem .t{font-size:1.08rem;flex:1;letter-spacing:-.01em}
.aitem .c{font-family:var(--mono);font-size:.76rem;color:var(--muted)}

/* ---------- about / generic page ---------- */
.about{max-width:680px;margin:0 auto;padding:clamp(2.4rem,7vw,4.5rem) 0}
.about .avatar{width:96px;height:96px;border-radius:14px;background:linear-gradient(135deg,var(--accent),var(--ink));margin-bottom:1.5rem}
.about .avatar.photo{background:var(--surface-2) center/cover no-repeat;border:1px solid var(--line)}
.about .eyebrow{display:block;margin-bottom:.5rem}
.about h1{font-size:clamp(2rem,5vw,2.9rem);margin-bottom:1.1rem}
.sociallinks{display:flex;gap:.55rem;flex-wrap:wrap;margin-top:1.8rem}
.sociallinks a{text-decoration:none;color:var(--ink);border:1px solid var(--line-strong);
  padding:.5rem 1rem;border-radius:7px;font-size:.82rem;font-family:var(--mono);transition:.18s}
.sociallinks a:hover{background:var(--ink);color:var(--bg)}

/* ---------- pagination ---------- */
.pager{display:flex;justify-content:center;align-items:center;gap:.4rem;margin:2.6rem 0 0;flex-wrap:wrap}
.pager a,.pager span{font-family:var(--mono);font-size:.85rem;text-decoration:none;color:var(--muted);
  border:1px solid var(--line);padding:.4rem .75rem;border-radius:6px;transition:.18s}
.pager a:hover{border-color:var(--line-strong);color:var(--ink)}
.pager .current{background:var(--ink);color:var(--bg);border-color:var(--ink)}
.pager .disabled{opacity:.4}

/* ---------- footer ---------- */
.site-foot{border-top:1px solid var(--line);margin-top:clamp(3rem,8vw,5.5rem)}
.foot-inner{max-width:var(--shell);margin:0 auto;padding:2.3rem var(--pad);display:flex;justify-content:space-between;gap:1.4rem;flex-wrap:wrap;align-items:center}
.foot-inner .c{font-family:var(--mono);font-size:.82rem;color:var(--muted)}
.foot-inner nav{display:flex;gap:1.1rem;flex-wrap:wrap}
.foot-inner nav a{color:var(--muted);text-decoration:none;font-size:.86rem;font-family:var(--mono)}
.foot-inner nav a:hover{color:var(--ink)}

@media(max-width:680px){
  .topbar{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:.65rem .75rem;align-items:center;
    padding:.75rem 0 0}
  .brand{grid-column:1;grid-row:1;min-width:0;min-height:44px;font-size:1rem}
  .brand .dot{flex:none}
  .headright{grid-column:2;grid-row:1;justify-content:flex-end}
  nav.main{grid-column:1/-1;grid-row:2;display:flex;flex-wrap:nowrap;gap:.35rem;overflow-x:auto;overscroll-behavior-x:contain;
    margin:.05rem calc(var(--pad) * -1) 0;padding:0 var(--pad);border-top:1px solid var(--line);
    scrollbar-width:none;-webkit-overflow-scrolling:touch}
  nav.main::-webkit-scrollbar{display:none}
  nav.main a{flex:0 0 auto;min-height:44px;display:inline-flex;align-items:center;justify-content:center;
    margin-bottom:-1px;padding:0 .7rem;border-bottom:1px solid transparent;border-radius:0;font-size:.9rem;
    white-space:nowrap}
  nav.main a:first-child{margin-left:-.7rem}
  nav.main a:hover{background:transparent;color:var(--ink)}
  nav.main a.is-current{color:var(--ink);font-weight:560;border-bottom-color:var(--line-strong)}
  .row,.row.has-thumb{grid-template-columns:1fr;gap:.3rem}
  .row .when{display:none}
  .row .rowthumb{width:100%;grid-row:auto;margin-bottom:.6rem}
  .postnav,.cards,.taxgrid{grid-template-columns:1fr}
}
/* ---------- 跨頁切換（View Transitions）---------- */
/* 點分類/標籤是真實導航到該頁，但畫面滑順過渡：頂欄與篩選列保持不動，只有文章列表淡入淡出，像在原地篩選。不支援的瀏覽器退回一般換頁。 */
@view-transition{navigation:auto}
.topbar{view-transition-name:site-topbar}
.chips{view-transition-name:filter-chips}
::view-transition-old(root),::view-transition-new(root){animation-duration:.22s}

@media(prefers-reduced-motion:reduce){
  @view-transition{navigation:none}
  *{transition:none!important;scroll-behavior:auto!important}
}
