'use client' import { useEffect, useState } from 'react' import { Badge } from '@/components/ui/badge' import { BarChart } from '@/components/ui/bar-chart' import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert' import { LineChart } from '@/components/ui/line-chart' import { Panel, PanelContent, PanelHeader, PanelTitle } from '@/components/ui/panel' import { ProgressRing } from '@/components/ui/progress-ring' import { StatCard } from '@/components/ui/stat-card' import { StatusGrid, type SystemEntry } from '@/components/ui/status-grid' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import { Terminal, type TerminalLine } from '@/components/ui/terminal' // Interface base: layout + visual treatment rebuilt from the scificn-ui Mission Control // showcase (src/app/_pages/showcase/mission-control-content.tsx in baxy5/scificn-ui), with // placeholder SpaceWanderer content — no game logic yet. Single player, no auth, by design. function useNarrow(threshold = 900): boolean { const [narrow, setNarrow] = useState( () => typeof window !== 'undefined' && window.innerWidth < threshold ) useEffect(() => { const handle = () => setNarrow(window.innerWidth < threshold) window.addEventListener('resize', handle, { passive: true }) return () => window.removeEventListener('resize', handle) }, [threshold]) return narrow } function now(): string { return new Date().toLocaleTimeString('en-GB', { hour12: false }) } // ── Placeholder content (no game logic — real values land with the turn engine) ── const shipSystems: SystemEntry[] = [ { name: 'REACTOR', status: 'ACTIVE', detail: '94.2%' }, { name: 'LIFE SUPPORT', status: 'ACTIVE' }, { name: 'NAV COMPUTER', status: 'SCANNING' }, { name: 'WEAPONS', status: 'OFFLINE' }, { name: 'COMMS', status: 'ACTIVE' }, ] const bayOutput = [ { label: 'PWR', value: 14 }, { label: 'NAV', value: 9 }, { label: 'COM', value: 6 }, { label: 'WPN', value: 3 }, { label: 'LSS', value: 12 }, { label: 'ENG', value: 11 }, { label: 'BAY', value: 7 }, { label: 'MED', value: 5 }, ] const hullTrack = [100, 98, 97, 96, 94, 95, 92, 90, 89, 87] const hullLabels = hullTrack.map((_, i) => `T-${hullTrack.length - 1 - i}`) const encounters = [ { name: 'DERELICT FREIGHTER', when: 'T-07:14', id: '#E-102' }, { name: 'PIRATE SKIRMISH', when: 'T-22:40', id: '#E-103' }, { name: 'ANOMALY FIELD', when: 'T-48:12', id: '#E-104' }, ] const shipData = [ { label: 'TOTAL MODULES', value: '34' }, { label: 'HULL INTEGRITY', value: '87%' }, { label: 'REACTOR OUTPUT', value: '94.2%' }, { label: 'CREW ACTIVE', value: '3 / 6' }, { label: 'SECTOR', value: '7G // DRIFT LANE' }, { label: 'DRIFT VELOCITY', value: '0.4 KM/S' }, { label: 'TURN', value: '12' }, ] const logLines: TerminalLine[] = [ { type: 'system', text: 'SPACEWANDERER // INITIALIZING SHIP SYSTEMS...', timestamp: now() }, { type: 'output', text: 'HULL SCAN COMPLETE — INTEGRITY 87%', timestamp: now() }, { type: 'output', text: 'REACTOR OUTPUT STABLE AT 94.2%', timestamp: now() }, { type: 'output', text: 'CREW MANIFEST LOADED — 3 ACTIVE PERSONNEL', timestamp: now() }, { type: 'warn', text: 'WEAPONS OFFLINE — MODULE NOT INSTALLED', timestamp: now() }, { type: 'system', text: 'ALL SYSTEMS NOMINAL. AWAITING FIRST TURN.', timestamp: now() }, ] export function MissionControl() { const narrow = useNarrow() const [tick, setTick] = useState(0) useEffect(() => { const id = setInterval(() => setTick((t) => t + 1), 1000) return () => clearInterval(id) }, []) const timeStr = new Date().toLocaleTimeString('en-GB', { hour12: false }) return (
{/* ── HEADER ── */}
◄ SHIP │

SPACEWANDERER

{!narrow && ( // SHIP STATUS // CREW MANIFEST )}
{!narrow && ( SHIP NOMINAL )} SECTOR SCAN {timeStr}
{/* ── BODY ── */}
{/* STAT CARDS — placeholder ship readouts */}
{/* 3-COLUMN GRID */}
{/* ── LEFT: SHIP SYSTEMS + VESSEL METRICS ── */}
SHIP SYSTEMS
4 ONLINE
VESSEL METRICS
{[ { label: 'HULL INTEGRITY', note: 'last scan T-02' }, { label: 'REACTOR OUTPUT', note: 'idle cycle' }, { label: 'CREW ROSTER', note: 'of 6 berths' }, ].map((item) => (
{item.label}
{item.note}
))}
{/* ── CENTER: OPERATIONS TABS ── */}
OPERATIONS // SHIP COMMAND
SYS NOMINAL
SYSTEMS NEXT MISSION LOG HULL TRACK {/* SYSTEMS TAB */}
{[ { label: 'TOTAL MODULES', value: 34 }, { label: 'ONLINE', value: 29 }, { label: 'EFFICIENCY', value: '85%' }, ].map((s) => (
{s.label}
{s.value}
))}
{/* NEXT MISSION TAB */}
ENCOUNTER #E-102 — DERELICT FREIGHTER Placeholder briefing. Real encounter resolution lands with the turn engine.
{[ { label: 'DESTINATION', value: 'SECTOR 7G // DRIFT LANE' }, { label: 'ETA', value: 'T-07:14 (PLACEHOLDER)' }, { label: 'THREAT LEVEL', value: 'LOW — UNMANNED' }, { label: 'CARGO MANIFEST', value: 'UNKNOWN' }, ].map((item) => (
{item.label}
{item.value}
))}
{/* LOG TAB */} {/* HULL TRACK TAB */}
{/* ── RIGHT: UPCOMING ENCOUNTERS + SHIP DATA ── */}
UPCOMING ENCOUNTERS
{encounters.length} QUEUED
{encounters.map((enc, i) => { const isNext = i === 0 const isLast = i === encounters.length - 1 return (
{enc.name}
{enc.when} // {enc.id}
{isNext ? 'NEXT' : 'SCHED'}
) })}
SHIP DATA
{shipData.map((item, i) => (
{item.label} {item.value}
))}
{/* ── FOOTER ── */}
) }