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>
196 lines
5.7 KiB
CSS
196 lines
5.7 KiB
CSS
/* ============================================================
|
||
* v4.3 cover, author bar, actions, author card, nav, and related posts
|
||
* The cover stays inside the content column with a fixed aspect ratio box.
|
||
* ============================================================ */
|
||
|
||
/* ===== Cover (in-column ratio box) — legacy .single-cover ===== */
|
||
/* 高度由各模式的内联 padding-bottom 决定;此处不得再声明 padding-bottom,
|
||
* 否则会挤压绝对定位轮播内层(同样挂 .single-cover 类)的 content box。 */
|
||
.single-cover {
|
||
position: relative;
|
||
overflow: hidden;
|
||
border-radius: var(--main-radius, var(--radius, 8px));
|
||
box-shadow: 0 0 10px var(--main-shadow, rgba(116, 116, 116, 0.08));
|
||
margin-bottom: 20px;
|
||
}
|
||
|
||
.single-cover > .fit-cover,
|
||
.single-cover > img {
|
||
position: absolute;
|
||
inset: 0;
|
||
width: 100%;
|
||
height: 100%;
|
||
object-fit: cover;
|
||
}
|
||
|
||
.single-cover-con {
|
||
color: #fff;
|
||
padding: 15px 15px 10px 15px;
|
||
border-radius: 0 0 var(--main-radius, var(--radius, 8px)) var(--main-radius, var(--radius, 8px));
|
||
background-image: linear-gradient(0deg, rgba(29, 41, 49, 0.5), rgba(255, 255, 255, 0));
|
||
padding-top: 2em;
|
||
}
|
||
|
||
.single-cover-con a {
|
||
color: #fff;
|
||
}
|
||
|
||
.single-video .article-title,
|
||
.single-cover-con .article-title {
|
||
font-size: 18px;
|
||
font-weight: 700;
|
||
}
|
||
|
||
/* ===== Video Cover ===== */
|
||
.single-cover--video {
|
||
background: #000;
|
||
}
|
||
|
||
.single-cover--slide {
|
||
background: var(--color-bg-2, #f5f5f5);
|
||
}
|
||
|
||
.article-title + .img-badge,
|
||
.single-head-cover .img-badge.right,
|
||
.article-header .img-badge.right {
|
||
position: absolute;
|
||
top: 14px;
|
||
right: 14px;
|
||
z-index: 2;
|
||
}
|
||
|
||
.article-avatar {
|
||
position: relative;
|
||
}
|
||
|
||
/* line-form-line geometry owned by legacy-utilities.css (absolute full-width bottom).
|
||
* Here only ensure the meta row has height so the rule sits correctly. */
|
||
.article-header .article-avatar .relative {
|
||
margin-top: 20px;
|
||
position: relative;
|
||
min-height: 1px;
|
||
padding-bottom: 1px;
|
||
}
|
||
|
||
/* ===== Article Card ===== */
|
||
.article-card {
|
||
margin-bottom: 16px;
|
||
}
|
||
|
||
.article-card__header {
|
||
margin-bottom: 16px;
|
||
padding-bottom: 12px;
|
||
border-bottom: 1px solid var(--color-line);
|
||
}
|
||
|
||
.article-card__title {
|
||
font-size: clamp(1.25rem, 3vw, 1.75rem);
|
||
font-weight: 800;
|
||
margin: 0;
|
||
line-height: 1.35;
|
||
color: var(--color-ink);
|
||
}
|
||
|
||
|
||
|
||
/* ===== Video footer (legacy single-video-footer) ===== */
|
||
/* 内边距沿用 legacy 契约 .single-video-footer{padding:15px},
|
||
面包屑在 flex jsb at 行首,不再额外包装。 */
|
||
.single-head-cover .single-video-footer .article-title {
|
||
font-size: clamp(1.1rem, 2.4vw, 1.45rem); font-weight: 700; margin: 8px 0 0; line-height: 1.35;
|
||
}
|
||
.single-head-cover .featured-video-episode { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
|
||
.single-head-cover .featured-video-episode .switch-video {
|
||
display: inline-flex; align-items: center; max-width: 100%; padding: 6px 10px; border-radius: 8px;
|
||
background: var(--surface-2, rgba(0,0,0,.04)); color: var(--color-ink); font-size: 13px;
|
||
}
|
||
.single-head-cover .featured-video-episode .switch-video.active {
|
||
background: var(--color-primary-soft, rgba(240, 68, 148, 0.12)); color: var(--color-primary);
|
||
}
|
||
/* Cover meta pills + title-h-left */
|
||
.single-cover-con .article-title.title-h-left,
|
||
.single-cover .article-title.title-h-left {
|
||
color: #fff;
|
||
text-shadow: 0 1px 4px rgba(0, 0, 0, 0.45);
|
||
margin: 0;
|
||
}
|
||
.single-metabox .post-metas item,
|
||
.single-metabox .post-metas item a {
|
||
color: inherit;
|
||
opacity: 0.92;
|
||
margin-left: 10px;
|
||
font-size: 12px;
|
||
}
|
||
.single-metabox .post-metas item .fa,
|
||
.single-metabox .post-metas item i {
|
||
margin-right: 3px;
|
||
opacity: 0.9;
|
||
}
|
||
.article-avatar name.flex {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: 4px;
|
||
flex-wrap: nowrap;
|
||
min-height: 1.1em;
|
||
line-height: 1.1;
|
||
}
|
||
.article-avatar name.flex > .display-name {
|
||
line-height: 1.1;
|
||
}
|
||
.article-avatar name.flex > .img-icon,
|
||
.article-avatar name.flex > .jio-identity-certification-icon,
|
||
.article-avatar name.flex > .jio-identity-medal,
|
||
.article-avatar name.flex > .jio-user-level-icon,
|
||
.article-avatar name.flex > .jio-user-level-badge {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
width: auto;
|
||
height: 1.1em;
|
||
max-height: 1.1em;
|
||
max-width: 6em;
|
||
margin: 0;
|
||
padding-top: 0;
|
||
padding-bottom: 0;
|
||
line-height: 1;
|
||
vertical-align: middle;
|
||
box-sizing: border-box;
|
||
flex: 0 0 auto;
|
||
}
|
||
.article-avatar name.flex > .img-icon,
|
||
.article-avatar name.flex > .jio-identity-certification-icon,
|
||
.article-avatar name.flex > .jio-identity-medal,
|
||
.article-avatar name.flex > .jio-user-level-icon {
|
||
object-fit: contain;
|
||
}
|
||
.article-avatar name.flex > .jio-user-level-badge {
|
||
font-size: .78em;
|
||
white-space: nowrap;
|
||
}
|
||
|
||
|
||
|
||
/* Slide cover overlay (injected by jio_render_slider overlay_html) */
|
||
.jio-slider-wrapper--has-overlay,
|
||
.jio-slider-wrapper--scale {
|
||
position: relative;
|
||
overflow: hidden;
|
||
border-radius: var(--main-radius, var(--radius, 8px));
|
||
}
|
||
.jio-slider-wrapper--scale .new-swiper { position: absolute; inset: 0; width: 100%; height: 100%; }
|
||
.jio-slider-wrapper--scale .swiper-slide img.fit-cover { width: 100%; height: 100%; object-fit: cover; }
|
||
.jio-slider-overlay { position: absolute; inset: 0; z-index: 3; pointer-events: none; }
|
||
.jio-slider-overlay .abs-center.left-bottom {
|
||
pointer-events: none;
|
||
padding: 15px 15px 10px 15px;
|
||
color: #fff;
|
||
background-image: linear-gradient(0deg, rgba(29, 41, 49, 0.5), rgba(255, 255, 255, 0));
|
||
padding-top: 2em;
|
||
width: 100%;
|
||
box-sizing: border-box;
|
||
}
|
||
.jio-slider-overlay .article-title,
|
||
.jio-slider-overlay .article-title.title-h-left { color: #fff; text-shadow: 0 1px 4px rgba(0,0,0,.45); }
|
||
.jio-slider-overlay .breadcrumb a,
|
||
.jio-slider-overlay .breadcrumb li { color: rgba(255,255,255,.9); }
|