feat(frontend): 优化弹窗组件架构和用户体验
- 使用 BaseDialog 替代旧版 Modal 组件 - 添加平滑过渡动画和更好的可访问性支持 - 新增 ExportProgressDialog 导出进度弹窗 - 优化所有账号管理和使用记录相关弹窗 - 更新国际化文案,改进用户交互体验 - 精简依赖,减少 package.json 体积
This commit is contained in:
@@ -79,6 +79,20 @@
|
||||
@apply hover:from-red-600 hover:to-red-700 hover:shadow-lg hover:shadow-red-500/30;
|
||||
}
|
||||
|
||||
.btn-success {
|
||||
@apply bg-gradient-to-r from-emerald-500 to-emerald-600;
|
||||
@apply text-white shadow-md shadow-emerald-500/25;
|
||||
@apply hover:from-emerald-600 hover:to-emerald-700 hover:shadow-lg hover:shadow-emerald-500/30;
|
||||
@apply dark:shadow-emerald-500/20;
|
||||
}
|
||||
|
||||
.btn-warning {
|
||||
@apply bg-gradient-to-r from-amber-500 to-amber-600;
|
||||
@apply text-white shadow-md shadow-amber-500/25;
|
||||
@apply hover:from-amber-600 hover:to-amber-700 hover:shadow-lg hover:shadow-amber-500/30;
|
||||
@apply dark:shadow-amber-500/20;
|
||||
}
|
||||
|
||||
.btn-sm {
|
||||
@apply rounded-lg px-3 py-1.5 text-xs;
|
||||
}
|
||||
@@ -130,6 +144,20 @@
|
||||
-moz-appearance: textfield;
|
||||
}
|
||||
|
||||
/* ============ 玻璃效果 ============ */
|
||||
.glass {
|
||||
@apply bg-white/80 backdrop-blur-xl dark:bg-dark-800/80;
|
||||
}
|
||||
|
||||
.glass-card {
|
||||
@apply bg-white/70 dark:bg-dark-800/70;
|
||||
@apply backdrop-blur-xl;
|
||||
@apply rounded-2xl;
|
||||
@apply border border-white/20 dark:border-dark-700/50;
|
||||
@apply shadow-glass;
|
||||
@apply transition-all duration-300;
|
||||
}
|
||||
|
||||
/* ============ 卡片样式 ============ */
|
||||
.card {
|
||||
@apply bg-white dark:bg-dark-800/50;
|
||||
@@ -151,6 +179,20 @@
|
||||
@apply shadow-glass;
|
||||
}
|
||||
|
||||
.card-header {
|
||||
@apply border-b border-gray-100 dark:border-dark-700;
|
||||
@apply px-6 py-4;
|
||||
}
|
||||
|
||||
.card-body {
|
||||
@apply p-6;
|
||||
}
|
||||
|
||||
.card-footer {
|
||||
@apply border-t border-gray-100 dark:border-dark-700;
|
||||
@apply px-6 py-4;
|
||||
}
|
||||
|
||||
/* ============ 统计卡片 ============ */
|
||||
.stat-card {
|
||||
@apply card p-5;
|
||||
@@ -256,6 +298,10 @@
|
||||
@apply bg-gray-100 text-gray-700 dark:bg-dark-700 dark:text-dark-300;
|
||||
}
|
||||
|
||||
.badge-purple {
|
||||
@apply bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400;
|
||||
}
|
||||
|
||||
/* ============ 下拉菜单 ============ */
|
||||
.dropdown {
|
||||
@apply absolute z-50;
|
||||
@@ -283,15 +329,19 @@
|
||||
}
|
||||
|
||||
.modal-content {
|
||||
@apply w-full;
|
||||
@apply max-h-[95vh] sm:max-h-[90vh];
|
||||
@apply bg-white dark:bg-dark-800;
|
||||
@apply rounded-2xl shadow-2xl;
|
||||
@apply w-full;
|
||||
@apply max-h-[90vh] overflow-y-auto;
|
||||
@apply border border-gray-200 dark:border-dark-700;
|
||||
@apply flex flex-col;
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
@apply border-b border-gray-100 px-6 py-4 dark:border-dark-700;
|
||||
@apply border-b border-gray-200 px-4 py-3 dark:border-dark-700;
|
||||
@apply sm:px-6 sm:py-4;
|
||||
@apply flex items-center justify-between;
|
||||
@apply flex-shrink-0;
|
||||
}
|
||||
|
||||
.modal-title {
|
||||
@@ -299,12 +349,69 @@
|
||||
}
|
||||
|
||||
.modal-body {
|
||||
@apply px-6 py-4;
|
||||
@apply px-4 py-3;
|
||||
@apply sm:px-6 sm:py-4;
|
||||
@apply flex-1 overflow-y-auto;
|
||||
}
|
||||
|
||||
.modal-footer {
|
||||
@apply border-t border-gray-100 px-6 py-4 dark:border-dark-700;
|
||||
@apply border-t border-gray-200 px-4 py-3 dark:border-dark-700;
|
||||
@apply sm:px-6 sm:py-4;
|
||||
@apply flex items-center justify-end gap-3;
|
||||
@apply flex-shrink-0;
|
||||
}
|
||||
|
||||
/* 防止body滚动的工具类 */
|
||||
body.modal-open {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.modal-enter-active {
|
||||
transition: opacity 250ms ease-out;
|
||||
}
|
||||
|
||||
.modal-leave-active {
|
||||
transition: opacity 200ms ease-in;
|
||||
}
|
||||
|
||||
.modal-enter-from,
|
||||
.modal-leave-to {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.modal-enter-active .modal-content {
|
||||
transition: transform 250ms ease-out, opacity 250ms ease-out;
|
||||
}
|
||||
|
||||
.modal-leave-active .modal-content {
|
||||
transition: transform 200ms ease-in, opacity 200ms ease-in;
|
||||
}
|
||||
|
||||
.modal-enter-from .modal-content,
|
||||
.modal-leave-to .modal-content {
|
||||
transform: scale(0.95);
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.modal-enter-to .modal-content,
|
||||
.modal-leave-from .modal-content {
|
||||
transform: scale(1);
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.modal-enter-active,
|
||||
.modal-leave-active,
|
||||
.modal-enter-active .modal-content,
|
||||
.modal-leave-active .modal-content {
|
||||
transition-duration: 1ms;
|
||||
transition-delay: 0ms;
|
||||
}
|
||||
|
||||
.modal-enter-from .modal-content,
|
||||
.modal-leave-to .modal-content {
|
||||
transform: none;
|
||||
}
|
||||
}
|
||||
|
||||
/* ============ Dialog ============ */
|
||||
|
||||
Reference in New Issue
Block a user