:root {
--bg: #0d1117;
--surface: #161b22;
--surface-hover: #1c2129;
--border: #30363d;
--text: #e6edf3;
--text-secondary: #8b949e;
--accent-green: #16c79a;
--accent-blue: #58a6ff;
--error: #f85149;
--warning: #d29922;
--font: -apple-system, BlinkMacSystemFont, "Segoe UI", Noto Sans, Helvetica, Arial, sans-serif;
--mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
--radius: 6px;
--transition: 0.15s ease;
}
*,
*::before,
*::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: var(--font);
background: var(--bg);
color: var(--text);
line-height: 1.6;
min-height: 100vh;
display: flex;
flex-direction: column;
}
header {
background: var(--surface);
border-bottom: 1px solid var(--border);
padding: 0 1.5rem;
display: flex;
align-items: center;
justify-content: space-between;
height: 56px;
position: sticky;
top: 0;
z-index: 100;
}
.header-left {
display: flex;
align-items: center;
gap: 1rem;
}
header h1 {
font-size: 1.15rem;
font-weight: 600;
color: var(--text);
letter-spacing: -0.01em;
}
.indicator {
display: flex;
align-items: center;
gap: 0.4rem;
font-size: 0.8rem;
}
.indicator-dot {
width: 8px;
height: 8px;
border-radius: 50%;
display: inline-block;
transition: background var(--transition);
}
.indicator.connected .indicator-dot {
background: var(--accent-green);
box-shadow: 0 0 6px var(--accent-green);
}
.indicator.disconnected .indicator-dot {
background: var(--error);
box-shadow: 0 0 6px var(--error);
}
.indicator-text {
color: var(--text-secondary);
}
nav.tabs {
display: flex;
gap: 0;
}
.tab {
background: none;
border: none;
color: var(--text-secondary);
font-family: var(--font);
font-size: 0.85rem;
font-weight: 500;
padding: 0.5rem 1rem;
cursor: pointer;
border-bottom: 2px solid transparent;
transition: color var(--transition), border-color var(--transition);
height: 56px;
display: flex;
align-items: center;
}
.tab:hover {
color: var(--text);
}
.tab.active {
color: var(--text);
border-bottom-color: var(--accent-green);
}
main {
flex: 1;
padding: 1.5rem;
max-width: 1100px;
width: 100%;
margin: 0 auto;
}
.tab-content {
display: none;
}
.tab-content.active {
display: block;
}
.section-header {
display: flex;
align-items: center;
gap: 0.75rem;
margin-bottom: 1rem;
}
.section-header h2 {
font-size: 1rem;
font-weight: 600;
}
.badge {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 12px;
padding: 0.1rem 0.55rem;
font-size: 0.75rem;
color: var(--text-secondary);
font-weight: 500;
}
.table-wrap {
overflow-x: auto;
border: 1px solid var(--border);
border-radius: var(--radius);
}
table {
width: 100%;
border-collapse: collapse;
font-size: 0.875rem;
}
thead {
background: var(--surface);
}
th {
text-align: left;
padding: 0.6rem 1rem;
font-weight: 600;
font-size: 0.75rem;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--text-secondary);
border-bottom: 1px solid var(--border);
white-space: nowrap;
}
td {
padding: 0.55rem 1rem;
border-bottom: 1px solid var(--border);
vertical-align: middle;
}
tbody tr {
transition: background var(--transition);
}
tbody tr:hover {
background: var(--surface-hover);
}
tbody tr:last-child td {
border-bottom: none;
}
.mono {
font-family: var(--mono);
font-size: 0.82rem;
}
.role-badge {
display: inline-block;
padding: 0.1rem 0.5rem;
border-radius: 12px;
font-size: 0.75rem;
font-weight: 600;
text-transform: capitalize;
}
.role-badge.admin {
background: rgba(22, 199, 154, 0.15);
color: var(--accent-green);
border: 1px solid rgba(22, 199, 154, 0.3);
}
.role-badge.user {
background: rgba(88, 166, 255, 0.12);
color: var(--accent-blue);
border: 1px solid rgba(88, 166, 255, 0.25);
}
.role-badge.readonly {
background: rgba(139, 148, 158, 0.12);
color: var(--text-secondary);
border: 1px solid rgba(139, 148, 158, 0.25);
}
.status-badge {
display: inline-block;
padding: 0.1rem 0.5rem;
border-radius: 12px;
font-size: 0.75rem;
font-weight: 600;
text-transform: capitalize;
}
.status-badge.idle {
background: rgba(22, 199, 154, 0.15);
color: var(--accent-green);
border: 1px solid rgba(22, 199, 154, 0.3);
}
.status-badge.syncing {
background: rgba(210, 153, 34, 0.15);
color: var(--warning);
border: 1px solid rgba(210, 153, 34, 0.3);
}
.status-badge.error {
background: rgba(248, 81, 73, 0.15);
color: var(--error);
border: 1px solid rgba(248, 81, 73, 0.3);
}
.expand-btn {
background: none;
border: 1px solid var(--border);
color: var(--text-secondary);
font-family: var(--font);
font-size: 0.8rem;
padding: 0.2rem 0.55rem;
border-radius: 4px;
cursor: pointer;
transition: background var(--transition), color var(--transition);
white-space: nowrap;
}
.expand-btn:hover {
background: var(--surface);
color: var(--text);
}
.repo-details {
background: var(--bg);
border-top: 1px solid var(--border);
}
.repo-details td {
padding: 0.6rem 1rem 0.6rem 2.5rem;
}
.repo-details .branch-tag {
display: inline-block;
background: var(--surface);
border: 1px solid var(--border);
border-radius: 4px;
padding: 0.1rem 0.45rem;
font-family: var(--mono);
font-size: 0.78rem;
color: var(--accent-blue);
margin: 0.1rem 0.15rem;
}
.repo-details .detail-label {
font-size: 0.75rem;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.04em;
margin-bottom: 0.2rem;
}
.repo-details .detail-value {
font-family: var(--mono);
font-size: 0.82rem;
color: var(--text);
margin-bottom: 0.5rem;
}
.repo-details .detail-value:last-child {
margin-bottom: 0;
}
.loading {
text-align: center;
padding: 3rem 1rem;
color: var(--text-secondary);
font-size: 0.9rem;
}
.error-banner {
background: rgba(248, 81, 73, 0.1);
border: 1px solid rgba(248, 81, 73, 0.3);
color: var(--error);
padding: 0.75rem 1rem;
border-radius: var(--radius);
font-size: 0.85rem;
margin-bottom: 1rem;
}
.empty-state {
text-align: center;
padding: 3rem 1rem;
color: var(--text-secondary);
font-size: 0.9rem;
}
footer {
text-align: center;
padding: 1rem;
color: var(--text-secondary);
font-size: 0.78rem;
border-top: 1px solid var(--border);
}
.hidden {
display: none !important;
}
@media (max-width: 640px) {
header {
flex-direction: column;
height: auto;
padding: 0.75rem 1rem;
gap: 0.5rem;
}
.tab {
height: 40px;
padding: 0.4rem 0.75rem;
font-size: 0.8rem;
}
main {
padding: 1rem;
}
}