Files
wordpress-theme-aksrt/assets/css/frontend/modal-runtime.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

590 lines
16 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.
/**
* Modal runtime + ajax list primitives (shared).
*
* @package Jio
*/
/* ---- portal token bridge ----
*
* 弹窗由 runtime portal 到 <body>,因此它位于任何「页面级 token 作用域」之外。
* 典型陷阱:路由样式把语义别名挂在页面上,例如
*
* .jio-orders-page { --orders-ink: var(--color-ink, #333); }
*
* 弹窗内部再去 `var(--orders-ink)` 时该变量不存在,整条声明会被静默丢弃——
* 表现为边框消失、次级文字变透明,而不是抛错,排查成本很高。
*
* 因此共享调色板在这里声明:本壳层永远在 portal 内,任何弹窗都能直接消费
* `--modal-*`。路由样式应把自己的局部别名映射到这里,而不是映射到页面级变量。
*/
.jio-modal-runtime {
--modal-ink: var(--color-ink, #333333);
--modal-ink-2: var(--color-ink-2, #4e5358);
--modal-muted: var(--color-ink-3, #777777);
--modal-line: var(--color-line-stronger, rgba(50, 50, 50, 0.12));
--modal-line-soft: var(--color-line, rgba(50, 50, 50, 0.06));
--modal-surface: var(--surface-1, #ffffff);
--modal-surface-2: var(--surface-2, #eeeeee);
--modal-surface-3: var(--surface-4, #f8f8f8);
--modal-primary: var(--color-primary, #f04494);
--modal-on-primary: var(--color-on-primary, #ffffff);
--modal-warning: var(--color-warning, #f59e0b);
--modal-success: var(--color-success, #10b981);
--modal-danger: var(--color-danger, #ef4444);
}
/* ---- scroll lock ---- */
html.jio-modal-runtime-open,
body.jio-modal-runtime-open {
overflow: hidden;
}
/* ---- 对话框宽度类不得作用于壳 ----
触发器沿用参考主题的 data-class 语义(modal-mini/full-sm 等),
但这些类落在 fixed 全屏壳上时,.modal-mini 的 width:400px +
auto 边距会把壳压成居中单列,蒙版随之只覆盖一列。 */
.jio-modal-runtime.modal-mini,
.jio-modal-runtime.full-sm {
width: auto;
max-width: none;
margin: 0;
}
/* ---- modal runtime shell ---- */
.jio-modal-runtime {
position: fixed;
inset: 0;
z-index: 100050;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
visibility: hidden;
transition: opacity 0.2s ease, visibility 0.2s ease;
pointer-events: none;
}
.jio-modal-runtime.is-open {
opacity: 1;
visibility: visible;
pointer-events: auto;
}
.jio-modal-runtime.is-open.jio-modal-runtime--parent {
pointer-events: none;
}
.jio-modal-runtime.is-open.jio-modal-runtime--parent .jio-modal-runtime__dialog {
transform: scale(.98);
}
.jio-modal-runtime--child .jio-modal-runtime__overlay {
background: rgba(0, 0, 0, .2);
}
.jio-modal-runtime__overlay {
position: absolute;
inset: 0;
/* 参考主题 .modal-backdrop 同款:纯黑 50%,无模糊、无色调偏移 */
background: rgba(0, 0, 0, 0.5);
}
.jio-modal-runtime__dialog {
position: relative;
z-index: 1;
width: min(440px, calc(100vw - 32px));
max-height: min(88vh, 720px);
overflow: auto;
background: var(--surface-1, #fff);
border-radius: 16px;
box-shadow: 0 18px 48px rgba(15, 18, 28, 0.22);
transform: translateY(12px) scale(0.98);
transition: transform 0.22s cubic-bezier(0.22, 1, 0.36, 1);
color: var(--color-ink, #1f2937);
}
.jio-modal-runtime.is-open .jio-modal-runtime__dialog {
transform: translateY(0) scale(1);
}
.jio-modal-runtime--bottom {
align-items: flex-end;
}
.jio-modal-runtime--bottom .jio-modal-runtime__dialog {
width: 100%;
max-width: 100%;
border-radius: 16px 16px 0 0;
max-height: 90vh;
transform: translateY(24px);
}
.jio-modal-runtime--bottom.is-open .jio-modal-runtime__dialog {
transform: translateY(0);
}
.jio-modal-runtime__header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 16px 18px 0;
}
.jio-modal-runtime__title {
margin: 0;
font-size: 17px;
line-height: 1.35;
}
.jio-modal-runtime__content {
padding: 18px 18px 16px;
}
.jio-modal-runtime__loading,
.jio-modal-runtime__error-body {
padding: 28px 8px;
text-align: center;
color: var(--color-ink-2, #6b7280);
font-size: 14px;
}
.jio-modal-runtime__skeleton {
display: grid;
gap: 12px;
padding: 8px 2px;
}
.jio-modal-runtime__skeleton-line,
.jio-modal-runtime__skeleton-block {
display: block;
border-radius: 8px;
background: linear-gradient(90deg, rgba(148, 163, 184, 0.16), rgba(148, 163, 184, 0.3), rgba(148, 163, 184, 0.16));
background-size: 200% 100%;
animation: jio-modal-skeleton 1.2s ease-in-out infinite;
}
.jio-modal-runtime__skeleton-line {
width: 72%;
height: 12px;
}
.jio-modal-runtime__skeleton-line.is-wide {
width: 92%;
height: 18px;
}
.jio-modal-runtime__skeleton-line.is-short {
width: 44%;
}
.jio-modal-runtime__skeleton-block {
width: 100%;
min-height: 84px;
}
.jio-modal-runtime__retry {
cursor: pointer;
}
@keyframes jio-modal-skeleton {
0% { background-position: 100% 0; }
100% { background-position: -100% 0; }
}
.jio-modal-runtime .touch.border-title,
.jio-modal-runtime .border-title {
font-size: 16px;
font-weight: 700;
margin: 0 0 14px;
display: flex;
align-items: baseline;
flex-wrap: wrap;
gap: 6px;
}
.jio-modal-runtime .jio-modal-runtime__close {
position: absolute;
top: 10px;
right: 10px;
width: 32px;
height: 32px;
border: 0;
border-radius: 999px;
background: transparent;
color: var(--color-ink-3, #9ca3af);
cursor: pointer;
font-size: 18px;
line-height: 1;
}
.jio-modal-runtime .but-average.modal-buts,
.jio-modal-runtime .modal-buts {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
margin-top: 16px;
}
.jio-modal-runtime .but-average.modal-buts .but,
.jio-modal-runtime .modal-buts .but,
.jio-modal-runtime .modal-buts button {
min-height: 40px;
border-radius: 10px;
border: 1px solid var(--color-line, #e5e7eb);
background: var(--surface-4, #f3f4f6);
color: var(--color-ink, #111);
font-weight: 600;
cursor: pointer;
}
.jio-modal-runtime .modal-buts .but.c-blue,
.jio-modal-runtime .modal-buts button.c-blue,
.jio-modal-runtime .modal-buts .btn-primary {
background: var(--color-primary, #f04494);
border-color: color-mix(in srgb, var(--color-primary, #f04494) 70%, #000 0%);
color: var(--color-on-primary, #fff);
}
/* ---- 签到详情弹窗(参考主题 refresh_modal modal-mini 同构壳) ----
内容为服务端 HTML(modal-colorful-header + modal-body),与参考主题
.modal-dialog.modal-mini 几何 1:1:宽 400px、圆角 var(--main-radius)。 */
.jio-modal-runtime.jio-checkin-details-modal:not(.jio-modal-runtime--bottom) .jio-modal-runtime__dialog {
width: min(400px, calc(100vw - 32px));
border-radius: var(--main-radius, 8px);
background: var(--main-bg-color, #fff);
}
.jio-modal-runtime.jio-checkin-details-modal .jio-modal-runtime__content {
padding: 0;
}
.jio-modal-runtime.jio-checkin-details-modal .jio-modal-runtime__skeleton {
padding: 24px 18px;
}
/* ---- ajax list ---- */
.ajaxpager.is-ajax-loading {
position: relative;
min-height: 80px;
}
/* 骨架默认收起,由 JS 加 .is-loading 展开(参考主题 post_ajax 的 beforeSend
remove + fadeIn / success .hide() 语义等价物)。
这里不依赖 .ajaxpager 祖先:首页 tab pane、归档流、评论列表的 loader 层级各不
相同,而且并非每个 loader 都在 bootstrap 的 .tab-pane 里(bootstrap 只负责
隐藏 tab-pane 内的骨架),统一按类名自身控制。 */
.post_ajax_loader {
display: none;
}
.post_ajax_loader.is-loading {
display: block;
animation: jioFadeIn 0.2s ease both;
}
.ajax-item.is-fading {
opacity: 0.35;
transition: opacity 0.15s ease;
}
/* ---- 禁封用户弹窗(set_user_ban 模态框几何 1:1)----
编辑入口未传 data-class → 走 Bootstrap 默认
.modal-dialog(>=768px 宽 600px);data-height=360 → .modal-content 初始
高度 360 后动画至内容高度;mobile-bottom → <769px 底部抽屉。
此处以 min-height:360px 复刻初始高度契约,桌面宽取 600px。 */
.jio-user-ban-modal:not(.jio-modal-runtime--bottom) .jio-modal-runtime__dialog {
width: min(600px, calc(100vw - 32px));
border-radius: var(--main-radius, 8px);
background: var(--main-bg-color, #fff);
}
/* ---- 查看禁封状态 / 禁封申诉 / 禁封记录弹窗(参考主题 modal-mini 几何 1:1)----
参考主题三个链接均传 data_class='modal-mini'(宽 400px)、data-height=240。 */
.jio-user-ban-info-modal:not(.jio-modal-runtime--bottom) .jio-modal-runtime__dialog,
.jio-user-ban-appeal-modal:not(.jio-modal-runtime--bottom) .jio-modal-runtime__dialog,
.jio-user-ban-log-modal:not(.jio-modal-runtime--bottom) .jio-modal-runtime__dialog {
width: min(400px, calc(100vw - 32px));
border-radius: var(--main-radius, 8px);
background: var(--main-bg-color, #fff);
}
.jio-user-ban-info-modal .jio-modal-runtime__skeleton,
.jio-user-ban-appeal-modal .jio-modal-runtime__skeleton,
.jio-user-ban-log-modal .jio-modal-runtime__skeleton {
padding: 24px 18px;
}
.jio-user-ban-modal .jio-modal-runtime__skeleton {
padding: 24px 18px;
}
/* edit-header:与禁封表单头部同构(关闭钮靠右,红色警示徽标 + 标题居左)。 */
.jio-user-ban-modal .edit-header,
.jio-user-ban-appeal-modal .edit-header {
position: relative;
padding-right: 32px;
}
.jio-user-ban-modal .edit-header .close,
.jio-user-ban-appeal-modal .edit-header .close {
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
float: none;
font-size: 20px;
line-height: 1;
cursor: pointer;
background: none;
border: 0;
padding: 2px 6px;
}
/* 解封视图多彩横幅(多彩横幅头契约:c-yellow 配色变体):
120px 高绝对定位横幅 + 旋转彩斑,后续表单整体下移 120px。 */
.jio-user-ban-modal .modal-colorful-header,
.jio-user-ban-modal .colorful-bg,
.jio-user-ban-info-modal .modal-colorful-header,
.jio-user-ban-info-modal .colorful-bg,
.jio-user-ban-log-modal .modal-colorful-header,
.jio-user-ban-log-modal .colorful-bg {
position: relative;
overflow: hidden;
color: var(--this-color);
background: var(--this-bg);
background-size: 120%;
}
.jio-user-ban-modal .modal-colorful-header,
.jio-user-ban-info-modal .modal-colorful-header,
.jio-user-ban-log-modal .modal-colorful-header {
position: absolute;
top: 0;
right: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
height: 120px;
border-radius: var(--main-radius, 8px) var(--main-radius, 8px) 0 0;
}
.jio-user-ban-modal .modal-colorful-header + *,
.jio-user-ban-info-modal .modal-colorful-header + *,
.jio-user-ban-log-modal .modal-colorful-header + * {
margin-top: 120px;
}
.jio-user-ban-modal .modal-colorful-header > .close,
.jio-user-ban-info-modal .modal-colorful-header > .close,
.jio-user-ban-log-modal .modal-colorful-header > .close {
position: absolute;
top: 10px;
right: 10px;
z-index: 9;
color: var(--this-color);
font-size: 18px;
opacity: 0.6;
}
.jio-user-ban-modal .colorful-bg > .colorful-make,
.jio-user-ban-modal .colorful-bg > .colorful-make::before,
.jio-user-ban-modal .colorful-bg > .colorful-make::after,
.jio-user-ban-info-modal .colorful-bg > .colorful-make,
.jio-user-ban-info-modal .colorful-bg > .colorful-make::before,
.jio-user-ban-info-modal .colorful-bg > .colorful-make::after,
.jio-user-ban-log-modal .colorful-bg > .colorful-make,
.jio-user-ban-log-modal .colorful-bg > .colorful-make::before,
.jio-user-ban-log-modal .colorful-bg > .colorful-make::after {
position: absolute;
color: var(--this-color);
background: var(--this-bg);
border-radius: 100%;
content: '';
}
.jio-user-ban-modal .colorful-bg > .colorful-make,
.jio-user-ban-info-modal .colorful-bg > .colorful-make,
.jio-user-ban-log-modal .colorful-bg > .colorful-make {
top: 60%;
bottom: 0;
width: 323px;
height: 290px;
animation: jio-ban-colorful 120s linear infinite;
}
.jio-user-ban-modal .colorful-bg > .colorful-make::before,
.jio-user-ban-info-modal .colorful-bg > .colorful-make::before,
.jio-user-ban-log-modal .colorful-bg > .colorful-make::before {
top: -325px;
right: -558px;
bottom: 0;
width: 677px;
height: 300px;
opacity: 0.6;
transform: rotate(341deg);
}
.jio-user-ban-modal .colorful-bg > .colorful-make::after,
.jio-user-ban-info-modal .colorful-bg > .colorful-make::after,
.jio-user-ban-log-modal .colorful-bg > .colorful-make::after {
top: -170px;
bottom: 0;
left: -262px;
width: 402px;
height: 214px;
opacity: 0.4;
transform: rotate(326deg);
}
.jio-user-ban-modal .colorful-bg > .colorful-make + *,
.jio-user-ban-info-modal .colorful-bg > .colorful-make + *,
.jio-user-ban-log-modal .colorful-bg > .colorful-make + * {
position: relative;
}
/* 单选徽章行(参考主题 .form-but-radio 契约):input 由 main.css 隐藏,
label 可点;选中态由 main.css 的 input:checked + .but-radio 驱动。 */
.jio-user-ban-modal .form-but-radio label {
cursor: pointer;
}
.jio-user-ban-modal .form-but-radio .but-radio {
user-select: none;
}
/* 开关行(删除全部内容 / 禁止用户申诉):原生 checkbox 隐藏,
视觉态由 main.css 的 input:checked ~ .form-switch 驱动。 */
.jio-user-ban-modal .jio-user-ban-form label {
user-select: none;
}
@keyframes jio-ban-colorful {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* ---- order review modal content ---- */
.order-comment-from .shop-score-box {
display: flex;
align-items: center;
gap: 8px;
min-height: 36px;
}
.order-comment-from .score-title {
width: 4.5em;
flex: 0 0 auto;
font-size: 13px;
color: var(--color-ink-2, #6b7280);
}
.order-comment-from .score-icon {
display: inline-flex;
gap: 4px;
align-items: center;
height: 30px;
}
.order-comment-from .icon-star {
display: inline-flex;
width: 22px;
height: 22px;
color: #d1d5db;
cursor: pointer;
transition: color 0.12s ease, transform 0.12s ease;
}
.order-comment-from .icon-star svg {
width: 22px;
height: 22px;
fill: currentColor;
}
.order-comment-from .icon-star.active,
.order-comment-from .icon-star.hover {
color: #fc7049;
}
.order-comment-from .icon-star.hover {
transform: scale(1.08);
}
.order-comment-from .score-text {
min-width: 3em;
font-size: 13px;
color: var(--color-ink-2, #6b7280);
}
.order-comment-from textarea.form-control {
width: 100%;
border: 1px solid var(--color-line, #e5e7eb);
border-radius: 10px;
padding: 10px 12px;
font-size: 14px;
resize: vertical;
min-height: 96px;
background: var(--surface-1, #fff);
color: var(--color-ink, #111);
}
.order-comment-from .form-upload .preview {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.order-comment-from .form-upload .preview .add,
.order-comment-from .form-upload .preview .preview-item {
width: 80px;
height: 80px;
border-radius: 10px;
border: 1px dashed var(--color-line, #d1d5db);
background: var(--surface-4, #f9fafb);
position: relative;
overflow: hidden;
cursor: pointer;
}
/* 加号图标不在此重复定义:main.css 已有参考主题原生实现
(.preview .add:before/:after —— 25px 圆角杠,inset:0 + margin:auto 居中)。
此前这里的 left/top:50% + translate 版本与该规则叠加导致过约束,
加号被推到 75%/75% 只剩“L”形,故整体删除、统一走主样式包。 */
.order-comment-from .form-upload .preview .preview-item img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.order-comment-from .form-upload .preview .preview-item .remove {
position: absolute;
top: 2px;
right: 2px;
width: 20px;
height: 20px;
border: 0;
border-radius: 999px;
background: rgba(0, 0, 0, 0.55);
color: #fff;
font-size: 12px;
line-height: 1;
cursor: pointer;
}
.order-comment-from .form-upload .hide {
display: none !important;
}
.order-comment-from .review-error {
color: #ef4444;
font-size: 13px;
margin-top: 8px;
}
@media (max-width: 768px) {
.jio-modal-runtime:not(.jio-modal-runtime--bottom) .jio-modal-runtime__dialog {
width: calc(100vw - 20px);
}
}