manifest.sys — feature index

Feature Map

Canonical index of every screen, panel, overlay & sub-view · feature_map() in the dev console

Use this when you need to answer where does this feature live?, which component renders this pane?, or is there already a place for this, or am I creating a new one? The companion markdown lives at feature-map.md; the styling source of truth is style-guide.md + /style-guide/.

00 · Overview

Top-level routing happens in src/App.tsx and is driven by state.screen (one of 'title' | 'map' | 'docked' | 'denied' | 'transit' | 'gameover', defined in src/state/types.ts). Persistent chrome stacks on every non-title screen; overlays and modals stack on top.

Quick reference

ResourcePath
Top-level routingsrc/App.tsx
Game state shapesrc/state/types.ts
Reducersrc/state/reducer.ts
Static game datasrc/data/
Pure game logicsrc/engine/
Component CSSco-located: src/components/Foo.tsx + Foo.css
Style specstyle-guide.md, style-guide/index.html (/style-guide/)

01 · Window Taxonomy

Every visible UI surface, grouped by its window class. One row per pane — tabs inside a tabbed window are listed individually, not folded into the parent.

ClassDefinition
ScreenFull-canvas window. Mutually exclusive with other screens. Driven by state.screen.
PaneOne tab inside a tabbed screen.
Sub-surfaceInternal region of a screen with its own chrome (rails, strips, rosters).
OverlayFloats above the active screen, persists across screens, dismissed by the user.
ModalFloats above, blocks input, decision-driven dismissal.
Persistent chromeAlways rendered, not a window.

1a · Screens

PaneFilestate.screenGame systems housed
TitleScreensrc/components/TitleScreen.tsxtitleMain menu — new game, load, options. Bypasses TopBar / overlays.
StarMap (map mode)src/components/StarMap.tsxmapTravel / pathfinding, scan / survey, plot routing. Sub-surfaces in §1c.
StarMap (transit mode)src/components/StarMap.tsxtransitSame SVG canvas as map, but the TransitConsole bottom strip replaces FlightPlanStrip. Ship sprite animates the edge.
DockPanelsrc/components/DockPanel.tsxdockedTwo-column docked view — wraps StationPanel (left) + ShipPanel (right). Tabs in §1b.
DeniedPanelsrc/components/DeniedPanel.tsxdeniedHostile / story-locked station rejection. Faction system surfaces error here.
GameOverPanelsrc/components/GameOverPanel.tsxgameoverEnd-of-run summary.
Note legacy  src/components/TransitScreen.tsx exists but live transit is rendered by StarMap in transit mode. Don't add to it.

1b · Panes (tabs)

StationPanel  — left column of DockPanel

File: src/components/StationPanel.tsx. Each tab's visibility depends on station.shipyard, station.outfitting, etc.

PaneTab keyGame systems housed
StationPanel.infoinfoStation details, description, environment (atmosphere / temp / gravity), faction info, gatherables.
StationPanel.commscommsMission board — accept / hand-in story steps. Faction rep gating.
StationPanel.marketmarketBuy / sell goods. Row click opens GoodInfoModal.
StationPanel.outfittingoutfittingInstall / uninstall modules; warehouse parking.
StationPanel.shipyardshipyardBrowse and buy ships.
StationPanel.crewcrewHire / dismiss crew.

ShipPanel  — right column of DockPanel

File: src/components/ShipPanel.tsx.

PaneTab keyGame systems housed
ShipPanel.shipshipStats only. Cargo / fuel / crew / engine / scanner / hull readouts, mass & speed, crew roster. Inline subtext mentions module names but does not render the schematic.
ShipPanel.schematicschematicModules only. Renders ShipSchematic — slot grid, drag-drop install, warehouse. Single home for module visualisation + installation.
ShipPanel.cargocargoInventory list with quantities + value.
Don't add ShipSchematic to the ship tab. Modules belong on schematic; the ship tab is a stat readout. Both used to render the schematic — the duplication was confusing.

StoryPanel  — global overlay (L key)

File: src/components/StoryPanel.tsx.

PaneTab keyGame systems housed
StoryPanel.missionsmissionsActive steps, ready-to-hand-in, chain progress, story-flag unlocks.
StoryPanel.codexcodexPublic FIELD RECORDS (visit-unlocked lore dossiers) + story-gated CLASSIFIED intel (secrets, sealed until their reveal flag fires).
Missions and Codex live in this global overlay only — they used to also be tabs in ShipPanel; that duplication was removed. Don't add them back.

1c · Sub-surfaces (Star Map zones)

StarMap.tsx is a multi-zone shell, not a single pane. Each surface is a defined chrome region with its own role.

