Files
YschcmsService/src/main/resources/templates/themes/mint-breeze/assets/css/main.css
T
chenxing d2df12b91e
build / build-push (push) Successful in 51s
feat(theme)!: 下线粉/紫两包,改以学院蓝为基座交付 academic-navy/campus-azure 两套高校官网风皮肤
线上 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 项通过
2026-09-19 20:21:30 +08:00

618 lines
19 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ============================================================
* mint-breeze 皮肤包样式(blue-white 派生,docs/10 皮肤包契约 §5)
* 清新薄荷风:薄荷青品牌色 + 圆角 12px + 柔和阴影 + 卡片网格列表
* + 几何圆点装饰与大留白;无纹理、无通栏大图、无复杂动效。
* 轮播图设计尺寸约定:1920×560(管理端上传端按此引导裁剪)。
* ============================================================ */
:root {
--primary: #17A2A2;
--primary-dark: #0F7C7C;
--primary-light: #E6F6F6;
--text: #2F3E3C;
--text-light: #7D8F8C;
--bg: #F5FBFA;
--card-bg: #FFFFFF;
--border: #DDF0EE;
--radius: 12px;
--radius-sm: 8px;
--radius-pill: 999px;
--shadow-soft: 0 6px 18px rgba(15, 124, 124, .08);
--shadow-hover: 0 12px 28px rgba(15, 124, 124, .14);
--max-width: 1200px;
}
* { box-sizing: border-box; }
body {
margin: 0;
font-family: "PingFang SC", "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif;
color: var(--text);
background: var(--bg);
}
a { color: inherit; text-decoration: none; transition: color .15s ease; }
a:hover { color: var(--primary); }
img { max-width: 100%; }
time, .item-meta { color: var(--text-light); font-size: 13px; }
.empty { color: var(--text-light); text-align: center; padding: 32px 0; }
/* ===== 头部:细线顶栏 + 居中品牌行 + 白底导航(桌面吸顶) ===== */
.site-header {
position: sticky;
top: 0;
z-index: 90;
background: var(--card-bg);
box-shadow: var(--shadow-soft);
}
/* 细线顶栏:院系切换在左、站内搜索在右;院系未配置时搜索仍靠右 */
.top-bar {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 16px;
padding: 7px max(16px, calc((100% - var(--max-width)) / 2 + 16px));
border-bottom: 1px solid var(--border);
font-size: 13px;
}
.top-bar .site-colleges { margin-right: auto; }
/* 居中品牌行:两侧几何圆点装饰(纯 CSS,无纹理) */
.brand-row {
position: relative;
display: flex;
justify-content: center;
padding: 18px 16px 14px;
}
.brand-row::before, .brand-row::after {
content: "";
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 46px;
height: 10px;
opacity: .45;
background-image:
radial-gradient(circle, var(--primary) 2.2px, transparent 2.8px),
radial-gradient(circle, var(--primary) 1.6px, transparent 2.2px),
radial-gradient(circle, var(--primary) 1.1px, transparent 1.7px);
background-repeat: no-repeat;
background-position: left center, center center, right center;
}
.brand-row::before { left: 6%; }
.brand-row::after { right: 6%; }
.site-brand { display: flex; align-items: center; gap: 14px; }
.site-logo { height: 52px; }
.site-name {
font-size: 28px;
font-weight: 600;
letter-spacing: .02em;
color: var(--primary-dark);
}
.site-name:hover { color: var(--primary); }
.site-search { display: flex; align-items: center; }
.site-search input {
border: 1px solid var(--border);
border-right: none;
border-radius: var(--radius-pill) 0 0 var(--radius-pill);
padding: 7px 16px;
width: 220px;
outline: none;
background: var(--card-bg);
color: var(--text);
transition: border-color .15s ease, box-shadow .15s ease;
}
.site-search input:focus {
border-color: var(--primary);
box-shadow: 0 0 0 3px var(--primary-light);
}
.site-search button {
border: none;
background: var(--primary);
color: #fff;
padding: 7px 20px;
border-radius: 0 var(--radius-pill) var(--radius-pill) 0;
cursor: pointer;
transition: background .15s ease;
}
.site-search button:hover { background: var(--primary-dark); }
/* ===== 专业院系下拉(院系子站切换):胶囊开关 + 圆角白卡面板 ===== */
.site-colleges { position: relative; }
.site-colleges .colleges-toggle {
display: inline-flex;
align-items: center;
gap: 6px;
border: 1px solid var(--border);
border-radius: var(--radius-pill);
padding: 5px 14px;
cursor: pointer;
color: var(--primary-dark);
font-weight: 600;
white-space: nowrap;
transition: border-color .15s ease, background .15s ease;
}
.site-colleges:hover .colleges-toggle {
border-color: var(--primary);
background: var(--primary-light);
}
.site-colleges .colleges-arrow { font-style: normal; font-size: 12px; color: var(--primary); }
.site-colleges .colleges-menu {
display: none;
position: absolute;
top: 100%;
left: 0;
min-width: 200px;
max-height: 420px;
overflow-y: auto;
margin: 0;
padding: 8px 0;
list-style: none;
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: var(--radius);
box-shadow: var(--shadow-hover);
z-index: 110;
}
.site-colleges:hover .colleges-menu { display: block; }
.site-colleges .colleges-menu li a {
display: block;
margin: 0 8px;
padding: 9px 12px;
border-radius: var(--radius-sm);
color: var(--text);
white-space: nowrap;
}
.site-colleges .colleges-menu li a:hover { background: var(--primary-light); color: var(--primary-dark); }
.site-colleges .colleges-menu li.active a { color: var(--primary); font-weight: 600; }
/* ===== 主导航:白底 + 柔和文字层级,当前项圆点标记 ===== */
.site-nav { background: var(--card-bg); border-top: 1px solid var(--border); }
.site-nav ul {
max-width: var(--max-width);
margin: 0 auto;
padding: 0 16px;
list-style: none;
display: flex;
justify-content: center;
flex-wrap: wrap;
}
.site-nav li a {
position: relative;
display: block;
padding: 13px 20px;
color: var(--text);
font-weight: 500;
}
.site-nav li a:hover { color: var(--primary); }
.site-nav li.active a { color: var(--primary); font-weight: 600; }
/* 几何圆点:当前栏目下方的小圆点 */
.site-nav li.active > a::before {
content: "";
position: absolute;
left: 50%;
bottom: 5px;
width: 5px;
height: 5px;
transform: translateX(-50%);
border-radius: 50%;
background: var(--primary);
}
/* ===== 二级下拉导航:圆角白卡面板 ===== */
.site-nav > ul > li { position: relative; }
.site-nav li.has-sub > a::after { content: " ▾"; font-size: 12px; opacity: .7; }
.site-nav ul.sub-nav {
display: none;
position: absolute;
top: 100%;
left: 0;
min-width: 168px;
max-width: none;
margin: 0;
padding: 8px 0;
list-style: none;
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: var(--radius);
box-shadow: var(--shadow-hover);
z-index: 100;
}
.site-nav li:hover > .sub-nav { display: block; }
.site-nav .sub-nav li a {
margin: 0 8px;
padding: 9px 12px;
border-radius: var(--radius-sm);
color: var(--text);
font-weight: 400;
white-space: nowrap;
background: none;
}
.site-nav .sub-nav li a:hover { background: var(--primary-light); color: var(--primary-dark); }
.site-nav .sub-nav li.active a { color: var(--primary); font-weight: 600; }
/* ===== 首页轮播:容器内圆角卡片(非通栏),几何圆点指示器 ===== */
.banner {
position: relative;
grid-column: 1 / -1; /* .home-main 是三列网格,轮播必须跨满整行,否则被塞进首列变窄条 */
width: min(var(--max-width), calc(100% - 32px));
margin: 24px auto 0;
border-radius: var(--radius);
overflow: hidden;
box-shadow: var(--shadow-soft);
}
.banner-slides { position: relative; height: 400px; }
.banner-slide { display: none; position: absolute; inset: 0; }
.banner-slide.active { display: block; }
.banner-slide img { width: 100%; height: 100%; object-fit: cover; }
.banner-title {
position: absolute;
left: 0; right: 0; bottom: 0;
padding: 14px 20px;
color: #fff;
font-weight: 500;
background: linear-gradient(transparent, rgba(20, 63, 61, .62));
}
.banner-dots {
position: absolute;
bottom: 14px; right: 20px;
display: flex; gap: 8px;
}
.banner-dots button {
width: 9px; height: 9px;
border-radius: 50%;
border: none;
background: rgba(255, 255, 255, .55);
cursor: pointer;
transition: background .15s ease, transform .15s ease;
}
.banner-dots button.active { background: #fff; transform: scale(1.25); }
/* ===== 首页区块:卡片网格(头条通栏 + 栏目块一行 3 张) ===== */
.home-main {
max-width: var(--max-width);
margin: 0 auto;
padding: 28px 16px 56px;
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 24px;
}
.top-strip, .category-block {
background: var(--card-bg);
border-radius: var(--radius);
box-shadow: var(--shadow-soft);
padding: 24px;
}
.top-strip { grid-column: 1 / -1; }
/* 栏目标题:几何圆点标记(环形点),标题中等粗细、层级柔和 */
.section-title, .block-head h2 {
margin: 0 0 14px;
font-size: 19px;
font-weight: 600;
letter-spacing: .02em;
display: flex;
align-items: center;
gap: 10px;
}
.section-title::before, .block-head h2::before {
content: "";
flex: none;
width: 9px;
height: 9px;
border-radius: 50%;
background: var(--primary);
box-shadow: 0 0 0 3.5px var(--primary-light);
}
.block-head { display: flex; align-items: center; justify-content: space-between; }
.more {
flex: none;
font-size: 13px;
color: var(--text-light);
padding: 4px 12px;
border: 1px solid var(--border);
border-radius: var(--radius-pill);
transition: color .15s ease, border-color .15s ease, background .15s ease;
}
.more:hover {
color: var(--primary-dark);
border-color: var(--primary);
background: var(--primary-light);
}
.top-strip ul, .block-list { list-style: none; margin: 0; padding: 0; }
.top-strip li, .block-list li {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 10px 0;
border-bottom: 1px dashed var(--border);
}
.top-strip li:last-child, .block-list li:last-child { border-bottom: none; }
.top-strip li a, .block-list li a {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.top-badge {
flex: none;
color: var(--primary-dark);
background: var(--primary-light);
font-size: 12px;
font-weight: 500;
padding: 2px 10px;
border-radius: var(--radius-pill);
}
/* ===== 列表页:卡片网格(默认一行 3 张;listLayout=row 切换行列表) ===== */
.list-main {
max-width: var(--max-width);
margin: 0 auto;
padding: 28px 16px 56px;
}
.breadcrumb { color: var(--text-light); font-size: 13px; margin-bottom: 14px; }
.breadcrumb a { margin-right: 8px; }
.breadcrumb span { margin-left: 8px; }
.page-title {
font-size: 24px;
font-weight: 600;
letter-spacing: .02em;
margin: 0 0 22px;
display: flex;
align-items: center;
gap: 10px;
}
.page-title::before {
content: "";
flex: none;
width: 9px;
height: 9px;
border-radius: 50%;
background: var(--primary);
box-shadow: 0 0 0 3.5px var(--primary-light);
}
.article-list {
list-style: none;
margin: 0;
padding: 0;
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 20px;
}
.article-list li {
background: var(--card-bg);
border-radius: var(--radius);
box-shadow: var(--shadow-soft);
padding: 22px 20px;
display: flex;
flex-direction: column;
gap: 10px;
transition: transform .18s ease, box-shadow .18s ease;
}
.article-list li:hover { transform: translateY(-3px); box-shadow: var(--shadow-hover); }
.item-title {
font-size: 16px;
font-weight: 600;
line-height: 1.55;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.article-list li:hover .item-title { color: var(--primary); }
.item-summary {
color: var(--text-light);
font-size: 13.5px;
line-height: 1.7;
margin: 0;
flex: 1;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
}
.item-meta {
display: flex;
gap: 10px;
align-items: center;
margin-top: auto;
padding-top: 10px;
border-top: 1px dashed var(--border);
}
/* 布局变体:传统行列表(themeParams listLayout=row,见 list.html classappend) */
.list-rows .article-list { display: block; }
.list-rows .article-list li { display: block; margin-bottom: 16px; }
.list-rows .item-summary { -webkit-line-clamp: 2; flex: none; }
.list-rows .item-meta { border-top: none; padding-top: 0; margin-top: 6px; }
/* ===== 分页:胶囊页码 ===== */
.pagination {
display: flex;
gap: 8px;
justify-content: center;
flex-wrap: wrap;
padding: 28px 0 4px;
}
.pagination a {
min-width: 36px;
text-align: center;
padding: 6px 12px;
border: 1px solid var(--border);
border-radius: var(--radius-pill);
background: var(--card-bg);
font-size: 14px;
transition: color .15s ease, border-color .15s ease, background .15s ease;
}
.pagination a:hover { color: var(--primary-dark); border-color: var(--primary); }
.pagination a.active { background: var(--primary); color: #fff; border-color: var(--primary); }
/* ===== 详情/单页:整卡承载,正文舒适行距 ===== */
.detail-main {
max-width: var(--max-width);
margin: 0 auto;
padding: 28px 16px 56px;
}
.detail-main .article {
background: var(--card-bg);
border-radius: var(--radius);
box-shadow: var(--shadow-soft);
padding: 36px 40px;
}
.article-title {
margin: 4px 0 14px;
font-size: 26px;
font-weight: 600;
letter-spacing: .02em;
text-align: center;
}
.article-meta {
display: flex;
gap: 18px;
justify-content: center;
flex-wrap: wrap;
color: var(--text-light);
font-size: 13px;
padding-bottom: 18px;
border-bottom: 1px solid var(--border);
}
.article-content { line-height: 1.9; font-size: 16px; padding-top: 22px; word-break: break-word; }
.article-content img { height: auto; border-radius: var(--radius-sm); }
.article-content table { border-collapse: collapse; width: 100%; }
.article-content table td, .article-content table th { border: 1px solid var(--border); padding: 6px 10px; }
.article-sibling { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 20px; font-size: 14px; }
.article-sibling a {
flex: 1 1 320px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
background: var(--card-bg);
border-radius: var(--radius);
box-shadow: var(--shadow-soft);
padding: 14px 18px;
transition: transform .18s ease, box-shadow .18s ease, color .15s ease;
}
.article-sibling a:hover {
color: var(--primary-dark);
transform: translateY(-2px);
box-shadow: var(--shadow-hover);
}
/* ===== 页脚:浅薄荷底 + 圆点分隔条(三态渲染逻辑不动) ===== */
.site-footer {
margin-top: 40px;
background: var(--primary-light);
color: var(--text);
border-top: 1px solid var(--border);
}
.site-footer::before {
content: "";
display: block;
height: 8px;
width: min(var(--max-width), calc(100% - 32px));
margin: 18px auto 0;
background-image: radial-gradient(circle, var(--primary) 1.6px, transparent 2.2px);
background-size: 16px 8px;
background-repeat: repeat-x;
opacity: .4;
}
.footer-links {
max-width: var(--max-width);
margin: 0 auto;
padding: 18px 16px 0;
display: flex;
flex-direction: column;
gap: 10px;
}
.links-group { display: flex; flex-wrap: wrap; gap: 6px 14px; align-items: center; font-size: 13px; }
.group-name { font-weight: 600; margin-right: 4px; color: var(--primary-dark); }
.links-group a {
padding: 3px 10px;
border-radius: var(--radius-pill);
transition: background .15s ease, color .15s ease;
}
.links-group a:hover { background: rgba(255, 255, 255, .75); color: var(--primary-dark); }
.footer-info {
max-width: var(--max-width);
margin: 0 auto;
padding: 14px 16px 24px;
text-align: center;
font-size: 13px;
color: var(--text-light);
}
.footer-info p { margin: 4px 0; }
/* B4 友链 Logo:与名称并排小图(高度 ~20px,垂直居中;过宽截断不撑破页脚) */
.links-group a .link-logo {
height: 20px;
width: auto;
max-width: 64px;
object-fit: contain;
vertical-align: middle;
margin-right: 4px;
border-radius: 4px;
}
/* ===== 平板(≤992px):网格降为两列,隐藏品牌行圆点装饰 ===== */
@media (max-width: 992px) {
.home-main { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.article-list { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.brand-row::before, .brand-row::after { display: none; }
}
/* ===== 移动端(≤768px):取消吸顶,网格单列,导航横向滑动 ===== */
@media (max-width: 768px) {
.site-header { position: static; }
.top-bar { padding: 8px 14px; justify-content: flex-start; flex-wrap: wrap; }
.top-bar .site-colleges { margin-right: 0; }
.site-search { flex: 1; }
.site-search input { flex: 1; width: auto; min-width: 0; }
.brand-row { padding: 14px 16px 10px; }
.site-logo { height: 40px; }
.site-name { font-size: 22px; }
.site-nav ul {
justify-content: flex-start;
flex-wrap: nowrap;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.banner-slides { height: 200px; }
.home-main { grid-template-columns: minmax(0, 1fr); padding: 18px 14px 40px; }
.article-list { grid-template-columns: minmax(0, 1fr); }
.detail-main .article { padding: 22px 16px; }
.article-title { font-size: 21px; }
/* 触屏无 hover:子菜单静态平铺(缩进列表),不做浮层 */
.site-nav ul.sub-nav {
display: block;
position: static;
border: none;
box-shadow: none;
background: transparent;
min-width: 0;
padding: 0 0 6px;
}
.site-nav .sub-nav li a { margin: 0; padding: 8px 16px 8px 34px; border-radius: 0; color: var(--text-light); }
.site-nav .sub-nav li a:hover { background: var(--primary-light); color: var(--primary-dark); }
}
/* ===== 左侧栏目导航(docs/11):有二级节点的模块,栏目/文章页左侧展示兄弟目录 ===== */
.list-main.has-sidenav, .detail-main.has-sidenav { display: flex; align-items: flex-start; gap: 24px; }
.has-sidenav .list-body { flex: 1; min-width: 0; }
.side-nav { flex: none; width: 220px; background: var(--card-bg, #fff); border: 1px solid var(--border); overflow: hidden; }
.side-nav-head { background: var(--primary); color: #fff; font-size: 20px; font-weight: 700; text-align: center; padding: 18px 12px; letter-spacing: 2px; }
.side-nav-list { list-style: none; margin: 0; padding: 0; }
.side-nav-item + .side-nav-item { border-top: 1px dashed var(--border); }
.side-nav-item a { display: block; padding: 12px 16px; color: var(--text); text-decoration: none; font-size: 15px; transition: background .15s ease, color .15s ease; }
.side-nav-item a:hover { color: var(--primary); background: var(--bg); }
.side-nav-item.active a { background: var(--primary); color: #fff; font-weight: 600; text-decoration: none; }
/* 顶导航二级下拉当前项高亮(docs/11 顺带) */
.site-nav ul.sub-nav li.active a { color: var(--primary); }
@media (max-width: 768px) {
.list-main.has-sidenav, .detail-main.has-sidenav { flex-direction: column; gap: 12px; }
.side-nav { width: 100%; }
.side-nav-list { display: flex; overflow-x: auto; -webkit-overflow-scrolling: touch; }
.side-nav-item { flex: none; }
.side-nav-item + .side-nav-item { border-top: none; border-left: 1px dashed var(--border); }
.side-nav-item a { white-space: nowrap; }
}
@media print {
.side-nav { display: none; }
.list-main.has-sidenav, .detail-main.has-sidenav { display: block; }
}