/* 代码块增强：3D 阴影 + copy 按钮图标化
   覆盖 stellar 的 highlight/copycode 默认样式，不改动主题源码 */

/* 引入霞鹜文楷（LXGW WenKai）—— 开源钢笔楷书，仅给 welcome 便签用，
   其 unicode-range 分包加载，只下载便签里实际用到的字符范围 */
@import url('https://cdn.jsdelivr.net/npm/lxgw-wenkai-webfont/lxgwwenkai-regular.css');

/* 引入思源宋体（Noto Serif SC）—— 全站正文字体
   字重 300（Light）做正文（瘦劲，类似瘦金体感），700（Bold）做标题/加粗对比
   只加载 chinese-simplified 分包（含拉丁字母 + 简体中文），全字符集一次性加载
   welcome 便签在下方显式覆盖为 LXGW WenKai，不受影响 */
@import url('https://cdn.jsdelivr.net/npm/@fontsource/noto-serif-sc@5.3.0/chinese-simplified-300.css');
@import url('https://cdn.jsdelivr.net/npm/@fontsource/noto-serif-sc@5.3.0/chinese-simplified-700.css');

/* === 文章卡片 / 专栏卡片改成跟 Ech0 说说一样的渐变毛玻璃 === */
/* stellar 默认 .post-card 是 rgba(255,255,255,0.5) 白底，在彩色背景图上太突兀。
   借用 ech0-talks.css 的紫粉渐变（indigo→purple→pink 135deg）+ blur 16px，视觉跟说说统一 */
.post-card {
  background: linear-gradient(135deg, rgba(99, 102, 241, 0.10) 0%, rgba(168, 85, 247, 0.06) 50%, rgba(236, 72, 153, 0.08) 100%) !important;
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px);
}
.post-card:hover {
  background: linear-gradient(135deg, rgba(99, 102, 241, 0.14) 0%, rgba(168, 85, 247, 0.10) 50%, rgba(236, 72, 153, 0.12) 100%) !important;
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
}
[data-theme="dark"] .post-card {
  background: linear-gradient(135deg, rgba(99, 102, 241, 0.18) 0%, rgba(168, 85, 247, 0.12) 50%, rgba(236, 72, 153, 0.15) 100%) !important;
}
[data-theme="dark"] .post-card:hover {
  background: linear-gradient(135deg, rgba(99, 102, 241, 0.24) 0%, rgba(168, 85, 247, 0.18) 50%, rgba(236, 72, 153, 0.20) 100%) !important;
}

/* === navbar-blur 在背景图上白底太突兀，直接干掉磨砂伪元素 + 白色文字光晕 === */
/* stellar newblur() mixin 给 ::before/::after 做 8px+16px 模糊 + 0.3 白底，
   还给 navbar-blur 和未选中 a 加了三层白色 text-shadow + drop-shadow 光晕，
   在彩色背景图上每个文字周围都像有白底。全部干掉，让背景图原样透过来 */
body .navbar-blur {
  text-shadow: none !important;
}
body .navbar-blur nav a:not(.active) {
  text-shadow: none !important;
  filter: none !important;
}
body .navbar-blur::before,
body .navbar-blur::after {
  display: none !important;
}

/* === 3D 阴影：右下方向偏移，无模糊，营造层叠立体感 === */
/* 同时叠同色系淡渐变背景，呼应侧边栏 hsl(215→195→165) 蓝青绿渐变 */
.md-text .highlight {
  box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.35);
  background-image: linear-gradient(135deg, hsla(215, 95%, 64%, 0.08), hsla(195, 95%, 60%, 0.08), hsla(165, 95%, 56%, 0.08));
}

/* 移动端阴影缩小，避免横向溢出 */
@media (max-width: 768px) {
  .md-text .highlight {
    box-shadow: 3px 3px 0 rgba(0, 0, 0, 0.35);
  }
}

/* 暗色模式：阴影加深 + 渐变改成更深的同色系，避免浅色渐变在黑底上发灰 */
[data-theme="dark"] .md-text .highlight {
  box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.6);
  background-image: linear-gradient(135deg, hsla(215, 95%, 64%, 0.15), hsla(195, 95%, 60%, 0.15), hsla(165, 95%, 56%, 0.15));
}

/* === copy 按钮图标化：隐藏文字，用 SVG mask 显示图标 === */
.highlight .code .copy-btn {
  font-size: 0;          /* 隐藏 "Copy" / "Copied" 文字 */
  color: transparent;
  width: 28px;
  height: 28px;
  padding: 0 !important;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  line-height: 1;
  overflow: hidden;
}

