feat: 前台标签接入 antd 组件、列表封面图、favicon 随站点 Logo 及侧栏收窄

- 前台列表/详情/标签页标签统一 antd Tag;标签页改 CheckableTagGroup 单选
  (选中态由组件承接,再点已选标签回到全部);移除首页标签筛选条,
  标签入口收敛至顶部「标签」页
- 公开列表新增 cover 字段(取正文第一张站内图,store.FirstImageRef),
  首页条目左侧显示封面缩略图,无图条目保持纯文字
- favicon 随站点 Logo:webui.Meta.Icon 服务端注入 index.html,
  前端 useSiteTitle 兜底(dev 模板占位符场景)并即时生效;
  设置页「重置默认」清空 Logo 后回退内置 /favicon.svg
- 后台侧栏改 antd Menu(inline 分组),宽度 256→208、窄侧栏档 224→184
This commit is contained in:
2026-09-09 11:51:06 +08:00
parent 5457aeaa33
commit 5bac272f6d
13 changed files with 199 additions and 174 deletions
+54 -78
View File
@@ -242,16 +242,16 @@ li.ant-dropdown-menu-item.pn-dd-item-active span {
li.ant-dropdown-menu-item.pn-dd-item-active svg {
color: var(--foreground);
}
/* 标签云(antd CheckableTag):计数用等宽字体,选中态反白 */
.pn-cloud-tag {
display: inline-flex;
}
.pn-cloud-tag a {
/* 标签云(antd CheckableTagGroup 单选):计数用等宽字体,选中态反白。
antd 会把 label 包进单个块级 span,行内排版由内层选择器承接 */
.pn-cloud-tag > span {
display: inline-flex;
align-items: center;
gap: 6px;
color: inherit;
text-decoration: none;
}
.pn-cloud-tag svg {
width: 14px;
height: 14px;
}
.pn-cloud-count {
font-family: var(--font-mono);
@@ -538,16 +538,36 @@ button.pn-login-back:hover {
padding-top: 56px;
padding-bottom: 24px;
}
.pn-home-filter {
margin-bottom: 8px;
}
.pn-home-post {
display: flex;
align-items: flex-start;
gap: 18px;
padding: 30px 0;
border-bottom: 1px solid var(--border);
}
.pn-home-post:last-child {
border-bottom: 0;
}
/* 封面缩略图(正文第一张图,无图不渲染) */
.pn-home-cover {
flex: none;
width: 104px;
height: 104px;
border-radius: var(--radius-md);
overflow: hidden;
border: 1px solid var(--border);
background: var(--muted);
}
.pn-home-cover img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}
.pn-home-post-main {
flex: 1;
min-width: 0;
}
.pn-home-date {
display: block;
margin-bottom: 10px;
@@ -640,32 +660,6 @@ button.pn-login-back:hover {
color: var(--muted-foreground);
white-space: nowrap;
}
/* 首页标签筛选条:链接型分段导航(配色走无 layer 类规则,
避免 antd 的 <a> 重置压过 utilities 层) */
.pn-home-filter a {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 32px;
padding: 0 12px;
border-radius: calc(var(--radius-md) - 3px);
font-size: 13px;
font-weight: 500;
white-space: nowrap;
color: var(--muted-foreground);
transition: color 0.15s ease;
}
.pn-home-filter a:hover {
color: var(--foreground);
}
.pn-home-filter a[aria-current='page'] {
background: var(--primary);
color: var(--primary-foreground);
}
.pn-home-filter a:focus-visible {
outline: 2px solid var(--primary);
outline-offset: 2px;
}
/* 首页分页器已由 antd Pagination 承接(.pn-home-pager 仅保留布局行) */
@media (max-width: 640px) {
.pn-home-content {
@@ -673,6 +667,12 @@ button.pn-login-back:hover {
}
.pn-home-post {
padding: 26px 0;
gap: 12px;
}
.pn-home-cover {
width: 72px;
height: 72px;
border-radius: var(--radius-sm);
}
.pn-home-post-title {
font-size: 20px;
@@ -1217,7 +1217,7 @@ button.pn-note-back:hover {
============================================================ */
.pn-admin-shell {
display: grid;
grid-template-columns: 256px minmax(0, 1fr);
grid-template-columns: 208px minmax(0, 1fr);
min-height: 100vh;
background: var(--background);
color: var(--foreground);
@@ -1285,58 +1285,34 @@ button.pn-note-back:hover {
letter-spacing: var(--tracking-tight);
color: var(--sidebar-foreground);
}
.pn-admin-section {
padding: 0 10px;
margin-bottom: -6px;
/* 侧栏导航(antd Menu inline):融入 sidebar 底色,沿用窄侧栏密度 */
.pn-admin-menu {
flex: 1;
min-height: 0;
background: transparent;
border-inline-end: 0 !important;
}
.pn-admin-menu .ant-menu-item-group-title {
padding: 8px 10px 4px;
font-size: 10.5px;
line-height: 1;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--muted-foreground);
}
.pn-admin-nav {
display: flex;
flex-direction: column;
gap: 2px;
}
.pn-admin-item {
display: flex;
align-items: center;
gap: 10px;
width: 100%;
.pn-admin-menu .ant-menu-item {
margin-inline: 6px;
width: auto;
min-height: 34px;
padding: 0 10px;
border: 0;
line-height: 34px;
border-radius: var(--radius-sm);
background: transparent;
color: var(--sidebar-foreground);
font-size: 13px;
font-weight: 500;
text-align: left;
text-decoration: none;
cursor: pointer;
transition: background-color 0.15s ease, color 0.15s ease;
color: var(--sidebar-foreground);
}
.pn-admin-item:hover {
background: var(--sidebar-accent);
color: var(--sidebar-accent-foreground);
}
.pn-admin-item.active {
background: var(--sidebar-primary);
color: var(--sidebar-primary-foreground);
font-weight: 600;
}
.pn-admin-item svg {
.pn-admin-menu .ant-menu-item svg {
width: 15px;
height: 15px;
flex: none;
color: var(--muted-foreground);
transition: color 0.15s ease;
}
.pn-admin-item:hover svg {
color: var(--sidebar-accent-foreground);
}
.pn-admin-item.active svg {
color: var(--sidebar-primary-foreground);
}
.pn-admin-foot {
display: flex;
@@ -1503,7 +1479,7 @@ button.pn-note-back:hover {
/* 响应式 */
@media (max-width: 1023px) {
.pn-admin-shell {
grid-template-columns: 224px minmax(0, 1fr);
grid-template-columns: 184px minmax(0, 1fr);
}
.pn-admin-content {
padding: 20px;