diff --git a/src/app/globals.css b/src/app/globals.css index c23933d..759d74f 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -9,6 +9,12 @@ --nav-height: 3.5rem; --ops-accent: #0e7490; --ops-accent-light: rgba(14, 116, 144, 0.08); + --mission-accent: #67e8f9; + --mission-accent-strong: #0891b2; + --mission-accent-soft: rgba(103, 232, 249, 0.12); + --mission-panel: rgba(8, 15, 28, 0.72); + --mission-panel-strong: rgba(4, 10, 20, 0.9); + --mission-line: rgba(148, 163, 184, 0.16); --navigator-accent: #0891b2; --navigator-accent-light: rgba(8, 145, 178, 0.12); --navigator-accent-soft: rgba(34, 211, 238, 0.08); @@ -59,6 +65,7 @@ html { scroll-behavior: smooth; + scroll-padding-top: calc(var(--nav-height) + 4.5rem); } body { @@ -68,6 +75,7 @@ body { background-image: radial-gradient(circle at top, rgba(251, 191, 36, 0.18), transparent 32%), radial-gradient(circle at right 18%, rgba(8, 145, 178, 0.14), transparent 26%), + radial-gradient(circle at left 22%, rgba(103, 232, 249, 0.14), transparent 24%), linear-gradient(180deg, #fcf8ef 0%, #f4efe7 52%, #ebe5d9 100%); font-family: var(--font-geist-sans), Arial, Helvetica, sans-serif; } @@ -195,6 +203,49 @@ a { box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.85); } +.app-shell-status { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 0.75rem; + padding: 0.85rem 1.5rem 0; +} + +.app-shell-status__item { + display: flex; + flex-direction: column; + gap: 0.2rem; + border-radius: 1.2rem; + border: 1px solid rgba(8, 145, 178, 0.14); + background: + linear-gradient(180deg, rgba(255, 255, 255, 0.72), rgba(255, 255, 255, 0.48)); + padding: 0.85rem 1rem; + transition: + transform 0.2s ease, + border-color 0.2s ease, + box-shadow 0.2s ease; +} + +.app-shell-status__item:hover { + transform: translateY(-1px); + border-color: rgba(8, 145, 178, 0.26); + box-shadow: 0 14px 28px rgba(14, 116, 144, 0.08); +} + +.app-shell-status__label { + font-size: 0.6875rem; + font-weight: 700; + letter-spacing: 0.14em; + text-transform: uppercase; + color: rgba(8, 145, 178, 0.78); +} + +.app-shell-status__value { + font-size: 0.9375rem; + font-weight: 600; + letter-spacing: -0.01em; + color: rgba(15, 23, 42, 0.82); +} + /* ── Operations-center accent utilities ───────────────────── */ .ops-badge { @@ -389,6 +440,142 @@ a { .app-nav__meta { display: none; } + + .app-shell-status { + grid-template-columns: 1fr; + padding-inline: 1rem; + } +} + +/* ── Mission-console shared shell styles ──────────────────── */ + +.mission-console-shell { + position: relative; + min-height: 100vh; + overflow: hidden; + background: + radial-gradient(circle at top left, rgba(103, 232, 249, 0.16), transparent 28%), + radial-gradient(circle at 88% 14%, rgba(56, 189, 248, 0.18), transparent 24%), + linear-gradient(180deg, #07101c 0%, #0d1728 42%, #101f33 100%); +} + +.mission-console-shell__glow { + pointer-events: none; + position: absolute; + inset: 0; + background: + radial-gradient(circle at 18% 8%, rgba(103, 232, 249, 0.12), transparent 22%), + radial-gradient(circle at 84% 24%, rgba(14, 165, 233, 0.11), transparent 20%), + radial-gradient(circle at 76% 88%, rgba(251, 191, 36, 0.08), transparent 18%); +} + +.mission-panel { + position: relative; + overflow: hidden; + border: 1px solid var(--mission-line); + border-radius: 2rem; + background: + linear-gradient(180deg, rgba(17, 24, 39, 0.72), rgba(6, 11, 20, 0.92)); + padding: 1.5rem; + box-shadow: + 0 28px 100px rgba(2, 6, 23, 0.3), + inset 0 1px 0 rgba(255, 255, 255, 0.04); + backdrop-filter: blur(18px); +} + +.mission-panel--hero { + background: + radial-gradient(circle at top right, rgba(103, 232, 249, 0.1), transparent 34%), + linear-gradient(135deg, rgba(10, 18, 34, 0.92), rgba(7, 12, 22, 0.72)); +} + +.mission-panel--contrast { + background: + linear-gradient(180deg, rgba(5, 10, 20, 0.92), rgba(8, 16, 30, 0.84)); +} + +.mission-panel--window { + min-height: 100%; + padding: 1.5rem; +} + +.mission-kicker { + font-size: 0.75rem; + font-weight: 700; + letter-spacing: 0.28em; + text-transform: uppercase; + color: rgba(165, 243, 252, 0.92); +} + +.mission-kicker--muted { + color: rgba(148, 163, 184, 0.84); +} + +.mission-chip { + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 9999px; + padding: 0.4rem 0.8rem; + font-size: 0.6875rem; + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +.mission-chip--stable { + border: 1px solid rgba(52, 211, 153, 0.24); + background: rgba(16, 185, 129, 0.16); + color: rgb(167, 243, 208); +} + +.mission-chip--watch { + border: 1px solid rgba(251, 191, 36, 0.24); + background: rgba(245, 158, 11, 0.16); + color: rgb(253, 230, 138); +} + +.mission-chip--risk { + border: 1px solid rgba(248, 113, 113, 0.24); + background: rgba(239, 68, 68, 0.16); + color: rgb(254, 202, 202); +} + +.mission-rail { + display: grid; + gap: 1rem; + list-style: none; + margin: 0; + padding: 0; +} + +.mission-rail__item { + position: relative; + border-radius: 1.45rem; + border: 1px solid rgba(148, 163, 184, 0.14); + background: rgba(15, 23, 42, 0.46); + padding: 1rem 1rem 1rem 1.25rem; +} + +.mission-rail__item::before { + content: ""; + position: absolute; + top: 1.15rem; + bottom: 1.15rem; + left: 0; + width: 3px; + border-radius: 9999px; + background: linear-gradient( + 180deg, + rgba(103, 232, 249, 0.85) 0%, + rgba(56, 189, 248, 0.35) 100% + ); +} + +@media (min-width: 640px) { + .mission-panel { + padding: 2rem; + } } /* ── Queue-monitor & parcel-hub shared styles ────────────── */ diff --git a/src/app/layout.tsx b/src/app/layout.tsx index a2dd03d..eb8f95c 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -19,11 +19,12 @@ export const metadata: Metadata = { template: "%s | Archive Signals", }, description: - "Operational dashboards, navigator handoff surfaces, experiment registries, and field guides for archive-driven teams.", + "Operational dashboards, mission-console launch surfaces, experiment registries, and field guides for archive-driven teams.", }; const navLinks = [ { href: "/", label: "Home" }, + { href: "/mission-console", label: "Mission Console" }, { href: "/navigator-hub", label: "Navigator Hub" }, { href: "/team-directory", label: "Team Directory" }, { href: "/archive-browser", label: "Archive" }, @@ -36,6 +37,24 @@ const navLinks = [ { href: "/status-board", label: "Status Board" }, ] as const; +const shellStatusLinks = [ + { + href: "/mission-console", + label: "Mission Console", + value: "Launch branch active", + }, + { + href: "/operations-center", + label: "Ops Center", + value: "Shared command feed", + }, + { + href: "/navigator-hub", + label: "Navigator Hub", + value: "Cross-route overlap", + }, +] as const; + export default function RootLayout({ children, }: Readonly<{ @@ -63,13 +82,21 @@ export default function RootLayout({ ))} -

