diff --git a/app/assets/css/main.css b/app/assets/css/main.css index 526efe0..9b6640b 100644 --- a/app/assets/css/main.css +++ b/app/assets/css/main.css @@ -1,4 +1,4 @@ -@import "./markdown.css"; +/* @import "./markdown.css"; */ @import "tailwindcss"; @import "@nuxt/ui"; diff --git a/app/assets/css/markdown.css b/app/assets/css/markdown.css deleted file mode 100644 index b9c4e07..0000000 --- a/app/assets/css/markdown.css +++ /dev/null @@ -1,565 +0,0 @@ -/* 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) - ); - } -} diff --git a/app/layouts/default.vue b/app/layouts/default.vue index b063a53..68775e6 100644 --- a/app/layouts/default.vue +++ b/app/layouts/default.vue @@ -52,7 +52,9 @@ - +
+ +
diff --git a/app/pages/index.vue b/app/pages/index.vue index cd68686..3e069c8 100644 --- a/app/pages/index.vue +++ b/app/pages/index.vue @@ -36,6 +36,10 @@