diff --git a/scripts/build-perf/content-lint.mjs b/scripts/build-perf/content-lint.mjs index 18ca567..f13a2e8 100644 --- a/scripts/build-perf/content-lint.mjs +++ b/scripts/build-perf/content-lint.mjs @@ -14,7 +14,11 @@ if (MODE === 'skip') { } const SKIP_PREFIX = ['/admin/', '/photos-originals/']; // admin=CMS 路由;photos-originals=部署期 rsync 叠加层(不在 dist,另有部署链保障) -const SKIP_FILE = new Set(['/404.html']); // Astro 404 页不参与配对 +const SKIP_FILE = new Set([ + '/404.html', // Astro 404 页不参与配对 + // 一次性预览路由(预览-选型-落地模式):只有 zh 版,配对检查豁免;选定后随路由一起删 + '/heatmap-preview/index.html', +]); diff --git a/src/components/geek/hm/Comet.astro b/src/components/geek/hm/Comet.astro new file mode 100644 index 0000000..ca7b8dc --- /dev/null +++ b/src/components/geek/hm/Comet.astro @@ -0,0 +1,238 @@ +--- +// 热力图动效预览方案「星轨」:格子即星——档位只决定微光强弱(越密越亮), +// 一颗彗星(accent 亮核 + 渐变长尾)沿水平正弦轨迹横掠全年网格, +// 途经的活跃星短暂闪烁后回落档位原色,掠完全图歇息片刻再折返——尾随行进方向甩。 +// 本文件是独立预览件:只新增、不改既有、零依赖零请求。 +import { loadHeatmap, levelOf } from '../../../lib/heatmap'; + +interface Props { + title: string; + concept: string; +} +const { title, concept } = Astro.props; + +// 数据获取失败(无 token / 无缓存)时 weeks 为空 → 网格空壳,引擎自然不启动 +let weeks: import('../../../lib/heatmap').HeatDay[][] = []; +try { ({ weeks } = await loadHeatmap()); } catch {} +--- + + + {title} + {concept} + + + + + + + + {weeks.map((w) => + w.map((d) => ( + + )), + )} + + + + + + + diff --git a/src/components/geek/hm/Fireflies.astro b/src/components/geek/hm/Fireflies.astro new file mode 100644 index 0000000..fd60a23 --- /dev/null +++ b/src/components/geek/hm/Fireflies.astro @@ -0,0 +1,213 @@ +--- +// 热力图动效预览 · 方案「萤火」:5 只萤火虫在网格包围盒内拟周期游走, +// 路过活跃格时短暂点亮(brightness + 微光晕)后指数衰减回落。 +// 密度语义始终由 ink 档位承载,accent 只出现在运动元素与瞬时高亮上 +import { loadHeatmap, levelOf } from '../../../lib/heatmap'; + +interface Props { + title: string; + concept: string; +} +const { title, concept } = Astro.props; + +let weeks: import('../../../lib/heatmap').HeatDay[][] = []; +try { + ({ weeks } = await loadHeatmap()); +} catch { + // 三级回落已在 lib 内处理;此处再守一层:空网格不破构建 +} +--- + + + {title} + {concept} + + + {weeks.map((w) => + w.map((d) => ( + + )) + )} + + {[0, 1, 2, 3, 4].map(() => )} + + + + + + diff --git a/src/components/geek/hm/InkBloom.astro b/src/components/geek/hm/InkBloom.astro new file mode 100644 index 0000000..db84532 --- /dev/null +++ b/src/components/geek/hm/InkBloom.astro @@ -0,0 +1,242 @@ +--- +// 热力图 v5 预览方案「墨染」:一年贡献按时间顺序洇墨—— +// 只走有贡献的格子,每到访一格便有一圈软光晕从格心洇开; +// 扫完一年后一道横向墨光掠过整幅,随后无缝进入下一轮。 +// 本文件是独立预览件:只新增、不改既有、零依赖零请求。 +import { loadHeatmap, levelOf } from '../../../lib/heatmap'; + +interface Props { + title: string; + concept: string; +} +const { title, concept } = Astro.props; + +// 数据获取失败(无 token / 无缓存)时 weeks 为空 → 网格空壳,引擎自然不启动 +let weeks: import('../../../lib/heatmap').HeatDay[][] = []; +try { ({ weeks } = await loadHeatmap()); } catch {} +--- + + + {title} + {concept} + + + {weeks.map((w) => + w.map((d) => ( + + )), + )} + + + + + + + diff --git a/src/components/geek/hm/Loom.astro b/src/components/geek/hm/Loom.astro new file mode 100644 index 0000000..e5d4716 --- /dev/null +++ b/src/components/geek/hm/Loom.astro @@ -0,0 +1,325 @@ +--- +// 热力图动效候选「织锦」(Loom):一枚梭子逐周穿行,途经的活跃格成结,织完整幅呼吸一次再重来。 +// 数据与现役 Heatmap 同源(src/lib/heatmap.ts);reduced-motion 下引擎不启动,静态网格即成品。 +import { loadHeatmap, levelOf } from '../../../lib/heatmap'; + +interface Props { + title: string; + concept: string; +} + +const { title, concept } = Astro.props; +let weeks: import('../../../lib/heatmap').HeatDay[][] = []; +try { + ({ weeks } = await loadHeatmap()); +} catch { + // 三级回落已在 lib 内处理;此处再守一层:空网格不破构建 +} + +// 纱线渐变尾:分 6 段递减透明度(单个 polyline 无法做沿路径的透明度渐变) +const YARN_SEGS = 6; +--- + + + {title} + {concept} + + + {weeks.map((week) => + week.map((day) => ( + + )) + )} + + + + {Array.from({ length: YARN_SEGS }).map(() => )} + + + + + + + + diff --git a/src/components/geek/hm/Tide.astro b/src/components/geek/hm/Tide.astro new file mode 100644 index 0000000..296c68d --- /dev/null +++ b/src/components/geek/hm/Tide.astro @@ -0,0 +1,220 @@ +--- +// 热力图 v5 预览方案「潮汐」:一道 135° 斜向光带周期性从左下扫向右上, +// 带锋经过的格子短暂提亮并微微上浮,带过即按列位错峰回落—— +// 像潮线退去时在沙滩上留下的一层层水痕。 +// 本文件是独立预览件:只新增、不改既有、零依赖零请求。 +import { loadHeatmap, levelOf } from '../../../lib/heatmap'; + +interface Props { + title: string; + concept: string; +} +const { title, concept } = Astro.props; + +// 数据获取失败(无 token / 无缓存)时 weeks 为空 → 网格空壳,引擎自然不启动 +let weeks: import('../../../lib/heatmap').HeatDay[][] = []; +try { ({ weeks } = await loadHeatmap()); } catch {} +--- + + + {title} + {concept} + + + {weeks.map((w) => + w.map((d) => ( + + )), + )} + + + + + + + diff --git a/src/pages/heatmap-preview.astro b/src/pages/heatmap-preview.astro new file mode 100644 index 0000000..e454ae2 --- /dev/null +++ b/src/pages/heatmap-preview.astro @@ -0,0 +1,47 @@ +--- +// 热力图 v5 预览页(一次性路由):贪吃蛇之上的五个更"美观向"方案并陈, +// 供用户点选;选定后落地正式开源页并删除本路由与 lint 白名单(预览-选型-落地模式)。 +// 五个方案组件由多队友并行产出(契约见各组件头注),全部共用 loadHeatmap 真实数据。 +import BaseLayout from '../layouts/BaseLayout.astro'; +import Heatmap from '../components/geek/Heatmap.astro'; +import InkBloom from '../components/geek/hm/InkBloom.astro'; +import Tide from '../components/geek/hm/Tide.astro'; +import Comet from '../components/geek/hm/Comet.astro'; +import Loom from '../components/geek/hm/Loom.astro'; +import Fireflies from '../components/geek/hm/Fireflies.astro'; +import { t } from '../i18n/ui'; +--- + + + 热力图 v5 · 候选方案 + + 五个候选均在现役「智能寻食蛇」之上重做动效语言——更安静、更文艺。数据同源(真实贡献), + reduced-motion 下全部退化为静态网格。选定后我会把它落进开源页并删除本预览页。 + + + + 现役参考 · P1 智能寻食蛇 + + + + + + + + + + +
{concept}
+ 五个候选均在现役「智能寻食蛇」之上重做动效语言——更安静、更文艺。数据同源(真实贡献), + reduced-motion 下全部退化为静态网格。选定后我会把它落进开源页并删除本预览页。 +