Files
Agent Zero cd465e0564 feat: add MCP server with resources, tools, auth, and Traefik routing
- Add backend/app/mcp_server.py with FastMCP server (hms-cms)
- Resources: design-rules, page-structure, sync-status
- Tools: trigger_sync, get_sync_log, set_rentman_token, read_file,
  write_file, create_page, deploy, git_commit, git_status
- Bearer token auth via MCP_AUTH_TOKEN env var
- Mount MCP at /mcp with streamable HTTP transport
- Integrate session manager in FastAPI lifespan
- Add Traefik labels for external /mcp route on hms.media-on.de
- Add git, docker.io, curl to backend Dockerfile
- Mount repo root + docker socket in backend container
- Add mcp>=1.0.0 to requirements.txt
2026-07-12 15:58:22 +02:00

433 lines
13 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@tailwind base;
@tailwind components;
@tailwind utilities;
/* ============================================
HMS Licht & Ton Design Tokens & Custom CSS
Dark Theme + Subtle Orange Accent
============================================ */
:root {
/* Brand Accent - used sparingly */
--color-accent: #FA5C01;
--color-accent-hover: #d4581a;
--color-accent-light: rgba(236, 105, 37, 0.08);
--color-accent-border: rgba(236, 105, 37, 0.25);
--color-accent-dark: #b8461a;
/* Agent Zero Dark Theme Grays */
--bg: #131313;
--panel: #1a1a1a;
--surface: #212121;
--row: #272727;
--card: #2d2d2d;
--border: #444444a8;
--secondary: #656565;
--primary: #737a81;
--text: #ffffff;
--text-muted: #d4d4d4;
/* Aliases */
--color-bg: var(--bg);
--color-surface: var(--panel);
--color-surface-alt: var(--surface);
--color-card: var(--card);
--color-text: var(--text);
--color-text-muted: var(--text-muted);
--color-text-light: var(--secondary);
--color-border: var(--border);
--color-border-strong: #555555;
--border-strong: #555555;
/* Status Colors */
--color-success: #4ade80;
--color-success-bg: rgba(74, 222, 128, 0.08);
--color-error: #f87171;
--color-error-bg: rgba(248, 113, 113, 0.08);
--color-warning: #fbbf24;
--color-warning-bg: rgba(251, 191, 36, 0.08);
--color-info: #60a5fa;
--color-info-bg: rgba(96, 165, 250, 0.08);
/* Typography */
--font-sans: 'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
--font-heading: 'Inter', system-ui, sans-serif;
--font-mono: 'JetBrains Mono', 'Fira Code', monospace;
--text-xs: 0.75rem;
--text-sm: 0.875rem;
--text-base: 1rem;
--text-lg: 1.125rem;
--text-xl: 1.25rem;
--text-2xl: 1.5rem;
--text-3xl: 1.875rem;
--text-4xl: 2.25rem;
--text-5xl: 3rem;
--text-6xl: 3.75rem;
/* Spacing */
--space-xs: 0.25rem;
--space-sm: 0.5rem;
--space-md: 1rem;
--space-lg: 1.5rem;
--space-xl: 2rem;
--space-2xl: 3rem;
--space-3xl: 4rem;
--space-4xl: 6rem;
/* Radius */
--radius-sm: 2px;
--radius-md: 3px;
--radius-lg: 4px;
--radius-xl: 4px;
--radius-full: 9999px;
/* Shadows */
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.3);
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.4), 0 2px 4px -2px rgb(0 0 0 / 0.3);
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.4), 0 4px 6px -4px rgb(0 0 0 / 0.3);
--shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.5), 0 8px 10px -6px rgb(0 0 0 / 0.3);
/* Transitions */
--transition-fast: 150ms ease;
--transition-base: 250ms ease;
--transition-slow: 400ms ease;
/* Layout */
--header-height: 4rem;
--max-width: 1280px;
}
/* Base Reset */
* { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; }
body {
font-family: var(--font-sans);
color: var(--text);
background-color: var(--bg);
line-height: 1.6;
font-size: var(--text-base);
-webkit-font-smoothing: antialiased;
}
/* Tailwind dark overrides */
.text-gray-900 { color: var(--text) !important; }
.text-gray-800 { color: var(--text-muted) !important; }
.text-gray-700 { color: var(--text-muted) !important; }
.text-gray-600 { color: var(--text-muted) !important; }
.text-gray-500 { color: var(--secondary) !important; }
.text-gray-400 { color: var(--secondary) !important; }
.text-white { color: var(--text) !important; }
.bg-white { background-color: var(--panel) !important; }
.bg-gray-100 { background-color: var(--surface) !important; }
.bg-gray-200 { background-color: var(--row) !important; }
.bg-gray-800 { background-color: var(--bg) !important; }
.bg-gray-900 { background-color: var(--bg) !important; }
.border-gray-200 { border-color: var(--border) !important; }
.border-gray-700 { border-color: var(--border) !important; }
.border-gray-100 { border-color: var(--border) !important; }
.divide-gray-100 > * { border-color: var(--border) !important; }
/* Skip Link */
.skip-link {
position: absolute; top: -100px; left: 0;
background: var(--color-accent); color: white;
padding: var(--space-md) var(--space-lg);
z-index: 9999; border-radius: 0 0 var(--radius-md) 0;
font-weight: 600;
}
.skip-link:focus { top: 0; }
/* Focus visible */
*:focus-visible {
outline: 2px solid var(--color-accent);
outline-offset: 2px;
border-radius: var(--radius-sm);
}
/* Scrollbar */
::-webkit-scrollbar { width: 8px; height: 8px; }
::-webkit-scrollbar-track { background: var(--bg); }
::-webkit-scrollbar-thumb { background: var(--secondary); border-radius: 4px; }
::-webkit-scrollbar-thumb:hover { background: var(--primary); }
/* Component: Header */
.hms-header {
background: var(--panel);
border-bottom: 1px solid var(--border);
position: sticky; top: 0; z-index: 100;
}
.hms-logo-svg { height: 40px; width: auto; }
.hms-logo-svg rect { stroke: var(--color-accent) !important; }
/* Component: Hero with image background, subtle orange */
.hms-hero {
position: relative;
background: var(--bg);
color: var(--text);
overflow: hidden;
}
.hms-hero-bg {
position: absolute;
inset: 0;
background-size: cover;
background-position: center;
opacity: 0.35;
}
.hms-hero-overlay {
position: absolute;
inset: 0;
background: linear-gradient(180deg, rgba(19,19,19,0.6) 0%, rgba(19,19,19,0.85) 50%, var(--bg) 100%);
}
/* Component: Card */
.hms-card {
background: var(--panel);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-sm);
transition: box-shadow var(--transition-base), border-color var(--transition-base);
}
.hms-card:hover {
box-shadow: var(--shadow-lg);
border-color: var(--secondary);
}
/* Component: Button orange only on primary, subtle */
.hms-btn {
display: inline-flex; align-items: center; justify-content: center;
gap: var(--space-sm);
font-family: var(--font-sans); font-weight: 600;
border-radius: var(--radius-md);
transition: all var(--transition-fast);
cursor: pointer; border: none; text-decoration: none;
white-space: nowrap;
}
.hms-btn-primary {
background: var(--color-accent); color: white;
padding: var(--space-md) var(--space-xl);
box-shadow: 0 0 0 0 rgba(236, 105, 37, 0);
}
.hms-btn-primary:hover {
background: var(--color-accent-hover);
box-shadow: 0 0 12px 2px rgba(236, 105, 37, 0.3);
transform: translateY(-1px);
}
.hms-btn-primary:active { transform: translateY(0); box-shadow: 0 0 6px 0px rgba(236, 105, 37, 0.2); }
.hms-btn-primary:disabled { background: var(--secondary); cursor: not-allowed; box-shadow: none; transform: none; }
.hms-btn-secondary {
background: var(--surface); color: var(--text-muted);
border: 1px solid var(--border-strong);
padding: var(--space-md) var(--space-xl);
}
.hms-btn-secondary:hover {
background: var(--row);
border-color: var(--color-accent);
color: var(--text);
box-shadow: 0 0 8px 0 rgba(236, 105, 37, 0.1);
}
.hms-btn-secondary:active { background: var(--surface); box-shadow: none; }
.hms-btn-ghost {
background: transparent; color: var(--text-muted);
padding: var(--space-sm) var(--space-md);
}
.hms-btn-ghost:hover { background: var(--surface); color: var(--color-accent); border-color: var(--color-accent-border); }
/* Component: Nav Button (header menu items) */
.hms-nav-btn {
position: relative;
transition: color var(--transition-fast), background-color var(--transition-fast), border-color var(--transition-fast) !important;
}
.hms-nav-btn:hover {
color: var(--color-accent) !important;
background: var(--color-accent-light) !important;
}
.hms-nav-btn:hover::after {
content: '';
position: absolute;
bottom: 2px; left: 50%;
transform: translateX(-50%);
width: 60%; height: 2px;
background: var(--color-accent);
border-radius: var(--radius-full);
}
.hms-nav-btn[aria-current="page"]:hover {
color: var(--color-accent) !important;
background: var(--color-accent-light) !important;
}
/* Component: Badge subtle orange */
.hms-badge {
display: inline-flex; align-items: center;
padding: 2px var(--space-sm);
border-radius: var(--radius-full);
font-size: var(--text-xs); font-weight: 600;
}
.hms-badge-primary {
background: rgba(236, 105, 37, 0.12);
color: var(--color-accent);
border: 1px solid rgba(236, 105, 37, 0.2);
}
.hms-badge-gray { background: var(--surface); color: var(--text-muted); }
.hms-badge-success { background: var(--color-success-bg); color: var(--color-success); }
.hms-badge-error { background: var(--color-error-bg); color: var(--color-error); }
/* Component: Input */
.hms-input {
width: 100%;
padding: var(--space-md) var(--space-lg);
border: 1px solid var(--border-strong);
border-radius: var(--radius-md);
font-size: var(--text-base);
background: var(--surface); color: var(--text);
transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
}
.hms-input::placeholder { color: var(--secondary); }
.hms-input:focus {
outline: none;
border-color: var(--color-accent);
box-shadow: 0 0 0 2px rgba(236, 105, 37, 0.1);
}
.hms-input:disabled { background: var(--row); color: var(--secondary); cursor: not-allowed; }
.hms-input-error { border-color: var(--color-error); }
.hms-input-error:focus { box-shadow: 0 0 0 2px rgba(248, 113, 113, 0.1); }
select.hms-input { background: var(--surface); color: var(--text); }
select.hms-input option { background: var(--panel); color: var(--text); }
/* Component: Loading Skeleton */
.hms-skeleton {
background: linear-gradient(90deg, var(--surface) 25%, var(--row) 50%, var(--surface) 75%);
background-size: 200% 100%;
animation: skeleton-shimmer 1.5s infinite;
border-radius: var(--radius-md);
}
@keyframes skeleton-shimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
/* Component: Spinner */
.hms-spinner {
width: 24px; height: 24px;
border: 3px solid var(--surface);
border-top-color: var(--color-accent);
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }
/* Component: Service Icon Circle subtle, no large orange area */
.hms-icon-circle {
width: 48px; height: 48px;
border-radius: var(--radius-md);
background: var(--surface);
border: 1px solid var(--border);
color: var(--text-muted);
display: flex; align-items: center; justify-content: center;
font-size: 1.25rem; flex-shrink: 0;
}
/* Component: Speaker Grid */
.hms-speaker-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
gap: var(--space-md);
}
.hms-speaker-item {
background: var(--panel);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: var(--space-lg);
text-align: center;
transition: all var(--transition-base);
}
.hms-speaker-item:hover {
border-color: var(--color-accent-border);
background: var(--surface);
}
.hms-speaker-icon-wrap { display: inline-flex; align-items: center; justify-content: center; margin: 0 auto var(--space-sm); }
.hms-speaker-icon-wrap svg { width: 48px; height: 48px; color: var(--text-muted); transition: color var(--transition-base); }
.hms-speaker-item:hover .hms-speaker-icon-wrap svg { color: var(--color-accent); }
.hms-speaker-name {
font-size: var(--text-sm);
font-weight: 600;
color: var(--text);
margin-bottom: 2px;
}
.hms-speaker-type {
font-size: var(--text-xs);
color: var(--secondary);
}
/* Component: Footer */
.hms-footer {
background: var(--bg);
color: var(--text-muted);
border-top: 1px solid var(--border);
}
/* Gallery Grid */
.hms-gallery {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: var(--space-lg);
}
/* Equipment Card */
.hms-eq-card {
background: var(--panel);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
overflow: hidden;
transition: all var(--transition-base);
cursor: pointer;
}
.hms-eq-card:hover {
border-color: var(--color-accent-border);
box-shadow: var(--shadow-lg);
transform: translateY(-2px);
}
/* Filter Chip */
.hms-chip {
display: inline-flex; align-items: center; gap: var(--space-xs);
padding: var(--space-sm) var(--space-md);
border-radius: var(--radius-full);
font-size: var(--text-sm); font-weight: 500;
cursor: pointer;
border: 1px solid var(--border-strong);
background: var(--surface); color: var(--text-muted);
transition: all var(--transition-fast);
}
.hms-chip:hover { border-color: var(--secondary); }
.hms-chip.active {
background: var(--color-accent); color: white;
border-color: var(--color-accent);
}
/* Section divider subtle */
.hms-section-divider {
height: 1px;
background: linear-gradient(90deg, transparent 0%, var(--border) 50%, transparent 100%);
}
/* Mobile Menu Animation */
.mobile-menu-enter-active, .mobile-menu-leave-active { transition: all var(--transition-base); }
.mobile-menu-enter-from, .mobile-menu-leave-to { opacity: 0; transform: translateY(-10px); }
/* Fade Transition */
.fade-enter-active, .fade-leave-active { transition: opacity var(--transition-base); }
.fade-enter-from, .fade-leave-to { opacity: 0; }
/* Link colors */
a { color: var(--color-accent); }
a:hover { color: var(--color-accent-hover); }
/* Responsive */
@media (max-width: 768px) {
:root { --header-height: 3.5rem; }
.hms-speaker-grid { grid-template-columns: repeat(2, 1fr); }
}