/* ═══════════════════════════════════════════════════════════ transcriptionMain.css · Mainframe Design System v3 ═══════════════════════════════════════════════════════════ */ :root { --font-heading: 'HelveticaNowDisplay-Medium','Helvetica Neue',Arial,sans-serif; --font-body: 'HelveticaNowDisplayW01-Rg','Helvetica Neue',Arial,sans-serif; --ink: #0a0a0a; --ink-70: rgba(10,10,10,0.70); --ink-45: rgba(10,10,10,0.45); --ink-20: rgba(10,10,10,0.20); --ink-10: rgba(10,10,10,0.10); --ink-05: rgba(10,10,10,0.05); --surface: #f4f3ef; --surface-2: #eeecea; --card: #ffffff; --radius-pill: 9999px; --radius-xl: 24px; --radius-lg: 18px; --radius-md: 12px; --shadow-xs: 0 1px 2px rgba(0,0,0,0.06); --shadow-sm: 0 2px 10px rgba(0,0,0,0.08), 0 1px 2px rgba(0,0,0,0.04); --shadow-md: 0 6px 28px rgba(0,0,0,0.10), 0 2px 6px rgba(0,0,0,0.05); --shadow-inset: inset 0 1px 0 rgba(255,255,255,0.8); } /* ─── Animations ─────────────────────────────────────────── */ @keyframes fade-up { from { opacity:0; transform:translateY(16px); } to { opacity:1; transform:none; } } @keyframes spin { to { transform:rotate(360deg); } } /* ─── Base ───────────────────────────────────────────────── */ *,*::before,*::after { margin:0; padding:0; box-sizing:border-box; } html { font-family: var(--font-body); -webkit-font-smoothing: antialiased; background: var(--surface); color: var(--ink); } body { min-height: 100vh; background: var(--surface); padding: 0 20px 100px; font-family: var(--font-body); /* subtle paper grain */ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)' opacity='0.028'/%3E%3C/svg%3E"); } /* ─── Page Layout ────────────────────────────────────────── */ .container { width: 100%; max-width: 600px; margin: 0 auto; padding-top: 48px; } /* ─── Upload View ────────────────────────────────────────── */ .upload-view { animation: fade-up .7s cubic-bezier(.22,1,.36,1) backwards; animation-delay: .05s; } /* ── Section label above heading ── */ .upload-view::before { content: '✦ Powered by Whisper AI'; display: block; font-size: 11px; font-weight: 600; letter-spacing: .1em; text-transform: uppercase; color: var(--ink-45); margin-bottom: 14px; padding: 6px 14px; background: var(--card); border: 1px solid var(--ink-10); border-radius: var(--radius-pill); box-shadow: var(--shadow-xs); display: inline-block; } /* ─── Page Heading ───────────────────────────────────────── */ .upload-view h1 { font-family: var(--font-heading); font-size: clamp(32px, 6vw, 52px); font-weight: 500; letter-spacing: -0.05em; line-height: 1.0; color: var(--ink); margin-bottom: 12px; } /* ─── Subtitle ───────────────────────────────────────────── */ .subtitle { font-size: 14px; color: var(--ink-45); line-height: 1.6; margin-bottom: 36px; max-width: 400px; } /* ─── Drop Zone ──────────────────────────────────────────── */ .upload-area { background: var(--card); border: 1.5px dashed var(--ink-20); border-radius: var(--radius-xl); padding: 0; cursor: pointer; margin-bottom: 16px; position: relative; overflow: hidden; box-shadow: var(--shadow-sm), var(--shadow-inset); transition: border-color .25s ease, box-shadow .25s ease, transform .25s cubic-bezier(.22,1,.36,1); } /* Dashed border via gradient trick for rounded corners */ .upload-area::before { content: ''; position: absolute; inset: 0; border-radius: inherit; background: radial-gradient(ellipse 70% 55% at 50% -10%, rgba(10,10,10,0.04) 0%, transparent 70%); pointer-events: none; z-index: 0; } /* Inner content wrapper */ .upload-area > :not(.file-input) { position: relative; z-index: 1; } /* Actual click target padding */ .upload-area { padding: 52px 32px 44px; text-align: center; } .upload-area:hover, .upload-area.dragover { border-color: var(--ink-45); box-shadow: var(--shadow-md), var(--shadow-inset); transform: translateY(-3px); } .upload-icon { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; border-radius: var(--radius-md); background: var(--surface-2); border: 1px solid var(--ink-10); box-shadow: var(--shadow-xs); margin-bottom: 16px; font-size: 18px; color: var(--ink-45); line-height: 1; } .upload-area h3 { font-size: 15px; font-weight: 500; letter-spacing: -0.02em; margin-bottom: 6px; color: var(--ink); } .upload-area p { font-size: 12px; color: var(--ink-45); line-height: 1.55; max-width: 300px; margin: 0 auto; } .file-input { display:none; } /* ─── Controls Card ──────────────────────────────────────── */ /* Wrap language + model in a subtle grouped container */ .language-select, .model-select { animation: fade-up .7s cubic-bezier(.22,1,.36,1) backwards; } /* ─── Language Pills ─────────────────────────────────────── */ .language-select { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 10px; animation-delay: .18s; padding: 14px 16px; background: var(--card); border-radius: var(--radius-lg); border: 1px solid var(--ink-10); box-shadow: var(--shadow-xs); } .language-select::before { content: 'Ngôn ngữ'; display: block; width: 100%; font-size: 10px; font-weight: 600; letter-spacing: .09em; text-transform: uppercase; color: var(--ink-45); margin-bottom: 8px; } .language-select label { display: inline-flex; align-items: center; gap: 7px; font-size: 13px; letter-spacing: -0.01em; color: var(--ink-70); background: var(--surface); border: 1px solid var(--ink-10); border-radius: var(--radius-pill); padding: 5px 16px; cursor: pointer; box-shadow: var(--shadow-xs); transition: background .18s, color .18s, border-color .18s, box-shadow .18s; user-select: none; white-space: nowrap; } .language-select label:hover { background: var(--ink); color: #fff; border-color: var(--ink); box-shadow: var(--shadow-sm); } .language-select input[type="radio"] { accent-color: var(--ink); width: 13px; height: 13px; cursor: pointer; } /* ─── Model Row ──────────────────────────────────────────── */ .model-select { display: flex; align-items: center; gap: 12px; margin-bottom: 22px; animation-delay: .24s; padding: 12px 16px; background: var(--card); border-radius: var(--radius-lg); border: 1px solid var(--ink-10); box-shadow: var(--shadow-xs); font-size: 12px; font-weight: 600; letter-spacing: .06em; text-transform: uppercase; color: var(--ink-45); } .model-select select { padding: 6px 14px; border-radius: var(--radius-pill); border: 1px solid var(--ink-10); background: var(--surface); color: var(--ink); font-size: 13px; font-family: var(--font-body); cursor: pointer; appearance: none; -webkit-appearance: none; box-shadow: var(--shadow-xs); transition: border-color .18s, box-shadow .18s; flex: 1; } .model-select select:focus { outline: none; border-color: var(--ink-45); box-shadow: 0 0 0 3px rgba(10,10,10,.07); } .model-select select option { background:#fff; color:#000; } /* ─── File Info ──────────────────────────────────────────── */ .file-info { background: var(--card); border: 1px solid var(--ink-10); border-radius: var(--radius-md); padding: 12px 16px; margin-bottom: 14px; font-size: 12px; color: var(--ink-45); line-height: 1.8; word-break: break-all; display: none; box-shadow: var(--shadow-xs); } /* ─── Buttons ────────────────────────────────────────────── */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 7px; padding: 9px 24px; border-radius: var(--radius-pill); font-size: 13px; font-family: var(--font-body); letter-spacing: -0.01em; cursor: pointer; border: 1px solid var(--ink-10); text-decoration: none; white-space: nowrap; background: var(--card); color: var(--ink); box-shadow: var(--shadow-xs), var(--shadow-inset); margin: 0 5px 5px 0; position: relative; overflow: hidden; transition: background .2s ease, color .2s ease, border-color .2s ease, box-shadow .2s ease, transform .18s cubic-bezier(.22,1,.36,1); } .btn:hover:not(:disabled) { background: var(--ink); color: #fff; border-color: var(--ink); box-shadow: var(--shadow-md); transform: translateY(-2px); } .btn:active:not(:disabled) { transform: scale(.97) translateY(0); box-shadow: var(--shadow-xs); } .btn:disabled { opacity:.35; cursor:not-allowed; } .btn-outline { background: transparent; box-shadow: none; border-color: var(--ink-20); } .btn-outline:hover:not(:disabled) { background: var(--ink); color: #fff; border-color: var(--ink); box-shadow: var(--shadow-md); } /* ─── Progress Card ──────────────────────────────────────── */ .progress-container { margin-top: 18px; display: none; background: var(--card); border: 1px solid var(--ink-10); border-radius: var(--radius-xl); padding: 22px 24px 20px; box-shadow: var(--shadow-sm), var(--shadow-inset); animation: fade-up .5s cubic-bezier(.22,1,.36,1) backwards; } .progress-container h3 { font-size: 10px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: var(--ink-45); margin-bottom: 16px; } .progress-bar { width:100%; height:2px; background: var(--ink-05); border-radius:99px; overflow:hidden; margin-bottom:6px; } .progress-fill { height:100%; background: var(--ink); width:0%; border-radius:99px; transition: width .45s cubic-bezier(.22,1,.36,1); } .upload-progress-bar { width:100%; height:2px; background: var(--ink-05); border-radius:99px; overflow:hidden; margin:10px 0 4px; } .upload-progress-fill { height:100%; background: var(--ink-45); width:0%; border-radius:99px; transition: width .45s cubic-bezier(.22,1,.36,1); } .progress-text { font-size:11px; color:var(--ink-45); margin-top:6px; letter-spacing:.01em; } /* ─── Result ─────────────────────────────────────────────── */ .result-area { margin-top:22px; display:none; animation: fade-up .5s cubic-bezier(.22,1,.36,1) backwards; } .result-label { font-size:10px; font-weight:700; letter-spacing:.1em; text-transform:uppercase; color:var(--ink-45); margin-bottom:10px; } .result-preview { background: var(--card); border: 1px solid var(--ink-10); border-radius: var(--radius-lg); padding: 16px 20px; font-size:14px; color:var(--ink-70); line-height:1.75; margin-bottom:14px; box-shadow: var(--shadow-xs); } /* ─── Transcript View ────────────────────────────────────── */ .transcript-view { display:none; } .transcript-view h1 { font-family: var(--font-heading); font-size: clamp(26px, 4.5vw, 40px); font-weight: 500; letter-spacing: -0.05em; color: var(--ink); margin-bottom: 8px; } .meta { font-size: 12px; color: var(--ink-45); margin-bottom: 22px; padding-bottom: 20px; border-bottom: 1px solid var(--ink-10); line-height: 1.9; } .meta strong { color: var(--ink); font-weight: 500; } .transcript-content { background: var(--card); border: 1px solid var(--ink-10); border-radius: var(--radius-xl); padding: 26px 28px; font-size:15px; line-height:1.9; white-space:pre-wrap; word-wrap:break-word; max-height:580px; overflow-y:auto; color:var(--ink-70); box-shadow: var(--shadow-sm), var(--shadow-inset); scrollbar-width:thin; scrollbar-color: var(--ink-10) transparent; } .transcript-content::-webkit-scrollbar { width:4px; } .transcript-content::-webkit-scrollbar-track { background:transparent; } .transcript-content::-webkit-scrollbar-thumb { background:var(--ink-10); border-radius:99px; } .nav-buttons { display:flex; gap:6px; flex-wrap:wrap; margin-bottom:22px; }