/* Thomas-AI.space — marcyy.me 式博客布局 · 动漫风（奶油纸 + 樱花粉 + 天空蓝 / 夜空藏青）
   英文卡通字 Fredoka + 中文卡通字 ZCOOL 快乐体；动画只用 transform/opacity，尊重减少动态效果设置 */
@font-face{font-family:Fredoka;src:url('/vendor/fredoka-latin.woff2?v=1') format('woff2');font-weight:300 700;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
:root{--bg:#fbf6ee;--fg:#2b2733;--muted:#6a6374;--faint:#a39cab;--line:#eadfd3;--soft:#f4ebdf;--card:#fffdf9;--accent:#e0577e;--accent2:#3f8fd8;--sun:#f5b544;--dot:rgba(224,87,126,.08);--shadow:0 10px 28px -14px rgba(120,70,60,.35);--ease:cubic-bezier(.22,1,.36,1);--bounce:cubic-bezier(.34,1.56,.64,1);color-scheme:light}
:root[data-theme="dark"]{--bg:#141726;--fg:#eeebf7;--muted:#aeaac2;--faint:#716e89;--line:#282c43;--soft:#1c2034;--card:#191d30;--accent:#ff8fb1;--accent2:#7cc4ff;--sun:#ffd27a;--dot:rgba(124,196,255,.07);--shadow:0 12px 30px -14px rgba(0,0,0,.7);color-scheme:dark}
*{box-sizing:border-box}
[hidden]{display:none!important}
html{background:var(--bg);color:var(--fg);font-family:Fredoka,Kuaile,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",system-ui,sans-serif;font-size:17px;line-height:1.75;font-synthesis-weight:none;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;scroll-behavior:smooth}
body{margin:0;min-height:100vh;background-image:radial-gradient(var(--dot) 1.3px,transparent 1.4px);background-size:24px 24px}
a{color:inherit;text-decoration:none}
h1,h2,h3,h4{font-weight:600;letter-spacing:.005em}
b,strong{font-weight:600}
code,pre,kbd{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
::selection{background:var(--accent);color:#fff}
svg{display:block}
img{max-width:100%}
.wrap{width:100%;max-width:900px;margin:0 auto;padding:0 24px}
.skip{position:absolute;left:-999px}.skip:focus{left:12px;top:12px;z-index:99;padding:6px 10px;background:var(--bg)}
button{font-family:inherit}

/* ── 入场与滚动揭示（类由 JS 添加；3 秒兜底全部显示） ── */
.anim [data-rv]{opacity:0;transform:translateY(18px)}
.anim [data-rv].in{opacity:1;transform:none;transition:opacity .7s var(--ease),transform .7s var(--ease);transition-delay:var(--d,0ms)}
.anim [data-rv="pop"]{transform:scale(.8) rotate(-4deg)}
.anim [data-rv="pop"].in{transform:none;transition:opacity .6s var(--ease),transform .8s var(--bounce);transition-delay:var(--d,0ms)}
.rv-done [data-rv]{opacity:1!important;transform:none!important}
@keyframes twinkle{0%,100%{transform:scale(1) rotate(0);opacity:1}50%{transform:scale(.6) rotate(45deg);opacity:.55}}
@keyframes bob{0%,100%{transform:translateY(0)}50%{transform:translateY(-6px)}}
@keyframes spin{to{transform:rotate(360deg)}}
@keyframes blink{50%{opacity:0}}
@keyframes panelIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}
@keyframes wiggle{0%,100%{transform:rotate(0)}25%{transform:rotate(-12deg)}75%{transform:rotate(12deg)}}
@keyframes langFade{0%{opacity:1}40%{opacity:.25}100%{opacity:1}}
.lang-anim main{animation:langFade .45s var(--ease)}
::view-transition-old(root),::view-transition-new(root){animation:none;mix-blend-mode:normal}

/* ── 顶栏 ── */
.top{position:sticky;top:0;z-index:30;background:var(--bg);transition:box-shadow .3s}
.top.scrolled{box-shadow:0 8px 24px -18px rgba(0,0,0,.45)}
.top .wrap{display:flex;align-items:center;justify-content:space-between;gap:16px;height:84px;border-bottom:1px solid var(--line)}
.brand{display:inline-block;font-size:27px;font-weight:600;white-space:nowrap}
.brand span{color:var(--accent)}
.brand .brand-name{color:var(--fg)}
.brand .brand-sub{margin-left:8px;color:var(--faint);font-size:13px;font-weight:500}
@media (max-width:680px){.brand .brand-sub{display:none}}
.brand i{margin-left:6px;font-style:normal;color:var(--sun);display:inline-block;animation:twinkle 3.2s ease-in-out infinite}
.nav{display:flex;align-items:center;gap:4px;font-size:17px}
.nav-text{position:relative;padding:6px 11px;border-radius:10px;font-weight:500}
.nav-text::after{content:"";position:absolute;left:11px;right:11px;bottom:3px;height:2px;border-radius:2px;background:var(--accent);transform:scaleX(0);transform-origin:left;transition:transform .35s var(--ease)}
.nav-text:hover,.nav-text[aria-current="page"]{color:var(--accent)}
.nav-text:hover::after,.nav-text[aria-current="page"]::after{transform:scaleX(1)}
.icon-btn{display:inline-grid;place-items:center;width:42px;height:42px;padding:0;border:0;border-radius:12px;background:transparent;color:var(--fg);cursor:pointer;transition:background .2s,color .2s,transform .25s var(--bounce)}
.icon-btn:hover{background:var(--soft);color:var(--accent);transform:translateY(-2px)}
.icon-btn:active{transform:scale(.88)}
.icon-btn svg{width:23px;height:23px}
#themeToggle svg{transition:transform .5s var(--bounce)}
#themeToggle:hover svg{transform:rotate(-25deg)}
.lang-btn{height:36px;min-width:44px;padding:0 10px;border:1.5px solid var(--line);border-radius:999px;background:var(--card);color:var(--fg);font-size:14px;font-weight:600;cursor:pointer;transition:border-color .2s,color .2s,transform .25s var(--bounce)}
.lang-btn:hover{border-color:var(--accent);color:var(--accent);transform:translateY(-2px)}

/* ── 公告 ── */
.notice{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;margin:20px 0 0;padding:14px 16px;border:1.5px dashed var(--accent);border-radius:16px;background:var(--card);font-size:15px}
.notice strong{display:block;color:var(--accent)}
.notice p{margin:2px 0 0;color:var(--muted);white-space:pre-line}
.notice .icon-btn{width:30px;height:30px;font-size:20px}

/* ── 简介 ── */
.intro{display:flex;gap:28px;align-items:flex-start;padding:34px 0 30px}
.avatar-wrap{position:relative;flex:none;width:188px;height:188px}
.avatar-wrap::before{content:"";position:absolute;inset:-9px;border:2px dashed var(--accent);border-radius:30px;opacity:.55;animation:spin 26s linear infinite}
.avatar{position:relative;width:100%;height:100%;border-radius:24px;object-fit:cover;background:var(--soft);border:3px solid var(--card);box-shadow:var(--shadow);animation:bob 5.5s ease-in-out infinite}
.avatar-wrap .badge-emoji{position:absolute;right:-12px;bottom:-8px;display:grid;place-items:center;width:46px;height:46px;border-radius:50%;background:var(--card);box-shadow:var(--shadow);font-size:24px;animation:wiggle 2.8s ease-in-out infinite;transform-origin:50% 90%}
.intro-body{flex:1;min-width:0}
.intro h1{display:flex;align-items:center;gap:12px;margin:4px 0 2px;font-size:40px;line-height:1.15}
.intro h1 .spark{color:var(--sun);font-size:26px;display:inline-block;animation:twinkle 2.6s ease-in-out infinite}
.typer{margin:0 0 12px;font-size:20px;color:var(--muted)}
.typer b{color:var(--accent);font-weight:600}
.typer .caret{display:inline-block;width:2px;height:1.05em;margin-left:2px;vertical-align:-3px;background:var(--accent);animation:blink 1s steps(1) infinite}
.bio{position:relative;max-height:136px;overflow:hidden;color:var(--muted);font-size:17px;transition:max-height .6s var(--ease)}
.bio p{margin:0 0 10px}
.bio::after{content:"";position:absolute;left:0;right:0;bottom:0;height:64px;background:linear-gradient(transparent,var(--bg));transition:opacity .4s}
.bio.open{max-height:900px}.bio.open::after{opacity:0}
.more{display:inline-flex;align-items:center;gap:4px;margin:4px 0 0;padding:0;border:0;background:none;color:var(--accent);font-size:15.5px;font-weight:600;cursor:pointer}
.more:hover{text-decoration:underline;text-underline-offset:4px}
.hashtags{color:var(--accent2)!important}
.socials{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px}
.socials a{display:inline-grid;place-items:center;width:42px;height:42px;border-radius:12px;background:var(--card);border:1px solid var(--line);color:var(--fg);transition:transform .3s var(--bounce),color .2s,border-color .2s}
.socials a:hover{transform:translateY(-4px) rotate(-6deg);color:var(--accent);border-color:var(--accent)}
.socials svg{width:22px;height:22px}

/* ── 数据与「最近在做」 ── */
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin:4px 0 0}
.stat{padding:16px 18px;border:1px solid var(--line);border-radius:18px;background:var(--card);transition:transform .35s var(--bounce),box-shadow .3s}
.stat:hover{transform:translateY(-4px);box-shadow:var(--shadow)}
.stat b{display:block;font-size:32px;line-height:1.1;color:var(--accent)}
.stat:nth-child(2) b{color:var(--accent2)}
.stat:nth-child(3) b{color:var(--sun)}
.stat span{color:var(--muted);font-size:14.5px}
.now{display:flex;gap:18px;align-items:flex-start;margin:18px 0 0;padding:18px 20px;border:1.5px dashed var(--line);border-radius:20px}
.now h2{flex:none;display:flex;align-items:center;gap:8px;margin:2px 0 0;font-size:18px;color:var(--accent)}
.now h2 .dot{width:10px;height:10px;border-radius:50%;background:#43c47a;box-shadow:0 0 0 0 rgba(67,196,122,.6);animation:pulse 2s infinite}
@keyframes pulse{70%{box-shadow:0 0 0 10px rgba(67,196,122,0)}100%{box-shadow:0 0 0 0 rgba(67,196,122,0)}}
.now ul{display:grid;gap:6px;margin:0;padding:0;list-style:none;font-size:16px}
.now li{display:flex;gap:10px}

/* ── 标签页 ── */
.tabs{position:relative;display:flex;gap:28px;margin:40px 0 0;border-bottom:1px solid var(--line)}
.tab{padding:4px 0 10px;border:0;background:none;color:var(--faint);font-size:25px;font-weight:600;cursor:pointer;transition:color .25s}
.tab:hover{color:var(--muted)}
.tab[aria-selected="true"]{color:var(--fg)}
.tab-ink{position:absolute;left:0;bottom:-1px;width:0;height:3.5px;border-radius:4px;background:linear-gradient(90deg,var(--accent),var(--accent2));transition:transform .5s var(--bounce),width .5s var(--bounce)}
.panel{padding-top:10px}
.panel[hidden]{display:none}
.panel.show{animation:panelIn .5s var(--ease)}

/* ── 文章卡片 ── */
.cards{margin:0;padding:0;list-style:none}
.card-item{display:grid;grid-template-columns:250px 1fr;gap:22px;padding:18px 0;border-bottom:1px dashed var(--line)}
.card-item:last-child{border-bottom:0}
.card-item .thumb{position:relative;display:block;width:250px;height:156px;border-radius:16px;overflow:hidden;border:1px solid var(--line);background:var(--soft);transition:transform .4s var(--bounce),box-shadow .35s}
.card-item .thumb img{width:100%;height:100%;object-fit:cover;transition:transform .7s var(--ease)}
.card-item:hover .thumb{transform:translateY(-4px) rotate(-1deg);box-shadow:var(--shadow)}
.card-item:hover .thumb img{transform:scale(1.07)}
.card-item h3{margin:2px 0 0;font-size:23px;line-height:1.4}
.card-item h3 a{color:var(--accent);background:linear-gradient(currentColor,currentColor) 0 100%/0 2px no-repeat;transition:background-size .45s var(--ease)}
.card-item h3 a:hover{background-size:100% 2px}
.date{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:6px 0;color:var(--muted);font-size:15px}
.date svg{width:18px;height:18px}
.pin{padding:1px 9px;border-radius:999px;background:var(--accent);color:#fff;font-size:12.5px;font-weight:600}
.cat{padding:1px 9px;border-radius:999px;border:1px solid var(--line);color:var(--accent2);font-size:12.5px}
.excerpt{margin:0;color:var(--fg);font-size:16.5px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.all-link{display:flex;justify-content:center;padding:26px 0 6px}
.all-link a{display:inline-flex;align-items:center;gap:8px;padding:10px 22px;border:1.5px solid var(--line);border-radius:999px;background:var(--card);font-size:17px;font-weight:600;transition:transform .3s var(--bounce),border-color .2s,color .2s}
.all-link a:hover{transform:translateY(-3px);border-color:var(--accent);color:var(--accent)}
.all-link a svg{width:19px;height:19px;transition:transform .3s var(--bounce)}
.all-link a:hover svg{transform:translateX(4px)}
.sub{display:flex;align-items:center;gap:8px;margin:24px 0 4px;font-size:18px;color:var(--muted)}
.sub::before{content:"✦";color:var(--accent)}

/* ── 项目 ── */
.projects{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin:14px 0 0;padding:0;list-style:none}
.project{display:block;overflow:hidden;border:1px solid var(--line);border-radius:20px;background:var(--card);transition:transform .4s var(--bounce),box-shadow .35s}
.project:hover{transform:translateY(-6px);box-shadow:var(--shadow)}
.project .pic{aspect-ratio:16/9;overflow:hidden;background:var(--soft)}
.project .pic img{width:100%;height:100%;object-fit:cover;transition:transform .7s var(--ease)}
.project:hover .pic img{transform:scale(1.06)}
.project .txt{padding:14px 18px 18px}
.project h3{margin:0;font-size:20px;color:var(--accent)}
.project p{margin:4px 0 10px;color:var(--muted);font-size:15.5px}
.tagline{display:flex;flex-wrap:wrap;gap:6px}
.tagline span{padding:1px 9px;border-radius:999px;background:var(--soft);color:var(--accent2);font-size:12.5px}

/* ── 话题 ── */
.topics{margin:38px 0 0}
.topics h2{display:flex;align-items:center;gap:8px;margin:0 0 12px;font-size:20px}
.archive-links{margin:8px 0 0}.archive-links a{color:var(--accent);font-weight:500}.archive-links a:hover{text-decoration:underline;text-underline-offset:4px}
.topics h2::before{content:"#";color:var(--accent2)}
.chips-row{display:flex;flex-wrap:wrap;gap:10px}
.chips-row a{padding:5px 14px;border:1px solid var(--line);border-radius:999px;background:var(--card);font-size:15px;transition:transform .3s var(--bounce),border-color .2s,color .2s}
.chips-row a small{margin-left:4px;color:var(--faint)}
.chips-row a:hover{transform:translateY(-3px) rotate(-2deg);border-color:var(--accent);color:var(--accent)}

/* ── 列表 / 空状态 ── */
.rows{margin:0;padding:0;list-style:none}
.row{display:flex;align-items:baseline;gap:14px;padding:11px 6px;border-bottom:1px dashed var(--line);border-radius:10px;font-size:17px;transition:background .2s,padding .3s var(--ease)}
.row:hover{background:var(--soft);padding-left:12px}
.row time{flex:none;width:98px;color:var(--faint);font-size:14px}
.row .t{flex:1;min-width:0}
.row:hover .t{color:var(--accent)}
.badge{flex:none;padding:0 9px;border:1px solid var(--accent2);border-radius:8px;color:var(--accent2);font-size:12.5px}
.empty{display:flex;align-items:center;gap:12px;margin:14px 0;padding:18px 20px;border:1.5px dashed var(--line);border-radius:16px;color:var(--faint);font-size:16px}
.empty b{color:var(--accent);font-size:20px;white-space:nowrap}
.muted{margin:12px 0;color:var(--faint);font-size:15.5px}
.link-btn{padding:0;border:0;background:none;color:var(--accent);font:inherit;text-decoration:underline;cursor:pointer}
.skeleton{height:156px;margin:18px 0;border-radius:16px;background:linear-gradient(100deg,var(--soft) 30%,var(--card) 50%,var(--soft) 70%) 0 0/300% 100%;animation:shine 1.3s linear infinite}
@keyframes shine{to{background-position:-150% 0}}

/* ── 页脚 ── */
.foot{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;margin-top:50px;padding:26px 24px 44px;border-top:1px solid var(--line);color:var(--muted);font-size:15.5px}
.foot a:hover{color:var(--accent)}

/* ── 归档页 ── */
.page-head{padding:36px 0 10px}
.page-head h1{margin:0;font-size:38px}
.page-head p{margin:4px 0 0;color:var(--muted);font-size:17px}
.search{width:100%;height:50px;margin:16px 0 4px;padding:0 18px;border:1.5px solid var(--line);border-radius:16px;background:var(--card);color:var(--fg);font:inherit;font-size:17px;outline:none;transition:border-color .2s,box-shadow .2s}
.search:focus{border-color:var(--accent);box-shadow:0 0 0 4px color-mix(in srgb,var(--accent) 18%,transparent)}
.year{display:flex;align-items:baseline;gap:10px;margin:30px 0 6px;font-size:26px}
.year small{color:var(--faint);font-size:14px;font-weight:400}

/* ── 文章页 ── */
.back{display:inline-flex;align-items:center;gap:6px;margin:30px 0 0;font-size:16px;color:var(--muted);transition:color .2s,transform .3s var(--bounce)}
.back:hover{color:var(--accent);transform:translateX(-4px)}
.article-head{padding:16px 0 8px}
.meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px;color:var(--muted);font-size:15px}
.meta svg{width:18px;height:18px}
.article-head h1{margin:10px 0 0;font-size:40px;line-height:1.28}
.cover{display:block;width:100%;max-height:420px;margin:22px 0 0;object-fit:cover;border:1px solid var(--line);border-radius:20px;box-shadow:var(--shadow)}
.prose{padding:12px 0 22px;font-size:18px;line-height:1.95;overflow-wrap:anywhere}
.prose h1,.prose h2,.prose h3{margin:1.8em 0 .6em;line-height:1.35}
.prose h1{font-size:28px}.prose h2{font-size:25px}.prose h3{font-size:21px}
.prose h2::before{content:"✦ ";color:var(--accent)}
.prose p{margin:0 0 1.1em}
.prose a{color:var(--accent2);text-decoration:underline;text-underline-offset:3px}
.prose strong{color:var(--accent)}
.prose blockquote{margin:1.2em 0;padding:.6em 1.1em;border-left:4px solid var(--accent);border-radius:0 14px 14px 0;background:var(--soft);color:var(--muted)}
.prose code{padding:.12em .38em;border-radius:6px;background:var(--soft);font-size:.86em}
.prose pre{overflow:auto;padding:16px 18px;border:1px solid var(--line);border-radius:14px;background:var(--soft);font-size:14px;line-height:1.6}
.prose pre code{padding:0;background:none}
.prose img{height:auto;border:1px solid var(--line);border-radius:14px}
.prose iframe{width:100%;aspect-ratio:16/9;border:0;border-radius:14px}
.prose video{display:block;width:100%;max-height:520px;border-radius:14px;background:#000;border:1px solid var(--line)}
.prose audio{display:block;width:100%;margin:6px 0}
.prose ul,.prose ol{padding-left:1.4em}
.prose hr{margin:2em 0;border:0;border-top:1.5px dashed var(--line)}
.chips{display:flex;flex-wrap:wrap;gap:8px;padding:6px 0 26px}
.chips span{padding:3px 12px;border:1px solid var(--line);border-radius:999px;background:var(--card);color:var(--accent2);font-size:14px}
.comments{padding:26px 0;border-top:1px solid var(--line)}
.comments h2{margin:0 0 12px;font-size:24px}
.comments h2 small{margin-left:6px;color:var(--faint);font-size:15px}
.c-item{padding:14px 0;border-bottom:1px dashed var(--line)}
.c-item b{color:var(--accent);font-size:16px}
.c-item time{margin-left:8px;color:var(--faint);font-size:13.5px}
.c-item p{margin:4px 0 0;font-size:16.5px;white-space:pre-wrap;overflow-wrap:anywhere}
.c-form{display:grid;gap:12px;margin-top:18px}
.c-form input,.c-form textarea{width:100%;padding:12px 14px;border:1.5px solid var(--line);border-radius:14px;background:var(--card);color:var(--fg);font:inherit;font-size:16px;outline:none;transition:border-color .2s}
.c-form textarea{min-height:120px;resize:vertical}
.c-form input:focus,.c-form textarea:focus{border-color:var(--accent)}
.btn{justify-self:start;height:44px;padding:0 22px;border:0;border-radius:14px;background:var(--accent);color:#fff;font-size:16px;font-weight:600;cursor:pointer;box-shadow:4px 4px 0 var(--soft);transition:transform .25s var(--bounce)}
.btn:hover{transform:translateY(-2px)}
.btn:active{transform:scale(.95)}
.btn:disabled{opacity:.5;cursor:default}
.c-msg{margin:0;color:var(--muted);font-size:14.5px}

/* ── 关于页：01–05 章节 ── */
.sec{padding:30px 0 10px;border-top:1px solid var(--line)}
.sec h2{margin:0 0 10px;font-size:24px}
.links a{color:var(--accent)}.links a:hover{text-decoration:underline}
.about-hero{display:flex;gap:28px;align-items:center;padding:36px 0 28px}
.about-hero img{flex:none;width:160px;height:160px;border-radius:24px;object-fit:cover;border:3px solid var(--card);box-shadow:var(--shadow);animation:bob 5.5s ease-in-out infinite}
.about-hero h1{margin:0;font-size:40px;line-height:1.2}
.about-hero p{margin:6px 0 0;color:var(--muted);font-size:18px}
.toc{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px;font-size:15px}
.toc a{padding:4px 12px;border:1px solid var(--line);border-radius:999px;background:var(--card);color:var(--accent2);transition:transform .3s var(--bounce),border-color .2s}
.toc a:hover{transform:translateY(-3px);border-color:var(--accent2)}
.chapter{scroll-margin-top:100px;padding-top:34px}
.chapter-head{display:flex;align-items:center;gap:16px;margin-bottom:12px}
.chapter-num{min-width:68px;color:var(--accent);font-size:50px;font-weight:600;line-height:1}
.eyebrow{margin:0;color:var(--faint);font-size:12.5px;letter-spacing:.16em}
.chapter .chapter-head h2{margin:2px 0 0;font-size:28px}
.quote{margin:8px 0 6px;padding:12px 16px;border-left:4px solid var(--accent);border-radius:0 14px 14px 0;background:var(--soft);color:var(--muted);font-size:17px}
.about-text p{margin:.7em 0;font-size:17.5px}
.lead{margin:4px 0 14px;color:var(--muted);font-size:18px}
.facts{display:flex;flex-wrap:wrap;gap:8px 18px;margin:12px 0;color:var(--accent2);font-size:14px}
.figure{margin:16px 0 6px}
.figure img{display:block;width:100%;height:auto;max-height:460px;object-fit:cover;border:1px solid var(--line);border-radius:20px;background:var(--soft)}
.figure figcaption{margin-top:8px;color:var(--faint);font-size:13px;letter-spacing:.12em}
.timeline{margin:6px 0 0;padding:0;list-style:none}
.timeline li{display:grid;grid-template-columns:120px 1fr;gap:16px;padding:12px 0;border-bottom:1px dashed var(--line)}
.timeline b{padding-top:2px;color:var(--accent2);font-size:15px}
.timeline strong{display:block;font-size:18px}
.timeline p{margin:2px 0 0;color:var(--muted);font-size:16px}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:10px}
.card{padding:16px 18px;border:1px solid var(--line);border-radius:18px;background:var(--card);transition:transform .35s var(--bounce),box-shadow .3s}
.card:hover{transform:translateY(-4px);box-shadow:var(--shadow)}
.card strong{display:block;color:var(--accent);font-size:18px}
.card p{margin:4px 0 0;color:var(--muted);font-size:15.5px}
.photos{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:12px}
.photos img{width:100%;aspect-ratio:4/3;object-fit:cover;border:1px solid var(--line);border-radius:14px;background:var(--soft);transition:transform .4s var(--bounce)}
.photos img:hover{transform:scale(1.04) rotate(-1deg)}

/* ══════════ 文章详情页（动漫风） ══════════ */
/* 跨页过渡：首页卡片封面/标题 → 文章横幅/大标题；其余页面之间柔和淡入 */
@media (prefers-reduced-motion:no-preference){
  @view-transition{navigation:auto;types:page-nav}
  html:active-view-transition-type(page-nav)::view-transition-old(root){animation:vtOut .32s var(--ease) both}
  html:active-view-transition-type(page-nav)::view-transition-new(root){animation:vtIn .52s var(--ease) both}
  ::view-transition-group(post-cover),::view-transition-group(post-title){animation-duration:.6s;animation-timing-function:var(--ease)}
  ::view-transition-old(post-cover),::view-transition-new(post-cover){width:100%;height:100%;object-fit:cover}
}
@keyframes vtOut{to{opacity:0;transform:translateY(-16px) scale(.985)}}
@keyframes vtIn{from{opacity:0;transform:translateY(22px)}}
@keyframes heroZoom{from{opacity:0;transform:scale(1.14)}to{opacity:1;transform:none}}
@keyframes heroUp{from{opacity:0;transform:translateY(30px)}to{opacity:1;transform:none}}
@keyframes menuIn{from{opacity:0;transform:translate(-50%,10px) scale(.9)}to{opacity:1;transform:translateX(-50%)}}
@keyframes heartPop{0%{transform:scale(1)}30%{transform:scale(.7)}60%{transform:scale(1.4)}100%{transform:scale(1)}}
@keyframes burst{0%{opacity:1;transform:translate(-50%,-50%) rotate(var(--a)) translateY(0) scale(.4)}100%{opacity:0;transform:translate(-50%,-50%) rotate(var(--a)) translateY(-50px) scale(1.15)}}
@keyframes ringOut{from{transform:scale(.2);opacity:1}to{transform:scale(1.7);opacity:0}}
@keyframes fabIn{from{opacity:0;transform:translateY(16px) scale(.8)}to{opacity:1;transform:none}}

.post-page .wrap{max-width:860px}
.post-page .nav-text[href="/code"],.post-page .nav-text[href="/#research"]{display:none}
.lang-btn{flex:none;white-space:nowrap}
.read-progress{position:fixed;top:0;left:0;right:0;z-index:60;height:4px;pointer-events:none}
.read-progress span{display:block;height:100%;border-radius:0 4px 4px 0;background:linear-gradient(90deg,var(--accent),var(--sun),var(--accent2));box-shadow:0 0 12px color-mix(in srgb,var(--accent) 55%,transparent);transform:scaleX(0);transform-origin:0 50%;will-change:transform}

.post-hero{margin:16px 0 0}
.hero-cover{position:relative;overflow:hidden;aspect-ratio:21/9;border:1px solid var(--line);border-radius:26px;background:var(--soft);box-shadow:var(--shadow)}
.hero-cover img{display:block;width:100%;height:100%;object-fit:cover;view-transition-name:post-cover}
.hero-cover::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,transparent 50%,rgba(24,18,36,.32))}
.hero-text{position:relative;margin:-58px 22px 0;padding:22px 28px 20px;border:1px solid var(--line);border-radius:24px;background:var(--card);box-shadow:var(--shadow)}
.post-hero.no-cover .hero-cover{display:none}.post-hero.no-cover .hero-text{margin:0}
.meta .m{display:inline-flex;align-items:center;gap:5px}
.post-title{margin:10px 0 6px;font-size:40px;line-height:1.25;view-transition-name:post-title}
.title-skeleton{display:block;width:72%;height:42px;border-radius:12px;background:linear-gradient(100deg,var(--soft) 30%,var(--card) 50%,var(--soft) 70%) 0 0/300% 100%;animation:shine 1.3s linear infinite}
.post-excerpt{margin:0 0 14px;color:var(--muted);font-size:17.5px}
.lang-notice{margin:0 0 22px;padding:9px 14px;border-radius:10px;font-size:13.5px;color:var(--muted);
  border:1px dashed color-mix(in srgb,var(--muted) 45%,transparent);
  background:color-mix(in srgb,var(--muted) 7%,transparent)}
.author-mini{display:flex;align-items:center;gap:10px;padding-top:14px;border-top:1.5px dashed var(--line)}
.author-mini img{width:40px;height:40px;border-radius:12px}
.author-mini b{display:block;font-size:15.5px;line-height:1.2}
.author-mini span{color:var(--faint);font-size:13.5px}
.anim .hero-cover img{animation:heroZoom 1.1s var(--ease) both}
.anim .hero-text{animation:heroUp .8s .12s var(--ease) both}
.anim .author-mini{animation:heroUp .7s .32s var(--ease) both}
.anim.from-list .hero-cover img,.anim.from-list .hero-text{animation:none}

/* 目录 */
.toc-inline{margin:24px 0 0;overflow:hidden;border:1px solid var(--line);border-radius:18px;background:var(--card)}
.toc-inline summary{display:flex;align-items:center;gap:8px;padding:13px 18px;font-weight:600;list-style:none;cursor:pointer}
.toc-inline summary::-webkit-details-marker{display:none}
.toc-inline summary::after{content:"▾";margin-left:auto;color:var(--accent);transition:transform .3s var(--bounce)}
.toc-inline[open] summary::after{transform:rotate(180deg)}
.toc-inline .toc-nav{padding:0 10px 14px}
.toc-inline[open] .toc-nav{animation:panelIn .35s var(--ease)}
.toc-side{position:fixed;top:120px;left:calc(50% + 458px);z-index:20;width:214px;max-height:calc(100vh - 170px);overflow:auto;padding:16px 14px 16px 16px;border:1px solid var(--line);border-radius:20px;background:var(--card);box-shadow:var(--shadow);animation:heroUp .7s .45s var(--ease) both}
.toc-title{margin:0 0 8px;color:var(--faint);font-size:13.5px;letter-spacing:.08em}
.toc-title span:first-child{color:var(--sun)}
.toc-nav{position:relative;display:grid;gap:2px}
.toc-nav a{position:relative;display:block;padding:5px 10px 5px 14px;border-radius:9px;color:var(--muted);font-size:14.5px;line-height:1.45;transition:color .2s,background .2s,transform .3s var(--bounce)}
.toc-nav a.lv3{padding-left:26px;font-size:13.5px}
.toc-nav a:hover{color:var(--fg);background:var(--soft);transform:translateX(3px)}
.toc-nav a.active{color:var(--accent);font-weight:600}
.toc-marker{position:absolute;left:0;top:0;width:3.5px;height:26px;border-radius:4px;background:linear-gradient(var(--accent),var(--accent2));transition:transform .45s var(--bounce),height .3s var(--ease)}
.toc-inline .toc-nav a.active::before{content:"✦";position:absolute;left:0;color:var(--accent);font-size:11px;top:8px}
.prose h1,.prose h2,.prose h3{scroll-margin-top:100px}
@media (max-width:1339px){.toc-side{display:none!important}}
@media (min-width:1340px){.toc-inline{display:none!important}}

/* 正文细节 */
.prose pre{position:relative}
.copy-code{position:absolute;top:8px;right:8px;padding:3px 10px;border:1px solid var(--line);border-radius:8px;background:var(--card);color:var(--muted);font-family:inherit;font-size:12.5px;cursor:pointer;opacity:0;transition:opacity .2s,color .2s}
.copy-code:hover{color:var(--accent)}
.prose pre:hover .copy-code,.copy-code:focus{opacity:1}
@media (hover:none){.copy-code{opacity:1}}
.chips a{padding:3px 12px;border:1px solid var(--line);border-radius:999px;background:var(--card);color:var(--accent2);font-size:14px;transition:transform .3s var(--bounce),border-color .2s}
.chips a:hover{transform:translateY(-3px);border-color:var(--accent2)}

/* 点赞与分享 */
.reactions{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:14px;margin:6px 0 28px;padding:24px;border:1.5px dashed var(--line);border-radius:24px}
.like-btn,.share-btn{position:relative;display:inline-flex;align-items:center;gap:10px;height:54px;padding:0 24px;border:1.5px solid var(--line);border-radius:999px;background:var(--card);color:var(--fg);font-size:17px;font-weight:600;cursor:pointer;transition:transform .3s var(--bounce),border-color .2s,background .25s,color .25s,box-shadow .3s}
.like-btn:hover,.share-btn:hover{transform:translateY(-3px);border-color:var(--accent);box-shadow:var(--shadow)}
.like-btn:active,.share-btn:active{transform:scale(.94)}
.like-btn .heart{position:relative;display:grid;place-items:center;width:26px;height:26px}
.like-btn .heart svg{width:26px;height:26px;fill:transparent;stroke:var(--accent);stroke-width:1.9;stroke-linejoin:round;transition:fill .25s,stroke .25s}
.like-btn.liked{border-color:var(--accent);background:var(--accent);color:#fff}
.like-btn.liked .heart svg{fill:#fff;stroke:#fff}
.like-btn.pop .heart svg{animation:heartPop .6s var(--bounce)}
.like-count{font-size:16px}
.like-count:empty{display:none}
.like-count::before{content:"· ";opacity:.6}
.burst{position:absolute;left:50%;top:50%;width:0;height:0;pointer-events:none}
.burst::before{content:"";position:absolute;left:-24px;top:-24px;width:48px;height:48px;border:2px solid var(--accent);border-radius:50%;animation:ringOut .6s var(--ease) forwards}
.burst i{position:absolute;left:0;top:0;color:var(--c);font-size:13px;font-style:normal;animation:burst .85s var(--ease) forwards}
.share-btn svg{width:22px;height:22px}
.share-wrap{position:relative}
.share-menu{position:absolute;bottom:calc(100% + 12px);left:50%;z-index:45;display:grid;grid-template-columns:1fr 1fr;gap:4px;width:290px;padding:8px;border:1px solid var(--line);border-radius:18px;background:var(--card);box-shadow:var(--shadow);transform:translateX(-50%)}
.share-menu.show{animation:menuIn .38s var(--bounce)}
.share-menu button{display:flex;align-items:center;gap:9px;padding:10px 12px;border:0;border-radius:12px;background:none;color:var(--fg);font-size:15px;text-align:left;cursor:pointer;transition:background .2s,color .2s,transform .25s var(--bounce)}
.share-menu button:hover{background:var(--soft);color:var(--accent);transform:translateX(2px)}

/* 作者卡片 */
.author-card{display:flex;align-items:center;gap:20px;margin:0 0 28px;padding:22px 24px;border:1px solid var(--line);border-radius:24px;background:linear-gradient(135deg,color-mix(in srgb,var(--accent) 12%,var(--card)),color-mix(in srgb,var(--accent2) 12%,var(--card)))}
.author-card img{flex:none;border-radius:20px;box-shadow:var(--shadow);animation:bob 5.5s ease-in-out infinite}
.author-card h2{margin:0;font-size:24px}
.author-card h2 span{color:var(--sun)}
.author-card p{margin:4px 0 8px;color:var(--muted);font-size:15.5px}
.author-card p.eyebrow{margin:0;color:var(--faint);font-size:12px}
.author-card a{color:var(--accent);font-weight:600}
.author-card a:hover{text-decoration:underline;text-underline-offset:4px}

/* 上一篇 / 下一篇 */
.post-nav{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin:0 0 34px}
.nav-card{position:relative;isolation:isolate;display:flex;flex-direction:column;justify-content:flex-end;min-height:168px;padding:16px 20px;overflow:hidden;border:1px solid var(--line);border-radius:22px;color:#fff;transition:transform .4s var(--bounce),box-shadow .3s}
.nav-card img{position:absolute;inset:0;z-index:-2;width:100%;height:100%;object-fit:cover;transition:transform .8s var(--ease)}
.nav-card::before{content:"";position:absolute;inset:0;z-index:-1;background:linear-gradient(180deg,rgba(24,18,36,.05) 20%,rgba(24,18,36,.78))}
.nav-card:hover{transform:translateY(-6px);box-shadow:var(--shadow)}
.nav-card:hover img{transform:scale(1.08)}
.nav-card.next{align-items:flex-end;text-align:right}
.nav-card .dir{font-size:13.5px;opacity:.92}
.nav-card b{font-size:19px;line-height:1.35}
.nav-card time{font-size:13px;opacity:.85}
.nav-card.none{justify-content:center;border-style:dashed;background:var(--soft);color:var(--faint)}
.nav-card.none::before{display:none}
.nav-card.none b{font-size:16px;font-weight:500}

/* 评论气泡头像 */
.c-item{display:flex;gap:12px}
.c-avatar{flex:none;display:grid;place-items:center;width:42px;height:42px;border-radius:14px;color:#fff;font-size:18px;font-weight:600}
.c-body{flex:1;min-width:0}

/* 回到顶部（环形阅读进度）与提示 */
.to-top{position:fixed;right:22px;bottom:24px;z-index:40;display:grid;place-items:center;width:54px;height:54px;padding:0;border:0;border-radius:50%;background:var(--card);color:var(--accent);box-shadow:var(--shadow);cursor:pointer;animation:fabIn .45s var(--bounce);transition:transform .3s var(--bounce)}
.to-top[hidden]{display:none}
.to-top:hover{transform:translateY(-4px)}
.to-top .ring{position:absolute;inset:0;width:54px;height:54px;transform:rotate(-90deg)}
.to-top .ring circle{fill:none;stroke:var(--line);stroke-width:3}
.to-top .ring .ring-fill{stroke:var(--accent);stroke-linecap:round;stroke-dasharray:119.4;stroke-dashoffset:119.4}
.to-top .arrow{width:20px;height:20px}
.toast{position:fixed;left:50%;bottom:32px;z-index:70;padding:10px 20px;border-radius:999px;background:var(--fg);color:var(--bg);font-size:15px;box-shadow:var(--shadow);opacity:0;transform:translate(-50%,20px);pointer-events:none;transition:opacity .3s,transform .45s var(--bounce)}
.toast.show{opacity:1;transform:translate(-50%,0)}

@media (max-width:680px){
  .hero-cover{aspect-ratio:16/10;border-radius:20px}
  .hero-text{margin:-34px 10px 0;padding:16px 18px}
  .post-title{font-size:29px}
  .title-skeleton{height:32px}
  .reactions{padding:18px 12px;gap:10px}
  .like-btn,.share-btn{height:50px;padding:0 18px;font-size:16px}
  .share-menu{width:260px}
  .author-card{flex-direction:column;align-items:flex-start;padding:18px}
  .post-nav{grid-template-columns:1fr}
  .nav-card{min-height:140px}
  .nav-card.none{min-height:84px}
  .to-top{right:14px;bottom:16px;width:48px;height:48px}
  .to-top .ring{width:48px;height:48px}
}

/* ══════════ 标签分类页 ══════════ */
.tags-head h1{display:flex;flex-wrap:wrap;align-items:center;gap:4px 12px;line-height:1.2}
.head-emoji{display:inline-block;animation:wiggle 3s ease-in-out infinite;transform-origin:50% 80%}
.tag-block{margin-top:26px}
.collections{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:10px}
.collection{position:relative;isolation:isolate;display:flex;flex-direction:column;justify-content:flex-end;min-height:176px;padding:16px 18px;overflow:hidden;border:2.5px solid transparent;border-radius:22px;color:#fff;box-shadow:var(--shadow);transition:transform .4s var(--bounce),border-color .25s}
.collection img{position:absolute;inset:0;z-index:-2;width:100%;height:100%;object-fit:cover;transition:transform .8s var(--ease)}
.collection::before{content:"";position:absolute;inset:0;z-index:-1;background:linear-gradient(180deg,rgba(24,18,36,.02) 10%,rgba(24,18,36,.8))}
.collection:hover{transform:translateY(-6px) rotate(-.6deg)}
.collection:hover img{transform:scale(1.08)}
.collection.active{border-color:var(--accent);transform:translateY(-4px)}
.c-emoji{position:absolute;top:12px;left:14px;display:grid;place-items:center;width:44px;height:44px;border-radius:14px;background:rgba(255,255,255,.92);font-size:23px;transition:transform .4s var(--bounce)}
.collection:hover .c-emoji{transform:rotate(-12deg) scale(1.12)}
.collection b{font-size:22px;line-height:1.2}
.collection small{font-size:13.5px;opacity:.92}
.collection em{position:absolute;top:16px;right:14px;padding:2px 11px;border-radius:999px;background:var(--accent);font-size:13px;font-style:normal;font-weight:600}
.cat-grid{display:flex;flex-wrap:wrap;gap:12px;margin-top:10px}
.cat-pill{display:inline-flex;align-items:center;gap:10px;padding:10px 12px 10px 16px;border:1.5px solid var(--line);border-radius:16px;background:var(--card);font-size:17px;transition:transform .3s var(--bounce),border-color .2s,box-shadow .3s,background .2s}
.cat-pill .dot{width:12px;height:12px;border-radius:50%;background:var(--h)}
.cat-pill b{display:grid;place-items:center;min-width:28px;height:28px;padding:0 8px;border-radius:10px;background:color-mix(in srgb,var(--h) 16%,transparent);color:var(--h);font-size:14px}
.cat-pill:hover{transform:translateY(-4px);border-color:var(--h);box-shadow:var(--shadow)}
.cat-pill.active{border-color:var(--h);background:color-mix(in srgb,var(--h) 13%,var(--card))}
.tag-cloud{display:flex;flex-wrap:wrap;align-items:center;gap:12px 14px;margin-top:12px;padding:22px;border:1.5px dashed var(--line);border-radius:22px}
.cloud-tag{display:inline-flex;align-items:baseline;gap:4px;padding:4px 15px;border-radius:999px;background:color-mix(in srgb,var(--h) 13%,var(--card));color:var(--h);font-weight:600;transform:rotate(var(--r,0deg));transition:transform .35s var(--bounce),background .2s,color .2s,box-shadow .3s}
.cloud-tag small{font-size:12px;font-weight:400;opacity:.75}
.cloud-tag:hover{transform:rotate(0) translateY(-4px) scale(1.07);box-shadow:var(--shadow)}
.cloud-tag.active{background:var(--h);color:#fff}
.tag-cloud .empty,.cat-grid .empty{margin:0;border:0;padding:4px}
.tag-results{margin-top:34px;padding-top:6px;scroll-margin-top:96px}
.tag-results.pop{animation:panelIn .5s var(--ease)}
.results-head{display:flex;align-items:flex-end;justify-content:space-between;gap:14px;padding-bottom:12px;border-bottom:1px solid var(--line)}
.results-head .eyebrow{letter-spacing:.12em}
.results-head h2{margin:2px 0 0;font-size:32px;color:var(--accent)}
.clear-btn{display:inline-flex;align-items:center;gap:6px;height:38px;padding:0 16px;border:1.5px solid var(--line);border-radius:999px;background:var(--card);color:var(--fg);font-size:15px;cursor:pointer;transition:transform .3s var(--bounce),border-color .2s,color .2s}
.clear-btn:hover{transform:translateY(-2px);border-color:var(--accent);color:var(--accent)}
a.cat{transition:border-color .2s,color .2s}
a.cat:hover{border-color:var(--accent2);color:var(--accent)}
.topics-more{margin-left:auto;font-size:15px;font-weight:500;color:var(--accent)}
.topics-more:hover{text-decoration:underline;text-underline-offset:4px}
@media (max-width:680px){.tags-head h1{font-size:30px}.collections{grid-template-columns:1fr}.collection{min-height:132px}.results-head h2{font-size:26px}.tag-cloud{padding:16px}}

/* ══════════ 链接卡片 / 阅读时长 ══════════ */
.link-card{position:relative;display:flex;align-items:stretch;margin:1.3em 0;overflow:hidden;border:1.5px solid var(--line);border-radius:18px;background:var(--card);color:var(--fg)!important;text-decoration:none!important;box-shadow:0 6px 18px -14px rgba(0,0,0,.35);transition:transform .35s var(--bounce),border-color .2s,box-shadow .3s}
.link-card:hover{transform:translateY(-4px);border-color:var(--accent);box-shadow:var(--shadow)}
.link-card::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:linear-gradient(var(--accent),var(--accent2))}
.lc-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px;padding:14px 16px 14px 20px}
.lc-title{display:-webkit-box;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:17px;font-weight:600;line-height:1.4}
.lc-desc{display:-webkit-box;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical;color:var(--muted);font-size:14.5px;line-height:1.6}
.lc-site{display:flex;align-items:center;gap:7px;margin-top:auto;padding-top:4px;color:var(--faint);font-size:13px}
.prose .lc-site img.lc-fav,.lc-site img.lc-fav{width:16px;height:16px;border:0;border-radius:4px}
.lc-img{flex:none;width:200px;overflow:hidden;background:var(--soft)}
.prose .lc-img img,.lc-img img{display:block;width:100%;height:100%;object-fit:cover;border:0;border-radius:0;transition:transform .7s var(--ease)}
.link-card:hover .lc-img img{transform:scale(1.06)}
.link-card:not([data-filled]) .lc-title{color:var(--faint)}
.link-card:not([data-filled]) .lc-img{background:linear-gradient(100deg,var(--soft) 30%,var(--card) 50%,var(--soft) 70%) 0 0/300% 100%;animation:shine 1.3s linear infinite}
.read-tag{padding:1px 9px;border-radius:999px;background:var(--soft);color:var(--muted);font-size:12.5px}
.read-left{position:fixed;right:88px;bottom:32px;z-index:40;padding:9px 16px;border:1px solid var(--line);border-radius:999px;background:var(--card);color:var(--fg);font-size:14.5px;font-weight:500;box-shadow:var(--shadow);animation:fabIn .45s var(--bounce);white-space:nowrap}
.read-left[hidden]{display:none}
.read-left.done{border-color:var(--accent);color:var(--accent)}
@media (max-width:680px){.link-card{flex-direction:column-reverse}.lc-img{width:100%;height:150px}.read-left{right:72px;bottom:22px;padding:7px 12px;font-size:13px}}

/* 链接合集（网格小卡片） */
.link-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px;margin:1.3em 0}
.link-mini{display:flex;align-items:center;gap:12px;padding:12px 14px;border:1.5px solid var(--line);border-radius:16px;background:var(--card);color:var(--fg)!important;text-decoration:none!important;transition:transform .35s var(--bounce),border-color .2s,box-shadow .3s}
.link-mini:hover{transform:translateY(-4px) rotate(-.5deg);border-color:var(--accent);box-shadow:var(--shadow)}
.lm-fav{display:grid;place-items:center;flex:none;width:38px;height:38px;overflow:hidden;border-radius:12px;background:var(--soft);font-size:17px}
.prose .lm-fav img,.lm-fav img{width:22px;height:22px;border:0;border-radius:5px}
.lm-text{display:flex;flex-direction:column;min-width:0;line-height:1.35}
.lm-title{overflow:hidden;font-size:15.5px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}
.lm-site{overflow:hidden;color:var(--faint);font-size:12.5px;text-overflow:ellipsis;white-space:nowrap}
.link-mini:not([data-filled]) .lm-title{color:var(--faint)}

/* ══════════ 朋友 ══════════ */
.friends{margin:38px 0 0}
.friends h2{display:flex;align-items:center;gap:8px;margin:0 0 12px;font-size:20px}
.friend-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px}
.friend-card{display:flex;align-items:center;gap:14px;padding:14px 16px;border:1.5px solid var(--line);border-radius:20px;background:var(--card);color:var(--fg);text-decoration:none;transition:transform .4s var(--bounce),border-color .2s,box-shadow .3s}
.friend-card:hover{transform:translateY(-5px) rotate(-.6deg);border-color:var(--accent);box-shadow:var(--shadow)}
.friend-card img{flex:none;width:56px;height:56px;border-radius:18px;object-fit:cover;background:var(--soft);border:2px solid var(--card);box-shadow:0 4px 12px -6px rgba(0,0,0,.3)}
.friend-text{display:flex;flex:1;flex-direction:column;min-width:0;line-height:1.35}
.friend-text b{overflow:hidden;font-size:17px;text-overflow:ellipsis;white-space:nowrap}
.friend-text small{overflow:hidden;color:var(--faint);font-size:13px;text-overflow:ellipsis;white-space:nowrap}
.friend-go{flex:none;font-size:18px;transition:transform .3s var(--bounce)}
.friend-card:hover .friend-go{transform:translateX(3px) scale(1.15)}

/* ══════════ 手机端底部标签栏 ══════════ */
.tabbar{display:none}
@media (max-width:780px){
  .tabbar{position:fixed;left:12px;right:12px;bottom:calc(10px + env(safe-area-inset-bottom));z-index:50;display:flex;justify-content:space-around;gap:4px;padding:6px;border:1px solid var(--line);border-radius:22px;background:var(--card);box-shadow:0 12px 30px -12px rgba(0,0,0,.35);transition:transform .4s var(--ease),opacity .3s}
  .tabbar.hide{transform:translateY(calc(100% + 24px));opacity:0}
  .tabbar a{position:relative;display:flex;flex:1;flex-direction:column;align-items:center;gap:2px;padding:6px 2px;border-radius:16px;color:var(--faint);font-size:11px;font-weight:600;text-decoration:none;transition:color .2s,background .25s}
  .tabbar a svg{width:22px;height:22px;transition:transform .35s var(--bounce)}
  .tabbar a:active svg{transform:scale(.85)}
  .tabbar a.active{background:color-mix(in srgb,var(--accent) 13%,transparent);color:var(--accent)}
  .tabbar a.active svg{transform:translateY(-1px) scale(1.08)}
  .has-tabbar body{padding-bottom:calc(84px + env(safe-area-inset-bottom))}
  .has-tabbar .foot{padding-bottom:20px}
  .nav .icon-btn[aria-label="Archives"],.nav .icon-btn[aria-label="Tags"],.nav .icon-btn[aria-label="Search"]{display:none}
  .has-tabbar .to-top{bottom:calc(88px + env(safe-area-inset-bottom))}
  .has-tabbar .read-left{bottom:calc(94px + env(safe-area-inset-bottom))}
  .has-tabbar .toast{bottom:calc(96px + env(safe-area-inset-bottom))}
}

/* 共同作者 */
.partners .amp{color:var(--accent);font-weight:500}
.partners .partner-name{color:var(--fg)}
.partners a.partner-name:hover{color:var(--accent)}
.avatar-partners{position:absolute;left:-14px;bottom:-10px;display:flex}
.avatar-partners img,.avatar-partners .ap-initial{width:62px;height:62px;margin-left:calc(var(--i) * -18px);border:3px solid var(--card);border-radius:50%;object-fit:cover;background:var(--soft);box-shadow:var(--shadow);animation:bob 5.5s ease-in-out infinite;animation-delay:-1.6s}
.avatar-partners .ap-initial{display:grid;place-items:center;background:linear-gradient(135deg,var(--accent),var(--accent2));color:#fff;font-size:24px;font-weight:600}
.date .by{padding:1px 9px;border-radius:999px;background:color-mix(in srgb,var(--accent2) 13%,transparent);color:var(--accent2);font-size:12.5px}
@media (max-width:680px){.avatar-partners img,.avatar-partners .ap-initial{width:52px;height:52px}.avatar-partners{left:-10px}}

/* ── 响应式 ── */
@media (min-width:1400px){html{font-size:18px}.wrap{max-width:980px}}
@media (max-width:900px){
  .wrap{padding:0 20px}
  .card-item{grid-template-columns:210px 1fr;gap:18px}
  .card-item .thumb{width:210px;height:132px}
  .stats{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:680px){
  html{font-size:16.5px}
  .wrap{padding:0 16px}
  .top .wrap{height:66px}
  .brand{font-size:20px}.brand i{display:none}
  .top .wrap{gap:8px}
  .nav{gap:0}.nav-text{display:none}
  .icon-btn{width:38px;height:38px}
  .lang-btn{height:32px;min-width:40px;padding:0 8px}
  .intro{flex-direction:column;align-items:center;text-align:center;gap:18px;padding-top:28px}
  .avatar-wrap{width:150px;height:150px}
  .intro h1{justify-content:center;font-size:34px}
  .typer{font-size:18px}
  .bio{text-align:left}
  .socials{justify-content:center}
  .stats{gap:10px}.stat{padding:14px}.stat b{font-size:28px}
  .now{flex-direction:column;gap:8px}
  .tabs{gap:20px}.tab{font-size:22px}
  .card-item{grid-template-columns:1fr;gap:12px}
  .card-item .thumb{width:100%;height:auto;aspect-ratio:16/9}
  .card-item h3{font-size:21px}
  .projects{grid-template-columns:1fr}
  .row{font-size:16px}.row time{width:84px}
  .article-head h1{font-size:30px}
  .prose{font-size:17px}
  .about-hero{flex-direction:column;align-items:flex-start}
  .about-hero h1{font-size:32px}
  .grid2{grid-template-columns:1fr}
  .photos{grid-template-columns:1fr 1fr}
  .timeline li{grid-template-columns:92px 1fr}
  .chapter-num{font-size:40px;min-width:54px}
}
@media (max-width:940px){.nav-text[href="/code"],.nav-text[href="/#research"]{display:none}}
@media (max-width:780px){.nav-text{display:none}}
@media (max-width:420px){.nav .icon-btn[href="/archive"]{display:none}.brand{font-size:19px}}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}
  .anim [data-rv]{opacity:1!important;transform:none!important}
}

/* ── 双人介绍：左 主理人 / 右 共同作者（头像同尺寸、模块相同，右侧更紧凑但完整展示） ── */
.duo{position:relative;display:grid;grid-template-columns:1.22fr 1fr;gap:22px;align-items:stretch;padding:34px 0 30px}
.duo.solo{grid-template-columns:1fr}
.person{position:relative;display:flex;flex-direction:column;min-width:0;padding:24px 24px 20px;border:1px solid var(--line);border-radius:24px;background:var(--card);box-shadow:var(--shadow)}
.person.host{background:linear-gradient(160deg,color-mix(in srgb,var(--accent) 8%,var(--card)),var(--card) 58%)}
.person.co{background:linear-gradient(160deg,color-mix(in srgb,var(--accent2) 9%,var(--card)),var(--card) 58%)}
.p-head{display:flex;gap:20px;align-items:center;margin-bottom:16px}
.person .avatar-wrap{flex:none;width:112px;height:112px}
.person .avatar-wrap::before{inset:-7px;border-radius:26px}
.person.co .avatar-wrap::before{border-color:var(--accent2);animation-direction:reverse}
.person .avatar{border-radius:20px}
.person .avatar-wrap .badge-emoji{right:-10px;bottom:-8px;width:38px;height:38px;font-size:20px}
.p-id{flex:1;min-width:0}
.p-role{display:inline-block;margin-bottom:6px;padding:2px 10px;border-radius:999px;font-size:12.5px;font-weight:600;letter-spacing:.04em;color:var(--accent);background:color-mix(in srgb,var(--accent) 13%,transparent)}
.person.co .p-role{color:var(--accent2);background:color-mix(in srgb,var(--accent2) 14%,transparent)}
.person h1,.person h2{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 8px;margin:0 0 4px;font-size:32px;line-height:1.15}
.person h1 .spark{font-size:22px;align-self:center}
.person h2 small{font-size:15px;font-weight:500;color:var(--faint)}
.person h2 a{color:inherit}.person h2 a:hover{color:var(--accent2)}
.person .typer{margin:0;font-size:16.5px}
.person.co .typer b{color:var(--accent2)}.person.co .typer .caret{background:var(--accent2)}
.person .bio{max-height:128px;font-size:15.5px}
.person .bio::after{background:linear-gradient(transparent,var(--card))}
.person .bio.open{max-height:1200px}
.person .co-bio{max-height:none;font-size:15px}
.person .co-bio::after{display:none}
.person .co-bio p:last-child{margin-bottom:0}
.p-links{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:auto;padding-top:14px}
.p-links .socials{margin-top:0}
.code-chip{display:inline-flex;align-items:center;gap:7px;height:42px;padding:0 14px;border:1px solid var(--line);border-radius:12px;background:var(--card);color:var(--fg);font-size:14.5px;font-weight:600;text-decoration:none;transition:transform .3s var(--bounce),border-color .2s,color .2s}
.code-chip svg{width:18px;height:18px;color:var(--accent)}
.code-chip small{max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:13px;font-weight:500}
.code-chip:hover{transform:translateY(-3px);border-color:var(--accent);color:var(--accent)}
.person.co .code-chip svg{color:var(--accent2)}
.person.co .code-chip:hover{border-color:var(--accent2);color:var(--accent2)}
.duo-amp{position:absolute;z-index:2;top:96px;left:calc((100% - 22px) * .5495 + 11px);display:grid;place-items:center;width:44px;height:44px;margin-left:-22px;border:1px solid var(--line);border-radius:50%;background:var(--card);box-shadow:var(--shadow);color:var(--accent);font-family:Fredoka,"ZCOOL KuaiLe",sans-serif;font-size:24px;font-weight:600}
@media (prefers-reduced-motion:no-preference){.duo-amp{animation:bob 4.5s ease-in-out infinite}}
@media (max-width:780px){
  .duo{grid-template-columns:1fr;gap:26px;padding-top:24px}
  .duo-amp{position:relative;top:auto;left:auto;justify-self:center;margin:-24px 0}
  .person{padding:20px 18px 18px}
  .p-head{gap:16px}
  .person .avatar-wrap{width:96px;height:96px}
  .person h1,.person h2{font-size:27px}
  .person .typer{font-size:15.5px}
}
