配置层 Seed 8
seed/01-config.md
星轨配置
路径
astro.config.mjs功能Astro 主配置,接入 React 集成 + Tailwind v4 + remark 插件(remark-directive + 文章图令解析器)
备注站点 URL、输出模式(static)、trailingSlash 在此修改;markdown.remarkPlugins 注册指令解析;新增集成在此追加
契约石碑
路径
src/types/config.ts功能定义 SiteConfig 与 NavItem 类型契约
备注被「站点名片」「引航罗盘」引用;改字段需同步改引用方
站点名片
路径
src/config/site.ts功能站点标题、描述、URL、作者、语言等元信息
备注引用「契约石碑」;SEO 与 BaseLayout 都依赖此文件
引航罗盘
路径
src/config/nav.ts功能导航栏菜单项配置(首页/广场/说说 + 更多下拉:文章/归档/友链/关于我/关于)
备注引用「契约石碑」;新增导航项在此追加;v0.1.8 「更多」下拉新增「关于我」入口(移动端抽屉 flatMap 自动继承)
文仓总管
路径
src/content.config.ts功能定义 posts/talks/spec 三个内容集合的 loader 与 schema
备注Astro 7 loader API(glob);schema 字段对应 D1 文章/说说结构;posts/talks 均含 `placeholder` 可选字段(占位文案,为空则默认取标题/内容前 2 字)
基底星砂
路径
src/styles/global.css功能Tailwind v4 引入 + 暗夜孟菲斯 CSS 变量体系(粉/青/黄/胶囊圆角/硬阴影)
备注所有孟菲斯配色变量在此定义;组件用 var(--color-neon-*) 引用
情绪图鉴
路径
src/config/emotions.ts功能emotion 代号字典(开心/难过/惊讶/生气/中性/激动/焦虑/疲惫 8 种)→ {label, color, stickerDir, shadowClass}
备注被「文仓索引」「说说情绪签」「广场数据池」引用;主人上传说说时填代号,构建时自动解析
作者映射表
路径
src/config/authors.ts功能talks/posts 的 author 字段 → { 昵称 nick, 头像 avatar } 映射
备注导出 `resolveAuthor(author)`,未登记的 author 回退为 `{ nick: author, avatar: DEFAULT_AVATAR }`;当前「天镜」「百奇」共用 `/assets/my/` 默认头像;被「朋友圈头部」「朋友圈动态卡」引用
布局导航 Seed 10
seed/02-layout.md
承重骨架
路径
src/layouts/BaseLayout.astro功能基础 HTML 布局,输出 head/meta/body/slot;生产环境注入 umami 统计脚本;挂载「niko吊挂画布」全站可见
备注引用「站点名片」「基底星砂」「归色过渡幕」「归色寻光幕」「niko吊挂画布」;后续页面均继承此布局;umami 仅 PROD 注入;v0.1.5 移除旧 .ani 光标皮肤,改为 niko 挂件;v0.1.7 移除 ClientRouter(View Transitions 导致 GSAP/Twikoo 换页状态崩坏),回退普通整页跳转,niko 闪烁靠 localStorage 锚点持久化 + GIF 浏览器缓存缓解
顶舷灯塔
路径
src/components/layout/Navbar.astro功能顶部固定导航条;桌面端粉色 logo 左 + 青色胶囊菜单右 + 向上箭头返回按钮 absolute 50% 真正居中;移动端(≤640px)改为左箭头 + 中央标题(隐藏 logo mark)+ 右汉堡
备注引用「引航罗盘」「站点名片」「右滑归色抽屉」;fixed 定位,backdrop-filter 毛玻璃;桌面端 back 用 `position:absolute; left:50%; transform:translateX(-50%)` 不依赖剩余空间;移动端 back 回到 static 贴左,logo flex:1 居中显示文本;汉堡点击 dispatch `drawer:open` 事件;v0.1.7 随 ClientRouter 移除一并去除 transition:persist
右滑归色抽屉
路径
src/components/layout/MobileDrawer.astro功能移动端导航抽屉,从右往左滑出,含「归色罗盘」标题 + 所有页面按钮平铺(首页/广场/说说/文章/归档/友链/关于)
备注引用「引航罗盘」(flatMap 自动继承其「更多」子项);监听全局 `drawer:open`/`drawer:close` 事件;点击遮罩/关闭按钮/链接自动关闭;桌面端不渲染;v0.1.7 随 ClientRouter 移除一并去除 transition:persist
归色签到幕
路径
src/components/layout/WelcomeGate.astro功能根路径 `/` 的欢迎+签到+3秒跳转页。首次访问(无 `blog:score`)跳 `/home/`;非首次显示「欢迎回来,归色者」+ 离开时长 + 签到积分+2(同一天不重复)+ 3秒倒计时跳 `/talks/`
备注引用「承重骨架」;localStorage 键:`blog:score`/`blog:lastSignDate`/`blog:lastVisit`;黑底中央胶囊卡片,霓虹粉硬阴影
落日余晖
路径
src/components/layout/Footer.astro功能页脚,黄粉渐变细线 + 版权信息 + 归色者标语
备注引用「站点名片」;所有页面通用
归色入口
路径
src/pages/index.astro功能根路径 `/` 的入口,渲染「归色签到幕」
备注引用「归色签到幕」;首次访问跳 `/home/`,非首次 3 秒后跳 `/talks/`
港湾入口
路径
src/pages/home/index.astro功能首页组装(导航 + Hero + 祈愿之幕 + 归港之门 + 页脚)
备注引用「承重骨架」「顶舷灯塔」「破晓之幕」「祈愿之幕」「归港之门」「落日余晖」「孟菲斯装饰」「祈愿之幕样式」;从原 `/` 路由迁入
关于我入口
路径
src/pages/about-me.astro功能关于我页面——名片卡(头像/名字/座右铭/简介)+ 基本设定 + 聊天与社交 + 吃喝偏好 + 人生历程星轨(上=最早→下=最晚),区块滚动入场动画
备注引用「承重骨架」「顶舷灯塔」「落日余晖」「归色者基本设定」「归色者社联卡」「归色者味蕾图鉴」「人生历程星轨」「星轨入场仪」「关于我样式」;v0.1.8 从单卡片扩展为五段区块并接入导航「更多」下拉
关于入口
路径
src/pages/about.astro功能关于本站页面——页头(含通往 /seed-explorer.html 的霓虹胶囊按钮)+ 乐园世界观 + 本站技术信息(Astro/React/GSAP/D1/R2/umami.8765777.xyz/twikoo.8765777.xyz)+ 隐私政策(统计/评论/本地存储/第三方资源/数据安全)
备注引用「承重骨架」「顶舷灯塔」「落日余晖」「关于我样式」(复用 about-block 等类);v0.1.8 从占位页重写为完整关于页
顶舷留白
路径
src/components/layout/NavbarSpacer.astro功能与顶部固定导航栏等高的占位块,避免内容被 fixed navbar 遮挡
备注高度匹配 .navbar 实测渲染——桌面 72px(padding 28px + 内容 43px + 1px 余量),移动 60px;仅在「港湾入口」「广场入口」「说说长廊入口」三处使用,其他页面不处理
首页模块 Seed 17
seed/03-home.md
破晓之幕
路径
src/components/home/HeroSection.astro功能Hero 段,视差背景图 + 标题色块 + 欢迎语「欢迎光临偶一生的blog!」+ 副标题「读者即归色者 · 点击即着色 · 浏览即记得」+ 滚动提示
备注引用「视差背景」「站点名片」;100vh 全屏,bg/9.webp 作背景;v0.2.6 起原 tagline 替换为欢迎语,原描述句替换为 tagline
祈愿之幕
路径
src/components/home/WishSection.astro功能新「3」块·6 阶段滚动叙事容器,5 stage + 独立立绘浮层
备注引用「前置全屏幕」「双海报幕」「五段记忆卡」「归色者立绘」「祈愿双卡」「主视觉终幕」;GSAP ScrollTrigger pin 驱动;data-debug-id="3";立绘独立挂顶层 z-index:100 跨越阶段3~4
五段记忆卡
路径
src/components/home/wish/WishStageCards.astro功能阶段2·五张硬切图竖直5等分全屏(各20vw),上下交替方向滑入(下↑/上↓/下↑/上↓/下↑)
备注被「祈愿之幕」引用;data-debug-id="3a";data-card-dir 标记入场方向;图片 bg/hardcut-1~5.webp;v0.2.7 起从小卡片改为竖直5列硬切全屏
归色者立绘
路径
src/components/home/wish/WishCharacter.astro功能阶段3·透明通道角色图从下往上滑入居中,跨越阶段3~4,阶段5缓出
备注被「祈愿之幕」引用;独立挂在 .wish 顶层 z-index:100;data-debug-id="3b";niko站立1.webp(v0.2.7 更新为新立绘图)
祈愿双卡
路径
src/components/home/wish/WishSidePanels.astro功能阶段4·黑屏背景 + 上下半屏双卡(各50vh)水平进入 + 大字"云程发轫/踵事增华"左上右下放大
备注被「祈愿之幕」引用;层叠 黑屏(z0)<双卡(z1)<大字(z2)<立绘(z100);data-debug-id="3c";子卡 3c1(上)/3c2(下);v0.2.7 起上半屏CG改为 bg/10.webp,大字从「祈愿/成真」改为「云程发轫/踵事增华」
主视觉终幕
路径
src/components/home/wish/WishFinalVisual.astro功能阶段5·底部遮罩从上往下覆盖 + 主视觉大图淡入 + 主标题
备注引用「祈愿主标题」;被「祈愿之幕」引用;data-debug-id="3d"
祈愿主标题
路径
src/components/home/wish/WishTitle.astro功能阶段5·Till We Meet 淡入 + 轻微放大
备注被「主视觉终幕」引用;中英双行标题;v0.2.7 起文案从「Pure Wish True / 纯粹祈愿皆成真」改为「Till We Meet / 直到与ta相遇」
前置全屏幕
路径
src/components/home/wish/WishIntroVisual.astro功能阶段0·全屏CG铺满,滚动时透明度淡出过渡到双海报
备注被「祈愿之幕」引用;data-debug-id="3e";bg/15.webp(v0.2.7 更新为归色者序章新图)
双海报幕
路径
src/components/home/wish/WishDualPosters.astro功能阶段1·bg/1.webp 左滑 + bg/2.webp 对称图右滑,从两侧向中心进入后左右分开消失
备注被「祈愿之幕」引用;data-debug-id="3f";v0.2.7 起左海报更新为 bg/1.webp,右海报更新为 bg/2.webp
归港之门
路径
src/components/home/EndSection.astro功能CTA 段,引导文字 + 两个磁吸胶囊按钮(跳广场/说说)
备注引用「磁吸胶囊按钮」;严格 20px 胶囊圆角 + 彩色硬阴影
磁吸胶囊按钮
路径
src/components/control/MagneticButton.tsx功能受 showcase 018 启发的磁性吸附按钮,鼠标靠近时按钮跟随偏移
备注React 组件,被「归港之门」引用;variant 支持 pink/cyan/yellow
视差背景
路径
src/components/control/ParallaxBackground.tsx功能滚动视差背景图 + 半透明遮罩 + 孟菲斯波点叠加
备注React 组件,被「破晓之幕」引用;requestAnimationFrame 节流
孟菲斯装饰
路径
src/styles/home.css功能首页专用全局动画/几何装饰工具类(锯齿/网格/星点/硬阴影 hover)
备注引用「基底星砂」提供 CSS 变量;含实验性 scroll-driven 动画
祈愿时间轴
路径
src/scripts/wishTimeline.ts功能GSAP ScrollTrigger 驱动祈愿之幕 6 阶段滚动叙事
备注被「港湾入口」引用;pin + scrub=1;统一 power4.out 缓动,五卡入场用 power4.out(v0.2.7 起从 elastic.out 改为硬切风格);立绘从下↑入跨越阶段3~4,阶段5缓出;v0.2.7 起总滚动距离从 5600 延长至 7200(终幕停留+30%)
祈愿之幕样式
路径
src/styles/wish.css功能祈愿之幕专用样式,6 阶段层叠 + 缓动变量 + 孟菲斯色块
备注引用「基底星砂」提供 CSS 变量;stage 容器始终 opacity:1,子元素由 GSAP 控制显隐;立绘浮层 z-index:100
Debug区块
路径
src/components/debug/DebugBlock.ts功能测试专用客户端脚本,为带 data-debug-id 的元素注入彩色框 + 角标 + 点击显隐
备注被「港湾入口」引用;id 纯数字=主块(实线),含字母=子块(虚线);颜色按数字部分 % 3 循环粉/青/黄;子块隐藏时 btn/placeholder 显式 visibility:visible 覆盖父级,确保角标可点恢复;开关由「调试开关面板」通过 localStorage 与 "debug-blocks:change" 事件控制;默认 off(不注入),不注入时 cleanup 彻底清除所有 inline style,页面正常显示
调试开关面板
路径
src/components/debug/DebugToggle.ts功能右下角浮动胶囊,控制 DebugBlock 注入开/关,状态持久化
备注被「港湾入口」引用;按钮始终显示;localStorage key="tiancat:debug-blocks",默认 off(不注入);切换派发 window "debug-blocks:change" 事件,DebugBlock 监听即时同步无需 reload
文章模块 Seed 16
seed/04-post.md
文章星卡
路径
src/components/post/PostCard.astro功能单张文章卡片,横向布局 240px 方形封面 + 右侧内容,边框/硬阴影按 index 轮换粉/青/黄
备注引用「文仓索引」getPostCover;被「文章长廊」引用
文章长廊
路径
src/components/post/PostList.astro功能文章列表容器,顶部粉色胶囊标题 + 垂直卡片流 max-w-3xl
备注引用「文仓索引」filterPublished+sortByPublishedDesc;引用「文章星卡」
文章背景层
路径
src/components/post/PostBackground.astro功能双层主视觉图(供图令执行器切换)+ 从右往左递增遮罩(右暗左亮)+ 波点叠加
备注被「文章沉浸幕」「说说沉浸幕」引用;data-post-bg-layer-a/b 双层 opacity 切换;position fixed z-index:0;小屏(<640px)改上图下文布局
文章网格画布
路径
src/components/post/PostGridCanvas.tsx功能鼠标光晕网格背景(迁移自 cosmic-broth GridCanvas),网格线 + 鼠标附近高亮 + 粉色径向渐变光晕
备注React 组件 client:load;被「文章沉浸幕」「说说沉浸幕」引用;position fixed pointer-events:none
文章锯齿线
路径
src/components/post/PostTechDivider.astro功能SVG 折线分割线(三层粉/青/灰叠加),点列由「纵向段高随机 20-50px 稳定往下 + 横向有界随机游走 ±2 增量限制在 [4,16]」生成,形成明显折角
备注seed 参数控制伪随机形态(sin 哈希);viewBox 20x1000 + preserveAspectRatio=none 拉伸到容器高度;被「文章沉浸幕」「说说沉浸幕」引用;图景隐文键激活时随分界线锚点一起淡出
文章摩斯点
路径
src/components/post/PostMorseSep.astro功能摩斯码风格分隔符(迁移自 cosmic-broth MorseSep),两行小点
备注color 支持 pink/cyan/yellow;被「文章侧舷」「说说侧舷」引用
文章侧舷
路径
src/components/post/PostSidePanel.astro功能文章详情侧边面板(标题色块+元信息+摩斯点+正文 slot + 点赞 slot + 评论 slot),max-w-480px 偏右布局;元信息含 发表/作者/语言/标签/分类,分类显示在标签后用青色胶囊+粉色硬阴影区分
备注引用「文章摩斯点」;被「文章沉浸幕」引用;zpix 字体 + 粉色硬阴影标题;小屏(<640px)改上图下文(padding-top 55vh);含 `like`/`comments` 命名 slot;v0.2.6 起新增 category prop 与分类块渲染
文章沉浸幕
路径
src/components/post/PostDetail.astro功能cosmic-broth 迁移主体,组装背景层+网格画布+进度柱+图令执行器+锯齿线+侧边面板+点赞键+归色回响盒+标题导航轨;v0.2.6 起向「文章侧舷」传入 category
备注引用「文章背景层」「文章网格画布」「文章进度柱」「文章图令执行器」「文章锯齿线」「文章侧舷」「文章点赞键」「归色回响盒」「标题导航轨」;锯齿线锚点贴文字块左边缘(right:480px),v0.1.7 起锚点带 `data-niko-hang` 标记供「挂壁分界线星槎」收集为 niko 挂壁分界线;用 astro:content 的 render() 渲染 md 并取 headings 传给「标题导航轨」;v0.2.2 起 headings 非空时挂载标题导航轨;被「文章详情入口」引用
文章点赞键
路径
src/components/post/PostLikeButton.astro功能心形按钮 + 点赞数,点击触发 umami 虚拟路由 `/like/post-{slug}/` 统计
备注引用「点赞统计星槎」getLikeCount;构建时从 cache 读取初始点赞数;客户端用隐藏 iframe 加载虚拟路由触发 umami pageview;localStorage 防重复点赞;被「文章沉浸幕」填充到 `like` slot
文章长廊样式
路径
src/styles/post.css功能PostList 和 PostCard 专用样式 + zpix 字体声明 + PostDetail 容器
备注引用「基底星砂」;@font-face zpix.ttf
文章长廊入口
路径
src/pages/posts/index.astro功能文章列表页组装(BaseLayout + Navbar + PostList + Footer)
备注引用「承重骨架」「顶舷灯塔」「落日余晖」「文章长廊」
文章详情入口
路径
src/pages/posts/[slug].astro功能动态路由 /posts/[uid]/,getStaticPaths 生成 12 章静态页
备注引用「文章沉浸幕」;params.slug 用 entry.data.uid
文章图令解析器
路径
src/plugins/remark-post-image.mjs功能remark 插件,识别 md 中的 ::img{src="..."} 指令,替换为不可见触发点 div(data-post-img 属性)
备注参考 fuwari-main 的 ::post{} 指令解析;需配合 remark-directive 使用(顺序:remarkDirective → remarkPostImage);被「星轨配置」注册;触发点由「文章图令执行器」监听
文章进度柱
路径
src/components/post/PostProgressBar.tsx功能固定视口最左侧的垂直进度条,0-100% 反映页面滚动进度;计算时排除 `[data-exclude-progress]` 评论区高度,让 100% 落在评论区顶部
备注React 组件 client:load;监听 window scroll + SidePanel scroll + resize;样式在「文章沉浸幕」「说说沉浸幕」的 is:global style 中定义;被「文章沉浸幕」「说说沉浸幕」「归档沉浸幕」引用
文章图令执行器
路径
src/components/post/PostImageSwitcher.tsx功能监听 .post-img-trigger 触发点与判定线碰撞,缓入缓出切换背景图(双层 opacity 交叉淡入淡出);预加载所有 trigger 图片到缓存;移动端(≤640px)自动切换为监听 SidePanel scroll,判定线改为 SidePanel 顶部
备注React 组件 client:load,返回 null(纯副作用);桌面端碰撞线=视口底端(trigger.top <= viewportHeight);移动端碰撞线=SidePanel 顶部(trigger.top <= sidePanel.top);操作「文章背景层」的 data-post-bg-layer-a/b;被「文章沉浸幕」「归档沉浸幕」引用
文章附件
路径
src/components/post/PostAttachment.astro功能扫描 .post-body 内所有 <img>,在文字块后以网格缩略图形式展示全部图片;点击缩略图 dispatch `lightbox:open` 事件触发「图令灯箱」
备注被「文章沉浸幕」引用;空图片时显示提示文案;缩略图带 hover 上浮 + 粉色硬阴影
说说模块 Seed 24
seed/05-talk.md
随机海报情绪仪
路径
src/components/talk/feed/MoodCurve.astro功能说说长廊顶部海报——客户端每次访问从背景图随机池随机一张,叠加情绪过山车曲线(按时间倒序的情绪价态折线+情绪色圆点)
备注引用「情绪图鉴」「作者映射表」「文仓索引」;价态表 VALENCE:excited1.0/happy0.85/surprised0.65/neutral0.5/anxious0.35/sad0.25/angry0.2/tired0.1;被「说说长廊入口」引用
今日时光胶囊
路径
src/components/talk/feed/TimeCapsule.astro功能「历史上的今天」横条,展示往年同月日/同月的说说胶囊(年份+摘录),点击跳详情
备注引用「时光胶囊星槎」「情绪图鉴」;被「说说长廊入口」引用
说说节奏流
路径
src/components/talk/feed/RhythmFeed.astro功能说说长廊主体——左列纯时间倒序卡流(初始10条,每批5条;横屏滚到底自动加载/竖屏点按钮,驿站同款)+ 右侧「染色战线轨」+ 末批后亮「未完悬念幕」
备注引用「文仓索引」「朋友圈数据星槎」「大字情绪卡」「图文瞬间卡」「胶囊碎语卡」「月份分界签」「未完悬念幕」「染色战线轨」「相对时间星槎」「说说节奏流样式」;卡型规则:无图或≥40字→大字卡,≤30字→胶囊卡,其余→图文卡;内联脚本负责分页 reveal 与相对时间刷新;被「说说长廊入口」引用
大字情绪卡
路径
src/components/talk/feed/MoodTextCard.astro功能无图/长文说说的整卡情绪染色巨字卡(--ec 情绪色描边+波点底纹+情绪色硬阴影),有图时首图缩为右上角拍立得
备注引用「情绪图鉴」「相对时间星槎」「朋友圈点赞栏」「卡片发射器」;被「说说节奏流」引用
图文瞬间卡
路径
src/components/talk/feed/MomentImageCard.astro功能有图说说的朋友圈风动态卡(头像+昵称+情绪签+正文+九宫格/视频+点赞+评论+发射器),左缘 6px 情绪色边
备注引用「情绪图鉴」「作者映射表」「相对时间星槎」「朋友圈九宫格」「朋友圈点赞栏」「朋友圈评论区」「卡片发射器」;被「说说节奏流」引用
胶囊碎语卡
路径
src/components/talk/feed/CapsuleWhisper.astro功能≤30字超短说说的 20px 胶囊圆角小卡(情绪色勾边+小圆贴缩略图),节奏呼吸里的「小」
备注引用「情绪图鉴」「相对时间星槎」「朋友圈点赞栏」「卡片发射器」;被「说说节奏流」引用
卡片发射器
路径
src/components/talk/feed/CardLauncher.astro功能说说卡右侧的染色开火装置。两段式:点击按钮长出几何发射器(10°/s 自动旋转)→ 再点按当前角度发射抛物线炮弹;弹种5球/6炮塔/7破土/8染色圈为单击直发;闲置6s收回
备注引用「染色战线星槎」「情绪图鉴」;炮弹色由星槎 cardColor 一次摇定终身;被三种说说卡引用
染色战线轨
路径
src/components/talk/feed/TerritoryRail.tsx功能右侧竖式领土战争小游戏(纯解压无胜负)。上区域悬浮计数板(四色块数,数字300ms滚动过渡);下区域格子战场(桌面40px/窄屏20px,行列自适应,随页面高度生长);双 canvas(战场+视口飞行覆盖层)
备注引用「染色战线星槎」;React client:load;炮弹同色穿透/异色染色;点击格子循环换色(灰→粉→青→黄);弹种:1普通(5%暴走5s每0.3s补射) 2分裂(8向) 3爆炸(吸附3s半径2.3格) 4激光(即时射线+3s印记) 5球(召唤位置=战场中部列x+按钮视口y,向下180°扇形随机方向初速度rand(200,400)px/s,无重力等速运动,碰撞镜面反射无能量衰减,初落0.2s全染随后弹跳染色5s) 6炮塔(同球后定植,30°/s旋转1弹/s,子弹无寿命限制且碰壁不反弹飞出边界,炮塔永久存在无寿命限制,炮塔所在格颜色被改为任何不同颜色时移除炮塔+360°固定8方向发射8枚子弹+pop闪烁特效,localStorage持久化≤12座) 7破土(随机3-5格) 8染色圈(鼠标半径2格10s,每1000ms脉冲染色一次+虚线圆加粗闪烁);被「说说节奏流」引用
月份分界签
路径
src/components/talk/feed/MonthDivider.astro功能说说流内跨月时的锯齿黄线+大字号月份分隔卡(时间厚度)
备注被「说说节奏流」引用
未完悬念幕
路径
src/components/talk/feed/UnfinishedEnd.astro功能全部加载完后的粉色虚线钩子卡——「下一条说说还在褪色中,归色后即见…」(无终点感)
备注默认 hidden,由节奏流分页脚本揭开;被「说说节奏流」引用
时光胶囊星槎
路径
src/lib/time-capsule.ts功能从历史说说打捞时间厚度——兜底链:同月日(往年)→同月(往年)→乐园第一条说说;导出 getTimeCapsules
备注被「今日时光胶囊」引用
染色战线星槎
路径
src/lib/territory-store.ts功能小游戏状态中枢单例(框架无关)。格子模型(0灰1粉2青3黄)/localStorage持久化(格子稀疏图·卡片炮弹色·炮塔)/情绪→弹种映射/卡片炮弹色随机不灭/行列配置与生长(列数变化按比例重映射保留旧作)/pub-sub事件
备注导出 territoryStore;被「卡片发射器」「染色战线轨」引用
说说节奏流样式
路径
src/styles/talk-rhythm.css功能说说长廊重构全套样式(布局双列/海报/胶囊横条/三种卡/发射器/月份签/悬念幕/游戏轨/响应式)
备注引用「基底星砂」配色变量;响应式三档:>1100px 轨240px、≤900px 轨108px、≤640px 轨72px;被「说说节奏流」引用
说说长廊入口
路径
src/pages/talks/index.astro功能说说列表页组装(BaseLayout + Navbar + 海报情绪仪 + 时光胶囊 + 节奏流 + Footer)
备注引用「承重骨架」「顶舷灯塔」「顶舷留白」「落日余晖」「随机海报情绪仪」「今日时光胶囊」「说说节奏流」
说说侧舷
路径
src/components/talk/TalkSidePanel.astro功能说说详情侧边面板(emotion 横幅+表情包+元信息+content+图墙+点赞 slot+评论 slot),与「文章侧舷」布局一致
备注引用「情绪图鉴」「文仓索引」「文章摩斯点」;max-w-480px 偏右布局;小屏(<640px)改上图下文(padding-top 55vh);含 `like`/`comments` 命名 slot;被「说说沉浸幕」引用;v0.2.2 content 改用「说说 markdown 渲染星槎」渲染的 HTML(contentHtml prop)经 set:html 注入,支持基础 md 语法 + ##/### 标题,h2/h3 带 scroll-margin-top:120px 供「标题导航轨」定位
说说沉浸幕
路径
src/components/talk/TalkDetail.astro功能cosmic-broth 迁移主体,组装背景层+网格画布+进度柱+说说图令执行器+锯齿线+说说侧舷+点赞键+归色回响盒+标题导航轨
备注引用「文章背景层」「文章网格画布」「文章进度柱」「说说图令执行器」「文章锯齿线」「说说侧舷」「说说点赞键」「归色回响盒」「标题导航轨」「说说 markdown 渲染星槎」;锯齿线锚点贴文字块左边缘(right:480px),v0.1.7 起锚点带 `data-niko-hang` 标记供「挂壁分界线星槎」收集为 niko 挂壁分界线;含 is:global 进度柱样式;v0.2.2 起调用 renderTalkMarkdown 渲染 content 并把 headings 传给「标题导航轨」;被「说说详情入口」引用
说说 markdown 渲染星槎
路径
src/lib/render-talk-markdown.ts功能把说说 content 字符串当 markdown 渲染为 HTML + 提取 headings({depth,slug,text}[]);用 @astrojs/markdown-remark 的 createMarkdownProcessor(gfm:true、关闭语法高亮、显式启用 rehypeHeadingIds 为标题注入 id);processor 单例缓存
备注仅基础 md 语法 + ##/### 标题;不支持 ::img 指令(图片走 images 数组);被「说说沉浸幕」引用;headings 用于「标题导航轨」
说说点赞键
路径
src/components/talk/TalkLikeButton.astro功能心形按钮 + 点赞数,点击触发 umami 虚拟路由 `/like/talk-{id}/` 统计
备注引用「点赞统计星槎」getLikeCount;构建时从 cache 读取初始点赞数;客户端用隐藏 iframe 加载虚拟路由触发 umami pageview;localStorage 防重复点赞;被「说说沉浸幕」填充到 `like` slot
说说样式
路径
src/styles/talk.css功能TalkDetail 专用样式(talk-list 系旧列表样式已无页面引用,留作备用)
备注引用「基底星砂」;详情复用 PostDetail 容器
说说详情入口
路径
src/pages/talks/[id].astro功能动态路由 /talks/[id]/,getStaticPaths 生成 20 条说说静态页(status=0 在 prod 跳过)
备注引用「说说沉浸幕」;params.id 用 entry.data.id
说说图令执行器
路径
src/components/talk/TalkImageSwitcher.tsx功能按滚动进度 0-80% 平均分配 images 数组切换背景图(双层 opacity 交叉淡入淡出);预加载所有图片到缓存,切换时检查 complete 状态避免快速滚动硬切
备注React 组件 client:load,返回 null(纯副作用);公式:第 n 张图切换进度 = n * (80 / N),80-100% 显示最后一张;操作「文章背景层」的 data-post-bg-layer-a/b;被「说说沉浸幕」引用;images.length <= 1 时不渲染
朋友圈九宫格
路径
src/components/talk/TalkFeedGallery.astro功能1-9 张图片自适应九宫格布局,微信朋友圈风格
备注布局规则:1张=大图70%宽,2-4张=2列,5-9张=3列;>9张只显示前9张第9张带 `+N` 蒙层;图片点击跳转详情页;hover 微缩放;小屏单图满宽;被「图文瞬间卡」引用
朋友圈点赞栏
路径
src/components/talk/TalkFeedLikes.astro功能心形图标 + 点赞数字按钮,点击触发 umami 虚拟路由统计
备注引用「点赞统计星槎」getLikeCount 取初始数;客户端点击用隐藏 iframe 加载 `/like/talk-{id}/` 触发 umami pageview;localStorage 防重复点赞;已点赞时心形填充粉色;被「大字情绪卡」「图文瞬间卡」「胶囊碎语卡」引用
朋友圈评论区
路径
src/components/talk/TalkFeedComments.astro功能一级评论 + 二级回复(楼中楼)静态渲染,含昵称高亮和回复层级缩进
备注引用「twikoo数据星槎」TwikooCommentTree 类型;当前 twikoo 云函数未升级,数据为空;升级后自动接入;评论区容器有左侧青色竖线装饰;被「图文瞬间卡」引用
广场模块 Seed 8
seed/06-plaza.md
无限画布
路径
src/components/plaza/InfiniteCanvas.tsx功能Canvas 2D 虚拟化卡片墙,行高统一 320px,大/中/小三档宽度(360/260/180)按图片宽高比分类,2D自由拖拽+松手惯性(阻尼0.92)+缺位自动补齐;含「归色者驿站」DOM 着陆区(往右滑进入,最新文章+说说列表)+ 竖线分隔
备注卡片间 64px,行间距 96px;每行用 hashRow(行号) 做确定性随机起点循环取卡片;只渲染视口内可见卡片(虚拟化);点击用 hitTestCard 碰撞检测;x 方向往右拖到驿站完全可见时停止(offset.x ∈ (-∞, vw]),往左无限;被「广场总控」引用;v0.3.6 起驿站 Banner 随机背景从广场入口接收 bgPool prop,不再硬编码 1-16 序列
广场详情幕
路径
src/components/plaza/PlazaModal.tsx功能背景变暗模态框,封面+标题+跳转链接+关闭按钮,ESC 关闭
备注引用「图景占位幕·React版」;被「广场总控」引用;孟菲斯白底 + 粉色硬阴影 + pop 动画;v0.2.6 起封面改用图景占位幕·React版,获得加载中大字占位+光辉+失败兑底能力
广场总控
路径
src/components/plaza/PlazaApp.tsx功能广场容器组件,管理 cards 数据与模态框选中状态
备注引用「无限画布」「广场详情幕」;被「广场入口」引用;client:load;v0.3.6 起接收 bgPool prop 并透传给无限画布
广场样式
路径
src/styles/plaza.css功能舞台(网格+点阵+探照灯伪元素)+ Canvas 透明层 + 模态框 + 驿站 + 竖线分隔样式
备注引用「基底星砂」;.plaza-stage::before 探照灯用 --mx/--my CSS 变量跟随鼠标;含 plaza-modal-pop 动画;驿站滚动条隐藏(scrollbar-width: none + ::-webkit-scrollbar display:none)
广场入口
路径
src/pages/plaza/index.astro功能驿站页面(Banner + 筛选栏 + 双栏信息流 + 侧边栏),替代旧广场入口
备注引用「承重骨架」「顶舷灯塔」「驿站Banner」「驿站筛选栏」「驿站信息流」「驿站niko召唤」「驿站搜索框」「驿站最近说说」「驿站样式」「广场数据池」;详见 seed/09-station.md
广场数据池
路径
src/lib/plaza-data.ts功能构建时聚合 posts+talks 为统一 PlazaCardData 数组,按发布时间倒序混合
备注引用「文仓索引」;被「广场入口」引用;PlazaCardData = {type,id,title,cover,href,emotion,published}
背景图随机池·读取器
路径
src/lib/bg-pool.ts功能服务端读取构建时生成的 `src/content/.bg-pool.json`,返回随机背景路径数组;文件不存在时回退到 7 张基础图
备注被「随机海报情绪仪」「广场入口」引用;v0.3.6 新增
背景图随机池·生成器
路径
scripts/gen-bg-pool.mjs功能扫描 `src/content/posts/*.md` 的 frontmatter,收集 `addToBgPool: true` 的文章 `image` 字段(封面图),合并基础 7 张图,输出 `src/content/.bg-pool.json`
备注npm script `gen:bg-pool`;已纳入 `build`/`build:full`/`build:local` 链路;v0.3.6 新增
数据层 Seed 12
seed/07-data.md
D1星桥
路径
src/lib/d1-client.ts功能Cloudflare D1 HTTP 查询封装(queryD1 + hasD1Env)
备注仅构建时使用;环境变量 CF_ACCOUNT_ID/CF_D1_DATABASE_ID/CF_D1_API_TOKEN;被「数据同步星槎」引用
R2星桥
路径
src/lib/r2-client.ts功能Cloudflare R2 对象列出与下载(R2Client 类)
备注仅构建时使用;图片按 uid/id 分文件夹存储;上传由主人另一软件负责,本项目仅下载
文仓索引
路径
src/lib/content-utils.ts功能内容集合读取工具(filterPublished 按 status 过滤、resolveEmotion、sortByPublishedDesc、getPostCover、getTalkCover)
备注引用「情绪图鉴」「情绪贴图池星槎」;被列表页和广场数据池引用;status=0 仅 dev 渲染,prod 跳过;getTalkCover 无图时回退到「情绪贴图池星槎」getStickerFirst(按 emotion 目录首张,文件名可任意)
占位绘制星槎
路径
src/lib/draw-placeholder.ts功能在任意 Canvas 2D 上下文绘制暗夜孟菲斯风占位图——深炭灰底 + 暗调霓虹大字居中(严禁硬阴影)+ 可选光辉描边;字号自适应;导出 drawPlaceholder()、getPlaceholderTone()、PLACEHOLDER_TONES 暗调色板(粉#c43d6f/青#2a9d96/黄#c9922a)
备注被「图景占位幕」「无限画布」引用;Astro 组件光辉由 CSS box-shadow 实现(drawPlaceholder 内 glow 传 false),广场 Canvas 用 drawPlaceholder 的 glow=true 画 canvas 光辉
数据同步星槎
路径
scripts/sync-d1.mjs功能D1 拉取落地脚本,build 前自动跑;同步 posts/talks/friends 三类内容
备注独立 .mjs 不依赖 src/lib;Vercel 构建 Build Command 用 `npm run build:full`;本地用 `npm run sync:local`;**增量同步**——posts/talks 按 uid/id 命名文件,本地已存在则跳过(保留主人「每月 GitHub 归档流程」手动归档版本),本地没有的从 D1 拉取(这月内新增内容能正常上线),`--force-content` / `FORCE_CONTENT=true` 强制覆盖本地(用于用 D1 版本重置);friends 始终全量覆盖写 `src/data/friends-remote.json`(D1 是唯一数据源);缺环境变量或拉取失败仅 warn 不终止构建(用本地数据兜底)
小说分章剪
路径
scripts/split-novel.mjs功能一次性从《猫耳帽下坠落的星空》原文 txt 切出 12 个 md 测试用例
备注测试用,已生成 12 章到 src/content/posts/;uid 在脚本顶部 CHAPTER_UID 数组定义
表情抽取器
路径
scripts/pick-stickers.mjs功能一次性从 D:/表情包目录 抽 24 张图复制到 public/assets/stickers/{emotion}/
备注测试用,随机配对情绪代号;正式发布前请人工归类;文件名统一 `{emotion}-01.jpg` 格式
说说生成器
路径
scripts/gen-talks.mjs功能一次性生成 20 条测试说说 JSON(含 2 条 status=0 dev-only)
备注测试用,已生成到 src/content/talks/;种子数据在脚本 SEEDS 数组中
归色者字典生成器
路径
scripts/gen-seed-explorer.mjs功能读取 seed/*.md 解析全部组件条目,生成 public/seed-explorer.html 静态字典页(暗夜孟菲斯风格 + 搜索筛选 + 中文名一键复制)
备注引用所有 seed 子文件;npm run gen:seed-explorer 执行;生成物归色者字典(public/seed-explorer.html)双击即开;改 seed 后重跑脚本刷新
情绪贴图池星槎
路径
src/lib/emotion-sticker-pool.ts功能构建时扫描 public/assets/stickers/{emotion}/ 生成贴图映射,导出 getStickerFirst(emotion) / getStickerRandom(emotion, seed?)
备注引用「情绪图鉴」的 stickerDir 字段;被「文仓索引」「说说侧舷」引用;仅服务端构建时使用(依赖 node:fs,禁止客户端引用);文件名可任意(哈希/语义化都支持);内存缓存避免重复 IO
图片包打包星槎
路径
scripts/pack-image-packs.mjs功能扫描 public/assets 生成两个 tar 包(2025-07 不含 stickers / stickers 仅含 stickers)+ 同步更新 .image-pack-manifest.json
备注npm run pack:images 执行;tar 编码为内嵌实现,与 yiyan-blog-update/src/services/tar-builder.ts 严格对齐;扫描路径相对 public/,不含 public/ 前缀(与 image-pack-cache.ts 的 toR2Key 对齐);输出到 dist/image-packs/,manifest 走 merge 模式不破坏其他包
R2包上传星槎
路径
scripts/upload-r2-pack.mjs功能上传 dist/image-packs/*.tar + manifest.json 到 R2 /image-packs/(S3 SigV4 签名 PUT 方法)
备注npm run upload:r2 执行;读 .env 的 R2_ACCESS_KEY_ID/SECRET;与 yiyan-blog-update/src/services/pack.ts 的 uploadR2Object 路径对齐;上传后客户端访问站点时自动拉取新 manifest
过渡与搜索 Seed 7
seed/08-transition-search.md
归色过渡幕
路径
src/components/transition/PageLoadingOverlay.astro功能全屏加载覆盖层(niko 加载中.webp 居中 + 离散关键帧硬切跳跃 + 进度条)
备注引用「基底星砂」「归色过渡样式」;被「承重骨架」引用;z-index:9999;v0.1.7 随 ClientRouter 移除去除 transition:persist 与 astro:before-preparation/astro:page-load 监听,每次整页跳转都是全新加载(load 事件 → 淡出,5s 兜底)
归色过渡样式
路径
src/styles/transition.css功能加载覆盖层样式 + niko 离散关键帧动画(左下→右上硬切)+ 渐变进度条
备注被「归色过渡幕」引用;steps(1, end) 硬切动画 0.32s 循环
归色索引镜
路径
src/lib/search-index.ts功能构建时生成搜索索引(文章 + 说说 + 关键页面),导出 buildSearchIndex
备注引用「文仓索引」的 filterPublished;被「归色星桥API」引用;友链页面占位待后续接入
归色星桥API
路径
src/pages/api/search.json.ts功能GET /api/search.json 返回搜索索引 JSON
备注引用「归色索引镜」;Cache-Control: public, max-age=3600
归色寻光核
路径
src/components/search/SearchModal.tsx功能React 客户端搜索弹窗(输入实时搜索 + 分组结果 + 键盘导航 + 关键字高亮)
备注引用「归色星桥API」;被「归色寻光幕」引用;监听 search:toggle 事件切换开关
归色寻光幕
路径
src/components/search/SearchModal.astro功能搜索弹窗 Astro 包装(client:load 挂载 + Ctrl/Cmd+K 触发 + "/" 快捷键)
备注引用「归色寻光核」「归色寻光样式」;被「承重骨架」引用
归色寻光样式
路径
src/styles/search.css功能搜索弹窗样式(浅色卡片、圆角、30% 黑色遮罩、关键字高亮、响应式)
备注被「归色寻光幕」引用;二次元博客风圆角卡片式
驿站模块 Seed 12
seed/09-station.md
驿站我的卡片
路径
src/components/station/StationProfile.tsx功能展示「我」的信息(头像+名字+座右铭+简介),头像悬浮显示SVG提醒(用户图标+「关于我」文字),点击跳转 /about-me/
备注引用「基底星砂」;被「驿站内容」引用;client:load;放在「驿站niko召唤」上方
驿站Banner
路径
src/components/station/StationBanner.astro功能顶部宽幅 Hero 图片区域,文字内容叠加在图片左下角(大标题 + 一行副标题)
备注引用「基底星砂」「驿站样式」;被「广场入口」引用
驿站筛选栏
路径
src/components/station/StationFilterBar.astro功能横向排序/筛选栏,可按分类筛选,仅一行高度,可左右滑动,手没滑动时每秒自动从右向左滑动约1个字符
备注引用「基底星砂」「驿站样式」;被「广场入口」引用;含拖拽+自动滚动+分类点击事件
驿站信息流
路径
src/components/station/StationFeed.tsx功能垂直流式图文卡片列表,初始10条=说说+文章按发布时间混排;「加载更多」(横屏滚到底自动 / 竖屏点按钮)只从文章池随机抽5篇追加
备注引用「驿站样式」「图景占位幕·React版」;被「驿站内容」引用;client:load;卡片结构:左缩略图(右上角文/说类型徽标)+右标题摘要+底部标签/作者/箭头;v0.1.8 起随机抽取批次内不放回、跨批允许重复,批次号保证 key 唯一;v0.2.6 起左侧缩略图改用图景占位幕·React版,获得加载中大字占位+光辉+失败兑底能力
驿站星卡
路径
src/components/station/StationCard.astro功能单张图文卡片(左缩略图 + 右标题摘要 + 底部标签/作者头像/右箭头)
备注引用「文仓索引」「驿站样式」;Astro 版本(预渲染用),React 版本逻辑内联在「驿站信息流」中
驿站niko召唤
路径
src/components/station/StationNiko.tsx功能niko 召唤阵——中央 niko睁眼.webp + 底部进度条(从中间向两边扩张)+ 右侧竖列「click!」文字;点击 webp 触发彩色粒子爆开动画 + 进度条随机增加 4%~10%;每秒进度自动衰减 5%;进度达 100% 时 webp 替换为 niko床上1.webp,3 秒后消失变为「配置」按钮,同时锚点出现在 webp 位置(dispatch `niko-pendant:activate` 事件让「niko吊挂画布」激活)
备注引用「基底星砂」「驿站样式」;被「驿站内容」引用;client:load;localStorage 键:`niko-summon-progress`/`niko-summon-activated`/`niko-summon-bed-shown`;进度衰减由 useEffect setInterval 实现;粒子动画用 Canvas API;「配置」按钮跳转 `/niko-config/`
驿站搜索框
路径
src/components/station/StationSearchBox.astro功能点击调出已开发的搜索悬浮框(search:toggle 事件)
备注引用「基底星砂」「驿站样式」;被「广场入口」引用
驿站最近说说
路径
src/components/station/StationRecentTalks.astro功能展示最近3条说说,点击 more 跳转到 /talks/ 页面
备注引用「文仓索引」「驿站样式」;被「广场入口」引用
归色公告跑马灯
路径
src/components/station/StationMarquee.tsx功能水平无限循环滚动公告栏,× 分隔,悬停暂停,点击跳转;默认公告覆盖各页面入口(活动/文章/说说/友链/关于)
备注引用「基底星砂」;被「驿站内容」引用;client:load;导出 MarqueeItem 接口与 DEFAULT_MARQUEE_ITEMS 默认数据
驿站双维筛
路径
src/components/station/StationTagFilter.tsx功能标题「筛选」+ 标签/分类互斥切换按钮 + 云点选跳转归档页(标签跳 /archive/?tag=,分类跳 /archive/?category=),底部含「文章长廊」「归档星图」两枚跳转按钮;归档副筛窗变体(lockMode+hideActions+archiveSub)支持叠加筛选
备注引用「基底星砂」;被「驿站内容」「归档沉浸幕」引用;client:load;点选即跳转,无本地筛选状态;v0.2.5 起新增分类维度与归档副筛窗变体
驿站内容
路径
src/components/station/StationContent.tsx功能嵌入无限画布末端的双栏布局(Banner + 跑马灯 + 混合信息流 + 侧边栏),左栏初始混排说说+文章(按发布时间倒序),侧边栏含我的卡片/niko/搜索框/最近说说/按标签筛
备注引用「归色公告跑马灯」「驿站信息流」「驿站niko召唤」「驿站我的卡片」「驿站标签筛」「驿站样式」;被「无限画布」引用;client:load;v0.1.7 起右侧栏各组件包覆 `data-niko-hang` 标记,四周边缘供「挂壁分界线星槎」收集为 niko 挂壁分界线;v0.1.8 起向「驿站信息流」传入混排初始流 + 文章随机池
驿站样式
路径
src/styles/station.css功能驿站页面完整样式(Banner + 筛选栏 + 双栏布局 + 图文卡片 + 侧边栏 + niko动画 + 搜索框 + 最近说说 + 响应式 + 卡片类型徽标)
备注引用「基底星砂」;4px 蓝色竖线标题装饰;暗夜孟菲斯风格;v0.1.8 新增 .station-card-type 类型徽标(文=粉/说=青,封面右上角圆形)
归档模块 Seed 10
seed/10-archive.md
归档星图配置
路径
src/data/archive-config.ts功能定义 SeasonKey/SeasonSpec/SEASON_SPECS/SEASON_ORDER/YEAR_SEASON_IMAGES,提供 getSeasonByMonth/getSeasonImage/calcSeasonProgress/calcDayProgress 等工具函数
备注被「归档沉浸幕」「季节归档块」「时光计量仪」引用;季度月份范围:春3-5 / 夏6-8 / 秋9-11 / 冬12-1,2;百分比精确到 5 位小数
归档公告
路径
src/content/spec/archive.md功能归档页面的自定义公告 markdown 内容,frontmatter 仅含 title/description,正文会被「归档沉浸幕」用 Content 组件渲染到 .archive-announce 区
备注被「归档沉浸幕」引用;正文支持 ::: tip 容器指令
归档展开条
路径
src/components/archive/ArchiveRevealBar.tsx功能页面刷新后从中间向两边展开到 80% 宽的条状动画,requestAnimationFrame + quartic ease-out 快入缓出;等待 `#page-loading-overlay` 添加 `is-done` class 或被移除后才开始动画
备注引用「基底星砂」「归色过渡幕」;被「归档沉浸幕」引用;client:load;用 MutationObserver 监听 overlay class 变化与 body childList;props: widthPercent/duration
时光计量仪
路径
src/components/archive/ArchiveTimeCounter.tsx功能实时显示「今年是 X 年的第 N 天 / 本季度已过 xx.xxxxx% / 今天已过 xx.xxxxx%」,0.2s 刷新,5 位小数,百分比文字带轻微脉冲动画
备注引用「归档星图配置」的 calcSeasonProgress/calcDayProgress;被「归档沉浸幕」引用;client:load
年份实心标题
路径
src/components/archive/ArchiveYearTitle.tsx功能实心年份大标题,默认黑色仅白色边框,点击循环上色(粉/青/黄霓虹色),COLOR_CYCLE 数组驱动
备注引用「基底星砂」;被「归档沉浸幕」引用;client:load;props: year
季节归档块
路径
src/components/archive/ArchiveSeasonBlock.astro功能单个季度的归档块,含季度大标题(中文+英文+年份)+ 文章/说说条目列表(箭头svg+日期+标题,文章粉箭头/说说青箭头,条目含 data-tags 与 data-category 属性供客户端标签/分类筛选)+ 巨大半透明季度英文水印(pointer-events: none)+ 图片触发点
备注引用「归档星图配置」的 SEASON_SPECS;被「归档沉浸幕」引用;props: year/season/entries/imgSrc;v0.2.5 起 entry 增加 data-category
归档副筛窗
路径
src/components/archive/ArchiveDetail.astro(内嵌「驿站双维筛」StationTagFilter)功能归档筛选模式下显示的副筛窗,交叉显示另一维度(标签筛→分类列表;分类筛→标签列表),点击叠加 ?tag=&category= 双维筛选,隐藏底部跳转按钮与切换按钮
备注复用「驿站双维筛」的 lockMode+hideActions+archiveSub 变体;被「归档沉浸幕」内嵌;client:load;v0.2.5 新增
归档沉浸幕
路径
src/components/archive/ArchiveDetail.astro功能归档页面主体,复刻 PostDetail 结构(背景层+网格画布+进度柱+图令执行器+锯齿线+侧舷),侧舷内依次渲染:展开条 → 文章总数摘要 → :::::: 分割 → 时光计量仪 → :::::: 分割 → 自定义公告 → :::::: 分割 → 筛选横幅 → 归档副筛窗 → 年份+季节归档块;支持 URL ?tag= 与 ?category= 单维或叠加筛选(隐藏展开条/摘要/计量仪/公告,显示横幅+副筛窗+年份季节块,客户端按 tag+category 叠加过滤条目)
备注引用「文章背景层」「文章网格画布」「文章进度柱」「文章图令执行器」「文章锯齿线」「归档展开条」「时光计量仪」「年份实心标题」「季节归档块」「驿站双维筛」「归档星图配置」「归档星图样式」「驿站样式」「文仓总管」「文仓索引」;被「归档入口」引用;PostImageSwitcher 传入 triggerLine={vh:40};v0.2.5 起支持 ?category= 与双维叠加筛选+副筛窗
归档入口
路径
src/pages/archive.astro功能归档星图页面路由 /archive/,组装承重骨架 + 顶舷灯塔 + 归档沉浸幕 + 落日余晖
备注引用「承重骨架」「顶舷灯塔」「落日余晖」「归档沉浸幕」
归档星图样式
路径
src/styles/archive.css功能归档页面完整样式(侧舷容器+展开条+摘要行+分割线+计量仪+公告+年份标题+季节块+水印+条目+触发点+进度柱+主容器)
备注引用「基底星砂」提供 CSS 变量;被「归档沉浸幕」通过 import 引入;与「文章侧舷」布局保持一致以便复用 PostProgressBar 滚动监听
评论与统计模块 Seed 7
seed/11-comment.md
归色回响盒
路径
src/components/comment/TwikooComment.tsx功能Twikoo 评论区容器,运行时加载 twikoo.js 并初始化;带 `data-exclude-progress` 属性,进度柱计算时排除该区域
备注React 组件 client:load;动态注入 twikoo.js CDN(1.7.15);暗夜孟菲斯主题适配(粉色按钮+青色输入框);被「文章沉浸幕」「说说沉浸幕」填充到 `comments` slot
twikoo 数据星槎
路径
src/lib/twikoo-fetch.ts功能构建时拉取 twikoo 评论数据的接口预留(stub)
备注导出 `fetchTalkComments`/`fetchTalkCommentsBatch`;当前返回空数组,等待主人升级 twikoo 云函数至支持 `comment_get` HTTP API 的版本后启用;预留请求格式 `POST {TWIKOO_BASE_URL}/ body={event:"comment_get",eventId:"/talks/{id}/"}`
朋友圈数据星槎
路径
src/lib/talk-feed.ts功能批量获取多说说的评论树,按说说 id 分组为 Map<talkId, TwikooCommentTree[]>
备注引用「twikoo数据星槎」fetchTalkCommentsBatch;导出 `getTalkCommentsMap(talkIds)`;将 path `/talks/{id}/` 转换为 talkId 作为 key;被「说说朋友圈流」引用
相对时间星槎
路径
src/lib/relative-time.ts功能客户端实时计算「X分钟前/X小时前/X天前/YYYY-MM-DD」
备注导出 `formatRelativeTime(iso, now?)`;阈值:<60s=刚刚,<60min=X分钟前,<24h=X小时前,<7d=X天前,>=7d=YYYY-MM-DD;构建时只写 ISO 时间戳到 `data-datetime` 属性,客户端 JS 实时格式化;被「朋友圈动态卡」的相对时间逻辑引用(TalkList.astro 内联脚本中复用此逻辑)
点赞统计星槎
路径
src/lib/like-stats.ts功能构建时从 cache 文件读取 umami 点赞数
备注cache 文件 `src/content/.likes-cache.json`(不进 git);导出 `readLikesCache`/`getLikeCount`;cache 不存在时返回空 Map,不中断构建;被「说说点赞键」「文章点赞键」引用
归色点赞路由
路径
src/pages/like/[slug].astro功能虚拟路由,被 umami 自动统计 pageview,用作说说/文章的点赞计数器
备注getStaticPaths 枚举所有说说(`talk-{id}`)+ 文章(`post-{slug}`);HTML 含 umami 脚本+display:none body;非 iframe 直接访问跳 `/home/`;被「说说点赞键」「文章点赞键」用隐藏 iframe 加载触发统计
点赞预取脚本
路径
scripts/fetch-likes.mjs功能构建前调 umami API 拉取所有虚拟路由的 pageviews,写入 cache 文件
备注从 `.env` 读 `UMAMI_BASE_URL`/`UMAMI_USERNAME`/`UMAMI_PASSWORD`/`UMAMI_WEBSITE_ID`;调 `/api/auth/login` 拿 token,再调 `/api/websites/{id}/stats?path=...` 拿 pageviews;任何步骤失败都不中断构建;npm run build 前置调用
niko 挂件模块 Seed 13
seed/12-niko-pendant.md
GIF解码器
路径
src/lib/gif-decoder.ts功能纯 JS GIF89a 解码器,手动解析帧;浏览器对 hidden/off-screen img 不播放 GIF,故手动解析帧并按时间戳取帧
备注导出 GifFrame 接口与 GifDecoder 类;支持透明色、disposal method、interlace、NETSCAPE loop count、LZW 解码;被「挂件渲染器」引用
挂件默认配置
路径
src/components/niko-pendant/pendant-config.ts功能从 no-cursor/config.js 迁移的默认参数集,含 assets/fixedAnchor/followCursor/visual/physics/anchors/state/engine3/timing 九大分组
备注导出各分组 config interface 与 DEFAULT_PENDANT_CONFIG 常量;assets 路径指向 /assets/niko-pendant/000~005.gif;v0.1.7 state 组新增挂壁参数(edgeStickEnabled/MinVelocity=1667/DurationSec=1.0/MaxRopeStretch=2.0/ViewportMargin=20);被所有挂件模块引用
挂件物理引擎
路径
src/components/niko-pendant/PendantPhysics.ts功能Verlet 积分绳子物理——距离约束、拉伸保护、锚点平滑插值、pinPendantAt/unpinPendant 拖拽支持、applyRandomHitImpulse 点击冲击
备注从 no-cursor/pendant.js 迁移;导出 PendantPhysics 类;保留原作的 constraintStiffness/damping/gravityScale;新增 pinPendantAt/unpinPendant 支持拖拽;被「挂件状态机」「挂件渲染器」「挂件拖拽舵」「挂件主循环」引用
挂件状态机
路径
src/components/niko-pendant/PendantState.ts功能gif1→gif2 (下垂5s)→gif3 (下垂10s) 状态切换;hit 由点击触发;dizziness 仅 followCursor 模式启用(鼠标快速晃动让 niko 眩晕);edge 挂壁由高速穿越分界线触发
备注导出 GifKey 类型与 PendantState 类;v0.1.7 移植复刻版 UpdateEdgeStickState——updateEdgeStick(dt, zones) 每帧检测球位穿越分界线(沿穿越轴速度≥1667px/s),吸附 1s、绳拉伸超 REST_LEN×2 或被拖拽/hit 时脱落;速度判定按穿越轴分量(原作为 vH+vV×0.5 混合速,改动为支持水平边缘);被「挂件渲染器」「挂件主循环」引用
挂壁分界线星槎
路径
src/components/niko-pendant/EdgeStickZones.ts功能收集 niko 可挂壁的竖直/水平分界线——视口四边(内缩 20px)+ 页面内 `data-niko-hang` 标记元素的四周边缘
备注导出 EdgeStickZone 接口与 collectEdgeStickZones 函数;元素列表每 1000ms 缓存刷新,边缘坐标每帧 getBoundingClientRect 实时读取(跟随滚动/sticky/transform);display:none 元素 rect 全 0 天然跳过;标记点:「文章沉浸幕」「说说沉浸幕」文字块左分界线、「驿站内容」右侧栏各组件;被「挂件状态机」「挂件主循环」引用
挂件渲染器
路径
src/components/niko-pendant/PendantRenderer.ts功能Canvas 绘制绳子(贝塞尔平滑)+ niko GIF 帧(按时间戳取帧)+ 锚点把手(黄色圆点);hitTest 命中检测供「挂件拖拽舵」使用;挂壁吸附时不随绳角旋转、撞右缘时水平镜像
备注引用「GIF解码器」「挂件默认配置」「挂件物理引擎」「挂件状态机」;导出 PendantRenderer 类;async _loadGifs 预加载 6 个 GIF;DPR 自适应;被「挂件拖拽舵」「挂件主循环」引用
挂件拖拽舵
路径
src/components/niko-pendant/DragController.ts功能拖拽 niko(pinPendantAt)与拖拽锚点(setFixedAnchor);释放时把鼠标速度注入 unpinPendant;点击 niko(按下抬起位移<4px 且<400ms)触发 hit
备注引用「挂件物理引擎」「挂件状态机」「挂件渲染器」;导出 DragController 类与 PendantAppLike 接口(避免循环依赖);canvas pointer-events:none,事件在 window capture 阶段捕获;命中 niko/锚点时才 preventDefault,未命中放行让页面正常响应;被「挂件主循环」引用
挂件主循环
路径
src/components/niko-pendant/PendantApp.ts功能requestAnimationFrame 调度 + 全局鼠标追踪 + 光标跟随模式(followCursor 启用时锚点目标设为鼠标位置)+ 眩晕检测(每 100ms 一次)+ 挂壁检测(物理推进后调用 updateEdgeStick)
备注引用「挂件物理引擎」「挂件状态机」「挂件渲染器」「挂件拖拽舵」「挂壁分界线星槎」;导出 PendantApp 类(implements PendantAppLike);监听 resize/mousemove/touchmove;loop 内每帧推进物理、挂壁检测、状态机、渲染;followCursor 启用时自动隐藏锚点把手 + 启用眩晕;被「niko吊挂画布」引用
niko挂件配置
路径
src/components/niko-pendant/NikoPendantConfig.ts功能localStorage 读写访问层——loadUserConfig/saveUserConfig/resetUserConfig + buildRuntimeConfig 合并默认配置
备注导出 NikoPendantUserConfig 接口与 DEFAULT_USER_CONFIG 常量;STORAGE_KEY = `niko-pendant-config-v1`;缺失字段用默认值补齐;被「niko吊挂画布」「niko配置表单」引用
niko吊挂画布
路径
src/components/niko-pendant/NikoPendantCanvas.tsx功能React 包装层,挂载到「承重骨架」全站可见;mount 时读取 localStorage 配置 → 构建 runtime config → new PendantApp;监听 `niko-pendant:config-update` 事件实时应用新配置;召唤阵未激活前不渲染
备注引用「挂件主循环」「niko挂件配置」「挂件默认配置」;client:load;canvas position:fixed inset:0 z-index:9999 pointer-events:none(事件由 DragController 在 window 捕获);被「承重骨架」引用
niko配置分区
路径
src/components/niko-config/NikoConfigSection.tsx功能可复用的配置项分组容器,接收 title 与 children
备注导出 NikoConfigSectionProps 接口与默认组件;被「niko配置表单」引用
niko配置表单
路径
src/components/niko-config/NikoConfigForm.tsx功能控制面板的 React 版——物理参数滑杆(挂件大小/绳长/绳段数/重力/挂件质量)、锚点位置、绳子颜色、显示开关(挂件/锚点把手)、光标跟随开关(默认不选中)、送走 niko 按钮;保存后 dispatch `niko-pendant:config-update` 事件让「niko吊挂画布」实时应用
备注引用「niko挂件配置」「niko配置分区」;client:load;送走 niko 清空 `niko-summon-activated`/`niko-summon-progress`/`niko-summon-bed-shown` 并刷新页面;被「niko配置入口」引用
niko配置入口
路径
src/pages/niko-config.astro功能/niko-config/ 路由,挂载「niko配置表单」
备注引用「承重骨架」「顶舷灯塔」「顶舷留白」「落日余晖」「niko配置表单」;暗夜孟菲斯风格——粉色硬阴影标题 + 青色虚线分区 + 胶囊圆角按钮
公共模块 Seed 7
seed/13-common.md
归色文契
路径
src/components/common/InfoBlock.astro功能详情页底部信息块——左侧偏上:标题 + 绝对 URL;左侧偏下:作者 / 发布于 / 许可协议(CC BY-NC-SA 4.0);右侧偏下:闹钟 icon + 「距今已经过去 X天X时X分X秒」(每秒更新);右侧 [cc] 图标水印
备注引用「流逝时间星槎」;被「说说沉浸幕」「文章沉浸幕」引用;elapsed time 由 data-elapsed 属性 + setInterval 每秒更新;visibilitychange 暂停后台更新
图令灯箱
路径
src/components/common/ImageLightbox.tsx功能单图浏览模式——全屏覆盖 + ESC 关闭 + 点击遮罩关闭;监听 `lightbox:open` 事件(detail: {src, alt})打开对应图片
备注client:load;打开时 body overflow:hidden;图片带缩放动画;被「说说沉浸幕」「文章沉浸幕」「文章附件」引用
流逝时间星槎
路径
src/lib/elapsed-time.ts功能formatElapsed(iso) → 「X天X时X分X秒」字符串,基于 Date.now() 与传入 ISO 时间戳差值计算
备注纯函数无副作用;被「归色文契」引用
图景隐文键
路径
src/components/common/TextVeilToggle.astro功能详情页桌面版(>768px)左下角 fixed 胶囊按钮(left:16px/bottom:20px),点击卡片 3D 翻转切换 `body[data-text-veil]` 状态——「on」时文字块(.post-side-panel / .talk-side-panel)opacity→0、pointer-events:none,顶舷灯塔(.navbar)opacity→0、pointer-events:none(仅淡出不位移),背景遮罩 .post-bg-overlay opacity→0.12,分界线锚点(.post-divider-anchor / .talk-divider-anchor)opacity→0,让背景图更沉浸;恢复时所有元素 0.4s ease 淡入;正面粉色眼睛图标,背面青色眼睛关闭图标;辉光替代硬阴影(粉/青辉光随状态切换并 0.4s 过渡,避免翻转解体感)
备注纯 .astro + 内联 script,无需 client:load;移动端不显示;不持久化偏好,每次进页面默认显示;被「文章沉浸幕」「说说沉浸幕」引用
标题导航轨
路径
src/components/common/HeadingNavRail.tsx功能详情页左上角固定悬浮胶囊(left:24px/top:80px,避开 4px 进度柱 + 进度文字 + 顶部导航栏),竖排显示「当前标题 + 下 2 个」共 3 个标题;h2 霓虹青「■」、h3 霓虹黄「└」缩进区分层级;滚动时根据标题元素相对视口位置(TOP_OFFSET=120px)实时高亮当前标题;点击平滑滚动到对应标题(带偏移);小屏(≤640px)隐藏
备注client:load;headings 为空时 return null 不渲染;监听 window scroll + resize;被「文章沉浸幕」「说说沉浸幕」引用;headings 来自 Astro render()(文章)或「说说 markdown 渲染星槎」(说说)
图景占位幕
路径
src/components/common/ImagePlaceholder.astro功能图片占位组件——16:9 canvas 叠层 <img>,加载中/失败/无封面时显示暗夜孟菲斯大字占位;有封面加载中→容器一圈光辉(CSS box-shadow 光晕,暗示有封面正在加载);加载完成→占位淡出露出真实图片;加载失败→占位永久显示且光辉消失;无封面→纯大字无光辉
备注引用「占位绘制星槎」;默认 16:9 比例,外部 class 可覆盖 aspect-ratio(九宫格 1:1 场景);被「文章星卡」「朋友圈九宫格」「驿站星卡」引用;暗调色板由 toneIndex 轮换
图景占位幕·React版
路径
src/components/common/ImagePlaceholder.tsx功能与 Astro 版(ImagePlaceholder.astro)行为等价的 React 版图片占位组件——canvas 叠层 <img>,加载中/失败/无封面时显示暗夜孟菲斯大字占位;有封面加载中→容器一圈光辉;加载完成→占位淡出露出真实图片;加载失败→占位永久显示且光辉消失;无封面→纯大字无光辉;ResizeObserver 监听容器尺寸变化重绘
备注引用「占位绘制星槎」;与 Astro 版不同的是宽度/高度由父容器决定(不默认 16:9);被「驿站信息流」引用;暗调色板由 toneIndex 轮换
关于我模块 Seed 6
seed/14-about-me.md
归色者基本设定
路径
src/components/about-me/BasicProfile.astro功能关于我页面的基本设定块(昵称/生日/MBTI/身份/坐标/成分,双列网格)
备注引用「关于我样式」;被「关于我入口」引用;内容为园主自填设定资料,改动直接编辑文件 frontmatter
归色者社联卡
路径
src/components/about-me/SocialCard.astro功能关于我页面的聊天与社交块(聊天风格/社交电量/联系渠道/欢迎话题 chips)
备注引用「关于我样式」;被「关于我入口」引用;内容为园主自填设定资料
归色者味蕾图鉴
路径
src/components/about-me/FoodPrefs.astro功能关于我页面的吃喝偏好块(爱喝爱吃黄 chips/口味立场/雷区粉色删除线 chips)
备注引用「关于我样式」;被「关于我入口」引用;内容为园主自填设定资料
人生历程星轨
路径
src/components/about-me/LifeTimeline.astro功能关于我页面的人生历程时间轴(上=最早 → 下=最晚,2010.05.19 出生起共 11 条;粉青黄渐变轨道 + 发光节点 + 日期胶囊)
备注引用「关于我样式」;被「关于我入口」引用;每条带 data-reveal + --reveal-delay 阶梯延迟(70ms 递增封顶 420ms),由「星轨入场仪」驱动入场
星轨入场仪
路径
src/components/about-me/TimelineReveal.ts功能滚动入场动画驱动——IntersectionObserver 监听 [data-reveal] 元素,进入视口加 .is-revealed 触发 CSS 过渡(淡入+上移36px+轻微缩放)
备注单导出 initTimelineReveal;不支持 IO 的浏览器直接全部显示;prefers-reduced-motion 时 CSS 侧跳过动画;被「关于我入口」引用
关于我样式
路径
src/styles/about-me.css功能关于我页面全部样式(名片卡 + 四个区块 + 时间轴 + 滚动入场动画 + 响应式)
备注引用「基底星砂」提供配色变量;v0.1.8 从 about-me.astro 内联 style 迁入并扩展;也被「关于入口」复用 about-block/about-profile-* 类
友链模块 Seed 9
seed/15-friends.md
友链契约
路径
src/types/friend.ts功能Friend / FriendGroupId / FriendAccent / FriendGroup 类型契约
备注Friend 字段与对外申请格式 `satisfies Friend` 一致(title/desc/link/avatar/rss?/screenshot?/back_link)
友链星簿
路径
src/data/friends.ts功能友链页唯一数据源(博主名片 my + 申请公约 apply + 三分组 groups)
备注远端 JSON 优先——构建时读取 `src/data/friends-remote.json`(由「数据同步星槎」拉取 D1 `friends` 表生成),三个分组的 `friends` 字段从该 JSON 注入;JSON 缺失/解析失败时回退到硬编码兜底(当前硬编码为空数组,可后续手动追加);`my` 与 `apply` 始终硬编码(博主名片与公约不靠 D1);分组顺序固定:故交满座(朋友友链, yellow) → 见贤思齐(自推友链, cyan) → 未来可期(互加友链, pink)
友链沉浸幕
路径
src/components/friends/FriendUniverse.astro功能友链页总装:页头幕 → 博主星卡 → 三组星群 → 归色公约 → Twikoo 评论区(path=/friends/)
备注引用「友链星簿」「友链样式」「归色回响盒」;Twikoo envId 与说说/文章详情一致(TWIKOO_BASE_URL,回退 twikoo.8765777.xyz)
友链页头幕
路径
src/components/friends/FriendHero.astro功能大标题「归色者坐标集」+ 世界观引入文案 + 锯齿/波点孟菲斯装饰
博主星卡
路径
src/components/friends/FriendMyCard.astro功能本站坐标卡(头像/标题/desc/链接)+「复制友链信息」胶囊按钮
备注复制内容为 ts 代码块格式(与申请格式一致),头像自动拼成绝对地址;clipboard API + textarea 回退,按钮短暂反馈「已复制」
友链星群
路径
src/components/friends/FriendGroup.astro功能单个分组区块(组名/原义胶囊/锯齿装饰/标语/卡片网格)
备注空组自动渲染两张「虚位以待」占位卡(呼吸虚线边框)
友链星卡
路径
src/components/friends/FriendCard.astro功能单条友链卡片,双态:默认仅头像+标题,hover/focus 浮现 desc+link
备注移动端(hover:none)点一下展开、再点跳转、点空白收起(内联脚本事件委托);头像带 referrerpolicy="no-referrer" 防防盗链
归色公约
路径
src/components/friends/FriendApplyGuide.astro功能申请要求 + 申请方式(评论锚点 / mailto 胶囊按钮)+ Friend 代码格式高亮展示 + 「信息可能会被适当修改」声明
友链样式
路径
src/styles/friends.css功能友链页全部样式(页头/博主星卡/星群网格/星卡双态/公约代码块/胶囊按钮/响应式/prefers-reduced-motion)
感谢模块 Seed 1
seed/16-thanks.md
隆重感谢页入口
路径
src/pages/thanks.astro功能/thanks/ 路由,8 块色块纵向排列,每块引用 about-me.css 的 about-block 样式体系,内含卡片网格/数据表/居中文案
备注从 /about/ 页的「跳转到隆重感谢页面」按钮和 /niko-config/ 页的文字链接两处可进入;页头有「返回关于本站」链接
RSS与站点地图模块 Seed 3
seed/17-rss-sitemap.md
归色信使
路径
src/pages/rss.xml.ts功能`/rss.xml` 端点,合并 posts + talks(status===1)按 published 倒序取前 20 条,输出 RSS 2.0 + atom:link 自引用
站点地图索引
路径
src/pages/sitemap-index.xml.ts功能`/sitemap-index.xml` 端点,输出 `<sitemapindex>` 指向 `/sitemap-0.xml`
站点地图正文
路径
src/pages/sitemap-0.xml.ts功能`/sitemap-0.xml` 端点,输出 `<urlset>`,含 10 静态页 + 全部文章详情 + 公开说说详情