基于你的需求,以下是移除时间估算后的完整技术整合方案:
astro-theme-reimu/ # 上游基础(功能层) └── src/ ├── components/ # 原子组件(25个文件) │ ├── base/ # 基础UI原子 │ ├── content/ # 内容展示 │ ├── effects/ # 视觉特效 │ └── widgets/ # 功能小部件 ├── layouts/ # 布局系统(8个文件) ├── pages/ # 路由页面(15个文件) ├── content/ # 内容集合(配置) ├── lib/ # 工具库(10个文件) ├── styles/ # 主题系统(5个文件) └── types/ # 类型定义(2个文件)
60个 Astro 文件分配:
public/ ├── images/ │ ├── covers/ # 文章封面 webp(响应式) │ │ ├── default/ │ │ ├── anime/ │ │ └── games/ │ ├── ui/ # UI 元素 webp │ │ ├── buttons/ │ │ ├── cards/ │ │ └── backgrounds/ │ ├── effects/ # 特效资源 webp │ │ ├── sakura/ │ │ ├── particles/ │ │ └── glow/ │ └── avatars/ # 头像 webp └── fonts/ # 字体文件(如需)
创建 src/components/base/Image.astro 统一处理 webp:
--- interface Props { src: string; // 相对于 /images 的路径 alt: string; width?: number; height?: number; format?: 'webp' | 'png' | 'auto'; responsive?: boolean; // 是否生成 srcset lazy?: boolean; // 懒加载 effect?: 'sakura' | 'glow' | 'none'; // 视觉特效类名 } const { src, alt, width, height, responsive = true, lazy = true, effect = 'none' } = Astro.props; // 构建完整路径 const fullSrc = src.startsWith('http') ? src : `/images/${src}`; // 响应式图片生成逻辑(保持上游的 srcset 能力) const srcSet = responsive ? generateSrcSet(fullSrc) : null; --- <picture class:list={[`img-effect-${effect}`]}> <source srcset={srcSet || fullSrc} type="image/webp" /> <img src={fullSrc} alt={alt} width={width} height={height} loading={lazy ? 'lazy' : 'eager'} decoding="async" /> </picture> <style> .img-effect-sakura { /* 樱花遮罩效果 */ } .img-effect-glow { /* 发光边框效果 */ } </style>
// src/lib/covers.ts
// 保持你的随机封面逻辑,但扩展为分类管理
export interface CoverSet {
category: string;
images: string[]; // webp 路径数组
fallback: string;
}
export const coverRegistry: CoverSet[] = [
{
category: 'default',
images: import.meta.glob('/public/images/covers/default/*.webp', { eager: true }),
fallback: '/images/covers/default/fallback.webp'
},
// 其他分类...
];
export function getRandomCover(category?: string): string {
// 保持你的随机选择逻辑
}
这些组件替代上游的默认组件,应用你的博丽灵梦配色和动画:
| 文件名 | 功能 | 特性 |
|---|---|---|
Button.astro | 按钮组件 | 渐变红金配色、发光hover效果 |
Card.astro | 卡片容器 | 毛玻璃效果、悬浮动画 |
Tag.astro | 标签组件 | 丝带红配色、圆角全边 |
Avatar.astro | 头像组件 | 金边框、发光效果 |
Divider.astro | 分割线 | 渐变红透明、樱花装饰 |
Badge.astro | 徽标 | 灵梦红底、金色文字 |
Button.astro 示例(保持你的样式命名):
--- interface Props { variant?: 'primary' | 'secondary' | 'ghost'; size?: 'sm' | 'md' | 'lg'; glow?: boolean; // 是否启用发光效果 href?: string; // 作为链接使用 } const { variant = 'primary', size = 'md', glow = false, href } = Astro.props; // 映射到你的 tailwind 配置 const variants = { primary: 'bg-reimu-primary text-white shadow-anime hover:shadow-anime-lg', secondary: 'bg-reimu-secondary text-reimu-dark', ghost: 'bg-transparent border-2 border-reimu-primary text-reimu-primary' }; --- {href ? ( <a href={href} class:list={['btn', variants[variant], size, { 'animate-glow': glow }]}> <slot /> </a> ) : ( <button class:list={['btn', variants[variant], size, { 'animate-glow': glow }]}> <slot /> </button> )}
博客核心展示组件,60个文件中的主要部分:
| 文件名 | 功能 | 上游功能保留 |
|---|---|---|
BlogCard.astro | 文章卡片 | 封面、标签、阅读时间 |
PostHeader.astro | 文章头图区 | 响应式头图、分类标签 |
PostContent.astro | 文章内容区 | MDX渲染、代码高亮 |
PostFooter.astro | 文章底部 | 版权、分享、导航 |
Toc.astro | 目录导航 | 滚动监听、高亮当前 |
Comment.astro | 评论系统 | Waline/Valine/Twikoo 多后端支持 |
ShareButtons.astro | 分享按钮 | 微信/微博/QQ |
Copyright.astro | 版权信息 | 知识共享协议 |
从你的 global.css 提取的独立特效组件:
src/components/effects/ ├── SakuraFall.astro # 樱花飘落(全屏背景) ├── ParticleCursor.astro # 鼠标粒子跟随 ├── GlowBorder.astro # 发光边框包装器 ├── ReimuRibbon.astro # 灵梦丝带装饰 ├── FloatAnimation.astro # 悬浮动画包装器 └── ThemeTransition.astro # 主题切换过渡动画
SakuraFall.astro:
--- // 樱花飘落特效组件 interface Props { count?: number; // 樱花数量 zIndex?: number; } const { count = 50, zIndex = 0 } = Astro.props; --- <div class="sakura-container" style={`z-index: ${zIndex}`} data-count={count}> <!-- 客户端 JS 动态生成樱花元素 --> </div> <script> // 保持你的 sakura-fall keyframes 动画逻辑 // 但封装为可配置组件 </script> <style> .sakura-container { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; overflow: hidden; } /* 保持你的 @keyframes sakura-fall 定义 */ </style>
8个核心布局文件,对应不同页面类型:
src/layouts/ ├── BaseLayout.astro # 基础HTML结构、元信息 ├── BlogLayout.astro # 博客列表页布局 ├── PostLayout.astro # 单篇文章布局(含TOC、评论) ├── ArchiveLayout.astro # 归档页时间线布局 ├── CategoryLayout.astro # 分类页面布局 ├── TagLayout.astro # 标签云页面布局 ├── PageLayout.astro # 独立页面布局(关于页等) └── ErrorLayout.astro # 404等错误页面
PostLayout.astro 结构:
--- import BaseLayout from './BaseLayout.astro'; import SakuraFall from '../components/effects/SakuraFall.astro'; import PostHeader from '../components/content/PostHeader.astro'; import Toc from '../components/content/Toc.astro'; import Comment from '../components/content/Comment.astro'; const { frontmatter, headings } = Astro.props; --- <BaseLayout title={frontmatter.title} description={frontmatter.description}> <!-- 全局特效 --> <SakuraFall count={30} zIndex={0} /> <div class="post-container reimu-gradient-bg"> <!-- 文章头部 --> <PostHeader title={frontmatter.title} date={frontmatter.date} cover={frontmatter.cover} tags={frontmatter.tags} categories={frontmatter.categories} /> <div class="post-grid"> <!-- 侧边栏TOC(桌面端) --> <aside class="toc-sidebar"> <Toc headings={headings} /> </aside> <!-- 文章内容 --> <article class="post-content card-anime"> <slot /> </article> </div> <!-- 文章底部 --> <PostFooter copyright={frontmatter.copyright !== false} share={frontmatter.share !== false} /> <!-- 评论区 --> {frontmatter.comment !== false && <Comment />} </div> </BaseLayout>
15个页面文件,覆盖完整博客功能:
src/pages/ ├── index.astro # 首页(Hero + 文章列表) ├── about.astro # 关于页面 ├── 404.astro # 错误页面 ├── rss.xml.js # RSS订阅(保留上游功能) ├── search.astro # 搜索页面(Fuse.js) ├── blog/ │ ├── index.astro # 博客列表(分页) │ ├── [slug].astro # 文章详情(动态路由) │ └── page/[page].astro # 分页路由 ├── archives/ │ ├── index.astro # 归档首页(按年份) │ └── [year].astro # 年度归档 ├── categories/ │ ├── index.astro # 分类列表 │ └── [category].astro # 单分类页面 └── tags/ ├── index.astro # 标签云 ├── [tag].astro # 单标签页面 └── page/[page].astro # 标签分页
完整保留上游功能配置,增加 KimiAstro 视觉配置:
// src/config.ts
import type { ReimuConfig } from './types/config';
export const config: ReimuConfig = {
// 站点信息(上游标准)
site: {
title: 'My Blog',
subtitle: '基于 KimiAstro 的主题',
description: '博丽灵梦风格的 Astro 博客',
author: 'Paimon1999',
language: 'zh-CN',
url: 'https://example.com',
},
// 视觉主题配置(KimiAstro 扩展)
theme: {
// 颜色方案
colors: {
primary: '#E53935', // 灵梦红
secondary: '#FF8A80', // 浅红
accent: '#FFCdd2', // 粉红
gold: '#FFD700', // 金色装饰
dark: '#B71C1C', // 深红
},
// 特效开关(对应你的 global.css 效果)
effects: {
sakura: true, // 樱花飘落
particles: true, // 鼠标粒子
glow: true, // 发光效果
float: true, // 悬浮动画
},
// 封面配置(对应你的 covers.ts)
covers: {
default: '/images/covers/default/',
categories: {
'技术': '/images/covers/tech/',
'生活': '/images/covers/life/',
'动漫': '/images/covers/anime/',
}
}
},
// 功能配置(上游完整保留)
features: {
// 搜索配置
search: {
enable: true,
type: 'fuse', // fuse | algolia
},
// 评论系统(多后端支持)
comments: {
enable: true,
provider: 'waline', // waline | valine | twikoo | giscus
config: {
// 对应上游各评论系统配置
}
},
// 分析统计
analytics: {
baidu: '',
google: '',
clarity: '',
},
// 其他上游功能...
toc: true,
readingTime: true,
wordCount: true,
copyright: true,
share: true,
},
// 导航菜单(上游标准)
menu: [
{ name: 'home', url: '/', icon: 'ri-home-line' },
{ name: 'archives', url: '/archives', icon: 'ri-archive-line' },
{ name: 'categories', url: '/categories', icon: 'ri-folder-line' },
{ name: 'tags', url: '/tags', icon: 'ri-price-tag-3-line' },
{ name: 'about', url: '/about', icon: 'ri-user-line' },
],
// 侧边栏小部件(上游 widgets 配置)
widgets: ['author', 'categories', 'tags', 'recent', 'archive'],
// 社交链接
social: {
github: '',
twitter: '',
email: '',
},
};
export default config;
export interface ReimuConfig {
site: SiteConfig;
theme: ThemeConfig;
features: FeaturesConfig;
menu: MenuItem[];
widgets: string[];
social: SocialConfig;
}
export interface ThemeConfig {
colors: {
primary: string;
secondary: string;
accent: string;
gold: string;
dark: string;
};
effects: {
sakura: boolean;
particles: boolean;
glow: boolean;
float: boolean;
};
covers: {
default: string;
categories: Record<string, string>;
};
}
// ... 其他类型定义
将你的 global.css 变量化,支持主题切换:
/* src/styles/theme.css */
:root {
/* KimiAstro 基础色(亮色模式) */
--reimu-primary: #E53935;
--reimu-secondary: #FF8A80;
--reimu-accent: #FFCdd2;
--reimu-dark: #B71C1C;
--reimu-gold: #FFD700;
/* 背景渐变(来自你的 body 样式) */
--bg-gradient-start: #FAFAFA;
--bg-gradient-mid: #FFF5F5;
--bg-gradient-end: #FFEBEE;
/* 动画时长 */
--transition-fast: 0.2s;
--transition-normal: 0.3s;
--transition-slow: 0.5s;
/* 阴影(来自你的 tailwind config) */
--shadow-anime: 0 4px 20px rgba(229, 57, 53, 0.3);
--shadow-anime-lg: 0 8px 40px rgba(229, 57, 53, 0.4);
}
/* 暗色模式(自动继承上游的暗黑逻辑) */
[data-theme='dark'] {
--reimu-primary: #FF5252;
--bg-gradient-start: #1A1A1A;
--bg-gradient-mid: #2D1F1F;
--bg-gradient-end: #1F1F1F;
}
/* 来自你的 global.css 的工具类提取 */
@layer utilities {
.reimu-gradient-bg {
background: linear-gradient(135deg, var(--bg-gradient-start) 0%, var(--bg-gradient-mid) 50%, var(--bg-gradient-end) 100%);
}
.text-gradient {
background: linear-gradient(135deg, var(--reimu-primary), var(--reimu-gold));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.card-anime {
background: rgba(255, 255, 255, 0.9);
backdrop-filter: blur(10px);
box-shadow: var(--shadow-anime);
border: 1px solid rgba(229, 57, 53, 0.1);
border-radius: 1rem;
transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}
.card-anime:hover {
transform: translateY(-5px);
box-shadow: var(--shadow-anime-lg);
}
}
确保上游所有功能在 KimiAstro 风格下完整实现:
| 功能模块 | 实现文件 | KimiAstro 风格化 |
|---|---|---|
| 搜索 | src/pages/search.astro | 红金配色搜索框、发光聚焦效果 |
| 评论 | src/components/content/Comment.astro | 毛玻璃评论卡片 |
| TOC | src/components/content/Toc.astro | 丝带红激活指示器 |
| 分页 | src/components/widgets/Pagination.astro | 灵梦符卡风格分页按钮 |
| 归档 | src/pages/archives/[year].astro | 时间线红线设计 |
| 标签云 | src/pages/tags/index.astro | 浮动标签球效果 |
| RSS | src/pages/rss.xml.js | 保持上游生成逻辑 |
| SEO | src/components/base/SEO.astro | 完整 OpenGraph/Twitter Card |
| i18n | src/lib/i18n/ | 中日英三语支持(博丽灵梦术语表) |
| Loading | src/components/effects/Preloader.astro | "少女祈祷中..."加载动画 |
public/images/docs/ ├── README.md # 快速开始 ├── CONFIG.md # 配置详解(对应 config.ts) ├── COMPONENTS.md # 组件使用文档 ├── THEME.md # 主题定制指南(颜色、特效) ├── WEBP.md # 图片资源管理规范 ├── MIGRATION.md # 从上游主题迁移指南 └── API.md # 工具函数API
关键文档内容:
CONFIG.md 示例:
## 主题特效配置
### sakura (boolean)
启用樱花飘落背景效果。
- 类型: `boolean`
- 默认: `true`
- 对应 CSS: `.sakura` keyframes
### particles (boolean)
启用鼠标跟随粒子效果。
- 注意: 移动端自动禁用(性能考虑)
### covers (Object)
文章封面配置。
- `default`: 默认封面路径(webp格式)
- `categories`: 按分类指定不同封面库
webp 文件处理:
astro:assets 进行图片优化(如 Astro 版本支持)<picture> + srcset性能优化:
client:visible 延迟加载非首屏组件font-display: swap上游兼容性:
src/content/config.ts schema 兼容(文章 frontmatter 不变)rss.xml.js)命名规范(遵守你的记忆要求):
BlogCard, Hero)保持不变reimu-primary, anime-pink)保持不变sakura-fall, float)保持不变这份方案确保你能系统性地将 KimiAstro 作为视觉框架 整合到功能完整的主题中,最终产出约 60 个 Astro 文件、完整的 webp 资源管理、健全的配置接口和文档。