docs(style): document R2/Farsight design system and align frontend neutral tokens
Some checks are pending
Holocron Frontend CI / lint-and-test (push) Waiting to run

- Add docs/STYLE.md describing the .settings/style reference, per-surface
  reproduction, and how holocron-frontend / holocron-sim docs map to it
- Link the design system from README.md and AGENTS.md
- Nudge holocron-frontend default-dark neutral tokens to reference values
  (bg-primary, text-primary/secondary/muted); keep tactical accents
This commit is contained in:
Josh Belke 2026-06-02 01:03:02 -04:00
commit 29e5bb3a8d
5 changed files with 124 additions and 5 deletions

View file

@ -6,10 +6,11 @@
{"_type":"issue","id":"holo-d8j.4","title":"git mv 7 component directories (holochron-* → holocron-*)","description":"After sed pass: git mv holochron-{cesium,frontend,keycloak,keycloak-postgresql,proxy,sim,trigger} → holocron-*. Preserves history. Run §5.3 special filename check after; rename leftovers with git mv individually.","acceptance_criteria":"7 dirs renamed; §5.3 grep clean; single commit.","status":"closed","priority":1,"issue_type":"task","owner":"joshua@innovationhub-act.org","created_at":"2026-05-25T12:47:12Z","created_by":"Joshua Belke","updated_at":"2026-05-28T13:31:13Z","closed_at":"2026-05-28T13:31:13Z","close_reason":"Directories already renamed by user (holochron-* → holocron-*); git detected renames via similarity index when staged.","dependencies":[{"issue_id":"holo-d8j.4","depends_on_id":"holo-d8j","type":"parent-child","created_at":"2026-05-25T08:47:12Z","created_by":"Joshua Belke","metadata":"{}"},{"issue_id":"holo-d8j.4","depends_on_id":"holo-d8j.3","type":"blocks","created_at":"2026-05-25T08:47:58Z","created_by":"Joshua Belke","metadata":"{}"}],"dependency_count":1,"dependent_count":2,"comment_count":0}
{"_type":"issue","id":"holo-d8j.1","title":"Pre-flight: checkpoint r2d2 WIP, cut refactor/holocron-rename from dev","description":"Before any rename work: (1) commit or stash r2d2 WIP (staged .beads/issues.jsonl, modified vite.config.ts, untracked docker-compose.yml, .settings/kubeconfig.r2d2, holochron-frontend/.dual-graph/, holochron-frontend/CLAUDE.md). (2) git checkout dev \u0026\u0026 git pull --rebase. (3) git checkout -b refactor/holocron-rename. (4) make down + clean target/ + clean .dual-graph/ per plan §3.","acceptance_criteria":"On branch refactor/holocron-rename off latest dev; working tree clean; build artifacts cleaned.","status":"closed","priority":1,"issue_type":"task","owner":"joshua@innovationhub-act.org","created_at":"2026-05-25T12:47:11Z","created_by":"Joshua Belke","updated_at":"2026-05-28T13:31:12Z","closed_at":"2026-05-28T13:31:12Z","close_reason":"Branch cut deferred; user proceeded directly on r2d2 branch with the rename.","dependencies":[{"issue_id":"holo-d8j.1","depends_on_id":"holo-d8j","type":"parent-child","created_at":"2026-05-25T08:47:11Z","created_by":"Joshua Belke","metadata":"{}"}],"dependency_count":0,"dependent_count":1,"comment_count":0}
{"_type":"issue","id":"holo-d8j","title":"[epic] Refactor HALOCHRON → HOLOCRON site-wide rename","description":"Site-wide rename of all case variants of HALOCHRON/holochron → HOLOCRON/holocron per .settings/features/feature-refactor-holocron.md. ~3,177 text occurrences, 7 directory renames, 2 submodule path entries. Parent dir rename done by user after this epic completes.","status":"open","priority":1,"issue_type":"epic","owner":"joshua@innovationhub-act.org","created_at":"2026-05-25T12:46:52Z","created_by":"Joshua Belke","updated_at":"2026-05-25T12:46:52Z","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"holo-jpa.3","title":"Build Holocron data mapping, dynamic layers, and Kubernetes configuration","description":"Implement the data-mapping and deployment configuration portion of the Holocron plan. Make layer/source mappings configurable from YAML and visible in the frontend, then package the app for Kubernetes as holocron at holocron.r2d2.office.ilab.zone.\n\nScope:\n- Add LayerDefinition/source mapping types and normalize YAML source config.\n- Derive display layers from source config plus existing UAV/USV/UUV/UGV/Contacts/Fused defaults.\n- Update layer filtering, ControlPanel, ReportPanel, and SettingsModal to support dynamic source-backed layers.\n- Add a frontend configuration UI to inspect/toggle sources and layer visibility.\n- Create deployment artifacts under deploy/holocron with Deployment, Service, Ingress, ConfigMap, Secret references, NetworkPolicy, values-production.yaml, and README.\n- Use holocron spelling in Kubernetes resource names, labels, image names, hostnames, and deployment docs.\n- Configure production host holocron.r2d2.office.ilab.zone and WS_PUBLIC_URL=wss://holocron.r2d2.office.ilab.zone/ws.\n- Keep the local YAML object fallback and local compose validation path working.","acceptance_criteria":"- Dynamic layers can be created from source config and toggled in the app.\n- Existing UAV/USV/UUV/UGV/Contacts/Fused behavior is preserved.\n- Settings exposes source/layer configuration without showing secrets.\n- Helm or Kubernetes manifests render deployable holocron resources for production.\n- Production values include holocron.r2d2.office.ilab.zone and runtime-mounted source config.\n- Tests cover layer mapping/reporting and source configuration behavior.\n- Deployment docs explain local validation, required secrets, install/upgrade, and rollback.","spec_id":"docs/plans/2026-05-24-holocron-k8s-mqtt-r2d2-integration.md","status":"in_progress","priority":1,"issue_type":"feature","assignee":"Joshua Belke","owner":"joshua@innovationhub-act.org","created_at":"2026-05-24T22:50:06Z","created_by":"Joshua Belke","updated_at":"2026-06-02T04:52:15Z","started_at":"2026-06-02T04:52:15Z","labels":["data-mapping","holocron","k8s","layers"],"dependencies":[{"issue_id":"holo-jpa.3","depends_on_id":"holo-jpa","type":"parent-child","created_at":"2026-05-24T18:50:06Z","created_by":"Joshua Belke","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"holo-jpa.3","title":"Build Holocron data mapping, dynamic layers, and Kubernetes configuration","description":"Implement the data-mapping and deployment configuration portion of the Holocron plan. Make layer/source mappings configurable from YAML and visible in the frontend, then package the app for Kubernetes as holocron at holocron.r2d2.office.ilab.zone.\n\nScope:\n- Add LayerDefinition/source mapping types and normalize YAML source config.\n- Derive display layers from source config plus existing UAV/USV/UUV/UGV/Contacts/Fused defaults.\n- Update layer filtering, ControlPanel, ReportPanel, and SettingsModal to support dynamic source-backed layers.\n- Add a frontend configuration UI to inspect/toggle sources and layer visibility.\n- Create deployment artifacts under deploy/holocron with Deployment, Service, Ingress, ConfigMap, Secret references, NetworkPolicy, values-production.yaml, and README.\n- Use holocron spelling in Kubernetes resource names, labels, image names, hostnames, and deployment docs.\n- Configure production host holocron.r2d2.office.ilab.zone and WS_PUBLIC_URL=wss://holocron.r2d2.office.ilab.zone/ws.\n- Keep the local YAML object fallback and local compose validation path working.","acceptance_criteria":"- Dynamic layers can be created from source config and toggled in the app.\n- Existing UAV/USV/UUV/UGV/Contacts/Fused behavior is preserved.\n- Settings exposes source/layer configuration without showing secrets.\n- Helm or Kubernetes manifests render deployable holocron resources for production.\n- Production values include holocron.r2d2.office.ilab.zone and runtime-mounted source config.\n- Tests cover layer mapping/reporting and source configuration behavior.\n- Deployment docs explain local validation, required secrets, install/upgrade, and rollback.","notes":"K8s packaging + deploy DONE (2026-06-02): created Helm chart deploy/holocron (Chart.yaml, values.yaml, values.override.yaml, templates: deployment/service/ingress/configmap/secret/mosquitto/networkpolicy/NOTES). Built+pushed git.office.ilab.zone/raid/r2d2-holocron:sha-fab7c7c. Deployed to ns 'holocron': frontend + in-cluster mosquitto, nginx Ingress holocron.r2d2.office.ilab.zone (/ws-\u003e9002, /-\u003e3001). Verified via port-forward: /health 200 mqtt=connected, / 200, /api/config wsUrl=wss://.../ws, NO frame headers (iframe-safe). Reconfigured .settings/deploy skill+env for holocron. REMAINING for this bead: source registry types, multi-MQTT subs, dynamic layers, Settings source UI, R2-D2 REST adapter (plan Tasks 1-7). BLOCKER for public access: office edge must register holocron.r2d2 (Caddy/174.77.95.250) like flora/farsight.","spec_id":"docs/plans/2026-05-24-holocron-k8s-mqtt-r2d2-integration.md","status":"in_progress","priority":1,"issue_type":"feature","assignee":"Joshua Belke","owner":"joshua@innovationhub-act.org","created_at":"2026-05-24T22:50:06Z","created_by":"Joshua Belke","updated_at":"2026-06-02T05:01:32Z","started_at":"2026-06-02T04:52:15Z","labels":["data-mapping","holocron","k8s","layers"],"dependencies":[{"issue_id":"holo-jpa.3","depends_on_id":"holo-jpa","type":"parent-child","created_at":"2026-05-24T18:50:06Z","created_by":"Joshua Belke","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"holo-jpa.2","title":"Integrate R2-D2 data and feed APIs","description":"Implement the R2-D2 external API portion of the Holocron plan once endpoint details are available. Model R2-D2 APIs as configurable server-side data sources so reference data and feeds can be enabled, disabled, cached, transformed, and rendered as app layers without exposing credentials to the browser.\n\nScope:\n- Add r2d2-rest source kind support.\n- Add server-side R2-D2 client and source cache.\n- Integrate data API endpoints for bases, ports, ICAOs, and related reference data.\n- Integrate feeds API endpoints such as critical underwater infrastructure.\n- Read base URLs and tokens from environment/Kubernetes secrets.\n- Return redacted source/auth status in config endpoints.\n- Surface stale/error state without blocking app startup.\n\nDetails still needed:\n- Base URLs for local/staging/production.\n- Auth method and required headers.\n- Example payloads for bases, ports, ICAOs, and feed items.\n- Pagination/filtering/cache semantics.\n- Refresh cadence and payload size expectations.\n- Feed geometry and display metadata requirements.","acceptance_criteria":"- R2-D2 credentials are server-only and redacted in all browser-visible config.\n- Enabled R2-D2 REST sources can be fetched through a server endpoint such as /api/sources/:sourceId/data.\n- Bases, ports, ICAOs, and feed items are transformed into map-ready assets or overlays with source/layer metadata.\n- API failure produces visible source error/stale state and does not crash the app.\n- Unit tests cover R2-D2 response transforms using fixture payloads.\n- Implementation is blocked until API contracts and sample payloads are provided.","spec_id":"docs/plans/2026-05-24-holocron-k8s-mqtt-r2d2-integration.md","status":"open","priority":1,"issue_type":"feature","owner":"joshua@innovationhub-act.org","created_at":"2026-05-24T22:49:55Z","created_by":"Joshua Belke","updated_at":"2026-05-24T22:49:55Z","labels":["api","feeds","holocron","r2d2"],"dependencies":[{"issue_id":"holo-jpa.2","depends_on_id":"holo-jpa","type":"parent-child","created_at":"2026-05-24T18:49:55Z","created_by":"Joshua Belke","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"holo-jpa.1","title":"Implement configurable MQTT source integrations","description":"Implement the MQTT portion of the Holocron source plan. Replace the single hard-coded MQTT topic derived from MQTT_TOPIC_PREFIX with a source registry that can subscribe to multiple enabled topic groups such as demo, synthetic, exercise, and production. Keep local Mosquitto compatibility while allowing production to point at the cluster/R2-D2 broker.\n\nScope:\n- Add config/sources/config.yaml entries for MQTT sources.\n- Serve normalized source config from /api/config and /api/config/sources.\n- Subscribe server.cjs to all enabled MQTT topics.\n- Include sourceId, sourceLabel, and layer metadata in WebSocket asset_update messages.\n- Update publish allowlisting to use per-source publish_prefix values.\n- Preserve the existing single-topic local dev behavior as a fallback.","acceptance_criteria":"- /api/config/sources exposes demo, synthetic, exercise, and production-capable MQTT source definitions.\n- server.cjs subscribes to every enabled MQTT source topic after broker connection.\n- WebSocket clients receive source metadata for MQTT messages.\n- Publishing is only allowed to configured source publish prefixes.\n- Local docker compose with Mosquitto still works without a custom sources config.\n- Tests cover source config parsing and WebSocket topic subscription behavior.","spec_id":"docs/plans/2026-05-24-holocron-k8s-mqtt-r2d2-integration.md","status":"open","priority":1,"issue_type":"feature","owner":"joshua@innovationhub-act.org","created_at":"2026-05-24T22:49:44Z","created_by":"Joshua Belke","updated_at":"2026-05-24T22:49:44Z","labels":["holocron","k8s","mqtt"],"dependencies":[{"issue_id":"holo-jpa.1","depends_on_id":"holo-jpa","type":"parent-child","created_at":"2026-05-24T18:49:43Z","created_by":"Joshua Belke","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"holo-jpa","title":"Deploy holochron to RAID-K8-ILAB cluster","description":"Stand up holochron in the RKE2 cluster (kubeconfig: .settings/kubeconfig.r2d2). Reachable internally at holocron.r2d2.office.ilab.zone. LoadBalancer via kube-vip (pool 192.168.3.120-220 + .10). Target LB IP: 192.168.3.120. See child issues for breakdown.","status":"open","priority":1,"issue_type":"epic","owner":"joshua@innovationhub-act.org","created_at":"2026-05-22T23:08:38Z","created_by":"Joshua Belke","updated_at":"2026-05-22T23:08:38Z","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"holo-81a","title":"Align styling to .settings/style reference (docs + token nudges)","description":"Add docs/STYLE.md documenting the R2/Farsight design system in .settings/style, link from README.md and AGENTS.md, and nudge clearly-drifted structural tokens in holocron-frontend toward the reference palette. No brand reskin.","status":"closed","priority":2,"issue_type":"task","owner":"joshua@innovationhub-act.org","created_at":"2026-06-02T05:01:22Z","created_by":"Joshua Belke","updated_at":"2026-06-02T05:02:57Z","closed_at":"2026-06-02T05:02:57Z","close_reason":"Added docs/STYLE.md, linked from README/AGENTS; nudged frontend neutral tokens to reference palette","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"holo-d8j.11","title":"DNS cutover: holochron-{dev,stg}.ilab.zone with TTL pre-lowering (HOL-5)","description":"Cut DNS for holochron-dev.ilab.zone and holochron-stg.ilab.zone. BEFORE cutover: drop TTL to 300s at least 24h ahead so the switch propagates fast. Keep old hostname as CNAME → new during transition, drop later. Coordinate with infra owner.","acceptance_criteria":"TTL lowered 24h+ pre-cutover; new hostnames resolve; old hostnames CNAME to new with sunset date documented.","status":"open","priority":2,"issue_type":"task","owner":"joshua@innovationhub-act.org","created_at":"2026-05-25T12:47:51Z","created_by":"Joshua Belke","updated_at":"2026-05-25T12:47:51Z","dependencies":[{"issue_id":"holo-d8j.11","depends_on_id":"holo-d8j","type":"parent-child","created_at":"2026-05-25T08:47:50Z","created_by":"Joshua Belke","metadata":"{}"},{"issue_id":"holo-d8j.11","depends_on_id":"holo-d8j.8","type":"blocks","created_at":"2026-05-25T08:48:01Z","created_by":"Joshua Belke","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"holo-d8j.12","title":"MQTT topic prefix change with dual-publish window (HOL-6)","description":"Plan §7 row 3 was hard cutover from r2d2/halochron/* to r2d2/holocron/*. Better: dual-publish during transition window so subscribers migrate without coordination. Update holochron-cesium/server.js, public/app.js, test-publisher to publish on BOTH prefixes until consumers confirm cutover, then retire old prefix. Also purge mosquitto retained messages on old topics post-cutover.","acceptance_criteria":"Dual-publish active in dev/stg; consumer cutover tracked; old prefix retired and retained messages purged.","status":"open","priority":2,"issue_type":"task","owner":"joshua@innovationhub-act.org","created_at":"2026-05-25T12:47:51Z","created_by":"Joshua Belke","updated_at":"2026-05-25T12:47:51Z","dependencies":[{"issue_id":"holo-d8j.12","depends_on_id":"holo-d8j","type":"parent-child","created_at":"2026-05-25T08:47:50Z","created_by":"Joshua Belke","metadata":"{}"},{"issue_id":"holo-d8j.12","depends_on_id":"holo-d8j.8","type":"blocks","created_at":"2026-05-25T08:48:01Z","created_by":"Joshua Belke","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"holo-d8j.10","title":"SonarQube: rename project key + migrate history (HOL-4)","description":"SonarQube project key 'project-team-holochron-holochron' needs rename. Decide: migrate project (preserves history) vs create new + archive old. Update sonar-project.properties on refactor branch. Coordinate with CI/CD owner.","acceptance_criteria":"New project key live; CI publishes to it; history strategy documented.","status":"open","priority":2,"issue_type":"task","owner":"joshua@innovationhub-act.org","created_at":"2026-05-25T12:47:30Z","created_by":"Joshua Belke","updated_at":"2026-05-25T12:47:30Z","dependencies":[{"issue_id":"holo-d8j.10","depends_on_id":"holo-d8j","type":"parent-child","created_at":"2026-05-25T08:47:30Z","created_by":"Joshua Belke","metadata":"{}"},{"issue_id":"holo-d8j.10","depends_on_id":"holo-d8j.8","type":"blocks","created_at":"2026-05-25T08:48:00Z","created_by":"Joshua Belke","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0}

View file

@ -47,6 +47,18 @@ cp -rf source dest # NOT: cp -r source dest
- `apt-get` - use `-y` flag
- `brew` - use `HOMEBREW_NO_AUTO_UPDATE=1` env var
## Styling & Design System
UI styling follows the **R2 / Farsight** aesthetic. The canonical reference is
`.settings/style/` — read its `README.md` first. `docs/STYLE.md` documents the
palette, fonts, and how each app maps to the reference.
When adding or editing UI, take colors/fonts/radii/shadows from
`.settings/style/`, not from a nearby component. Do **not** reskin either app's
brand (`holocron-frontend` tactical accents, `holocron-sim/apps/docs` green Sim
brand) to the R2 teal without an explicit decision — those divergences are
intentional and recorded in `docs/STYLE.md`.
<!-- BEGIN BEADS INTEGRATION v:1 profile:minimal hash:7510c1e2 -->
## Beads Issue Tracker

View file

@ -82,6 +82,14 @@ Flow: `.env` → Compose injects into container → server’s `process.env.MAPT
Shortly describe the technical stack of the project.
### Design system
UI styling follows the **R2 / Farsight** aesthetic. The canonical reference
(palette, fonts, Fumadocs + Scalar themes) lives in
[`.settings/style/`](.settings/style/README.md); see [`docs/STYLE.md`](docs/STYLE.md)
for how the project's apps map to it and which tokens are aligned vs. intentionally
divergent.
## Visible endpoints
Describe all exposed endpoints of the project.

96
docs/STYLE.md Normal file
View file

@ -0,0 +1,96 @@
# Styling & Design System
The canonical design reference for this project lives in
[`.settings/style/`](../.settings/style/README.md). That directory is a
self-contained, copy-paste export of the **R2 / Farsight** aesthetic and is the
source of truth — read its `README.md` first, then the per-surface files.
> When in doubt about a color, font, radius, shadow, or spacing token, take the
> value from `.settings/style/`, not from an existing component.
## The aesthetic (R2 / Farsight)
Dark navy (`#0a0e1a`) surfaces with glassy panels, a **teal** accent
(`#2dd4bf`), slate text, a teal→blue→violet brand bar across the top, subtle
grid texture behind articles, **Inter** for UI and **JetBrains Mono** for code.
Core palette (full token list in `.settings/style/tailwind/tailwind.css`):
| Token | Value | Use |
| ------------------ | --------------------------- | ---------------------------- |
| `--r2-bg` | `#0a0e1a` | base background (navy) |
| `--r2-bg-secondary`| `#111827` | raised surface |
| `--r2-border` | `rgba(255,255,255,0.06)` | hairline borders |
| `--r2-text` | `#f1f5f9` | primary text (slate-100) |
| `--r2-text-secondary`| `#94a3b8` | secondary text (slate-400) |
| `--r2-text-muted` | `#64748b` | muted text (slate-500) |
| `--r2-accent` | `#2dd4bf` | teal accent / interactive |
| `--r2-cyan` | `#22d3ee` | brand bar |
| `--r2-blue` | `#3b82f6` | brand bar |
| `--r2-violet` | `#8b5cf6` | brand bar |
| `--r2-online` | `#10b981` | status: online |
| `--r2-offline` | `#ef4444` | status: offline |
| `--r2-degraded` | `#f59e0b` | status: degraded |
Fonts: `Inter` (UI) / `JetBrains Mono` (code). Radii: `6 / 10 / 14px`.
Shadows: `--r2-card`, `--r2-card-hover`, `--r2-glow`.
## Reproducing each surface
The reference is split by surface — copy the matching folder into a new app:
- **`fumadocs/`** — the docs-site theme (Fumadocs 16.x + Tailwind v4, CSS-first,
no `tailwind.config.js`). `global.css` is the whole theme; the root layout
must carry `class="dark"` + `class="r2-theme"` or you get unstyled defaults.
- **`scalar/`** — the API-reference GUI. `scalar.tsx` mirrors the R2 palette into
Scalar's `--scalar-*` variables; `scalar-settings.md` documents every theme and
airgap setting (telemetry off, AI agent disabled, no proxy).
- **`tailwind/tailwind.css`** — framework-agnostic Tailwind v4 sheet exposing the
palette as utilities (`bg-r2-bg`, `text-r2-accent`, `rounded-r2-md`,
`font-r2-mono`, `shadow-r2-card`, …). Put `class="dark"` (or `r2-theme`) on
`<html>`.
Full step-by-step instructions are in `.settings/style/README.md`.
## How this project's apps map to the reference
The two front-facing apps predate this export and each keep their own brand. They
are **aligned in spirit, not pixel-identical** — that is intentional. Do not
reskin either brand to teal without an explicit decision.
### `holocron-frontend` (Vite + React, Tailwind **v3**)
Tactical NATO operations UI. Uses a `[data-theme]` CSS-variable system
(`src/index.css`) with a default dark theme plus `light` and `netbird` variants.
Its **neutral/structural** tokens are aligned to the reference; its **accent /
status** colors are deliberately tactical-branded (tactical green, alert red,
warning amber) and are *not* the R2 teal.
| `holocron-frontend` var (default dark) | Reference token | Status |
| -------------------------------------- | ---------------------- | ----------------- |
| `--bg-primary: #0a0e1a` | `--r2-bg #0a0e1a` | aligned |
| `--text-primary: #f1f5f9` | `--r2-text #f1f5f9` | aligned |
| `--text-secondary: #94a3b8` | `--r2-text-secondary` | aligned |
| `--text-muted: #64748b` | `--r2-text-muted` | aligned |
| `--accent-cyan: #39d0d8` | `--r2-accent #2dd4bf` | tactical (kept) |
| `--accent-green: #3fb950` | `--r2-online #10b981` | tactical (kept) |
| `--accent-red: #f85149` | `--r2-offline #ef4444` | tactical (kept) |
| `--warning-amber: #ffb627` | `--r2-degraded #f59e0b`| tactical (kept) |
> Note: this app is on **Tailwind v3** (`tailwind.config.js`), while the
> reference is Tailwind v4 (CSS-first). The palette transfers; the build wiring
> does not — don't copy `.settings/style/fumadocs/postcss.config.mjs` here.
### `holocron-sim/apps/docs` (Next.js + Fumadocs)
The simulator documentation site. Carries its own **green "Sim" brand**
(`--color-fd-primary: #33c482`) with **Geist** fonts and the Fumadocs *neutral*
preset — a deliberate divergence from the R2/Farsight teal+Inter docs theme in
`.settings/style/fumadocs/`. If this site is ever re-themed to R2, the reference
`fumadocs/global.css` is the drop-in target.
## Changelog
- 2026-06-02: Created. Nudged `holocron-frontend` neutral tokens
(`--bg-primary`, `--text-primary/-secondary/-muted`) to the reference values;
documented intentional divergences (tactical accents; Sim-green docs brand).

View file

@ -4,13 +4,15 @@
/* Design tokens (for components still using var() until fully migrated) */
:root {
--bg-primary: #0a0e14;
/* Neutral/structural tokens aligned to the R2/Farsight reference
(.settings/style). Accent/status colors below stay tactical-branded. */
--bg-primary: #0a0e1a;
--bg-secondary: #151b23;
--bg-tertiary: #1e2730;
--border-color: #2d3848;
--text-primary: #e6edf3;
--text-secondary: #8b949e;
--text-muted: #6e7681;
--text-primary: #f1f5f9;
--text-secondary: #94a3b8;
--text-muted: #64748b;
--accent-cyan: #39d0d8;
--accent-green: #3fb950;
--accent-yellow: #d29922;