/* markdown.css 默认:明亮 / 白色背景主题 同时提供:.dark .prose 覆盖(如需启用 class-based dark 模式) 依赖:全局定义的 CSS 变量 --color-primary 和 --color-secondary */ /* 平滑滚动 */ html { scroll-behavior: smooth; } /* ---------- 默认:明亮主题(Light) ---------- */ /* 美化 prose 内容样式 */ .prose { @apply text-gray-800 leading-relaxed; font-feature-settings: "kern" 1, "liga" 1; color: inherit; } /* 标题层级 */ .prose h1 { @apply text-4xl font-bold mt-8 mb-6 pb-4 border-b border-gray-200; background-image: linear-gradient( 90deg, var(--color-primary), var(--color-secondary) ); background-clip: text; -webkit-background-clip: text; color: transparent; background-size: 200% 200%; animation: gradientShift 3s ease infinite; } .prose h2 { @apply text-3xl font-bold text-gray-900 mt-10 mb-5 pb-3 border-b border-gray-200 relative; } .prose h2::before { content: ""; @apply absolute bottom-0 left-0 w-12 h-0.5 rounded-full; background-image: linear-gradient( 90deg, var(--color-primary), var(--color-secondary) ); } .prose h3 { @apply text-2xl font-semibold text-gray-800 mt-8 mb-4; color: rgba(31, 41, 55, 0.95); } .prose h4 { @apply text-xl font-semibold text-gray-700 mt-7 mb-3; } .prose h5 { @apply text-lg font-medium text-gray-700 mt-6 mb-3; } .prose h6 { @apply text-base font-medium text-gray-600 mt-5 mb-2 italic; } /* 段落和文本 */ .prose p { @apply text-gray-700 leading-relaxed mb-5; text-align: justify; } .prose strong { @apply font-bold px-1 rounded; background: linear-gradient( 90deg, rgba(252, 239, 145, 0.22), rgba(251, 158, 58, 0.12) ); color: rgba(31, 41, 55, 0.95); } .prose em { @apply italic px-1 rounded; color: var(--color-secondary); background: rgba(251, 158, 58, 0.08); } .prose del { @apply line-through px-1 rounded; color: #ef4444; background: rgba(239, 68, 68, 0.06); } /* 链接 */ .prose a { @apply font-medium relative transition-all duration-300; color: var(--color-secondary); text-decoration: underline; text-underline-offset: 3px; } .prose a:hover { color: var(--color-primary); transform: translateY(1px); } .prose a::after { content: ""; @apply absolute bottom-0 left-0 w-0 h-0.5 transition-all duration-300; background: linear-gradient( 90deg, var(--color-primary), var(--color-secondary) ); } .prose a:hover::after { @apply w-full; } /* 外部链接图标 */ .prose a[href^="http"]::before { content: "↗"; @apply inline-block mr-1 text-xs translate-y-[2px] opacity-70; } .prose h1 a, .prose h2 a, .prose h3 a, .prose h4 a, .prose h5 a, .prose h6 a { text-decoration: none; } /* 列表 */ .prose ul { @apply list-none space-y-3 mb-6; } .prose ul li { @apply relative pl-6; } .prose ul li::before { content: ""; @apply absolute left-0 top-3 w-1.5 h-1.5 rounded-full; background: var(--color-secondary); } .prose ol { @apply list-decimal list-inside space-y-3 mb-6; counter-reset: list-counter; } .prose ol li { @apply relative pl-8; counter-increment: list-counter; } .prose ol li::before { content: counter(list-counter); @apply absolute left-0 top-0 w-6 h-6 text-white text-xs rounded-full flex items-center justify-center font-bold; background-image: linear-gradient( 135deg, var(--color-primary), var(--color-secondary) ); } /* 代码块(浅色风格) */ .prose pre { @apply rounded-xl p-6 my-8 border shadow-sm overflow-x-auto; border: 1px solid rgba(229, 231, 235, 1); /* gray-200 */ background: linear-gradient(180deg, #ffffff, #f8fafc); box-shadow: 0 6px 18px rgba(15, 23, 42, 0.04); backdrop-filter: blur(6px); } .prose code { @apply px-2 py-1 rounded text-sm font-mono; background: rgba(243, 244, 246, 0.8); /* gray-50-ish */ border: 1px solid rgba(229, 231, 235, 1); color: #0f172a; } .prose pre code { @apply bg-transparent p-0 text-current border-none; color: #0f172a; } /* 引用块(浅色友好) */ .prose blockquote { @apply pl-6 italic text-gray-700 my-8 py-4 pr-6 rounded-r-xl relative overflow-hidden; border-left: 4px solid transparent; border-image: linear-gradient( to bottom, rgba(252, 239, 145, 0.9), rgba(251, 158, 58, 0.9) ) 1; background: linear-gradient( 90deg, rgba(252, 239, 145, 0.06), rgba(255, 255, 255, 0) ); } .prose blockquote::before { content: '"'; @apply absolute -top-4 -left-2 text-6xl opacity-20 font-serif; color: var(--color-primary); } .prose blockquote p { @apply mb-3 last:mb-0 relative z-10; } /* 图片 */ .prose img { @apply rounded-2xl my-8 mx-auto transition-all duration-500 border-2; border-color: rgba(226, 232, 240, 0.6); /* gray-200 */ box-shadow: 0 10px 30px rgba(15, 23, 42, 0.04); } .prose img:hover { @apply scale-[1.02]; border-color: var(--color-secondary); } .prose figure { @apply my-8 text-center; } .prose figcaption { @apply text-sm text-gray-500 mt-3 italic; } /* 表格 */ .prose table { @apply w-full border-collapse my-8 text-sm rounded-xl overflow-hidden shadow-sm; } .prose thead { background-image: linear-gradient( 90deg, rgba(252, 239, 145, 0.18), rgba(251, 158, 58, 0.12) ); } .prose th { @apply border px-6 py-4 text-left font-bold text-gray-800 text-sm uppercase tracking-wider; border-color: rgba(226, 232, 240, 0.6); background: rgba(250, 250, 250, 0.8); } .prose td { @apply border px-6 py-4 text-gray-700; border-color: rgba(226, 232, 240, 0.4); } .prose tr:nth-child(even) { @apply bg-gray-50; } .prose tr:hover { background: rgba(251, 158, 58, 0.06); transition: background 0.2s; } /* 分割线 */ .prose hr { @apply border-gray-200 my-12 relative; } .prose hr::before { content: ""; @apply absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-8 h-8 rounded-full opacity-20; background-image: linear-gradient( 90deg, var(--color-primary), var(--color-secondary) ); } /* 任务列表(checkbox) */ .prose input[type="checkbox"] { @apply mr-3 rounded w-5 h-5 transition-all duration-200; background: #fff; border: 1px solid rgba(226, 232, 240, 0.8); } .prose input[type="checkbox"]:checked { background-image: linear-gradient( 90deg, var(--color-primary), var(--color-secondary) ); border: none; } .prose .task-list-item { @apply list-none pl-0 flex items-start; } .prose .task-list-item input[type="checkbox"] { @apply mt-0.5 flex-shrink-0; } /* 强调和标记 */ .prose mark { @apply px-2 py-1 rounded font-medium; background: linear-gradient( 120deg, rgba(252, 239, 145, 0.22), rgba(251, 158, 58, 0.18) ); color: #8a4b00; } /* 键盘按键 */ .prose kbd { @apply border rounded-lg px-3 py-1.5 text-sm font-mono shadow-sm; background: rgba(247, 249, 250, 0.9); border-color: rgba(226, 232, 240, 0.8); color: #0f172a; } /* 动画定义 */ @keyframes gradientShift { 0%, 100% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } } /* 滚动条(浅色) */ .prose pre::-webkit-scrollbar { @apply h-2; } .prose pre::-webkit-scrollbar-track { @apply rounded-full; background: rgba(243, 244, 246, 0.9); } .prose pre::-webkit-scrollbar-thumb { border-radius: 9999px; background-image: linear-gradient( 90deg, var(--color-primary), var(--color-secondary) ); } /* 移动端优化 */ @media (max-width: 768px) { .prose { @apply text-base; } .prose h1 { @apply text-3xl; } .prose h2 { @apply text-2xl; } .prose h3 { @apply text-xl; } .prose pre { @apply p-4; } } /* 打印优化 */ @media print { .prose { @apply text-black; } .prose a { @apply text-black no-underline; } .prose pre { @apply bg-gray-100 border border-gray-300; } } /* ---------- 可选:深色模式覆盖(.dark class 优先) ---------- */ /* 如果你使用 Tailwind 的 class-based dark 模式(),.dark .prose 会生效 */ /* 也可替换为 @media (prefers-color-scheme: dark) {...} 来自动跟随系统 dark 模式 */ .dark .prose { @apply text-gray-200; color: inherit; } .dark .prose h1 { border-color: rgba(55, 65, 81, 0.5); } .dark .prose h2 { color: #fff; border-color: rgba(55, 65, 81, 0.4); } .dark .prose p { @apply text-gray-300; } .dark .prose pre { border: 1px solid rgba(55, 65, 81, 0.6); background: linear-gradient( 135deg, rgba(17, 24, 39, 0.9), rgba(31, 41, 55, 0.9) ); box-shadow: 0 8px 30px rgba(2, 6, 23, 0.6); } .dark .prose code { background: rgba(31, 41, 55, 0.6); border: 1px solid rgba(55, 65, 81, 0.5); color: #e6eef8; } .dark .prose blockquote { border-image: linear-gradient( to bottom, var(--color-primary), var(--color-secondary) ) 1; background: linear-gradient( 90deg, rgba(255, 255, 255, 0.02), rgba(255, 255, 255, 0) ); color: rgba(255, 255, 255, 0.9); } .dark .prose table thead { background-image: linear-gradient( 90deg, rgba(252, 239, 145, 0.06), rgba(251, 158, 58, 0.04) ); } .dark .prose tr:nth-child(even) { background: rgba(255, 255, 255, 0.02); } .dark .prose td, .dark .prose th { color: rgba(255, 255, 255, 0.9); } .dark .prose img { box-shadow: 0 10px 30px rgba(2, 6, 23, 0.6); border-color: rgba(55, 65, 81, 0.5); } .dark .prose kbd { background: rgba(31, 41, 55, 0.7); border-color: rgba(55, 65, 81, 0.6); color: #e6eef8; } /* 滚动条(深色) */ .dark .prose pre::-webkit-scrollbar-track { background: rgba(17, 24, 39, 0.8); } .dark .prose pre::-webkit-scrollbar-thumb { background-image: linear-gradient( 90deg, var(--color-primary), var(--color-secondary) ); } @media (prefers-color-scheme: dark) { .prose { @apply text-gray-200; color: inherit; } .prose h1 { border-color: rgba(55, 65, 81, 0.5); } .prose h2 { color: #fff; border-color: rgba(55, 65, 81, 0.4); } .prose p { @apply text-gray-300; } .prose pre { border: 1px solid rgba(55, 65, 81, 0.6); background: linear-gradient( 135deg, rgba(17, 24, 39, 0.9), rgba(31, 41, 55, 0.9) ); box-shadow: 0 8px 30px rgba(2, 6, 23, 0.6); } .prose code { background: rgba(31, 41, 55, 0.6); border: 1px solid rgba(55, 65, 81, 0.5); color: #e6eef8; } .prose blockquote { border-image: linear-gradient( to bottom, var(--color-primary), var(--color-secondary) ) 1; background: linear-gradient( 90deg, rgba(255, 255, 255, 0.02), rgba(255, 255, 255, 0) ); color: rgba(255, 255, 255, 0.9); } .prose table thead { background-image: linear-gradient( 90deg, rgba(252, 239, 145, 0.06), rgba(251, 158, 58, 0.04) ); } .prose tr:nth-child(even) { background: rgba(255, 255, 255, 0.02); } .prose td, .prose th { color: rgba(255, 255, 255, 0.9); } .prose img { box-shadow: 0 10px 30px rgba(2, 6, 23, 0.6); border-color: rgba(55, 65, 81, 0.5); } .prose kbd { background: rgba(31, 41, 55, 0.7); border-color: rgba(55, 65, 81, 0.6); color: #e6eef8; } /* 滚动条(深色) */ .prose pre::-webkit-scrollbar-track { background: rgba(17, 24, 39, 0.8); } .prose pre::-webkit-scrollbar-thumb { background-image: linear-gradient( 90deg, var(--color-primary), var(--color-secondary) ); } }