/* * 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(--font-size-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(--font-size-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(--font-size-sm); font-weight: var(--font-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: rgba(79, 142, 247, 0.08); } .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(--font-size-xs); font-family: var(--font-mono); font-weight: var(--font-weight-medium); text-decoration: none; white-space: nowrap; transition: background var(--transition-fast), border-color var(--transition-fast); } .domain-badge:hover { background: rgba(88, 166, 255, 0.12); 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(--font-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 * ============================================================================ */ [data-domain="midi"] { /* Dimension token remapping for MIDI (matches the original names) */ --dim-a: #388bfd; /* harmonic */ --dim-b: #3fb950; /* rhythmic */ --dim-c: #bc8cff; /* melodic */ --dim-d: #f0883e; /* structural */ --dim-e: #f85149; /* dynamic */ } /* 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(--font-size-base); font-weight: var(--font-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(--font-size-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, #388bfd); 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(--font-size-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(--font-size-xs); color: var(--text-muted); white-space: nowrap; } [data-domain="midi"] .iap-track-select { flex: 1; font-size: var(--font-size-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 * ============================================================================ */ [data-domain="code"] { /* Dimension token remapping for Code */ --dim-a: #388bfd; /* syntax */ --dim-b: #3fb950; /* semantics */ --dim-c: #bc8cff; /* types */ --dim-d: #f0883e; /* tests */ --dim-e: #f85149; /* docs */ } /* 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(--font-size-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(--font-size-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(--font-size-sm); color: var(--text-muted); } .credits-badge { display: inline-flex; align-items: center; gap: var(--space-2); background: rgba(31, 111, 235, 0.13); border: 1px solid var(--color-accent-muted); border-radius: var(--radius-base); padding: var(--space-2) 14px; font-size: var(--font-size-base); } .credits-badge .num { font-size: 22px; font-weight: var(--font-weight-bold); color: var(--color-accent); } /* ── Contribution heatmap ────────────────────────────────────────────────── */ .contrib-graph { display: flex; gap: 2px; flex-wrap: nowrap; overflow-x: auto; } .contrib-week { display: flex; flex-direction: column; gap: 2px; } .contrib-day { width: 10px; height: 10px; border-radius: 2px; background: var(--bg-surface); border: 1px solid var(--border-subtle); } .contrib-day[data-count="0"] { background: var(--bg-surface); } .contrib-day[data-count="1"] { background: #0e4429; border-color: #0e4429; } .contrib-day[data-count="2"] { background: #006d32; border-color: #006d32; } .contrib-day[data-count="3"] { background: #26a641; border-color: #26a641; } .contrib-day[data-count="4"] { background: #39d353; border-color: #39d353; } /* ============================================================================ * 7. SHARED INFRASTRUCTURE * ============================================================================ */ /* ── Session live dot ────────────────────────────────────────────────────── */ .session-live-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--color-success, #3fb950); animation: session-pulse 1.5s ease-in-out infinite; } @keyframes session-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } } /* ── MCP docs page ───────────────────────────────────────────────────────── */ .mcp-docs-page { max-width: 900px; margin: 0 auto; padding: var(--space-8) var(--space-4); } .mcp-docs-header { margin-bottom: var(--space-8); } .mcp-docs-header__title { font-size: var(--font-size-2xl); font-weight: var(--font-weight-bold); color: var(--text-primary); margin-bottom: var(--space-3); } .mcp-docs-header__subtitle { font-size: var(--font-size-base); color: var(--text-secondary); margin-bottom: var(--space-4); line-height: var(--line-height-normal); } .mcp-docs-header__actions { display: flex; gap: var(--space-2); } .mcp-docs-section { margin-bottom: var(--space-10); } .mcp-docs-section__title { font-size: var(--font-size-lg); font-weight: var(--font-weight-semibold); color: var(--text-primary); margin-bottom: var(--space-4); padding-bottom: var(--space-2); border-bottom: 1px solid var(--border-default); display: flex; align-items: center; gap: var(--space-2); } .mcp-docs-count { font-size: var(--font-size-sm); font-weight: var(--font-weight-regular); color: var(--text-muted); background: var(--bg-overlay); border: 1px solid var(--border-subtle); border-radius: var(--radius-full); padding: 1px 8px; } .mcp-docs-connect-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: var(--space-3); margin-bottom: var(--space-6); } .mcp-docs-connect-item { display: flex; flex-direction: column; gap: var(--space-1); background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-base); padding: var(--space-3); } .mcp-docs-connect-label { font-size: var(--font-size-xs); color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.06em; } .mcp-docs-connect-value { font-size: var(--font-size-sm); font-family: var(--font-mono); color: var(--text-primary); word-break: break-all; } .mcp-docs-quickstart { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-base); padding: var(--space-4); } .mcp-docs-quickstart__title { font-size: var(--font-size-base); font-weight: var(--font-weight-semibold); color: var(--text-primary); margin-bottom: var(--space-3); } .mcp-docs-quickstart__steps { padding-left: var(--space-5); color: var(--text-secondary); line-height: var(--line-height-relaxed); font-size: var(--font-size-base); } .mcp-docs-tools-list, .mcp-docs-resource-list, .mcp-docs-prompt-list { display: flex; flex-direction: column; gap: var(--space-3); } .mcp-docs-tool { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-base); padding: var(--space-4); } .mcp-docs-tool__header { display: flex; align-items: center; gap: var(--space-2); margin-bottom: var(--space-2); } .mcp-docs-tool__name { font-size: var(--font-size-sm); font-family: var(--font-mono); color: var(--color-accent-link); font-weight: var(--font-weight-semibold); } .mcp-docs-tool__desc { font-size: var(--font-size-sm); color: var(--text-secondary); line-height: var(--line-height-normal); margin-bottom: var(--space-2); } .mcp-docs-tool__schema { border-top: 1px solid var(--border-subtle); padding-top: var(--space-2); } .mcp-docs-tool__schema > summary { font-size: var(--font-size-xs); color: var(--text-muted); cursor: pointer; margin-bottom: var(--space-2); } .mcp-docs-params-table { width: 100%; border-collapse: collapse; font-size: var(--font-size-xs); } .mcp-docs-params-table th { text-align: left; color: var(--text-muted); font-weight: var(--font-weight-medium); padding: var(--space-1) var(--space-2); border-bottom: 1px solid var(--border-subtle); } .mcp-docs-params-table td { padding: var(--space-1) var(--space-2); color: var(--text-secondary); vertical-align: top; border-bottom: 1px solid var(--border-subtle); } .mcp-docs-type { font-family: var(--font-mono); color: var(--color-purple); font-size: 11px; } .mcp-docs-required { color: var(--color-success); font-weight: var(--font-weight-semibold); } .mcp-docs-resource, .mcp-docs-prompt { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-base); padding: var(--space-3) var(--space-4); } .mcp-docs-resource__uri, .mcp-docs-prompt__name { display: block; font-size: var(--font-size-sm); font-family: var(--font-mono); color: var(--color-accent-link); margin-bottom: var(--space-1); } .mcp-docs-resource__name { font-size: var(--font-size-xs); color: var(--text-muted); } .mcp-docs-resource__desc, .mcp-docs-prompt__desc { font-size: var(--font-size-sm); color: var(--text-secondary); margin-top: var(--space-1); line-height: var(--line-height-normal); } .mcp-docs-prompt__args { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-2); } .mcp-docs-prompt__arg { display: inline-flex; align-items: center; gap: var(--space-1); font-size: var(--font-size-xs); color: var(--text-muted); background: var(--bg-overlay); border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); padding: 2px 6px; } .mcp-docs-prompt__arg-desc { color: var(--text-muted); } /* ── Badge variants (elicitation, verified, deprecated) ──────────────────── */ .badge-elicitation { background: rgba(188, 140, 255, 0.15); color: var(--color-purple); border-color: rgba(188, 140, 255, 0.3); } /* ============================================================================ * 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, #58a6ff); --dd-accent-2: var(--color-accent-emphasis, #1f6feb); --dd-hero-from: #0d1117; --dd-hero-to: #161b22; --dd-glow: rgba(88, 166, 255, 0.25); &[data-domain-slug="midi"] { --dd-accent: #a855f7; --dd-accent-2: #7c3aed; --dd-hero-from: #130a24; --dd-hero-to: #0a0514; --dd-glow: rgba(168, 85, 247, 0.4); } &[data-domain-slug="code"] { --dd-accent: #38bdf8; --dd-accent-2: #2563eb; --dd-hero-from: #01111f; --dd-hero-to: #020c1a; --dd-glow: rgba(56, 189, 248, 0.35); } } // ── 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, #39d353 15%, transparent); color: #39d353; border: 1px solid color-mix(in srgb, #39d353 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, #f97316 15%, transparent); color: #f97316; border: 1px solid color-mix(in srgb, #f97316 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: #fff; display: flex; align-items: baseline; gap: 14px; flex-wrap: wrap; } .dd-hero__icon { font-size: 0.7em; } .dd-hero__subtitle { font-size: 0.42em; font-weight: 400; color: var(--dd-accent); letter-spacing: 0.06em; text-transform: uppercase; opacity: 0.85; } // ph-hero-sub handles desc sizing; only color override needed .dd-hero .ph-hero-sub { color: rgba(255,255,255,0.65); } .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-muted); 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 — only sets the CSS custom property .dd-dim-color-0 { --dim-color: #a855f7; } .dd-dim-color-1 { --dim-color: #38bdf8; } .dd-dim-color-2 { --dim-color: #34d399; } .dd-dim-color-3 { --dim-color: #fb923c; } .dd-dim-color-4 { --dim-color: #f472b6; } .dd-dim-color-5 { --dim-color: #facc15; } .dd-dim-color-6 { --dim-color: #60a5fa; } .dd-dim-color-7 { --dim-color: #f87171; } .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: #0d1117; &--compact .dd-terminal__body { padding: 10px 16px; font-size: 12px; } } .dd-terminal__chrome { display: flex; align-items: center; gap: 7px; padding: 10px 14px; background: #161b22; border-bottom: 1px solid rgba(255,255,255,0.06); } .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 rgba(255,255,255,0.1); background: transparent; color: #8b949e; cursor: pointer; transition: all 0.15s; margin-left: auto; flex-shrink: 0; &:hover { background: rgba(255,255,255,0.08); color: #e6edf3; } &.copied { color: #39d353; border-color: #39d353; } } .dd-terminal__body { padding: 12px 16px; margin: 0; font-size: 12px; font-family: var(--font-mono); color: #e6edf3; 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: #39d353; border-color: #39d353; } } // ── 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 ─────────────────────────────────────────────────────── /* Hero */ .dm-hero { position: relative; background: linear-gradient(135deg, #0d1117 0%, #0f1923 50%, #0d1117 100%); border-bottom: 1px solid var(--border-default); overflow: hidden; padding: 0 var(--space-4); } .dm-hero-glow { position: absolute; inset: 0; background: radial-gradient(ellipse 60% 80% at 75% 30%, rgba(88,166,255,0.06) 0%, transparent 70%), radial-gradient(ellipse 40% 60% at 5% 80%, rgba(188,140,255,0.05) 0%, transparent 60%); pointer-events: none; } .dm-hero-inner { position: relative; display: flex; justify-content: space-between; align-items: center; gap: var(--space-6); padding: var(--space-8) 0 var(--space-6); } .dm-hero-left { flex: 1; min-width: 0; max-width: 560px; } .dm-hero-title { font-size: clamp(26px, 4vw, 38px); font-weight: 800; line-height: 1.15; letter-spacing: -0.02em; margin: 0 0 var(--space-3); color: var(--text-primary); } .dm-hero-sub { font-size: 14px; line-height: 1.65; color: var(--text-secondary); margin: 0 0 var(--space-4); max-width: 460px; } /* Inline search bar — matches explore page exactly */ .dm-search-field { display: flex; align-items: center; gap: 8px; height: 40px; border: 1px solid rgba(255,255,255,0.1); border-radius: 6px; padding: 0 14px; background: transparent; max-width: 400px; margin-bottom: var(--space-3); transition: border-color 0.15s; &:focus-within { border-color: rgba(88, 166, 255, 0.45); } } .dm-search-icon { color: var(--text-muted); flex-shrink: 0; } // Use higher specificity (.dm-search-field input) to override global input[type="text"] rule .dm-search-field input.dm-search-input { flex: 1; background: transparent; border: none; outline: none; box-shadow: none; padding: 0; width: auto; color: var(--text-primary); font-size: 15px; font-family: var(--font-sans); appearance: none; -webkit-appearance: none; &::placeholder { color: var(--text-muted); } } /* Verified toggle — styled pill chip */ .dm-verified-toggle { display: inline-flex; align-items: center; cursor: pointer; user-select: none; } .dm-verified-toggle input[type="checkbox"] { // visually hidden but accessible position: absolute; opacity: 0; width: 0; height: 0; pointer-events: none; } .dm-verified-chip { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: 500; letter-spacing: 0.02em; padding: 4px 10px; border-radius: 20px; border: 1px solid var(--border-default); color: var(--text-muted); background: transparent; transition: border-color 0.15s, color 0.15s, background 0.15s; svg { opacity: 0.4; transition: opacity 0.15s; } } .dm-verified-toggle:hover .dm-verified-chip { border-color: var(--border-emphasis); color: var(--text-secondary); svg { opacity: 0.7; } } .dm-verified-toggle input:checked ~ .dm-verified-chip { background: rgba(57, 211, 83, 0.08); border-color: rgba(57, 211, 83, 0.3); color: #39d353; svg { opacity: 1; stroke: #39d353; } } /* Right stat pills */ .dm-hero-right { display: flex; flex-direction: column; gap: var(--space-2); flex-shrink: 0; } .dm-stat-pill { display: flex; align-items: center; gap: 10px; background: transparent; border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); padding: 9px 14px; min-width: 130px; } .dm-stat-value { font-family: var(--font-mono); font-size: 18px; font-weight: 700; color: var(--text-primary); line-height: 1; } .dm-stat-label { font-size: 11px; font-weight: 500; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.06em; } /* Body */ .dm-body { padding: var(--space-4) var(--space-4); } .dm-empty { padding: var(--space-6) 0; font-size: 14px; color: var(--text-muted); text-align: center; } .dm-scoped-id { margin-left: auto; } /* 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); } .badge-verified { font-size: 10px; padding: 2px 7px; border-radius: 10px; background: color-mix(in srgb, #39d353 12%, transparent); color: #39d353; border: 1px solid color-mix(in srgb, #39d353 20%, transparent); letter-spacing: 0.03em; } .badge-deprecated { font-size: 10px; padding: 2px 7px; border-radius: 10px; background: color-mix(in srgb, #f97316 12%, transparent); color: #f97316; border: 1px solid color-mix(in srgb, #f97316 20%, transparent); } .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); } /* CTA */ .domains-cta { border-top: 1px solid var(--border-subtle); padding: var(--space-5) var(--space-4); } .domains-cta__inner { display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); flex-wrap: wrap; } .domains-cta__text { flex: 1; min-width: 0; } .domains-cta__title { font-size: 15px; font-weight: 600; margin: 0 0 4px; color: var(--text-primary); } .domains-cta__body { font-size: 13px; color: var(--text-muted); margin: 0; code { font-family: var(--font-mono); font-size: 12px; color: var(--color-accent); } } .domains-cta__actions { display: flex; gap: 8px; flex-shrink: 0; flex-wrap: wrap; } /* Themed CTA buttons (override generic .btn) */ .dm-cta-btn { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 500; padding: 6px 14px; border-radius: 6px; text-decoration: none; transition: border-color 0.15s, color 0.15s, background 0.15s; } .dm-cta-btn--primary { border: 1px solid rgba(88,166,255,0.35); color: var(--color-accent); background: rgba(88,166,255,0.06); &:hover { border-color: rgba(88,166,255,0.6); background: rgba(88,166,255,0.12); color: var(--color-accent); text-decoration: none; } } .dm-cta-btn--secondary { border: 1px solid var(--border-default); color: var(--text-secondary); background: transparent; &:hover { border-color: var(--border-emphasis); color: var(--text-primary); background: rgba(255,255,255,0.04); text-decoration: none; } } @media (max-width: 640px) { .dm-hero-right { display: none; } .dm-hero-left { max-width: 100%; } }