Merge PR #70: feat(frontend): 优化弹窗组件架构和用户体验
## 主要变更 ### 对话框系统重构 - 升级 BaseDialog 组件,添加动画、焦点管理、响应式宽度 - 删除旧的 Modal.vue,统一使用 BaseDialog ### 使用量数据导出升级 - 改为 Excel 格式导出,支持分页全量导出 - 添加导出进度对话框,支持取消操作 - 新增依赖:xlsx、file-saver ### 使用量页面优化 - Token 明细悬浮提示 - 请求 ID 一键复制 - 新增 first_token 列 ### 后端修复 - 账户统计查询添加软删除过滤 ## 冲突解决 - 保留 driver.js 依赖(onboarding 功能需要) - 合并 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