.app-shell { max-width: 1120px; margin: 0 auto; /* Honour curved-display safe-area on Android (OnePlus / Galaxy edge); fall back to 20px on flat displays. Requires viewport-fit=cover. */ padding-top: max(24px, env(safe-area-inset-top)); padding-right: max(20px, env(safe-area-inset-right)); padding-bottom: max(40px, env(safe-area-inset-bottom)); padding-left: max(20px, env(safe-area-inset-left)); } .status-line-error { color: #b91c1c; font-weight: 500; } .link-button { background: none; border: none; color: #0f766e; text-decoration: underline; cursor: pointer; padding: 0; font: inherit; } .server-url-editor { background: #f8fafc; border: 1px solid #cbd5e1; border-radius: 10px; padding: 12px; margin: 0 0 16px; } .server-url-editor label { display: block; font-size: 13px; color: #334155; font-weight: 600; } .server-url-editor label span { display: block; margin-bottom: 4px; } .server-url-editor input { width: 100%; box-sizing: border-box; border: 1px solid #94a3b8; border-radius: 8px; padding: 8px 10px; font: inherit; } .server-url-actions { display: flex; gap: 8px; margin-top: 10px; } .server-url-hint { margin: 10px 0 0; font-size: 12px; color: #64748b; } .server-url-hint code { background: #e2e8f0; padding: 1px 5px; border-radius: 4px; font-size: 11px; } .import-progress { margin: 10px 0 4px; } .import-progress-label { font-size: 12px; color: #334155; margin-bottom: 6px; font-variant-numeric: tabular-nums; } .import-progress-bar { width: 100%; height: 8px; appearance: none; border: none; border-radius: 6px; background: #e2e8f0; overflow: hidden; } .import-progress-bar::-webkit-progress-bar { background: #e2e8f0; border-radius: 6px; } .import-progress-bar::-webkit-progress-value { background: #0f766e; border-radius: 6px; transition: width 0.2s ease; } .import-progress-bar::-moz-progress-bar { background: #0f766e; border-radius: 6px; } .hero { text-align: center; margin-bottom: 10px; } .hero h1 { margin: 0; font-size: 44px; color: #0f766e; } .hero p { margin: 8px 0 14px; color: #64748b; } .badge-row { display: flex; gap: 8px; justify-content: center; flex-wrap: wrap; } .badge { background: #e8faf7; border: 1px solid #b6efe5; color: #0f766e; font-size: 12px; padding: 4px 10px; border-radius: 999px; } .status-line { text-align: center; color: #64748b; margin-bottom: 18px; } .tabs { display: flex; gap: 8px; margin-bottom: 14px; } .tabs button { border: 1px solid #dce7ef; border-radius: 10px; background: #fff; color: #334155; padding: 8px 14px; font-weight: 600; cursor: pointer; } .tabs button.active { background: #e8faf7; border-color: #9de5d8; color: #0f766e; } .panel { margin-bottom: 14px; } .panel h2 { margin: 0 0 10px; font-size: 17px; color: #0f172a; } .card { background: #fff; border: 1px solid #dce7ef; border-radius: 14px; padding: 14px; margin-bottom: 12px; } .audio-tools, .text-tools { display: grid; grid-template-columns: repeat(4, minmax(120px, 1fr)); gap: 10px; margin-bottom: 12px; } .btn, select { min-height: 42px; border-radius: 10px; border: 1px solid #cdd9e3; padding: 0 12px; font-size: 14px; } .btn { background: #fff; font-weight: 600; cursor: pointer; } .btn.primary { background: linear-gradient(135deg, #0d9488, #059669); color: #fff; border: none; } .btn.secondary { display: inline-flex; align-items: center; justify-content: center; } .btn.danger { background: #fee2e2; border-color: #fecaca; color: #991b1b; } .audio-player { width: 100%; } .file-name { margin-top: 8px; color: #64748b; font-size: 13px; } .translate-row { display: flex; align-items: center; gap: 12px; margin-top: 12px; } .error-text { color: #991b1b; font-size: 13px; } .text-input { width: 100%; min-height: 220px; resize: vertical; border: 1px solid #cdd9e3; border-radius: 10px; padding: 12px; font-size: 14px; box-sizing: border-box; } .transcript { margin: 0; background: #f8fbfd; border: 1px solid #e2e8f0; border-radius: 10px; padding: 10px; white-space: pre-wrap; color: #334155; max-height: 260px; overflow: auto; } .results-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; } .card h3 { margin: 0 0 12px; color: #0f766e; } .muted { color: #64748b; font-weight: 500; } .kv-grid { display: grid; gap: 8px; max-height: 540px; overflow: auto; } .kv-row { display: grid; grid-template-columns: 1.2fr 1fr; gap: 10px; border-bottom: 1px solid #edf2f7; padding-bottom: 6px; } .kv-row span { color: #64748b; } .danger { border-color: #fecaca; } .referral { font-weight: 700; color: #b91c1c; margin: 0 0 8px; } .reason { margin: 0 0 12px; color: #334155; } .danger-list { display: grid; gap: 8px; max-height: 540px; overflow: auto; } .danger-item { background: #f8fafc; border: 1px solid #e2e8f0; border-left: 3px solid #ef4444; border-radius: 10px; padding: 10px; display: grid; gap: 4px; } .danger-item span { color: #64748b; font-size: 12px; font-weight: 600; } .danger-item em { color: #0f172a; font-style: normal; } .danger-item p { margin: 0; color: #475569; font-style: italic; } .error-banner { border: 1px solid #fecaca; background: #fef2f2; color: #b91c1c; border-radius: 10px; padding: 10px 12px; margin-bottom: 10px; } .loader { color: #0369a1; background: #eff6ff; border-radius: 10px; padding: 10px; } .timing { display: flex; gap: 12px; flex-wrap: wrap; color: #334155; margin-top: 6px; } .pipeline-progress { display: grid; gap: 6px; } .progress-step { display: flex; align-items: center; gap: 10px; padding: 8px 12px; border-radius: 8px; font-size: 14px; transition: all 0.3s ease; } .progress-step.done { background: #f0fdf9; color: #0f766e; } .progress-step.running { background: #eff6ff; color: #0369a1; } .progress-step.running .step-icon { animation: pulse 1s infinite; } .progress-step.pending { color: #94a3b8; } .step-icon { font-size: 16px; width: 20px; text-align: center; flex-shrink: 0; } .step-time { font-size: 12px; opacity: 0.7; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } } .history-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; } .history-header h2 { margin: 0; } .history-list { display: grid; gap: 8px; } .history-entry { cursor: pointer; transition: border-color 0.2s; } .history-entry:hover { border-color: #9de5d8; } .history-meta { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; } .history-meta strong { color: #0f766e; } .history-meta span { color: #64748b; font-size: 13px; } .history-preview { margin: 6px 0 0; color: #475569; font-size: 13px; line-height: 1.4; } .history-detail-header { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; } .history-detail-header h3 { margin: 0; } .export-buttons { display: flex; gap: 8px; margin-top: 12px; } .about-card h2 { color: #0f766e; margin-top: 0; } .about-card h3 { color: #0f766e; margin-top: 20px; margin-bottom: 8px; font-size: 16px; } .about-card p { color: #334155; line-height: 1.6; margin: 4px 0 8px; } .about-card ul { padding-left: 20px; color: #334155; line-height: 1.8; } .pipeline-steps { display: grid; gap: 8px; margin-top: 8px; } .step { display: grid; grid-template-columns: 200px 1fr; gap: 10px; background: #f0fdf9; border: 1px solid #d1f5ea; border-radius: 10px; padding: 10px 14px; align-items: center; } .step strong { color: #0f766e; } .step span { color: #475569; font-size: 14px; } .tech-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-top: 8px; } .tech-item { background: #f8fbfd; border: 1px solid #e2e8f0; border-radius: 10px; padding: 10px 14px; display: grid; gap: 2px; } .tech-item strong { color: #0f766e; font-size: 13px; } .tech-item span { color: #475569; font-size: 14px; } @media (max-width: 960px) { .hero h1 { font-size: 34px; } .audio-tools, .text-tools { grid-template-columns: 1fr; } .results-grid { grid-template-columns: 1fr; } .step { grid-template-columns: 1fr; } .tech-grid { grid-template-columns: 1fr; } } /* ── Field Mode ── */ .connectivity-badge { display: inline-block; padding: 6px 14px; border-radius: 20px; font-size: 13px; font-weight: 600; margin-bottom: 12px; } .connectivity-badge.online { background: #dcfce7; color: #166534; } .connectivity-badge.offline { background: #fef3c7; color: #92400e; } .field-desc { color: #64748b; font-size: 14px; margin-bottom: 16px; line-height: 1.5; } .queue-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; flex-wrap: wrap; gap: 8px; } .queue-header h3 { margin: 0; color: #0f766e; } .queue-actions { display: flex; gap: 8px; } .queue-list { display: flex; flex-direction: column; gap: 8px; } .queue-item { display: flex; justify-content: space-between; align-items: center; padding: 10px 14px; border-radius: 8px; background: #f8fafc; border: 1px solid #e2e8f0; flex-wrap: wrap; gap: 8px; } .queue-item.processing { background: #eff6ff; border-color: #93c5fd; } .queue-meta { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; font-size: 13px; } .queue-meta strong { color: #1e293b; } .queue-meta span { color: #64748b; } .queue-status.pending { color: #d97706; } .queue-status.processing { color: #2563eb; } .queue-item-actions { display: flex; gap: 6px; } .metadata-card { border-left: 4px solid #0d9488; } .metadata-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 10px; } .metadata-grid label { display: flex; flex-direction: column; gap: 4px; font-size: 12px; color: #475569; font-weight: 500; } .metadata-grid input, .metadata-grid select { min-height: 38px; border: 1px solid #cdd9e3; border-radius: 8px; padding: 0 10px; font-size: 14px; width: 100%; box-sizing: border-box; background: #fff; color: #0f172a; } .metadata-grid input::placeholder { color: #94a3b8; } .age-row { display: flex; gap: 6px; } .age-row input { flex: 1; min-width: 0; } .age-row select { flex: 0 0 96px; } .audio-tools-3 { grid-template-columns: repeat(3, minmax(120px, 1fr)); } .audio-tools-1 { grid-template-columns: minmax(160px, 240px); }