Files
wordpress-theme-aksrt/assets/css/routes/user-center/shell.css
T
kate522andClaude Opus 5 427968a721 chore(branding): remove leftover upstream theme identifiers
The theme was renamed Zibll/子比 → AKSRT → Jio, but upstream branding
survived the sweeps in CSS classes, the SVG sprite prefix, a persisted
widget field ID, JS events, admin Vue class names, test infrastructure
and docblocks.

Renames:
- zib-widget / zib-widget-wrap / zib-slider → jio-widget-box /
  jio-widget-box-wrap / jio-slider-box (jio-widget is taken by the modern
  widget shell, jio-box-* by the card primitives)
- zib-partners-scroll + zps-* → jio-partners-scroll + jps-*
- zib-combo-info-card + zci-* → jio-combo-info-card + jci-*
- zibsvg- → jiosvg-, including the exported picker helpers and the
  fa-zibsvg- family-prefix guard
- zibpay_type → pay_type; the dual-read fallback in PostQuery collapses
  to a single key
- [zibajax="submit"] dropped (no PHP emitter); zib_ajax.success →
  jio_ajax.success
- aks-* admin Vue classes → jio-*
- zib_palette() → palette()

User-facing vendor traces are gone: the floating "more" button default no
longer ships a zibll.com link or 子比主题 marketing copy, the notice
widget ships no preset promo entries, and the four 官网教程 links are
removed from the post-list admin schema.

Test infrastructure renamed to neutral names (docker-compose.reference.yml,
Caddyfile, article-baseline.json, modern-widgets-contract.test.cjs) with
their DB/volume/env/slug identifiers following.

Kept intentionally, documented in tests/fixtures/README.md: the golden
fixture reference fingerprint (a SHA-256 record of an external directory,
read by validate-widget-golden / generate-widget-golden-fixture /
audit-widget-system), the doesNotMatch guards that prove the old tokens are
gone, and the reference theme's own meta key in the visual fixtures.

No backward-compat or data migration: saved widget configs holding old
icon keys or the old field ID silently lose them, per the project's
rewrite-over-compatibility rule.

Verified: 132/132 node contract tests, php tests/widget-system/run.php
(146 assertions), audit-admin-contracts, audit-psr4-paths and
validate-widget-golden all green; tracked bundles regenerated and in sync.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-11-02 00:06:54 +08:00

