@dollhousemcp/mcp-server
Version:
DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.
1,906 lines (1,693 loc) • 55.3 kB
CSS
/**
* DollhouseMCP Collection — Atelier Design Language
*
* Fonts: Plus Jakarta Sans (headings) · Manrope (body) · IBM Plex Mono (utility)
* Palette: Signal blue · Accent orange · Paper/Ink neutrals · 6 element-type lanes
* Modes: light (default) · dark (data-theme="dark")
*/
/* ── Tokens ─────────────────────────────────────────────────────────────── */
:root {
--ink-950: #0a1020;
--ink-900: #18243a;
--ink-700: #324563;
--ink-500: #677893;
--line: #c8d5e9;
--paper: #f3f7ff;
--paper-strong: #ffffff;
--surface-1: #eaf1ff;
--surface-2: #f8fbff;
--signal: #1e40af;
--signal-2: #3b82f6;
--accent: #f97316;
--accent-soft: #fff1e5;
--violet: #7c3aed;
--teal: #2d8c80;
--radius-sm: 0.42rem;
--radius-md: 0.85rem;
--radius-lg: 1.3rem;
--radius-angled: 0.95rem;
--shadow-soft: 0 0.95rem 1.8rem -1.15rem rgba(17, 40, 74, 0.28);
--shadow-card: 0 1.5rem 2.9rem -1.35rem rgba(13, 35, 69, 0.34);
--max-width: 76rem;
--gutter: clamp(1rem, 0.72rem + 1.15vw, 1.95rem);
--font-body: "Manrope", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
--font-heading: "Plus Jakarta Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
--font-mono: "IBM Plex Mono", "SFMono-Regular", Consolas, monospace;
--step--1: clamp(0.78rem, 0.75rem + 0.15vw, 0.87rem);
--step-0: clamp(0.93rem, 0.88rem + 0.25vw, 1.05rem);
--step-1: clamp(1.1rem, 1rem + 0.5vw, 1.28rem);
--step-2: clamp(1.3rem, 1.16rem + 0.7vw, 1.6rem);
--step-3: clamp(1.6rem, 1.4rem + 1vw, 2.1rem);
--step-4: clamp(1.9rem, 1.7rem + 1.1vw, 2.6rem);
}
[data-theme="dark"] {
--ink-950: #f6f9fd;
--ink-900: #dce6f2;
--ink-700: #a8bcce;
--ink-500: #7b93a7;
--line: #2b3445;
--paper: #111318;
--paper-strong: #161b24;
--surface-1: #1c2230;
--surface-2: #212838;
--signal: #6fa3f5;
--signal-2: #4f8eef;
--accent: #f5883a;
--accent-soft: #281b0c;
--shadow-soft: 0 1rem 2rem -1rem rgba(0, 0, 0, 0.4);
--shadow-card: 0 1.55rem 2.95rem -1.2rem rgba(0, 0, 0, 0.5);
}
/* ── Reset ───────────────────────────────────────────────────────────────── */
*, *::before, *::after { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
margin: 0;
min-height: 100vh;
display: flex;
flex-direction: column;
color-scheme: light;
color: var(--ink-900);
background:
radial-gradient(110% 55% at 0% 0%,
color-mix(in srgb, var(--signal-2) 7%, transparent), transparent 55%),
radial-gradient(85% 45% at 100% 0%,
color-mix(in srgb, var(--accent) 4%, transparent), transparent 50%),
var(--paper);
font-family: var(--font-body);
font-size: var(--step-0);
line-height: 1.62;
position: relative;
}
[data-theme="dark"] body {
color-scheme: dark;
background:
radial-gradient(110% 55% at 0% 0%,
color-mix(in srgb, var(--signal-2) 2%, transparent), transparent 55%),
radial-gradient(85% 45% at 100% 0%,
color-mix(in srgb, var(--accent) 2%, transparent), transparent 50%),
var(--paper);
}
/* Subtle crosshatch noise */
.page-noise {
position: fixed;
inset: 0;
pointer-events: none;
background-image:
linear-gradient(135deg, color-mix(in srgb, var(--signal) 4%, transparent) 0.75px, transparent 0.75px),
linear-gradient(45deg, color-mix(in srgb, var(--accent) 3%, transparent) 0.75px, transparent 0.75px);
background-size: 24px 24px, 34px 34px;
z-index: -3;
}
a {
color: var(--signal);
text-decoration-thickness: 0.08em;
text-underline-offset: 0.16em;
}
a:hover { color: var(--accent); }
h1, h2, h3, h4 {
color: var(--ink-950);
font-family: var(--font-heading);
font-weight: 800;
letter-spacing: -0.008em;
line-height: 1.14;
margin: 0 0 0.5em;
}
h1 { font-size: var(--step-4); }
h2 { font-size: var(--step-3); }
h3 { font-size: var(--step-2); }
p, li { max-width: 69ch; }
/* ── Accessibility ───────────────────────────────────────────────────────── */
.sr-only {
position: absolute;
width: 1px; height: 1px;
padding: 0; margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
border: 0;
}
/* ── Site header ─────────────────────────────────────────────────────────── */
.site-header {
position: sticky;
top: 0;
z-index: 35;
display: grid;
grid-template-columns: auto minmax(0, 1fr);
grid-template-areas:
"brand controls"
"nav nav";
align-items: center;
column-gap: 1rem;
row-gap: 0.12rem;
padding: 0.44rem var(--gutter) 0.4rem;
border-bottom: 1px solid var(--line);
background: color-mix(in srgb, var(--paper-strong) 90%, transparent);
backdrop-filter: blur(8px);
}
.site-header::after {
content: "";
position: absolute;
left: 0; right: 0; bottom: -1px;
height: 2px;
background: linear-gradient(90deg,
color-mix(in srgb, var(--signal) 10%, transparent),
color-mix(in srgb, var(--accent) 12%, transparent),
color-mix(in srgb, var(--signal) 10%, transparent));
pointer-events: none;
}
.header-brand { grid-area: brand; display: flex; flex-direction: row; align-items: center; gap: 0.6rem; min-width: 0; min-height: 2.35rem; }
.header-brand-text { display: flex; flex-direction: column; justify-content: center; gap: 0.05rem; min-width: 0; min-height: 2.35rem; }
.header-logo { width: 32px; height: 32px; flex-shrink: 0; }
.site-title {
font-family: var(--font-heading);
font-size: var(--step-1);
font-weight: 800;
color: var(--ink-950);
margin: 0;
line-height: 1.2;
}
.site-tagline {
margin: 0;
font-size: var(--step--1);
color: var(--ink-700);
max-width: none;
line-height: 1.15;
}
.header-controls {
grid-area: controls;
display: flex;
align-items: center;
justify-content: flex-end;
flex-wrap: wrap;
gap: 0.65rem;
width: auto;
max-width: 100%;
min-width: 0;
}
.header-nav-row {
grid-area: nav;
display: flex;
align-items: center;
justify-content: flex-end;
flex-wrap: nowrap;
gap: 0.55rem;
width: 100%;
min-width: 0;
}
.console-tab-menu-shell {
position: relative;
display: flex;
align-items: center;
flex-shrink: 0;
min-width: 0;
}
.site-stats {
display: flex;
align-items: center;
flex-wrap: wrap;
justify-content: flex-end;
gap: 0.5rem;
font-family: var(--font-mono);
font-size: 0.72rem;
color: var(--ink-500);
min-width: 0;
}
.stat {
display: inline-flex;
align-items: baseline;
gap: 0.24rem;
border: 1px solid color-mix(in srgb, var(--line) 88%, var(--paper-strong));
border-radius: 0.32rem;
background: color-mix(in srgb, var(--surface-2) 65%, var(--paper-strong));
padding: 0.14rem 0.44rem;
}
.stat strong {
font-family: var(--font-heading);
font-size: var(--step-0);
font-weight: 800;
color: var(--ink-950);
}
.stat--session strong {
font-family: var(--font-mono);
font-size: 0.8rem;
letter-spacing: 0.01em;
}
/* Theme toggle */
.theme-toggle {
border: 1px solid color-mix(in srgb, var(--signal) 24%, var(--line));
border-radius: 999px;
background: color-mix(in srgb, var(--surface-1) 70%, var(--paper-strong));
color: var(--ink-700);
font: inherit;
width: 2rem;
height: 2rem;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 0.9rem;
padding: 0;
cursor: pointer;
flex-shrink: 0;
}
.theme-toggle:hover,
.theme-toggle:focus-visible {
background: color-mix(in srgb, var(--surface-1) 88%, var(--paper-strong));
outline: 2px solid var(--signal);
outline-offset: 2px;
}
.theme-toggle-icon { line-height: 1; }
/* ── Main layout ─────────────────────────────────────────────────────────── */
.site-main {
width: min(var(--max-width), calc(100% - 2 * var(--gutter)));
margin: 0 auto;
flex: 1 0 auto;
padding: clamp(1.1rem, 3vw, 2rem) 0 3rem;
}
/* ── Browse controls ─────────────────────────────────────────────────────── */
.browse-controls {
display: flex;
flex-direction: column;
gap: 0.72rem;
margin-bottom: 0.85rem;
}
.search-input {
width: 100%;
font-family: var(--font-body);
font-size: var(--step-0);
color: var(--ink-900);
background: color-mix(in srgb, var(--paper-strong) 94%, var(--surface-1));
border: 1px solid color-mix(in srgb, var(--signal) 18%, var(--line));
border-radius: var(--radius-md);
padding: 0.55rem 0.82rem;
outline: none;
transition: border-color 160ms ease, box-shadow 160ms ease;
}
.search-input::placeholder { color: var(--ink-500); }
.search-input:focus {
border-color: var(--signal-2);
box-shadow: 0 0 0 3px color-mix(in srgb, var(--signal-2) 15%, transparent);
}
/* Type filter row — filter chips + portfolio button side by side */
.type-filter-row {
display: flex;
align-items: flex-start;
gap: 0.5rem;
flex-wrap: wrap;
}
/* Type filter chips */
.type-filters {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
flex: 1;
}
.type-filter {
appearance: none;
border: 1px solid color-mix(in srgb, var(--line) 90%, var(--ink-700));
border-radius: 0.32rem;
background: color-mix(in srgb, var(--surface-2) 68%, var(--paper-strong));
color: var(--ink-500);
font-family: var(--font-mono);
font-size: 0.68rem;
font-weight: 500;
letter-spacing: 0.04em;
text-transform: uppercase;
padding: 0.2rem 0.52rem;
cursor: pointer;
transition: background 120ms ease, border-color 120ms ease, color 120ms ease;
}
.type-filter:hover {
background: color-mix(in srgb, var(--surface-1) 75%, var(--paper-strong));
color: var(--ink-700);
border-color: color-mix(in srgb, var(--signal) 20%, var(--line));
}
.type-filter.active {
background: linear-gradient(120deg, var(--signal-2), var(--signal));
border-color: transparent;
color: #fff;
}
.type-filter:focus-visible {
outline: 2px solid var(--signal);
outline-offset: 2px;
}
/* Type-specific active states */
.type-filter[data-type="agent"].active { background: linear-gradient(120deg, #5c9cfb, #1e40af); }
.type-filter[data-type="skill"].active { background: linear-gradient(120deg, #34d399, #15803d); }
.type-filter[data-type="persona"].active { background: linear-gradient(120deg, #d468e8, #9113a8); }
.type-filter[data-type="template"].active { background: linear-gradient(120deg, #38bdf8, #0e7490); }
.type-filter[data-type="memory"].active { background: linear-gradient(120deg, #f5b942, #a16207); }
.type-filter[data-type="ensemble"].active { background: linear-gradient(120deg, #f5893a, #b43410); }
.type-filter[data-type="prompt"].active { background: linear-gradient(120deg, #2dd4bf, #0f766e); }
.type-filter[data-type="tool"].active { background: linear-gradient(120deg, #94a3b8, #334155); }
/* Dark mode filter chips — lighter stop colors */
[data-theme="dark"] .type-filter[data-type="agent"].active { background: linear-gradient(120deg, #93bbfd, #4a80e6); }
[data-theme="dark"] .type-filter[data-type="skill"].active { background: linear-gradient(120deg, #6ee7b7, #2da65a); }
[data-theme="dark"] .type-filter[data-type="persona"].active { background: linear-gradient(120deg, #e879f9, #c026d3); }
[data-theme="dark"] .type-filter[data-type="template"].active { background: linear-gradient(120deg, #7dd3fc, #0891b2); }
[data-theme="dark"] .type-filter[data-type="memory"].active { background: linear-gradient(120deg, #fcd34d, #d97706); }
[data-theme="dark"] .type-filter[data-type="ensemble"].active { background: linear-gradient(120deg, #fdba74, #ea580c); }
[data-theme="dark"] .type-filter[data-type="prompt"].active { background: linear-gradient(120deg, #5eead4, #0d9488); }
[data-theme="dark"] .type-filter[data-type="tool"].active { background: linear-gradient(120deg, #cbd5e1, #64748b); }
/* Unavailable elements (404 / missing from branch) */
.element-card[data-unavailable] {
opacity: 0.45;
cursor: default;
}
.element-card[data-unavailable]:hover { box-shadow: none; transform: none; }
.unavailable-badge {
display: inline-block;
font-size: 0.62rem;
font-family: var(--font-mono);
padding: 0.1rem 0.4rem;
border-radius: 999px;
background: color-mix(in srgb, var(--ink-500) 12%, transparent);
color: var(--ink-500);
border: 1px solid color-mix(in srgb, var(--ink-500) 20%, transparent);
margin-left: auto;
}
/* LOCAL badge — shown on portfolio elements */
.source-badge {
display: inline-block;
font-size: 0.58rem;
font-family: var(--font-mono);
font-weight: 700;
letter-spacing: 0.07em;
padding: 0.08rem 0.38rem;
border-radius: 0.2rem;
background: color-mix(in srgb, #f5b942 28%, var(--paper-strong));
color: color-mix(in srgb, #a16207 90%, var(--ink-800));
border: 1px solid color-mix(in srgb, #f5b942 55%, transparent);
flex-shrink: 0;
}
[data-theme="dark"] .source-badge {
background: color-mix(in srgb, #fcd34d 18%, var(--paper-strong));
color: #fcd34d;
border-color: color-mix(in srgb, #fcd34d 35%, transparent);
}
/* Portfolio button in browse controls */
.portfolio-btn {
appearance: none;
border: 1px solid var(--line);
border-radius: 0.32rem;
padding: 0.38rem 0.85rem;
font-family: var(--font-mono);
font-size: 0.76rem;
font-weight: 600;
color: var(--ink-600);
background: var(--paper-strong);
cursor: pointer;
white-space: nowrap;
transition: background 0.15s, border-color 0.15s;
}
.portfolio-btn:hover {
background: color-mix(in srgb, var(--surface-1) 55%, var(--paper-strong));
border-color: color-mix(in srgb, var(--ink-600) 35%, var(--line));
}
.portfolio-btn[data-loaded="true"] {
border-color: color-mix(in srgb, #f5b942 60%, var(--line));
color: color-mix(in srgb, #a16207 90%, var(--ink-800));
}
[data-theme="dark"] .portfolio-btn[data-loaded="true"] {
border-color: color-mix(in srgb, #fcd34d 50%, var(--line));
color: #fcd34d;
}
.filter-count { opacity: 0.68; }
.type-filter.active .filter-count { opacity: 0.82; }
/* ── Results bar ─────────────────────────────────────────────────────────── */
.results-bar {
display: flex;
align-items: center;
gap: 0.5rem;
margin-bottom: 0.8rem;
}
.results-bar .source-toggle { margin-left: auto; }
.results-count {
font-family: var(--font-mono);
font-size: var(--step--1);
color: var(--ink-500);
}
/* Sort select */
.sort-select {
appearance: none;
border: 1px solid color-mix(in srgb, var(--line) 85%, var(--paper-strong));
border-radius: 0.35rem;
padding: 0.22rem 1.4rem 0.22rem 0.52rem;
font-family: var(--font-mono);
font-size: 0.68rem;
font-weight: 500;
color: var(--ink-600);
background:
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23888'/%3E%3C/svg%3E") no-repeat right 0.45rem center,
color-mix(in srgb, var(--surface-2) 65%, var(--paper-strong));
background-size: 8px 5px, auto;
cursor: pointer;
letter-spacing: 0.02em;
transition: border-color 120ms ease, background-color 120ms ease;
}
.sort-select:hover { border-color: color-mix(in srgb, var(--signal) 40%, var(--line)); }
.sort-select:focus-visible { outline: 2px solid var(--signal); outline-offset: 2px; }
/* View toggle */
.view-toggle {
display: flex;
gap: 0.22rem;
border: 1px solid color-mix(in srgb, var(--line) 85%, var(--paper-strong));
border-radius: 0.4rem;
padding: 0.18rem;
background: color-mix(in srgb, var(--surface-2) 65%, var(--paper-strong));
}
.view-btn {
appearance: none;
border: none;
border-radius: 0.28rem;
background: transparent;
color: var(--ink-500);
font-family: var(--font-mono);
font-size: 0.68rem;
font-weight: 500;
letter-spacing: 0.04em;
text-transform: uppercase;
padding: 0.22rem 0.52rem;
cursor: pointer;
transition: background 120ms ease, color 120ms ease;
}
.view-btn:hover { color: var(--ink-700); background: color-mix(in srgb, var(--paper-strong) 60%, transparent); }
.view-btn.active {
background: var(--paper-strong);
color: var(--signal);
box-shadow: 0 1px 3px rgba(0,0,0,0.08);
}
.view-btn:focus-visible {
outline: 2px solid var(--signal);
outline-offset: 2px;
}
/* Source toggle — All / Collection / Portfolio */
.source-toggle {
display: flex;
gap: 0.22rem;
border: 1px solid color-mix(in srgb, var(--line) 85%, var(--paper-strong));
border-radius: 0.4rem;
padding: 0.18rem;
background: color-mix(in srgb, var(--surface-2) 65%, var(--paper-strong));
}
.source-btn {
appearance: none;
border: none;
border-radius: 0.28rem;
background: transparent;
color: var(--ink-500);
font-family: var(--font-mono);
font-size: 0.68rem;
font-weight: 500;
letter-spacing: 0.04em;
text-transform: uppercase;
padding: 0.22rem 0.52rem;
cursor: pointer;
transition: background 120ms ease, color 120ms ease;
}
.source-btn:hover { color: var(--ink-700); background: color-mix(in srgb, var(--paper-strong) 60%, transparent); }
.source-btn.active {
background: var(--paper-strong);
color: var(--signal);
box-shadow: 0 1px 3px rgba(0,0,0,0.08);
}
.source-btn:focus-visible { outline: 2px solid var(--signal); outline-offset: 2px; }
/* ── Element grid — base (cards view) ───────────────────────────────────── */
.elements-grid {
display: grid;
gap: 0.65rem;
grid-template-columns: repeat(auto-fill, minmax(min(100%, 13.5rem), 1fr));
}
/* ── Element cards ───────────────────────────────────────────────────────── */
.element-card {
--family-1: var(--signal-2);
--family-2: var(--signal);
--family-3: #6366f1;
--family-4: var(--violet);
border-radius: var(--radius-angled);
border: 1px solid color-mix(in srgb, var(--family-2) 22%, var(--line));
background:
radial-gradient(circle at 95% 6%,
color-mix(in srgb, var(--family-1) 16%, transparent), transparent 42%),
linear-gradient(168deg,
color-mix(in srgb, var(--family-1) 7%, var(--paper-strong)),
var(--paper-strong) 55%);
padding: 0.75rem;
display: flex;
flex-direction: column;
gap: 0.45rem;
box-shadow: var(--shadow-soft);
cursor: pointer;
position: relative;
overflow: hidden;
transition: transform 150ms ease, box-shadow 150ms ease;
}
/* Subtle corner accent — much smaller than before */
.element-card::before {
content: "";
position: absolute;
right: 0.7rem;
top: 0.7rem;
width: 0.42rem;
height: 0.42rem;
border-radius: 0.12rem;
transform: rotate(45deg);
background: color-mix(in srgb, var(--family-1) 60%, var(--paper-strong));
opacity: 0.7;
}
.element-card:hover {
transform: translateY(-2px);
box-shadow: var(--shadow-card);
}
.element-card:focus-visible {
outline: 2px solid var(--signal);
outline-offset: 3px;
}
/* Per-type family tokens — light mode */
.element-card[data-type="agent"] { --family-1: #5c9cfb; --family-2: #1e40af; --family-3: #60a5fa; --family-4: #2563eb; }
.element-card[data-type="skill"] { --family-1: #34d399; --family-2: #15803d; --family-3: #22c55e; --family-4: #2fbf71; }
.element-card[data-type="persona"] { --family-1: #d468e8; --family-2: #9113a8; --family-3: #c026d3; --family-4: #8b5cf6; }
.element-card[data-type="template"] { --family-1: #38bdf8; --family-2: #0e7490; --family-3: #22d3ee; --family-4: #06b6d4; }
.element-card[data-type="memory"] { --family-1: #f5b942; --family-2: #a16207; --family-3: #f59e0b; --family-4: #d97706; }
.element-card[data-type="ensemble"] { --family-1: #f5893a; --family-2: #b43410; --family-3: #f97316; --family-4: #ea580c; }
.element-card[data-type="prompt"] { --family-1: #2dd4bf; --family-2: #0f766e; --family-3: #14b8a6; --family-4: #0d9488; }
.element-card[data-type="tool"] { --family-1: #94a3b8; --family-2: #334155; --family-3: #64748b; --family-4: #475569; }
/* Per-type family tokens — dark mode (elevated lightness, reduced saturation per ui-visual-design-expert) */
[data-theme="dark"] .element-card[data-type="agent"] { --family-1: #93bbfd; --family-2: #4a80e6; --family-3: #a5c4fe; --family-4: #6ea3f7; }
[data-theme="dark"] .element-card[data-type="skill"] { --family-1: #6ee7b7; --family-2: #2da65a; --family-3: #86efac; --family-4: #4ade80; }
[data-theme="dark"] .element-card[data-type="persona"] { --family-1: #e879f9; --family-2: #c026d3; --family-3: #f0abfc; --family-4: #d946ef; }
[data-theme="dark"] .element-card[data-type="template"] { --family-1: #7dd3fc; --family-2: #0891b2; --family-3: #a5f3fc; --family-4: #22d3ee; }
[data-theme="dark"] .element-card[data-type="memory"] { --family-1: #fcd34d; --family-2: #d97706; --family-3: #fde68a; --family-4: #f59e0b; }
[data-theme="dark"] .element-card[data-type="ensemble"] { --family-1: #fdba74; --family-2: #ea580c; --family-3: #fed7aa; --family-4: #f97316; }
[data-theme="dark"] .element-card[data-type="prompt"] { --family-1: #5eead4; --family-2: #0d9488; --family-3: #99f6e4; --family-4: #2dd4bf; }
[data-theme="dark"] .element-card[data-type="tool"] { --family-1: #94a3b8; --family-2: #64748b; --family-3: #cbd5e1; --family-4: #94a3b8; }
/* Dark mode: pull color accents back — the type label pill carries identity;
card surfaces should be calm. Light mode keeps fuller saturation. */
[data-theme="dark"] .element-card {
border: 1px solid color-mix(in srgb, var(--family-2) 8%, var(--line));
background:
radial-gradient(circle at 95% 6%,
color-mix(in srgb, var(--family-1) 5%, transparent), transparent 40%),
var(--surface-1);
}
[data-theme="dark"] .element-card::before {
background: color-mix(in srgb, var(--family-1) 28%, var(--surface-2));
opacity: 0.45;
}
[data-theme="dark"] .elements-grid[data-view="list"] .element-card {
border-left: 3px solid color-mix(in srgb, var(--family-1) 45%, var(--line));
}
.card-components {
font-size: 0.68rem;
font-family: var(--font-mono);
color: var(--ink-400);
margin: 0.1rem 0 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.element-rendered {
font-size: var(--step--1);
line-height: 1.65;
color: var(--ink-700);
}
.element-rendered h1,.element-rendered h2,.element-rendered h3,
.element-rendered h4,.element-rendered h5 {
font-family: var(--font-heading);
margin: 1rem 0 0.35rem;
color: var(--ink-900);
}
.element-rendered p { margin: 0 0 0.6rem; }
.element-rendered ul,.element-rendered ol { padding-left: 1.4rem; margin: 0 0 0.6rem; }
.element-rendered code {
font-family: var(--font-mono);
font-size: 0.82em;
background: var(--surface-1);
padding: 0.1em 0.35em;
border-radius: 0.2rem;
}
.element-rendered pre { margin: 0 0 0.6rem; }
.element-rendered pre code { background: none; padding: 0; }
.element-rendered blockquote {
border-left: 3px solid var(--accent);
margin: 0 0 0.6rem;
padding: 0.2rem 0.8rem;
color: var(--ink-500);
}
/* Card internals */
.card-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 0.5rem;
padding-right: 0.85rem; /* clear corner accent */
}
.card-title {
font-family: var(--font-heading);
font-size: var(--step-0);
font-weight: 800;
color: var(--ink-950);
margin: 0;
line-height: 1.25;
}
/* Type badge — filled color pill */
.type-badge {
flex-shrink: 0;
align-self: flex-start;
border: 1px solid color-mix(in srgb, var(--family-2) 45%, transparent);
border-radius: 0.28rem;
font-family: var(--font-mono);
font-size: 0.63rem;
text-transform: uppercase;
letter-spacing: 0.06em;
font-weight: 700;
color: color-mix(in srgb, var(--family-2) 100%, var(--ink-950));
background: color-mix(in srgb, var(--family-1) 22%, var(--paper-strong));
padding: 0.12rem 0.42rem;
white-space: nowrap;
}
/* Badge group — stacks type + source badges vertically, right-aligned */
.card-badges {
display: flex;
flex-direction: column;
align-items: flex-end;
gap: 0.2rem;
flex-shrink: 0;
}
.card-description {
font-size: var(--step--1);
color: var(--ink-700);
margin: 0;
line-height: 1.5;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
flex: 1;
}
.card-footer {
margin-top: auto;
display: flex;
flex-direction: column;
gap: 0.35rem;
}
.card-meta {
display: flex;
flex-wrap: wrap;
gap: 0.25rem 0.5rem;
font-family: var(--font-mono);
font-size: var(--step--1);
color: var(--ink-500);
}
/* "by" prefix handled by CSS so JS can pass raw author value */
.meta-author::before {
content: "by\00a0";
opacity: 0.65;
}
.meta-version {
border: 1px solid color-mix(in srgb, var(--line) 82%, var(--paper-strong));
border-radius: 0.24rem;
background: color-mix(in srgb, var(--surface-2) 60%, var(--paper-strong));
padding: 0 0.28rem;
}
.meta-category { color: color-mix(in srgb, var(--signal) 60%, var(--ink-700)); }
.meta-date { color: var(--ink-500); }
/* Tags */
.card-tags {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-wrap: wrap;
gap: 0.25rem;
}
.tag {
border: 1px solid color-mix(in srgb, var(--family-2) 18%, var(--line));
border-radius: 999px;
background: color-mix(in srgb, var(--family-1) 7%, var(--paper-strong));
color: color-mix(in srgb, var(--family-2) 60%, var(--ink-500));
font-family: var(--font-mono);
font-size: 0.62rem;
letter-spacing: 0.02em;
padding: 0.08rem 0.4rem;
}
/* ── View modes ──────────────────────────────────────────────────────────── */
/* Grid (default) — already defined above */
.elements-grid[data-view="grid"] {
grid-template-columns: repeat(auto-fill, minmax(min(100%, 13.5rem), 1fr));
}
/* List view — compact horizontal rows */
.elements-grid[data-view="list"] {
display: flex;
flex-direction: column;
gap: 0.38rem;
}
.elements-grid[data-view="list"] .element-card {
flex-direction: row;
flex-wrap: wrap;
align-items: center;
gap: 0.65rem;
padding: 0.42rem 0.65rem 0.42rem 0.75rem;
border-radius: var(--radius-sm);
border-left: 4px solid var(--family-1);
}
/* Hide corner accent in list view */
.elements-grid[data-view="list"] .element-card::before { display: none; }
.elements-grid[data-view="list"] .card-header {
flex: 0 0 auto;
min-width: 0;
width: 13rem;
gap: 0.4rem;
padding-right: 0;
justify-content: flex-start;
overflow: hidden;
}
/* Move badge group visually before title in list view */
.elements-grid[data-view="list"] .card-badges {
order: -1;
flex-direction: row;
align-items: center;
gap: 0.18rem;
}
.elements-grid[data-view="list"] .card-title {
font-size: var(--step--1);
font-weight: 700;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
min-width: 0;
}
.elements-grid[data-view="list"] .card-description {
flex: 1;
display: block;
-webkit-line-clamp: unset;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-size: var(--step--1);
margin: 0;
min-width: 0;
color: var(--ink-500);
}
.elements-grid[data-view="list"] .card-footer {
flex-direction: row;
align-items: center;
flex-shrink: 0;
margin-top: 0;
}
.elements-grid[data-view="list"] .card-tags { display: none; }
/* Card download action — visible in list view only */
.card-actions { display: none; }
.elements-grid[data-view="list"] .card-actions {
display: flex;
align-items: center;
flex-shrink: 0;
}
.card-download-btn {
appearance: none;
border: 1px solid color-mix(in srgb, var(--line) 80%, transparent);
border-radius: 0.28rem;
background: color-mix(in srgb, var(--surface-1) 40%, var(--paper-strong));
color: var(--ink-500);
font-size: 0.8rem;
width: 1.55rem;
height: 1.55rem;
display: inline-flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: background 100ms ease, color 100ms ease;
flex-shrink: 0;
}
.card-download-btn:hover {
background: color-mix(in srgb, var(--signal-2) 15%, var(--paper-strong));
color: var(--signal);
border-color: color-mix(in srgb, var(--signal) 30%, var(--line));
}
.card-download-btn:focus-visible { outline: 2px solid var(--signal); outline-offset: 2px; }
/* List view — inline expand */
.card-inline-detail {
display: none;
width: 100%;
padding: 0.65rem 0 0.2rem;
border-top: 1px solid var(--line);
margin-top: 0.4rem;
}
.elements-grid[data-view="list"] .element-card[data-expanded] .card-inline-detail {
display: block;
}
.elements-grid[data-view="list"] .element-card[data-expanded] {
align-items: flex-start;
}
/* Inline detail action bar — sits at the TOP of expanded content */
.inline-detail-actions {
display: flex;
gap: 0.3rem;
flex-wrap: wrap;
padding-bottom: 0.6rem;
border-bottom: 1px solid var(--line);
margin-bottom: 0.5rem;
}
.card-expand-icon {
display: none; /* hidden unless in list view */
margin-left: auto;
font-size: 0.65rem;
color: var(--ink-400);
transition: transform 0.15s;
flex-shrink: 0;
}
.elements-grid[data-view="list"] .card-expand-icon { display: inline; }
.element-card[data-expanded] .card-expand-icon { transform: rotate(180deg); }
/* Detail view — wider cards, full description */
.elements-grid[data-view="detail"] {
grid-template-columns: repeat(auto-fill, minmax(min(100%, 22rem), 1fr));
gap: 0.9rem;
}
.elements-grid[data-view="detail"] .element-card { padding: 1rem; }
.elements-grid[data-view="detail"] .card-title { font-size: var(--step-1); }
.elements-grid[data-view="detail"] .card-description {
-webkit-line-clamp: 4;
font-size: var(--step-0);
}
.elements-grid[data-view="detail"] .card-tags .tag { font-size: 0.68rem; }
/* ── Modal ───────────────────────────────────────────────────────────────── */
/* Reset browser-native fieldset chrome */
fieldset.type-filters,
fieldset.view-toggle {
border: 0;
padding: 0;
margin: 0;
min-width: 0;
}
dialog.modal {
/* Reset browser-native dialog chrome */
border: 0;
background: transparent;
color: inherit;
max-width: none;
max-height: none;
overflow: visible;
/* Layout — full viewport, flex container so dialog is pinned to top */
position: fixed;
inset: 0;
z-index: 100;
display: flex;
align-items: flex-start;
justify-content: center;
padding: 1rem var(--gutter) calc(var(--site-footer-height, 4.5rem) + 0.5rem);
width: 100%;
}
dialog.modal::backdrop { display: none; }
dialog.modal:not([open]) { display: none; }
body.modal-open { overflow: hidden; }
.modal-overlay {
position: fixed;
inset: 0;
background: color-mix(in srgb, var(--ink-900) 50%, transparent);
backdrop-filter: blur(3px);
z-index: -1;
}
.modal-dialog {
position: relative;
width: min(72rem, 100%);
margin: 0 auto;
/* Keep the dialog fully inside the viewport and above the fixed footer. */
height: calc(100dvh - var(--site-footer-height, 4.5rem) - 1.5rem);
max-height: calc(100dvh - var(--site-footer-height, 4.5rem) - 1.5rem);
border-radius: var(--radius-lg);
background: var(--paper-strong);
border: 1px solid var(--line);
box-shadow: var(--shadow-card);
overflow: hidden;
display: flex;
flex-direction: column;
}
.modal-header {
display: grid;
grid-template-areas: "heading actions" "meta actions";
grid-template-columns: 1fr auto;
gap: 0.2rem 0.65rem;
padding: 0.9rem 1rem 0.75rem;
border-bottom: 1px solid var(--line);
background: linear-gradient(168deg,
color-mix(in srgb, var(--signal-2) 5%, var(--paper-strong)),
var(--paper-strong) 55%);
position: relative;
}
.modal-header::after {
content: "";
position: absolute;
left: 0; right: 0; bottom: -1px;
height: 2px;
background: linear-gradient(90deg,
color-mix(in srgb, var(--signal) 10%, transparent),
color-mix(in srgb, var(--accent) 14%, transparent),
color-mix(in srgb, var(--signal) 10%, transparent));
}
.modal-heading {
grid-area: heading;
display: flex;
align-items: baseline;
gap: 0.55rem;
flex-wrap: wrap;
}
.modal-title {
font-family: var(--font-heading);
font-size: var(--step-2);
font-weight: 800;
color: var(--ink-950);
margin: 0;
line-height: 1.2;
}
.modal-type {
border: 1px solid color-mix(in srgb, var(--signal) 26%, var(--line));
border-radius: 0.3rem;
font-family: var(--font-mono);
font-size: 0.66rem;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--signal);
background: color-mix(in srgb, var(--signal-2) 8%, var(--paper-strong));
padding: 0.1rem 0.38rem;
white-space: nowrap;
align-self: flex-start;
}
.modal-meta {
grid-area: meta;
display: flex;
gap: 0.55rem;
font-family: var(--font-mono);
font-size: var(--step--1);
color: var(--ink-500);
flex-wrap: wrap;
}
.modal-header-actions {
grid-area: actions;
display: inline-flex;
align-items: center;
gap: 0.45rem;
justify-self: end;
}
.modal-header-actions .modal-action-btn {
min-height: 1.85rem;
border-radius: 999px;
padding: 0.26rem 0.78rem;
}
.modal-close {
align-self: start;
appearance: none;
border: 1px solid color-mix(in srgb, var(--line) 82%, var(--paper-strong));
border-radius: 999px;
background: color-mix(in srgb, var(--surface-1) 50%, var(--paper-strong));
color: var(--ink-500);
width: 1.85rem;
height: 1.85rem;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 0.82rem;
cursor: pointer;
transition: background 120ms ease;
}
.modal-close:hover {
background: color-mix(in srgb, var(--accent-soft) 70%, var(--paper-strong));
color: var(--ink-950);
}
.modal-close:focus-visible {
outline: 2px solid var(--signal);
outline-offset: 2px;
}
.modal-body {
flex: 1;
overflow-y: auto;
padding: 1rem;
}
/* Reset the global p,li max-width readability rule inside the modal */
.modal-body p,
.modal-body li { max-width: none; }
.element-source {
background: color-mix(in srgb, var(--ink-950) 18%, #0b1629);
border-radius: var(--radius-md);
margin: 0;
overflow-x: auto;
tab-size: 2;
}
.element-code {
display: block;
padding: 0.9rem 1rem;
font-family: var(--font-mono);
font-size: 0.82rem;
line-height: 1.6;
color: #dce8fb;
white-space: pre;
background: transparent;
}
/* ── Modal toolbar ───────────────────────────────────────────────────────── */
.modal-toolbar {
display: flex;
align-items: center;
gap: 0.3rem;
padding: 0.4rem 1rem;
border-bottom: 1px solid var(--line);
background: color-mix(in srgb, var(--surface-1) 35%, var(--paper-strong));
}
.modal-action-btn {
appearance: none;
border: 1px solid color-mix(in srgb, var(--line) 80%, transparent);
border-radius: 0.32rem;
padding: 0.26rem 0.58rem;
font-family: var(--font-mono);
font-size: 0.74rem;
font-weight: 600;
color: var(--ink-600);
background: color-mix(in srgb, var(--paper-strong) 65%, var(--surface-1));
cursor: pointer;
text-decoration: none;
display: inline-flex;
align-items: center;
gap: 0.22rem;
white-space: nowrap;
transition: background 100ms ease, color 100ms ease, border-color 100ms ease;
line-height: 1.4;
}
.modal-action-btn:hover {
background: color-mix(in srgb, var(--surface-2) 55%, var(--paper-strong));
color: var(--ink-900);
border-color: color-mix(in srgb, var(--line) 110%, transparent);
}
.modal-action-btn:focus-visible { outline: 2px solid var(--signal); outline-offset: 2px; }
.modal-action-btn[data-active="true"],
#btn-render[data-mode="raw"] {
background: color-mix(in srgb, var(--signal-2) 18%, var(--paper-strong));
color: var(--signal);
border-color: color-mix(in srgb, var(--signal) 30%, var(--line));
}
/* ── Security scan badges ──────────────────────────────────── */
.scan-badge {
display: inline-flex;
align-items: center;
gap: 0.25rem;
padding: 0.2rem 0.5rem;
border-radius: 0.25rem;
font-family: var(--font-mono);
font-size: 0.7rem;
font-weight: 600;
letter-spacing: 0.02em;
cursor: default;
margin-left: 0.5rem;
}
.scan-badge--pass {
background: #f0fdf4;
color: #166534;
border: 1px solid #bbf7d0;
}
.scan-badge--warn {
background: #fff7ed;
color: #9a3412;
border: 1px solid #fed7aa;
}
[data-theme="dark"] .scan-badge--pass {
background: #052e16;
color: #86efac;
border-color: #14532d;
}
[data-theme="dark"] .scan-badge--warn {
background: #431407;
color: #fdba74;
border-color: #7c2d12;
}
/* Submit button — accent amber for local elements */
.modal-nav {
display: flex;
align-items: center;
gap: 0.3rem;
margin-left: auto;
padding-left: 0.5rem;
border-left: 1px solid var(--line);
}
.modal-nav-btn {
appearance: none;
border: 1px solid color-mix(in srgb, var(--line) 80%, transparent);
border-radius: 0.32rem;
background: transparent;
color: var(--ink-600);
font-size: 1rem;
line-height: 1;
padding: 0.18rem 0.5rem;
cursor: pointer;
transition: background 0.12s, color 0.12s;
}
.modal-nav-btn:hover:not(:disabled) { background: var(--paper-strong); color: var(--ink-700); }
.modal-nav-btn:disabled { opacity: 0.3; cursor: default; }
.modal-nav-btn:focus-visible { outline: 2px solid var(--signal); outline-offset: 2px; }
.modal-nav-count {
font-size: 0.75rem;
color: var(--ink-400);
min-width: 5ch;
text-align: center;
white-space: nowrap;
}
.modal-action-btn--submit {
color: color-mix(in srgb, #a16207 90%, var(--ink-900));
border-color: color-mix(in srgb, #f5b942 55%, transparent);
background: color-mix(in srgb, #f5b942 14%, var(--paper-strong));
}
.modal-action-btn--submit:hover {
background: color-mix(in srgb, #f5b942 22%, var(--paper-strong));
color: color-mix(in srgb, #a16207 100%, transparent);
border-color: color-mix(in srgb, #f5b942 70%, transparent);
}
/* Modal date */
.modal-date {
font-size: var(--step--1);
color: var(--ink-500);
}
/* Hide source badge when empty */
.modal-source:empty { display: none; }
/* ── State messages ──────────────────────────────────────────────────────── */
.loading, .empty-state, .error {
padding: 2.5rem 1rem;
text-align: center;
color: var(--ink-500);
font-family: var(--font-mono);
font-size: var(--step--1);
grid-column: 1 / -1;
max-width: none;
}
.error {
color: color-mix(in srgb, #b44210 75%, var(--ink-700));
background: color-mix(in srgb, var(--accent-soft) 40%, var(--paper-strong));
border: 1px solid color-mix(in srgb, var(--accent) 20%, var(--line));
border-radius: var(--radius-md);
}
.error-hint {
margin-top: 0.5rem;
font-family: var(--font-mono);
font-size: var(--step--1);
color: var(--ink-500);
max-width: none;
}
.modal-body .loading,
.modal-body .error { padding: 1.5rem 0.5rem; border-radius: var(--radius-md); }
/* ── Pagination ──────────────────────────────────────────────────────────── */
.pagination {
display: flex;
align-items: center;
justify-content: center;
gap: 1rem;
padding: 1.25rem 0 0.5rem;
}
.pagination-btn {
padding: 0.35rem 0.85rem;
border: 1px solid var(--line);
border-radius: var(--radius-sm);
background: var(--paper);
color: var(--ink-600);
font-size: 0.85rem;
cursor: pointer;
transition: background 0.15s, color 0.15s, border-color 0.15s;
}
.pagination-btn:hover:not(:disabled) {
background: var(--paper-strong);
color: var(--ink-700);
border-color: var(--ink-300);
}
.pagination-btn:disabled {
opacity: 0.35;
cursor: default;
}
.pagination-btn:focus-visible {
outline: 2px solid var(--signal);
outline-offset: 2px;
}
.pagination-info {
font-size: 0.82rem;
color: var(--ink-500);
min-width: 8ch;
text-align: center;
}
/* ── Console tabs ────────────────────────────────────────────────────────── */
.console-tabs {
display: flex;
gap: 2px;
background: var(--surface-1);
border-radius: var(--radius-sm);
padding: 2px;
min-width: 0;
width: fit-content;
max-width: 100%;
flex-wrap: wrap;
}
.console-tab-menu-toggle {
display: none;
align-items: center;
gap: 0.42rem;
border: 1px solid color-mix(in srgb, var(--signal) 24%, var(--line));
border-radius: 999px;
background: color-mix(in srgb, var(--surface-1) 70%, var(--paper-strong));
color: var(--ink-700);
font-family: var(--font-mono);
font-size: 0.72rem;
font-weight: 700;
line-height: 1;
padding: 0.48rem 0.78rem;
cursor: pointer;
white-space: nowrap;
}
.console-tab-menu-toggle:hover,
.console-tab-menu-toggle:focus-visible {
background: color-mix(in srgb, var(--surface-1) 88%, var(--paper-strong));
outline: 2px solid var(--signal);
outline-offset: 2px;
}
.console-tab-menu-icon {
font-size: 0.95rem;
line-height: 1;
}
.console-tab-menu {
position: absolute;
top: calc(100% + 0.4rem);
right: 0;
min-width: 13rem;
max-width: min(18rem, calc(100vw - (2 * var(--gutter, 1rem))));
background: var(--paper-strong);
border: 1px solid var(--line);
border-radius: var(--radius-md);
box-shadow: var(--shadow-soft);
padding: 0.3rem;
z-index: 200;
}
.console-tab-menu-item {
width: 100%;
border: none;
border-radius: var(--radius-sm);
background: transparent;
color: var(--ink-700);
font-family: var(--font-body);
font-size: var(--step--1);
font-weight: 600;
text-align: left;
padding: 0.52rem 0.68rem;
cursor: pointer;
}
.console-tab-menu-item:hover,
.console-tab-menu-item:focus-visible {
background: var(--surface-1);
outline: none;
}
.console-tab-menu-item.active {
background: color-mix(in srgb, var(--signal-2) 10%, var(--paper-strong));
color: var(--signal);
}
.header-nav-row--collapsed .console-tabs {
display: none;
}
.header-nav-row--collapsed .console-tab-menu-toggle:not([hidden]) {
display: inline-flex;
}
.console-tab {
background: transparent;
color: var(--ink-500);
border: none;
border-radius: var(--radius-sm);
padding: 4px 14px;
font-family: var(--font-mono);
font-size: 11.5px;
font-weight: 600;
cursor: pointer;
transition: background 0.15s, color 0.15s;
letter-spacing: 0.02em;
}
.console-tab:hover {
color: var(--ink-900);
background: var(--surface-2);
}
.console-tab.active {
background: var(--paper-strong);
color: var(--signal);
box-shadow: 0 1px 3px rgba(0,0,0,0.08);
}
@media (max-width: 960px) {
.header-controls {
align-items: center;
justify-content: flex-end;
width: auto;
max-width: 100%;
gap: 0.5rem;
}
.site-stats {
flex: 0 1 auto;
width: auto;
justify-content: flex-end;
}
}
@media (max-width: 860px) {
.site-header {
column-gap: 0.7rem;
}
.header-brand {
gap: 0.5rem;
min-height: 0;
}
.header-brand-text {
min-height: 0;
gap: 0;
}
.header-brand .site-tagline {
display: none;
}
.header-controls,
.site-stats {
gap: 0.35rem;
}
.header-controls {
align-items: center;
}
.stat {
padding: 0.12rem 0.34rem;
}
.stat strong {
font-size: 0.92rem;
}
.stat--session strong {
font-size: 0.74rem;
}
.theme-toggle {
width: 1.85rem;
height: 1.85rem;
}
.console-tab {
padding: 4px 11px;
}
}
@media (max-width: 46rem) {
.stat--session {
display: none;
}
}
@media (max-width: 28rem) {
.site-header {
grid-template-columns: minmax(0, 1fr) auto auto;
grid-template-areas: "brand nav controls";
column-gap: 0.45rem;
}
.header-brand {
gap: 0;
min-width: 0;
}
.header-logo {
display: block;
width: 28px;
height: 28px;
}
.header-brand-text {
display: none;
}
.site-stats {
display: none;
}
.header-controls {
width: auto;
justify-content: flex-end;
}
.header-nav-row {
width: auto;
min-width: 0;
justify-content: flex-end;
gap: 0.4rem;
}
}
@media (max-width: 24rem) {
.site-header {
grid-template-columns: 1fr;
grid-template-areas:
"brand"
"controls"
"nav";
}
.header-controls {
justify-content: flex-end;
width: 100%;
}
.site-stats {
justify-content: flex-end;
}
.header-nav-row {
width: 100%;
justify-content: flex-end;
}
}
/* ── Tab panels ──────────────────────────────────────────────────────────── */
.tab-panel {
display: none;
}
.tab-panel.active {
display: block;
}
.tab-panel[hidden] {
display: none !important;
}
/* ── Site footer ─────────────────────────────────────────────────────────── */
.site-footer {
border-top: 1px solid var(--line);
padding: 0.85rem 0 1.35rem;
margin-top: 0;
position: fixed;
left: 0;
right: 0;
bottom: 0;
background: color-mix(in srgb, var(--paper) 92%, transparent);
backdrop-filter: blur(10px);
z-index: 40;
}
.footer-inner {
width: min(var(--max-width), calc(100% - 2 * var(--gutter)));
margin: 0 auto;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.35rem 0.9rem;
font-size: var(--step--1);
color: var(--ink-700);
}
.footer-link {
color: var(--ink-500);
text-decoration: none;
font-family: var(--font-mono);
font-size: 0.75rem;
}
.footer-link:hover { color: var(--accent); }
.footer-copyright {
color: var(--ink-500);
font-size: 0.75rem;
margin-left: auto;
}
.footer-version,
.footer-updated {
font-family: var(--font-mono);
font-size: 0.72rem;
color: var(--ink-500);
}
.footer-updated {
margin-left: auto;
}
/* ── Topic filters ───────────────────────────────────────────────────────── */
fieldset.topic-filters {
border: 0; padding: 0; margin: 0; min-width: 0;
display: flex; flex-wrap: wrap; gap: 0.35rem;
margin-top: 0.4rem;
}
.topic-filter {
padding: 0.2rem 0.65rem;
border: 1px solid var(--ink-200);
border-radius: 999px;
background: transparent;
color: var(--ink-600);
font-family: var(--font-body);
font-size: 0.72rem;
cursor: pointer;
transition: background 0.15s, color 0.15s, border-color 0.15s;
}
.topic-filter:hover { border-color: var(--accent); color: var(--accent); }
.topic-filter.active {
background: color-mix(in srgb, var(--accent) 12%, transparent);
border-color: var(--accent);
color: var(--accent);
font-weight: 600;
}
/* Detail view — created date header */
.detail-created {
display: flex;
align-items: baseline;
gap: 0.45rem;
padding: 0 0 0.7rem;
border-bottom: 1px solid var(--line);
margin-bottom: 0.2rem;
}
.detail-created-label {
font-family: var(--font-mono);
font-size: 0.65rem;
text-transform: uppercase;
letter-spacing: 0.07em;
color: var(--ink-500);
}
.detail-created-value {
font-family: var(--font-mono);
font-size: 0.8rem;
font-weight: 600;
color: var(--ink-900);
}
/* ── Detail view sections ────────────────────────────────────────────────── */
.detail-section {
border-top: 1px solid var(--ink-100);
padding: 0.9rem 0 0.5rem;
}
.detail-section:first-child { border-top: 0; padding-top: 0; }
.detail-section-title {
font-family: var(--font-mono);
font-size: 0.7rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--ink-500);
margin: 0 0 0.55rem;
padding-bottom: 0.3rem;
border-bottom: 1px solid color-mix(in srgb, var(--line) 60%, transparent);
}
.detail-section-body { font-size: var(--step--1); }
.detail-field {
display: flex;
gap: 1.25rem;
align-items: baseline;
padding: 0.22rem 0;
}
.detail-label {
font-family: var(--font-mono);
font-size: 0.68rem;
/* Signal-tinted blue — distinct from values, like YAML key color */
color: color-mix(in srgb, var(--signal) 60%, var(--ink-400));
min-width: 9rem;
flex-shrink: 0;
}
.detail-value {
color: var(--ink-800);
font-size: 0.82rem;
}
.detail-pills {
display: flex; flex-wrap: wrap; gap: 0.3rem;
}
.detail-pill {
display: inline-block;
padding: 0.15rem 0.55rem;
border-radius: 999px;
font-size: 0.68rem;
font-family: var(--font-mono);
background: var(--ink-100);
color: var(--ink-600);
}
.detail-pill.pill-tag {
background: color-mix(in srgb, var(--accent) 10%, transparent);
color: var(--accent);
border: 1px solid color-mix(in srgb, var(--accent) 25%, transparent);
}
.detail-pill.pill-trigger {
background: color-mix(in srgb, #f59e0b 12%, var(--paper));
color: var(--ink-700);
border: 1px solid color-mix(in srgb, #f59e0b 35%, var(--paper));
}
.detail-pill.pill-required {
background: color-mix(in srgb, #ef4444 12%, var(--paper));
color: var(--ink-800);
}
.detail-pill.pill-meta {
background: var(--ink-100);
color: var(--ink-500);
}
.detail-prose {
color: var(--ink-600);
font-style: italic;
margin: 0;
}
.detail-list {
margin: 0;
padding-left: 1.2rem;
color: var(--ink-700);
}
.detail-list li { margin-bottom: 0.2rem; }
.memory-entries-list {
list-style: none;
padding: 0;
margin: 0;
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.memory-entry {
border: 1px solid var(--line);
border-radius: var(--radius-sm);
overflow: hidden;
}
.memory-entry-content {
padding: 0.75rem 1rem 0.5rem;
}
.memory-entry-meta {
font-size: 0.72rem;
color: var(--ink-400);
padding: 0.35rem 1rem;
background: color-mix(in srgb, var(--ink-900) 4%, var(--paper));
border-top: 1px solid var(--line);
display: flex;
flex-wrap: wrap;
gap: 0.1rem 0.6rem;
}
.memory-meta-key {
color: var(--ink-500);
font-weight: 500;
}
.detail-goal-template {
font-family: var(--font-mono);
font-size: 0.85rem;
color: var(--ink-700);
background: color-mix(in srgb, var(--signal) 8%, var(--paper));
border-left: 3px solid var(--signal);
padding: 0.45rem 0.75rem;
border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
margin-bottom: 0.6rem;
}
.detail-template-param {
background: color-mix(in srgb, var(--signal) 18%, transparent);
color: color-mix(in srgb, var(--signal) 90%, var(--ink-700));
border: 1px solid color-mix(in srgb, var(--signal) 35%, transparent);
border-radius: 0.25rem;
padding: 0.05em 0.3em;
font-size: 0.9em;
}
.detail-subsection-title {
font-size: 0.7rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--ink-500);
margin: 0.75rem 0 0.35rem;
}
.detail-multiline {
font-family: var(--font-mono);
font-size: 0.8rem;
line-height: 1.55;
white-space: pre-wrap;
word-break: break-word;
background: color-mix(in srgb, var(--ink-900) 6%, var(--paper));
border-radius: var(--radius-sm);
padding: 0.55rem 0.75rem;
margin: 0;
overflow-x: auto;
color: var(--ink-700);
}
.detail-param {
display: flex;
flex-direction: column;
gap: 0.2rem;
padding: 0.45rem 0;
border-bottom: 1px solid var(--ink-100);
}
.detail-param:last-child { border-bottom: 0; }
/* Name + type/required pills on one stable row */
.deta