Files
kate522 ee39024549 fix(header): put the top-nav clusters on one horizontal line
The top-nav account row carried min-height: 50px on top of the 8px
margin-top that Bootstrap base .navbar-form rule keeps at >=768px (the
override only zeroes the horizontal margins). The 8px was counted twice,
so the row ran from 8px to 58px: its icon tiles landed 8px below the 25px
midline that the 50px menu row and the logo define, and the navbar grew
from 50px to 58px, which also broke the body.nav-fixed offset.

Drop the min-height so the row takes its natural 34px height from the
icon tiles, and give the theme/language group the same 34px cross-size so
its 29px toggle shares that midline instead of sitting 2.5px above it.
Measured against the reference theme, the navbar goes from 66px to
50.05px (reference 50.28px) and the logo, menu, publish chip, VIP chip,
theme toggle and account icons all centre on 25px.

The desktop navbar stays visible below 991px (only the menu folds into a
dropdown there), so the same fix applies at the mobile and tablet
breakpoints: the top bar drops from 68px to 52.05px.

Verified: node --test across tests/ (603 passing), and a stubbed navbar
render measured in a headless browser against the reference theme
stylesheet.
2026-10-15 21:03:27 +08:00

6908 lines
183 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: AKSRT
Theme URI: https://github.com/Lexo0522/aksrt
Author: Kate
Author URI: https://github.com/Lexo0522
Description: AKSRT 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: aksrt
Tags: blog, two-columns, right-sidebar, custom-menu, featured-images, translation-ready, dark-mode
============================================================
AKSRT 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 */
/**
* AKSRT 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);
/* ===== AKSRT-to-AKSRT 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 等价 ===== */
--aksrt-avatar-size-xs: 24px;
--aksrt-avatar-size-sm: 32px;
--aksrt-avatar-size: 40px;
--aksrt-avatar-size-lg: 56px;
--aksrt-avatar-size-xl: 80px;
/* ===== Post card thumbnail scale ===== */
--aksrt-card-thumb-scale: 56.25%; /* 16:9 */
/* ===== Multi-color palette (for buttons / badges / gradients) ===== */
--aksrt-rose: #f43f5e;
--aksrt-rose-soft: rgba(244, 63, 94, 0.12);
--aksrt-blue: #3b82f6;
--aksrt-blue-soft: rgba(59, 130, 246, 0.12);
--aksrt-green: #10b981;
--aksrt-green-soft: rgba(16, 185, 129, 0.12);
--aksrt-orange: #f97316;
--aksrt-orange-soft:rgba(249, 115, 22, 0.12);
--aksrt-purple: #8b5cf6;
--aksrt-purple-soft:rgba(139, 92, 246, 0.12);
--aksrt-cyan: #06b6d4;
--aksrt-cyan-soft: rgba(6, 182, 212, 0.12);
--aksrt-yellow: #eab308;
--aksrt-yellow-soft:rgba(234, 179, 8, 0.12);
--aksrt-red: #ef4444;
--aksrt-red-soft: rgba(239, 68, 68, 0.12);
--aksrt-teal: #14b8a6;
--aksrt-teal-soft: rgba(20, 184, 166, 0.12);
--aksrt-indigo: #6366f1;
--aksrt-indigo-soft:rgba(99, 102, 241, 0.12);
--aksrt-pink: #ec4899;
--aksrt-pink-soft: rgba(236, 72, 153, 0.12);
/* ===== VIP / special gradients ===== */
--aksrt-vip-gold-1: #f6d365;
--aksrt-vip-gold-2: #fda085;
--aksrt-grad-sunset-1: #f093fb;
--aksrt-grad-sunset-2: #f5576c;
--aksrt-grad-ocean-1: #4facfe;
--aksrt-grad-ocean-2: #00f2fe;
--aksrt-grad-forest-1: #43e97b;
--aksrt-grad-forest-2: #38f9d7;
--aksrt-grad-night-1: #a18cd1;
--aksrt-grad-night-2: #fbc2eb;
--aksrt-grad-fire-1: #f83600;
--aksrt-grad-fire-2: #f9d423;
/* ===== Component sizing ===== */
--aksrt-toggle-w: 44px;
--aksrt-toggle-h: 24px;
--aksrt-stepper-h: 36px;
--aksrt-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 */
--aksrt-rose-soft: rgba(244, 63, 94, 0.18);
--aksrt-blue-soft: rgba(59, 130, 246, 0.18);
--aksrt-green-soft: rgba(16, 185, 129, 0.18);
--aksrt-orange-soft:rgba(249, 115, 22, 0.18);
--aksrt-purple-soft:rgba(139, 92, 246, 0.18);
--aksrt-cyan-soft: rgba(6, 182, 212, 0.18);
--aksrt-yellow-soft:rgba(234, 179, 8, 0.18);
--aksrt-red-soft: rgba(239, 68, 68, 0.18);
--aksrt-teal-soft: rgba(20, 184, 166, 0.18);
--aksrt-indigo-soft:rgba(99, 102, 241, 0.18);
--aksrt-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 .aksrt-theme-box,
html.dark .theme-box,
body.dark-theme .post-card,
body.dark-theme .widget,
body.dark-theme .aksrt-theme-box,
body.dark-theme .theme-box {
border-color: transparent;
}
/* source: assets/css/core/reset.css */
/**
* AKSRT 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 */
/**
* AKSRT 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 */
/**
* AKSRT 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 AKSRT .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,
.toggle-radius > i {
position: absolute;
top: 50%;
right: 0 !important;
left: 0 !important;
margin: auto;
transform: translateY(-50%);
line-height: 1;
width: 1em;
height: 1em;
display: inline-flex;
align-items: center;
justify-content: center;
text-align: center;
}
/* 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, #f99d4d 10%, #f7631d 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 */
/**
* AKSRT 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 */
/**
* AKSRT 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 */
/**
* AKSRT Animations — animate.css 等价(独立重写)
* ------------------------------------------------------------
* 关键帧 + 工具类 + IntersectionObserver 触发配合
* 触发 JS 已在 enhancements2.js([data-aksrt-animate] 属性)
* 本文件仅定义 @keyframes 和 .aksrt-anim-* 工具类
*/
/* ============================================================
* Keyframes
* ============================================================ */
/* Fade 系列 */
@keyframes aksrtFadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes aksrtFadeInUp {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: none; }
}
@keyframes aksrtFadeInDown {
from { opacity: 0; transform: translateY(-20px); }
to { opacity: 1; transform: none; }
}
@keyframes aksrtFadeInLeft {
from { opacity: 0; transform: translateX(-20px); }
to { opacity: 1; transform: none; }
}
@keyframes aksrtFadeInRight {
from { opacity: 0; transform: translateX(20px); }
to { opacity: 1; transform: none; }
}
/* Zoom 系列 */
@keyframes aksrtZoomIn {
from { opacity: 0; transform: scale(.85); }
to { opacity: 1; transform: none; }
}
@keyframes aksrtZoomInUp {
from { opacity: 0; transform: scale(.85) translateY(20px); }
to { opacity: 1; transform: none; }
}
/* Bounce 系列 */
@keyframes aksrtBounceIn {
0% { opacity: 0; transform: scale(.3); }
50% { opacity: 1; transform: scale(1.08); }
70% { transform: scale(.95); }
100% { opacity: 1; transform: none; }
}
@keyframes aksrtBounce {
0%, 20%, 50%, 80%, 100% { transform: translateY(0); }
40% { transform: translateY(-12px); }
60% { transform: translateY(-6px); }
}
/* Pulse */
@keyframes aksrtPulse {
0% { transform: scale(1); }
50% { transform: scale(1.06); }
100% { transform: scale(1); }
}
/* Flash */
@keyframes aksrtFlash {
0%, 50%, 100% { opacity: 1; }
25%, 75% { opacity: 0; }
}
/* RubberBand */
@keyframes aksrtRubberBand {
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 aksrtShake {
0%, 100% { transform: translateX(0); }
10%, 30%, 50%, 70%, 90% { transform: translateX(-4px); }
20%, 40%, 60%, 80% { transform: translateX(4px); }
}
/* Swing */
@keyframes aksrtSwing {
20% { transform: rotate(15deg); }
40% { transform: rotate(-10deg); }
60% { transform: rotate(5deg); }
80% { transform: rotate(-5deg); }
100% { transform: none; }
}
/* Tada */
@keyframes aksrtTada {
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 aksrtWobble {
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 aksrtSlideInUp {
from { opacity: 0; transform: translateY(100%); }
to { opacity: 1; transform: none; }
}
@keyframes aksrtSlideInDown {
from { opacity: 0; transform: translateY(-100%); }
to { opacity: 1; transform: none; }
}
@keyframes aksrtSlideInLeft {
from { opacity: 0; transform: translateX(-100%); }
to { opacity: 1; transform: none; }
}
@keyframes aksrtSlideInRight {
from { opacity: 0; transform: translateX(100%); }
to { opacity: 1; transform: none; }
}
/* HeartBeat */
@keyframes aksrtHeartBeat {
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 aksrtJello {
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 aksrtHeadShake {
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 aksrtBounceOut {
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 aksrtZoomOut {
0% { opacity: 1; transform: none; }
100% { opacity: 0; transform: scale(0.85); }
}
/* BackIn/BackOut */
@keyframes aksrtBackInUp {
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 aksrtBackInDown {
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 aksrtFlip {
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 aksrtFlipInX {
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
* ============================================================ */
.aksrt-anim-fade-in { animation: aksrtFadeIn var(--dur-base, .4s) var(--ease-out, ease) both; }
.aksrt-anim-fade-up { animation: aksrtFadeInUp var(--dur-base, .4s) var(--ease-out, ease) both; }
.aksrt-anim-fade-down { animation: aksrtFadeInDown var(--dur-base, .4s) var(--ease-out, ease) both; }
.aksrt-anim-fade-left { animation: aksrtFadeInLeft var(--dur-base, .4s) var(--ease-out, ease) both; }
.aksrt-anim-fade-right { animation: aksrtFadeInRight var(--dur-base, .4s) var(--ease-out, ease) both; }
.aksrt-anim-zoom-in { animation: aksrtZoomIn var(--dur-base, .4s) var(--ease-out, ease) both; }
.aksrt-anim-zoom-in-up { animation: aksrtZoomInUp var(--dur-base, .4s) var(--ease-out, ease) both; }
.aksrt-anim-bounce-in { animation: aksrtBounceIn .6s var(--ease-out, ease) both; }
.aksrt-anim-bounce { animation: aksrtBounce 1s ease both; }
.aksrt-anim-pulse { animation: aksrtPulse 1s ease infinite; }
.aksrt-anim-flash { animation: aksrtFlash 1s ease both; }
.aksrt-anim-rubber-band { animation: aksrtRubberBand .8s ease both; }
.aksrt-anim-shake { animation: aksrtShake .5s ease both; }
.aksrt-anim-swing { animation: aksrtSwing .6s var(--ease-out, ease) both; }
.aksrt-anim-tada { animation: aksrtTada 1s ease both; }
.aksrt-anim-wobble { animation: aksrtWobble .8s ease both; }
.aksrt-anim-heart-beat { animation: aksrtHeartBeat 1.3s ease both; }
.aksrt-anim-jello { animation: aksrtJello .8s ease both; }
.aksrt-anim-head-shake { animation: aksrtHeadShake .8s ease both; }
/* 退出动画 */
.aksrt-anim-bounce-out { animation: aksrtBounceOut .5s ease both; }
.aksrt-anim-zoom-out { animation: aksrtZoomOut .3s ease both; }
/* BackIn 动画 */
.aksrt-anim-back-in-up { animation: aksrtBackInUp .5s var(--ease-out, ease) both; }
.aksrt-anim-back-in-down { animation: aksrtBackInDown .5s var(--ease-out, ease) both; }
.aksrt-anim-slide-up { animation: aksrtSlideInUp .5s var(--ease-out, ease) both; }
.aksrt-anim-slide-down { animation: aksrtSlideInDown .5s var(--ease-out, ease) both; }
.aksrt-anim-slide-left { animation: aksrtSlideInLeft .5s var(--ease-out, ease) both; }
.aksrt-anim-slide-right { animation: aksrtSlideInRight .5s var(--ease-out, ease) both; }
.aksrt-anim-flip { animation: aksrtFlip .6s var(--ease-out, ease) both; }
.aksrt-anim-flip-x { animation: aksrtFlipInX .6s var(--ease-out, ease) both; }
/* ============================================================
* Duration modifiers
* ============================================================ */
.aksrt-anim-fast { --dur-base: .2s; }
.aksrt-anim-slow { --dur-base: .6s; }
/* ============================================================
* Delay modifiers (配合 data-aksrt-delay 使用时为 inline,
* 也可用 class 方式独立设置)
* ============================================================ */
.aksrt-anim-delay-1 { animation-delay: .1s; }
.aksrt-anim-delay-2 { animation-delay: .2s; }
.aksrt-anim-delay-3 { animation-delay: .3s; }
.aksrt-anim-delay-4 { animation-delay: .4s; }
.aksrt-anim-delay-5 { animation-delay: .5s; }
.aksrt-anim-delay-6 { animation-delay: .6s; }
.aksrt-anim-delay-7 { animation-delay: .7s; }
.aksrt-anim-delay-8 { animation-delay: .8s; }
/* ============================================================
* Infinite modifier
* ============================================================ */
.aksrt-anim-infinite { animation-iteration-count: infinite; }
/* ============================================================
* Reduced-motion — 尊重用户偏好
* ============================================================ */
@media (prefers-reduced-motion: reduce) {
.aksrt-anim-fade-in,
.aksrt-anim-fade-up,
.aksrt-anim-fade-down,
.aksrt-anim-fade-left,
.aksrt-anim-fade-right,
.aksrt-anim-zoom-in,
.aksrt-anim-zoom-in-up,
.aksrt-anim-bounce-in,
.aksrt-anim-bounce,
.aksrt-anim-pulse,
.aksrt-anim-flash,
.aksrt-anim-rubber-band,
.aksrt-anim-shake,
.aksrt-anim-swing,
.aksrt-anim-tada,
.aksrt-anim-wobble,
.aksrt-anim-heart-beat,
.aksrt-anim-jello,
.aksrt-anim-head-shake,
.aksrt-anim-bounce-out,
.aksrt-anim-zoom-out,
.aksrt-anim-back-in-up,
.aksrt-anim-back-in-down,
.aksrt-anim-slide-up,
.aksrt-anim-slide-down,
.aksrt-anim-slide-left,
.aksrt-anim-slide-right,
.aksrt-anim-flip,
.aksrt-anim-flip-x {
animation: none !important;
}
}
/* source: assets/css/core/components-ext.css */
/**
* AKSRT Extended Components — 时间轴 / 步骤向导 / 九宫格 / 定价卡片 /
* Toggle 开关 / 自定义复选框 / 数字步进器
* ------------------------------------------------------------
* 全部使用 aksrt- 前缀,保持原生语义可访问性。
*/
/* ============================================================
* 1. 时间轴 — .aksrt-timeline
* ============================================================ */
.aksrt-timeline {
position: relative;
padding-left: 28px;
margin: 0;
list-style: none;
}
/* 竖线 */
.aksrt-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;
}
.aksrt-timeline__item {
position: relative;
padding-bottom: 24px;
}
.aksrt-timeline__item:last-child {
padding-bottom: 0;
}
/* 圆点 */
.aksrt-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;
}
/* 空心圆点变体 */
.aksrt-timeline__dot--outline {
background: var(--surface-1, #fff);
border: 2px solid var(--color-primary);
box-shadow: none;
}
/* 灰色圆点 — 已完成/已过去 */
.aksrt-timeline__dot--muted {
background: var(--color-ink-4, #999);
box-shadow: 0 0 0 2px var(--surface-2, #eee);
}
.aksrt-timeline__time {
display: block;
font-size: 12px;
color: var(--color-ink-4, #999);
margin-bottom: 4px;
}
.aksrt-timeline__title {
font-weight: 600;
color: var(--color-ink, #333);
margin-bottom: 4px;
}
.aksrt-timeline__content {
font-size: 14px;
color: var(--color-ink-3, #777);
line-height: 1.6;
}
/* ============================================================
* 2. 步骤向导 — .aksrt-steps
* ============================================================ */
.aksrt-steps {
display: flex;
align-items: flex-start;
gap: 0;
margin: 0;
padding: 0;
list-style: none;
counter-reset: aksrt-step;
}
.aksrt-steps__item {
flex: 1;
position: relative;
text-align: center;
counter-increment: aksrt-step;
}
/* 连接线 */
.aksrt-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));
}
.aksrt-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;
}
.aksrt-steps__item--active .aksrt-steps__icon {
background: var(--color-primary);
color: var(--color-on-primary, #fff);
}
.aksrt-steps__item--done .aksrt-steps__icon {
background: var(--color-success);
color: #fff;
}
.aksrt-steps__item--done:not(:last-child)::after {
background: var(--color-success);
}
.aksrt-steps__label {
font-size: 13px;
font-weight: 600;
color: var(--color-ink-3, #777);
}
.aksrt-steps__item--active .aksrt-steps__label {
color: var(--color-primary);
}
.aksrt-steps__item--done .aksrt-steps__label {
color: var(--color-success);
}
/* 垂直模式 */
.aksrt-steps--vertical {
flex-direction: column;
gap: 0;
padding-left: 20px;
}
.aksrt-steps--vertical .aksrt-steps__item {
text-align: left;
padding-left: 28px;
padding-bottom: 20px;
}
.aksrt-steps--vertical .aksrt-steps__item:not(:last-child)::after {
top: 34px;
left: 36px;
right: auto;
width: 2px;
height: calc(100% - 34px);
}
.aksrt-steps--vertical .aksrt-steps__icon {
position: absolute;
left: 0;
margin: 0;
}
/* ============================================================
* 3. 九宫格 — .aksrt-img-grid
* ============================================================ */
.aksrt-img-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 4px;
border-radius: var(--radius, 8px);
overflow: hidden;
}
.aksrt-img-grid img {
width: 100%;
aspect-ratio: 1;
object-fit: cover;
display: block;
cursor: pointer;
transition: transform .2s ease;
}
.aksrt-img-grid img:hover {
transform: scale(1.03);
}
/* 自适应列数 */
.aksrt-img-grid--2 { grid-template-columns: repeat(2, 1fr); }
.aksrt-img-grid--4 { grid-template-columns: repeat(4, 1fr); }
@media (max-width: 480px) {
.aksrt-img-grid--4 { grid-template-columns: repeat(3, 1fr); }
}
/* ============================================================
* 5. Toggle 开关 — .aksrt-toggle (纯 CSS + :checked)
* 保持原生 <input> 可访问性
* ============================================================ */
.aksrt-toggle {
position: relative;
display: inline-flex;
align-items: center;
cursor: pointer;
user-select: none;
gap: 8px;
}
.aksrt-toggle__input {
position: absolute;
opacity: 0;
width: 0;
height: 0;
pointer-events: none;
}
.aksrt-toggle__track {
position: relative;
width: var(--aksrt-toggle-w, 44px);
height: var(--aksrt-toggle-h, 24px);
background: var(--surface-3, #e8e8e8);
border-radius: var(--aksrt-toggle-h, 24px);
transition: background .2s ease;
flex-shrink: 0;
}
.aksrt-toggle__track::after {
content: '';
position: absolute;
top: 2px;
left: 2px;
width: calc(var(--aksrt-toggle-h, 24px) - 4px);
height: calc(var(--aksrt-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 */
.aksrt-toggle__input:checked + .aksrt-toggle__track {
background: var(--color-primary);
}
.aksrt-toggle__input:checked + .aksrt-toggle__track::after {
transform: translateX(calc(var(--aksrt-toggle-w, 44px) - var(--aksrt-toggle-h, 24px)));
}
/* Focus-visible */
.aksrt-toggle__input:focus-visible + .aksrt-toggle__track {
box-shadow: var(--focus-ring, 0 0 2px 3px rgba(253, 83, 161, 0.4));
}
/* Disabled */
.aksrt-toggle__input:disabled + .aksrt-toggle__track {
opacity: 0.5;
cursor: not-allowed;
}
.aksrt-toggle__label {
font-size: 14px;
color: var(--color-ink-2, #4e5358);
}
/* ============================================================
* 6. 自定义复选框 — .aksrt-checkbox (纯 CSS + :checked)
* 保持原生 <input type="checkbox"> 可访问性
* ============================================================ */
.aksrt-checkbox {
display: inline-flex;
align-items: center;
gap: 8px;
cursor: pointer;
user-select: none;
}
.aksrt-checkbox__input {
position: absolute;
opacity: 0;
width: 0;
height: 0;
pointer-events: none;
}
.aksrt-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 */
.aksrt-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;
}
.aksrt-checkbox__input:checked + .aksrt-checkbox__box {
background: var(--color-primary);
border-color: var(--color-primary);
}
.aksrt-checkbox__input:checked + .aksrt-checkbox__box::after {
transform: rotate(45deg) scale(1);
}
.aksrt-checkbox__input:focus-visible + .aksrt-checkbox__box {
box-shadow: var(--focus-ring, 0 0 2px 3px rgba(253, 83, 161, 0.4));
}
.aksrt-checkbox__input:disabled + .aksrt-checkbox__box {
opacity: 0.5;
cursor: not-allowed;
}
.aksrt-checkbox__label {
font-size: 14px;
color: var(--color-ink-2, #4e5358);
}
/* ============================================================
* 7. 数字步进器 — .aksrt-stepper
* ============================================================ */
.aksrt-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(--aksrt-stepper-h, 36px);
}
.aksrt-stepper__btn {
display: flex;
align-items: center;
justify-content: center;
width: var(--aksrt-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;
}
.aksrt-stepper__btn:hover {
background: var(--surface-3, #e8e8e8);
color: var(--color-ink, #333);
}
.aksrt-stepper__btn:disabled {
opacity: 0.4;
cursor: not-allowed;
}
.aksrt-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;
}
.aksrt-stepper__input::-webkit-outer-spin-button,
.aksrt-stepper__input::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
.aksrt-stepper__input:focus {
outline: none;
background: var(--color-primary-softer, rgba(240, 68, 148, 0.05));
}
/* ============================================================
* 8. 头像尺寸变量系统 — .aksrt-avatar--{size}
* ============================================================ */
.aksrt-avatar--xs { width: var(--aksrt-avatar-size-xs); height: var(--aksrt-avatar-size-xs); }
.aksrt-avatar--sm { width: var(--aksrt-avatar-size-sm); height: var(--aksrt-avatar-size-sm); }
.aksrt-avatar { width: var(--aksrt-avatar-size); height: var(--aksrt-avatar-size); }
.aksrt-avatar--lg { width: var(--aksrt-avatar-size-lg); height: var(--aksrt-avatar-size-lg); }
.aksrt-avatar--xl { width: var(--aksrt-avatar-size-xl); height: var(--aksrt-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. 涟漪点击效果 — .aksrt-ripple
* 容器加此类,点击时 JS 注入 span.aksrt-ripple__wave
* ============================================================ */
.aksrt-ripple {
position: relative;
overflow: hidden;
}
.aksrt-ripple__wave {
position: absolute;
border-radius: 50%;
background: rgba(255, 255, 255, 0.35);
transform: scale(0);
animation: aksrtRippleWave .6s ease-out forwards;
pointer-events: none;
}
@keyframes aksrtRippleWave {
to {
transform: scale(4);
opacity: 0;
}
}
/* Runtime broad ripple (.aksrt-wave injected into .but/.btn).
* MUST stay out of flow — missing absolute made header CTA grow on click. */
.aksrt-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: aksrtWaveRipple 0.6s ease-out forwards;
}
@keyframes aksrtWaveRipple {
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 */
/**
* AKSRT Color Utilities — 多色按钮 / 渐变按钮 / 文字渐变 / Badge
* ------------------------------------------------------------
* 所有颜色走 CSS 变量(定义在 tokens.css),不硬编码十六进制。
*/
/* ============================================================
* 1. 多色按钮 — .aksrt-btn--{color}
* ============================================================ */
.aksrt-btn--rose { background: var(--aksrt-rose); color: #fff; }
.aksrt-btn--rose:hover,
.aksrt-btn--rose:focus-visible { background: #e11d48; }
.aksrt-btn--blue { background: var(--aksrt-blue); color: #fff; }
.aksrt-btn--blue:hover,
.aksrt-btn--blue:focus-visible { background: #2563eb; }
.aksrt-btn--green { background: var(--aksrt-green); color: #fff; }
.aksrt-btn--green:hover,
.aksrt-btn--green:focus-visible { background: #059669; }
.aksrt-btn--orange { background: var(--aksrt-orange); color: #fff; }
.aksrt-btn--orange:hover,
.aksrt-btn--orange:focus-visible { background: #ea580c; }
.aksrt-btn--purple { background: var(--aksrt-purple); color: #fff; }
.aksrt-btn--purple:hover,
.aksrt-btn--purple:focus-visible { background: #7c3aed; }
.aksrt-btn--cyan { background: var(--aksrt-cyan); color: #fff; }
.aksrt-btn--cyan:hover,
.aksrt-btn--cyan:focus-visible { background: #0891b2; }
.aksrt-btn--yellow { background: var(--aksrt-yellow); color: #422006; }
.aksrt-btn--yellow:hover,
.aksrt-btn--yellow:focus-visible { background: #ca8a04; color: #fff; }
.aksrt-btn--red { background: var(--aksrt-red); color: #fff; }
.aksrt-btn--red:hover,
.aksrt-btn--red:focus-visible { background: #dc2626; }
.aksrt-btn--teal { background: var(--aksrt-teal); color: #fff; }
.aksrt-btn--teal:hover,
.aksrt-btn--teal:focus-visible { background: #0d9488; }
.aksrt-btn--indigo { background: var(--aksrt-indigo); color: #fff; }
.aksrt-btn--indigo:hover,
.aksrt-btn--indigo:focus-visible { background: #4f46e5; }
.aksrt-btn--pink { background: var(--aksrt-pink); color: #fff; }
.aksrt-btn--pink:hover,
.aksrt-btn--pink:focus-visible { background: #db2777; }
/* Soft variant — 浅色背景 + 深色文字 */
.aksrt-btn--rose-soft { background: var(--aksrt-rose-soft); color: var(--aksrt-rose); }
.aksrt-btn--blue-soft { background: var(--aksrt-blue-soft); color: var(--aksrt-blue); }
.aksrt-btn--green-soft { background: var(--aksrt-green-soft); color: var(--aksrt-green); }
.aksrt-btn--orange-soft { background: var(--aksrt-orange-soft); color: var(--aksrt-orange); }
.aksrt-btn--purple-soft { background: var(--aksrt-purple-soft); color: var(--aksrt-purple); }
.aksrt-btn--cyan-soft { background: var(--aksrt-cyan-soft); color: var(--aksrt-cyan); }
.aksrt-btn--yellow-soft { background: var(--aksrt-yellow-soft); color: #92400e; }
.aksrt-btn--red-soft { background: var(--aksrt-red-soft); color: var(--aksrt-red); }
.aksrt-btn--teal-soft { background: var(--aksrt-teal-soft); color: var(--aksrt-teal); }
.aksrt-btn--indigo-soft { background: var(--aksrt-indigo-soft); color: var(--aksrt-indigo); }
.aksrt-btn--pink-soft { background: var(--aksrt-pink-soft); color: var(--aksrt-pink); }
/* ============================================================
* 2. 渐变按钮 — .aksrt-btn--grad-{name}
* ============================================================ */
.aksrt-btn--grad-vip {
background: linear-gradient(135deg, var(--aksrt-vip-gold-1), var(--aksrt-vip-gold-2));
color: #5a3d00;
border: none;
}
.aksrt-btn--grad-sunset {
background: linear-gradient(135deg, var(--aksrt-grad-sunset-1), var(--aksrt-grad-sunset-2));
color: #fff;
border: none;
}
.aksrt-btn--grad-ocean {
background: linear-gradient(135deg, var(--aksrt-grad-ocean-1), var(--aksrt-grad-ocean-2));
color: #fff;
border: none;
}
.aksrt-btn--grad-forest {
background: linear-gradient(135deg, var(--aksrt-grad-forest-1), var(--aksrt-grad-forest-2));
color: #064e3b;
border: none;
}
.aksrt-btn--grad-night {
background: linear-gradient(135deg, var(--aksrt-grad-night-1), var(--aksrt-grad-night-2));
color: #4c1d95;
border: none;
}
.aksrt-btn--grad-fire {
background: linear-gradient(135deg, var(--aksrt-grad-fire-1), var(--aksrt-grad-fire-2));
color: #fff;
border: none;
}
.aksrt-btn--grad-primary {
background: linear-gradient(135deg, var(--color-primary), var(--color-primary-active));
color: var(--color-on-primary);
border: none;
}
/* 渐变按钮 hover — 亮度微调 */
.aksrt-btn--grad-vip:hover,
.aksrt-btn--grad-sunset:hover,
.aksrt-btn--grad-ocean:hover,
.aksrt-btn--grad-forest:hover,
.aksrt-btn--grad-night:hover,
.aksrt-btn--grad-fire:hover,
.aksrt-btn--grad-primary:hover {
filter: brightness(1.08);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
}
/* ============================================================
* 3. 文字渐变 — .aksrt-text-grad-{name}
* ============================================================ */
.aksrt-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;
}
.aksrt-text-grad-vip {
background: linear-gradient(135deg, var(--aksrt-vip-gold-1), var(--aksrt-vip-gold-2));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.aksrt-text-grad-sunset {
background: linear-gradient(135deg, var(--aksrt-grad-sunset-1), var(--aksrt-grad-sunset-2));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.aksrt-text-grad-ocean {
background: linear-gradient(135deg, var(--aksrt-grad-ocean-1), var(--aksrt-grad-ocean-2));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.aksrt-text-grad-forest {
background: linear-gradient(135deg, var(--aksrt-grad-forest-1), var(--aksrt-grad-forest-2));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.aksrt-text-grad-night {
background: linear-gradient(135deg, var(--aksrt-grad-night-1), var(--aksrt-grad-night-2));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.aksrt-text-grad-fire {
background: linear-gradient(135deg, var(--aksrt-grad-fire-1), var(--aksrt-grad-fire-2));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
/* ============================================================
* 4. Badge 系统 — .aksrt-badge / .aksrt-badge--{color}
* ============================================================ */
.aksrt-badge {
display: inline-flex;
align-items: center;
justify-content: center;
height: var(--aksrt-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;
}
.aksrt-badge--primary { background: var(--color-primary-soft); color: var(--color-primary); }
.aksrt-badge--success { background: rgba(16, 185, 129, 0.12); color: var(--color-success); }
.aksrt-badge--warning { background: rgba(245, 158, 11, 0.12); color: var(--color-warning); }
.aksrt-badge--error { background: rgba(239, 68, 68, 0.12); color: var(--color-error); }
.aksrt-badge--info { background: rgba(59, 130, 246, 0.12); color: var(--color-info); }
.aksrt-badge--rose { background: var(--aksrt-rose-soft); color: var(--aksrt-rose); }
.aksrt-badge--blue { background: var(--aksrt-blue-soft); color: var(--aksrt-blue); }
.aksrt-badge--green { background: var(--aksrt-green-soft); color: var(--aksrt-green); }
.aksrt-badge--orange { background: var(--aksrt-orange-soft); color: var(--aksrt-orange); }
.aksrt-badge--purple { background: var(--aksrt-purple-soft); color: var(--aksrt-purple); }
.aksrt-badge--cyan { background: var(--aksrt-cyan-soft); color: var(--aksrt-cyan); }
.aksrt-badge--yellow { background: var(--aksrt-yellow-soft); color: #92400e; }
.aksrt-badge--red { background: var(--aksrt-red-soft); color: var(--aksrt-red); }
.aksrt-badge--teal { background: var(--aksrt-teal-soft); color: var(--aksrt-teal); }
.aksrt-badge--indigo { background: var(--aksrt-indigo-soft); color: var(--aksrt-indigo); }
.aksrt-badge--pink { background: var(--aksrt-pink-soft); color: var(--aksrt-pink); }
/* 渐变 Badge */
.aksrt-badge--grad-vip {
background: linear-gradient(135deg, var(--aksrt-vip-gold-1), var(--aksrt-vip-gold-2));
color: #5a3d00;
}
.aksrt-badge--grad-primary {
background: linear-gradient(135deg, var(--color-primary), var(--color-primary-active));
color: var(--color-on-primary);
}
/* Solid badge variant — 纯色背景 + 白色文字 */
.aksrt-badge--solid-primary { background: var(--color-primary); color: #fff; }
.aksrt-badge--solid-success { background: var(--color-success); color: #fff; }
.aksrt-badge--solid-warning { background: var(--color-warning); color: #fff; }
.aksrt-badge--solid-error { background: var(--color-error); color: #fff; }
.aksrt-badge--solid-info { background: var(--color-info); color: #fff; }
.aksrt-badge--solid-rose { background: var(--aksrt-rose); color: #fff; }
.aksrt-badge--solid-blue { background: var(--aksrt-blue); color: #fff; }
.aksrt-badge--solid-green { background: var(--aksrt-green); color: #fff; }
.aksrt-badge--solid-orange { background: var(--aksrt-orange); color: #fff; }
.aksrt-badge--solid-purple { background: var(--aksrt-purple); color: #fff; }
.aksrt-badge--solid-cyan { background: var(--aksrt-cyan); color: #fff; }
.aksrt-badge--solid-yellow { background: var(--aksrt-yellow); color: #422006; }
.aksrt-badge--solid-red { background: var(--aksrt-red); color: #fff; }
.aksrt-badge--solid-teal { background: var(--aksrt-teal); color: #fff; }
.aksrt-badge--solid-indigo { background: var(--aksrt-indigo); color: #fff; }
.aksrt-badge--solid-pink { background: var(--aksrt-pink); color: #fff; }
/* Badge sizes */
.aksrt-badge--sm { height: 18px; padding: 0 6px; font-size: 11px; }
.aksrt-badge--lg { height: 28px; padding: 0 12px; font-size: 13px; }
/* ============================================================
* 5. 背景色工具类 — .aksrt-bg-{color}
* ============================================================ */
.aksrt-bg-rose { background-color: var(--aksrt-rose-soft); }
.aksrt-bg-blue { background-color: var(--aksrt-blue-soft); }
.aksrt-bg-green { background-color: var(--aksrt-green-soft); }
.aksrt-bg-orange { background-color: var(--aksrt-orange-soft); }
.aksrt-bg-purple { background-color: var(--aksrt-purple-soft); }
.aksrt-bg-cyan { background-color: var(--aksrt-cyan-soft); }
.aksrt-bg-yellow { background-color: var(--aksrt-yellow-soft); }
.aksrt-bg-red { background-color: var(--aksrt-red-soft); }
.aksrt-bg-teal { background-color: var(--aksrt-teal-soft); }
.aksrt-bg-indigo { background-color: var(--aksrt-indigo-soft); }
.aksrt-bg-pink { background-color: var(--aksrt-pink-soft); }
/* ============================================================
* 6. 文字色工具类 — .aksrt-text-{color}
* ============================================================ */
.aksrt-text-rose { color: var(--aksrt-rose); }
.aksrt-text-blue { color: var(--aksrt-blue); }
.aksrt-text-green { color: var(--aksrt-green); }
.aksrt-text-orange { color: var(--aksrt-orange); }
.aksrt-text-purple { color: var(--aksrt-purple); }
.aksrt-text-cyan { color: var(--aksrt-cyan); }
.aksrt-text-yellow { color: var(--aksrt-yellow); }
.aksrt-text-red { color: var(--aksrt-red); }
.aksrt-text-teal { color: var(--aksrt-teal); }
.aksrt-text-indigo { color: var(--aksrt-indigo); }
.aksrt-text-pink { color: var(--aksrt-pink); }
/* source: assets/css/frontend/base.css */
/**
* AKSRT 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;
}
.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. */
/* Header multifunc icon cards: pin typography baseline so cards render
* identically on all pages. .px12-sm is only defined globally in
* legacy-utilities.css, which is @import'd by the single-post aggregator;
* vendor CSS pins it at <=640px / .sidebar / .mobile-nav-widget only. */
.header-slider-card .icon-cover-card {
font-size: 12px;
}
/* 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.
*/
.aksrt-user-level-badge,
.aksrt-user-level-icon,
.aksrt-identity-medal,
.aksrt-identity-certification-icon,
.aksrt-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;
}
.aksrt-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. */
.aksrt-identity-medal--comment,
.aksrt-user-level-icon--comment,
.aksrt-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,
.aksrt-author-hero__name,
.uc-header__name,
.aksrt-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;
}
.aksrt-author-hero__name,
.uc-header__name {
display: inline-flex;
align-items: center;
gap: 4px;
}
.aksrt-author-hero__name-inner {
display: inline-flex;
align-items: center;
gap: 4px;
min-width: 0;
}
.aksrt-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 legacy navigation styles provide the popover shell, and every
* account row (avatar, VIP bar, check-in, wallet tiles, stats badges) renders
* through the reference legacy classes. This module only owns the navigation
* shell anchoring plus the account action-row geometry.
*/
/* The reference keeps the right cluster as three floated .navbar-form groups.
* Bootstrap's base .navbar-form rule carries margin-top: 8px and the >=768px
* override only zeroes the horizontal margins, so every right-cluster group
* starts 8px below the top of .navbar-collapse. The 50px menu row and the logo
* put the navbar midline at 25px, so a 34px cross-size lands a group's midline
* at 8 + 17 = 25px. The publish/VIP chips already reach that line through their
* own 0.4em margin stacked on the group's 8px; the account row reaches it from
* its 34px icon tiles, and the theme group needs the same cross-size because
* its 29px toggle is otherwise 2.5px high. Nothing here may restate a 50px
* min-height: it would double-count the 8px and push that group's content 8px
* below the line while inflating the navbar from 50px to 58px. */
.navbar-top .aksrt-navbar-account {
display: inline-flex;
align-items: center;
gap: 4px;
margin: 0;
}
.navbar-top .aksrt-navbar-account > li {
position: relative;
display: inline-flex;
align-items: center;
flex: 0 0 auto;
padding: 0;
overflow: visible;
}
.navbar-top .aksrt-navbar-account > li > .sub-menu {
top: calc(100% + 5px);
right: 0;
left: auto;
z-index: 1002;
margin: 0;
}
.navbar-top .aksrt-nav-icon,
.navbar-top .aksrt-nav-avatar {
display: inline-flex !important;
align-items: center;
justify-content: center;
width: 34px;
height: 34px;
padding: 0 !important;
overflow: visible !important;
border: 0 !important;
border-radius: 0;
background: transparent !important;
box-shadow: none !important;
}
.navbar-top .aksrt-nav-icon .icon {
width: 1.2em;
height: 1.2em;
}
.navbar-top .aksrt-nav-avatar {
margin-top: 0;
}
.navbar-top .aksrt-nav-avatar .avatar {
display: block;
width: 29px;
height: 29px;
border-radius: 50%;
object-fit: cover;
}
.navbar-top .navbar-form .toggle-radius {
flex: 0 0 29px;
margin: 0;
vertical-align: middle;
}
/* Match the account row's 34px cross-size so the 29px toggle shares the 25px
* midline instead of sitting 2.5px above it. */
.navbar-top .navbar-form.flex.ac {
min-height: 34px;
}
.navbar-top .navbar-form .aksrt-navbar-language {
margin: 0;
}
/* The reference keeps the publish/VIP hover wrapper a plain inline-block, so the
* absolutely positioned .sub-vip-card takes its normal-flow static position.
* The shared action cluster otherwise forces inline-flex on every child, which
* would move that static position to the flex container's cross-start. */
.navbar-top .navbar-but > .hover-show {
display: inline-block;
}
/* Keep the drop-down search panel above a fixed header (z-index: 999). */
.navbar-search {
z-index: 1001;
opacity: 0;
transform: translate3d(0, -24px, 0);
transition: transform .24s ease, opacity .18s ease, visibility 0s linear .24s;
will-change: transform, opacity;
}
.navbar-search.show {
opacity: 1;
transform: translate3d(0, 0, 0);
transition-delay: 0s;
}
.navbar-search .line-form-input:focus,
.navbar-search .line-form-input:focus-visible {
outline: 0;
box-shadow: none;
}
.navbar-search .search-close-box {
display: flex;
justify-content: flex-end;
max-width: 660px;
margin: 16px auto 0;
}
.navbar-search .search-close-box > .but {
float: none;
}
.aksrt-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. */
.aksrt-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. */
.aksrt-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). */
.aksrt-nav-notification .aksrt-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 .aksrt-header-userbox .header-user-href > a,
.aksrt-header-userbox .header-user-href > a {
max-height: none;
}
.mobile-navbar .aksrt-header-userbox {
width: auto;
max-width: 400px;
margin: auto;
}
/* source: assets/css/frontend/card-primitives.css */
/**
* AKSRT Card Primitives — 1:1 legacy Alignment
*
* 对齐 legacy 的 .theme-box / .box-bg / .box-body / .box-header:
* 阴影优先,无边框,8px 圆角,15px 内边距。
*
* @package AKSRT
*/
/* ============================================================
* .aksrt-theme-box — 完整卡片原语(阴影 + 圆角 + 表面)
* 对齐 legacy .theme-box + .box-bg
* ============================================================ */
.aksrt-theme-box {
border: none;
border-radius: var(--radius, 8px);
background: var(--surface-1);
box-shadow: var(--shadow-sm);
transition: box-shadow 0.2s ease;
}
.aksrt-theme-box:hover {
box-shadow: var(--shadow);
}
/* ============================================================
* .aksrt-box-bg — 表面原语(仅背景 + 阴影)
* ============================================================ */
.aksrt-box-bg {
background-color: var(--surface-1);
box-shadow: var(--shadow-sm);
}
/* ============================================================
* .aksrt-box-body / .aksrt-box-header — 内边距区段
* 对齐 legacy .box-body / .box-header { padding: 15px }
* ============================================================ */
.aksrt-box-body,
.aksrt-box-header {
padding: var(--card-padding);
}
.aksrt-box-header {
border-bottom: 1px solid var(--color-line-soft);
}
.aksrt-box-header + .aksrt-box-body {
padding-top: 0;
}
.aksrt-box-body.notop,
.aksrt-box-header.notop { padding-top: 0; }
.aksrt-box-body.nobottom,
.aksrt-box-header.nobottom { padding-bottom: 0; }
/* ============================================================
* .aksrt-muted-box — 柔和背景嵌套
* 对齐 legacy .muted-box
* ============================================================ */
.aksrt-muted-box {
background-color: var(--surface-2);
border-radius: var(--radius);
padding: var(--card-padding);
}
/* ============================================================
* .aksrt-noshadow — 去除阴影
* ============================================================ */
.aksrt-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 / .aksrt-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 .aksrt-theme-box,
body.dark-theme .aksrt-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 .aksrt-theme-box:hover,
body.dark-theme .aksrt-theme-box:hover {
box-shadow: 0 0 10px var(--main-shadow, rgba(0, 0, 0, 0.28));
}
/* ============================================================
* 卡片 hover 动效
* ============================================================ */
.aksrt-theme-box {
transition: box-shadow var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.aksrt-card-hover:hover,
.aksrt-card-hover:focus-within {
box-shadow: none;
transform: none;
}
.aksrt-card-hover-lg:hover,
.aksrt-card-hover-lg:focus-within {
box-shadow: var(--shadow-lg);
transform: none;
}
.aksrt-noshadow:hover {
box-shadow: none !important;
transform: none !important;
}
/* ============================================================
* .aksrt-panel — legacy sidebar/widget surface
* ============================================================ */
.aksrt-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 */
/**
* AKSRT Overlay / Glass Primitives
*
* Provides backdrop-filter glass surfaces used by header, footer-tabbar,
* floating buttons and search overlays — matching legacy's blur system.
*
* @package AKSRT
*/
/* ============================================================
* .aksrt-blur-bg — generic glass surface
* Use on any element that needs a translucent blurred background.
* ============================================================ */
.aksrt-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 带
* .aksrt-profile(公开主页的该类只打在 body 上),因此不会误伤其它路由。 */
.site-main.content-shell.aksrt-profile {
max-width: 100%;
box-sizing: border-box;
}
/* 公开主页是单栏,继续沿用后台「内容最大宽度」。顶部多功能组件位于
* main 之前;main 的通用 32/40px 上内边距会把资料卡与组件人为拉开,
* 这里仅对公开主页清除该段重复空白。 */
.site-main.content-shell.aksrt-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;
}
.term-page-header {
position: relative;
overflow: hidden;
border: 1px solid var(--color-line-soft, rgba(15, 23, 42, 0.08));
border-radius: var(--radius-lg);
background: var(--surface-1);
box-shadow: var(--shadow-sm, 0 1px 6px rgba(15, 23, 42, 0.04));
}
.term-page-header__body {
position: relative;
z-index: 1;
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
padding: 24px;
}
.term-page-header__eyebrow {
margin: 0 0 8px;
font-size: 0.8125rem;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--color-primary);
}
.term-page-header__desc {
margin-top: 10px;
}
.term-page-header__cover {
min-height: 140px;
background-position: center;
background-size: cover;
border-top: 1px solid var(--color-line-soft, rgba(15, 23, 42, 0.08));
}
.term-page-header--simple .term-page-header__cover {
display: none;
}
/* Card style: accent top border, slightly more padding */
.term-page-header--card {
border-top: 3px solid var(--color-primary, #f04494);
}
.term-page-header--card .term-page-header__body {
padding: 28px 24px;
}
/* Cover style: full-width hero with background image */
.term-page-header--cover {
border: none;
border-radius: var(--radius-lg);
background: transparent;
box-shadow: none;
min-height: 220px;
display: flex;
flex-direction: column;
}
.term-page-header__cover-bg {
position: absolute;
inset: 0;
background-position: center;
background-size: cover;
border-radius: var(--radius-lg);
}
.term-page-header__cover-overlay {
position: absolute;
inset: 0;
background: linear-gradient(135deg, rgba(0, 0, 0, 0.55) 0%, rgba(0, 0, 0, 0.25) 100%);
border-radius: var(--radius-lg);
}
.term-page-header--cover .term-page-header__body {
flex: 1;
align-items: flex-end;
z-index: 2;
}
.term-page-header__body--overlay .entry-title,
.term-page-header__body--overlay .term-page-header__desc,
.term-page-header__body--overlay .term-page-header__eyebrow {
color: #fff;
}
.term-page-header__body--overlay .term-page-header__eyebrow {
color: rgba(255, 255, 255, 0.8);
}
@media (max-width: 767px) {
.term-page-header--cover {
min-height: 160px;
}
}
.aksrt-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;
}
.aksrt-admin-quicklink:hover {
color: var(--color-primary);
border-color: var(--color-primary);
background: var(--color-primary-soft, rgba(59, 130, 246, 0.08));
}
.archive-filter-bar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
flex-wrap: wrap;
margin: -8px 0 24px;
padding: 16px 18px;
border-radius: var(--radius-lg);
background: var(--surface-2);
border: 1px solid var(--color-line-soft, rgba(15, 23, 42, 0.06));
}
.archive-filter-bar__main {
display: flex;
align-items: center;
gap: 12px;
flex-wrap: wrap;
}
.archive-filter-bar__label {
color: var(--color-ink-4);
font-size: 0.8125rem;
font-weight: 600;
}
.archive-filter-bar__chips {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 8px;
}
.archive-filter-bar__chip {
display: inline-flex;
align-items: center;
min-height: 34px;
padding: 0 12px;
border-radius: var(--radius-pill, 999px);
background: var(--surface-1);
color: var(--color-ink-2);
text-decoration: none;
font-size: 0.875rem;
font-weight: 500;
}
.archive-filter-bar__chip.is-active,
.archive-filter-bar__chip:hover {
background: var(--color-primary);
color: var(--color-on-primary, #fff);
}
.archive-filter-bar__meta {
color: var(--color-ink-4);
font-size: 0.8125rem;
font-weight: 600;
}
.archive-filter-bar__sort {
display: flex;
align-items: center;
gap: 8px;
margin-left: auto;
}
.archive-filter-bar__main--tags {
border-top: 1px solid var(--color-line-soft, rgba(15, 23, 42, 0.06));
padding-top: 10px;
margin-top: 10px;
}
/* §3.4 custom_filter dimension rows */
.archive-filter-bar__main--custom {
border-top: 1px solid var(--color-line-soft, rgba(15, 23, 42, 0.06));
padding-top: 10px;
margin-top: 10px;
}
.content-stream {
display: grid;
gap: 20px;
}
.content-main--archive,
.content-main--tag,
.content-main--category,
.content-main--search,
.content-main--single {
display: grid;
gap: 20px;
}
.content-stream__list {
width: 100%;
}
.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) {
.term-page-header__body {
flex-direction: column;
align-items: stretch;
padding: 20px;
}
.aksrt-admin-quicklink {
width: fit-content;
}
}
/* ========== AJAX 分页(加载更多 / 无限滚动) ========== */
.aksrt-pagination-ajax {
display: flex;
flex-direction: column;
align-items: center;
gap: 16px;
margin: 40px 0 8px;
}
.aksrt-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;
}
.aksrt-load-more-btn:hover {
border-color: var(--color-primary);
color: var(--color-primary);
}
.aksrt-load-more-btn:disabled {
opacity: 0.5;
pointer-events: none;
}
.aksrt-loading-indicator {
display: none;
align-items: center;
gap: 8px;
font-size: 14px;
color: var(--color-ink-4);
}
.aksrt-loading-indicator i {
font-size: 16px;
}
.aksrt-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 */
/* ============================================================
* AKSRT Footer utilities — float buttons start + device helpers
* Main template_1 shell: shell.css
* Tabbar / float details continue below.
* ============================================================ */
:root {
--aksrt-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(--aksrt-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(--aksrt-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(--aksrt-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;
}
}
@media (max-width: 640px) {
.float-right {
right: 10px;
}
}
/* source: assets/css/frontend/enhancements.css */
/**
* AKSRT Enhancements — 全局 UI 增强
*
* 包含:悬停动效、暗色过渡、滚动感知
* 所有选择器使用 aksrt- 前缀避免冲突
*
* 骨架屏不在此文件:唯一契约是 .placeholder 块 + .post_ajax_loader 容器
* (inc/helpers/posts-renderer/markup.php 的 aksrt_render_placeholder)。
*/
@keyframes aksrt-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* ============================================================
* 1. 悬停交互动效
* ============================================================ */
/* 卡片放大 */
.aksrt-hover-zoom {
transition: transform 0.3s ease;
}
.aksrt-hover-zoom:hover {
transform: scale(1.02);
}
/* 卡片轻微放大 */
.aksrt-hover-zoom-sm {
transition: transform 0.3s ease;
}
.aksrt-hover-zoom-sm:hover {
transform: scale(1.02);
}
/* 悬停显示内容 */
.aksrt-hover-show {
position: relative;
}
.aksrt-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;
}
.aksrt-hover-show:hover .aksrt-hover-show__content {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
/* 关闭按钮旋转 */
.aksrt-ic-close {
transition: transform 0.3s;
cursor: pointer;
}
.aksrt-ic-close:hover {
transform: rotate(270deg);
}
/* 图片悬停缩放(缩略图容器) */
.aksrt-hover-zoom-img img {
transition: transform 0.3s ease;
}
.aksrt-hover-zoom-img:hover img {
transform: scale(1.02);
}
.aksrt-hover-zoom-img-sm img {
transition: transform 0.3s ease;
}
.aksrt-hover-zoom-img-sm:hover img {
transform: scale(1.02);
}
/* 按钮悬停上浮 */
.aksrt-hover-lift {
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.aksrt-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 {
--aksrt-blur-bg: #ffffff;
}
.dark {
--aksrt-blur-bg: var(--surface-1);
}
}
/* ============================================================
* 4. 滚动方向感知
* ============================================================ */
/* 向下滚动时隐藏导航栏 */
body.aksrt-scroll-down .site-nav.nav-scroll-hide {
transform: translateY(-100%);
transition: transform 0.3s ease;
}
body.aksrt-scroll-up .site-nav.nav-scroll-hide {
transform: translateY(0);
transition: transform 0.3s ease;
}
/* 滚动时隐藏浮动按钮 */
body.aksrt-scrolling .aksrt-floating-right.scrolling-hide {
opacity: 0;
pointer-events: none;
transition: opacity 0.2s;
}
/* body-scroll 状态类 */
body.aksrt-body-scroll .aksrt-show-on-scroll {
opacity: 1;
visibility: visible;
}
.aksrt-show-on-scroll {
opacity: 0;
visibility: hidden;
transition: opacity 0.3s, visibility 0.3s;
}
/* 可缩放图片的光标 */
.aksrt-cursor-zoom-in {
cursor: zoom-in;
}
/* ============================================================
* 9. 公告跑马灯 Widget
* ============================================================ */
.aksrt-announcement {
position: relative;
overflow: hidden;
padding: 10px 12px;
background: var(--surface-2, #F4F5F7);
border-radius: var(--radius, 10px);
}
.aksrt-announcement__icon {
position: absolute;
left: 12px;
top: 50%;
transform: translateY(-50%);
color: var(--color-primary, var(--color-primary));
font-size: 14px;
z-index: 1;
}
.aksrt-announcement__track {
margin-left: 24px;
overflow: hidden;
height: 20px;
}
.aksrt-announcement__list {
margin: 0;
padding: 0;
list-style: none;
animation: aksrt-marquee 10s linear infinite;
}
.aksrt-announcement__item {
height: 20px;
line-height: 20px;
font-size: 13px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.aksrt-announcement__item a {
color: var(--color-ink-2);
text-decoration: none;
}
.aksrt-announcement__item a:hover {
color: var(--color-primary, var(--color-primary));
}
@keyframes aksrt-marquee {
0% { transform: translateY(0); }
100% { transform: translateY(-100%); }
}
.aksrt-announcement:hover .aksrt-announcement__list {
animation-play-state: paused;
}
/* ============================================================
* 11. 滚动触发动画初始状态
* ============================================================ */
[data-aksrt-animate] {
will-change: opacity, transform;
}
/* ============================================================
* 12. 粘性侧栏
* ============================================================ */
[data-aksrt-sticky] {
will-change: transform;
}
/* ============================================================
* 13. 用户排行榜 Widget
* ============================================================ */
.aksrt-user-ranking {
margin: 0;
padding: 0;
list-style: none;
}
.aksrt-user-ranking__item {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 0;
border-bottom: 1px solid var(--color-line-soft, #F0F1F3);
}
.aksrt-user-ranking__item:last-child {
border-bottom: none;
}
.aksrt-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;
}
.aksrt-user-ranking__item--top:nth-child(1) .aksrt-user-ranking__rank {
background: #FFD700;
color: #fff;
}
.aksrt-user-ranking__item--top:nth-child(2) .aksrt-user-ranking__rank {
background: #C0C0C0;
color: #fff;
}
.aksrt-user-ranking__item--top:nth-child(3) .aksrt-user-ranking__rank {
background: #CD7F32;
color: #fff;
}
.aksrt-user-ranking__avatar {
flex-shrink: 0;
}
.aksrt-user-ranking__avatar img {
width: 36px;
height: 36px;
border-radius: 50%;
object-fit: cover;
}
.aksrt-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;
}
.aksrt-user-ranking__name:hover {
color: var(--color-primary, var(--color-primary));
}
.aksrt-user-ranking__value {
font-size: 12px;
color: var(--color-ink-4, #8A8F98);
white-space: nowrap;
}
/* ============================================================
* 14. 图文封面卡片 Widget
* ============================================================ */
.aksrt-cover-cards {
display: grid;
grid-template-columns: repeat(var(--cols, 2), 1fr);
gap: 12px;
}
.aksrt-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;
}
.aksrt-cover-card:hover {
transform: translateY(-3px);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
}
.aksrt-cover-card__bg {
position: absolute;
inset: 0;
}
.aksrt-cover-card__bg img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.5s;
}
.aksrt-cover-card:hover .aksrt-cover-card__bg img {
transform: scale(1.02);
}
.aksrt-cover-card__overlay {
position: absolute;
inset: 0;
background: linear-gradient(180deg, rgba(0,0,0,0) 30%, rgba(0,0,0,0.6) 100%);
}
.aksrt-cover-card__content {
position: relative;
z-index: 1;
padding: 16px;
width: 100%;
}
.aksrt-cover-card__link {
text-decoration: none;
color: inherit;
display: block;
}
.aksrt-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);
}
.aksrt-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
* ============================================================ */
.aksrt-video-widget {
position: relative;
width: 100%;
overflow: hidden;
border-radius: var(--radius, 10px);
background: #000;
}
.aksrt-video-widget iframe,
.aksrt-video-widget video {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border: none;
}
/* ============================================================
* 16. 表单输入浮动标签
* ============================================================ */
.aksrt-float-label {
position: relative;
}
.aksrt-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;
}
.aksrt-float-label__input:focus {
outline: none;
border-color: var(--color-primary, var(--color-primary));
}
.aksrt-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;
}
.aksrt-float-label__input:focus + .aksrt-float-label__label,
.aksrt-float-label__input:not(:placeholder-shown) + .aksrt-float-label__label {
top: 8px;
transform: translateY(0);
font-size: 11px;
color: var(--color-primary, var(--color-primary));
}
/* ============================================================
* 17. 视差滚动层
* ============================================================ */
[data-aksrt-parallax] {
will-change: transform;
transition: transform 0.1s linear;
}
/* ============================================================
* 20. 用户等级进度条
* ============================================================ */
.aksrt-level-bar {
position: relative;
height: 8px;
background: var(--surface-2, #F4F5F7);
border-radius: 4px;
overflow: hidden;
}
.aksrt-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;
}
.aksrt-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 ========== */
.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,
.aksrt-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,
.aksrt-pagination a,
.aksrt-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,
.aksrt-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,
.aksrt-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,
.aksrt-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,
.aksrt-pagination .prev,
.aksrt-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,
.aksrt-pagination .prev i,
.aksrt-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,
.aksrt-pagination .pag-jump,
.navigation.pagination .pag-jump {
display: inline-flex;
align-items: center;
gap: 6px;
margin-left: 6px;
}
.pagenav.ajax-pag .jump-input,
.aksrt-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,
.aksrt-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,
.aksrt-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,
.aksrt-pagination a,
.aksrt-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,
.aksrt-pagination .pag-jump,
.navigation.pagination .pag-jump {
width: 100%;
justify-content: center;
margin-left: 0;
margin-top: 6px;
}
.pagenav.ajax-pag .jump-input,
.aksrt-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 AKSRT
*/
/* ---- portal token bridge ----
*
* 弹窗由 runtime portal 到 <body>,因此它位于任何「页面级 token 作用域」之外。
* 典型陷阱:路由样式把语义别名挂在页面上,例如
*
* .aksrt-orders-page { --orders-ink: var(--color-ink, #333); }
*
* 弹窗内部再去 `var(--orders-ink)` 时该变量不存在,整条声明会被静默丢弃——
* 表现为边框消失、次级文字变透明,而不是抛错,排查成本很高。
*
* 因此共享调色板在这里声明:本壳层永远在 portal 内,任何弹窗都能直接消费
* `--modal-*`。路由样式应把自己的局部别名映射到这里,而不是映射到页面级变量。
*/
.aksrt-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.aksrt-modal-runtime-open,
body.aksrt-modal-runtime-open {
overflow: hidden;
}
/* ---- 对话框宽度类不得作用于壳 ----
触发器沿用参考主题的 data-class 语义(modal-mini/full-sm 等),
但这些类落在 fixed 全屏壳上时,.modal-mini 的 width:400px +
auto 边距会把壳压成居中单列,蒙版随之只覆盖一列。 */
.aksrt-modal-runtime.modal-mini,
.aksrt-modal-runtime.full-sm {
width: auto;
max-width: none;
margin: 0;
}
/* ---- modal runtime shell ---- */
.aksrt-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;
}
.aksrt-modal-runtime.is-open {
opacity: 1;
visibility: visible;
pointer-events: auto;
}
.aksrt-modal-runtime__overlay {
position: absolute;
inset: 0;
/* 参考主题 .modal-backdrop 同款:纯黑 50%,无模糊、无色调偏移 */
background: rgba(0, 0, 0, 0.5);
}
.aksrt-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);
}
.aksrt-modal-runtime.is-open .aksrt-modal-runtime__dialog {
transform: translateY(0) scale(1);
}
.aksrt-modal-runtime--bottom {
align-items: flex-end;
}
.aksrt-modal-runtime--bottom .aksrt-modal-runtime__dialog {
width: 100%;
max-width: 100%;
border-radius: 16px 16px 0 0;
max-height: 90vh;
transform: translateY(24px);
}
.aksrt-modal-runtime--bottom.is-open .aksrt-modal-runtime__dialog {
transform: translateY(0);
}
.aksrt-modal-runtime__header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 16px 18px 0;
}
.aksrt-modal-runtime__title {
margin: 0;
font-size: 17px;
line-height: 1.35;
}
.aksrt-modal-runtime__content {
padding: 18px 18px 16px;
}
.aksrt-modal-runtime__loading,
.aksrt-modal-runtime__error-body {
padding: 28px 8px;
text-align: center;
color: var(--color-ink-2, #6b7280);
font-size: 14px;
}
.aksrt-modal-runtime__skeleton {
display: grid;
gap: 12px;
padding: 8px 2px;
}
.aksrt-modal-runtime__skeleton-line,
.aksrt-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: aksrt-modal-skeleton 1.2s ease-in-out infinite;
}
.aksrt-modal-runtime__skeleton-line {
width: 72%;
height: 12px;
}
.aksrt-modal-runtime__skeleton-line.is-wide {
width: 92%;
height: 18px;
}
.aksrt-modal-runtime__skeleton-line.is-short {
width: 44%;
}
.aksrt-modal-runtime__skeleton-block {
width: 100%;
min-height: 84px;
}
.aksrt-modal-runtime__retry {
cursor: pointer;
}
@keyframes aksrt-modal-skeleton {
0% { background-position: 100% 0; }
100% { background-position: -100% 0; }
}
.aksrt-modal-runtime .touch.border-title,
.aksrt-modal-runtime .border-title {
font-size: 16px;
font-weight: 700;
margin: 0 0 14px;
display: flex;
align-items: baseline;
flex-wrap: wrap;
gap: 6px;
}
.aksrt-modal-runtime .aksrt-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;
}
.aksrt-modal-runtime .but-average.modal-buts,
.aksrt-modal-runtime .modal-buts {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
margin-top: 16px;
}
.aksrt-modal-runtime .but-average.modal-buts .but,
.aksrt-modal-runtime .modal-buts .but,
.aksrt-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;
}
.aksrt-modal-runtime .modal-buts .but.c-blue,
.aksrt-modal-runtime .modal-buts button.c-blue,
.aksrt-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)。 */
.aksrt-modal-runtime.aksrt-checkin-details-modal:not(.aksrt-modal-runtime--bottom) .aksrt-modal-runtime__dialog {
width: min(400px, calc(100vw - 32px));
border-radius: var(--main-radius, 8px);
background: var(--main-bg-color, #fff);
}
.aksrt-modal-runtime.aksrt-checkin-details-modal .aksrt-modal-runtime__content {
padding: 0;
}
.aksrt-modal-runtime.aksrt-checkin-details-modal .aksrt-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: aksrtFadeIn 0.2s ease both;
}
.ajax-item.is-fading {
opacity: 0.35;
transition: opacity 0.15s ease;
}
/* ---- 举报弹窗(参考主题报告弹窗几何 1:1)----
宽度对齐参考主题 Bootstrap 默认模态(>=768px 600px),圆角/底色走
--main-radius / --main-bg-color;移动端仍由 --bottom 底部抽屉接管。 */
.aksrt-report-modal:not(.aksrt-modal-runtime--bottom) .aksrt-modal-runtime__dialog {
width: min(600px, calc(100vw - 32px));
border-radius: var(--main-radius, 8px);
background: var(--main-bg-color, #fff);
}
/* edit-header:参考主题弹窗头(关闭钮靠右,红色警示徽标 + 标题居左)。 */
.aksrt-report-modal .edit-header {
position: relative;
padding-right: 32px;
}
.aksrt-report-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;
}
/* 原因徽章行:与参考主题一致,徽章可换行且间距走 mr6/mb6 工具类。 */
.aksrt-report-modal .form-but-radio .badg {
cursor: pointer;
user-select: none;
}
/* ---- 禁封用户弹窗(参考主题 set_user_ban 模态框几何 1:1)----
参考主题 zib_get_edit_user_ban_link 未传 data-class → 走 Bootstrap 默认
.modal-dialog(>=768px 宽 600px);data-height=360 → .modal-content 初始
高度 360 后动画至内容高度;mobile-bottom → <769px 底部抽屉。
此处以 min-height:360px 复刻初始高度契约,桌面宽取 600px。 */
.aksrt-user-ban-modal:not(.aksrt-modal-runtime--bottom) .aksrt-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。 */
.aksrt-user-ban-info-modal:not(.aksrt-modal-runtime--bottom) .aksrt-modal-runtime__dialog,
.aksrt-user-ban-appeal-modal:not(.aksrt-modal-runtime--bottom) .aksrt-modal-runtime__dialog,
.aksrt-user-ban-log-modal:not(.aksrt-modal-runtime--bottom) .aksrt-modal-runtime__dialog {
width: min(400px, calc(100vw - 32px));
border-radius: var(--main-radius, 8px);
background: var(--main-bg-color, #fff);
}
.aksrt-user-ban-info-modal .aksrt-modal-runtime__skeleton,
.aksrt-user-ban-appeal-modal .aksrt-modal-runtime__skeleton,
.aksrt-user-ban-log-modal .aksrt-modal-runtime__skeleton {
padding: 24px 18px;
}
.aksrt-user-ban-modal .aksrt-modal-runtime__skeleton {
padding: 24px 18px;
}
/* edit-header:与禁封表单头部同构(关闭钮靠右,红色警示徽标 + 标题居左)。 */
.aksrt-user-ban-modal .edit-header,
.aksrt-user-ban-appeal-modal .edit-header {
position: relative;
padding-right: 32px;
}
.aksrt-user-ban-modal .edit-header .close,
.aksrt-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;
}
/* 解封视图多彩横幅(参考主题 zib_get_modal_colorful_header('c-yellow', ...)):
120px 高绝对定位横幅 + 旋转彩斑,后续表单整体下移 120px。 */
.aksrt-user-ban-modal .modal-colorful-header,
.aksrt-user-ban-modal .colorful-bg,
.aksrt-user-ban-info-modal .modal-colorful-header,
.aksrt-user-ban-info-modal .colorful-bg,
.aksrt-user-ban-log-modal .modal-colorful-header,
.aksrt-user-ban-log-modal .colorful-bg {
position: relative;
overflow: hidden;
color: var(--this-color);
background: var(--this-bg);
background-size: 120%;
}
.aksrt-user-ban-modal .modal-colorful-header,
.aksrt-user-ban-info-modal .modal-colorful-header,
.aksrt-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;
}
.aksrt-user-ban-modal .modal-colorful-header + *,
.aksrt-user-ban-info-modal .modal-colorful-header + *,
.aksrt-user-ban-log-modal .modal-colorful-header + * {
margin-top: 120px;
}
.aksrt-user-ban-modal .modal-colorful-header > .close,
.aksrt-user-ban-info-modal .modal-colorful-header > .close,
.aksrt-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;
}
.aksrt-user-ban-modal .colorful-bg > .colorful-make,
.aksrt-user-ban-modal .colorful-bg > .colorful-make::before,
.aksrt-user-ban-modal .colorful-bg > .colorful-make::after,
.aksrt-user-ban-info-modal .colorful-bg > .colorful-make,
.aksrt-user-ban-info-modal .colorful-bg > .colorful-make::before,
.aksrt-user-ban-info-modal .colorful-bg > .colorful-make::after,
.aksrt-user-ban-log-modal .colorful-bg > .colorful-make,
.aksrt-user-ban-log-modal .colorful-bg > .colorful-make::before,
.aksrt-user-ban-log-modal .colorful-bg > .colorful-make::after {
position: absolute;
color: var(--this-color);
background: var(--this-bg);
border-radius: 100%;
content: '';
}
.aksrt-user-ban-modal .colorful-bg > .colorful-make,
.aksrt-user-ban-info-modal .colorful-bg > .colorful-make,
.aksrt-user-ban-log-modal .colorful-bg > .colorful-make {
top: 60%;
bottom: 0;
width: 323px;
height: 290px;
animation: aksrt-ban-colorful 120s linear infinite;
}
.aksrt-user-ban-modal .colorful-bg > .colorful-make::before,
.aksrt-user-ban-info-modal .colorful-bg > .colorful-make::before,
.aksrt-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);
}
.aksrt-user-ban-modal .colorful-bg > .colorful-make::after,
.aksrt-user-ban-info-modal .colorful-bg > .colorful-make::after,
.aksrt-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);
}
.aksrt-user-ban-modal .colorful-bg > .colorful-make + *,
.aksrt-user-ban-info-modal .colorful-bg > .colorful-make + *,
.aksrt-user-ban-log-modal .colorful-bg > .colorful-make + * {
position: relative;
}
/* 单选徽章行(参考主题 .form-but-radio 契约):input 由 main.css 隐藏,
label 可点;选中态由 main.css 的 input:checked + .but-radio 驱动。 */
.aksrt-user-ban-modal .form-but-radio label {
cursor: pointer;
}
.aksrt-user-ban-modal .form-but-radio .but-radio {
user-select: none;
}
/* 开关行(删除全部内容 / 禁止用户申诉):原生 checkbox 隐藏,
视觉态由 main.css 的 input:checked ~ .form-switch 驱动。 */
.aksrt-user-ban-modal .aksrt-user-ban-form label {
user-select: none;
}
@keyframes aksrt-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);
}
:is(.order-comment-from, .aksrt-report-modal, .aksrt-after-sale-apply-modal) .form-upload .preview {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
:is(.order-comment-from, .aksrt-report-modal) .form-upload .preview .add,
:is(.order-comment-from, .aksrt-report-modal, .aksrt-after-sale-apply-modal) .form-upload .preview .add,
:is(.order-comment-from, .aksrt-report-modal, .aksrt-after-sale-apply-modal) .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”形,故整体删除、统一走主样式包。 */
:is(.order-comment-from, .aksrt-report-modal, .aksrt-after-sale-apply-modal) .form-upload .preview .preview-item img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
:is(.order-comment-from, .aksrt-report-modal, .aksrt-after-sale-apply-modal) .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;
}
:is(.order-comment-from, .aksrt-report-modal, .aksrt-after-sale-apply-modal) .form-upload .hide {
display: none !important;
}
.order-comment-from .review-error {
color: #ef4444;
font-size: 13px;
margin-top: 8px;
}
@media (max-width: 768px) {
.aksrt-modal-runtime:not(.aksrt-modal-runtime--bottom) .aksrt-modal-runtime__dialog {
width: calc(100vw - 20px);
}
}
/* ---- 售后弹窗(申请 / 售后详细 / 超时效提示,参考主题 modal-mini 几何 1:1)----
三个弹窗与禁封申诉弹窗同几何:data_class='modal-mini'(宽 400px),圆角与
底色走 --main-radius / --main-bg-color;移动端由 --bottom 底部抽屉接管。 */
.aksrt-after-sale-apply-modal:not(.aksrt-modal-runtime--bottom) .aksrt-modal-runtime__dialog,
.aksrt-after-sale-detail-modal:not(.aksrt-modal-runtime--bottom) .aksrt-modal-runtime__dialog,
.aksrt-after-sale-expired-modal:not(.aksrt-modal-runtime--bottom) .aksrt-modal-runtime__dialog,
.aksrt-after-sale-withdraw-modal:not(.aksrt-modal-runtime--bottom) .aksrt-modal-runtime__dialog {
width: min(400px, calc(100vw - 32px));
border-radius: var(--main-radius, 8px);
background: var(--main-bg-color, #fff);
}
.aksrt-after-sale-apply-modal .aksrt-modal-runtime__skeleton,
.aksrt-after-sale-detail-modal .aksrt-modal-runtime__skeleton,
.aksrt-after-sale-expired-modal .aksrt-modal-runtime__skeleton,
.aksrt-after-sale-withdraw-modal .aksrt-modal-runtime__skeleton {
padding: 24px 18px;
}
/* 蓝色炫彩标题区(参考主题 zib_get_modal_colorful_header('jb-blue', ...)):120px
绝对定位横幅 + 旋转彩斑,后续内容整体下移 120px,与禁封记录弹窗同构。 */
.aksrt-after-sale-apply-modal .modal-colorful-header,
.aksrt-after-sale-detail-modal .modal-colorful-header,
.aksrt-after-sale-expired-modal .modal-colorful-header,
.aksrt-after-sale-withdraw-modal .modal-colorful-header,
.aksrt-order-detail-modal .modal-colorful-header,
.aksrt-after-sale-apply-modal .colorful-bg,
.aksrt-after-sale-detail-modal .colorful-bg,
.aksrt-after-sale-expired-modal .colorful-bg,
.aksrt-after-sale-withdraw-modal .colorful-bg,
.aksrt-order-detail-modal .colorful-bg {
position: relative;
overflow: hidden;
color: var(--this-color);
background: var(--this-bg);
background-size: 120%;
}
.aksrt-after-sale-apply-modal .modal-colorful-header,
.aksrt-after-sale-detail-modal .modal-colorful-header,
.aksrt-after-sale-expired-modal .modal-colorful-header,
.aksrt-after-sale-withdraw-modal .modal-colorful-header,
.aksrt-order-detail-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;
}
.aksrt-after-sale-apply-modal .modal-colorful-header + *,
.aksrt-after-sale-detail-modal .modal-colorful-header + *,
.aksrt-after-sale-expired-modal .modal-colorful-header + *,
.aksrt-after-sale-withdraw-modal .modal-colorful-header + *,
.aksrt-order-detail-modal .modal-colorful-header + * {
margin-top: 120px;
}
.aksrt-after-sale-apply-modal .modal-colorful-header > .close,
.aksrt-after-sale-detail-modal .modal-colorful-header > .close,
.aksrt-after-sale-expired-modal .modal-colorful-header > .close,
.aksrt-after-sale-withdraw-modal .modal-colorful-header > .close,
.aksrt-order-detail-modal .modal-colorful-header > .close {
position: absolute;
top: 10px;
right: 10px;
z-index: 9;
color: var(--this-color);
font-size: 18px;
opacity: 0.6;
}
.aksrt-after-sale-apply-modal .colorful-bg > .colorful-make,
.aksrt-after-sale-apply-modal .colorful-bg > .colorful-make::before,
.aksrt-after-sale-apply-modal .colorful-bg > .colorful-make::after,
.aksrt-after-sale-detail-modal .colorful-bg > .colorful-make,
.aksrt-after-sale-detail-modal .colorful-bg > .colorful-make::before,
.aksrt-after-sale-detail-modal .colorful-bg > .colorful-make::after,
.aksrt-after-sale-expired-modal .colorful-bg > .colorful-make,
.aksrt-after-sale-withdraw-modal .colorful-bg > .colorful-make,
.aksrt-order-detail-modal .colorful-bg > .colorful-make,
.aksrt-after-sale-expired-modal .colorful-bg > .colorful-make::before,
.aksrt-after-sale-withdraw-modal .colorful-bg > .colorful-make::before,
.aksrt-order-detail-modal .colorful-bg > .colorful-make::before,
.aksrt-after-sale-expired-modal .colorful-bg > .colorful-make::after,
.aksrt-after-sale-withdraw-modal .colorful-bg > .colorful-make::after,
.aksrt-order-detail-modal .colorful-bg > .colorful-make::after {
position: absolute;
color: var(--this-color);
background: var(--this-bg);
border-radius: 100%;
content: '';
}
.aksrt-after-sale-apply-modal .colorful-bg > .colorful-make,
.aksrt-after-sale-detail-modal .colorful-bg > .colorful-make,
.aksrt-after-sale-expired-modal .colorful-bg > .colorful-make,
.aksrt-after-sale-withdraw-modal .colorful-bg > .colorful-make,
.aksrt-order-detail-modal .colorful-bg > .colorful-make {
top: 60%;
bottom: 0;
width: 323px;
height: 290px;
animation: aksrt-ban-colorful 120s linear infinite;
}
.aksrt-after-sale-apply-modal .colorful-bg > .colorful-make::before,
.aksrt-after-sale-detail-modal .colorful-bg > .colorful-make::before,
.aksrt-after-sale-expired-modal .colorful-bg > .colorful-make::before,
.aksrt-after-sale-withdraw-modal .colorful-bg > .colorful-make::before,
.aksrt-order-detail-modal .colorful-bg > .colorful-make::before {
top: -325px;
right: -558px;
bottom: 0;
width: 677px;
height: 300px;
opacity: 0.6;
transform: rotate(341deg);
}
.aksrt-after-sale-apply-modal .colorful-bg > .colorful-make::after,
.aksrt-after-sale-detail-modal .colorful-bg > .colorful-make::after,
.aksrt-after-sale-expired-modal .colorful-bg > .colorful-make::after,
.aksrt-after-sale-withdraw-modal .colorful-bg > .colorful-make::after,
.aksrt-order-detail-modal .colorful-bg > .colorful-make::after {
top: -170px;
bottom: 0;
left: -262px;
width: 402px;
height: 214px;
opacity: 0.4;
transform: rotate(326deg);
}
/* 售后原因徽章:与举报弹窗一致,可换行且间距走 mr6/mb6 工具类。 */
.aksrt-after-sale-apply-modal .form-but-radio .badg {
cursor: pointer;
user-select: none;
}
/* 订单摘要与售后明细行 */
.aksrt-after-sale-summary__row,
.aksrt-after-sale-detail__row {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 12px;
margin-bottom: 6px;
}
.aksrt-after-sale-summary__row:last-child,
.aksrt-after-sale-detail__row:last-child {
margin-bottom: 0;
}
.aksrt-after-sale-summary__value,
.aksrt-after-sale-detail__value {
min-width: 0;
text-align: right;
word-break: break-all;
}
.aksrt-after-sale-detail__statusRow {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 10px;
}
.aksrt-after-sale-reason-text {
color: var(--color-ink-2, #4e5358);
background: var(--surface-2, #eee);
border-radius: 6px;
padding: 10px 12px;
}
.aksrt-after-sale-images {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.aksrt-after-sale-images img {
width: 72px;
height: 72px;
object-fit: cover;
border-radius: 6px;
border: 1px solid var(--color-line, #e5e7eb);
display: block;
}
.aksrt-after-sale-status.is-pending { color: var(--color-warning, #f59e0b); }
.aksrt-after-sale-status.is-processing { color: var(--color-info, #3b82f6); }
.aksrt-after-sale-status.is-approved,
.aksrt-after-sale-status.is-completed { color: var(--color-success, #10b981); }
.aksrt-after-sale-status.is-rejected,
.aksrt-after-sale-status.is-cancelled { color: var(--color-error, #ef4444); }
/* 售后处理记录时间线:[节点][处理状态][时间] 一行,处理备注另起一行并对齐状态文字。
售后详细弹窗与订单详情弹窗的「售后记录」共用同一套标记;竖线为条目的
::before,末项不收口,避免出现悬空的线段。 */
.aksrt-after-sale-log { display: grid; gap: 6px; }
.aksrt-after-sale-log__empty { color: var(--modal-muted); font-size: 12px; }
.aksrt-after-sale-timeline { display: grid; margin: 0; padding: 0; list-style: none; }
.aksrt-after-sale-timeline__item { --as-accent: var(--modal-muted); position: relative; display: grid; grid-template-columns: 10px minmax(0, 1fr); gap: 10px; padding: 0 0 14px; }
.aksrt-after-sale-timeline__item:last-child { padding-bottom: 0; }
.aksrt-after-sale-timeline__item.is-pending { --as-accent: var(--modal-warning); }
.aksrt-after-sale-timeline__item.is-processing { --as-accent: var(--modal-primary); }
.aksrt-after-sale-timeline__item.is-completed { --as-accent: var(--modal-success); }
.aksrt-after-sale-timeline__item.is-rejected,
.aksrt-after-sale-timeline__item.is-cancelled { --as-accent: var(--modal-danger, #ef4444); }
.aksrt-after-sale-timeline__item::before { content: ""; position: absolute; top: 14px; bottom: -2px; left: 4px; width: 2px; border-radius: 1px; background: color-mix(in srgb, var(--as-accent) 30%, var(--modal-line)); }
.aksrt-after-sale-timeline__item:last-child::before { display: none; }
.aksrt-after-sale-timeline__knot { position: relative; z-index: 1; width: 10px; height: 10px; margin-top: 4px; border: 2px solid var(--as-accent); border-radius: 50%; background: var(--modal-surface, #fff); }
.aksrt-after-sale-timeline__body { display: grid; gap: 3px; min-width: 0; }
.aksrt-after-sale-timeline__head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px; }
.aksrt-after-sale-timeline__status { color: var(--as-accent); font-size: 12px; font-weight: 700; line-height: 1.5; }
.aksrt-after-sale-timeline__time { color: var(--modal-muted); font-size: 11px; line-height: 1.5; font-variant-numeric: tabular-nums; }
.aksrt-after-sale-timeline__note { margin: 0; color: var(--modal-ink); font-size: 12.5px; line-height: 1.65; word-break: break-word; }
/* 状态行右侧单元格:状态徽章 + 「撤销售后」入口(仅待审核工单渲染)。 */
.aksrt-after-sale-detail__statusCell { display: inline-flex; align-items: center; gap: 10px; }
.aksrt-after-sale-withdraw { display: inline-flex; align-items: center; gap: 3px; padding: 0; border: 0; background: transparent; color: var(--modal-danger, #ef4444); font-size: 12px; font-weight: 600; line-height: 1.4; cursor: pointer; transition: color .15s ease; }
.aksrt-after-sale-withdraw .fa { font-size: 12px; }
.aksrt-after-sale-withdraw:hover { color: color-mix(in srgb, var(--modal-danger) 78%, var(--modal-ink)); }
/* 售后提示弹窗(撤销售后确认)正文。 */
.aksrt-after-sale-withdraw__body { margin-bottom: 16px; color: var(--color-ink-2, #4e5358); line-height: 1.7; }
/* 售后弹窗底部按钮:全宽平铺贴底(负 margin 抵消 __content 内边距)+ 分隔线,
子按钮去独立背景/边框/圆角(文字色区分主次),覆盖上方全局按钮网格的胶囊观感;
仅在售后弹窗家族生效,其他 runtime 弹窗仍走全局网格样式。
footer 自身不留垂直内边距——上下 12px 并入按钮(min-height 62 = 12+38+12),
按钮盒即整个底部区域(hover 底色/分界线随之满幅)。 */
.aksrt-after-sale-apply-modal .but-average.modal-buts,
.aksrt-after-sale-detail-modal .but-average.modal-buts,
.aksrt-after-sale-expired-modal .but-average.modal-buts,
.aksrt-after-sale-withdraw-modal .but-average.modal-buts {
gap: 0;
margin: 16px -18px -16px;
padding: 0;
border-top: 1px solid var(--modal-line-soft, rgba(50, 50, 50, 0.06));
background: var(--main-bg-color, #fff);
}
.aksrt-after-sale-apply-modal .but-average.modal-buts > .but,
.aksrt-after-sale-detail-modal .but-average.modal-buts > .but,
.aksrt-after-sale-expired-modal .but-average.modal-buts > .but,
.aksrt-after-sale-withdraw-modal .but-average.modal-buts > .but {
min-height: 62px;
border: 0;
border-radius: 0;
box-shadow: none;
background: transparent;
color: var(--modal-muted, #777);
font-weight: 600;
cursor: pointer;
--this-bg: transparent;
--this-border: transparent;
--this-shadow: none;
}
.aksrt-after-sale-apply-modal .but-average.modal-buts > .but.c-blue,
.aksrt-after-sale-detail-modal .but-average.modal-buts > .but.c-blue,
.aksrt-after-sale-expired-modal .but-average.modal-buts > .but.c-blue,
.aksrt-after-sale-withdraw-modal .but-average.modal-buts > .but.c-blue {
background: transparent;
border: 0;
color: var(--modal-primary, #f04494);
}
/* 相邻按钮分界线:legacy footer 自带 .but + .but 左分隔线,上方平铺规则的 border:0
会把它抹掉,这里按家族分隔色还原(单按钮无相邻兄弟,天然无分界线)。
需排在 .c-blue 规则之后:确认提交等主按钮同受 border:0 影响,后者同名优先级。 */
.aksrt-after-sale-apply-modal .but-average.modal-buts > .but + .but,
.aksrt-after-sale-detail-modal .but-average.modal-buts > .but + .but,
.aksrt-after-sale-expired-modal .but-average.modal-buts > .but + .but,
.aksrt-after-sale-withdraw-modal .but-average.modal-buts > .but + .but {
border-left: 1px solid var(--modal-line-soft, rgba(50, 50, 50, 0.06));
}
/* 悬停反馈(参考 Element 卡片 footer 的 hover 语言):整块区域浅灰底 + 文字转主色,
次级按钮 hover 升为主色、主按钮略加深;平铺按钮已满幅,底色即铺满整个区域,
基础 .but 的 0.15s 过渡自动生效,并压掉 compat 层的 hover 半透明。 */
.aksrt-after-sale-apply-modal .but-average.modal-buts > .but:hover,
.aksrt-after-sale-detail-modal .but-average.modal-buts > .but:hover,
.aksrt-after-sale-expired-modal .but-average.modal-buts > .but:hover,
.aksrt-after-sale-withdraw-modal .but-average.modal-buts > .but:hover {
opacity: 1;
background: color-mix(in srgb, var(--modal-ink, #333333) 5%, transparent);
color: var(--modal-primary, #f04494);
}
.aksrt-after-sale-apply-modal .but-average.modal-buts > .but.c-blue:hover,
.aksrt-after-sale-detail-modal .but-average.modal-buts > .but.c-blue:hover,
.aksrt-after-sale-expired-modal .but-average.modal-buts > .but.c-blue:hover,
.aksrt-after-sale-withdraw-modal .but-average.modal-buts > .but.c-blue:hover {
color: color-mix(in srgb, var(--modal-primary, #f04494) 82%, #000000);
}
/* 单按钮 footer 占满整行(全局网格是 1fr 1fr,单按钮会只占一半)。 */
.aksrt-after-sale-apply-modal .but-average.modal-buts > .but:only-child,
.aksrt-after-sale-detail-modal .but-average.modal-buts > .but:only-child,
.aksrt-after-sale-expired-modal .but-average.modal-buts > .but:only-child,
.aksrt-after-sale-withdraw-modal .but-average.modal-buts > .but:only-child { grid-column: 1 / -1; }
/* source: assets/css/frontend/notyf.css */
/**
* legacy-compatible frontend notifications.
*
* @package AKSRT
*/
.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 */
/**
* AKSRT Captcha Styles
* 人机验证组件样式(从 functions.php 内联 CSS 抽取)
*
* @package AKSRT
*/
.aksrt-captcha-box{display:none}.aksrt-captcha-wrap{text-align:center}
/* Cloudflare Turnstile Modal */
.aksrt-captcha-modal-overlay{position:fixed;inset:0;z-index:99999;display:flex;align-items:center;justify-content:center}
.aksrt-captcha-modal-backdrop{position:absolute;inset:0;background:rgba(0,0,0,.55);animation:aksrtFadeIn .2s ease}
.aksrt-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:aksrtSlideUp .25s ease;overflow:hidden}
.aksrt-captcha-modal-header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--color-line,#e5e7eb)}
.aksrt-captcha-modal-title{font-size:15px;font-weight:600;color:var(--color-ink,#1f2937)}
.aksrt-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}.aksrt-captcha-modal-close:hover{background:var(--color-bg-hover,#f3f4f6);color:var(--color-ink,#1f2937)}
.aksrt-captcha-modal-body{padding:20px}
.aksrt-captcha-modal-hint{font-size:13px;color:var(--color-ink-4,#9ca3af);margin:0 0 16px;text-align:center}
.aksrt-captcha-modal-widget{display:flex;justify-content:center}
@keyframes aksrtFadeIn{from{opacity:0}to{opacity:1}}
@keyframes aksrtSlideUp{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}
/* source: assets/css/frontend/single-post/rewards.css */
/* ---- 文章打赏:内容使用 AksrtModalRuntime,几何对齐参考主题 modal-mini ---- */
.aksrt-modal-runtime.aksrt-reward-modal:not(.aksrt-modal-runtime--bottom) .aksrt-modal-runtime__dialog {
width: min(400px, calc(100vw - 32px));
border-radius: var(--main-radius, 8px);
background: var(--main-bg-color, #fff);
}
.aksrt-modal-runtime.aksrt-reward-modal .aksrt-modal-runtime__content {
padding: 0;
}
.aksrt-reward-modal .modal-colorful-header + .aksrt-reward__body {
margin-top: 0;
padding: 135px 15px 15px;
color: var(--main-color, var(--color-ink, #333));
}
.aksrt-reward__desc {
margin: 0 0 16px;
text-align: center;
}
.aksrt-modal-runtime.aksrt-reward-modal .aksrt-reward__amounts {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 8px;
margin: 16px 0;
}
.aksrt-modal-runtime.aksrt-reward-modal .aksrt-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;
}
.aksrt-modal-runtime.aksrt-reward-modal .aksrt-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);
}
.aksrt-modal-runtime.aksrt-reward-modal .aksrt-reward__amount:focus-visible {
outline: 0;
box-shadow: 0 0 0 3px var(--color-primary-soft, rgba(240, 68, 148, 0.2));
}
.aksrt-modal-runtime.aksrt-reward-modal .aksrt-reward__amount.is-active,
.aksrt-modal-runtime.aksrt-reward-modal .aksrt-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;
}
.aksrt-reward__currency {
font-size: 13px;
font-weight: 400;
}
.aksrt-reward__value {
font-size: 15px;
}
.aksrt-modal-runtime.aksrt-reward-modal .aksrt-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;
}
.aksrt-reward__custom-label {
flex: 0 0 auto;
}
.aksrt-modal-runtime.aksrt-reward-modal .aksrt-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;
}
.aksrt-modal-runtime.aksrt-reward-modal .aksrt-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));
}
.aksrt-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;
}
.aksrt-modal-runtime.aksrt-reward-modal .aksrt-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;
}
.aksrt-reward__input::-webkit-inner-spin-button,
.aksrt-reward__input::-webkit-outer-spin-button {
margin: 0;
-webkit-appearance: none;
}
.aksrt-reward__input::placeholder {
color: var(--muted-color, var(--color-ink-4, #999));
opacity: 1;
}
.aksrt-reward__input:disabled,
.aksrt-reward__amount:disabled {
cursor: wait;
opacity: 0.6;
}
.aksrt-reward__submit {
min-height: 42px;
}
.aksrt-reward__submit:disabled {
cursor: wait;
opacity: 0.7;
}
.aksrt-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;
}
.aksrt-reward__captcha {
margin: 0 0 14px;
}
.aksrt-modal-runtime--bottom.aksrt-reward-modal .aksrt-modal-runtime__dialog {
border-radius: 16px 16px 0 0;
}
.aksrt-modal-runtime--bottom.aksrt-reward-modal .modal-colorful-header {
border-radius: 16px 16px 0 0;
}