diff options
Diffstat (limited to 'packages/meshbay-hub/src/meshbay_hub/static/style.css')
| -rw-r--r-- | packages/meshbay-hub/src/meshbay_hub/static/style.css | 802 |
1 files changed, 802 insertions, 0 deletions
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/style.css b/packages/meshbay-hub/src/meshbay_hub/static/style.css new file mode 100644 index 0000000..27e645e --- /dev/null +++ b/packages/meshbay-hub/src/meshbay_hub/static/style.css @@ -0,0 +1,802 @@ +/* MeshBay Web Client — Phase 9.6 */ + +/* ── Theme variables ──────────────────────────────────────────────────────── */ + +:root, .theme-light { + --bg-base: #f8fafc; + --bg-surface: #ffffff; + --bg-raised: #f1f5f9; + --text: #0f172a; + --text-secondary: #475569; + --text-dim: #94a3b8; + --border: #e2e8f0; + --border-focus: #0ea5e9; + --accent: #0ea5e9; + --accent-hover: #0284c7; + --accent-text: #ffffff; + --error: #ef4444; + --error-bg: #fef2f2; + --success: #22c55e; + --nav-bg: #0f172a; + --nav-text: #e2e8f0; + --nav-brand: #38bdf8; + --sidebar-bg: #f1f5f9; + --sidebar-hover: #e2e8f0; + --shadow: 0 1px 3px rgba(0, 0, 0, 0.08); + --shadow-lg: 0 4px 16px rgba(0, 0, 0, 0.1); +} + +.theme-dark { + --bg-base: #0f172a; + --bg-surface: #1e293b; + --bg-raised: #334155; + --text: #f1f5f9; + --text-secondary: #94a3b8; + --text-dim: #64748b; + --border: #334155; + --error-bg: #450a0a; + --nav-bg: #020617; + --sidebar-bg: #1e293b; + --sidebar-hover: #334155; + --shadow: 0 1px 3px rgba(0, 0, 0, 0.3); + --shadow-lg: 0 4px 16px rgba(0, 0, 0, 0.3); +} + +/* ── Reset ────────────────────────────────────────────────────────────────── */ + +*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } + +body { + font-family: system-ui, -apple-system, sans-serif; + background: var(--bg-base); + color: var(--text); + line-height: 1.6; + min-height: 100vh; +} + +a { color: var(--accent); text-decoration: none; } +a:hover { text-decoration: underline; } + +/* ── Navigation ───────────────────────────────────────────────────────────── */ + +.nav { + background: var(--nav-bg); + color: var(--nav-text); + padding: 0 16px; + height: 52px; + display: flex; + align-items: center; + justify-content: space-between; + position: sticky; + top: 0; + z-index: 100; +} + +.nav-left, .nav-right { display: flex; align-items: center; gap: 12px; } + +.nav-brand { + color: var(--nav-brand); + font-weight: 700; + font-size: 1.15em; + text-decoration: none; +} +.nav-brand:hover { text-decoration: none; } + +.nav-hamburger { + display: none; + background: none; + border: none; + color: var(--nav-text); + font-size: 1.4em; + cursor: pointer; + padding: 4px 8px; + line-height: 1; +} + +.nav-user { color: var(--text-dim); font-size: 0.9em; } + +.nav-theme { + background: none; + border: 1px solid rgba(255, 255, 255, 0.15); + color: var(--nav-text); + width: 32px; + height: 32px; + border-radius: 6px; + cursor: pointer; + font-size: 1.1em; + display: flex; + align-items: center; + justify-content: center; +} +.nav-theme:hover { border-color: rgba(255, 255, 255, 0.3); background: none; } + +.nav-btn { + background: rgba(255, 255, 255, 0.1); + color: var(--nav-text); + border: none; + padding: 6px 14px; + border-radius: 6px; + font-size: 0.85em; + cursor: pointer; + text-decoration: none; +} +.nav-btn:hover { background: rgba(255, 255, 255, 0.18); text-decoration: none; } + +/* ── Layout ───────────────────────────────────────────────────────────────── */ + +.layout { display: flex; min-height: calc(100vh - 52px); } + +/* ── Sidebar ──────────────────────────────────────────────────────────────── */ + +.sidebar { + width: 240px; + background: var(--sidebar-bg); + border-right: 1px solid var(--border); + padding: 16px 0; + flex-shrink: 0; + overflow-y: auto; +} + +.sidebar-section { padding: 0 12px; margin-bottom: 24px; } + +.sidebar-heading { + font-size: 0.7em; + text-transform: uppercase; + letter-spacing: 0.06em; + color: var(--text-dim); + padding: 4px 8px; + margin-bottom: 4px; + font-weight: 600; +} + +.sidebar-item { + display: block; + padding: 7px 12px; + border-radius: 6px; + color: var(--text); + text-decoration: none; + font-size: 0.9em; + transition: background 0.12s; +} +.sidebar-item:hover { background: var(--sidebar-hover); text-decoration: none; } +.sidebar-item.active { background: var(--accent); color: var(--accent-text); } + +.sidebar-empty { + padding: 8px 12px; + color: var(--text-dim); + font-size: 0.85em; + font-style: italic; +} + +/* ── Main content ─────────────────────────────────────────────────────────── */ + +.main { + flex: 1; + padding: 24px 32px; + max-width: 960px; + min-width: 0; +} + +.main h2 { font-size: 1.25em; margin-bottom: 16px; } + +.page-message { + color: var(--text-secondary); + margin-bottom: 24px; +} + +/* ── Page center (login / register) ───────────────────────────────────────── */ + +.page-center { + display: flex; + align-items: center; + justify-content: center; + min-height: calc(100vh - 52px); + padding: 24px; +} + +/* ── Cards ────────────────────────────────────────────────────────────────── */ + +.card { + background: var(--bg-surface); + border: 1px solid var(--border); + border-radius: 8px; + padding: 24px; + box-shadow: var(--shadow); +} + +.login-card { width: 100%; max-width: 380px; } +.login-card h2 { text-align: center; margin-bottom: 20px; } +.login-card form { display: flex; flex-direction: column; gap: 12px; } + +.login-footer { + text-align: center; + margin-top: 16px; + font-size: 0.85em; + color: var(--text-dim); +} + +/* ── Form elements ────────────────────────────────────────────────────────── */ + +input[type="text"], +input[type="password"], +input[type="email"] { + padding: 10px 12px; + border: 1px solid var(--border); + border-radius: 6px; + background: var(--bg-base); + color: var(--text); + font-size: 0.95em; + width: 100%; + transition: border-color 0.15s; +} +input:focus { outline: none; border-color: var(--border-focus); } + +button { + padding: 10px 20px; + background: var(--accent); + color: var(--accent-text); + border: none; + border-radius: 6px; + font-size: 0.95em; + cursor: pointer; + transition: background 0.15s; +} +button:hover { background: var(--accent-hover); } +button:disabled { opacity: 0.5; cursor: not-allowed; } + +/* ── Alerts ───────────────────────────────────────────────────────────────── */ + +.error-msg { + background: var(--error-bg); + color: var(--error); + border: 1px solid var(--error); + border-radius: 6px; + padding: 8px 12px; + font-size: 0.85em; +} + +/* ── Group cards (9.7 prep) ───────────────────────────────────────────────── */ + +.group-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); + gap: 16px; +} + +.group-card { + background: var(--bg-surface); + border: 1px solid var(--border); + border-radius: 8px; + padding: 16px; + cursor: pointer; + transition: border-color 0.12s, box-shadow 0.12s; + text-decoration: none; + color: var(--text); + display: block; +} +.group-card:hover { + border-color: var(--accent); + box-shadow: var(--shadow-lg); + text-decoration: none; +} +.group-card h3 { font-size: 1em; margin-bottom: 4px; } + +.badge { + display: inline-block; + background: var(--bg-raised); + color: var(--text-secondary); + padding: 2px 8px; + border-radius: 12px; + font-size: 0.75em; +} + +/* ── Group page header ───────────────────────────────────────────────────── */ + +.group-header { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 16px; +} +.group-header h2 { margin-bottom: 0; } + +.status-badge { + display: inline-block; + padding: 3px 10px; + border-radius: 12px; + font-size: 0.75em; + font-weight: 500; +} +.status-ok { background: #16a34a20; color: var(--success); } +.status-err { background: var(--error-bg); color: var(--error); } +.status-busy { background: var(--bg-raised); color: var(--text-secondary); } + +/* ── Group tabs ──────────────────────────────────────────────────────────── */ + +.group-tabs { + display: flex; + gap: 0; + margin-bottom: 16px; + border-bottom: 2px solid var(--border); +} + +.group-tab { + background: none; + border: none; + border-bottom: 2px solid transparent; + margin-bottom: -2px; + padding: 8px 20px; + color: var(--text-secondary); + font-size: 0.9em; + font-weight: 500; + cursor: pointer; + border-radius: 0; + transition: color 0.12s, border-color 0.12s; +} +.group-tab:hover { color: var(--text); background: none; } +.group-tab.active { + color: var(--accent); + border-bottom-color: var(--accent); +} + +/* ── Chat panel ──────────────────────────────────────────────────────────── */ + +.chat-panel { + display: flex; + flex-direction: column; + height: calc(100vh - 220px); + min-height: 300px; + background: var(--bg-surface); + border: 1px solid var(--border); + border-radius: 8px; + overflow: hidden; +} + +.chat-messages { + flex: 1; + overflow-y: auto; + padding: 16px; + display: flex; + flex-direction: column; + gap: 4px; +} + +.chat-empty { + text-align: center; + color: var(--text-dim); + font-style: italic; + padding: 40px 16px; +} + +.chat-msg { + display: flex; + flex-direction: column; + align-items: flex-start; + max-width: 75%; +} + +.chat-msg-own { + align-self: flex-end; + align-items: flex-end; +} + +.chat-sender { + font-size: 0.72em; + color: var(--text-dim); + margin-bottom: 2px; + padding-left: 10px; + font-weight: 600; +} + +.chat-bubble { + background: var(--bg-raised); + padding: 8px 12px; + border-radius: 12px 12px 12px 4px; + font-size: 0.9em; + line-height: 1.45; + word-break: break-word; + display: inline-flex; + align-items: baseline; + gap: 8px; + flex-wrap: wrap; +} + +.chat-bubble-own { + background: var(--accent); + color: var(--accent-text); + border-radius: 12px 12px 4px 12px; +} + +.chat-text { white-space: pre-wrap; } + +.chat-time { + font-size: 0.65em; + color: var(--text-dim); + white-space: nowrap; + flex-shrink: 0; +} +.chat-bubble-own .chat-time { color: rgba(255, 255, 255, 0.6); } + +.chat-input-row { + display: flex; + gap: 8px; + padding: 12px; + border-top: 1px solid var(--border); + background: var(--bg-base); +} + +.chat-input { + flex: 1; + resize: none; + padding: 8px 12px; + border: 1px solid var(--border); + border-radius: 8px; + background: var(--bg-surface); + color: var(--text); + font-size: 0.9em; + font-family: inherit; + line-height: 1.4; + min-height: 38px; + max-height: 100px; +} +.chat-input:focus { outline: none; border-color: var(--border-focus); } + +.chat-send { + align-self: flex-end; + padding: 8px 16px; + font-size: 0.85em; + border-radius: 8px; + white-space: nowrap; +} + +/* ── File toolbar ────────────────────────────────────────────────────────── */ + +.file-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + margin-bottom: 12px; + flex-wrap: wrap; +} + +.breadcrumbs { + display: flex; + align-items: center; + gap: 2px; + font-size: 0.85em; + min-width: 0; + flex-wrap: wrap; +} +.crumb { + cursor: pointer; + color: var(--accent); + padding: 2px 4px; + border-radius: 4px; +} +.crumb:hover { background: var(--bg-raised); text-decoration: none; } +.crumb-sep { color: var(--text-dim); } + +.file-search { + max-width: 220px; + padding: 6px 10px !important; + font-size: 0.85em !important; +} + +/* ── File table ──────────────────────────────────────────────────────────── */ + +.file-table { + width: 100%; + border-collapse: collapse; + font-size: 0.9em; +} + +.file-table th { + text-align: left; + padding: 8px 12px; + border-bottom: 2px solid var(--border); + color: var(--text-secondary); + font-size: 0.8em; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.04em; + white-space: nowrap; + user-select: none; +} + +.file-table th.sortable { cursor: pointer; } +.file-table th.sortable:hover { color: var(--text); } + +.file-row td { + padding: 8px 12px; + border-bottom: 1px solid var(--border); + vertical-align: middle; +} + +.file-row:hover { background: var(--bg-raised); } +.dir-row { cursor: pointer; } +.dir-row td { font-weight: 500; } + +.file-name { + word-break: break-word; + min-width: 0; +} +.file-size { white-space: nowrap; color: var(--text-secondary); } +.file-type { color: var(--text-dim); } +.file-date { white-space: nowrap; color: var(--text-dim); } +.file-empty { + text-align: center; + padding: 24px 12px !important; + color: var(--text-dim); + font-style: italic; +} + +/* ── Download button + progress ──────────────────────────────────────────── */ + +.dl-btn { + background: none; + border: 1px solid var(--border); + color: var(--accent); + width: 30px; + height: 30px; + border-radius: 6px; + font-size: 0.9em; + padding: 0; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; +} +.dl-btn:hover { background: var(--bg-raised); border-color: var(--accent); } +.dl-btn:disabled { opacity: 0.3; cursor: not-allowed; } + +.dl-bar { + display: flex; + align-items: center; + gap: 12px; + padding: 10px 14px; + background: var(--bg-surface); + border: 1px solid var(--border); + border-radius: 8px; + margin-bottom: 12px; + font-size: 0.85em; +} + +.dl-name { + flex-shrink: 0; + max-width: 200px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-weight: 500; +} + +.dl-progress { + flex: 1; + height: 6px; + background: var(--bg-raised); + border-radius: 3px; + overflow: hidden; +} + +.dl-fill { + height: 100%; + background: var(--accent); + border-radius: 3px; + transition: width 0.2s; +} + +.dl-pct { + flex-shrink: 0; + color: var(--text-secondary); + font-size: 0.85em; + white-space: nowrap; +} + +/* ── Settings page ───────────────────────────────────────────────────────── */ + +.settings-section { + background: var(--bg-surface); + border: 1px solid var(--border); + border-radius: 8px; + padding: 16px 20px; + margin-bottom: 16px; +} + +.settings-heading { + font-size: 0.8em; + text-transform: uppercase; + letter-spacing: 0.04em; + color: var(--text-dim); + font-weight: 600; + margin-bottom: 12px; +} + +.settings-row { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px 0; +} +.settings-row + .settings-row { + border-top: 1px solid var(--border); +} + +.settings-label { + font-size: 0.9em; + color: var(--text); +} + +.settings-value { + font-size: 0.9em; + color: var(--text-secondary); +} + +.settings-select { + padding: 6px 10px; + border: 1px solid var(--border); + border-radius: 6px; + background: var(--bg-base); + color: var(--text); + font-size: 0.9em; + cursor: pointer; + min-width: 120px; +} +.settings-select:focus { outline: none; border-color: var(--border-focus); } + +/* ── Video player overlay ─────────────────────────────────────────────────── */ + +.video-overlay { + position: fixed; + inset: 0; + z-index: 200; + background: rgba(0, 0, 0, 0.92); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.video-top-bar { + position: absolute; + top: 0; + left: 0; + right: 0; + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 20px; + z-index: 210; +} + +.video-title { + color: #e2e8f0; + font-size: 0.9em; + font-weight: 500; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: calc(100% - 60px); +} + +.video-close { + background: rgba(255, 255, 255, 0.12); + border: none; + color: #e2e8f0; + width: 36px; + height: 36px; + border-radius: 50%; + font-size: 1.2em; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} +.video-close:hover { background: rgba(255, 255, 255, 0.25); } + +.video-container { + width: 100%; + max-width: min(90vw, 1280px); + max-height: calc(100vh - 120px); + display: flex; + align-items: center; + justify-content: center; +} + +.video-container video { + width: 100%; + max-height: calc(100vh - 120px); + border-radius: 4px; + outline: none; +} + +.video-loading { + text-align: center; + color: #94a3b8; +} + +.video-loading-label { + margin-bottom: 16px; + font-size: 0.95em; +} + +.video-progress-bar { + width: min(400px, 80vw); + height: 6px; + background: rgba(255, 255, 255, 0.1); + border-radius: 3px; + overflow: hidden; + margin-bottom: 8px; +} + +.video-progress-fill { + height: 100%; + background: var(--accent); + border-radius: 3px; + transition: width 0.15s; +} + +.video-progress-text { + font-size: 0.8em; + color: #64748b; +} + +.video-error { + color: var(--error); + font-size: 0.9em; + text-align: center; + max-width: 400px; +} + +.play-btn { + background: none; + border: 1px solid var(--border); + color: var(--success); + width: 30px; + height: 30px; + border-radius: 6px; + font-size: 0.85em; + padding: 0; + display: inline-flex; + align-items: center; + justify-content: center; + cursor: pointer; + margin-right: 4px; +} +.play-btn:hover { background: var(--bg-raised); border-color: var(--success); } +.play-btn:disabled { opacity: 0.3; cursor: not-allowed; } + +/* ── Overlay (mobile sidebar backdrop) ────────────────────────────────────── */ + +.overlay { + display: none; + position: fixed; + inset: 0; + top: 52px; + background: rgba(0, 0, 0, 0.4); + z-index: 40; +} +.overlay.visible { display: block; } + +/* ── Responsive ───────────────────────────────────────────────────────────── */ + +@media (max-width: 768px) { + .nav-hamburger { display: flex; } + + .sidebar { + position: fixed; + left: -240px; + top: 52px; + height: calc(100vh - 52px); + z-index: 50; + transition: left 0.2s; + box-shadow: none; + } + .sidebar.open { left: 0; box-shadow: var(--shadow-lg); } + + .main { padding: 16px; } + .page-center { padding: 16px; } + .th-type, .td-type { display: none; } + .th-date, .td-date { display: none; } +} |