:root { --bg: #f4f6f9; --surface: #ffffff; --text: #1a2332; --muted: #5c6b7a; --border: #e2e8f0; --primary: #2563eb; --primary-hover: #1d4ed8; --success: #059669; --success-bg: #ecfdf5; --warning: #d97706; --warning-bg: #fffbeb; --error: #dc2626; --error-bg: #fef2f2; --updated: #7c3aed; --updated-bg: #f5f3ff; --radius: 12px; --shadow: 0 4px 24px rgba(15, 23, 42, 0.06); font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; } *, *::before, *::after { box-sizing: border-box; } body { margin: 0; background: var(--bg); color: var(--text); line-height: 1.5; min-height: 100vh; } .page { max-width: 960px; margin: 0 auto; padding: 2rem 1.25rem 3rem; } .header { margin-bottom: 2rem; } .eyebrow { margin: 0 0 0.5rem; font-size: 0.8rem; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--primary); } .header h1 { margin: 0 0 0.5rem; font-size: clamp(1.5rem, 4vw, 2rem); font-weight: 700; letter-spacing: -0.02em; } .subtitle { margin: 0; color: var(--muted); max-width: 36rem; } .subtitle code { font-size: 0.9em; background: var(--border); padding: 0.1em 0.4em; border-radius: 4px; } .main { display: flex; flex-direction: column; gap: 1.25rem; } .card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.5rem; box-shadow: var(--shadow); } .card h2 { margin: 0 0 1rem; font-size: 1.1rem; } #health-banner.banner-warn { background: var(--warning-bg); border-color: #fcd34d; } #health-banner.banner-ok { background: var(--success-bg); border-color: #6ee7b7; } .banner-text { margin: 0; font-size: 0.9rem; } .upload-zone { display: flex; flex-direction: column; align-items: center; gap: 0.5rem; padding: 2rem 1.5rem; border: 2px dashed var(--border); border-radius: var(--radius); cursor: pointer; transition: border-color 0.15s, background 0.15s; text-align: center; } .upload-zone:hover, .upload-zone.dragover { border-color: var(--primary); background: #eff6ff; } .upload-icon { font-size: 2rem; } .upload-title { font-weight: 600; } .upload-hint, .file-name { font-size: 0.875rem; color: var(--muted); } .file-name { margin-top: 0.25rem; } .actions { margin-top: 1.25rem; display: flex; justify-content: flex-end; } .btn { font: inherit; font-weight: 600; padding: 0.65rem 1.5rem; border: none; border-radius: 8px; cursor: pointer; transition: background 0.15s, opacity 0.15s; } .btn:disabled { opacity: 0.45; cursor: not-allowed; } .btn-primary { background: var(--primary); color: #fff; } .btn-primary:hover:not(:disabled) { background: var(--primary-hover); } .progress { margin-top: 1rem; height: 4px; background: var(--border); border-radius: 2px; overflow: hidden; } .progress-bar { height: 100%; width: 40%; background: var(--primary); border-radius: 2px; animation: indeterminate 1.2s ease-in-out infinite; } @keyframes indeterminate { 0% { transform: translateX(-100%); } 100% { transform: translateX(350%); } } .alert { margin: 0; padding: 0.75rem 1rem; border-radius: 8px; font-size: 0.95rem; } .alert.success { background: var(--success-bg); color: var(--success); } .alert.error { background: var(--error-bg); color: var(--error); } .summary-grid { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 1rem; } .summary-grid li { text-align: center; padding: 0.75rem; background: var(--bg); border-radius: 8px; } .summary-grid strong { display: block; font-size: 1.5rem; font-weight: 700; } .summary-grid span { font-size: 0.8rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.04em; } .mapping-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.5rem; font-size: 0.875rem; } .mapping-list li { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; padding: 0.5rem 0.75rem; background: var(--bg); border-radius: 8px; } .mapping-list .excel-col { color: var(--text); font-weight: 500; } .mapping-list .arrow { color: var(--muted); } .mapping-list .api-col { font-family: ui-monospace, monospace; font-size: 0.8rem; color: var(--primary); } .table-wrap { overflow-x: auto; border: 1px solid var(--border); border-radius: 8px; } table { width: 100%; border-collapse: collapse; font-size: 0.875rem; } th, td { padding: 0.6rem 0.75rem; text-align: left; border-bottom: 1px solid var(--border); } th { background: var(--bg); font-weight: 600; white-space: nowrap; } tbody tr:last-child td { border-bottom: none; } .badge { display: inline-block; padding: 0.2em 0.55em; border-radius: 999px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.03em; } .badge.created { background: var(--success-bg); color: var(--success); } .badge.updated { background: var(--updated-bg); color: var(--updated); } .badge.error { background: var(--error-bg); color: var(--error); } .footer { margin-top: 2.5rem; text-align: center; font-size: 0.8rem; color: var(--muted); } @media (max-width: 600px) { .page { padding: 1.25rem 1rem 2rem; } .card { padding: 1rem; } }