PaneSub-componentClass rootGame systems housed
StarMap.FilterChipsFilterChips.starmap-corner-hud, .starmap-filtersInteractive faction-filter chips (All / per-faction / Neutral / Hostile). Dims non-matching nodes.
StarMap.ZoomControlsinline.starmap-zoomZoom in/out, percentage, reset (RST), roster toggle ().
StarMap.IntelPanelIntelPanel.starmap-intelSelected-station survey readout (scan-gated rows, survey-progress bar, SCAN / CENTER / DOCK). Persists until Esc or close.
StarMap.SectorRosterSectorRoster.starmap-rosterCollapsible searchable list of known stations, sorted by distance. Click selects + plots + focuses.
StarMap.IdleHintIdleHint.starmap-idle-hintTiny hint pill when nothing is plotted.
StarMap.FlightPlanStripFlightPlanStrip.starmap-flightWaypoint trail, 5-stat totals, next-leg row, JUMP button. Survives Intel close — Esc again clears.
StarMap.TransitConsoleTransitConsole.starmap-transit-consoleOrigin → destination, long progress bar with ship marker, ETA / elapsed, risk pips, event-window state, drive status.
StarMap.StationNode (×N)StationNode.starmap-nodePer-station glyph: ring (category vs. faction), pulse on current, dashed ring on plotted, hostile / dimmed / unknown variants.
Bottom-zone exclusivity — exactly one of IdleHint / FlightPlanStrip / TransitConsole renders at a time.

1d · Overlays

PaneComponentTriggerGame systems housed
Story / MissionsStoryPanelL key or [L] MISSIONS buttonStory progression, codex. See §1b for tabs.
Controls / helpControlsOverlay? or / keyKeyboard + mouse reference.
Esc precedence on the map — Intel panel → plotted route → controls / story overlay (handled in App.tsx).

1e · Modals

PaneComponentTriggerGame systems housed
EventEventModalReducer sets state.activeEventRandom encounters. Blocks input; 1 / 2 / 3 to pick a response.
ArrivalArrivalModalAfter transit → map with currentStationId setArrival flow — DOCK / MINE / EXPLORE / STAY IN ORBIT. Faction-rep gating.
Good infoGoodInfoModalClick a market row in StationPanel.marketGood details + lore tip.
Scan toastinline .starmap-message in StarMapReducer sets state.message after SCAN_STATION etc.Brief confirmation. Top-centre, auto-dismisses.

1f · Persistent Chrome

Rendered on top of every non-title screen. Not windows — never call them "panels".

ElementComponentFileGame systems housed
Top barTopBarsrc/components/TopBar.tsxDay · credits · fuel (segmented bar) · hull (segmented bar) · location · [M] DOCK (map only) · SAVE · MENU.
Missions toggleinline .story-global-btnsrc/App.tsx[L] MISSIONS — opens the Story overlay.
Notification toastNotificationToastsrc/components/NotificationToast.tsxGame-event toasts surfaced from the reducer.
Error boundaryErrorBoundarysrc/components/ErrorBoundary.tsxWraps the shell — renders a fallback on thrown error.
Scanlines + small-viewport warninginlinesrc/App.tsxPure visual overlay; no logic.

1g · Proposed — new homes for orphaned systems

These game systems exist in the engine / data but have no canonical window today — they're either scattered inline across unrelated panels or invisible after the moment they fire. Each row below is a proposed new pane; none of these are implemented yet. Documenting them as the agreed home prevents the next ad-hoc inline render from deepening the scatter.

