gabriel / musehub public
Closed #7 Enhancement design
filed by gabriel human · 49 days ago

feat: Spectral Dark — MuseHub design system & component theme

0 Anchors
Blast radius
Churn 30d
0 Proposals

What This Is — Read First

This is a CSS theme delivery. The mental model: imagine you purchased a premium dark-mode theme called Spectral Dark and dropped it into MuseHub. When the theme is complete, every page in the app renders correctly simply by applying the right class names — no page-specific color, typography, or visual rules anywhere.

The contract every agent must follow:

  • HTML templates apply class names: class="btn btn--primary", class="hero hero--agent", class="card card--repo"
  • The CSS theme defines what those classes look like — once, in one file, for the entire app
  • pages/ SCSS files contain structural layout only — grid columns, flex direction, max-width, sticky positioning — zero colors, zero typography, zero visual appearance

If you find yourself writing color:, background:, border-color:, or font-size: in a pages/ file — stop. That rule belongs in a components/ or patterns/ file.


What Agents Must NOT Do

  • Do not write visual/color CSS in page files. Page files are structural layout only.
  • Do not tokenize old flat SCSS files. The old flat files (_user-profile.scss, _commit-detail.scss, _blob.scss, etc.) are being deleted entirely, not migrated. Stop touching them.
  • Do not create one-off component classes per page. .prof-hero should not exist. Use .hero.hero--human. .prof-repo-card should not exist. Use .card.card--repo.
  • Do not write a pages/ file before its template uses component classes. Update the template first, then write the minimal structural layout file.
  • Do not read entire flat SCSS files line by line looking for hex values. Those files are going away. The component files are the source of truth.

How To Deliver This (Exact Steps)

One page at a time. Build and visually verify after each step.

  1. Pick a page (start with profile)
  2. Open its HTML template
  3. Replace one-off page classes with canonical component classes (.prof-hero.hero.hero--human, .prof-repo-card.card.card--repo, etc.)
  4. Write pages/_[page].scss with structural layout only — grids, max-widths, flex direction
  5. Build: npm run build:css
  6. Verify the page visually on https://localhost:1337
  7. Delete the old flat SCSS file
  8. Repeat for next page

The Complete Component Inventory

Every element below must be defined once in src/scss/components/ or src/scss/patterns/. These are the canonical class names. HTML uses these. Nothing else.

Base HTML elements — globally styled, no class required

h1 h2 h3 h4 h5 h6 — size, weight, line-height flowing from --text-* and --weight-* tokens p a strong em small blockquote code pre pre code — mono font, --bg-surface background, --border-default border ul ol li table thead tbody tr th td hr details summary input textarea select button — base reset, visual styling in components

Buttons — components/_buttons.scss

Every button is class="btn" plus a modifier. All variants need: default, :hover, :active, :focus-visible, [disabled].

  • .btn--primary — spectral gradient fill, white text, glow on hover
  • .btn--ghost — transparent, --border-default edge, lifts on hover
  • .btn--danger — red fill, destructive actions only
  • .btn--secondary--bg-surface fill, muted text
  • .btn--create — success green, create/publish actions
  • .btn--accent — accent blue tint
  • .btn--cta — full spectral gradient, largest CTA
  • .btn--sm .btn--lg — size modifiers

Inputs — components/_inputs.scss

All need: default, :focus, :disabled, [aria-invalid] states.

  • .form-input — text, email, password, search
  • .form-select — dropdown with chevron
  • .form-textarea — multiline
  • .form-checkbox .form-radio
  • .form-toggle — on/off switch
  • .form-label .form-group .form-error .form-hint
  • .tag-input-container .tag-pill — multi-tag input
  • .token-form — API token display

Cards — components/_cards.scss

  • .card — base: --bg-surface, --border-default, --radius-md
  • .card--elevated — stronger shadow/glow
  • .card--hover — pointer cursor, lift transform on hover
  • .card--repo — repo card with domain-colored left accent bar, name, description, footer stats
  • .card--stat — number + label layout for dashboard stats
  • .card--accent-top .card--accent-success .card--accent-warning .card--accent-danger — top border accent variants
  • .site-nav — top navigation bar, full width, --bg-base background
  • .site-nav__logo .site-nav__links .site-nav__actions
  • .tab-list .tab .tab--active — horizontal tab bar with bottom border indicator
  • .tab-btn .tab-count — tab button with numeric count badge
  • .breadcrumb .breadcrumb__item .breadcrumb__sep
  • .sidebar-nav .sidebar-nav__item .sidebar-nav__item--active
  • .sort-btn — sort/filter button in list headers
  • .sidebar-section .sidebar-section-title

