sakhi / frontend /src /App.css
Tushar9802's picture
feat(audio): demo clips + Translate + Whisper warm + CT2 mirror
d3595cb
.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);
}