*, *::before, *::after { box-sizing: border-box; } html, body { height: 100%; margin: 0; } body { display: flex; flex-direction: column; background: var(--c-bg); color: var(--c-text); font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; line-height: 1.5; } :root { --c-bg: #f8fafc; --c-surface: #ffffff; --c-text: #0f172a; --c-text-muted: #64748b; --c-text-link: #6366f1; --c-text-link-hover: #4f46e5; --c-border: #e2e8f0; --c-accent: #6366f1; --c-badge-ok-bg: #dcfce7; --c-badge-ok-text: #166534; --c-badge-warn-bg: #fef3c7; --c-badge-warn-text: #92400e; } [data-theme="dark"] { --c-bg: #0f1115; --c-surface: #171a21; --c-text: #e7e9ee; --c-text-muted: #9aa3b2; --c-text-link: #6ea8fe; --c-text-link-hover: #8bb9fe; --c-border: #262b36; --c-accent: #6ea8fe; --c-badge-ok-bg: rgba(16, 185, 129, 0.15); --c-badge-ok-text: #6ee7b7; --c-badge-warn-bg: rgba(251, 191, 36, 0.15); --c-badge-warn-text: #fcd34d; } a { color: var(--c-text-link); } a:hover { color: var(--c-text-link-hover); } /* Layout */ .page { display: flex; flex-direction: column; min-height: 100vh; } .page-header { position: sticky; top: 0; z-index: 10; border-bottom: 1px solid var(--c-border); background: var(--c-surface); } .page-header-inner { max-width: 1152px; margin: 0 auto; display: flex; align-items: center; justify-content: space-between; padding: 0.75rem 1.5rem; } .page-main { flex: 1; width: 100%; max-width: 1152px; margin: 0 auto; padding: 2rem 1.5rem; } .page-footer { border-top: 1px solid var(--c-border); padding: 1rem; text-align: center; font-size: 0.75rem; color: var(--c-text-muted); } /* Nav */ .nav { display: flex; align-items: center; gap: 1rem; font-size: 0.875rem; } .nav-link { color: var(--c-text-link); text-decoration: none; } .nav-link:hover { color: var(--c-text-link-hover); } .nav-sep { color: var(--c-text-muted); } .logo { font-size: 1.125rem; font-weight: 600; color: var(--c-text); text-decoration: none; } /* Buttons */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 0.5rem; border-radius: 0.5rem; padding: 0.5rem 1rem; font-size: 0.875rem; font-weight: 500; border: none; cursor: pointer; transition: opacity 0.15s; } .btn:active { opacity: 0.8; } .btn-sm { padding: 0.25rem 0.5rem; font-size: 0.75rem; } .btn-primary { background: var(--c-accent); color: white; text-decoration: none; } .btn-primary:hover { opacity: 0.9; } .btn-secondary { background: var(--c-surface); color: var(--c-text); text-decoration: none; box-shadow: inset 0 0 0 1px var(--c-border); } .btn-secondary:hover { background: var(--c-border); } /* Forms */ .input { width: 100%; border-radius: 0.5rem; background: var(--c-bg); color: var(--c-text); padding: 0.5rem 0.75rem; font-size: 0.875rem; border: 1px solid var(--c-border); outline: none; } .input:focus { border-color: var(--c-accent); box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.2); } .input::placeholder { color: var(--c-text-muted); } .label { display: block; margin-bottom: 0.25rem; font-size: 0.875rem; font-weight: 500; } .hint { margin-top: 0.25rem; font-size: 0.75rem; color: var(--c-text-muted); } /* Cards */ .card { border-radius: 0.75rem; background: var(--c-surface); border: 1px solid var(--c-border); } .card-flush { border-radius: 0.75rem; background: var(--c-surface); border: 1px solid var(--c-border); padding: 0; } .card-body { padding: 1.5rem; } /* Grid */ .grid { display: grid; gap: 1rem; } .grid-2 { grid-template-columns: repeat(auto-fill, minmax(22rem, 1fr)); } .grid-stats { grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr)); } /* Typography */ .page-title { margin: 0 0 1.5rem; font-size: 1.5rem; font-weight: 600; } .section-title { margin: 0 0 0.75rem; font-size: 1.125rem; font-weight: 500; } .stat-value { margin: 0.5rem 0 0; font-size: 1.875rem; font-weight: 600; } .stat-title { font-size: 0.875rem; color: var(--c-text-muted); margin: 0; } .text-muted { color: var(--c-text-muted); } .opacity-30 { opacity: 0.3; } .text-center { text-align: center; } .text-sm { font-size: 0.875rem; } .font-mono { font-family: monospace; } /* Spacing */ .mt-1 { margin-top: 0.25rem; } .mt-2 { margin-top: 0.5rem; } .mt-4 { margin-top: 1rem; } .mt-6 { margin-top: 1.5rem; } .mt-8 { margin-top: 2rem; } .mb-2 { margin-bottom: 0.5rem; } .mb-4 { margin-bottom: 1rem; } .mb-6 { margin-bottom: 1.5rem; } .ml-2 { margin-left: 0.5rem; } .p-0 { padding: 0; } .p-4 { padding: 1rem; } .p-6 { padding: 1.5rem; } .px-6 { padding-left: 1.5rem; padding-right: 1.5rem; } .py-3 { padding-top: 0.75rem; padding-bottom: 0.75rem; } .gap-2 { gap: 0.5rem; } .gap-4 { gap: 1rem; } /* Flex */ .flex { display: flex; } .flex-wrap { flex-wrap: wrap; } .items-center { align-items: center; } .justify-between { justify-content: space-between; } .w-full { width: 100%; } .overflow-x-auto { overflow-x: auto; } /* Badges */ .badge { display: inline-flex; align-items: center; border-radius: 9999px; padding: 0.125rem 0.625rem; font-size: 0.75rem; font-weight: 500; } .badge-ok { background: var(--c-badge-ok-bg); color: var(--c-badge-ok-text); } .badge-warn { background: var(--c-badge-warn-bg); color: var(--c-badge-warn-text); } /* Tables */ table { width: 100%; font-size: 0.875rem; border-collapse: collapse; } th { text-align: left; font-weight: 500; color: var(--c-text-muted); padding: 0.75rem 1.5rem; border-bottom: 1px solid var(--c-border); } td { padding: 0.75rem 1.5rem; border-bottom: 1px solid var(--c-border); } tr:last-child td { border-bottom: none; } /* Alerts */ .alert { padding: 0.75rem 1rem; border-radius: 0.5rem; font-size: 0.875rem; margin-bottom: 1rem; } .alert-error { background: #fef2f2; color: #991b1b; } .alert-success { background: #dcfce7; color: #166534; } .alert-warning { background: #fef3c7; color: #92400e; } .ml-2 { margin-left: 0.5rem; } .list-pad { padding-left: 1.25rem; } .import-card { border-color: rgba(16,185,129,0.4); } .mini-alert { padding: 0.5rem 0.75rem; border-radius: 0.25rem; margin-bottom: 0.5rem; } .font-semibold { font-weight: 600; } /* Theme toggle */ .theme-btn { padding: 0.25rem 0.5rem; font-size: 0.75rem; } /* Group assignment page */ .group-title { margin: 0 0 0.5rem; font-size: 1rem; font-weight: 600; } .inline-form { display: inline-flex; align-items: center; gap: 0.375rem; margin: 0; } .inline-form .input-sm { width: auto; min-width: 10rem; } .input-sm { padding: 0.25rem 0.5rem; font-size: 0.8125rem; } .input-score { width: 4.5rem; } .filter-select { width: auto; } .hidden { display: none !important; } /* Markdown body */ .md-body { font-size: 0.9375rem; } .md-body h1, .md-body h2, .md-body h3 { margin: 1rem 0 0.5rem; line-height: 1.3; } .md-body h1 { font-size: 1.25rem; } .md-body h2 { font-size: 1.125rem; } .md-body p, .md-body ul, .md-body ol { margin: 0.5rem 0; } .md-body ul, .md-body ol { padding-left: 1.5rem; } .md-body pre { background: var(--c-bg); border: 1px solid var(--c-border); border-radius: 0.5rem; padding: 0.75rem 1rem; overflow-x: auto; font-size: 0.8125rem; } .md-body code { font-family: monospace; } .md-body details.spoiler { border: 1px solid var(--c-border); border-radius: 0.5rem; padding: 0.5rem 0.75rem; margin: 0.5rem 0; } .md-body details.spoiler summary { cursor: pointer; font-weight: 500; color: var(--c-text-link); } .md-body img { max-width: 100%; } .md-body table { margin: 0.5rem 0; } /* Empty state */ .empty { text-align: center; color: var(--c-text-muted); padding: 1.5rem; } /* Mono inline code */ code.code { padding: 0.125rem 0.5rem; border-radius: 0.25rem; font-family: monospace; background: var(--c-bg); } /* Containers */ .container-sm { max-width: 28rem; margin: 0 auto; } .form-stack { display: flex; flex-direction: column; gap: 1rem; } .form-card { padding: 1.5rem; } /* Header logo */ .link-inherit { font-size: 0.875rem; }