:root {
  color-scheme: light dark;
  --bg: #fdfdfc;
  --fg: #17191c;
  --dim: #6c7278;
  --mono: "Cascadia Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo,
          "JetBrains Mono", Consolas, "DejaVu Sans Mono",
          "Sarasa Mono SC", "Noto Sans Mono CJK SC", "Microsoft YaHei Mono",
          "Microsoft YaHei", monospace;
  /* 文章正文的衬线。故意跟 giscus 的 fro 主题用同一条栈，正文和评论区字体一致。
     没有 webfont：拉丁取系统衬线（Win 上是 Georgia），中文由系统补衬线字
     （Win 上是 SimSun/宋体）。所以不同系统看到的不完全一样，这是取舍。 */
  --serif: ui-serif, "Georgia", "Cambria", "Times New Roman", "Times", serif;
  --measure: 46rem;
  --pad: 1.5rem;
}

@media (prefers-color-scheme: dark) {
  :root { --bg: #0c0d0f; --fg: #e7e7e4; --dim: #8b9199; }
}

* { box-sizing: border-box; }

body {
  margin: 0;
  background: var(--bg);
  color: var(--fg);
  font-family: var(--mono);
  font-size: 16px;
  line-height: 1.75;
  font-variant-ligatures: none;
  -webkit-text-size-adjust: 100%;
}

.wrap {
  max-width: var(--measure);
  margin-inline: auto;
  padding-inline: var(--pad);
}

a {
  color: var(--fg);
  text-decoration: underline;
  text-decoration-color: var(--dim);
  text-underline-offset: 0.3em;
}
a:hover { text-decoration-color: currentColor; }
:focus-visible { outline: 2px solid var(--fg); outline-offset: 3px; }

/* nav */
.nav {
  position: sticky;
  top: 0;
  z-index: 2;
  background: var(--bg);
}
.nav .wrap {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding-block: 0.875rem;
}
.mark { text-decoration: none; letter-spacing: 0.02em; }
.nav ul {
  display: flex;
  gap: 1.25rem;
  margin: 0;
  padding: 0;
  list-style: none;
  font-size: 0.9375rem;
}
.nav ul a { color: var(--dim); text-decoration: none; }
.nav ul a:hover { color: var(--fg); }

/* hero */
.hero { padding-block: clamp(3rem, 13vh, 7rem) 2rem; }
h1 {
  margin: 0;
  font-size: clamp(3rem, 14vw, 7.5rem);
  font-weight: 600;
  line-height: 0.95;
  letter-spacing: -0.035em;
}
.cn {
  margin: 0.5rem 0 0;
  color: var(--dim);
  font-size: 0.9375rem;
  letter-spacing: 0.3em;
}
.tagline { margin: 1.75rem 0 0; font-size: 1.0625rem; }
.cursor {
  display: inline-block;
  margin-left: 0.25em;
  animation: blink 1.05s steps(1, end) infinite;
}
@keyframes blink { 50% { opacity: 0; } }

.art { overflow: hidden; margin-top: clamp(2rem, 7vh, 3.5rem); }
/* planet-scale is a coloured piece: it fills the tag's width, so give it one. */
.art ascii-art { display: block; width: 100%; aspect-ratio: 2 / 1; background: #050505; }

/* sections */
section { padding-block: 2.5rem; scroll-margin-top: 4rem; }
h2 {
  margin: 0 0 1.5rem;
  color: var(--dim);
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: 0.18em;
}
section p { margin: 0 0 0.25rem; max-width: 34em; }

/* ascii rules */
.rule {
  margin: 0;
  overflow: hidden;
  white-space: nowrap;
  color: var(--dim);
  font-size: 0.8125rem;
  line-height: 1;
  opacity: 0.45;
}

/* projects: ascii file tree */
.tree-root { margin: 0; color: var(--dim); line-height: 1.3; }
.tree {
  margin: 0;
  padding: 0;
  list-style: none;
}
.tree li {
  display: grid;
  grid-template-columns: 15ch 1fr;
  gap: 0 1ch;
}
.tree .br { color: var(--dim); white-space: pre; }
.tree .note { color: var(--dim); font-size: 0.9375rem; }

/* contact */
.contact {
  display: grid;
  grid-template-columns: max-content 1fr;
  column-gap: 2ch;
  row-gap: 0.25rem;
  margin: 0;
}
.contact dt { color: var(--dim); }
.contact dd { margin: 0; }

/* 微信号：点一下复制。看着跟隔壁两个链接一样，语义上是按钮。
   类名避开 .copy —— 那是页脚版权的。 */
.copy-id {
  padding: 0;
  border: 0;
  background: none;
  font: inherit;
  color: inherit;
  cursor: pointer;
  text-decoration: underline;
  text-decoration-color: var(--dim);
  text-underline-offset: 0.3em;
}
.copy-id:hover { text-decoration-color: currentColor; }
.copy-id.copied::after {
  content: "已复制";
  display: inline-block;   /* 原子化内联盒，才不会继承按钮那条下划线 */
  margin-left: 0.75ch;     /* 前导空格会被 inline-block 折叠，所以用 margin */
  color: var(--dim);
  font-size: 0.8125rem;
}

/* footer */
footer { padding-block: 2rem 3rem; color: var(--dim); font-size: 0.875rem; }
.banner { display: block; margin: 0 0 1.25rem; }
.banner img { display: block; width: min(100%, 345px); height: auto; }
.copy { margin: 0; }

@media (prefers-reduced-motion: reduce) {
  .cursor { animation: none; }
}

/* ---- inner pages: section lists + articles ---- */
.page { padding-block: clamp(2.5rem, 9vh, 4.5rem) 2rem; }
.page-title {
  margin: 0 0 1.75rem;
  font-size: clamp(1.75rem, 6vw, 2.5rem);
  font-weight: 600;
  line-height: 1.1;
  letter-spacing: -0.02em;
}
.meta { margin: 0 0 2.5rem; color: var(--dim); font-size: 0.875rem; }
.meta .tags::before { content: " · "; }

/* 文章顶部的 md 目录（Hugo 按 h2/h3 生成），折叠 + 吸顶 */
.toc {
  position: sticky;
  top: 3.5rem;   /* 让开顶部吸顶导航栏，别把它盖住 */
  z-index: 1;
  margin: 0 0 2.5rem;
  padding: 0.5rem 0;
  background: var(--bg);
  border-bottom: 1px solid rgba(127, 127, 127, 0.18);
  font-size: 0.9375rem;
}
.toc summary {
  cursor: pointer;
  color: var(--dim);
  font-size: 0.75rem;
  letter-spacing: 0.08em;
}
.toc summary:hover { color: var(--fg); }
/* 展开时别让长目录盖满屏幕 */
.toc[open] { max-height: 70vh; overflow-y: auto; }
.toc ul { margin: 0.75rem 0 0.25rem; padding-left: 1.5ch; list-style: none; }
.toc ul ul { margin-top: 0.25rem; }
.toc li { margin: 0.3rem 0; }
.toc a { color: var(--dim); text-decoration: none; }
.toc a:hover { color: var(--fg); text-decoration: underline; }
/* 锚点跳转后标题别被吸顶目录挡住 */
.prose h2, .prose h3, .prose h4 { scroll-margin-top: 6rem; }

/* article body —— 正文用衬线，界面和 ASCII 装饰仍归等宽 */
.prose { max-width: 38em; font-family: var(--serif); overflow-wrap: anywhere; }
.prose > :first-child { margin-top: 0; }
.prose > :last-child { margin-bottom: 0; }
.prose h2 {
  margin: 2.75rem 0 1rem;
  color: var(--fg);
  font-size: 1.0625rem;
  font-weight: 600;
  letter-spacing: 0;
}
.prose h3 { margin: 2rem 0 0.75rem; font-size: 1rem; font-weight: 600; }
.prose ul, .prose ol { margin: 1rem 0; padding-left: 2ch; }
.prose li { margin: 0.3rem 0; }
.prose blockquote {
  margin: 1.75rem 0;
  padding-left: 1.5ch;
  border-left: 2px solid var(--dim);
  color: var(--dim);
}
.prose pre {
  margin: 1.5rem 0;
  padding: 1rem 1.25rem;
  overflow-x: auto;
  font-family: var(--mono);   /* 正文是衬线，代码块得显式钉回等宽 */
  background: rgba(127, 127, 127, 0.1);
  font-size: 0.875rem;
  line-height: 1.6;
}
.prose code { font-family: var(--mono); font-size: 0.9375em; }
.prose :not(pre) > code {
  padding: 0.1em 0.35em;
  background: rgba(127, 127, 127, 0.14);
}
.prose img { max-width: 100%; height: auto; }
.prose table { border-collapse: collapse; margin: 1.5rem 0; font-size: 0.9375rem; }
.prose th, .prose td {
  padding: 0.35rem 0.75rem;
  border: 1px solid rgba(127, 127, 127, 0.3);
  text-align: left;
}
.prose hr { margin: 2.75rem 0; border: 0; border-top: 1px solid rgba(127, 127, 127, 0.3); }

/* post list */
.posts { margin: 1.75rem 0 0; padding: 0; list-style: none; }
.posts li {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 1.5ch;
  padding-block: 0.6rem;
  border-bottom: 1px solid rgba(127, 127, 127, 0.18);
}
.posts a { text-decoration: none; }
.posts a:hover { text-decoration: underline; }
.posts time { color: var(--dim); font-size: 0.8125rem; white-space: nowrap; }
.posts .empty { justify-content: flex-start; color: var(--dim); }

.back { margin: 3rem 0 0; font-size: 0.9375rem; }
.back a { color: var(--dim); text-decoration: none; }
.back a:hover { color: var(--fg); }

/* landing-page file tree is clickable now */
.tree a { color: inherit; text-decoration: none; }
.tree a:hover { color: var(--fg); }

/* section title line: title left, optional ascii piece right */
.page-head {
  display: flex;
  flex-wrap: wrap;          /* narrow screens: the piece drops below the title */
  align-items: center;
  justify-content: space-between;
  gap: 2ch;
  margin: 0 0 1.75rem;
}
.page-head .page-title { margin: 0; }

/* An <ascii-art> piece in the title line — music/ shows "vinyl".
   The piece draws 64x25 text cells, so font-size scales the whole thing:
   0.5rem ≈ 282x240px. colour: var(--dim) keeps it behind the title. */
.page-art {
  flex: none;
  font-size: 0.5rem;
  color: var(--dim);
}

@media (max-width: 34rem) {
  .page-art { font-size: 0.375rem; }   /* ≈ 212x180px */
}

/* 正文里的音频播放器（audio 短代码）：封面 + 标题 + 一行播放条。
   原生 <audio> 只当引擎，界面全在 HTML 里（static/js/player.js 管行为）。
   正文是衬线，播放器算界面，字体钉回等宽。 */
.prose .player {
  display: grid;
  grid-template-columns: 5rem 1fr;
  gap: 0.9rem;
  align-items: center;
  margin: 1.75rem 0;
  padding: 0.75rem;
  border: 1px solid rgba(127, 127, 127, 0.3);
  font-family: var(--mono);
  font-size: 0.8125rem;
  line-height: 1.5;
}
.prose .player audio { display: none; }   /* 控件自己画 */

.player-cover {
  aspect-ratio: 1;
  overflow: hidden;
  background: rgba(127, 127, 127, 0.12);
}
.player-cover img { display: block; width: 100%; height: 100%; object-fit: cover; }
.player-cover .ph { display: grid; place-items: center; height: 100%; color: var(--dim); font-size: 1.5rem; }

.player-artist { color: var(--dim); font-size: 0.75rem; }
/* 网格项的 min-width 默认是 auto，不给 0 的话窄屏下这一列顶不开，
   进度条不缩，右边的时间就被卡片裁掉。 */
.player-info { min-width: 0; }

.player-bar {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  margin-top: 0.5rem;
}
/* 播放/暂停：一个字符的按钮，跟首页复制微信号那个一样去掉浏览器默认样式。
   定宽，免得 ▶ 和 ❚❚ 宽度不同把进度条挤来挤去。 */
.player .play {
  flex: none;
  width: 1.6em;
  padding: 0;
  border: 0;
  background: none;
  font: inherit;
  color: inherit;
  text-align: center;
  cursor: pointer;
}
.player .play:hover { color: var(--dim); }
.player .seek { flex: 1; min-width: 0; height: 1rem; margin: 0; accent-color: var(--fg); }
.player .time {
  flex: none;
  color: var(--dim);
  font-size: 0.75rem;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

/* 专辑播放器：曲目列表接在单曲那张卡下面，横跨封面和文字两栏 */
.prose .player .tracks {
  grid-column: 1 / -1;
  margin: 0.2rem 0 0;
  padding: 0;
  list-style: none;
  border-top: 1px solid rgba(127, 127, 127, 0.18);
}
.prose .player .tracks li { margin: 0; }   /* 挡住 .prose li 那条外边距 */
.prose .player .track {
  display: flex;
  gap: 0.75ch;
  width: 100%;
  padding: 0.3rem 0.4rem;
  border: 0;
  background: none;
  font: inherit;
  color: var(--dim);
  text-align: left;
  cursor: pointer;
}
.prose .player .track:hover { color: var(--fg); background: rgba(127, 127, 127, 0.1); }
.prose .player .track .n { flex: none; font-size: 0.75rem; }
/* 正在放的那首：换成正文色，左边加一道竖线（inset 阴影不占位置，列表不跳） */
.prose .player .track.on { color: var(--fg); box-shadow: inset 2px 0 0 var(--fg); }
.prose .player .track .d { flex: none; color: var(--dim); font-size: 0.75rem; font-variant-numeric: tabular-nums; }
.prose .player .track .t {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

/* 专辑文件夹不存在时留的话（构建机器上没有那些没进仓库的 mp3 时会出现） */
.prose .player-missing { color: var(--dim); font-family: var(--mono); font-size: 0.8125rem; }

/* 窄屏（手机）：缩封面、缩内边距、缩时间字号，把宽度让给进度条——
   不缩的话 320px 下进度条只剩三十几像素，没法拖。 */
@media (max-width: 30rem) {
  .prose .player { grid-template-columns: 4rem 1fr; gap: 0.75rem; padding: 0.6rem; }
  .player .time { font-size: 0.6875rem; }
}

/* giscus comments — article pages + homepage */
.comments {
  margin-top: 2.5rem;
  padding-top: 2rem;
  border-top: 1px solid rgba(127, 127, 127, 0.18);
}
/* 首页评论紧跟在 .rule 后面，那条 ascii 横线已经分隔了，别叠第二条细线 */
.rule + .comments { border-top: 0; padding-top: 0; }
