Files
kate522andClaude Opus 5 35bb96e82f refactor: rename the theme brand and every identifier from AKSRT to Jio
Full-project rename. `git grep -i aksrt` is now empty apart from the
DBMigrator 3.3.0 changelog note that documents the rename itself.

Code identifiers
- PHP namespace AKSRT\ -> Jio\ (composer PSR-4 + 378 declarations)
- global constants AKSRT_* -> JIO_* (VERSION/DIR/URI, PAY_TYPE_*, CAPTCHA_*)
- procedural functions, hooks, options, meta keys, table names,
  cookies, query vars, ajax actions and nonces: aksrt_ -> jio_
- text domain aksrt -> jio; Theme Name -> Jio
- JS globals: aksrtData/aksrtAdminData/... -> jioData/jioAdminData/...,
  window.AKSRTCaptcha & friends -> window.JioCaptcha, Aksrt* -> Jio*
- Vue components Aks*.vue -> Jio*.vue (15 files renamed + imports)
- CSS classes/data-attrs/custom properties: aksrt- -> jio-
- REST namespace aksrt/v1 -> jio/v1 (incl. payment gateway callbacks)

Storage layer
- DB tables {prefix}aksrt_* -> {prefix}jio_*; SCHEMA_VERSION 3.2.0 -> 3.3.0
  so dbDelta creates the new names on install
- widget id_base aksrt_widget_* -> jio_widget_*
- uninstall.php drop list rebuilt from the actual migrator tables
  (dropped 3 stale entries, added the 17 missing ones)

Removed
- hardcoded https://api.aksrt.com/version.json default update endpoint;
  get_endpoint() now reads the 「更新端点」 setting and do_check() no-ops
  when it is empty

Files renamed: inc/helpers/aksrt-*.php -> jio-*.php (54),
assets/admin/src/components/form/Aks*.vue -> Jio*.vue (15).
Build artifacts regenerated: assets/css/build, assets/js/runtime,
assets/admin/build.

Verified: audit-psr4-paths errors=0, audit-admin-contracts errors=0
(warnings=56, unchanged baseline), 813/813 widget-system tests,
44/44 phpunit, php -l clean across all PHP.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-11-01 20:05:04 +08:00

