/** * 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-size: 0; line-height: 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; } .container { width: 100%; max-width: var(--container); margin: 0 auto; padding: 0 16px; } @media (min-width: 768px) { .container { padding: 0 24px; } } @media (min-width: 1200px) { .container { padding: 0 32px; } } /* ========== 通用空状态 ========== */ .no-results { padding: 48px 20px; text-align: center; color: var(--color-ink-3); }/** * legacy Variable Compatibility Layer — Global Bridge * * Maps legacy CSS variable names to AKSRT design tokens. * This file allows existing legacy-style markup and third-party components * that reference legacy variables to work correctly in AKSRT. * * @package AKSRT */ /* ============================================================ * Global bridge (all pages) * Maps legacy variables → AKSRT tokens so any legacy-style markup works. * ============================================================ */ :root { /* Layout (legacy typo preserved for compat) */ --mian-max-width: var(--container, 1200px); /* Theme color — now matches legacy #f04494 */ --theme-color: var(--color-primary, #f04494); --focus-color: var(--color-primary, #f04494); --focus-shadow-color: var(--color-primary-soft, rgba(253, 83, 161, 0.4)); /* Text hierarchy */ --key-color: var(--color-ink); --main-color: var(--color-ink-2); --muted-color: var(--color-ink-3); --muted-2-color: var(--color-ink-4); --muted-3-color: #b1b1b1; --muted-4-color: #d2d2d2; /* Surfaces & borders */ --body-bg-color: var(--surface-page); --main-bg-color: var(--surface-1); --muted-bg-color: var(--surface-2); --main-border-color: var(--color-line); --muted-border-color: var(--color-line-soft); --main-shadow: rgba(116, 116, 116, 0.08); --main-radius: var(--radius, 8px); /* Radius variants */ --mini-radius: calc(var(--main-radius) / 1.4); /* Blur / glass */ --blur-bg: rgba(255, 255, 255, 0.8); --float-btn-bg: rgba(200, 200, 200, 0.4); /* Header / footer composites */ --header-bg: var(--blur-bg); --header-color: var(--color-ink-2); --footer-bg: var(--surface-1); --footer-color: var(--color-ink-4); /* Cards — 对齐 legacy 70% */ --posts-card-scale: 70%; --posts-list-scale: 70%; --single-cover-scale: 35%; } /* ============================================================ * Dark mode bridge — 对齐 legacy dark theme * ============================================================ */ html.dark { --theme-color: var(--color-primary); --focus-color: var(--color-primary); --focus-shadow-color: rgba(253, 83, 161, 0.25); --key-color: var(--color-ink); --main-color: var(--color-ink-2); --muted-color: var(--color-ink-3); --muted-2-color: var(--color-ink-4); --muted-3-color: #666; --muted-4-color: #555; --body-bg-color: var(--surface-page); --main-bg-color: var(--surface-1); --muted-bg-color: var(--surface-2); --main-border-color: var(--color-line); --muted-border-color: var(--color-line-soft); --main-shadow: rgba(24, 24, 24, 0.1); --blur-bg: rgba(50, 51, 53, 0.8); --float-btn-bg: rgba(70, 70, 70, 0.4); --header-color: var(--color-ink-2); --footer-color: var(--color-ink-4); } /** * 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); background: var(--surface-1); box-shadow: var(--shadow-sm); transition: box-shadow var(--dur) var(--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 兼容别名 * ============================================================ */ .theme-box { background: var(--surface-1); border: none; border-radius: var(--radius); box-shadow: var(--shadow-sm); margin-bottom: 20px; transition: box-shadow var(--dur) var(--ease); } .theme-box:hover { box-shadow: var(--shadow); } .box-bg { background-color: var(--surface-1); box-shadow: var(--shadow-sm); } .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: var(--shadow); } .muted-box { background-color: var(--surface-2); border-radius: var(--radius); padding: var(--card-padding); } /* ============================================================ * 暗色模式 * ============================================================ */ html.dark .aksrt-theme-box, html.dark .theme-box, html.dark .box-bg { box-shadow: var(--shadow-sm); } html.dark .aksrt-theme-box:hover, html.dark .theme-box:hover { box-shadow: var(--shadow); } /* ============================================================ * 卡片 hover 动效 * ============================================================ */ .aksrt-theme-box, .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: var(--shadow); transform: translateY(-2px); } .aksrt-card-hover-lg:hover, .aksrt-card-hover-lg:focus-within { box-shadow: var(--shadow-lg); transform: translateY(-4px); } .aksrt-noshadow:hover { box-shadow: none !important; transform: none !important; } /** * 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: 0 4px 10px rgba(20, 28, 48, 0.06); border-bottom-color: var(--color-line-soft); } html.dark .site-nav--glass.is-scrolled, html.dark .site-nav--glass.is-scrolled { box-shadow: 0 4px 10px rgba(0, 0, 0, 0.25); } /* ============================================================ * 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 -4px 5px rgba(20, 28, 48, 0.06); } html.dark .footer-tabbar--glass, html.dark .footer-tabbar--glass { box-shadow: 0 -4px 5px rgba(0, 0, 0, 0.25); } /* ============================================================ * Glass on floating buttons (lighter blur: saturate(2) blur(10px)) * ============================================================ */ .float-right--glass .float-btn { -webkit-backdrop-filter: saturate(2) blur(10px); backdrop-filter: saturate(2) blur(10px); background: var(--float-btn-bg); border-color: transparent; } /* ============================================================ * 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); } /* ============================================================ * AKSRT Navigation — Editorial v3.4 * * - 高度 60px (--nav-h) * - 字体使用 --font-ui (Inter / 思源黑体) * - 主色蓝调,hover 改为 primary-soft 浅底 * - 永远实心:白底深字 + 1px 分隔线,滚动后追加 box-shadow * - 移动端:≤768 显示汉堡菜单 * ============================================================ */ .site-nav { position: sticky; top: 0; z-index: 1000; min-height: var(--nav-height, 60px); border-bottom: 1px solid var(--color-line); background-color: var(--blur-bg); backdrop-filter: saturate(5) blur(20px); -webkit-backdrop-filter: saturate(5) blur(20px); transition: background-color 0.25s ease, border-color 0.25s ease, color 0.25s ease, box-shadow 0.25s ease; } .site-nav--static { position: relative; } .site-nav--transparent { background: var(--blur-bg); border-bottom-color: var(--color-line-soft); } .site-nav--transparent.is-scrolled { background: var(--blur-bg); } .site-nav--blur { background: var(--blur-bg); backdrop-filter: saturate(5) blur(20px); -webkit-backdrop-filter: saturate(5) blur(20px); border-bottom-color: transparent; } html.dark .site-nav--transparent, html.dark .site-nav--blur, html.dark .site-nav--transparent, html.dark .site-nav--blur { background: var(--blur-bg); border-bottom-color: var(--color-line-soft); } /* 滚动后追加轻阴影作为状态反馈(颜色不变) */ .site-nav.is-scrolled { box-shadow: var(--shadow-sm, 0 1px 6px rgba(0, 0, 0, 0.06)); } /* WordPress Admin Bar 已全局禁用,无需偏移规则 */ /* ============================================================ * Inner / Row layout * ============================================================ */ .site-nav__inner { max-width: var(--nav-max-width, var(--container)); margin: 0 auto; padding: 0 15px; display: flex; flex-direction: column; gap: 0; } .site-nav__row { display: flex; align-items: center; justify-content: flex-start; gap: 12px; width: 100%; min-height: var(--nav-height, 60px); } /* ============================================================ * Brand * ============================================================ */ .site-brand { display: inline-flex; align-items: center; gap: 10px; min-width: 0; max-width: min(48vw, 360px); padding: 7px 10px; color: var(--color-ink); font-size: 1.0625rem; font-weight: 700; letter-spacing: -0.01em; flex-shrink: 0; text-decoration: none; } .site-brand:hover { color: var(--color-ink); text-decoration: none; } .site-brand--has-logo { gap: 0; } .site-brand__logo { width: 36px; height: 36px; border-radius: 8px; display: flex; align-items: center; justify-content: center; font-weight: 800; font-size: 13px; color: var(--color-on-primary, #fff); background: linear-gradient(135deg, var(--color-primary), var(--color-primary-active, var(--color-primary-dark))); letter-spacing: 0.02em; overflow: hidden; } .site-brand__media { display: block; flex: 0 1 auto; max-width: 100%; padding: 0 30px; line-height: 0; box-sizing: border-box; background: transparent !important; border: 0; border-radius: 0; box-shadow: none; filter: none !important; opacity: 1; } .site-brand__img { display: block; height: 36px; width: auto; max-width: 100%; object-fit: contain; object-position: left center; background: transparent !important; border-radius: 0; box-shadow: none; filter: none !important; mix-blend-mode: normal !important; opacity: 1; transform: none !important; } .site-brand__name { font-weight: 700; letter-spacing: -0.01em; white-space: nowrap; } /* ============================================================ * Desktop menu * ============================================================ */ ul.nav-desktop { display: none; list-style: none; margin: 0; padding: 0; align-items: center; flex: 1 1 auto; min-width: 0; } .nav-desktop--fallback { display: none; align-items: center; flex: 1 1 auto; min-width: 0; } ul.nav-desktop a, .nav-desktop--fallback a { color: var(--color-ink-3); font-size: 15px; font-weight: 500; padding: 8px 10px; border-radius: 4px; transition: color var(--dur-fast, 0.15s) var(--ease), background var(--dur-fast, 0.15s) var(--ease); } /* Hover — 对齐 legacy: 仅变色,无背景 */ ul.nav-desktop a:hover, .nav-desktop--fallback a:hover { color: var(--color-primary); background: transparent; } /* Active page — 对齐 legacy: 顶部彩色条指示器 */ ul.nav-desktop .current-menu-item > a, ul.nav-desktop .current_page_item > a { color: var(--color-primary); background: transparent; position: relative; } ul.nav-desktop .current-menu-item > a::before, ul.nav-desktop .current_page_item > a::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: var(--color-primary); border-radius: 0 0 2px 2px; } /* ============================================================ * Desktop submenu (dropdown) * ============================================================ */ ul.nav-desktop .menu-item { position: relative; } ul.nav-desktop .sub-menu { position: absolute; top: 100%; left: 0; z-index: 998; min-width: 200px; list-style: none; margin: 4px 0 0; padding: 8px; background: var(--main-bg-color, #fff); border: 1px solid var(--main-border-color, rgba(50, 50, 50, 0.06)); border-radius: var(--main-radius, 8px); box-shadow: 0 6px 16px rgba(0, 0, 0, 0.08); opacity: 0; visibility: hidden; transform: translateY(6px); transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s ease; } ul.nav-desktop .menu-item:hover > .sub-menu { opacity: 1; visibility: visible; transform: translateY(0); } ul.nav-desktop .sub-menu .menu-item > a { display: flex; align-items: center; gap: 8px; padding: 8px 15px; font-size: 14px; border-radius: 4px; white-space: nowrap; } ul.nav-desktop .sub-menu .menu-item > a:hover { background: var(--color-primary-soft, rgba(24, 144, 255, 0.08)); color: var(--color-primary); } /* Nested submenus fly out to the right */ ul.nav-desktop .sub-menu .sub-menu { top: -6px; left: 100%; margin: 0 0 0 4px; } /* Dark mode submenu */ html.dark ul.nav-desktop .sub-menu, html.dark ul.nav-desktop .sub-menu { background: var(--surface-page); border-color: var(--color-line, #2d2d3f); } /* ============================================================ * Mega Menu (图文超级菜单) * ============================================================ */ /* Mega Menu 容器:全宽定位 */ ul.nav-desktop .mega-menu-item { position: static; } ul.nav-desktop .mega-menu-item > .mega-menu__panel { position: absolute; top: 100%; left: 50%; transform: translateX(-50%); width: 100%; max-width: var(--container); min-width: auto; padding: 16px; margin-top: 4px; } /* 列布局 */ .mega-menu__columns-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; } .mega-menu__columns-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; } .mega-menu__columns-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; } .mega-menu__columns-5 { display: grid; grid-template-columns: repeat(5, 1fr); gap: 8px; } /* Mega Menu 子项(卡片样式) */ .mega-menu__panel > .menu-item { border-radius: 8px; transition: background 0.15s; } .mega-menu__panel > .menu-item:hover { background: var(--surface-2, #F4F5F7); } .mega-menu__panel > .menu-item > a { display: flex; align-items: center; gap: 10px; padding: 10px 12px; font-size: 14px; border-radius: 8px; white-space: normal; line-height: 1.4; } .mega-menu__panel > .menu-item > a i { width: 20px; text-align: center; color: var(--color-primary, var(--color-primary)); flex-shrink: 0; } /* 描述文字 */ .mega-menu__item-desc { display: block; font-size: 12px; color: var(--color-ink-4, #8A8F98); margin-top: 2px; line-height: 1.3; } /* Mega Menu 标题分组 */ .mega-menu__panel .mega-menu__group-title { grid-column: 1 / -1; padding: 8px 12px 4px; font-size: 12px; font-weight: 600; color: var(--color-ink-3); text-transform: uppercase; letter-spacing: 0.05em; } /* Mega Menu 底部区域(可放图片/CTA) */ .mega-menu__panel .mega-menu__footer { grid-column: 1 / -1; padding: 12px 0 0; margin-top: 8px; border-top: 1px solid var(--color-line); } /* Dark mode Mega Menu */ html.dark ul.nav-desktop .mega-menu-item > .mega-menu__panel, html.dark ul.nav-desktop .mega-menu-item > .mega-menu__panel { background: var(--surface-page); border-color: var(--color-line, #2d2d3f); } html.dark .mega-menu__panel > .menu-item:hover, html.dark .mega-menu__panel > .menu-item:hover { background: var(--surface-2); } /* Responsive Mega Menu */ @media (max-width: 767px) { ul.nav-desktop .mega-menu-item > .mega-menu__panel { position: static; transform: none; width: 100%; max-width: none; } .mega-menu__columns-2, .mega-menu__columns-3, .mega-menu__columns-4, .mega-menu__columns-5 { grid-template-columns: 1fr; } } /* ============================================================ * Right actions (icons + auth) * ============================================================ */ .nav-actions { display: flex; align-items: center; gap: 4px; flex-shrink: 0; margin-left: auto; } .nav-settings-link, .nav-publish-btn { flex-shrink: 0; } .nav-settings-link svg { width: 18px; height: 18px; } .nav-publish-btn { display: inline-flex; align-items: center; gap: 8px; height: 36px; padding: 0 14px; font-size: 0.875rem; font-weight: 600; } .nav-publish-btn i { font-size: 0.8125rem; } .theme-toggle.is-animating svg { transform: rotate(360deg); } /* ============================================================ * Auth buttons (in nav, when logged out) * ============================================================ */ .nav-auth { display: none; align-items: center; gap: 8px; } /* btn-outline / btn-primary 复用 core/buttons.css 的定义, * 这里仅做导航专用调整(高度对齐、字体) */ .nav-auth .btn-outline, .nav-auth .btn-primary { height: 36px; font-size: 0.875rem; padding: 0 16px; } /* Mobile toggle */ .nav-toggle { display: flex; } @media (max-width: 991px) { .site-brand { max-width: min(46vw, 300px); } .site-brand__media { padding: 0 8px; } .nav-publish-btn { display: none; } } /* Desktop search icon: hide on mobile (use drawer search instead) */ @media (max-width: 767px) { .site-brand { max-width: min(62vw, 260px); padding: 7px 0; } .site-brand__media { padding: 0; } #search-toggle { display: none; } /* Search panel only makes sense alongside the desktop search icon */ .nav-search-panel { display: none !important; } } @media (min-width: 768px) { ul.nav-desktop, .nav-desktop--fallback { display: flex; } .nav-auth { display: flex; } .nav-toggle { display: none; } } .nav-mobile-strip { display: none; width: calc(100% + 8px); margin: 0 -4px; padding: 0 0 12px; } .nav-mobile-strip__menu, .nav-mobile-strip__menu ul { display: flex; align-items: center; gap: 8px; overflow-x: auto; margin: 0; padding: 0; list-style: none; scrollbar-width: none; -ms-overflow-style: none; } .nav-mobile-strip__menu::-webkit-scrollbar, .nav-mobile-strip__menu ul::-webkit-scrollbar { display: none; } .nav-mobile-strip__menu a { display: inline-flex; align-items: center; min-height: 34px; padding: 0 12px; border-radius: var(--radius-pill, 999px); background: var(--surface-2); color: var(--color-ink-2); white-space: nowrap; text-decoration: none; font-size: 0.875rem; font-weight: 500; } .nav-mobile-strip__menu .current-menu-item > a, .nav-mobile-strip__menu .current_page_item > a { background: var(--color-primary); color: var(--color-on-primary, #fff); } @media (max-width: 767px) { .nav-mobile-strip { display: block; } } /* ============================================================ * User avatar + dropdown * ============================================================ */ .nav-user { position: relative; } .nav-user__toggle { width: 40px; height: 40px; border-radius: var(--radius-avatar); padding: 0; border: 2px solid var(--color-line); cursor: pointer; overflow: hidden; background: var(--surface-2); transition: border-color var(--dur-fast, 0.15s) var(--ease); } .nav-user__toggle:hover { border-color: var(--color-primary); } .nav-user__toggle img { width: 100%; height: 100%; object-fit: cover; display: block; } .user-dropdown { position: absolute; top: calc(100% + 8px); right: 0; width: 260px; max-width: calc(100vw - 32px); padding: 12px 0; background: var(--surface-1); border: 1px solid var(--color-line); border-radius: var(--radius-lg, 8px); box-shadow: var(--shadow-lg); z-index: 1100; opacity: 0; visibility: hidden; transform: translateY(-6px); transition: opacity 0.2s, transform 0.2s, visibility 0.2s; } .user-dropdown.is-open { opacity: 1; visibility: visible; transform: translateY(0); } .user-dropdown__profile { display: flex; align-items: center; gap: 12px; padding: 8px 16px 14px; } .user-dropdown__profile img { width: 44px; height: 44px; border-radius: var(--radius-avatar); object-fit: cover; flex-shrink: 0; } .user-dropdown__name { font-weight: 700; font-size: 0.9375rem; color: var(--color-ink); } .user-dropdown__email { font-size: 0.75rem; color: var(--color-ink-4); word-break: break-all; margin-top: 2px; } .user-dropdown__sep { height: 1px; background: var(--color-line); margin: 6px 0; } .user-dropdown a, .user-dropdown button { display: flex; align-items: center; gap: 10px; width: 100%; padding: 0 16px; height: 44px; border: none; background: none; font-size: 0.875rem; color: var(--color-ink); text-align: left; cursor: pointer; transition: background var(--dur-fast, 0.15s) var(--ease), color var(--dur-fast, 0.15s) var(--ease); } .user-dropdown a:hover, .user-dropdown button:hover { background: var(--surface-3); color: var(--color-primary-active); } /* dropdown 项内的 SVG 图标 */ .user-dropdown__item svg { width: 16px; height: 16px; flex-shrink: 0; opacity: 0.85; } .user-dropdown__item span:first-of-type:not(.user-dropdown__pill) { flex: 1; min-width: 0; } /* 未读消息数 badge */ .user-dropdown__badge { display: inline-flex; align-items: center; justify-content: center; min-width: 18px; height: 18px; padding: 0 5px; margin-left: auto; font-size: 11px; font-weight: 600; color: #fff; background: var(--color-error, #ef4444); border-radius: 9px; line-height: 1; } .user-dropdown__credits { display: flex; align-items: center; gap: 10px; padding: 0 16px; height: 44px; font-size: 0.875rem; color: var(--color-ink-2); } .user-dropdown__credits i { color: var(--color-warning); flex-shrink: 0; } .user-dropdown__credits-label { flex: 1; } .user-dropdown__credits-value { font-weight: 600; color: var(--color-primary); } .user-dropdown__logout { color: var(--color-error) !important; } .user-dropdown__logout svg { color: var(--color-error); } .user-dropdown__logout:hover { background: rgba(239, 68, 68, 0.08) !important; color: var(--color-error) !important; } .user-dropdown .badge-dot { margin-left: auto; min-width: 8px; height: 8px; border-radius: var(--radius-pill); background: var(--color-error); } /* ============================================================ * Search panel * ============================================================ */ .nav-search-panel { display: none; padding: 12px 0 16px; border-top: 1px solid var(--color-line); } .nav-search-panel.is-open { display: block; } .nav-searchbox { margin: 0; } .nav-searchbox__field { display: flex; align-items: center; gap: 10px; min-height: 42px; padding: 0 6px 0 14px; border: 1px solid var(--color-line); border-radius: var(--radius-pill, 999px); background: var(--surface-3); box-sizing: border-box; transition: border-color var(--dur-fast, 0.15s) var(--ease), box-shadow var(--dur-fast, 0.15s) var(--ease), background var(--dur-fast, 0.15s) var(--ease); } .nav-searchbox__icon { order: 1; flex: 0 0 16px; width: 16px; height: 16px; color: var(--color-ink-4); pointer-events: none; } .nav-searchbox__input { order: 2; flex: 1; min-width: 0; width: auto; height: 40px; padding: 0; border: 0; background: transparent; color: var(--color-ink); font-size: 0.9rem; line-height: 1.2; box-sizing: border-box; } .nav-searchbox__input:focus { outline: none; } .nav-searchbox__input::placeholder { color: var(--color-ink-4); } .nav-searchbox__submit { order: 3; flex: 0 0 auto; height: 30px; min-width: 64px; padding: 0 14px; border: 0; border-radius: var(--radius-pill, 999px); background: var(--color-primary); color: #fff; font-size: 0.8125rem; font-weight: 600; line-height: 1; white-space: nowrap; cursor: pointer; } .nav-searchbox__field:focus-within { border-color: var(--color-primary); box-shadow: 0 0 0 3px var(--color-primary-soft); background: var(--surface-1); } .nav-searchbox__submit:hover { background: var(--color-primary-active); } /* ============================================================ * Mobile drawer * ============================================================ */ .nav-drawer-backdrop { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.45); z-index: 1200; opacity: 0; visibility: hidden; transition: opacity 0.3s ease, visibility 0.3s; } .nav-drawer-backdrop.is-open { opacity: 1; visibility: visible; } .nav-drawer { position: fixed; top: 0; right: 0; width: min(100vw, 360px); height: 100vh; max-height: 100dvh; background: var(--surface-page); z-index: 1210; box-shadow: var(--shadow-drawer); transform: translateX(100%); transition: transform 0.32s var(--ease-out, ease); display: flex; flex-direction: column; overflow: auto; pointer-events: none; visibility: hidden; } .nav-drawer.is-open { transform: translateX(0); pointer-events: auto; visibility: visible; } .nav-drawer__head { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 16px 20px; border-bottom: 1px solid var(--color-line); font-weight: 700; font-size: 1rem; } .site-brand--drawer { max-width: calc(100% - 52px); padding: 7px 0; } .site-brand--drawer .site-brand__media { padding: 0; } .nav-drawer__search { padding: 16px 20px 0; } .nav-drawer__search .nav-searchbox__field { min-height: 40px; } .nav-drawer__search .nav-searchbox__input { height: 38px; } .nav-drawer__search .nav-searchbox__submit { height: 28px; min-width: 58px; padding: 0 12px; font-size: 0.75rem; } .nav-drawer__menu { flex: 1; padding: 16px 20px 32px; } .nav-drawer__menu a { display: block; padding: 14px 0; font-size: 1rem; font-weight: 500; color: var(--color-ink); border-bottom: 1px solid var(--color-line-soft); } .nav-drawer__menu a:hover { color: var(--color-primary-active); } .nav-drawer__menu ul { list-style: none; margin: 0; padding: 0; } .nav-drawer__auth { padding: 20px; display: flex; flex-direction: column; gap: 12px; border-top: 1px solid var(--color-line); } .nav-drawer__auth .btn-outline, .nav-drawer__auth .btn-primary { width: 100%; height: 44px; } .nav-drawer__publish { padding: 0 20px 20px; } .nav-drawer__publish .btn-primary { width: 100%; min-height: 44px; justify-content: center; gap: 8px; } /* ============================================================ * Menu Decoration — Icons, Badges, Hover Effects * ============================================================ */ /* Menu item icon */ .aksrt-nav__icon { font-size: 0.85em; width: 1.2em; text-align: center; margin-right: 4px; opacity: 0.7; transition: opacity 0.2s; } .aksrt-nav__item--has-icon > a { display: inline-flex; align-items: center; gap: 4px; } .aksrt-nav__item--has-icon:hover .aksrt-nav__icon { opacity: 1; } /* Menu item badge */ .aksrt-nav__badge { display: inline-flex; align-items: center; justify-content: center; font-size: 10px; font-weight: 600; line-height: 1; padding: 2px 5px; border-radius: 3px; margin-left: 4px; white-space: nowrap; vertical-align: middle; transform: translateY(-1px); } .aksrt-nav__badge--new { color: #fff; background: var(--color-error); } .aksrt-nav__badge--hot { color: #fff; background: var(--color-warning); } .aksrt-nav__badge--info { color: #fff; background: var(--color-info); } .aksrt-nav__badge--success { color: #fff; background: var(--color-success); } .aksrt-nav__badge--vip { color: #fff; background: linear-gradient(135deg, var(--color-warning), var(--color-error)); } /* Hover effects */ .aksrt-nav__item--hover-underline > a::after { content: ''; position: absolute; bottom: 0; left: 50%; width: 0; height: 2px; background: var(--color-primary); transition: width 0.2s ease, left 0.2s ease; border-radius: 1px; } .aksrt-nav__item--hover-underline:hover > a::after { width: 60%; left: 20%; } .aksrt-nav__item--hover-background > a { transition: background-color 0.2s; border-radius: 4px; } .aksrt-nav__item--hover-background:hover > a { background-color: var(--color-primary-soft, rgba(24, 144, 255, 0.08)); } .aksrt-nav__item--hover-color > a { transition: color 0.2s; } .aksrt-nav__item--hover-color:hover > a { color: var(--color-primary); } /* Mega submenu */ .aksrt-nav__mega { position: absolute; top: 100%; left: 0; z-index: 1001; background: var(--surface-1); border: 1px solid var(--color-line); border-radius: var(--radius); box-shadow: var(--shadow-lg); padding: 16px; opacity: 0; visibility: hidden; transform: translateY(8px); transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s ease; } .aksrt-nav__item:hover > .aksrt-nav__mega { opacity: 1; visibility: visible; transform: translateY(0); } .aksrt-nav__mega--columns { display: grid; gap: 16px; } /* Cards submenu */ .aksrt-nav__cards { display: grid; gap: 12px; padding: 8px; } .aksrt-nav__card { display: flex; align-items: center; gap: 12px; padding: 10px 12px; border-radius: 6px; text-decoration: none; color: inherit; transition: background 0.15s; } .aksrt-nav__card:hover { background: var(--color-primary-soft, rgba(24, 144, 255, 0.06)); } .aksrt-nav__card-icon { width: 36px; height: 36px; border-radius: 8px; display: flex; align-items: center; justify-content: center; background: var(--color-primary-soft, #e6f4ff); color: var(--color-primary); font-size: 16px; flex-shrink: 0; } .aksrt-nav__card-text { flex: 1; min-width: 0; } .aksrt-nav__card-title { font-size: 13px; font-weight: 600; color: var(--color-ink); margin: 0; } .aksrt-nav__card-desc { font-size: 11px; color: var(--color-ink-4); margin: 2px 0 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* ============================================================ * 导航溢出「更多」下拉 * ============================================================ */ .aksrt-nav-more { position: relative; } .aksrt-nav-more__btn { display: inline-flex; align-items: center; gap: 4px; padding: 6px 12px; border: none; background: none; color: var(--color-ink-2); font-size: 14px; font-weight: 500; cursor: pointer; border-radius: var(--radius, 8px); transition: background 0.15s, color 0.15s; } .aksrt-nav-more__btn:hover { background: var(--color-primary-soft, rgba(240, 68, 148, 0.08)); color: var(--color-primary); } .aksrt-nav-more__dropdown { display: none; position: absolute; top: 100%; right: 0; min-width: 160px; padding: 6px 0; background: var(--surface-1, #fff); border: 1px solid var(--color-line, rgba(50, 50, 50, 0.06)); border-radius: var(--radius, 8px); box-shadow: var(--shadow-lg, 0 0 10px rgba(116, 116, 116, 0.12)); z-index: var(--z-dropdown, 100); list-style: none; margin: 4px 0 0; } .aksrt-nav-more__dropdown.is-open { display: block; } .aksrt-nav-more__dropdown li { display: block; } .aksrt-nav-more__dropdown li a, .aksrt-nav-more__dropdown li button { display: block; width: 100%; padding: 8px 16px; border: none; background: none; color: var(--color-ink-2); font-size: 14px; text-align: left; text-decoration: none; cursor: pointer; transition: background 0.15s, color 0.15s; } .aksrt-nav-more__dropdown li a:hover, .aksrt-nav-more__dropdown li button:hover { background: var(--color-primary-soft, rgba(240, 68, 148, 0.08)); color: var(--color-primary); } /* ========== 面包屑 — 对齐 legacy .breadcrumb ========== */ .breadcrumbs { font-size: 13px; color: var(--muted-2-color, #999); margin-bottom: 12px; opacity: 0.8; } .breadcrumbs a { color: var(--muted-2-color, #999); } .breadcrumbs a:hover { color: var(--focus-color, #f04494); } .breadcrumbs__sep { margin: 0 0 0 6px; opacity: 0.6; } @media (max-width: 767px) { .breadcrumbs { font-size: 12px; } } /* 封面内面包屑 */ .single-cover-con .breadcrumbs { font-size: 13px; margin: 5px 0 0 -6px; opacity: unset; } /* ========== 主布局 ========== */ .content-shell { width: 100%; margin: 0 auto; padding: 32px 16px 48px; max-width: var(--container); } @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; } .content-layout { display: grid; grid-template-columns: 1fr; gap: 20px; align-items: start; } @media (min-width: 992px) { .content-layout { grid-template-columns: minmax(0, 1fr) 300px; gap: 20px; } } .content-layout__primary { min-width: 0; } .content-layout__aside { min-width: 0; } @media (min-width: 992px) { .content-layout__aside { position: sticky; top: calc(var(--nav-height, 60px) + 16px); align-self: start; } /* WordPress Admin Bar 已全局禁用,无需偏移规则 */ } @media (min-width: 992px) { .has-static-nav .content-layout__aside { top: 16px; } } .content-layout--no-sidebar { grid-template-columns: 1fr; } .content-layout--no-sidebar .content-layout__primary { width: 100%; max-width: var(--content-no-sidebar-max, 1080px); margin: 0 auto; } /* 三栏布局变体:侧边栏在左侧 */ @media (min-width: 992px) { .content-layout--sidebar-left { grid-template-columns: 300px minmax(0, 1fr); } .content-layout--sidebar-left .content-layout__aside { order: -1; } } /* ========== 分页 ========== */ .pagination, .navigation.pagination .nav-links { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 8px; margin: 40px 0 8px; } .pagination a, .pagination span, .navigation.pagination a, .navigation.pagination span { min-width: 40px; height: 40px; display: inline-flex; align-items: center; justify-content: center; border-radius: var(--radius-btn); border: 1px solid var(--color-line); color: var(--color-ink); font-size: 14px; font-weight: 500; transition: border-color 0.2s, color 0.2s, background 0.2s; } .pagination a:hover { border-color: var(--color-primary); color: var(--color-primary); } .pagination .current, .navigation.pagination span.current { background: var(--color-primary); border-color: var(--color-primary); color: #fff; } .pagination .dots, .navigation.pagination .dots { border: none; color: var(--color-ink-4); min-width: auto; padding: 0 4px; } .pagination .prev, .pagination .next, .navigation.pagination a.prev, .navigation.pagination a.next { min-width: 44px; } .pagination .disabled, .navigation.pagination span.disabled { opacity: 0.4; pointer-events: 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; } .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; } @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; } } /* CMS 模块在侧栏布局中的适配 */ .content-layout__primary--cms { min-width: 0; } .content-layout__primary--cms .home-modules { gap: var(--space-7, 32px); } .content-layout__primary--cms .home-modules > .home-module { max-width: 100%; padding-left: 0; padding-right: 0; } /* ============================================================ * Phase 2 — 背景遮罩层级修正 * body.aksrt-bg-overlay 的 ::before 需要 z-index: -1 让内容在其上方 * ============================================================ */ body.aksrt-bg-overlay { position: relative; } body.aksrt-bg-overlay::before { z-index: -1; } body.aksrt-bg-overlay .site-wrapper { position: relative; z-index: 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; } /* ============================================================ * AKSRT Footer — v4.0 legacy-Inspired * * 包含: * - 页脚主体(Bootstrap Grid) * - 浮动右侧按钮组 * - 移动端底部 Tab 栏 * ============================================================ */ /* ============================================================ * 页脚主体 * ============================================================ */ .site-footer { margin-top: auto; background: var(--surface-1); border-top: 1px solid var(--color-line); padding: 30px 0 0; } .site-footer__inner { max-width: var(--container); margin: 0 auto; padding: 0 16px; } @media (min-width: 768px) { .site-footer__inner { padding: 0 24px; } } .site-footer__grid { padding-bottom: 32px; } .site-footer__brand { margin-bottom: 24px; } .site-footer__title { font-size: 1rem; font-weight: 700; margin: 0 0 12px; color: var(--color-ink); } .site-footer__desc { font-size: 0.875rem; color: var(--color-ink-4); line-height: 1.6; margin: 0 0 16px; max-width: 360px; } .site-footer__col { margin-bottom: 24px; } .site-footer__col ul { list-style: none; margin: 0; padding: 0; } .site-footer__col li { margin-bottom: 8px; } .site-footer__col a { font-size: 0.875rem; color: var(--color-ink-3); transition: color 0.15s ease; } .site-footer__col a:hover { color: var(--color-primary); } /* 社交链接行 */ .social-row { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 16px; } .social-row a { display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px; border-radius: 50%; background: var(--surface-3); color: var(--color-ink-3); transition: background 0.2s, color 0.2s, transform 0.2s; } .social-row a:hover { background: var(--color-primary); color: #fff; transform: translateY(-2px); } .social-row .social-icon-link { background: var(--surface-3); color: var(--color-ink-3); } .social-row .social-icon-link:hover { background: var(--color-primary); color: #fff; } /* 友情链接 */ .site-footer__friends { margin-top: 16px; } .site-footer__friends-title { font-size: 0.8125rem; font-weight: 600; color: var(--color-ink-4); margin: 0 0 8px; } .site-footer__friends-list { display: flex; flex-wrap: wrap; gap: 6px 12px; } .site-footer__friends-list a { font-size: 0.8125rem; color: var(--color-ink-4); } .site-footer__friends-list a:hover { color: var(--color-primary); } /* 底部栏 */ .site-footer__bottom { border-top: 1px solid var(--color-line); padding: 20px 0; text-align: center; } .site-footer__filings { display: flex; justify-content: center; gap: 16px; margin-bottom: 8px; flex-wrap: wrap; } .site-footer__filings a { font-size: 0.75rem; color: var(--color-ink-4); } .site-footer__filings a:hover { color: var(--color-primary); } .site-footer__copyright { font-size: 0.75rem; color: var(--color-ink-4); margin: 0; } /* ============================================================ * 浮动右侧按钮组(模仿 legacy float-right) * ============================================================ */ /* 对齐 legacy: bottom 60px, z-index 1030 */ .float-right-btns { position: fixed; right: 20px; bottom: 60px; z-index: 1030; display: flex; flex-direction: column; gap: 8px; transition: opacity 0.3s ease; } /* 对齐 legacy: 40px, 1.4em icon */ .float-btn { display: flex; align-items: center; justify-content: center; width: 40px; min-height: 40px; border-radius: 50%; border: none; background: var(--float-btn-bg); color: var(--color-ink-3); box-shadow: var(--shadow-sm); cursor: pointer; transition: transform var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease); font-size: 1.4em; text-decoration: none; } .float-btn:hover { transform: translateY(-2px); box-shadow: var(--shadow); color: var(--color-primary); background: var(--surface-page); text-decoration: none; } .float-btn:active { transform: scale(0.95); } /* 回到顶部按钮 — 滚动后显示 */ .float-btn--top { opacity: 0; visibility: hidden; transition: opacity 0.3s ease, visibility 0.3s ease, transform 0.2s ease; } .float-btn--top.is-visible { opacity: 1; visibility: visible; display: flex; } /* 主题切换按钮 */ #float-theme-toggle .float-btn__icon-moon { display: none !important; } #float-theme-toggle .float-btn__icon-sun { display: inline-block !important; } #float-theme-toggle[aria-pressed="true"] .float-btn__icon-moon, .theme-dark #float-theme-toggle .float-btn__icon-moon, html.dark #float-theme-toggle .float-btn__icon-moon { display: inline-block !important; } #float-theme-toggle[aria-pressed="true"] .float-btn__icon-sun, .theme-dark #float-theme-toggle .float-btn__icon-sun, html.dark #float-theme-toggle .float-btn__icon-sun { display: none !important; } /* 移动端隐藏浮动按钮(用 tabbar 代替) */ @media (max-width: 767px) { .float-right-btns { right: 12px; bottom: 80px; } .float-btn { width: 38px; height: 38px; font-size: 14px; } } /* ============================================================ * 移动端底部 Tab 栏(模仿 legacy footer-tabbar) * ============================================================ */ .footer-tabbar { display: none; position: fixed; bottom: 0; left: 0; right: 0; z-index: 1035; min-height: 49px; 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: var(--shadow-sm); -webkit-backdrop-filter: saturate(5) blur(20px); backdrop-filter: saturate(5) blur(20px); } .footer-tabbar-placeholder { display: none; height: calc(49px + env(safe-area-inset-bottom, 0px)); } @media (max-width: 767px) { .footer-tabbar { display: flex; } .footer-tabbar-placeholder { display: block; } /* 有 tabbar 时页脚需要额外底部间距 */ .site-footer { padding-bottom: calc(49px + 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(--color-ink-4); 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: 24px; line-height: 1; } .tabbar-item span { display: block; font-weight: 500; line-height: 1; transform: scale(0.8); transform-origin: center top; } .tabbar-item:hover, .tabbar-item.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-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-page); box-shadow: 0 18px 50px rgba(15, 23, 42, 0.18); 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-page); 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; background: var(--surface-2); } .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: 0; border-radius: 16px; padding: 12px 14px; background: var(--surface-2); 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 .float-btn, html.dark .float-btn { background: var(--float-btn-bg); box-shadow: var(--shadow-sm); } .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%; } .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; } /* ============================================================ * Floating Buttons * ============================================================ */ .float-right { --float-btn-size: 42px; --float-btn-color: var(--color-ink-3); position: fixed; right: 20px; bottom: 96px; z-index: 900; display: flex; flex-direction: column; gap: 8px; transition: transform var(--dur, 0.25s) var(--ease, ease), opacity var(--dur, 0.25s) var(--ease, ease); padding-bottom: env(safe-area-inset-bottom, 0px); } .float-right.position-center { top: 50%; bottom: auto; transform: translateY(-50%); } .float-right.square { gap: 0; overflow: hidden; border-radius: var(--radius-lg, 8px); box-shadow: var(--shadow-md, 0 10px 30px rgba(17, 24, 39, 0.12)); } .float-right .float-btn { width: var(--float-btn-size); min-height: var(--float-btn-size); display: inline-flex; align-items: center; justify-content: center; position: relative; color: var(--this-color, var(--float-btn-color)); background: var(--this-bg, var(--float-btn-bg)); border: 1px solid var(--color-line-soft, #f0f1f3); text-decoration: none; box-shadow: var(--shadow, 0 8px 24px rgba(17, 24, 39, 0.08)); transition: transform var(--dur-fast, 0.15s) var(--ease, ease), box-shadow var(--dur-fast, 0.15s) var(--ease, ease), color var(--dur-fast, 0.15s) var(--ease, ease), background var(--dur-fast, 0.15s) var(--ease, ease); cursor: pointer; outline: none; overflow: visible; } .float-right.round .float-btn { border-radius: 12px; } .float-right.square .float-btn { border-radius: 0; box-shadow: none; border-top-width: 0; } .float-right.square .float-btn:first-child { border-top-width: 1px; } .float-right .float-btn:hover { transform: translateY(-2px); color: var(--color-primary, var(--color-primary)); text-decoration: none; box-shadow: var(--shadow-md, 0 10px 30px rgba(17, 24, 39, 0.12)); z-index: 2; } .float-right .float-btn:active { transform: scale(0.96); } .float-right .float-btn::after { content: ""; position: absolute; inset: auto; width: 6px; height: 6px; border-radius: 999px; background: currentColor; opacity: 0; transform: scale(1); pointer-events: none; } .float-right .float-btn.is-rippling::after { animation: float-btn-ripple 0.55s ease-out; } .float-right .float-btn i { font-size: 16px; line-height: 1; } .float-right .float-btn.ontop { opacity: 0; visibility: hidden; pointer-events: none; } .float-right .float-btn.ontop.is-visible { opacity: 1; visibility: visible; pointer-events: auto; } .float-right.has-blur-pc .float-btn { backdrop-filter: saturate(1.5) blur(10px); -webkit-backdrop-filter: saturate(1.5) blur(10px); } .float-right .hover-show-con { position: absolute; display: block; right: calc(100% + 12px); top: 50%; transform: translateY(-50%); min-width: 180px; max-width: 280px; padding: 12px; border-radius: var(--radius-lg, 8px); background: var(--surface-1, #fff); border: 1px solid var(--color-line); box-shadow: var(--shadow-lg, 0 18px 40px rgba(17, 24, 39, 0.18)); color: var(--color-ink-2); opacity: 0; visibility: hidden; pointer-events: none; transition: opacity var(--dur-fast, 0.15s) var(--ease, ease), transform var(--dur-fast, 0.15s) var(--ease, ease), visibility var(--dur-fast, 0.15s) var(--ease, ease); } .float-right .hover-show-con::before { content: ""; position: absolute; top: 50%; right: -8px; width: 16px; height: 16px; background: inherit; border-top: 1px solid var(--color-line); border-right: 1px solid var(--color-line); transform: translateY(-50%) rotate(45deg); } .float-right .hover-show-con img { display: block; width: 100%; max-width: 160px; height: auto; margin: 0 auto 10px; border-radius: var(--radius, 10px); } .float-right .hover-show-con p { margin: 0; font-size: 13px; line-height: 1.6; color: var(--color-ink-3); } .float-btn-qrcode { display: flex; align-items: center; justify-content: center; width: 100%; min-height: 120px; margin: 0 auto 10px; background: #fff; border-radius: var(--radius, 10px); } .float-right .service-wechat .hover-show-con, .float-right .service-qq .hover-show-con, .float-right .qrcode-btn .hover-show-con { padding: 14px; } .float-right .service-wechat .hover-show-con img, .float-right .service-qq .hover-show-con img { margin: 0 auto; box-shadow: 0 10px 24px rgba(17, 24, 39, 0.12); } .float-right .service-wechat .hover-show-con p, .float-right .service-qq .hover-show-con p { display: none; } .float-right .newadd-btns .hover-show-con { min-width: 196px; padding: 10px; } .float-add-menu { display: flex; flex-direction: column; gap: 6px; } .float-add-menu__item { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border-radius: 10px; color: var(--color-ink-2); text-decoration: none; transition: background var(--dur-fast, 0.15s) var(--ease, ease), color var(--dur-fast, 0.15s) var(--ease, ease), transform var(--dur-fast, 0.15s) var(--ease, ease); } .float-add-menu__item i { width: 18px; text-align: center; color: var(--color-primary, var(--color-primary)); } .float-add-menu__item:hover { background: var(--color-primary-soft, rgba(136, 171, 218, 0.1)); color: var(--color-primary, var(--color-primary)); transform: translateX(-2px); } .float-btn-qrcode :deep(canvas), .float-btn-qrcode :deep(img), .float-btn-qrcode svg { display: block; margin: 0 auto; } .float-right .float-btn:hover .hover-show-con, .float-right .float-btn:focus-visible .hover-show-con { opacity: 1; visibility: visible; pointer-events: auto; transform: translateY(-50%) translateX(-4px); } .float-right.scrolling-hide.is-hidden, .float-right.scroll-down-hide.is-hidden { transform: translateX(calc(100% + 24px)); } .float-right.position-center.scrolling-hide.is-hidden, .float-right.position-center.scroll-down-hide.is-hidden { transform: translateX(calc(100% + 24px)) translateY(-50%); } .float-right__html { font-size: 13px; line-height: 1.6; } .float-right__html a { color: var(--color-primary, var(--color-primary)); } .float-right__html a:hover { color: var(--color-primary-hover, #7099CC); } @keyframes float-btn-ripple { 0% { opacity: 0.22; transform: scale(1); } 100% { opacity: 0; transform: scale(14); } } .float-btn__icon-moon { display: none; } .float-btn__icon-sun { display: inline-block; } .theme-dark .float-btn__icon-moon, html.dark .float-btn__icon-moon { display: inline-block; } .theme-dark .float-btn__icon-sun, html.dark .float-btn__icon-sun { display: none; } .theme-dark .float-right, html.dark .float-right { --float-btn-color: var(--color-ink-4); } .theme-dark .float-right .hover-show-con, html.dark .float-right .hover-show-con { background: var(--surface-2, #1f2430); border-color: rgba(255, 255, 255, 0.08); } @media (max-width: 767px) { .float-right { right: 12px; bottom: 84px; --float-btn-size: 40px; } .float-right.has-blur-mobile .float-btn { backdrop-filter: saturate(1.5) blur(10px); -webkit-backdrop-filter: saturate(1.5) blur(10px); } .float-right .hover-show-con { max-width: min(240px, calc(100vw - 84px)); } } /** * AKSRT Theme Background System * * 全局背景图、夜间背景图、页面背景色/背景图。 * 所有选择器均带 aksrt- 命名空间。 */ /* ========== 全局背景 ========== */ .aksrt-bg-body { background-color: var(--aksrt-bg-color, transparent); background-image: var(--aksrt-bg-image, none); background-size: var(--aksrt-bg-size, cover); background-position: var(--aksrt-bg-position, center center); background-repeat: var(--aksrt-bg-repeat, no-repeat); background-attachment: var(--aksrt-bg-attachment, fixed); } /* ========== 夜间模式背景 ========== */ .aksrt-bg-dark { background-color: var(--aksrt-bg-dark-color, transparent); background-image: var(--aksrt-bg-dark-image, none); } /* ========== 页面级背景 ========== */ .aksrt-bg-page { background-color: var(--aksrt-page-bg-color, transparent); background-image: var(--aksrt-page-bg-image, none); background-size: cover; background-position: center center; background-repeat: no-repeat; } /* ========== 模块级背景 ========== */ .aksrt-bg-module { background-color: var(--aksrt-module-bg-color, transparent); background-image: var(--aksrt-module-bg-image, none); background-size: cover; background-position: center center; background-repeat: no-repeat; } /* ========== 背景遮罩层(提升文字可读性)========== */ .aksrt-bg-overlay { position: relative; } .aksrt-bg-overlay::before { content: ''; position: absolute; inset: 0; background: var(--aksrt-bg-overlay-color, rgba(0, 0, 0, 0.3)); pointer-events: none; z-index: 0; } .aksrt-bg-overlay > * { position: relative; z-index: 1; } /* ========== 暗色模式自动切换 ========== */ @media (prefers-color-scheme: dark) { :root:not(.aksrt-light-mode) .aksrt-bg-body { background-color: var(--aksrt-bg-dark-color, var(--aksrt-bg-color, transparent)); background-image: var(--aksrt-bg-dark-image, var(--aksrt-bg-image, none)); } } html.aksrt-dark-mode .aksrt-bg-body { background-color: var(--aksrt-bg-dark-color, var(--aksrt-bg-color, transparent)); background-image: var(--aksrt-bg-dark-image, var(--aksrt-bg-image, none)); } /** * AKSRT Menu Decorations * * 菜单图标、徽章、多列下拉、图文卡片子菜单样式。 * 所有选择器均带 aksrt- 或 .site-nav 命名空间。 */ /* ========== 菜单图标 ========== */ .nav-desktop .menu-item > a .menu-icon, .nav-desktop .menu-item > a > i:first-child { display: inline-flex; align-items: center; margin-right: 6px; font-size: 14px; opacity: 0.75; transition: opacity 0.2s ease; } .nav-desktop .menu-item:hover > a .menu-icon, .nav-desktop .menu-item:hover > a > i:first-child { opacity: 1; } /* ========== 菜单徽章 ========== */ .nav-desktop .menu-item > a .menu-badge, .nav-desktop .menu-item > a .aksrt-menu-badge { display: inline-flex; align-items: center; justify-content: center; margin-left: 6px; padding: 1px 6px; font-size: 10px; font-weight: 700; line-height: 1.4; letter-spacing: 0.02em; border-radius: 8px; white-space: nowrap; vertical-align: middle; transform: translateY(-1px); } .aksrt-menu-badge--new { background: var(--color-primary); color: #fff; } .aksrt-menu-badge--hot { background: #ff4d4f; color: #fff; } .aksrt-menu-badge--info { background: var(--color-info, #1890ff); color: #fff; } .aksrt-menu-badge--success { background: var(--color-success, #52c41a); color: #fff; } .aksrt-menu-badge--warning { background: var(--color-warning, #faad14); color: #fff; } /* ========== Hover 效果 ========== */ /* 下划线效果 */ .aksrt-menu-hover--underline .nav-desktop .menu-item > a { position: relative; } .aksrt-menu-hover--underline .nav-desktop .menu-item > a::after { content: ''; position: absolute; bottom: 0; left: 50%; width: 0; height: 2px; background: var(--color-primary); border-radius: 1px; transform: translateX(-50%); transition: width 0.25s ease; } .aksrt-menu-hover--underline .nav-desktop .menu-item:hover > a::after, .aksrt-menu-hover--underline .nav-desktop .menu-item.current-menu-item > a::after, .aksrt-menu-hover--underline .nav-desktop .menu-item.current_page_item > a::after { width: 70%; } /* 背景色效果 */ .aksrt-menu-hover--background .nav-desktop .menu-item > a { border-radius: 6px; transition: background-color 0.2s ease; } .aksrt-menu-hover--background .nav-desktop .menu-item:hover > a { background-color: var(--color-primary-soft, rgba(24, 144, 255, 0.08)); } /* 文字变色效果 */ .aksrt-menu-hover--color .nav-desktop .menu-item > a { transition: color 0.2s ease; } .aksrt-menu-hover--color .nav-desktop .menu-item:hover > a { color: var(--color-primary); } /* ========== 多列 Mega 下拉 ========== */ .nav-desktop .menu-item .aksrt-mega-submenu { position: absolute; top: 100%; left: 50%; z-index: 999; min-width: var(--aksrt-mega-width, 480px); padding: 16px 20px; background: var(--surface-page, #fff); border: 1px solid var(--color-line, #e8e8e8); border-radius: 8px; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12); opacity: 0; visibility: hidden; transform: translateX(-50%) translateY(8px); transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s ease; } .nav-desktop .menu-item:hover .aksrt-mega-submenu { opacity: 1; visibility: visible; transform: translateX(-50%) translateY(0); } .aksrt-mega-submenu__grid { display: grid; gap: 12px; } .aksrt-mega-submenu__grid--cols-2 { grid-template-columns: repeat(2, 1fr); } .aksrt-mega-submenu__grid--cols-3 { grid-template-columns: repeat(3, 1fr); } .aksrt-mega-submenu__grid--cols-4 { grid-template-columns: repeat(4, 1fr); } .aksrt-mega-submenu__grid--cols-5 { grid-template-columns: repeat(5, 1fr); } .aksrt-mega-submenu__item { display: flex; align-items: flex-start; gap: 10px; padding: 10px 12px; border-radius: 6px; text-decoration: none; color: var(--color-ink); transition: background-color 0.15s ease; } .aksrt-mega-submenu__item:hover { background-color: var(--color-primary-soft, rgba(24, 144, 255, 0.08)); } .aksrt-mega-submenu__item-icon { flex-shrink: 0; display: flex; align-items: center; justify-content: center; width: 32px; height: 32px; border-radius: 6px; background: var(--color-primary-soft, rgba(24, 144, 255, 0.08)); color: var(--color-primary); font-size: 14px; } .aksrt-mega-submenu__item-content { flex: 1; min-width: 0; } .aksrt-mega-submenu__item-title { font-size: 13px; font-weight: 500; line-height: 1.4; color: var(--color-ink); } .aksrt-mega-submenu__item-desc { margin-top: 2px; font-size: 12px; line-height: 1.4; color: var(--text-tertiary, #8a909c); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* ========== 图文卡片子菜单 ========== */ .nav-desktop .menu-item .aksrt-card-submenu { position: absolute; top: 100%; left: 50%; z-index: 999; display: flex; gap: 12px; padding: 16px; background: var(--surface-page, #fff); border: 1px solid var(--color-line, #e8e8e8); border-radius: 8px; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12); opacity: 0; visibility: hidden; transform: translateX(-50%) translateY(8px); transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s ease; } .nav-desktop .menu-item:hover .aksrt-card-submenu { opacity: 1; visibility: visible; transform: translateX(-50%) translateY(0); } .aksrt-card-submenu__item { display: flex; flex-direction: column; width: var(--aksrt-card-width, 160px); text-decoration: none; border-radius: 8px; overflow: hidden; transition: transform 0.2s ease, box-shadow 0.2s ease; } .aksrt-card-submenu__item:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); } .aksrt-card-submenu__thumb { width: 100%; aspect-ratio: 16 / 10; object-fit: cover; background: var(--color-fill, #f5f5f5); } .aksrt-card-submenu__body { padding: 8px 10px; } .aksrt-card-submenu__title { font-size: 13px; font-weight: 500; line-height: 1.4; color: var(--color-ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .aksrt-card-submenu__desc { margin-top: 2px; font-size: 11px; line-height: 1.4; color: var(--text-tertiary, #8a909c); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* ========== 暗色模式适配 ========== */ html.dark .aksrt-mega-submenu, html.dark .aksrt-card-submenu, html.dark .aksrt-mega-submenu, html.dark .aksrt-card-submenu { background: var(--surface-page); border-color: var(--color-line, #2d2d3f); } html.dark .aksrt-mega-submenu__item-title, html.dark .aksrt-card-submenu__title, html.dark .aksrt-mega-submenu__item-title, html.dark .aksrt-card-submenu__title { color: var(--color-ink); } /** * 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: translateY(-2px); 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) { z-index: 1; } .dark::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; } /* ============================================================ * 6. 图片灯箱 * ============================================================ */ .aksrt-lightbox { position: fixed; inset: 0; z-index: 9999; background: rgba(0, 0, 0, 0.85); display: flex; align-items: center; justify-content: center; opacity: 0; visibility: hidden; transition: opacity 0.3s, visibility 0.3s; cursor: zoom-out; } .aksrt-lightbox.is-open { opacity: 1; visibility: visible; } .aksrt-lightbox__img { max-width: 90vw; max-height: 85vh; object-fit: contain; border-radius: 4px; transform: scale(0.9); transition: transform 0.3s; cursor: default; } .aksrt-lightbox.is-open .aksrt-lightbox__img { transform: scale(1); } .aksrt-lightbox__close { position: absolute; top: 16px; right: 16px; width: 36px; height: 36px; border: none; border-radius: 50%; background: rgba(255, 255, 255, 0.15); color: #fff; font-size: 20px; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.2s; } .aksrt-lightbox__close:hover { background: rgba(255, 255, 255, 0.3); } .aksrt-lightbox__caption { position: absolute; bottom: 16px; left: 50%; transform: translateX(-50%); color: rgba(255, 255, 255, 0.8); font-size: 14px; text-align: center; max-width: 80%; } .aksrt-lightbox__nav { position: absolute; top: 50%; transform: translateY(-50%); width: 48px; height: 48px; border: none; border-radius: 50%; background: rgba(255, 255, 255, 0.1); color: #fff; font-size: 24px; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.2s; } .aksrt-lightbox__nav:hover { background: rgba(255, 255, 255, 0.25); } .aksrt-lightbox__nav--prev { left: 16px; } .aksrt-lightbox__nav--next { right: 16px; } .aksrt-lightbox__counter { position: absolute; top: 16px; left: 16px; color: rgba(255, 255, 255, 0.7); font-size: 14px; } .aksrt-lightbox__download { position: absolute; top: 16px; right: 64px; width: 40px; height: 40px; border: none; border-radius: 50%; background: rgba(255, 255, 255, 0.15); color: #fff; font-size: 18px; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.2s; } .aksrt-lightbox__download:hover { background: rgba(255, 255, 255, 0.3); } /* 可缩放图片的光标 */ .aksrt-cursor-zoom-in { cursor: zoom-in; } /* ============================================================ * 7. 文章封面轮播 * ============================================================ */ .single-cover-slider { position: relative; width: 100%; overflow: hidden; border-radius: var(--radius-lg, 8px); } .single-cover-slider .swiper-slide { position: relative; overflow: hidden; } .single-cover-slider__img { width: 100%; height: 400px; object-fit: cover; display: block; } .single-cover-slider__overlay { position: absolute; inset: 0; background: linear-gradient(180deg, rgba(0,0,0,0) 40%, rgba(0,0,0,0.6) 100%); pointer-events: none; } .single-cover-slider__content { position: absolute; bottom: 0; left: 0; right: 0; padding: 24px; color: #fff; z-index: 2; } .single-cover-slider__title { margin: 0 0 8px; font-size: 24px; font-weight: 700; text-shadow: 0 1px 3px rgba(0,0,0,0.3); } .single-cover-slider__meta { display: flex; gap: 16px; font-size: 13px; opacity: 0.9; } .single-cover-slider__pagination { position: absolute; bottom: 12px; right: 16px; z-index: 3; } .single-cover-slider__pagination .swiper-pagination-bullet { background: rgba(255,255,255,0.6); opacity: 1; } .single-cover-slider__pagination .swiper-pagination-bullet-active { background: #fff; } .single-cover-slider__prev, .single-cover-slider__next { position: absolute; top: 50%; transform: translateY(-50%); z-index: 3; width: 40px; height: 40px; border: none; border-radius: 50%; background: rgba(0,0,0,0.3); color: #fff; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.2s; } .single-cover-slider__prev:hover, .single-cover-slider__next:hover { background: rgba(0,0,0,0.5); } .single-cover-slider__prev { left: 12px; } .single-cover-slider__next { right: 12px; } @media (max-width: 640px) { .single-cover-slider__img { height: 240px; } .single-cover-slider__title { font-size: 18px; } } /* ============================================================ * 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); } /* ============================================================ * 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; } /* ============================================================ * 10. 用户卡片 Widget * ============================================================ */ .aksrt-user-card { text-align: center; padding: 20px; } .aksrt-user-card__avatar { width: 72px; height: 72px; border-radius: 50%; margin: 0 auto 12px; overflow: hidden; border: 3px solid var(--color-primary-soft, rgba(136,171,218,0.1)); } .aksrt-user-card__avatar img { width: 100%; height: 100%; object-fit: cover; } .aksrt-user-card__name { margin: 0 0 4px; font-size: 16px; font-weight: 600; color: var(--color-ink); } .aksrt-user-card__name a { color: inherit; text-decoration: none; } .aksrt-user-card__name a:hover { color: var(--color-primary, var(--color-primary)); } .aksrt-user-card__bio { margin: 0 0 12px; font-size: 13px; color: var(--color-ink-3); line-height: 1.5; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .aksrt-user-card__stats { display: flex; justify-content: center; gap: 20px; margin-bottom: 16px; } .aksrt-user-card__stat { text-align: center; } .aksrt-user-card__stat-value { display: block; font-size: 18px; font-weight: 600; color: var(--color-ink); } .aksrt-user-card__stat-label { font-size: 12px; color: var(--color-ink-4, #8A8F98); } .aksrt-user-card__actions { display: flex; gap: 8px; justify-content: center; } .aksrt-user-card__btn { display: inline-flex; align-items: center; gap: 4px; padding: 6px 16px; border-radius: var(--radius, 10px); font-size: 13px; text-decoration: none; transition: all 0.15s; } .aksrt-user-card__btn--primary { background: var(--color-primary, var(--color-primary)); color: #fff; } .aksrt-user-card__btn--primary:hover { opacity: 0.85; color: #fff; } .aksrt-user-card__btn--ghost { border: 1px solid var(--color-line); color: var(--color-ink-2); } .aksrt-user-card__btn--ghost:hover { border-color: var(--color-primary, var(--color-primary)); color: var(--color-primary, var(--color-primary)); } /* ============================================================ * 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. 签到日历可视化 * ============================================================ */ .aksrt-signin-calendar__grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; } .aksrt-signin-calendar__day { aspect-ratio: 1; display: flex; align-items: center; justify-content: center; border-radius: 6px; background: var(--surface-2, #F4F5F7); font-size: 12px; color: var(--color-ink-3); transition: all 0.2s; } .aksrt-signin-calendar__day.is-signed { background: var(--color-success, #10B981); color: #fff; } .aksrt-signin-calendar__day.is-today { border: 2px solid var(--color-primary, var(--color-primary)); } .aksrt-signin-calendar__day.is-signed.is-today { background: var(--color-primary, var(--color-primary)); border-color: var(--color-primary, var(--color-primary)); } .uc-signin-calendar__title { display: flex; align-items: center; gap: 6px; margin: 0 0 10px; font-size: 14px; font-weight: 600; color: var(--color-ink-2); } .uc-signin-calendar__title i { color: var(--color-primary, var(--color-primary)); } /* ============================================================ * 19. 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); } /* ============================================================ * 21. 弹窗登录/注册 * ============================================================ */ .aksrt-modal-auth { 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; } .aksrt-modal-auth.is-open { opacity: 1; visibility: visible; } .aksrt-modal-auth__overlay { position: absolute; inset: 0; background: rgba(0, 0, 0, 0.5); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); } .aksrt-modal-auth__card { position: relative; background: var(--main-bg-color, #fff); border-radius: var(--main-radius, 8px); padding: 32px; max-width: 400px; width: 90%; max-height: 90vh; overflow-y: auto; box-shadow: 0 0 10px var(--main-shadow, rgba(116, 116, 116, 0.08)); z-index: 1; transform: scale(0.9); transition: transform 0.5s cubic-bezier(0.32, 0.85, 0.45, 1.18); } .aksrt-modal-auth.is-open .aksrt-modal-auth__card { transform: scale(1); } .aksrt-modal-auth__close { position: absolute; top: 12px; right: 12px; width: 36px; height: 36px; 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; font-size: 16px; } .aksrt-modal-auth__close:hover { background: var(--surface-3, #ECEEF1); } .aksrt-modal-auth__header { text-align: center; margin-bottom: 24px; } .aksrt-modal-auth__logo { width: 56px; height: 56px; border-radius: var(--radius); background: linear-gradient(135deg, var(--color-primary, var(--color-primary)), var(--color-primary-active, #5A85BD)); color: #fff; font-size: 22px; font-weight: 700; display: flex; align-items: center; justify-content: center; margin: 0 auto 12px; } .aksrt-modal-auth__title { margin: 0; font-size: 20px; font-weight: 600; color: var(--color-ink); } /* Tabs */ .aksrt-modal-auth__tabs { display: flex; border-bottom: 1px solid var(--color-line); margin-bottom: 20px; } .aksrt-modal-auth__tab { flex: 1; padding: 10px; border: none; background: none; font-size: 15px; font-weight: 500; color: var(--color-ink-3); cursor: pointer; position: relative; transition: color 0.2s; } .aksrt-modal-auth__tab.is-active { color: var(--color-primary, var(--color-primary)); } .aksrt-modal-auth__tab.is-active::after { content: ''; position: absolute; bottom: -1px; left: 0; right: 0; height: 2px; background: var(--color-primary, var(--color-primary)); } /* Panels */ .aksrt-modal-auth__panel { display: none; } .aksrt-modal-auth__panel.is-active { display: block; } /* Form */ .aksrt-modal-auth__form { display: flex; flex-direction: column; gap: 16px; } .aksrt-modal-auth__error { padding: 10px 14px; border-radius: 8px; background: rgba(239, 68, 68, 0.08); color: var(--color-error, #EF4444); font-size: 13px; line-height: 1.5; } .aksrt-modal-auth__error a { color: var(--color-primary, var(--color-primary)); text-decoration: underline; } .aksrt-modal-auth__field label { display: block; font-size: 13px; font-weight: 500; color: var(--color-ink-2); margin-bottom: 6px; } .aksrt-modal-auth__field input { width: 100%; padding: 10px 14px; border: 1px solid var(--color-line); border-radius: 10px; font-size: 14px; color: var(--color-ink); background: var(--surface-1, #fff); transition: border-color 0.2s; box-sizing: border-box; } .aksrt-modal-auth__field input:focus { outline: none; border-color: var(--color-primary, var(--color-primary)); } .aksrt-modal-auth__field input::placeholder { color: var(--color-ink-4, #8A8F98); } .aksrt-modal-auth__pass-wrap { position: relative; } .aksrt-modal-auth__pass-wrap input { padding-right: 44px; } .aksrt-modal-auth__pass-toggle { position: absolute; right: 8px; top: 50%; transform: translateY(-50%); width: 32px; height: 32px; border: none; background: none; color: var(--color-ink-4, #8A8F98); cursor: pointer; display: flex; align-items: center; justify-content: center; border-radius: 6px; } .aksrt-modal-auth__pass-toggle:hover { background: var(--surface-2, #F4F5F7); } .aksrt-modal-auth__actions { display: flex; justify-content: flex-end; } .aksrt-modal-auth__link { font-size: 13px; color: var(--color-primary, var(--color-primary)); text-decoration: none; } .aksrt-modal-auth__link:hover { text-decoration: underline; } .aksrt-modal-auth__submit { width: 100%; padding: 12px; border: none; border-radius: 10px; background: var(--color-primary, var(--color-primary)); color: #fff; font-size: 15px; font-weight: 600; cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 8px; transition: opacity 0.2s; } .aksrt-modal-auth__submit:hover { opacity: 0.85; } .aksrt-modal-auth__submit:disabled { opacity: 0.6; cursor: not-allowed; } /* Divider */ .aksrt-modal-auth__divider { display: flex; align-items: center; gap: 12px; margin: 20px 0; color: var(--color-ink-4, #8A8F98); font-size: 12px; } .aksrt-modal-auth__divider::before, .aksrt-modal-auth__divider::after { content: ''; flex: 1; height: 1px; background: var(--color-line); } /* OAuth */ .aksrt-modal-auth__oauth { display: flex; justify-content: center; gap: 12px; } .aksrt-modal-auth__oauth-btn { width: 44px; height: 44px; border: 1px solid var(--color-line); border-radius: 50%; display: flex; align-items: center; justify-content: center; color: var(--color-ink-2); font-size: 18px; text-decoration: none; transition: all 0.2s; } .aksrt-modal-auth__oauth-btn:hover { border-color: var(--color-primary, var(--color-primary)); color: var(--color-primary, var(--color-primary)); background: var(--color-primary-soft, rgba(136, 171, 218, 0.1)); } /* Footer */ .aksrt-modal-auth__footer { text-align: center; margin-top: 20px; font-size: 13px; color: var(--color-ink-3); } .aksrt-modal-auth__switch { border: none; background: none; color: var(--color-primary, var(--color-primary)); cursor: pointer; font-size: 13px; font-weight: 500; padding: 0; } .aksrt-modal-auth__switch:hover { text-decoration: underline; } /* Dark mode */ .theme-dark .aksrt-modal-auth__card, html.dark .aksrt-modal-auth__card { background: #1e1e2e; border: 1px solid rgba(255, 255, 255, 0.1); } .theme-dark .aksrt-modal-auth__field input, html.dark .aksrt-modal-auth__field input { background: #2a2a3a; border-color: rgba(255, 255, 255, 0.15); color: #e0e0e0; } .theme-dark .aksrt-modal-auth__close, html.dark .aksrt-modal-auth__close { background: #2a2a3a; } /* Responsive */ @media (max-width: 480px) { .aksrt-modal-auth__card { padding: 24px 20px; border-radius: 12px; } .aksrt-modal-auth__logo { width: 48px; height: 48px; font-size: 18px; } .aksrt-modal-auth__title { font-size: 18px; } } /* ============================================================ * 22. 语言切换器 * ============================================================ */ .aksrt-lang-switch { position: relative; } .aksrt-lang-switch__toggle { display: flex; align-items: center; gap: 6px; padding: 8px 12px; border: 1px solid var(--color-line); border-radius: var(--radius, 10px); background: var(--surface-1, #fff); color: var(--color-ink-2); font-size: 13px; cursor: pointer; transition: border-color 0.2s; width: 100%; } .aksrt-lang-switch__toggle:hover { border-color: var(--color-primary, var(--color-primary)); } .aksrt-lang-switch__toggle img { border-radius: 2px; } .aksrt-lang-switch__dropdown { position: absolute; top: 100%; left: 0; right: 0; margin: 4px 0 0; padding: 4px; list-style: none; background: var(--surface-1, #fff); border: 1px solid var(--color-line); border-radius: var(--radius, 10px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); z-index: 100; opacity: 0; visibility: hidden; transform: translateY(4px); transition: all 0.2s; } .aksrt-lang-switch:hover .aksrt-lang-switch__dropdown, .aksrt-lang-switch__toggle:focus + .aksrt-lang-switch__dropdown { opacity: 1; visibility: visible; transform: translateY(0); } .aksrt-lang-switch__item { display: flex; align-items: center; gap: 8px; padding: 8px 10px; border-radius: 6px; font-size: 13px; color: var(--color-ink-2); text-decoration: none; transition: background 0.15s; } .aksrt-lang-switch__item:hover { background: var(--surface-2, #F4F5F7); } .aksrt-lang-switch__item.is-active { color: var(--color-primary, var(--color-primary)); font-weight: 600; } .aksrt-lang-switch__item img { border-radius: 2px; } /* 国旗模式 */ .aksrt-lang-switch--flags { display: flex; flex-wrap: wrap; gap: 8px; } .aksrt-lang-switch__flag { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 24px; border: 2px solid transparent; border-radius: 4px; overflow: hidden; transition: border-color 0.2s; text-decoration: none; } .aksrt-lang-switch__flag:hover { border-color: var(--color-primary, var(--color-primary)); } .aksrt-lang-switch__flag.is-active { border-color: var(--color-primary, var(--color-primary)); } .aksrt-lang-switch__flag img { width: 100%; height: 100%; object-fit: cover; } .aksrt-lang-switch__flag span { font-size: 10px; font-weight: 600; color: var(--color-ink-3); } /* Dark mode */ .theme-dark .aksrt-lang-switch__toggle, html.dark .aksrt-lang-switch__toggle { background: #2a2a3a; border-color: rgba(255, 255, 255, 0.15); } .theme-dark .aksrt-lang-switch__dropdown, html.dark .aksrt-lang-switch__dropdown { background: #2a2a3a; border-color: rgba(255, 255, 255, 0.15); } /* ============================================================ * 响应式 * ============================================================ */ @media (max-width: 640px) { .aksrt-lightbox__nav { width: 36px; height: 36px; font-size: 18px; } .single-cover-slider__img { height: 240px; } .single-cover-slider__title { font-size: 18px; } .reward-modal__card { padding: 24px; } .reward-modal__qr { width: 160px; height: 160px; } .aksrt-cover-cards { grid-template-columns: 1fr; } .aksrt-cover-card { min-height: 140px; } } /* ============================================================ * 13. 无障碍:prefers-reduced-motion * 用户系统设置"减少动画"时,禁用所有非必要动效 * ============================================================ */ @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; } .aksrt-skeleton { animation: none !important; } [data-aksrt-animate] { opacity: 1 !important; transform: none !important; } } /* ============================================================ * 14. 图片懒加载 blur-to-sharp 过渡 * 模仿 legacy 的 lazy_blur 效果 * ============================================================ */ img.lazyload, img.lazyloaded, img[data-src] { transition: filter 0.6s var(--ease), opacity 0.4s var(--ease); } img.lazyload, img[data-src] { filter: blur(5px); opacity: 0.7; } img.lazyloaded { filter: blur(0); opacity: 1; } /* ============================================================ * 15. 错误反馈 shake 动画 * 表单验证失败时的水平抖动效果 * ============================================================ */ @keyframes aksrtShake { 0%, 100% { transform: translateX(0); } 10%, 30%, 50%, 70%, 90% { transform: translateX(-4px); } 20%, 40%, 60%, 80% { transform: translateX(4px); } } .aksrt-shake { animation: aksrtShake 0.4s ease-in-out; } /* 应用于 Naive UI 表单验证 */ .n-form-item--error .n-input, .n-form-item--error .n-select, .n-form-item--error .n-input-number { animation: aksrtShake 0.3s ease-in-out; } /* ============================================================ * 16. FPS 加速模式:低端设备禁用 backdrop-filter * 模仿 legacy 的 body.fps-accelerat 模式 * ============================================================ */ body.fps-accelerat .site-nav, body.fps-accelerat .footer-tabbar, body.fps-accelerat .float-right .float-btn, body.fps-accelerat .aksrt-blur-bg { backdrop-filter: none !important; -webkit-backdrop-filter: none !important; } /* 模态框内禁用 backdrop-filter 避免渲染冲突 */ body.modal-open .site-nav, body.dialog-open .site-nav { backdrop-filter: none !important; -webkit-backdrop-filter: none !important; } /* ============================================================ * 17. .blur-bg 通用工具类 * 模仿 legacy 的 .blur-bg,可在任意元素上应用毛玻璃效果 * ============================================================ */ .aksrt-blur-bg { background: var(--blur-bg); backdrop-filter: saturate(5) blur(20px); -webkit-backdrop-filter: saturate(5) blur(20px); } /* ============================================================ * 18. 滚动触发动画延迟支持 * data-aksrt-delay 属性控制入场延迟 * ============================================================ */ [data-aksrt-animate][data-aksrt-delay="1"] { transition-delay: 0.1s; } [data-aksrt-animate][data-aksrt-delay="2"] { transition-delay: 0.2s; } [data-aksrt-animate][data-aksrt-delay="3"] { transition-delay: 0.3s; } [data-aksrt-animate][data-aksrt-delay="4"] { transition-delay: 0.4s; } [data-aksrt-animate][data-aksrt-delay="5"] { transition-delay: 0.5s; } /* ============================================================ * 19. 全站动效节奏统一 * 模仿 legacy 的统一 hover / slide / blur / drawer 语言 * ============================================================ */ /* --- 全局过渡基线 --- */ a, button, input, select, textarea { transition: border-color var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease), background-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease); } /* --- 卡片 hover 统一 --- */ .post-card, .widget, .aksrt-theme-box, .theme-box, .comment-body, .friend-card, .special-card, .resource-download-box, .resource-meta-box { transition: box-shadow var(--dur) var(--ease), border-color var(--dur) var(--ease), transform var(--dur) var(--ease); } .post-card:hover, .widget:hover, .friend-card:hover, .special-card:hover { box-shadow: var(--shadow); transform: translateY(-2px); } /* --- 按钮 hover 统一 --- */ .btn-primary, .btn-outline, .btn-lg, .btn-sm, .n-button, .aksrt-button { transition: all var(--dur-fast) var(--ease); } .btn-primary:hover, .n-button--primary-type:hover { opacity: 0.85; } .btn-primary:active, .n-button--primary-type:active { opacity: 1; } /* --- 输入框 focus 统一 --- */ input:focus, textarea:focus, select:focus, .n-input--focus, .n-select--focus { box-shadow: var(--focus-ring); transition: box-shadow var(--dur-fast) var(--ease); } /* --- 抽屉/模态框动效统一 --- */ .n-drawer, .n-modal, .n-dialog { transition: all var(--dur) var(--ease-out); } .n-drawer-mask, .n-modal-mask, .n-dialog-mask { transition: opacity var(--dur) var(--ease); } /* --- Tab 切换动效 --- */ .n-tabs-tab, .nav-tab, .aksrt-tab { transition: color var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease), background-color var(--dur-fast) var(--ease); } /* --- 下拉菜单动效 --- */ .n-dropdown-menu, .aksrt-dropdown { transition: opacity var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease-out); transform-origin: top; } /* --- 骨架屏动效 --- */ .aksrt-skeleton { animation: aksrtSkeletonShimmer 1.5s infinite linear; background: linear-gradient(90deg, var(--skeleton-base) 25%, var(--skeleton-shine) 50%, var(--skeleton-base) 75%); background-size: 200% 100%; } /* --- 页面切换动效 --- */ .fade-slide-enter-active, .fade-slide-leave-active { transition: opacity var(--dur) var(--ease), transform var(--dur) var(--ease); } .fade-slide-enter-from { opacity: 0; transform: translateY(8px); } .fade-slide-leave-to { opacity: 0; transform: translateY(-8px); } /* --- 导航栏滚动动效 --- */ .site-nav { transition: transform var(--dur) var(--ease), background-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease); } .site-nav.aksrt-nav--hidden { transform: translateY(-100%); } /* --- 浮层弹出动效 --- */ @keyframes aksrtPopIn { 0% { opacity: 0; transform: scale(0.95) translateY(-4px); } 100% { opacity: 1; transform: scale(1) translateY(0); } } @keyframes aksrtPopOut { 0% { opacity: 1; transform: scale(1) translateY(0); } 100% { opacity: 0; transform: scale(0.95) translateY(-4px); } } .aksrt-popover, .aksrt-tooltip, .aksrt-dropdown-panel { animation: aksrtPopIn var(--dur-fast) var(--ease-out) forwards; } /* --- 图片懒加载过渡 --- */ img.lazyload, img.lazyloaded, img[data-src] { transition: filter 0.6s var(--ease), opacity 0.4s var(--ease); } img.lazyload, img[data-src] { filter: blur(5px); opacity: 0.7; } img.lazyloaded { filter: blur(0); opacity: 1; } /* --- 滚动进度条动效 --- */ .reading-progress-bar { transition: width 0.1s linear; } /* --- 移动端抽屉动效 --- */ @media (max-width: 767px) { .n-drawer { transition: transform var(--dur) var(--ease-out); } .site-nav .n-drawer-body { transition: transform var(--dur) var(--ease-out); } } /* --- 暗色模式切换动效 --- */ html.dark { transition: background-color 0.3s var(--ease), color 0.3s var(--ease); } html.dark * { transition: background-color 0.3s var(--ease), border-color 0.3s var(--ease), color 0.3s var(--ease), box-shadow 0.3s var(--ease); } /* ============================================================ * 18. 合作伙伴无缝滚动 (marquee) * ============================================================ */ .aksrt-marquee { position: relative; overflow: hidden; width: 100%; } .aksrt-marquee__inner { display: flex; gap: 24px; white-space: nowrap; will-change: transform; } .aksrt-marquee__inner > * { flex-shrink: 0; } @media (prefers-reduced-motion: reduce) { .aksrt-marquee__inner { animation: none !important; transform: none !important; } } /* ============================================================ * 19. 视频剧集切换按钮 * ============================================================ */ .switch-video, .switch-iframe { display: inline-flex; align-items: center; gap: 4px; padding: 6px 14px; border: 1px solid var(--color-line, rgba(50, 50, 50, 0.1)); border-radius: var(--radius, 8px); background: var(--surface-1, #fff); color: var(--color-ink-2, #4e5358); font-size: 13px; font-weight: 500; cursor: pointer; transition: all 0.15s ease; text-decoration: none; } .switch-video:hover, .switch-iframe:hover { border-color: var(--color-primary); color: var(--color-primary); } .switch-video.is-active, .switch-iframe.is-active { background: var(--color-primary); border-color: var(--color-primary); color: #fff; } /* ============================================================ * 20. 一言轮播组件 * ============================================================ */ .aksrt-yiyan { padding: 16px; text-align: center; } .aksrt-yiyan__content { min-height: 60px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; } .aksrt-yiyan__icon { font-size: 20px; color: var(--color-primary); opacity: 0.6; } .aksrt-yiyan__text { font-size: 14px; line-height: 1.8; color: var(--color-ink-2, #4e5358); margin: 0; transition: opacity 0.2s ease; font-style: italic; } .aksrt-yiyan__from { font-size: 12px; color: var(--color-ink-4, #999); margin: 0; } .aksrt-yiyan__dots { display: flex; align-items: center; justify-content: center; gap: 6px; margin-top: 12px; } .aksrt-yiyan__dot { width: 6px; height: 6px; border-radius: 50%; background: var(--color-line, rgba(50, 50, 50, 0.1)); transition: background 0.2s; } .aksrt-yiyan__dot.is-active { background: var(--color-primary); width: 16px; border-radius: 3px; } /* ============================================================ * 底部弹出 Sheet — 对齐 legacy .modal.bottom * ============================================================ */ .aksrt-modal--bottom .aksrt-modal-auth__card, .modal.bottom .modal-dialog { position: fixed; bottom: 0; left: 0; right: 0; max-width: 100%; width: 100%; border-radius: var(--main-radius, 8px) var(--main-radius, 8px) 0 0; transform: translateY(110%); transition: transform 0.4s; margin-bottom: 0; padding-bottom: env(safe-area-inset-bottom); } .aksrt-modal--bottom.is-open .aksrt-modal-auth__card, .modal.bottom.in .modal-dialog { transform: translateY(0); } .aksrt-modal--bottom .aksrt-modal-auth__card, .modal.bottom .modal-dialog .modal-content { box-shadow: 0 -10px 50px rgba(0, 0, 0, 0.15); }