/* 默认态：剪贴板图标，颜色随主题文字色 */
.highlight .code .copy-btn::before {
  content: '';
  display: block;
  width: 14px;
  height: 14px;
  background-color: var(--text-p3, #888);
  -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path fill='black' d='M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1z'/></svg>") center / contain no-repeat;
          mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path fill='black' d='M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1z'/></svg>") center / contain no-repeat;
}

/* 成功态：绿色背景 + 白色对勾图标（覆盖 stellar 默认 success 样式） */
.highlight .code .copy-btn.success::before {
  background-color: white;
  -webkit-mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path fill='black' d='M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z'/></svg>");
          mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path fill='black' d='M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z'/></svg>");
}

/* 警告态：橙色背景 + 白色感叹号图标（clipboard 权限被拒/非 HTTPS） */
.highlight .code .copy-btn.warning::before {
  background-color: white;
  -webkit-mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path fill='black' d='M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z'/></svg>");
          mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path fill='black' d='M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z'/></svg>");
}

/* === 含 banner 标签的页面：隐藏 stellar 自动生成的顶部「主页>标题>发布日期」横幅 === */
/* stellar page/post layout 默认在 l_main 第一个子元素位置生成 .article.banner.top（面包屑+标题+发布日期），
   高 169px，把用户写的 banner 标签往下挤。当文章正文里自己放了 banner 标签时，这个自动横幅就是冗余的，
   用 :has() 检测到 .tag-plugin.banner 后隐藏之，让 banner 标签贴到 navbar 下方。 */
.l_main:has(.tag-plugin.banner) > .article.banner.top {
  display: none !important;
}
/* 同时去掉 article 首元素 banner 的上 margin，让它真正贴顶 */
.l_main:has(.tag-plugin.banner) > article.md-text > .tag-plugin.banner:first-child {
  margin-top: 0 !important;
}

/* === /tech/ 列表页 JS 注入的 banner img：无 data-src，stellar lazyload 不接管 === */
/* tech-listing-banner.js 动态创建的 img 没有 lazyload 需要的 data-src 属性，
   stellar lazyload 不接管，img 卡在 loading 状态 opacity:0 看不到。
   stellar 正常渲染的 banner img 走完 lazyload 流程后是 loaded 状态 opacity:1，
   这里 !important 只对卡在 loading 的 img 生效，无副作用。 */
.tag-plugin.banner > img.bg {
  opacity: 1 !important;
}

/* === div_photo 卡片图片高度：与纯文字卡片保持一致 === */
/* stellar 默认 div_photo 卡片图片用 cover_ratio=2（2:1），在 688px 宽度下高 344px，
   比纯文字卡片（165px）高出一倍多，列表页看起来大小不一致。
   改成固定 165px 高，让有封面图的 div_photo 卡片和纯文字卡片高度一致。
   只影响 .post-card.photo（有 poster 字段的卡片），不影响普通 div_default 卡片。 */
.post-list .post-card.post.photo .cover img {
  aspect-ratio: auto !important;
  height: 165px !important;
}

/* === swiper 轮播图片：cursor pointer 提示可点击放大 === */
/* fancybox v5 用事件委托绑定，不会自动给图片加 cursor:pointer。
   加上 cursor:pointer 让用户知道 swiper 里的图片可以点击放大查看。 */
.tag-plugin.swiper .swiper-slide img {
  cursor: pointer !important;
}

/* === welcome widget：仿真便签（透明底）===
   保留便签形式（细边框+纸张阴影+轻微旋转+顶部胶带+钢笔体+棕墨色），
   但把米黄纸底改成透明，让 leftbar 背景图透出来，融入整体冷色调。
   暗色模式下只调整文字色为暖米黄，背景始终透明 */
.widget-wrapper.markdown {
  background: none !important;
  background-color: transparent !important;
  border: 1px solid rgba(180, 150, 90, 0.22) !important;
  border-radius: 2px !important;
  box-shadow: 0 1px 0 rgba(0,0,0,0.04), 2px 3px 6px rgba(0,0,0,0.14), 4px 6px 14px rgba(0,0,0,0.10), inset 0 0 0 1px rgba(255,255,255,0.5) !important;
  transform: none !important;
  margin: 8px 8px 20px 8px !important;
  padding: 0 0 24px !important;
  overflow: visible !important;
  position: relative !important;
}
/* welcome 便签顶部胶带：半透明白色 + 虚线边模拟胶带齿纹，倾斜挂在便签上沿
   用 .l_left 限定只对 welcome 生效（日历/近期说说在右栏，不应用胶带） */
.l_left .widget-wrapper.markdown::before {
  content: '' !important;
  position: absolute !important;
  top: -8px !important;
  left: 50% !important;
  transform: translateX(-50%) rotate(-3deg) !important;
  width: 86px !important;
  height: 16px !important;
  background: linear-gradient(180deg, rgba(255,255,255,0.6), rgba(245,240,220,0.4)) !important;
  border-left: 1px dashed rgba(180, 150, 90, 0.35) !important;
  border-right: 1px dashed rgba(180, 150, 90, 0.35) !important;
  box-shadow: 0 1px 2px rgba(0,0,0,0.08) !important;
  z-index: 1 !important;
  pointer-events: none !important;
}
[data-theme="dark"] .l_left .widget-wrapper.markdown::before {
  background: linear-gradient(180deg, rgba(255,255,255,0.10), rgba(245,240,220,0.06)) !important;
  border-left-color: rgba(200, 170, 100, 0.35) !important;
  border-right-color: rgba(200, 170, 100, 0.35) !important;
}
.widget-wrapper.markdown > * {
  position: relative;
  z-index: 1;
}
.widget-wrapper.markdown .widget-header .name {
  font-weight: 600 !important;
  color: #0a0a0a !important;
  font-size: 15px !important;
  font-family: 'Noto Serif SC', system-ui, sans-serif !important;
}
/* welcome 便签（左侧栏）标题加粗居中——只 l_left 的 markdown widget 是 welcome */
.l_left .widget-wrapper.markdown .widget-header {
  justify-content: center !important;
}
.l_left .widget-wrapper.markdown .widget-header .name {
  font-weight: 700 !important;
  text-align: center !important;
  letter-spacing: 1px;
}
/* welcome 便签整体放大 + 文本下移：padding-top 20px + 标题/正文各 +2px */
.l_left .widget-wrapper.markdown {
  padding: 20px 0 24px !important;
}
.l_left .widget-wrapper.markdown .widget-header .name {
  font-size: 17px !important;
}
.l_left .widget-wrapper.markdown .widget-body {
  font-size: 16px !important;
}
.l_left .widget-wrapper.markdown .widget-body em {
  font-weight: 700 !important;
  font-style: italic !important;
}
.widget-wrapper.markdown .widget-body {
  background: none !important;
  font-size: 14px !important;
  line-height: 1.75 !important;
  color: rgba(60, 45, 15, 0.85) !important;
  font-family: 'Noto Serif SC', system-ui, sans-serif !important;
  padding: 4px 16px !important;
  border-radius: 0 !important;
}
.widget-wrapper.markdown .widget-body p {
  margin: 8px 0 !important;
  line-height: 1.75 !important;
}
.widget-wrapper.markdown .widget-body ul {
  margin: 6px 0 !important;
  padding-left: 20px !important;}
.widget-wrapper.markdown .widget-body li {
  margin: 4px 0 !important;
  line-height: 1.75 !important;
}
.widget-wrapper.markdown .widget-body strong {
  color: rgba(50, 35, 10, 0.95) !important;
  font-weight: 700 !important;
}
/* 暗色模式：背景依然透明，文字色从棕墨→米黄，边框/胶带色微调以贴合深色背景 */
[data-theme="dark"] .widget-wrapper.markdown {
  background: none !important;
  background-color: transparent !important;
  border-color: rgba(200, 170, 100, 0.22) !important;
  box-shadow: 0 1px 0 rgba(0,0,0,0.20), 2px 3px 6px rgba(0,0,0,0.30), 4px 6px 14px rgba(0,0,0,0.25), inset 0 0 0 1px rgba(255,255,255,0.08) !important;
}
[data-theme="dark"] .widget-wrapper.markdown .widget-header .name {
  color: rgba(255, 245, 200, 0.92) !important;
}
[data-theme="dark"] .widget-wrapper.markdown .widget-body {
  color: rgba(245, 235, 200, 0.88) !important;
}
[data-theme="dark"] .widget-wrapper.markdown .widget-body strong {
  color: rgba(255, 250, 220, 0.98) !important;
}


/* === 左侧栏头像：hover 时 360° 旋转（点击仍跳 /about/）===
   avatar 是 <a class="avatar"><img class="avatar"></a>，给 img 加 transition + hover rotate */
.l_left .header .logo-wrap a.avatar {
  transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1);
}
.l_left .header .logo-wrap a.avatar:hover {
  transform: rotate(360deg);
}
.l_left .header .logo-wrap a.avatar img.avatar {
  transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1);
  pointer-events: none;
}