592 lines
15 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.
/**
* User Center — shell / sidebar / content base / drawer
*/
/**
* Jio User Center — 本人中心专属样式
*
* 原主题风格两栏布局:左侧边栏 + 右侧内容区
* 仅在本人中心页面加载(body.jio-user-center)
*/
/* ==================== 用户中心容器 ==================== */
/* 主内容宽度由 frontend/layout.css 的 profile shell 合同统一管理。 */
.jio-profile.content-shell {
display: block;
width: 100%;
max-width: none;
padding: 0 0 40px;
box-sizing: border-box;
}
/* main 仍带 legacy .user-center 类;旧规则会把整页误设为 flex,并以
* gap:20px 挤窄第一个 flex 子项(顶部资料卡所在的 content-wrap)。 */
.jio-profile.user-center {
display: block;
gap: 0;
}
/* 顶部资料卡位于双栏布局之前,必须与用户中心外壳同宽,不能继续继承
* legacy .content-wrap / .container 的收窄规则。 */
.jio-profile.content-shell > .content-wrap,
.jio-profile.content-shell > .content-wrap > .uc-header,
.jio-profile.content-shell .uc-header {
width: 100%;
max-width: none;
box-sizing: border-box;
}
/* VIP, level and worn-medal marks share the global identity baseline. */
.uc-header__name > .img-icon,
h1.uc-header__name > .img-icon,
.uc-header__name .medal-icon.img-icon,
.uc-header__name .jio-identity-medal,
h1.uc-header__name .medal-icon.img-icon,
h1.uc-header__name .jio-identity-medal {
width: auto;
height: 1.1em;
max-width: 6em;
object-fit: contain;
vertical-align: -.15em;
margin-left: 4px;
display: inline-block;
border: none;
outline: none;
box-shadow: none;
background: transparent;
}
/* ==================== 页面自有双栏(对齐 legacy .user-center flex,不走全站 float 壳) ==================== */
/* DOM: sidebar first + content second(与 legacy user-center-sidebar / user-center-content 一致)。
* 选择器同时覆盖 body.jio-user-center 与 main.user-center / .jio-profile,避免 body class 漏打时失效。 */
body.jio-user-center .content-wrap,
.jio-profile .content-wrap,
.user-center .content-wrap {
float: none;
width: 100%;
min-width: 0;
}
/* 对齐 legacy: .user-center { display:flex; gap:20px; } */
body.jio-user-center .user-center-body,
body.jio-user-center .jio-profile__layout,
.jio-profile .user-center-body,
.jio-profile .jio-profile__layout,
.user-center .user-center-body {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-items: flex-start;
gap: 20px;
width: 100%;
margin-left: 0;
margin-right: 0;
min-width: 0;
box-sizing: border-box;
}
/* 中和 site-layout-2/3 对 content-layout 的 margin 挖空(兼容旧 class) */
body.jio-user-center.site-layout-1 .jio-profile__layout,
body.jio-user-center.site-layout-2 .jio-profile__layout,
body.jio-user-center.site-layout-3 .jio-profile__layout,
body.jio-user-center.site-layout-1 .user-center-body,
body.jio-user-center.site-layout-2 .user-center-body,
body.jio-user-center.site-layout-3 .user-center-body {
margin-left: 0;
margin-right: 0;
}
/* 对齐 legacy: .user-center .user-center-sidebar { width:320px; flex-shrink:0; } */
body.jio-user-center .user-center-sidebar,
body.jio-user-center .uc-sidebar,
body.jio-user-center .jio-profile__aside,
.jio-profile .user-center-sidebar,
.jio-profile .uc-sidebar,
.jio-profile .jio-profile__aside,
.user-center .user-center-sidebar {
float: none;
display: flex;
flex-direction: column;
gap: 0;
flex: 0 0 320px;
width: 320px;
max-width: 320px;
margin-left: 0;
margin-right: 0;
box-sizing: border-box;
min-width: 0;
position: sticky;
top: calc(var(--nav-height, 60px) + 20px);
align-self: flex-start;
}
/* 对齐 legacy: .user-center .user-center-content { width: calc(100% - 320px); } */
body.jio-user-center .user-center-content,
body.jio-user-center .uc-content,
.jio-profile .user-center-content,
.jio-profile .uc-content,
.user-center .user-center-content {
flex: 1 1 auto;
width: calc(100% - 340px);
min-width: 0;
max-width: none;
box-sizing: border-box;
}
.uc-header__actions {
position: relative;
display: flex;
align-items: center;
gap: 6px;
}
.uc-header__signin-btn.is-done {
color: var(--color-success, #10b981);
}
.uc-header__message-btn {
position: relative;
}
.uc-header__action-badge {
position: absolute;
top: -5px;
right: -5px;
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 16px;
height: 16px;
margin: 0;
padding: 0 4px;
border-radius: 999px;
background: var(--color-error, #ef4444);
color: #fff;
font-size: 11px;
font-weight: 700;
line-height: 1;
}
/* ==================== 左侧边栏 chrome ==================== */
/* sticky / 宽度由 .user-center-sidebar 负责;此处只定 section/btn 视觉 */
.uc-sidebar {
display: flex;
flex-direction: column;
gap: 0;
}
/* 侧栏卡片间距:1:1 参考主题。参考侧栏是普通块流,每张卡片自带 mb20
(jio-widget-box 默认也是 20px),≤640px 由 mb10-sm 收到 10px。
本站侧栏不用 gap,间距全部由卡片自己的 margin-bottom 承担。 */
.uc-sidebar > .uc-sidebar-statistics,
.uc-sidebar > .uc-sidebar-vip,
.uc-sidebar > .uc-sidebar__pair,
.uc-sidebar-centers > .jio-widget-box,
.uc-sidebar > .uc-sidebar-iconbox {
margin-bottom: 20px;
}
@media (max-width: 640px) {
.uc-sidebar > .uc-sidebar-statistics,
.uc-sidebar > .uc-sidebar-vip,
.uc-sidebar > .uc-sidebar__pair,
.uc-sidebar-centers > .jio-widget-box,
.uc-sidebar > .uc-sidebar-iconbox {
margin-bottom: 10px;
}
}
.uc-sidebar__section {
background: var(--surface-1);
border-radius: var(--main-radius, var(--radius, 8px));
padding: 16px;
box-shadow: 0 1px 4px rgba(15, 23, 42, 0.04);
border: 1px solid var(--color-line-soft, transparent);
}
.uc-sidebar__title {
font-size: 12px;
font-weight: 600;
color: var(--color-ink-4);
margin-bottom: 12px;
text-transform: uppercase;
letter-spacing: 0.05em;
padding-bottom: 8px;
border-bottom: 1px solid var(--color-line-soft, rgba(0,0,0,0.06));
}
/* 侧栏按钮组 */
.uc-sidebar__buttons {
display: flex;
flex-direction: column;
gap: 2px;
}
.uc-sidebar__btn {
display: flex;
align-items: center;
gap: 10px;
width: 100%;
padding: 10px 12px;
border: none;
border-radius: 8px;
background: transparent;
color: var(--color-ink-2);
text-decoration: none;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: background-color 0.15s, color 0.15s, box-shadow 0.15s;
text-align: left;
position: relative;
}
.uc-sidebar__btn::before {
content: '';
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
width: 3px;
height: 0;
background: var(--color-primary);
border-radius: 0 3px 3px 0;
transition: height 0.2s ease;
}
.uc-sidebar__btn:hover {
background: var(--surface-2);
color: var(--color-ink);
}
.uc-sidebar__btn.is-active {
background: var(--color-primary-soft);
color: var(--color-primary);
font-weight: 600;
}
.uc-sidebar__btn.is-active::before {
height: 20px;
}
.uc-sidebar__btn i {
width: 18px;
text-align: center;
font-size: 14px;
flex-shrink: 0;
opacity: 0.8;
}
.uc-sidebar__btn.is-active i {
opacity: 1;
}
.uc-sidebar__badge {
margin-left: auto;
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 18px;
height: 18px;
padding: 0 5px;
border-radius: 100px;
background: var(--color-error);
color: #fff;
font-size: 11px;
font-weight: 600;
line-height: 1;
animation: badge-pulse 2s ease-in-out infinite;
}
@keyframes badge-pulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.1); }
}
/* 移动端抽屉触发器 */
.uc-sidebar__drawer-trigger {
display: none;
position: fixed;
bottom: calc(80px + env(safe-area-inset-bottom, 0px));
right: calc(20px + env(safe-area-inset-right, 0px));
width: 50px;
height: 50px;
border-radius: 50%;
border: none;
background: var(--color-primary);
color: #fff;
font-size: 20px;
cursor: pointer;
box-shadow: 0 4px 16px rgba(0,0,0,0.25);
z-index: 100;
align-items: center;
justify-content: center;
transition: transform 0.2s, box-shadow 0.2s;
}
.uc-sidebar__drawer-trigger:hover {
transform: scale(1.02);
box-shadow: 0 6px 20px rgba(0,0,0,0.3);
}
.uc-sidebar__drawer-trigger:active {
transform: scale(0.92);
}
/* 抽屉遮罩 */
.uc-drawer-overlay {
display: none;
position: fixed;
inset: 0;
background: rgba(0,0,0,0.45);
backdrop-filter: blur(2px);
-webkit-backdrop-filter: blur(2px);
z-index: 200;
opacity: 0;
transition: opacity 0.3s;
}
.uc-drawer-overlay.is-visible {
display: block;
opacity: 1;
}
/* ==================== 右侧内容区 ==================== */
/* 宽度由 .user-center-content / flex 行负责;此处只定内容区 min-width */
.uc-content {
min-width: 0;
}
.uc-content .dashboard-panel {
background: var(--surface-1);
border-radius: var(--main-radius, var(--radius, 8px));
padding: 24px;
box-shadow: 0 1px 4px rgba(15, 23, 42, 0.04);
border: 1px solid var(--color-line-soft, transparent);
animation: panel-fade-in 0.25s ease;
}
@keyframes panel-fade-in {
from { opacity: 0; transform: translateY(6px); }
to { opacity: 1; transform: translateY(0); }
}
.uc-content .dashboard-panel.is-active {
display: block;
}
/* 面板内 widget-card 增强 */
.uc-content .widget-card {
border: 1px solid var(--color-line-soft, rgba(0,0,0,0.06));
border-radius: 10px;
padding: 20px;
margin-bottom: 16px;
background: var(--surface-1);
transition: box-shadow 0.2s;
}
.uc-content .widget-card:hover {
box-shadow: 0 2px 8px rgba(15, 23, 42, 0.06);
}
.uc-content .dashboard-panel:not(#panel-settings) > .widget-card,
.uc-content #panel-profile .profile-form > .widget-card {
background: transparent;
border: 0;
border-radius: 0;
box-shadow: none;
margin-bottom: 0;
padding: 0;
}
.uc-content .dashboard-panel:not(#panel-settings) > .widget-card:hover,
.uc-content #panel-profile .profile-form > .widget-card:hover {
box-shadow: none;
}
.uc-content #panel-profile .profile-form > .widget-card + .widget-card {
margin-top: 18px;
padding-top: 18px;
border-top: 1px solid var(--color-line-soft, rgba(0,0,0,0.06));
}
/* 文章 / 评论 / 收藏 / 粉丝:1:1 同构 sidebar statistics。
侧栏统计项没有专门样式,外观全部来自 jio-widget-box padding-10
与 em14 / em09 opacity5 mt6;链接交互来自全局 a / a:hover 与 a[href] 过渡:
常态正文色,悬停/聚焦切到 --focus-color,color 0.2s 过渡,无下划线、无 outline。 */
.uc-sidebar-statistics.jio-widget-box {
clear: both;
line-height: 1.42857143;
background-color: var(--main-bg-color);
box-shadow: 0 0 10px var(--main-shadow);
border-radius: var(--main-radius);
color: var(--main-color);
}
.uc-sidebar-statistics > .user-statistics-item {
color: var(--main-color);
text-decoration: none;
transition: color 0.2s, background 0.3s, opacity 0.3s, box-shadow 0.3s, transform 0.3s;
}
.uc-sidebar-statistics > .user-statistics-item:hover,
.uc-sidebar-statistics > .user-statistics-item:focus {
color: var(--focus-color, #f04494);
outline: 0;
text-decoration: none;
}
@media (max-width: 991.98px) {
.uc-sidebar > .uc-sidebar-statistics {
margin-right: 12px;
margin-left: 12px;
}
}
/* VIP 入口:1:1 同构 sidebar vip,外观全部来自
payvip-icon / badg / btn-block / abs-right。这里只补 <a> 与侧栏 gap 带来的差异。 */
.uc-sidebar .uc-sidebar-vip,
.uc-sidebar .uc-sidebar-vip:hover,
.uc-sidebar .uc-sidebar-vip:focus {
color: #ece0e0;
text-decoration: none;
}
/* legacy-utilities 把 .abs-right 改成 top:0/right:0,恢复垂直居中几何。 */
.uc-sidebar-vip > .abs-right {
top: 50%;
right: 0.7em;
transform: translateY(-50%);
}
.uc-sidebar-vip .img-icon {
height: 1em;
width: auto;
vertical-align: -0.1em;
}
/* 创作中心 / 推广中心:1:1 同构 sidebar income/rebate 入口。
.jio-widget-box 在本站不是全局类,在侧栏内按同名原值落地。 */
.uc-sidebar-centers > .jio-widget-box {
clear: both;
background-color: var(--main-bg-color);
padding: 10px;
box-shadow: 0 0 10px var(--main-shadow);
border-radius: var(--main-radius);
color: var(--main-color);
text-decoration: none;
}
.uc-sidebar-centers > .jio-widget-box:hover,
.uc-sidebar-centers > .jio-widget-box:focus {
color: var(--main-color);
}
@media (max-width: 991.98px) {
.uc-sidebar > .uc-sidebar-vip,
.uc-sidebar > .uc-sidebar__pair,
.uc-sidebar > .uc-sidebar-centers {
margin-right: 12px;
margin-left: 12px;
}
}
.uc-sidebar__pair {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
/* 参考主题余额 / 积分并排用 col-ml6,横向间距 6px。 */
gap: 6px;
}
.uc-summary-card {
min-width: 0;
border: 1px solid var(--color-line-soft, rgba(15, 23, 42, 0.06));
border-radius: var(--main-radius, var(--radius, 8px));
background: var(--surface-1);
box-shadow: 0 1px 4px rgba(15, 23, 42, 0.04);
color: var(--color-ink-2);
text-decoration: none;
}
.uc-summary-card {
padding: 14px;
}
.uc-summary-card__head,
.uc-summary-card__body {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
}
.uc-summary-card__head {
margin-bottom: 10px;
color: var(--color-ink-4);
font-size: 12px;
}
.uc-summary-card__body strong {
overflow: hidden;
font-size: 18px;
font-variant-numeric: tabular-nums;
letter-spacing: -0.02em;
text-overflow: ellipsis;
}
.uc-summary-card__body > i,
.uc-summary-card__body > svg {
font-size: 18px;
}
.uc-summary-card--wallet .uc-summary-card__body { color: #3978d6; }
.uc-summary-card--points .uc-summary-card__body { color: #ba7a0a; }
/* 我的服务 / 功能设置:1:1 同构 sidebar button 1/2。
外壳为 jio-widget-box padding-6,标题为普通字重的 padding-6 ml3;
网格项只继承正文色,无 hover / 选中变色。
正文行高是 bootstrap 的 1.42857143,本站 body 为 1.6,
标题、图标、文字三行会各自被撑高,这里恢复参考行高。 */
/* widgets/frontend.css 在 main.min.css 之后加载,其 .jio-widget-box{padding:15px} 会盖掉 .padding-6,这里按参考值锁回 6px。 */
.uc-sidebar-iconbox.jio-widget-box {
clear: both;
padding: 6px;
line-height: 1.42857143;
background-color: var(--main-bg-color);
box-shadow: 0 0 10px var(--main-shadow);
border-radius: var(--main-radius);
color: var(--main-color);
}
.user-icon-but-box > a {
width: calc(25% - 10px);
margin: 5px;
min-width: 50px;
max-width: 100px;
cursor: pointer;
color: inherit;
text-decoration: none;
}
.user-icon-but-box > a:hover,
.user-icon-but-box > a:focus {
color: inherit;
}
@media (max-width: 991.98px) {
.uc-sidebar > .uc-sidebar-iconbox {
margin-right: 12px;
margin-left: 12px;
}
}
.uc-follow-management__list { display: grid; gap: 10px; margin-top: 16px; }
.uc-follow-management__item { display: flex; align-items: center; gap: 12px; padding: 12px; border: 1px solid var(--border-color, rgba(15, 23, 42, .08)); border-radius: 12px; }
.uc-follow-management__avatar img { display: block; width: 48px; height: 48px; border-radius: 50%; }
.uc-follow-management__identity { display: grid; gap: 4px; min-width: 0; }
.uc-follow-management__identity a { color: var(--color-ink-1); font-weight: 600; }
.uc-follow-management__identity span { color: var(--color-ink-4); font-size: 12px; }
.uc-follow-management__actions { display: flex; flex-wrap: wrap; gap: 8px; margin-left: auto; }
@media (max-width: 560px) { .uc-follow-management__item { align-items: flex-start; flex-wrap: wrap; } .uc-follow-management__actions { width: 100%; margin-left: 60px; } }