Files
kate522andClaude Opus 5 030baa511e fix(nav): restore reference theme toggle geometry and single binding
The top-bar theme switch was bound twice — core/theme.js attached a click
handler to #theme-toggle-desktop while runtime/main.js delegated click on
.toggle-theme, and both ship in main.min.js, so one press toggled twice and
the button looked dead.

Also realign the control with the reference:

- Drop the far modifier from fa-toggle-theme so the sun/moon glyphs resolve
  against the Solid face at the reference weight instead of Regular.
- Restore .toggle-radius .fa/.icon to the reference form (left/right 0 +
  auto margin only). The extra position/top/transform/size/flex block and
  the > i selector were overriding the shared abs-* centering rule.
- Replace the per-ID bindings with one delegated listener so the floating
  rail, which carries no id, keeps working.
- Remove dead theme.js queries for selectors no markup or stylesheet ships
  (#theme-toggle, #dropdown-theme-toggle, .theme-icon-moon/.theme-icon-sun,
  [data-action='toggle-theme'], .is-dark).

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

6355 lines
160 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.
/* source: style.css */
/*
Theme Name: Jio
Theme URI: https://github.com/Lexo0522/jio
Author: Kate
Author URI: https://github.com/Lexo0522
Description: Jio Blog Theme - Modern WordPress theme with custom admin panel, OAuth social login, and beautiful blog layout. Based on fresh frontend with dark/light mode.
Version: 1.0.0
Requires at least: 6.4
Tested up to: 6.8
Requires PHP: 8.1
License: GPL v2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: jio
Tags: blog, two-columns, right-sidebar, custom-menu, featured-images, translation-ready, dark-mode
============================================================
Jio WordPress Theme v3.0 - Fresh Frontend + Admin Backend
Fresh frontend templates (dark/light mode, responsive).
Full admin panel preserved (settings, OAuth, content tools, etc).
============================================================
*/
/* source: assets/css/core/tokens.css */
/**
* Jio Design Tokens v7 — 1:1 legacy Alignment
* ------------------------------------------------------------
* 单一真理源(Single Source of Truth)
* 所有颜色、字体、间距、动效都从此处读取,禁止在组件内硬编码。
* 严格对齐 legacy main.css 的视觉值。
*/
:root {
/* ===== Primary — legacy theme-color (#f04494 pink) ===== */
--color-primary: #f04494;
--color-primary-hover: #e0307e;
--color-primary-active: #c9206d;
--color-primary-soft: rgba(240, 68, 148, 0.10);
--color-primary-softer: rgba(240, 68, 148, 0.05);
--color-on-primary: #FFFFFF;
/* ===== Ink (text) — 对齐 legacy --key-color / --main-color / --muted-color ===== */
--color-ink: #333333; /* legacy --key-color */
--color-ink-2: #4e5358; /* legacy --main-color */
--color-ink-3: #777777; /* legacy --muted-color */
--color-ink-4: #999999; /* legacy --muted-2-color */
/* ===== Surface — 对齐 legacy --body-bg-color / --main-bg-color / --muted-bg-color ===== */
--surface-page: #f5f6f7; /* legacy --body-bg-color */
--surface-1: #FFFFFF; /* legacy --main-bg-color */
--surface-2: #eeeeee; /* legacy --muted-bg-color #eee */
--surface-3: #e9ecef; /* 输入框 / code / 次级面 */
--surface-4: #f8f8f8; /* 分页 / 标签 / hover 薄层 */
/* ===== Borders — 对齐 legacy --main-border-color ===== */
--color-line: rgba(50, 50, 50, 0.06);
--color-line-soft: rgba(0, 0, 0, 0.03);
--color-line-stronger: rgba(50, 50, 50, 0.12);
/* ===== State colors ===== */
--color-success: #10B981;
--color-warning: #F59E0B;
--color-error: #EF4444;
--color-info: #3B82F6;
/* ===== Accent (action green — legacy tabbar/CTA) ===== */
--color-accent: #18a058;
--color-accent-soft: rgba(24, 160, 88, 0.12);
--color-accent-shadow: rgba(24, 160, 88, 0.28);
/* ===== Fonts — 对齐 legacy(系统默认字体栈)===== */
--font-display: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;
--font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;
--font-ui: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;
--font-mono: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
/* ===== Type scale ===== */
--text-xs: 0.75rem; /* 12 */
--text-sm: 0.875rem; /* 14 */
--text-base: 0.875rem; /* 14 — 对齐参考主题 bootstrap 基础字号 */
--text-md: 1.125rem; /* 18 */
--text-lg: 1.25rem; /* 20 */
--text-xl: 1.5rem; /* 24 */
--text-2xl: 1.875rem; /* 30 */
--text-3xl: 2.25rem; /* 36 */
--text-4xl: 3rem; /* 48 */
--text-5xl: 3.75rem; /* 60 */
--leading-tight: 1.2;
--leading-snug: 1.4;
--leading-normal: 1.6; /* legacy body line-height */
--leading-relaxed: 1.6;
/* ===== Spacing (4px base) ===== */
--space-1: 4px;
--space-2: 8px;
--space-3: 12px;
--space-4: 16px;
--space-5: 20px;
--space-6: 24px;
--space-7: 32px;
--space-8: 40px;
--space-9: 48px;
--space-10: 64px;
--space-11: 80px;
--space-12: 96px;
/* ===== Radius — 对齐 legacy --main-radius: 8px ===== */
--radius-xs: 3px;
--radius-sm: 4px;
--radius: 8px;
--radius-lg: 8px; /* legacy main-radius — was 10px */
--radius-xl: 12px;
--radius-2xl: 16px;
--radius-pill: 100px;
--radius-avatar: 50%;
/* ===== Shadows — 对齐 legacy --main-shadow: rgba(116,116,116,0.08) ===== */
--shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.03);
--shadow-sm: 0 0 10px rgba(116, 116, 116, 0.08);
--shadow: 0 0 10px rgba(116, 116, 116, 0.12);
--shadow-lg: 0 12px 32px rgba(18, 18, 18, 0.10);
--shadow-drawer: 0 18px 60px rgba(0, 0, 0, 0.20);
/* ===== Layout — 对齐 legacy --mian-max-width: 1200px ===== */
--nav-height: 60px;
--container: 1200px;
--container-wide: 1440px;
--container-read: 760px;
--container-page: 880px;
--sidebar-width: 311px;
--content-gap: 24px;
--section-gap: 24px;
--sidebar-bp: 992px;
/* ===== Motion ===== */
--ease: cubic-bezier(.4, 0, .2, 1);
--ease-out: cubic-bezier(.16, 1, .3, 1);
--ease-spring: cubic-bezier(.34, 1.56, .64, 1);
--dur-fast: 0.15s;
--dur: 0.25s;
--dur-slow: 0.4s;
/* ===== Focus Ring — 对齐 legacy focus-shadow-color ===== */
--focus-ring: 0 0 2px 3px rgba(253, 83, 161, 0.4);
/* ===== Z-index layers ===== */
--z-dropdown: 100;
--z-sticky: 200;
--z-fixed: 300;
--z-overlay: 400;
--z-modal: 500;
--z-popover: 600;
--z-toast: 700;
--z-tooltip: 800;
/* ===== Button sizes — 对齐 legacy ===== */
--radius-btn: 4px;
--btn-sm-h: 28px;
--btn-md-h: 34px;
--btn-lg-h: 44px;
/* ===== Card density — 对齐 legacy .box-body { padding: 15px } ===== */
--card-padding: 15px;
--card-padding-sm: 10px;
--card-gap: 16px;
--card-gap-lg: 20px;
/* ===== Extended tokens (used by components) ===== */
--color-primary-light: var(--color-primary-soft);
--color-surface: var(--surface-1);
--color-line-strong: var(--color-line);
--color-bg-hover: var(--surface-2);
--color-border-light: var(--color-line-soft);
--color-fill: var(--surface-2);
--color-warning-bg: #fffbe6;
--color-warning-text: #ad6800;
--text-secondary: var(--color-ink-3);
--text-tertiary: var(--color-ink-4);
--surface-active: var(--surface-2);
--surface-card: var(--surface-1);
--surface-hover: var(--surface-2);
--surface-secondary: var(--surface-2);
--radius-code: var(--radius);
--radius-full: 100px;
--shadow-xl: 0 0 10px rgba(116, 116, 116, 0.12);
--space-16: 64px;
--z-floating: 900;
--transition-fast: 0.15s ease;
--transition-base: 0.25s ease;
/* ===== Composite / Context tokens — 对齐 legacy ===== */
--header-bg: var(--blur-bg);
--header-color: var(--color-ink-2);
--footer-bg: var(--surface-1);
--footer-color: var(--color-ink-4);
--blur-bg: rgba(255, 255, 255, 0.80);
--float-btn-bg: rgba(200, 200, 200, 0.40);
/* ===== Jio-to-Jio canonical aliases ===== */
--font-heading: var(--font-ui);
--radius-card: var(--radius);
--radius-md: var(--radius);
--color-primary-50: var(--color-primary-soft);
--color-primary-dark: var(--color-primary-active);
--shadow-md: var(--shadow);
--mini-radius: calc(var(--radius) / 1.4);
/* ===== Avatar size system — legacy --this-size 等价 ===== */
--jio-avatar-size-xs: 24px;
--jio-avatar-size-sm: 32px;
--jio-avatar-size: 40px;
--jio-avatar-size-lg: 56px;
--jio-avatar-size-xl: 80px;
/* ===== Post card thumbnail scale ===== */
--jio-card-thumb-scale: 56.25%; /* 16:9 */
/* ===== Multi-color palette (for buttons / badges / gradients) ===== */
--jio-rose: #f43f5e;
--jio-rose-soft: rgba(244, 63, 94, 0.12);
--jio-blue: #3b82f6;
--jio-blue-soft: rgba(59, 130, 246, 0.12);
--jio-green: #10b981;
--jio-green-soft: rgba(16, 185, 129, 0.12);
--jio-orange: #f97316;
--jio-orange-soft:rgba(249, 115, 22, 0.12);
--jio-purple: #8b5cf6;
--jio-purple-soft:rgba(139, 92, 246, 0.12);
--jio-cyan: #06b6d4;
--jio-cyan-soft: rgba(6, 182, 212, 0.12);
--jio-yellow: #eab308;
--jio-yellow-soft:rgba(234, 179, 8, 0.12);
--jio-red: #ef4444;
--jio-red-soft: rgba(239, 68, 68, 0.12);
--jio-teal: #14b8a6;
--jio-teal-soft: rgba(20, 184, 166, 0.12);
--jio-indigo: #6366f1;
--jio-indigo-soft:rgba(99, 102, 241, 0.12);
--jio-pink: #ec4899;
--jio-pink-soft: rgba(236, 72, 153, 0.12);
/* ===== VIP / special gradients ===== */
--jio-vip-gold-1: #f6d365;
--jio-vip-gold-2: #fda085;
--jio-grad-sunset-1: #f093fb;
--jio-grad-sunset-2: #f5576c;
--jio-grad-ocean-1: #4facfe;
--jio-grad-ocean-2: #00f2fe;
--jio-grad-forest-1: #43e97b;
--jio-grad-forest-2: #38f9d7;
--jio-grad-night-1: #a18cd1;
--jio-grad-night-2: #fbc2eb;
--jio-grad-fire-1: #f83600;
--jio-grad-fire-2: #f9d423;
/* ===== Component sizing ===== */
--jio-toggle-w: 44px;
--jio-toggle-h: 24px;
--jio-stepper-h: 36px;
--jio-badge-h: 22px;
/* ===== Legacy name bridge ===== */
--text-1: var(--color-ink);
--text-2: var(--color-ink-2);
--text-3: var(--color-ink-3);
--border: var(--color-line);
--color-text-1: var(--color-ink);
--color-text-2: var(--color-ink-2);
--color-text-3: var(--color-ink-3);
--color-primary-bg: var(--color-primary-softer);
--color-danger: var(--color-error);
}
/* ============================================================
* Blur-bg fallback cascade (mirrors legacy behaviour)
* ============================================================ */
@supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {
:root {
--blur-bg: var(--surface-1);
--header-bg: var(--surface-1);
}
}
@supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {
html.dark,
body.dark-theme {
--blur-bg: #37383a;
--header-bg: #37383a;
}
}
body.modal-open,
body.dialog-open {
--blur-bg: var(--surface-1);
--header-bg: var(--surface-1);
}
body.modal-open .site-nav,
body.modal-open .footer-tabbar,
body.modal-open .float-right .float-btn,
body.dialog-open .site-nav,
body.dialog-open .footer-tabbar,
body.dialog-open .float-right .float-btn {
backdrop-filter: none !important;
-webkit-backdrop-filter: none !important;
}
html.dark body.modal-open,
html.dark body.dialog-open,
body.dark-theme.modal-open,
body.dark-theme.dialog-open {
--blur-bg: #37383a;
--header-bg: #37383a;
}
/* ============================================================
* Multi-level container responsive — 对齐 legacy --mian-max-width
* 不同视口宽度下容器自动调整
* ============================================================ */
@media (min-width: 992px) {
:root {
--container: 960px;
}
}
@media (min-width: 1200px) {
:root {
--container: 1140px;
}
}
@media (min-width: 1400px) {
:root {
--container: 1200px;
}
}
/* ============================================================
* Dark Theme — 对齐 legacy .dark-theme 精确 hex
* body.dark-theme 与 html.dark 同权(legacy 用 body class)
* ============================================================ */
html.dark,
body.dark-theme {
--color-ink: #f8fafc; /* legacy --key-color */
--color-ink-2: #e5eef7; /* legacy --main-color */
--color-ink-3: #b4b6bb; /* legacy --muted-color */
--color-ink-4: #888a8f; /* legacy --muted-2-color */
--surface-page: #292a2d; /* legacy --body-bg-color */
--surface-1: #323335; /* legacy --main-bg-color */
--surface-2: #2d2e31; /* legacy --muted-bg-color */
--surface-3: #3a3c42;
--surface-4: #26282d;
--color-line: rgba(114, 114, 114, 0.1);
--color-line-soft: rgba(184, 184, 184, 0.02);
--color-line-stronger: rgba(255, 255, 255, 0.12);
--color-primary-soft: rgba(240, 68, 148, 0.16);
--color-primary-softer: rgba(240, 68, 148, 0.08);
--color-primary-light: var(--color-primary-soft);
--color-surface: var(--surface-1);
--color-line-strong: var(--color-line);
--color-bg-hover: var(--surface-2);
--color-border-light: var(--color-line-soft);
--color-fill: var(--surface-2);
--text-secondary: var(--color-ink-3);
--text-tertiary: var(--color-ink-4);
--surface-active: var(--surface-2);
--surface-card: var(--surface-1);
--surface-hover: var(--surface-2);
--surface-secondary: var(--surface-2);
--shadow-xl: 0 0 10px rgba(24, 24, 24, 0.18);
--shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.18);
--shadow-sm: 0 0 10px rgba(24, 24, 24, 0.1); /* legacy --main-shadow dark */
--shadow: 0 0 10px rgba(24, 24, 24, 0.14);
--shadow-lg: 0 14px 36px rgba(0, 0, 0, 0.32);
--shadow-drawer: 0 20px 60px rgba(0, 0, 0, 0.60);
--blur-bg: rgba(50, 51, 53, 0.80);
--float-btn-bg: rgba(70, 70, 70, 0.40);
--header-bg: var(--blur-bg);
--footer-bg: var(--surface-1);
--footer-color: var(--color-ink-4);
--shadow-md: var(--shadow);
/* Multi-color palette — dark mode: same hue, softer tint backgrounds */
--jio-rose-soft: rgba(244, 63, 94, 0.18);
--jio-blue-soft: rgba(59, 130, 246, 0.18);
--jio-green-soft: rgba(16, 185, 129, 0.18);
--jio-orange-soft:rgba(249, 115, 22, 0.18);
--jio-purple-soft:rgba(139, 92, 246, 0.18);
--jio-cyan-soft: rgba(6, 182, 212, 0.18);
--jio-yellow-soft:rgba(234, 179, 8, 0.18);
--jio-red-soft: rgba(239, 68, 68, 0.18);
--jio-teal-soft: rgba(20, 184, 166, 0.18);
--jio-indigo-soft:rgba(99, 102, 241, 0.18);
--jio-pink-soft: rgba(236, 72, 153, 0.18);
}
/* Dark mode component refinements */
html.dark .site-nav,
body.dark-theme .site-nav {
border-bottom-color: var(--color-line);
box-shadow: none;
}
html.dark .footer-tabbar,
body.dark-theme .footer-tabbar {
background: rgba(50, 51, 53, 0.80);
box-shadow: 0 -1px 3px rgba(0, 0, 0, 0.20);
}
html.dark .n-drawer,
html.dark .n-modal,
html.dark .n-dialog,
body.dark-theme .n-drawer,
body.dark-theme .n-modal,
body.dark-theme .n-dialog {
background: var(--surface-1);
}
html.dark .post-card,
html.dark .widget,
html.dark .jio-theme-box,
html.dark .theme-box,
body.dark-theme .post-card,
body.dark-theme .widget,
body.dark-theme .jio-theme-box,
body.dark-theme .theme-box {
border-color: transparent;
}
/* source: assets/css/core/reset.css */
/**
* Jio Reset
* 现代精简 reset,结合 box-sizing 与 a11y 友好的默认值。
*/
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
font-size: 16px;
scroll-behavior: smooth;
-webkit-text-size-adjust: 100%;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
overflow-x: hidden;
text-rendering: optimizeLegibility;
}
body {
margin: 0;
font-family: var(--font-body);
font-size: var(--text-base);
line-height: var(--leading-normal);
background-color: var(--surface-page);
color: var(--color-ink-2);
transition: background-color 0.25s ease, color 0.25s ease;
overflow-x: hidden;
}
/* 媒体元素 */
img,
picture,
video,
canvas {
display: block;
max-width: 100%;
height: auto;
}
/* 表单元素继承字体 */
input,
button,
textarea,
select {
font: inherit;
color: inherit;
}
button {
background: none;
border: 0;
padding: 0;
cursor: pointer;
}
/* 链接 */
a {
color: inherit;
text-decoration: none;
transition: color var(--dur-fast) var(--ease);
}
a:hover {
color: var(--color-primary);
}
/* 取消浏览器默认聚焦描边;组件按需声明自己的焦点状态。 */
:focus {
outline: none;
}
/* 选区色 */
::selection {
background: var(--color-primary-soft);
color: var(--color-ink);
}
/* 屏幕阅读器隐藏 */
.screen-reader-text,
.sr-only {
position: absolute !important;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
.screen-reader-text:focus,
.sr-only:focus {
position: fixed !important;
top: 16px;
left: 16px;
width: auto;
height: auto;
padding: 8px 16px;
background: var(--surface-1);
color: var(--color-ink);
z-index: 100000;
clip: auto;
box-shadow: var(--shadow-lg);
border-radius: var(--radius);
}
/* 减少动效偏好 */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
/* source: assets/css/core/typography.css */
/**
* Jio Typography — 1:1 legacy Alignment
*
* 对齐 legacy main.css 的排版系统
*/
/* ===== 全局标题 — 对齐 legacy line 8947 ===== */
h1, h2, h3, h4, h5, h6 {
font-weight: 700;
margin: 20px 0 10px;
color: var(--key-color, #333);
}
h1 { font-size: 22px; }
h2 { font-size: 20px; }
h3 { font-size: 18px; }
h4 { font-size: 16px; }
h5 { font-size: 15px; }
h6 { font-size: 14px; }
/* ===== 文章正文 — 对齐 legacy line 8740 ===== */
.wp-posts-content,
.entry-content,
.prose {
font-size: 16px;
line-height: 2;
color: var(--main-color, #4e5358);
min-height: 90px;
}
/* ===== 文章内标题 — 对齐 legacy line 8947 ===== */
.wp-posts-content h1,
.wp-posts-content h2,
.wp-posts-content h3,
.wp-posts-content h4,
.wp-posts-content h5,
.entry-content h1,
.entry-content h2,
.entry-content h3,
.entry-content h4,
.entry-content h5,
.prose h1,
.prose h2,
.prose h3,
.prose h4,
.prose h5 {
font-weight: 700;
margin: 20px 0 10px;
color: var(--key-color, #333);
}
.wp-posts-content h1,
.entry-content h1,
.prose h1 { font-size: 22px; }
.wp-posts-content h2,
.entry-content h2,
.prose h2 { font-size: 20px; }
.wp-posts-content h3,
.entry-content h3,
.prose h3 { font-size: 18px; }
.wp-posts-content h4,
.entry-content h4,
.prose h4 { font-size: 16px; }
/* ===== 段落 — 对齐 legacy line 8999 ===== */
.wp-posts-content p,
.entry-content p,
.prose p {
margin: 0 0 20px;
word-wrap: break-word;
}
/* ===== 链接 — 对齐 legacy line 8836 ===== */
.wp-posts-content a,
.entry-content a,
.prose a {
color: var(--focus-color, #f04494);
text-decoration: none;
}
.wp-posts-content a:hover,
.entry-content a:hover,
.prose a:hover {
color: var(--focus-color, #f04494);
}
/* ===== 图片 — 对齐 legacy line 8850 ===== */
.wp-posts-content img,
.entry-content img,
.prose img {
max-width: 100%;
height: auto;
display: block;
margin: auto;
}
/* ===== 内联代码 — 对齐 legacy line 8844 ===== */
.wp-posts-content code:not(pre code),
.entry-content code:not(pre code),
.prose code:not(pre code) {
color: #ff3c98;
background: rgba(253, 153, 153, 0.2);
font-family: var(--font-mono, monospace);
font-size: 0.9em;
}
/* ===== 代码块 — 对齐 legacy ===== */
.wp-posts-content pre,
.entry-content pre,
.prose pre {
position: relative;
background: #282c34;
color: #abb2bf;
padding: 15px;
border-radius: var(--main-radius, 8px);
overflow-x: auto;
font-size: 14px;
line-height: 1.5;
margin: 0 0 20px;
}
.wp-posts-content pre code,
.entry-content pre code,
.prose pre code {
color: inherit;
background: none;
padding: 0;
font-size: inherit;
}
/* ===== 表格 — 对齐 legacy line 8897 ===== */
.wp-posts-content table,
.entry-content table,
.prose table {
font-size: 14px;
width: 100%;
border-collapse: collapse;
margin: 0 0 20px;
}
.wp-posts-content th,
.wp-posts-content td,
.entry-content th,
.entry-content td,
.prose th,
.prose td {
border: 1px solid var(--main-border-color, rgba(50, 50, 50, 0.06));
padding: 8px;
}
.wp-posts-content th,
.entry-content th,
.prose th {
background: var(--muted-border-color, rgba(0, 0, 0, 0.03));
font-weight: 700;
}
.wp-posts-content tr:hover,
.entry-content tr:hover,
.prose tr:hover {
background-color: rgba(240, 68, 148, 0.05);
}
/* ===== 列表 — 对齐 legacy line 8977 ===== */
.wp-posts-content ul,
.wp-posts-content ol,
.entry-content ul,
.entry-content ol,
.prose ul,
.prose ol {
margin: 10px 0 20px 15px;
padding-left: 15px;
}
.wp-posts-content li,
.entry-content li,
.prose li {
margin-bottom: 10px;
}
/* ===== 引用 — 对齐 legacy line 680 ===== */
.wp-posts-content blockquote,
.entry-content blockquote,
.prose blockquote {
padding: 15px 20px;
margin: 0 0 20px;
border-left: 4px solid var(--main-border-color, rgba(50, 50, 50, 0.06));
background: var(--muted-border-color, rgba(0, 0, 0, 0.03));
font-size: 16px;
color: var(--muted-color, #777);
border-radius: 0;
}
.wp-posts-content blockquote p:last-child,
.entry-content blockquote p:last-child,
.prose blockquote p:last-child {
margin-bottom: 0;
}
/* ===== 水平分割线 — 对齐 legacy line 676 ===== */
hr {
border-color: var(--main-border-color, rgba(50, 50, 50, 0.06));
}
/* ===== Strong / Bold ===== */
strong, b {
font-weight: 700;
}
/* source: assets/css/core/buttons.css */
/**
* Jio Buttons — 1:1 legacy Alignment
*
* 对齐 legacy .but 系统:
* - 正常字重 (normal)
* - 4px 圆角
* - 灰色默认背景
* - opacity hover
*/
.btn,
.btn-primary,
.btn-outline,
.btn-ghost,
.btn-danger {
--btn-h: 34px;
--btn-px: 14px;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
height: var(--btn-h);
padding: 0 var(--btn-px);
font-size: var(--text-sm);
font-weight: normal; /* legacy .but: normal — was 500 */
line-height: 1.44;
border: 1px solid transparent;
border-radius: var(--radius-btn);
cursor: pointer;
white-space: nowrap;
user-select: none;
text-decoration: none;
box-shadow: none;
transition: opacity 0.15s ease,
background 0.15s ease,
border-color 0.15s ease,
color 0.15s ease,
box-shadow 0.15s ease;
}
/* 尺寸变体 */
.btn-sm { --btn-h: 28px; --btn-px: 8px; font-size: var(--text-xs); }
.btn-lg { --btn-h: 44px; --btn-px: 18px; font-size: var(--text-md); }
/* === Default (gray background, like legacy .but default) === */
.btn {
background: rgba(136, 136, 136, 0.1);
color: #888;
border-color: transparent;
}
.btn:hover {
opacity: 0.8;
color: #888;
}
/* === Primary — solid theme, opacity hover (no translateY / heavy glow) === */
.btn-primary {
background: var(--color-primary);
color: var(--color-on-primary);
border-color: var(--color-primary);
box-shadow: none;
}
.btn-primary:hover {
opacity: 0.8;
color: var(--color-on-primary);
background: var(--color-primary);
border-color: var(--color-primary);
transform: none;
box-shadow: none;
}
.btn-primary:active {
opacity: 1;
box-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.08);
}
/* === Outline === */
.btn-outline {
background: transparent;
color: var(--color-ink-2);
border-color: var(--color-ink-2);
}
.btn-outline:hover {
opacity: 0.8;
background: transparent;
border-color: var(--color-ink-2);
color: var(--color-ink-2);
}
/* === Ghost === */
.btn-ghost {
background: transparent;
color: var(--color-ink-2);
border-color: transparent;
}
.btn-ghost:hover {
background: rgba(136, 136, 136, 0.1);
opacity: 0.8;
}
/* === Danger === */
.btn-danger {
background: var(--color-error);
color: #fff;
border-color: var(--color-error);
}
.btn-danger:hover {
opacity: 0.8;
color: #fff;
}
/* === Disabled === */
.btn:disabled,
.btn-primary:disabled,
.btn-outline:disabled,
.btn-ghost:disabled,
.btn-danger:disabled {
opacity: 0.5;
cursor: not-allowed;
pointer-events: none;
}
/* === Icon button === */
.btn-icon {
width: var(--btn-h);
padding: 0;
justify-content: center;
}
.btn-icon.btn-sm { width: 28px; }
.btn-icon.btn-lg { width: 44px; }
/* === Full width === */
.btn-block {
display: block;
width: 100%;
}
/* ============================================================
* legacy .but / .badg compat layer — 1:1 legacy main.css (.but system)
* ------------------------------------------------------------
* Additive: does NOT alter the Jio .btn system above. Lets reused
* legacy-style markup (.but / .badg / .b-* / .jb-* / .c-* / .but-group /
* .but-average / .toggle-radius) render via the --this-* context-coloring vars.
* The --this-* DEFAULTS are set on the base rule here (BEFORE the .b-* and .jb-*
* modifiers) so the cascade resolves colored variants correctly; scoped to
* .but/.badg (never :root) so .float-btn's own var(--this-*, fallback) stays intact.
* Uses --focus-color-opacity* tokens with local fallbacks.
* ============================================================ */
/* Base (legacy .but / .badg) */
.but,
.badg {
display: inline-block;
vertical-align: middle;
padding: 0.3em 0.6em;
text-align: center;
font-weight: normal;
line-height: 1.44;
border-radius: 4px;
border: 1px solid var(--this-border);
box-shadow: var(--this-shadow);
background: var(--this-bg);
color: var(--this-color);
--main-color: var(--this-color);
--this-bg: rgba(136, 136, 136, 0.1);
--this-border: transparent;
--this-shadow: none;
--this-color: #888;
text-shadow: 0 0 0;
transition: 0.15s;
cursor: pointer;
}
.but a { color: inherit; }
.but .icon,
.but > .fa:not(.fa-angle-right),
.but > i[class*="fa-"]:not(.fa-angle-right) { margin-right: 0.25em; }
.but.block { display: block; }
/* hover / active */
.but:focus,
.but:hover { opacity: 0.8; color: var(--this-color); }
.but:active { --this-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.08); }
/* radius variants */
.but.radius,
.badg.radius,
.radius > .but { border-radius: 50px; padding: 0.3em 1em; }
.but.main-radius,
.badg.main-radius { border-radius: var(--main-radius); }
.but.mini-radius,
.badg.mini-radius { border-radius: var(--mini-radius); }
/* hollow (outline) */
.but.hollow,
.badg.hollow { background: transparent; --this-border: var(--this-color); }
.but.hollow:hover { background: var(--this-bg); }
.badg.hollow[class*='b-'],
.but.hollow[class*='b-'] { background: 0 0; --this-border: var(--this-bg); --this-color: var(--this-bg); }
.but.hollow[class*='b-']:hover { color: #fff; }
.but.hollow.c-white:hover { background: 0 0; --this-color: var(--focus-color); color: var(--focus-color); }
/* circular icon button */
.circular,
.badg.cir,
.but.cir {
padding: 0;
border-radius: 5em;
--this-size: 1.8em;
display: inline-flex;
justify-content: center;
align-items: center;
height: var(--this-size);
min-width: var(--this-size);
}
.circular.radius4,
.badg.cir.radius4,
.but.cir.radius4 { border-radius: 4px; }
/* :not() variants outrank the .but > i[class*="fa-"]:not(.fa-angle-right) margin rule */
.but.cir svg.icon,
.but.cir > .fa,
.but.cir > .fa:not(.fa-angle-right),
.but.cir > i[class*="fa-"]:not(.fa-angle-right) { margin: 0; }
/* button group (joined) */
.but-group { display: inline-flex; }
.but-group > .but { border-radius: 0; margin: 0; }
.but-group > .but:first-of-type { border-radius: 4px 0 0 4px; }
.but-group > .but:last-of-type { border-radius: 0 4px 4px 0; }
/* segmented control (equal-width) */
.but-average { display: flex; border-radius: 4px; overflow: hidden; }
.but-average.inline { display: inline-flex; }
.but-average.radius { border-radius: 100px; }
.but-average.main-radius { border-radius: var(--main-radius); }
.but-average.mini-radius { border-radius: var(--mini-radius); }
.but-average > .but { margin: 0 !important; border-radius: 0; flex: auto; }
.but-average > .but.active { --this-bg: var(--focus-color-opacity1); --this-color: var(--focus-color); }
/* size variants */
.but.but-sm { font-size: 0.9em; padding: 0.1em 0.4em; vertical-align: 0.05em; }
.but.badg-sm,
.badg.badg-sm { font-size: 0.8em; padding: 0 0.2em; vertical-align: 0.1em; min-width: 1.6em; }
.badg.badg-sm.cir { --this-size: 1.6em; }
.padding-lg,
.badg.badg-lg,
.but.padding-lg { padding: 0.5em 2em; }
/* active badge state */
.active.badg,
.active > .badg:not(.vip-tag) { --this-bg: var(--focus-color); --this-color: #fff; }
.active.badg.hollow,
.active > .hollow:not(.vip-tag) { --this-color: var(--focus-color); }
/* toggle-radius (round 29px toggle) — legacy 1:1 */
.toggle-radius {
background: var(--this-bg);
width: 29px;
height: 29px;
display: inline-block;
text-align: center;
border-radius: 100%;
position: relative;
vertical-align: text-top;
--this-bg: var(--main-border-color);
}
/* legacy groups these with abs-* : absolute + vertical center; then pin left/right 0 */
.toggle-radius .fa,
.toggle-radius .icon {
right: 0 !important;
left: 0 !important;
margin: auto;
}
/* solid color modifiers — set --this-bg; default --this-color white */
.b-gray, .b-theme, .b-red, .b-yellow, .b-blue, .b-blue-2, .b-black,
.b-cyan, .b-green, .b-purple,
.jb-red, .jb-pink, .jb-yellow, .jb-blue, .jb-green, .jb-purple,
.jb-vip1, .jb-vip2 {
color: var(--this-color);
background: var(--this-bg);
--this-color: #fff;
}
.jb-red, .jb-pink, .jb-yellow, .jb-blue, .jb-green, .jb-purple,
.jb-vip1, .jb-vip2 { border: none; }
.b-theme { --this-bg: var(--focus-color); }
.b-gray { --this-bg: #818b95; }
.b-red { --this-bg: #ff5473; }
.b-yellow { --this-bg: #ff6f06; }
.b-cyan { --this-bg: #08c4c1; }
.b-blue { --this-bg: #2997f7; }
.b-blue-2 { --this-bg: #5c7cff; }
.b-green { --this-bg: #12b928; }
.b-purple { --this-bg: #d448f5; }
.b-black { --this-bg: #121517; }
/* gradient modifiers (legacy .jb-*) */
.jb-red { --this-bg: linear-gradient(135deg, #fd7a64 10%, #fb2d2d 100%); }
.jb-yellow { --this-bg: linear-gradient(135deg, #f59f54 10%, #ff6922 100%); }
.jb-blue { --this-bg: linear-gradient(135deg, #59c3fb 10%, #268df7 100%); }
.jb-green { --this-bg: linear-gradient(135deg, #60e464 10%, #5cb85b 100%); }
.jb-purple { --this-bg: linear-gradient(135deg, #f98dfb 10%, #ea00f9 100%); }
.jb-pink { --this-bg: linear-gradient(135deg, #ff5e7f 30%, #ff967e 100%); }
.jb-vip1 { --this-bg: linear-gradient(25deg, #eabe7b 10%, #f5e3c7 70%, #edc788 100%); --this-color: #866127; }
.jb-vip2 { --this-bg: linear-gradient(317deg, #4d4c4c 30%, #7b7b7b 70%, #5f5c5c 100%); --this-color: #ddd; }
/* text-color modifiers (legacy .c-*) — set --this-color + light --this-bg */
.c-theme, .c-gray, .c-white, .c-red, .c-red-2, .c-yellow, .c-blue, .c-blue-2,
.c-green, .c-cyan, .c-purple { color: var(--this-color); }
.c-theme { --this-color: var(--focus-color); --this-bg: var(--focus-color-opacity1); }
.c-gray { --this-color: #888; --this-bg: rgba(136, 136, 136, 0.1); }
.c-white { --this-color: #fff; --this-bg: rgba(255, 255, 255, 0.1); }
.c-red { --this-color: #ff5473; --this-bg: rgba(255, 84, 115, 0.1); }
.c-red-2 { --this-color: #d6064c; --this-bg: rgba(194, 41, 46, 0.1); }
.c-yellow { --this-color: #ff6f06; --this-bg: rgba(255, 111, 6, 0.1); }
.c-blue { --this-color: #2997f7; --this-bg: rgba(41, 151, 247, 0.1); }
/* source: assets/css/core/forms.css */
/**
* Jio Forms — 1:1 legacy Alignment
*
* 对齐 legacy .form-control:
* - 灰色背景 (#f5f6f7)
* - 透明边框
* - 34px 高度
* - 8px 圆角
* - focus 时粉色边框 + 光晕
*/
/* ===== Field Wrapper ===== */
.field {
display: flex;
flex-direction: column;
gap: 6px;
margin-bottom: var(--space-4);
}
.field-label {
font-size: var(--text-sm);
font-weight: 600;
color: var(--color-ink);
}
.field-help {
font-size: var(--text-xs);
color: var(--color-ink-3);
}
.field-error {
font-size: var(--text-xs);
color: var(--color-error);
}
/* ===== Input / Textarea / Select — 对齐 legacy .form-control ===== */
.input,
.textarea,
.select,
input[type="text"].form-input,
input[type="email"].form-input,
input[type="password"].form-input,
input[type="search"].form-input,
input[type="url"].form-input,
input[type="tel"].form-input,
textarea.form-textarea,
select.form-select {
width: 100%;
height: 34px;
padding: 6px 12px;
font-size: 14px;
color: var(--color-ink);
background: var(--surface-page);
border: 1px solid transparent;
border-radius: var(--radius);
transition: border-color var(--dur-fast) var(--ease),
box-shadow var(--dur-fast) var(--ease);
}
.textarea,
textarea.form-textarea {
height: auto;
min-height: 120px;
padding: 12px;
line-height: var(--leading-snug);
resize: vertical;
}
.input:hover,
.textarea:hover,
.select:hover {
border-color: var(--color-primary);
}
.input:focus,
.textarea:focus,
.select:focus {
outline: none;
border-color: var(--color-primary);
box-shadow: 0 0 2px 3px rgba(253, 83, 161, 0.4);
}
.input::placeholder,
.textarea::placeholder {
color: var(--color-ink-4);
}
/* ===== Select ===== */
.select,
select.form-select {
appearance: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23777' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 12px center;
padding-right: 32px;
}
/* ===== Checkbox / Radio ===== */
.checkbox,
.radio {
display: inline-flex;
align-items: center;
gap: 8px;
cursor: pointer;
font-size: var(--text-sm);
color: var(--color-ink-2);
}
.checkbox input,
.radio input {
width: 16px;
height: 16px;
accent-color: var(--color-primary);
cursor: pointer;
}
/* ===== Input Group ===== */
.input-group {
display: flex;
align-items: stretch;
}
.input-group .input {
border-radius: var(--radius) 0 0 var(--radius);
}
.input-group .btn {
border-radius: 0 var(--radius) var(--radius) 0;
}
/* ===== Form Layout ===== */
.form-row {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: var(--space-4);
}
.form-actions {
display: flex;
gap: var(--space-3);
margin-top: var(--space-5);
}
/* source: assets/css/core/alerts.css */
/**
* Jio Alerts
* 统一提示组件:error / warning / info / success
* 用于替代各页面 inline 的 .login-error / .bind-error 等
*/
.alert {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 12px 14px;
margin-bottom: var(--space-4);
font-size: var(--text-sm);
line-height: var(--leading-snug);
border-radius: var(--radius);
border: 1px solid transparent;
}
.alert > svg {
flex-shrink: 0;
width: 18px;
height: 18px;
margin-top: 1px;
}
.alert--error {
color: #B91C1C;
background: rgba(239, 68, 68, 0.08);
border-color: rgba(239, 68, 68, 0.3);
}
.alert--warning {
color: #B45309;
background: rgba(245, 158, 11, 0.08);
border-color: rgba(245, 158, 11, 0.3);
}
.alert--success {
color: #047857;
background: rgba(16, 185, 129, 0.08);
border-color: rgba(16, 185, 129, 0.3);
}
.alert--info {
color: #1D4ED8;
background: rgba(59, 130, 246, 0.08);
border-color: rgba(59, 130, 246, 0.3);
}
html.dark .alert--error { color: #FCA5A5; }
html.dark .alert--warning { color: #FCD34D; }
html.dark .alert--success { color: #6EE7B7; }
html.dark .alert--info { color: #93C5FD; }
/* source: assets/css/core/animations.css */
/**
* Jio Animations — animate.css 等价(独立重写)
* ------------------------------------------------------------
* 关键帧 + 工具类 + IntersectionObserver 触发配合
* 触发 JS 已在 enhancements2.js([data-jio-animate] 属性)
* 本文件仅定义 @keyframes 和 .jio-anim-* 工具类
*/
/* ============================================================
* Keyframes
* ============================================================ */
/* Fade 系列 */
@keyframes jioFadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes jioFadeInUp {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: none; }
}
@keyframes jioFadeInDown {
from { opacity: 0; transform: translateY(-20px); }
to { opacity: 1; transform: none; }
}
@keyframes jioFadeInLeft {
from { opacity: 0; transform: translateX(-20px); }
to { opacity: 1; transform: none; }
}
@keyframes jioFadeInRight {
from { opacity: 0; transform: translateX(20px); }
to { opacity: 1; transform: none; }
}
/* Zoom 系列 */
@keyframes jioZoomIn {
from { opacity: 0; transform: scale(.85); }
to { opacity: 1; transform: none; }
}
@keyframes jioZoomInUp {
from { opacity: 0; transform: scale(.85) translateY(20px); }
to { opacity: 1; transform: none; }
}
/* Bounce 系列 */
@keyframes jioBounceIn {
0% { opacity: 0; transform: scale(.3); }
50% { opacity: 1; transform: scale(1.08); }
70% { transform: scale(.95); }
100% { opacity: 1; transform: none; }
}
@keyframes jioBounce {
0%, 20%, 50%, 80%, 100% { transform: translateY(0); }
40% { transform: translateY(-12px); }
60% { transform: translateY(-6px); }
}
/* Pulse */
@keyframes jioPulse {
0% { transform: scale(1); }
50% { transform: scale(1.06); }
100% { transform: scale(1); }
}
/* Flash */
@keyframes jioFlash {
0%, 50%, 100% { opacity: 1; }
25%, 75% { opacity: 0; }
}
/* RubberBand */
@keyframes jioRubberBand {
0% { transform: scale(1); }
30% { transform: scaleX(1.25) scaleY(0.75); }
40% { transform: scaleX(0.75) scaleY(1.25); }
50% { transform: scaleX(1.15) scaleY(0.85); }
65% { transform: scaleX(0.95) scaleY(1.05); }
75% { transform: scaleX(1.05) scaleY(0.95); }
100% { transform: scale(1); }
}
/* Shake */
@keyframes jioShake {
0%, 100% { transform: translateX(0); }
10%, 30%, 50%, 70%, 90% { transform: translateX(-4px); }
20%, 40%, 60%, 80% { transform: translateX(4px); }
}
/* Swing */
@keyframes jioSwing {
20% { transform: rotate(15deg); }
40% { transform: rotate(-10deg); }
60% { transform: rotate(5deg); }
80% { transform: rotate(-5deg); }
100% { transform: none; }
}
/* Tada */
@keyframes jioTada {
0% { transform: scale(1); }
10%, 20% { transform: scale(0.9) rotate(-3deg); }
30%, 50%, 70%, 90% { transform: scale(1.1) rotate(3deg); }
40%, 60%, 80% { transform: scale(1.1) rotate(-3deg); }
100% { transform: scale(1) rotate(0); }
}
/* Wobble */
@keyframes jioWobble {
0% { transform: none; }
15% { transform: translateX(-25%) rotate(-5deg); }
30% { transform: translateX(20%) rotate(3deg); }
45% { transform: translateX(-15%) rotate(-3deg); }
60% { transform: translateX(10%) rotate(2deg); }
75% { transform: translateX(-5%) rotate(-1deg); }
100% { transform: none; }
}
/* Slide 系列 */
@keyframes jioSlideInUp {
from { opacity: 0; transform: translateY(100%); }
to { opacity: 1; transform: none; }
}
@keyframes jioSlideInDown {
from { opacity: 0; transform: translateY(-100%); }
to { opacity: 1; transform: none; }
}
@keyframes jioSlideInLeft {
from { opacity: 0; transform: translateX(-100%); }
to { opacity: 1; transform: none; }
}
@keyframes jioSlideInRight {
from { opacity: 0; transform: translateX(100%); }
to { opacity: 1; transform: none; }
}
/* HeartBeat */
@keyframes jioHeartBeat {
0% { transform: scale(1); }
14% { transform: scale(1.3); }
28% { transform: scale(1); }
42% { transform: scale(1.3); }
70% { transform: scale(1); }
100% { transform: scale(1); }
}
/* Jello */
@keyframes jioJello {
0%, 100% { transform: none; }
11% { transform: skewX(-12.5deg) skewY(-12.5deg); }
22% { transform: skewX(6.25deg) skewY(6.25deg); }
33% { transform: skewX(-6.25deg) skewY(-6.25deg); }
44% { transform: skewX(3.125deg) skewY(3.125deg); }
55% { transform: skewX(-3.125deg) skewY(-3.125deg); }
66% { transform: skewX(1.5625deg) skewY(1.5625deg); }
77% { transform: skewX(-1.5625deg) skewY(-1.5625deg); }
88% { transform: skewX(0.78125deg) skewY(0.78125deg); }
}
/* HeadShake */
@keyframes jioHeadShake {
0% { transform: translateX(0); }
6.5% { transform: translateX(-6px) rotateY(-9deg); }
18.5% { transform: translateX(5px) rotateY(7deg); }
31.5% { transform: translateX(-3px) rotateY(-5deg); }
43.5% { transform: translateX(2px) rotateY(3deg); }
50% { transform: translateX(0); }
100% { transform: translateX(0); }
}
/* BounceOut — 退出动画 */
@keyframes jioBounceOut {
0% { transform: scale(1); }
25% { transform: scale(0.95); }
50% { transform: scale(1.1); }
75% { transform: scale(0.97); }
100% { transform: scale(1); opacity: 0; }
}
/* ZoomOut — 退出动画 */
@keyframes jioZoomOut {
0% { opacity: 1; transform: none; }
100% { opacity: 0; transform: scale(0.85); }
}
/* BackIn/BackOut */
@keyframes jioBackInUp {
0% { opacity: 0; transform: translateY(30px) scale(0.7); }
80% { opacity: 0.8; transform: translateY(-5px) scale(1.02); }
100% { opacity: 1; transform: none; }
}
@keyframes jioBackInDown {
0% { opacity: 0; transform: translateY(-30px) scale(0.7); }
80% { opacity: 0.8; transform: translateY(5px) scale(1.02); }
100% { opacity: 1; transform: none; }
}
/* Flip */
@keyframes jioFlip {
0% { transform: perspective(400px) rotateY(90deg); opacity: 0; }
40% { transform: perspective(400px) rotateY(-10deg); }
70% { transform: perspective(400px) rotateY(10deg); }
100% { transform: perspective(400px) rotateY(0deg); opacity: 1; }
}
@keyframes jioFlipInX {
0% { transform: perspective(400px) rotateX(90deg); opacity: 0; }
40% { transform: perspective(400px) rotateX(-10deg); }
70% { transform: perspective(400px) rotateX(10deg); }
100% { transform: perspective(400px) rotateX(0deg); opacity: 1; }
}
/* ============================================================
* Animation utility classes
* ============================================================ */
.jio-anim-fade-in { animation: jioFadeIn var(--dur-base, .4s) var(--ease-out, ease) both; }
.jio-anim-fade-up { animation: jioFadeInUp var(--dur-base, .4s) var(--ease-out, ease) both; }
.jio-anim-fade-down { animation: jioFadeInDown var(--dur-base, .4s) var(--ease-out, ease) both; }
.jio-anim-fade-left { animation: jioFadeInLeft var(--dur-base, .4s) var(--ease-out, ease) both; }
.jio-anim-fade-right { animation: jioFadeInRight var(--dur-base, .4s) var(--ease-out, ease) both; }
.jio-anim-zoom-in { animation: jioZoomIn var(--dur-base, .4s) var(--ease-out, ease) both; }
.jio-anim-zoom-in-up { animation: jioZoomInUp var(--dur-base, .4s) var(--ease-out, ease) both; }
.jio-anim-bounce-in { animation: jioBounceIn .6s var(--ease-out, ease) both; }
.jio-anim-bounce { animation: jioBounce 1s ease both; }
.jio-anim-pulse { animation: jioPulse 1s ease infinite; }
.jio-anim-flash { animation: jioFlash 1s ease both; }
.jio-anim-rubber-band { animation: jioRubberBand .8s ease both; }
.jio-anim-shake { animation: jioShake .5s ease both; }
.jio-anim-swing { animation: jioSwing .6s var(--ease-out, ease) both; }
.jio-anim-tada { animation: jioTada 1s ease both; }
.jio-anim-wobble { animation: jioWobble .8s ease both; }
.jio-anim-heart-beat { animation: jioHeartBeat 1.3s ease both; }
.jio-anim-jello { animation: jioJello .8s ease both; }
.jio-anim-head-shake { animation: jioHeadShake .8s ease both; }
/* 退出动画 */
.jio-anim-bounce-out { animation: jioBounceOut .5s ease both; }
.jio-anim-zoom-out { animation: jioZoomOut .3s ease both; }
/* BackIn 动画 */
.jio-anim-back-in-up { animation: jioBackInUp .5s var(--ease-out, ease) both; }
.jio-anim-back-in-down { animation: jioBackInDown .5s var(--ease-out, ease) both; }
.jio-anim-slide-up { animation: jioSlideInUp .5s var(--ease-out, ease) both; }
.jio-anim-slide-down { animation: jioSlideInDown .5s var(--ease-out, ease) both; }
.jio-anim-slide-left { animation: jioSlideInLeft .5s var(--ease-out, ease) both; }
.jio-anim-slide-right { animation: jioSlideInRight .5s var(--ease-out, ease) both; }
.jio-anim-flip { animation: jioFlip .6s var(--ease-out, ease) both; }
.jio-anim-flip-x { animation: jioFlipInX .6s var(--ease-out, ease) both; }
/* ============================================================
* Duration modifiers
* ============================================================ */
.jio-anim-fast { --dur-base: .2s; }
.jio-anim-slow { --dur-base: .6s; }
/* ============================================================
* Delay modifiers (配合 data-jio-delay 使用时为 inline,
* 也可用 class 方式独立设置)
* ============================================================ */
.jio-anim-delay-1 { animation-delay: .1s; }
.jio-anim-delay-2 { animation-delay: .2s; }
.jio-anim-delay-3 { animation-delay: .3s; }
.jio-anim-delay-4 { animation-delay: .4s; }
.jio-anim-delay-5 { animation-delay: .5s; }
.jio-anim-delay-6 { animation-delay: .6s; }
.jio-anim-delay-7 { animation-delay: .7s; }
.jio-anim-delay-8 { animation-delay: .8s; }
/* ============================================================
* Infinite modifier
* ============================================================ */
.jio-anim-infinite { animation-iteration-count: infinite; }
/* ============================================================
* Reduced-motion — 尊重用户偏好
* ============================================================ */
@media (prefers-reduced-motion: reduce) {
.jio-anim-fade-in,
.jio-anim-fade-up,
.jio-anim-fade-down,
.jio-anim-fade-left,
.jio-anim-fade-right,
.jio-anim-zoom-in,
.jio-anim-zoom-in-up,
.jio-anim-bounce-in,
.jio-anim-bounce,
.jio-anim-pulse,
.jio-anim-flash,
.jio-anim-rubber-band,
.jio-anim-shake,
.jio-anim-swing,
.jio-anim-tada,
.jio-anim-wobble,
.jio-anim-heart-beat,
.jio-anim-jello,
.jio-anim-head-shake,
.jio-anim-bounce-out,
.jio-anim-zoom-out,
.jio-anim-back-in-up,
.jio-anim-back-in-down,
.jio-anim-slide-up,
.jio-anim-slide-down,
.jio-anim-slide-left,
.jio-anim-slide-right,
.jio-anim-flip,
.jio-anim-flip-x {
animation: none !important;
}
}
/* source: assets/css/core/components-ext.css */
/**
* 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;
}
/* source: assets/css/core/color-utilities.css */
/**
* Jio Color Utilities — 多色按钮 / 渐变按钮 / 文字渐变 / Badge
* ------------------------------------------------------------
* 所有颜色走 CSS 变量(定义在 tokens.css),不硬编码十六进制。
*/
/* ============================================================
* 1. 多色按钮 — .jio-btn--{color}
* ============================================================ */
.jio-btn--rose { background: var(--jio-rose); color: #fff; }
.jio-btn--rose:hover,
.jio-btn--rose:focus-visible { background: #e11d48; }
.jio-btn--blue { background: var(--jio-blue); color: #fff; }
.jio-btn--blue:hover,
.jio-btn--blue:focus-visible { background: #2563eb; }
.jio-btn--green { background: var(--jio-green); color: #fff; }
.jio-btn--green:hover,
.jio-btn--green:focus-visible { background: #059669; }
.jio-btn--orange { background: var(--jio-orange); color: #fff; }
.jio-btn--orange:hover,
.jio-btn--orange:focus-visible { background: #ea580c; }
.jio-btn--purple { background: var(--jio-purple); color: #fff; }
.jio-btn--purple:hover,
.jio-btn--purple:focus-visible { background: #7c3aed; }
.jio-btn--cyan { background: var(--jio-cyan); color: #fff; }
.jio-btn--cyan:hover,
.jio-btn--cyan:focus-visible { background: #0891b2; }
.jio-btn--yellow { background: var(--jio-yellow); color: #422006; }
.jio-btn--yellow:hover,
.jio-btn--yellow:focus-visible { background: #ca8a04; color: #fff; }
.jio-btn--red { background: var(--jio-red); color: #fff; }
.jio-btn--red:hover,
.jio-btn--red:focus-visible { background: #dc2626; }
.jio-btn--teal { background: var(--jio-teal); color: #fff; }
.jio-btn--teal:hover,
.jio-btn--teal:focus-visible { background: #0d9488; }
.jio-btn--indigo { background: var(--jio-indigo); color: #fff; }
.jio-btn--indigo:hover,
.jio-btn--indigo:focus-visible { background: #4f46e5; }
.jio-btn--pink { background: var(--jio-pink); color: #fff; }
.jio-btn--pink:hover,
.jio-btn--pink:focus-visible { background: #db2777; }
/* Soft variant — 浅色背景 + 深色文字 */
.jio-btn--rose-soft { background: var(--jio-rose-soft); color: var(--jio-rose); }
.jio-btn--blue-soft { background: var(--jio-blue-soft); color: var(--jio-blue); }
.jio-btn--green-soft { background: var(--jio-green-soft); color: var(--jio-green); }
.jio-btn--orange-soft { background: var(--jio-orange-soft); color: var(--jio-orange); }
.jio-btn--purple-soft { background: var(--jio-purple-soft); color: var(--jio-purple); }
.jio-btn--cyan-soft { background: var(--jio-cyan-soft); color: var(--jio-cyan); }
.jio-btn--yellow-soft { background: var(--jio-yellow-soft); color: #92400e; }
.jio-btn--red-soft { background: var(--jio-red-soft); color: var(--jio-red); }
.jio-btn--teal-soft { background: var(--jio-teal-soft); color: var(--jio-teal); }
.jio-btn--indigo-soft { background: var(--jio-indigo-soft); color: var(--jio-indigo); }
.jio-btn--pink-soft { background: var(--jio-pink-soft); color: var(--jio-pink); }
/* ============================================================
* 2. 渐变按钮 — .jio-btn--grad-{name}
* ============================================================ */
.jio-btn--grad-vip {
background: linear-gradient(135deg, var(--jio-vip-gold-1), var(--jio-vip-gold-2));
color: #5a3d00;
border: none;
}
.jio-btn--grad-sunset {
background: linear-gradient(135deg, var(--jio-grad-sunset-1), var(--jio-grad-sunset-2));
color: #fff;
border: none;
}
.jio-btn--grad-ocean {
background: linear-gradient(135deg, var(--jio-grad-ocean-1), var(--jio-grad-ocean-2));
color: #fff;
border: none;
}
.jio-btn--grad-forest {
background: linear-gradient(135deg, var(--jio-grad-forest-1), var(--jio-grad-forest-2));
color: #064e3b;
border: none;
}
.jio-btn--grad-night {
background: linear-gradient(135deg, var(--jio-grad-night-1), var(--jio-grad-night-2));
color: #4c1d95;
border: none;
}
.jio-btn--grad-fire {
background: linear-gradient(135deg, var(--jio-grad-fire-1), var(--jio-grad-fire-2));
color: #fff;
border: none;
}
.jio-btn--grad-primary {
background: linear-gradient(135deg, var(--color-primary), var(--color-primary-active));
color: var(--color-on-primary);
border: none;
}
/* 渐变按钮 hover — 亮度微调 */
.jio-btn--grad-vip:hover,
.jio-btn--grad-sunset:hover,
.jio-btn--grad-ocean:hover,
.jio-btn--grad-forest:hover,
.jio-btn--grad-night:hover,
.jio-btn--grad-fire:hover,
.jio-btn--grad-primary:hover {
filter: brightness(1.08);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
}
/* ============================================================
* 3. 文字渐变 — .jio-text-grad-{name}
* ============================================================ */
.jio-text-grad-primary {
background: linear-gradient(135deg, var(--color-primary), var(--color-primary-active));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.jio-text-grad-vip {
background: linear-gradient(135deg, var(--jio-vip-gold-1), var(--jio-vip-gold-2));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.jio-text-grad-sunset {
background: linear-gradient(135deg, var(--jio-grad-sunset-1), var(--jio-grad-sunset-2));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.jio-text-grad-ocean {
background: linear-gradient(135deg, var(--jio-grad-ocean-1), var(--jio-grad-ocean-2));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.jio-text-grad-forest {
background: linear-gradient(135deg, var(--jio-grad-forest-1), var(--jio-grad-forest-2));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.jio-text-grad-night {
background: linear-gradient(135deg, var(--jio-grad-night-1), var(--jio-grad-night-2));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.jio-text-grad-fire {
background: linear-gradient(135deg, var(--jio-grad-fire-1), var(--jio-grad-fire-2));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
/* ============================================================
* 4. Badge 系统 — .jio-badge / .jio-badge--{color}
* ============================================================ */
.jio-badge {
display: inline-flex;
align-items: center;
justify-content: center;
height: var(--jio-badge-h, 22px);
padding: 0 8px;
border-radius: var(--radius-pill, 100px);
font-size: 12px;
font-weight: 600;
line-height: 1;
white-space: nowrap;
vertical-align: middle;
}
.jio-badge--primary { background: var(--color-primary-soft); color: var(--color-primary); }
.jio-badge--success { background: rgba(16, 185, 129, 0.12); color: var(--color-success); }
.jio-badge--warning { background: rgba(245, 158, 11, 0.12); color: var(--color-warning); }
.jio-badge--error { background: rgba(239, 68, 68, 0.12); color: var(--color-error); }
.jio-badge--info { background: rgba(59, 130, 246, 0.12); color: var(--color-info); }
.jio-badge--rose { background: var(--jio-rose-soft); color: var(--jio-rose); }
.jio-badge--blue { background: var(--jio-blue-soft); color: var(--jio-blue); }
.jio-badge--green { background: var(--jio-green-soft); color: var(--jio-green); }
.jio-badge--orange { background: var(--jio-orange-soft); color: var(--jio-orange); }
.jio-badge--purple { background: var(--jio-purple-soft); color: var(--jio-purple); }
.jio-badge--cyan { background: var(--jio-cyan-soft); color: var(--jio-cyan); }
.jio-badge--yellow { background: var(--jio-yellow-soft); color: #92400e; }
.jio-badge--red { background: var(--jio-red-soft); color: var(--jio-red); }
.jio-badge--teal { background: var(--jio-teal-soft); color: var(--jio-teal); }
.jio-badge--indigo { background: var(--jio-indigo-soft); color: var(--jio-indigo); }
.jio-badge--pink { background: var(--jio-pink-soft); color: var(--jio-pink); }
/* 渐变 Badge */
.jio-badge--grad-vip {
background: linear-gradient(135deg, var(--jio-vip-gold-1), var(--jio-vip-gold-2));
color: #5a3d00;
}
.jio-badge--grad-primary {
background: linear-gradient(135deg, var(--color-primary), var(--color-primary-active));
color: var(--color-on-primary);
}
/* Solid badge variant — 纯色背景 + 白色文字 */
.jio-badge--solid-primary { background: var(--color-primary); color: #fff; }
.jio-badge--solid-success { background: var(--color-success); color: #fff; }
.jio-badge--solid-warning { background: var(--color-warning); color: #fff; }
.jio-badge--solid-error { background: var(--color-error); color: #fff; }
.jio-badge--solid-info { background: var(--color-info); color: #fff; }
.jio-badge--solid-rose { background: var(--jio-rose); color: #fff; }
.jio-badge--solid-blue { background: var(--jio-blue); color: #fff; }
.jio-badge--solid-green { background: var(--jio-green); color: #fff; }
.jio-badge--solid-orange { background: var(--jio-orange); color: #fff; }
.jio-badge--solid-purple { background: var(--jio-purple); color: #fff; }
.jio-badge--solid-cyan { background: var(--jio-cyan); color: #fff; }
.jio-badge--solid-yellow { background: var(--jio-yellow); color: #422006; }
.jio-badge--solid-red { background: var(--jio-red); color: #fff; }
.jio-badge--solid-teal { background: var(--jio-teal); color: #fff; }
.jio-badge--solid-indigo { background: var(--jio-indigo); color: #fff; }
.jio-badge--solid-pink { background: var(--jio-pink); color: #fff; }
/* Badge sizes */
.jio-badge--sm { height: 18px; padding: 0 6px; font-size: 11px; }
.jio-badge--lg { height: 28px; padding: 0 12px; font-size: 13px; }
/* ============================================================
* 5. 背景色工具类 — .jio-bg-{color}
* ============================================================ */
.jio-bg-rose { background-color: var(--jio-rose-soft); }
.jio-bg-blue { background-color: var(--jio-blue-soft); }
.jio-bg-green { background-color: var(--jio-green-soft); }
.jio-bg-orange { background-color: var(--jio-orange-soft); }
.jio-bg-purple { background-color: var(--jio-purple-soft); }
.jio-bg-cyan { background-color: var(--jio-cyan-soft); }
.jio-bg-yellow { background-color: var(--jio-yellow-soft); }
.jio-bg-red { background-color: var(--jio-red-soft); }
.jio-bg-teal { background-color: var(--jio-teal-soft); }
.jio-bg-indigo { background-color: var(--jio-indigo-soft); }
.jio-bg-pink { background-color: var(--jio-pink-soft); }
/* ============================================================
* 6. 文字色工具类 — .jio-text-{color}
* ============================================================ */
.jio-text-rose { color: var(--jio-rose); }
.jio-text-blue { color: var(--jio-blue); }
.jio-text-green { color: var(--jio-green); }
.jio-text-orange { color: var(--jio-orange); }
.jio-text-purple { color: var(--jio-purple); }
.jio-text-cyan { color: var(--jio-cyan); }
.jio-text-yellow { color: var(--jio-yellow); }
.jio-text-red { color: var(--jio-red); }
.jio-text-teal { color: var(--jio-teal); }
.jio-text-indigo { color: var(--jio-indigo); }
.jio-text-pink { color: var(--jio-pink); }
/* source: assets/css/frontend/base.css */
/**
* Jio Main v5 — 博客/个人站完整前端
*/
/* 防止 hero 等使用 100vw / full-bleed 时产生横向滚动条 */
html,
body {
overflow-x: clip;
}
@supports not (overflow-x: clip) {
html,
body {
overflow-x: hidden;
}
}
/* ========== 阅读进度条(单篇文章顶 fixed)========== */
.reading-progress-bar {
position: fixed;
top: 0;
left: 0;
height: 3px;
width: 0%;
z-index: 9999;
pointer-events: none;
background: linear-gradient(90deg, var(--color-primary), var(--color-primary-light));
transition: width 0.1s ease-out;
}
/* 折叠 body 内注入的 BOM / 空白文本节点,防止产生多余行高间距 */
body {
font-family: var(--font-body);
font-size: var(--text-base);
line-height: var(--leading-normal);
color: var(--color-ink-2);
background-color: var(--surface-page);
}
/* legacy compat: global link composite transition */
a[href] {
transition: color 0.2s, background 0.3s, opacity 0.3s, box-shadow 0.3s, transform 0.3s;
}
/* Font Awesome 5: when legacy markup includes both `fa` and `fab`, the
* generic Solid rule must not override the Brands font face. */
.fa.fab {
font-family: "Font Awesome 5 Brands";
font-weight: 400;
}
/* FA5's later .fa rule sets 900; keep outline glyphs at their regular weight. */
.fa.far {
font-family: "Font Awesome 5 Free";
font-weight: 400;
}
.skip-link {
position: absolute;
left: 16px;
top: 12px;
z-index: 1100;
padding: 10px 14px;
border-radius: 999px;
background: var(--color-primary);
color: #fff;
transform: translateY(-140%);
transition: transform 0.2s ease;
}
.skip-link:focus {
transform: translateY(0);
}
/* ========== 站点外壳 ========== */
.site-wrapper {
min-height: 100vh;
display: flex;
flex-direction: column;
font-size: var(--text-base);
line-height: var(--leading-normal);
}
.site-main {
flex: 1;
}
/* legacy dual-column float math expects a padding-free main.container.
* Bootstrap 5 also defines .container (max-width ladder + padding-x).
* Force legacy geometry after Bootstrap so negative-margin sidebars land correctly. */
.container,
main.container,
.site-main.container {
width: 100%;
max-width: var(--container, var(--mian-max-width, 1200px));
margin-right: auto;
margin-left: auto;
padding-right: 0;
padding-left: 0;
/* Kill Bootstrap 5 --bs-gutter-x padding model on site shells */
--bs-gutter-x: 0;
--bs-gutter-y: 0;
}
/* Header multifunc icon cards must align with the main content edges:
* the global .container is padding-free at >=992px (dual-column float
* math), so the card container gets no extra gutter either. The
* <=991.98px media rule below restores 15px for every .container. */
/* Let the reference .px12-sm utility apply at its mobile breakpoint only. */
/* Keep the header multifunction search stable across route-specific CSS.
* Some routes load a later .abs-right utility, while the global input focus
* ring looks like an extra border against this transparent pill field. */
.header-slider-search .line-form-input:focus,
.header-slider-search .line-form-input:focus-visible {
border: 0;
outline: 0;
box-shadow: none;
}
.header-slider-search .line-form .abs-right {
position: absolute;
right: 0.7em;
top: 50%;
transform: translateY(-50%);
margin-top: 0;
}
@media (min-width: 576px) {
.container,
main.container {
max-width: var(--container, var(--mian-max-width, 1200px));
}
}
@media (min-width: 768px) {
.container,
main.container {
max-width: var(--container, var(--mian-max-width, 1200px));
}
}
@media (min-width: 992px) {
.container,
main.container {
max-width: var(--container, var(--mian-max-width, 1200px));
}
}
@media (min-width: 1200px) {
.container,
main.container {
max-width: var(--container, var(--mian-max-width, 1200px));
}
}
@media (min-width: 1240px) {
.container,
main.container,
.fluid-widget-wrap .widget-container {
width: auto;
max-width: var(--container, var(--mian-max-width, 1200px));
}
}
@media (min-width: 1400px) {
.container,
main.container {
max-width: var(--container, var(--mian-max-width, 1200px));
}
}
/* Soft pad only when the float dual-column is collapsed.
* Match legacy bootstrap container pad (15px) rather than 10px. */
@media (max-width: 991.98px) {
.container,
main.container {
padding-right: 15px;
padding-left: 15px;
}
}
@media (max-width: 767px) {
.container,
main.container {
width: 100%;
max-width: 100%;
padding-right: 15px;
padding-left: 15px;
}
}
/* ========== User identity inline icons ==========
* All compact identity marks share one line-height baseline: VIP, level,
* certification, and worn medals remain visually aligned in every surface.
*/
.jio-user-level-badge,
.jio-user-level-icon,
.jio-identity-medal,
.jio-identity-certification-icon,
.jio-header-user-medal {
display: inline-flex;
align-items: center;
justify-content: center;
width: auto;
height: 1.1em;
max-width: 6em;
object-fit: contain;
vertical-align: -.15em;
flex: 0 0 auto;
box-sizing: border-box;
}
.jio-user-level-badge {
padding: 0 .35em;
font-size: .78em;
line-height: 1.1;
white-space: nowrap;
}
/* Comment context: keep all identity marks inside the compact author line. */
.jio-identity-medal--comment,
.jio-user-level-icon--comment,
.jio-header-user-medal--comment {
height: 1em;
vertical-align: -.12em;
}
/* No-wrap inline name rows — keep the level icon on the same line as the name.
* The non-standard <name> element (legacy compat) plus .user-name / author-hero /
* uc-header name rows must not flex-wrap, or the badge drops to a new line.
* The comment header may still wrap (avatar + name + like can overflow on
* narrow viewports), so it keeps flex-wrap but the inner <name> never does. */
.article-avatar name,
.article-avatar .name,
.user-name,
.jio-author-hero__name,
.uc-header__name,
.jio-header-badges {
flex-wrap: nowrap;
white-space: nowrap;
}
.user-card.author .user-name > name {
overflow: visible;
}
.user-card.author .user-name > name > .display-name,
.user-card.widget .user-name > name > .display-name {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
}
.user-card.author .user-name > name > .follow {
flex-shrink: 0;
}
.jio-author-hero__name,
.uc-header__name {
display: inline-flex;
align-items: center;
gap: 4px;
}
.jio-author-hero__name-inner {
display: inline-flex;
align-items: center;
gap: 4px;
min-width: 0;
}
.jio-ip-geo-badge {
display: inline-flex;
align-items: center;
min-width: 0;
margin: 2px 0;
padding: .3em .6em;
border: 1px solid var(--color-line-soft, var(--main-border-color, rgba(136, 136, 136, .18)));
border-radius: var(--mini-radius, 4px);
background: var(--surface-2, rgba(136, 136, 136, .1));
box-shadow: var(--shadow-xs, 0 1px 3px rgba(0, 0, 0, .08));
color: var(--color-ink-3, #666);
font-size: .92em;
line-height: 1.44;
vertical-align: middle;
box-sizing: border-box;
}
.no-results {
padding: 48px 20px;
text-align: center;
color: var(--color-ink-3);
}
/* source: assets/css/frontend/header-userbox.css */
/**
* Header account popover.
*
* The shared navigation rules own the layout. Restore the reference typography
* and action controls where the public reset differs from Bootstrap 3.
*/
.header,
.mobile-header,
.navbar-search {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
font-weight: 400;
line-height: 1.42857143;
-webkit-font-smoothing: auto;
-moz-osx-font-smoothing: auto;
text-rendering: auto;
}
/* Keep the logo inline so the centered mobile brand can use text-align. */
.navbar-logo > img {
display: inline;
}
/* Reference .btn geometry without the public .btn skin. The 14px SVG keeps
* main.css's 1em size and -0.15em baseline; list-inline owns the item spacing. */
.navbar-top .jio-nav-icon {
display: inline-block;
padding: 6px 12px;
margin-bottom: 0;
font-size: 14px;
font-weight: 400;
line-height: 1.42857143;
text-align: center;
white-space: nowrap;
vertical-align: middle;
touch-action: manipulation;
border: 1px solid transparent;
border-radius: 4px;
user-select: none;
}
.navbar-search .line-form-input:focus,
.navbar-search .line-form-input:focus-visible {
outline: 0;
box-shadow: none;
}
.jio-header-userbox {
color: var(--color-ink-2);
line-height: 1.42857143;
}
/* public.css redeclares .muted-box after the legacy utility rules, which
* otherwise overrides the wallet tiles' padding-6 and radius4 utilities. */
.jio-header-userbox .muted-box.padding-6 {
background-color: var(--this-bg, var(--color-line-soft));
border-radius: 4px;
padding: 6px;
}
/* core/buttons.css restates the legacy .but block after main.css, so its
* background / color / border / text-shadow declarations outrank .payvip-icon
* and replace the payvip surface with whatever .jb-* skin is on the element.
* The reference theme has no such compatibility layer, so its .payvip-icon
* declarations are the last word in the cascade. Re-assert them here, which
* loads after core/buttons.css, so every payvip surface (top-nav chip, user
* card status bar and CTA, guest CTA) keeps the legacy metallic gradient. */
.payvip-icon {
background: linear-gradient(300deg, #4c4d51, #2a2a31 15%, #85858a 40%, #393a3c 60%, #393838 80%, #5e5f62 100%);
color: #ece0e0;
--this-color: #ece0e0;
border: none;
text-shadow: none;
}
/* Keep the header check-in action flush with the VIP row's padded inner width. */
.jio-header-userbox > .mt6.em09 > .but.block {
display: block;
box-sizing: border-box;
width: 100%;
}
/* Top-nav bell badge (the card itself uses the legacy badge.top element). */
.jio-nav-notification .jio-notification-badge {
position: absolute;
top: 2px;
right: 2px;
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 16px;
height: 16px;
padding: 0 4px;
border: 2px solid var(--surface-1);
border-radius: 999px;
background: #e74c3c;
color: #fff;
font-size: 9px;
font-weight: 700;
line-height: 1;
}
/* Navigation links are globally capped at 50px. Account actions are taller
* icon tiles and must opt out or their labels overlap the following row.
* The tile geometry itself stays with the shared legacy rules
* (.header-user-href > a and .header-user-href .toggle-radius in main.css)
* so the action row keeps the reference proportions. */
.navbar-top .jio-header-userbox .header-user-href > a,
.jio-header-userbox .header-user-href > a {
max-height: none;
}
.mobile-navbar .jio-header-userbox {
width: auto;
max-width: 400px;
margin: auto;
}
/* source: assets/css/frontend/card-primitives.css */
/**
* Jio Card Primitives — 1:1 legacy Alignment
*
* 对齐 legacy 的 .theme-box / .box-bg / .box-body / .box-header:
* 阴影优先,无边框,8px 圆角,15px 内边距。
*
* @package Jio
*/
/* ============================================================
* .jio-theme-box — 完整卡片原语(阴影 + 圆角 + 表面)
* 对齐 legacy .theme-box + .box-bg
* ============================================================ */
.jio-theme-box {
border: none;
border-radius: var(--radius, 8px);
background: var(--surface-1);
box-shadow: var(--shadow-sm);
transition: box-shadow 0.2s ease;
}
.jio-theme-box:hover {
box-shadow: var(--shadow);
}
/* ============================================================
* .jio-box-bg — 表面原语(仅背景 + 阴影)
* ============================================================ */
.jio-box-bg {
background-color: var(--surface-1);
box-shadow: var(--shadow-sm);
}
/* ============================================================
* .jio-box-body / .jio-box-header — 内边距区段
* 对齐 legacy .box-body / .box-header { padding: 15px }
* ============================================================ */
.jio-box-body,
.jio-box-header {
padding: var(--card-padding);
}
.jio-box-header {
border-bottom: 1px solid var(--color-line-soft);
}
.jio-box-header + .jio-box-body {
padding-top: 0;
}
.jio-box-body.notop,
.jio-box-header.notop { padding-top: 0; }
.jio-box-body.nobottom,
.jio-box-header.nobottom { padding-bottom: 0; }
/* ============================================================
* .jio-muted-box — 柔和背景嵌套
* 对齐 legacy .muted-box
* ============================================================ */
.jio-muted-box {
background-color: var(--surface-2);
border-radius: var(--radius);
padding: var(--card-padding);
}
/* ============================================================
* .jio-noshadow — 去除阴影
* ============================================================ */
.jio-noshadow {
box-shadow: none !important;
}
/* ============================================================
* legacy 兼容别名
* ============================================================ */
/* legacy .theme-box is ONLY a spacing utility (margin-bottom: 20px).
* Background/shadow live on .main-bg / .main-shadow / .box-bg / .jio-panel.
* Do NOT turn every theme-box into a card — article-header also uses it. */
.theme-box,
.mb20 {
margin-bottom: 20px;
}
.box-bg {
background-color: var(--main-bg-color, var(--surface-1));
box-shadow: 0 0 10px var(--main-shadow, rgba(116, 116, 116, 0.08));
}
.box-body {
padding: var(--card-padding);
}
.box-header {
padding: var(--card-padding);
border-bottom: 1px solid var(--color-line-soft);
}
.box-header + .box-body {
padding-top: 0;
}
.radius8 {
border-radius: var(--radius);
}
.main-shadow {
box-shadow: 0 0 10px var(--main-shadow, rgba(116, 116, 116, 0.08));
}
.main-bg {
background: var(--main-bg-color, var(--surface-1));
}
.muted-box {
background-color: var(--surface-2);
border-radius: var(--radius);
padding: var(--card-padding);
}
/* ============================================================
* 暗色模式
* ============================================================ */
html.dark .jio-theme-box,
body.dark-theme .jio-theme-box,
html.dark .box-bg,
body.dark-theme .box-bg {
border-color: transparent;
box-shadow: 0 0 10px var(--main-shadow, rgba(0, 0, 0, 0.2));
}
html.dark .jio-theme-box:hover,
body.dark-theme .jio-theme-box:hover {
box-shadow: 0 0 10px var(--main-shadow, rgba(0, 0, 0, 0.28));
}
/* ============================================================
* 卡片 hover 动效
* ============================================================ */
.jio-theme-box {
transition: box-shadow var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.jio-card-hover:hover,
.jio-card-hover:focus-within {
box-shadow: none;
transform: none;
}
.jio-card-hover-lg:hover,
.jio-card-hover-lg:focus-within {
box-shadow: var(--shadow-lg);
transform: none;
}
.jio-noshadow:hover {
box-shadow: none !important;
transform: none !important;
}
/* ============================================================
* .jio-panel — legacy sidebar/widget surface
* ============================================================ */
.jio-panel {
clear: both;
background-color: var(--surface-1);
padding: var(--card-padding);
box-shadow: var(--shadow-sm);
border-radius: var(--radius, 8px);
margin-bottom: 20px;
}
/* source: assets/css/frontend/overlay-primitives.css */
/**
* Jio Overlay / Glass Primitives
*
* Provides backdrop-filter glass surfaces used by header, footer-tabbar,
* floating buttons and search overlays — matching legacy's blur system.
*
* @package Jio
*/
/* ============================================================
* .jio-blur-bg — generic glass surface
* Use on any element that needs a translucent blurred background.
* ============================================================ */
.jio-blur-bg {
-webkit-backdrop-filter: saturate(5) blur(20px);
backdrop-filter: saturate(5) blur(20px);
background: var(--blur-bg);
}
/* ============================================================
* Glass on site-nav (when using fixed/sticky mode)
* Applied via .site-nav--blur already; this adds the legacy-grade
* saturate(5) blur(20px) instead of the lighter saturate(1.5) blur(18px).
* ============================================================ */
.site-nav--glass {
-webkit-backdrop-filter: saturate(5) blur(20px);
backdrop-filter: saturate(5) blur(20px);
background: var(--blur-bg);
border-bottom-color: transparent;
}
.site-nav--glass.is-scrolled {
box-shadow: var(--shadow-sm);
border-bottom-color: var(--color-line-soft);
}
html.dark .site-nav--glass.is-scrolled,
html.dark .site-nav--glass.is-scrolled {
box-shadow: var(--shadow-sm);
}
/* ============================================================
* Glass on footer-tabbar (already uses backdrop-filter in footer.css;
* this class can be toggled to match legacy's exact blur spec)
* ============================================================ */
.footer-tabbar--glass {
-webkit-backdrop-filter: saturate(5) blur(20px);
backdrop-filter: saturate(5) blur(20px);
background: var(--blur-bg);
box-shadow: 0 -8px 24px rgba(20, 28, 48, 0.08);
}
html.dark .footer-tabbar--glass,
html.dark .footer-tabbar--glass {
box-shadow: 0 -10px 28px rgba(0, 0, 0, 0.32);
}
/* ============================================================
* Scroll shadow on glass header (legacy: .body-scroll .header)
* ============================================================ */
body.has-scrolled .site-nav--glass {
box-shadow: 0 4px 10px rgba(20, 28, 48, 0.06);
}
html.dark body.has-scrolled .site-nav--glass,
html.dark body.has-scrolled .site-nav--glass {
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.25);
}
/* source: assets/css/frontend/layout.css */
/* Breadcrumb chrome lives in breadcrumb.css (single source). */
/* ========== 主布局 ========== */
.content-main {
width: 100%;
}
.content-main--single {
max-width: 100%;
}
.content-shell {
width: 100%;
margin: 0 auto;
padding: 32px 16px 48px;
max-width: var(--container);
}
/* 用户中心(双栏)铺满视口:左栏 320 + 间距 20 + 右栏需要横向空间,被
* 阅读宽度收窄会在左右两侧留下大片空白。只有 page-profile.php 的 main 带
* .jio-profile(公开主页的该类只打在 body 上),因此不会误伤其它路由。 */
.site-main.content-shell.jio-profile {
max-width: 100%;
box-sizing: border-box;
}
/* 公开主页是单栏,继续沿用后台「内容最大宽度」。顶部多功能组件位于
* main 之前;main 的通用 32/40px 上内边距会把资料卡与组件人为拉开,
* 这里仅对公开主页清除该段重复空白。 */
.site-main.content-shell.jio-user-home {
max-width: var(--container, 1440px);
padding-top: 0;
box-sizing: border-box;
}
@media (min-width: 768px) {
.content-shell {
padding: 40px 24px 56px;
}
}
/* page.php 专用:阅读宽度收窄 */
.content-shell--page {
max-width: var(--container-page, 860px);
}
.content-shell--cms {
max-width: 100%;
padding: 0;
}
/* page.php 内的元素 */
.entry-page .entry-thumb {
margin: 0 0 var(--space-6, 24px);
border-radius: var(--radius-lg, 12px);
overflow: hidden;
}
.entry-page .page-links {
margin-top: var(--space-6, 24px);
font-size: var(--text-sm, 0.875rem);
color: var(--color-ink-3, var(--color-ink-3));
}
.entry-page .page-links-title {
margin-right: 8px;
font-weight: 600;
}
/* ============================================================
* Site shell — site-layout-1/2/3 dual-column
* DOM: main.container > .content-wrap + .sidebar (siblings)
* body.site-layout-1 = no sidebar
* body.site-layout-2 = sidebar right
* body.site-layout-3 = sidebar left
*
* This intentionally uses legacy's float/negative-margin ownership model.
* Below 992px the sidebar is hidden and the content margins collapse.
* ============================================================ */
main.container,
main.content-shell,
.site-main.container {
position: relative;
}
/* content-shell is a padding shell for non-dual pages; when it also hosts
* the float dual-column, kill horizontal padding so negative-margin math matches legacy. */
main.container.content-shell,
main.content-shell.container,
.site-main.container.content-shell {
padding-left: 0;
padding-right: 0;
max-width: var(--container, var(--mian-max-width, 1200px));
width: 100%;
box-sizing: border-box;
}
main.container::after,
main.content-shell::after,
.site-main.container::after {
content: "";
display: table;
clear: both;
}
/* Float/negative-margin compatibility fallback.
*
* Critical: .content-layout must NOT set width:100%. Under box-sizing:border-box
* a 100% width + margin-right gutter keeps the border-box at full container
* width, so the gutter never shrinks the content box and .sidebar (margin-left:-311px)
* sits under the main column (overlap). legacy only sets margin on .content-layout;
* width stays auto so margin carves out the column. */
.content-wrap {
float: left;
width: 100%;
min-width: 0;
display: block;
box-sizing: border-box;
}
.content-layout {
display: block;
/* width:auto — never 100%; margin must shrink the used width */
width: auto;
min-width: 0;
max-width: none;
margin-right: 0;
margin-left: 0;
box-sizing: border-box;
}
.content-layout__primary {
min-width: 0;
max-width: 100%;
}
/* Base sidebar column (legacy .sidebar defaults) — layout variants override below */
.sidebar {
float: left;
width: 311px; /* legacy hard 311px; --sidebar-width kept in sync via runtime vars */
width: var(--sidebar-width, 311px);
min-width: 0;
position: relative;
box-sizing: border-box;
display: block;
}
.content-layout__aside {
min-width: 0;
}
/* No sidebar */
body.site-layout-1 .sidebar,
.site-layout-1 .sidebar {
display: none;
}
body.site-layout-1 .content-layout,
body.site-layout-1 .content-layout--no-sidebar,
.site-layout-1 .content-layout {
margin-left: 0;
margin-right: 0;
}
/* Compat: templates may still stamp content-layout--no-sidebar */
.content-layout--no-sidebar {
margin-left: 0 !important;
margin-right: 0 !important;
}
/* Sidebar RIGHT (layout 2) — legacy: margin-right: calc(311px + 15px) only */
body.site-layout-2 .content-layout,
.site-layout-2 .content-layout {
margin-right: calc(311px + 15px);
margin-right: calc(var(--sidebar-width, 311px) + 15px);
margin-left: 0;
width: auto;
}
body.site-layout-2 .sidebar,
.site-layout-2 .sidebar {
float: left;
width: 311px;
width: var(--sidebar-width, 311px);
margin-left: -311px;
margin-left: calc(0px - var(--sidebar-width, 311px));
position: unset;
}
/* Sidebar LEFT (layout 3) */
body.site-layout-3 .content-layout,
.site-layout-3 .content-layout {
margin-left: calc(311px + 15px);
margin-left: calc(var(--sidebar-width, 311px) + 15px);
margin-right: unset;
width: auto;
}
body.site-layout-3 .sidebar,
.site-layout-3 .sidebar {
float: left;
width: 311px;
width: var(--sidebar-width, 311px);
margin-left: -100%;
position: unset;
}
/* Sticky widgets inside sidebar */
@media (min-width: 992px) {
.sidebar .content-layout__aside,
.content-layout__aside {
position: sticky;
top: calc(var(--nav-height, 60px) + 16px);
}
.has-static-nav .content-layout__aside {
top: 16px;
}
}
/* Mobile collapse (legacy max-width: 991px) */
@media (max-width: 991.98px) {
body.site-layout-2 .content-layout,
body.site-layout-3 .content-layout,
.site-layout-2 .content-layout,
.site-layout-3 .content-layout {
margin-left: auto;
margin-right: auto;
}
body.site-layout-2 .sidebar,
body.site-layout-3 .sidebar,
.site-layout-2 .sidebar,
.site-layout-3 .sidebar,
.sidebar {
display: none;
}
}
/* ========== 页面标题区 ========== */
.page-header {
margin-bottom: 28px;
}
.page-header .entry-title {
margin-bottom: 8px;
}
.page-header p {
color: var(--color-ink-3);
margin: 0;
max-width: 720px;
}
/* Reference cover ratio must outrank the shared panel padding. */
body.category .site-main {
line-height: 1.42857143;
}
.page-cover.jio-panel {
padding: 0 0 calc(25% + 80px);
}
.jio-admin-quicklink {
display: inline-flex;
align-items: center;
gap: 8px;
min-height: 36px;
padding: 0 14px;
border: 1px solid var(--color-line);
border-radius: var(--radius-pill, 999px);
background: var(--surface-2);
color: var(--color-ink-2);
text-decoration: none;
white-space: nowrap;
font-size: 0.875rem;
font-weight: 600;
}
.jio-admin-quicklink:hover {
color: var(--color-primary);
border-color: var(--color-primary);
background: var(--color-primary-soft, rgba(59, 130, 246, 0.08));
}
.content-stream {
display: block;
}
.content-main--archive,
.content-main--tag,
.content-main--search,
.content-main--single {
display: grid;
gap: 20px;
}
.content-stream__empty {
padding: 28px 24px;
border-radius: var(--radius-lg);
background: var(--surface-1);
border: 1px solid var(--color-line-soft, rgba(15, 23, 42, 0.08));
}
.article-shell {
overflow: hidden;
}
/* 归档面 AJAX 筛选的加载态与首页共用同一套骨架契约:
.post_ajax_loader 容器 + .is-loading 开关(见 frontend/modal-runtime.css)。
原先本文件另有一套独立 spinner 遮罩与 opacity 淡出,已删除 ——
全站只有一套加载语言。 */
@media (max-width: 767px) {
.jio-admin-quicklink {
width: fit-content;
}
}
/* ========== AJAX 分页(加载更多 / 无限滚动) ========== */
.jio-pagination-ajax {
display: flex;
flex-direction: column;
align-items: center;
gap: 16px;
margin: 40px 0 8px;
}
.jio-load-more-btn {
min-width: 180px;
height: 44px;
padding: 0 32px;
border-radius: var(--radius-btn);
border: 1px solid var(--color-line);
background: var(--surface-page);
color: var(--color-ink);
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: border-color 0.2s, color 0.2s, background 0.2s;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
}
.jio-load-more-btn:hover {
border-color: var(--color-primary);
color: var(--color-primary);
}
.jio-load-more-btn:disabled {
opacity: 0.5;
pointer-events: none;
}
.jio-loading-indicator {
display: none;
align-items: center;
gap: 8px;
font-size: 14px;
color: var(--color-ink-4);
}
.jio-loading-indicator i {
font-size: 16px;
}
.jio-scroll-sentinel {
width: 100%;
height: 1px;
pointer-events: none;
}
/* ========== 移动端/平板隐藏侧栏(与 legacy 一致:991px 以下隐藏) ========== */
@media (max-width: 991px) {
.content-layout__aside {
display: none;
}
}
.content-layout__primary--cms {
min-width: 0;
}
/* ============================================================
* Phase 2 — 侧栏 widget 内链接增强
* ============================================================ */
.content-layout__aside .widget a {
transition: color var(--dur-fast, 0.15s) var(--ease);
}
.content-layout__aside .widget a:hover {
color: var(--color-primary);
}
/* ============================================================
* Phase 5 — 文章操作卡片增强
* ============================================================ */
/* ============================================================
* Phase 6 — 评论卡片容器
* ============================================================ */
.comments-card {
overflow: hidden;
}
/* source: assets/css/frontend/footer.css */
/* ============================================================
* Jio Footer utilities — float buttons start + device helpers
* Main template_1 shell: shell.css
* Tabbar / float details continue below.
* ============================================================ */
:root {
--jio-footer-tabbar-height: 49px;
}
/* Device visibility utility classes */
@media (max-width: 767px) {
.hide-on-mobile { display: none !important; }
.hidden-xs { display: none !important; }
}
@media (min-width: 768px) {
.hide-on-desktop { display: none !important; }
.hide-on-pc { display: none !important; }
}
/* ============================================================
* 移动端底部 Tab 栏(模仿 legacy footer-tabbar)
* ============================================================ */
.footer-tabbar {
display: none;
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 1035;
min-height: var(--jio-footer-tabbar-height);
background: var(--blur-bg);
border-top: 1px solid var(--color-line-soft);
padding: 0 0 env(safe-area-inset-bottom, 0px);
justify-content: space-around;
align-items: center;
box-shadow: 0 -4px 5px var(--main-shadow, rgba(0, 0, 0, 0.06));
-webkit-backdrop-filter: saturate(5) blur(20px);
backdrop-filter: saturate(5) blur(20px);
--tabbar-active-color: #f04494;
--tabbar-icon-size: 24px;
--tabbar-text-size: 10px;
}
.footer-tabbar.no-border {
border-top: none;
}
.footer-tabbar.no-shadow {
box-shadow: none;
}
.footer-tabbar.hide-text .tabbar-item span {
display: none;
}
.footer-tabbar.has-animation .tabbar-item {
transition: color 0.15s ease, transform 0.15s ease;
}
.footer-tabbar.has-animation .tabbar-item:active {
transform: scale(0.9);
}
.footer-tabbar-placeholder {
display: none;
height: calc(var(--jio-footer-tabbar-height) + env(safe-area-inset-bottom, 0px));
}
@media (max-width: 767px) {
.footer-tabbar {
display: flex;
}
.footer-tabbar-placeholder {
display: block;
}
/* 有 tabbar 时页脚需要额外底部间距 */
.footer,
.site-footer {
padding-bottom: calc(var(--jio-footer-tabbar-height) + env(safe-area-inset-bottom, 0px));
}
}
.tabbar-item {
display: flex;
flex: 1 1 0;
min-width: 0;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 1px;
min-height: 49px;
padding: 4px 0 3px;
color: var(--muted-color, var(--color-ink-3));
font-size: 13px;
text-decoration: none;
border: none;
background: none;
cursor: pointer;
transition: color 0.15s ease;
-webkit-tap-highlight-color: transparent;
position: relative;
}
/* 对齐 legacy: 24px 图标 */
.tabbar-item i {
font-size: var(--tabbar-icon-size, 24px);
line-height: 1;
}
.tabbar-item span {
display: block;
font-size: var(--tabbar-text-size, 10px);
font-weight: 500;
line-height: 1;
transform: scale(0.8);
transform-origin: center top;
}
.tabbar-item:hover,
.tabbar-item.active {
color: var(--tabbar-active-color, var(--color-primary));
text-decoration: none;
}
.tabbar-item.active i {
font-weight: 900;
}
.tabbar-badge {
position: absolute;
top: 2px;
right: 8px;
min-width: 16px;
height: 16px;
padding: 0 4px;
border-radius: 999px;
background: var(--color-error);
color: #fff;
font-size: 10px;
line-height: 16px;
font-style: normal;
font-weight: 700;
text-align: center;
box-shadow: 0 2px 8px rgba(239, 68, 68, 0.20);
}
.tabbar-badge--dot {
min-width: 0;
width: 8px;
height: 8px;
padding: 0;
top: 4px;
right: 10px;
font-size: 0;
line-height: 1;
box-shadow: 0 0 0 2px var(--blur-bg);
}
.tabbar-item--add {
margin-top: -22px;
width: 62px;
height: 62px;
min-height: 62px;
border-radius: 50%;
background: var(--color-accent);
color: #fff;
box-shadow: 0 12px 24px var(--color-accent-shadow);
flex: 0 0 62px;
z-index: 1;
}
.tabbar-item--add i {
font-size: 22px;
}
.tabbar-item--add span {
font-size: 11px;
}
.tabbar-item--add:hover,
.tabbar-item--add.active {
color: #fff;
}
.tabbar-add-backdrop {
position: fixed;
inset: 0;
z-index: 951;
background: rgba(15, 23, 42, 0.38);
}
.tabbar-add-panel {
position: fixed;
left: 0;
right: 0;
bottom: 0;
z-index: 952;
padding: 0 12px calc(84px + env(safe-area-inset-bottom, 0px));
}
.tabbar-add-panel__sheet {
border-radius: 20px;
background: var(--surface-1);
border: none;
box-shadow: var(--shadow-drawer);
overflow: hidden;
}
.tabbar-add-panel__head {
display: flex;
align-items: center;
justify-content: space-between;
padding: 16px 18px 12px;
border-bottom: 1px solid var(--color-line);
}
.tabbar-add-panel__close {
width: 32px;
height: 32px;
border: 0;
border-radius: 50%;
background: var(--surface-2);
color: var(--color-ink-3);
}
.tabbar-add-panel__list {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 12px;
padding: 18px;
}
.tabbar-add-panel__item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 8px;
min-height: 88px;
border-radius: 18px;
background: var(--surface-2);
color: var(--color-ink-3);
text-decoration: none;
}
.tabbar-add-panel__item i {
font-size: 22px;
color: var(--color-accent);
}
.tabbar-add-panel__item span {
font-size: 13px;
font-weight: 600;
}
.tabbar-search-overlay {
position: fixed;
inset: 0;
z-index: 953;
background: rgba(15, 23, 42, 0.58);
display: flex;
align-items: stretch;
justify-content: center;
}
.tabbar-search-overlay__dialog {
width: 100%;
min-height: 100%;
background: var(--surface-1);
padding: 18px 16px calc(24px + env(safe-area-inset-bottom, 0px));
}
.tabbar-search-overlay__head {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 16px;
}
.tabbar-search-overlay__close {
width: 36px;
height: 36px;
border: 0;
border-radius: 50%;
background: var(--surface-2);
color: var(--color-ink-3);
}
.tabbar-search-overlay__form {
display: grid;
grid-template-columns: 20px 1fr auto;
gap: 10px;
align-items: center;
padding: 14px 14px 14px 12px;
border-radius: 18px;
border: none;
box-shadow: var(--shadow-sm);
background: var(--surface-4);
}
.tabbar-search-overlay__icon {
color: var(--color-ink-4);
}
.tabbar-search-overlay__form input {
min-width: 0;
border: 0;
background: transparent;
color: var(--color-ink);
font-size: 15px;
outline: none;
}
.tabbar-search-overlay__submit {
border: 0;
border-radius: 12px;
padding: 10px 14px;
background: var(--color-accent);
color: #fff;
font-weight: 700;
}
.tabbar-search-overlay__types {
display: flex;
gap: 8px;
margin-top: 14px;
}
.tabbar-search-overlay__type {
border: 0;
border-radius: 999px;
padding: 9px 14px;
background: var(--surface-2);
color: var(--color-ink-3);
font-size: 13px;
font-weight: 600;
}
.tabbar-search-overlay__type.is-active {
background: var(--color-accent-soft);
color: var(--color-accent);
}
.tabbar-search-overlay__section {
margin-top: 20px;
}
.tabbar-search-overlay__section-head {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 12px;
}
.tabbar-search-overlay__label {
color: var(--color-ink-3);
font-size: 13px;
font-weight: 700;
}
.tabbar-search-overlay__clear {
border: 0;
background: transparent;
color: var(--color-accent);
font-size: 12px;
font-weight: 700;
}
.tabbar-search-overlay__history,
.tabbar-search-overlay__suggestions {
display: flex;
flex-direction: column;
gap: 10px;
}
.tabbar-search-overlay__history-item,
.tabbar-search-overlay__suggestion-item {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
width: 100%;
border: none;
border-radius: 16px;
padding: 12px 14px;
background: var(--surface-4);
box-shadow: var(--shadow-sm);
color: var(--color-ink-3);
text-decoration: none;
text-align: left;
}
.tabbar-search-overlay__history-item i {
color: var(--color-accent);
}
.tabbar-search-overlay__history-item span,
.tabbar-search-overlay__suggestion-item span {
flex: 1;
min-width: 0;
font-size: 14px;
font-weight: 600;
}
.tabbar-search-overlay__suggestion-item small {
color: var(--color-ink-4);
font-size: 12px;
}
.tabbar-search-overlay__empty {
padding: 14px;
border-radius: 16px;
background: var(--surface-2);
color: var(--color-ink-4);
font-size: 13px;
text-align: center;
}
.tabbar-search-overlay__tags {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.tabbar-search-overlay__tag {
padding: 10px 14px;
border-radius: 999px;
background: var(--surface-2);
color: var(--color-ink-3);
text-decoration: none;
font-size: 13px;
}
body.tabbar-search-open,
body.tabbar-add-open {
overflow: hidden;
}
/* 滚动时隐藏 tabbar(可选,通过 JS 添加 class) */
.footer-tabbar.scrolling-hide {
transform: translateY(100%);
transition: transform 0.3s ease;
}
/* 向下滚动隐藏,向上滚动显示 */
.footer-tabbar.scroll-down-hide {
transition: transform 0.3s ease;
}
.footer-tabbar.scroll-down-hide.is-hidden {
transform: translateY(120%);
}
/* 返回顶部包裹项(首页按钮 + 返回顶部切换) */
.tabbar-ontop-wrap {
position: relative;
}
.tabbar-ontop-wrap .tabbar-ontop-btn {
display: none;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 2px;
padding: 4px 12px;
color: var(--color-primary);
font-size: 13px;
text-decoration: none;
cursor: pointer;
-webkit-tap-highlight-color: transparent;
}
.tabbar-ontop-wrap .tabbar-ontop-btn i {
font-size: 18px;
line-height: 1;
}
.tabbar-ontop-wrap .tabbar-ontop-btn span {
font-weight: 500;
line-height: 1;
transform: scale(0.8);
transform-origin: center top;
}
.tabbar-ontop-wrap.is-scrolled .tabbar-ontop-btn {
display: flex;
}
.tabbar-ontop-wrap.is-scrolled > .tabbar-item:not(.tabbar-ontop-btn) {
opacity: 0;
pointer-events: none;
}
/* ============================================================
* 暗色模式适配
* ============================================================ */
.theme-dark .site-footer,
html.dark .site-footer {
background: var(--surface-1);
}
.theme-dark .footer-tabbar,
html.dark .footer-tabbar {
background: var(--blur-bg);
box-shadow: 0 -1px 3px rgba(0, 0, 0, 0.20);
}
/* ============================================================
* 旧版 back-to-top 按钮兼容(隐藏,用浮动按钮代替)
* ============================================================ */
.back-to-top {
display: none !important;
}
/* ============================================================
* 页脚布局模板变体
* ============================================================ */
/* 紧凑模板:单行版权 + 链接 */
.site-footer--compact .site-footer__grid {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 16px;
}
.site-footer--compact .site-footer__brand {
flex: 1 1 100%;
}
/* Full-viewport search panel open state (desktop + mobile) */
.tabbar-search-overlay[hidden] {
display: none !important;
}
.tabbar-search-overlay.is-open,
.tabbar-search-overlay.show:not([hidden]) {
display: flex;
}
.tabbar-search-overlay__dialog {
max-width: 720px;
margin: 0 auto;
}
@media (min-width: 768px) {
.tabbar-search-overlay {
align-items: flex-start;
padding-top: 8vh;
background: rgba(15, 23, 42, 0.45);
}
.tabbar-search-overlay__dialog {
min-height: auto;
max-height: min(84vh, 860px);
overflow: auto;
border-radius: 20px;
box-shadow: var(--shadow-lg, 0 20px 50px rgba(15, 23, 42, 0.22));
}
.nav-searchbox--desktop {
display: none;
}
.main-search-btn.nav-search-toggle {
display: inline-flex;
align-items: center;
justify-content: center;
}
}
@media (max-width: 767.98px) {
.main-search-btn.nav-search-toggle {
display: none;
}
}
.site-footer--compact .site-footer__brand .site-footer__desc,
.site-footer--compact .site-footer__brand .social-row,
.site-footer--compact .site-footer__brand .site-footer__friends {
display: none;
}
.site-footer--compact .site-footer__col {
flex: 0 0 auto;
}
.site-footer--compact .site-footer__col ul {
display: flex;
flex-wrap: wrap;
gap: 12px;
list-style: none;
padding: 0;
margin: 0;
}
.site-footer--compact .site-footer__bottom {
border-top: 1px solid var(--color-line);
padding-top: 12px;
margin-top: 12px;
}
/* 中央模板:居中品牌 + 链接 */
.site-footer--centered .site-footer__grid {
text-align: center;
}
.site-footer--centered .site-footer__brand {
flex: 1 1 100%;
display: flex;
flex-direction: column;
align-items: center;
}
.site-footer--centered .site-footer__col {
flex: 1 1 auto;
}
.site-footer--centered .site-footer__col ul {
list-style: none;
padding: 0;
margin: 0;
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 16px;
}
/**
* Footer — legacy template_1 shell
* Contract: legacy/css/main.css footer block + legacy markup
*/
.footer {
color: var(--footer-color, var(--color-ink-4));
background: var(--footer-bg, var(--surface-1));
padding: 30px;
font-size: 13px;
margin-top: auto;
}
.footer a:not(.but):not(.focus-color) {
color: var(--footer-color, var(--color-ink-4));
}
.footer a:hover {
color: var(--focus-color, var(--color-primary));
}
.footer .container-footer {
max-width: calc(var(--mian-max-width, var(--container, 1200px)) + 180px);
margin: 0 auto;
width: 100%;
}
.footer .list-inline {
display: flex;
align-items: center;
gap: 20px;
list-style: none;
margin: 0 0 12px;
padding: 0;
}
.footer .list-inline > li {
flex: 1;
margin: 5px 15px;
}
.footer .list-inline > li + li + li {
float: right;
display: flex;
align-items: flex-end;
flex-direction: column;
gap: 10px;
}
.footer a.footer-logo img,
.footer .footer-logo img {
height: 40px;
width: auto;
max-width: 180px;
vertical-align: middle;
display: inline-block;
}
/* title-h-left underline bar (legacy) */
.footer .title-h-left {
position: relative;
margin: 8px 0 10px;
padding-bottom: 8px;
font-size: 15px;
font-weight: 700;
color: var(--color-ink, #333);
}
.footer .title-h-left:before {
transition: 0.4s;
transform-origin: left;
position: absolute;
content: "";
width: 40px;
height: 3px;
background: var(--theme-color, var(--color-primary));
left: 0;
bottom: 3px;
border-radius: 5px;
box-shadow: 1px 1px 3px -1px var(--theme-color, var(--color-primary));
}
.footer .footer-muted,
.footer .em09 {
font-size: 0.92em;
color: var(--muted-2-color, var(--color-ink-4));
line-height: 1.7;
}
.footer .opacity8 {
opacity: 0.8;
}
.footer .fcode-links {
margin: 0 0 8px;
line-height: 1.9;
}
.footer .fcode-links > a + a:before {
content: "";
width: 4px;
height: 4px;
margin: 0 0.5em;
border-radius: 50%;
display: inline-block;
vertical-align: middle;
background: var(--main-color, var(--color-ink-2));
opacity: 0.3;
vertical-align: 0.2em;
}
/* Circular contact buttons — legacy .toggle-radius + .footer-contact > a */
.footer .toggle-radius {
background: var(--this-bg, var(--main-border-color, var(--surface-2, #f0f0f0)));
width: 29px;
height: 29px;
display: inline-block;
text-align: center;
border-radius: 100%;
position: relative;
vertical-align: text-top;
line-height: 29px;
color: var(--footer-color, var(--color-ink-3));
text-decoration: none;
}
.footer .footer-contact {
margin-top: 10px;
}
.footer .footer-contact > a {
font-size: 20px;
margin: 5px;
width: 35px;
height: 35px;
line-height: 35px;
display: inline-block;
text-align: center;
border-radius: 100%;
background: var(--this-bg, var(--main-border-color, var(--surface-2, #f0f0f0)));
color: var(--footer-color, var(--color-ink-3));
text-decoration: none;
vertical-align: text-top;
position: relative;
transition: color 0.15s ease, background 0.15s ease;
}
.footer .footer-contact > a:hover {
color: #fff;
background: var(--focus-color, var(--color-primary));
}
.footer .footer-contact > a i {
vertical-align: middle;
}
.footer .footer-wechat-img {
display: none;
position: absolute;
width: 140px;
bottom: 90%;
left: -55px;
padding-bottom: 20px;
z-index: 5;
}
.footer .hover-show {
position: relative;
}
.footer .hover-show:hover .footer-wechat-img,
.footer .hover-show:focus .footer-wechat-img {
display: block;
}
.footer .footer-wechat-img img {
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
border-radius: 4px;
width: 100%;
height: auto;
background: #fff;
}
.footer .footer-miniimg img {
width: 90px;
margin: 0 6px;
height: auto;
max-width: 100%;
display: block;
border-radius: 4px;
}
.footer .footer-miniimg-2 {
justify-content: flex-end;
}
.footer .footer-miniimg-2 img {
height: 36px;
border-radius: var(--main-radius);
}
.footer .footer-miniimg-2 .opacity8 {
display: none;
}
.footer .footer-conter {
margin: 8px 0 0;
line-height: 1.8;
color: var(--footer-color, var(--color-ink-4));
font-size: 13px;
}
.footer .mt10 {
margin-top: 10px;
}
/* Device visibility — legacy hidden-xs */
@media (max-width: 767px) {
.footer .hidden-xs,
.hidden-xs {
display: none !important;
}
.footer {
padding: 10px 0;
}
.footer .container-footer {
text-align: center;
padding: 0 16px;
}
.footer .list-inline {
gap: 10px;
flex-direction: column;
align-items: center;
justify-content: center;
}
.footer .list-inline > li + li + li {
float: none;
align-items: center;
}
.footer .list-inline > li {
margin: 12px 0;
max-width: none !important;
}
.footer .footer-miniimg-2 {
justify-content: center;
}
.footer .title-h-left:before {
left: 50%;
transform: translateX(-50%);
}
}
/* source: assets/css/frontend/floating-buttons.css */
/* ============================================================
* 右侧悬浮按钮(结构/样式对齐参考主题 .float-right)
* 依赖 main.css 基础规则:.hover-show / .dropdown-menu(::before) /
* .drop-newadd / .fa-toggle-theme / badge
* ============================================================ */
.float-right {
position: fixed;
bottom: 60px;
right: 20px;
z-index: 1030;
text-align: center;
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
transition: 0.3s;
}
/* 前台页面编辑齿轮的提示横条:参考主题共用 .abs-right(top:50% + right:.7em +
* translateY(-50%) 的垂直居中定位)。本站 legacy-utilities 的 .abs-right 是
* top:0/right:0,横条会贴到按钮顶角,故在此恢复参考几何。 */
.float-right .admin-set-page .admin-set-info {
position: absolute;
top: 50%;
right: 0.7em;
transform: translateY(-50%);
white-space: nowrap;
line-height: 1.5;
margin: 0;
box-shadow: none;
text-align: center;
z-index: 1;
}
body:has(.modal.in) .float-right,
.modal-open .float-right,
.imgbox-show .float-right,
.scroll-down .scroll-down-hide.float-right,
.scroll-ing .scrolling-hide.float-right {
transform: translateX(200%);
}
body:has(.modal.in) .float-right.position-center,
.modal-open .float-right.position-center,
.imgbox-show .float-right.position-center,
.scroll-down .scroll-down-hide.float-right.position-center,
.scroll-ing .scrolling-hide.float-right.position-center {
transform: translate(200%, -50%);
}
.float-right.position-center {
bottom: auto;
top: 50%;
transform: translateY(-50%);
}
.float-right .float-btn {
width: 40px;
min-height: 40px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
padding: 7px 0px;
font-size: 1.4em;
--this-color: var(--muted-2-color);
--this-bg: var(--float-btn-bg);
background: var(--this-bg);
position: relative;
color: var(--this-color) !important;
}
.float-right .float-btn text {
font-size: 12px;
line-height: 1;
margin-top: 5px;
}
.float-right badge {
transform: translate(-11px, -5px) scale(0.85);
margin-right: -50px;
right: auto;
left: 35px;
font-size: 12px;
position: absolute;
}
.filter .float-btn {
-webkit-backdrop-filter: saturate(2) blur(10px);
backdrop-filter: saturate(2) blur(10px);
}
.float-right.square .float-btn + .float-btn {
border-top: 1px solid var(--main-shadow);
}
.float-right.round .float-btn {
margin-top: 6px;
border-radius: 8px;
}
.float-btn.ontop {
opacity: 0;
transition: 0.5s;
transform: translateY(10px);
visibility: hidden;
}
.ontop.show {
opacity: 1;
transform: translateY(0);
visibility: unset;
display: flex !important;
}
.float-btn .hover-show-con {
right: 35px;
left: auto;
width: 200px;
margin-right: 15px;
top: 0;
font-size: 14px;
line-height: 1.4;
color: var(--main-color);
padding: 10px;
margin-top: 0;
border-radius: var(--main-radius);
cursor: auto;
}
.float-btn .dropdown-menu::before {
left: auto;
top: 15px;
right: -5px;
}
.float-btn.service-wechat .hover-show-con {
width: 120px;
top: -40px;
padding: 0;
}
.float-btn.service-wechat .dropdown-menu::before {
top: 53px;
}
.float-btn.qrcode-btn .hover-show-con {
width: 150px;
top: -60px;
padding: 16px 5px 12px;
text-align: center;
}
.float-btn.qrcode-btn .qrcode {
background: #fff;
display: inline-flex;
padding: 5px;
}
.float-btn.qrcode-btn .dropdown-menu::before {
top: 73px;
}
.float-btn.newadd-btns .drop-newadd {
width: 137px;
top: -74px;
}
.float-btn.newadd-btns .drop-newadd::before {
left: auto;
top: 88px;
right: -5px;
}
@media (max-width: 767px) {
.float-btn .hover-show-con {
max-width: 240px;
}
}
/* 待支付订单浮窗(对齐参考主题 .float-right-wait-pay) */
.float-right.position-top {
bottom: auto;
top: 80px;
}
.float-btn.wait-pay-btn .hover-show-con {
animation: float-wait-pay 2s;
animation-delay: 0.3s;
}
body.modal-open .float-btn.wait-pay-btn .hover-show-con {
opacity: 0 !important;
}
.float-btn .order-thumb {
width: 48px;
height: 48px;
}
.float-btn .order-item {
color: inherit;
}
@keyframes float-wait-pay {
0% {
opacity: 0;
visibility: unset;
box-shadow: 0 0 10px 0 rgba(255, 73, 121, 0.1);
}
10% {
opacity: 1;
box-shadow: 0 0 10px 0 rgba(255, 73, 121, 0.95);
}
30% {
box-shadow: 0 0 10px 0 rgba(255, 73, 121, 0.1);
}
50% {
box-shadow: 0 0 10px 0 rgba(255, 73, 121, 0.95);
}
70% {
box-shadow: 0 0 10px 0 rgba(255, 73, 121, 0.1);
}
80% {
visibility: unset;
opacity: 1;
}
}
@media (max-width: 640px) {
.float-right {
right: 10px;
}
.float-right.position-top {
top: 56px;
}
}
/* source: assets/css/frontend/enhancements.css */
/**
* Jio Enhancements — 全局 UI 增强
*
* 包含:悬停动效、暗色过渡、滚动感知
* 所有选择器使用 jio- 前缀避免冲突
*
* 骨架屏不在此文件:唯一契约是 .placeholder 块 + .post_ajax_loader 容器
* (inc/helpers/posts-renderer/markup.php 的 jio_render_placeholder)。
*/
@keyframes jio-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* ============================================================
* 1. 悬停交互动效
* ============================================================ */
/* 卡片放大 */
.jio-hover-zoom {
transition: transform 0.3s ease;
}
.jio-hover-zoom:hover {
transform: scale(1.02);
}
/* 卡片轻微放大 */
.jio-hover-zoom-sm {
transition: transform 0.3s ease;
}
.jio-hover-zoom-sm:hover {
transform: scale(1.02);
}
/* 悬停显示内容 */
.jio-hover-show {
position: relative;
}
.jio-hover-show__content {
position: absolute;
opacity: 0;
visibility: hidden;
transform: translateY(6px);
transition: opacity 0.3s, transform 0.3s, visibility 0.3s;
z-index: 10;
}
.jio-hover-show:hover .jio-hover-show__content {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
/* 关闭按钮旋转 */
.jio-ic-close {
transition: transform 0.3s;
cursor: pointer;
}
.jio-ic-close:hover {
transform: rotate(270deg);
}
/* 图片悬停缩放(缩略图容器) */
.jio-hover-zoom-img img {
transition: transform 0.3s ease;
}
.jio-hover-zoom-img:hover img {
transform: scale(1.02);
}
.jio-hover-zoom-img-sm img {
transition: transform 0.3s ease;
}
.jio-hover-zoom-img-sm:hover img {
transform: scale(1.02);
}
/* 按钮悬停上浮 */
.jio-hover-lift {
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.jio-hover-lift:hover {
transform: none;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
/* ============================================================
* 3. 暗色模式过渡 (View Transitions API)
* ============================================================ */
::view-transition-old(root),
::view-transition-new(root) {
animation: none;
mix-blend-mode: normal;
}
.dark::view-transition-old(root),
body.dark-theme::view-transition-old(root) {
z-index: 1;
}
.dark::view-transition-new(root),
body.dark-theme::view-transition-new(root) {
z-index: 2147483646;
}
::view-transition-old(root) {
z-index: 2147483646;
}
::view-transition-new(root) {
z-index: 1;
}
/* backdrop-filter 不支持时的降级 */
@supports not ((-webkit-backdrop-filter: blur(20px)) or (backdrop-filter: blur(20px))) {
:root {
--jio-blur-bg: #ffffff;
}
.dark {
--jio-blur-bg: var(--surface-1);
}
}
/* ============================================================
* 4. 滚动方向感知
* ============================================================ */
/* 向下滚动时隐藏导航栏 */
body.jio-scroll-down .site-nav.nav-scroll-hide {
transform: translateY(-100%);
transition: transform 0.3s ease;
}
body.jio-scroll-up .site-nav.nav-scroll-hide {
transform: translateY(0);
transition: transform 0.3s ease;
}
/* 滚动时隐藏浮动按钮 */
body.jio-scrolling .jio-floating-right.scrolling-hide {
opacity: 0;
pointer-events: none;
transition: opacity 0.2s;
}
/* body-scroll 状态类 */
body.jio-body-scroll .jio-show-on-scroll {
opacity: 1;
visibility: visible;
}
.jio-show-on-scroll {
opacity: 0;
visibility: hidden;
transition: opacity 0.3s, visibility 0.3s;
}
/* 可缩放图片的光标 */
.jio-cursor-zoom-in {
cursor: zoom-in;
}
/* ============================================================
* 9. 公告跑马灯 Widget
* ============================================================ */
.jio-announcement {
position: relative;
overflow: hidden;
padding: 10px 12px;
background: var(--surface-2, #F4F5F7);
border-radius: var(--radius, 10px);
}
.jio-announcement__icon {
position: absolute;
left: 12px;
top: 50%;
transform: translateY(-50%);
color: var(--color-primary, var(--color-primary));
font-size: 14px;
z-index: 1;
}
.jio-announcement__track {
margin-left: 24px;
overflow: hidden;
height: 20px;
}
.jio-announcement__list {
margin: 0;
padding: 0;
list-style: none;
animation: jio-marquee 10s linear infinite;
}
.jio-announcement__item {
height: 20px;
line-height: 20px;
font-size: 13px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.jio-announcement__item a {
color: var(--color-ink-2);
text-decoration: none;
}
.jio-announcement__item a:hover {
color: var(--color-primary, var(--color-primary));
}
@keyframes jio-marquee {
0% { transform: translateY(0); }
100% { transform: translateY(-100%); }
}
.jio-announcement:hover .jio-announcement__list {
animation-play-state: paused;
}
/* ============================================================
* 11. 滚动触发动画初始状态
* ============================================================ */
[data-jio-animate] {
will-change: opacity, transform;
}
/* ============================================================
* 12. 粘性侧栏
* ============================================================ */
[data-jio-sticky] {
will-change: transform;
}
/* ============================================================
* 13. 用户排行榜 Widget
* ============================================================ */
.jio-user-ranking {
margin: 0;
padding: 0;
list-style: none;
}
.jio-user-ranking__item {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 0;
border-bottom: 1px solid var(--color-line-soft, #F0F1F3);
}
.jio-user-ranking__item:last-child {
border-bottom: none;
}
.jio-user-ranking__rank {
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
border-radius: 6px;
background: var(--surface-2, #F4F5F7);
color: var(--color-ink-3);
font-size: 12px;
font-weight: 600;
flex-shrink: 0;
}
.jio-user-ranking__item--top:nth-child(1) .jio-user-ranking__rank {
background: #FFD700;
color: #fff;
}
.jio-user-ranking__item--top:nth-child(2) .jio-user-ranking__rank {
background: #C0C0C0;
color: #fff;
}
.jio-user-ranking__item--top:nth-child(3) .jio-user-ranking__rank {
background: #CD7F32;
color: #fff;
}
.jio-user-ranking__avatar {
flex-shrink: 0;
}
.jio-user-ranking__avatar img {
width: 36px;
height: 36px;
border-radius: 50%;
object-fit: cover;
}
.jio-user-ranking__name {
flex: 1;
min-width: 0;
font-size: 14px;
color: var(--color-ink);
text-decoration: none;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.jio-user-ranking__name:hover {
color: var(--color-primary, var(--color-primary));
}
.jio-user-ranking__value {
font-size: 12px;
color: var(--color-ink-4, #8A8F98);
white-space: nowrap;
}
/* ============================================================
* 14. 图文封面卡片 Widget
* ============================================================ */
.jio-cover-cards {
display: grid;
grid-template-columns: repeat(var(--cols, 2), 1fr);
gap: 12px;
}
.jio-cover-card {
position: relative;
border-radius: var(--radius-lg, 8px);
overflow: hidden;
min-height: 160px;
display: flex;
align-items: flex-end;
transition: transform 0.3s, box-shadow 0.3s;
}
.jio-cover-card:hover {
transform: translateY(-3px);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
}
.jio-cover-card__bg {
position: absolute;
inset: 0;
}
.jio-cover-card__bg img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.5s;
}
.jio-cover-card:hover .jio-cover-card__bg img {
transform: scale(1.02);
}
.jio-cover-card__overlay {
position: absolute;
inset: 0;
background: linear-gradient(180deg, rgba(0,0,0,0) 30%, rgba(0,0,0,0.6) 100%);
}
.jio-cover-card__content {
position: relative;
z-index: 1;
padding: 16px;
width: 100%;
}
.jio-cover-card__link {
text-decoration: none;
color: inherit;
display: block;
}
.jio-cover-card__title {
margin: 0 0 4px;
font-size: 16px;
font-weight: 600;
color: #fff;
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
}
.jio-cover-card__desc {
margin: 0;
font-size: 13px;
color: rgba(255, 255, 255, 0.85);
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
/* ============================================================
* 15. 视频播放器 Widget
* ============================================================ */
.jio-video-widget {
position: relative;
width: 100%;
overflow: hidden;
border-radius: var(--radius, 10px);
background: #000;
}
.jio-video-widget iframe,
.jio-video-widget video {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border: none;
}
/* ============================================================
* 16. 表单输入浮动标签
* ============================================================ */
.jio-float-label {
position: relative;
}
.jio-float-label__input {
width: 100%;
padding: 14px 12px 6px;
font-size: 14px;
border: 1px solid var(--color-line);
border-radius: var(--radius, 10px);
background: var(--surface-1, #fff);
color: var(--color-ink);
transition: border-color 0.2s;
}
.jio-float-label__input:focus {
outline: none;
border-color: var(--color-primary, var(--color-primary));
}
.jio-float-label__label {
position: absolute;
left: 12px;
top: 50%;
transform: translateY(-50%);
font-size: 14px;
color: var(--color-ink-4, #8A8F98);
pointer-events: none;
transition: all 0.2s ease;
}
.jio-float-label__input:focus + .jio-float-label__label,
.jio-float-label__input:not(:placeholder-shown) + .jio-float-label__label {
top: 8px;
transform: translateY(0);
font-size: 11px;
color: var(--color-primary, var(--color-primary));
}
/* ============================================================
* 17. 视差滚动层
* ============================================================ */
[data-jio-parallax] {
will-change: transform;
transition: transform 0.1s linear;
}
/* ============================================================
* 20. 用户等级进度条
* ============================================================ */
.jio-level-bar {
position: relative;
height: 8px;
background: var(--surface-2, #F4F5F7);
border-radius: 4px;
overflow: hidden;
}
.jio-level-bar__fill {
height: 100%;
background: linear-gradient(90deg, var(--color-primary, var(--color-primary)), var(--color-primary-active, #5A85BD));
border-radius: 4px;
transition: width 0.5s ease;
}
.jio-level-bar__label {
position: absolute;
right: 0;
top: -18px;
font-size: 11px;
color: var(--color-ink-4, #8A8F98);
}
/* source: assets/css/frontend/empty-state.css */
/* ========== 空状态 — 对齐 legacy empty state ========== */
/* The media reset makes images block-level; text-align cannot center them. */
.jio-null > .jio-null__img {
display: block;
margin-right: auto;
margin-left: auto;
}
.empty-state {
text-align: center;
padding: 60px 20px;
color: var(--color-ink-3, #777);
}
.empty-state__icon {
font-size: 56px;
color: var(--surface-3, #e8e8e8);
margin-bottom: 16px;
line-height: 1;
}
.empty-state__icon i {
display: inline-block;
}
.empty-state__title {
font-size: 16px;
font-weight: 500;
color: var(--color-ink-2, #4e5358);
margin-bottom: 8px;
}
.empty-state__desc {
font-size: 13px;
color: var(--color-ink-4, #999);
margin-bottom: 20px;
max-width: 320px;
margin-left: auto;
margin-right: auto;
line-height: 1.6;
}
.empty-state__action {
display: inline-flex;
align-items: center;
gap: 6px;
}
/* 空状态变体 */
.empty-state--sm {
padding: 30px 16px;
}
.empty-state--sm .empty-state__icon {
font-size: 40px;
}
.empty-state--sm .empty-state__title {
font-size: 14px;
}
.empty-state--sm .empty-state__desc {
font-size: 12px;
}
/* 搜索空状态 */
.search-empty {
text-align: center;
padding: 80px 20px;
}
.search-empty__icon {
font-size: 64px;
color: var(--surface-3, #e8e8e8);
margin-bottom: 16px;
}
.search-empty__title {
font-size: 18px;
font-weight: 500;
color: var(--color-ink-2, #4e5358);
margin-bottom: 8px;
}
.search-empty__suggestions {
font-size: 13px;
color: var(--color-ink-4, #999);
}
.search-empty__suggestions a {
color: var(--color-primary, #f04494);
text-decoration: none;
}
.search-empty__suggestions a:hover {
text-decoration: underline;
}
/* 移动端 */
@media (max-width: 767px) {
.empty-state {
padding: 40px 16px;
}
.empty-state__icon {
font-size: 44px;
}
}
/* source: assets/css/frontend/pagination.css */
/* ========== 分页 — 对齐 legacy pagination ========== */
.pagination,
.jio-pagination,
.navigation.pagination .nav-links,
.pagenav.ajax-pag {
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
padding: 24px 0;
flex-wrap: wrap;
}
.pagination a,
.pagination span,
.jio-pagination a,
.jio-pagination span,
.navigation.pagination a,
.navigation.pagination span,
.pagenav.ajax-pag a,
.pagenav.ajax-pag span {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 34px;
min-height: 34px;
padding: 6px 10px;
font-size: 13px;
line-height: 1.4;
color: var(--muted-color, var(--color-ink-3));
background: var(--surface-4, var(--main-border-color, rgba(50, 50, 50, 0.06)));
border: 1px solid transparent;
border-radius: var(--radius-xs, 3px);
text-decoration: none;
transition: all 0.2s;
user-select: none;
}
.pagination a:hover,
.jio-pagination a:hover,
.navigation.pagination a:hover,
.pagenav.ajax-pag a:hover {
opacity: 1;
color: var(--color-primary);
background: var(--color-primary-soft);
}
.pagination .current,
.jio-pagination .current,
.navigation.pagination .current,
.pagenav.ajax-pag .current {
color: var(--color-on-primary, #fff);
background: var(--color-primary, #f04494);
border-color: var(--color-primary, #f04494);
font-weight: 500;
}
.pagination .dots,
.jio-pagination .dots,
.navigation.pagination .dots,
.pagenav.ajax-pag .dots {
border: none;
background: none;
color: var(--color-ink-4, #999);
cursor: default;
min-width: auto;
padding-left: 4px;
padding-right: 4px;
}
.pagination .prev,
.pagination .next,
.jio-pagination .prev,
.jio-pagination .next,
.navigation.pagination .prev,
.navigation.pagination .next,
.pagenav.ajax-pag .prev,
.pagenav.ajax-pag .next {
font-size: 12px;
}
.pagination .prev i,
.pagination .next i,
.jio-pagination .prev i,
.jio-pagination .next i,
.navigation.pagination .prev i,
.navigation.pagination .next i,
.pagenav.ajax-pag .prev i,
.pagenav.ajax-pag .next i {
font-size: 11px;
}
.pagenav.ajax-pag .pag-jump,
.jio-pagination .pag-jump,
.navigation.pagination .pag-jump {
display: inline-flex;
align-items: center;
gap: 6px;
margin-left: 6px;
}
.pagenav.ajax-pag .jump-input,
.jio-pagination .jump-input,
.navigation.pagination .jump-input {
width: 64px;
min-width: 64px;
padding: 6px 8px 5px;
font-size: 13px;
line-height: 1.4;
color: var(--muted-color, var(--color-ink-3));
background: var(--main-bg-color, #fff);
border: 1px solid var(--main-border-color, rgba(50, 50, 50, 0.06));
border-radius: 3px;
box-shadow: none;
}
.pagenav.ajax-pag .jump-input:focus,
.jio-pagination .jump-input:focus,
.navigation.pagination .jump-input:focus {
outline: none;
border-color: var(--focus-color, var(--color-primary, #f04494));
}
.pagenav.ajax-pag .pag-jump .ajax-next,
.jio-pagination .pag-jump .ajax-next,
.navigation.pagination .pag-jump .ajax-next {
min-width: auto;
cursor: pointer;
}
/* 上一页/下一页 */
.pagination__nav {
display: flex;
gap: 8px;
justify-content: center;
margin-top: 8px;
}
.pagination__nav a {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 6px 14px;
font-size: 13px;
color: var(--color-ink-2, #4e5358);
background: var(--surface-1, #fff);
border: 1px solid var(--color-line, rgba(50, 50, 50, 0.06));
border-radius: 6px;
text-decoration: none;
transition: all 0.2s;
}
.pagination__nav a:hover {
color: var(--color-primary, #f04494);
border-color: var(--color-primary, #f04494);
}
/* 移动端 */
@media (max-width: 767px) {
.pagination a,
.pagination span,
.jio-pagination a,
.jio-pagination span,
.navigation.pagination a,
.navigation.pagination span,
.pagenav.ajax-pag a,
.pagenav.ajax-pag span {
min-width: 28px;
font-size: 12px;
margin: 2px;
}
.pagenav.ajax-pag .pag-jump,
.jio-pagination .pag-jump,
.navigation.pagination .pag-jump {
width: 100%;
justify-content: center;
margin-left: 0;
margin-top: 6px;
}
.pagenav.ajax-pag .jump-input,
.jio-pagination .jump-input,
.navigation.pagination .jump-input {
width: 58px;
min-width: 58px;
font-size: 12px;
}
}
/* source: assets/css/frontend/modal-runtime.css */
/**
* 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);
}
}
/* source: assets/css/frontend/notyf.css */
/**
* legacy-compatible frontend notifications.
*
* @package Jio
*/
.notyn {
position: fixed;
bottom: 6em;
right: 0;
max-width: 320px;
z-index: 10000000;
}
.notyf {
position: relative;
margin-bottom: 0.6em;
color: #fff;
font-size: 14px;
line-height: 1.42857143;
float: right;
min-width: 200px;
padding: 1em 3em 1em 3.4em;
box-shadow: -3px 3px 6px rgba(0, 0, 0, 0.1);
transform: translateX(1.5em);
transition: 0.3s;
-webkit-backdrop-filter: saturate(5) blur(20px);
backdrop-filter: saturate(5) blur(20px);
-webkit-animation: notyf 0.4s cubic-bezier(0.35, 0.71, 0.46, 1.08);
animation: notyf 0.4s cubic-bezier(0.35, 0.71, 0.46, 1.08);
}
.notyn-out .notyf {
transform: translateX(110%);
opacity: 0.5;
transition: 0.5s;
}
@-webkit-keyframes notyf {
0% {
transform: translateX(110%);
opacity: 0;
}
100% {
transform: translateX(1.5em);
opacity: 1;
}
}
@keyframes notyf {
0% {
transform: translateX(110%);
opacity: 0;
}
100% {
transform: translateX(1.5em);
opacity: 1;
}
}
.notyf::before {
font-family:"Font Awesome 5 Free";font-weight:900;
font-style: normal;
font-weight: 900;
line-height: 1;
left: 0.8em;
font-size: 1.5em;
position: absolute;
top: 0;
bottom: 0;
margin: auto;
height: 20px;
}
.notyf.success {
background: linear-gradient(90deg, rgba(15, 147, 249, 0.7), rgba(61, 189, 249, 0.8));
}
.notyf.success::before {
content: '\f058';
}
.notyf.info {
background: linear-gradient(90deg, rgba(58, 162, 54, 0.8), rgba(89, 247, 131, 0.8));
}
.notyf.info::before {
content: '\f0a1';
}
.notyf.warning,
.notyf.load {
background: linear-gradient(90deg, rgba(253, 170, 71, 0.7), rgba(247, 154, 13, 0.8));
}
.notyf.warning::before {
content: '\f05a';
}
.notyf.danger {
background: linear-gradient(90deg, rgba(253, 69, 28, 0.7), rgba(251, 110, 75, 0.8));
}
.notyf.danger::before {
content: '\f057';
}
.notyf .fa-close {
float: right;
padding: 0.6em;
margin: -0.4em;
}
.notyf.load::before {
content: '';
width: 0.7em;
height: 0.7em;
display: inline-block;
border: 0.08em solid transparent;
border-width: calc(1px + 0.03em);
border-radius: 50%;
border-top-color: var(--this-color);
border-bottom-color: var(--this-color);
-webkit-animation: huan-rotate 1s cubic-bezier(0.7, 0.1, 0.31, 0.9) infinite;
animation: huan-rotate 1s cubic-bezier(0.7, 0.1, 0.31, 0.9) infinite;
}
@-webkit-keyframes huan-rotate {
0% {
transform: rotate(0);
}
100% {
transform: rotate(360deg);
}
}
@keyframes huan-rotate {
0% {
transform: rotate(0);
}
100% {
transform: rotate(360deg);
}
}
/* source: assets/css/shared/captcha.css */
/**
* Jio Captcha Styles
* 人机验证组件样式(从 functions.php 内联 CSS 抽取)
*
* @package Jio
*/
.jio-captcha-box{display:none}.jio-captcha-wrap{text-align:center}
/* Cloudflare Turnstile Modal */
.jio-captcha-modal-overlay{position:fixed;inset:0;z-index:99999;display:flex;align-items:center;justify-content:center}
.jio-captcha-modal-backdrop{position:absolute;inset:0;background:rgba(0,0,0,.55);animation:jioFadeIn .2s ease}
.jio-captcha-modal-box{position:relative;background:var(--surface-page,#fff);border-radius:12px;box-shadow:0 20px 60px rgba(0,0,0,.3);width:90%;max-width:380px;animation:jioSlideUp .25s ease;overflow:hidden}
.jio-captcha-modal-header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--color-line,#e5e7eb)}
.jio-captcha-modal-title{font-size:15px;font-weight:600;color:var(--color-ink,#1f2937)}
.jio-captcha-modal-close{background:none;border:none;font-size:22px;color:var(--color-ink-4,#9ca3af);cursor:pointer;padding:0;line-height:1;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:6px}.jio-captcha-modal-close:hover{background:var(--color-bg-hover,#f3f4f6);color:var(--color-ink,#1f2937)}
.jio-captcha-modal-body{padding:20px}
.jio-captcha-modal-hint{font-size:13px;color:var(--color-ink-4,#9ca3af);margin:0 0 16px;text-align:center}
.jio-captcha-modal-widget{display:flex;justify-content:center}
@keyframes jioFadeIn{from{opacity:0}to{opacity:1}}
@keyframes jioSlideUp{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}
/* source: assets/css/frontend/single-post/rewards.css */
/* ---- 文章打赏:内容使用 JioModalRuntime,几何对齐参考主题 modal-mini ---- */
.jio-modal-runtime.jio-reward-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-reward-modal .jio-modal-runtime__content {
padding: 0;
}
.jio-reward-modal .modal-colorful-header + .jio-reward__body {
margin-top: 0;
padding: 135px 15px 15px;
color: var(--main-color, var(--color-ink, #333));
}
.jio-reward__desc {
margin: 0 0 16px;
text-align: center;
}
.jio-modal-runtime.jio-reward-modal .jio-reward__amounts {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 8px;
margin: 16px 0;
}
.jio-modal-runtime.jio-reward-modal .jio-reward__amount {
display: inline-flex;
width: 100%;
min-width: 0;
min-height: 46px;
align-items: center;
justify-content: center;
gap: 4px;
margin: 0;
padding: 8px 6px;
border: 1px solid var(--color-line-stronger, rgba(50, 50, 50, 0.12));
border-radius: var(--radius, 8px);
background: var(--surface-2, #f5f6f7);
color: var(--color-ink-2, #4e5358);
cursor: pointer;
font-size: 16px;
font-weight: 700;
line-height: 1.2;
box-shadow: none;
transition: border-color 0.2s ease, background-color 0.2s ease, color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease;
}
.jio-modal-runtime.jio-reward-modal .jio-reward__amount:hover {
border-color: var(--focus-color, var(--color-primary, #f04494));
background: var(--color-primary-soft, rgba(240, 68, 148, 0.1));
color: var(--focus-color, var(--color-primary, #f04494));
opacity: 1;
transform: translateY(-1px);
}
.jio-modal-runtime.jio-reward-modal .jio-reward__amount:focus-visible {
outline: 0;
box-shadow: 0 0 0 3px var(--color-primary-soft, rgba(240, 68, 148, 0.2));
}
.jio-modal-runtime.jio-reward-modal .jio-reward__amount.is-active,
.jio-modal-runtime.jio-reward-modal .jio-reward__amount.is-active:hover {
border-color: var(--focus-color, var(--color-primary, #f04494));
background: var(--focus-color, var(--color-primary, #f04494));
color: #fff;
box-shadow: 0 3px 10px var(--color-primary-soft, rgba(240, 68, 148, 0.2));
opacity: 1;
transform: none;
}
.jio-reward__currency {
font-size: 13px;
font-weight: 400;
}
.jio-reward__value {
font-size: 15px;
}
.jio-modal-runtime.jio-reward-modal .jio-reward__custom {
display: flex;
width: 100%;
align-items: center;
justify-content: space-between;
gap: 12px;
margin: 0 0 16px;
color: var(--color-ink-2, #4e5358);
font-size: 14px;
font-weight: 600;
}
.jio-reward__custom-label {
flex: 0 0 auto;
}
.jio-modal-runtime.jio-reward-modal .jio-reward__input-wrap {
display: flex;
width: min(190px, 62%);
min-height: 44px;
align-items: center;
padding: 0 10px 0 12px;
border: 1px solid var(--color-line-stronger, rgba(50, 50, 50, 0.12));
border-radius: var(--radius, 8px);
background: var(--surface-1, #fff);
transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
.jio-modal-runtime.jio-reward-modal .jio-reward__input-wrap:focus-within {
border-color: var(--focus-color, var(--color-primary, #f04494));
box-shadow: 0 0 0 3px var(--color-primary-soft, rgba(240, 68, 148, 0.1));
}
.jio-reward__input-currency {
flex: 0 0 auto;
margin-right: 6px;
color: var(--muted-color, var(--color-ink-3, #777));
font-size: 14px;
font-weight: 600;
}
.jio-modal-runtime.jio-reward-modal .jio-reward__input {
width: 100%;
min-width: 0;
min-height: 42px;
padding: 0;
border: 0;
outline: 0;
background: transparent;
color: var(--color-ink, #333);
font-size: 15px;
font-weight: 600;
text-align: right;
-moz-appearance: textfield;
box-shadow: none;
}
.jio-reward__input::-webkit-inner-spin-button,
.jio-reward__input::-webkit-outer-spin-button {
margin: 0;
-webkit-appearance: none;
}
.jio-reward__input::placeholder {
color: var(--muted-color, var(--color-ink-4, #999));
opacity: 1;
}
.jio-reward__input:disabled,
.jio-reward__amount:disabled {
cursor: wait;
opacity: 0.6;
}
.jio-reward__submit {
min-height: 42px;
}
.jio-reward__submit:disabled {
cursor: wait;
opacity: 0.7;
}
.jio-reward__message {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
.jio-reward__captcha {
margin: 0 0 14px;
}
.jio-modal-runtime--bottom.jio-reward-modal .jio-modal-runtime__dialog {
border-radius: 16px 16px 0 0;
}
.jio-modal-runtime--bottom.jio-reward-modal .modal-colorful-header {
border-radius: 16px 16px 0 0;
}