Proposed paneStatusWhat it would showSource
StoryPanel.factions proposed All four factions at a glance, each with current rep, rank, trading modifiers, key stations, story chains gated by them. data/factions.ts, state.factionRep; reuse getRepRank / getRepModifiers / getRepProgress from data/factions.ts.
StoryPanel.log proposed Reverse-chronological event history — events fired, choices taken, outcomes. Currently events vanish after RESOLVE_EVENT. Needs reducer to keep a bounded state.eventHistory array on each RESOLVE_EVENT.
StoryPanel.gathering (optional, lower priority) proposed Resources gathered, cooldowns, eligible nodes. state.gatheringHistory (new) + station.gatherables lookups.
PriorityStoryPanel.factions is the highest-value addition (rep already exists; players can't see all standings at once). StoryPanel.log is medium. StoryPanel.gathering is optional.
When you implement one of these, move the row from §1g into §1b in the same change.

02 · Shared Components

Canonical implementations of UI patterns that appear in multiple panes. Located at src/components/shared/. Do not duplicate these inline — import from shared/. If you find a pattern rendered in 2+ panes with cosmetic drift, promote it here.

ComponentClass prefixConsumersRenders
ObjectiveList.obj-*StoryPanel · StationPanel.comms · ShipPanelMission objective checklist with progress + done states.
CodexList.codex-*StoryPanel.codexPublic FIELD RECORDS — discovered lore dossiers + undiscovered titles list.
ClassifiedList.classified-*StoryPanel.codexStory-gated CLASSIFIED intel — revealed secret bodies + sealed teaser rows. Gated by secrets.ts reveal flags; in-game only, never on public pages.
MissionStepCard.mission-step-*StoryPanel.missionsMission step card — chain badge, title, description, objectives, reward. Variants: default / ready-handin / auto-complete / new-mission.
ChainRow.mission-chain-*StoryPanel.missionsChain progress row with status pill (LOCKED / IN PROGRESS / COMPLETE), faction, step count, optional prereq.
StoryFlagRow.mission-flag-*StoryPanel.missionsSingle unlock row in the UNLOCKS section.
StatBar.stat-bar-*TopBar (fuel + hull) · ShipPanel (cargo / fuel / crew / speed / scanner / hull)Segmented stat indicator. Supports fixed colour, tier mode (auto low/mid/ok colour by pct), and blinkOnCritical (≤ 10%). Replaces the previous FuelBar / HullBar / Bar.
Promotion rule — when the same data is rendered with cosmetic drift in 2+ components, extract a shared/Foo.tsx + Foo.css with a single foo-* class prefix, replace the duplicates, and add a row to this table.

03 · Engine Modules

Pure modules under src/engine/. No React imports. Each pane consumes zero or more of these to compute display values.

ModuleOwnsConsumers
travel.tsPath-finding, distance, fuel cost, station lookupStarMap, FlightPlan, Transit
economy.tsPricing, stock, supply/demand modifiersStationPanel (market)
shipStats.tsEngine speed, fuel efficiency, cargo capacity, scanner depth, cargo riskTopBar, StarMap, ShipPanel
events.tsEvent rolls + risk evaluationStarMap (transit), EventModal
environment.tsThermal / radiation hazardsreducer.applyArrivalProcessing
story.tsStory step graph, station accessibilityStarMap, StationPanel.comms, StoryPanel
objectives.tsDerives per-step objective listsshared/ObjectiveList
hexGrid.tsHex maths legacy

04 · Static Data

All under src/data/. Loaded at build time. Every entity follows the same convention: one JSON file per entity, aggregated into an array by a thin .ts wrapper using import.meta.glob. No data is inline in TypeScript.

WrapperJSON globDrives
stations.tsstations/*.jsonEvery node on the star map; market exports/imports; gatherables.
ships.tsships/*/info.jsonShipyard inventory + archetypes + gameplay stats.
modules.tsmodules/*.jsonOutfitting catalogue (engines, fuel tanks, scanners, etc.).
goods.tsgoods/*.jsonTradeable items + categories.
factions.tsfactions/*.jsonFaction list, colour, reputation thresholds. Also exports rep-tier logic.
crew.tscrew/*.jsonHireable crew templates.
story.tsstory/*.jsonMission chains, objectives, dialogue.
lore.tslore/*.jsonPublic codex dossiers (FIELD RECORDS) unlocked by visits / events. Exports both LORE_ENTRIES (array) and LORE_BY_ID (Record).
secrets.tssecrets/*.jsonStory-gated CLASSIFIED codex entries. Each has a revealFlag; isSecretRevealed() checks it against storyFlags. Bodies lifted from STARWIND_LORE.md §10.
stationInventory.tsPure filter logic. Resolves station services against storyFlags + factionRep.
Rule: static data lives in *.json. If you find inline data in a .ts file under src/data/, split it into per-entity JSON files and reduce the .ts to an import.meta.glob wrapper. The existing wrappers are the template.

05 · Keyboard Map

Handled in App.tsx (handleKey) unless noted. ? / / always toggles ControlsOverlay.

KeyScreen(s)Action
MmapDock at current station
MdockedUndock back to map
K · S · UmapAlias for dock
JmapJump to plotted destination (handled in StarMap.tsx)
RdockedRefuel
LanywhereToggle Story / Missions overlay
1 · 2 · 3EventModalPick response option
EscEventModalDecline (encounters & opportunities only)
EscmapClose Intel → clear route → close overlay (cascading)
? · /anywhereToggle ControlsOverlay
`non-titleDEBUG_CHEAT action dev

The canonical list rendered to the player lives in src/components/ControlsOverlay.tsx. Keep this table and that array in sync.

06 · Screen Transitions

                ┌──────────┐
                │  title   │
                └────┬─────┘
                     │ start / load
                     ▼
                ┌──────────┐                ┌─────────────┐
   undock ◀────┤   map    ├─── jump ─────▶ │   transit   │
                │          │                │             │
                │   ▲      │ complete       │  (StarMap   │
                │   └──────┼────────────────┤   in        │
                │          │                │   transit   │
                │  dock    │                │   mode)     │
                └────┬─────┘                └─────────────┘
                     │
                     ▼
                ┌──────────┐
                │  docked  │
                └────┬─────┘
                     │
              hostile / locked
                     ▼
                ┌──────────┐
                │  denied  │
                └──────────┘

       hull == 0 / catastrophic event from any state ▶  gameover

07 · When to Update This File

You must update this file (and its markdown twin feature-map.md) when you:

You do not need to update this file for: