Files
wordpress-theme-aksrt/assets/css/frontend/enhancements/core-ui.css
T

484 lines
9.8 KiB
CSS

/**
* AKSRT Enhancements — 全局 UI 增强
*
* 包含:Toast 通知、骨架屏、悬停动效、暗色过渡、滚动感知
* 所有选择器使用 aksrt- 前缀避免冲突
*/
/* ============================================================
* 1. Toast 通知系统
* ============================================================ */
.aksrt-toast-container {
position: fixed;
bottom: 80px;
right: 16px;
max-width: 360px;
z-index: 10000;
display: flex;
flex-direction: column-reverse;
gap: 8px;
pointer-events: none;
}
.aksrt-toast {
pointer-events: auto;
display: flex;
align-items: center;
gap: 10px;
padding: 12px 16px;
border-radius: var(--main-radius, 8px);
color: #fff;
font-size: 14px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
backdrop-filter: saturate(5) blur(20px);
-webkit-backdrop-filter: saturate(5) blur(20px);
transform: translateX(120%);
opacity: 0;
animation: aksrt-toast-in 0.35s cubic-bezier(0.35, 0.71, 0.46, 1.08) forwards;
cursor: pointer;
transition: transform 0.3s, opacity 0.3s;
}
.aksrt-toast.is-dismissing {
transform: translateX(120%);
opacity: 0;
transition: transform 0.3s ease-in, opacity 0.3s ease-in;
}
.aksrt-toast__icon {
font-size: 18px;
flex-shrink: 0;
}
.aksrt-toast__text {
flex: 1;
min-width: 0;
line-height: 1.4;
}
/* Toast 类型 — 对齐 zibll 纯色 */
.aksrt-toast--success {
background: rgba(16, 185, 129, 0.9);
}
.aksrt-toast--info {
background: rgba(59, 130, 246, 0.9);
}
.aksrt-toast--warning {
background: rgba(245, 158, 11, 0.9);
}
.aksrt-toast--danger,
.aksrt-toast--error {
background: rgba(239, 68, 68, 0.9);
}
.aksrt-toast--loading {
background: rgba(107, 114, 128, 0.9);
}
.aksrt-toast--loading .aksrt-toast__icon {
animation: aksrt-spin 1s linear infinite;
}
.aksrt-modal-auth__error.is-success {
background: rgba(16, 185, 129, 0.08);
border-color: rgba(16, 185, 129, 0.22);
color: #047857;
}
.aksrt-modal-auth__checkbox {
display: flex;
align-items: flex-start;
gap: 8px;
font-size: 13px;
color: var(--muted-color, #777);
}
.aksrt-modal-auth__hint {
margin: -4px 0 0;
font-size: 13px;
color: var(--muted-color, #777);
line-height: 1.6;
}
@keyframes aksrt-toast-in {
from {
transform: translateX(120%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
@keyframes aksrt-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* ============================================================
* 2. 骨架屏加载动画
* ============================================================ */
.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;
}
/* ============================================================
* 3. 悬停交互动效
* ============================================================ */
/* 卡片放大 */
.aksrt-hover-zoom {
transition: transform 0.3s ease;
}
.aksrt-hover-zoom:hover {
transform: scale(1.02);
}
/* 卡片轻微放大 */
.aksrt-hover-zoom-sm {
transition: transform 0.3s ease;
}
.aksrt-hover-zoom-sm:hover {
transform: scale(1.02);
}
/* 悬停显示内容 */
.aksrt-hover-show {
position: relative;
}
.aksrt-hover-show__content {
position: absolute;
opacity: 0;
visibility: hidden;
transform: translateY(6px);
transition: opacity 0.3s, transform 0.3s, visibility 0.3s;
z-index: 10;
}
.aksrt-hover-show:hover .aksrt-hover-show__content {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
/* 关闭按钮旋转 */
.aksrt-ic-close {
transition: transform 0.3s;
cursor: pointer;
}
.aksrt-ic-close:hover {
transform: rotate(270deg);
}
/* 图片悬停缩放(缩略图容器) */
.aksrt-hover-zoom-img img {
transition: transform 0.3s ease;
}
.aksrt-hover-zoom-img:hover img {
transform: scale(1.02);
}
.aksrt-hover-zoom-img-sm img {
transition: transform 0.3s ease;
}
.aksrt-hover-zoom-img-sm:hover img {
transform: scale(1.02);
}
/* 按钮悬停上浮 */
.aksrt-hover-lift {
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.aksrt-hover-lift:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
/* ============================================================
* 4. 暗色模式过渡 (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);
}
.aksrt-toast {
backdrop-filter: none;
-webkit-backdrop-filter: none;
}
}
/* ============================================================
* 5. 滚动方向感知
* ============================================================ */
/* 向下滚动时隐藏导航栏 */
body.aksrt-scroll-down .site-nav.nav-scroll-hide {
transform: translateY(-100%);
transition: transform 0.3s ease;
}
body.aksrt-scroll-up .site-nav.nav-scroll-hide {
transform: translateY(0);
transition: transform 0.3s ease;
}
/* 滚动时隐藏浮动按钮 */
body.aksrt-scrolling .aksrt-floating-right.scrolling-hide {
opacity: 0;
pointer-events: none;
transition: opacity 0.2s;
}
/* body-scroll 状态类 */
body.aksrt-body-scroll .aksrt-show-on-scroll {
opacity: 1;
visibility: visible;
}
.aksrt-show-on-scroll {
opacity: 0;
visibility: hidden;
transition: opacity 0.3s, visibility 0.3s;
}
/* ============================================================
* 6. 图片灯箱
* ============================================================ */
.aksrt-lightbox {
position: fixed;
inset: 0;
z-index: 9999;
background: rgba(0, 0, 0, 0.85);
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
visibility: hidden;
transition: opacity 0.3s, visibility 0.3s;
cursor: zoom-out;
}
.aksrt-lightbox.is-open {
opacity: 1;
visibility: visible;
}
.aksrt-lightbox__img {
max-width: 90vw;
max-height: 85vh;
object-fit: contain;
border-radius: 4px;
transform: scale(0.9);
transition: transform 0.3s;
cursor: default;
}
.aksrt-lightbox.is-open .aksrt-lightbox__img {
transform: scale(1);
}
.aksrt-lightbox__close {
position: absolute;
top: 16px;
right: 16px;
width: 36px;
height: 36px;
border: none;
border-radius: 50%;
background: rgba(255, 255, 255, 0.15);
color: #fff;
font-size: 20px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: background 0.2s;
}
.aksrt-lightbox__close:hover {
background: rgba(255, 255, 255, 0.3);
}
.aksrt-lightbox__caption {
position: absolute;
bottom: 16px;
left: 50%;
transform: translateX(-50%);
color: rgba(255, 255, 255, 0.8);
font-size: 14px;
text-align: center;
max-width: 80%;
}
.aksrt-lightbox__nav {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 48px;
height: 48px;
border: none;
border-radius: 50%;
background: rgba(255, 255, 255, 0.1);
color: #fff;
font-size: 24px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: background 0.2s;
}
.aksrt-lightbox__nav:hover {
background: rgba(255, 255, 255, 0.25);
}
.aksrt-lightbox__nav--prev {
left: 16px;
}
.aksrt-lightbox__nav--next {
right: 16px;
}
.aksrt-lightbox__counter {
position: absolute;
top: 16px;
left: 16px;
color: rgba(255, 255, 255, 0.7);
font-size: 14px;
}
.aksrt-lightbox__download {
position: absolute;
top: 16px;
right: 64px;
width: 40px;
height: 40px;
border: none;
border-radius: 50%;
background: rgba(255, 255, 255, 0.15);
color: #fff;
font-size: 18px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: background 0.2s;
}
.aksrt-lightbox__download:hover {
background: rgba(255, 255, 255, 0.3);
}
/* 可缩放图片的光标 */
.aksrt-cursor-zoom-in {
cursor: zoom-in;
}