You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte-kit-vice/web/routes/layout.css

1558 lines
37 KiB

/*
* UIX Demos — modern docs aesthetic, Chakra/Radix/shadcn lineage.
* Geist (sans + mono), neutral grays, indigo accent, sharp 6px radius,
* three-column layout (sidebar / canvas / TOC). No serif, no editorial chrome.
*/
:root,
[data-theme='light'] {
--font-sans: 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI Variable', 'Helvetica Neue', Arial, sans-serif;
--font-mono: 'Geist Mono', 'JetBrains Mono', 'SF Mono', Menlo, Consolas, monospace;
/* Neutrals — a warm-tinted gray scale */
--gray-0: #ffffff;
--gray-25: #fcfcfd;
--gray-50: #f9fafb;
--gray-100: #f3f4f6;
--gray-150: #ebedf0;
--gray-200: #e5e7eb;
--gray-300: #d1d5db;
--gray-400: #9ca3af;
--gray-500: #6b7280;
--gray-600: #4b5563;
--gray-700: #374151;
--gray-800: #1f2937;
--gray-900: #111827;
--gray-950: #0a0e16;
}
[data-theme='dark'] {
--gray-0: #0c1018;
--gray-25: #0e131c;
--gray-50: #131924;
--gray-100: #1a2130;
--gray-150: #20283a;
--gray-200: #283044;
--gray-300: #374055;
--gray-400: #5d6985;
--gray-500: #8a93a8;
--gray-600: #aab0c0;
--gray-700: #c5c9d4;
--gray-800: #dadde4;
--gray-900: #ebedf2;
--gray-950: #f5f6f9;
/* Accent — slightly more luminous on dark */
--accent-50: #1e1b4b;
--accent-100: #2e2a6b;
--accent-200: #3f3a8b;
--accent-500: #818cf8;
--accent-600: #a5b4fc;
--accent-700: #c7d2fe;
--accent-800: #e0e7ff;
/* Layer accent backgrounds — darker tints */
--layer-soma: #60a5fa;
--layer-soma-bg: #0c1c33;
--layer-morfo: #a78bfa;
--layer-morfo-bg: #1e1733;
--layer-sema: #f472b6;
--layer-sema-bg: #2c0f24;
--layer-eidos: #34d399;
--layer-eidos-bg: #0a2419;
--layer-docs: #94a3b8;
--layer-docs-bg: #182030;
/* Shadows — slightly visible on dark */
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4);
--shadow-md: 0 4px 12px -2px rgba(0, 0, 0, 0.5), 0 2px 4px -1px rgba(0, 0, 0, 0.3);
}
:root,
[data-theme] {
/* Accent — a sober indigo */
--accent-50: #eef2ff;
--accent-100: #e0e7ff;
--accent-200: #c7d2fe;
--accent-500: #6366f1;
--accent-600: #4f46e5;
--accent-700: #4338ca;
--accent-800: #3730a3;
/* Layer accents — desaturated, used for badges */
--layer-soma: #2563eb;
--layer-soma-bg: #eff6ff;
--layer-morfo: #7c3aed;
--layer-morfo-bg: #f5f3ff;
--layer-sema: #db2777;
--layer-sema-bg: #fdf2f8;
--layer-eidos: #059669;
--layer-eidos-bg: #ecfdf5;
--layer-docs: #475569;
--layer-docs-bg: #f1f5f9;
/* Code surface */
--code-bg: #0f172a;
--code-bg-soft: #131c2e;
--code-fg: #e2e8f0;
--code-comment: #64748b;
--code-keyword: #c4b5fd;
--code-string: #86efac;
--code-tag: #fda4af;
--code-attr: #fcd34d;
--code-punct: #94a3b8;
/* Layout */
--rail-w: 256px;
--toc-w: 220px;
--canvas-max: 880px;
--radius-xs: 4px;
--radius-sm: 6px;
--radius-md: 8px;
--radius-lg: 10px;
--shadow-sm: 0 1px 2px rgba(15, 23, 42, 0.04);
--shadow-md: 0 4px 12px -2px rgba(15, 23, 42, 0.08), 0 2px 4px -1px rgba(15, 23, 42, 0.04);
--ease: cubic-bezier(0.2, 0.6, 0.2, 1);
}
* {
box-sizing: border-box;
}
html,
body {
margin: 0;
padding: 0;
min-height: 100vh;
background: var(--gray-25);
color: var(--gray-900);
font-family: var(--font-sans);
font-size: 14.5px;
line-height: 1.6;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-feature-settings: 'cv11', 'ss01';
}
a {
color: inherit;
}
/* ─────────────────────────────────────────────────────────────────────
* Shell — three-column layout
* ───────────────────────────────────────────────────────────────────── */
.shell {
display: grid;
grid-template-columns: var(--rail-w) minmax(0, 1fr);
min-height: 100vh;
}
/* ─────────────────────────────────────────────────────────────────────
* Rail (left)
* ───────────────────────────────────────────────────────────────────── */
.rail {
position: sticky;
top: 0;
height: 100vh;
overflow-y: auto;
padding: 1.25rem 0.5rem 1.5rem 1rem;
background: var(--gray-0);
border-right: 1px solid var(--gray-200);
display: flex;
flex-direction: column;
}
.brand {
display: flex;
align-items: center;
gap: 0.55rem;
padding: 0.4rem 0.6rem 1rem;
text-decoration: none;
color: var(--gray-900);
margin-bottom: 0.5rem;
}
.brand-mark {
width: 26px;
height: 26px;
border-radius: 6px;
background: linear-gradient(135deg, var(--gray-900), var(--gray-700));
color: var(--gray-0);
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 0.85rem;
letter-spacing: -0.02em;
font-family: var(--font-sans);
}
.brand-name {
font-weight: 600;
font-size: 0.95rem;
letter-spacing: -0.01em;
}
.brand-sub {
font-size: 0.72rem;
color: var(--gray-500);
margin-left: auto;
font-weight: 500;
}
.nav {
display: flex;
flex-direction: column;
gap: 1.1rem;
flex: 1;
}
.nav-group-head {
font-size: 0.72rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--gray-500);
padding: 0.3rem 0.7rem;
margin-bottom: 0.15rem;
}
.nav ul {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: 1px;
}
.nav a {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.4rem 0.7rem;
color: var(--gray-700);
text-decoration: none;
font-size: 0.875rem;
font-weight: 450;
border-radius: var(--radius-sm);
transition: background 120ms var(--ease), color 120ms var(--ease);
}
.nav a:hover {
background: var(--gray-100);
color: var(--gray-900);
}
.nav a.active {
background: var(--accent-50);
color: var(--accent-700);
font-weight: 550;
}
.nav a.active::before {
content: '';
width: 4px;
height: 4px;
border-radius: 50%;
background: var(--accent-600);
margin-right: -0.1rem;
}
.rail-foot {
padding: 0.75rem 0.7rem 0;
margin-top: 0.5rem;
border-top: 1px solid var(--gray-150);
font-size: 0.72rem;
color: var(--gray-500);
}
/* ─────────────────────────────────────────────────────────────────────
* Canvas (right of rail) — main content with right TOC
* ───────────────────────────────────────────────────────────────────── */
.canvas {
display: grid;
grid-template-columns: minmax(0, 1fr) var(--toc-w);
gap: 3rem;
padding: 2.5rem 2rem 6rem 2.5rem;
max-width: calc(var(--canvas-max) + var(--toc-w) + 5rem);
width: 100%;
margin: 0 auto;
}
.canvas.no-toc {
grid-template-columns: minmax(0, 1fr);
max-width: var(--canvas-max);
}
.canvas-content {
min-width: 0;
}
/* ─────────────────────────────────────────────────────────────────────
* Page header
* ───────────────────────────────────────────────────────────────────── */
.page-eyebrow {
display: inline-flex;
align-items: center;
gap: 0.5rem;
font-family: var(--font-mono);
font-size: 0.72rem;
font-weight: 500;
color: var(--gray-500);
margin-bottom: 0.6rem;
}
.page-eyebrow-dot {
width: 4px;
height: 4px;
border-radius: 50%;
background: var(--accent-600);
}
.page-title {
font-size: 2.1rem;
font-weight: 600;
line-height: 1.15;
letter-spacing: -0.025em;
margin: 0 0 0.5rem;
}
.page-lede {
font-size: 1.05rem;
color: var(--gray-600);
line-height: 1.6;
max-width: 60ch;
margin: 0;
}
.page-meta {
display: flex;
flex-wrap: wrap;
gap: 0.4rem;
margin-top: 1rem;
}
.meta-pill {
display: inline-flex;
align-items: center;
gap: 0.35rem;
padding: 0.2rem 0.55rem;
border-radius: var(--radius-sm);
font-family: var(--font-mono);
font-size: 0.72rem;
font-weight: 500;
background: var(--gray-100);
color: var(--gray-700);
border: 1px solid var(--gray-200);
}
.meta-pill .k {
color: var(--gray-500);
}
/* ─────────────────────────────────────────────────────────────────────
* Tabs
* ───────────────────────────────────────────────────────────────────── */
.tablist {
display: flex;
gap: 0.25rem;
margin: 2rem 0 1.5rem;
border-bottom: 1px solid var(--gray-200);
flex-wrap: wrap;
row-gap: 0;
}
.tab {
background: none;
border: none;
padding: 0.55rem 0.85rem;
font: inherit;
font-size: 0.875rem;
font-weight: 500;
color: var(--gray-600);
cursor: pointer;
border-bottom: 2px solid transparent;
margin-bottom: -1px;
transition: color 120ms var(--ease), border-color 120ms var(--ease);
white-space: nowrap;
display: inline-flex;
align-items: center;
gap: 0.4rem;
}
.tab:hover {
color: var(--gray-900);
}
.tab.active {
color: var(--gray-900);
border-bottom-color: var(--gray-900);
}
.tab-count {
font-family: var(--font-mono);
font-size: 0.7rem;
font-weight: 500;
color: var(--gray-500);
background: var(--gray-100);
padding: 0.05rem 0.35rem;
border-radius: 9px;
line-height: 1.4;
}
.tab.active .tab-count {
background: var(--gray-900);
color: var(--gray-0);
}
/* ─────────────────────────────────────────────────────────────────────
* Sections
* ───────────────────────────────────────────────────────────────────── */
.section {
margin: 2.5rem 0;
scroll-margin-top: 1.5rem;
}
.section-head {
margin-bottom: 1rem;
}
.section-title {
font-size: 1.25rem;
font-weight: 600;
letter-spacing: -0.01em;
margin: 0 0 0.3rem;
display: flex;
align-items: center;
gap: 0.6rem;
}
.section-desc {
color: var(--gray-600);
margin: 0;
font-size: 0.92rem;
line-height: 1.6;
max-width: 60ch;
}
/* Layer badge — tiny pill with a dot */
.layer-badge {
display: inline-flex;
align-items: center;
gap: 0.35rem;
font-family: var(--font-mono);
font-size: 0.68rem;
font-weight: 500;
letter-spacing: 0.02em;
padding: 0.15rem 0.45rem;
border-radius: var(--radius-xs);
border: 1px solid currentColor;
background: transparent;
text-transform: lowercase;
}
.layer-badge::before {
content: '';
width: 6px;
height: 6px;
border-radius: 50%;
background: currentColor;
}
.layer-badge.soma {
color: var(--layer-soma);
background: var(--layer-soma-bg);
border-color: var(--layer-soma-bg);
}
.layer-badge.morfo {
color: var(--layer-morfo);
background: var(--layer-morfo-bg);
border-color: var(--layer-morfo-bg);
}
.layer-badge.sema {
color: var(--layer-sema);
background: var(--layer-sema-bg);
border-color: var(--layer-sema-bg);
}
.layer-badge.eidos {
color: var(--layer-eidos);
background: var(--layer-eidos-bg);
border-color: var(--layer-eidos-bg);
}
.layer-badge.docs {
color: var(--layer-docs);
background: var(--layer-docs-bg);
border-color: var(--layer-docs-bg);
}
/* ─────────────────────────────────────────────────────────────────────
* Live preview card
* ───────────────────────────────────────────────────────────────────── */
.preview,
.canvas-stage {
border: 1px solid var(--gray-200);
border-radius: var(--radius-md);
background: var(--gray-0);
overflow: hidden;
box-shadow: var(--shadow-sm);
}
/* Always-rendered live preview, sits above the tablist so the Sema
* tab's Play buttons can fire on the live toggle no matter which tab
* the user is on. */
.canvas-stage {
margin: 1rem 0 0;
}
.preview-stage {
padding: 2rem 1.5rem;
display: flex;
gap: 1rem;
align-items: center;
justify-content: center;
flex-wrap: wrap;
min-height: 7rem;
background:
radial-gradient(circle at center, var(--gray-25), var(--gray-0)),
linear-gradient(0deg, var(--gray-50), var(--gray-50));
background-blend-mode: normal;
}
.preview-trace {
padding: 0.55rem 1rem;
border-top: 1px solid var(--gray-150);
background: var(--gray-50);
font-family: var(--font-mono);
font-size: 0.75rem;
color: var(--gray-600);
display: flex;
align-items: center;
gap: 0.6rem;
flex-wrap: wrap;
}
.preview-trace .label {
color: var(--gray-500);
font-weight: 500;
}
.preview-trace .arrow {
color: var(--gray-400);
}
.preview-trace .val {
color: var(--accent-700);
font-weight: 600;
}
.preview-trace .ts {
color: var(--gray-400);
margin-left: auto;
}
.preview-trace .event {
color: var(--layer-sema);
font-weight: 600;
}
/* ─────────────────────────────────────────────────────────────────────
* Controls panel
* ───────────────────────────────────────────────────────────────────── */
.controls {
margin-top: 1rem;
border: 1px solid var(--gray-200);
border-radius: var(--radius-md);
background: var(--gray-0);
overflow: hidden;
}
.controls-head {
padding: 0.55rem 1rem;
font-family: var(--font-mono);
font-size: 0.72rem;
color: var(--gray-500);
background: var(--gray-50);
border-bottom: 1px solid var(--gray-150);
letter-spacing: 0.04em;
text-transform: uppercase;
font-weight: 500;
}
.controls-grid {
padding: 1rem;
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 0.75rem 1.25rem;
}
.control {
display: flex;
flex-direction: column;
gap: 0.3rem;
min-width: 0;
}
.control-label {
font-family: var(--font-mono);
font-size: 0.72rem;
color: var(--gray-500);
font-weight: 500;
display: flex;
align-items: center;
gap: 0.35rem;
}
.control-label .ty {
color: var(--gray-400);
font-weight: 400;
}
.control input[type='text'],
.control select {
padding: 0.4rem 0.6rem;
border: 1px solid var(--gray-300);
border-radius: var(--radius-sm);
background: var(--gray-0);
font: inherit;
font-size: 0.85rem;
color: var(--gray-900);
transition: border-color 120ms var(--ease), box-shadow 120ms var(--ease);
}
.control input[type='text']:focus,
.control select:focus {
outline: none;
border-color: var(--accent-500);
box-shadow: 0 0 0 3px var(--accent-100);
}
/* Switch-style boolean control */
.switch {
position: relative;
display: inline-flex;
align-items: center;
gap: 0.5rem;
cursor: pointer;
user-select: none;
font-size: 0.85rem;
color: var(--gray-700);
}
.switch input {
position: absolute;
opacity: 0;
width: 0;
height: 0;
}
.switch-track {
position: relative;
width: 30px;
height: 18px;
background: var(--gray-300);
border-radius: 999px;
transition: background 150ms var(--ease);
}
.switch-track::after {
content: '';
position: absolute;
top: 2px;
left: 2px;
width: 14px;
height: 14px;
background: var(--gray-0);
border-radius: 50%;
transition: transform 150ms var(--ease);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
}
.switch input:checked + .switch-track {
background: var(--accent-600);
}
.switch input:checked + .switch-track::after {
transform: translateX(12px);
}
.switch input:focus-visible + .switch-track {
box-shadow: 0 0 0 3px var(--accent-100);
}
/* ─────────────────────────────────────────────────────────────────────
* Code blocks
* ───────────────────────────────────────────────────────────────────── */
.code-stack {
display: grid;
gap: 0.85rem;
margin: 1rem 0 0;
}
.code {
margin: 0;
border: 1px solid var(--gray-200);
border-radius: var(--radius-md);
background: var(--code-bg);
overflow: hidden;
}
.code-stack .code {
margin: 0;
}
.code-head {
display: flex;
justify-content: flex-start;
gap: 0.6rem;
align-items: center;
padding: 0.45rem 0.85rem;
background: var(--code-bg-soft);
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
font-family: var(--font-mono);
font-size: 0.7rem;
color: rgba(226, 232, 240, 0.55);
}
.code-head .lang {
letter-spacing: 0.04em;
text-transform: uppercase;
font-weight: 500;
margin-left: auto;
}
.code-head .code-title {
font-family: var(--font-sans);
font-size: 0.72rem;
font-weight: 500;
color: rgba(226, 232, 240, 0.7);
letter-spacing: 0;
text-transform: none;
}
.code pre {
margin: 0;
padding: 1rem 1.1rem;
overflow-x: auto;
font-family: var(--font-mono);
font-size: 0.82rem;
line-height: 1.6;
color: var(--code-fg);
font-feature-settings: 'liga' 0;
}
.code .tag { color: var(--code-tag); }
.code .attr { color: var(--code-attr); }
.code .str { color: var(--code-string); }
.code .com { color: var(--code-comment); font-style: italic; }
.code .kw { color: var(--code-keyword); }
.code .punct { color: var(--code-punct); }
/* ─────────────────────────────────────────────────────────────────────
* Tables
* ───────────────────────────────────────────────────────────────────── */
.spec-wrap {
margin: 0.75rem 0 0;
border: 1px solid var(--gray-200);
border-radius: var(--radius-md);
overflow: hidden;
background: var(--gray-0);
}
.spec-caption {
font-size: 0.85rem;
color: var(--gray-700);
font-weight: 500;
margin: 1.5rem 0 0.4rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.spec {
width: 100%;
border-collapse: collapse;
font-size: 0.85rem;
}
.spec thead th {
text-align: left;
padding: 0.55rem 0.9rem;
background: var(--gray-50);
border-bottom: 1px solid var(--gray-200);
font-family: var(--font-mono);
font-size: 0.7rem;
font-weight: 600;
letter-spacing: 0.04em;
text-transform: uppercase;
color: var(--gray-600);
}
.spec tbody td {
padding: 0.65rem 0.9rem;
border-bottom: 1px solid var(--gray-150);
vertical-align: top;
color: var(--gray-700);
}
.spec tbody tr:last-child td {
border-bottom: none;
}
.spec tbody tr:hover td {
background: var(--gray-50);
}
.spec td.name {
font-family: var(--font-mono);
font-size: 0.82rem;
color: var(--gray-900);
font-weight: 500;
white-space: nowrap;
}
.spec td.type,
.spec td.value,
.spec td.source,
.spec td.default {
font-family: var(--font-mono);
font-size: 0.78rem;
color: var(--gray-600);
white-space: nowrap;
}
.spec td.desc {
color: var(--gray-700);
max-width: 36em;
line-height: 1.5;
}
.spec .empty {
color: var(--gray-400);
font-style: italic;
}
/* Pills (tags within tables) */
.pill {
display: inline-block;
font-family: var(--font-mono);
font-size: 0.7rem;
font-weight: 500;
letter-spacing: 0.02em;
padding: 0.1rem 0.4rem;
border-radius: var(--radius-xs);
background: var(--gray-100);
color: var(--gray-700);
border: 1px solid var(--gray-200);
margin-right: 0.3rem;
vertical-align: middle;
line-height: 1.4;
}
.pill.bindable {
color: var(--accent-700);
background: var(--accent-50);
border-color: var(--accent-100);
}
.pill.required {
color: #b91c1c;
background: #fef2f2;
border-color: #fecaca;
}
.pill.recommended {
color: #b45309;
background: #fffbeb;
border-color: #fde68a;
}
.pill.optional {
color: var(--gray-600);
}
.pill.static {
color: var(--gray-500);
background: transparent;
}
.pill.contact {
color: #0d9488;
background: #f0fdfa;
border-color: #99f6e4;
}
.pill.commit {
color: var(--layer-morfo);
background: var(--layer-morfo-bg);
border-color: #ddd6fe;
}
.pill.emerge {
color: #c2410c;
background: #fff7ed;
border-color: #fed7aa;
}
.pill.signal {
color: var(--layer-sema);
background: var(--layer-sema-bg);
border-color: #fbcfe8;
}
/* Empty state for tables */
.spec-empty {
padding: 1rem 1.1rem;
border: 1px dashed var(--gray-200);
border-radius: var(--radius-md);
background: var(--gray-50);
color: var(--gray-600);
font-size: 0.9rem;
}
/* ─────────────────────────────────────────────────────────────────────
* Selector list (eidos)
* ───────────────────────────────────────────────────────────────────── */
.selectors {
margin: 0.75rem 0 0;
border: 1px solid var(--gray-200);
border-radius: var(--radius-md);
overflow: hidden;
background: var(--gray-0);
}
.selectors-row {
display: grid;
grid-template-columns: 1fr auto;
gap: 1rem;
align-items: baseline;
padding: 0.55rem 0.9rem;
border-bottom: 1px solid var(--gray-150);
transition: background 120ms var(--ease);
}
.selectors-row:hover {
background: var(--gray-50);
}
.selectors-row:last-child {
border-bottom: none;
}
.selectors-row .sel {
font-family: var(--font-mono);
font-size: 0.82rem;
color: var(--gray-900);
word-break: break-all;
}
.selectors-row.token .sel {
color: var(--gray-500);
}
.selectors-row .tag {
font-family: var(--font-mono);
font-size: 0.68rem;
color: var(--gray-500);
letter-spacing: 0.04em;
text-transform: uppercase;
white-space: nowrap;
font-weight: 500;
}
.selectors-row.morfo .tag {
color: var(--layer-morfo);
}
.selectors-row.token .tag {
color: var(--gray-400);
}
/* ─────────────────────────────────────────────────────────────────────
* Prose
* ───────────────────────────────────────────────────────────────────── */
.prose {
max-width: 65ch;
color: var(--gray-700);
line-height: 1.7;
font-size: 0.95rem;
}
.prose p {
margin: 0 0 1rem;
}
.prose strong {
color: var(--gray-900);
font-weight: 600;
}
.prose code {
font-family: var(--font-mono);
font-size: 0.86em;
color: var(--gray-900);
background: var(--gray-100);
padding: 0.05em 0.35em;
border-radius: 3px;
border: 1px solid var(--gray-200);
}
.prose ul {
margin: 0 0 1rem;
padding-left: 1.25rem;
}
.prose li {
margin: 0.25rem 0;
}
.prose blockquote {
margin: 1.25rem 0;
padding: 0.75rem 1rem;
border-left: 3px solid var(--accent-600);
background: var(--accent-50);
border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
color: var(--gray-800);
font-style: italic;
}
/* ─────────────────────────────────────────────────────────────────────
* TOC (right rail)
* ───────────────────────────────────────────────────────────────────── */
.toc {
position: sticky;
top: 2.5rem;
align-self: start;
font-size: 0.85rem;
}
.toc-head {
font-size: 0.72rem;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--gray-500);
font-weight: 600;
margin-bottom: 0.5rem;
padding-bottom: 0.4rem;
border-bottom: 1px solid var(--gray-200);
}
.toc ul {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: 1px;
}
.toc a {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.3rem 0.5rem;
color: var(--gray-600);
text-decoration: none;
border-radius: var(--radius-xs);
transition: color 120ms var(--ease), background 120ms var(--ease);
font-size: 0.85rem;
}
.toc a:hover {
color: var(--gray-900);
background: var(--gray-100);
}
.toc a .layer-badge {
font-size: 0.62rem;
padding: 0.05rem 0.3rem;
border: none;
background: transparent;
}
.toc a .layer-badge::before {
width: 5px;
height: 5px;
}
/* ─────────────────────────────────────────────────────────────────────
* Landing
* ───────────────────────────────────────────────────────────────────── */
.landing-hero {
margin: 0 0 2.5rem;
}
.landing-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 0.75rem;
}
.landing-card {
display: flex;
flex-direction: column;
gap: 0.25rem;
padding: 1rem 1.1rem;
background: var(--gray-0);
border: 1px solid var(--gray-200);
border-radius: var(--radius-md);
text-decoration: none;
color: inherit;
transition: border-color 150ms var(--ease), box-shadow 150ms var(--ease),
transform 150ms var(--ease);
}
.landing-card:hover {
border-color: var(--gray-300);
box-shadow: var(--shadow-md);
transform: translateY(-1px);
}
.landing-card-eyebrow {
font-family: var(--font-mono);
font-size: 0.7rem;
color: var(--gray-500);
letter-spacing: 0.02em;
font-weight: 500;
margin-bottom: 0.25rem;
}
.landing-card-title {
font-size: 1.05rem;
font-weight: 600;
letter-spacing: -0.01em;
}
.landing-card-desc {
font-size: 0.85rem;
color: var(--gray-600);
line-height: 1.5;
}
/* ─────────────────────────────────────────────────────────────────────
* Responsive
* ───────────────────────────────────────────────────────────────────── */
@media (max-width: 1100px) {
.canvas {
grid-template-columns: minmax(0, 1fr);
gap: 0;
}
.toc {
display: none;
}
}
@media (max-width: 720px) {
.shell {
grid-template-columns: 1fr;
}
.rail {
position: relative;
height: auto;
border-right: none;
border-bottom: 1px solid var(--gray-200);
padding: 1rem;
}
.canvas {
padding: 1.5rem 1.25rem 4rem;
}
}
/* ─────────────────────────────────────────────────────────────────────
* TOPBAR
* ───────────────────────────────────────────────────────────────────── */
.topbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
padding: 0 1.25rem;
height: 56px;
background: var(--gray-0);
border-bottom: 1px solid var(--gray-200);
position: sticky;
top: 0;
z-index: 50;
backdrop-filter: saturate(1.4) blur(8px);
}
.topbar-left,
.topbar-right {
display: flex;
align-items: center;
gap: 1.25rem;
}
.topbar-right {
gap: 0.4rem;
}
.brand {
display: flex;
align-items: center;
gap: 0.55rem;
text-decoration: none;
color: var(--gray-900);
padding-right: 0.75rem;
border-right: 1px solid var(--gray-200);
}
.brand-mark {
width: 26px;
height: 26px;
border-radius: 6px;
background: linear-gradient(135deg, var(--gray-900), var(--gray-700));
color: var(--gray-0);
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 0.85rem;
letter-spacing: -0.02em;
}
[data-theme='dark'] .brand-mark {
background: linear-gradient(135deg, var(--gray-200), var(--gray-400));
color: var(--gray-0);
}
.brand-name {
font-weight: 600;
font-size: 0.95rem;
letter-spacing: -0.01em;
}
.brand-version {
font-family: var(--font-mono);
font-size: 0.7rem;
color: var(--gray-500);
font-weight: 500;
}
.topbar-nav {
display: flex;
gap: 1.1rem;
}
.topbar-nav a {
font-size: 0.875rem;
color: var(--gray-600);
text-decoration: none;
font-weight: 500;
padding: 0.3rem 0;
border-bottom: 2px solid transparent;
transition: color 120ms var(--ease), border-color 120ms var(--ease);
}
.topbar-nav a:hover {
color: var(--gray-900);
}
.topbar-nav a.active {
color: var(--gray-900);
}
.iconbtn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
border-radius: var(--radius-sm);
border: 1px solid transparent;
background: transparent;
color: var(--gray-600);
cursor: pointer;
transition: background 120ms var(--ease), color 120ms var(--ease),
border-color 120ms var(--ease);
text-decoration: none;
padding: 0;
}
.iconbtn:hover {
background: var(--gray-100);
color: var(--gray-900);
border-color: var(--gray-200);
}
.iconbtn:focus-visible {
outline: none;
box-shadow: 0 0 0 3px var(--accent-100);
border-color: var(--accent-500);
}
.iconbtn[aria-pressed='true'] {
background: var(--gray-100);
color: var(--gray-900);
}
/* Adjust rail to account for topbar */
.shell {
min-height: calc(100vh - 56px);
}
.rail {
height: calc(100vh - 56px);
top: 56px;
padding-top: 1.25rem;
}
/* ─────────────────────────────────────────────────────────────────────
* SEMA TAB — per-event signature visualizations
* ───────────────────────────────────────────────────────────────────── */
.intent-picker {
display: flex;
align-items: center;
gap: 0.5rem;
margin: 0 0 1.25rem;
padding: 0.5rem 0.75rem;
background: var(--gray-50);
border: 1px solid var(--gray-200);
border-radius: var(--radius-md);
flex-wrap: wrap;
}
.intent-picker-label {
font-family: var(--font-mono);
font-size: 0.7rem;
color: var(--gray-500);
letter-spacing: 0.04em;
text-transform: uppercase;
margin-right: 0.4rem;
}
.intent-chip {
background: var(--gray-0);
border: 1px solid var(--gray-200);
border-radius: var(--radius-sm);
padding: 0.3rem 0.7rem;
font: inherit;
font-family: var(--font-mono);
font-size: 0.78rem;
color: var(--gray-700);
cursor: pointer;
transition: all 120ms var(--ease);
}
.intent-chip:hover {
border-color: var(--gray-400);
color: var(--gray-900);
}
.intent-chip.active {
background: var(--gray-900);
color: var(--gray-0);
border-color: var(--gray-900);
}
[data-theme='dark'] .intent-chip.active {
background: var(--gray-200);
color: var(--gray-0);
}
.event-block {
margin: 1.25rem 0;
border: 1px solid var(--gray-200);
border-radius: var(--radius-md);
background: var(--gray-0);
overflow: hidden;
}
.event-block-head {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.6rem 1rem;
background: var(--gray-50);
border-bottom: 1px solid var(--gray-150);
flex-wrap: wrap;
gap: 0.75rem;
}
.event-name {
display: flex;
align-items: center;
gap: 0.5rem;
font-family: var(--font-mono);
font-size: 0.85rem;
}
.event-name code {
background: var(--gray-100);
padding: 0.1rem 0.4rem;
border-radius: var(--radius-xs);
color: var(--gray-900);
}
.event-channels {
display: flex;
gap: 0.3rem;
flex-wrap: wrap;
}
.event-actions {
display: flex;
align-items: center;
gap: 0.6rem;
flex-wrap: wrap;
}
.play-btn {
display: inline-flex;
align-items: center;
gap: 0.35rem;
padding: 0.25rem 0.6rem;
font: inherit;
font-family: var(--font-mono);
font-size: 0.72rem;
font-weight: 500;
color: var(--gray-0);
background: var(--gray-900);
border: 1px solid var(--gray-900);
border-radius: var(--radius-sm);
cursor: pointer;
transition: background 120ms var(--ease), transform 80ms var(--ease);
}
.play-btn:hover {
background: var(--accent-700);
border-color: var(--accent-700);
}
.play-btn:active {
transform: scale(0.96);
}
[data-theme='dark'] .play-btn {
background: var(--gray-200);
color: var(--gray-0);
border-color: var(--gray-200);
}
[data-theme='dark'] .play-btn:hover {
background: var(--accent-600);
color: var(--gray-0);
border-color: var(--accent-600);
}
.ch-pill {
font-family: var(--font-mono);
font-size: 0.68rem;
font-weight: 500;
padding: 0.1rem 0.45rem;
border: 1px solid var(--gray-300);
border-radius: var(--radius-xs);
color: var(--gray-500);
background: var(--gray-0);
}
.ch-pill.active {
color: var(--accent-700);
background: var(--accent-50);
border-color: var(--accent-200);
}
.signature-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 1rem;
padding: 1rem;
}
.signature-card {
border: 1px solid var(--gray-150);
border-radius: var(--radius-sm);
padding: 0.85rem;
background: var(--gray-25);
display: flex;
flex-direction: column;
gap: 0.6rem;
}
.signature-card-head {
display: flex;
justify-content: space-between;
align-items: baseline;
}
.signature-card .ch-name {
font-family: var(--font-mono);
font-size: 0.75rem;
font-weight: 600;
color: var(--gray-900);
letter-spacing: 0.04em;
text-transform: uppercase;
}
.signature-card .ch-status {
font-family: var(--font-mono);
font-size: 0.65rem;
color: var(--gray-400);
text-transform: uppercase;
letter-spacing: 0.06em;
}
.signature-card .ch-status.active {
color: var(--accent-600);
}
.signature-fields {
display: grid;
grid-template-columns: auto 1fr;
gap: 0.2rem 0.7rem;
margin: 0;
font-family: var(--font-mono);
font-size: 0.74rem;
line-height: 1.4;
}
.signature-fields dt {
color: var(--gray-500);
}
.signature-fields dd {
margin: 0;
color: var(--gray-900);
}
.signature-fields .unit {
color: var(--gray-400);
font-size: 0.85em;
margin-left: 0.1em;
}
.sig-affects {
margin: 0.4rem 0 0;
font-size: 0.78rem;
color: var(--gray-500);
line-height: 1.45;
border-top: 1px dashed var(--gray-200);
padding-top: 0.5rem;
}
/* Haptic pattern — alternating pulses and gaps. Each segment is a flex
* row item with `flex` proportional to its ms duration, so the strip
* visualises the pattern's rhythm regardless of total length. */
.haptic-pattern {
height: 36px;
display: flex;
gap: 0;
background: var(--gray-0);
border-radius: var(--radius-xs);
overflow: hidden;
border: 1px solid var(--gray-150);
}
.haptic-segment {
display: block;
height: 100%;
min-width: 2px;
}
.haptic-segment.pulse {
background: var(--haptic-color, var(--accent-600));
}
.haptic-segment.gap {
background: transparent;
}
/* Motion preview — animates a square per the signature */
.motion-preview {
height: 56px;
background:
linear-gradient(0deg, transparent 11px, var(--gray-200) 12px),
linear-gradient(90deg, transparent 11px, var(--gray-200) 12px);
background-size: 12px 12px;
background-color: var(--gray-0);
border-radius: var(--radius-xs);
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
}
.motion-target {
width: 28px;
height: 28px;
background: var(--motion-color, var(--accent-600));
border-radius: 4px;
transform-origin: center;
/* Animation runs forward then back (2 alternate iterations) and stops.
* Replay by clicking Play (the page bumps a key) or by changing intent
* (svelte remounts via {#key}). */
animation: motion-cycle var(--dur, 240ms) var(--ease, ease-out) 2 alternate;
transition: background 200ms ease-out;
}
@keyframes motion-cycle {
from {
transform: scale(var(--from, 1));
}
to {
transform: scale(var(--to, 1));
}
}
/* Sound spectrum — bars that visualize pitch + contour */
.sound-spectrum {
display: flex;
align-items: flex-end;
gap: 2px;
height: 56px;
padding: 0.4rem;
background: var(--code-bg);
border-radius: var(--radius-xs);
}
.sound-spectrum .bar {
flex: 1;
background: linear-gradient(0deg, var(--accent-600), var(--accent-200));
border-radius: 1px;
min-width: 2px;
}
/* Color affects — swatch + visual demos of where color is applied */
.color-affects {
display: flex;
gap: 0.85rem;
align-items: stretch;
}
.color-swatch-lg {
width: 56px;
height: 56px;
border-radius: var(--radius-sm);
border: 1px solid rgba(0, 0, 0, 0.1);
flex-shrink: 0;
}
.color-affects-list {
display: flex;
flex-direction: column;
gap: 0.3rem;
font-size: 0.72rem;
color: var(--gray-600);
flex: 1;
}
.color-affects-row {
display: flex;
align-items: center;
gap: 0.5rem;
}
.affect-bar,
.affect-fill,
.affect-glow {
width: 16px;
height: 16px;
flex-shrink: 0;
border-radius: 3px;
}
.affect-bar {
border: 2px solid currentColor;
background: transparent;
}
.affect-fill {
border: 0;
}
.affect-glow {
background: var(--gray-100);
}
/* Presence preview — shows opacity + shadow */
.presence-preview {
height: 56px;
background: var(--gray-100);
border-radius: var(--radius-xs);
display: flex;
align-items: center;
justify-content: center;
}
.presence-target {
width: 36px;
height: 28px;
background: var(--accent-600);
border-radius: 4px;
}
/* Background applied to overall page in dark mode */
[data-theme='dark'] body {
background: var(--gray-25);
color: var(--gray-900);
}

Powered by TurnKey Linux.