| version | 0.5.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| name | Nexus Design System | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| description | Nexus precision creative tool: neutral surfaces, cobalt interaction, offline system typography. Light/default; sole token authority with DESIGN.dark.md. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| colors |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| typography |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| spacing |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| rounded |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| elevation |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| motion |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| components |
|
Nexus is a precision creative tool: a neutral workbench with clear boundaries, comfortable reading regions, and deliberate cobalt interaction. Preserve the Nexus name and the five-node timeline mark. Warm-paper surfaces, global literary serif, cyan glow, and marketing motion are not the active language.
This light/default frontmatter and DESIGN.dark.md are the sole token authority. version: 0.5.0 is this repository's design-contract revision, continuing its existing schema: nested component recipes, semantic rounded keys, space-* steps, and scalar typography metrics are intentional. Do not flatten/rename them to match an external template. Every frontmatter key exists in both themes; only values differ. Level 3 describes specification completeness, not a claim of rendered QA.
The implementation contract and complete Studio inventory live in .mstar/specs/active/surfaces/design-studio.md. No app-specific palette, shadow table, font stack, or live token override is allowed.
- Silver-neutral light planes and graphite dark planes distinguish workspace, panel, and raised content. No grain, glass, decorative gradients, or full-width marketing heroes.
- Cobalt denotes action, focus, selection, and timeline activity. Semantic hues still distinguish success/running, warning/stale, error, queued, presets, and annotation categories. Color is never the only status cue.
- Interface and authoring titles are both sans. Content voice remains a larger title hierarchy, not a different typeface. Existing
font-display,display-*, andCardTitle.voiceconsumers remain valid. - Compact chrome uses existing 32px controls; form/default 40px and large 48px remain. Reading is not squeezed to match toolbars.
- Motion communicates changes, not personality. No hover translation, scale-on-press, animated gradients, or perpetual decorative motion.
All brand values are in colors. Public names brand-deep-blue, brand-cyan, their extended steps, blue-*, and package brandColors.deepBlue/cyan/white remain unchanged. These are stable API identifiers, not promises of historical pigment: brand-cyan now carries the theme's cobalt signal. No new alias or compatibility layer is introduced.
brand-deep-blue remains a dark structural pigment in both themes, suitable for bright-fill labels and fixed dark brand surfaces, never dark-theme paragraph text. brand-cyan and blue-700 match per theme; their 800/900/1000 steps deepen in light and brighten in dark. blue-1100 is retained and now explicitly present in dark. Package numeric brandColors exports are generated light/default snapshots; theme-aware UI reads CSS, not JavaScript constants.
Foreground follows the actual fill, not the page name. Light primary uses blue-700 fill and brand-white text; dark primary uses blue-700 fill and brand-deep-blue text. Hover/active use blue-800/900. Light destructive uses white on the red scale; dark uses deep-blue on its brighter red scale. Never place white on a bright dark-theme accent.
background-100: document/raised reading plane;background-200: quiet groups;background-300: stronger panel/selection plane.- Gray 100–300: neutral fills; 400–500: borders and subdued graphical detail; 600–700: secondary/helper copy; 800–1000: increasing text emphasis. Do not set active small text in gray-500. Use gray-700 for Studio metadata instead of the old gray-500 convention.
- Gray-alpha: hover washes and decorative separators. Input boundaries use opaque gray-500; a low-alpha divider is not a control's only affordance.
scrim: backdrop only; text lives on an opaque dialog/popover plane above it.red: failed/destructive/conflict;amber: warning/stale/review;green: success/healthy/running/completed;teal: queued/starting;blue: info/interaction/timeline;purple: preset/strategy/research;pink: annotation/relationship category. Preserve labels and icon/shape cues.- All existing component status, finding, memory, reading, SOUL, and canvas families remain. Literal semantic tints in recipes are resolved from the same color scales; they are not independent palettes.
WCAG sRGB calculations below are design-time arithmetic, not browser verification. AA minimum: 4.5:1 normal text, 3:1 large text and required graphical affordances. Alpha fills must be composited over the actual backing plane before evaluating contrast. Disabled controls and decorative grids are not active text targets; never apply their exemption to helper text.
| Pair | Light | Dark |
|---|---|---|
| gray-1000 / background-100 | 16.58:1 | 16.15:1 |
| gray-700 / background-300 | 5.89:1 | 6.78:1 |
| gray-600 / background-300 | 4.62:1 | 4.98:1 |
| blue-700 / background-300 (focus/interaction) | 4.78:1 | 6.52:1 |
| Primary label / blue-700 | 5.61:1 | 6.81:1 |
| Primary label / blue-800 | 6.86:1 | 8.08:1 |
| Primary label / blue-900 | 8.36:1 | 9.54:1 |
| Destructive label / red-800 | 6.85:1 | 7.59:1 |
These pairs do not certify arbitrary class combinations or app pages. Studio must exercise actual rest/hover/active/focus and both-theme surfaces before acceptance. Focus adjacent to primary fills needs the opaque background gap below.
Exact families and metrics live in typography. UI/prose/display use the OS sans stack: system-ui, Apple/Segoe UI, then named Simplified Chinese system fallbacks (PingFang SC, Hiragino Sans GB, Microsoft YaHei UI, Noto Sans CJK SC). No network font request is needed. Do not claim identical glyph metrics across operating systems. Keep Latin and CJK in the same specimen and inspect punctuation, glyph fallback, and baseline alignment. Do not introduce a font dependency solely for visual novelty.
- Display 32/24/20: creative-entity titles and reading headings, sans; CardTitle content remains 20px vs interface 16px.
- Heading 32/24/20/16: page through panel hierarchy, weight 600. Preserve the token metrics, not overrides such as
leading-tightthat erase them. - Label 14/12: 1.5 line height, no tracking; no all-caps treatment for Chinese.
- Copy 16/14/13/12: prose, explanatory text, dense helpers; copy-12 formalizes an existing Tailwind utility rather than adding a new control.
- Button 14/12: weight 600, 1.25 line height, one line when practical; do not clip glyphs to enforce density.
- Mono: OS monospace stack with CJK sans fallback. IDs/code remain legible offline; numerical columns use tabular figures.
- Reading measure 66ch, line-height 1.75, paragraph gap 1.25em in both themes. Main prose is 16px; responsive containers constrain the measure, never shrink the font to fit.
The old Source Serif 4 font-face declarations and Studio-only preloads are removed from the active pipeline. Existing web/desktop files and preloads are outside this change's edit scope; their unused packaged font files do not constitute an active typography authority. No replacement asset is required.
Base 4px; retain the nine public space steps. Rhythm: 4–8px inside a control/label group, 12–16px between related controls, 24px between groups, 32–40px between gallery sections. Default card padding 24px, compact 16px, large composition 32px. Do not turn every sample into a nested card.
Use existing Tailwind v3 breakpoints: sm 640px, md 768px, lg 1024px, xl 1280px, 2xl 1536px. The former 401/601/961 breakpoint prose is retired; no screen-key remapping is needed. Studio content cap 1400px; horizontal padding 24px desktop / 16px narrow. A fixed section rail is allowed at lg and above; below lg place it above the content. Top navigation wraps with all five labels visible below md. Header has a 56px minimum height, not a fixed height that clips wrapped content.
Existing control sizes stay tiny 24px / small 32px / default 40px / large 48px. Tiny is for compact pointer/keyboard chrome, not the only touch affordance. Studio chrome uses a 44px minimum hit area at narrow/coarse-pointer layouts without changing public size enums. Tables and canvas fixtures use labeled local overflow regions; never hide document overflow to conceal broken layout.
Exact elevation-0–4 and existing shadow-card/popover/modal projections are in frontmatter. Rest card/node = elevation-1; interactive hover = elevation-2; popover/menu/tooltip = elevation-3; modal/dragging = elevation-4. Flat grouping = elevation-0. Shadows separate planes, not brand glow. Preserve existing public shadow names; new code may use elevation names directly.
Interactive card hover changes border/shadow only, without moving text. Canvas dragging elevation changes immediately so the node tracks the pointer. Selected nodes keep their accent stroke plus a 2px ring and a textual/shape selection cue, not a shadow alone.
| Context | Token | Value |
|---|---|---|
| Filtering / hash jump / pair layout | duration-instant | 0ms |
| Rest / hover / active | duration-state | 120ms |
| Popover / tooltip | duration-popover | 160ms |
| Dialog | duration-modal | 200ms |
| Enter | duration-enter | 160ms |
| Exit | duration-exit | 140ms |
Easings: standard cubic-bezier(0.2, 0, 0, 1); emphasized cubic-bezier(0.16, 1, 0.3, 1). Menus/dialogs/toasts fade; no translation is required. Reduced motion removes decorative transitions/transforms and makes state visibility immediate. The Toast exit timer remains 140ms for normal motion, 0ms for reduced motion, without changing toast duration/queue APIs. Loading progress may use an existing spinner when progress is real; reduced motion uses a static icon plus status text. No pretend progress values or new animation library.
Control 4px; card/popover 8px; fullscreen 12px; pill 9999px. Pills are for compact status/avatar shapes, not the default container. Logo geometry and asset corner radii are frozen, independent of UI radius tokens.
Every keyboard target has a visible indicator. components.focus-ring encodes a 2px background gap and a 2px outer blue-700 band: 0 0 0 2px var(--color-background-100), 0 0 0 4px var(--color-blue-700). Do not suppress outline without providing this ring. Shared primitives provide their own focus-visible treatment so external consumers do not rely on Studio global CSS. Forced-colors mode preserves an outline. Active controls never use the disabled opacity wash.
Five-node wide timeline axis: ring, ring, solid center, ring, ring. Preserve SVG paths, viewBoxes, packaged assets, PNG provenance, and desktop icon outputs. Plain marks and square plates are distinct contracts; retain all public logo variant names and exports.
| Asset | Treatment |
|---|---|
| logo-primary.svg / logo-white-bg.svg | Frozen baked gradient pigments; wide geometry reference and installed-identity asset |
| logo-primary-square.svg / logo-white-bg-square.svg | Frozen square plates; keep all existing plate and desktop icon uses |
| logo-white.svg / logo-mono.svg | Frozen monochrome/gradient assets on the appropriate contrasting plate |
| logo-text.svg | Existing asset wordmark; SVG loaded as an image does not inherit a parent CSS currentColor; retain the existing tested image treatment |
| NexusMark | Inline currentColor timeline mark; live theme pigment from shared tokens |
| NexusLogoVariant | Four existing elegant/nature/parchment/scifi palette specimens retained as explicitly labeled historical geometry/pigment references, not active application themes |
Frozen asset pigments may differ from live cobalt tokens. This is a deliberate asset boundary, not a second active theme: Brand separates installed asset references from live token-driven mark and CSS swatches. Do not claim frozen cyan pixels equal brandColors.cyan. Never recolor the assets with CSS filters to simulate a new logo, nor regenerate desktop icons. Existing wordmark image inversion used for contrasting placement may remain; it is not token recoloring.
General mark height 24px, compact titlebar mark 14px, square shell plate 20px, clear space ≥25% of rendered height. Wide marks use height + width auto; do not squeeze them into a square. Identity text uses the existing logo-text asset rather than newly typeset imitation. Ordinary page titles may say Nexus Design Studio. Images use alt="Nexus"; inline marks retain unique accessible title/description IDs.
Helpful, precise, local-first. Title Case for existing English nav labels/page titles; sentence case for helper text, errors, loading, and toasts. Keep existing localized product vocabulary.
Buttons use a clear verb when the object is obvious: Save, Create, Delete. Dialog/page titles and accessible names retain the object (Delete Work); use Action + object where context would otherwise be ambiguous. Do not expand source-level product copy changes into apps/web. Errors state what happened and a recoverable next action. Empty states explain the first action; loading says what is happening with an ellipsis; success/toasts name the changed object without “successfully” or a trailing period. No decorative emoji, fake metrics, or marketing slogans.
All current public signatures remain. Dialog, States (EmptyState/Loading/ErrorState), Table and other app-proven primitives MAY be promoted to public component families under the library discipline: pure presentational, caller-owned copy via props, a per-component test, and export via src/index.ts with no deep imports. Values are frontmatter recipes; behavior remains native or owned by the existing component.
- Button: four variants × four sizes; source-compatible
asChild, refs, native attributes and callbacks. Primary uses the new blue-700/800/900 recipe. Disabled remains non-interactive. No layout transform on hover/press. - Badge: neutral/running/queued/warning/error/preset × soft/solid. Preserve default soft and state meaning. Soft uses named semantic fills/borders; solid chooses text by fill luminance. Domain badges retain every finding/task/chapter status.
- Card: preserve
interactive?: booleanas a visual opt-in andvoice?: 'interface' | 'content'; no synthetic click behavior. Content voice now uses the larger sans display tier. Host still owns role, tabindex, and action semantics. - Input / Select / Textarea / Label: native behavior, refs, invalid/aria-invalid and id/htmlFor remain. Label/control/helper/error composition stays fixture/app-owned; helper IDs use aria-describedby; errors are readable and identified beyond a red border. Native Select remains native.
- Tabs: preserve existing controlled/uncontrolled props and values. Baseline TabsTrigger has no disabled prop; do not add one to satisfy a generic matrix. Show supported rest/hover/selected/focus, and label disabled as unsupported. Repair keyboard arrow navigation and unique tab/panel associations internally without changing signatures.
- Toast: existing success/error/warning/info, real queue/dismissal/portals and caller-owned copy. Dialog/Toast portals stay in their rendering document, including comparison frames. Long text wraps, viewport inset is respected.
- TransportErrorBlock: existing six kinds and optional actions; compact text-link CTAs, not filled buttons in an alert. Preserve kind-to-action/callback/copy rules.
- Compute composites: existing field schemas, entity pickers, proposal sections, statuses, run tables, node chrome, inspector props remain. Show existing empty/populated/invalid/disabled/truncated/overflow/provenance states as supported, never simulate network state inside a pure primitive.
- Dialog / Sheet: promoted to public
@42ch/nexus-uifamilies (V1.148 P1). Radix-based modal / end-rail drawer with caller-owned copy (title,description,closeLabel); scrim overlay,shadow-elevation-4, dialog/sheet sizing tokens. Light/dark parity is token-driven (--nexus-*projections); apps/web keeps locale-aware copy through thin wrappers. Dialog/Popover recipes also govern menus/tooltips. - States: promoted to a public
@42ch/nexus-uifamily (V1.148 P1):Spinner,LoadingState,EmptyState,UnavailableState,ErrorState. Caller-owned copy with English fallbacks; loading voice (present participle + ellipsis), empty-state content voice (font-displaydisplay tier), and error pattern (what happened + next action) per §Voice & Content; error surface consumes theerror-surfacetokens. Light/dark parity via token projections plus explicitdark:hooks (Spinner blue-1000/blue-700, retry deep ink/cobalt). - Table: promoted to public
@42ch/nexus-uiprimitives (V1.148 P1): nativeTable/TableHeader/TableBody/TableRow/TableHead/TableCell; background-200 header well, label-12 head, background-200 row hover with token-driven reduced-motion-safe motion; the overflow-x narrow-screen wrapper is owned by the primitive. - EmptyCreateCard: promoted to a public
@42ch/nexus-uiprimitive (V1.148 P1): dashed-card create affordance matching the list-item card footprint (V1.125 P2 AC-V1125-5); caller-owned copy/icon/callback, disabled gate with native tooltip, icon brand-deep-blue on light / blue-700 on dark. - ListStateContainer: promoted to a public
@42ch/nexus-uiL2 pattern (V1.149 P1): the single four-branch list container (loading/error/empty/ready) composing the promoted States primitives — loading showsLoadingState, error showsErrorStatewith an optional callerretry, ready renders caller children; empty showsEmptyStatewith caller-ownedemptyTitle/emptyHint/emptyAction(English fallback title "Nothing here yet"), so empty vs "no selection context" is distinguished by caller copy. Voice, error-surface tokens, and content-voice headline are inherited from the States recipes; no query/router/i18n deps. - ConfirmDialog: promoted to a public
@42ch/nexus-uiL2 pattern (V1.149 P1): the destructive/irreversible-action confirmation over the promoted Dialog + Button primitives. Caller-owned copy (title, optionaldescription,confirmLabel,cancelLabel) and caller-owned decision (onConfirm) / open state (open/onOpenChange).destructivemaps the confirm action to the Button destructive recipe (red-800 fill, background-driven label contrast); otherwise the primary recipe.pendingdisables both actions and shows the busy spinner — a slow confirm cannot be double-fired or cancelled mid-flight. - FormDialog / FormSection: promoted to public
@42ch/nexus-uiL2 patterns (V1.149 P1). FormDialog is the form-in-modal over the promoted Dialog + Button: caller-owned field controls render inside a native form with the caller'sonSubmit; native validation stays on the caller's field attributes; the dialog owns the title/description header, the right-aligned action bar (secondary cancel / primary submit), an optional inline error slot (role=alert, error-surface tokens, copy caller-owned), and thependingbusy state (actions disabled + spinner; dismissal via X/Escape/overlay and implicit form submit are intercepted while pending, so a slow submit cannot be double-fired, cancelled, or lost to native navigation). FormSection is the shared field group: nativefieldset/legend(heading-16 voice), optional description, the same inline error slot, and a space-4 stacked field layout. - ListPageLayout: promoted to a public
@42ch/nexus-uiL2 pattern (V1.150 P1): the shared list-page chrome behind findings/works/chapters/sessions/schedule/capabilities/strategies/modules/memory pages — Card > CardHeader title/description + actions slot > filters row > results region > load-more footer. Caller-owned copy (title, optionaldescription) and caller-owned slots (filterstoolbar,actionsheader affordance,childrenresults region,footerpagination); the caller composesListStateContainer/Tableinsidechildren(composition, not prop tunneling), so filter/list/pagination state all stay app-side. Voice and surface tokens are inherited from the promoted Card recipe; no query/router/i18n deps. - SettingsSection / SettingRow: promoted to public
@42ch/nexus-uiL2 patterns (V1.150 P2). SettingsSection is the settings section chrome parallel to FormSection minus the error slot: caller-ownedtitle, optionaldescriptionhelper copy, caller-owned cards/forms inchildren; native fieldset/legend group semantics with the shared heading voice. SettingRow is the label/control/hint row inside a section card:labelcopy on the promoted Label,htmlForwires Label → control a11y (the app useId pattern), caller-owned control inchildren, optionalhinthelper copy under the control (the caller owns the control's aria-describedby wiring). - SettingsLayout: promoted to a public
@42ch/nexus-uiL2 pattern (V1.150 P2): the settings section nav rail + outlet region promoted from the app frame. Caller-owned section registry (sections: id/label/icon, i18n resolution stays app-side), caller-owned selection (activeId/onNavigate),hiddenIdsentrance hide-table (AR-15 precedent),navLabelnav aria-label copy, and optional page chrome (title/helper) replacing the frame's showPageChrome mode; section outlet content stays caller-owned children. The typed registry, URL aliasing, and section content renderers stay app-side; no query/router/i18n deps. - ListDetailShell: promoted to a public
@42ch/nexus-uiL2 pattern (V1.150 P3): the fixed-width responsive master/detail split behind findings-page and modules-page — stacks belowlg, 360px detail column atlg(lg:grid-cols-[minmax(0,1fr)_360px]). Both regions are caller-owned slots (list,detail); the shell owns no open/close state — the caller renders the detail panel or a "no selection"EmptyStateindetailand owns selection state, per the contract amendment vs the prototype rev 1 sketch (nodetailOpen/onDetailClose, no drag-resize — no consumer implements either). No query/router/i18n deps. - FieldRow / DetailCard: promoted to public
@42ch/nexus-uiL2 patterns (V1.150 P3), the read-only detail parts family. FieldRow is the label/value pair behind the app-side work-timeline-inspector / timeline-moment-inspector / modules-pageDetailFieldshapes: caller-ownedlabel/valuecopy, and the row renders nothing whenvalueis null/undefined/''(shared null-hide behavior) so callers can map rows over sparse data without guarding each row. DetailCard is the detail panel chrome (findings-page detail Card shape) composing the promotedCard/CardHeader/CardTitle/CardDescription/CardContentprimitives: caller-ownedtitleand optionaldescriptioncopy, FieldRow groups or any caller content in the body. Voice and surface tokens are inherited from the Card recipe; no query/router/i18n deps. (HubCard stays app-side per the plan D5 keep decision: single consumer, no second reuse demand recorded.)
Label htmlFor matches control id; the caller composes helper/error text and aria-describedby. Input/Select/Textarea own only native control styling and invalid state. Required/optional copy, validation, submit and routing are caller-owned. This contract is complete here, with no dependency on a local process document.
Keep all existing canvas/outline/worldkb/timeline/layer/SOUL/annotation tokens and width slots. Canvas is neutral, with a subtle decorative grid (20px pitch, 1.5px dots); node plane, border, selection ring, and semantic spine carry hierarchy. Strategy/outline/worldkb/timeline stay distinct semantic accents. Brief/narrative/moment accents remain separate from status. Keep geometry, node widths and product behavior unchanged. Selection uses accent plus ring/state text; conflict uses label/icon plus red. Local overflow is allowed for intrinsically wide graph specimens.
Existing editor, data-table, context-menu, desktop-window-chrome, app-menu, native-dialog, daemon indicator, connection/setup, finding, memory, reading, SOUL, footer-profile, and wizard frontmatter remain named contracts, not permission to edit those product surfaces. Their values flow through shared CSS where projected. Profile-specific reading title/blockquote/script rules and annotation semantics remain; the active title family is now sans. Setup remains a 480px portrait card capped at min(720px,85vh), horizontal steps, scrollable body, anchored actions. Retained step-panel tokens serve existing consumers but do not authorize restoring a retired vertical wizard.
One pipeline: DESIGN pair → shared token projection → shared Tailwind utilities and existing brand projections → public primitives → Studio and web consumers. Full projection/compiler contract: Studio spec §3.5. Shared :root and .dark are the only theme value layers. Pair view uses isolated documents loading the same entrypoint and CSS, not nested .dark/light-reset subtrees.
All existing CSS names and Tailwind utility keys are retained, including historical structural names under --color-*; do not rename them while web edits are excluded. New missing color, typography and brand-step projections follow the documented mapping. Existing shadow names remain projections of the elevation scale, not duplicated shadow values. brandColors literal values are generated light snapshots; --nexus-brand-* and --color-* resolve per theme.
Retain existing min-h-[180px] StrategyGroupNode floor and border-l-[3px] NodeChromeShell spine as structural exceptions. They are not color tokens. Studio-local comparison viewport dimensions and labeled overflow constraints are composition, not global token families. Do not invent new visual pigments or typography outside the DESIGN pair.