Files
Onekey/web/en/static/css/animations.css
ikun0014 361150b3bc 新增多语言支持并重构前端资源结构
引入英文和中文多语言支持,web 目录下静态资源和模板按语言分目录存放。新增 src/utils/i18n.py 实现国际化,main.py 增加多语言错误提示。CI/CD 工作流升级 Python 版本与 Nuitka 编译方式,提升兼容性和构建效率。
2025-10-12 16:32:36 +08:00

278 lines
4.2 KiB
CSS

@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes slideUp {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes slideIn {
from {
opacity: 0;
transform: translateX(-20px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
@keyframes slideInDown {
from {
transform: translateY(-20px);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
}
@keyframes slideInUp {
from {
transform: translateY(60px);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
}
@keyframes rotate {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@keyframes subtle-rotate {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@keyframes pulse {
0%,
100% {
opacity: 0.3;
transform: scale(1);
}
50% {
opacity: 0.5;
transform: scale(1.05);
}
}
@keyframes float {
0%,
100% {
transform: translateY(0px);
}
50% {
transform: translateY(-10px);
}
}
@keyframes shimmer {
0% {
background-position: -200% center;
}
100% {
background-position: 200% center;
}
}
@keyframes shake {
0%,
100% {
transform: translateX(0);
}
10%,
30%,
50%,
70%,
90% {
transform: translateX(-5px);
}
20%,
40%,
60%,
80% {
transform: translateX(5px);
}
}
@keyframes success-pulse {
0% {
transform: scale(1);
box-shadow: 0 0 0 0 rgba(76, 175, 80, 0.4);
}
50% {
transform: scale(1.05);
box-shadow: 0 0 0 10px rgba(76, 175, 80, 0);
}
100% {
transform: scale(1);
box-shadow: 0 0 0 0 rgba(76, 175, 80, 0);
}
}
@keyframes loading-bounce {
0%,
80%,
100% {
transform: scale(0);
opacity: 0.5;
}
40% {
transform: scale(1);
opacity: 1;
}
}
.loading {
display: flex;
align-items: center;
gap: 12px;
color: var(--md-sys-color-on-surface-variant);
}
.loading::before {
content: "";
width: 20px;
height: 20px;
border: 2px solid var(--md-sys-color-primary-container);
border-top: 2px solid var(--md-sys-color-primary);
border-radius: 50%;
animation: spin 1s cubic-bezier(0.68, -0.55, 0.265, 1.55) infinite;
}
.loading-dots {
display: inline-flex;
gap: 4px;
}
.loading-dots span {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--md-sys-color-primary);
animation: loading-bounce 1.4s ease-in-out infinite;
}
.loading-dots span:nth-child(1) {
animation-delay: -0.32s;
}
.loading-dots span:nth-child(2) {
animation-delay: -0.16s;
}
.skeleton-loader {
background: linear-gradient(
90deg,
var(--md-sys-color-surface-container) 25%,
var(--md-sys-color-surface-container-high) 50%,
var(--md-sys-color-surface-container) 75%
);
background-size: 200% 100%;
animation: shimmer 1.5s infinite;
}
.error-state {
animation: shake 0.5s ease-in-out;
}
.success-state {
animation: success-pulse 0.5s ease-out;
}
.ripple {
position: relative;
overflow: hidden;
}
.ripple::before {
content: "";
position: absolute;
top: var(--ripple-y, 50%);
left: var(--ripple-x, 50%);
width: 0;
height: 0;
border-radius: 50%;
background: rgba(255, 255, 255, 0.5);
transform: translate(-50%, -50%);
transition:
width 0.6s ease,
height 0.6s ease,
opacity 0.6s ease;
opacity: 0;
}
.ripple:active::before {
width: 300px;
height: 300px;
opacity: 0.3;
}
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
.animate-fadeIn {
animation: fadeIn var(--transition-medium) ease;
}
.animate-slideUp {
animation: slideUp var(--transition-medium) ease-out;
}
.animate-slideIn {
animation: slideIn var(--transition-medium) ease-out;
}
.animate-pulse {
animation: pulse 2s ease-in-out infinite;
}
.animate-float {
animation: float 3s ease-in-out infinite;
}
.animate-spin {
animation: spin 1s linear infinite;
}