Surfaces and Overlays — patterns/_surfaces.scss

  • .panel — base panel surface (background + border + radius)
  • .panel--overlay — floating elevated panel
  • .hero — full-width section with dark gradient background
  • .hero--human — subtle blue-tinted gradient glow
  • .hero--agent — subtle purple-tinted gradient glow
  • .hero--org — subtle amber-tinted gradient glow
  • .modal .modal-backdrop .modal-panel .modal-header .modal-footer
  • .dropdown .dropdown__item .dropdown__divider
  • .comment-block .comment-header-row .comment-body-text

Badges — components/_badges.scss

  • .badge — base inline badge
  • .badge--open .badge--closed .badge--merged .badge--active
  • .badge--success .badge--failure .badge--running .badge--pending .badge--cancelled .badge--warning — CI/CD states
  • .badge--human .badge--agent .badge--verified .badge--deprecated — identity/provenance
  • .badge-dim-harmonic .badge-dim-rhythmic .badge-dim-melodic .badge-dim-structural .badge-dim-dynamic — dimension badges

Pills — components/_pills.scss

  • .pill[data-domain="code"] .pill[data-domain="midi"] .pill[data-domain="mist"] .pill[data-domain="agent"] .pill[data-domain="generic"]
  • .pill--status[data-status="open"] .pill--status[data-status="merged"] .pill--status[data-status="closed"]

Chips — components/_chips.scss

  • .chip--code .chip--midi .chip--mist .chip--agent .chip--generic
  • .filter-chip — toggleable filter
  • .ticker-chip — numeric data chip
  • .mono-badge .mono-badge--accent .mono-badge--success
  • .label-chip .label-dot

Avatars — components/_avatars.scss

  • .avatar — base circular avatar
  • .avatar--sm .avatar--lg
  • .avatar--agent — purple spectral ring
  • .avatar--org — rounded-square
  • .participant-stack .participant-avatar .participant-overflow — stacked avatar row

Activity Canvas — components/_canvas.scss

  • .prof-canvas .prof-canvas__domain .prof-canvas__cell[data-intensity="0-4"]
  • Cell colors map: 0--canvas-0 through 4--canvas-4

Code and Diff — components/_code.scss

  • pre code pre code — base monospace styling
  • .diff-track-row .diff-track-added .diff-track-removed .diff-track-changed
  • .diff-sign-add .diff-sign-del .diff-sign-ctx

Timeline and Activity Rows — components/_timeline.scss

  • .commit-row .proposal-row .issue-row .session-row
  • .commit-sha .commit-msg .commit-meta
  • .session-row--active .session-live — live pulse animation
  • .branch-pill — inline branch name chip

Feedback States — components/_toasts.scss

  • .loading — spinner + muted message
  • .error — red tinted error state
  • .empty-state .empty-icon .empty-title .empty-desc
  • .toast .toast--success .toast--error .toast--info
  • [data-tooltip] — CSS-only tooltip on hover
  • .notif-badge — notification count dot

Spectral Patterns — patterns/_spectral.scss

  • .spectral-text — gradient background-clip text (hero handles, callout names)
  • .spectral-glow — layered box-shadow glow
  • .spectral-glow--accent .spectral-glow--agent
  • .spectral-shimmer — animated shimmer for loading states

Agent Patterns — patterns/_agents.scss

  • .agent-badge — agent identity badge
  • .agent-ring — spectral ring around agent avatar
  • .agent-commit-marker — marker on timeline for agent-authored commits
  • .fleet-dot .fleet-dot--active .fleet-dot--idle .fleet-dot--error

Page Layout Files — Structural Only

These four files cover every page. They contain zero visual rules — only layout.

