feat(theme): promote industrial blueprint to the whole shell
Every scene now reads as the same FM doctrine: paper canvas + navy
frame + amber accent, 1px hairlines, square edges, monospace
uppercase labels, no glass, no shadows, no gradients.
WHAT CHANGED
- src/index.css rewritten end-to-end. Doctrinal hex tokens declared
at :root, legacy --bg/--surface/--text/--primary/--border aliases
repointed at doctrine values so existing component classes inherit
the blueprint palette without per-component churn. Global
* { border-radius: 0 } + box-shadow strip-out. All low-opacity
tints via color-mix(in srgb, var(--bp-navy) X%, transparent) so no
rgba() literals survive.
- Topbar redone as a 44px instrument strip: navy brand-lock with
amber mark, uppercase mono tabs, amber-on-paper selected tab,
square link buttons, mode pill with currentColor border.
- Mission Control hero + scenario tab strip + KPI cards retoken
with amber underline on selected.
- Left rail: 1px-bordered KPI grid, queue cards stack as a single
bordered list, agent supervision actions span the full width.
- Inspector: tabbed nav with amber selected, hairline-separated
fields, square rule + run + evidence cards.
- Command palette: paper bg, amber-bordered selected item, mono
caps headings.
- Live API console: paper drawer, mono call rows, amber filter chip,
color-tokenised METHOD_COLOR map.
- Toaster: left-border accent on paper surface.
- Telemetry: navy gauges, mono row, square tick.
- Studio + Settings: shared studio-grid layout — paper panels in a
1px navy grid with no margins between, mono inputs.
- Run History: mono table rows with amber selected filter chip.
- Landing: mono hero, square brand mark, stats strip as one
bordered row, scenario cards in a 1px grid (no glow, no shadow,
no gradient).
- Family accents in synthetic.ts and buildScenarios.ts retoken to
doctrine hex. src/scenarios.json snapshot patched in place.
- Console.tsx METHOD_COLOR map → var(--bp-muted/info/amber/err).
AUDIT
- qa/palette_audit.mjs upgraded: scans 31 source files (.ts/.tsx/
.json + index.css), catches rgb()/rgba()/hsl()/hsla() literals,
and refuses named CSS colors (white/red/blue/...) as background/
color/fill/stroke/border values. Hex regex uses (?![0-9a-fA-F])
lookahead so deploy-id text like '#d3f1a' is not a false positive.
Result: 0 non-doctrinal literals anywhere in src/.
- qa/smoke.mjs + qa/smoke_blueprint.mjs hasText matches converted
to case-insensitive regex because the doctrine uppercases every
user-visible label via text-transform: uppercase.
- qa/snap_all_scenes.mjs captures 9 fresh 1440x900 screenshots
in qa/screenshots/v4/ (landing, mission procurement, mission AR
blueprint, inspector raw, command palette, studio, settings,
run history, mission live with console).
VERIFY
- tsc -b clean
- vite build green (CSS 41 KB / 8 KB gz, JS 851 KB / 230 KB gz)
- vitest 5 files / 24 tests green
- main smoke 27/27, 0 console errors
- blueprint smoke 15/15, 0 console errors
- palette audit clean (31 files)
ORACLE-REVIEWED
Round 1 PASS with <promise>VERIFIED</promise>. Two non-blocking
audit hardening notes landed in this same commit: scan JSON,
catch rgb/hsl/named CSS colors.
Confidence: high
Scope-risk: moderate (theme sweep, all scenes touched)
Not-tested: pixel-level visual diff vs prior theme (Oracle could
not inspect images this round; relied on programmatic checks)
This commit is contained in:
@@ -6,11 +6,11 @@ import { useApp } from "../state/store";
|
||||
import { Close, Refresh, Layers, Pulse } from "./icons";
|
||||
|
||||
const METHOD_COLOR: Record<string, string> = {
|
||||
GET: "var(--text-2)",
|
||||
POST: "#7eb0ff",
|
||||
PUT: "#f5b755",
|
||||
PATCH: "#f5b755",
|
||||
DELETE: "#ff8a8a",
|
||||
GET: "var(--bp-muted)",
|
||||
POST: "var(--bp-info)",
|
||||
PUT: "var(--bp-amber)",
|
||||
PATCH: "var(--bp-amber)",
|
||||
DELETE: "var(--bp-err)",
|
||||
};
|
||||
|
||||
function statusClass(s: number): string {
|
||||
|
||||
@@ -90,7 +90,7 @@ function baseTour(familyId: string): TourStep[] {
|
||||
// ---------- AR · Customer Refund Approval ----------
|
||||
export const arRefund = build(
|
||||
"ar",
|
||||
{ id: "ar", label: "Accounts Receivable", subtitle: "Refunds, credits & collections", accent: "#10b981" },
|
||||
{ id: "ar", label: "Accounts Receivable", subtitle: "Refunds, credits & collections", accent: "#3d6a2c" },
|
||||
"syn-ar-refund-v1",
|
||||
"AR · Customer Refund Approval",
|
||||
"Customer refund · risk-scored · synthetic preview",
|
||||
@@ -161,7 +161,7 @@ export const arRefund = build(
|
||||
// ---------- HCM · New Hire Onboarding ----------
|
||||
export const hcmOnboarding = build(
|
||||
"hcm",
|
||||
{ id: "hcm", label: "People Operations", subtitle: "Onboard · Offboard · Leave", accent: "#a855f7" },
|
||||
{ id: "hcm", label: "People Operations", subtitle: "Onboard · Offboard · Leave", accent: "#1d6f82" },
|
||||
"syn-hcm-onboarding-v1",
|
||||
"HCM · New Hire Onboarding",
|
||||
"Day-0 → Day-30 onboarding · synthetic preview",
|
||||
@@ -223,7 +223,7 @@ export const hcmOnboarding = build(
|
||||
// ---------- GL · Period-End Close ----------
|
||||
export const glClose = build(
|
||||
"gl",
|
||||
{ id: "gl", label: "GL Close", subtitle: "Accruals, reconciliations, journals", accent: "#f59e0b" },
|
||||
{ id: "gl", label: "GL Close", subtitle: "Accruals, reconciliations, journals", accent: "#c46a14" },
|
||||
"syn-gl-close-v1",
|
||||
"GL · Period-End Close",
|
||||
"Period-end close · automated accrual collection · synthetic preview",
|
||||
@@ -283,7 +283,7 @@ export const glClose = build(
|
||||
// ---------- Service Ops · Customer Incident ----------
|
||||
export const svcIncident = build(
|
||||
"service",
|
||||
{ id: "service", label: "Service Operations", subtitle: "Tickets, incidents, support", accent: "#ef4444" },
|
||||
{ id: "service", label: "Service Operations", subtitle: "Tickets, incidents, support", accent: "#a6342a" },
|
||||
"syn-svc-incident-v1",
|
||||
"Service Ops · Customer Incident",
|
||||
"Triage → assign → resolve · synthetic preview",
|
||||
|
||||
+1173
-945
File diff suppressed because it is too large
Load Diff
@@ -217,11 +217,11 @@ interface CandidateBucket {
|
||||
}
|
||||
|
||||
const FAMILIES = [
|
||||
{ id: "procurement", label: "Procurement to Pay", subtitle: "Requisition → PO → 3-way match", accent: "#3b82f6", re: /procure|purchas|pr_to_po|atlas|requisition|po\b/i },
|
||||
{ id: "ar", label: "Accounts Receivable", subtitle: "Refunds, credits & collections", accent: "#10b981", re: /refund|credit|collect|receivable|invoice/i },
|
||||
{ id: "hcm", label: "People Operations", subtitle: "Onboard · Offboard · Leave", accent: "#a855f7", re: /onboard|offboard|hire|hcm|employee|leave|payroll|hr\b/i },
|
||||
{ id: "gl", label: "GL Close", subtitle: "Accruals, reconciliations, journals", accent: "#f59e0b", re: /close|ledger|journal|accrual|reconcil|gl\b/i },
|
||||
{ id: "service", label: "Service Operations", subtitle: "Tickets, incidents, support", accent: "#ef4444", re: /ticket|incident|support|service|case\b/i },
|
||||
{ id: "procurement", label: "Procurement to Pay", subtitle: "Requisition → PO → 3-way match", accent: "#1a2740", re: /procure|purchas|pr_to_po|atlas|requisition|po\b/i },
|
||||
{ id: "ar", label: "Accounts Receivable", subtitle: "Refunds, credits & collections", accent: "#3d6a2c", re: /refund|credit|collect|receivable|invoice/i },
|
||||
{ id: "hcm", label: "People Operations", subtitle: "Onboard · Offboard · Leave", accent: "#1d6f82", re: /onboard|offboard|hire|hcm|employee|leave|payroll|hr\b/i },
|
||||
{ id: "gl", label: "GL Close", subtitle: "Accruals, reconciliations, journals", accent: "#c46a14", re: /close|ledger|journal|accrual|reconcil|gl\b/i },
|
||||
{ id: "service", label: "Service Operations", subtitle: "Tickets, incidents, support", accent: "#a6342a", re: /ticket|incident|support|service|case\b/i },
|
||||
];
|
||||
|
||||
export async function buildLiveScenariosFromApi(signal?: AbortSignal): Promise<{ scenarios: ProcessScenario[]; workItems: WorkItem[]; distinctDefs: number }> {
|
||||
@@ -298,7 +298,7 @@ export async function buildLiveScenariosFromApi(signal?: AbortSignal): Promise<{
|
||||
id: `extra-${scenarios.length}`,
|
||||
label: e.graph.process_definition.display_name || e.graph.process_definition.name,
|
||||
subtitle: `${e.bucket.cases.length} live cases`,
|
||||
accent: "#64748b",
|
||||
accent: "#4a5b80",
|
||||
},
|
||||
e.bucket.key,
|
||||
e.graph,
|
||||
|
||||
+1
-8138
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user