SYS // UI LANGUAGE

The cognitive overlay, in CSS terms

In fiction the interface is Vann's cognitive overlay: chamfered navy panels drawn over a signal-blue grid. This page documents that visual system as design tokens and CSS. Both stylesheets are vendored from the game code (tokens.css from UiThemeTokens, components.css from VindicatorWebStyle), so every demo below renders with the shipped classes rather than a copy of them.

Color tokens

Six base tokens carry the whole interface. Everything else is derived by mixing or fading them.

--bg-deep#060B12Deep navy-black. The space background.
--panel-base#0E1826Panel glass fill.
--signal#83C3FFPrimary structure: rails, headers, hover, grid.
--cassius#F59A56Reserved for CASSIUS comms.
--fold#91A6FFExotic tech: the fold drive.
--online#05C6C1Online, success, pressed.
--nav-ink#D0D0D0Body, data, resting button labels.
--steel-rail#B5CBE0mix(nav-ink, signal 35%), the resting button rail.

Derived tokens are alpha fades of the base set:

--rail:       rgba(131, 195, 255, 0.55);  /* signal @ 55% — the 1px outline everywhere */
--grid-major: rgba(131, 195, 255, 0.11);  /* signal @ 11% — 64px grid lines */
--grid-minor: rgba(131, 195, 255, 0.05);  /* signal @ 5%  — 16px grid lines */
--muted-ink:  rgba(208, 208, 208, 0.50);  /* nav-ink @ 50% — footnotes, version tags */
--steel-rail: #B5CBE0;  /* color-mix(in srgb, var(--nav-ink) 65%, var(--signal)) */

Color semantics: four voices

  • SIGNAL CYAN is the overlay's own voice: structure, rails, headers, anything active or hovered.
  • ONLINE GREEN is confirmation: systems online, success, credits, a pressed button.
  • CASSIUS ORANGE is reserved. Only CASSIUS speaks in orange, so the companion can annotate the interface without appearing to own it.
  • FOLD PERIWINKLE marks fold-drive tech and nothing mundane.

The reservations are strict on purpose. If any element could take any accent, the accents would stop carrying information; as it stands, orange on this screen is always someone talking to you from outside.

Typography

Three working faces plus one reserve, each with one job:

Asimovian: display, titles onlyVINDICATOR // COGNITIVE OVERLAY

Titillium Web: body and chrome copyThe gates are dark. Fold anyway. Body text is the only lowercase voice in the interface.

Maple Mono NF: data and chips (uppercase, letter-spaced)FOLD CHARGE 87% · HULL 100 · CREDITS 4,210

Doto: reserved numeric face (in repo, unused by the HUD yet)00:42:17

The in-game size ladder, in px, top to bottom:

SteppxUsed for
display30screen titles (Asimovian)
dialog title26pause / codex / gallery dialogs
panel title22large panel headings
subheader16section headers
body14default text (Titillium Web)
mono13mono body labels
data12telemetry values, buttons, chips
header11section kickers, CASSIUS comms
muted10footnotes
label9version tags, map labels
micro8map controls, legends, nameplates

Shape: chamfer, never radius

Every surface cuts its corners at 45°. There is no border-radius anywhere in the language. On the web the cut is a clip-path octagon:

clip-path: polygon(
  var(--c) 0,  100% 0,
  100% calc(100% - var(--c)),  calc(100% - var(--c)) 100%,
  0 100%,  0 var(--c)
);

The cut size is per surface class:

PANEL 14px
TOOLTIP 10px
BUTTON 8px
CHIP 6px

Around every cut runs a 1px rail (--rail, signal @ 55%). In-game, ChamferStyleBox strokes the whole octagon, diagonals included. A CSS border cannot: a single element's border is cut away by its own clip-path at the four diagonal segments. So the web version splits by construction. Panels close the octagon by nesting: a clipped .vframe carries the rail color as its background, and 1px of padding reveals it around the clipped .vpanel child. Buttons and chips stay single elements and leave their corners open. At a 6 to 8px cut on a 1px rail that gap is invisible; at panel scale it is not, which is why panels pay for the extra element.

Panel anatomy

SELECTION

This panel renders from the live components.css recipe: a rail frame around a flat panel-base face, with a static signal glow outside the cut.

Three layers, outside in:

  1. The glow is a drop-shadow(0 0 7px …) at signal @ 40% on the frame, so the halo follows the chamfered silhouette instead of the element's rectangle. In the game this glow breathes via shader; the web version holds still.
  2. The rail is the frame's own background, revealed as a 1px line by the frame's padding. It is --rail by default, --cassius under .vframe.cassius, and --signal when the frame is a link under the pointer.
  3. The fill is flat --panel-base. The quiet pass removed the gradient, the top highlight line, and the panel scanlines from the game, and the site follows.

Panels sit on a signal-tinted grid substrate: 16px minor lines at 5%, and every fourth line (64px) major at 11%:

The language allows one decorative motion: a slow additive shimmer band in the signal tint, travelling top to bottom at roughly 20 seconds per pass and 10% alpha. It never strobes. Surfaces opt into it individually, and on this site only the landing hero uses it.

Buttons

Play / Wishlist

The secondary .vbtn (hover it) is a steel hairline over the grid tint. The primary .vbtn.go drops the rail entirely and fills with the accent, so the committed action is marked by fill instead of a brighter outline:

StateRailFillLabel
.vbtn rest--steel-rail--grid-minor--nav-ink
.vbtn hover--signal--grid-majorwhite
.vbtn.gonone--online--bg-deep, 600

The resting rail is desaturated on purpose: mix(nav-ink, signal 35%). Against that steel, the cyan hover registers as a clear step up. Both buttons use a 7px cut with open corners, and both labels are sans; the quiet pass reserved mono for data, and a button label is chrome. Pages may adjust padding and font size for their own scale, as the landing hero does. Colors, rails, and geometry stay the component's.

.vbtn {
  border: 1px solid var(--steel-rail);
  color: var(--nav-ink);
  background: var(--grid-minor);
  clip-path: polygon(7px 0, 100% 0, 100% calc(100% - 7px),
                     calc(100% - 7px) 100%, 0 100%, 0 7px);
}
.vbtn:hover { border-color: var(--signal); color: #fff; background: var(--grid-major); }
.vbtn.go    { border: none; background: var(--online); color: var(--bg-deep); font-weight: 600; }

Chips

SYS // VINDICATOR CREDITS 4,210 CASSIUS // EXTERNAL

Chips are the smallest surface and the only chrome set in mono, because a chip's content is data: a system name, a credit count, a comms tag. The recipe is a 6px cut (--chamfer-chip-sm), 12px caps at 2px letter-spacing, an accent rail at 90%, and the same accent mixed 10% into panel navy for the fill. Scanlines are omitted; at this size they read as noise. A chip makes one decision, its accent, chosen with the .online / .cassius modifiers under the voice rules above. Chips never mint their own colors.

Provenance

The authoritative source is the game code: common/UiThemeTokens.cs (tokens, size ladder, state tables) and common/ChamferStyleBox.cs (the chamfered draw model). The Godot theme resource vindicator_theme.tres is an editor preview mirror, normalized from those tokens at startup. build_docs.cs generates the two stylesheets this page loads from that code, byte-identical to what the in-game state server serves, and vindicator.css adds layout only. When a page needs a chrome look the components cannot give, the knob grows in VindicatorWebStyle and re-vendors; the site does not fork recipes. This page used to keep its own panel styles and drifted a full design pass behind the game, which is why the rule exists.