/* * MuseHub — Base reset, typography, and unmigrated component patterns. * * Buttons, badges, pills, chips, cards, inputs, canvas, avatars, code, * timeline, nav, toasts, spectral, surfaces, and agents now live in * src/scss/components/ and src/scss/patterns/. * * This file keeps: base reset, body, headings, links, artifact-card, * repo-card, table, grids, heatmap, stat-card, comment thread, reactions, * analysis-grid, stat-cell, diff-stat, and misc utilities. */ /* ── Base reset ─────────────────────────────────────────────────────────── */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { -webkit-text-size-adjust: 100%; } body { font-family: var(--font-sans); font-size: var(--text-base); line-height: var(--line-height-normal); background-color: var(--bg-base); color: var(--text-secondary); min-height: 100vh; } /* ── Links ──────────────────────────────────────────────────────────────── */ a { color: var(--color-accent-link); text-decoration: none; } a:hover { text-decoration: none; } /* ── Headings ───────────────────────────────────────────────────────────── */ h1 { font-size: var(--text-2xl); font-weight: var(--weight-bold); letter-spacing: -0.03em; line-height: 1.15; color: var(--text-primary); margin-bottom: var(--space-4); } h2 { font-size: var(--text-xl); font-weight: var(--weight-semibold); letter-spacing: -0.02em; line-height: 1.25; color: var(--text-primary); margin-bottom: var(--space-3); } h3 { font-size: var(--text-lg); font-weight: var(--weight-semibold); letter-spacing: -0.01em; line-height: 1.3; color: var(--text-primary); margin-bottom: var(--space-2); } h4 { font-size: var(--text-md); font-weight: var(--weight-semibold); line-height: 1.4; color: var(--text-primary); margin-bottom: var(--space-2); } h5 { font-size: var(--text-base); font-weight: var(--weight-semibold); line-height: 1.4; color: var(--text-primary); margin-bottom: var(--space-1); } h6 { font-size: var(--text-sm); font-weight: var(--weight-semibold); line-height: 1.4; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: var(--space-1); } /* ── Body copy ──────────────────────────────────────────────────────────── */ p { font-size: var(--text-base); line-height: var(--line-height-relaxed); color: var(--text-secondary); margin-bottom: var(--space-3); &:last-child { margin-bottom: 0; } } strong, b { font-weight: var(--weight-semibold); color: var(--text-primary); } em, i { font-style: italic; } small { font-size: var(--text-xs); color: var(--text-muted); } blockquote { border-left: 3px solid var(--border-strong); padding: var(--space-2) var(--space-4); margin: var(--space-4) 0; color: var(--text-muted); font-style: italic; background: var(--bg-surface); border-radius: 0 var(--radius-sm) var(--radius-sm) 0; } hr { border: none; border-top: 1px solid var(--border-subtle); margin: var(--space-6) 0; } /* ── Lists ──────────────────────────────────────────────────────────────── */ ul, ol { padding-left: var(--space-5); margin-bottom: var(--space-3); color: var(--text-secondary); &:last-child { margin-bottom: 0; } } li { font-size: var(--text-base); line-height: var(--line-height-relaxed); margin-bottom: var(--space-1); &:last-child { margin-bottom: 0; } } ul { list-style-type: disc; } ol { list-style-type: decimal; } /* ── Tables ─────────────────────────────────────────────────────────────── */ table { width: 100%; border-collapse: collapse; font-size: var(--text-sm); color: var(--text-secondary); } thead tr { border-bottom: 1px solid var(--border-default); } th { text-align: left; font-size: var(--text-xs); font-weight: var(--weight-semibold); color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.06em; padding: var(--space-2) var(--space-3); } td { padding: var(--space-2) var(--space-3); border-bottom: 1px solid var(--border-subtle); vertical-align: middle; } tbody tr:last-child td { border-bottom: none; } tbody tr:hover td { background: var(--bg-overlay); } /* ── Details / Summary ──────────────────────────────────────────────────── */ details { border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); padding: var(--space-3); } summary { font-size: var(--text-sm); font-weight: var(--weight-medium); color: var(--text-secondary); cursor: pointer; list-style: none; &::-webkit-details-marker { display: none; } &:hover { color: var(--text-primary); } } /* ── Utilities ──────────────────────────────────────────────────────────── */ .text-muted { color: var(--text-muted); } .text-secondary { color: var(--text-secondary); } // Meta row — inline icon + label items in a horizontal strip .meta-row { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; margin-bottom: var(--space-2); } .meta-item { display: inline-flex; align-items: center; gap: 5px; font-size: var(--text-sm); color: var(--text-muted); } // Identity sigil (square avatar SVG) .sigil-wrap { flex-shrink: 0; align-self: flex-start; margin-top: 4px; } .sigil { display: block; border-radius: 14px; transition: box-shadow 0.2s; } .sigil--sm { border-radius: 10px; } // Light mode: the sigil stays dark in all modes — the glow-in-void aesthetic // is its identity. On a light page we make the dark card feel intentional: // a spectral border ring frames it, a lift shadow gives it depth, and a wide // spectral aura ties it to the page's color language. @mixin sigil-light { .sigil { box-shadow: 0 0 0 1.5px rgba(139, 92, 246, 0.35), // spectral border ring 0 6px 28px rgba(0, 0, 0, 0.28), // lift / depth 0 0 56px rgba(99, 102, 241, 0.18); // outer spectral aura } } [data-theme="light"] { @include sigil-light; } @media (prefers-color-scheme: light) { @include sigil-light; } // Avatar circle .avatar { display: inline-flex; align-items: center; justify-content: center; border-radius: 50%; font-weight: var(--weight-bold); text-transform: uppercase; flex-shrink: 0; background: var(--bg-overlay); color: var(--text-primary); &--xs { width: 24px; height: 24px; font-size: 10px; } &--sm { width: 32px; height: 32px; font-size: 12px; } &--md { width: 40px; height: 40px; font-size: 16px; } } /* ── Artifact card ──────────────────────────────────────────────────────── */ .artifact-card { background: var(--bg-overlay); border: 1px solid var(--border-default); border-radius: var(--radius-base); padding: 10px; display: flex; flex-direction: column; gap: var(--space-2); img { width: 100%; border-radius: var(--radius-sm); border: 1px solid var(--border-default); } audio { width: 100%; } .path { font-size: var(--text-sm); color: var(--text-muted); word-break: break-all; } } .artifact-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: var(--space-3); margin-top: var(--space-3); } /* ── Repo grid + repo card ──────────────────────────────────────────────── */ .repo-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 12px; } .repo-card { position: relative; background: transparent; border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); padding: var(--space-3); cursor: pointer; transition: border-color var(--transition-fast), background var(--transition-fast); text-decoration: none; display: flex; flex-direction: column; gap: var(--space-2); color: inherit; &:hover { border-color: var(--border-default); background: color-mix(in srgb, var(--text-primary) 2%, transparent); text-decoration: none; color: inherit; } } .repo-card__header { display: flex; align-items: center; justify-content: space-between; } .repo-card__name { font-weight: var(--weight-semibold); font-size: var(--text-sm); color: var(--text-primary); letter-spacing: -0.01em; } .repo-card__sep { color: var(--text-muted); font-weight: var(--weight-normal); margin: 0 1px; } .repo-card__desc { font-size: var(--text-xs); color: var(--text-muted); line-height: var(--line-height-relaxed); margin: 0; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .repo-card__pills { display: flex; gap: 5px; flex-wrap: wrap; margin-top: var(--space-1); } .repo-meta-pill { display: inline-flex; align-items: center; gap: 3px; font-family: var(--font-mono); font-size: 11px; padding: 2px 8px; border-radius: var(--radius-full); background: var(--bg-overlay); color: var(--text-muted); border: 1px solid var(--border-subtle); } .tag-pill { display: inline-block; font-size: 11px; padding: 1px 7px; border-radius: var(--radius-full); background: var(--bg-overlay); border: 1px solid var(--border-subtle); color: var(--text-muted); font-family: var(--font-mono); &--more { opacity: 0.6; } } .repo-card__footer { display: flex; align-items: center; gap: var(--space-4); margin-top: auto; padding-top: var(--space-2); border-top: 1px solid var(--border-subtle); } .repo-card__stat { display: inline-flex; align-items: center; gap: 4px; font-size: var(--text-xs); color: var(--text-muted); svg { opacity: 0.7; } } /* ── Table ──────────────────────────────────────────────────────────────── */ .table { width: 100%; border-collapse: collapse; font-size: var(--text-base); } .table th { text-align: left; padding: var(--space-2) var(--space-3); font-size: var(--text-xs); font-weight: var(--weight-semibold); color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.5px; border-bottom: 1px solid var(--border-default); } .table td { padding: var(--space-2) var(--space-3); border-bottom: 1px solid var(--border-subtle); color: var(--text-secondary); vertical-align: top; } .table tr:last-child td { border-bottom: none; } .table tr:hover td { background: var(--bg-overlay); } /* ── Grids ──────────────────────────────────────────────────────────────── */ .grid-auto { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: var(--space-3); } .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-3); } .grid-3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: var(--space-3); } /* ── Metadata rows ──────────────────────────────────────────────────────── */ .meta-row { display: flex; gap: var(--space-6); flex-wrap: wrap; margin-bottom: var(--space-3); } .meta-item { display: flex; flex-direction: column; gap: var(--space-1); } .meta-label { font-size: var(--text-xs); color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.5px; } .meta-value { font-size: var(--text-base); color: var(--text-primary); } /* ── Heatmap (legacy — use .prof-canvas for activity canvas) ────────────── */ .heatmap-grid { display: flex; gap: 3px; overflow-x: auto; } .heatmap-week { display: flex; flex-direction: column; gap: 3px; } .heatmap-day { width: 12px; height: 12px; border-radius: 2px; background: var(--bg-overlay); } .heatmap-day[data-count="0"] { background: var(--bg-overlay); } .heatmap-day[data-count="1"] { background: var(--dim-rhythmic-muted); } .heatmap-day[data-count="2"] { background: var(--dim-rhythmic); opacity: 0.6; } .heatmap-day[data-count="3"] { background: var(--dim-rhythmic); } .heatmap-day[data-count="4"] { background: var(--color-success); } /* ── Insights grid / stat card ──────────────────────────────────────────── */ .insights-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: var(--space-4); margin-bottom: var(--space-4); } .stat-card { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-base); padding: var(--space-4); text-align: center; .stat-value { font-family: var(--font-mono); font-size: var(--text-2xl); font-weight: var(--weight-bold); color: var(--color-accent); display: block; line-height: 1.1; } .stat-label { font-size: var(--text-sm); color: var(--text-muted); margin-top: var(--space-1); } } /* ── Stat cell (Muse protocol strip) ────────────────────────────────────── */ .stat-cell-muse { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: var(--space-4) var(--space-5); border: 1px solid var(--border-default); border-radius: var(--radius-base); text-align: center; background: var(--bg-surface); } .stat-num-muse { font-family: var(--font-mono); font-size: 26px; font-weight: var(--weight-bold); color: var(--color-accent); line-height: 1.1; display: block; } .stat-lbl-muse { font-size: 11px; color: var(--text-muted); margin-top: var(--space-1); line-height: 1.3; } /* ── Comment thread ─────────────────────────────────────────────────────── */ .comment-thread { border-top: 1px solid var(--border-subtle); margin-top: var(--space-4); padding-top: var(--space-4); margin-bottom: var(--space-4); &:last-child { margin-bottom: 0; } } .comment-row { display: flex; gap: var(--space-3); align-items: flex-start; } .comment-reply-row { margin-top: var(--space-3); } .comment-body-col { flex: 1; min-width: 0; } .comment-meta { display: flex; align-items: baseline; gap: var(--space-2); margin-bottom: var(--space-1); } .comment-author { font-size: var(--text-sm); font-weight: var(--weight-medium); color: var(--text-primary); } .comment-ts { font-size: var(--text-xs); color: var(--text-muted); } .comment-date { font-size: var(--text-xs); color: var(--text-muted); margin-left: auto; } .comment-text, .comment-body { font-size: var(--text-sm); color: var(--text-secondary); white-space: pre-wrap; word-break: break-word; line-height: 1.6; margin-bottom: 6px; } .comment-actions { display: flex; gap: var(--space-1); margin-top: var(--space-1); } .comment-delete-btn { color: var(--color-danger); } .comment-replies { margin-top: var(--space-3); padding-left: var(--space-4); border-left: 2px solid var(--border-subtle); display: flex; flex-direction: column; gap: var(--space-3); } .comment-replies .comment-reply { margin-bottom: 0; } .reply-form { margin-top: var(--space-2); } .comment-textarea { width: 100%; font-family: var(--font-sans); font-size: var(--text-sm); } .comment-form-actions { display: flex; gap: var(--space-2); margin-top: var(--space-1); } /* ── Reactions ──────────────────────────────────────────────────────────── */ .reaction-bar { display: flex; flex-wrap: wrap; gap: 6px; padding: var(--space-3) 0; } .reaction-btn { display: inline-flex; align-items: center; gap: 4px; padding: 4px 10px; border: 1px solid var(--border-subtle); border-radius: 20px; background: var(--bg-overlay); color: var(--text-primary); font-size: 16px; cursor: pointer; transition: background var(--transition-fast), border-color var(--transition-fast), transform var(--transition-fast); line-height: 1; user-select: none; &:hover { background: var(--bg-hover); border-color: var(--color-accent); transform: scale(1.08); } &.active, &--active { background: color-mix(in srgb, var(--color-accent) 15%, transparent); border-color: var(--color-accent); } } .reaction-count { font-size: 12px; font-weight: var(--weight-semibold); color: var(--text-secondary); min-width: 12px; } .reaction-btn--active .reaction-count { color: var(--color-accent); } /* ── Follow button ──────────────────────────────────────────────────────── */ .follow-btn { background: var(--bg-overlay); border: 1px solid var(--border-default); border-radius: var(--radius-base); padding: 5px var(--space-4); cursor: pointer; font-size: var(--text-sm); color: var(--text-secondary); transition: background var(--transition-fast), border-color var(--transition-fast); &.following { background: var(--color-success-bg); border-color: var(--color-success-bg); color: #fff; } } /* ── Analysis grid ──────────────────────────────────────────────────────── */ .analysis-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 14px; margin-top: 4px; } .analysis-card { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-md); padding: var(--space-4); display: flex; flex-direction: column; gap: 6px; transition: border-color var(--transition-fast), background var(--transition-fast); color: inherit; text-decoration: none; &:hover { border-color: var(--color-accent); text-decoration: none; } } .card-emoji { font-size: 22px; } .card-dim { font-size: 11px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.6px; } .card-metric { font-size: 18px; font-weight: var(--weight-bold); color: var(--text-primary); word-break: break-word; } .card-sub { font-size: 12px; color: var(--text-muted); } .card-spark { font-size: 14px; color: var(--color-success); letter-spacing: 1px; margin-top: 2px; } /* ── Waveform placeholder ───────────────────────────────────────────────── */ .waveform-bar { display: flex; align-items: flex-end; gap: 2px; height: 48px; overflow: hidden; .wave-col { flex: 1; background: var(--color-accent); opacity: 0.6; border-radius: 2px 2px 0 0; min-height: 4px; transition: height 0.1s; } } /* ── Diff stats ─────────────────────────────────────────────────────────── */ .diff-stat { display: flex; gap: var(--space-3); font-size: 13px; flex-wrap: wrap; } .diff-stat-additions { color: var(--color-success); font-weight: var(--weight-semibold); } .diff-stat-deletions { color: var(--color-danger); font-weight: var(--weight-semibold); } .diff-stat-files { color: var(--text-muted); } /* ── Issue preview ──────────────────────────────────────────────────────── */ .issue-preview { font-size: var(--text-sm); color: var(--text-muted); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } /* ── Label / pill utilities ─────────────────────────────────────────────── */ .label { display: inline-block; padding: 1px var(--space-2); border-radius: var(--radius-full); font-size: var(--text-xs); background: var(--bg-hover); color: var(--text-secondary); margin: 2px; } .label-pill { transition: opacity var(--transition-fast), outline var(--transition-fast); } .label-pill:hover { opacity: 0.8; outline: 1px solid var(--color-accent); } .label-active { outline: 2px solid var(--color-accent); background: color-mix(in srgb, var(--color-accent) 15%, var(--bg-hover)); color: var(--color-accent); } /* ── HTMX indicator ─────────────────────────────────────────────────────── */ .htmx-indicator { opacity: 0; transition: opacity 0.2s ease; } .htmx-request .htmx-indicator, .htmx-request.htmx-indicator { opacity: 1; } /* ── Session notes preview ──────────────────────────────────────────────── */ .session-notes-preview { font-size: 12px; color: var(--text-muted); margin-top: 3px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 600px; font-style: italic; } .session-row-participants { margin-top: 6px; }