booth-musicgpt/static/css/booth.css

1131 lines
23 KiB
CSS

:root {
/* Brand colors sampled from Trollgorithm_booth.jpg */
--booth-gold: #e0a040;
--booth-gold-light: #f2c46d;
--booth-amber: #805030;
--booth-amber-dark: #5a3520;
/* Surfaces */
--bg-base: #0b0f17;
--bg-page: #111827;
--bg-panel: #1f2937;
--bg-input: #111827;
--bg-hover: #2d3748;
/* Text */
--text-primary: #f3f4f6;
--text-secondary: #9ca3af;
--text-muted: #6b7280;
--text-link: #93c5fd;
--text-link-hover: #bfdbfe;
/* Accents */
--accent: var(--booth-gold);
--accent-hover: var(--booth-gold-light);
--accent-text: #0b0f17;
--accent-subtle: rgba(224, 160, 64, 0.12);
/* Semantic */
--success: #10b981;
--success-bg: rgba(16, 185, 129, 0.12);
--warning: #f59e0b;
--warning-bg: rgba(245, 158, 11, 0.12);
--danger: #ef4444;
--danger-bg: rgba(239, 68, 68, 0.12);
--info: #60a5fa;
--info-bg: rgba(96, 165, 250, 0.12);
/* Borders */
--border: #374151;
--border-subtle: rgba(55, 65, 81, 0.6);
/* Spacing */
--space-1: 0.25rem;
--space-2: 0.5rem;
--space-3: 0.75rem;
--space-4: 1rem;
--space-5: 1.25rem;
--space-6: 1.5rem;
--space-8: 2rem;
--space-10: 2.5rem;
--space-12: 3rem;
/* Radius */
--radius-sm: 0.375rem;
--radius-md: 0.5rem;
--radius-lg: 0.75rem;
--radius-xl: 1rem;
--radius-full: 9999px;
/* Typography */
--font-display: "Outfit", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
--font-body: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
--font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
/* Shadows */
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.2);
--shadow-md: 0 4px 12px rgba(0, 0, 0, 0.25);
--shadow-lg: 0 10px 32px rgba(0, 0, 0, 0.35);
/* Transitions */
--transition-fast: 120ms ease;
--transition-base: 200ms ease;
}
/* ---------------------------------------------
Base reset (scope to booth pages)
--------------------------------------------- */
.booth-page {
margin: 0;
padding: 0;
font-family: var(--font-body);
background: var(--bg-base);
color: var(--text-primary);
line-height: 1.5;
min-height: 100vh;
}
.booth-page *,
.booth-page *::before,
.booth-page *::after {
box-sizing: border-box;
}
.booth-page img {
max-width: 100%;
display: block;
}
.booth-page a {
color: var(--text-link);
text-decoration: none;
}
.booth-page a:hover {
color: var(--text-link-hover);
text-decoration: underline;
}
/* ---------------------------------------------
Typography
--------------------------------------------- */
.booth-page h1,
.booth-page h2,
.booth-page h3 {
font-family: var(--font-display);
color: var(--accent);
margin-top: 0;
line-height: 1.2;
}
.booth-page h1 { font-size: 1.75rem; }
.booth-page h2 { font-size: 1.35rem; }
.booth-page h3 { font-size: 1.1rem; }
.booth-page .subtitle {
color: var(--text-secondary);
text-align: center;
margin-bottom: var(--space-6);
}
/* ---------------------------------------------
Layout containers
--------------------------------------------- */
.booth-page .container {
max-width: 720px;
margin: 0 auto;
padding: var(--space-6);
}
.booth-page .container-wide {
max-width: 1200px;
}
.booth-page .card {
background: var(--bg-panel);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-xl);
padding: var(--space-6);
box-shadow: var(--shadow-lg);
}
/* ---------------------------------------------
Banner
--------------------------------------------- */
.booth-page .banner {
width: 100%;
border-radius: var(--radius-xl);
box-shadow: var(--shadow-lg);
margin-bottom: var(--space-6);
}
/* ---------------------------------------------
Forms
--------------------------------------------- */
.booth-page label {
display: block;
margin-top: var(--space-4);
font-weight: 600;
color: var(--text-link);
}
.booth-page input[type="text"],
.booth-page input[type="email"],
.booth-page input[type="password"],
.booth-page input[type="number"],
.booth-page input[type="url"],
.booth-page input[type="file"],
.booth-page select,
.booth-page textarea {
width: 100%;
padding: var(--space-3);
border-radius: var(--radius-md);
border: 1px solid var(--border);
background: var(--bg-input);
color: var(--text-primary);
font: inherit;
margin-top: var(--space-1);
transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
}
.booth-page input:focus,
.booth-page select:focus,
.booth-page textarea:focus {
outline: none;
border-color: var(--accent);
box-shadow: 0 0 0 3px var(--accent-subtle);
}
.booth-page textarea {
min-height: 90px;
resize: vertical;
}
.booth-page input[type="checkbox"],
.booth-page input[type="radio"] {
width: auto;
margin: 0;
}
.booth-page .checkbox-label {
display: flex;
align-items: center;
gap: var(--space-2);
margin-top: var(--space-4);
cursor: pointer;
font-weight: 400;
color: var(--text-primary);
}
.booth-page .checkbox-label input {
flex-shrink: 0;
}
.booth-page .required {
color: var(--danger);
}
/* ---------------------------------------------
Buttons
--------------------------------------------- */
.booth-page button,
.booth-page .button,
.booth-page .button-link {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--space-2);
padding: var(--space-3) var(--space-5);
border: none;
border-radius: var(--radius-md);
background: var(--accent);
color: var(--accent-text);
font-weight: 700;
font-size: 1rem;
cursor: pointer;
transition: transform var(--transition-fast), background var(--transition-fast), box-shadow var(--transition-fast);
}
.booth-page button:hover,
.booth-page .button:hover,
.booth-page .button-link:hover {
background: var(--accent-hover);
transform: translateY(-1px);
text-decoration: none;
}
.booth-page button:disabled,
.booth-page .button:disabled {
background: var(--border);
color: var(--text-muted);
cursor: not-allowed;
transform: none;
}
.booth-page .button-secondary {
background: var(--border);
color: var(--text-primary);
}
.booth-page .button-secondary:hover {
background: var(--bg-hover);
}
.booth-page .button-success {
background: var(--success);
color: var(--accent-text);
}
.booth-page .button-success:hover {
background: #34d399;
}
.booth-page .button-danger {
background: var(--danger);
color: #fff;
}
.booth-page .button-danger:hover {
background: #f87171;
}
.booth-page .button-block {
width: 100%;
margin-top: var(--space-6);
}
/* ---------------------------------------------
Flash / status messages
--------------------------------------------- */
.booth-page .flash {
padding: var(--space-3) var(--space-4);
border-radius: var(--radius-md);
margin-bottom: var(--space-4);
background: var(--success-bg);
color: var(--text-primary);
border: 1px solid var(--success);
}
.booth-page .flash.error {
background: var(--danger-bg);
border-color: var(--danger);
}
.booth-page .flash.warning {
background: var(--warning-bg);
border-color: var(--warning);
}
.booth-page .flash.info {
background: var(--info-bg);
border-color: var(--info);
}
/* ---------------------------------------------
Status badges
--------------------------------------------- */
.booth-page .status-badge {
display: inline-flex;
align-items: center;
gap: var(--space-1);
padding: var(--space-1) var(--space-2);
border-radius: var(--radius-full);
font-size: 0.75rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.03em;
background: var(--border);
color: var(--text-primary);
white-space: nowrap;
}
.booth-page .status-badge.ok,
.booth-page .status-badge.delivered,
.booth-page .status-badge.paid {
background: var(--success);
color: var(--accent-text);
}
.booth-page .status-badge.pending,
.booth-page .status-badge.prompt_ready {
background: var(--info);
color: var(--accent-text);
}
.booth-page .status-badge.songs_uploaded {
background: #a78bfa;
color: var(--accent-text);
}
.booth-page .status-badge.awaiting_payment {
background: var(--warning);
color: var(--accent-text);
}
.booth-page .status-badge.revisions_requested,
.booth-page .status-badge.missing,
.booth-page .status-badge.cancelled {
background: var(--danger);
color: #fff;
}
.booth-page .status-badge.sent {
background: var(--info);
color: var(--accent-text);
}
/* ---------------------------------------------
Admin dashboard
--------------------------------------------- */
.booth-page .topbar {
display: flex;
justify-content: space-between;
align-items: center;
gap: var(--space-4);
margin-bottom: var(--space-6);
flex-wrap: wrap;
}
.booth-page .topbar .nav {
display: flex;
gap: var(--space-4);
align-items: center;
}
.booth-page .filters {
display: flex;
gap: var(--space-2);
flex-wrap: wrap;
align-items: center;
margin-bottom: var(--space-4);
}
.booth-page .filters a,
.booth-page .filters .filter-pill {
color: var(--text-link);
text-decoration: none;
padding: var(--space-2) var(--space-3);
border-radius: var(--radius-md);
border: 1px solid transparent;
font-size: 0.9rem;
}
.booth-page .filters a:hover {
background: var(--bg-panel);
}
.booth-page .filters a.active {
font-weight: 700;
color: var(--accent-text);
background: var(--accent);
}
.booth-page .table-wrap {
overflow-x: auto;
border-radius: var(--radius-lg);
border: 1px solid var(--border);
}
.booth-page table {
width: 100%;
border-collapse: collapse;
background: var(--bg-panel);
font-size: 0.92rem;
}
.booth-page th,
.booth-page td {
padding: var(--space-2) var(--space-3);
text-align: left;
border-bottom: 1px solid var(--border);
vertical-align: middle;
}
.booth-page th {
background: var(--bg-page);
color: var(--text-secondary);
font-weight: 600;
font-size: 0.8rem;
text-transform: uppercase;
letter-spacing: 0.04em;
}
.booth-page tr:hover {
background: var(--bg-hover);
}
.booth-page .table-actions {
display: flex;
gap: var(--space-2);
align-items: center;
flex-wrap: wrap;
}
.booth-page .table-actions a,
.booth-page .table-actions button {
padding: var(--space-1) var(--space-2);
font-size: 0.8rem;
}
.booth-page .refresh-hint {
color: var(--text-muted);
font-size: 0.85rem;
margin-left: auto;
}
/* ---------------------------------------------
Admin request detail page
--------------------------------------------- */
.booth-page .section {
background: var(--bg-panel);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-lg);
padding: var(--space-5);
margin-bottom: var(--space-4);
}
.booth-page .section h2 {
margin-bottom: var(--space-3);
}
.booth-page .section h3 {
color: var(--accent);
font-size: 1rem;
margin-bottom: var(--space-2);
}
.booth-page .copy-hint {
font-size: 0.85rem;
color: var(--text-secondary);
margin-top: var(--space-1);
}
.booth-page .actions {
display: flex;
gap: var(--space-2);
flex-wrap: wrap;
margin-top: var(--space-3);
}
.booth-page .actions button,
.booth-page .actions .button,
.booth-page .actions .button-link {
margin-top: 0;
}
.booth-page .two-col {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--space-4);
}
@media (max-width: 900px) {
.booth-page .two-col {
grid-template-columns: 1fr;
}
}
.booth-page .revision-note {
background: var(--danger-bg);
border: 1px solid var(--danger);
border-radius: var(--radius-md);
padding: var(--space-4);
margin-top: var(--space-4);
}
.booth-page .revision-note h3 {
color: var(--danger);
margin-top: 0;
}
.booth-page .song-row {
display: flex;
align-items: flex-start;
gap: var(--space-3);
margin: var(--space-2) 0;
padding: var(--space-2) 0;
}
.booth-page .song-row input[type="checkbox"],
.booth-page .song-row input[type="radio"] {
margin-top: 0.2rem;
}
.booth-page .song-row label {
margin: 0;
font-weight: 400;
line-height: 1.4;
flex: 1;
}
.booth-page .file-select {
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: var(--radius-md);
padding: var(--space-2) var(--space-3);
margin: var(--space-2) 0;
}
.booth-page .file-select input {
width: auto;
margin-right: var(--space-2);
}
.booth-page .file-select label {
display: inline;
margin: 0;
font-weight: 400;
}
.booth-page .old-rev {
font-size: 0.8rem;
color: var(--text-muted);
margin-left: 1.6rem;
}
.booth-page .approved-box {
font-size: 1.1rem;
font-weight: 800;
color: var(--accent);
}
.booth-page .steps {
display: flex;
list-style: none;
margin: 0;
padding: 0;
gap: var(--space-1);
align-items: flex-start;
}
.booth-page .step-item {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
flex: 1;
min-width: 70px;
position: relative;
}
.booth-page .step-item:not(:last-child)::after {
content: "";
position: absolute;
top: 0.875rem;
left: 50%;
width: 100%;
height: 2px;
background: var(--border);
z-index: 0;
}
.booth-page .step-item.completed:not(:last-child)::after {
background: var(--success);
}
.booth-page .step-indicator {
width: 1.75rem;
height: 1.75rem;
border-radius: var(--radius-full);
display: flex;
align-items: center;
justify-content: center;
font-size: 0.8rem;
font-weight: 700;
background: var(--border);
color: var(--text-primary);
position: relative;
z-index: 1;
}
.booth-page .step-item.completed .step-indicator {
background: var(--success);
color: var(--accent-text);
}
.booth-page .step-item.current .step-indicator {
background: var(--accent);
color: var(--accent-text);
box-shadow: 0 0 0 3px var(--accent-subtle);
}
.booth-page .step-item.upcoming .step-indicator {
background: var(--border);
color: var(--text-muted);
}
.booth-page .step-label {
font-size: 0.7rem;
margin-top: var(--space-1);
color: var(--text-secondary);
}
.booth-page .step-item.upcoming .step-label {
color: var(--text-muted);
}
.booth-page .history-list {
margin: 0;
padding: 0;
list-style: none;
}
.booth-page .history-list li {
border-bottom: 1px solid var(--border);
padding: var(--space-3) 0;
}
.booth-page .history-list li:last-child {
border-bottom: none;
}
.booth-page .history-list .meta {
font-size: 0.8rem;
color: var(--text-secondary);
}
.booth-page .history-list .note {
margin: var(--space-1) 0 0 0;
}
.booth-page .media-status {
display: flex;
align-items: flex-start;
gap: var(--space-4);
flex-wrap: wrap;
}
.booth-page .cover-col {
flex-shrink: 0;
}
.booth-page .cover-col img {
max-width: 160px;
border-radius: var(--radius-md);
}
.booth-page .status-col {
flex: 1;
min-width: 220px;
}
.booth-page .cover-hint {
font-size: 0.75rem;
color: var(--text-muted);
margin: var(--space-1) 0 0 0;
max-width: 160px;
}
.booth-page .section-nav {
display: flex;
gap: var(--space-1);
flex-wrap: wrap;
margin-bottom: var(--space-4);
}
.booth-page .section-nav a {
padding: var(--space-2) var(--space-3);
border-radius: var(--radius-md);
background: var(--bg-panel);
border: 1px solid var(--border);
font-size: 0.85rem;
font-weight: 600;
color: var(--text-secondary);
}
.booth-page .section-nav a:hover {
background: var(--bg-hover);
color: var(--text-primary);
text-decoration: none;
}
/* ---------------------------------------------
Player page
--------------------------------------------- */
.booth-page .player {
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: var(--space-4);
margin: var(--space-4) 0;
}
.booth-page .player audio {
width: 100%;
margin-top: var(--space-2);
}
.booth-page .lyrics {
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: var(--space-5);
margin: var(--space-4) 0;
line-height: 1.35;
}
.booth-page .lyrics h2 {
margin-top: 0;
margin-bottom: var(--space-4);
color: var(--accent);
font-size: 1.25rem;
}
.booth-page .lyrics .verse {
margin-bottom: var(--space-4);
}
.booth-page .lyrics .verse:last-child {
margin-bottom: 0;
}
.booth-page .lyrics .lyric-line {
display: block;
margin: 0;
padding: 0;
}
.booth-page .locked {
margin-top: var(--space-4);
padding: var(--space-5);
background: var(--bg-input);
border-radius: var(--radius-lg);
border: 1px solid var(--border);
}
.booth-page .locked h2 {
margin-top: 0;
color: var(--accent);
}
/* ---------------------------------------------
Kiosk
--------------------------------------------- */
.booth-page.kiosk-page,
.booth-page.kiosk-page body {
height: 100%;
overflow: hidden;
}
.booth-page.kiosk-page body {
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
padding: 2vh 3vw;
text-align: center;
}
.booth-page .kiosk {
height: 100%;
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
}
.booth-page .kiosk .header {
width: 100%;
}
.booth-page .kiosk-banner {
width: 100%;
max-height: 22vh;
object-fit: contain;
border-radius: var(--radius-xl);
box-shadow: var(--shadow-lg);
}
.booth-page .status-pill {
display: inline-block;
margin-top: 1.5vh;
padding: var(--space-2) var(--space-4);
border-radius: var(--radius-full);
font-weight: 700;
font-size: 1.1rem;
text-transform: uppercase;
letter-spacing: 0.05em;
}
.booth-page .status-pill.open {
background: var(--success);
color: var(--accent-text);
}
.booth-page .status-pill.closed {
background: var(--danger);
color: #fff;
}
.booth-page .stage {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100%;
max-width: 900px;
margin: 2vh 0;
}
.booth-page .slide {
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
animation: fadeIn 0.8s ease;
}
.booth-page .slide > * {
max-width: 100%;
}
.booth-page .slide.hidden {
display: none;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
.booth-page .kiosk h1 {
margin: 0 0 1.5vh 0;
font-size: clamp(2rem, 5vw, 3.5rem);
}
.booth-page .qr-code {
max-height: 44vh;
max-width: 44vh;
width: auto;
border-radius: var(--radius-xl);
box-shadow: var(--shadow-lg);
background: #fff;
padding: var(--space-2);
}
.booth-page .qr-caption {
margin-top: 1.5vh;
font-size: clamp(1.1rem, 2.5vw, 1.6rem);
color: var(--text-link);
}
.booth-page .price-card,
.booth-page .queue-card {
background: var(--bg-panel);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-xl);
padding: 3vh 4vw;
box-shadow: var(--shadow-lg);
width: 100%;
}
.booth-page .queue-card {
max-height: 62vh;
display: flex;
flex-direction: column;
}
.booth-page .price-card h2,
.booth-page .queue-card h2 {
margin: 0 0 2vh 0;
font-size: clamp(1.6rem, 4vw, 2.6rem);
}
.booth-page .price-list,
.booth-page .queue-list {
list-style: none;
margin: 0;
padding: 0;
text-align: left;
}
.booth-page .price-list li,
.booth-page .queue-list li {
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid var(--border-subtle);
padding: 1.2vh 0;
font-size: clamp(1.2rem, 3vw, 1.8rem);
}
.booth-page .price-list li:last-child,
.booth-page .queue-list li:last-child {
border-bottom: none;
}
.booth-page .price-list .label,
.booth-page .queue-list .customer {
color: var(--text-primary);
}
.booth-page .price-list .amount,
.booth-page .queue-list .status {
font-weight: 700;
color: var(--accent);
}
.booth-page .price-empty,
.booth-page .queue-empty {
font-size: 1.3rem;
color: var(--text-secondary);
text-align: center;
}
.booth-page .queue-note {
font-size: 1rem;
color: var(--text-secondary);
margin-top: var(--space-3);
text-align: center;
}
.booth-page .kiosk .footer {
font-size: 1rem;
color: var(--text-muted);
}
.booth-page .dots {
display: flex;
gap: var(--space-2);
justify-content: center;
margin-top: 1vh;
}
.booth-page .dot {
width: 12px;
height: 12px;
border-radius: var(--radius-full);
background: var(--border);
transition: background 0.3s;
}
.booth-page .dot.active {
background: var(--accent);
}
/* ---------------------------------------------
Settings page
--------------------------------------------- */
.booth-page .grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: var(--space-5);
}
@media (max-width: 900px) {
.booth-page .grid {
grid-template-columns: 1fr;
}
}
.booth-page .danger-zone {
grid-column: 1 / -1;
background: var(--danger-bg);
border: 1px solid var(--danger);
border-radius: var(--radius-lg);
padding: var(--space-5);
}
.booth-page .danger-zone h2 {
color: var(--danger);
}
.booth-page .danger-zone button {
background: var(--danger);
}
.booth-page .danger-zone button:hover {
background: #f87171;
}
.booth-page .meta-table {
width: 100%;
border-collapse: collapse;
margin-top: var(--space-2);
}
.booth-page .meta-table td {
padding: var(--space-2);
vertical-align: top;
border-bottom: 1px solid var(--border);
}
.booth-page .meta-table td:first-child {
width: 30%;
font-size: 0.9rem;
color: var(--text-secondary);
padding-left: 0;
}
.booth-page .meta-table td:last-child {
padding-right: 0;
}
.booth-page .meta-table tr:last-child td {
border-bottom: none;
}
.booth-page .meta-table input,
.booth-page .meta-table textarea,
.booth-page .meta-table select {
margin-top: 0;
}
.booth-page .path {
word-break: break-all;
font-family: var(--font-mono);
font-size: 0.85rem;
color: var(--text-secondary);
}
.booth-page .version-tag {
display: inline-block;
background: var(--accent);
color: var(--accent-text);
font-size: 0.85rem;
font-weight: 700;
padding: var(--space-1) var(--space-2);
border-radius: var(--radius-md);
margin-left: var(--space-2);
vertical-align: middle;
}
.booth-page .status-ok {
color: var(--success);
font-weight: 600;
}
.booth-page .status-bad {
color: var(--warning);
font-weight: 600;
}
/* ---------------------------------------------
Utility
--------------------------------------------- */
.booth-page .text-muted { color: var(--text-muted); }
.booth-page .text-secondary { color: var(--text-secondary); }
.booth-page .text-accent { color: var(--accent); }
.booth-page .text-danger { color: var(--danger); }
.booth-page .text-success { color: var(--success); }
.booth-page .mb-0 { margin-bottom: 0; }
.booth-page .mt-0 { margin-top: 0; }
.booth-page .mb-2 { margin-bottom: var(--space-2); }
.booth-page .mt-2 { margin-top: var(--space-2); }
.booth-page .mb-4 { margin-bottom: var(--space-4); }
.booth-page .mt-4 { margin-top: var(--space-4); }
.booth-page .mb-6 { margin-bottom: var(--space-6); }
.booth-page .mt-6 { margin-top: var(--space-6); }
.booth-page .text-center { text-align: center; }
.booth-page .font-mono { font-family: var(--font-mono); }
.booth-page hr.divider {
border: none;
border-top: 1px solid var(--border);
margin: var(--space-4) 0;
}