File Pages covered Key structural rules
pages/_profile.scss profile, forks, commit graph hero layout, canvas grid, repo card grid, DAG viewport
pages/_repo.scss repo home, blob, branches, tags, releases, new-repo file tree layout, blob viewer, list layouts
pages/_commit.scss commit detail, diff, symbols, symbol-view diff layout, symbol sidebar, two-column
pages/_docs.scss docs, MCP docs, legal, credits prose layout, sidebar TOC, section spacing

Vision

MuseHub is not GitHub. This is a domain-agnostic version control system for multi-dimensional state with agents, humans, and organizations as first-class citizens. The UI should feel like what you'd get if a recording studio, a particle accelerator control room, and a very clean dark-mode IDE had a child.

Theme name: Spectral Dark

The visual metaphor: you're looking through a viewport into a void where agents and humans deposit work as luminous crystalline structures. Everything is dark and precise, with spectral color as signal — not decoration.


The Color System

Two channels, one spectrum

Cold → Hot axis (maps to domain types):

Cold                                              Hot
#1d4ed8  #3730a3  #6d28d9  #7c3aed  #9333ea  #a855f7  #c084fc
 blue     indigo   deep     violet   purple   amethyst  lavender
 code     base     midi     accent   mist     agent     soft

The palette we have is directionally right but slightly garish at the hot end. The fix is not to remove the warmth — this should still breathe and feel alive — but to pull the fuchsia/pink back from fully saturated neon toward a richer, more luminous purple-magenta. Think: bioluminescent, not neon sign.

Refined intensity palette (for canvas, heatmaps, intensity UI):

level 0:  #0d0d1a  ← void, empty
level 1:  #1e1b4b  ← indigo shadow
level 2:  #4c1d95  ← deep violet
level 3:  #7c3aed  ← violet (current, keep)
level 4:  #a855f7  ← amethyst (replaces fuchsia #c026d3 — less neon, same energy)

Spectral name gradient:

