@import "tailwindcss"; @custom-variant dark (&:where(.dark, .dark *)); @theme { /* 覆盖 Tailwind v4 默认 --font-sans(ui-sans-serif, system-ui, sans-serif, ...): 默认栈不含 CJK sans,font-sans 类一旦生效,body 的中文字体栈会被绕过, 中文 fallback 到系统衬线体。这里对齐 body 的 CJK sans 栈,根治全项目。 */ --font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif, 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei'; --font-serif: 'Source Serif 4', 'Noto Serif SC', 'Source Han Serif SC', 'Songti SC', Georgia, serif; /* Catppuccin Latte(亮色)。语义 token → 调色板角色: theme=base entry=mantle primary=text secondary=subtext1 tertiary=overlay0 content=subtext0 code-block=crust code-bg=surface0 border=surface1 accent=green accent-2=teal(主/次强调色) */ --color-paper-theme: #eff1f5; --color-paper-entry: #e6e9ef; --color-paper-primary: #4c4f69; --color-paper-secondary: #5c5f77; --color-paper-tertiary: #9ca0b0; --color-paper-content: #6c6f85; --color-paper-code-block: #dce0e8; --color-paper-code-bg: #ccd0da; --color-paper-border: #bcc0cc; --color-paper-accent: #40a02b; --color-paper-accent-soft: #ccd0da; --color-paper-accent-2: #179299; --color-paper-accent-2-soft: #ccd0da; --radius-paper: 8px; --gap-paper: 24px; --content-gap-paper: 20px; --nav-width-paper: 1024px; --main-width-paper: 720px; } @layer base { html { scroll-behavior: smooth; background-color: var(--color-paper-theme); } body { background-color: var(--color-paper-theme); color: var(--color-paper-primary); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } @keyframes page-enter { 0% { opacity: 0; transform: translateY(16px) scale(0.995); } 100% { opacity: 1; transform: none; } } .animate-page-enter { animation: page-enter 400ms cubic-bezier(0.22, 1, 0.36, 1) both; } /* Popover / 确认框淡入缩放(比 page-enter 更轻、更快) */ @keyframes popover-enter { 0% { opacity: 0; transform: translateX(-50%) scale(0.95); } 100% { opacity: 1; transform: translateX(-50%) scale(1); } } .animate-popover-enter { animation: popover-enter 150ms cubic-bezier(0.22, 1, 0.36, 1) both; } /* Minimalist custom scrollbars */ * { scrollbar-width: thin; scrollbar-color: var(--color-paper-border) transparent; } ::-webkit-scrollbar { width: 6px; height: 6px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background-color: var(--color-paper-border); border-radius: 10px; } ::-webkit-scrollbar-thumb:hover { background-color: var(--color-paper-tertiary); } .dark { /* Catppuccin Mocha(暗色)。accent-soft 带绿调、accent-2-soft 带 teal 调, 在 surface0 暗底上透出微弱主/次强调色。 */ --color-paper-theme: #1e1e2e; --color-paper-entry: #181825; --color-paper-primary: #cdd6f4; --color-paper-secondary: #bac2de; --color-paper-tertiary: #6c7086; --color-paper-content: #a6adc8; --color-paper-code-block: #313244; --color-paper-code-bg: #313244; --color-paper-border: #45475a; --color-paper-accent: #a6e3a1; --color-paper-accent-soft: #1e2e22; --color-paper-accent-2: #94e2d5; --color-paper-accent-2-soft: #1e2a28; } } @layer components { .post-single { margin: 0 auto; } .post-header { margin: 48px auto 48px auto; display: flex; flex-direction: column; gap: 16px; } .post-title { font-size: clamp(2.5rem, 6vw, 4.5rem); font-weight: 800; line-height: 1.1; color: var(--color-paper-primary); word-break: break-word; letter-spacing: -0.04em; margin: 0; } .post-description { color: var(--color-paper-secondary); font-size: 1.125rem; font-weight: 500; line-height: 1.7; margin: 0; } .post-meta { margin-top: 8px; color: var(--color-paper-tertiary); font-size: 15px; display: flex; align-items: center; gap: 0.75rem; flex-wrap: wrap; font-weight: 500; } .post-meta a { color: var(--color-paper-secondary); text-decoration-style: dotted; text-underline-offset: 0.3rem; text-decoration: underline; } .post-meta a:hover { color: var(--color-paper-primary); } .breadcrumbs { display: flex; flex-wrap: wrap; align-items: center; gap: 0.2rem; color: var(--color-paper-secondary); font-size: 14px; margin-bottom: 10px; } .breadcrumbs a { font-size: 16px; color: var(--color-paper-primary); } .breadcrumbs a:hover { text-decoration: underline; text-underline-offset: 0.2rem; } .entry-hint { display: inline-flex; margin-left: 0.5rem; color: var(--color-paper-secondary); } details.toc { margin-bottom: var(--content-gap-paper); background: var(--color-paper-code-bg); border-radius: var(--radius-paper); border: 1px solid var(--color-paper-border); } details.toc summary { padding: 0.3rem 1.2rem; border-radius: var(--radius-paper); cursor: pointer; display: list-item; width: 100%; user-select: none; color: var(--color-paper-primary); } details.toc .title { display: inline; font-weight: 500; margin-inline-start: 0.2rem; } details.toc .inner { margin: 0 2.4rem; padding-bottom: 0.6rem; } details.toc ul { list-style: none; padding: 0; margin: 0; } details.toc li { margin: 0.3rem 0; } details.toc a { color: var(--color-paper-secondary); text-decoration: none; font-size: 14px; } details.toc a:hover { color: var(--color-paper-primary); text-decoration: underline; text-underline-offset: 0.3rem; } details.toc li ul { margin-inline-start: var(--gap-paper); } details { interpolate-size: allow-keywords; } details::details-content { height: 0; opacity: 0; overflow: clip; transition: height 150ms ease, opacity 150ms ease, content-visibility 150ms allow-discrete; } details[open]::details-content { height: auto; opacity: 1; } .entry-cover { margin-bottom: var(--content-gap-paper); } /* 封面用 blur-img 结构:去 margin、保持圆角,内层 img cover 填充 */ .entry-cover .blur-img { margin: 0; border-radius: 2rem; overflow: hidden; } .entry-cover img { width: 100%; height: 100%; object-fit: cover; } .post-content { color: var(--color-paper-content); margin: 30px 0; } .md-content h1 { margin: 40px auto 32px; font-size: 40px; color: var(--color-paper-primary); letter-spacing: -0.01em; } .md-content h2 { margin: 32px auto 24px; font-size: 32px; color: var(--color-paper-primary); letter-spacing: -0.01em; } .md-content h3 { margin: 24px 0 16px; font-size: 24px; color: var(--color-paper-primary); } .md-content h4 { margin: 24px 0 16px; font-size: 16px; color: var(--color-paper-primary); } .md-content h5 { margin: 24px 0 16px; font-size: 14px; color: var(--color-paper-primary); } .md-content h6 { margin: 24px 0 16px; font-size: 12px; color: var(--color-paper-primary); } /* 锚点目标偏移:scrollIntoView / 原生 fragment-scroll 落点避开 80px sticky header。 [id] 限定只作用于带锚点 id 的标题;6rem = 80px header + 16px 呼吸空间。 */ .md-content :is(h1, h2, h3, h4, h5, h6)[id] { scroll-margin-top: 6rem; } .md-content a:not(.anchor) { text-underline-offset: 0.3rem; text-decoration: underline; color: var(--color-paper-accent); } .md-content a:not(.anchor):hover { color: var(--color-paper-accent-2); } .md-content p { margin-bottom: var(--content-gap-paper); line-height: 1.85; } .md-content p:last-child { margin-bottom: 0; } .md-content blockquote { margin: 1rem 0; padding-inline-start: 1rem; border-inline-start: 0.3rem solid var(--color-paper-content); color: var(--color-paper-secondary); } .md-content blockquote p:last-child { margin-bottom: 0; } .md-content ol, .md-content ul { padding-inline-start: 1.25rem; margin-bottom: var(--content-gap-paper); } /* Tailwind Preflight 把 list-style 清成 none,这里恢复被清掉的 marker。 * 任务列表项(含 checkbox 的 li)另有规则覆盖为 none,不受影响。 */ .md-content ul { list-style-type: disc; } .md-content ol { list-style-type: decimal; } .md-content li { margin-top: 0.3rem; } .md-content li p { margin-bottom: 0; } /* 任务列表:pulldown-cmark 把 - [ ] / - [x] 渲染成裸
  • … * (无