/* * MuseHub Domain-Agnostic Visual Components * * This file supersedes _music.scss. All visual components for multidimensional * state are defined here in a domain-agnostic way. Domain-specific styles * (MIDI piano roll, Code symbol graph, etc.) are scoped under * [data-domain=""] so they only apply when the relevant domain is active. * * Structure: * 1. Generic dimension components (radar, diff heatmap, dimension strip) * 2. Domain badge * 3. Agent badge * 4. [data-domain="midi"] — MIDI-specific overrides (piano roll, waveform) * 5. [data-domain="code"] — Code-specific overrides (symbol graph, file tree) * 6. Profile / contributor / repo grid (shared by all domains) * 7. Audio player (iap-*) — legacy MIDI feature, scoped under data-domain="midi" * 8. Shared infrastructure (session live-dot, responsive) */ /* ============================================================================ * 1. GENERIC DIMENSION COMPONENTS * ============================================================================ */ /* ── Radar / spider chart ─────────────────────────────────────────────────── Rendered as an SVG inside . Dimension colors are resolved from the generic --dim-a … --dim-e tokens so any domain can reuse this chart without MIDI-specific class names. */ .radar-chart { overflow: visible; } .radar-axis { stroke: var(--border-default); stroke-width: 1; } .radar-polygon { fill-opacity: 0.15; stroke-width: 2; } /* Generic slot classes — domain-neutral */ .radar-polygon-dim-a { stroke: var(--dim-a); fill: var(--dim-a); } .radar-polygon-dim-b { stroke: var(--dim-b); fill: var(--dim-b); } .radar-polygon-dim-c { stroke: var(--dim-c); fill: var(--dim-c); } .radar-polygon-dim-d { stroke: var(--dim-d); fill: var(--dim-d); } .radar-polygon-dim-e { stroke: var(--dim-e); fill: var(--dim-e); } /* MIDI backward-compat aliases (deprecated — prefer -dim-a … -dim-e) */ .radar-polygon-harmonic { stroke: var(--dim-a); fill: var(--dim-a); } .radar-polygon-rhythmic { stroke: var(--dim-b); fill: var(--dim-b); } .radar-polygon-melodic { stroke: var(--dim-c); fill: var(--dim-c); } .radar-polygon-structural { stroke: var(--dim-d); fill: var(--dim-d); } .radar-polygon-dynamic { stroke: var(--dim-e); fill: var(--dim-e); } .radar-label { fill: var(--text-muted); font-size: 11px; font-family: var(--font-sans); } /* ── Diff heatmap ─────────────────────────────────────────────────────────── Visual summary of how much each dimension changed between commits. */ .diff-heatmap { display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-3); background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-base); } .diff-dim-row { display: flex; align-items: center; gap: var(--space-3); } .diff-dim-label { width: 90px; font-size: var(--text-xs); color: var(--text-muted); text-transform: capitalize; flex-shrink: 0; } .diff-dim-bar-wrap { flex: 1; height: 8px; background: var(--bg-overlay); border-radius: var(--radius-full); overflow: hidden; } .diff-dim-bar { height: 100%; border-radius: var(--radius-full); transition: width var(--transition-slow); } /* Generic slot bars */ .diff-dim-bar-dim-a { background: var(--dim-a); } .diff-dim-bar-dim-b { background: var(--dim-b); } .diff-dim-bar-dim-c { background: var(--dim-c); } .diff-dim-bar-dim-d { background: var(--dim-d); } .diff-dim-bar-dim-e { background: var(--dim-e); } /* MIDI backward-compat aliases */ .diff-dim-bar-harmonic { background: var(--dim-a); } .diff-dim-bar-rhythmic { background: var(--dim-b); } .diff-dim-bar-melodic { background: var(--dim-c); } .diff-dim-bar-structural { background: var(--dim-d); } .diff-dim-bar-dynamic { background: var(--dim-e); } .diff-dim-value { font-size: var(--text-xs); color: var(--text-muted); font-family: var(--font-mono); width: 40px; text-align: right; flex-shrink: 0; } /* ── Dimension navigation strip ───────────────────────────────────────────── Horizontal strip of dimension tabs shown in the universal viewer and insights pages. Domain-neutral; labels are rendered from data attributes. */ .dim-strip { display: flex; gap: var(--space-1); overflow-x: auto; padding-bottom: var(--space-1); scrollbar-width: none; } .dim-strip::-webkit-scrollbar { display: none; } .dim-strip-item { display: flex; align-items: center; gap: var(--space-2); padding: var(--space-1) var(--space-3); border-radius: var(--radius-full); font-size: var(--text-sm); font-weight: var(--weight-medium); color: var(--text-muted); background: var(--bg-overlay); border: 1px solid var(--border-subtle); cursor: pointer; white-space: nowrap; transition: color var(--transition-fast), border-color var(--transition-fast); text-decoration: none; } .dim-strip-item:hover { color: var(--text-primary); border-color: var(--border-default); } .dim-strip-item.is-active { color: var(--color-accent); border-color: var(--color-accent-muted); background: color-mix(in srgb, var(--color-accent) 8%, transparent); } .dim-strip-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; } /* ============================================================================ * 2. DOMAIN BADGE * ============================================================================ */ /* The @author/slug pill shown on repo cards, repo headers, and the domain browser */ .domain-badge { display: inline-flex; align-items: center; gap: var(--space-1); padding: 2px var(--space-2); background: var(--domain-badge-bg); color: var(--domain-badge-text); border: 1px solid var(--domain-badge-border); border-radius: var(--radius-full); font-size: var(--text-xs); font-family: var(--font-mono); font-weight: var(--weight-medium); text-decoration: none; white-space: nowrap; transition: background var(--transition-fast), border-color var(--transition-fast); } .domain-badge:hover { background: color-mix(in srgb, var(--domain-badge-text) 12%, transparent); border-color: var(--domain-badge-text); } /* ============================================================================ * 3. AGENT BADGE * ============================================================================ */ /* "agent" badge displayed beside agent-authored events in the activity feed */ .agent-badge { display: inline-flex; align-items: center; gap: var(--space-1); padding: 1px var(--space-2); background: var(--agent-accent-bg); color: var(--agent-accent); border: 1px solid color-mix(in srgb, var(--agent-accent) 40%, transparent); border-radius: var(--radius-full); font-size: 10px; font-weight: var(--weight-semibold); letter-spacing: 0.04em; text-transform: uppercase; vertical-align: middle; white-space: nowrap; } .agent-badge::before { content: ''; display: inline-block; width: 6px; height: 6px; border-radius: 50%; background: var(--agent-accent); flex-shrink: 0; } /* Agent-authored commit row / event row tint */ .event-row[data-agent="true"] { padding-left: var(--space-3); } /* ============================================================================ * 4. [data-domain="midi"] — MIDI piano roll, waveform, and related * ============================================================================ */ /* Piano roll — only visible when viewing a MIDI-domain repo */ [data-domain="midi"] .piano-roll { --piano-roll-rows: 12; --piano-roll-cell-h: 12px; --piano-roll-cell-w: 6px; overflow: auto; background: var(--bg-base); border: 1px solid var(--border-default); border-radius: var(--radius-base); padding: var(--space-2); } [data-domain="midi"] .piano-roll-grid { display: grid; grid-template-rows: repeat(var(--piano-roll-rows), var(--piano-roll-cell-h)); gap: 1px; min-width: max-content; } [data-domain="midi"] .piano-roll-lane { display: flex; gap: 1px; align-items: center; } [data-domain="midi"] .piano-roll-lane.is-black { background: rgba(255, 255, 255, 0.03); } [data-domain="midi"] .piano-roll-note { height: var(--piano-roll-cell-h); border-radius: 2px; opacity: 0.85; min-width: var(--piano-roll-cell-w); } [data-domain="midi"] .piano-roll-note[data-track="0"] { background: var(--track-0); } [data-domain="midi"] .piano-roll-note[data-track="1"] { background: var(--track-1); } [data-domain="midi"] .piano-roll-note[data-track="2"] { background: var(--track-2); } [data-domain="midi"] .piano-roll-note[data-track="3"] { background: var(--track-3); } [data-domain="midi"] .piano-roll-note[data-track="4"] { background: var(--track-4); } [data-domain="midi"] .piano-roll-note[data-track="5"] { background: var(--track-5); } [data-domain="midi"] .piano-roll-note[data-track="6"] { background: var(--track-6); } [data-domain="midi"] .piano-roll-note[data-track="7"] { background: var(--track-7); } [data-domain="midi"] .piano-roll-labels { display: flex; flex-direction: column; gap: 1px; margin-right: var(--space-2); flex-shrink: 0; } [data-domain="midi"] .piano-roll-label { height: var(--piano-roll-cell-h); font-size: 9px; font-family: var(--font-mono); color: var(--text-muted); display: flex; align-items: center; width: 20px; } /* Waveform — MIDI domain ships audio artifacts */ [data-domain="midi"] .waveform { position: relative; background: var(--bg-base); border: 1px solid var(--border-default); border-radius: var(--radius-base); overflow: hidden; height: 64px; } [data-domain="midi"] .waveform canvas { display: block; width: 100%; height: 100%; } [data-domain="midi"] .waveform-playhead { position: absolute; top: 0; bottom: 0; width: 2px; background: var(--color-orange); pointer-events: none; } /* Inline Audio Player — MIDI domain only */ [data-domain="midi"] .iap-card { border-color: var(--color-accent-muted, #1f6feb); background: linear-gradient(135deg, var(--bg-base) 0%, var(--bg-surface) 100%); } [data-domain="midi"] .iap-title { font-size: var(--text-base); font-weight: var(--weight-semibold); color: var(--text-primary); margin-bottom: var(--space-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } [data-domain="midi"] .iap-waveform-wrap { min-height: 72px; border-radius: var(--radius-sm); background: var(--bg-base); border: 1px solid var(--border-subtle); margin-bottom: var(--space-3); overflow: hidden; display: flex; align-items: center; justify-content: center; } [data-domain="midi"] .iap-waveform-placeholder { color: var(--text-muted); font-size: var(--text-sm); padding: var(--space-3); } [data-domain="midi"] .iap-controls { display: flex; align-items: center; gap: var(--space-3); } [data-domain="midi"] .iap-play-btn { width: 40px; height: 40px; border-radius: 50%; background: var(--color-accent-muted, #1f6feb); border: none; color: #fff; font-size: 16px; cursor: pointer; display: flex; align-items: center; justify-content: center; flex-shrink: 0; transition: background 0.15s, transform 0.1s; } [data-domain="midi"] .iap-play-btn:hover { background: var(--color-accent, var(--color-accent)); transform: scale(1.05); } [data-domain="midi"] .iap-progress-bar { height: 6px; background: var(--bg-overlay); border-radius: 3px; cursor: pointer; position: relative; margin-bottom: 4px; flex: 1; } [data-domain="midi"] .iap-progress-fill { height: 100%; background: var(--color-accent-muted, #1f6feb); border-radius: 3px; width: 0%; pointer-events: none; transition: width 0.1s linear; } [data-domain="midi"] .iap-time-row { display: flex; justify-content: space-between; font-size: 11px; color: var(--text-muted); font-variant-numeric: tabular-nums; } [data-domain="midi"] .iap-volume-wrap { display: flex; align-items: center; gap: var(--space-1); flex-shrink: 0; font-size: var(--text-sm); color: var(--text-muted); } [data-domain="midi"] .iap-volume-slider { width: 72px; accent-color: var(--color-accent-muted, #1f6feb); cursor: pointer; } [data-domain="midi"] .iap-track-selector { display: flex; align-items: center; gap: var(--space-2); margin-top: var(--space-3); } [data-domain="midi"] .iap-track-label { font-size: var(--text-xs); color: var(--text-muted); white-space: nowrap; } [data-domain="midi"] .iap-track-select { flex: 1; font-size: var(--text-sm); background: var(--bg-overlay); border: 1px solid var(--border-default); color: var(--text-primary); border-radius: var(--radius-sm); padding: 4px 8px; } /* ============================================================================ * 5. [data-domain="code"] — Code symbol graph and file tree * ============================================================================ */ /* Code viewer placeholder — rendered by the code_graph viewer TypeScript module */ [data-domain="code"] .code-graph-canvas { width: 100%; height: 420px; background: var(--bg-base); border: 1px solid var(--border-default); border-radius: var(--radius-base); display: flex; align-items: center; justify-content: center; } [data-domain="code"] .code-graph-placeholder { color: var(--text-muted); font-size: var(--text-sm); text-align: center; } /* ============================================================================ * 6. PROFILE / CONTRIBUTOR / REPO GRID (shared by all domains) * ============================================================================ */ .profile-header { display: flex; align-items: flex-start; gap: var(--space-6); margin-bottom: var(--space-6); } .avatar { width: 80px; height: 80px; border-radius: var(--radius-full); background: var(--bg-overlay); border: 2px solid var(--border-default); display: flex; align-items: center; justify-content: center; font-size: 32px; flex-shrink: 0; } .avatar img { width: 100%; height: 100%; border-radius: var(--radius-full); object-fit: cover; } .profile-meta { flex: 1; } .profile-meta h1 { font-size: 22px; color: var(--text-primary); margin-bottom: var(--space-1); } .bio { font-size: var(--text-base); color: var(--text-muted); margin-bottom: var(--space-3); } .repo-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: var(--space-3); } /* .repo-card base styles live in _components.scss */ .repo-card h3 { font-size: 15px; margin: 0; } .repo-card .repo-meta { font-size: var(--text-sm); color: var(--text-muted); } .credits-badge { display: inline-flex; align-items: center; gap: var(--space-2); background: color-mix(in srgb, var(--color-accent-muted) 25%, transparent); border: 1px solid var(--color-accent-muted); border-radius: var(--radius-base); padding: var(--space-2) 14px; font-size: var(--text-base); } .credits-badge .num { font-size: 22px; font-weight: var(--weight-bold); color: var(--color-accent); } /* ============================================================================ * 7. SHARED INFRASTRUCTURE * ============================================================================ */ /* ── Session live dot ────────────────────────────────────────────────────── */ .session-live-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--color-success, var(--color-success)); animation: session-pulse 1.5s ease-in-out infinite; } @keyframes session-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } } /* ============================================================================ * 8. RESPONSIVE * ============================================================================ */ @media (max-width: 479px) { .profile-header { flex-direction: column; } [data-domain="midi"] .piano-roll { --piano-roll-cell-w: 4px; } .diff-dim-label { width: 60px; } .repo-grid { grid-template-columns: 1fr; } .mcp-docs-connect-grid { grid-template-columns: 1fr; } } /* ============================================================================= Domain Detail Page (.dd-* prefix) ============================================================================= */ // ── Per-slug accent colours ────────────────────────────────────────────────── .dd-page { --dd-accent: var(--color-accent); --dd-accent-2: var(--color-accent-muted); --dd-hero-from: var(--bg-base); --dd-hero-to: var(--bg-surface); --dd-glow: color-mix(in srgb, var(--color-accent) 25%, transparent); &[data-domain-slug="midi"] { --dd-accent: var(--domain-midi); --dd-accent-2: var(--canvas-3); --dd-hero-from: color-mix(in srgb, var(--domain-midi) 8%, var(--bg-void)); --dd-hero-to: var(--bg-void); --dd-glow: color-mix(in srgb, var(--domain-midi) 40%, transparent); } &[data-domain-slug="code"] { --dd-accent: var(--domain-code); --dd-accent-2: var(--color-accent-muted); --dd-hero-from: color-mix(in srgb, var(--domain-code) 6%, var(--bg-void)); --dd-hero-to: var(--bg-void); --dd-glow: color-mix(in srgb, var(--domain-code) 35%, transparent); } } // ── Hero — domain-specific gradient overlay on top of shared .ph-hero ──────── .dd-hero { background: linear-gradient(160deg, var(--dd-hero-from) 0%, var(--dd-hero-to) 100%); border-bottom-color: color-mix(in srgb, var(--dd-accent) 15%, transparent); } .dd-hero__bg { position: absolute; inset: 0; pointer-events: none; overflow: hidden; &::before { content: ''; position: absolute; top: -40%; right: -10%; width: 55%; aspect-ratio: 1; background: radial-gradient(circle, var(--dd-glow) 0%, transparent 65%); border-radius: 50%; } &::after { content: ''; position: absolute; bottom: -30%; left: 15%; width: 40%; aspect-ratio: 1; background: radial-gradient(circle, color-mix(in srgb, var(--dd-accent-2) 18%, transparent) 0%, transparent 65%); border-radius: 50%; } } .dd-verified-badge { display: inline-flex; align-items: center; gap: 4px; font-size: 11px; font-weight: 700; padding: 3px 10px; border-radius: 12px; background: color-mix(in srgb, var(--color-success) 15%, transparent); color: var(--color-success); border: 1px solid color-mix(in srgb, var(--color-success) 30%, transparent); } .dd-deprecated-badge { display: inline-flex; align-items: center; gap: 4px; font-size: 11px; font-weight: 700; padding: 3px 10px; border-radius: 12px; background: color-mix(in srgb, var(--color-orange) 15%, transparent); color: var(--color-orange); border: 1px solid color-mix(in srgb, var(--color-orange) 30%, transparent); } .dd-version { font-size: 12px; color: var(--text-muted); font-family: var(--font-mono); } // dd-hero__title extends ph-hero-title — only domain-specific tweaks here .dd-hero__title { color: var(--color-accent); font-weight: 300; display: flex; align-items: center; gap: 14px; flex-wrap: wrap; } .dd-hero__icon { font-size: 1em; color: var(--color-accent); } .dd-hero__subtitle { font-size: 1em; font-weight: 300; color: var(--color-accent); } // ph-hero-sub handles desc sizing; only color override needed .dd-hero .ph-hero-sub { color: var(--text-secondary); } .dd-hero__actions { display: flex; gap: 12px; flex-wrap: wrap; } .dd-sidebar-desc { font-size: 12px; color: var(--text-muted); margin: 0 0 8px; } // ── Domain detail hero buttons ───────────────────────────────────────────── .dd-hero-btn { display: inline-flex; align-items: center; gap: 6px; padding: 7px 16px; border-radius: var(--radius-sm); font-size: 13px; font-weight: 500; line-height: 1; white-space: nowrap; text-decoration: none; cursor: pointer; border: none; transition: background 0.15s, border-color 0.15s, color 0.15s; svg { flex-shrink: 0; } &--primary { background: color-mix(in srgb, var(--dd-accent) 5%, transparent); border: 1px solid color-mix(in srgb, var(--dd-accent) 45%, transparent); color: var(--dd-accent); &:hover { background: color-mix(in srgb, var(--dd-accent) 10%, transparent); border-color: color-mix(in srgb, var(--dd-accent) 65%, transparent); color: color-mix(in srgb, var(--dd-accent) 90%, #fff); } } &--secondary { background: transparent; border: 1px solid var(--border-default); color: var(--text-secondary); &:hover { background: rgba(255, 255, 255, 0.04); border-color: var(--border-default); color: var(--text-primary); } } &--ghost { background: transparent; border: 1px solid var(--border-subtle); color: var(--text-muted); &:hover { background: rgba(255, 255, 255, 0.03); border-color: var(--border-default); color: var(--text-secondary); } } } .dd-install-btn { &:disabled { opacity: 0.5; cursor: default; } } // Stats ribbon uses shared .ph-stats-strip — no dd-specific overrides needed // Body/section layout uses shared .ph-body, .ph-content, .ph-section — no dd overrides .dd-main { display: flex; flex-direction: column; gap: 0; min-width: 0; } // ── Dimension cards ─────────────────────────────────────────────────────────── .dd-dim-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(175px, 1fr)); gap: 10px; @media (max-width: 600px) { grid-template-columns: repeat(2, 1fr); } } .dd-dim-card { padding: 10px 12px; border-radius: var(--radius-sm); border: 1px solid var(--border-subtle); background: transparent; transition: background 0.15s, border-color 0.15s; &:hover { background: rgba(255,255,255,0.02); } } // 8 rotating accent colors — mapped to the track palette .dd-dim-color-0 { --dim-color: var(--track-3); } .dd-dim-color-1 { --dim-color: var(--track-0); } .dd-dim-color-2 { --dim-color: var(--track-1); } .dd-dim-color-3 { --dim-color: var(--track-2); } .dd-dim-color-4 { --dim-color: var(--track-6); } .dd-dim-color-5 { --dim-color: var(--track-5); } .dd-dim-color-6 { --dim-color: var(--track-7); } .dd-dim-color-7 { --dim-color: var(--track-4); } .dd-dim-card__header { display: flex; align-items: center; gap: 6px; margin-bottom: 6px; flex-wrap: wrap; } .dd-dim-card__index { font-size: 10px; font-family: var(--font-mono); color: var(--dim-color); opacity: 0.75; } .dd-dim-card__name { font-size: 13px; font-weight: 700; color: var(--text-primary); font-family: var(--font-mono); } .dd-dim-card__unit { font-size: 9px; padding: 1px 6px; border-radius: 4px; margin-left: auto; background: color-mix(in srgb, var(--dim-color) 12%, transparent); color: var(--dim-color); border: 1px solid color-mix(in srgb, var(--dim-color) 22%, transparent); } .dd-dim-card__desc { font-size: 11px; color: var(--text-muted); margin: 0; line-height: 1.45; } // ── Terminal blocks ─────────────────────────────────────────────────────────── .dd-terminal { border-radius: var(--radius-md); overflow: hidden; border: 1px solid var(--border-default); background: var(--bg-base); &--compact .dd-terminal__body { padding: 10px 16px; font-size: 12px; } } .dd-terminal__chrome { display: flex; align-items: center; gap: 7px; padding: 10px 14px; background: var(--bg-surface); border-bottom: 1px solid var(--border-subtle); } .dd-terminal__dot { width: 11px; height: 11px; border-radius: 50%; flex-shrink: 0; &--red { background: #ff5f57; } &--yellow { background: #febc2e; } &--green { background: #28c840; } } .dd-terminal__title { font-size: 11px; color: var(--text-muted); font-family: var(--font-mono); margin: 0 auto; } .dd-copy-btn { display: flex; align-items: center; justify-content: center; width: 26px; height: 26px; border-radius: 4px; border: 1px solid var(--border-default); background: transparent; color: var(--text-muted); cursor: pointer; transition: all 0.15s; margin-left: auto; flex-shrink: 0; &:hover { background: var(--bg-hover); color: var(--text-primary); } &.copied { color: var(--color-success); border-color: var(--color-success); } } .dd-terminal__body { padding: 12px 16px; margin: 0; font-size: 12px; font-family: var(--font-mono); color: var(--text-primary); line-height: 1.65; overflow-x: auto; white-space: pre; } // ── MCP callout ─────────────────────────────────────────────────────────────── .dd-mcp-callout { display: flex; gap: 10px; align-items: flex-start; margin-top: var(--space-3); padding: 10px 12px; background: color-mix(in srgb, var(--dd-accent) 5%, transparent); border: 1px solid color-mix(in srgb, var(--dd-accent) 20%, transparent); border-radius: var(--radius-sm); font-size: 13px; color: var(--text-secondary); line-height: 1.5; } .dd-mcp-callout__icon { font-size: 22px; flex-shrink: 0; } // Sidebar uses shared .ph-sidebar, .ph-sidebar-section, .ph-sidebar-heading // ── Artifact badges ─────────────────────────────────────────────────────────── .dd-artifact-list { display: flex; flex-wrap: wrap; gap: 6px; } .dd-artifact-badge { font-size: 11px; font-family: var(--font-mono); padding: 3px 9px; border-radius: 4px; background: transparent; color: var(--dd-accent); border: 1px solid color-mix(in srgb, var(--dd-accent) 28%, transparent); } // ── Hash / URI blocks ───────────────────────────────────────────────────────── .dd-hash-block { display: flex; align-items: center; gap: 8px; background: transparent; border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); padding: 8px 12px; } .dd-hash-code { font-size: 11px; font-family: var(--font-mono); color: var(--text-secondary); word-break: break-all; flex: 1; } .dd-hash-copy { font-size: 13px; padding: 2px 8px; border: 1px solid var(--border-subtle); background: transparent; color: var(--text-muted); cursor: pointer; border-radius: 4px; transition: all 0.15s; flex-shrink: 0; font-family: var(--font-mono); &:hover { color: var(--text-primary); border-color: var(--border-default); } &.copied { color: var(--color-success); border-color: var(--color-success); } } // ── Meta list ───────────────────────────────────────────────────────────────── .dd-meta-list { display: grid; grid-template-columns: auto 1fr; gap: 8px 14px; margin: 0; dt { font-size: 11px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.05em; align-self: center; } dd { font-size: 13px; color: var(--text-primary); font-family: var(--font-mono); margin: 0; align-self: center; } } // ── Repo grid ───────────────────────────────────────────────────────────────── .dd-repo-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 10px; } .dd-repo-card { display: flex; flex-direction: column; gap: 6px; padding: 12px 14px; background: transparent; border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); text-decoration: none; transition: border-color 0.15s, background 0.15s; &:hover { border-color: var(--border-default); background: rgba(255,255,255,0.02); .dd-repo-card__arrow { opacity: 1; transform: translateX(3px); } } } .dd-repo-card__header { display: flex; align-items: center; justify-content: space-between; } .dd-repo-card__name { font-size: 13px; font-weight: 600; color: var(--color-accent); } .dd-repo-card__arrow { font-size: 14px; color: var(--dd-accent); opacity: 0.3; transition: opacity 0.15s, transform 0.15s; } .dd-repo-card__desc { font-size: 12px; color: var(--text-muted); margin: 0; line-height: 1.4; } .dd-see-all { margin-top: var(--space-4); } .dd-repos-empty { display: flex; flex-direction: column; align-items: center; padding: 64px var(--space-4); border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); color: var(--text-muted); p { margin: var(--space-2) 0 var(--space-4); font-size: 13px; } } .dd-repos-empty__icon { margin-bottom: var(--space-3); opacity: 0.35; color: var(--text-secondary); } // ── Domains listing page — canonical classes ────────────────────────────────── // dm-* hero/body/CTA classes removed — migrated to pages/_domains.scss and // canonical components (search-field, stat-pill, verified-toggle, btn--*) /* Domain grid */ .domain-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 12px; } /* Domain card */ .domain-card { display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-3) var(--space-3); background: transparent; border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); text-decoration: none; transition: border-color 0.15s, background 0.15s; &:hover { border-color: var(--border-default); background: rgba(255,255,255,0.025); } } .domain-card__header { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .domain-card__name { font-size: 14px; font-weight: 600; color: var(--text-primary); } .domain-card__description { font-size: 12px; color: var(--text-muted); margin: 0; line-height: 1.5; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .domain-card__meta { display: flex; gap: 12px; font-size: 11px; color: var(--text-muted); margin-top: auto; flex-wrap: wrap; align-items: center; } .domain-card__stat { display: inline-flex; align-items: center; gap: 4px; } .domain-card__viewer, .domain-card__merge { font-size: 10px; padding: 2px 6px; border-radius: 3px; background: var(--bg-overlay); color: var(--text-muted); border: 1px solid var(--border-subtle); font-family: var(--font-mono); }