/* 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; /* ===== Skeleton loader ===== */ --skeleton-base: var(--surface-2); --skeleton-shine: var(--surface-1); /* ===== 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); --skeleton-base: #3a3b3e; --skeleton-shine: #444548; /* 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 { 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; } /* 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) * 保持原生 可访问性 * ============================================================ */ .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) * 保持原生 可访问性 * ============================================================ */ .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); } /* ============================================================ * 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; } } .nowave { overflow: hidden; } /* ============================================================ * 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-vip-badge, .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-vip-badge__icon { display: block; width: auto; height: 1.1em; max-width: 6em; object-fit: contain; } .aksrt-vip-badge > i { font-size: .9em; line-height: 1; } .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; } .aksrt-vip-badge--sm { height: 1.1em; padding: 0; font-size: inherit; } /* No-wrap inline name rows — keep the level icon on the same line as the name. * The non-standard 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 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 { 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. This module * owns AKSRT-specific account content such as check-in, wallet and VIP rows. */ /* The desktop action cluster owns one horizontal alignment context. */ .navbar-top .aksrt-navbar-actions { display: flex; align-items: center; gap: 10px; min-height: 50px; margin-top: 0; margin-bottom: 0; padding: 0; } .navbar-top .aksrt-navbar-actions > *, .navbar-top .aksrt-navbar-account, .navbar-top .aksrt-navbar-account > li { display: inline-flex; align-items: center; flex: 0 0 auto; } .navbar-top .aksrt-navbar-account > li { position: relative; 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-navbar-account { gap: 4px; min-height: 50px; margin: 0; } .navbar-top .aksrt-navbar-account.navbar-text { float: none; } .navbar-top .aksrt-navbar-actions .navbar-cta { display: inline-flex; align-items: center; justify-content: center; gap: 4px; min-height: 29px; margin: 0; padding: .3em 1em !important; border-radius: var(--radius-btn, 4px); font-size: .8em; line-height: 1.44; } .navbar-top .aksrt-navbar-actions .navbar-cta.radius { border-radius: 50px; } .navbar-top .aksrt-navbar-actions .navbar-cta > .icon { width: 1.2em; height: 1.2em; flex: 0 0 auto; } .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 .aksrt-navbar-actions .toggle-radius { flex: 0 0 29px; margin: 0; vertical-align: middle; } .navbar-top .aksrt-navbar-language { margin: 0; } /* Anchor the VIP preview to the full navigation row instead of relying on * the absolute panel's static position beside the compact CTA. */ .navbar-top .aksrt-navbar-actions .navbar-vip-hover { position: relative; align-self: stretch; align-items: center; overflow: visible; } .navbar-top .aksrt-navbar-actions .navbar-vip-hover > .sub-vip-card { top: 100%; right: 0; left: auto; width: max-content; max-width: calc(100vw - 24px); margin: 0; z-index: 1002; } /* 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 { width: 260px; color: var(--color-ink-2); } .aksrt-header-userbox .user-info { min-height: 44px; padding: 2px; } .aksrt-header-userbox .user-info > .avatar { flex: 0 0 44px; width: 44px; height: 44px; object-fit: cover; } .aksrt-header-userbox .user-right, .aksrt-header-userbox .user-right > .flex1 { min-width: 0; } .aksrt-header-userbox .user-right b { display: flex; align-items: center; gap: 4px; max-width: 100%; overflow: hidden; white-space: nowrap; } .aksrt-header-userbox .display-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .aksrt-header-userbox .user-right .aksrt-vip-badge, .aksrt-header-userbox .user-right .aksrt-user-level-icon, .aksrt-header-userbox .user-right .aksrt-identity-medal, .aksrt-header-userbox .user-right .aksrt-header-user-medal, .aksrt-header-userbox .user-right .aksrt-identity-certification-icon { flex: 0 0 auto; height: 1.1em; } .aksrt-header-userbox .user-info > .abs-right { top: 50%; right: 2px; transform: translateY(-50%); display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; border-radius: 50%; background: var(--surface-2); color: var(--color-ink-3); } .aksrt-header-userbox .aksrt-notification-badge { position: absolute; top: -4px; right: -4px; display: inline-flex; align-items: center; justify-content: center; min-width: 17px; height: 17px; padding: 0 4px; border: 2px solid var(--surface-1); border-radius: 999px; background: #e74c3c; color: #fff; font-size: 10px; font-weight: 700; line-height: 1; } .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; } .aksrt-header-wallet { display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%; padding: 9px 10px; border-radius: 8px; background: var(--surface-2); color: var(--color-ink-2); font-size: 12px; line-height: 1.35; } .aksrt-header-wallet:hover { color: var(--color-ink); } .aksrt-header-wallet__item { min-width: 0; white-space: nowrap; } .aksrt-header-wallet__item i { margin-right: 2px; color: var(--color-ink-3); } .aksrt-header-wallet__item b { margin-left: 2px; color: var(--color-ink); font-weight: 700; } .aksrt-header-checkin { display: inline-flex !important; align-items: center; justify-content: center; gap: 6px; width: 100% !important; min-height: 36px; margin: 0; padding: 8px 10px !important; border: 0 !important; border-radius: 6px !important; background: #fff6db !important; color: #8a5a00 !important; font-size: 13px !important; font-weight: 600; line-height: 1.3; white-space: nowrap; } .aksrt-header-checkin > i { margin: 0 !important; color: #b78103 !important; } .aksrt-header-checkin:hover { background: #fff0c2 !important; color: #8a5a00 !important; } /* 已签到态对齐参考主题:保留原配色(参考主题签到后仍为同一彩色按钮), * 且按钮可点击(打开签到详情弹窗);仅请求进行中的禁用态降不透明度。 */ .aksrt-header-checkin:disabled, .aksrt-header-checkin:disabled:hover { cursor: default; opacity: .85; } .aksrt-header-payvip__cta, .aksrt-header-payvip:not(.is-vip) .payvip-icon, .aksrt-header-payvip:not(.is-vip) .but { display: inline-flex !important; align-items: center !important; justify-content: center !important; gap: 6px !important; width: 100% !important; min-width: 0 !important; min-height: 36px; margin: 0 !important; padding: 8px 10px !important; border: 0 !important; border-radius: 6px !important; background: linear-gradient(90deg, #ff6b6b, #f04494) !important; color: #fff !important; font-size: 13px !important; font-weight: 600; line-height: 1.3; text-align: center; white-space: nowrap; } .aksrt-header-payvip__cta > i, .aksrt-header-payvip:not(.is-vip) .payvip-icon > i, .aksrt-header-payvip:not(.is-vip) .but > i { margin: 0 !important; color: inherit !important; } .aksrt-header-payvip__cta:hover { color: #fff !important; opacity: .92; } .aksrt-header-payvip__active { display: flex; flex-direction: row; align-items: center; justify-content: center; gap: 8px !important; width: 100%; min-height: 42px; padding: 7px 10px !important; white-space: nowrap; } .aksrt-header-payvip__level { display: inline-flex; align-items: center; justify-content: center; gap: 6px; } .aksrt-header-payvip__level > i { margin: 0 !important; } .aksrt-header-payvip__exp { display: inline; margin: 0; padding: 0; border: 0; background: none !important; box-shadow: none; color: inherit; font-size: .85em; font-weight: 400; line-height: 1.3; opacity: .9; white-space: nowrap; } /* Navigation links are globally capped at 50px. Account actions are taller * icon tiles and must opt out or their labels overlap the following row. */ .navbar-top .aksrt-header-userbox .header-user-href { align-items: flex-start; gap: 4px; } .navbar-top .aksrt-header-userbox .header-user-href > a, .aksrt-header-userbox .header-user-href > a { display: flex; flex: 1 1 0; flex-direction: column; align-items: center; min-width: 0; max-height: none; padding: 10px 2px 2px; line-height: 1.35; } .aksrt-header-userbox .header-user-href > a:hover { opacity: .75; } .aksrt-header-userbox .header-user-href .toggle-radius { flex: 0 0 36px; width: 36px; height: 36px; } .aksrt-header-userbox .header-user-href > a > div:last-child { max-width: 100%; overflow: hidden; font-size: 12px; text-overflow: ellipsis; white-space: nowrap; } .mobile-navbar .aksrt-header-userbox { width: 100%; max-width: 400px; margin-right: auto; margin-left: auto; } body.dark-theme .aksrt-header-checkin { background: rgba(255, 193, 7, .18) !important; color: #f0c14b !important; } body.dark-theme .aksrt-header-checkin > i { color: #f0c14b !important; } body.dark-theme .aksrt-header-wallet { background: rgba(255, 255, 255, .06); } body.dark-theme .aksrt-header-wallet__item, body.dark-theme .aksrt-header-wallet__item b { color: inherit; } @media (max-width: 360px) { .aksrt-header-userbox .header-user-href { gap: 2px; } .aksrt-header-userbox .header-user-href .toggle-radius { flex-basis: 34px; width: 34px; height: 34px; } } /* 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 筛选加载状态 */ .archive__ajax-wrap { position: relative; transition: opacity 0.2s ease; } .archive__ajax-wrap.is-loading { opacity: 0.5; pointer-events: none; } .archive__ajax-loading { display: none; position: absolute; top: 0; left: 0; right: 0; bottom: 0; align-items: center; justify-content: center; z-index: 5; background: rgba(255, 255, 255, 0.6); backdrop-filter: blur(1px); } .archive__ajax-loading.is-loading { display: flex; } .archive__ajax-spinner { display: inline-block; width: 28px; height: 28px; border: 3px solid var(--surface-3, #e8e8e8); border-top-color: var(--color-primary, #f04494); border-radius: 50%; animation: aksrt-spin 0.6s linear infinite; } @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; } 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- 前缀避免冲突 */ @keyframes aksrt-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } /* ============================================================ * 1. 骨架屏加载动画 * ============================================================ */ .aksrt-skeleton { background: linear-gradient( 90deg, rgba(121, 121, 121, 0.08) 25%, rgba(121, 121, 121, 0.15) 37%, rgba(121, 121, 121, 0.08) 63% ); background-size: 400% 100%; animation: aksrt-skeleton-shimmer 1.5s ease infinite; border-radius: 4px; } .aksrt-skeleton--image { height: 0; padding-bottom: 66.67%; /* 3:2 aspect ratio */ } .aksrt-skeleton--avatar { width: 40px; height: 40px; border-radius: 50%; } .aksrt-skeleton--title { height: 22px; width: 80%; } .aksrt-skeleton--text { height: 16px; width: 100%; } .aksrt-skeleton--text-short { height: 16px; width: 60%; } .aksrt-skeleton--button { height: 36px; width: 100px; border-radius: 8px; } @keyframes aksrt-skeleton-shimmer { 0% { background-position: 100% 50%; } 100% { background-position: 0 50%; } } /* 骨架屏组合:文章卡片骨架 */ .aksrt-skeleton-card { background: var(--surface-1, #fff); border: 1px solid var(--color-line); border-radius: 12px; overflow: hidden; padding: 0; } .aksrt-skeleton-card .aksrt-skeleton--image { border-radius: 0; } .aksrt-skeleton-card__body { padding: 16px; display: flex; flex-direction: column; gap: 10px; } /* ============================================================ * 2. 悬停交互动效 * ============================================================ */ /* 卡片放大 */ .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; } /* ============================================================ * 8. 打赏按钮 * ============================================================ */ .action-btn--reward { position: relative; } .action-btn--reward.is-active { color: var(--color-warning, #F59E0B); } .reward-modal { position: fixed; inset: 0; z-index: 99999; display: flex; align-items: center; justify-content: center; opacity: 0; visibility: hidden; transition: opacity 0.3s, visibility 0.3s; } .reward-modal.is-open { opacity: 1; visibility: visible; } .reward-modal__overlay { position: absolute; inset: 0; background: rgba(0,0,0,0.5); } .reward-modal__card { position: relative; background: var(--surface-1, #fff); border-radius: var(--radius-lg, 8px); padding: 32px; max-width: 360px; width: 90%; text-align: center; box-shadow: 0 8px 32px rgba(0,0,0,0.15); z-index: 1; } .reward-modal__title { margin: 0 0 8px; font-size: 18px; font-weight: 600; color: var(--color-ink); } .reward-modal__desc { margin: 0 0 20px; font-size: 14px; color: var(--color-ink-3); } .reward-modal__qr { width: 200px; height: 200px; margin: 0 auto 16px; border-radius: var(--radius, 10px); overflow: hidden; } .reward-modal__qr img { width: 100%; height: 100%; object-fit: contain; } .reward-modal__close { position: absolute; top: 12px; right: 12px; width: 32px; height: 32px; border: none; border-radius: 50%; background: var(--surface-2, #F4F5F7); color: var(--color-ink-3); cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.2s; } .reward-modal__close:hover { background: var(--surface-3, #ECEEF1); } .reward-modal__content > p { margin: -4px 0 18px; } .reward-amounts { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; margin: 18px 0; } .reward-amount { min-height: 42px; border: 1px solid var(--color-line-soft, rgba(15, 23, 42, 0.1)); border-radius: 10px; background: var(--surface-2); color: var(--color-ink-2); cursor: pointer; font-weight: 700; } .reward-amount.is-active { border-color: var(--color-primary); background: var(--color-primary-soft); color: var(--color-primary); } .reward-custom { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 16px; color: var(--color-ink-3); font-size: 13px; } .reward-custom input { width: 140px; min-height: 40px; border: 1px solid var(--color-line-soft, rgba(15, 23, 42, 0.1)); border-radius: 9px; background: var(--surface-1); color: var(--color-ink); padding: 0 12px; } .reward-modal__submit { width: 100%; min-height: 42px; } .reward-modal__message { min-height: 20px; margin-top: 10px; color: var(--color-primary); font-size: 12px; text-align: center; } /* ---- reward amounts ---- */ .reward-amounts { display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; margin-bottom: 16px; } .reward-amounts__btn { display: inline-flex; align-items: baseline; gap: 2px; padding: 8px 16px; border: 1px solid var(--color-line, #e5e7eb); border-radius: var(--radius, 10px); background: var(--surface-2, #F4F5F7); color: var(--color-ink); font-size: 15px; font-weight: 600; cursor: pointer; transition: all 0.2s ease; user-select: none; } .reward-amounts__btn:hover { border-color: var(--color-primary, #f04494); background: rgba(240, 68, 148, 0.06); } .reward-amounts__btn.is-active { border-color: var(--color-primary, #f04494); background: var(--color-primary, #f04494); color: #fff; } .reward-amounts__currency { font-size: 13px; font-weight: 400; } .reward-amounts__value { font-size: 15px; } /* ---- custom amount ---- */ .reward-custom { display: flex; align-items: center; gap: 8px; margin-bottom: 16px; } .reward-custom__input { flex: 1; height: 40px; padding: 0 12px; border: 1px solid var(--color-line, #e5e7eb); border-radius: var(--radius, 10px); background: var(--surface-2, #F4F5F7); color: var(--color-ink); font-size: 14px; text-align: center; outline: none; transition: border-color 0.2s; -moz-appearance: textfield; } .reward-custom__input::-webkit-inner-spin-button, .reward-custom__input::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; } .reward-custom__input:focus { border-color: var(--color-primary, #f04494); } .reward-custom__confirm { flex-shrink: 0; height: 40px; padding: 0 20px; border: none; border-radius: var(--radius, 10px); background: var(--color-primary, #f04494); color: #fff; font-size: 14px; font-weight: 500; cursor: pointer; transition: opacity 0.2s; } .reward-custom__confirm:hover { opacity: 0.85; } /* ============================================================ * 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; } /* ============================================================ * 18. VIP 等级标识 * ============================================================ */ .aksrt-vip-badge { display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px; border-radius: var(--radius-pill, 999px); font-size: 11px; font-weight: 600; } .aksrt-vip-badge--gold { background: linear-gradient(135deg, #FFD700, #FFA500); color: #fff; } .aksrt-vip-badge--silver { background: linear-gradient(135deg, #C0C0C0, #A8A8A8); color: #fff; } .aksrt-vip-badge--bronze { background: linear-gradient(135deg, #CD7F32, #A0522D); color: #fff; } /* ============================================================ * 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/skeleton.css */ /* ========== 骨架屏加载 — 对齐 legacy skeleton loading ========== */ .skeleton { position: relative; overflow: hidden; background: var(--surface-2, #eee); border-radius: var(--radius, 8px); } .skeleton::after { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient( 90deg, transparent 0%, rgba(255, 255, 255, 0.4) 50%, transparent 100% ); animation: skeleton-shimmer 1.5s infinite; } @keyframes skeleton-shimmer { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } } /* 骨架屏变体 */ .skeleton-text { height: 14px; border-radius: 4px; margin-bottom: 8px; } .skeleton-text--title { height: 20px; width: 60%; margin-bottom: 12px; } .skeleton-text--short { width: 40%; } .skeleton-text--medium { width: 70%; } .skeleton-avatar { width: 48px; height: 48px; border-radius: 50%; flex-shrink: 0; } .skeleton-avatar--sm { width: 32px; height: 32px; } .skeleton-avatar--lg { width: 64px; height: 64px; } .skeleton-thumb { width: 100%; aspect-ratio: 16 / 9; border-radius: var(--radius, 8px); } .skeleton-thumb--square { aspect-ratio: 1; } .skeleton-thumb--card { aspect-ratio: 16 / 10; border-radius: var(--radius, 8px) var(--radius, 8px) 0 0; } /* 卡片骨架屏 */ .skeleton-card { background: var(--surface-1, #fff); border-radius: var(--radius, 8px); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04); overflow: hidden; } .skeleton-card__thumb { width: 100%; aspect-ratio: 16 / 10; } .skeleton-card__body { padding: 14px 16px; } .skeleton-card__meta { display: flex; align-items: center; gap: 8px; margin-top: 10px; } /* 评论骨架屏 */ .skeleton-comment { display: flex; gap: 12px; padding: 16px 0; border-bottom: 1px solid var(--color-line-soft, rgba(0, 0, 0, 0.03)); } .skeleton-comment__body { flex: 1; } .skeleton-comment__header { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; } /* 通用骨架屏容器 */ .skeleton-list .skeleton-item { padding: 12px 0; border-bottom: 1px solid var(--color-line-soft, rgba(0, 0, 0, 0.03)); } .skeleton-list .skeleton-item:last-child { border-bottom: none; } /* 减弱动画偏好 */ @media (prefers-reduced-motion: reduce) { .skeleton::after { animation: none; } } /* 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); } /* AJAX 加载更多 */ .load-more { text-align: center; padding: 20px 0; } .load-more__btn { display: inline-flex; align-items: center; gap: 6px; padding: 10px 24px; 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: 20px; cursor: pointer; transition: all 0.2s; } .load-more__btn:hover { color: var(--color-primary, #f04494); border-color: var(--color-primary, #f04494); } .load-more__btn:disabled { opacity: 0.5; cursor: not-allowed; } .load-more__spinner { display: inline-block; width: 16px; height: 16px; border: 2px solid var(--surface-3, #e8e8e8); border-top-color: var(--color-primary, #f04494); border-radius: 50%; animation: spin 0.6s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* 移动端 */ @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/ajax-spinner.css */ /* ========== AJAX 加载指示器 — 对齐 legacy loading spinner ========== */ .aksrt-loading { display: flex; align-items: center; justify-content: center; padding: 40px 20px; color: var(--color-ink-4, #999); font-size: 13px; gap: 8px; } .aksrt-loading__spinner { display: inline-block; width: 20px; height: 20px; border: 2px solid var(--surface-3, #e8e8e8); border-top-color: var(--color-primary, #f04494); border-radius: 50%; animation: aksrt-spin 0.6s linear infinite; } @keyframes aksrt-spin { to { transform: rotate(360deg); } } /* 全屏加载遮罩 */ .aksrt-loading-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(255, 255, 255, 0.8); display: flex; align-items: center; justify-content: center; z-index: 9999; backdrop-filter: blur(2px); } .aksrt-loading-overlay__content { text-align: center; } .aksrt-loading-overlay__spinner { width: 36px; height: 36px; border: 3px solid var(--surface-3, #e8e8e8); border-top-color: var(--color-primary, #f04494); border-radius: 50%; animation: aksrt-spin 0.6s linear infinite; margin: 0 auto 12px; } .aksrt-loading-overlay__text { font-size: 13px; color: var(--color-ink-3, #777); } /* 行内加载(替换内容时) */ .aksrt-loading-inline { display: flex; align-items: center; justify-content: center; padding: 20px; color: var(--color-ink-4, #999); font-size: 12px; gap: 6px; } .aksrt-loading-inline__dot { width: 6px; height: 6px; background: var(--color-primary, #f04494); border-radius: 50%; animation: aksrt-dot-pulse 1.2s ease-in-out infinite; } .aksrt-loading-inline__dot:nth-child(2) { animation-delay: 0.2s; } .aksrt-loading-inline__dot:nth-child(3) { animation-delay: 0.4s; } @keyframes aksrt-dot-pulse { 0%, 80%, 100% { opacity: 0.3; transform: scale(0.8); } 40% { opacity: 1; transform: scale(1); } } /* 页面加载进度条 */ .aksrt-progress-bar { position: fixed; top: 0; left: 0; height: 2px; background: var(--color-primary, #f04494); z-index: 10000; transition: width 0.3s ease; } /* 减弱动画偏好 */ @media (prefers-reduced-motion: reduce) { .aksrt-loading__spinner, .aksrt-loading-overlay__spinner { animation-duration: 1.5s; } .aksrt-loading-inline__dot { animation: none; opacity: 0.6; } } /* source: assets/css/frontend/modal-runtime.css */ /** * Modal runtime + ajax list primitives (shared). * * @package AKSRT */ /* ---- portal token bridge ---- * * 弹窗由 runtime portal 到 ,因此它位于任何「页面级 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; } .ajaxpager .post_ajax_loader, .ajaxpager .post-ajax-loader { display: none; } .ajaxpager .post_ajax_loader.is-loading, .ajaxpager .post-ajax-loader.is-loading { display: block; } .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) .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) .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) .form-upload .preview .preview-item img { width: 100%; height: 100%; object-fit: cover; display: block; } :is(.order-comment-from, .aksrt-report-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) .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); } } /* 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)}}