@import "tailwindcss"; @custom-variant dark (&:where(.dark, .dark *)); @theme { --font-serif: 'Source Serif 4', 'Noto Serif SC', 'Source Han Serif SC', 'Songti SC', Georgia, serif; --color-paper-theme: #faf9f6; --color-paper-entry: #ffffff; --color-paper-primary: #1c1917; --color-paper-secondary: #78716c; --color-paper-tertiary: #d6d3d1; --color-paper-content: #292524; --color-paper-code-block: #1c1917; --color-paper-code-bg: #f5f4f0; --color-paper-border: #e7e5e0; --color-paper-accent: #5c7a5e; --color-paper-accent-soft: #e8f0e8; --radius-paper: 8px; --gap-paper: 24px; --content-gap-paper: 20px; --nav-width-paper: 1024px; --main-width-paper: 720px; } @layer base { html { scroll-behavior: smooth; } 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; transition: background-color 0.3s ease, color 0.3s ease; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .dark { --color-paper-theme: #141416; --color-paper-entry: #1e1f22; --color-paper-primary: #e7e5df; --color-paper-secondary: #8c8981; --color-paper-tertiary: #3a3a3d; --color-paper-content: #d4d2cc; --color-paper-code-block: #1e1f22; --color-paper-code-bg: #28292d; --color-paper-border: #2a2b2e; --color-paper-accent: #7da97f; --color-paper-accent-soft: #1e2e1e; } } @layer components { .post-single { margin: 0 auto; } .post-header { margin: 24px auto var(--content-gap-paper) auto; } .post-title { font-size: 40px; line-height: 1.2; color: var(--color-paper-primary); word-break: break-word; letter-spacing: -0.02em; } .post-description { margin-top: 10px; color: var(--color-paper-secondary); font-size: 16px; line-height: 1.7; } .post-meta { margin-top: 5px; color: var(--color-paper-secondary); font-size: 14px; display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; } .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); } .entry-cover img { border-radius: var(--radius-paper); width: 100%; height: auto; } .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); } .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: #4a6249; } .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); } .md-content li { margin-top: 0.3rem; } .md-content li p { margin-bottom: 0; } .md-content hr { margin: 30px 0; height: 2px; background: var(--color-paper-tertiary); border: 0; } .md-content table { margin-bottom: var(--content-gap-paper); width: 100%; border-collapse: collapse; } .md-content table th, .md-content table td { min-width: 80px; padding: 6px 13px; line-height: 1.5; border: 1px solid var(--color-paper-border); } .md-content table th { text-align: start; font-weight: 600; background: var(--color-paper-code-bg); } .md-content img { border-radius: var(--radius-paper); margin: 1rem 0; max-width: 100%; height: auto; } .md-content-img-zoomable { cursor: zoom-in; transition: opacity 0.2s ease-out; } .md-content-img-zoomable:hover { opacity: 0.9; } .md-content iframe { max-width: 100%; border-radius: var(--radius-paper); } .md-content code { padding: 0.2rem 0.3rem; font-size: 0.85em; line-height: 1.5; background: var(--color-paper-code-bg); border-radius: 0.2rem; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; } .md-content pre { position: relative; margin-bottom: var(--content-gap-paper); background: var(--color-paper-code-block); border-radius: var(--radius-paper); overflow-x: auto; } .md-content pre code { display: block; padding: 16px; background: transparent; border-radius: 0; overflow-x: auto; white-space: pre; font-size: 0.85em; line-height: 1.6; } .md-content pre code span { display: inline !important; } .copy-code { display: none; position: absolute; top: 8px; right: 8px; color: rgba(255, 255, 255, 0.8); background: rgba(78, 78, 78, 0.8); border-radius: var(--radius-paper); padding: 4px 8px; font-size: 12px; user-select: none; cursor: pointer; border: none; font-family: inherit; transition: background 0.2s ease-out; } .copy-code:hover { background: rgba(92, 122, 94, 0.9); } pre:hover .copy-code, .highlight:hover .copy-code { display: block; } .anchor { display: none; text-decoration: none; color: var(--color-paper-secondary); } .md-content h1:hover .anchor, .md-content h2:hover .anchor, .md-content h3:hover .anchor, .md-content h4:hover .anchor, .md-content h5:hover .anchor, .md-content h6:hover .anchor { display: inline-flex; margin-inline-start: 0.5em; font-weight: 500; user-select: none; text-decoration: none; color: var(--color-paper-secondary); } .anchor:hover { color: var(--color-paper-primary) !important; } .post-footer { margin-top: var(--content-gap-paper); } .post-tags { display: flex; flex-wrap: wrap; gap: 10px; list-style: none; padding: 0; margin: 0 0 var(--content-gap-paper) 0; } .post-tags li { display: inline-block; } .post-tags a { display: block; padding: 0 14px; color: var(--color-paper-secondary); font-size: 14px; line-height: 34px; background: var(--color-paper-code-bg); border-radius: var(--radius-paper); border: 1px solid var(--color-paper-border); text-decoration: none; transition: all 0.2s ease-out; } .post-tags a:hover { background: var(--color-paper-accent-soft); border-color: var(--color-paper-accent); color: var(--color-paper-accent); } .paginav { display: flex; border-radius: var(--radius-paper); background: var(--color-paper-code-bg); border: 1px solid var(--color-paper-border); overflow: hidden; } .paginav a { width: 50%; display: flex; flex-direction: column; gap: 0.5rem; padding: 0.8rem; text-decoration: none; color: var(--color-paper-primary); transition: background 0.2s ease-out; } .paginav a:hover { background: var(--color-paper-border); } .paginav .next { margin-inline-start: auto; text-align: right; } .paginav .title { letter-spacing: 1px; font-size: 0.8rem; color: var(--color-paper-secondary); } .paginav .post-title-nav { font-size: 16px; font-weight: 500; } .back-to-home { margin-top: calc(var(--content-gap-paper) * 1.5); padding-top: var(--content-gap-paper); border-top: 1px solid var(--color-paper-border); } .back-to-home a, .back-to-home button { color: var(--color-paper-secondary); font-size: 14px; text-decoration: none; background: none; border: none; cursor: pointer; padding: 0; font-family: inherit; } .back-to-home a:hover, .back-to-home button:hover { color: var(--color-paper-primary); text-decoration: underline; text-underline-offset: 0.3rem; } .image-viewer-overlay { position: fixed; inset: 0; z-index: 50; background: rgba(0, 0, 0, 0.92); display: flex; align-items: center; justify-content: center; padding: 2rem; animation: fadeIn 0.2s ease-out; } .image-viewer-content { position: relative; max-width: 90vw; max-height: 90vh; } .image-viewer-img { max-width: 100%; max-height: 90vh; object-fit: contain; border-radius: var(--radius-paper); } .image-viewer-close { position: absolute; top: -2.5rem; right: 0; background: rgba(255, 255, 255, 0.2); border: none; color: white; font-size: 1.5rem; width: 2rem; height: 2rem; border-radius: 50%; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.2s ease-out; } .image-viewer-close:hover { background: rgba(255, 255, 255, 0.4); } .md-image-lightbox-overlay { position: fixed; inset: 0; z-index: 50; background: rgba(0, 0, 0, 0.92); display: flex; align-items: center; justify-content: center; padding: 2rem; animation: fadeIn 0.2s ease-out; } .md-image-lightbox-content { position: relative; max-width: 90vw; max-height: 90vh; } .md-image-lightbox-content img { max-width: 100%; max-height: 90vh; object-fit: contain; border-radius: var(--radius-paper); } .md-image-lightbox-close { position: absolute; top: -2.5rem; right: 0; background: rgba(255, 255, 255, 0.2); border: none; color: white; font-size: 1.5rem; width: 2rem; height: 2rem; border-radius: 50%; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.2s ease-out; } .md-image-lightbox-close:hover { background: rgba(255, 255, 255, 0.4); } .post-card-cover { overflow: hidden; border-radius: var(--radius-paper); } .post-card-cover img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.3s ease-out; } .post-card-cover:hover img { transform: scale(1.05); } a.accent-link { color: var(--color-paper-accent); text-decoration: none; transition: color 0.2s ease-out; } a.accent-link:hover { color: var(--color-paper-primary); } .btn-primary { display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.5rem 1.25rem; font-size: 0.875rem; font-weight: 500; color: white; background: var(--color-paper-accent); border-radius: 9999px; border: none; cursor: pointer; transition: all 0.2s ease-out; } .btn-primary:hover { filter: brightness(1.1); transform: translateY(-1px); } .btn-primary:active { transform: translateY(0) scale(0.98); } .post-card-accent { position: relative; } .post-card-accent::after { content: ''; position: absolute; bottom: 0; left: 0; width: 0; height: 2px; background: var(--color-paper-accent); transition: width 0.3s ease-out; } .post-card-accent:hover::after { width: 100%; } } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @media screen and (max-width: 768px) { .post-title { font-size: 32px; } .md-content h1 { font-size: 32px; } .md-content h2 { font-size: 26px; } .md-content h3 { font-size: 20px; } .paginav { flex-direction: column; } .paginav a { width: 100%; } .paginav .next { margin-inline-start: 0; text-align: left; border-top: 1px solid var(--color-paper-border); } details.toc .inner { margin: 0 1rem; } } @keyframes pageEnter { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } } .page-enter { animation: pageEnter 0.15s ease-out; } @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } details::details-content { transition: none; } .page-enter { animation: none; } }