import { useEffect, useRef, useState, type FormEvent } from 'react' import { ArrowRight, BrainCircuit, Check, ChevronRight, Database, Eye, EyeOff, LockKeyhole, LogIn, MapPinned, Menu, MousePointer2, ShieldCheck, Sparkles, UserRound, X, } from 'lucide-react' import { login, loginAsGuest, type AuthSession } from '../../services/api/auth' import { formatAuthError } from '../../lib/authError' import '../../styles/landing.css' import { GeoIntelMark } from '../brand/GeoIntelBrand' import { ItWorxSignature } from '../brand/ItWorxSignature' interface LandingPageProps { onAuthenticated: (session: AuthSession) => void serviceError?: string | null guestAccessEnabled?: boolean } const capabilityItems = [ { icon: MapPinned, number: '01', title: 'Eén kaartgerichte werkruimte', description: 'Selecteer een gebied in België of de Belgische Noordzee en werk verder vanuit dezelfde ruimtelijke context.', }, { icon: Database, number: '02', title: 'Bronnen blijven herkenbaar', description: 'Autoriteit, meetmoment, dekking, CRS en beperkingen blijven zichtbaar in plaats van achter één generieke kaartlaag te verdwijnen.', }, { icon: ShieldCheck, number: '03', title: 'Kwaliteit vóór resultaat', description: 'Vergelijk referentie- en kandidaatgegevens, controleer bewijs en exporteer pas wanneer de context klopt.', }, ] const workflowSteps = [ ['Selecteer', 'Kies een officiële grens of teken zelf een gebied.'], ['Controleer', 'Bekijk dekking, bronkwaliteit en toepasselijke beperkingen.'], ['Analyseer', 'Meet toestand, evolutie of modelresultaten op de kaart.'], ['Onderbouw', 'Bewaar controleerbare resultaten en provenance.'], ] export function LandingPage({ onAuthenticated, serviceError = null, guestAccessEnabled = false, }: LandingPageProps): JSX.Element { const [username, setUsername] = useState('') const [password, setPassword] = useState('') const [pendingAction, setPendingAction] = useState<'operator' | 'guest' | null>(null) const [authError, setAuthError] = useState(null) const [showPassword, setShowPassword] = useState(false) const [menuOpen, setMenuOpen] = useState(false) const usernameRef = useRef(null) const accessPanelRef = useRef(null) const busy = pendingAction !== null useEffect(() => { document.body.classList.add('landing-body') return () => document.body.classList.remove('landing-body') }, []) const submitLogin = async (event: FormEvent) => { event.preventDefault() setPendingAction('operator') setAuthError(null) try { const session = await login(username.trim(), password) onAuthenticated(session) } catch (error) { setAuthError(formatAuthError(error, 'Aanmelden is momenteel niet gelukt. Controleer de verbinding en probeer opnieuw.')) } finally { setPendingAction(null) } } const submitGuestLogin = async () => { setMenuOpen(false) setPendingAction('guest') setAuthError(null) accessPanelRef.current?.scrollIntoView({ behavior: 'smooth', block: 'center' }) try { const session = await loginAsGuest() onAuthenticated(session) } catch (error) { setAuthError(formatAuthError(error, 'De gastdemo kon niet worden voorbereid. Probeer het over enkele ogenblikken opnieuw.')) } finally { setPendingAction(null) } } const focusLogin = () => { setMenuOpen(false) accessPanelRef.current?.scrollIntoView({ behavior: 'smooth', block: 'center' }) window.requestAnimationFrame(() => usernameRef.current?.focus()) } return (
Ga naar toegang
GeoIntel Atlas Workbench
{guestAccessEnabled ? ( ) : null}

Gebouwd voor controleerbare analyse

Geen los dashboard, maar één samenhangende GIS-keten

De interface volgt de manier waarop een onderbouwde ruimtelijke analyse werkelijk tot stand komt.
{capabilityItems.map(({ icon: Icon, number, title, description }) => (
{number}

{title}

{description}

))}

Een helder werkproces

Vier stappen, zonder de technische context te verliezen

{workflowSteps.map(([title, description], index) => (
{String(index + 1).padStart(2, '0')}

{title}

{description}

))}
GeoIntel Atlas Workbench

Operationele GIS-analyse voor België en de Belgische Noordzee.

© {new Date().getFullYear()} GeoIntel · Professionele operator- en demonstratieomgeving

) }