ElevenClip-AI / frontend /src /styles.css
JakgritB
feat(frontend): redesign editor workspace controls
c481310
raw
history blame
21.7 kB
@tailwind base;
@tailwind components;
@tailwind utilities;
:root {
color-scheme: light;
font-family: Inter, ui-sans-serif, system-ui, sans-serif;
--bg: #f6f7f9;
--surface: #ffffff;
--surface-muted: #eef2f6;
--surface-strong: #e2e8f0;
--text: #111827;
--text-muted: #64748b;
--text-soft: #94a3b8;
--border: #d9e2ec;
--border-strong: #b7c4d4;
--primary: #0f766e;
--primary-strong: #115e59;
--primary-soft: #ccfbf1;
--accent: #d97706;
--accent-soft: #fef3c7;
--danger: #be123c;
--danger-soft: #ffe4e6;
--shadow: 0 18px 40px rgb(15 23 42 / 0.08);
--radius: 8px;
}
:root[data-theme="dark"] {
color-scheme: dark;
--bg: #09111f;
--surface: #111827;
--surface-muted: #172033;
--surface-strong: #243044;
--text: #f8fafc;
--text-muted: #a8b3c7;
--text-soft: #748198;
--border: #28364d;
--border-strong: #3b4d67;
--primary: #2dd4bf;
--primary-strong: #5eead4;
--primary-soft: #133b3b;
--accent: #fbbf24;
--accent-soft: #3d2e12;
--danger: #fb7185;
--danger-soft: #3d1723;
--shadow: 0 20px 44px rgb(0 0 0 / 0.26);
}
* {
box-sizing: border-box;
}
body {
margin: 0;
background: var(--bg);
color: var(--text);
}
button,
input,
select,
textarea {
font: inherit;
}
button,
select {
cursor: pointer;
}
button:disabled {
cursor: not-allowed;
}
.app-shell {
min-height: 100vh;
background:
linear-gradient(180deg, color-mix(in srgb, var(--surface-muted) 60%, transparent), transparent 360px),
var(--bg);
color: var(--text);
}
.app-header {
position: sticky;
top: 0;
z-index: 20;
display: flex;
min-height: 76px;
align-items: center;
justify-content: space-between;
gap: 20px;
border-bottom: 1px solid var(--border);
background: color-mix(in srgb, var(--surface) 92%, transparent);
padding: 14px clamp(16px, 4vw, 44px);
backdrop-filter: blur(18px);
}
.brand-block,
.header-actions,
.clip-actions,
.metric-row,
.editor-topbar,
.panel-heading,
.toolbar-select,
.mode-pill,
.status-pill,
.icon-button,
.ghost-button,
.primary-button,
.inspector-actions a,
.inspector-actions button {
display: flex;
align-items: center;
}
.brand-block {
min-width: 0;
gap: 12px;
}
.brand-mark {
display: grid;
width: 44px;
height: 44px;
flex: 0 0 auto;
place-items: center;
border-radius: var(--radius);
background: #020617;
color: white;
}
.brand-block h1,
.panel-heading h2,
.editor-topbar h2,
.mini-transcript h3 {
margin: 0;
color: var(--text);
letter-spacing: 0;
}
.brand-block h1 {
font-size: 1.2rem;
font-weight: 800;
}
.brand-block p,
.panel-heading p,
.helper-text,
.file-name {
margin: 2px 0 0;
color: var(--text-muted);
font-size: 0.86rem;
line-height: 1.5;
}
.header-actions {
flex-wrap: wrap;
justify-content: flex-end;
gap: 8px;
}
.mode-pill,
.status-pill {
min-height: 34px;
border-radius: 999px;
border: 1px solid var(--border);
padding: 0 10px;
color: var(--text-muted);
font-size: 0.76rem;
font-weight: 800;
text-transform: uppercase;
}
.mode-pill.prod,
.status-pill.completed {
border-color: color-mix(in srgb, var(--primary) 50%, var(--border));
background: var(--primary-soft);
color: var(--primary-strong);
}
.mode-pill.demo,
.status-pill.running,
.status-pill.queued {
border-color: color-mix(in srgb, #0ea5e9 45%, var(--border));
background: color-mix(in srgb, #e0f2fe 70%, var(--surface));
color: #0369a1;
}
:root[data-theme="dark"] .mode-pill.demo,
:root[data-theme="dark"] .status-pill.running,
:root[data-theme="dark"] .status-pill.queued {
background: #102a3d;
color: #7dd3fc;
}
.status-pill.failed {
border-color: color-mix(in srgb, var(--danger) 50%, var(--border));
background: var(--danger-soft);
color: var(--danger);
}
.toolbar-select,
.icon-button,
.ghost-button,
.clip-actions button,
.download-button,
.inspector-actions a,
.inspector-actions button {
min-height: 36px;
justify-content: center;
gap: 8px;
border: 1px solid var(--border);
border-radius: 7px;
background: var(--surface);
color: var(--text);
text-decoration: none;
}
.toolbar-select {
padding: 0 8px;
background: var(--surface);
}
.toolbar-select select {
min-width: 52px;
border: 0;
background: var(--surface);
color: var(--text);
-webkit-text-fill-color: var(--text);
outline: none;
}
.toolbar-select select option,
.text-input option {
background: #ffffff;
color: #111827;
}
:root[data-theme="dark"] .toolbar-select select option,
:root[data-theme="dark"] .text-input option {
background: #111827;
color: #f8fafc;
}
.icon-button {
width: 36px;
padding: 0;
}
.workspace-grid {
display: grid;
grid-template-columns: minmax(320px, 420px) minmax(0, 1fr);
gap: 14px;
align-items: start;
padding: 18px clamp(16px, 3vw, 40px) 36px;
}
.center-column,
.results-column,
.form-stack {
display: grid;
align-content: start;
gap: 16px;
}
.panel {
border: 1px solid var(--border);
border-radius: var(--radius);
background: color-mix(in srgb, var(--surface) 96%, transparent);
box-shadow: var(--shadow);
}
.input-panel,
.progress-panel,
.transcript-panel,
.clips-panel,
.editor-main,
.inspector-panel {
padding: 18px;
}
.input-panel {
position: static;
overflow: visible;
}
.results-column {
grid-column: 1 / -1;
}
.panel-heading {
justify-content: space-between;
gap: 12px;
}
.panel-heading.compact {
margin-bottom: 12px;
}
.panel-heading h2,
.editor-topbar h2,
.mini-transcript h3 {
font-size: 0.92rem;
font-weight: 850;
text-transform: uppercase;
}
.divider {
height: 1px;
background: var(--border);
}
.form-grid-two {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
gap: 12px;
}
.field-block {
display: grid;
gap: 6px;
}
.field-label {
color: var(--text);
font-size: 0.82rem;
font-weight: 750;
}
.text-input,
.file-input,
textarea,
.timeline input {
width: 100%;
border: 1px solid var(--border-strong);
border-radius: 7px;
background: var(--surface);
color: var(--text);
outline: none;
}
.text-input,
.file-input {
min-height: 42px;
padding: 9px 11px;
}
textarea {
resize: vertical;
padding: 10px 11px;
line-height: 1.5;
}
.text-input:focus,
.file-input:focus,
textarea:focus,
.timeline input:focus {
border-color: var(--primary);
box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary) 18%, transparent);
}
.segmented {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 4px;
border-radius: var(--radius);
background: var(--surface-muted);
padding: 4px;
}
.segmented button {
display: flex;
min-height: 40px;
align-items: center;
justify-content: center;
gap: 8px;
border: 0;
border-radius: 6px;
background: transparent;
color: var(--text-muted);
}
.segmented button.active {
background: var(--surface);
color: var(--text);
box-shadow: 0 1px 2px rgb(15 23 42 / 0.10);
}
.primary-button {
min-height: 44px;
justify-content: center;
gap: 10px;
border: 1px solid var(--primary-strong);
border-radius: 7px;
background: var(--primary-strong);
color: white;
font-weight: 850;
}
:root[data-theme="dark"] .primary-button {
color: #042f2e;
}
.primary-button:disabled {
opacity: 0.55;
}
.progress-percent {
color: var(--text);
font-size: 2rem;
font-variant-numeric: tabular-nums;
}
.progress-track {
height: 12px;
overflow: hidden;
border-radius: 999px;
background: var(--surface-strong);
margin-top: 16px;
}
.progress-bar {
height: 100%;
border-radius: 999px;
background: linear-gradient(90deg, var(--primary), var(--accent));
transition: width 260ms ease;
}
.step-list {
display: grid;
grid-template-columns: repeat(6, minmax(0, 1fr));
gap: 8px;
margin-top: 16px;
}
.step-item {
display: grid;
gap: 6px;
min-width: 0;
color: var(--text-soft);
font-size: 0.75rem;
font-weight: 750;
}
.step-item span {
display: grid;
width: 28px;
height: 28px;
place-items: center;
border: 1px solid var(--border);
border-radius: 999px;
background: var(--surface);
font-variant-numeric: tabular-nums;
}
.step-item p {
margin: 0;
overflow-wrap: anywhere;
}
.step-item.done,
.step-item.active {
color: var(--text);
}
.step-item.done span,
.step-item.active span {
border-color: var(--primary);
background: var(--primary-soft);
color: var(--primary-strong);
}
.timing-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
gap: 10px;
margin-top: 16px;
}
.timing-grid div {
border: 1px solid var(--border);
border-radius: 7px;
background: var(--surface-muted);
padding: 10px;
}
.timing-grid span,
.inspector-list dt,
.cue-row span,
.transcript-row span,
.mini-transcript span {
color: var(--text-muted);
font-size: 0.76rem;
font-weight: 750;
}
.timing-grid strong {
display: block;
margin-top: 4px;
color: var(--text);
font-size: 1.02rem;
font-variant-numeric: tabular-nums;
}
.transcript-list {
display: grid;
max-height: 420px;
overflow: auto;
gap: 8px;
padding-right: 6px;
}
.transcript-row {
display: grid;
grid-template-columns: 112px 1fr;
gap: 12px;
border-bottom: 1px solid var(--border);
padding-bottom: 8px;
}
.transcript-row p,
.mini-transcript p {
margin: 0;
color: var(--text);
font-size: 0.9rem;
line-height: 1.55;
}
.empty-state {
display: grid;
min-height: 280px;
place-items: center;
align-content: center;
gap: 10px;
border: 1px dashed var(--border-strong);
border-radius: var(--radius);
background: var(--surface-muted);
color: var(--text-muted);
text-align: center;
}
.empty-state h3 {
margin: 0;
color: var(--text);
font-size: 1rem;
}
.empty-state p {
max-width: 270px;
margin: 0;
line-height: 1.5;
}
.clip-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
gap: 14px;
align-items: start;
}
.clip-card {
overflow: hidden;
border: 1px solid var(--border);
border-radius: var(--radius);
background: var(--surface-muted);
min-width: 0;
}
.clip-video {
display: grid;
aspect-ratio: 9 / 16;
max-height: 300px;
place-items: center;
background: #050b16;
color: white;
}
.clip-video video {
width: 100%;
height: 100%;
object-fit: contain;
}
.clip-body {
display: grid;
gap: 12px;
padding: 13px;
}
.clip-title-row {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 10px;
}
.clip-title-row h3 {
margin: 0;
color: var(--text);
font-size: 0.96rem;
font-weight: 850;
line-height: 1.35;
}
.clip-title-row p {
margin: 5px 0 0;
color: var(--text-muted);
font-size: 0.82rem;
line-height: 1.45;
}
.score {
display: inline-flex;
min-width: 52px;
min-height: 34px;
flex: 0 0 auto;
align-items: center;
justify-content: center;
gap: 5px;
border-radius: 7px;
background: var(--accent-soft);
color: var(--accent);
font-weight: 900;
}
.metric-row {
justify-content: space-between;
gap: 8px;
color: var(--text-muted);
font-size: 0.8rem;
font-weight: 750;
}
.metric-row span {
display: inline-flex;
align-items: center;
gap: 5px;
}
.clip-actions {
display: grid;
grid-template-columns: minmax(0, 1fr) auto auto auto auto;
gap: 8px;
}
.clip-actions button,
.download-button {
min-width: 38px;
padding: 0 10px;
white-space: nowrap;
}
.clip-actions button:not(.action-primary):not(.action-approve),
.download-button {
width: 38px;
padding: 0;
}
.clip-actions .action-approve {
min-width: 92px;
}
.subtitle-snippet {
display: -webkit-box;
min-height: 54px;
margin: 0;
overflow: hidden;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
border: 1px solid var(--border);
border-radius: 7px;
background: var(--surface);
color: var(--text);
font-size: 0.84rem;
line-height: 1.45;
padding: 10px;
}
.download-button {
margin-left: auto;
border-color: var(--primary);
background: var(--primary);
color: white;
}
:root[data-theme="dark"] .download-button {
color: #042f2e;
}
.editor-shell {
display: grid;
gap: 14px;
padding: 18px clamp(16px, 3vw, 40px) 32px;
}
.editor-topbar {
justify-content: space-between;
gap: 18px;
}
.editor-topbar > div {
flex: 1;
}
.editor-topbar p {
margin: 4px 0 0;
color: var(--text-muted);
}
.ghost-button {
padding: 0 12px;
}
.editor-grid {
display: grid;
grid-template-columns: 74px minmax(0, 1fr) minmax(330px, 420px);
gap: 14px;
align-items: start;
}
.tool-rail {
position: sticky;
top: 96px;
display: grid;
gap: 8px;
border: 1px solid var(--border);
border-radius: var(--radius);
background: color-mix(in srgb, var(--surface) 96%, transparent);
padding: 8px;
box-shadow: var(--shadow);
}
.tool-rail button {
display: grid;
min-height: 58px;
place-items: center;
gap: 4px;
border: 1px solid transparent;
border-radius: 7px;
background: transparent;
color: var(--text-muted);
font-size: 0.68rem;
font-weight: 800;
}
.tool-rail button.active,
.tool-rail button:hover {
border-color: color-mix(in srgb, var(--primary) 45%, var(--border));
background: var(--primary-soft);
color: var(--primary-strong);
}
.editor-main,
.inspector-panel {
display: grid;
gap: 16px;
}
.editor-preview {
display: grid;
position: relative;
min-height: 520px;
max-height: 68vh;
overflow: hidden;
place-items: center;
border-radius: var(--radius);
background: #050b16;
color: white;
}
.editor-preview video {
width: 100%;
height: 100%;
max-height: 68vh;
object-fit: contain;
}
.caption-preview {
position: absolute;
left: 50%;
width: min(82%, 760px);
transform: translateX(-50%);
color: white;
font-weight: 900;
letter-spacing: 0;
line-height: 1.08;
text-align: center;
text-transform: none;
pointer-events: none;
}
.caption-preview .lit {
color: var(--accent);
}
.caption-preview.pop {
animation: caption-pop 900ms ease-in-out infinite alternate;
}
.caption-preview.bounce {
animation: caption-bounce 760ms ease-in-out infinite alternate;
}
@keyframes caption-pop {
from {
transform: translateX(-50%) scale(0.98);
}
to {
transform: translateX(-50%) scale(1.04);
}
}
@keyframes caption-bounce {
from {
transform: translateX(-50%) translateY(0);
}
to {
transform: translateX(-50%) translateY(-8px);
}
}
.range-editor,
.subtitle-editor,
.timeline-workbench,
.caption-style-panel {
display: grid;
gap: 12px;
border: 1px solid var(--border);
border-radius: var(--radius);
background: var(--surface-muted);
padding: 14px;
}
.timeline-visual {
position: relative;
height: 54px;
overflow: hidden;
border-radius: 7px;
background: var(--surface);
border: 1px solid var(--border);
}
.timeline-fill {
position: absolute;
inset: 21px 14px;
border-radius: 999px;
background: var(--surface-strong);
}
.timeline-window {
position: absolute;
top: 14px;
height: 26px;
border: 2px solid var(--primary);
border-radius: 999px;
background: color-mix(in srgb, var(--primary) 24%, transparent);
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--primary) 35%, transparent);
}
.timeline-window::before,
.timeline-window::after {
position: absolute;
top: 4px;
width: 2px;
height: 14px;
border-radius: 999px;
background: var(--primary-strong);
content: "";
}
.timeline-window::before {
left: 8px;
}
.timeline-window::after {
right: 8px;
}
.timeline-visual span {
position: absolute;
top: 18px;
width: 1px;
height: 18px;
background: var(--border-strong);
}
.timeline {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) 82px;
align-items: end;
gap: 10px;
}
.editor-toolbox {
display: flex;
flex-wrap: wrap;
gap: 8px;
align-items: center;
}
.editor-toolbox span {
margin-right: 2px;
color: var(--text);
font-size: 0.82rem;
font-weight: 850;
}
.editor-toolbox button {
min-height: 34px;
border: 1px solid var(--border);
border-radius: 7px;
background: var(--surface);
color: var(--text);
padding: 0 10px;
font-size: 0.82rem;
font-weight: 750;
}
.editor-toolbox button:hover {
border-color: var(--primary);
}
.range-sliders {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
gap: 12px;
}
.range-sliders label {
display: grid;
gap: 6px;
color: var(--text-muted);
font-size: 0.76rem;
font-weight: 800;
}
.range-sliders input[type="range"] {
width: 100%;
accent-color: var(--primary);
}
.timeline label {
display: grid;
gap: 5px;
color: var(--text-muted);
font-size: 0.76rem;
font-weight: 800;
}
.timeline input {
min-height: 38px;
padding: 7px 9px;
}
.timeline strong {
min-height: 38px;
border-radius: 7px;
background: var(--surface-strong);
padding: 9px 8px;
color: var(--text);
text-align: center;
font-variant-numeric: tabular-nums;
}
.track-stack {
display: grid;
gap: 8px;
}
.track-row {
display: grid;
grid-template-columns: 92px minmax(0, 1fr);
gap: 10px;
align-items: center;
}
.track-row > span {
color: var(--text-muted);
font-size: 0.75rem;
font-weight: 850;
}
.track-lane {
position: relative;
min-height: 42px;
overflow: hidden;
border: 1px solid var(--border);
border-radius: 7px;
background:
repeating-linear-gradient(
90deg,
transparent 0,
transparent 11.8%,
color-mix(in srgb, var(--border) 70%, transparent) 12%,
transparent 12.2%
),
var(--surface);
}
.track-clip {
position: absolute;
top: 7px;
bottom: 7px;
display: flex;
min-width: 54px;
align-items: center;
overflow: hidden;
border-radius: 6px;
color: #042f2e;
font-size: 0.72rem;
font-weight: 850;
padding: 0 8px;
text-overflow: ellipsis;
white-space: nowrap;
}
.track-clip.video {
background: linear-gradient(90deg, #5eead4, #22c55e);
}
.track-clip.subtitle {
background: #fde68a;
color: #422006;
}
.waveform {
position: absolute;
inset: 8px 10px;
display: flex;
align-items: center;
gap: 4px;
}
.waveform span {
width: 4px;
border-radius: 999px;
background: color-mix(in srgb, var(--primary) 70%, var(--text-soft));
}
.cue-list {
display: grid;
gap: 10px;
}
.cue-row {
display: grid;
grid-template-columns: 112px minmax(0, 1fr);
gap: 10px;
align-items: start;
}
.inspector-list {
display: grid;
gap: 12px;
margin: 0;
}
.inspector-list div {
border-bottom: 1px solid var(--border);
padding-bottom: 10px;
}
.inspector-list dd {
margin: 4px 0 0;
color: var(--text);
line-height: 1.45;
}
.inspector-actions {
display: grid;
gap: 8px;
}
.inspector-actions a,
.inspector-actions button {
min-height: 40px;
padding: 0 12px;
}
.inspector-actions .danger {
border-color: color-mix(in srgb, var(--danger) 45%, var(--border));
background: var(--danger-soft);
color: var(--danger);
}
.caption-style-panel {
background: color-mix(in srgb, var(--surface-muted) 92%, var(--surface));
}
.preset-row {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 8px;
}
.preset-row button {
min-height: 36px;
border: 1px solid var(--border);
border-radius: 7px;
background: var(--surface);
color: var(--text);
font-weight: 800;
}
.style-grid,
.color-grid {
display: grid;
gap: 10px;
}
.color-grid {
grid-template-columns: 1fr 1fr;
}
.color-field,
.range-control {
display: grid;
gap: 7px;
}
.color-field span,
.range-control span {
display: flex;
justify-content: space-between;
color: var(--text-muted);
font-size: 0.76rem;
font-weight: 800;
}
.range-control strong {
color: var(--text);
font-variant-numeric: tabular-nums;
}
.color-field input {
width: 100%;
height: 38px;
border: 1px solid var(--border);
border-radius: 7px;
background: var(--surface);
padding: 4px;
}
.range-control input {
width: 100%;
accent-color: var(--primary);
}
.mini-transcript {
display: grid;
gap: 10px;
border-top: 1px solid var(--border);
padding-top: 14px;
}
.mini-transcript div {
display: grid;
gap: 4px;
}
.error-box {
border: 1px solid color-mix(in srgb, var(--danger) 45%, var(--border));
border-radius: 7px;
background: var(--danger-soft);
padding: 10px;
color: var(--danger);
font-size: 0.9rem;
line-height: 1.45;
}
.spin {
animation: spin 0.9s linear infinite;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
@media (max-width: 1260px) {
.workspace-grid {
grid-template-columns: minmax(290px, 340px) minmax(0, 1fr);
}
.editor-grid {
grid-template-columns: 64px minmax(0, 1fr);
}
.inspector-panel {
grid-column: 1 / -1;
}
.results-column {
grid-column: 1 / -1;
}
.clip-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-width: 900px) {
.app-header,
.editor-topbar {
align-items: flex-start;
flex-direction: column;
}
.workspace-grid,
.editor-grid {
grid-template-columns: 1fr;
}
.tool-rail {
position: static;
display: flex;
overflow-x: auto;
}
.tool-rail button {
min-width: 72px;
}
.input-panel {
position: static;
max-height: none;
}
.clip-grid {
grid-template-columns: 1fr;
}
.step-list {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.editor-preview {
min-height: 420px;
}
}
@media (max-width: 620px) {
.form-grid-two,
.range-sliders,
.timeline,
.cue-row,
.track-row,
.transcript-row {
grid-template-columns: 1fr;
}
.color-grid,
.preset-row {
grid-template-columns: 1fr;
}
.progress-percent {
font-size: 1.5rem;
}
.step-list {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}