PUMS-TOOLKIT / static /audio_studio_v2.css
ndmhung6's picture
feat: redesign Audio Story Studio UI v2 - sticky timeline, char counter, waveform, improved layout
29cfe69
Raw
History Blame Contribute Delete
12.5 kB
/* ═══════════════════════════════════════════
AI Audio Story Studio — Enhanced UI v2
═══════════════════════════════════════════ */
/* ── Hero ── */
.studio-hero {
background: linear-gradient(135deg, #4361ee 0%, #7c3aed 50%, #a855f7 100%);
border-radius: var(--radius-xl); padding: 28px 32px;
color: #fff; position: relative; overflow: hidden; margin-bottom: 0;
}
.studio-hero::before {
content:''; position:absolute; top:-40%; right:-10%;
width:300px; height:300px;
background:radial-gradient(circle,rgba(255,255,255,.12) 0%,transparent 70%);
pointer-events:none;
}
.studio-hero::after {
content:''; position:absolute; bottom:-30%; left:10%;
width:200px; height:200px;
background:radial-gradient(circle,rgba(255,255,255,.08) 0%,transparent 70%);
pointer-events:none;
}
.studio-hero h2 { font-weight:800; margin:0; position:relative; z-index:1; }
.studio-hero p { margin:6px 0 0; opacity:.85; font-size:.9rem; position:relative; z-index:1; }
/* ── Timeline sticky ── */
.step-timeline-wrapper {
position:sticky; top:0; z-index:100;
background:var(--color-bg-page); padding:16px 0 0;
margin-bottom:28px; box-shadow:0 2px 12px rgba(0,0,0,.06);
}
.step-timeline { display:flex; align-items:center; justify-content:center; padding:12px 24px; }
.step-progress-bar-track { height:3px; background:#e2e8f0; overflow:hidden; }
.step-progress-bar-fill {
height:100%; background:linear-gradient(90deg,#4361ee,#7c3aed);
transition:width .5s cubic-bezier(.4,0,.2,1); width:0%;
}
/* ── Step dots ── */
.step-dot { display:flex; flex-direction:column; align-items:center; gap:6px; position:relative; z-index:2; }
.step-dot .dot-circle {
width:42px; height:42px; border-radius:50%;
display:flex; align-items:center; justify-content:center;
font-weight:800; font-size:.95rem;
background:#e2e8f0; color:#94a3b8;
transition:all .4s cubic-bezier(.4,0,.2,1);
border:3px solid transparent; box-shadow:0 2px 8px rgba(0,0,0,.06);
}
.step-dot.active .dot-circle {
background:linear-gradient(135deg,#4361ee,#7c3aed); color:#fff;
border-color:rgba(67,97,238,.3); box-shadow:0 4px 20px rgba(67,97,238,.35); transform:scale(1.12);
}
.step-dot.done .dot-circle {
background:linear-gradient(135deg,#10b981,#059669); color:#fff;
border-color:rgba(16,185,129,.3); box-shadow:0 4px 16px rgba(16,185,129,.3);
}
.step-dot .dot-label {
font-size:.72rem; font-weight:700; color:#94a3b8;
text-transform:uppercase; letter-spacing:.04em; white-space:nowrap; transition:color .3s;
}
.step-dot.active .dot-label { color:var(--color-primary); }
.step-dot.done .dot-label { color:#059669; }
.step-line {
width:80px; height:3px; background:#e2e8f0; border-radius:2px;
margin:0 -4px; margin-bottom:22px; transition:background .4s; position:relative; z-index:1;
}
.step-line.done { background:linear-gradient(90deg,#10b981,#34d399); }
/* ── Panels ── */
.step-panel { display:none; animation:panelIn .4s ease; }
.step-panel.active { display:block; }
@keyframes panelIn { from{opacity:0;transform:translateY(16px)} to{opacity:1;transform:translateY(0)} }
/* ── Studio Cards ── */
.studio-card {
background:var(--color-bg-card); border:1px solid var(--color-border);
border-radius:var(--radius-lg); box-shadow:var(--shadow-card);
overflow:hidden; transition:box-shadow .2s;
}
.studio-card:hover { box-shadow:0 4px 24px rgba(0,0,0,.10); }
.studio-card .card-header-custom {
background:linear-gradient(135deg,#f8fafc,#f1f5f9);
padding:16px 20px; border-bottom:1px solid var(--color-border);
display:flex; align-items:center; gap:10px;
}
.studio-card .card-header-custom h5 { margin:0; font-weight:700; font-size:.95rem; color:var(--color-text-heading); }
.studio-card .card-header-custom .header-icon {
width:32px; height:32px; border-radius:8px;
display:flex; align-items:center; justify-content:center; font-size:.85rem; flex-shrink:0;
}
.icon-purple { background:#ede9fe; color:#7c3aed; }
.icon-blue { background:#dbeafe; color:#2563eb; }
.icon-green { background:#d1fae5; color:#059669; }
.icon-amber { background:#fef3c7; color:#d97706; }
.studio-card .card-body-custom { padding:20px; }
/* ── Character counter ── */
.textarea-wrapper { position:relative; }
.char-counter {
position:absolute; bottom:10px; right:12px;
font-size:.72rem; color:#94a3b8; background:rgba(255,255,255,.9);
padding:2px 6px; border-radius:4px; pointer-events:none; transition:color .2s;
}
.char-counter.warn { color:#d97706; }
.char-counter.limit { color:#dc2626; }
/* ── Config Groups ── */
.config-group {
background:#f8fafc; border:1px solid #e8ecf0;
border-radius:var(--radius-md); padding:14px 16px 10px;
margin-bottom:14px; transition:border-color .2s;
}
.config-group:hover { border-color:#c7d2fe; }
.config-group-title {
font-size:.72rem; font-weight:700; text-transform:uppercase;
letter-spacing:.06em; color:#94a3b8; margin-bottom:10px;
}
.config-separator { border:none; border-top:1px dashed #e2e8f0; margin:10px 0; }
.form-select:hover:not(:focus) { border-color:#a5b4fc; }
/* ── Prompt toolbar ── */
.prompt-toolbar {
display:flex; align-items:center; gap:8px; padding:8px 12px;
background:#f8fafc; border:1px solid var(--color-border);
border-bottom:none; border-radius:var(--radius-md) var(--radius-md) 0 0;
}
.prompt-toolbar .word-count-badge {
margin-left:auto; font-size:.72rem; color:#64748b;
background:#e2e8f0; padding:2px 8px; border-radius:50px;
}
.prompt-toolbar .btn-toolbar-sm {
font-size:.75rem; padding:4px 10px; border-radius:6px;
border:1px solid #e2e8f0; background:#fff; color:#64748b;
cursor:pointer; transition:all .15s;
}
.prompt-toolbar .btn-toolbar-sm:hover { background:#f0f3ff; color:var(--color-primary); border-color:#c7d2fe; }
.prompt-has-toolbar { border-top-left-radius:0 !important; border-top-right-radius:0 !important; }
/* ── Script word count badge ── */
.script-badge {
display:inline-flex; align-items:center; gap:4px;
padding:3px 10px; background:#ede9fe; color:#7c3aed;
border-radius:50px; font-size:.72rem; font-weight:700;
}
/* ── Audio dark card ── */
.audio-dark-card {
background:linear-gradient(135deg,#0f172a 0%,#1e1b4b 50%,#312e81 100%);
border:1px solid rgba(255,255,255,.08);
border-radius:var(--radius-lg); color:#fff; position:relative; overflow:hidden;
}
.audio-dark-card::before {
content:''; position:absolute; top:-80px; right:-60px;
width:200px; height:200px;
background:radial-gradient(circle,rgba(99,102,241,.2) 0%,transparent 70%);
pointer-events:none;
}
.audio-dark-card audio { width:100%; outline:none; border-radius:8px; }
/* ── Audio empty state ── */
.audio-empty-state {
background:linear-gradient(135deg,#0f172a 0%,#1e1b4b 50%,#312e81 100%);
border:1px solid rgba(255,255,255,.08);
border-radius:var(--radius-lg); color:rgba(255,255,255,.5);
padding:28px 20px; text-align:center;
}
.audio-empty-state .empty-icon {
width:56px; height:56px; border-radius:50%;
background:rgba(255,255,255,.08);
display:flex; align-items:center; justify-content:center;
font-size:1.5rem; margin:0 auto 12px;
}
.audio-empty-state p { font-size:.82rem; margin:0; color:rgba(255,255,255,.4); }
/* ── Waveform ── */
.waveform { display:flex; align-items:center; justify-content:center; gap:3px; height:28px; margin:8px 0; }
.waveform .bar {
width:3px; border-radius:2px; background:rgba(255,255,255,.6);
height:4px; transition:height .1s;
}
.waveform.playing .bar { animation:waveBounce 1.2s ease-in-out infinite; }
.waveform .bar:nth-child(1) { animation-delay:0s; }
.waveform .bar:nth-child(2) { animation-delay:.1s; }
.waveform .bar:nth-child(3) { animation-delay:.2s; }
.waveform .bar:nth-child(4) { animation-delay:.3s; }
.waveform .bar:nth-child(5) { animation-delay:.4s; }
.waveform .bar:nth-child(6) { animation-delay:.15s; }
.waveform .bar:nth-child(7) { animation-delay:.25s; }
.waveform .bar:nth-child(8) { animation-delay:.35s; }
.waveform .bar:nth-child(9) { animation-delay:.05s; }
.waveform .bar:nth-child(10) { animation-delay:.45s; }
.waveform .bar:nth-child(11) { animation-delay:.18s; }
.waveform .bar:nth-child(12) { animation-delay:.28s; }
@keyframes waveBounce { 0%,100%{height:4px} 50%{height:22px} }
/* ── Voice chips ── */
.voice-chip { display:inline-flex; align-items:center; gap:5px; padding:4px 10px; border-radius:50px; font-size:.75rem; font-weight:600; }
.chip-purple { background:#ede9fe; color:#7c3aed; }
.chip-emerald { background:#d1fae5; color:#059669; }
/* ── Nav buttons ── */
.step-nav { display:flex; gap:10px; margin-top:20px; padding-top:16px; border-top:1px solid var(--color-border-light); }
.btn-step {
padding:12px 24px; border-radius:var(--radius-md); font-weight:700;
font-size:.9rem; border:none; cursor:pointer; transition:all .2s;
display:inline-flex; align-items:center; gap:8px;
}
.btn-step-primary {
background:linear-gradient(135deg,#4361ee,#7c3aed);
color:#fff; box-shadow:0 4px 14px rgba(67,97,238,.3);
}
.btn-step-primary:hover { transform:translateY(-2px); box-shadow:0 8px 24px rgba(67,97,238,.5); }
.btn-step-back { background:#f1f5f9; color:#64748b; border:1px solid #e2e8f0; }
.btn-step-back:hover { background:#e2e8f0; }
.btn-step-green {
background:linear-gradient(135deg,#059669,#10b981);
color:#fff; box-shadow:0 4px 14px rgba(16,185,129,.3);
}
.btn-step-green:hover { transform:translateY(-2px); box-shadow:0 8px 24px rgba(16,185,129,.45); }
#btnStep1 { font-size:1rem; letter-spacing:.02em; }
#btnStep1:hover { animation:btnGlow 1.5s ease-in-out infinite alternate; }
@keyframes btnGlow {
from { box-shadow:0 4px 14px rgba(67,97,238,.35); }
to { box-shadow:0 8px 32px rgba(124,58,237,.65); }
}
/* ── Tip box ── */
.tip-box {
background:linear-gradient(135deg,#eff6ff,#dbeafe); border:1px solid #bfdbfe;
border-radius:var(--radius-md); padding:14px 16px; font-size:.85rem; color:#1e40af;
display:flex; gap:10px; align-items:flex-start;
}
.tip-box i { margin-top:2px; flex-shrink:0; }
/* ── AI insight ── */
.ai-insight { background:linear-gradient(135deg,#faf5ff,#ede9fe); border:1px solid #ddd6fe; border-radius:var(--radius-md); padding:16px; }
.ai-insight h6 { color:#6d28d9; font-weight:700; font-size:.82rem; margin-bottom:10px; }
.ai-insight .insight-row { display:flex; align-items:center; gap:8px; margin-bottom:6px; font-size:.85rem; }
.ai-insight .insight-label { color:#7c3aed; font-weight:600; min-width:90px; }
.ai-insight .insight-value { color:#4c1d95; }
.studio-card .ai-insight { border-radius:0; border:none; border-top:1px solid #ddd6fe; }
/* ── Error slide-in ── */
#errorArea { animation:slideDown .3s ease; }
@keyframes slideDown { from{opacity:0;transform:translateY(-12px)} to{opacity:1;transform:translateY(0)} }
/* ── Loader enhanced ── */
.loader-overlay {
display:none; position:fixed; top:0; left:0; width:100%; height:100%;
background:rgba(248,250,252,.92); backdrop-filter:blur(4px);
z-index:1000; justify-content:center; align-items:center; flex-direction:column;
}
.loader-box {
background:#fff; border-radius:var(--radius-xl);
box-shadow:0 8px 40px rgba(67,97,238,.15);
padding:36px 48px; text-align:center; min-width:280px;
}
.loader-progress-track { height:4px; background:#e2e8f0; border-radius:2px; overflow:hidden; margin-top:16px; width:100%; }
.loader-progress-fill {
height:100%; background:linear-gradient(90deg,#4361ee,#7c3aed);
border-radius:2px; width:0%; transition:width .4s ease;
}
.loader-sub-text { font-size:.78rem; color:#94a3b8; margin-top:8px; }
/* ── Responsive ── */
@media (max-width:768px) {
.studio-hero { padding:20px 18px; }
.step-dot .dot-label { display:none; }
.step-dot .dot-circle { width:34px; height:34px; font-size:.85rem; }
.step-line { width:40px; }
.btn-step { width:100%; justify-content:center; font-size:.85rem; }
.step-nav { flex-direction:column; }
.prompt-toolbar { flex-wrap:wrap; gap:6px; }
#btnStep1 { font-size:.9rem; }
.loader-box { min-width:240px; padding:24px 28px; }
}