// ───────────────────────────────────────────────────────────────────────────── // Component: Commit Detail (.cmt-* prefix) // File: src/scss/components/_commit-detail.scss // // Visual rules only — colors, typography, backgrounds, borders, animations. // Structural layout lives in pages/_commit-detail.scss. // ───────────────────────────────────────────────────────────────────────────── // ── Hero ───────────────────────────────────────────────────────────────────── .cmt-hero { background: linear-gradient(135deg, var(--bg-base) 0%, var(--bg-hero-mid) 60%, var(--bg-base) 100%); &.cmt-hero--breaking { border-left: 3px solid var(--color-danger); } } .cmt-hero-glow { position: absolute; inset: 0; pointer-events: none; } .cmt-hero--feat .cmt-hero-glow { background: radial-gradient(ellipse 55% 80% at 80% 30%, color-mix(in srgb, var(--color-accent) 8%, transparent) 0%, transparent 65%); } .cmt-hero--fix .cmt-hero-glow { background: radial-gradient(ellipse 55% 80% at 80% 30%, color-mix(in srgb, var(--color-danger) 7%, transparent) 0%, transparent 65%); } .cmt-hero--refactor .cmt-hero-glow { background: radial-gradient(ellipse 55% 80% at 80% 30%, color-mix(in srgb, var(--color-orange) 7%, transparent) 0%, transparent 65%); } .cmt-hero--perf .cmt-hero-glow { background: radial-gradient(ellipse 55% 80% at 80% 30%, color-mix(in srgb, var(--color-warning) 7%, transparent) 0%, transparent 65%); } .cmt-hero--test .cmt-hero-glow { background: radial-gradient(ellipse 55% 80% at 80% 30%, color-mix(in srgb, var(--color-success) 7%, transparent) 0%, transparent 65%); } .cmt-hero--docs .cmt-hero-glow { background: radial-gradient(ellipse 55% 80% at 80% 30%, color-mix(in srgb, var(--color-teal) 6%, transparent) 0%, transparent 65%); } .cmt-hero--agent .cmt-hero-glow { background: radial-gradient(ellipse 40% 60% at 15% 60%, color-mix(in srgb, var(--color-accent) 5%, transparent) 0%, transparent 60%), radial-gradient(ellipse 55% 80% at 80% 30%, color-mix(in srgb, var(--color-accent) 8%, transparent) 0%, transparent 65%); } .cmt-hero--default .cmt-hero-glow { background: radial-gradient(ellipse 55% 80% at 80% 30%, color-mix(in srgb, var(--text-muted) 5%, transparent) 0%, transparent 65%); } .cmt-hero-title { font-size: clamp(18px, 2.5vw, 26px); font-weight: var(--weight-bold); color: var(--text-primary); line-height: 1.25; margin: 0; } .cmt-hero-desc { font-size: 13px; color: var(--text-secondary); line-height: 1.65; max-width: 640px; p { margin: 0; } p + p { margin-top: 8px; } } .cmt-hero-actor { font-size: 13px; font-weight: var(--weight-semibold); color: var(--text-primary); text-decoration: none; &:hover { color: var(--color-accent); } } .cmt-hero-sep { color: var(--border-default); font-size: 13px; } .cmt-hero-time { font-size: 12px; color: var(--text-secondary); } .cmt-hero-date { font-size: 12px; color: var(--text-muted); } .cmt-hero-agent-badge { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: var(--weight-semibold); color: var(--color-accent); background: color-mix(in srgb, var(--color-accent) 10%, transparent); border: 1px solid color-mix(in srgb, var(--color-accent) 25%, transparent); border-radius: var(--radius-full); padding: 2px 9px; svg { color: var(--color-accent); } } // ── Manifest ───────────────────────────────────────────────────────────────── .cmt-manifest-key { color: var(--text-muted); } .cmt-manifest-val { color: var(--text-secondary); font-size: 12px; &.cmt-mono { font-family: var(--font-mono); font-size: 11px; word-break: break-all; color: var(--text-secondary); } } .cmt-muted { color: var(--text-muted); } .cmt-mono { font-family: var(--font-mono); } .cmt-green { color: var(--color-success); display: inline-flex; align-items: center; gap: 4px; } .cmt-truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .cmt-sha-break { font-size: 10px; word-break: break-all; } .cmt-copy-btn { background: none; border: none; padding: 2px; cursor: pointer; color: var(--text-muted); border-radius: var(--radius-sm); display: inline-flex; align-items: center; transition: color var(--transition-fast), background var(--transition-fast); &:hover { color: var(--text-primary); background: var(--bg-overlay); } } .cmt-parent-chip { font-family: var(--font-mono); font-size: 11px; color: var(--color-accent-link); text-decoration: none; background: color-mix(in srgb, var(--color-accent) 10%, transparent); border: 1px solid color-mix(in srgb, var(--color-accent) 20%, transparent); border-radius: var(--radius-sm); padding: 1px 6px; &:hover { background: color-mix(in srgb, var(--color-accent) 18%, transparent); } } // ── Type / semver / scope badges ────────────────────────────────────────────── .cmt-type { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: var(--radius-sm); font-size: 11px; font-weight: var(--weight-bold); font-family: var(--font-mono); text-transform: lowercase; letter-spacing: 0.02em; } .cmt-type--feat { background: color-mix(in srgb, var(--color-accent) 12%, transparent); color: var(--color-accent); border: 1px solid color-mix(in srgb, var(--color-accent) 25%, transparent); } .cmt-type--fix { background: color-mix(in srgb, var(--color-danger) 12%, transparent); color: var(--color-danger); border: 1px solid color-mix(in srgb, var(--color-danger) 25%, transparent); } .cmt-type--chore { background: color-mix(in srgb, var(--text-muted) 10%, transparent); color: var(--text-muted); border: 1px solid color-mix(in srgb, var(--text-muted) 20%, transparent); } .cmt-type--style { background: color-mix(in srgb, var(--color-purple) 12%, transparent); color: var(--color-purple); border: 1px solid color-mix(in srgb, var(--color-purple) 25%, transparent); } .cmt-type--refactor { background: color-mix(in srgb, var(--color-orange) 12%, transparent); color: var(--color-orange); border: 1px solid color-mix(in srgb, var(--color-orange) 25%, transparent); } .cmt-type--docs { background: color-mix(in srgb, var(--color-teal) 12%, transparent); color: var(--color-teal); border: 1px solid color-mix(in srgb, var(--color-teal) 25%, transparent); } .cmt-type--test { background: color-mix(in srgb, var(--color-success) 12%, transparent); color: var(--color-success); border: 1px solid color-mix(in srgb, var(--color-success) 25%, transparent); } .cmt-type--perf { background: color-mix(in srgb, var(--color-warning) 12%, transparent); color: var(--color-warning); border: 1px solid color-mix(in srgb, var(--color-warning) 25%, transparent); } .cmt-type--build { background: color-mix(in srgb, var(--color-orange) 12%, transparent); color: var(--color-orange); border: 1px solid color-mix(in srgb, var(--color-orange) 25%, transparent); } .cmt-type--ci { background: color-mix(in srgb, var(--color-teal) 12%, transparent); color: var(--color-teal); border: 1px solid color-mix(in srgb, var(--color-teal) 25%, transparent); } .cmt-sv { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: var(--radius-sm); font-size: 10px; font-weight: var(--weight-bold); font-family: var(--font-mono); text-transform: uppercase; letter-spacing: 0.05em; } .cmt-sv--breaking { background: color-mix(in srgb, var(--color-danger) 15%, transparent); color: var(--color-danger); border: 1px solid color-mix(in srgb, var(--color-danger) 30%, transparent); } .cmt-sv--major { background: color-mix(in srgb, var(--color-danger) 10%, transparent); color: var(--color-danger); border: 1px solid color-mix(in srgb, var(--color-danger) 20%, transparent); } .cmt-sv--minor { background: color-mix(in srgb, var(--color-accent) 10%, transparent); color: var(--color-accent); border: 1px solid color-mix(in srgb, var(--color-accent) 20%, transparent); } .cmt-sv--patch { background: color-mix(in srgb, var(--color-success) 10%, transparent); color: var(--color-success); border: 1px solid color-mix(in srgb, var(--color-success) 20%, transparent); } .cmt-scope { font-size: 11px; font-family: var(--font-mono); color: var(--text-muted); background: var(--bg-overlay); border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); padding: 2px 7px; } .cmt-branch-pill { display: inline-flex; align-items: center; gap: 4px; font-size: 11px; font-family: var(--font-mono); color: var(--text-secondary); background: var(--bg-overlay); border: 1px solid var(--border-subtle); border-radius: var(--radius-full); padding: 2px 8px; svg { color: var(--text-muted); } } .cmt-pos-pill { font-size: 10px; font-family: var(--font-mono); color: var(--text-muted); background: var(--bg-overlay); border: 1px solid var(--border-subtle); border-radius: var(--radius-full); padding: 2px 7px; } // ── Dimension strip ─────────────────────────────────────────────────────────── .cmt-dim { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-md); } .cmt-dim-num { font-size: 22px; font-weight: var(--weight-bold); font-family: var(--font-mono); line-height: 1; } .cmt-dim-label { font-size: 10px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.06em; font-weight: var(--weight-medium); } .cmt-dim--add { border-left: 2px solid var(--color-success); .cmt-dim-num { color: var(--color-success); } } .cmt-dim--mod { border-left: 2px solid var(--color-warning); .cmt-dim-num { color: var(--color-warning); } } .cmt-dim--del { border-left: 2px solid var(--color-danger); .cmt-dim-num { color: var(--color-danger); } } .cmt-dim--files { .cmt-dim-num { color: var(--text-primary); } } .cmt-dim--snap { .cmt-dim-num { color: var(--text-secondary);} } .cmt-dim--dead { border-left: 2px solid var(--color-danger); .cmt-dim-num { color: var(--color-danger); } } .cmt-dim--clean { .cmt-dim-num { color: var(--color-success); } } .cmt-dim--test { border-left: 2px solid var(--color-accent); .cmt-dim-num { color: var(--color-accent); } } // ── Sections ────────────────────────────────────────────────────────────────── .cmt-section { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-md); overflow: hidden; } .cmt-section-hd { border-bottom: 1px solid var(--border-subtle); background: var(--bg-surface); } .cmt-section-summary { cursor: pointer; user-select: none; list-style: none; &::-webkit-details-marker { display: none; } &:hover { background: var(--bg-overlay); } } .cmt-chevron { color: var(--text-muted); transition: transform var(--transition-fast); } details.cmt-section--collapsible[open] .cmt-chevron { transform: rotate(180deg); } .cmt-section-title { font-size: 13px; font-weight: var(--weight-semibold); color: var(--text-primary); } .cmt-section-pill { font-size: 10px; font-weight: var(--weight-semibold); color: var(--text-muted); background: var(--bg-overlay); border: 1px solid var(--border-subtle); border-radius: var(--radius-full); padding: 1px 7px; font-family: var(--font-mono); &.cmt-pill--count { color: var(--color-accent); background: color-mix(in srgb, var(--color-accent) 10%, transparent); border-color: color-mix(in srgb, var(--color-accent) 20%, transparent); } } // ── Op dots ─────────────────────────────────────────────────────────────────── .cmt-op { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; border-radius: 50%; font-size: 11px; font-weight: var(--weight-bold); flex-shrink: 0; line-height: 1; } .cmt-op--add { background: color-mix(in srgb, var(--color-success) 15%, transparent); color: var(--color-success); } .cmt-op--del { background: color-mix(in srgb, var(--color-danger) 15%, transparent); color: var(--color-danger); } .cmt-op--mod { background: color-mix(in srgb, var(--color-warning) 15%, transparent); color: var(--color-warning); } .cmt-op--unk { background: var(--bg-overlay); color: var(--text-muted); } // ── File cards ──────────────────────────────────────────────────────────────── .cmt-file-card { border-bottom: 1px solid var(--border-subtle); &:last-child { border-bottom: none; } } .cmt-file-hd { background: color-mix(in srgb, var(--bg-overlay) 50%, transparent); } .cmt-file-card--insert { border-left: 2px solid var(--color-success); } .cmt-file-card--delete { border-left: 2px solid var(--color-danger); } .cmt-file-card--replace, .cmt-file-card--patch { border-left: 2px solid var(--color-warning); } .cmt-file-path { font-family: var(--font-mono); font-size: 12px; font-weight: var(--weight-semibold); color: var(--text-primary); text-decoration: none; &:hover { color: var(--color-accent-link); text-decoration: underline; } } .cmt-ext { font-family: var(--font-mono); font-size: 10px; color: var(--text-muted); background: var(--bg-overlay); border: 1px solid var(--border-subtle); border-radius: 3px; padding: 1px 5px; } .cmt-file-summary { font-size: 11px; color: var(--text-muted); } // ── Symbol tree ─────────────────────────────────────────────────────────────── .cmt-sym-row { border-radius: var(--radius-sm); transition: background var(--transition-fast); &:hover { background: var(--bg-overlay); } } .cmt-sym-indent { color: var(--border-default); } .cmt-sym-name { font-family: var(--font-mono); font-size: 12px; color: var(--text-primary); font-weight: var(--weight-medium); &.cmt-sym-name--link { text-decoration: none; &:hover { color: var(--color-accent-link); text-decoration: underline; } } &.cmt-sym-name--child { color: var(--text-secondary); } } .cmt-sym-desc { font-size: 11px; color: var(--text-muted); } .cmt-sym-row--delete .cmt-sym-name { color: var(--text-muted); text-decoration: line-through; } // ── Kind chips ──────────────────────────────────────────────────────────────── .cmt-kind { font-size: 9px; font-weight: var(--weight-bold); font-family: var(--font-mono); text-transform: uppercase; letter-spacing: 0.04em; padding: 1px 5px; border-radius: 3px; } .cmt-kind--class { background: color-mix(in srgb, var(--color-accent) 10%, transparent); color: var(--color-accent); border: 1px solid color-mix(in srgb, var(--color-accent) 20%, transparent); } .cmt-kind--method { background: color-mix(in srgb, var(--color-purple) 10%, transparent); color: var(--color-purple); border: 1px solid color-mix(in srgb, var(--color-purple) 20%, transparent); } .cmt-kind--func { background: color-mix(in srgb, var(--color-teal) 10%, transparent); color: var(--color-teal); border: 1px solid color-mix(in srgb, var(--color-teal) 20%, transparent); } .cmt-kind--var { background: color-mix(in srgb, var(--color-orange) 10%, transparent); color: var(--color-orange); border: 1px solid color-mix(in srgb, var(--color-orange) 20%, transparent); } .cmt-kind--import { background: color-mix(in srgb, var(--text-muted) 10%, transparent); color: var(--text-muted); border: 1px solid color-mix(in srgb, var(--text-muted) 20%, transparent); } // ── Flat file list ──────────────────────────────────────────────────────────── .cmt-fl-row { border-radius: var(--radius-sm); transition: background var(--transition-fast); &:hover { background: var(--bg-overlay); } } .cmt-fl-dot { font-size: 13px; font-weight: var(--weight-bold); font-family: var(--font-mono); } .cmt-fl-row--add .cmt-fl-dot { color: var(--color-success); } .cmt-fl-row--mod .cmt-fl-dot { color: var(--color-warning); } .cmt-fl-row--del .cmt-fl-dot { color: var(--color-danger); } .cmt-fl-path { font-family: var(--font-mono); font-size: 12px; color: var(--text-primary); text-decoration: none; &:hover { color: var(--color-accent-link); text-decoration: underline; } } .cmt-fl-path--gone { color: var(--text-muted); text-decoration: line-through; } .cmt-tally-add, .cmt-tally-mod, .cmt-tally-del { font-size: 11px; font-weight: var(--weight-bold); font-family: var(--font-mono); padding: 1px 6px; border-radius: var(--radius-sm); } .cmt-tally-add { color: var(--color-success); background: color-mix(in srgb, var(--color-success) 10%, transparent); } .cmt-tally-mod { color: var(--color-warning); background: color-mix(in srgb, var(--color-warning) 10%, transparent); } .cmt-tally-del { color: var(--color-danger); background: color-mix(in srgb, var(--color-danger) 10%, transparent); } // ── Commit navigation ───────────────────────────────────────────────────────── .cmt-nav-card { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-md); text-decoration: none; transition: border-color var(--transition-fast), background var(--transition-fast); &:hover { border-color: var(--color-accent); background: color-mix(in srgb, var(--color-accent) 5%, var(--bg-surface)); } } .cmt-nav-card--disabled { background: var(--bg-surface); border: 1px solid var(--border-subtle); border-radius: var(--radius-md); opacity: 0.4; } .cmt-nav-dir { font-size: 11px; font-weight: var(--weight-semibold); color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.06em; display: inline-flex; align-items: center; gap: 4px; } .cmt-nav-msg { font-size: 13px; color: var(--text-primary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .cmt-nav-sha { font-family: var(--font-mono); font-size: 10px; color: var(--text-muted); } .cmt-nav-all { font-size: 12px; color: var(--color-accent-link); text-decoration: none; &:hover { text-decoration: underline; } } // ── Discussion ──────────────────────────────────────────────────────────────── .cmt-disc-title { font-size: 15px; font-weight: var(--weight-semibold); color: var(--text-primary); margin: 0; } .cmt-disc-hd { svg { color: var(--text-muted); } } .cmt-cli-hint { color: var(--text-secondary); background: var(--bg-elevated); border: 1px solid var(--border-subtle); } // ── Sidebar panel ───────────────────────────────────────────────────────────── .cmt-side-panel { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-md); overflow: hidden; &.cmt-side-panel--agent { border-color: color-mix(in srgb, var(--color-accent) 35%, transparent); } } .cmt-prov-glow { position: absolute; inset: 0; background: radial-gradient(ellipse at 50% 0%, color-mix(in srgb, var(--color-accent) 8%, transparent) 0%, transparent 65%); pointer-events: none; } .cmt-scard-hd { background: var(--bg-surface); svg { color: var(--text-muted); flex-shrink: 0; } span { flex: 1; min-width: 0; } } .cmt-scard-label { font-size: 10px; font-weight: var(--weight-semibold); color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.05em; &.cmt-scard-label--danger { color: var(--color-danger); } } .cmt-scard-val { font-size: 12px; color: var(--text-secondary); } // Sidebar heading style: same as proposal-scard-hd .cmt-scard-hd { font-size: 11px; font-weight: var(--weight-semibold); color: var(--text-primary); text-transform: uppercase; letter-spacing: 0.06em; } .cmt-sig-badge { display: inline-flex; align-items: center; gap: 3px; font-size: 9px; font-weight: var(--weight-bold); text-transform: uppercase; letter-spacing: 0.06em; color: var(--color-success); background: color-mix(in srgb, var(--color-success) 10%, transparent); border: 1px solid color-mix(in srgb, var(--color-success) 25%, transparent); border-radius: var(--radius-full); padding: 2px 7px; margin-left: auto; } .cmt-prov-agent { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: var(--weight-semibold); color: var(--color-accent); svg { color: var(--color-accent); } } .cmt-prov-model { font-family: var(--font-mono); font-size: 11px; color: var(--text-muted); background: var(--bg-overlay); border: 1px solid var(--border-subtle); border-radius: var(--radius-full); padding: 2px 8px; align-self: flex-start; } .cmt-prov-human { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: var(--weight-semibold); color: var(--text-secondary); svg { color: var(--text-muted); } } .cmt-scard-row--breaking { background: color-mix(in srgb, var(--color-danger) 6%, transparent); } .cmt-break-item { font-size: 11px; color: var(--color-danger); font-family: var(--font-mono); } .cmt-reviewer { font-size: 11px; color: var(--text-secondary); background: var(--bg-overlay); border: 1px solid var(--border-subtle); border-radius: var(--radius-full); padding: 1px 7px; }