<h1 align="center">
<a href="https://prompts.chat">
How to customize a template viewer for a specific investigation. The agent reads the project data and derives palette, intro, typography, and personality.
Loading actions...
<a href="https://prompts.chat">
TypeScript and ESLint rules that MUST be followed when creating, modifying, or reviewing any file under apps/frontend/, including .ts, .tsx, .js, and .jsx files. Also apply when discussing frontend linting, type safety, or ESLint configuration.
risks
How to customize a template viewer for a specific investigation. The agent reads the project data and derives palette, intro, typography, and personality.
The default_style and presentation block in investigation.json tell you the visual world. Derive CSS variables from them:
| Art Style | --accent | --accent-bright | --bg-primary | Feel |
|---|---|---|---|---|
| dark-cinematic-military | #4ADE80 (green) | #6EE7A0 | #060608 | Military HUD, night ops |
| maritime-cartographic | #7BB8D4 (ocean) | #9DD0E8 | #080E14 | Naval intelligence, deep water |
| ink-wash-intelligence-dossier | #C44B4B (crimson) | #D46B6B | #0D0D0D | Field dossier, redacted |
| archival-documentary | #C9A96E (sepia) | #DBC48E | #0A0908 | Historical archive |
| sepia-documentary | #B8956A (warm sepia) | #D4B08C | #0A0906 | War photography |
| noir-gritty | #E0E0E0 (silver) | #FFFFFF | #050505 | High contrast, minimal |
| warm-painterly | #C89B3C (brass) | #E8B84B | #0F0F1A | Cozy, inviting |
| retro-propaganda | #CC3333 (bold red) | #FF4444 | #1A0A0A | Soviet poster, political |
| cyberpunk-neon | #00FFCC (cyan) | #33FFD4 | #0A0A14 | Neon, digital |
If presentation.accent_color exists in investigation.json, use that directly — it's the creator's explicit choice.
If presentation.background_color exists, use that for --bg-primary.
The intro badge sets the emotional context. Rules:
border: 1px solid var(--accent-dim)letter-spacing: 0.5em; text-transform: uppercaseopacity: 0.8 so it doesn't dominateEach moment can have a title from moment.metadata.stage or a generated section name from the act_structure in knowledge.json.
If moments have stage/act metadata, display as small-caps amber header above the narration. If they don't, derive from act_structure by matching panel ranges to act boundaries.
From metadata.json cross_references[]:
METADATA.cross_references.forEach(ref => {
// ref.project_id, ref.connection, ref.type
// Display as clickable pill in end screen
// Format: project_id → human-readable title (replace hyphens with spaces, title case)
});
Step by step:
investigation.json — get title, subtitle, default_style, presentation, moments countknowledge.json — get entity count (for review panel richness)metadata.json — get cross_references, geographic_focus, investigation_typeprojects/{id}/index.html:root CSS variables based on palette derivation above<title> to investigation title<title> to the investigation name