/** * STP模具几何分析中心 - 暖白色主题设计系统 * 版本: 4.0.0 - 现代化暖色系UI */ /* ================================ 设计系统变量 - 暖白色主题 ================================ */ :root { /* 主色调 - 温暖的琥珀/橙色系 */ --primary-color: #e67e22; --primary-hover: #d35400; --primary-light: #fdebd0; --primary-dark: #ba4a00; /* 辅助色 */ --secondary-color: #8e6d4a; --accent-color: #c0392b; /* 状态色 */ --success-color: #27ae60; --success-light: #d5f4e6; --warning-color: #f39c12; --warning-light: #fef9e7; --error-color: #e74c3c; --error-light: #fdedec; --info-color: #3498db; --info-light: #ebf5fb; /* 暖白色系 */ --warm-white: #faf8f5; --cream: #fdf9f3; --ivory: #fffff0; --linen: #faf0e6; --seashell: #fff5ee; /* 暖灰色系 */ --warm-gray-50: #faf9f7; --warm-gray-100: #f5f3f0; --warm-gray-200: #e8e4de; --warm-gray-300: #d4cfc6; --warm-gray-400: #a69f94; --warm-gray-500: #7a7267; --warm-gray-600: #5c564d; --warm-gray-700: #3d3832; --warm-gray-800: #2c2824; --warm-gray-900: #1a1816; /* 文字颜色 */ --text-primary: #3d3832; --text-secondary: #5c564d; --text-muted: #7a7267; --text-light: #a69f94; /* 间距系统 */ --space-xs: 0.25rem; --space-sm: 0.5rem; --space-md: 1rem; --space-lg: 1.5rem; --space-xl: 2rem; --space-2xl: 3rem; --space-3xl: 4rem; /* 字体系统 */ --font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', system-ui, sans-serif; --font-size-xs: 0.75rem; --font-size-sm: 0.875rem; --font-size-base: 1rem; --font-size-lg: 1.125rem; --font-size-xl: 1.25rem; --font-size-2xl: 1.5rem; --font-size-3xl: 1.875rem; --font-size-4xl: 2.25rem; /* 阴影系统 - 温暖阴影 */ --shadow-xs: 0 1px 2px rgba(58, 45, 35, 0.05); --shadow-sm: 0 2px 4px rgba(58, 45, 35, 0.08); --shadow-md: 0 4px 12px rgba(58, 45, 35, 0.1); --shadow-lg: 0 8px 24px rgba(58, 45, 35, 0.12); --shadow-xl: 0 16px 48px rgba(58, 45, 35, 0.15); --shadow-warm: 0 4px 20px rgba(230, 126, 34, 0.15); /* 圆角系统 */ --radius-sm: 0.375rem; --radius-md: 0.625rem; --radius-lg: 0.875rem; --radius-xl: 1.25rem; --radius-2xl: 1.5rem; --radius-full: 9999px; /* 过渡动画 */ --transition-fast: 0.15s ease; --transition-base: 0.25s ease; --transition-slow: 0.4s ease; --transition-bounce: 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55); } /* ================================ 基础重置与全局样式 ================================ */ * { margin: 0; padding: 0; box-sizing: border-box; } html { scroll-behavior: smooth; font-size: 16px; } body { font-family: var(--font-family); background: linear-gradient(135deg, var(--warm-white) 0%, var(--cream) 50%, var(--linen) 100%); background-attachment: fixed; min-height: 100vh; padding: var(--space-lg); color: var(--text-primary); line-height: 1.7; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* 背景装饰 */ body::before { content: ''; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-image: radial-gradient(circle at 20% 80%, rgba(230, 126, 34, 0.05) 0%, transparent 50%), radial-gradient(circle at 80% 20%, rgba(243, 156, 18, 0.05) 0%, transparent 50%), radial-gradient(circle at 40% 40%, rgba(39, 174, 96, 0.03) 0%, transparent 40%); pointer-events: none; z-index: -1; } /* ================================ 应用外壳 ================================ */ .app-shell { max-width: 1400px; margin: 0 auto; min-height: calc(100vh - 2 * var(--space-lg)); display: flex; flex-direction: column; animation: fadeInUp 0.6s ease-out; } @keyframes fadeInUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } /* ================================ 通知系统 ================================ */ .notification-container { position: fixed; top: var(--space-lg); right: var(--space-lg); z-index: 1000; max-width: 420px; display: flex; flex-direction: column; gap: var(--space-sm); } .notification { background: white; border-radius: var(--radius-lg); padding: var(--space-md) var(--space-lg); box-shadow: var(--shadow-lg); border-left: 4px solid var(--info-color); animation: slideInRight 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55); display: flex; align-items: center; justify-content: space-between; backdrop-filter: blur(10px); transition: transform var(--transition-base), box-shadow var(--transition-base); } .notification:hover { transform: translateX(-4px); box-shadow: var(--shadow-xl); } .notification-success { border-left-color: var(--success-color); background: linear-gradient(135deg, white 0%, var(--success-light) 100%); } .notification-error { border-left-color: var(--error-color); background: linear-gradient(135deg, white 0%, var(--error-light) 100%); } .notification-warning { border-left-color: var(--warning-color); background: linear-gradient(135deg, white 0%, var(--warning-light) 100%); } .notification-message { flex: 1; color: var(--text-primary); font-weight: 500; } .notification-close { background: var(--warm-gray-100); border: none; font-size: var(--font-size-lg); color: var(--text-muted); cursor: pointer; padding: var(--space-xs); margin-left: var(--space-md); border-radius: var(--radius-full); width: 28px; height: 28px; display: flex; align-items: center; justify-content: center; transition: all var(--transition-fast); } .notification-close:hover { background: var(--error-light); color: var(--error-color); transform: rotate(90deg); } @keyframes slideInRight { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } /* ================================ 应用头部 ================================ */ .app-header { background: linear-gradient(135deg, white 0%, var(--cream) 100%); border-radius: var(--radius-2xl) var(--radius-2xl) 0 0; padding: var(--space-2xl) var(--space-3xl); box-shadow: var(--shadow-md); margin-bottom: var(--space-lg); border: 1px solid var(--warm-gray-200); border-bottom: none; position: relative; overflow: hidden; } .app-header::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, var(--primary-color), var(--warning-color), var(--success-color)); } .app-title { display: flex; align-items: center; gap: var(--space-xl); margin-bottom: var(--space-xl); } .logo { font-size: var(--font-size-4xl); background: linear-gradient(135deg, var(--primary-color), var(--warning-color)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; filter: drop-shadow(0 2px 4px rgba(230, 126, 34, 0.3)); animation: float 3s ease-in-out infinite; } @keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-5px); } } .app-title h1 { font-size: var(--font-size-3xl); color: var(--text-primary); margin-bottom: var(--space-xs); font-weight: 700; letter-spacing: -0.02em; } .app-subtitle { color: var(--text-secondary); font-size: var(--font-size-base); font-weight: 400; } .app-nav { display: flex; gap: var(--space-sm); border-top: 1px solid var(--warm-gray-200); padding-top: var(--space-lg); } .nav-link { padding: var(--space-sm) var(--space-lg); text-decoration: none; color: var(--text-secondary); border-radius: var(--radius-full); transition: all var(--transition-base); font-weight: 500; display: flex; align-items: center; gap: var(--space-sm); position: relative; overflow: hidden; } .nav-link::before { content: ''; position: absolute; bottom: 0; left: 50%; width: 0; height: 2px; background: var(--primary-color); transition: all var(--transition-base); transform: translateX(-50%); } .nav-link:hover { color: var(--primary-color); background: var(--primary-light); } .nav-link:hover::before { width: 60%; } .nav-link.active { color: white; background: linear-gradient(135deg, var(--primary-color), var(--primary-hover)); box-shadow: var(--shadow-warm); } .nav-link.active::before { display: none; } /* ================================ 主要内容区域 ================================ */ .app-main { flex: 1; background: white; border-radius: 0 0 var(--radius-2xl) var(--radius-2xl); padding: var(--space-2xl) var(--space-3xl); box-shadow: var(--shadow-md); border: 1px solid var(--warm-gray-200); border-top: none; } /* ================================ 应用底部 ================================ */ .app-footer { background: linear-gradient(135deg, var(--warm-gray-100) 0%, var(--warm-gray-200) 100%); color: var(--text-secondary); padding: var(--space-lg) var(--space-xl); border-radius: var(--radius-xl); margin-top: var(--space-lg); display: flex; justify-content: space-between; align-items: center; font-size: var(--font-size-sm); border: 1px solid var(--warm-gray-200); } .footer-left, .footer-right { display: flex; align-items: center; gap: var(--space-md); } .status-success { color: var(--success-color); font-weight: 600; } .status-error { color: var(--error-color); font-weight: 600; } /* ================================ 上传区域 ================================ */ .upload-section { margin-bottom: var(--space-2xl); } .upload-area { border: 2px dashed var(--warm-gray-300); border-radius: var(--radius-xl); padding: var(--space-3xl); text-align: center; transition: all var(--transition-base); background: linear-gradient(135deg, var(--warm-gray-50) 0%, white 100%); cursor: pointer; position: relative; overflow: hidden; } .upload-area::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(135deg, var(--primary-light) 0%, transparent 100%); opacity: 0; transition: opacity var(--transition-base); } .upload-area:hover, .upload-area.drag-over { border-color: var(--primary-color); background: var(--cream); transform: translateY(-2px); box-shadow: var(--shadow-lg); } .upload-area:hover::before, .upload-area.drag-over::before { opacity: 1; } .upload-icon { font-size: 4rem; margin-bottom: var(--space-lg); display: block; animation: bounce 2s ease-in-out infinite; } @keyframes bounce { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-10px); } } .upload-area h3 { color: var(--text-primary); font-size: var(--font-size-xl); margin-bottom: var(--space-sm); } .upload-area p { color: var(--text-muted); margin-bottom: var(--space-md); } .file-input { display: none; } .btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--space-sm); padding: var(--space-sm) var(--space-lg); border-radius: var(--radius-full); font-weight: 600; font-size: var(--font-size-sm); cursor: pointer; transition: all var(--transition-base); border: none; text-decoration: none; } .btn-primary { background: linear-gradient(135deg, var(--primary-color), var(--primary-hover)); color: white; box-shadow: var(--shadow-sm), 0 4px 12px rgba(230, 126, 34, 0.3); } .btn-primary:hover { transform: translateY(-2px); box-shadow: var(--shadow-md), 0 6px 20px rgba(230, 126, 34, 0.4); } .btn-primary:active { transform: translateY(0); } .btn-secondary { background: white; color: var(--text-primary); border: 2px solid var(--warm-gray-300); } .btn-secondary:hover { border-color: var(--primary-color); color: var(--primary-color); background: var(--primary-light); } .btn-success { background: linear-gradient(135deg, var(--success-color), #219a52); color: white; box-shadow: 0 4px 12px rgba(39, 174, 96, 0.3); } .btn-success:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(39, 174, 96, 0.4); } .btn:disabled { opacity: 0.6; cursor: not-allowed; transform: none !important; } /* ================================ 文件信息卡片 ================================ */ .file-info { background: linear-gradient(135deg, var(--primary-light) 0%, white 100%); border-radius: var(--radius-lg); padding: var(--space-lg); margin-top: var(--space-lg); border: 1px solid var(--primary-color); animation: scaleIn 0.3s ease-out; } @keyframes scaleIn { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } } .file-info h4 { color: var(--primary-color); margin-bottom: var(--space-sm); display: flex; align-items: center; gap: var(--space-sm); } .file-info p { color: var(--text-secondary); font-size: var(--font-size-sm); } /* ================================ 进度条 ================================ */ .progress-container { margin: var(--space-xl) 0; } .progress-bar { height: 8px; background: var(--warm-gray-200); border-radius: var(--radius-full); overflow: hidden; position: relative; } .progress-fill { height: 100%; background: linear-gradient(90deg, var(--primary-color), var(--warning-color), var(--success-color)); background-size: 200% 100%; border-radius: var(--radius-full); transition: width var(--transition-slow); animation: shimmer 2s linear infinite; } @keyframes shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } .progress-text { text-align: center; margin-top: var(--space-sm); color: var(--text-secondary); font-size: var(--font-size-sm); } /* ================================ 结果展示区域 ================================ */ .results-section { padding: var(--space-lg) 0; } .result-card { background: white; border-radius: var(--radius-xl); padding: var(--space-xl); margin: var(--space-lg) 0; border: 1px solid var(--warm-gray-200); box-shadow: var(--shadow-sm); transition: all var(--transition-base); } .result-card:hover { box-shadow: var(--shadow-lg); transform: translateY(-2px); } .result-card h3 { color: var(--text-primary); margin-bottom: var(--space-lg); display: flex; align-items: center; gap: var(--space-sm); font-size: var(--font-size-xl); padding-bottom: var(--space-md); border-bottom: 2px solid var(--warm-gray-100); } /* 数据网格 */ .task-info, .geometry-data, .bounding-box-data, .topology-data, .features-data, .recommendations-data, .metrics-data, .analysis-info { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: var(--space-md); } /* 数据项 */ .data-item { background: linear-gradient(135deg, var(--warm-gray-50) 0%, white 100%); padding: var(--space-lg); border-radius: var(--radius-lg); border: 1px solid var(--warm-gray-200); transition: all var(--transition-base); } .data-item:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); border-color: var(--primary-light); } .data-label { font-weight: 600; color: var(--text-secondary); margin-bottom: var(--space-sm); font-size: var(--font-size-sm); display: flex; align-items: center; gap: var(--space-sm); text-transform: uppercase; letter-spacing: 0.05em; } .data-value { color: var(--text-primary); font-family: 'SF Mono', 'Consolas', monospace; font-size: var(--font-size-lg); font-weight: 700; } .data-unit { color: var(--text-muted); font-size: var(--font-size-sm); margin-left: var(--space-xs); font-weight: 400; } /* 坐标项 */ .coordinate-item { background: linear-gradient(135deg, var(--info-light) 0%, white 100%); padding: var(--space-md); border-radius: var(--radius-md); border: 1px solid var(--info-color); } .coordinate-label { font-weight: 600; color: var(--info-color); margin-bottom: var(--space-xs); font-size: var(--font-size-sm); } .coordinate-value { font-family: 'SF Mono', 'Consolas', monospace; color: var(--text-primary); font-weight: 600; } /* ================================ 状态徽章 ================================ */ .status-badge { padding: var(--space-xs) var(--space-md); border-radius: var(--radius-full); font-size: var(--font-size-sm); font-weight: 600; display: inline-flex; align-items: center; gap: var(--space-xs); } .status-pending { background: var(--warning-light); color: #8b6914; border: 1px solid var(--warning-color); } .status-processing { background: var(--info-light); color: #1a5276; border: 1px solid var(--info-color); animation: pulse 2s ease-in-out infinite; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.7; } } .status-completed { background: var(--success-light); color: #1e8449; border: 1px solid var(--success-color); } .status-failed { background: var(--error-light); color: #922b21; border: 1px solid var(--error-color); } /* ================================ 特征和建议卡片 ================================ */ .feature-item { background: linear-gradient(135deg, var(--info-light) 0%, white 100%); padding: var(--space-lg); border-radius: var(--radius-lg); border-left: 4px solid var(--info-color); transition: all var(--transition-base); } .feature-item:hover { transform: translateX(4px); box-shadow: var(--shadow-md); } .recommendation-item { background: linear-gradient(135deg, var(--warning-light) 0%, white 100%); padding: var(--space-lg); border-radius: var(--radius-lg); border-left: 4px solid var(--warning-color); transition: all var(--transition-base); } .recommendation-item:hover { transform: translateX(4px); box-shadow: var(--shadow-md); } .recommendation-high { border-left-color: var(--error-color); background: linear-gradient(135deg, var(--error-light) 0%, white 100%); } .recommendation-medium { border-left-color: var(--warning-color); background: linear-gradient(135deg, var(--warning-light) 0%, white 100%); } .recommendation-low { border-left-color: var(--success-color); background: linear-gradient(135deg, var(--success-light) 0%, white 100%); } .feature-header, .recommendation-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--space-md); } .feature-type { font-weight: 700; color: var(--text-primary); font-size: var(--font-size-lg); } .confidence-badge { background: linear-gradient(135deg, var(--info-color), #2980b9); color: white; padding: var(--space-xs) var(--space-md); border-radius: var(--radius-full); font-size: var(--font-size-sm); font-weight: 600; } .priority-badge { padding: var(--space-xs) var(--space-md); border-radius: var(--radius-full); font-size: var(--font-size-sm); font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; } .priority-high { background: linear-gradient(135deg, var(--error-color), #c0392b); color: white; } .priority-medium { background: linear-gradient(135deg, var(--warning-color), #d68910); color: white; } .priority-low { background: linear-gradient(135deg, var(--success-color), #219a52); color: white; } .recommendation-list { list-style: none; padding: 0; margin: var(--space-md) 0 0; } .recommendation-list li { padding: var(--space-sm) 0; border-bottom: 1px solid var(--warm-gray-200); display: flex; align-items: flex-start; gap: var(--space-sm); color: var(--text-secondary); } .recommendation-list li:last-child { border-bottom: none; } .recommendation-list li::before { content: "💡"; font-size: 1.1em; flex-shrink: 0; } /* ================================ 指标卡片 ================================ */ .metric-item { background: white; padding: var(--space-xl); border-radius: var(--radius-xl); box-shadow: var(--shadow-sm); text-align: center; border: 1px solid var(--warm-gray-200); transition: all var(--transition-base); } .metric-item:hover { transform: translateY(-4px); box-shadow: var(--shadow-lg); } .metric-value { font-size: var(--font-size-3xl); font-weight: 800; color: var(--text-primary); margin: var(--space-md) 0; line-height: 1; } .metric-label { color: var(--text-muted); font-size: var(--font-size-sm); text-transform: uppercase; letter-spacing: 0.1em; } .metric-good { color: var(--success-color); } .metric-warning { color: var(--warning-color); } .metric-poor { color: var(--error-color); } /* ================================ 加载动画 ================================ */ .loading { text-align: center; padding: var(--space-2xl); } .spinner { width: 50px; height: 50px; border: 4px solid var(--warm-gray-200); border-top-color: var(--primary-color); border-radius: 50%; animation: spin 1s linear infinite; margin: 0 auto var(--space-lg); } @keyframes spin { to { transform: rotate(360deg); } } .loading-text { color: var(--text-secondary); font-size: var(--font-size-lg); } /* ================================ 错误消息 ================================ */ .error-message { background: linear-gradient(135deg, var(--error-light) 0%, white 100%); color: var(--error-color); padding: var(--space-lg); border-radius: var(--radius-lg); margin: var(--space-lg) 0; border-left: 4px solid var(--error-color); display: flex; align-items: center; gap: var(--space-md); } .error-message::before { content: "⚠️"; font-size: 1.5em; } /* ================================ 历史记录表格 ================================ */ .history-table { width: 100%; border-collapse: collapse; margin-top: var(--space-lg); background: white; border-radius: var(--radius-lg); overflow: hidden; box-shadow: var(--shadow-sm); } .history-table th, .history-table td { padding: var(--space-md) var(--space-lg); text-align: left; border-bottom: 1px solid var(--warm-gray-200); } .history-table th { background: linear-gradient(135deg, var(--warm-gray-100) 0%, var(--warm-gray-50) 100%); color: var(--text-secondary); font-weight: 600; font-size: var(--font-size-sm); text-transform: uppercase; letter-spacing: 0.05em; } .history-table tr:hover td { background: var(--warm-gray-50); } .history-table tr:last-child td { border-bottom: none; } /* ================================ 空状态 ================================ */ .empty-state { text-align: center; padding: var(--space-3xl); color: var(--text-muted); } .empty-state-icon { font-size: 4rem; margin-bottom: var(--space-lg); opacity: 0.5; } .empty-state h3 { color: var(--text-secondary); margin-bottom: var(--space-sm); } /* ================================ 统计卡片 ================================ */ .stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: var(--space-lg); margin-bottom: var(--space-2xl); } .stat-card { background: white; border-radius: var(--radius-xl); padding: var(--space-xl); text-align: center; border: 1px solid var(--warm-gray-200); transition: all var(--transition-base); position: relative; overflow: hidden; } .stat-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, var(--primary-color), var(--warning-color)); } .stat-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-lg); } .stat-icon { font-size: 2.5rem; margin-bottom: var(--space-md); } .stat-value { font-size: var(--font-size-3xl); font-weight: 800; color: var(--text-primary); line-height: 1; } .stat-label { color: var(--text-muted); font-size: var(--font-size-sm); margin-top: var(--space-sm); text-transform: uppercase; letter-spacing: 0.05em; } /* ================================ 响应式设计 ================================ */ @media (max-width: 1024px) { .app-header { padding: var(--space-xl); } .app-main { padding: var(--space-xl); } .app-title { flex-direction: column; align-items: flex-start; gap: var(--space-md); } } @media (max-width: 768px) { body { padding: var(--space-md); } .app-header { padding: var(--space-lg); border-radius: var(--radius-xl) var(--radius-xl) 0 0; } .app-main { padding: var(--space-lg); border-radius: 0 0 var(--radius-xl) var(--radius-xl); } .app-title h1 { font-size: var(--font-size-2xl); } .app-nav { flex-wrap: wrap; } .nav-link { padding: var(--space-sm) var(--space-md); font-size: var(--font-size-sm); } .upload-area { padding: var(--space-xl); } .upload-icon { font-size: 3rem; } .task-info, .geometry-data, .bounding-box-data, .topology-data, .features-data, .recommendations-data, .metrics-data, .analysis-info { grid-template-columns: 1fr; } .app-footer { flex-direction: column; gap: var(--space-md); text-align: center; } .footer-left, .footer-right { flex-wrap: wrap; justify-content: center; } .stats-grid { grid-template-columns: 1fr 1fr; } } @media (max-width: 480px) { .stats-grid { grid-template-columns: 1fr; } .notification-container { left: var(--space-md); right: var(--space-md); max-width: none; } .history-table { font-size: var(--font-size-sm); } .history-table th, .history-table td { padding: var(--space-sm); } } /* ================================ 打印样式 ================================ */ @media print { body { background: white; padding: 0; } .app-header, .app-footer, .notification-container, .upload-section, .nav-link { display: none; } .app-main { box-shadow: none; border: none; padding: 0; } .result-card { break-inside: avoid; box-shadow: none; border: 1px solid #ddd; } } /* ================================ 深色模式支持(可选) ================================ */ @media (prefers-color-scheme: dark) { :root { --warm-white: #1a1816; --cream: #2c2824; --text-primary: #f5f3f0; --text-secondary: #d4cfc6; --text-muted: #a69f94; } } /* ================================ Vue 过渡动画 ================================ */ .fade-slide-enter-active, .fade-slide-leave-active { transition: all 0.3s ease; } .fade-slide-enter-from { opacity: 0; transform: translateY(10px); } .fade-slide-leave-to { opacity: 0; transform: translateY(-10px); } .notification-enter-active, .notification-leave-active { transition: all 0.3s ease; } .notification-enter-from { opacity: 0; transform: translateX(100%); } .notification-leave-to { opacity: 0; transform: translateX(100%); } .notification-hidden { opacity: 0; transform: translateX(20px); } .list-enter-active, .list-leave-active { transition: all 0.4s ease; } .list-enter-from { opacity: 0; transform: translateY(20px); } .list-leave-to { opacity: 0; transform: translateY(-20px); } .list-move { transition: transform 0.4s ease; } .expand-enter-active, .expand-leave-active { transition: all 0.3s ease; overflow: hidden; } .expand-enter-from, .expand-leave-to { opacity: 0; max-height: 0; } .expand-enter-to, .expand-leave-from { max-height: 1000px; } /* ================================ 卡片和布局组件 ================================ */ .card { background: white; border-radius: var(--radius-xl); padding: var(--space-xl); border: 1px solid var(--warm-gray-200); box-shadow: var(--shadow-sm); transition: all var(--transition-base); } .card:hover { box-shadow: var(--shadow-md); } .card h2 { display: flex; align-items: center; gap: var(--space-sm); color: var(--text-primary); font-size: var(--font-size-xl); margin-bottom: var(--space-md); } .card-icon { font-size: 1.5em; } .card-subtitle { color: var(--text-muted); font-size: var(--font-size-sm); margin-bottom: var(--space-lg); } .grid-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--space-lg); } .grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-lg); } @media (max-width: 1024px) { .grid-2, .grid-3 { grid-template-columns: 1fr; } } /* ================================ 上传卡片 ================================ */ .upload-card { min-height: 400px; } .upload-btn { width: 100%; margin-top: var(--space-lg); padding: var(--space-md) var(--space-xl); font-size: var(--font-size-lg); } .clear-btn { margin-top: var(--space-sm); } .current-task-card { background: linear-gradient(135deg, var(--warm-gray-50) 0%, white 100%); border-radius: var(--radius-lg); padding: var(--space-lg); margin-top: var(--space-xl); border: 1px solid var(--warm-gray-200); } .current-task-card h4 { color: var(--text-primary); margin-bottom: var(--space-md); } /* ================================ 文件预览 ================================ */ .latest-file { margin-bottom: var(--space-lg); } .latest-file h4 { color: var(--text-secondary); font-size: var(--font-size-sm); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: var(--space-md); } .file-preview { display: flex; align-items: center; gap: var(--space-md); padding: var(--space-md); background: var(--warm-gray-50); border-radius: var(--radius-lg); } .file-preview .file-icon { font-size: 2rem; } .file-preview .file-name { font-weight: 600; color: var(--text-primary); margin-bottom: var(--space-xs); } .file-preview .file-meta { display: flex; gap: var(--space-md); color: var(--text-muted); font-size: var(--font-size-sm); } .link-btn { display: inline-flex; margin-top: var(--space-lg); } /* ================================ 历史记录视图 ================================ */ .history-view h2 { display: flex; align-items: center; gap: var(--space-sm); color: var(--text-primary); margin-bottom: var(--space-sm); } .file-list { display: flex; flex-direction: column; gap: var(--space-md); margin-top: var(--space-xl); } .file-card { background: white; border-radius: var(--radius-lg); border: 1px solid var(--warm-gray-200); overflow: hidden; transition: all var(--transition-base); } .file-card:hover { box-shadow: var(--shadow-md); } .file-card.expanded { box-shadow: var(--shadow-lg); } .file-header { display: flex; justify-content: space-between; align-items: center; padding: var(--space-lg); cursor: pointer; transition: background var(--transition-fast); } .file-header:hover { background: var(--warm-gray-50); } .file-info .file-name { font-weight: 600; color: var(--text-primary); margin-bottom: var(--space-xs); } .file-info .file-meta { color: var(--text-muted); font-size: var(--font-size-sm); } .expand-btn { flex-shrink: 0; } .record-list { padding: 0 var(--space-lg) var(--space-lg); } .record-item { padding: var(--space-md); background: var(--warm-gray-50); border-radius: var(--radius-md); margin-bottom: var(--space-sm); cursor: pointer; transition: all var(--transition-fast); } .record-item:hover { background: var(--primary-light); transform: translateX(4px); } .record-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--space-sm); } .record-date { color: var(--text-secondary); font-size: var(--font-size-sm); } .record-meta { display: flex; flex-wrap: wrap; gap: var(--space-md); color: var(--text-muted); font-size: var(--font-size-sm); } /* ================================ 结果视图 ================================ */ .result-view h2 { display: flex; align-items: center; gap: var(--space-sm); color: var(--text-primary); margin-bottom: var(--space-xl); } .result-layout { display: flex; flex-direction: column; gap: var(--space-xl); } /* ================================ 通知图标 ================================ */ .notification-icon { width: 24px; height: 24px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: bold; flex-shrink: 0; } .notification-success .notification-icon { background: var(--success-color); color: white; } .notification-error .notification-icon { background: var(--error-color); color: white; } .notification-warning .notification-icon { background: var(--warning-color); color: white; } .notification-info .notification-icon { background: var(--info-color); color: white; } /* ================================ 页脚增强 ================================ */ .footer-item { display: inline-flex; align-items: center; gap: var(--space-xs); } .footer-label { color: var(--text-muted); } .footer-divider { color: var(--warm-gray-400); }