Files
jontsai_command-center/public/css/dashboard.css

1937 lines
35 KiB
CSS

:root {
--bg: #0d1117;
--card-bg: #161b22;
--card-hover: #1c2128;
--border: #30363d;
--text: #c9d1d9;
--text-muted: #8b949e;
--accent: #58a6ff;
--green: #3fb950;
--yellow: #d29922;
--red: #f85149;
--purple: #a371f7;
--orange: #db6d28;
--sidebar-width: 220px;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
background: var(--bg);
color: var(--text);
min-height: 100vh;
display: flex;
}
/* Buttons */
.btn-primary,
.btn-secondary {
padding: 6px 12px;
border-radius: 6px;
font-size: 0.85rem;
cursor: pointer;
border: 1px solid var(--border);
transition: all 0.15s ease;
}
.btn-primary {
background: var(--accent);
color: #fff;
border-color: var(--accent);
}
.btn-primary:hover {
background: #4c9aed;
border-color: #4c9aed;
}
.btn-secondary {
background: var(--card-bg);
color: var(--text);
}
.btn-secondary:hover {
background: var(--card-hover);
border-color: var(--accent);
}
/* Sidebar */
.sidebar {
width: var(--sidebar-width);
background: var(--card-bg);
border-right: 1px solid var(--border);
height: 100vh;
position: fixed;
top: 0;
left: 0;
display: flex;
flex-direction: column;
z-index: 60;
transition: transform 0.2s ease;
}
.sidebar.collapsed {
width: 56px;
transform: none;
}
.sidebar.collapsed .sidebar-title,
.sidebar.collapsed .nav-section-title,
.sidebar.collapsed .nav-item span:not(.nav-icon),
.sidebar.collapsed .nav-badge,
.sidebar.collapsed .sidebar-footer {
display: none;
}
.sidebar.collapsed .sidebar-header {
justify-content: center;
padding: 16px 8px;
}
.sidebar.collapsed .sidebar-toggle {
margin-left: 0;
}
.sidebar.collapsed .nav-item {
justify-content: center;
padding: 12px;
}
.sidebar.collapsed .nav-icon {
margin: 0;
font-size: 1.2rem;
}
.sidebar.collapsed .nav-section {
margin-bottom: 8px;
}
.sidebar.collapsed .nav-item {
position: relative;
}
.sidebar.collapsed .nav-item::after {
content: attr(data-tooltip);
position: absolute;
left: 100%;
top: 50%;
transform: translateY(-50%);
background: var(--card-bg);
border: 1px solid var(--border);
padding: 6px 12px;
border-radius: 6px;
font-size: 0.8rem;
white-space: nowrap;
opacity: 0;
pointer-events: none;
transition: opacity 0.15s;
margin-left: 8px;
z-index: 100;
}
.sidebar.collapsed .nav-item:hover::after {
opacity: 1;
}
.sidebar-header {
padding: 16px;
border-bottom: 1px solid var(--border);
display: flex;
align-items: center;
gap: 10px;
}
.sidebar-logo {
font-size: 1.3rem;
}
.sidebar-title {
font-size: 0.9rem;
font-weight: 600;
white-space: nowrap;
}
.sidebar-toggle {
margin-left: auto;
background: none;
border: none;
color: var(--text-muted);
cursor: pointer;
padding: 6px;
border-radius: 6px;
font-size: 1rem;
}
.sidebar-toggle:hover {
background: var(--bg);
color: var(--text);
}
.sidebar-nav {
flex: 1;
padding: 12px 8px;
overflow-y: auto;
}
.nav-section {
margin-bottom: 16px;
}
.nav-section-title {
font-size: 0.65rem;
text-transform: uppercase;
color: var(--text-muted);
padding: 8px 12px 4px;
letter-spacing: 0.5px;
}
.nav-item {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 12px;
border-radius: 8px;
cursor: pointer;
font-size: 0.85rem;
color: var(--text-muted);
transition: all 0.15s;
text-decoration: none;
}
.nav-item:hover {
background: var(--bg);
color: var(--text);
}
.nav-item.active {
background: rgba(88, 166, 255, 0.15);
color: var(--accent);
}
.nav-icon {
font-size: 1rem;
width: 20px;
text-align: center;
}
.nav-badge {
margin-left: auto;
background: var(--border);
padding: 2px 8px;
border-radius: 10px;
font-size: 0.7rem;
}
.nav-item.active .nav-badge {
background: rgba(88, 166, 255, 0.3);
}
.sidebar-footer {
padding: 12px;
border-top: 1px solid var(--border);
font-size: 0.7rem;
color: var(--text-muted);
text-align: center;
}
/* Main Content Area */
.main-wrapper {
flex: 1;
margin-left: var(--sidebar-width);
transition: margin-left 0.2s ease;
display: flex;
flex-direction: column;
min-height: 100vh;
}
.main-wrapper.sidebar-collapsed {
margin-left: 56px;
}
/* Header */
header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px 24px;
border-bottom: 1px solid var(--border);
background: var(--card-bg);
position: sticky;
top: 0;
z-index: 50;
}
.header-left {
display: flex;
align-items: center;
gap: 16px;
}
.page-title {
font-size: 1.1rem;
font-weight: 600;
}
.status-pill {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 12px;
background: rgba(63, 185, 80, 0.15);
border-radius: 20px;
font-size: 0.8rem;
color: var(--green);
}
.pulse {
width: 8px;
height: 8px;
background: var(--green);
border-radius: 50%;
animation: pulse 2s infinite;
}
@keyframes pulse {
0%,
100% {
opacity: 1;
}
50% {
opacity: 0.4;
}
}
.status-pill.connected {
background: rgba(63, 185, 80, 0.15);
color: var(--green);
}
.status-pill.disconnected {
background: rgba(248, 81, 73, 0.15);
color: var(--red);
}
.status-pill.connecting {
background: rgba(210, 153, 34, 0.15);
color: var(--yellow);
}
.status-pill.disconnected .pulse {
background: var(--red);
animation: none;
}
.status-pill.connecting .pulse {
background: var(--yellow);
}
/* Activity State Indicators */
@keyframes activity-pulse {
0%,
100% {
transform: scale(1);
opacity: 1;
}
50% {
transform: scale(1.1);
opacity: 0.7;
}
}
@keyframes activity-spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.activity-indicator {
display: inline-flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
border-radius: 50%;
font-size: 0.9rem;
flex-shrink: 0;
}
.activity-indicator.thinking {
animation: activity-pulse 1.5s ease-in-out infinite;
background: rgba(88, 166, 255, 0.15);
}
.activity-indicator.tool {
animation: activity-spin 2s linear infinite;
background: rgba(210, 153, 34, 0.15);
}
.activity-indicator.waiting {
background: rgba(139, 148, 158, 0.15);
}
.activity-indicator.idle {
background: rgba(139, 148, 158, 0.1);
opacity: 0.6;
}
.activity-label {
font-size: 0.65rem;
color: var(--text-muted);
margin-left: 4px;
text-transform: uppercase;
letter-spacing: 0.3px;
}
.activity-wrapper {
display: flex;
align-items: center;
gap: 4px;
}
/* Stats Bar */
.stats-bar {
display: flex;
gap: 12px;
padding: 16px 24px;
background: var(--card-bg);
border-bottom: 1px solid var(--border);
overflow-x: auto;
}
.stat {
display: flex;
flex-direction: column;
align-items: center;
padding: 12px 20px;
background: var(--bg);
border-radius: 8px;
min-width: 100px;
}
.stat-value {
font-size: 1.5rem;
font-weight: 700;
color: var(--accent);
}
.stat-label {
font-size: 0.7rem;
color: var(--text-muted);
text-transform: uppercase;
margin-top: 4px;
}
/* Legend & Filters Bar */
.filters-bar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 24px;
background: var(--bg);
border-bottom: 1px solid var(--border);
flex-wrap: wrap;
gap: 12px;
}
.legend {
display: flex;
gap: 16px;
align-items: center;
}
.legend-title {
font-size: 0.75rem;
color: var(--text-muted);
margin-right: 4px;
}
.legend-item {
display: flex;
align-items: center;
gap: 6px;
font-size: 0.75rem;
color: var(--text-muted);
}
.legend-dot {
width: 10px;
height: 10px;
border-radius: 50%;
}
.legend-dot.live {
background: var(--green);
}
.legend-dot.recent {
background: var(--yellow);
}
.legend-dot.idle {
background: var(--text-muted);
opacity: 0.5;
}
.filters {
display: flex;
gap: 8px;
align-items: center;
}
.filter-label {
font-size: 0.75rem;
color: var(--text-muted);
margin-right: 4px;
}
.filter-btn {
display: flex;
align-items: center;
gap: 5px;
padding: 5px 10px;
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 16px;
font-size: 0.75rem;
color: var(--text-muted);
cursor: pointer;
transition: all 0.15s;
}
.filter-btn:hover {
border-color: var(--accent);
color: var(--text);
}
.filter-btn.active {
background: rgba(88, 166, 255, 0.15);
border-color: var(--accent);
color: var(--accent);
}
.filter-btn .filter-dot {
width: 8px;
height: 8px;
border-radius: 50%;
}
.filter-btn .filter-dot.live {
background: var(--green);
}
.filter-btn .filter-dot.recent {
background: var(--yellow);
}
.filter-btn .filter-dot.idle {
background: var(--text-muted);
}
.filter-count {
background: var(--bg);
padding: 1px 6px;
border-radius: 8px;
font-size: 0.65rem;
}
/* Section Filters (inline with each section) */
.section-filters {
display: flex;
flex-wrap: wrap;
gap: 16px;
padding: 12px 16px;
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 12px;
margin-bottom: 16px;
}
.filter-group {
display: flex;
align-items: center;
gap: 8px;
}
.filter-group .filter-label {
font-size: 0.75rem;
color: var(--text-muted);
white-space: nowrap;
}
.filter-group .filter-btn {
padding: 4px 10px;
font-size: 0.75rem;
}
/* Pagination */
.pagination {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
padding: 16px;
margin-top: 16px;
}
.pagination-btn {
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 8px;
padding: 8px 12px;
color: var(--text);
font-size: 0.85rem;
cursor: pointer;
transition: all 0.2s;
display: flex;
align-items: center;
gap: 4px;
}
.pagination-btn:hover:not(:disabled) {
background: var(--hover-bg);
border-color: var(--accent);
}
.pagination-btn:disabled {
opacity: 0.4;
cursor: not-allowed;
}
.pagination-info {
color: var(--text-muted);
font-size: 0.8rem;
padding: 0 12px;
}
.pagination-pages {
display: flex;
gap: 4px;
}
.pagination-page {
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 6px;
padding: 6px 10px;
color: var(--text-muted);
font-size: 0.8rem;
cursor: pointer;
transition: all 0.2s;
min-width: 32px;
text-align: center;
}
.pagination-page:hover {
background: var(--hover-bg);
}
.pagination-page.active {
background: var(--accent);
color: var(--bg);
border-color: var(--accent);
}
.pagination-ellipsis {
color: var(--text-muted);
padding: 6px 4px;
}
/* Main Content */
main {
padding: 24px;
flex: 1;
}
/* Section */
.section {
margin-bottom: 32px;
scroll-margin-top: 100px;
}
/* Section Headers */
.section-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
}
.section-title {
font-size: 1rem;
font-weight: 600;
color: var(--text-muted);
display: flex;
align-items: center;
gap: 8px;
}
.section-count {
background: var(--border);
padding: 2px 8px;
border-radius: 10px;
font-size: 0.75rem;
}
/* Card Grid */
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 16px;
}
/* Session Card */
.session-card {
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 12px;
padding: 16px;
cursor: pointer;
transition: all 0.15s ease;
position: relative;
overflow: hidden;
}
.session-card.hidden-by-filter {
display: none;
}
.session-card:hover {
background: var(--card-hover);
border-color: var(--accent);
transform: translateY(-2px);
}
.session-card.active {
border-color: var(--green);
box-shadow: 0 0 0 1px var(--green);
}
.session-card.active::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: var(--green);
}
.session-card.recent-active {
border-color: var(--yellow);
}
.session-card.recent-active::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: var(--yellow);
}
.card-header {
display: flex;
align-items: flex-start;
gap: 12px;
margin-bottom: 12px;
}
.card-icon {
width: 40px;
height: 40px;
background: var(--bg);
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.3rem;
flex-shrink: 0;
}
.card-icon.slack {
background: rgba(88, 166, 255, 0.15);
}
.card-icon.telegram {
background: rgba(63, 185, 80, 0.15);
}
.card-icon.main {
background: rgba(163, 113, 247, 0.15);
}
.card-title-area {
flex: 1;
min-width: 0;
}
.card-title {
font-size: 0.9rem;
font-weight: 600;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.card-subtitle {
font-size: 0.75rem;
color: var(--text-muted);
margin-top: 2px;
}
.card-topics {
display: flex;
flex-wrap: wrap;
gap: 4px;
margin-top: 8px;
margin-bottom: 4px;
}
.topic-pill {
font-size: 0.65rem;
font-weight: 500;
padding: 2px 8px;
border-radius: 12px;
background: var(--card-bg);
border: 1px solid var(--border);
color: var(--text-muted);
white-space: nowrap;
}
.topic-pill.coding {
background: rgba(99, 102, 241, 0.15);
border-color: rgba(99, 102, 241, 0.3);
color: #818cf8;
}
.topic-pill.git {
background: rgba(249, 115, 22, 0.15);
border-color: rgba(249, 115, 22, 0.3);
color: #fb923c;
}
.topic-pill.slack {
background: rgba(74, 21, 75, 0.3);
border-color: rgba(224, 30, 90, 0.3);
color: #e91e63;
}
.topic-pill.dashboard {
background: rgba(16, 185, 129, 0.15);
border-color: rgba(16, 185, 129, 0.3);
color: #34d399;
}
.topic-pill.memory {
background: rgba(139, 92, 246, 0.15);
border-color: rgba(139, 92, 246, 0.3);
color: #a78bfa;
}
.topic-pill.heartbeat {
background: rgba(239, 68, 68, 0.15);
border-color: rgba(239, 68, 68, 0.3);
color: #f87171;
}
.topic-pill.tools {
background: rgba(234, 179, 8, 0.15);
border-color: rgba(234, 179, 8, 0.3);
color: #fbbf24;
}
.topic-pill.file {
background: rgba(59, 130, 246, 0.15);
border-color: rgba(59, 130, 246, 0.3);
color: #60a5fa;
}
.topic-pill.research {
background: rgba(236, 72, 153, 0.15);
border-color: rgba(236, 72, 153, 0.3);
color: #f472b6;
}
.topic-pill.api {
background: rgba(20, 184, 166, 0.15);
border-color: rgba(20, 184, 166, 0.3);
color: #2dd4bf;
}
.card-preview {
font-size: 0.75rem;
color: var(--text-muted);
margin-top: 6px;
font-style: italic;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
}
.card-badge {
padding: 3px 8px;
border-radius: 12px;
font-size: 0.7rem;
font-weight: 500;
flex-shrink: 0;
}
.badge-live {
background: rgba(63, 185, 80, 0.2);
color: var(--green);
}
.badge-recent {
background: rgba(210, 153, 34, 0.2);
color: var(--yellow);
}
.badge-idle {
background: rgba(139, 148, 158, 0.15);
color: var(--text-muted);
}
/* Quick hide button on cards */
.hide-btn {
background: none;
border: none;
cursor: pointer;
opacity: 0;
padding: 4px 6px;
font-size: 0.85rem;
transition: opacity 0.15s;
flex-shrink: 0;
}
.session-card:hover .hide-btn,
.cron-card:hover .hide-btn {
opacity: 0.5;
}
.hide-btn:hover {
opacity: 1 !important;
}
.card-stats {
display: flex;
gap: 16px;
padding: 10px 0;
border-top: 1px solid var(--border);
margin-top: 8px;
}
.card-stat {
display: flex;
align-items: center;
gap: 4px;
font-size: 0.75rem;
color: var(--text-muted);
}
.card-stat-value {
color: var(--text);
font-weight: 500;
}
.card-stat.high .card-stat-value {
color: var(--red);
}
.card-stat.med .card-stat-value {
color: var(--yellow);
}
/* Cerebro topic tag */
.cerebro-tag {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 0.7rem;
color: var(--accent);
background: rgba(100, 223, 223, 0.1);
border: 1px solid rgba(100, 223, 223, 0.3);
border-radius: 4px;
padding: 2px 8px;
cursor: pointer;
transition: all 0.2s ease;
}
.cerebro-tag:hover {
background: rgba(100, 223, 223, 0.2);
border-color: var(--accent);
}
/* Cerebro topic action buttons */
.topic-actions {
display: flex;
gap: 4px;
margin-left: auto;
}
.topic-action-btn {
padding: 2px 6px;
font-size: 0.7rem;
border: 1px solid var(--border);
border-radius: 4px;
background: var(--bg);
color: var(--text-muted);
cursor: pointer;
transition: all 0.15s ease;
opacity: 0.6;
}
.topic-action-btn:hover {
opacity: 1;
background: var(--card-hover);
}
.topic-action-btn.resolve:hover {
border-color: var(--green);
color: var(--green);
}
.topic-action-btn.park:hover {
border-color: var(--yellow);
color: var(--yellow);
}
.topic-action-btn.reactivate:hover {
border-color: var(--accent);
color: var(--accent);
}
.topic-action-btn.hide:hover {
border-color: var(--red);
color: var(--red);
}
/* Toast notifications */
.toast-container {
position: fixed;
bottom: 80px;
right: 24px;
z-index: 1000;
display: flex;
flex-direction: column;
gap: 8px;
}
.toast {
padding: 12px 16px;
border-radius: 8px;
background: var(--card-bg);
border: 1px solid var(--border);
color: var(--text);
font-size: 0.85rem;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
animation: toast-in 0.3s ease;
display: flex;
align-items: center;
gap: 8px;
}
.toast.success {
border-color: var(--green);
background: rgba(63, 185, 80, 0.15);
}
.toast.error {
border-color: var(--red);
background: rgba(248, 81, 73, 0.15);
}
@keyframes toast-in {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes toast-out {
from {
opacity: 1;
transform: translateY(0);
}
to {
opacity: 0;
transform: translateY(20px);
}
}
/* Progress/Effort Metrics Bar - Fitness tracker aesthetic */
.metrics-bar {
display: flex;
gap: 12px;
padding: 8px 12px;
margin-top: 10px;
background: rgba(0, 0, 0, 0.2);
border-radius: 8px;
justify-content: space-around;
}
.metric-ring {
display: flex;
flex-direction: column;
align-items: center;
gap: 2px;
position: relative;
}
.metric-icon {
font-size: 0.9rem;
opacity: 0.8;
}
.metric-value {
font-size: 0.7rem;
font-weight: 600;
color: var(--text);
}
.metric-label {
font-size: 0.55rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.3px;
}
.metric-ring.burn .metric-value {
color: var(--orange);
}
.metric-ring.burn.hot .metric-value {
color: var(--red);
}
.metric-ring.tools .metric-value {
color: var(--accent);
}
.metric-ring.time .metric-value {
color: var(--green);
}
.card-links {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-top: 10px;
}
.link-tag {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 3px 8px;
background: var(--bg);
border-radius: 4px;
font-size: 0.7rem;
color: var(--accent);
text-decoration: none;
}
.link-tag:hover {
background: rgba(88, 166, 255, 0.2);
}
.link-tag.linear {
color: #5e6ad2;
}
.link-tag.jira {
color: #0052cc;
}
.link-tag.github {
color: var(--text);
}
.link-tag.slack {
color: #e01e5a;
}
.link-tag.file {
color: var(--orange);
}
/* Cron Cards */
.cron-card {
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 12px;
padding: 14px 16px;
display: flex;
align-items: center;
gap: 12px;
transition: all 0.15s ease;
}
.cron-card:hover {
background: var(--card-hover);
border-color: var(--purple);
}
.cron-card.disabled {
opacity: 0.5;
}
.cron-icon {
width: 36px;
height: 36px;
background: rgba(163, 113, 247, 0.15);
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.1rem;
}
.cron-info {
flex: 1;
}
.cron-name {
font-size: 0.85rem;
font-weight: 500;
}
.cron-schedule {
font-size: 0.75rem;
color: var(--purple);
font-family: monospace;
}
.cron-schedule-human {
font-size: 0.7rem;
color: var(--text-muted);
margin-top: 2px;
}
.cron-meta {
display: flex;
align-items: center;
gap: 8px;
}
.cron-next {
font-size: 0.7rem;
color: var(--text-muted);
padding: 4px 10px;
background: var(--bg);
border-radius: 12px;
}
.cron-status {
font-size: 0.7rem;
padding: 4px 8px;
border-radius: 12px;
}
.cron-status.enabled {
background: rgba(63, 185, 80, 0.15);
color: var(--green);
}
.cron-status.disabled {
background: rgba(139, 148, 158, 0.15);
color: var(--text-muted);
}
/* Operators Grid */
.operators-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 16px;
}
.operator-card {
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 12px;
padding: 20px;
transition: all 0.15s ease;
position: relative;
}
.operator-card:hover {
background: var(--card-hover);
border-color: var(--accent);
}
.operator-card.role-owner {
border-color: rgba(255, 215, 0, 0.4);
}
.operator-card.role-owner::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: linear-gradient(90deg, #ffd700, #ff8c00);
}
.operator-card.role-admin {
border-color: rgba(163, 113, 247, 0.4);
}
.operator-card.role-admin::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: linear-gradient(90deg, #a371f7, #8957e5);
}
.operator-header {
display: flex;
align-items: center;
gap: 16px;
margin-bottom: 16px;
}
.operator-avatar {
width: 48px;
height: 48px;
border-radius: 50%;
background: var(--bg);
display: flex;
align-items: center;
justify-content: center;
font-size: 1.5rem;
flex-shrink: 0;
}
.operator-avatar img {
width: 100%;
height: 100%;
border-radius: 50%;
object-fit: cover;
}
.operator-info {
flex: 1;
min-width: 0;
}
.operator-name {
font-size: 1rem;
font-weight: 600;
margin-bottom: 2px;
}
.operator-username {
font-size: 0.8rem;
color: var(--text-muted);
}
.operator-role {
padding: 3px 10px;
border-radius: 12px;
font-size: 0.7rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.operator-role.owner {
background: linear-gradient(135deg, rgba(255, 215, 0, 0.2), rgba(255, 140, 0, 0.2));
color: #ffd700;
}
.operator-role.admin {
background: linear-gradient(135deg, rgba(163, 113, 247, 0.2), rgba(137, 87, 229, 0.2));
color: #a371f7;
}
.operator-role.user {
background: rgba(88, 166, 255, 0.15);
color: var(--accent);
}
.operator-stats {
display: flex;
gap: 16px;
padding-top: 12px;
border-top: 1px solid var(--border);
}
.operator-stat {
text-align: center;
flex: 1;
}
.operator-stat-value {
font-size: 1.2rem;
font-weight: 600;
color: var(--text);
}
.operator-stat-label {
font-size: 0.7rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.3px;
}
/* Session originator badge */
.session-originator {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
background: rgba(88, 166, 255, 0.1);
border-radius: 10px;
font-size: 0.7rem;
color: var(--text-muted);
margin-top: 4px;
}
.session-originator .originator-avatar {
width: 14px;
height: 14px;
border-radius: 50%;
background: var(--bg);
font-size: 0.5rem;
display: flex;
align-items: center;
justify-content: center;
}
/* System Vitals Panel */
.vitals-panel {
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 12px;
padding: 20px;
margin-bottom: 24px;
}
.vitals-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
}
.vitals-title {
font-size: 0.9rem;
font-weight: 600;
display: flex;
align-items: center;
gap: 8px;
}
.vitals-hostname {
font-size: 0.8rem;
color: var(--accent);
background: rgba(88, 166, 255, 0.15);
padding: 4px 10px;
border-radius: 12px;
}
.vitals-uptime {
font-size: 0.75rem;
color: var(--text-muted);
}
.vitals-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 16px;
}
.vital-card {
background: var(--bg);
border-radius: 10px;
padding: 14px;
}
.vital-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
}
.vital-label {
font-size: 0.75rem;
color: var(--text-muted);
text-transform: uppercase;
display: flex;
align-items: center;
gap: 6px;
}
.vital-value {
font-size: 1rem;
font-weight: 600;
}
.vital-value.green {
color: var(--green);
}
.vital-value.yellow {
color: var(--yellow);
}
.vital-value.red {
color: var(--red);
}
/* Progress bar (DaisyDisk-style) */
.vital-bar {
height: 8px;
background: var(--border);
border-radius: 4px;
overflow: hidden;
margin-bottom: 8px;
}
.vital-bar-fill {
height: 100%;
border-radius: 4px;
transition: width 0.3s ease;
}
.vital-bar-fill.green {
background: linear-gradient(90deg, #2ea043, #3fb950);
}
.vital-bar-fill.yellow {
background: linear-gradient(90deg, #9e6a03, #d29922);
}
.vital-bar-fill.red {
background: linear-gradient(90deg, #da3633, #f85149);
}
.vital-bar-fill.blue {
background: linear-gradient(90deg, #1f6feb, #58a6ff);
}
.vital-bar-fill.purple {
background: linear-gradient(90deg, #8957e5, #a371f7);
}
.vital-bar-fill.gray {
background: linear-gradient(90deg, #484f58, #6e7681);
}
.vital-detail {
display: flex;
justify-content: space-between;
font-size: 0.7rem;
color: var(--text-muted);
}
.vital-detail-item {
display: flex;
flex-direction: column;
align-items: center;
}
.vital-detail-value {
font-size: 0.8rem;
color: var(--text);
font-weight: 500;
}
.vital-detail-label {
font-size: 0.65rem;
}
/* CPU cores visualization */
.cpu-cores {
display: flex;
gap: 3px;
margin-top: 8px;
}
.cpu-core {
flex: 1;
height: 20px;
background: var(--border);
border-radius: 3px;
position: relative;
overflow: hidden;
}
.cpu-core-fill {
position: absolute;
bottom: 0;
left: 0;
right: 0;
background: var(--accent);
transition: height 0.3s ease;
}
/* Temperature */
.temp-display {
display: flex;
align-items: baseline;
gap: 4px;
}
.temp-value {
font-size: 1.5rem;
font-weight: 700;
}
.temp-unit {
font-size: 0.9rem;
color: var(--text-muted);
}
/* Memory pressure indicator */
.pressure-indicator {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
border-radius: 10px;
font-size: 0.65rem;
text-transform: uppercase;
}
.pressure-indicator.normal {
background: rgba(63, 185, 80, 0.15);
color: var(--green);
}
.pressure-indicator.warning {
background: rgba(210, 153, 34, 0.15);
color: var(--yellow);
}
.pressure-indicator.critical {
background: rgba(248, 81, 73, 0.15);
color: var(--red);
}
/* Empty States */
.empty-state {
text-align: center;
padding: 40px 20px;
color: var(--text-muted);
}
.empty-state-icon {
font-size: 2.5rem;
margin-bottom: 12px;
opacity: 0.5;
}
.empty-state-text {
font-size: 0.9rem;
}
/* Detail Panel */
.detail-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.6);
z-index: 100;
opacity: 0;
transition: opacity 0.2s;
}
.detail-overlay.visible {
opacity: 1;
}
.detail-overlay.hidden {
display: none;
}
.detail-panel {
position: fixed;
top: 0;
right: 0;
width: 50%;
max-width: 600px;
height: 100vh;
background: var(--bg);
border-left: 1px solid var(--border);
z-index: 101;
overflow-y: auto;
transform: translateX(100%);
transition: transform 0.2s ease;
}
.detail-panel.visible {
transform: translateX(0);
}
.detail-panel.hidden {
display: none;
}
.detail-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px 24px;
border-bottom: 1px solid var(--border);
position: sticky;
top: 0;
background: var(--bg);
}
.detail-header h2 {
font-size: 1rem;
font-weight: 600;
}
.close-btn {
background: var(--card-bg);
border: 1px solid var(--border);
color: var(--text-muted);
width: 32px;
height: 32px;
border-radius: 8px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
font-size: 1rem;
}
.close-btn:hover {
background: var(--card-hover);
color: var(--text);
}
.detail-content {
padding: 24px;
}
.detail-section {
margin-bottom: 24px;
}
.detail-section h3 {
font-size: 0.8rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.5px;
margin-bottom: 10px;
display: flex;
align-items: center;
gap: 6px;
}
.detail-box {
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 8px;
padding: 14px;
}
.detail-row {
display: flex;
justify-content: space-between;
padding: 6px 0;
font-size: 0.85rem;
}
.detail-row:not(:last-child) {
border-bottom: 1px solid var(--border);
}
.detail-label {
color: var(--text-muted);
}
.detail-value {
font-weight: 500;
}
.detail-section.attention .detail-box {
border-color: var(--yellow);
background: rgba(210, 153, 34, 0.08);
}
.attention-item {
padding: 8px 0;
font-size: 0.85rem;
display: flex;
gap: 8px;
}
.attention-item:not(:last-child) {
border-bottom: 1px solid var(--border);
}
.tool-tag {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 4px 10px;
background: var(--bg);
border-radius: 6px;
font-size: 0.8rem;
margin: 3px;
}
.tool-tag code {
color: var(--accent);
}
.tool-count {
color: var(--text-muted);
font-size: 0.7rem;
}
.message-item {
padding: 10px 0;
font-size: 0.85rem;
}
.message-item:not(:last-child) {
border-bottom: 1px solid var(--border);
}
.message-role {
font-weight: 600;
font-size: 0.75rem;
margin-bottom: 4px;
}
.message-role.user {
color: var(--accent);
}
.message-role.assistant {
color: var(--green);
}
.message-text {
color: var(--text-muted);
line-height: 1.4;
}
/* Action Buttons (Read-Write Controls) - Future */
.action-btn {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 8px 14px;
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 8px;
font-size: 0.8rem;
color: var(--text);
cursor: pointer;
transition: all 0.15s;
}
.action-btn:hover {
background: var(--card-hover);
border-color: var(--accent);
}
.action-btn.danger:hover {
border-color: var(--red);
color: var(--red);
}
.action-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.detail-actions {
display: flex;
gap: 8px;
flex-wrap: wrap;
margin-top: 16px;
padding-top: 16px;
border-top: 1px solid var(--border);
}
.refresh-bar {
text-align: center;
padding: 12px;
color: var(--text-muted);
font-size: 0.75rem;
background: var(--card-bg);
border-top: 1px solid var(--border);
}
/* Skeleton Loading States */
@keyframes skeleton-pulse {
0%,
100% {
opacity: 0.4;
}
50% {
opacity: 0.7;
}
}
.skeleton {
animation: skeleton-pulse 1.5s ease-in-out infinite;
}
.skeleton-card {
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 12px;
padding: 16px;
animation: skeleton-pulse 1.5s ease-in-out infinite;
}
.skeleton-bar {
background: var(--border);
border-radius: 4px;
height: 14px;
}
.skeleton-bar.title {
width: 60%;
height: 18px;
margin-bottom: 8px;
}
.skeleton-bar.subtitle {
width: 40%;
height: 12px;
margin-bottom: 12px;
}
.skeleton-bar.text {
width: 80%;
margin-bottom: 6px;
}
.skeleton-bar.short {
width: 30%;
}
.skeleton-circle {
width: 32px;
height: 32px;
background: var(--border);
border-radius: 50%;
}
.skeleton-header {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 12px;
}
.skeleton-stats {
display: flex;
gap: 16px;
margin-top: 12px;
}
.skeleton-badge {
width: 50px;
height: 20px;
background: var(--border);
border-radius: 10px;
margin-left: auto;
}
.loading-dots {
display: inline-flex;
gap: 4px;
}
.loading-dots span {
width: 6px;
height: 6px;
background: var(--accent);
border-radius: 50%;
animation: loading-dot 1.4s infinite ease-in-out both;
}
.loading-dots span:nth-child(1) {
animation-delay: -0.32s;
}
.loading-dots span:nth-child(2) {
animation-delay: -0.16s;
}
@keyframes loading-dot {
0%,
80%,
100% {
transform: scale(0);
}
40% {
transform: scale(1);
}
}
/* Responsive */
@media (max-width: 1024px) {
.sidebar {
transform: translateX(-100%);
}
.sidebar.visible {
transform: translateX(0);
}
.main-wrapper {
margin-left: 0;
}
.mobile-menu-btn {
display: block;
}
}
@media (max-width: 768px) {
.detail-panel {
width: 100%;
max-width: none;
}
.card-grid {
grid-template-columns: 1fr;
}
.stats-bar {
flex-wrap: wrap;
}
.filters-bar {
flex-direction: column;
align-items: flex-start;
}
}
/* Token Utilization Widget */
.utilization-section {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 16px;
margin-bottom: 24px;
}
.utilization-card {
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 12px;
padding: 16px;
}
.utilization-header {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 14px;
}
.utilization-icon {
width: 36px;
height: 36px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.2rem;
}
.utilization-icon.anthropic {
background: rgba(216, 153, 99, 0.2);
}
.utilization-icon.openai {
background: rgba(16, 163, 127, 0.2);
}
.utilization-title {
font-weight: 600;
font-size: 0.9rem;
}
.utilization-subtitle {
font-size: 0.7rem;
color: var(--text-muted);
}
.quota-bar {
height: 8px;
background: var(--bg);
border-radius: 4px;
overflow: hidden;
margin: 8px 0;
}
.quota-bar-fill {
height: 100%;
border-radius: 4px;
transition: width 0.3s ease;
}
.quota-bar-fill.low {
background: var(--green);
}
.quota-bar-fill.medium {
background: var(--yellow);
}
.quota-bar-fill.high {
background: var(--red);
}
.quota-stats {
display: flex;
justify-content: space-between;
font-size: 0.75rem;
color: var(--text-muted);
}
.quota-value {
font-weight: 600;
color: var(--text);
}
/* Sub-agent Status Panel */
.subagent-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
gap: 16px;
margin-bottom: 24px;
}
.subagent-card {
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 12px;
padding: 16px;
transition: border-color 0.2s ease;
}
.subagent-card.active {
border-color: var(--green);
}
.subagent-card.stale {
border-color: var(--yellow);
}
.subagent-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 12px;
}
.subagent-info h4 {
font-size: 0.9rem;
font-weight: 600;
margin-bottom: 4px;
}
.subagent-meta {
font-size: 0.7rem;
color: var(--text-muted);
}
.subagent-status {
padding: 4px 8px;
border-radius: 12px;
font-size: 0.7rem;
font-weight: 500;
}
.subagent-status.active {
background: rgba(63, 185, 80, 0.15);
color: var(--green);
}
.subagent-status.idle {
background: rgba(217, 153, 34, 0.15);
color: var(--yellow);
}
.subagent-status.stale {
background: rgba(248, 81, 73, 0.15);
color: var(--red);
}
/* Quick Actions */
.quick-actions {
display: flex;
gap: 12px;
flex-wrap: wrap;
margin-bottom: 24px;
}
.quick-actions-title {
width: 100%;
font-size: 0.9rem;
font-weight: 600;
color: var(--text);
margin-bottom: 8px;
}
.quick-action-btn {
padding: 8px 16px;
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: 8px;
color: var(--text);
cursor: pointer;
font-size: 0.8rem;
transition: all 0.2s ease;
text-decoration: none;
}
.quick-action-btn:hover {
background: var(--card-hover);
border-color: var(--accent);
}