import React, { useState, useEffect } from 'react'; interface TimelineEvent { date: string; event: string; type: 'start' | 'data' | 'milestone' | 'operation' | 'end'; } interface Document { name: string; file: string; category: string; } interface CampaignManifest { timeline: TimelineEvent[]; documents: Document[]; } export default function CampaignDocs() { const [manifest, setManifest] = useState(null); const [activeTab, setActiveTab] = useState<'timeline' | 'docs'>('timeline'); useEffect(() => { fetch('/seismic/api/docs/manifest') .then(r => r.json()) .then(setManifest) .catch(console.error); }, []); if (!manifest) return
Chargement...
; const typeColors: Record = { start: '#10b981', data: '#3b82f6', milestone: '#f59e0b', operation: '#8b5cf6', end: '#ef4444' }; const typeIcons: Record = { start: '๐Ÿš€', data: '๐Ÿ“Š', milestone: '๐ŸŽฏ', operation: 'โš™๏ธ', end: '๐Ÿ' }; return (
{/* Header */}

๐Ÿ“š Campagne SeaKESP - Sรจte 2020

Documentation, chronologie et ressources de la campagne OBN

{/* Tabs */}
{/* Timeline Tab */} {activeTab === 'timeline' && (

Chronologie de la campagne

{/* Timeline line */}
{manifest.timeline.map((event, idx) => (
{/* Timeline dot */}
{/* Event card */}
{typeIcons[event.type]} {event.date}

{event.event}

))}
{/* Stats */}
46 jours
Durรฉe totale
345 fichiers
RAW collectรฉs
~800h
Enregistrements
)} {/* Documents Tab */} {activeTab === 'docs' && (

Documents de rรฉfรฉrence

{['Sources', 'Acquisition', 'Specifications', 'Geometry', 'Maps'].map(category => { const categoryDocs = manifest.documents.filter(d => d.category === category); if (categoryDocs.length === 0) return null; const categoryIcons: Record = { Sources: '๐ŸŽบ', Acquisition: '๐Ÿ“‹', Specifications: '๐Ÿ“–', Geometry: '๐Ÿ—บ๏ธ', Maps: '๐Ÿ—บ๏ธ' }; return ( ); })}
)}
); }