Navigator overlap active

+

Mission overlap active

+
+ {shellStatusLinks.map((item) => ( + + {item.label} + {item.value} + + ))} +
{children} diff --git a/src/app/mission-console/page.tsx b/src/app/mission-console/page.tsx new file mode 100644 index 0000000..8799d7b --- /dev/null +++ b/src/app/mission-console/page.tsx @@ -0,0 +1,443 @@ +import type { Metadata } from "next"; +import Link from "next/link"; + +export const metadata: Metadata = { + title: "Mission Console", + description: + "Shared-shell mission console for launch readiness windows, operator assignments, and live decision pressure.", +}; + +const consoleStats = [ + { + label: "Decision horizon", + value: "18 min", + detail: "Command wants the branch recommendation locked before the relay handoff.", + }, + { + label: "Staged teams", + value: "4 crews", + detail: "Recovery, relay, thermal, and dock support are all held in pre-commit posture.", + }, + { + label: "Open watchpoints", + value: "3", + detail: "Thermal drift, relay confidence, and dock-clearance timing still need active coverage.", + }, +]; + +const launchWindows = [ + { + name: "Window A", + span: "05:40-06:05 UTC", + posture: "Primary go branch", + detail: + "Weather is clean and relay capacity is within margin, but the dock chief needs one more clean check before commit.", + tone: "stable", + }, + { + name: "Window B", + span: "06:35-06:58 UTC", + posture: "Watch branch", + detail: + "Safer thermal profile, but it consumes the reserve crew rotation and compresses downstream cargo sequencing.", + tone: "watch", + }, + { + name: "Window C", + span: "07:20-07:52 UTC", + posture: "Recovery-only fallback", + detail: + "Best margin for dock recovery, but it breaks the planned uplink cadence and forces a customer-facing delay notice.", + tone: "risk", + }, +] as const; + +const commandStreams = [ + { + title: "Flight readiness", + owner: "N. Ibarra", + summary: + "Primary branch is green if the final relay confirmation lands before T-12.", + items: [ + "Autopilot rollback rehearsal completed", + "Dock-side abort path revalidated after the overnight sim", + "Payload thermal buffer remains above minimum threshold", + ], + }, + { + title: "Ground orchestration", + owner: "R. Malik", + summary: + "Load teams are staged, but the reserve forklift lane is still borrowed by maintenance.", + items: [ + "Cold-chain pallets moved into priority order", + "Reserve dock crew can cover Window B without overtime", + "West gate access remains under escort restrictions", + ], + }, + { + title: "Communications", + owner: "S. Okafor", + summary: + "Command channel is stable, but the customer update draft still depends on the final branch call.", + items: [ + "Pager tree dry run finished at 04:58 UTC", + "Public status note drafted for hold or fallback branches", + "Regional leads subscribed to the command relay digest", + ], + }, +]; + +const decisionRail = [ + { + checkpoint: "T-18", + title: "Lock the recommended branch", + detail: + "Flight and dock leads need a single branch so the console can collapse the non-primary call paths.", + }, + { + checkpoint: "T-14", + title: "Confirm relay confidence", + detail: + "If confidence stays below threshold, command shifts to Window B without reopening cargo sequencing.", + }, + { + checkpoint: "T-09", + title: "Publish operator handoff note", + detail: + "Every crew receives the same go, hold, or fallback language before the lift-cap sequence begins.", + }, + { + checkpoint: "T-04", + title: "Freeze public-facing updates", + detail: + "External status copy moves from draft to live so the customer desk stops chasing command for wording.", + }, +]; + +const operatorAssignments = [ + { + lane: "Recovery", + owner: "M. Patel", + state: "Stable", + note: "Abort corridor is clean and reserve crew pickup time is under six minutes.", + }, + { + lane: "Relay", + owner: "A. Svensson", + state: "Watch", + note: "One final validation cycle remains before the high-confidence uplink threshold is restored.", + }, + { + lane: "Dock", + owner: "T. Nguyen", + state: "Risk", + note: "Lift-cap sequencing depends on the escort release clearing before T-10.", + }, +]; + +const escalationLog = [ + "04:46 UTC: Recovery lead reopened Window C only as a contingency branch after escort delays at west gate.", + "05:02 UTC: Relay monitoring recovered packet loss, but confidence still needs a second clean interval.", + "05:11 UTC: Customer desk drafted staggered status language for go and hold outcomes.", + "05:19 UTC: Command requested a unified branch note so downstream teams stop planning against multiple windows.", +]; + +const toneClasses = { + stable: "mission-chip mission-chip--stable", + watch: "mission-chip mission-chip--watch", + risk: "mission-chip mission-chip--risk", +} as const; + +export default function MissionConsolePage() { + return ( +
+
+
+
+ + + Landing routes + + + Shared shell overlap + +
+ +
+
+
+
+

Issue 220 / Mission Console

+

+ Bring launch windows, crew posture, and shared-shell pressure + into one command surface. +

+

+ This route intentionally overlaps the app shell: shared nav, + landing-page spotlight, and global styling all move with the + mission console so merge conflicts hit the common entry + points instead of staying isolated to a leaf route. +

+
+ + +
+ + +
+
+ +
+
+
+

+ Launch windows +

+

+ Stack the mission branches by timing, margin, and downstream + cost. +

+
+

+ The console keeps all three windows visible so command can choose + the least-damaging branch without losing track of dock, relay, or + customer impact. +

+
+ +
+ {launchWindows.map((window) => ( +
+
+
+

+ {window.name} +

+

+ {window.span} +

+
+ + {window.posture} + +
+

+ {window.detail} +

+
+ ))} +
+
+ +
+
+
+
+

+ Command streams +

+

+ Keep every crew in the same frame before the branch locks. +

+
+

+ Each stream shows the owner, the posture summary, and the three + facts most likely to move the recommendation. +

+
+ +
+ {commandStreams.map((stream) => ( +
+
+
+

+ {stream.title} +

+

+ {stream.summary} +

+
+

+ Owner: {stream.owner} +

+
+
    + {stream.items.map((item) => ( +
  • + {item} +
  • + ))} +
+
+ ))} +
+
+ + +
+ +
+
+
+
+

+ Operator lanes +

+

+ Hand each lane a clear owner, state, and reason to escalate. +

+
+ +
+ {operatorAssignments.map((assignment) => ( +
+
+
+

+ {assignment.lane} +

+

+ {assignment.owner} +

+
+ + {assignment.state} + +
+

+ {assignment.note} +

+
+ ))} +
+
+ + +
+
+
+
+ ); +} diff --git a/src/app/page.tsx b/src/app/page.tsx index 6c37aa1..85a0008 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,10 +1,10 @@ import Link from "next/link"; import { teamGroups, getDirectoryMetrics } from "@/data/team-directory"; -const navigatorHubHighlights = [ - "New navigator hub route with linked intervention rails across queue, parcel, and command views", +const missionConsoleHighlights = [ + "New mission console route with launch windows, crew posture, and a decision rail in one shared surface", "Shared landing-page overlap that rewrites the featured hero around the new route", - "Global shell styling updates that intentionally modify the common app nav, footer, and theme tokens", + "Global shell styling updates that intentionally modify the common app nav, footer, and launch-status strip", ]; const notebookHighlights = [ @@ -70,30 +70,30 @@ export default function Home() { return (
-
+

- Issue 216 / Navigator Hub + Issue 220 / Mission Console

- Coordinate shared app-shell handoffs from a dedicated navigator - hub. + Open the mission console to manage launch branches, crew + posture, and shared app-shell pressure.

- The navigator hub is the new conflict surface for issue 216: - one route that pulls together lane pressure, handoff timing, - and shared-shell entry points while also rewriting common - landing and global presentation files. + Issue 220 intentionally overlaps the shared shell: the mission + console brings launch windows, operator lanes, and escalation + timing into one route while also rewriting the landing page, + nav chrome, and global presentation tokens.