diff --git a/public/admin/config.yml b/public/admin/config.yml index 95760e7..454b7fa 100644 --- a/public/admin/config.yml +++ b/public/admin/config.yml @@ -143,6 +143,73 @@ collections: - name: site_pages label: 页面文案 files: + - name: pages + label: 瞬间 / 书架 标题下的说明 + file: content/site/pages.yaml + format: yaml + hint: 这两页大标题下面那一行字,文字与样式都在这里改 + fields: + - label: 瞬间页 + name: moments + widget: object + required: false + fields: + - label: 说明文字 + name: note + widget: object + required: false + hint: 支持 markdown 与排版类(字体/颜色) + fields: + - { label: 中文, name: zh, widget: markdown, required: false } + - { label: English, name: en, widget: markdown, required: false } + - label: 样式 + name: style + widget: object + required: false + hint: 留空用全站默认;越界值会被自动夹取(不会破版) + fields: + - { label: 字号(px,11–16), name: size, widget: number, required: false, value_type: int, min: 11, max: 16 } + - label: 颜色 + name: color + widget: select + required: false + hint: 只开放灰阶层级,避免正文被染色 + options: [ink-1, ink-2, ink-3, ink-4] + - label: 字体 + name: font + widget: select + required: false + options: [font-sans, font-serif, font-kai, font-huiwen, font-kuaile, font-xiaowei, font-huangyou, font-mashanzheng, font-liujianmaocao, font-smiley, font-neoxihei] + - label: 书架页 + name: books + widget: object + required: false + fields: + - label: 说明文字 + name: note + widget: object + required: false + hint: 支持 markdown 与排版类(字体/颜色) + fields: + - { label: 中文, name: zh, widget: markdown, required: false } + - { label: English, name: en, widget: markdown, required: false } + - label: 样式 + name: style + widget: object + required: false + hint: 留空用全站默认;越界值会被自动夹取(不会破版) + fields: + - { label: 字号(px,11–16), name: size, widget: number, required: false, value_type: int, min: 11, max: 16 } + - label: 颜色 + name: color + widget: select + required: false + options: [ink-1, ink-2, ink-3, ink-4] + - label: 字体 + name: font + widget: select + required: false + options: [font-sans, font-serif, font-kai, font-huiwen, font-kuaile, font-xiaowei, font-huangyou, font-mashanzheng, font-liujianmaocao, font-smiley, font-neoxihei] - name: home label: 主页设置 file: content/site/home.yaml @@ -544,11 +611,19 @@ collections: fields: - { label: 中文, name: zh, widget: string } - { label: English, name: en, widget: string } - - label: 叙述(链接前) + - label: 叙述(推荐改这里) + name: story + widget: object + required: false + hint: '整段叙述写成一个字段即可(markdown + 排版类),链接直接写在句子里:[本站源码](https://git.wait4x.online/wait4x/blog) —— 这样就不用再分"链接前/链接后"。留空时才会退回下面的旧字段拼接' + fields: + - { label: 中文, name: zh, widget: markdown, required: false } + - { label: English, name: en, widget: markdown, required: false } + - label: 叙述(旧:链接前) name: blurb widget: object required: false - hint: 富文本(markdown + 排版类),渲染在仓库链接之前 + hint: 'legacy:仅当上面的「叙述」为空时才使用(历史字段,为把仓库链接夹在中间而拆成两半)' fields: - { label: 中文, name: zh, widget: string, required: false } - { label: 英文, name: en, widget: string, required: false } diff --git a/src/pages/heatmap-preview.astro b/src/pages/heatmap-preview.astro index 5652bad..4430433 100644 --- a/src/pages/heatmap-preview.astro +++ b/src/pages/heatmap-preview.astro @@ -1,10 +1,16 @@ --- /** - * 热力图动效方案预览 v2(Phase 5j)——用户看过 v1 五案后觉得不够,要求「类似贪吃蛇」的 - * 方案并再深入设计 4–6 个。本页给 6 个更深入的方案(F–K),v1 的 A–E 已下线。 + * 热力图动效方案 v3(Phase 5j)——用户选定方向「F+J」,但要求贪吃蛇能**循环**, + * 并希望再看几个新变体。故本页给四个蛇家族方案 + J 柱状图参考: * - * 设计红线(六案都守):灰阶骨架、accent 只做高亮不做数据编码(数据仍由 ink 四档承载)、 - * prefers-reduced-motion 一律静态、零第三方依赖、离开视口即停(省电)。 + * F1 循环贪吃蛇(GitHub README 蛇的循环逻辑) + * F2 生长蛇(吃得越多身体越长) + * F3 双蛇对开(两头同时吃,交汇于年中) + * FJ 蛇 + 月度柱联动(用户要的 F+J 组合) + * J 月度柱状图(单独保留作参考) + * + * 设计红线:accent 只做高亮不参与数据编码(数据密度仍由 ink 四档承载)、 + * prefers-reduced-motion 静态化、离开视口即停、零第三方依赖。 */ import BaseLayout from '../layouts/BaseLayout.astro'; import HeatGrid from '../components/geek/HeatGrid.astro'; @@ -14,7 +20,7 @@ const { weeks, total } = await loadHeatmap(); const days: HeatDay[] = weeks.flat(); const buildTime = new Date().toISOString().slice(0, 10); -/* ── 连续贡献(本地计算,口径:以最后一个有贡献的日子为终点往回数)── */ +/* 连续贡献(本地计算,口径:以最后一个有贡献的日子为终点往回数) */ const countOf = new Map(days.map((d) => [d.date, d.count])); const isoOf = (d: Date) => d.toISOString().slice(0, 10); const lastActive = [...days].reverse().find((d) => d.count > 0)?.date ?? ''; @@ -34,9 +40,8 @@ for (const d of days) { run = d.count > 0 ? run + 1 : 0; if (run > longest) longest = run; } -const bestDay = days.reduce((a, b) => (b.count > a.count ? b : a), days[0]); -/* ── 月度聚合(J 方案用)── */ +/* 月度聚合(J / FJ 用) */ const byMonth = new Map(); for (const d of days) { const key = d.date.slice(0, 7); @@ -44,102 +49,103 @@ for (const d of days) { } const months = [...byMonth.entries()].sort(([a], [b]) => a.localeCompare(b)); const maxMonth = Math.max(...months.map(([, v]) => v)); - -/* ── 最后活跃日的坐标(H 涟漪终点起点)── */ -const lastActiveIdx = days.findLastIndex((d) => d.date === lastActive); -const lastActiveCol = Math.floor(lastActiveIdx / 7); -const lastActiveRow = lastActiveIdx % 7; - -const stats = { total, current, longest, best: bestDay?.count ?? 0, bestDate: bestDay?.date ?? '' }; -const dataForClient = { cells: days.map((d) => d.count), weeks: weeks.length }; +const activeDays = days.filter((d) => d.count > 0).length; +const stats = { total, current, longest, activeDays }; --- - -

热力图:六个更深入的方案

+ +

热力图:蛇的四个变体

- 同一份真实数据(近一年 {stats.total} 次贡献 · 当前连续 - {stats.current} 天 · 最长 {stats.longest} 天 · 单日最高 {stats.best} 次), - 数据更新于 {buildTime}。 + 按你的选择做成 F + J 方向,并让蛇循环爬(学 GitHub README 蛇的 + 节奏:吃完一轮 → 停顿 → 清空 → 再来)。真实数据:近一年 {stats.total} 次贡献 · + {stats.activeDays} 天有贡献 · 当前连续 {stats.current} 天 · 数据更新于 {buildTime}。
- 上一版的五个方案已按你的反馈下线;这一版六个都往「有生命、有叙事」的方向推。 - 回字母告诉我选哪个(也可以说「F 但慢一点」「F + J 组合」)。 + 回字母告诉我选哪个(F1 / F2 / F3 / FJ / J),也可以说「FJ 但循环慢一点」。

- -
+ +
- F -

贪吃蛇

-

一条蛇沿着贡献格蛇形爬过:吃到有贡献的格子就把它们点亮并"长"一点,空格直接穿过。 - 优点最有生命感、天然表达"这一年被一点点吃掉";代价是持续动画(离开视口即暂停)。

+ F1 +

循环贪吃蛇

+

蛇沿格子蛇形爬一年,吃到有贡献的日子就点亮;爬到尽头停一拍、清空、重新开始, + 无限循环。身体保持 6 格长度(GitHub README 蛇手感)。

-
- +
+
-

准备出发… ·

+

准备出发… · 第 1 轮 · +

- -
+ +
- G -

心跳呼吸

-

每格按当日贡献量呼吸:越忙的日子跳得越快、越亮,静下来时整片缓慢起伏。 - 优点像一张"活的"心电图,无需交互;代价持续动画(纯 CSS,合成层,很省)。

+ F2 +

生长蛇

+

每吃到一天就长一节(最长 26 节),前半程是细蛇、后半程拖成长尾,吃完循环重置。 + 优点"积累"的隐喻最强;代价尾长时略挡格子。

-
- +
+
+

准备出发… · 蛇长 3 节

- -
+ +
- H -

雨滴涟漪

-

从"最后一次贡献"那一格出发,涟漪一圈圈向外扩散,扫过的格子闪一下再落定。 - 优点叙事清晰(现在 → 过去)、只播一次;代价纯装饰。

+ F3 +

双蛇对开

+

两条蛇分别从最早与最新一头出发对向而吃,在年中附近交汇,吃完一起循环。 + 优点更有戏剧性、时间感双向;代价两条同时动,注意力会被分走。

-
- +
+
-

· 起点 {lastActive}

+

准备出发…

- -
+ +
- I -

3D 地形

-

把贡献量当"海拔":忙的日子凸起来,整块网格随鼠标轻轻倾斜,像俯瞰一年的地貌。 - 优点一眼看出密集区、视觉独特;代价倾斜会略降可读性。

+ FJ +

蛇 + 月度柱联动 你的选择方向

+

蛇每爬进一个月,对应的柱子就同步升起并高亮;爬到年末时十二根柱子全部立起, + 然后蛇回到起点、柱子清零、再来一轮。优点格子与柱状图互相解释,信息与动感兼得。

-
-
- -
+
+
+
    + {months.map(([m, v], i) => ( +
  • + + {m.slice(5)} +
  • + ))} +
+

准备出发…

- -
+ +
J -

周冠军柱

-

网格下方按月长出一排柱子,进视口时逐根升起;指针移到柱子上,对应那些格子同时亮起。 - 优点把"哪几个月最忙"讲清楚、信息量大;代价多一层图表,页面变高。

+

月度柱状图

+

不带动效时的样子:进视口逐根升起,指针移到柱子上,对应月份的格子同时高亮。 + 可单独用,也可像 FJ 那样与蛇联动。

- +
    {months.map(([m, v]) => ( @@ -153,240 +159,192 @@ const dataForClient = { cells: days.map((d) => d.count), weeks: weeks.length };
- -
-
- K -

显微镜

-

指针所在处浮起一枚圆镜,把周围 5×5 的格子放大显示,并标出当天日期与次数。 - 优点小格子也读得清、趣味强;代价触屏需点按。

-
-
- - -
-

把指针移到任意格子上

-
+

数据口径:GitHub GraphQL 贡献日历,构建期快照({buildTime})。"减少动态效果"下全部静态;离开视口自动暂停。

-

数据口径:GitHub GraphQL 贡献日历,构建期快照({buildTime})。"减少动态效果"下六案全部静态。

- -