feat(theme)!: 下线粉/紫两包,改以学院蓝为基座交付 academic-navy/campus-azure 两套高校官网风皮肤
build / build-push (push) Successful in 51s

线上 10027 首页配了 home_layout 后走 themes/common 通用骨架,派生皮肤只换了页头页脚,
正文仍是骨架内置蓝灰卡(外加 cherry-bloom 的粉紫配色),用户判定"完全不能用"。

- 新增 academic-navy(学府藏蓝,an-)/campus-azure(青蓝校园,cz-):以 scholar-blue 为基座,
  各自自带 fragments/home-blocks.html 与 home.html 分发,news_grid/media_focus/compact/
  image_wall/card/ticker/gallery/links 八种区块形态全部由皮肤渲染,未知类型才回落通用骨架
- 两套皮肤 :root 把私有变量别名到 --primary/--text/--card-bg/--border/--radius 契约变量;
  中文行锁 nowrap+min-width:0+ellipsis,grid 轨道用 minmax(0,1fr) 防窄视口压塌
- 新闻背景带 .an-sec-bg/.cz-sec-bg 压 z-index:0、卡片抬到 1:绝对定位层默认画在普通流之上,
  不抬起会整张卡片泛成底图色(无头截图实测)
- common 骨架空态守卫改包 th:block(th:replace 优先级 100 先于 th:if 300)
- 删除 cherry-bloom/violet-iris;sql/upgrade_theme_academic_skins.sql 幂等改指存量站点
  (站点缓存 CacheNames.SITE TTL 30 分钟,改库后需重启或在管理端重存站点)
- 测试:AcademicSkinContractTest(区块自带/分发/CJK 行/变量别名/主色必须学术蓝/背景带层级/
  预览图不得沿用基座)、HomeBlocksCssContractTest、PortalHomeLayoutIT 端到端断言零 plb- 输出;
  全量 383 项通过
This commit is contained in:
chenxing
2026-09-19 20:21:30 +08:00
parent 52433f06a2
commit d2df12b91e
65 changed files with 5498 additions and 2118 deletions
@@ -105,11 +105,12 @@ class ThemeRegistryTest {
}
@Test
@DisplayName("新增包: cherry-bloom/violet-iris 注册成功,primary 与 default 及彼此互异(拷贝忘改哨兵)")
void cherryBloomAndVioletIrisRegisteredWithDistinctPrimary() {
@DisplayName("高校官网风新包: academic-navy/campus-azure 注册成功,主色与 default/scholar-blue 及彼此互异")
void academicSkinsRegisteredWithDistinctPrimary() {
String defaultPrimary = registry.get(ThemeRegistry.DEFAULT_THEME).param("primary").getDefaultValue();
String scholarPrimary = registry.get("scholar-blue").param("primary").getDefaultValue();
java.util.Map<String, String> seen = new java.util.LinkedHashMap<>();
for (String name : new String[] {"cherry-bloom", "violet-iris"}) {
for (String name : new String[] {"academic-navy", "campus-azure"}) {
ThemeInfo info = registry.get(name);
assertThat(info).as("%s 皮肤包必须注册(清单+必备模板+截图齐全)", name).isNotNull();
assertThat(info.getTitle()).isNotBlank();
@@ -117,9 +118,21 @@ class ThemeRegistryTest {
assertThat(primary).as("%s 应声明 primary 参数", name).isNotNull();
assertThat(primary.getDefaultValue())
.as("%s 的 primary 不得与 default 相同", name).isNotEqualTo(defaultPrimary);
assertThat(primary.getDefaultValue())
.as("%s 的 primary 不得与基座 scholar-blue 相同(拷贝忘改哨兵)", name)
.isNotEqualTo(scholarPrimary);
seen.put(name, primary.getDefaultValue());
}
assertThat(seen.get("cherry-bloom")).isNotEqualTo(seen.get("violet-iris"));
assertThat(seen.get("academic-navy")).isNotEqualTo(seen.get("campus-azure"));
}
@Test
@DisplayName("下线包: cherry-bloom/violet-iris 不再注册(粉/紫两包不符高校官网风,用户否决)")
void rejectedPinkSkinsAreGone() {
for (String name : new String[] {"cherry-bloom", "violet-iris"}) {
assertThat(registry.contains(name)).as("%s 必须已从皮肤库移除", name).isFalse();
assertThat(registry.get(name)).isNull();
}
}
@Test