Spaces:
Sleeping
Sleeping
| :root { | |
| --bg: #0F2E2B; | |
| --surface: #15403A; | |
| --surface-raised: #1B4D45; | |
| --accent: #E0922E; | |
| --accent-strong: #F0A744; | |
| --text: #F3ECDD; | |
| --text-muted: #9FBDB6; | |
| --error: #C7402B; | |
| --border: rgba(243, 236, 221, 0.12); | |
| --font-display: 'Fraunces', serif; | |
| --font-body: 'Work Sans', sans-serif; | |
| --font-mono: 'JetBrains Mono', monospace; | |
| } | |
| * { box-sizing: border-box; } | |
| body { | |
| margin: 0; | |
| background: var(--bg); | |
| color: var(--text); | |
| font-family: var(--font-body); | |
| -webkit-font-smoothing: antialiased; | |
| } | |
| .app { | |
| max-width: 560px; | |
| margin: 0 auto; | |
| padding: 24px 20px calc(48px + env(safe-area-inset-bottom)); | |
| min-height: 100vh; | |
| } | |
| .app-header { margin-bottom: 28px; } | |
| .brand { | |
| display: flex; | |
| align-items: center; | |
| gap: 12px; | |
| } | |
| .brand-mark { | |
| color: var(--accent); | |
| flex-shrink: 0; | |
| } | |
| h1 { | |
| font-family: var(--font-display); | |
| font-size: 1.6rem; | |
| font-weight: 700; | |
| margin: 0; | |
| letter-spacing: -0.01em; | |
| } | |
| .tagline { | |
| margin: 2px 0 0; | |
| color: var(--text-muted); | |
| font-size: 0.85rem; | |
| } | |
| /* Tabs */ | |
| .tabs { | |
| display: grid; | |
| grid-template-columns: repeat(4, 1fr); | |
| gap: 6px; | |
| background: var(--surface); | |
| padding: 4px; | |
| border-radius: 12px; | |
| margin-bottom: 22px; | |
| } | |
| .tab { | |
| appearance: none; | |
| border: none; | |
| background: transparent; | |
| color: var(--text-muted); | |
| font-family: var(--font-body); | |
| font-weight: 500; | |
| font-size: 0.85rem; | |
| padding: 10px 4px; | |
| border-radius: 9px; | |
| cursor: pointer; | |
| transition: background 0.15s ease, color 0.15s ease; | |
| } | |
| .tab.is-active { | |
| background: var(--accent); | |
| color: #1A1206; | |
| } | |
| .tab:focus-visible { | |
| outline: 2px solid var(--accent-strong); | |
| outline-offset: 2px; | |
| } | |
| /* Panels */ | |
| .panel { display: none; } | |
| .panel.is-active { display: block; } | |
| .field-label { | |
| display: block; | |
| font-size: 0.8rem; | |
| font-weight: 600; | |
| text-transform: uppercase; | |
| letter-spacing: 0.04em; | |
| color: var(--text-muted); | |
| margin-bottom: 8px; | |
| } | |
| .field-label--secondary { margin-top: 18px; } | |
| .field-hint { | |
| font-family: var(--font-mono); | |
| font-size: 0.75rem; | |
| color: var(--text-muted); | |
| margin: -4px 0 10px; | |
| } | |
| textarea, | |
| input[type="file"], | |
| input[type="number"] { | |
| width: 100%; | |
| background: var(--surface); | |
| border: 1px solid var(--border); | |
| border-radius: 10px; | |
| color: var(--text); | |
| font-family: var(--font-body); | |
| font-size: 1rem; | |
| padding: 12px 14px; | |
| } | |
| textarea { | |
| resize: vertical; | |
| min-height: 110px; | |
| } | |
| textarea:focus, | |
| input:focus { | |
| outline: none; | |
| border-color: var(--accent); | |
| } | |
| .char-count { | |
| text-align: right; | |
| font-family: var(--font-mono); | |
| font-size: 0.75rem; | |
| color: var(--text-muted); | |
| margin: 6px 0 0; | |
| } | |
| /* Voice selector */ | |
| .voice-select { margin: 22px 0 18px; } | |
| .voice-options { | |
| display: flex; | |
| gap: 8px; | |
| } | |
| .voice-pill { | |
| position: relative; | |
| flex: 1; | |
| text-align: center; | |
| background: var(--surface); | |
| border: 1px solid var(--border); | |
| border-radius: 10px; | |
| padding: 10px; | |
| cursor: pointer; | |
| font-size: 0.9rem; | |
| font-weight: 500; | |
| transition: border-color 0.15s ease, background 0.15s ease; | |
| } | |
| .voice-pill input { | |
| position: absolute; | |
| opacity: 0; | |
| inset: 0; | |
| cursor: pointer; | |
| } | |
| .voice-pill:has(input:checked) { | |
| border-color: var(--accent); | |
| background: rgba(224, 146, 46, 0.14); | |
| } | |
| /* Submit */ | |
| .primary-btn { | |
| width: 100%; | |
| background: var(--accent); | |
| color: #1A1206; | |
| border: none; | |
| border-radius: 12px; | |
| padding: 15px; | |
| font-family: var(--font-body); | |
| font-weight: 600; | |
| font-size: 1rem; | |
| cursor: pointer; | |
| transition: background 0.15s ease, transform 0.05s ease; | |
| } | |
| .primary-btn:hover { background: var(--accent-strong); } | |
| .primary-btn:active { transform: scale(0.99); } | |
| .primary-btn:disabled { opacity: 0.5; cursor: not-allowed; } | |
| /* Status / waveform (signature element) */ | |
| .status { | |
| margin-top: 26px; | |
| text-align: center; | |
| } | |
| .waveform { | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| gap: 5px; | |
| height: 36px; | |
| margin-bottom: 10px; | |
| } | |
| .waveform span { | |
| width: 4px; | |
| height: 100%; | |
| background: var(--accent); | |
| border-radius: 2px; | |
| animation: wave 1.1s ease-in-out infinite; | |
| } | |
| .waveform span:nth-child(2) { animation-delay: 0.1s; } | |
| .waveform span:nth-child(3) { animation-delay: 0.2s; } | |
| .waveform span:nth-child(4) { animation-delay: 0.3s; } | |
| .waveform span:nth-child(5) { animation-delay: 0.4s; } | |
| @keyframes wave { | |
| 0%, 100% { transform: scaleY(0.3); } | |
| 50% { transform: scaleY(1); } | |
| } | |
| @media (prefers-reduced-motion: reduce) { | |
| .waveform span { animation: none; transform: scaleY(0.7); } | |
| } | |
| #status-text { | |
| font-family: var(--font-mono); | |
| font-size: 0.85rem; | |
| color: var(--text-muted); | |
| margin: 0; | |
| } | |
| /* Result */ | |
| .result { | |
| margin-top: 26px; | |
| background: var(--surface); | |
| border-radius: 14px; | |
| padding: 18px; | |
| } | |
| .result-text { | |
| font-family: var(--font-display); | |
| font-size: 1.15rem; | |
| line-height: 1.5; | |
| margin: 0 0 16px; | |
| } | |
| audio { width: 100%; } | |
| .download-link { | |
| display: inline-block; | |
| margin-top: 12px; | |
| color: var(--accent-strong); | |
| font-family: var(--font-mono); | |
| font-size: 0.85rem; | |
| text-decoration: none; | |
| border-bottom: 1px solid currentColor; | |
| } | |
| /* Error */ | |
| .error { | |
| margin-top: 20px; | |
| background: rgba(199, 64, 43, 0.14); | |
| border: 1px solid var(--error); | |
| border-radius: 10px; | |
| padding: 14px 16px; | |
| font-size: 0.9rem; | |
| color: var(--text); | |
| } | |
| [hidden] { display: none ; } | |