before: linear-gradient(90deg, #388bfd, #7c3aed, #c026d3, #f472b6)
after:  linear-gradient(90deg, #60a5fa, #818cf8, #a78bfa, #c084fc)

This shifts the whole gradient about 20° cooler — still spectral, still alive, but the landing color is lavender instead of fuchsia. It reads as "cosmic" rather than "rave."

Domain color assignments

Domain Primary Muted bg Border Feeling
code #60a5fa rgba(96,165,250,0.08) rgba(96,165,250,0.18) electric blue, precision
midi #a78bfa rgba(167,139,250,0.08) rgba(167,139,250,0.18) violet, resonant
mist #c084fc rgba(192,132,252,0.08) rgba(192,132,252,0.18) lavender, ambient
generic #64748b rgba(100,116,139,0.08) rgba(100,116,139,0.18) slate, neutral
agent #e879f9 rgba(232,121,249,0.08) rgba(232,121,249,0.18) fuchsia, alive

Agent intentionally gets the most saturated treatment — agents are special, they should pop.

Background layers

--bg-void:      #07070f   /* page background — the deepest dark */
--bg-base:      #0d1117   /* familiar grounded dark */
--bg-surface:   #161b22   /* cards, panels */
--bg-elevated:  #1c1c2e   /* modals, dropdowns, canvas cells */
--bg-overlay:   #21213a   /* hover states, active rows */

Text

--text-primary:   #e2e8f0   /* main content */
--text-secondary: #94a3b8   /* labels, metadata */
--text-muted:     #4a5568   /* timestamps, counts, disabled */

Borders (crystalline — thin, barely there)

--border-subtle:  rgba(99, 102, 241, 0.07)   /* almost invisible */
--border-default: rgba(99, 102, 241, 0.14)   /* card edges */
--border-strong:  rgba(139, 92, 246, 0.28)   /* focused inputs, active */
--border-glow:    rgba(167, 139, 250, 0.45)  /* hover, selected */

Named gradients

--gradient-spectral:    linear-gradient(90deg, #60a5fa, #818cf8, #a78bfa, #c084fc);
--gradient-spectral-45: linear-gradient(45deg, #60a5fa, #818cf8, #a78bfa, #c084fc);
--gradient-agent:       linear-gradient(90deg, #a78bfa, #e879f9);
--gradient-void:        linear-gradient(180deg, #0d1117 0%, #07070f 100%);
--gradient-surface:     linear-gradient(135deg, #161b22 0%, #1c1c2e 100%);

Typography

UI text: Inter — clean, humanist, excellent legibility. CDN with local fallback.

--font-sans: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;
--font-mono: 'JetBrains Mono', 'Berkeley Mono', 'Fira Code', 'Cascadia Code', monospace;

Scale:

--text-xs:   11px   /* timestamps, labels, canvas totals */
--text-sm:   13px   /* secondary content, metadata */
--text-base: 15px   /* body, default */
--text-md:   17px   /* sub-headings */
--text-lg:   20px   /* section headings */
--text-xl:   24px   /* page titles */
--text-2xl:  32px   /* hero */
--text-3xl:  48px   /* display */

Weights:

--weight-normal:   400
--weight-medium:   500
--weight-semibold: 600
--weight-bold:     700

Spacing — 8pt grid

--space-1: 4px   --space-2: 8px    --space-3: 12px   --space-4: 16px
--space-5: 20px  --space-6: 24px   --space-7: 32px   --space-8: 40px
--space-9: 48px  --space-10: 64px  --space-11: 80px  --space-12: 96px

Motion

--ease-out:  cubic-bezier(0.0, 0, 0.2, 1)
--ease-in:   cubic-bezier(0.4, 0, 1, 1)
--ease-snap: cubic-bezier(0.0, 0, 0.1, 1)
--duration-fast:   80ms
--duration-base:   150ms
--duration-slow:   250ms
--duration-reveal: 400ms

Key Component Signatures

Buttons

  • .btn--primary — spectral gradient fill, white text, box-shadow: 0 0 12px rgba(139,92,246,0.25) on hover
  • .btn--ghost — transparent, --border-default, lifts on hover
  • .btn--danger#dc2626 tint, destructive actions only

Hero sections

  • .hero — full-width, --bg-base background
  • .hero--human — radial gradient glow using --color-accent
  • .hero--agent — radial gradient glow using --color-purple
  • .hero--org — radial gradient glow using --color-warning
  • Every profile, repo, and commit page uses .hero + a modifier. No page-specific hero styling.

Cards

  • Base: --bg-surface + --border-default + 8px radius
  • Hover: border lifts to --border-glow, 200ms
  • No drop shadows — in dark theme, use border lift instead

Spectral text

.spectral-text {
  background: var(--gradient-spectral);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}

Used on hero handles and featured callouts. Sparingly — maximum impact.

Glow

.spectral-glow {
  box-shadow:
    0 0 0 1px rgba(139, 92, 246, 0.2),
    0 0 16px rgba(139, 92, 246, 0.12),
    0 0 32px rgba(139, 92, 246, 0.06);
}

Used on focused inputs, selected cards, active nav items, primary CTAs.


Light Mode

Secondary target — dark is primary. Spectral colors unchanged, backgrounds invert:

[data-theme="light"] {
  --bg-void:        #ffffff;
  --bg-base:        #f8fafc;
  --bg-surface:     #f1f5f9;
  --bg-elevated:    #e2e8f0;
  --text-primary:   #0f172a;
  --text-secondary: #475569;
  --text-muted:     #94a3b8;
  --border-default: rgba(99, 102, 241, 0.18);
  --border-strong:  rgba(99, 102, 241, 0.35);
}

File Architecture

src/scss/
├── theme/
│   ├── _tokens.scss         ← ALL CSS custom properties (dark default + light override)
│   ├── _typography.scss     ← font declarations, scale vars
│   ├── _spacing.scss        ← --space-1 through --space-12
│   └── _motion.scss         ← easing, durations, transition helpers
│
├── components/              ← one file per UI element; visual rules only
│   ├── _buttons.scss
│   ├── _pills.scss
│   ├── _cards.scss
│   ├── _inputs.scss
│   ├── _badges.scss
│   ├── _chips.scss
│   ├── _canvas.scss
│   ├── _avatars.scss
│   ├── _code.scss
│   ├── _timeline.scss
│   ├── _nav.scss
│   └── _toasts.scss
│
├── patterns/                ← multi-component compositions
│   ├── _spectral.scss       ← .spectral-text, .spectral-glow, shimmer
│   ├── _surfaces.scss       ← .hero, .panel, .modal, .dropdown
│   └── _agents.scss         ← agent visual language, fleet indicators
│
├── pages/                   ← structural layout ONLY, zero colors
│   ├── _profile.scss
│   ├── _repo.scss
│   ├── _commit.scss
│   └── _docs.scss
│
└── app.scss                 ← @use in order: theme → components → patterns → pages

_tokens.scss is the single source of truth. Every value in every other file is either a token or a local calc derived from tokens. No raw hex values outside _tokens.scss.


Acceptance Criteria

  • Every component listed above is defined in the correct file with all variants and states
  • Base HTML elements (h1h6, a, p, table, input, etc.) are globally styled — no class required
  • .hero, .hero--human, .hero--agent, .hero--org exist in patterns/_surfaces.scss — no page uses a one-off hero class
  • All four pages/ files contain zero color/typography rules
  • All old flat SCSS files deleted (_user-profile.scss, _commit-detail.scss, _blob.scss, _diff.scss, _repo-home.scss, etc.)
  • app.scss imports only: theme → components → patterns → pages (no flat legacy files)
  • Profile, repo, and commit pages visually verified in dark mode on https://localhost:1337
  • Agent-created commits visually distinct from human commits everywhere they appear
  • No raw hex values outside _tokens.scss
Activity9
gabriel opened this issue 49 days ago
gabriel 49 days ago

Progress update — tokens layer complete

✅ Done

Layer 1: Design tokens ()

  • Complete rewrite as Spectral Dark single source of truth
  • Background void stack: #07070f#0d1117#161b22#1c1c2e (purple-tinted elevation)
  • Translucent purple borders: rgba(99,102,241,0.07/0.14/0.28/0.45)
  • Spectral gradient: linear-gradient(90deg, #60a5fa, #818cf8, #a78bfa, #c084fc)
  • Domain color system: code/midi/mist/agent/generic with primary + bg + border triples
  • Canvas intensity palette: canvas-0 through canvas-4 (amethyst, toned down from fuchsia)
  • Glow effects: --glow-spectral, --glow-accent, --glow-agent
  • Motion tokens: --ease-out, --ease-snap, --duration-fast/base/slow/reveal
  • Dimension slots (5 generic data viz slots) + 8-slot track palette
  • Typography: Inter (sans-serif) + JetBrains Mono loaded via bunny.net CDN
  • Light mode overrides in [data-theme="light"]
  • Z-index ladder, shadow system, spacing 8pt grid, border-radius scale

Layer 2: Activity canvas token adoption ()

  • All data-intensity cells now use var(--canvas-0)var(--canvas-4)
  • Legend swatches tokenized
  • Tooltip backgrounds use var(--bg-elevated)/var(--text-primary)/var(--canvas-2)
  • Domain name labels use var(--domain-code), var(--domain-midi), etc. (not hardcoded purple)
  • Added --agent and --generic domain label variants

Fonts

  • Inter added to bunny.net CDN load in base.html
  • --font-sans: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif

🔄 In progress / next

  • Visual verification on localhost (CSS compiled, server running, needs eyeball check)
  • Audit remaining component files for raw hex → token migration
  • Buttons: .btn--primary (spectral gradient fill), .btn--ghost, .btn--danger
  • Pills: .pill[data-domain] using domain color tokens
  • Nav, sidebar, repo cards adopting new border/bg tokens
  • File architecture restructure (theme/components/patterns/pages subdirs) — lower priority
gabriel 49 days ago

Progress update — component token sweep complete

✅ Done since last update

Core component files fully tokenized

_user-profile.scss

  • Hero background gradients use color-mix(in srgb, var(--token)...) — no hardcoded hex
  • Hero glow radials reference var(--color-accent), var(--color-purple), var(--color-warning), var(--color-success)
  • Identity type badges (human / agent / org) fully tokenized
  • Heatmap agent/mixed color tokens use var(--color-purple) / var(--color-accent)
  • DAG popover badges use var(--color-purple) / var(--color-danger)
  • pop-sym-add/del use var(--color-success) / var(--color-danger)
  • Canvas cells / legend swatches: var(--canvas-0) through var(--canvas-4)
  • Canvas domain labels: var(--domain-code), var(--domain-midi), etc.

_components.scss

  • .btn-cta upgraded to var(--gradient-spectral) — canonical brand gradient fill
  • Form required marker + tag-pill-remove → var(--color-danger)
  • Code block text → var(--text-secondary)

_layout.scss

  • Search focus ring → color-mix(in srgb, var(--color-accent) 12%, transparent)
  • Agent insight value → var(--color-purple)
  • Pre border → var(--border-default)

_domain.scss

  • Domain badge hover → color-mix(in srgb, var(--domain-badge-text) 12%, transparent)

Font FOUC fix

  • Changed bunny.net load from display=swapdisplay=optional
  • Eliminates late font swap; Inter loads silently, fallback (Helvetica Neue) never swaps out late

🔄 Next

  • _domain.scss — contribution graph still uses GitHub-green palette, domain dim overrides have raw hex
  • Page-specific files: _commit-detail.scss (111), _releases.scss (104), _issues.scss (101), _insights.scss (65)
  • Verify no regressions on non-profile pages
gabriel 49 days ago

Progress update

Completed

Token foundation

  • src/scss/theme/_tokens.scss — complete Spectral Dark token set (backgrounds, borders, text, brand colors, domain colors, canvas palette, gradients, glows, shadows, z-index)
  • src/scss/theme/_primitives.scss — raw named color atoms
  • src/scss/theme/_typography.scss — font stack, scale, weights
  • src/scss/theme/_spacing.scss — 8pt grid, border radius, z-index ladder
  • src/scss/theme/_motion.scss — easing, durations, transition helpers
  • Light mode overrides in [data-theme="light"]
  • Inter font loaded via bunny.net CDN with display=optional (eliminates FOUC)

Component library (src/scss/components/)

  • _buttons.scss — .btn--primary, .btn--ghost, .btn--danger, .btn--cta (spectral gradient), .btn--sm
  • _pills.scss — .pill[data-domain], .pill--status[data-status=open/merged/closed]
  • _cards.scss — .card, .card--elevated, .card--hover, .card--repo, .card--stat, accent-top variants
  • _inputs.scss — all form elements, tag-pill input widget, token-form
  • _badges.scss — state badges, CI status badges, identity badges (human/agent/verified)
  • _chips.scss — domain chips, filter chips, ticker chips, mono-badge, label-chip
  • _canvas.scss — activity canvas (.prof-canvas), cells, tooltip, legend
  • _avatars.scss — .avatar, agent ring, participant stack
  • _code.scss — pre/code, diff-track rows
  • _timeline.scss — commit/proposal/issue/session rows, live pulse animation
  • _nav.scss — tabs, sort buttons, sidebar sections
  • _toasts.scss — empty state, loading, error, CSS tooltips, notif badge

Patterns (src/scss/patterns/)

  • _spectral.scss — .spectral-text (gradient clip), .spectral-glow, shimmer animation
  • _surfaces.scss — modal, panel, comment blocks
  • _agents.scss — agent badge, agent ring, fleet dots, agent commit marker

Entry point

  • app.scss rewritten with correct import order: theme → components → patterns → layout → page files

In progress

Page files still contain per-component color rules (the legacy flat files). Those rules are redundant now that the component library covers the same patterns. Next step: strip color declarations from page files and replace with component classes in templates.

gabriel 49 days ago

Implementation Guide — Read This First

The vision and color spec above are complete and correct. This note clarifies what to build and how, so no time is wasted on band-aid work.


What we are delivering

A single compiled app.css built from a clean SCSS architecture. When someone buys a CSS theme, they get one file that contains all the tokens and every component styled. That is what this is. Every page on MuseHub uses classes from this theme — it does not define its own colors.


The file architecture (already created)

src/scss/
├── theme/              ← tokens, typography, spacing, motion, primitives
├── components/         ← every reusable UI component
├── patterns/           ← spectral, surfaces, agents
├── pages/              ← layout/structure only, zero colors
└── app.scss            ← entry point, imports in dependency order

Complete component inventory

Every component lives in src/scss/components/. Colors come exclusively from tokens.

File Components
_buttons.scss .btn, .btn--primary, .btn--ghost, .btn--danger, .btn--cta, .btn--sm
_badges.scss .badge, .badge--open/closed/merged/active/clean/dirty/error, .badge--success/failure/running/pending/cancelled, .badge--human/agent/verified/deprecated
_pills.scss .pill[data-domain="code/midi/mist/agent"], .pill--status[data-status="open/merged/closed"]
_chips.scss .chip--code/midi/mist/agent, .filter-chip, .ticker-chip, .mono-badge, .label-chip
_cards.scss .card, .card--elevated, .card--hover, .card--repo, .card--stat, .card--accent-top
_inputs.scss input, select, textarea, .form-group, .form-label, .form-input, .tag-input-container
_nav.scss .tab-list, .tab, .tab-btn, .sort-btn, .sidebar-section
_avatars.scss .avatar, .avatar--sm/lg/agent/org, .participant-stack
_canvas.scss .prof-canvas, .prof-canvas__cell[data-intensity="0-4"], legend, tooltip
_code.scss pre, code, .diff-track-added/removed/changed
_timeline.scss .commit-row, .proposal-row, .issue-row, .session-row, .session-live
_toasts.scss .empty-state, .loading, .error, [data-tooltip], .notif-badge

Patterns:

File Components
_spectral.scss .spectral-text (gradient clip), .spectral-glow, .spectral-shimmer
_surfaces.scss .modal, .panel, .comment-block
_agents.scss .agent-badge, .agent-ring, .fleet-dot, .agent-commit-marker

How to implement

Step 1 — For each page group, write one clean pages/ file:

  • pages/_profile.scss — structural layout only for profile hero, canvas section, repo grid
  • pages/_repo.scss — structural layout only for repo home, file browser, branch list, blob
  • pages/_commit.scss — structural layout only for commit detail, diff view
  • pages/_docs.scss — structural layout only for docs, MCP docs, legal

Structural means: grid, flexbox, positioning, sizing, spacing. Zero colors. Zero font sizes that aren't var(--text-*).

Step 2 — Delete all old flat page files. These are the 30+ files like _commit-detail.scss, _user-profile.scss, _blob.scss, etc. They go away entirely.

Step 3 — Update app.scss to only import the 4 page files.

Step 4 — Update HTML templates to use component class names (e.g. badge badge--success instead of a one-off class defined in a page file).


What NOT to do

  • Do not tokenize old flat files. Those files are being deleted. Replacing #22c55e with var(--color-success) in _commit-detail.scss is wasted work — that file is going away.
  • Do not define colors in page files. If a component needs a color, it belongs in a component file, not a page file.
  • Do not create new one-off classes in page files. If something needs to be styled, it either uses an existing component class or a new component file is created.
gabriel 49 days ago

Component Audit Complete ✅

All 15 component and pattern files verified and complete as of 2026-05-02.

File Status
components/_buttons.scss ✅ all variants + :hover :active :focus-visible [disabled]
components/_inputs.scss ✅ all variants + :focus :disabled [aria-invalid] + toggle
components/_cards.scss ✅ all variants + .stat-pill added
components/_badges.scss ✅ all variants
components/_pills.scss ✅ all domain + status variants
components/_chips.scss ✅ all variants + .project-chip added
components/_nav.scss ✅ .site-nav .breadcrumb .sidebar-nav added
components/_toasts.scss ✅ .toast --success --error --info added
components/_avatars.scss ✅ complete
components/_timeline.scss ✅ complete
components/_code.scss ✅ .diff-sign-del .diff-sign-ctx aliases added
components/_canvas.scss ✅ complete
patterns/_spectral.scss ✅ complete
patterns/_surfaces.scss ✅ .hero .hero--human/agent/org .hero-inner .hero-strip added
patterns/_agents.scss ✅ complete

Base HTML elements (h1–h6, p, blockquote, ul, ol, table, hr, details) now globally styled in _components.scss.

Next: Replace all .prof-* one-off classes in profile.html with canonical component classes.

gabriel 49 days ago

✅ /explore page complete

Profile page (previous session) and Explore page (this session) are done.

What landed

Separation of concerns enforced across the board:

  • explore.ts no longer generates any HTML — all markup moved to Jinja
  • New GET /explore/search endpoint renders search results server-side
  • Two new fragments: search_repo_results.html, search_commit_results.html

Canonical class names:

  • All ex-* and ph-* one-off classes replaced in explore.html
  • repo_grid.html: repo-card-gridrepo-grid, repo-card-*repo-card__* BEM
  • JS toggles updated to match: search-type-pill--active, search-field--active

CSS architecture:

  • components/_search.scss — search box, type pills, results list, commit results (visual rules only)
  • pages/_explore.scss — browse-layout grid, sidebar-section, grid-header (structural layout only, zero colors)
  • patterns/_surfaces.scsshero--explore, hero-glow--explore, hero-inner--center, hero__sub
  • _components.scssrepo-card__* BEM, tag-pill, repo-grid

Next: /mcp/docs

gabriel 49 days ago

/mcp/docs page migrated ✓

Replaced all mcp-* prefixed classes with canonical BEM names. The flat _mcp-docs.scss file (632 lines) has been deleted and replaced by:

New component file — components/_mcp-docs.scss

  • tool-card / tool-card__* — tool card with collapsible params
  • step-card / step-card__* — quickstart numbered steps
  • kv-table / kv-table__* — key/value connection table
  • tool-filter-bar / tool-count — live search bar
  • param-type param-type--{string,integer,boolean,array,object,any} — type chips
  • params-table / params-table__* — parameter display table
  • resource-card / resource-card__* — resource/template cards
  • prompt-card / prompt-card__* — prompt cards
  • copy-btn — clipboard copy button

New page file — pages/_docs.scss (structural layout only, zero colors)

  • docs-layout — sidebar + content grid
  • docs-sidebar-link / docs-sidebar-link--{read,write,cli,elicit,meta} — nav links with color dots
  • docs-section / docs-section__* — content sections with scroll margin

Existing components extended:

  • badge--{read,write,cli,elicit,server,resource,prompt}_badges.scss
  • sidebar-count_nav.scss
  • hero__actions, hero__stats_surfaces.scss
  • Hero reuses hero hero--agent + hero-glow hero-glow--agent — no new hero CSS
  • Stat pills reuse stat-pill / stat-pill__num / stat-pill__label from _cards.scss
  • Connection strip reuses hero-strip / strip-item / strip-label / strip-val / strip-sep

mcp-docs.ts updated — all class/ID queries use new canonical names (#tool-filter, #tool-count, .tool-card, .docs-section, .docs-sidebar-link).

gabriel 49 days ago

/domains page migrated

Commit: sha256:01d9dbf58eca

All dm-* classes replaced with canonical BEM names:

  • hero hero--human + hero-glow hero-glow--human + hero-inner
  • search-field / search-icon / search-input
  • stat-pill / stat-pill__num / stat-pill__label
  • verified-toggle / verified-chip → moved to components/_inputs.scss
  • domain-grid / domain-card__* → stay in _domain.scss
  • domains-body / empty-state / page-cta__* → new pages/_domains.scss
  • badge badge--verified (canonical badge variant)
  • btn btn--accent / btn btn--ghost (canonical button variants)

HTMX target IDs updated: dm-list-regiondomain-list-region, dm-search-inputdomain-search-input.

gabriel 49 days ago

✅ Complete

The Spectral Dark migration is fully shipped and on staging.

What landed

Phase 1 — Spectral Dark foundation

  • All component SCSS files migrated to token-only variables (no raw hex)
  • Strict two-layer split enforced: components/ = visual, pages/ = structural
  • Theme doc written: docs/guides/spectral-dark-theme.md

Phase 2 — Dead code audit + CSS restoration

  • Audited all templates against live routes — 5 dead templates deleted (commit.html, compare.html, context.html, similarity.html, workspace.html)
  • src/scss/_user-profile.scss deleted (1,195 lines, unimported, class prefix superseded)
  • Root cause of broken blob/diff pages identified: prior audit searched for old class prefixes (blob-\*, diff-\*) but templates had been rewritten to new prefixes (blob2-\*, df3-\*)

Phase 3 — Restored pages

  • components/_blob.scss + pages/_blob.scss — full blob2-* coverage (header, code viewer, outline panel, history timeline, provenance pills, bump badges, signal pills)
  • components/_diff.scss + pages/_diff.scss — full df3-* coverage (stats bar, file cards, diff table, symbol panel, kind chips)
  • tag-\* visual + layout appended to _releases.scss (simple page, natural home)
  • tags.ts bug fixed: .tg-row selector → .tag-row, dataset.tagNamedataset.tag

Documentation

  • Theme reference: spectral-dark-theme.md
  • All component and page layout files documented with prefix inventory and routes

Deployed

40bad3c3-20260502142034 → staging (active slot: green)