/* === 左侧栏底部：白天/夜间模式切换滑动 pill ===
   放在 .footer.dis-select 末尾，社交图标下方
   整个按钮就是 pill 轨道：左侧隐约的太阳、右侧隐约的月亮
   圆形 knob 在轨道里左右滑动：light 模式 knob 停在左端（显示太阳）
   点击后 knob 滑到右端、主题切到 dark、knob 上图标换成月亮 */
/* sidebar 底部预留 margin 从 stellar 默认 96px → 36px，多出来的 60px 给 .widgets
   滚动区让最近更新显示更多文章（welcome+recent 原本 overflow 67px，加 60px 后基本不滚） */
.l_left {
  max-height: calc(100vh - var(--gap-margin) * 2 - 36px) !important;
}
.l_left .leftbar-container {
  height: calc(100vh - var(--gap-margin) * 2 - 36px) !important;
}
/* sidebar footer 整体下移：social-wrap 与 theme-toggle 与上方 recent widget 拉开距离 */
.l_left .footer.dis-select {
  margin-top: 24px;
  padding-bottom: 8px;
}
.l_left .footer.dis-select .theme-toggle-pill {
  position: relative;
  display: block;
  width: 100%;
  height: 36px;
  margin-top: 10px;
  border-radius: 18px;
  border: 1px solid rgba(245, 200, 100, 0.40);
  background: linear-gradient(135deg, rgba(255, 247, 220, 0.85), rgba(255, 230, 170, 0.70));
  cursor: pointer;
  padding: 0;
  overflow: hidden;
  transition: background 0.3s ease, border-color 0.3s ease;
}
.l_left .footer.dis-select .theme-toggle-pill:hover {
  background: linear-gradient(135deg, rgba(255, 240, 195, 0.95), rgba(255, 220, 150, 0.85));
  border-color: rgba(245, 200, 100, 0.60);
}
/* 轨道两端的隐约图标（提示另一侧的状态） */
.l_left .footer.dis-select .theme-toggle-pill .track-icon {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 18px;
  height: 18px;
  opacity: 0.3;
  pointer-events: none;
  display: flex;
  align-items: center;
  justify-content: center;
}
.l_left .footer.dis-select .theme-toggle-pill .track-sun {
  left: 9px;
}
.l_left .footer.dis-select .theme-toggle-pill .track-moon {
  right: 9px;
}
.l_left .footer.dis-select .theme-toggle-pill .track-icon img {
  width: 100%;
  height: 100%;
}
/* 滑动 knob：圆形，根据 is-light/is-dark 停在左/右端 */
.l_left .footer.dis-select .theme-toggle-pill .knob {
  position: absolute;
  top: 3px;
  left: 3px;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  background: linear-gradient(135deg, #f59e0b, #fbbf24);
  box-shadow: 0 1px 4px rgba(0,0,0,0.18), 0 0 0 1px rgba(255,255,255,0.25) inset;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: left 0.35s cubic-bezier(0.4, 0, 0.2, 1), background 0.35s ease, box-shadow 0.35s ease;
  z-index: 1;
}
.l_left .footer.dis-select .theme-toggle-pill.is-dark .knob {
  left: calc(100% - 31px);
  background: linear-gradient(135deg, #6366f1, #a855f7);
  box-shadow: 0 1px 4px rgba(0,0,0,0.28), 0 0 4px rgba(168, 85, 247, 0.4), 0 0 0 1px rgba(255,255,255,0.15) inset;
}
.l_left .footer.dis-select .theme-toggle-pill.is-light .knob {
  box-shadow: 0 1px 4px rgba(0,0,0,0.18), 0 0 4px rgba(245, 158, 11, 0.35), 0 0 0 1px rgba(255,255,255,0.25) inset;
}
.l_left .footer.dis-select .theme-toggle-pill .knob-icon {
  width: 18px;
  height: 18px;
  pointer-events: none;
}
[data-theme="dark"] .l_left .footer.dis-select .theme-toggle-pill {
  background: var(--bg-a60, rgba(255,255,255,0.05));
  border-color: var(--bg-a100, rgba(255,255,255,0.08));
}
[data-theme="dark"] .l_left .footer.dis-select .theme-toggle-pill:hover {
  background: var(--bg-a100, rgba(255,255,255,0.10));
}

/* === footer 排版：每行图标+文字垂直居中对齐，备案号成对横排 === */
/* stellar footer.content 渲染后包在 .footer-content 里，这里定制几行信息视觉 */
.footer-info {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin: 8px 0;
  font-size: 13px;
  line-height: 1.6;
  opacity: 0.92;
}
.footer-row {
  display: flex;
  align-items: center;
  justify-content: flex-start;
  gap: 6px;
  flex-wrap: wrap;
}
.footer-ico {
  width: 18px;
  height: 18px;
  flex-shrink: 0;
  vertical-align: middle;
  opacity: 0.85;
}
.footer-ico.beian-police {
  width: 16px;
  height: 16px;
}
.footer-ico.beian-moe {
  width: 18px;
  height: 18px;
}
.footer-ico.cc-license {
  width: auto;
  height: 22px;
  vertical-align: middle;
  margin-right: 4px;
  opacity: 0.95;
}
.footer-beian {
  gap: 4px;
}
.footer-beian .beian-sep {
  opacity: 0.4;
  margin: 0 4px;
}
.footer-info a {
  text-decoration: none;
  border-bottom: 1px dashed currentColor;
  opacity: 0.88;
  transition: opacity 0.2s;
}
.footer-info a:hover {
  opacity: 1;
}
#uptime-counter {
  font-variant-numeric: tabular-nums;
  font-feature-settings: 'tnum';
  color: var(--text-a85, #888);
  margin-left: 2px;
}
/* 暗色模式下 footer 链接和图标稍微提亮，配 stellar footer 的深色背景 */
[data-theme="dark"] .footer-info {
  opacity: 0.88;
}
[data-theme="dark"] .footer-ico {
  opacity: 0.75;
}
[data-theme="dark"] .footer-info a {
  opacity: 0.92;
}

/* === footer sitemap 排版增强：每条链接前面加小图标，让两列不再空旷 ===
   原本只有纯文字链接，看着空；给每条按 href 配一个 iconify 小图标，
   链接改成 flex 行布局，hover 加底色，整组卡片化，视觉密度上去 */
.sitemap {
  margin: 12px 0 16px !important;
}
.sitemap-group {
  break-inside: avoid;
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 10px 14px;
  border-radius: 12px;
  background: none !important;
  border: none !important;
}
.sitemap-group > .fs15 {
  font-size: 13px !important;
  font-weight: 700;
  color: var(--text-p3, #888);
  letter-spacing: 0.5px;
  margin-bottom: 4px;
  display: flex;
  align-items: center;
  gap: 6px;
}
.sitemap-group > .fs15::before {
  content: '';
  width: 4px;
  height: 14px;
  border-radius: 2px;
  background: linear-gradient(180deg, rgb(99, 102, 241), rgb(168, 85, 247), rgb(236, 72, 153));
}
.sitemap-group a {
  display: flex !important;
  align-items: center;
  gap: 8px;
  padding: 4px 8px;
  border-radius: 6px;
  width: 100% !important;
  color: var(--text-p1, inherit) !important;
  text-decoration: none !important;
  font-size: 14px;
  transition: background 0.15s ease, color 0.15s ease;
}
.sitemap-group a::before {
  content: '';
  width: 15px;
  height: 15px;
  flex-shrink: 0;
  background-size: contain;
  background-repeat: no-repeat;
  background-position: center;
  opacity: 0.4;
  filter: grayscale(1);
  /* 默认图标（未匹配到 href 时）*/
  background-image: url('https://api.iconify.design/solar:arrow-right-up-linear.svg?color=%23888');
}
.sitemap-group a:hover {
  background: linear-gradient(135deg, rgba(99, 102, 241, 0.10) 0%, rgba(168, 85, 247, 0.06) 50%, rgba(236, 72, 153, 0.08) 100%) !important;
  color: var(--text-link, hsl(207 90% 54%)) !important;
}
.sitemap-group a:hover::before {
  opacity: 1;
  filter: grayscale(0);
}
/* 按路径匹配专属图标，让每条链接视觉有差异 */
.sitemap-group a[href="/"]::before             { background-image: url('https://api.iconify.design/solar:document-add-outline.svg?color=%231e90ff'); }
.sitemap-group a[href="/tags/"]::before         { background-image: url('https://api.iconify.design/solar:hashtag-square-outline.svg?color=%23e91e63'); }
.sitemap-group a[href="/archives/"]::before     { background-image: url('https://api.iconify.design/solar:archive-minimalistic-outline.svg?color=%239c27b0'); }
.sitemap-group a[href="/life/"]::before        { background-image: url('https://api.iconify.design/solar:camera-outline.svg?color=%23ffc107'); }
.sitemap-group a[href="/friends/"]::before     { background-image: url('https://api.iconify.design/solar:users-group-rounded-outline.svg?color=%236366f1'); }
.sitemap-group a[href="/shuoshuo/"]::before     { background-image: url('https://api.iconify.design/solar:balloon-outline.svg?color=%2300bfa5'); }
.sitemap-group a[href="/about/"]::before       { background-image: url('https://api.iconify.design/solar:user-circle-outline.svg?color=%236d28d9'); }
.sitemap-group a[href="/privacy/"]::before     { background-image: url('https://api.iconify.design/solar:lock-keyhole-minimalistic-outline.svg?color=%2310b981'); }
.sitemap-group a[href="/license/"]::before     { background-image: url('https://api.iconify.design/solar:shield-check-outline.svg?color=%238b5cf6'); }
.sitemap-group a[href="/disclaimer/"]::before  { background-image: url('https://api.iconify.design/solar:danger-triangle-outline.svg?color=%23ef4444'); }
[data-theme="dark"] .sitemap-group {
  background: none !important;
  border: none !important;
}
[data-theme="dark"] .sitemap-group a::before {
  opacity: 0.5;
}
[data-theme="dark"] .sitemap-group a:hover {
  background: linear-gradient(135deg, rgba(99, 102, 241, 0.18) 0%, rgba(168, 85, 247, 0.12) 50%, rgba(236, 72, 153, 0.15) 100%) !important;
}
[data-theme="dark"] .sitemap-group a:hover::before {
  opacity: 1;
}

/* === 主页右栏：日历 widget ===
   日历容器沿用 markdown widget 的透明卡片风格（与近期说说一致），
   只在内部排版网格 + 今天高亮 + 年剩余倒计时 */
.sidebar-calendar-container,
.sidebar-calendar-loading,
.sidebar-calendar-empty,
.sidebar-calendar-error {
  padding: 4px 4px 0 !important;
}
.cal-grid {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.cal-title {
  text-align: center;
  font-size: 14px;
  font-weight: 600;
  color: var(--text-p3, #555);
  padding: 4px 0 2px;
  letter-spacing: 0.5px;
}
.cal-cells {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 1px;
}
.cal-cell {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  min-height: 34px;
  padding: 2px 0;
  font-size: 12px;
  border-radius: 5px;
  color: var(--text-p1, #444);
  font-variant-numeric: tabular-nums;
}
.cal-head {
  color: var(--text-p3, #888);
  font-weight: 600;
  font-size: 11px;
  opacity: 0.7;
  min-height: 18px;
}
.cal-empty {
  visibility: hidden;
}
.cal-day-num {
  font-size: 13px;
  line-height: 1.2;
  font-weight: 500;
}
.cal-day-lunar {
  font-size: 9px;
  line-height: 1.1;
  color: var(--text-p3, #aaa);
  font-weight: 400;
  margin-top: 1px;
  min-height: 10px;
  text-align: center;
}
.cal-day {
  transition: none;
}
/* 非今日格子 hover 时不变化（不再变白底） */
.cal-day:hover {
  background: none;
  cursor: default;
}
.cal-today {
  background: linear-gradient(135deg, rgb(99, 102, 241), rgb(168, 85, 247), rgb(236, 72, 153));
  color: #fff !important;
  font-weight: 700;
  box-shadow: 0 2px 6px rgba(168, 85, 247, 0.35);
}
.cal-today .cal-day-lunar {
  color: rgba(255, 255, 255, 0.92);
}
.cal-today:hover {
  background: linear-gradient(135deg, rgb(99, 102, 241), rgb(168, 85, 247), rgb(236, 72, 153)) !important;
}
/* 当天详情：农历日期 + 宜忌 */
.cal-day-info {
  margin-top: 8px;
  padding: 8px 4px 0;
  border-top: 1px dashed var(--bg-a60, rgba(0, 0, 0, 0.10));
  display: flex;
  flex-direction: column;
  gap: 5px;
}
.cal-lunar-date {
  text-align: center;
  font-size: 12px;
  color: var(--text-p2, #555);
  font-weight: 500;
  margin-bottom: 2px;
}
.cal-yi,
.cal-ji {
  display: flex;
  align-items: flex-start;
  gap: 6px;
  font-size: 11px;
  line-height: 1.5;
}
.cal-yi-label,
.cal-ji-label {
  flex-shrink: 0;
  font-weight: 700;
  color: #fff;
  padding: 1px 5px;
  border-radius: 3px;
  font-size: 10px;
  line-height: 1.3;
  margin-top: 1px;
}
.cal-yi-label {
  background: #4caf50;
}
.cal-ji-label {
  background: #f44336;
}
.cal-yi-list,
.cal-ji-list {
  color: var(--text-p2, #555);
  flex: 1;
}
[data-theme="dark"] .cal-yi-list,
[data-theme="dark"] .cal-ji-list,
[data-theme="dark"] .cal-lunar-date {
  color: var(--text-p2, #ccc);
}
[data-theme="dark"] .cal-day-info {
  border-top-color: var(--bg-a60, rgba(255, 255, 255, 0.10));
}
/* 倒计时块：透明（不卡片化，融入便签） */
.cal-countdown {
  margin-top: 10px;
  padding: 8px 4px 0;
  border-top: 1px dashed var(--bg-a60, rgba(0, 0, 0, 0.10));
  border-radius: 0;
  background: none !important;
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.cal-countdown-label {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
  color: var(--text-p3, #777);
}
.cal-countdown-ico {
  width: 14px;
  height: 14px;
  opacity: 0.85;
}
.cal-countdown-numbers {
  display: flex;
  align-items: baseline;
  justify-content: center;
  gap: 6px;
}
.cal-num {
  display: flex;
  align-items: baseline;
  gap: 2px;
}
.cal-num-val {
  font-size: 18px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: rgb(168, 85, 247);
  line-height: 1;
}
.cal-num-unit {
  font-size: 11px;
  color: var(--text-p3, #888);
}
.cal-sep {
  color: var(--text-p3, #aaa);
  font-size: 14px;
  opacity: 0.6;
}
[data-theme="dark"] .cal-countdown {
  background: none !important;
  border-top: 1px dashed var(--bg-a60, rgba(255, 255, 255, 0.10));
}
[data-theme="dark"] .cal-num-val {
  color: rgb(192, 132, 252);
}

/* === 近期说说 widget（主页右栏）：去掉 welcome 便签样式 === */
/* .widget-wrapper.markdown 的便签样式（米黄底/旋转/胶带）只给 welcome 用，
   含 #sidebar-talks 的 markdown widget 改回普通卡片样式 */
.widget-wrapper.markdown:has(#sidebar-talks) {
  background: none !important;
  background-color: transparent !important;
  border: none !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  margin: 0 !important;
  padding: 0 0 32px !important; /* 底部 32px，对齐左侧 widget 间距 */
  transform: none !important;
  overflow: visible !important;
  font-family: inherit !important;
}
.widget-wrapper.markdown:has(#sidebar-talks)::before {
  display: none !important;
}
.widget-wrapper.markdown:has(#sidebar-talks) .widget-header .name {
  font-weight: 600 !important;
  color: var(--text-p3, inherit) !important;
  font-size: 15px !important;
  font-family: inherit !important;
}
/* header 做成按钮样式（仿 .widget-wrapper.post-list .item 的 6px 16px + 8px 圆角 + hover 变底色）
   默认无底色（未选中），hover 时显示 bg-a100 底色，点击跳 /shuoshuo/ */
.widget-wrapper.markdown:has(#sidebar-talks) .widget-header {
  padding: 6px 16px !important;
  border-radius: 8px !important;
  cursor: pointer !important;
  transition: background 0.2s ease !important;
}
.widget-wrapper.markdown:has(#sidebar-talks) .widget-header:hover {
  background: var(--bg-a100, rgba(0,0,0,0.04)) !important;
}
.widget-wrapper.markdown:has(#sidebar-talks) .widget-body {
  font-size: 14px !important;
  line-height: 1.5 !important;
  color: inherit !important;
  font-family: inherit !important;
  padding: 0 !important;
}

/* 暗色模式：同样去掉便签暗色版 */
[data-theme="dark"] .widget-wrapper.markdown:has(#sidebar-talks),
[data-theme="dark"] .widget-wrapper.markdown:has(#sidebar-talks) .widget-header .name,
[data-theme="dark"] .widget-wrapper.markdown:has(#sidebar-talks) .widget-body {
  background: none !important;
  color: inherit !important;
}

/* === 日历 widget：继承 welcome 便签样式（旋转+胶带+边框+阴影），仅隐藏标题 ===
   基类 .widget-wrapper.markdown 的便签样式（透明底+棕墨色+LXGW 钢笔体+旋转+胶带）
   会自动生效，但日历是数据展示组件，需要：
   1. 去掉「日历」标题文字
   2. 数字用系统字体不用钢笔体
   3. 文字色覆盖棕墨色，用主题 text 变量（明暗自适应）
   4. 不倾斜（覆盖基类 rotate(-2.5deg)）
   5. 顶部图钉已移除，改用顶部红色撕页条做实物日历感 */
.widget-wrapper.markdown:has(#sidebar-calendar) {
  margin: 18px 8px 20px 8px !important;
  padding: 0 0 16px !important;
  transform: none !important; /* 不倾斜 */
  position: relative !important;
  overflow: hidden !important;
  border-radius: 8px !important;
  background: linear-gradient(180deg, #fdfaf3 0%, #faf5e8 100%) !important;
  box-shadow: 0 2px 10px rgba(120, 90, 40, 0.10), 0 1px 0 rgba(255,255,255,0.8) inset !important;
}
/* 顶部红色撕页条（模仿实物日历的装订红条） */
.widget-wrapper.markdown:has(#sidebar-calendar)::before {
  content: '' !important;
  position: absolute !important;
  top: 0 !important;
  left: 0 !important;
  right: 0 !important;
  height: 6px !important;
  background: linear-gradient(180deg, #d32f2f 0%, #b71c1c 100%) !important;
  border-radius: 8px 8px 0 0 !important;
  box-shadow: 0 1px 2px rgba(183, 28, 28, 0.4) !important;
  z-index: 2 !important;
  pointer-events: none !important;
}
/* 撕页条上的两个装订孔（圆点） */
.widget-wrapper.markdown:has(#sidebar-calendar)::after {
  content: '' !important;
  position: absolute !important;
  top: 1px !important;
  left: 0 !important;
  right: 0 !important;
  height: 4px !important;
  background-image: radial-gradient(circle at 18% 50%, rgba(255,255,255,0.85) 1.2px, transparent 1.8px),
                     radial-gradient(circle at 82% 50%, rgba(255,255,255,0.85) 1.2px, transparent 1.8px) !important;
  background-repeat: no-repeat !important;
  z-index: 3 !important;
  pointer-events: none !important;
}
[data-theme="dark"] .widget-wrapper.markdown:has(#sidebar-calendar) {
  background: linear-gradient(180deg, #2a2620 0%, #232019 100%) !important;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.35), 0 1px 0 rgba(255,255,255,0.04) inset !important;
}
.widget-wrapper.markdown:has(#sidebar-calendar) .widget-header {
  display: none !important; /* 去掉「日历」标题 */
}
.widget-wrapper.markdown:has(#sidebar-calendar) .widget-body {
  padding: 14px 14px 4px !important;
  color: var(--text-p1, inherit) !important; /* 覆盖棕墨色 */
  font-family: inherit !important; /* 不用 LXGW 钢笔体，数字用系统字体 */
  font-size: 14px !important;
  line-height: 1.5 !important;
}
/* === 实物日历样式：月份标题 + 周末红字 + 今天红圈 === */
.cal-title {
  position: relative !important;
  font-family: 'Noto Serif SC', 'Source Han Serif', system-ui, serif !important;
  font-size: 15px !important;
  font-weight: 700 !important;
  color: #5d4037 !important;
  padding: 4px 0 6px !important;
  border-bottom: 1px solid rgba(120, 90, 40, 0.18) !important;
  margin-bottom: 4px !important;
  letter-spacing: 1px !important;
}
[data-theme="dark"] .cal-title {
  color: #d7c9a8 !important;
  border-bottom-color: rgba(215, 201, 168, 0.18) !important;
}
/* 周末（周六周日）表头红色 */
.cal-weekend-head {
  color: #c62828 !important;
}
[data-theme="dark"] .cal-weekend-head {
  color: #ef9a9a !important;
}
/* 周末日期数字红色（非今日） */
.cal-day.cal-weekend:not(.cal-today) .cal-day-num {
  color: #c62828 !important;
}
[data-theme="dark"] .cal-day.cal-weekend:not(.cal-today) .cal-day-num {
  color: #ef9a9a !important;
}
/* 今天：改用红圈标记（替代原来的渐变方块） */
.cal-today {
  background: transparent !important;
  box-shadow: none !important;
  position: relative !important;
}
.cal-today .cal-day-num {
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  width: 24px !important;
  height: 24px !important;
  border-radius: 50% !important;
  background: #d32f2f !important;
  color: #fff !important;
  font-weight: 700 !important;
  box-shadow: 0 1px 3px rgba(211, 47, 47, 0.45) !important;
}
.cal-today .cal-day-lunar {
  color: #d32f2f !important;
  font-weight: 600 !important;
}
.cal-today:hover {
  background: transparent !important;
}

/* === 近期说说：复用 stellar 的 .tag-plugin.timeline .timenode 样式 === */
/* 容器加了 tag-plugin timeline 类后，stellar 自带的左侧竖线 + 圆点 + hover 变色生效。
   这里做几处侧边栏专属调整：去掉 body 卡片框、缩小间距、保持 hover 只变圆点不变文字色 */
.sidebar-talks-container .timenode + .timenode {
  margin-top: 0.5rem !important; /* stellar 默认 1rem 太疏，且 specificity 更高，需 !important */
}
.sidebar-talks-container .body {
  background: none !important;
  box-shadow: none !important;
  border-radius: 0 !important;
  padding: 0 16px 0 4px !important; /* 左 4px 避让竖线，右 16px 对齐左侧 widget 文字到边框间距 */
  margin-top: 2px !important; /* stellar 默认 4px，缩小让 header 和 body 贴近 */
  color: var(--text-a85, #555) !important; /* 跟之前 sidebar-talk-content 颜色一致 */
  font-size: 13px;
  line-height: 1.55;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-decoration: none;
  cursor: pointer;
  transition: none; /* body 不做任何过渡，hover 只让圆点变 */
}
.sidebar-talks-container .body p {
  margin: 0;
  color: inherit;
  background: none !important;
}
/* hover 整个 timenode：整行紫粉渐变底（与 .post-card 一致），不单独给 body/p 设背景 */
.sidebar-talks-container .timenode:hover {
  background: linear-gradient(135deg, rgba(99, 102, 241, 0.10) 0%, rgba(168, 85, 247, 0.06) 50%, rgba(236, 72, 153, 0.08) 100%) !important;
  border-radius: 6px;
}
/* body 文字色继承，链接也保持普通文字色（ stellar 默认 link 色） */
.sidebar-talks-container .body,
.sidebar-talks-container .body p,
.sidebar-talks-container .body:hover,
.sidebar-talks-container .body:hover p,
.sidebar-talks-container .timenode:hover .body,
.sidebar-talks-container .timenode:hover .body p {
  color: var(--text-a85, #555) !important;
  background: none !important;
}
[data-theme="dark"] .sidebar-talks-container .timenode:hover {
  background: linear-gradient(135deg, rgba(99, 102, 241, 0.18) 0%, rgba(168, 85, 247, 0.12) 50%, rgba(236, 72, 153, 0.15) 100%) !important;
}
.sidebar-talks-loading, .sidebar-talks-empty, .sidebar-talks-error {
  font-size: 13px;
  color: var(--text-a60, #888);
  padding: 8px 4px;
  line-height: 1.6;
}
.sidebar-talks-empty a, .sidebar-talks-error a {
  color: var(--text-p3, inherit);
}

/* === 文章卡片「置顶」渐变徽章（替代 stellar 默认 pin 图标） ===
   复用博客强调色 indigo→purple→pink 135deg 渐变（与 .post-card / 日历今日格 / sitemap 竖线一致）
   放在 <h2 class="post-title"> 内、标题文字前 */
.post-title .pin-badge {
  display: inline-block;
  vertical-align: middle;
  background: linear-gradient(135deg, rgb(99, 102, 241), rgb(168, 85, 247), rgb(236, 72, 153));
  color: #fff;
  font-size: 11px;
  font-weight: 700;
  line-height: 1.4;
  letter-spacing: 0.5px;
  padding: 2px 7px;
  border-radius: 4px;
  margin-right: 8px;
  box-shadow: 0 2px 6px rgba(168, 85, 247, 0.35);
  text-shadow: 0 1px 1px rgba(0, 0, 0, 0.15);
}
[data-theme="dark"] .post-title .pin-badge {
  box-shadow: 0 2px 8px rgba(168, 85, 247, 0.45);
}

/* === 置顶文章卡片：cover 由独立块改为整卡片叠加背景，文字浮于其上 ===
   解决 stellar 默认 .post-cover position:static + aspect-ratio:2/1 导致
   卡片高度从 ~165px 膨胀到 ~507px、图与文字上下分开的问题 */
.post-list .post-card:has(.pin-badge) {
  position: relative;
  overflow: hidden;
}
.post-list .post-card:has(.pin-badge) .post-cover {
  position: absolute;
  inset: 0;
  margin: 0;
  width: 100%;
  height: 100%;
  z-index: 0;
}
.post-list .post-card:has(.pin-badge) .post-cover img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  aspect-ratio: auto;
}
.post-list .post-card:has(.pin-badge) .post-cover::after {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(to bottom, rgba(0,0,0,0.10), rgba(0,0,0,0.35));
  z-index: 1;
}
.post-list .post-card:has(.pin-badge) .post-title,
.post-list .post-card:has(.pin-badge) .excerpt,
.post-list .post-card:has(.pin-badge) .meta {
  position: relative;
  z-index: 2;
  color: #fff;
}
.post-list .post-card:has(.pin-badge) .post-title {
  text-shadow: 0 2px 8px rgba(0,0,0,0.85), 0 1px 3px rgba(0,0,0,0.9);
}
.post-list .post-card:has(.pin-badge) .excerpt p,
.post-list .post-card:has(.pin-badge) .meta,
.post-list .post-card:has(.pin-badge) .meta time,
.post-list .post-card:has(.pin-badge) .meta .cap {
  color: rgba(255,255,255,0.95);
  text-shadow: 0 1px 5px rgba(0,0,0,0.9), 0 1px 2px rgba(0,0,0,0.85);
}
.post-list .post-card:has(.pin-badge) .pin-badge {
  box-shadow: 0 2px 8px rgba(0,0,0,0.45);
}
[data-theme="dark"] .post-list .post-card:has(.pin-badge) .post-cover::after {
  background: linear-gradient(to bottom, rgba(0,0,0,0.18), rgba(0,0,0,0.45));
}

/* === RSS social 图标：默认深灰透着黑（和其他 social 一致），hover 显示原本的橙色 ===
   src 用橙色 SVG，filter grayscale+brightness 把彩色压成深灰，hover 时 filter:none 还原彩色 */
a.social[href*="atom.xml"] img {
  filter: grayscale(1) brightness(0.2);
  transition: filter 0.3s ease;
}
a.social[href*="atom.xml"]:hover img {
  filter: none;
}
[data-theme="dark"] a.social[href*="atom.xml"] img {
  filter: grayscale(1) brightness(0.6);
}
[data-theme="dark"] a.social[href*="atom.xml"]:hover img {
  filter: none;
}

/* ==========================================================================
   科技感点睛 - 3 项（v1）：极淡点阵底纹 + 卡片 hover 微动效 + 打字机 slogan 光标
   配套 source/js/typewriter.js（注入 _config.stellar.yml inject.script）
   颜色统一用 Stellar 主题色 var(--theme)，不引入电青独立变量
   尊重 prefers-reduced-motion：关闭位移/流光/打字光标动画
   ========================================================================== */

/* --- 1) 全屏极淡点阵底纹（工程图纸感），固定在最底层，不拦截交互 --- */
body::before {
  content: "";
  position: fixed;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  background-color: transparent;
  background-image: radial-gradient(hsla(220 25% 30% / 0.05) 1px, transparent 1.5px);
  background-size: 22px 22px;
  background-position: -1px -1px;
}
[data-theme="dark"] body::before {
  background-image: radial-gradient(hsla(192 80% 65% / 0.07) 1px, transparent 1.5px);
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) body::before {
    background-image: radial-gradient(hsla(192 80% 65% / 0.07) 1px, transparent 1.5px);
  }
}

/* --- 4) 卡片 hover 微动效：轻微上浮 + 顶部主题色流光描边 --- */
.post-card {
  position: relative;
  overflow: hidden;
}
.post-card::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 2px;
  background: linear-gradient(90deg, transparent, var(--theme), transparent);
  transform: scaleX(0);
  transform-origin: left center;
  opacity: 0;
  transition: transform 0.45s ease, opacity 0.3s ease;
  pointer-events: none;
}
.post-card:hover {
  transform: translateY(-3px);
}
.post-card:hover::before {
  transform: scaleX(1);
  opacity: 0.9;
}

/* --- 6) 打字机 slogan 光标（配合 source/js/typewriter.js 使用） --- */
/* welcome widget 里 markdown 加粗段落（**让消失的留下痕迹...**）会被 typewriter.js
   逐字显示，并加上 .v0-typing 类触发下面的主题色光标 */
.v0-typing::after {
  content: "";
  display: inline-block;
  width: 0.6em;
  height: 1.05em;
  margin-left: 2px;
  vertical-align: text-bottom;
  background: var(--theme);
  box-shadow: 0 0 8px var(--theme-a30);
  animation: v0-caret 1s steps(1) infinite;
}
.v0-typing.v0-typing-done::after {
  animation: v0-caret 1.1s steps(1) infinite;
}
@keyframes v0-caret {
  0%, 50% { opacity: 1; }
  50.01%, 100% { opacity: 0; }
}

/* 尊重「减少动态效果」偏好：关闭卡片上浮/流光/打字光标动画 */
@media (prefers-reduced-motion: reduce) {
  .post-card:hover { transform: none; }
  .post-card::before { display: none; }
  .v0-typing::after { animation: none; }
}
