Some checks failed
ci/woodpecker/push/integration Pipeline failed
ci/woodpecker/push/main Pipeline failed
CI/CD Pipeline / Go Tests (push) Has been cancelled
CI/CD Pipeline / Python Tests (push) Has been cancelled
CI/CD Pipeline / Website Tests (push) Has been cancelled
CI/CD Pipeline / Linting (push) Has been cancelled
CI/CD Pipeline / Security Scan (push) Has been cancelled
CI/CD Pipeline / Docker Build & Push (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Has been cancelled
Security Scanning / Dependency Vulnerability Scan (push) Has been cancelled
Security Scanning / Go Security Scan (push) Has been cancelled
Security Scanning / Python Security Scan (push) Has been cancelled
Security Scanning / Node.js Security Scan (push) Has been cancelled
Security Scanning / Docker Image Security (push) Has been cancelled
Security Scanning / Security Summary (push) Has been cancelled
Tests / All Checks Passed (push) Has been cancelled
Tests / Go Tests (push) Has been cancelled
Tests / Python Tests (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / CI Summary (push) Has been cancelled
Security Scanning / Secret Scanning (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / Go Lint (push) Has been cancelled
Tests / Python Lint (push) Has been cancelled
Tests / Security Scan (push) Has been cancelled
Restructure financial plan from single 200k SAFE to realistic staged funding (25k Stammkapital, 25k Angel, 200k Wandeldarlehen, 1M Series A = 1.25M total). Add 60-month compute engine with CAPEX/OPEX accounting, cash constraints, hardware financing (30% upfront / 70% leasing), and revenue-based hiring caps. Rebuild TheAskSlide with 4-event funding timeline, update i18n (DE/EN), chat agent core messages, and add 15 new annex/technology slides with supporting UI components (KPICard, RunwayGauge, WaterfallChart, etc.). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
93 lines
2.1 KiB
TypeScript
93 lines
2.1 KiB
TypeScript
'use client'
|
|
|
|
import { useState, useCallback } from 'react'
|
|
import { SlideId } from '../types'
|
|
|
|
const SLIDE_ORDER: SlideId[] = [
|
|
'cover',
|
|
'problem',
|
|
'solution',
|
|
'product',
|
|
'how-it-works',
|
|
'market',
|
|
'business-model',
|
|
'traction',
|
|
'competition',
|
|
'team',
|
|
'technology',
|
|
'financials',
|
|
'the-ask',
|
|
'ai-qa',
|
|
'appendix',
|
|
'annex-infra',
|
|
'annex-ai-stack',
|
|
'annex-rag',
|
|
'annex-security',
|
|
'annex-devops',
|
|
'annex-agent-arch',
|
|
'annex-agent-rag',
|
|
'annex-agent-workflow',
|
|
'annex-usp-overview',
|
|
'annex-usp-comparison',
|
|
'annex-usp-moat',
|
|
'annex-roadmap-2027',
|
|
'annex-roadmap-2028',
|
|
]
|
|
|
|
export const TOTAL_SLIDES = SLIDE_ORDER.length
|
|
|
|
export function useSlideNavigation() {
|
|
const [currentIndex, setCurrentIndex] = useState(0)
|
|
const [direction, setDirection] = useState(0)
|
|
const [visitedSlides, setVisitedSlides] = useState<Set<number>>(new Set([0]))
|
|
const [showOverview, setShowOverview] = useState(false)
|
|
|
|
const currentSlide = SLIDE_ORDER[currentIndex]
|
|
|
|
const goToSlide = useCallback((index: number) => {
|
|
if (index < 0 || index >= TOTAL_SLIDES) return
|
|
setDirection(index > currentIndex ? 1 : -1)
|
|
setCurrentIndex(index)
|
|
setVisitedSlides(prev => new Set([...prev, index]))
|
|
setShowOverview(false)
|
|
}, [currentIndex])
|
|
|
|
const nextSlide = useCallback(() => {
|
|
if (currentIndex < TOTAL_SLIDES - 1) {
|
|
goToSlide(currentIndex + 1)
|
|
}
|
|
}, [currentIndex, goToSlide])
|
|
|
|
const prevSlide = useCallback(() => {
|
|
if (currentIndex > 0) {
|
|
goToSlide(currentIndex - 1)
|
|
}
|
|
}, [currentIndex, goToSlide])
|
|
|
|
const goToFirst = useCallback(() => goToSlide(0), [goToSlide])
|
|
const goToLast = useCallback(() => goToSlide(TOTAL_SLIDES - 1), [goToSlide])
|
|
|
|
const toggleOverview = useCallback(() => {
|
|
setShowOverview(prev => !prev)
|
|
}, [])
|
|
|
|
return {
|
|
currentIndex,
|
|
currentSlide,
|
|
direction,
|
|
visitedSlides,
|
|
showOverview,
|
|
totalSlides: TOTAL_SLIDES,
|
|
slideOrder: SLIDE_ORDER,
|
|
goToSlide,
|
|
nextSlide,
|
|
prevSlide,
|
|
goToFirst,
|
|
goToLast,
|
|
toggleOverview,
|
|
setShowOverview,
|
|
isFirst: currentIndex === 0,
|
|
isLast: currentIndex === TOTAL_SLIDES - 1,
|
|
}
|
|
}
|