// _blob.scss — Blob / blame / search pages (.blob-*, .blob2-*, .blame-*, .sr-* prefixes) /* ========================================================================= Blame page (v2 — piano-roll blame visualization) ========================================================================= */ // ── Header ──────────────────────────────────────────────────────────────── .blame2-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; flex-wrap: wrap; padding-bottom: 12px; border-bottom: 1px solid var(--border-default); margin-bottom: 12px; } .blame2-title-group { display: flex; align-items: center; gap: 12px; } .blame2-icon-wrap { width: 36px; height: 36px; display: flex; align-items: center; justify-content: center; background: rgba(88,166,255,0.12); border-radius: var(--radius); color: #58a6ff; flex-shrink: 0; } .blame2-title { margin: 0; font-size: 17px; color: var(--text-secondary); font-weight: 600; } .blame2-path-code { font-size: 15px; background: var(--bg-overlay); padding: 2px 8px; border-radius: 4px; color: var(--text-primary); } .blame2-ref-code { font-size: 12px; background: var(--bg-overlay); padding: 1px 6px; border-radius: 4px; color: var(--text-muted); font-family: var(--font-mono); } .blame2-subtitle { margin: 4px 0 0; font-size: 13px; color: var(--text-muted); } .blame2-file-link { color: var(--color-accent); text-decoration: none; font-size: 13px; } .blame2-file-link:hover { text-decoration: underline; } .blame2-actions { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; } // ── Stats strip ─────────────────────────────────────────────────────────── .blame2-stats { display: flex; gap: 0; background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius); overflow: hidden; margin-bottom: 10px; } .blame2-stat { display: flex; flex-direction: column; align-items: center; padding: 10px 20px; flex: 1; border-right: 1px solid var(--border-default); &:last-child { border-right: none; } } .blame2-stat-val { font-size: 18px; font-weight: 700; color: var(--text-secondary); font-variant-numeric: tabular-nums; } .blame2-stat-lbl { font-size: 11px; color: var(--text-muted); margin-top: 2px; text-transform: uppercase; letter-spacing: 0.04em; } // ── Filter bar ──────────────────────────────────────────────────────────── .blame2-filter { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; padding: 8px 12px; background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius); margin-bottom: 14px; font-size: 13px; } .blame2-filter-label { display: flex; align-items: center; gap: 6px; color: var(--text-muted); } .blame2-filter-select, .blame2-filter-input { font-size: 12px; background: var(--bg-base); border: 1px solid var(--border-default); color: var(--text-primary); border-radius: 4px; padding: 4px 8px; } .blame2-filter-clear { font-size: 12px; color: var(--text-muted); text-decoration: none; margin-left: 4px; &:hover { color: var(--text-secondary); } } // ── Empty state ─────────────────────────────────────────────────────────── .blame2-empty { padding: 60px 24px; text-align: center; color: var(--text-muted); font-size: 14px; display: flex; flex-direction: column; align-items: center; gap: 4px; } .blame2-empty-hint { font-size: 12px; color: var(--text-muted); opacity: 0.7; } // ── Two-column layout ────────────────────────────────────────────────────── .blame2-layout { display: grid; grid-template-columns: 240px 1fr; gap: var(--space-3); align-items: start; } @media (max-width: 768px) { .blame2-layout { grid-template-columns: 1fr; } } // ── Commit legend (left panel) ──────────────────────────────────────────── .blame2-legend { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius); overflow: hidden; } .blame2-legend-title { margin: 0; padding: 8px 12px; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); border-bottom: 1px solid var(--border-default); background: var(--bg-overlay); } .blame2-commit { display: flex; align-items: flex-start; gap: 10px; padding: 10px 12px; border-bottom: 1px solid var(--border-subtle); text-decoration: none; transition: background 0.1s; &:last-child { border-bottom: none; } &:hover { background: var(--bg-overlay); } } .blame2-commit-dot { width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; margin-top: 3px; } .blame2-commit-body { min-width: 0; flex: 1; } .blame2-commit-top { display: flex; justify-content: space-between; align-items: baseline; gap: 6px; margin-bottom: 2px; } .blame2-commit-sha { font-family: var(--font-mono); font-size: 11px; color: var(--color-accent); } .blame2-commit-count { font-size: 10px; color: var(--text-muted); white-space: nowrap; } .blame2-commit-msg { font-size: 12px; color: var(--text-primary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-bottom: 2px; } .blame2-commit-meta { font-size: 11px; color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } // ── Blame canvas (right panel) ──────────────────────────────────────────── .blame2-canvas { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius); overflow: hidden; } // Beat ruler .blame2-ruler { position: relative; height: 20px; background: var(--bg-overlay); border-bottom: 1px solid var(--border-default); font-family: var(--font-mono); font-size: 10px; color: var(--text-muted); overflow: hidden; } .blame2-ruler-tick { position: absolute; top: 4px; transform: translateX(-50%); white-space: nowrap; pointer-events: none; line-height: 1; } .blame2-ruler-minor { position: absolute; top: 14px; width: 1px; height: 5px; background: var(--border-subtle); transform: translateX(-50%); pointer-events: none; } // Track lanes .blame2-track { display: flex; align-items: stretch; border-bottom: 1px solid var(--border-subtle); &:last-child { border-bottom: none; } &:hover { background: rgba(255,255,255,0.02); } } .blame2-track-label { width: 72px; flex-shrink: 0; display: flex; align-items: center; padding: 0 10px; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; color: var(--text-muted); border-right: 1px solid var(--border-default); background: var(--bg-overlay); } .blame2-track-lane { position: relative; flex: 1; height: 88px; overflow: hidden; } .blame2-grid-line { position: absolute; top: 0; bottom: 0; width: 1px; background: var(--border-subtle); pointer-events: none; } .blame2-note { position: absolute; height: 8px; min-width: 3px; border-radius: 2px; opacity: 0.85; cursor: pointer; transition: opacity 0.1s, transform 0.1s; &:hover { opacity: 1; transform: scaleY(1.3); z-index: 2; } } // ── Hover tooltip ───────────────────────────────────────────────────────── .blame2-tooltip { position: absolute; z-index: 1000; background: var(--bg-overlay); border: 1px solid var(--border-default); border-radius: var(--radius); padding: 10px 12px; font-size: 12px; min-width: 220px; max-width: 320px; pointer-events: none; box-shadow: 0 8px 24px rgba(0,0,0,0.5); } .blame2-tip-sha { font-family: var(--font-mono); font-size: 11px; color: var(--color-accent); margin-bottom: 4px; } .blame2-tip-msg { color: var(--text-primary); margin-bottom: 8px; font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .blame2-tip-row { display: flex; justify-content: space-between; gap: 12px; font-size: 11px; color: var(--text-muted); padding: 1px 0; span:last-child { color: var(--text-secondary); font-family: var(--font-mono); } } // ── Type badge ──────────────────────────────────────────────────────────── .blame2-type-badge { display: inline-block; font-size: 10px; font-weight: 600; padding: 2px 7px; border-radius: 12px; vertical-align: middle; margin-left: 8px; text-transform: uppercase; letter-spacing: 0.05em; } .blame2-type-symbol { background: rgba(88,166,255,0.15); color: #58a6ff; } .blame2-type-midi { background: rgba(63,185,80,0.15); color: #3fb950; } .blame2-type-file { background: rgba(240,136,62,0.15); color: #f0883e; } // ── Symbol blame table ───────────────────────────────────────────────────── .blame2-symbol-table-wrap { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius); overflow: hidden; } .blame2-symbol-table { width: 100%; border-collapse: collapse; font-size: 13px; th { text-align: left; padding: 8px 12px; border-bottom: 1px solid var(--border-default); color: var(--text-muted); font-weight: 500; font-size: 11px; text-transform: uppercase; letter-spacing: 0.04em; background: var(--bg-overlay); white-space: nowrap; } } .blame2-symbol-row { border-bottom: 1px solid var(--border-subtle); &:last-child { border-bottom: none; } &:hover td { background: rgba(255,255,255,0.02); } td { padding: 7px 12px; vertical-align: middle; } } .blame2-symbol-name { font-family: var(--font-mono); font-size: 12px; } .blame2-symbol-link { color: var(--text-secondary); text-decoration: none; &:hover { color: var(--color-accent); text-decoration: underline; } } .blame2-commit-msg-inline { font-size: 12px; color: var(--text-muted); margin-left: 8px; } .blame2-author { font-size: 12px; color: var(--text-muted); white-space: nowrap; } .blame2-date { font-size: 12px; color: var(--text-muted); white-space: nowrap; } .blame2-op { display: inline-block; padding: 1px 7px; border-radius: 10px; font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; } .blame2-op-add { background: rgba(63,185,80,0.15); color: #3fb950; } .blame2-op-modify { background: rgba(88,166,255,0.15); color: #58a6ff; } .blame2-op-delete { background: rgba(248,81,73,0.15); color: #f85149; } .blame2-changes { display: flex; align-items: center; gap: 8px; white-space: nowrap; } .blame2-heat-bar { width: 48px; height: 4px; background: var(--bg-overlay); border-radius: 2px; overflow: hidden; } .blame2-heat-fill { height: 100%; border-radius: 2px; background: linear-gradient(to right, #58a6ff, #ff7b72); min-width: 2px; } .blame2-change-count { font-size: 11px; color: var(--text-muted); font-variant-numeric: tabular-nums; } .blame2-file-fallback { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius); padding: 32px 20px; } .blame2-file-fallback-msg { font-size: 13px; color: var(--text-muted); } /* ========================================================================= Blame page (v3 — symbol-level redesign) .blame-* prefix. .blame2-* (piano roll) kept for MIDI files. ========================================================================= */ // ── Header ──────────────────────────────────────────────────────────────── .blame-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; flex-wrap: wrap; padding-bottom: 12px; border-bottom: 1px solid var(--border-default); margin-bottom: 12px; } .blame-title-group { display: flex; align-items: center; gap: 12px; } .blame-icon-wrap { width: 36px; height: 36px; display: flex; align-items: center; justify-content: center; background: rgba(88,166,255,0.12); border-radius: var(--radius); color: #58a6ff; flex-shrink: 0; } .blame-title { margin: 0; font-size: 17px; color: var(--text-secondary); font-weight: 600; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; } .blame-path-code { font-size: 15px; background: var(--bg-overlay); padding: 2px 8px; border-radius: 4px; color: var(--text-primary); } .blame-ref-code { font-size: 12px; background: var(--bg-overlay); padding: 1px 6px; border-radius: 4px; color: var(--text-muted); font-family: var(--font-mono); } .blame-subtitle { margin: 4px 0 0; font-size: 13px; color: var(--text-muted); } .blame-file-link { color: var(--color-accent); text-decoration: none; font-size: 13px; &:hover { text-decoration: underline; } } .blame-actions { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; } // ── Type badge ──────────────────────────────────────────────────────────── .blame-type-badge { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: 20px; font-size: 11px; font-weight: 600; letter-spacing: 0.03em; text-transform: uppercase; } .blame-type-symbol { background: rgba(88,166,255,0.15); color: #58a6ff; } .blame-type-midi { background: rgba(63,185,80,0.15); color: #3fb950; } .blame-type-file { background: rgba(240,136,62,0.15); color: #f0883e; } // ── Stats strip ─────────────────────────────────────────────────────────── .blame-stats { display: flex; gap: 0; background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius); overflow: hidden; margin-bottom: 14px; } .blame-stat { display: flex; flex-direction: column; align-items: center; padding: 10px 18px; flex: 1; border-right: 1px solid var(--border-default); &:last-child { border-right: none; } } .blame-stat-val { font-size: 18px; font-weight: 700; color: var(--text-secondary); font-variant-numeric: tabular-nums; } .blame-stat-lbl { font-size: 11px; color: var(--text-muted); margin-top: 2px; text-transform: uppercase; letter-spacing: 0.04em; } // Signal stats glow when non-zero .blame-stat-hotspot.blame-stat-active .blame-stat-val { color: #ffa657; } .blame-stat-dead.blame-stat-active .blame-stat-val { color: #79c0ff; } .blame-stat-blast.blame-stat-active .blame-stat-val { color: #ff7b72; } // ── Empty state ─────────────────────────────────────────────────────────── .blame-empty { text-align: center; padding: 64px 20px; color: var(--text-muted); code { background: var(--bg-overlay); padding: 1px 5px; border-radius: 3px; } } .blame-empty-hint { font-size: 12px; color: var(--text-muted); opacity: 0.7; margin-top: 6px; } // ── Two-column layout ───────────────────────────────────────────────────── .blame-layout { display: grid; grid-template-columns: 220px 1fr; gap: 14px; align-items: start; @media (max-width: 768px) { grid-template-columns: 1fr; } } .blame-content { min-width: 0; } // ── Commit legend (left panel) ──────────────────────────────────────────── .blame-legend { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius); overflow: hidden; position: sticky; top: 12px; } .blame-legend-header { display: flex; align-items: center; justify-content: space-between; padding: 8px 10px; border-bottom: 1px solid var(--border-default); background: var(--bg-overlay); } .blame-legend-title { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; color: var(--text-muted); } .blame-legend-authorship-key { font-size: 10px; color: var(--text-muted); white-space: nowrap; } .blame-legend-entry { display: flex; align-items: flex-start; gap: 8px; padding: 8px 10px; border-bottom: 1px solid var(--border-subtle, rgba(255,255,255,0.05)); text-decoration: none; transition: background 0.1s; &:last-child { border-bottom: none; } &:hover { background: var(--bg-overlay); } } .blame-legend-dot { width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; margin-top: 3px; } .blame-legend-body { min-width: 0; flex: 1; } .blame-legend-top { display: flex; align-items: center; gap: 5px; margin-bottom: 2px; } .blame-legend-sha { font-family: var(--font-mono); font-size: 11px; color: var(--color-accent); } .blame-legend-count { font-size: 10px; color: var(--text-muted); white-space: nowrap; margin-left: auto; } .blame-legend-msg { font-size: 12px; color: var(--text-primary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-bottom: 2px; } .blame-legend-meta { font-size: 11px; color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .blame-legend-model { display: inline-block; background: rgba(88,166,255,0.12); color: #58a6ff; font-size: 10px; padding: 0 4px; border-radius: 3px; margin-left: 4px; font-family: var(--font-mono); } // ── Authorship icons ────────────────────────────────────────────────────── .blame-author-icon { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; border-radius: 50%; flex-shrink: 0; } .blame-author-agent { background: rgba(88,166,255,0.15); color: #58a6ff; } .blame-author-human { background: rgba(63,185,80,0.12); color: #3fb950; } .blame-legend-author-icon { @extend .blame-author-icon; width: 14px; height: 14px; } // ── Symbol blame table ──────────────────────────────────────────────────── .blame-table { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius); overflow: hidden; } .blame-table-head { display: grid; grid-template-columns: 1fr 52px 110px 130px 88px 64px; padding: 6px 12px; background: var(--bg-overlay); border-bottom: 1px solid var(--border-default); font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); gap: 8px; } // ── Blame row (
) ───────────────────────────────────────────────── .blame-row { border-bottom: 1px solid var(--border-subtle, rgba(255,255,255,0.04)); &:last-child { border-bottom: none; } &[open] > summary { background: var(--bg-overlay); } &[open] .blame-expand-chevron { transform: rotate(0deg); } } .blame-row-summary { display: grid; grid-template-columns: 1fr 52px 110px 130px 88px 64px; align-items: center; padding: 7px 12px; gap: 8px; cursor: pointer; list-style: none; transition: background 0.1s; &:hover { background: var(--bg-overlay); } &::-webkit-details-marker { display: none; } } // Column spans — must match .blame-table-head grid .blame-col-symbol { display: flex; align-items: center; gap: 6px; min-width: 0; font-family: var(--font-mono); font-size: 12px; } .blame-col-op { display: flex; align-items: center; } .blame-col-heat { display: flex; align-items: center; gap: 6px; } .blame-col-author { display: flex; align-items: center; gap: 5px; min-width: 0; font-size: 12px; color: var(--text-muted); } .blame-col-age { font-size: 12px; color: var(--text-muted); white-space: nowrap; } .blame-col-signals { display: flex; align-items: center; gap: 3px; } .blame-expand-chevron { flex-shrink: 0; color: var(--text-muted); transform: rotate(-90deg); transition: transform 0.15s; details[open] & { transform: rotate(0deg); } } .blame-symbol-link { color: var(--text-secondary); text-decoration: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; &:hover { color: var(--color-accent); text-decoration: underline; } } .blame-author-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } // ── Op badges ──────────────────────────────────────────────────────────── .blame-op { display: inline-flex; align-items: center; padding: 1px 6px; border-radius: 3px; font-size: 10px; font-weight: 600; font-family: var(--font-mono); text-transform: lowercase; white-space: nowrap; } .blame-op-add { background: rgba(63,185,80,0.15); color: #3fb950; } .blame-op-modify, .blame-op-mod { background: rgba(88,166,255,0.15); color: #58a6ff; } .blame-op-delete, .blame-op-del { background: rgba(248,81,73,0.15); color: #f85149; } // ── Heat bar ────────────────────────────────────────────────────────────── .blame-heat-bar { width: 56px; height: 6px; background: var(--bg-overlay); border-radius: 3px; overflow: hidden; flex-shrink: 0; } .blame-heat-fill { height: 100%; border-radius: 3px; background: linear-gradient(90deg, #58a6ff 0%, #f0883e 60%, #ff7b72 100%); min-width: 2px; transition: width 0.2s; } .blame-heat-count { font-size: 11px; color: var(--text-muted); font-variant-numeric: tabular-nums; min-width: 14px; } // ── Signal badges ───────────────────────────────────────────────────────── .blame-signal { font-size: 13px; cursor: default; line-height: 1; opacity: 0.85; &:hover { opacity: 1; } } // ── Expanded history panel ──────────────────────────────────────────────── .blame-history-panel { padding: 0 12px 12px 12px; background: var(--bg-base); border-top: 1px solid var(--border-default); } .blame-history-table { width: 100%; border-collapse: collapse; font-size: 12px; margin-top: 10px; th { text-align: left; font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); padding: 4px 8px; border-bottom: 1px solid var(--border-default); } } .blame-history-row { &:hover td { background: var(--bg-overlay); } td { padding: 4px 8px; border-bottom: 1px solid var(--border-subtle, rgba(255,255,255,0.04)); } } .blame-hist-num { color: var(--text-muted); font-size: 11px; width: 24px; } .blame-hist-sha { font-family: var(--font-mono); font-size: 11px; white-space: nowrap; a { color: var(--color-accent); text-decoration: none; &:hover { text-decoration: underline; } } } .blame-hist-msg { color: var(--text-secondary); max-width: 320px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .blame-hist-author { color: var(--text-muted); white-space: nowrap; display: flex; align-items: center; gap: 4px; } .blame-hist-age { color: var(--text-muted); white-space: nowrap; font-family: var(--font-mono); font-size: 11px; } .blame-history-empty { font-size: 12px; color: var(--text-muted); padding: 10px 0; } .blame-history-footer { margin-top: 8px; font-size: 12px; a { color: var(--color-accent); text-decoration: none; &:hover { text-decoration: underline; } } } // ── MIDI filter bar (inside blame-content) ──────────────────────────────── .blame-filter { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; padding: 8px 12px; background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius); margin-bottom: 12px; font-size: 12px; } .blame-filter-label { display: flex; align-items: center; gap: 6px; color: var(--text-muted); } .blame-filter-select, .blame-filter-input { background: var(--bg-base); border: 1px solid var(--border-default); border-radius: 4px; color: var(--text-primary); font-size: 12px; padding: 3px 6px; &:focus { outline: none; border-color: var(--color-accent); } } .blame-filter-clear { font-size: 12px; color: var(--text-muted); text-decoration: none; margin-left: 4px; &:hover { color: var(--text-secondary); } } /* ========================================================================= Blob (file viewer) page ========================================================================= */ .blob-header { display: flex; align-items: center; justify-content: space-between; padding: 10px 16px; background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: 8px 8px 0 0; border-bottom: none; margin-top: 8px; gap: 12px; flex-wrap: wrap; } .blob-filename { font-size: 14px; font-weight: 600; color: var(--text-secondary); display: flex; align-items: center; gap: 8px; } .blob-meta { font-size: 12px; color: var(--text-muted); display: flex; gap: 16px; flex-wrap: wrap; } .blob-meta span { display: flex; align-items: center; gap: 4px; } .blob-actions { display: flex; gap: 8px; flex-wrap: wrap; } .btn-blob { display: inline-flex; align-items: center; gap: 6px; padding: 6px 14px; border-radius: 6px; font-size: 13px; text-decoration: none; font-weight: 500; border: 1px solid transparent; cursor: pointer; } .btn-blob-primary { background: var(--color-success, #238636); border-color: #2ea043; color: #fff; } .btn-blob-primary:hover { background: #2ea043; } .btn-blob-secondary { background: var(--bg-overlay); border-color: var(--border-default); color: var(--text-secondary); } .btn-blob-secondary:hover { background: var(--bg-hover, var(--bg-overlay)); } .blob-body { background: var(--bg-base); border: 1px solid var(--border-default); border-radius: 0 0 8px 8px; min-height: 120px; overflow: hidden; } .blob-loading { padding: 40px; text-align: center; color: var(--text-muted); font-size: 14px; } .blob-error { padding: 24px; color: var(--color-danger, #f85149); font-size: 14px; } .blob-midi-banner { padding: 48px 24px; text-align: center; background: var(--bg-base); } .blob-midi-icon { font-size: 64px; margin-bottom: 16px; display: block; } .blob-midi-title { font-size: 20px; font-weight: 600; color: var(--text-secondary); margin-bottom: 8px; } .blob-midi-sub { font-size: 14px; color: var(--text-muted); margin-bottom: 24px; } .blob-code-wrap { overflow: auto; max-height: 680px; border-radius: 0 0 8px 8px; } .blob-code { margin: 0; padding: 16px; font-family: var(--font-mono); font-size: 12px; line-height: 1.6; color: var(--text-secondary); white-space: pre-wrap; word-break: break-word; background: var(--bg-base); tab-size: 2; } .blob-code .json-key { color: #79c0ff; } .blob-code .json-str { color: #a5d6ff; } .blob-code .json-num { color: #f2cc60; } .blob-code .json-bool { color: #ff7b72; } .blob-code .json-null { color: var(--text-muted); } .blob-img-wrap { padding: 24px; display: flex; justify-content: center; align-items: center; background: repeating-conic-gradient(var(--bg-surface) 0% 25%, var(--bg-base) 0% 50%) 0 0 / 20px 20px; min-height: 200px; border-radius: 0 0 8px 8px; } .blob-img { max-width: 100%; max-height: 640px; border-radius: 4px; box-shadow: 0 4px 16px rgba(0,0,0,0.6); } .blob-hex-wrap { overflow: auto; max-height: 400px; } .blob-hex { margin: 0; padding: 16px; font-family: var(--font-mono); font-size: 12px; line-height: 1.7; color: var(--text-muted); background: var(--bg-base); white-space: pre; } .blob-hex .hex-offset { color: var(--text-muted); margin-right: 12px; } .blob-hex .hex-bytes { color: var(--text-secondary); margin-right: 12px; } .blob-hex .hex-ascii { color: var(--text-muted); } .blob-binary-notice { padding: 24px; text-align: center; color: var(--text-muted); font-size: 14px; border-top: 1px solid var(--border-subtle); } // ── Blob line-numbered table (replaces old inline styles) ──────────────────── .blob-viewer { overflow-x: auto; } .blob-line-table { width: 100%; border-collapse: collapse; font-family: var(--font-mono); font-size: 12.5px; line-height: 1.65; // When hljs runs, we fade from plain colour to highlighted &.hljs { background: var(--bg-base); } } .blob-line { &:hover .blob-ln, &:hover .blob-code { background: color-mix(in srgb, var(--color-accent) 5%, transparent); } // Line anchor highlight when navigated to via #L{n} &:target .blob-ln, &:target .blob-code { background: color-mix(in srgb, var(--color-accent) 15%, transparent); } } .blob-ln { width: 1%; min-width: 44px; padding: 0 12px 0 8px; text-align: right; color: var(--text-muted); user-select: none; vertical-align: top; white-space: nowrap; a { color: inherit; text-decoration: none; &:hover { color: var(--text-secondary); } } } .blob-code { padding: 0 16px 0 4px; white-space: pre; vertical-align: top; color: var(--text-secondary); // hljs injects tokens; allow them to colour inline &.hljs { color: var(--text-secondary); } // Smooth colour transition as JS injects highlighted spans transition: color 0.1s; } .blob-lang-badge { display: inline-block; font-size: 10px; font-family: var(--font-mono); padding: 2px 7px; border-radius: 4px; background: var(--bg-overlay); color: var(--text-muted); border: 1px solid var(--border-subtle); } /* ========================================================================= Collaborators settings page ========================================================================= */ .badge-perm-read { background: var(--bg-overlay); color: var(--text-muted); } .badge-perm-write { background: #1f4e96; color: #58a6ff; } .badge-perm-admin { background: #7d2a00; color: #f0883e; } .badge-perm-owner { background: #5a3e00; color: #e3b341; } .collab-list { display: flex; flex-direction: column; gap: 0; } .collab-row { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--border-subtle); } .collab-row:last-child { border-bottom: none; } .collab-avatar { width: 32px; height: 32px; border-radius: 50%; background: var(--bg-overlay); display: flex; align-items: center; justify-content: center; font-size: 14px; flex-shrink: 0; } .collab-info { flex: 1; min-width: 0; } .collab-user-id { font-weight: 600; font-size: 13px; color: var(--text-primary); } .collab-meta { font-size: 11px; color: var(--text-muted); margin-top: 2px; } .invite-grid { display: grid; grid-template-columns: 1fr auto auto; gap: var(--space-2); align-items: center; } @media (max-width: 600px) { .invite-grid { grid-template-columns: 1fr; } } .settings-tabs { display: flex; gap: 0; border-bottom: 1px solid var(--border-subtle); margin-bottom: var(--space-4); } .settings-tab { padding: 8px 16px; font-size: 13px; color: var(--text-muted); text-decoration: none; border-bottom: 2px solid transparent; margin-bottom: -1px; } .settings-tab.active { color: var(--text-primary); border-bottom-color: var(--color-accent); font-weight: 600; } .perm-badge { display: inline-block; border-radius: 4px; padding: 2px 8px; font-size: 11px; font-weight: 600; } /* ========================================================================= Search pages (.sr-* prefix) ========================================================================= */ /* ── Search hero (in-repo search) ──────────────────────────────────────── */ .sr-hero { margin-bottom: var(--space-5); } .sr-hero-title { font-size: var(--font-size-lg); font-weight: var(--font-weight-semibold); color: var(--text-primary); margin-bottom: var(--space-4); } .sr-input-wrap { display: flex; align-items: stretch; gap: 0; background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-lg); overflow: hidden; transition: border-color 0.15s, box-shadow 0.15s; &:focus-within { border-color: var(--color-accent); box-shadow: 0 0 0 3px rgba(88, 166, 255, 0.15); } } .sr-input-icon { display: flex; align-items: center; padding: 0 var(--space-3); color: var(--text-muted); font-size: 1rem; flex-shrink: 0; } .sr-input { flex: 1; background: transparent; border: none; outline: none; padding: var(--space-3) var(--space-2); font-size: var(--font-size-base); color: var(--text-primary); min-width: 0; &::placeholder { color: var(--text-muted); } } .sr-submit-btn { padding: var(--space-3) var(--space-5); background: var(--color-accent); color: var(--bg-base); border: none; font-size: var(--font-size-sm); font-weight: var(--font-weight-semibold); cursor: pointer; flex-shrink: 0; transition: opacity 0.15s; &:hover { opacity: 0.88; } } /* ── Mode pills ─────────────────────────────────────────────────────────── */ .sr-mode-bar { display: flex; align-items: center; gap: var(--space-2); margin-top: var(--space-3); flex-wrap: wrap; } .sr-mode-label { font-size: var(--font-size-xs); color: var(--text-muted); margin-right: var(--space-1); } .sr-mode-pill { display: inline-flex; align-items: center; gap: var(--space-1); padding: 3px 12px; border-radius: var(--radius-full); border: 1px solid var(--border-default); font-size: var(--font-size-xs); font-weight: var(--font-weight-medium); color: var(--text-muted); cursor: pointer; text-decoration: none; transition: border-color 0.12s, color 0.12s, background 0.12s; &:hover { border-color: var(--color-accent); color: var(--color-accent); } &.sr-mode-pill--active { background: var(--color-accent); border-color: var(--color-accent); color: var(--bg-base); font-weight: var(--font-weight-semibold); } } /* ── Type tabs ──────────────────────────────────────────────────────────── */ .sr-type-tabs { display: flex; gap: 0; border-bottom: 1px solid var(--border-default); margin-bottom: var(--space-4); overflow-x: auto; flex-wrap: nowrap; } .sr-type-tab { display: inline-flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-4); font-size: var(--font-size-sm); font-weight: var(--font-weight-medium); color: var(--text-muted); cursor: pointer; text-decoration: none; border-bottom: 2px solid transparent; white-space: nowrap; transition: color 0.12s, border-color 0.12s; margin-bottom: -1px; &:hover { color: var(--text-primary); } &.sr-type-tab--active { color: var(--text-primary); border-bottom-color: var(--color-accent); font-weight: var(--font-weight-semibold); } } .sr-type-count { font-size: 0.7rem; padding: 1px 6px; background: var(--bg-overlay); border-radius: var(--radius-full); font-weight: var(--font-weight-semibold); color: var(--text-muted); font-family: var(--font-mono); } .sr-type-tab--active .sr-type-count { background: var(--color-accent); color: var(--bg-base); } /* ── Results meta ───────────────────────────────────────────────────────── */ .sr-results-meta { font-size: var(--font-size-xs); color: var(--text-muted); margin-bottom: var(--space-3); display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; } .sr-results-meta strong { color: var(--text-primary); } /* ── Section headers ────────────────────────────────────────────────────── */ .sr-section { margin-bottom: var(--space-5); } .sr-section-header { display: flex; align-items: center; gap: var(--space-2); margin-bottom: var(--space-3); padding-bottom: var(--space-2); border-bottom: 1px solid var(--border-default); font-size: var(--font-size-sm); font-weight: var(--font-weight-semibold); color: var(--text-secondary); } /* ── Result cards ───────────────────────────────────────────────────────── */ .sr-card { display: grid; grid-template-columns: auto 1fr auto; gap: var(--space-3); align-items: start; padding: var(--space-3) var(--space-4); background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-base); margin-bottom: var(--space-2); transition: border-color 0.12s, box-shadow 0.12s; text-decoration: none; color: inherit; &:hover { border-color: var(--color-accent); box-shadow: 0 0 0 1px var(--color-accent); } &:last-child { margin-bottom: 0; } } .sr-card-icon { width: 32px; height: 32px; border-radius: var(--radius-base); display: flex; align-items: center; justify-content: center; font-size: 1rem; flex-shrink: 0; &.sr-icon-commit { background: rgba(88,166,255,0.12); } &.sr-icon-issue { background: rgba(63,185,80,0.12); } &.sr-icon-proposal { background: rgba(163,113,247,0.12); } &.sr-icon-release { background: rgba(248,113,113,0.12); } &.sr-icon-session { background: rgba(251,191,36,0.12); } } .sr-card-body { min-width: 0; } .sr-card-title { font-size: var(--font-size-sm); font-weight: var(--font-weight-medium); color: var(--text-primary); margin-bottom: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; a { color: inherit; text-decoration: none; &:hover { color: var(--color-accent); } } } .sr-card-meta { font-size: var(--font-size-xs); color: var(--text-muted); display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; margin-top: 2px; } .sr-card-side { display: flex; flex-direction: column; align-items: flex-end; gap: var(--space-1); flex-shrink: 0; } .sr-badge { font-size: 0.68rem; padding: 2px 8px; border-radius: var(--radius-full); font-weight: 600; white-space: nowrap; &.sr-badge-open { background: rgba(63,185,80,0.15); color: var(--color-success); border: 1px solid var(--color-success); } &.sr-badge-closed { background: rgba(248,81,73,0.12); color: var(--color-danger); border: 1px solid var(--color-danger); } &.sr-badge-merged { background: rgba(163,113,247,0.15); color: var(--dim-harmonic); border: 1px solid var(--dim-harmonic); } &.sr-badge-stable { background: rgba(63,185,80,0.12); color: var(--color-success); border: 1px solid var(--color-success); } &.sr-badge-pre { background: rgba(240,136,62,0.15); color: var(--color-warning); border: 1px solid var(--color-warning); } &.sr-badge-draft { background: var(--bg-overlay); color: var(--text-muted); border: 1px solid var(--border-default); } &.sr-badge-active { background: rgba(63,185,80,0.12); color: var(--color-success); border: 1px solid var(--color-success); } &.sr-badge-keyword { background: rgba(88,166,255,0.1); color: var(--color-accent); border: 1px solid var(--color-accent); } } .sr-sha { font-family: var(--font-mono); font-size: 0.7rem; padding: 2px 6px; background: var(--bg-overlay); border-radius: 4px; color: var(--text-muted); } .sr-score { font-family: var(--font-mono); font-size: 0.65rem; color: var(--text-muted); } .sr-branch-pill { display: inline-flex; align-items: center; gap: 3px; padding: 1px 7px; background: var(--bg-overlay); border-radius: var(--radius-full); font-size: 0.7rem; color: var(--text-muted); font-family: var(--font-mono); } /* ── Search term highlight ──────────────────────────────────────────────── */ mark.sr-hl { background: rgba(255, 220, 60, 0.28); color: inherit; border-radius: 2px; padding: 0 1px; } /* ── Empty / tips states ────────────────────────────────────────────────── */ .sr-tips { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-lg); padding: var(--space-6) var(--space-5); text-align: center; } .sr-tips-icon { font-size: 2.5rem; line-height: 1; margin-bottom: var(--space-3); } .sr-tips-title { font-size: var(--font-size-base); font-weight: var(--font-weight-semibold); color: var(--text-primary); margin-bottom: var(--space-2); } .sr-tips-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: var(--space-3); margin-top: var(--space-4); text-align: left; } .sr-tip-card { background: var(--bg-overlay); border-radius: var(--radius-base); padding: var(--space-3); } .sr-tip-label { font-size: var(--font-size-xs); font-weight: var(--font-weight-semibold); color: var(--text-secondary); margin-bottom: var(--space-1); } .sr-tip-example { font-family: var(--font-mono); font-size: 0.7rem; color: var(--color-accent); } .sr-tip-desc { font-size: var(--font-size-xs); color: var(--text-muted); margin-top: 2px; } .sr-no-results { text-align: center; padding: var(--space-6); color: var(--text-muted); font-size: var(--font-size-sm); } /* ── Global search — repo group cards ──────────────────────────────────── */ .sr-repo-group { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-lg); margin-bottom: var(--space-4); overflow: hidden; } .sr-repo-group-header { display: flex; align-items: center; justify-content: space-between; padding: var(--space-3) var(--space-4); background: var(--bg-overlay); border-bottom: 1px solid var(--border-default); gap: var(--space-3); } .sr-repo-group-name { font-weight: var(--font-weight-semibold); font-size: var(--font-size-sm); color: var(--text-primary); a { color: inherit; text-decoration: none; &:hover { color: var(--color-accent); } } } .sr-repo-group-meta { font-size: var(--font-size-xs); color: var(--text-muted); display: flex; align-items: center; gap: var(--space-2); } .sr-repo-group-body { padding: var(--space-3) var(--space-4); } .sr-pagination { display: flex; gap: var(--space-2); margin-top: var(--space-4); align-items: center; flex-wrap: wrap; } /* ── Legacy aliases (keep commit-row for other templates that use it) ───── */ .commit-row { display: flex; gap: var(--space-2); align-items: baseline; padding: var(--space-1) 0; border-top: 1px solid var(--border-default); font-size: 13px; } .commit-row:first-child { border-top: none; } .commit-msg { flex: 1; color: var(--text-primary); } .commit-meta { font-size: 11px; color: var(--text-muted); flex-shrink: 0; } .more-note { font-size: 12px; color: var(--text-muted); margin-top: var(--space-1); } .search-bar { display: flex; gap: var(--space-2); margin-bottom: var(--space-3); flex-wrap: wrap; } .search-bar input[type="search"] { flex: 1; min-width: 200px; } .search-result-repo { border: 1px solid var(--border-default); border-radius: 6px; padding: var(--space-3); margin-bottom: var(--space-3); background: var(--bg-surface); } .search-result-repo h3 { margin: 0 0 var(--space-2) 0; font-size: 16px; } // ── Blob v2 (content-addressed file viewer) ────────────────────────────────── // Single-column by default; Phase 2 adds .blob2-panel-open for 1fr 260px split. .blob2-layout { margin-top: var(--space-4); } .blob2-main { min-width: 0; } // Header bar .blob2-header { display: flex; align-items: center; gap: var(--space-3); padding: 10px 14px; background: var(--bg-surface); border: 1px solid var(--border-default); border-bottom: none; flex-wrap: wrap; } .blob2-header-left { display: flex; align-items: center; gap: 8px; flex: 1 1 0; min-width: 0; } .blob2-filename { font-family: var(--font-mono); font-size: 13px; color: var(--text-primary); font-weight: 500; } .blob2-lang-badge { font-size: 10px; font-weight: 600; letter-spacing: .5px; text-transform: uppercase; background: var(--bg-sunken); color: var(--text-muted); border: 1px solid var(--border-subtle); border-radius: 4px; padding: 0 6px; line-height: 18px; } .blob2-header-meta { display: flex; align-items: center; gap: 6px; } .blob2-meta-pill { font-size: 11px; color: var(--text-muted); background: var(--bg-sunken); border-radius: 999px; padding: 1px 8px; } .blob2-header-actions { display: flex; align-items: center; gap: 6px; } // Language colour dots .blob2-lang-dot { width: 10px; height: 10px; border-radius: 50%; display: inline-block; flex-shrink: 0; background: var(--text-muted); } .blob2-ld-py { background: #3572A5; } .blob2-ld-ts { background: #2b7489; } .blob2-ld-js { background: #f1e05a; } .blob2-ld-rs { background: #dea584; } .blob2-ld-go { background: #00ADD8; } .blob2-ld-md { background: #6f42c1; } .blob2-ld-toml, .blob2-ld-yaml, .blob2-ld-yml { background: #cb171e; } .blob2-ld-json { background: #292929; } .blob2-ld-css { background: #563d7c; } .blob2-ld-scss { background: #c6538c; } .blob2-ld-html { background: #e34c26; } .blob2-ld-sh, .blob2-ld-bash { background: #89e051; } .blob2-ld-mid, .blob2-ld-midi { background: var(--color-accent); } // Last-modified bar .blob2-lastmod { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 6px 14px; font-size: 12px; background: var(--bg-sunken); border: 1px solid var(--border-subtle); border-bottom: none; } .blob2-lastmod-sha { font-family: var(--font-mono); font-size: 11px; color: var(--color-accent-link); text-decoration: none; background: var(--bg-surface); border: 1px solid var(--border-subtle); border-radius: 4px; padding: 1px 5px; &:hover { border-color: var(--color-accent); } } .blob2-lastmod-msg { color: var(--text-secondary); flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .blob2-lastmod-author { color: var(--text-muted); font-size: 11px; } .blob2-lastmod-time { color: var(--text-muted); font-size: 11px; margin-left: auto; } // Content .blob2-content { border: 1px solid var(--border-default); border-radius: 0 0 8px 8px; overflow: hidden; background: var(--bg-surface); } // Code viewer .blob2-viewer { overflow-x: auto; } .blob2-line-table { width: 100%; border-collapse: collapse; font-size: 13px; font-family: var(--font-mono); tab-size: 4; } .blob2-line { scroll-margin-top: calc(var(--sticky-offset, 80px) + 16px); &:target, &:hover { background: var(--bg-sunken); } } .blob2-ln { width: 1%; min-width: 40px; padding: 0 12px 0 16px; text-align: right; color: var(--text-muted); font-size: 11px; user-select: none; border-right: 1px solid var(--border-subtle); white-space: nowrap; vertical-align: top; } .blob2-ln-link { color: inherit; text-decoration: none; &:hover { color: var(--text-primary); } } .blob2-code { padding: 0 16px; white-space: pre; word-break: keep-all; color: var(--text-primary); line-height: 1.6; } .blob2-empty { color: var(--text-muted); font-size: 13px; padding: 32px; text-align: center; } // MIDI banner inside blob2 .blob2-midi-banner { display: flex; align-items: center; gap: var(--space-4); padding: var(--space-6) var(--space-5); background: linear-gradient(135deg, var(--bg-sunken) 0%, var(--bg-surface) 100%); } .blob2-midi-info { flex: 1; } .blob2-midi-filename { font-size: 15px; font-weight: 600; color: var(--text-primary); } .blob2-midi-sub { font-size: 12px; color: var(--text-muted); margin-top: 2px; } .blob2-midi-actions { display: flex; gap: 8px; } // Binary notice .blob2-binary-notice { display: flex; flex-direction: column; align-items: center; gap: var(--space-3); padding: var(--space-8) var(--space-5); color: var(--text-muted); font-size: 13px; text-align: center; } // 404 state .blob2-not-found { display: flex; flex-direction: column; align-items: center; gap: var(--space-3); padding: var(--space-10) var(--space-5); color: var(--text-muted); text-align: center; h2 { color: var(--text-secondary); font-size: 18px; } p { font-size: 13px; } code { font-family: var(--font-mono); background: var(--bg-sunken); padding: 1px 5px; border-radius: 4px; } } // ── Phase 1: Provenance pill ────────────────────────────────────────────────── .blob2-prov-pill { display: inline-flex; align-items: center; gap: 4px; font-size: 10px; font-weight: 700; letter-spacing: 0.04em; padding: 1px 7px; border-radius: var(--radius-full); border: 1px solid; white-space: nowrap; flex-shrink: 0; text-transform: uppercase; &--human { color: var(--color-success); border-color: color-mix(in srgb, var(--color-success) 40%, transparent); background: color-mix(in srgb, var(--color-success) 8%, transparent); } &--agent { color: var(--color-accent); border-color: color-mix(in srgb, var(--color-accent) 40%, transparent); background: color-mix(in srgb, var(--color-accent) 8%, transparent); } } // ── Phase 1: Sem-ver bump badge ─────────────────────────────────────────────── .blob2-bump-badge { display: inline-block; font-size: 9px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; padding: 1px 6px; border-radius: 3px; border: 1px solid; white-space: nowrap; flex-shrink: 0; &--patch { color: var(--text-muted); border-color: var(--border-subtle); background: var(--bg-overlay); } &--minor { color: #d4a017; border-color: #5a420a; background: rgba(212,160,23,0.1); } &--major { color: var(--color-danger); border-color: color-mix(in srgb, var(--color-danger) 40%, transparent); background: color-mix(in srgb, var(--color-danger) 8%, transparent); } &--breaking { color: var(--color-warning); border-color: color-mix(in srgb, var(--color-warning) 35%, transparent); background: color-mix(in srgb, var(--color-warning) 8%, transparent); } } // ── Phase 1: Line selection ─────────────────────────────────────────────────── .blob2-line--selected { background: color-mix(in srgb, var(--color-accent) 12%, transparent) !important; .blob2-ln { color: var(--color-accent); } } // ── Phase 1: Permalink float ────────────────────────────────────────────────── .blob2-permalink-float { position: fixed; bottom: 24px; right: 24px; z-index: 50; display: none; &.is-visible { display: block; } } .blob2-permalink-btn { display: inline-flex; align-items: center; gap: 5px; padding: 6px 12px; border-radius: var(--radius-full); background: var(--bg-surface); border: 1px solid var(--border-default); color: var(--text-primary); font-size: 11px; font-weight: 600; cursor: pointer; box-shadow: 0 2px 8px rgba(0,0,0,0.3); transition: border-color 0.12s, box-shadow 0.12s; &:hover { border-color: var(--color-accent); box-shadow: 0 2px 12px rgba(0,0,0,0.4); } } // ── Phase 1: Outline toggle button ─────────────────────────────────────────── .blob2-outline-toggle { font-size: 11px; gap: 4px; } // ── Phase 2: Outline panel ──────────────────────────────────────────────────── // Both columns scroll independently inside a fixed-height grid. .blob2-layout { &.blob2-panel-open { display: grid; grid-template-columns: 1fr 260px; gap: var(--space-3); height: calc(100vh - 180px); min-height: 400px; > .blob2-main { overflow-y: auto; min-height: 0; border-radius: var(--radius); } } } .blob2-panel { display: none; min-height: 0; background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius); overflow: clip; // clips children to border-radius without blocking scroll } .blob2-layout.blob2-panel-open .blob2-panel { display: flex; flex-direction: column; border-radius: 0; } @media (max-width: 768px) { .blob2-layout.blob2-panel-open { display: block; height: auto; > .blob2-main { overflow-y: visible; } } .blob2-panel { display: none !important; } #blob2-outline-toggle { display: none; } } // Tabs .blob2-panel-tabs { display: flex; border-bottom: 1px solid var(--border-default); flex-shrink: 0; } .blob2-panel-tab { flex: 1; padding: 7px 10px; font-size: 11px; font-weight: 600; color: var(--text-muted); background: none; border: none; cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px; transition: color 0.12s, border-color 0.12s; &:hover { color: var(--text-primary); } &--active { color: var(--text-primary); border-bottom-color: var(--color-accent); } } // Panes — flex:1 + min-height:0 + overflow-y:auto is the correct pattern // for a scrollable child inside a flex column with a max-height parent. .blob2-panel-pane { padding: var(--space-2) 0; } .blob2-panel-pane--hidden { display: none; } .blob2-panel-empty { padding: var(--space-4) var(--space-3); font-size: 12px; color: var(--text-muted); text-align: center; } // Symbols tab — outline rows .blob2-outline-row { display: flex; align-items: center; gap: 6px; padding: 5px var(--space-3); font-size: 11px; &:hover { background: var(--bg-sunken); } } .blob2-outline-op { flex-shrink: 0; font-size: 9px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; padding: 1px 5px; border-radius: 3px; border: 1px solid; &--add { color: var(--color-success); border-color: color-mix(in srgb, var(--color-success) 35%, transparent); background: color-mix(in srgb, var(--color-success) 8%, transparent); } &--modify { color: var(--color-accent-link); border-color: color-mix(in srgb, var(--color-accent-link) 35%, transparent); background: color-mix(in srgb, var(--color-accent-link) 8%, transparent); } &--delete { color: var(--color-danger); border-color: color-mix(in srgb, var(--color-danger) 35%, transparent); background: color-mix(in srgb, var(--color-danger) 8%, transparent); } &--rename { color: #d4a017; border-color: #5a420a; background: rgba(212,160,23,0.1); } &--patch { color: var(--text-muted); border-color: var(--border-subtle); background: var(--bg-overlay); } // Live-parsed symbols (no commit history yet) — show kind instead of op &--fn { color: #d2a8ff; border-color: color-mix(in srgb, #d2a8ff 30%, transparent); background: color-mix(in srgb, #d2a8ff 8%, transparent); } &--class { color: #ffa657; border-color: color-mix(in srgb, #ffa657 30%, transparent); background: color-mix(in srgb, #ffa657 8%, transparent); } &--sym { color: var(--text-muted); border-color: var(--border-subtle); background: var(--bg-overlay); } } .blob2-outline-addr { flex: 1; min-width: 0; font-family: var(--font-mono); font-size: 11px; color: var(--text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .blob2-outline-meta { display: flex; align-items: center; gap: 4px; flex-shrink: 0; } .blob2-outline-count { font-size: 9px; color: var(--text-muted); background: var(--bg-sunken); border-radius: 999px; padding: 0 4px; } .blob2-outline-time { font-size: 10px; color: var(--text-muted); } // Info tab .blob2-info-section { padding: var(--space-2) var(--space-3); &--sep { border-top: 1px solid var(--border-subtle); padding-top: var(--space-3); } } .blob2-info-row { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; padding: 2px 0; font-size: 11px; } .blob2-info-label { color: var(--text-muted); flex-shrink: 0; } .blob2-info-value { color: var(--text-secondary); text-align: right; min-width: 0; } .blob2-info-mono { font-family: var(--font-mono); font-size: 10px; } .blob2-info-label-block { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); margin-bottom: var(--space-1); } .blob2-info-addr { display: flex; align-items: center; gap: 6px; code { color: var(--text-secondary); } } .blob2-copy-addr { background: none; border: none; cursor: pointer; padding: 2px; color: var(--text-muted); line-height: 0; &:hover { color: var(--text-primary); } } .blob2-info-commit-link { font-family: var(--font-mono); font-size: 11px; color: var(--color-accent-link); text-decoration: none; display: inline-block; margin-bottom: 2px; &:hover { text-decoration: underline; } } .blob2-info-commit-msg { font-size: 11px; color: var(--text-secondary); margin-bottom: 2px; } .blob2-info-commit-time { font-size: 10px; color: var(--text-muted); } .blob2-info-link { display: block; font-size: 11px; color: var(--color-accent-link); text-decoration: none; padding: 2px 0; &:hover { text-decoration: underline; } } // Responsive — panel collapses on narrow screens @media (max-width: 900px) { .blob2-layout.blob2-panel-open { grid-template-columns: 1fr; } .blob2-layout.blob2-panel-open .blob2-panel { position: static; max-height: 400px; } } // ── Phase 4: Intelligence signal pills ─────────────────────────────────────── .blob2-signal-pill { display: inline-flex; align-items: center; gap: 4px; font-size: 10px; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; padding: 1px 7px; border-radius: var(--radius-full); border: 1px solid; white-space: nowrap; flex-shrink: 0; cursor: default; &--hotspot { color: #e07b39; border-color: rgba(224, 123, 57, 0.4); background: rgba(224, 123, 57, 0.1); } &--cold { color: var(--color-accent-link); border-color: color-mix(in srgb, var(--color-accent-link) 35%, transparent); background: color-mix(in srgb, var(--color-accent-link) 8%, transparent); } &--blast { color: #d4a017; border-color: rgba(212, 160, 23, 0.4); background: rgba(212, 160, 23, 0.1); } } // ── Phase 3: File provenance timeline ──────────────────────────────────────── .blob2-history { margin-top: var(--space-4); border: 1px solid var(--border-default); border-radius: var(--radius); background: var(--bg-surface); overflow: hidden; } .blob2-history-header { display: flex; align-items: center; gap: 7px; padding: 8px 14px; font-size: 12px; font-weight: 600; color: var(--text-secondary); background: var(--bg-sunken); border-bottom: 1px solid var(--border-default); } .blob2-history-count { font-size: 10px; font-weight: 400; color: var(--text-muted); background: var(--bg-overlay); border-radius: 999px; padding: 1px 7px; } .blob2-history-rows { } .blob2-history-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 7px 14px; font-size: 12px; border-bottom: 1px solid var(--border-subtle); &:last-child { border-bottom: none; } &:hover { background: var(--bg-sunken); } } .blob2-history-sha { font-family: var(--font-mono); font-size: 11px; color: var(--color-accent-link); text-decoration: none; flex-shrink: 0; background: var(--bg-overlay); border: 1px solid var(--border-subtle); border-radius: 4px; padding: 1px 5px; &:hover { border-color: var(--color-accent); } } .blob2-history-msg { flex: 1; min-width: 0; color: var(--text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .blob2-history-prov { display: inline-flex; align-items: center; flex-shrink: 0; } .blob2-history-time { font-size: 11px; color: var(--text-muted); margin-left: auto; flex-shrink: 0; } // ── Responsive ──────────────────────────────────────────────────────────────── @media (max-width: 768px) { .blob2-permalink-float { bottom: 12px; right: 12px; } .blob-toolbar { flex-wrap: wrap; gap: var(--space-1); } .blob-header { flex-direction: column; align-items: flex-start; } .sr-layout { grid-template-columns: 1fr; } .sr-filters { display: none; } .sr-result-path { font-size: 11px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .blame-line-meta { display: none; } .blame-gutter { width: 32px; font-size: 10px; } } @media (max-width: 480px) { .blob2-header-bar { flex-direction: column; align-items: flex-start; gap: var(--space-2); } .blob-breadcrumb { font-size: 12px; } .sr-result-snippet { font-size: 12px; } .sr-hits-count { font-size: 11px; } }