// ───────────────────────────────────────────────────────────────────────────── // Component: Domain Protocol visualizations // File: src/scss/components/_domains-viz.scss // // Two visualization blocks for /muse/domains (Phase 03): // 1. .domains-cap-* — "What Every Plugin Gets for Free" (4-cap grid) // 2. .domains-da-* — "Five Algebras. One Typed Result." (diff algebra) // // Tokens: all from theme/_tokens.scss — no raw hex values here. // ───────────────────────────────────────────────────────────────────────────── // ── Shared: section intro ───────────────────────────────────────────────────── .domains-viz-lead { font-size: var(--text-base); color: var(--text-secondary); line-height: 1.65; margin: 0 0 var(--space-6); max-width: 640px; } // ───────────────────────────────────────────────────────────────────────────── // 1. Capability showcase — "What Every Plugin Gets for Free" // ───────────────────────────────────────────────────────────────────────────── .domains-cap-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-4); margin-top: var(--space-4); @media (max-width: 860px) { grid-template-columns: 1fr; } } .domains-cap-card { border-radius: 10px; border: 1px solid var(--border-default); background: var(--bg-surface); overflow: hidden; display: flex; flex-direction: column; transition: border-color 0.15s; &:hover { border-color: var(--border-strong); } } .domains-cap-header { display: flex; flex-direction: column; gap: var(--space-1); padding: var(--space-4) var(--space-5); border-bottom: 1px solid var(--border-default); background: var(--bg-elevated); } .domains-cap-badge { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; font-family: var(--font-mono); padding: 3px 8px; border-radius: 5px; border: 1px solid transparent; width: fit-content; &--delta { color: var(--color-warning); background: color-mix(in srgb, var(--color-warning) 10%, transparent); border-color: color-mix(in srgb, var(--color-warning) 25%, transparent); } &--schema { color: var(--color-accent); background: color-mix(in srgb, var(--color-accent) 10%, transparent); border-color: color-mix(in srgb, var(--color-accent) 25%, transparent); } &--merge { color: var(--color-danger); background: color-mix(in srgb, var(--color-danger) 10%, transparent); border-color: color-mix(in srgb, var(--color-danger) 25%, transparent); } &--harmony { color: var(--color-purple); background: color-mix(in srgb, var(--color-purple) 10%, transparent); border-color: color-mix(in srgb, var(--color-purple) 25%, transparent); } } .domains-cap-sub { font-size: 12px; color: var(--text-muted); line-height: 1.4; } .domains-cap-body { padding: var(--space-4) var(--space-5); flex: 1; } .domains-cap-desc { font-size: 13px; color: var(--text-secondary); line-height: 1.65; margin: 0 0 var(--space-4); code { font-family: var(--font-mono); font-size: 12px; background: var(--bg-overlay); border: 1px solid var(--border-default); border-radius: 3px; padding: 1px 5px; color: var(--color-purple); } strong { color: var(--text-primary); font-weight: 600; } } // ── AMM (Address-keyed Map Merge) scenarios ─────────────────────────────────── .domains-amm-scenarios { display: flex; flex-direction: column; gap: var(--space-3); } .domains-amm-scenario { border-radius: 8px; border: 1px solid var(--border-default); overflow: hidden; &--clean { border-color: color-mix(in srgb, var(--color-success) 25%, transparent); } &--conflict { border-color: color-mix(in srgb, var(--color-danger) 25%, transparent); } } .domains-amm-scenario-hdr { display: flex; align-items: center; gap: var(--space-3); padding: 6px var(--space-4); border-bottom: 1px solid var(--border-subtle); background: var(--bg-elevated); } .domains-amm-scenario-label { font-size: 10px; font-weight: 700; font-family: var(--font-mono); color: var(--text-muted); letter-spacing: 0.06em; text-transform: uppercase; } .domains-amm-scenario-title { font-size: 12px; color: var(--text-secondary); } .domains-amm-ops { padding: var(--space-3) var(--space-4); display: flex; flex-direction: column; gap: var(--space-2); border-bottom: 1px solid var(--border-subtle); } .domains-amm-op { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; } .domains-amm-op-side { font-size: 10px; font-weight: 700; font-family: var(--font-mono); text-transform: uppercase; letter-spacing: 0.06em; color: var(--text-muted); min-width: 32px; } .domains-amm-op-type { font-size: 11px; font-weight: 600; font-family: var(--font-mono); padding: 2px 7px; border-radius: 4px; &--insert { color: var(--color-success); background: color-mix(in srgb, var(--color-success) 12%, transparent); border: 1px solid color-mix(in srgb, var(--color-success) 25%, transparent); } &--replace { color: var(--color-warning); background: color-mix(in srgb, var(--color-warning) 12%, transparent); border: 1px solid color-mix(in srgb, var(--color-warning) 25%, transparent); } &--delete { color: var(--color-danger); background: color-mix(in srgb, var(--color-danger) 12%, transparent); border: 1px solid color-mix(in srgb, var(--color-danger) 25%, transparent); } } .domains-amm-op-addr { font-size: 12px; font-family: var(--font-mono); color: var(--color-accent-link); } .domains-amm-op-meta { font-size: 11px; color: var(--text-muted); } .domains-amm-result { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); padding: 6px var(--space-4); flex-wrap: wrap; } .domains-amm-reason { font-size: 11px; color: var(--text-muted); font-style: italic; } .domains-amm-badge { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: 600; font-family: var(--font-mono); padding: 2px 8px; border-radius: 4px; &--clean { color: var(--color-success); background: color-mix(in srgb, var(--color-success) 10%, transparent); border: 1px solid color-mix(in srgb, var(--color-success) 25%, transparent); } &--conflict { color: var(--color-danger); background: color-mix(in srgb, var(--color-danger) 10%, transparent); border: 1px solid color-mix(in srgb, var(--color-danger) 25%, transparent); } } // ── Schema domain grid (cap-card: Domain Schema) ────────────────────────────── .domains-schema-grid { display: flex; flex-direction: column; gap: var(--space-2); } .domains-schema-row { display: grid; grid-template-columns: 80px 1fr auto; align-items: center; gap: var(--space-3); padding: 6px var(--space-3); border-radius: 6px; border: 1px solid var(--border-subtle); background: var(--bg-elevated); font-size: 12px; font-family: var(--font-mono); } .domains-schema-name { font-weight: 600; color: var(--text-primary); } .domains-schema-dims { color: var(--text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .domains-schema-mode { font-size: 10px; padding: 1px 6px; border-radius: 4px; letter-spacing: 0.03em; white-space: nowrap; &--three-way { color: var(--color-accent); background: color-mix(in srgb, var(--color-accent) 10%, transparent); } &--addressed { color: var(--color-danger); background: color-mix(in srgb, var(--color-danger) 10%, transparent); } &--crdt { color: var(--color-purple); background: color-mix(in srgb, var(--color-purple) 10%, transparent); } } // ───────────────────────────────────────────────────────────────────────────── // 2. Diff algebra — "Five Algebras. One Typed Result." // ───────────────────────────────────────────────────────────────────────────── .domains-da-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-4); margin-top: var(--space-4); @media (max-width: 860px) { grid-template-columns: 1fr; } } .domains-da-card { border-radius: 10px; border: 1px solid var(--border-default); background: var(--bg-surface); padding: var(--space-4); display: flex; flex-direction: column; gap: var(--space-3); &--full { grid-column: 1 / -1; } } .domains-da-card-hdr { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); } .domains-da-chip { font-size: 11px; font-weight: 700; font-family: var(--font-mono); padding: 2px 8px; border-radius: 4px; letter-spacing: 0.04em; &--seq { color: var(--color-accent); background: color-mix(in srgb, var(--color-accent) 12%, transparent); border: 1px solid color-mix(in srgb, var(--color-accent) 25%, transparent); } &--tree { color: var(--color-purple); background: color-mix(in srgb, var(--color-purple) 12%, transparent); border: 1px solid color-mix(in srgb, var(--color-purple) 25%, transparent); } &--tensor { color: var(--color-warning); background: color-mix(in srgb, var(--color-warning) 12%, transparent); border: 1px solid color-mix(in srgb, var(--color-warning) 25%, transparent); } &--set { color: var(--color-success); background: color-mix(in srgb, var(--color-success) 12%, transparent); border: 1px solid color-mix(in srgb, var(--color-success) 25%, transparent); } &--map { color: var(--color-teal); background: color-mix(in srgb, var(--color-teal) 12%, transparent); border: 1px solid color-mix(in srgb, var(--color-teal) 25%, transparent); } } .domains-da-algo-name { font-size: 11px; color: var(--text-muted); font-family: var(--font-mono); text-align: right; } .domains-da-domains-row { font-size: 11px; color: var(--text-muted); } .domains-da-note { font-size: 11px; color: var(--text-muted); line-height: 1.5; padding-top: var(--space-2); border-top: 1px solid var(--border-subtle); } // ── Sequence visual ─────────────────────────────────────────────────────────── .domains-seq-vis { display: flex; flex-direction: column; gap: 4px; font-family: var(--font-mono); overflow-x: auto; } .domains-seq-row-lbl { font-size: 9px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); } .domains-seq-row { display: flex; gap: 4px; } .domains-seq-blk { display: flex; flex-direction: column; align-items: center; gap: 2px; padding: 4px 6px; border-radius: 5px; border: 1px solid var(--border-default); background: var(--bg-elevated); min-width: 46px; &--match { border-color: var(--border-default); opacity: 0.7; } &--del { border-color: color-mix(in srgb, var(--color-danger) 40%, transparent); background: color-mix(in srgb, var(--color-danger) 8%, var(--bg-elevated)); text-decoration: line-through; opacity: 0.7; } &--ins { border-color: color-mix(in srgb, var(--color-success) 40%, transparent); background: color-mix(in srgb, var(--color-success) 8%, var(--bg-elevated)); } &--moved-from { border: 1px dashed color-mix(in srgb, var(--color-purple) 50%, transparent); background: color-mix(in srgb, var(--color-purple) 6%, var(--bg-elevated)); } &--moved-to { border-color: color-mix(in srgb, var(--color-purple) 50%, transparent); background: color-mix(in srgb, var(--color-purple) 10%, var(--bg-elevated)); } } .domains-seq-hash { font-size: 9px; color: var(--text-muted); letter-spacing: 0.02em; } .domains-seq-name { font-size: 12px; font-weight: 600; color: var(--text-primary); } .domains-seq-ops-row { display: flex; gap: 4px; } .domains-seq-op-cell { min-width: 46px; display: flex; justify-content: center; } .domains-da-op { font-size: 10px; font-weight: 600; font-family: var(--font-mono); padding: 1px 5px; border-radius: 3px; white-space: nowrap; &--match { color: var(--text-muted); } &--delete { color: var(--color-danger); background: color-mix(in srgb, var(--color-danger) 10%, transparent); } &--insert { color: var(--color-success); background: color-mix(in srgb, var(--color-success) 10%, transparent); } &--move { color: var(--color-purple); background: color-mix(in srgb, var(--color-purple) 10%, transparent); } } // ── Tensor visual ───────────────────────────────────────────────────────────── .domains-tensor-wrap { display: flex; align-items: center; gap: var(--space-4); flex-wrap: wrap; } .domains-tensor-panel { display: flex; flex-direction: column; gap: 4px; } .domains-tensor-label { font-size: 10px; font-family: var(--font-mono); color: var(--text-muted); text-align: center; } .domains-tensor-grid { display: grid; grid-template-columns: repeat(4, 22px); gap: 3px; } .domains-tc { width: 22px; height: 22px; border-radius: 3px; &--0 { background: var(--bg-elevated); } &--1 { background: color-mix(in srgb, var(--color-accent) 20%, var(--bg-elevated)); } &--2 { background: color-mix(in srgb, var(--color-accent) 40%, var(--bg-elevated)); } &--3 { background: color-mix(in srgb, var(--color-accent) 65%, var(--bg-elevated)); } &--warm1 { background: color-mix(in srgb, var(--color-warning) 50%, var(--bg-elevated)); border: 1px solid color-mix(in srgb, var(--color-warning) 50%, transparent); } &--hot2 { background: color-mix(in srgb, var(--color-danger) 55%, var(--bg-elevated)); border: 1px solid color-mix(in srgb, var(--color-danger) 55%, transparent); } &--hot3 { background: color-mix(in srgb, var(--color-danger) 80%, var(--bg-elevated)); border: 1px solid color-mix(in srgb, var(--color-danger) 70%, transparent); } } .domains-tensor-arrow { font-size: 18px; color: var(--text-muted); flex-shrink: 0; } .domains-tensor-legend { display: flex; gap: var(--space-3); flex-wrap: wrap; } .domains-tl-item { display: flex; align-items: center; gap: 5px; font-size: 10px; font-family: var(--font-mono); color: var(--text-muted); } .domains-tl-swatch { width: 10px; height: 10px; border-radius: 2px; flex-shrink: 0; &--unchanged { background: var(--bg-elevated); border: 1px solid var(--border-default); } &--warm { background: color-mix(in srgb, var(--color-warning) 50%, var(--bg-elevated)); } &--hot { background: color-mix(in srgb, var(--color-danger) 70%, var(--bg-elevated)); } } // ── Set visual ──────────────────────────────────────────────────────────────── .domains-set-vis { display: flex; gap: var(--space-3); align-items: flex-start; font-family: var(--font-mono); font-size: 11px; } .domains-set-col { display: flex; flex-direction: column; gap: 4px; } .domains-set-header { font-size: 9px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); margin-bottom: 2px; } .domains-set-members { display: flex; flex-direction: column; gap: 3px; } .domains-set-member { padding: 2px 7px; border-radius: 4px; border: 1px solid var(--border-default); white-space: nowrap; &--kept { color: var(--text-secondary); background: var(--bg-elevated); } &--removed { color: var(--color-danger); background: color-mix(in srgb, var(--color-danger) 8%, var(--bg-elevated)); border-color: color-mix(in srgb, var(--color-danger) 25%, transparent); text-decoration: line-through; } &--added { color: var(--color-success); background: color-mix(in srgb, var(--color-success) 8%, var(--bg-elevated)); border-color: color-mix(in srgb, var(--color-success) 25%, transparent); } } .domains-set-ops-col { display: flex; flex-direction: column; gap: 3px; padding-top: 20px; } .domains-set-op-line { font-size: 11px; padding: 2px 4px; line-height: 1.4; text-align: center; &--keep { color: var(--text-muted); } &--rm { color: var(--color-danger); } &--add { color: var(--color-success); } } // ── Map visual ──────────────────────────────────────────────────────────────── .domains-map-vis { display: flex; flex-direction: column; gap: 4px; font-family: var(--font-mono); font-size: 11px; } .domains-map-entry { display: flex; align-items: center; gap: var(--space-2); padding: 4px 8px; border-radius: 5px; border: 1px solid var(--border-subtle); flex-wrap: wrap; &--changed { background: var(--bg-elevated); border-color: var(--border-default); } &--unchanged { background: var(--bg-surface); opacity: 0.55; } } .domains-map-key { color: var(--color-accent-link); font-weight: 600; min-width: 56px; } .domains-map-val-before { color: var(--text-muted); } .domains-map-delta { color: var(--text-disabled); padding: 0 2px; } .domains-map-val-after { color: var(--text-primary); font-weight: 600; } .domains-map-sub-algo { margin-left: auto; font-size: 10px; font-weight: 700; padding: 1px 6px; border-radius: 3px; letter-spacing: 0.03em; white-space: nowrap; } // ── Tree SVG ────────────────────────────────────────────────────────────────── .domains-tree-svg { width: 100%; max-width: 320px; height: auto; display: block; margin: 0 auto; } // ── Delta flow (all five → one typed result) ────────────────────────────────── .domains-da-delta-flow { margin-top: var(--space-6); border-radius: 10px; border: 1px solid var(--border-default); background: var(--bg-surface); overflow: hidden; } .domains-da-delta-top { display: flex; flex-direction: column; gap: 4px; padding: var(--space-4) var(--space-5); border-bottom: 1px solid var(--border-default); background: var(--bg-elevated); } .domains-da-delta-label { font-size: 13px; font-weight: 700; font-family: var(--font-mono); color: var(--text-primary); } .domains-da-delta-sub { font-size: 11px; color: var(--text-muted); } .domains-da-delta-ops { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-4) var(--space-5); border-bottom: 1px solid var(--border-default); } .domains-da-dop { font-size: 12px; font-weight: 600; font-family: var(--font-mono); padding: 3px 10px; border-radius: 5px; &--ins { color: var(--color-success); background: color-mix(in srgb, var(--color-success) 10%, transparent); border: 1px solid color-mix(in srgb, var(--color-success) 25%, transparent); } &--del { color: var(--color-danger); background: color-mix(in srgb, var(--color-danger) 10%, transparent); border: 1px solid color-mix(in srgb, var(--color-danger) 25%, transparent); } &--mov { color: var(--color-purple); background: color-mix(in srgb, var(--color-purple) 10%, transparent); border: 1px solid color-mix(in srgb, var(--color-purple) 25%, transparent); } &--rep { color: var(--color-warning); background: color-mix(in srgb, var(--color-warning) 10%, transparent); border: 1px solid color-mix(in srgb, var(--color-warning) 25%, transparent); } &--pat { color: var(--color-teal); background: color-mix(in srgb, var(--color-teal) 10%, transparent); border: 1px solid color-mix(in srgb, var(--color-teal) 25%, transparent); } } .domains-da-delta-merge { display: grid; grid-template-columns: 1fr auto 1fr; gap: 0; align-items: stretch; } .domains-da-merge-branch { padding: var(--space-4) var(--space-5); &--addressed { border-right: 1px solid var(--border-subtle); } } .domains-da-merge-divider { display: flex; align-items: center; justify-content: center; padding: 0 var(--space-3); font-size: 11px; color: var(--text-muted); font-style: italic; } .domains-da-merge-mode-label { font-size: 12px; font-weight: 700; font-family: var(--font-mono); color: var(--text-primary); margin-bottom: 4px; } .domains-da-merge-desc { font-size: 12px; color: var(--text-muted); line-height: 1.55; }