diff --git a/services/web-ui/public/css/common.css b/services/web-ui/public/css/common.css new file mode 100644 index 0000000..b6ff469 --- /dev/null +++ b/services/web-ui/public/css/common.css @@ -0,0 +1,925 @@ +/* Wild Dragon MAM - Common Styles */ + +/* Color Palette - CSS Custom Properties */ +:root { + --color-bg-primary: #0f0f1e; + --color-bg-secondary: #1a1a2e; + --color-bg-tertiary: #16213e; + --color-bg-hover: #252d48; + + --color-accent-primary: #e94560; + --color-accent-light: #ff5a7e; + --color-accent-dark: #d63050; + + --color-text-primary: #f0f0f0; + --color-text-secondary: #b0b0b0; + --color-text-tertiary: #808080; + + --color-border: #2a3050; + --color-border-light: #3a4060; + + --color-status-ingesting: #f59e0b; + --color-status-processing: #3b82f6; + --color-status-ready: #10b981; + --color-status-error: #ef4444; + --color-status-archived: #6b7280; + + --color-success: #10b981; + --color-warning: #f59e0b; + --color-danger: #ef4444; + --color-info: #3b82f6; + + --spacing-xs: 4px; + --spacing-sm: 8px; + --spacing-md: 16px; + --spacing-lg: 24px; + --spacing-xl: 32px; + + --radius-sm: 4px; + --radius-md: 8px; + --radius-lg: 12px; + + --font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Helvetica Neue', sans-serif; + + --transition-fast: 150ms ease-out; + --transition-normal: 250ms ease-out; +} + +/* Reset and Base Styles */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; + font-size: 16px; +} + +body { + background-color: var(--color-bg-primary); + color: var(--color-text-primary); + font-family: var(--font-family); + line-height: 1.5; + letter-spacing: 0.3px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* Typography */ +h1, h2, h3, h4, h5, h6 { + font-weight: 600; + line-height: 1.2; + letter-spacing: -0.5px; +} + +h1 { + font-size: 2rem; +} + +h2 { + font-size: 1.5rem; +} + +h3 { + font-size: 1.25rem; +} + +h4 { + font-size: 1.1rem; +} + +p { + margin-bottom: var(--spacing-md); +} + +a { + color: var(--color-accent-primary); + text-decoration: none; + transition: color var(--transition-fast); +} + +a:hover { + color: var(--color-accent-light); +} + +/* Scrollbar Styling */ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: var(--color-bg-secondary); +} + +::-webkit-scrollbar-thumb { + background: var(--color-bg-tertiary); + border-radius: var(--radius-sm); + border: 2px solid var(--color-bg-secondary); +} + +::-webkit-scrollbar-thumb:hover { + background: var(--color-border-light); +} + +/* Header Bar */ +.header { + display: flex; + align-items: center; + justify-content: space-between; + height: 60px; + background-color: var(--color-bg-secondary); + border-bottom: 1px solid var(--color-border); + padding: 0 var(--spacing-lg); + gap: var(--spacing-lg); + position: sticky; + top: 0; + z-index: 100; +} + +.header-logo { + display: flex; + align-items: center; + gap: var(--spacing-sm); + font-size: 1.1rem; + font-weight: 700; + letter-spacing: 1px; + text-transform: uppercase; + color: var(--color-text-primary); +} + +.header-logo-icon { + display: inline-flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + background: linear-gradient(135deg, var(--color-accent-primary), var(--color-accent-light)); + border-radius: var(--radius-sm); + font-weight: 800; + font-size: 0.9rem; +} + +.header-nav { + display: flex; + gap: var(--spacing-lg); + align-items: center; +} + +.nav-item { + padding: var(--spacing-sm) var(--spacing-md); + color: var(--color-text-secondary); + transition: all var(--transition-fast); + cursor: pointer; + border-bottom: 2px solid transparent; + font-size: 0.95rem; + font-weight: 500; +} + +.nav-item:hover { + color: var(--color-text-primary); +} + +.nav-item.active { + color: var(--color-accent-primary); + border-bottom-color: var(--color-accent-primary); +} + +/* Layout Container */ +.app-container { + display: flex; + flex-direction: column; + height: 100vh; + overflow: hidden; +} + +.main-content { + display: flex; + flex: 1; + overflow: hidden; +} + +.sidebar { + width: 280px; + background-color: var(--color-bg-secondary); + border-right: 1px solid var(--color-border); + overflow-y: auto; + padding: var(--spacing-md); + flex-shrink: 0; +} + +.content-area { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; +} + +.content-main { + flex: 1; + overflow-y: auto; + padding: var(--spacing-lg); +} + +/* Sidebar Sections */ +.sidebar-section { + margin-bottom: var(--spacing-lg); +} + +.sidebar-section-title { + font-size: 0.85rem; + font-weight: 700; + color: var(--color-text-tertiary); + text-transform: uppercase; + letter-spacing: 0.5px; + margin-bottom: var(--spacing-sm); + padding: 0 var(--spacing-sm); +} + +.sidebar-item { + padding: var(--spacing-sm) var(--spacing-md); + margin-bottom: var(--spacing-xs); + background-color: transparent; + border: 1px solid transparent; + border-radius: var(--radius-md); + color: var(--color-text-secondary); + cursor: pointer; + font-size: 0.95rem; + transition: all var(--transition-fast); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.sidebar-item:hover { + background-color: var(--color-bg-hover); + border-color: var(--color-border-light); + color: var(--color-text-primary); +} + +.sidebar-item.active { + background-color: var(--color-bg-tertiary); + border-color: var(--color-accent-primary); + color: var(--color-accent-primary); +} + +.sidebar-tree { + padding-left: var(--spacing-md); +} + +.sidebar-tree-item { + padding: var(--spacing-xs) var(--spacing-sm); + margin-bottom: var(--spacing-xs); + font-size: 0.9rem; + color: var(--color-text-tertiary); + border-left: 2px solid var(--color-border); + border-radius: 0; + cursor: pointer; + transition: all var(--transition-fast); +} + +.sidebar-tree-item:hover { + color: var(--color-text-secondary); + border-left-color: var(--color-accent-primary); +} + +.sidebar-tree-item.active { + color: var(--color-accent-primary); + border-left-color: var(--color-accent-primary); +} + +/* Panels and Cards */ +.panel { + background-color: var(--color-bg-tertiary); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + padding: var(--spacing-md); +} + +.panel-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: var(--spacing-md); + padding-bottom: var(--spacing-md); + border-bottom: 1px solid var(--color-border); +} + +.panel-title { + font-size: 1.1rem; + font-weight: 600; + color: var(--color-text-primary); +} + +.panel-action { + font-size: 0.9rem; + color: var(--color-accent-primary); + cursor: pointer; + transition: color var(--transition-fast); +} + +.panel-action:hover { + color: var(--color-accent-light); +} + +.card { + background-color: var(--color-bg-tertiary); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + padding: 0; + overflow: hidden; + transition: all var(--transition-normal); + cursor: pointer; +} + +.card:hover { + border-color: var(--color-accent-primary); + box-shadow: 0 8px 24px rgba(233, 69, 96, 0.15); + transform: translateY(-2px); +} + +.card-thumbnail { + position: relative; + width: 100%; + padding-bottom: 62.5%; + background-color: var(--color-bg-primary); + overflow: hidden; +} + +.card-thumbnail img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; +} + +.card-content { + padding: var(--spacing-md); +} + +.card-title { + font-size: 0.95rem; + font-weight: 600; + color: var(--color-text-primary); + margin-bottom: var(--spacing-xs); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.card-meta { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: var(--spacing-sm); +} + +.card-duration { + font-size: 0.85rem; + color: var(--color-text-tertiary); +} + +.card-status { + display: inline-block; +} + +/* Buttons */ +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: var(--spacing-sm); + padding: var(--spacing-sm) var(--spacing-md); + border: none; + border-radius: var(--radius-md); + font-size: 0.95rem; + font-weight: 600; + cursor: pointer; + transition: all var(--transition-fast); + text-decoration: none; + white-space: nowrap; + user-select: none; + font-family: var(--font-family); +} + +.btn:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.btn-primary { + background-color: var(--color-accent-primary); + color: white; +} + +.btn-primary:hover:not(:disabled) { + background-color: var(--color-accent-light); + box-shadow: 0 4px 12px rgba(233, 69, 96, 0.3); +} + +.btn-primary:active:not(:disabled) { + background-color: var(--color-accent-dark); +} + +.btn-secondary { + background-color: var(--color-bg-tertiary); + color: var(--color-text-primary); + border: 1px solid var(--color-border); +} + +.btn-secondary:hover:not(:disabled) { + background-color: var(--color-bg-hover); + border-color: var(--color-accent-primary); +} + +.btn-ghost { + background-color: transparent; + color: var(--color-text-secondary); + border: 1px solid transparent; +} + +.btn-ghost:hover:not(:disabled) { + color: var(--color-text-primary); + border-color: var(--color-border-light); +} + +.btn-sm { + padding: var(--spacing-xs) var(--spacing-sm); + font-size: 0.85rem; +} + +.btn-lg { + padding: var(--spacing-md) var(--spacing-lg); + font-size: 1.05rem; + min-height: 44px; +} + +.btn-icon { + padding: var(--spacing-sm); + border-radius: var(--radius-md); +} + +/* Form Elements */ +.form-group { + margin-bottom: var(--spacing-md); +} + +.form-label { + display: block; + margin-bottom: var(--spacing-sm); + font-size: 0.9rem; + font-weight: 600; + color: var(--color-text-secondary); + text-transform: uppercase; + letter-spacing: 0.3px; +} + +.form-input, +.form-select, +.form-textarea { + width: 100%; + padding: var(--spacing-sm) var(--spacing-md); + background-color: var(--color-bg-primary); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + color: var(--color-text-primary); + font-family: var(--font-family); + font-size: 0.95rem; + transition: all var(--transition-fast); +} + +.form-input:focus, +.form-select:focus, +.form-textarea:focus { + outline: none; + border-color: var(--color-accent-primary); + background-color: var(--color-bg-secondary); + box-shadow: 0 0 0 3px rgba(233, 69, 96, 0.1); +} + +.form-input::placeholder { + color: var(--color-text-tertiary); +} + +.form-select { + cursor: pointer; + appearance: none; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%23b0b0b0' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3E%3C/svg%3E"); + background-position: right var(--spacing-sm) center; + background-repeat: no-repeat; + background-size: 1.5em 1.5em; + padding-right: 2.5rem; +} + +.form-textarea { + resize: vertical; + min-height: 100px; + font-family: 'Courier New', monospace; +} + +.form-error { + margin-top: var(--spacing-xs); + font-size: 0.85rem; + color: var(--color-status-error); +} + +/* Status Badges */ +.badge { + display: inline-flex; + align-items: center; + gap: var(--spacing-xs); + padding: 4px 10px; + border-radius: 20px; + font-size: 0.8rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.3px; +} + +.badge-ingesting { + background-color: rgba(245, 158, 11, 0.2); + color: var(--color-status-ingesting); +} + +.badge-processing { + background-color: rgba(59, 130, 246, 0.2); + color: var(--color-status-processing); +} + +.badge-ready { + background-color: rgba(16, 185, 129, 0.2); + color: var(--color-status-ready); +} + +.badge-error { + background-color: rgba(239, 68, 68, 0.2); + color: var(--color-status-error); +} + +.badge-archived { + background-color: rgba(107, 114, 128, 0.2); + color: var(--color-status-archived); +} + +.badge::before { + content: ''; + display: inline-block; + width: 6px; + height: 6px; + border-radius: 50%; + background-color: currentColor; +} + +/* Grid Layout */ +.grid { + display: grid; + gap: var(--spacing-lg); +} + +.grid-2 { + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); +} + +.grid-3 { + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); +} + +.grid-4 { + grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); +} + +/* Search Bar */ +.search-bar { + display: flex; + align-items: center; + gap: var(--spacing-sm); + padding: 0 var(--spacing-md); + background-color: var(--color-bg-secondary); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + margin-bottom: var(--spacing-lg); + height: 44px; + transition: all var(--transition-fast); +} + +.search-bar:focus-within { + border-color: var(--color-accent-primary); + background-color: var(--color-bg-tertiary); + box-shadow: 0 0 0 3px rgba(233, 69, 96, 0.1); +} + +.search-bar input { + flex: 1; + background: transparent; + border: none; + color: var(--color-text-primary); + font-size: 0.95rem; +} + +.search-bar input:focus { + outline: none; +} + +.search-bar input::placeholder { + color: var(--color-text-tertiary); +} + +.search-icon { + color: var(--color-text-tertiary); +} + +/* Bottom Bar / Status Bar */ +.status-bar { + display: flex; + align-items: center; + justify-content: space-between; + height: 50px; + background-color: var(--color-bg-secondary); + border-top: 1px solid var(--color-border); + padding: 0 var(--spacing-lg); + gap: var(--spacing-lg); + flex-shrink: 0; +} + +.status-item { + display: flex; + align-items: center; + gap: var(--spacing-sm); + font-size: 0.9rem; + color: var(--color-text-secondary); +} + +.status-indicator { + display: inline-block; + width: 8px; + height: 8px; + border-radius: 50%; + background-color: var(--color-status-ready); +} + +.status-indicator.disconnected { + background-color: var(--color-status-error); +} + +/* Recording Indicator */ +.recording-indicator { + display: inline-flex; + align-items: center; + gap: var(--spacing-sm); + padding: 4px 10px; + background-color: rgba(239, 68, 68, 0.2); + border-radius: 20px; + font-size: 0.85rem; + color: var(--color-status-error); + font-weight: 600; +} + +.recording-dot { + display: inline-block; + width: 8px; + height: 8px; + border-radius: 50%; + background-color: var(--color-status-error); + animation: pulse 1s infinite; +} + +@keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} + +/* Modal/Overlay */ +.modal-overlay { + display: none; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.6); + z-index: 1000; + animation: fadeIn var(--transition-normal); +} + +.modal-overlay.active { + display: flex; + align-items: center; + justify-content: center; +} + +.modal { + background-color: var(--color-bg-secondary); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + max-width: 600px; + width: 90%; + max-height: 90vh; + overflow-y: auto; + animation: slideUp var(--transition-normal); + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4); +} + +.modal-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--spacing-lg); + border-bottom: 1px solid var(--color-border); +} + +.modal-title { + font-size: 1.25rem; + font-weight: 700; + color: var(--color-text-primary); +} + +.modal-close { + background: none; + border: none; + color: var(--color-text-secondary); + font-size: 1.5rem; + cursor: pointer; + padding: 0; + width: 32px; + height: 32px; + display: flex; + align-items: center; + justify-content: center; + transition: all var(--transition-fast); +} + +.modal-close:hover { + color: var(--color-text-primary); +} + +.modal-body { + padding: var(--spacing-lg); +} + +.modal-footer { + display: flex; + justify-content: flex-end; + gap: var(--spacing-md); + padding: var(--spacing-lg); + border-top: 1px solid var(--color-border); + background-color: var(--color-bg-tertiary); +} + +@keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes slideUp { + from { + transform: translateY(20px); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} + +/* Responsive */ +@media (max-width: 768px) { + .main-content { + flex-direction: column; + } + + .sidebar { + width: 100%; + border-right: none; + border-bottom: 1px solid var(--color-border); + max-height: 150px; + overflow-x: auto; + display: flex; + gap: var(--spacing-lg); + padding: var(--spacing-md); + } + + .sidebar-section { + margin-bottom: 0; + white-space: nowrap; + } + + .grid-2 { + grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); + } + + .header { + flex-wrap: wrap; + height: auto; + padding: var(--spacing-md); + } + + .header-nav { + width: 100%; + order: 3; + } +} + +@media (max-width: 480px) { + :root { + font-size: 14px; + } + + .header { + padding: var(--spacing-sm); + } + + .content-main { + padding: var(--spacing-md); + } + + .grid-2 { + grid-template-columns: 1fr; + } + + .modal { + width: 95%; + } +} + +/* Utilities */ +.hidden { + display: none !important; +} + +.visible { + display: block !important; +} + +.flex { + display: flex; +} + +.flex-col { + flex-direction: column; +} + +.gap-sm { + gap: var(--spacing-sm); +} + +.gap-md { + gap: var(--spacing-md); +} + +.gap-lg { + gap: var(--spacing-lg); +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.mt-sm { margin-top: var(--spacing-sm); } +.mt-md { margin-top: var(--spacing-md); } +.mt-lg { margin-top: var(--spacing-lg); } + +.mb-sm { margin-bottom: var(--spacing-sm); } +.mb-md { margin-bottom: var(--spacing-md); } +.mb-lg { margin-bottom: var(--spacing-lg); } + +.p-sm { padding: var(--spacing-sm); } +.p-md { padding: var(--spacing-md); } +.p-lg { padding: var(--spacing-lg); } + +.opacity-50 { + opacity: 0.5; +} + +.opacity-75 { + opacity: 0.75; +} + +.cursor-pointer { + cursor: pointer; +} + +.truncate { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.no-wrap { + white-space: nowrap; +}