/* * 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); }