499 lines
12 KiB
CSS
Raw Permalink 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.
/**
* Jio Extended Components — 时间轴 / 步骤向导 / 九宫格 / 定价卡片 /
* Toggle 开关 / 自定义复选框 / 数字步进器
* ------------------------------------------------------------
* 全部使用 jio- 前缀,保持原生语义可访问性。
*/
/* ============================================================
* 1. 时间轴 — .jio-timeline
* ============================================================ */
.jio-timeline {
position: relative;
padding-left: 28px;
margin: 0;
list-style: none;
}
/* 竖线 */
.jio-timeline::before {
content: '';
position: absolute;
left: 8px;
top: 4px;
bottom: 4px;
width: 2px;
background: var(--color-line, rgba(50, 50, 50, 0.1));
border-radius: 1px;
}
.jio-timeline__item {
position: relative;
padding-bottom: 24px;
}
.jio-timeline__item:last-child {
padding-bottom: 0;
}
/* 圆点 */
.jio-timeline__dot {
position: absolute;
left: -24px;
top: 4px;
width: 12px;
height: 12px;
border-radius: 50%;
background: var(--color-primary);
border: 2px solid var(--surface-1, #fff);
box-shadow: 0 0 0 2px var(--color-primary-soft, rgba(240, 68, 148, 0.12));
z-index: 1;
}
/* 空心圆点变体 */
.jio-timeline__dot--outline {
background: var(--surface-1, #fff);
border: 2px solid var(--color-primary);
box-shadow: none;
}
/* 灰色圆点 — 已完成/已过去 */
.jio-timeline__dot--muted {
background: var(--color-ink-4, #999);
box-shadow: 0 0 0 2px var(--surface-2, #eee);
}
.jio-timeline__time {
display: block;
font-size: 12px;
color: var(--color-ink-4, #999);
margin-bottom: 4px;
}
.jio-timeline__title {
font-weight: 600;
color: var(--color-ink, #333);
margin-bottom: 4px;
}
.jio-timeline__content {
font-size: 14px;
color: var(--color-ink-3, #777);
line-height: 1.6;
}
/* ============================================================
* 2. 步骤向导 — .jio-steps
* ============================================================ */
.jio-steps {
display: flex;
align-items: flex-start;
gap: 0;
margin: 0;
padding: 0;
list-style: none;
counter-reset: jio-step;
}
.jio-steps__item {
flex: 1;
position: relative;
text-align: center;
counter-increment: jio-step;
}
/* 连接线 */
.jio-steps__item:not(:last-child)::after {
content: '';
position: absolute;
top: 16px;
left: calc(50% + 20px);
right: calc(-50% + 20px);
height: 2px;
background: var(--color-line, rgba(50, 50, 50, 0.1));
}
.jio-steps__icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 34px;
height: 34px;
border-radius: 50%;
background: var(--surface-2, #eee);
color: var(--color-ink-3, #777);
font-size: 14px;
font-weight: 700;
margin: 0 auto 8px;
position: relative;
z-index: 1;
}
.jio-steps__item--active .jio-steps__icon {
background: var(--color-primary);
color: var(--color-on-primary, #fff);
}
.jio-steps__item--done .jio-steps__icon {
background: var(--color-success);
color: #fff;
}
.jio-steps__item--done:not(:last-child)::after {
background: var(--color-success);
}
.jio-steps__label {
font-size: 13px;
font-weight: 600;
color: var(--color-ink-3, #777);
}
.jio-steps__item--active .jio-steps__label {
color: var(--color-primary);
}
.jio-steps__item--done .jio-steps__label {
color: var(--color-success);
}
/* 垂直模式 */
.jio-steps--vertical {
flex-direction: column;
gap: 0;
padding-left: 20px;
}
.jio-steps--vertical .jio-steps__item {
text-align: left;
padding-left: 28px;
padding-bottom: 20px;
}
.jio-steps--vertical .jio-steps__item:not(:last-child)::after {
top: 34px;
left: 36px;
right: auto;
width: 2px;
height: calc(100% - 34px);
}
.jio-steps--vertical .jio-steps__icon {
position: absolute;
left: 0;
margin: 0;
}
/* ============================================================
* 3. 九宫格 — .jio-img-grid
* ============================================================ */
.jio-img-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 4px;
border-radius: var(--radius, 8px);
overflow: hidden;
}
.jio-img-grid img {
width: 100%;
aspect-ratio: 1;
object-fit: cover;
display: block;
cursor: pointer;
transition: transform .2s ease;
}
.jio-img-grid img:hover {
transform: scale(1.03);
}
/* 自适应列数 */
.jio-img-grid--2 { grid-template-columns: repeat(2, 1fr); }
.jio-img-grid--4 { grid-template-columns: repeat(4, 1fr); }
@media (max-width: 480px) {
.jio-img-grid--4 { grid-template-columns: repeat(3, 1fr); }
}
/* ============================================================
* 5. Toggle 开关 — .jio-toggle (纯 CSS + :checked)
* 保持原生 <input> 可访问性
* ============================================================ */
.jio-toggle {
position: relative;
display: inline-flex;
align-items: center;
cursor: pointer;
user-select: none;
gap: 8px;
}
.jio-toggle__input {
position: absolute;
opacity: 0;
width: 0;
height: 0;
pointer-events: none;
}
.jio-toggle__track {
position: relative;
width: var(--jio-toggle-w, 44px);
height: var(--jio-toggle-h, 24px);
background: var(--surface-3, #e8e8e8);
border-radius: var(--jio-toggle-h, 24px);
transition: background .2s ease;
flex-shrink: 0;
}
.jio-toggle__track::after {
content: '';
position: absolute;
top: 2px;
left: 2px;
width: calc(var(--jio-toggle-h, 24px) - 4px);
height: calc(var(--jio-toggle-h, 24px) - 4px);
background: #fff;
border-radius: 50%;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
transition: transform .2s ease;
}
/* Checked */
.jio-toggle__input:checked + .jio-toggle__track {
background: var(--color-primary);
}
.jio-toggle__input:checked + .jio-toggle__track::after {
transform: translateX(calc(var(--jio-toggle-w, 44px) - var(--jio-toggle-h, 24px)));
}
/* Focus-visible */
.jio-toggle__input:focus-visible + .jio-toggle__track {
box-shadow: var(--focus-ring, 0 0 2px 3px rgba(253, 83, 161, 0.4));
}
/* Disabled */
.jio-toggle__input:disabled + .jio-toggle__track {
opacity: 0.5;
cursor: not-allowed;
}
.jio-toggle__label {
font-size: 14px;
color: var(--color-ink-2, #4e5358);
}
/* ============================================================
* 6. 自定义复选框 — .jio-checkbox (纯 CSS + :checked)
* 保持原生 <input type="checkbox"> 可访问性
* ============================================================ */
.jio-checkbox {
display: inline-flex;
align-items: center;
gap: 8px;
cursor: pointer;
user-select: none;
}
.jio-checkbox__input {
position: absolute;
opacity: 0;
width: 0;
height: 0;
pointer-events: none;
}
.jio-checkbox__box {
position: relative;
width: 18px;
height: 18px;
border: 2px solid var(--color-line, rgba(50, 50, 50, 0.15));
border-radius: 4px;
background: var(--surface-1, #fff);
transition: background .15s ease, border-color .15s ease;
flex-shrink: 0;
}
/* 打勾 SVG */
.jio-checkbox__box::after {
content: '';
position: absolute;
top: 2px;
left: 5px;
width: 5px;
height: 9px;
border: 2px solid #fff;
border-top: none;
border-left: none;
transform: rotate(45deg) scale(0);
transition: transform .15s ease;
}
.jio-checkbox__input:checked + .jio-checkbox__box {
background: var(--color-primary);
border-color: var(--color-primary);
}
.jio-checkbox__input:checked + .jio-checkbox__box::after {
transform: rotate(45deg) scale(1);
}
.jio-checkbox__input:focus-visible + .jio-checkbox__box {
box-shadow: var(--focus-ring, 0 0 2px 3px rgba(253, 83, 161, 0.4));
}
.jio-checkbox__input:disabled + .jio-checkbox__box {
opacity: 0.5;
cursor: not-allowed;
}
.jio-checkbox__label {
font-size: 14px;
color: var(--color-ink-2, #4e5358);
}
/* ============================================================
* 7. 数字步进器 — .jio-stepper
* ============================================================ */
.jio-stepper {
display: inline-flex;
align-items: center;
border: 1px solid var(--color-line, rgba(50, 50, 50, 0.1));
border-radius: var(--radius, 8px);
overflow: hidden;
height: var(--jio-stepper-h, 36px);
}
.jio-stepper__btn {
display: flex;
align-items: center;
justify-content: center;
width: var(--jio-stepper-h, 36px);
height: 100%;
background: var(--surface-2, #eee);
color: var(--color-ink-2, #4e5358);
border: none;
cursor: pointer;
font-size: 16px;
font-weight: 600;
transition: background .15s ease, color .15s ease;
user-select: none;
}
.jio-stepper__btn:hover {
background: var(--surface-3, #e8e8e8);
color: var(--color-ink, #333);
}
.jio-stepper__btn:disabled {
opacity: 0.4;
cursor: not-allowed;
}
.jio-stepper__input {
width: 48px;
height: 100%;
border: none;
text-align: center;
font-size: 14px;
font-weight: 600;
color: var(--color-ink, #333);
background: var(--surface-1, #fff);
-moz-appearance: textfield;
}
.jio-stepper__input::-webkit-outer-spin-button,
.jio-stepper__input::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
.jio-stepper__input:focus {
outline: none;
background: var(--color-primary-softer, rgba(240, 68, 148, 0.05));
}
/* ============================================================
* 8. 头像尺寸变量系统 — .jio-avatar--{size}
* ============================================================ */
.jio-avatar--xs { width: var(--jio-avatar-size-xs); height: var(--jio-avatar-size-xs); }
.jio-avatar--sm { width: var(--jio-avatar-size-sm); height: var(--jio-avatar-size-sm); }
.jio-avatar { width: var(--jio-avatar-size); height: var(--jio-avatar-size); }
.jio-avatar--lg { width: var(--jio-avatar-size-lg); height: var(--jio-avatar-size-lg); }
.jio-avatar--xl { width: var(--jio-avatar-size-xl); height: var(--jio-avatar-size-xl); }
/* ============================================================
* 8b. 头像形状统一 — 圆形基底
* --radius-avatar 是前端用户头像形状的唯一来源。任何带头像类名的
* <img>(含未包 .avatar-img 的裸 img)都必须是正圆,供后续头像
* 挂件/装扮叠加。特异性 0,1,1 高于 main.css 的 .avatar{100px},
* 同值为圆;路由 CSS 中显式声明圆角的头像框需各自对齐。
* ============================================================ */
img.avatar,
img.avatar-mini,
img.avatar-md,
img.avatar-lg,
.avatar-img img {
border-radius: var(--radius-avatar, 50%);
object-fit: cover;
}
/* ============================================================
* 9. 涟漪点击效果 — .jio-ripple
* 容器加此类,点击时 JS 注入 span.jio-ripple__wave
* ============================================================ */
.jio-ripple {
position: relative;
overflow: hidden;
}
.jio-ripple__wave {
position: absolute;
border-radius: 50%;
background: rgba(255, 255, 255, 0.35);
transform: scale(0);
animation: jioRippleWave .6s ease-out forwards;
pointer-events: none;
}
@keyframes jioRippleWave {
to {
transform: scale(4);
opacity: 0;
}
}
/* Runtime broad ripple (.jio-wave injected into .but/.btn).
* MUST stay out of flow — missing absolute made header CTA grow on click. */
.jio-wave {
position: absolute !important;
border-radius: 50%;
background: rgba(255, 255, 255, 0.35);
pointer-events: none !important;
z-index: 1;
transform: scale(0);
animation: jioWaveRipple 0.6s ease-out forwards;
}
@keyframes jioWaveRipple {
to {
transform: scale(1);
opacity: 0;
}
}
/* ============================================================
* 10. 模态框堆叠动画 — 父模态缩小
* ============================================================ */
.modal-stacked .modal-dialog {
transition: transform .25s var(--ease, ease), filter .25s ease;
}
.modal-stacked .modal-dialog.modal-behind {
transform: scale(0.92);
filter: brightness(0.85);
pointer-events: none;
}