/* source: assets/css/frontend/base.css */ /** * AKSRT Main v5 — 博客/个人站完整前端 */ /* 防止 hero 等使用 100vw / full-bleed 时产生横向滚动条 */ html, body { overflow-x: clip; } @supports not (overflow-x: clip) { html, body { overflow-x: hidden; } } /* ========== 阅读进度条(单篇文章顶 fixed)========== */ .reading-progress-bar { position: fixed; top: 0; left: 0; height: 3px; width: 0%; z-index: 9999; pointer-events: none; background: linear-gradient(90deg, var(--color-primary), var(--color-primary-light)); transition: width 0.1s ease-out; } /* 折叠 body 内注入的 BOM / 空白文本节点,防止产生多余行高间距 */ body { font-family: var(--font-body); font-size: var(--text-base); line-height: var(--leading-normal); color: var(--color-ink-2); background-color: var(--surface-page); } /* legacy compat: global link composite transition */ a[href] { transition: color 0.2s, background 0.3s, opacity 0.3s, box-shadow 0.3s, transform 0.3s; } /* Font Awesome 5: when legacy markup includes both `fa` and `fab`, the * generic Solid rule must not override the Brands font face. */ .fa.fab { font-family: "Font Awesome 5 Brands"; font-weight: 400; } .skip-link { position: absolute; left: 16px; top: 12px; z-index: 1100; padding: 10px 14px; border-radius: 999px; background: var(--color-primary); color: #fff; transform: translateY(-140%); transition: transform 0.2s ease; } .skip-link:focus { transform: translateY(0); } /* ========== 站点外壳 ========== */ .site-wrapper { min-height: 100vh; display: flex; flex-direction: column; font-size: var(--text-base); line-height: var(--leading-normal); } .site-main { flex: 1; } /* legacy dual-column float math expects a padding-free main.container. * Bootstrap 5 also defines .container (max-width ladder + padding-x). * Force legacy geometry after Bootstrap so negative-margin sidebars land correctly. */ .container, main.container, .site-main.container { width: 100%; max-width: var(--container, var(--mian-max-width, 1200px)); margin-right: auto; margin-left: auto; padding-right: 0; padding-left: 0; /* Kill Bootstrap 5 --bs-gutter-x padding model on site shells */ --bs-gutter-x: 0; --bs-gutter-y: 0; } /* Header multifunc icon cards need horizontal gutter (legacy content rows). * Global .container padding is 0 for dual-column float math. */ .header-slider-card.container { padding-left: 15px; padding-right: 15px; box-sizing: border-box; } /* Header multifunc icon cards: pin typography baseline so cards render * identically on all pages. .px12-sm is only defined globally in * legacy-utilities.css, which is @import'd by the single-post aggregator; * vendor CSS pins it at <=640px / .sidebar / .mobile-nav-widget only. */ .header-slider-card .icon-cover-card { font-size: 12px; } /* Keep the header multifunction search stable across route-specific CSS. * Some routes load a later .abs-right utility, while the global input focus * ring looks like an extra border against this transparent pill field. */ .header-slider-search .line-form-input:focus, .header-slider-search .line-form-input:focus-visible { border: 0; outline: 0; box-shadow: none; } .header-slider-search .line-form .abs-right { position: absolute; right: 0.7em; top: 50%; transform: translateY(-50%); margin-top: 0; } @media (min-width: 576px) { .container, main.container { max-width: var(--container, var(--mian-max-width, 1200px)); } } @media (min-width: 768px) { .container, main.container { max-width: var(--container, var(--mian-max-width, 1200px)); } } @media (min-width: 992px) { .container, main.container { max-width: var(--container, var(--mian-max-width, 1200px)); } } @media (min-width: 1200px) { .container, main.container { max-width: var(--container, var(--mian-max-width, 1200px)); } } @media (min-width: 1240px) { .container, main.container, .fluid-widget-wrap .widget-container { width: auto; max-width: var(--container, var(--mian-max-width, 1200px)); } } @media (min-width: 1400px) { .container, main.container { max-width: var(--container, var(--mian-max-width, 1200px)); } } /* Soft pad only when the float dual-column is collapsed. * Match legacy bootstrap container pad (15px) rather than 10px. */ @media (max-width: 991.98px) { .container, main.container { padding-right: 15px; padding-left: 15px; } } @media (max-width: 767px) { .container, main.container { width: 100%; max-width: 100%; padding-right: 15px; padding-left: 15px; } } /* ========== User identity inline icons ========== * All compact identity marks share one line-height baseline: VIP, level, * certification, and worn medals remain visually aligned in every surface. */ .aksrt-vip-badge, .aksrt-user-level-badge, .aksrt-user-level-icon, .aksrt-identity-medal, .aksrt-identity-certification-icon, .aksrt-header-user-medal { display: inline-flex; align-items: center; justify-content: center; width: auto; height: 1.1em; max-width: 6em; object-fit: contain; vertical-align: -.15em; flex: 0 0 auto; box-sizing: border-box; } .aksrt-vip-badge__icon { display: block; width: auto; height: 1.1em; max-width: 6em; object-fit: contain; } .aksrt-vip-badge > i { font-size: .9em; line-height: 1; } .aksrt-user-level-badge { padding: 0 .35em; font-size: .78em; line-height: 1.1; white-space: nowrap; } /* Comment context: keep all identity marks inside the compact author line. */ .aksrt-identity-medal--comment, .aksrt-user-level-icon--comment, .aksrt-header-user-medal--comment { height: 1em; vertical-align: -.12em; } .aksrt-vip-badge--sm { height: 1.1em; padding: 0; font-size: inherit; } /* No-wrap inline name rows — keep the level icon on the same line as the name. * The non-standard element (legacy compat) plus .user-name / author-hero / * uc-header name rows must not flex-wrap, or the badge drops to a new line. * The comment header may still wrap (avatar + name + like can overflow on * narrow viewports), so it keeps flex-wrap but the inner never does. */ .article-avatar name, .article-avatar .name, .user-name, .aksrt-author-hero__name, .uc-header__name, .aksrt-header-badges { flex-wrap: nowrap; white-space: nowrap; } .aksrt-author-hero__name, .uc-header__name { display: inline-flex; align-items: center; gap: 4px; } .aksrt-author-hero__name-inner { display: inline-flex; align-items: center; gap: 4px; min-width: 0; } .aksrt-ip-geo-badge { display: inline-flex; align-items: center; min-width: 0; margin: 2px 0; padding: .3em .6em; border: 1px solid var(--color-line-soft, var(--main-border-color, rgba(136, 136, 136, .18))); border-radius: var(--mini-radius, 4px); background: var(--surface-2, rgba(136, 136, 136, .1)); box-shadow: var(--shadow-xs, 0 1px 3px rgba(0, 0, 0, .08)); color: var(--color-ink-3, #666); font-size: .92em; line-height: 1.44; vertical-align: middle; box-sizing: border-box; } .no-results { padding: 48px 20px; text-align: center; color: var(--color-ink-3); } /* source: assets/css/frontend/header-userbox.css */ /** * Header account popover. * * The shared legacy navigation styles provide the popover shell. This module * owns AKSRT-specific account content such as check-in, wallet and VIP rows. */ /* The desktop action cluster owns one horizontal alignment context. */ .navbar-top .aksrt-navbar-actions { display: flex; align-items: center; gap: 10px; min-height: 50px; margin-top: 0; margin-bottom: 0; padding: 0; } .navbar-top .aksrt-navbar-actions > *, .navbar-top .aksrt-navbar-account, .navbar-top .aksrt-navbar-account > li { display: inline-flex; align-items: center; flex: 0 0 auto; } .navbar-top .aksrt-navbar-account > li { position: relative; padding: 0; overflow: visible; } .navbar-top .aksrt-navbar-account > li > .sub-menu { top: calc(100% + 5px); right: 0; left: auto; z-index: 1002; margin: 0; } .navbar-top .aksrt-navbar-account { gap: 4px; min-height: 50px; margin: 0; } .navbar-top .aksrt-navbar-account.navbar-text { float: none; } .navbar-top .aksrt-navbar-actions .navbar-cta { display: inline-flex; align-items: center; justify-content: center; gap: 4px; min-height: 29px; margin: 0; padding: .3em 1em !important; border-radius: var(--radius-btn, 4px); font-size: .8em; line-height: 1.44; } .navbar-top .aksrt-navbar-actions .navbar-cta.radius { border-radius: 50px; } .navbar-top .aksrt-navbar-actions .navbar-cta > .icon { width: 1.2em; height: 1.2em; flex: 0 0 auto; } .navbar-top .aksrt-nav-icon, .navbar-top .aksrt-nav-avatar { display: inline-flex !important; align-items: center; justify-content: center; width: 34px; height: 34px; padding: 0 !important; overflow: visible !important; border: 0 !important; border-radius: 0; background: transparent !important; box-shadow: none !important; } .navbar-top .aksrt-nav-icon .icon { width: 1.2em; height: 1.2em; } .navbar-top .aksrt-nav-avatar { margin-top: 0; } .navbar-top .aksrt-nav-avatar .avatar { display: block; width: 29px; height: 29px; border-radius: 50%; object-fit: cover; } .navbar-top .aksrt-navbar-actions .toggle-radius { flex: 0 0 29px; margin: 0; vertical-align: middle; } .navbar-top .aksrt-navbar-language { margin: 0; } /* Anchor the VIP preview to the full navigation row instead of relying on * the absolute panel's static position beside the compact CTA. */ .navbar-top .aksrt-navbar-actions .navbar-vip-hover { position: relative; align-self: stretch; align-items: center; overflow: visible; } .navbar-top .aksrt-navbar-actions .navbar-vip-hover > .sub-vip-card { top: 100%; right: 0; left: auto; width: max-content; max-width: calc(100vw - 24px); margin: 0; z-index: 1002; } /* Keep the drop-down search panel above a fixed header (z-index: 999). */ .navbar-search { z-index: 1001; opacity: 0; transform: translate3d(0, -24px, 0); transition: transform .24s ease, opacity .18s ease, visibility 0s linear .24s; will-change: transform, opacity; } .navbar-search.show { opacity: 1; transform: translate3d(0, 0, 0); transition-delay: 0s; } .navbar-search .line-form-input:focus, .navbar-search .line-form-input:focus-visible { outline: 0; box-shadow: none; } .navbar-search .search-close-box { display: flex; justify-content: flex-end; max-width: 660px; margin: 16px auto 0; } .navbar-search .search-close-box > .but { float: none; } .aksrt-header-userbox { width: 260px; color: var(--color-ink-2); } .aksrt-header-userbox .user-info { min-height: 44px; padding: 2px; } .aksrt-header-userbox .user-info > .avatar { flex: 0 0 44px; width: 44px; height: 44px; object-fit: cover; } .aksrt-header-userbox .user-right, .aksrt-header-userbox .user-right > .flex1 { min-width: 0; } .aksrt-header-userbox .user-right b { display: flex; align-items: center; gap: 4px; max-width: 100%; overflow: hidden; white-space: nowrap; } .aksrt-header-userbox .display-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .aksrt-header-userbox .user-right .aksrt-vip-badge, .aksrt-header-userbox .user-right .aksrt-user-level-icon, .aksrt-header-userbox .user-right .aksrt-identity-medal, .aksrt-header-userbox .user-right .aksrt-header-user-medal, .aksrt-header-userbox .user-right .aksrt-identity-certification-icon { flex: 0 0 auto; height: 1.1em; } .aksrt-header-userbox .user-info > .abs-right { top: 50%; right: 2px; transform: translateY(-50%); display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; border-radius: 50%; background: var(--surface-2); color: var(--color-ink-3); } .aksrt-header-userbox .aksrt-notification-badge { position: absolute; top: -4px; right: -4px; display: inline-flex; align-items: center; justify-content: center; min-width: 17px; height: 17px; padding: 0 4px; border: 2px solid var(--surface-1); border-radius: 999px; background: #e74c3c; color: #fff; font-size: 10px; font-weight: 700; line-height: 1; } .aksrt-nav-notification .aksrt-notification-badge { position: absolute; top: 2px; right: 2px; display: inline-flex; align-items: center; justify-content: center; min-width: 16px; height: 16px; padding: 0 4px; border: 2px solid var(--surface-1); border-radius: 999px; background: #e74c3c; color: #fff; font-size: 9px; font-weight: 700; line-height: 1; } .aksrt-header-wallet { display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%; padding: 9px 10px; border-radius: 8px; background: var(--surface-2); color: var(--color-ink-2); font-size: 12px; line-height: 1.35; } .aksrt-header-wallet:hover { color: var(--color-ink); } .aksrt-header-wallet__item { min-width: 0; white-space: nowrap; } .aksrt-header-wallet__item i { margin-right: 2px; color: var(--color-ink-3); } .aksrt-header-wallet__item b { margin-left: 2px; color: var(--color-ink); font-weight: 700; } .aksrt-header-checkin { display: inline-flex !important; align-items: center; justify-content: center; gap: 6px; width: 100% !important; min-height: 36px; margin: 0; padding: 8px 10px !important; border: 0 !important; border-radius: 6px !important; background: #fff6db !important; color: #8a5a00 !important; font-size: 13px !important; font-weight: 600; line-height: 1.3; white-space: nowrap; } .aksrt-header-checkin > i { margin: 0 !important; color: #b78103 !important; } .aksrt-header-checkin:hover { background: #fff0c2 !important; color: #8a5a00 !important; } .aksrt-header-checkin.is-done, .aksrt-header-checkin:disabled, .aksrt-header-checkin.is-done:hover, .aksrt-header-checkin:disabled:hover { cursor: default; opacity: .85; background: #f3f4f6 !important; color: #555 !important; } .aksrt-header-checkin.is-done > i, .aksrt-header-checkin:disabled > i { color: #777 !important; } .aksrt-header-payvip__cta, .aksrt-header-payvip:not(.is-vip) .payvip-icon, .aksrt-header-payvip:not(.is-vip) .but { display: inline-flex !important; align-items: center !important; justify-content: center !important; gap: 6px !important; width: 100% !important; min-width: 0 !important; min-height: 36px; margin: 0 !important; padding: 8px 10px !important; border: 0 !important; border-radius: 6px !important; background: linear-gradient(90deg, #ff6b6b, #f04494) !important; color: #fff !important; font-size: 13px !important; font-weight: 600; line-height: 1.3; text-align: center; white-space: nowrap; } .aksrt-header-payvip__cta > i, .aksrt-header-payvip:not(.is-vip) .payvip-icon > i, .aksrt-header-payvip:not(.is-vip) .but > i { margin: 0 !important; color: inherit !important; } .aksrt-header-payvip__cta:hover { color: #fff !important; opacity: .92; } .aksrt-header-payvip__active { display: flex; flex-direction: row; align-items: center; justify-content: center; gap: 8px !important; width: 100%; min-height: 42px; padding: 7px 10px !important; white-space: nowrap; } .aksrt-header-payvip__level { display: inline-flex; align-items: center; justify-content: center; gap: 6px; } .aksrt-header-payvip__level > i { margin: 0 !important; } .aksrt-header-payvip__exp { display: inline; margin: 0; padding: 0; border: 0; background: none !important; box-shadow: none; color: inherit; font-size: .85em; font-weight: 400; line-height: 1.3; opacity: .9; white-space: nowrap; } /* Navigation links are globally capped at 50px. Account actions are taller * icon tiles and must opt out or their labels overlap the following row. */ .navbar-top .aksrt-header-userbox .header-user-href { align-items: flex-start; gap: 4px; } .navbar-top .aksrt-header-userbox .header-user-href > a, .aksrt-header-userbox .header-user-href > a { display: flex; flex: 1 1 0; flex-direction: column; align-items: center; min-width: 0; max-height: none; padding: 10px 2px 2px; line-height: 1.35; } .aksrt-header-userbox .header-user-href > a:hover { opacity: .75; } .aksrt-header-userbox .header-user-href .toggle-radius { flex: 0 0 36px; width: 36px; height: 36px; } .aksrt-header-userbox .header-user-href > a > div:last-child { max-width: 100%; overflow: hidden; font-size: 12px; text-overflow: ellipsis; white-space: nowrap; } .mobile-navbar .aksrt-header-userbox { width: 100%; max-width: 400px; margin-right: auto; margin-left: auto; } body.dark-theme .aksrt-header-checkin { background: rgba(255, 193, 7, .18) !important; color: #f0c14b !important; } body.dark-theme .aksrt-header-checkin > i { color: #f0c14b !important; } body.dark-theme .aksrt-header-checkin.is-done, body.dark-theme .aksrt-header-checkin:disabled { background: rgba(255, 255, 255, .08) !important; color: #bbb !important; } body.dark-theme .aksrt-header-wallet { background: rgba(255, 255, 255, .06); } body.dark-theme .aksrt-header-wallet__item, body.dark-theme .aksrt-header-wallet__item b { color: inherit; } @media (max-width: 360px) { .aksrt-header-userbox .header-user-href { gap: 2px; } .aksrt-header-userbox .header-user-href .toggle-radius { flex-basis: 34px; width: 34px; height: 34px; } } /* source: assets/css/frontend/card-primitives.css */ /** * AKSRT Card Primitives — 1:1 legacy Alignment * * 对齐 legacy 的 .theme-box / .box-bg / .box-body / .box-header: * 阴影优先,无边框,8px 圆角,15px 内边距。 * * @package AKSRT */ /* ============================================================ * .aksrt-theme-box — 完整卡片原语(阴影 + 圆角 + 表面) * 对齐 legacy .theme-box + .box-bg * ============================================================ */ .aksrt-theme-box { border: none; border-radius: var(--radius, 8px); background: var(--surface-1); box-shadow: var(--shadow-sm); transition: box-shadow 0.2s ease; } .aksrt-theme-box:hover { box-shadow: var(--shadow); } /* ============================================================ * .aksrt-box-bg — 表面原语(仅背景 + 阴影) * ============================================================ */ .aksrt-box-bg { background-color: var(--surface-1); box-shadow: var(--shadow-sm); } /* ============================================================ * .aksrt-box-body / .aksrt-box-header — 内边距区段 * 对齐 legacy .box-body / .box-header { padding: 15px } * ============================================================ */ .aksrt-box-body, .aksrt-box-header { padding: var(--card-padding); } .aksrt-box-header { border-bottom: 1px solid var(--color-line-soft); } .aksrt-box-header + .aksrt-box-body { padding-top: 0; } .aksrt-box-body.notop, .aksrt-box-header.notop { padding-top: 0; } .aksrt-box-body.nobottom, .aksrt-box-header.nobottom { padding-bottom: 0; } /* ============================================================ * .aksrt-muted-box — 柔和背景嵌套 * 对齐 legacy .muted-box * ============================================================ */ .aksrt-muted-box { background-color: var(--surface-2); border-radius: var(--radius); padding: var(--card-padding); } /* ============================================================ * .aksrt-noshadow — 去除阴影 * ============================================================ */ .aksrt-noshadow { box-shadow: none !important; } /* ============================================================ * legacy 兼容别名 * ============================================================ */ /* legacy .theme-box is ONLY a spacing utility (margin-bottom: 20px). * Background/shadow live on .main-bg / .main-shadow / .box-bg / .aksrt-panel. * Do NOT turn every theme-box into a card — article-header also uses it. */ .theme-box, .mb20 { margin-bottom: 20px; } .box-bg { background-color: var(--main-bg-color, var(--surface-1)); box-shadow: 0 0 10px var(--main-shadow, rgba(116, 116, 116, 0.08)); } .box-body { padding: var(--card-padding); } .box-header { padding: var(--card-padding); border-bottom: 1px solid var(--color-line-soft); } .box-header + .box-body { padding-top: 0; } .radius8 { border-radius: var(--radius); } .main-shadow { box-shadow: 0 0 10px var(--main-shadow, rgba(116, 116, 116, 0.08)); } .main-bg { background: var(--main-bg-color, var(--surface-1)); } .muted-box { background-color: var(--surface-2); border-radius: var(--radius); padding: var(--card-padding); } /* ============================================================ * 暗色模式 * ============================================================ */ html.dark .aksrt-theme-box, body.dark-theme .aksrt-theme-box, html.dark .box-bg, body.dark-theme .box-bg { border-color: transparent; box-shadow: 0 0 10px var(--main-shadow, rgba(0, 0, 0, 0.2)); } html.dark .aksrt-theme-box:hover, body.dark-theme .aksrt-theme-box:hover { box-shadow: 0 0 10px var(--main-shadow, rgba(0, 0, 0, 0.28)); } /* ============================================================ * 卡片 hover 动效 * ============================================================ */ .aksrt-theme-box { transition: box-shadow var(--dur) var(--ease), transform var(--dur) var(--ease); } .aksrt-card-hover:hover, .aksrt-card-hover:focus-within { box-shadow: none; transform: none; } .aksrt-card-hover-lg:hover, .aksrt-card-hover-lg:focus-within { box-shadow: var(--shadow-lg); transform: none; } .aksrt-noshadow:hover { box-shadow: none !important; transform: none !important; } /* ============================================================ * .aksrt-panel — legacy sidebar/widget surface * ============================================================ */ .aksrt-panel { clear: both; background-color: var(--surface-1); padding: var(--card-padding); box-shadow: var(--shadow-sm); border-radius: var(--radius, 8px); margin-bottom: 20px; } /* source: assets/css/frontend/overlay-primitives.css */ /** * AKSRT Overlay / Glass Primitives * * Provides backdrop-filter glass surfaces used by header, footer-tabbar, * floating buttons and search overlays — matching legacy's blur system. * * @package AKSRT */ /* ============================================================ * .aksrt-blur-bg — generic glass surface * Use on any element that needs a translucent blurred background. * ============================================================ */ .aksrt-blur-bg { -webkit-backdrop-filter: saturate(5) blur(20px); backdrop-filter: saturate(5) blur(20px); background: var(--blur-bg); } /* ============================================================ * Glass on site-nav (when using fixed/sticky mode) * Applied via .site-nav--blur already; this adds the legacy-grade * saturate(5) blur(20px) instead of the lighter saturate(1.5) blur(18px). * ============================================================ */ .site-nav--glass { -webkit-backdrop-filter: saturate(5) blur(20px); backdrop-filter: saturate(5) blur(20px); background: var(--blur-bg); border-bottom-color: transparent; } .site-nav--glass.is-scrolled { box-shadow: var(--shadow-sm); border-bottom-color: var(--color-line-soft); } html.dark .site-nav--glass.is-scrolled, html.dark .site-nav--glass.is-scrolled { box-shadow: var(--shadow-sm); } /* ============================================================ * Glass on footer-tabbar (already uses backdrop-filter in footer.css; * this class can be toggled to match legacy's exact blur spec) * ============================================================ */ .footer-tabbar--glass { -webkit-backdrop-filter: saturate(5) blur(20px); backdrop-filter: saturate(5) blur(20px); background: var(--blur-bg); box-shadow: 0 -8px 24px rgba(20, 28, 48, 0.08); } html.dark .footer-tabbar--glass, html.dark .footer-tabbar--glass { box-shadow: 0 -10px 28px rgba(0, 0, 0, 0.32); } /* ============================================================ * 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); } /* source: assets/css/frontend/layout.css */ /* Breadcrumb chrome lives in breadcrumb.css (single source). */ /* ========== 主布局 ========== */ .content-main { width: 100%; } .content-main--single { max-width: 100%; } .content-shell { width: 100%; margin: 0 auto; padding: 32px 16px 48px; max-width: var(--container); } @media (min-width: 768px) { .content-shell { padding: 40px 24px 56px; } } /* page.php 专用:阅读宽度收窄 */ .content-shell--page { max-width: var(--container-page, 860px); } .content-shell--cms { max-width: 100%; padding: 0; } /* page.php 内的元素 */ .entry-page .entry-thumb { margin: 0 0 var(--space-6, 24px); border-radius: var(--radius-lg, 12px); overflow: hidden; } .entry-page .page-links { margin-top: var(--space-6, 24px); font-size: var(--text-sm, 0.875rem); color: var(--color-ink-3, var(--color-ink-3)); } .entry-page .page-links-title { margin-right: 8px; font-weight: 600; } /* ============================================================ * Site shell — site-layout-1/2/3 dual-column * DOM: main.container > .content-wrap + .sidebar (siblings) * body.site-layout-1 = no sidebar * body.site-layout-2 = sidebar right * body.site-layout-3 = sidebar left * * This intentionally uses legacy's float/negative-margin ownership model. * Below 992px the sidebar is hidden and the content margins collapse. * ============================================================ */ main.container, main.content-shell, .site-main.container { position: relative; } /* content-shell is a padding shell for non-dual pages; when it also hosts * the float dual-column, kill horizontal padding so negative-margin math matches legacy. */ main.container.content-shell, main.content-shell.container, .site-main.container.content-shell { padding-left: 0; padding-right: 0; max-width: var(--container, var(--mian-max-width, 1200px)); width: 100%; box-sizing: border-box; } main.container::after, main.content-shell::after, .site-main.container::after { content: ""; display: table; clear: both; } /* Float/negative-margin compatibility fallback. * * Critical: .content-layout must NOT set width:100%. Under box-sizing:border-box * a 100% width + margin-right gutter keeps the border-box at full container * width, so the gutter never shrinks the content box and .sidebar (margin-left:-311px) * sits under the main column (overlap). legacy only sets margin on .content-layout; * width stays auto so margin carves out the column. */ .content-wrap { float: left; width: 100%; min-width: 0; display: block; box-sizing: border-box; } .content-layout { display: block; /* width:auto — never 100%; margin must shrink the used width */ width: auto; min-width: 0; max-width: none; margin-right: 0; margin-left: 0; box-sizing: border-box; } .content-layout__primary { min-width: 0; max-width: 100%; } /* Base sidebar column (legacy .sidebar defaults) — layout variants override below */ .sidebar { float: left; width: 311px; /* legacy hard 311px; --sidebar-width kept in sync via runtime vars */ width: var(--sidebar-width, 311px); min-width: 0; position: relative; box-sizing: border-box; display: block; } .content-layout__aside { min-width: 0; } /* No sidebar */ body.site-layout-1 .sidebar, .site-layout-1 .sidebar { display: none; } body.site-layout-1 .content-layout, body.site-layout-1 .content-layout--no-sidebar, .site-layout-1 .content-layout { margin-left: 0; margin-right: 0; } /* Compat: templates may still stamp content-layout--no-sidebar */ .content-layout--no-sidebar { margin-left: 0 !important; margin-right: 0 !important; } /* Sidebar RIGHT (layout 2) — legacy: margin-right: calc(311px + 15px) only */ body.site-layout-2 .content-layout, .site-layout-2 .content-layout { margin-right: calc(311px + 15px); margin-right: calc(var(--sidebar-width, 311px) + 15px); margin-left: 0; width: auto; } body.site-layout-2 .sidebar, .site-layout-2 .sidebar { float: left; width: 311px; width: var(--sidebar-width, 311px); margin-left: -311px; margin-left: calc(0px - var(--sidebar-width, 311px)); position: unset; } /* Sidebar LEFT (layout 3) */ body.site-layout-3 .content-layout, .site-layout-3 .content-layout { margin-left: calc(311px + 15px); margin-left: calc(var(--sidebar-width, 311px) + 15px); margin-right: unset; width: auto; } body.site-layout-3 .sidebar, .site-layout-3 .sidebar { float: left; width: 311px; width: var(--sidebar-width, 311px); margin-left: -100%; position: unset; } /* Sticky widgets inside sidebar */ @media (min-width: 992px) { .sidebar .content-layout__aside, .content-layout__aside { position: sticky; top: calc(var(--nav-height, 60px) + 16px); } .has-static-nav .content-layout__aside { top: 16px; } } /* Mobile collapse (legacy max-width: 991px) */ @media (max-width: 991.98px) { body.site-layout-2 .content-layout, body.site-layout-3 .content-layout, .site-layout-2 .content-layout, .site-layout-3 .content-layout { margin-left: auto; margin-right: auto; } body.site-layout-2 .sidebar, body.site-layout-3 .sidebar, .site-layout-2 .sidebar, .site-layout-3 .sidebar, .sidebar { display: none; } } /* ========== 页面标题区 ========== */ .page-header { margin-bottom: 28px; } .page-header .entry-title { margin-bottom: 8px; } .page-header p { color: var(--color-ink-3); margin: 0; max-width: 720px; } .term-page-header { position: relative; overflow: hidden; border: 1px solid var(--color-line-soft, rgba(15, 23, 42, 0.08)); border-radius: var(--radius-lg); background: var(--surface-1); box-shadow: var(--shadow-sm, 0 1px 6px rgba(15, 23, 42, 0.04)); } .term-page-header__body { position: relative; z-index: 1; display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; padding: 24px; } .term-page-header__eyebrow { margin: 0 0 8px; font-size: 0.8125rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--color-primary); } .term-page-header__desc { margin-top: 10px; } .term-page-header__cover { min-height: 140px; background-position: center; background-size: cover; border-top: 1px solid var(--color-line-soft, rgba(15, 23, 42, 0.08)); } .term-page-header--simple .term-page-header__cover { display: none; } /* Card style: accent top border, slightly more padding */ .term-page-header--card { border-top: 3px solid var(--color-primary, #f04494); } .term-page-header--card .term-page-header__body { padding: 28px 24px; } /* Cover style: full-width hero with background image */ .term-page-header--cover { border: none; border-radius: var(--radius-lg); background: transparent; box-shadow: none; min-height: 220px; display: flex; flex-direction: column; } .term-page-header__cover-bg { position: absolute; inset: 0; background-position: center; background-size: cover; border-radius: var(--radius-lg); } .term-page-header__cover-overlay { position: absolute; inset: 0; background: linear-gradient(135deg, rgba(0, 0, 0, 0.55) 0%, rgba(0, 0, 0, 0.25) 100%); border-radius: var(--radius-lg); } .term-page-header--cover .term-page-header__body { flex: 1; align-items: flex-end; z-index: 2; } .term-page-header__body--overlay .entry-title, .term-page-header__body--overlay .term-page-header__desc, .term-page-header__body--overlay .term-page-header__eyebrow { color: #fff; } .term-page-header__body--overlay .term-page-header__eyebrow { color: rgba(255, 255, 255, 0.8); } @media (max-width: 767px) { .term-page-header--cover { min-height: 160px; } } .aksrt-admin-quicklink { display: inline-flex; align-items: center; gap: 8px; min-height: 36px; padding: 0 14px; border: 1px solid var(--color-line); border-radius: var(--radius-pill, 999px); background: var(--surface-2); color: var(--color-ink-2); text-decoration: none; white-space: nowrap; font-size: 0.875rem; font-weight: 600; } .aksrt-admin-quicklink:hover { color: var(--color-primary); border-color: var(--color-primary); background: var(--color-primary-soft, rgba(59, 130, 246, 0.08)); } .archive-filter-bar { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin: -8px 0 24px; padding: 16px 18px; border-radius: var(--radius-lg); background: var(--surface-2); border: 1px solid var(--color-line-soft, rgba(15, 23, 42, 0.06)); } .archive-filter-bar__main { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; } .archive-filter-bar__label { color: var(--color-ink-4); font-size: 0.8125rem; font-weight: 600; } .archive-filter-bar__chips { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; } .archive-filter-bar__chip { display: inline-flex; align-items: center; min-height: 34px; padding: 0 12px; border-radius: var(--radius-pill, 999px); background: var(--surface-1); color: var(--color-ink-2); text-decoration: none; font-size: 0.875rem; font-weight: 500; } .archive-filter-bar__chip.is-active, .archive-filter-bar__chip:hover { background: var(--color-primary); color: var(--color-on-primary, #fff); } .archive-filter-bar__meta { color: var(--color-ink-4); font-size: 0.8125rem; font-weight: 600; } .archive-filter-bar__sort { display: flex; align-items: center; gap: 8px; margin-left: auto; } .archive-filter-bar__main--tags { border-top: 1px solid var(--color-line-soft, rgba(15, 23, 42, 0.06)); padding-top: 10px; margin-top: 10px; } /* §3.4 custom_filter dimension rows */ .archive-filter-bar__main--custom { border-top: 1px solid var(--color-line-soft, rgba(15, 23, 42, 0.06)); padding-top: 10px; margin-top: 10px; } .content-stream { display: grid; gap: 20px; } .content-main--archive, .content-main--tag, .content-main--category, .content-main--search, .content-main--single { display: grid; gap: 20px; } .content-stream__list { width: 100%; } .content-stream__footer { margin-top: 4px; } .content-stream__footer > .content-stream__footer-nav, .archive__ajax-wrap > .content-stream__footer-nav { margin-top: 0; } .content-stream__empty { padding: 28px 24px; border-radius: var(--radius-lg); background: var(--surface-1); border: 1px solid var(--color-line-soft, rgba(15, 23, 42, 0.08)); } .article-shell { overflow: hidden; } /* AJAX 筛选加载状态 */ .archive__ajax-wrap { position: relative; transition: opacity 0.2s ease; } .archive__ajax-wrap.is-loading { opacity: 0.5; pointer-events: none; } .archive__ajax-loading { display: none; position: absolute; top: 0; left: 0; right: 0; bottom: 0; align-items: center; justify-content: center; z-index: 5; background: rgba(255, 255, 255, 0.6); backdrop-filter: blur(1px); } .archive__ajax-loading.is-loading { display: flex; } .archive__ajax-spinner { display: inline-block; width: 28px; height: 28px; border: 3px solid var(--surface-3, #e8e8e8); border-top-color: var(--color-primary, #f04494); border-radius: 50%; animation: aksrt-spin 0.6s linear infinite; } @media (max-width: 767px) { .term-page-header__body { flex-direction: column; align-items: stretch; padding: 20px; } .aksrt-admin-quicklink { width: fit-content; } } /* ========== AJAX 分页(加载更多 / 无限滚动) ========== */ .aksrt-pagination-ajax { display: flex; flex-direction: column; align-items: center; gap: 16px; margin: 40px 0 8px; } .aksrt-load-more-btn { min-width: 180px; height: 44px; padding: 0 32px; border-radius: var(--radius-btn); border: 1px solid var(--color-line); background: var(--surface-page); color: var(--color-ink); font-size: 14px; font-weight: 600; cursor: pointer; transition: border-color 0.2s, color 0.2s, background 0.2s; display: inline-flex; align-items: center; justify-content: center; gap: 8px; } .aksrt-load-more-btn:hover { border-color: var(--color-primary); color: var(--color-primary); } .aksrt-load-more-btn:disabled { opacity: 0.5; pointer-events: none; } .aksrt-loading-indicator { display: none; align-items: center; gap: 8px; font-size: 14px; color: var(--color-ink-4); } .aksrt-loading-indicator i { font-size: 16px; } .aksrt-scroll-sentinel { width: 100%; height: 1px; pointer-events: none; } /* ========== 移动端/平板隐藏侧栏(与 legacy 一致:991px 以下隐藏) ========== */ @media (max-width: 991px) { .content-layout__aside { display: none; } } .content-layout__primary--cms { min-width: 0; } /* ============================================================ * Phase 2 — 侧栏 widget 内链接增强 * ============================================================ */ .content-layout__aside .widget a { transition: color var(--dur-fast, 0.15s) var(--ease); } .content-layout__aside .widget a:hover { color: var(--color-primary); } /* ============================================================ * Phase 5 — 文章操作卡片增强 * ============================================================ */ /* ============================================================ * Phase 6 — 评论卡片容器 * ============================================================ */ .comments-card { overflow: hidden; } /* source: assets/css/frontend/footer.css */ /* ============================================================ * AKSRT Footer utilities — float buttons start + device helpers * Main template_1 shell: shell.css * Tabbar / float details continue below. * ============================================================ */ :root { --aksrt-footer-tabbar-height: 49px; } /* Device visibility utility classes */ @media (max-width: 767px) { .hide-on-mobile { display: none !important; } .hidden-xs { display: none !important; } } @media (min-width: 768px) { .hide-on-desktop { display: none !important; } .hide-on-pc { display: none !important; } } /* ============================================================ * 浮动右侧按钮组(模仿 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, body.dark-theme #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, body.dark-theme #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: var(--aksrt-footer-tabbar-height); background: var(--blur-bg); border-top: 1px solid var(--color-line-soft); padding: 0 0 env(safe-area-inset-bottom, 0px); justify-content: space-around; align-items: center; box-shadow: 0 -4px 5px var(--main-shadow, rgba(0, 0, 0, 0.06)); -webkit-backdrop-filter: saturate(5) blur(20px); backdrop-filter: saturate(5) blur(20px); --tabbar-active-color: #f04494; --tabbar-icon-size: 24px; --tabbar-text-size: 10px; } .footer-tabbar.no-border { border-top: none; } .footer-tabbar.no-shadow { box-shadow: none; } .footer-tabbar.hide-text .tabbar-item span { display: none; } .footer-tabbar.has-animation .tabbar-item { transition: color 0.15s ease, transform 0.15s ease; } .footer-tabbar.has-animation .tabbar-item:active { transform: scale(0.9); } .footer-tabbar-placeholder { display: none; height: calc(var(--aksrt-footer-tabbar-height) + env(safe-area-inset-bottom, 0px)); } @media (max-width: 767px) { .footer-tabbar { display: flex; } .footer-tabbar-placeholder { display: block; } /* 有 tabbar 时页脚需要额外底部间距 */ .footer, .site-footer { padding-bottom: calc(var(--aksrt-footer-tabbar-height) + env(safe-area-inset-bottom, 0px)); } } .tabbar-item { display: flex; flex: 1 1 0; min-width: 0; flex-direction: column; align-items: center; justify-content: center; gap: 1px; min-height: 49px; padding: 4px 0 3px; color: var(--muted-color, var(--color-ink-3)); font-size: 13px; text-decoration: none; border: none; background: none; cursor: pointer; transition: color 0.15s ease; -webkit-tap-highlight-color: transparent; position: relative; } /* 对齐 legacy: 24px 图标 */ .tabbar-item i { font-size: var(--tabbar-icon-size, 24px); line-height: 1; } .tabbar-item span { display: block; font-size: var(--tabbar-text-size, 10px); font-weight: 500; line-height: 1; transform: scale(0.8); transform-origin: center top; } .tabbar-item:hover, .tabbar-item.active { color: var(--tabbar-active-color, var(--color-primary)); text-decoration: none; } .tabbar-item.active i { font-weight: 900; } .tabbar-badge { position: absolute; top: 2px; right: 8px; min-width: 16px; height: 16px; padding: 0 4px; border-radius: 999px; background: var(--color-error); color: #fff; font-size: 10px; line-height: 16px; font-style: normal; font-weight: 700; text-align: center; box-shadow: 0 2px 8px rgba(239, 68, 68, 0.20); } .tabbar-badge--dot { min-width: 0; width: 8px; height: 8px; padding: 0; top: 4px; right: 10px; font-size: 0; line-height: 1; box-shadow: 0 0 0 2px var(--blur-bg); } .tabbar-item--add { margin-top: -22px; width: 62px; height: 62px; min-height: 62px; border-radius: 50%; background: var(--color-accent); color: #fff; box-shadow: 0 12px 24px var(--color-accent-shadow); flex: 0 0 62px; z-index: 1; } .tabbar-item--add i { font-size: 22px; } .tabbar-item--add span { font-size: 11px; } .tabbar-item--add:hover, .tabbar-item--add.active { color: #fff; } .tabbar-add-backdrop { position: fixed; inset: 0; z-index: 951; background: rgba(15, 23, 42, 0.38); } .tabbar-add-panel { position: fixed; left: 0; right: 0; bottom: 0; z-index: 952; padding: 0 12px calc(84px + env(safe-area-inset-bottom, 0px)); } .tabbar-add-panel__sheet { border-radius: 20px; background: var(--surface-1); border: none; box-shadow: var(--shadow-drawer); overflow: hidden; } .tabbar-add-panel__head { display: flex; align-items: center; justify-content: space-between; padding: 16px 18px 12px; border-bottom: 1px solid var(--color-line); } .tabbar-add-panel__close { width: 32px; height: 32px; border: 0; border-radius: 50%; background: var(--surface-2); color: var(--color-ink-3); } .tabbar-add-panel__list { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; padding: 18px; } .tabbar-add-panel__item { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; min-height: 88px; border-radius: 18px; background: var(--surface-2); color: var(--color-ink-3); text-decoration: none; } .tabbar-add-panel__item i { font-size: 22px; color: var(--color-accent); } .tabbar-add-panel__item span { font-size: 13px; font-weight: 600; } .tabbar-search-overlay { position: fixed; inset: 0; z-index: 953; background: rgba(15, 23, 42, 0.58); display: flex; align-items: stretch; justify-content: center; } .tabbar-search-overlay__dialog { width: 100%; min-height: 100%; background: var(--surface-1); padding: 18px 16px calc(24px + env(safe-area-inset-bottom, 0px)); } .tabbar-search-overlay__head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; } .tabbar-search-overlay__close { width: 36px; height: 36px; border: 0; border-radius: 50%; background: var(--surface-2); color: var(--color-ink-3); } .tabbar-search-overlay__form { display: grid; grid-template-columns: 20px 1fr auto; gap: 10px; align-items: center; padding: 14px 14px 14px 12px; border-radius: 18px; border: none; box-shadow: var(--shadow-sm); background: var(--surface-4); } .tabbar-search-overlay__icon { color: var(--color-ink-4); } .tabbar-search-overlay__form input { min-width: 0; border: 0; background: transparent; color: var(--color-ink); font-size: 15px; outline: none; } .tabbar-search-overlay__submit { border: 0; border-radius: 12px; padding: 10px 14px; background: var(--color-accent); color: #fff; font-weight: 700; } .tabbar-search-overlay__types { display: flex; gap: 8px; margin-top: 14px; } .tabbar-search-overlay__type { border: 0; border-radius: 999px; padding: 9px 14px; background: var(--surface-2); color: var(--color-ink-3); font-size: 13px; font-weight: 600; } .tabbar-search-overlay__type.is-active { background: var(--color-accent-soft); color: var(--color-accent); } .tabbar-search-overlay__section { margin-top: 20px; } .tabbar-search-overlay__section-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; } .tabbar-search-overlay__label { color: var(--color-ink-3); font-size: 13px; font-weight: 700; } .tabbar-search-overlay__clear { border: 0; background: transparent; color: var(--color-accent); font-size: 12px; font-weight: 700; } .tabbar-search-overlay__history, .tabbar-search-overlay__suggestions { display: flex; flex-direction: column; gap: 10px; } .tabbar-search-overlay__history-item, .tabbar-search-overlay__suggestion-item { display: flex; align-items: center; justify-content: space-between; gap: 12px; width: 100%; border: none; border-radius: 16px; padding: 12px 14px; background: var(--surface-4); box-shadow: var(--shadow-sm); color: var(--color-ink-3); text-decoration: none; text-align: left; } .tabbar-search-overlay__history-item i { color: var(--color-accent); } .tabbar-search-overlay__history-item span, .tabbar-search-overlay__suggestion-item span { flex: 1; min-width: 0; font-size: 14px; font-weight: 600; } .tabbar-search-overlay__suggestion-item small { color: var(--color-ink-4); font-size: 12px; } .tabbar-search-overlay__empty { padding: 14px; border-radius: 16px; background: var(--surface-2); color: var(--color-ink-4); font-size: 13px; text-align: center; } .tabbar-search-overlay__tags { display: flex; flex-wrap: wrap; gap: 10px; } .tabbar-search-overlay__tag { padding: 10px 14px; border-radius: 999px; background: var(--surface-2); color: var(--color-ink-3); text-decoration: none; font-size: 13px; } body.tabbar-search-open, body.tabbar-add-open { overflow: hidden; } /* 滚动时隐藏 tabbar(可选,通过 JS 添加 class) */ .footer-tabbar.scrolling-hide { transform: translateY(100%); transition: transform 0.3s ease; } /* 向下滚动隐藏,向上滚动显示 */ .footer-tabbar.scroll-down-hide { transition: transform 0.3s ease; } .footer-tabbar.scroll-down-hide.is-hidden { transform: translateY(120%); } /* 返回顶部包裹项(首页按钮 + 返回顶部切换) */ .tabbar-ontop-wrap { position: relative; } .tabbar-ontop-wrap .tabbar-ontop-btn { display: none; position: absolute; top: 0; left: 0; right: 0; bottom: 0; flex-direction: column; align-items: center; justify-content: center; gap: 2px; padding: 4px 12px; color: var(--color-primary); font-size: 13px; text-decoration: none; cursor: pointer; -webkit-tap-highlight-color: transparent; } .tabbar-ontop-wrap .tabbar-ontop-btn i { font-size: 18px; line-height: 1; } .tabbar-ontop-wrap .tabbar-ontop-btn span { font-weight: 500; line-height: 1; transform: scale(0.8); transform-origin: center top; } .tabbar-ontop-wrap.is-scrolled .tabbar-ontop-btn { display: flex; } .tabbar-ontop-wrap.is-scrolled > .tabbar-item:not(.tabbar-ontop-btn) { opacity: 0; pointer-events: none; } /* ============================================================ * 暗色模式适配 * ============================================================ */ .theme-dark .site-footer, html.dark .site-footer { background: var(--surface-1); } .theme-dark .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%; } /* Full-viewport search panel open state (desktop + mobile) */ .tabbar-search-overlay[hidden] { display: none !important; } .tabbar-search-overlay.is-open, .tabbar-search-overlay.show:not([hidden]) { display: flex; } .tabbar-search-overlay__dialog { max-width: 720px; margin: 0 auto; } @media (min-width: 768px) { .tabbar-search-overlay { align-items: flex-start; padding-top: 8vh; background: rgba(15, 23, 42, 0.45); } .tabbar-search-overlay__dialog { min-height: auto; max-height: min(84vh, 860px); overflow: auto; border-radius: 20px; box-shadow: var(--shadow-lg, 0 20px 50px rgba(15, 23, 42, 0.22)); } .nav-searchbox--desktop { display: none; } .main-search-btn.nav-search-toggle { display: inline-flex; align-items: center; justify-content: center; } } @media (max-width: 767.98px) { .main-search-btn.nav-search-toggle { display: none; } } .site-footer--compact .site-footer__brand .site-footer__desc, .site-footer--compact .site-footer__brand .social-row, .site-footer--compact .site-footer__brand .site-footer__friends { display: none; } .site-footer--compact .site-footer__col { flex: 0 0 auto; } .site-footer--compact .site-footer__col ul { display: flex; flex-wrap: wrap; gap: 12px; list-style: none; padding: 0; margin: 0; } .site-footer--compact .site-footer__bottom { border-top: 1px solid var(--color-line); padding-top: 12px; margin-top: 12px; } /* 中央模板:居中品牌 + 链接 */ .site-footer--centered .site-footer__grid { text-align: center; } .site-footer--centered .site-footer__brand { flex: 1 1 100%; display: flex; flex-direction: column; align-items: center; } .site-footer--centered .site-footer__col { flex: 1 1 auto; } .site-footer--centered .site-footer__col ul { list-style: none; padding: 0; margin: 0; display: flex; flex-wrap: wrap; justify-content: center; gap: 16px; } /** * Footer — legacy template_1 shell * Contract: legacy/css/main.css footer block + legacy markup */ .footer { color: var(--footer-color, var(--color-ink-4)); background: var(--footer-bg, var(--surface-1)); padding: 30px; font-size: 13px; margin-top: auto; } .footer a:not(.but):not(.focus-color) { color: var(--footer-color, var(--color-ink-4)); } .footer a:hover { color: var(--focus-color, var(--color-primary)); } .footer .container-footer { max-width: calc(var(--mian-max-width, var(--container, 1200px)) + 180px); margin: 0 auto; width: 100%; } .footer .list-inline { display: flex; align-items: center; gap: 20px; list-style: none; margin: 0 0 12px; padding: 0; } .footer .list-inline > li { flex: 1; margin: 5px 15px; } .footer .list-inline > li + li + li { float: right; display: flex; align-items: flex-end; flex-direction: column; gap: 10px; } .footer a.footer-logo img, .footer .footer-logo img { height: 40px; width: auto; max-width: 180px; vertical-align: middle; display: inline-block; } /* title-h-left underline bar (legacy) */ .footer .title-h-left { position: relative; margin: 8px 0 10px; padding-bottom: 8px; font-size: 15px; font-weight: 700; color: var(--color-ink, #333); } .footer .title-h-left:before { transition: 0.4s; transform-origin: left; position: absolute; content: ""; width: 40px; height: 3px; background: var(--theme-color, var(--color-primary)); left: 0; bottom: 3px; border-radius: 5px; box-shadow: 1px 1px 3px -1px var(--theme-color, var(--color-primary)); } .footer .footer-muted, .footer .em09 { font-size: 0.92em; color: var(--muted-2-color, var(--color-ink-4)); line-height: 1.7; } .footer .opacity8 { opacity: 0.8; } .footer .fcode-links { margin: 0 0 8px; line-height: 1.9; } .footer .fcode-links > a + a:before { content: ""; width: 4px; height: 4px; margin: 0 0.5em; border-radius: 50%; display: inline-block; vertical-align: middle; background: var(--main-color, var(--color-ink-2)); opacity: 0.3; vertical-align: 0.2em; } /* Circular contact buttons — legacy .toggle-radius + .footer-contact > a */ .footer .toggle-radius { background: var(--this-bg, var(--main-border-color, var(--surface-2, #f0f0f0))); width: 29px; height: 29px; display: inline-block; text-align: center; border-radius: 100%; position: relative; vertical-align: text-top; line-height: 29px; color: var(--footer-color, var(--color-ink-3)); text-decoration: none; } .footer .footer-contact { margin-top: 10px; } .footer .footer-contact > a { font-size: 20px; margin: 5px; width: 35px; height: 35px; line-height: 35px; display: inline-block; text-align: center; border-radius: 100%; background: var(--this-bg, var(--main-border-color, var(--surface-2, #f0f0f0))); color: var(--footer-color, var(--color-ink-3)); text-decoration: none; vertical-align: text-top; position: relative; transition: color 0.15s ease, background 0.15s ease; } .footer .footer-contact > a:hover { color: #fff; background: var(--focus-color, var(--color-primary)); } .footer .footer-contact > a i { vertical-align: middle; } .footer .footer-wechat-img { display: none; position: absolute; width: 140px; bottom: 90%; left: -55px; padding-bottom: 20px; z-index: 5; } .footer .hover-show { position: relative; } .footer .hover-show:hover .footer-wechat-img, .footer .hover-show:focus .footer-wechat-img { display: block; } .footer .footer-wechat-img img { box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); border-radius: 4px; width: 100%; height: auto; background: #fff; } .footer .footer-miniimg img { width: 90px; margin: 0 6px; height: auto; max-width: 100%; display: block; border-radius: 4px; } .footer .footer-miniimg-2 { justify-content: flex-end; } .footer .footer-miniimg-2 img { height: 36px; border-radius: var(--main-radius); } .footer .footer-miniimg-2 .opacity8 { display: none; } .footer .footer-conter { margin: 8px 0 0; line-height: 1.8; color: var(--footer-color, var(--color-ink-4)); font-size: 13px; } .footer .mt10 { margin-top: 10px; } /* Device visibility — legacy hidden-xs */ @media (max-width: 767px) { .footer .hidden-xs, .hidden-xs { display: none !important; } .footer { padding: 10px 0; } .footer .container-footer { text-align: center; padding: 0 16px; } .footer .list-inline { gap: 10px; flex-direction: column; align-items: center; justify-content: center; } .footer .list-inline > li + li + li { float: none; align-items: center; } .footer .list-inline > li { margin: 12px 0; max-width: none !important; } .footer .footer-miniimg-2 { justify-content: center; } .footer .title-h-left:before { left: 50%; transform: translateX(-50%); } } /* Float right buttons shell (kept from prior shell) */ #float-right-btns.float-right, .float-right { position: fixed; right: 16px; bottom: 60px; z-index: 1030; display: flex; flex-direction: column; gap: 8px; } /* source: assets/css/frontend/floating-buttons.css */ /* ============================================================ * Floating Buttons * ============================================================ */ .float-right { --float-btn-size: 42px; --float-btn-spacing: 8px; --float-btn-opacity: 1; --float-btn-color: var(--color-ink-3); --float-btn-bg: transparent; --float-btn-active-color: var(--color-primary); position: fixed; right: 20px; bottom: 96px; z-index: 900; display: flex; flex-direction: column; gap: var(--float-btn-spacing, 8px); opacity: var(--float-btn-opacity, 1); 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.no-shadow .float-btn { box-shadow: none; } .float-right.no-animation .float-btn { transition: none; } .float-right.no-animation .float-btn:hover { transform: none; } .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(--float-btn-active-color, 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); text-align: center; } .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; text-align: center; } /* Page QR hover card: keep title/caption centered under the code */ .float-right .qrcode-btn .hover-show-con { display: flex; flex-direction: column; align-items: center; } .float-right .qrcode-btn .hover-show-con p { width: 100%; text-align: center; margin-top: 2px; } .float-right .qrcode-btn .hover-show-con .float-btn-qrcode__title { width: 100%; text-align: center; margin: 2px 0 0; font-size: 13px; line-height: 1.6; color: var(--color-ink-3); } .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(240, 68, 148, 0.1)); color: var(--color-primary, var(--color-primary)); transform: translateX(-2px); } .float-btn-qrcode canvas, .float-btn-qrcode 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); } } /* * Theme float glyph: light → moon, dark → sun. * Match nav toggle + theme.js contract. Class-driven only. */ .float-right .float-btn__icon-sun { display: none !important; } .float-right .float-btn__icon-moon { display: inline-block !important; } html.dark .float-right .float-btn__icon-moon, body.theme-dark .float-right .float-btn__icon-moon, body.dark-theme .float-right .float-btn__icon-moon { display: none !important; } html.dark .float-right .float-btn__icon-sun, body.theme-dark .float-right .float-btn__icon-sun, body.dark-theme .float-right .float-btn__icon-sun { display: inline-block !important; } /* VIP float rail entry */ .float-right .float-btn.pay-vip { color: var(--this-color, #f5a623); } .float-right .float-btn.pay-vip:hover { color: var(--this-color, #f5a623); opacity: 0.9; } .float-right .float-btn.signin-loader { cursor: pointer; } /* Dark: solid surface + brighter icon so transparent btn doesn't vanish */ html.dark .float-right, body.theme-dark .float-right, body.dark-theme .float-right { --float-btn-color: var(--color-ink-2, #e5eef7); --float-btn-bg: var(--surface-1, #323335); } html.dark .float-right .float-btn, body.theme-dark .float-right .float-btn, body.dark-theme .float-right .float-btn { border-color: rgba(255, 255, 255, 0.12); box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35); color: var(--this-color, var(--float-btn-color)); background: var(--this-bg, var(--float-btn-bg)); } html.dark .float-right .hover-show-con, body.theme-dark .float-right .hover-show-con, body.dark-theme .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)); } .float-right .float-btn.hide-on-mobile { display: none; } } @media (min-width: 768px) { .float-right .float-btn.hide-on-pc { display: none; } } /* source: assets/css/frontend/enhancements.css */ /** * AKSRT Enhancements — 全局 UI 增强 * * 包含:骨架屏、悬停动效、暗色过渡、滚动感知 * 所有选择器使用 aksrt- 前缀避免冲突 */ @keyframes aksrt-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } /* ============================================================ * 1. 骨架屏加载动画 * ============================================================ */ .aksrt-skeleton { background: linear-gradient( 90deg, rgba(121, 121, 121, 0.08) 25%, rgba(121, 121, 121, 0.15) 37%, rgba(121, 121, 121, 0.08) 63% ); background-size: 400% 100%; animation: aksrt-skeleton-shimmer 1.5s ease infinite; border-radius: 4px; } .aksrt-skeleton--image { height: 0; padding-bottom: 66.67%; /* 3:2 aspect ratio */ } .aksrt-skeleton--avatar { width: 40px; height: 40px; border-radius: 50%; } .aksrt-skeleton--title { height: 22px; width: 80%; } .aksrt-skeleton--text { height: 16px; width: 100%; } .aksrt-skeleton--text-short { height: 16px; width: 60%; } .aksrt-skeleton--button { height: 36px; width: 100px; border-radius: 8px; } @keyframes aksrt-skeleton-shimmer { 0% { background-position: 100% 50%; } 100% { background-position: 0 50%; } } /* 骨架屏组合:文章卡片骨架 */ .aksrt-skeleton-card { background: var(--surface-1, #fff); border: 1px solid var(--color-line); border-radius: 12px; overflow: hidden; padding: 0; } .aksrt-skeleton-card .aksrt-skeleton--image { border-radius: 0; } .aksrt-skeleton-card__body { padding: 16px; display: flex; flex-direction: column; gap: 10px; } /* ============================================================ * 2. 悬停交互动效 * ============================================================ */ /* 卡片放大 */ .aksrt-hover-zoom { transition: transform 0.3s ease; } .aksrt-hover-zoom:hover { transform: scale(1.02); } /* 卡片轻微放大 */ .aksrt-hover-zoom-sm { transition: transform 0.3s ease; } .aksrt-hover-zoom-sm:hover { transform: scale(1.02); } /* 悬停显示内容 */ .aksrt-hover-show { position: relative; } .aksrt-hover-show__content { position: absolute; opacity: 0; visibility: hidden; transform: translateY(6px); transition: opacity 0.3s, transform 0.3s, visibility 0.3s; z-index: 10; } .aksrt-hover-show:hover .aksrt-hover-show__content { opacity: 1; visibility: visible; transform: translateY(0); } /* 关闭按钮旋转 */ .aksrt-ic-close { transition: transform 0.3s; cursor: pointer; } .aksrt-ic-close:hover { transform: rotate(270deg); } /* 图片悬停缩放(缩略图容器) */ .aksrt-hover-zoom-img img { transition: transform 0.3s ease; } .aksrt-hover-zoom-img:hover img { transform: scale(1.02); } .aksrt-hover-zoom-img-sm img { transition: transform 0.3s ease; } .aksrt-hover-zoom-img-sm:hover img { transform: scale(1.02); } /* 按钮悬停上浮 */ .aksrt-hover-lift { transition: transform 0.2s ease, box-shadow 0.2s ease; } .aksrt-hover-lift:hover { transform: none; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); } /* ============================================================ * 3. 暗色模式过渡 (View Transitions API) * ============================================================ */ ::view-transition-old(root), ::view-transition-new(root) { animation: none; mix-blend-mode: normal; } .dark::view-transition-old(root), body.dark-theme::view-transition-old(root) { z-index: 1; } .dark::view-transition-new(root), body.dark-theme::view-transition-new(root) { z-index: 2147483646; } ::view-transition-old(root) { z-index: 2147483646; } ::view-transition-new(root) { z-index: 1; } /* backdrop-filter 不支持时的降级 */ @supports not ((-webkit-backdrop-filter: blur(20px)) or (backdrop-filter: blur(20px))) { :root { --aksrt-blur-bg: #ffffff; } .dark { --aksrt-blur-bg: var(--surface-1); } } /* ============================================================ * 4. 滚动方向感知 * ============================================================ */ /* 向下滚动时隐藏导航栏 */ body.aksrt-scroll-down .site-nav.nav-scroll-hide { transform: translateY(-100%); transition: transform 0.3s ease; } body.aksrt-scroll-up .site-nav.nav-scroll-hide { transform: translateY(0); transition: transform 0.3s ease; } /* 滚动时隐藏浮动按钮 */ body.aksrt-scrolling .aksrt-floating-right.scrolling-hide { opacity: 0; pointer-events: none; transition: opacity 0.2s; } /* body-scroll 状态类 */ body.aksrt-body-scroll .aksrt-show-on-scroll { opacity: 1; visibility: visible; } .aksrt-show-on-scroll { opacity: 0; visibility: hidden; transition: opacity 0.3s, visibility 0.3s; } /* ============================================================ * 5. 图片灯箱 * ============================================================ */ .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); } .reward-modal__content > p { margin: -4px 0 18px; } .reward-amounts { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; margin: 18px 0; } .reward-amount { min-height: 42px; border: 1px solid var(--color-line-soft, rgba(15, 23, 42, 0.1)); border-radius: 10px; background: var(--surface-2); color: var(--color-ink-2); cursor: pointer; font-weight: 700; } .reward-amount.is-active { border-color: var(--color-primary); background: var(--color-primary-soft); color: var(--color-primary); } .reward-custom { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 16px; color: var(--color-ink-3); font-size: 13px; } .reward-custom input { width: 140px; min-height: 40px; border: 1px solid var(--color-line-soft, rgba(15, 23, 42, 0.1)); border-radius: 9px; background: var(--surface-1); color: var(--color-ink); padding: 0 12px; } .reward-modal__submit { width: 100%; min-height: 42px; } .reward-modal__message { min-height: 20px; margin-top: 10px; color: var(--color-primary); font-size: 12px; text-align: center; } /* ---- reward amounts ---- */ .reward-amounts { display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; margin-bottom: 16px; } .reward-amounts__btn { display: inline-flex; align-items: baseline; gap: 2px; padding: 8px 16px; border: 1px solid var(--color-line, #e5e7eb); border-radius: var(--radius, 10px); background: var(--surface-2, #F4F5F7); color: var(--color-ink); font-size: 15px; font-weight: 600; cursor: pointer; transition: all 0.2s ease; user-select: none; } .reward-amounts__btn:hover { border-color: var(--color-primary, #f04494); background: rgba(240, 68, 148, 0.06); } .reward-amounts__btn.is-active { border-color: var(--color-primary, #f04494); background: var(--color-primary, #f04494); color: #fff; } .reward-amounts__currency { font-size: 13px; font-weight: 400; } .reward-amounts__value { font-size: 15px; } /* ---- custom amount ---- */ .reward-custom { display: flex; align-items: center; gap: 8px; margin-bottom: 16px; } .reward-custom__input { flex: 1; height: 40px; padding: 0 12px; border: 1px solid var(--color-line, #e5e7eb); border-radius: var(--radius, 10px); background: var(--surface-2, #F4F5F7); color: var(--color-ink); font-size: 14px; text-align: center; outline: none; transition: border-color 0.2s; -moz-appearance: textfield; } .reward-custom__input::-webkit-inner-spin-button, .reward-custom__input::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; } .reward-custom__input:focus { border-color: var(--color-primary, #f04494); } .reward-custom__confirm { flex-shrink: 0; height: 40px; padding: 0 20px; border: none; border-radius: var(--radius, 10px); background: var(--color-primary, #f04494); color: #fff; font-size: 14px; font-weight: 500; cursor: pointer; transition: opacity 0.2s; } .reward-custom__confirm:hover { opacity: 0.85; } /* ============================================================ * 9. 公告跑马灯 Widget * ============================================================ */ .aksrt-announcement { position: relative; overflow: hidden; padding: 10px 12px; background: var(--surface-2, #F4F5F7); border-radius: var(--radius, 10px); } .aksrt-announcement__icon { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); color: var(--color-primary, var(--color-primary)); font-size: 14px; z-index: 1; } .aksrt-announcement__track { margin-left: 24px; overflow: hidden; height: 20px; } .aksrt-announcement__list { margin: 0; padding: 0; list-style: none; animation: aksrt-marquee 10s linear infinite; } .aksrt-announcement__item { height: 20px; line-height: 20px; font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .aksrt-announcement__item a { color: var(--color-ink-2); text-decoration: none; } .aksrt-announcement__item a:hover { color: var(--color-primary, var(--color-primary)); } @keyframes aksrt-marquee { 0% { transform: translateY(0); } 100% { transform: translateY(-100%); } } .aksrt-announcement:hover .aksrt-announcement__list { animation-play-state: paused; } /* ============================================================ * 11. 滚动触发动画初始状态 * ============================================================ */ [data-aksrt-animate] { will-change: opacity, transform; } /* ============================================================ * 12. 粘性侧栏 * ============================================================ */ [data-aksrt-sticky] { will-change: transform; } /* ============================================================ * 13. 用户排行榜 Widget * ============================================================ */ .aksrt-user-ranking { margin: 0; padding: 0; list-style: none; } .aksrt-user-ranking__item { display: flex; align-items: center; gap: 10px; padding: 10px 0; border-bottom: 1px solid var(--color-line-soft, #F0F1F3); } .aksrt-user-ranking__item:last-child { border-bottom: none; } .aksrt-user-ranking__rank { display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 6px; background: var(--surface-2, #F4F5F7); color: var(--color-ink-3); font-size: 12px; font-weight: 600; flex-shrink: 0; } .aksrt-user-ranking__item--top:nth-child(1) .aksrt-user-ranking__rank { background: #FFD700; color: #fff; } .aksrt-user-ranking__item--top:nth-child(2) .aksrt-user-ranking__rank { background: #C0C0C0; color: #fff; } .aksrt-user-ranking__item--top:nth-child(3) .aksrt-user-ranking__rank { background: #CD7F32; color: #fff; } .aksrt-user-ranking__avatar { flex-shrink: 0; } .aksrt-user-ranking__avatar img { width: 36px; height: 36px; border-radius: 50%; object-fit: cover; } .aksrt-user-ranking__name { flex: 1; min-width: 0; font-size: 14px; color: var(--color-ink); text-decoration: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .aksrt-user-ranking__name:hover { color: var(--color-primary, var(--color-primary)); } .aksrt-user-ranking__value { font-size: 12px; color: var(--color-ink-4, #8A8F98); white-space: nowrap; } /* ============================================================ * 14. 图文封面卡片 Widget * ============================================================ */ .aksrt-cover-cards { display: grid; grid-template-columns: repeat(var(--cols, 2), 1fr); gap: 12px; } .aksrt-cover-card { position: relative; border-radius: var(--radius-lg, 8px); overflow: hidden; min-height: 160px; display: flex; align-items: flex-end; transition: transform 0.3s, box-shadow 0.3s; } .aksrt-cover-card:hover { transform: translateY(-3px); box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15); } .aksrt-cover-card__bg { position: absolute; inset: 0; } .aksrt-cover-card__bg img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.5s; } .aksrt-cover-card:hover .aksrt-cover-card__bg img { transform: scale(1.02); } .aksrt-cover-card__overlay { position: absolute; inset: 0; background: linear-gradient(180deg, rgba(0,0,0,0) 30%, rgba(0,0,0,0.6) 100%); } .aksrt-cover-card__content { position: relative; z-index: 1; padding: 16px; width: 100%; } .aksrt-cover-card__link { text-decoration: none; color: inherit; display: block; } .aksrt-cover-card__title { margin: 0 0 4px; font-size: 16px; font-weight: 600; color: #fff; text-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); } .aksrt-cover-card__desc { margin: 0; font-size: 13px; color: rgba(255, 255, 255, 0.85); text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } /* ============================================================ * 15. 视频播放器 Widget * ============================================================ */ .aksrt-video-widget { position: relative; width: 100%; overflow: hidden; border-radius: var(--radius, 10px); background: #000; } .aksrt-video-widget iframe, .aksrt-video-widget video { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: none; } /* ============================================================ * 16. 表单输入浮动标签 * ============================================================ */ .aksrt-float-label { position: relative; } .aksrt-float-label__input { width: 100%; padding: 14px 12px 6px; font-size: 14px; border: 1px solid var(--color-line); border-radius: var(--radius, 10px); background: var(--surface-1, #fff); color: var(--color-ink); transition: border-color 0.2s; } .aksrt-float-label__input:focus { outline: none; border-color: var(--color-primary, var(--color-primary)); } .aksrt-float-label__label { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); font-size: 14px; color: var(--color-ink-4, #8A8F98); pointer-events: none; transition: all 0.2s ease; } .aksrt-float-label__input:focus + .aksrt-float-label__label, .aksrt-float-label__input:not(:placeholder-shown) + .aksrt-float-label__label { top: 8px; transform: translateY(0); font-size: 11px; color: var(--color-primary, var(--color-primary)); } /* ============================================================ * 17. 视差滚动层 * ============================================================ */ [data-aksrt-parallax] { will-change: transform; transition: transform 0.1s linear; } /* ============================================================ * 18. 签到日历可视化 * ============================================================ */ .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); } /* source: assets/css/frontend/skeleton.css */ /* ========== 骨架屏加载 — 对齐 legacy skeleton loading ========== */ .skeleton { position: relative; overflow: hidden; background: var(--surface-2, #eee); border-radius: var(--radius, 8px); } .skeleton::after { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient( 90deg, transparent 0%, rgba(255, 255, 255, 0.4) 50%, transparent 100% ); animation: skeleton-shimmer 1.5s infinite; } @keyframes skeleton-shimmer { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } } /* 骨架屏变体 */ .skeleton-text { height: 14px; border-radius: 4px; margin-bottom: 8px; } .skeleton-text--title { height: 20px; width: 60%; margin-bottom: 12px; } .skeleton-text--short { width: 40%; } .skeleton-text--medium { width: 70%; } .skeleton-avatar { width: 48px; height: 48px; border-radius: 50%; flex-shrink: 0; } .skeleton-avatar--sm { width: 32px; height: 32px; } .skeleton-avatar--lg { width: 64px; height: 64px; } .skeleton-thumb { width: 100%; aspect-ratio: 16 / 9; border-radius: var(--radius, 8px); } .skeleton-thumb--square { aspect-ratio: 1; } .skeleton-thumb--card { aspect-ratio: 16 / 10; border-radius: var(--radius, 8px) var(--radius, 8px) 0 0; } /* 卡片骨架屏 */ .skeleton-card { background: var(--surface-1, #fff); border-radius: var(--radius, 8px); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04); overflow: hidden; } .skeleton-card__thumb { width: 100%; aspect-ratio: 16 / 10; } .skeleton-card__body { padding: 14px 16px; } .skeleton-card__meta { display: flex; align-items: center; gap: 8px; margin-top: 10px; } /* 评论骨架屏 */ .skeleton-comment { display: flex; gap: 12px; padding: 16px 0; border-bottom: 1px solid var(--color-line-soft, rgba(0, 0, 0, 0.03)); } .skeleton-comment__body { flex: 1; } .skeleton-comment__header { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; } /* 通用骨架屏容器 */ .skeleton-list .skeleton-item { padding: 12px 0; border-bottom: 1px solid var(--color-line-soft, rgba(0, 0, 0, 0.03)); } .skeleton-list .skeleton-item:last-child { border-bottom: none; } /* 减弱动画偏好 */ @media (prefers-reduced-motion: reduce) { .skeleton::after { animation: none; } } /* source: assets/css/frontend/empty-state.css */ /* ========== 空状态 — 对齐 legacy empty state ========== */ .empty-state { text-align: center; padding: 60px 20px; color: var(--color-ink-3, #777); } .empty-state__icon { font-size: 56px; color: var(--surface-3, #e8e8e8); margin-bottom: 16px; line-height: 1; } .empty-state__icon i { display: inline-block; } .empty-state__title { font-size: 16px; font-weight: 500; color: var(--color-ink-2, #4e5358); margin-bottom: 8px; } .empty-state__desc { font-size: 13px; color: var(--color-ink-4, #999); margin-bottom: 20px; max-width: 320px; margin-left: auto; margin-right: auto; line-height: 1.6; } .empty-state__action { display: inline-flex; align-items: center; gap: 6px; } /* 空状态变体 */ .empty-state--sm { padding: 30px 16px; } .empty-state--sm .empty-state__icon { font-size: 40px; } .empty-state--sm .empty-state__title { font-size: 14px; } .empty-state--sm .empty-state__desc { font-size: 12px; } /* 搜索空状态 */ .search-empty { text-align: center; padding: 80px 20px; } .search-empty__icon { font-size: 64px; color: var(--surface-3, #e8e8e8); margin-bottom: 16px; } .search-empty__title { font-size: 18px; font-weight: 500; color: var(--color-ink-2, #4e5358); margin-bottom: 8px; } .search-empty__suggestions { font-size: 13px; color: var(--color-ink-4, #999); } .search-empty__suggestions a { color: var(--color-primary, #f04494); text-decoration: none; } .search-empty__suggestions a:hover { text-decoration: underline; } /* 移动端 */ @media (max-width: 767px) { .empty-state { padding: 40px 16px; } .empty-state__icon { font-size: 44px; } } /* source: assets/css/frontend/pagination.css */ /* ========== 分页 — 对齐 legacy pagination ========== */ .content-stream__footer-nav { width: 100%; } .content-stream__footer-nav.aksrt-pagination, .content-stream__footer-nav.aksrt-pagination-ajax, .content-stream__footer .aksrt-pagination, .content-stream__footer .aksrt-pagination-ajax { margin: 0; } .pagination, .aksrt-pagination, .navigation.pagination .nav-links, .pagenav.ajax-pag { display: flex; align-items: center; justify-content: center; gap: 6px; padding: 24px 0; flex-wrap: wrap; } .pagination a, .pagination span, .aksrt-pagination a, .aksrt-pagination span, .navigation.pagination a, .navigation.pagination span, .pagenav.ajax-pag a, .pagenav.ajax-pag span { display: inline-flex; align-items: center; justify-content: center; min-width: 34px; min-height: 34px; padding: 6px 10px; font-size: 13px; line-height: 1.4; color: var(--muted-color, var(--color-ink-3)); background: var(--surface-4, var(--main-border-color, rgba(50, 50, 50, 0.06))); border: 1px solid transparent; border-radius: var(--radius-xs, 3px); text-decoration: none; transition: all 0.2s; user-select: none; } .pagination a:hover, .aksrt-pagination a:hover, .navigation.pagination a:hover, .pagenav.ajax-pag a:hover { opacity: 1; color: var(--color-primary); background: var(--color-primary-soft); } .pagination .current, .aksrt-pagination .current, .navigation.pagination .current, .pagenav.ajax-pag .current { color: var(--color-on-primary, #fff); background: var(--color-primary, #f04494); border-color: var(--color-primary, #f04494); font-weight: 500; } .pagination .dots, .aksrt-pagination .dots, .navigation.pagination .dots, .pagenav.ajax-pag .dots { border: none; background: none; color: var(--color-ink-4, #999); cursor: default; min-width: auto; padding-left: 4px; padding-right: 4px; } .pagination .prev, .pagination .next, .aksrt-pagination .prev, .aksrt-pagination .next, .navigation.pagination .prev, .navigation.pagination .next, .pagenav.ajax-pag .prev, .pagenav.ajax-pag .next { font-size: 12px; } .pagination .prev i, .pagination .next i, .aksrt-pagination .prev i, .aksrt-pagination .next i, .navigation.pagination .prev i, .navigation.pagination .next i, .pagenav.ajax-pag .prev i, .pagenav.ajax-pag .next i { font-size: 11px; } .pagenav.ajax-pag .pag-jump, .aksrt-pagination .pag-jump, .navigation.pagination .pag-jump { display: inline-flex; align-items: center; gap: 6px; margin-left: 6px; } .pagenav.ajax-pag .jump-input, .aksrt-pagination .jump-input, .navigation.pagination .jump-input { width: 64px; min-width: 64px; padding: 6px 8px 5px; font-size: 13px; line-height: 1.4; color: var(--muted-color, var(--color-ink-3)); background: var(--main-bg-color, #fff); border: 1px solid var(--main-border-color, rgba(50, 50, 50, 0.06)); border-radius: 3px; box-shadow: none; } .pagenav.ajax-pag .jump-input:focus, .aksrt-pagination .jump-input:focus, .navigation.pagination .jump-input:focus { outline: none; border-color: var(--focus-color, var(--color-primary, #f04494)); } .pagenav.ajax-pag .pag-jump .ajax-next, .aksrt-pagination .pag-jump .ajax-next, .navigation.pagination .pag-jump .ajax-next { min-width: auto; cursor: pointer; } /* 上一页/下一页 */ .pagination__nav { display: flex; gap: 8px; justify-content: center; margin-top: 8px; } .pagination__nav a { display: inline-flex; align-items: center; gap: 4px; padding: 6px 14px; font-size: 13px; color: var(--color-ink-2, #4e5358); background: var(--surface-1, #fff); border: 1px solid var(--color-line, rgba(50, 50, 50, 0.06)); border-radius: 6px; text-decoration: none; transition: all 0.2s; } .pagination__nav a:hover { color: var(--color-primary, #f04494); border-color: var(--color-primary, #f04494); } /* AJAX 加载更多 */ .load-more { text-align: center; padding: 20px 0; } .load-more__btn { display: inline-flex; align-items: center; gap: 6px; padding: 10px 24px; font-size: 13px; color: var(--color-ink-2, #4e5358); background: var(--surface-1, #fff); border: 1px solid var(--color-line, rgba(50, 50, 50, 0.06)); border-radius: 20px; cursor: pointer; transition: all 0.2s; } .load-more__btn:hover { color: var(--color-primary, #f04494); border-color: var(--color-primary, #f04494); } .load-more__btn:disabled { opacity: 0.5; cursor: not-allowed; } .load-more__spinner { display: inline-block; width: 16px; height: 16px; border: 2px solid var(--surface-3, #e8e8e8); border-top-color: var(--color-primary, #f04494); border-radius: 50%; animation: spin 0.6s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* 移动端 */ @media (max-width: 767px) { .pagination a, .pagination span, .aksrt-pagination a, .aksrt-pagination span, .navigation.pagination a, .navigation.pagination span, .pagenav.ajax-pag a, .pagenav.ajax-pag span { min-width: 28px; font-size: 12px; margin: 2px; } .pagenav.ajax-pag .pag-jump, .aksrt-pagination .pag-jump, .navigation.pagination .pag-jump { width: 100%; justify-content: center; margin-left: 0; margin-top: 6px; } .pagenav.ajax-pag .jump-input, .aksrt-pagination .jump-input, .navigation.pagination .jump-input { width: 58px; min-width: 58px; font-size: 12px; } } /* source: assets/css/frontend/ajax-spinner.css */ /* ========== AJAX 加载指示器 — 对齐 legacy loading spinner ========== */ .aksrt-loading { display: flex; align-items: center; justify-content: center; padding: 40px 20px; color: var(--color-ink-4, #999); font-size: 13px; gap: 8px; } .aksrt-loading__spinner { display: inline-block; width: 20px; height: 20px; border: 2px solid var(--surface-3, #e8e8e8); border-top-color: var(--color-primary, #f04494); border-radius: 50%; animation: aksrt-spin 0.6s linear infinite; } @keyframes aksrt-spin { to { transform: rotate(360deg); } } /* 全屏加载遮罩 */ .aksrt-loading-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(255, 255, 255, 0.8); display: flex; align-items: center; justify-content: center; z-index: 9999; backdrop-filter: blur(2px); } .aksrt-loading-overlay__content { text-align: center; } .aksrt-loading-overlay__spinner { width: 36px; height: 36px; border: 3px solid var(--surface-3, #e8e8e8); border-top-color: var(--color-primary, #f04494); border-radius: 50%; animation: aksrt-spin 0.6s linear infinite; margin: 0 auto 12px; } .aksrt-loading-overlay__text { font-size: 13px; color: var(--color-ink-3, #777); } /* 行内加载(替换内容时) */ .aksrt-loading-inline { display: flex; align-items: center; justify-content: center; padding: 20px; color: var(--color-ink-4, #999); font-size: 12px; gap: 6px; } .aksrt-loading-inline__dot { width: 6px; height: 6px; background: var(--color-primary, #f04494); border-radius: 50%; animation: aksrt-dot-pulse 1.2s ease-in-out infinite; } .aksrt-loading-inline__dot:nth-child(2) { animation-delay: 0.2s; } .aksrt-loading-inline__dot:nth-child(3) { animation-delay: 0.4s; } @keyframes aksrt-dot-pulse { 0%, 80%, 100% { opacity: 0.3; transform: scale(0.8); } 40% { opacity: 1; transform: scale(1); } } /* 页面加载进度条 */ .aksrt-progress-bar { position: fixed; top: 0; left: 0; height: 2px; background: var(--color-primary, #f04494); z-index: 10000; transition: width 0.3s ease; } /* 减弱动画偏好 */ @media (prefers-reduced-motion: reduce) { .aksrt-loading__spinner, .aksrt-loading-overlay__spinner { animation-duration: 1.5s; } .aksrt-loading-inline__dot { animation: none; opacity: 0.6; } } /* source: assets/css/frontend/modal-runtime.css */ /** * Modal runtime + ajax list primitives (shared). * * @package AKSRT */ /* ---- scroll lock ---- */ html.aksrt-modal-runtime-open, body.aksrt-modal-runtime-open { overflow: hidden; } /* ---- modal runtime shell ---- */ .aksrt-modal-runtime { position: fixed; inset: 0; z-index: 100050; display: flex; align-items: center; justify-content: center; opacity: 0; visibility: hidden; transition: opacity 0.2s ease, visibility 0.2s ease; pointer-events: none; } .aksrt-modal-runtime.is-open { opacity: 1; visibility: visible; pointer-events: auto; } .aksrt-modal-runtime__overlay { position: absolute; inset: 0; background: rgba(15, 18, 28, 0.48); backdrop-filter: blur(2px); } .aksrt-modal-runtime__dialog { position: relative; z-index: 1; width: min(440px, calc(100vw - 32px)); max-height: min(88vh, 720px); overflow: auto; background: var(--surface-1, #fff); border-radius: 16px; box-shadow: 0 18px 48px rgba(15, 18, 28, 0.22); transform: translateY(12px) scale(0.98); transition: transform 0.22s cubic-bezier(0.22, 1, 0.36, 1); color: var(--color-ink, #1f2937); } .aksrt-modal-runtime.is-open .aksrt-modal-runtime__dialog { transform: translateY(0) scale(1); } .aksrt-modal-runtime--bottom { align-items: flex-end; } .aksrt-modal-runtime--bottom .aksrt-modal-runtime__dialog { width: 100%; max-width: 100%; border-radius: 16px 16px 0 0; max-height: 90vh; transform: translateY(24px); } .aksrt-modal-runtime--bottom.is-open .aksrt-modal-runtime__dialog { transform: translateY(0); } .aksrt-modal-runtime__header { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 16px 18px 0; } .aksrt-modal-runtime__title { margin: 0; font-size: 17px; line-height: 1.35; } .aksrt-modal-runtime__content { padding: 18px 18px 16px; } .aksrt-modal-runtime__loading, .aksrt-modal-runtime__error-body { padding: 28px 8px; text-align: center; color: var(--color-ink-2, #6b7280); font-size: 14px; } .aksrt-modal-runtime__skeleton { display: grid; gap: 12px; padding: 8px 2px; } .aksrt-modal-runtime__skeleton-line, .aksrt-modal-runtime__skeleton-block { display: block; border-radius: 8px; background: linear-gradient(90deg, rgba(148, 163, 184, 0.16), rgba(148, 163, 184, 0.3), rgba(148, 163, 184, 0.16)); background-size: 200% 100%; animation: aksrt-modal-skeleton 1.2s ease-in-out infinite; } .aksrt-modal-runtime__skeleton-line { width: 72%; height: 12px; } .aksrt-modal-runtime__skeleton-line.is-wide { width: 92%; height: 18px; } .aksrt-modal-runtime__skeleton-line.is-short { width: 44%; } .aksrt-modal-runtime__skeleton-block { width: 100%; min-height: 84px; } .aksrt-modal-runtime__retry { cursor: pointer; } @keyframes aksrt-modal-skeleton { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } } .aksrt-modal-runtime .touch.border-title, .aksrt-modal-runtime .border-title { font-size: 16px; font-weight: 700; margin: 0 0 14px; display: flex; align-items: baseline; flex-wrap: wrap; gap: 6px; } .aksrt-modal-runtime .aksrt-modal-runtime__close { position: absolute; top: 10px; right: 10px; width: 32px; height: 32px; border: 0; border-radius: 999px; background: transparent; color: var(--color-ink-3, #9ca3af); cursor: pointer; font-size: 18px; line-height: 1; } .aksrt-modal-runtime .but-average.modal-buts, .aksrt-modal-runtime .modal-buts { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 16px; } .aksrt-modal-runtime .but-average.modal-buts .but, .aksrt-modal-runtime .modal-buts .but, .aksrt-modal-runtime .modal-buts button { min-height: 40px; border-radius: 10px; border: 1px solid var(--color-line, #e5e7eb); background: var(--surface-4, #f3f4f6); color: var(--color-ink, #111); font-weight: 600; cursor: pointer; } .aksrt-modal-runtime .modal-buts .but.c-blue, .aksrt-modal-runtime .modal-buts button.c-blue, .aksrt-modal-runtime .modal-buts .btn-primary { background: var(--color-primary, #f04494); border-color: color-mix(in srgb, var(--color-primary, #f04494) 70%, #000 0%); color: var(--color-on-primary, #fff); } /* ---- ajax list ---- */ .ajaxpager.is-ajax-loading { position: relative; min-height: 80px; } .ajaxpager .post_ajax_loader, .ajaxpager .post-ajax-loader { display: none; } .ajaxpager .post_ajax_loader.is-loading, .ajaxpager .post-ajax-loader.is-loading { display: block; } .ajax-item.is-fading { opacity: 0.35; transition: opacity 0.15s ease; } /* ---- order review modal content ---- */ .order-comment-from .shop-score-box { display: flex; align-items: center; gap: 8px; min-height: 36px; } .order-comment-from .score-title { width: 4.5em; flex: 0 0 auto; font-size: 13px; color: var(--color-ink-2, #6b7280); } .order-comment-from .score-icon { display: inline-flex; gap: 4px; align-items: center; height: 30px; } .order-comment-from .icon-star { display: inline-flex; width: 22px; height: 22px; color: #d1d5db; cursor: pointer; transition: color 0.12s ease, transform 0.12s ease; } .order-comment-from .icon-star svg { width: 22px; height: 22px; fill: currentColor; } .order-comment-from .icon-star.active, .order-comment-from .icon-star.hover { color: #fc7049; } .order-comment-from .icon-star.hover { transform: scale(1.08); } .order-comment-from .score-text { min-width: 3em; font-size: 13px; color: var(--color-ink-2, #6b7280); } .order-comment-from textarea.form-control { width: 100%; border: 1px solid var(--color-line, #e5e7eb); border-radius: 10px; padding: 10px 12px; font-size: 14px; resize: vertical; min-height: 96px; background: var(--surface-1, #fff); color: var(--color-ink, #111); } .order-comment-from .form-upload .preview { display: flex; flex-wrap: wrap; gap: 8px; } .order-comment-from .form-upload .preview .add, .order-comment-from .form-upload .preview .preview-item { width: 80px; height: 80px; border-radius: 10px; border: 1px dashed var(--color-line, #d1d5db); background: var(--surface-4, #f9fafb); position: relative; overflow: hidden; cursor: pointer; } .order-comment-from .form-upload .preview .add::before, .order-comment-from .form-upload .preview .add::after { content: ""; position: absolute; left: 50%; top: 50%; background: var(--color-ink-3, #9ca3af); transform: translate(-50%, -50%); } .order-comment-from .form-upload .preview .add::before { width: 22px; height: 2px; } .order-comment-from .form-upload .preview .add::after { width: 2px; height: 22px; } .order-comment-from .form-upload .preview .preview-item img { width: 100%; height: 100%; object-fit: cover; display: block; } .order-comment-from .form-upload .preview .preview-item .remove { position: absolute; top: 2px; right: 2px; width: 20px; height: 20px; border: 0; border-radius: 999px; background: rgba(0, 0, 0, 0.55); color: #fff; font-size: 12px; line-height: 1; cursor: pointer; } .order-comment-from .form-upload .hide { display: none !important; } .order-comment-from .review-error { color: #ef4444; font-size: 13px; margin-top: 8px; } @media (max-width: 768px) { .aksrt-modal-runtime:not(.aksrt-modal-runtime--bottom) .aksrt-modal-runtime__dialog { width: calc(100vw - 20px); } } /* source: assets/css/frontend/notyf.css */ /** * legacy-compatible frontend notifications. * * @package AKSRT */ .notyn { position: fixed; bottom: 6em; right: 0; max-width: 320px; z-index: 10000000; } .notyf { position: relative; margin-bottom: 0.6em; color: #fff; font-size: 14px; line-height: 1.42857143; float: right; min-width: 200px; padding: 1em 3em 1em 3.4em; box-shadow: -3px 3px 6px rgba(0, 0, 0, 0.1); transform: translateX(1.5em); transition: 0.3s; -webkit-backdrop-filter: saturate(5) blur(20px); backdrop-filter: saturate(5) blur(20px); -webkit-animation: notyf 0.4s cubic-bezier(0.35, 0.71, 0.46, 1.08); animation: notyf 0.4s cubic-bezier(0.35, 0.71, 0.46, 1.08); } .notyn-out .notyf { transform: translateX(110%); opacity: 0.5; transition: 0.5s; } @-webkit-keyframes notyf { 0% { transform: translateX(110%); opacity: 0; } 100% { transform: translateX(1.5em); opacity: 1; } } @keyframes notyf { 0% { transform: translateX(110%); opacity: 0; } 100% { transform: translateX(1.5em); opacity: 1; } } .notyf::before { font-family:"Font Awesome 5 Free";font-weight:900; font-style: normal; font-weight: 900; line-height: 1; left: 0.8em; font-size: 1.5em; position: absolute; top: 0; bottom: 0; margin: auto; height: 20px; } .notyf.success { background: linear-gradient(90deg, rgba(15, 147, 249, 0.7), rgba(61, 189, 249, 0.8)); } .notyf.success::before { content: '\f058'; } .notyf.info { background: linear-gradient(90deg, rgba(58, 162, 54, 0.8), rgba(89, 247, 131, 0.8)); } .notyf.info::before { content: '\f0a1'; } .notyf.warning, .notyf.load { background: linear-gradient(90deg, rgba(253, 170, 71, 0.7), rgba(247, 154, 13, 0.8)); } .notyf.warning::before { content: '\f05a'; } .notyf.danger { background: linear-gradient(90deg, rgba(253, 69, 28, 0.7), rgba(251, 110, 75, 0.8)); } .notyf.danger::before { content: '\f057'; } .notyf .fa-close { float: right; padding: 0.6em; margin: -0.4em; } .notyf.load::before { content: ''; width: 0.7em; height: 0.7em; display: inline-block; border: 0.08em solid transparent; border-width: calc(1px + 0.03em); border-radius: 50%; border-top-color: var(--this-color); border-bottom-color: var(--this-color); -webkit-animation: huan-rotate 1s cubic-bezier(0.7, 0.1, 0.31, 0.9) infinite; animation: huan-rotate 1s cubic-bezier(0.7, 0.1, 0.31, 0.9) infinite; } @-webkit-keyframes huan-rotate { 0% { transform: rotate(0); } 100% { transform: rotate(360deg); } } @keyframes huan-rotate { 0% { transform: rotate(0); } 100% { transform: rotate(360deg); } }