/* Global Styles */ * { margin: 0; padding: 0; box-sizing: border-box; } body { margin: 0; font-family: 'MiSans', 'PingFang SC', 'Noto Sans SC', 'Microsoft YaHei', sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; background-color: transparent; color: #1e293b; line-height: 1.6; } .app { min-height: 100vh; width: 100%; } .ant-btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; border-radius: 12px; font-weight: 600; letter-spacing: 0.01em; transition: transform 0.18s ease, box-shadow 0.22s ease, border-color 0.22s ease, background 0.22s ease, color 0.22s ease; box-shadow: 0 6px 16px rgba(15, 23, 42, 0.06); } .ant-btn:hover { transform: translateY(-1px); } .ant-btn:active { transform: translateY(0); } .ant-btn .anticon { font-size: 0.98em; } .ant-btn.ant-btn-default, .ant-btn.ant-btn-dashed { background: rgba(255, 255, 255, 0.92); border-color: rgba(148, 163, 184, 0.2); color: #294261; } .ant-btn.ant-btn-default:hover, .ant-btn.ant-btn-dashed:hover { background: #ffffff; border-color: rgba(59, 130, 246, 0.28); color: #1d4ed8; box-shadow: 0 10px 24px rgba(59, 130, 246, 0.12); } .ant-btn.ant-btn-primary { background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 45%, #1e40af 100%); border-color: transparent; color: #fff; } .ant-btn.ant-btn-primary:hover { background: linear-gradient(135deg, #3b82f6 0%, #2563eb 48%, #1d4ed8 100%); box-shadow: 0 14px 28px rgba(37, 99, 235, 0.24); } .ant-btn.ant-btn-primary.ant-btn-dangerous, .ant-btn.ant-btn-dangerous:not(.ant-btn-link):not(.ant-btn-text) { background: linear-gradient(135deg, #ef4444 0%, #dc2626 48%, #b91c1c 100%); border-color: transparent; color: #fff; } .ant-btn.ant-btn-primary.ant-btn-dangerous:hover, .ant-btn.ant-btn-dangerous:not(.ant-btn-link):not(.ant-btn-text):hover { box-shadow: 0 14px 28px rgba(220, 38, 38, 0.24); } .ant-btn.ant-btn-link, .ant-btn.ant-btn-text { box-shadow: none; transform: none; } .ant-btn.ant-btn-link { padding-inline: 6px; color: #31568b; } .ant-btn.ant-btn-link:hover { color: #1d4ed8; background: rgba(37, 99, 235, 0.08); } .ant-btn.ant-btn-link.ant-btn-dangerous, .ant-btn.ant-btn-text.ant-btn-dangerous { color: #dc2626; } .ant-btn.ant-btn-link.ant-btn-dangerous:hover, .ant-btn.ant-btn-text.ant-btn-dangerous:hover { background: rgba(220, 38, 38, 0.08); color: #b91c1c; } .ant-btn.btn-soft-blue, .ant-btn.ant-btn-primary.btn-soft-blue { background: linear-gradient(180deg, #f8fbff 0%, #eff6ff 100%); border-color: #bfdbfe; color: #1d4ed8; box-shadow: 0 10px 22px rgba(59, 130, 246, 0.12); } .ant-btn.btn-soft-blue:hover, .ant-btn.ant-btn-primary.btn-soft-blue:hover { background: linear-gradient(180deg, #eff6ff 0%, #dbeafe 100%); border-color: #93c5fd; color: #1d4ed8; box-shadow: 0 14px 26px rgba(59, 130, 246, 0.18); } .ant-btn.btn-soft-violet, .ant-btn.ant-btn-primary.btn-soft-violet { background: linear-gradient(180deg, #faf5ff 0%, #f3e8ff 100%); border-color: #d8b4fe; color: #7c3aed; box-shadow: 0 10px 22px rgba(124, 58, 237, 0.12); } .ant-btn.btn-soft-violet:hover, .ant-btn.ant-btn-primary.btn-soft-violet:hover { background: linear-gradient(180deg, #f3e8ff 0%, #e9d5ff 100%); border-color: #c084fc; color: #6d28d9; box-shadow: 0 14px 26px rgba(124, 58, 237, 0.18); } .ant-btn.btn-soft-green, .ant-btn.ant-btn-primary.btn-soft-green { background: linear-gradient(180deg, #f0fdf4 0%, #dcfce7 100%); border-color: #86efac; color: #15803d; box-shadow: 0 10px 22px rgba(34, 197, 94, 0.12); } .ant-btn.btn-soft-green:hover, .ant-btn.ant-btn-primary.btn-soft-green:hover { background: linear-gradient(180deg, #dcfce7 0%, #bbf7d0 100%); border-color: #4ade80; color: #166534; box-shadow: 0 14px 26px rgba(34, 197, 94, 0.18); } .ant-btn.btn-icon-soft-blue { background: #eff6ff; border-color: #bfdbfe; color: #1d4ed8; box-shadow: none; } .ant-btn.btn-icon-soft-blue:hover { background: #dbeafe; border-color: #93c5fd; color: #1d4ed8; } .ant-btn.btn-icon-soft-red, .ant-btn.ant-btn-dangerous.btn-icon-soft-red { background: #fff1f2; border-color: #fecdd3; color: #dc2626; box-shadow: none; } .ant-btn.btn-icon-soft-red:hover, .ant-btn.ant-btn-dangerous.btn-icon-soft-red:hover { background: #ffe4e6; border-color: #fda4af; color: #b91c1c; } .ant-btn.ant-btn-link.btn-text-view, .ant-btn.ant-btn-text.btn-text-view { color: #2563eb; } .ant-btn.ant-btn-link.btn-text-view:hover, .ant-btn.ant-btn-text.btn-text-view:hover { background: rgba(37, 99, 235, 0.1); color: #1d4ed8; } .ant-btn.ant-btn-link.btn-text-edit, .ant-btn.ant-btn-text.btn-text-edit { color: #0f766e; } .ant-btn.ant-btn-link.btn-text-edit:hover, .ant-btn.ant-btn-text.btn-text-edit:hover { background: rgba(13, 148, 136, 0.1); color: #0f766e; } .ant-btn.ant-btn-link.btn-text-accent, .ant-btn.ant-btn-text.btn-text-accent { color: #7c3aed; } .ant-btn.ant-btn-link.btn-text-accent:hover, .ant-btn.ant-btn-text.btn-text-accent:hover { background: rgba(124, 58, 237, 0.1); color: #6d28d9; } .ant-btn.ant-btn-link.btn-text-delete, .ant-btn.ant-btn-text.btn-text-delete, .ant-btn.ant-btn-link.ant-btn-dangerous.btn-text-delete, .ant-btn.ant-btn-text.ant-btn-dangerous.btn-text-delete { color: #dc2626; } .ant-btn.ant-btn-link.btn-text-delete:hover, .ant-btn.ant-btn-text.btn-text-delete:hover, .ant-btn.ant-btn-link.ant-btn-dangerous.btn-text-delete:hover, .ant-btn.ant-btn-text.ant-btn-dangerous.btn-text-delete:hover { background: rgba(220, 38, 38, 0.1); color: #b91c1c; } .ant-btn.ant-btn-icon-only.ant-btn-text, .ant-btn.ant-btn-icon-only.ant-btn-link { min-width: 36px; } .ant-btn-icon-only { min-width: 40px; } .app-loading { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100vh; color: #64748b; } .loading-spinner { width: 40px; height: 40px; border: 3px solid #e2e8f0; border-top: 3px solid #667eea; border-radius: 50%; animation: spin 1s linear infinite; margin-bottom: 1rem; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } /* Utility Classes */ .text-center { text-align: center; } .mt-1 { margin-top: 0.25rem; } .mt-2 { margin-top: 0.5rem; } .mt-3 { margin-top: 0.75rem; } .mt-4 { margin-top: 1rem; } .mb-1 { margin-bottom: 0.25rem; } .mb-2 { margin-bottom: 0.5rem; } .mb-3 { margin-bottom: 0.75rem; } .mb-4 { margin-bottom: 1rem; } .p-1 { padding: 0.25rem; } .p-2 { padding: 0.5rem; } .p-3 { padding: 0.75rem; } .p-4 { padding: 1rem; } /* Button Styles */ .btn { display: inline-flex; align-items: center; justify-content: center; padding: 0.5rem 1rem; border: none; border-radius: 8px; font-size: 0.9rem; font-weight: 500; cursor: pointer; text-decoration: none; transition: all 0.3s ease; gap: 0.5rem; } .btn:hover { transform: translateY(-1px); } .btn-primary { background: linear-gradient(45deg, #667eea, #764ba2); color: white; } .btn-primary:hover { box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3); } .btn-secondary { background: #f1f5f9; color: #475569; border: 1px solid #e2e8f0; } .btn-secondary:hover { background: #e2e8f0; } /* Input Styles */ .form-input { width: 100%; padding: 0.75rem; border: 2px solid #e1e5e9; border-radius: 8px; font-size: 1rem; transition: all 0.3s ease; } .form-input:focus { outline: none; border-color: #667eea; box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1); } /* Card Styles */ .card { background: white; border-radius: 12px; padding: 1.5rem; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); border: 1px solid #e2e8f0; } .card:hover { box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12); } /* Text Styles */ .text-sm { font-size: 0.875rem; } .text-base { font-size: 1rem; } .text-lg { font-size: 1.125rem; } .text-xl { font-size: 1.25rem; } .font-medium { font-weight: 500; } .font-semibold { font-weight: 600; } .font-bold { font-weight: 700; } .text-gray-500 { color: #64748b; } .text-gray-600 { color: #475569; } .text-gray-700 { color: #334155; } .text-gray-900 { color: #0f172a; }