import { useState, useEffect, useCallback, useRef } from 'react'; import Grainient from '../Grainient'; import IntroSlide from '../IntroSlide'; const heroButtonStyles = ` .hero-btn { cursor: pointer; transition: all 0.15s ease; display: inline-flex; align-items: center; gap: 0; overflow: hidden; } .hero-btn::after { content: ''; display: inline-block; width: 0; opacity: 0; transition: width 0.2s ease, opacity 0.2s ease, margin 0.2s ease; height: 14px; margin-left: 0; background-color: currentColor; -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.5 8h9M8.5 4l4 4-4 4'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.5 8h9M8.5 4l4 4-4 4'/%3E%3C/svg%3E"); -webkit-mask-size: contain; mask-size: contain; -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat; flex-shrink: 0; } .hero-btn:hover::after { width: 14px; opacity: 1; margin-left: 6px; } .hero-btn:focus-visible { outline: 2px solid #FFBC42; outline-offset: 2px; } .hero-btn-solid { background-color: #034955; color: #FFFFFF; } .hero-btn-solid:hover { background-color: #02383F; box-shadow: 0 4px 12px rgba(3,73,85,0.3); } .hero-btn-solid:active { background-color: #032E36; box-shadow: none; } .hero-btn-outline-light { border: 1px solid #034955; color: #034955; background-color: transparent; } .hero-btn-outline-light:hover { background-color: rgba(3,73,85,0.06); border-color: #032E36; color: #032E36; } .hero-btn-outline-light:active { background-color: rgba(3,73,85,0.12); } .hero-btn-yellow { border-radius: 4px; opacity: 0.8; background: #FFBC42; color: #032E36; box-shadow: 0 36px 80px 0 rgba(255,188,66,0.52), 0 15.04px 33.422px 0 rgba(255,188,66,0.37), 0 8.041px 17.869px 0 rgba(255,188,66,0.31), 0 4.508px 10.017px 0 rgba(255,188,66,0.26), 0 2.394px 5.32px 0 rgba(255,188,66,0.21), 0 0.996px 2.214px 0 rgba(255,188,66,0.15); } .hero-btn-yellow:hover { opacity: 1; box-shadow: 0 40px 90px 0 rgba(255,188,66,0.58), 0 18px 40px 0 rgba(255,188,66,0.42), 0 10px 22px 0 rgba(255,188,66,0.35), 0 6px 12px 0 rgba(255,188,66,0.28), 0 3px 6px 0 rgba(255,188,66,0.22), 0 1px 3px 0 rgba(255,188,66,0.16); } .hero-btn-yellow:active { opacity: 1; background: #E8A830; box-shadow: 0 20px 50px 0 rgba(255,188,66,0.4), 0 8px 20px 0 rgba(255,188,66,0.28), 0 4px 10px 0 rgba(255,188,66,0.2); } .hero-btn-ghost { border: 1px solid rgba(255,255,255,0.3); color: #FFFFFF; background-color: transparent; } .hero-btn-ghost:hover { background-color: rgba(255,255,255,0.1); border-color: rgba(255,255,255,0.5); } .hero-btn-ghost:active { background-color: rgba(255,255,255,0.15); border-color: rgba(255,255,255,0.5); } .hero-btn-ghost-blur { border: 1px solid rgba(255,255,255,0.3); color: #FFFFFF; background-color: rgba(255,255,255,0.06); } .hero-btn-ghost-blur:hover { background-color: rgba(255,255,255,0.14); border-color: rgba(255,255,255,0.5); } .hero-btn-ghost-blur:active { background-color: rgba(255,255,255,0.2); border-color: rgba(255,255,255,0.5); } .hero-slide { position: absolute; inset: 0; opacity: 0; transition: opacity 0.6s ease; } .hero-slide.active { opacity: 1; } .hero-slide img { width: 100%; height: 100%; object-fit: cover; } .hero-vnav { position: absolute; right: 24px; top: 50%; transform: translateY(-50%); display: flex; flex-direction: column; align-items: center; gap: 0; z-index: 10; } .hero-vnav-item { display: flex; align-items: center; gap: 10px; cursor: pointer; background: none; border: none; padding: 8px 0; position: relative; } .hero-vnav-dot { width: 12px; height: 12px; border-radius: 50%; border: 2px solid rgba(255,255,255,0.5); background: transparent; transition: all 0.25s ease; flex-shrink: 0; position: relative; z-index: 2; } .hero-vnav-item:hover .hero-vnav-dot { border-color: #FFFFFF; } .hero-vnav-item.active .hero-vnav-dot { border-color: #FFFFFF; background: #FFFFFF; } .hero-vnav-label { position: absolute; right: 22px; white-space: nowrap; font-size: 11px; font-weight: 700; letter-spacing: 0.05em; color: rgba(255,255,255,0.45); transition: all 0.2s ease; } .hero-vnav-item:hover .hero-vnav-label, .hero-vnav-item.active .hero-vnav-label { color: #FFFFFF; } .hero-vnav-line { width: 2px; flex: 1; background: rgba(255,255,255,0.2); min-height: 20px; } `; function Section({ title, children }: { title: string; children: React.ReactNode }) { return (

{title}

{children}
); } const imageSlides = [ { label: 'Quest', image: '/images/hero-quest.png', badge: 'Quest', heading: <>Find your next
adventure, sub: 'Search \u00b7 Compare \u00b7 Book', body: 'Intelligent package search and availability for tour operators. Real-time pricing, flexible filtering, and instant booking.', cta: 'Search packages', }, { label: 'Circle', image: '/images/hero-circle.png', badge: 'Circle', heading: <>Connect every
guest touchpoint, sub: 'CRM \u00b7 Loyalty \u00b7 Engagement', body: 'A unified guest platform that brings together profiles, preferences, and interactions across every channel.', cta: 'Explore Circle', }, { label: 'Voyage', image: '/images/hero-travel.png', badge: 'Voyage', heading: <>Travel without
boundaries, sub: 'Cruise \u00b7 Rail \u00b7 Touring', body: 'From coastal cruises to scenic rail journeys, one platform to manage every departure, cabin, and guest experience.', cta: 'Explore packages', }, ]; function ImageHeroSlider() { const [active, setActive] = useState(0); const goTo = useCallback((i: number) => setActive(i), []); useEffect(() => { const timer = setInterval(() => { setActive(prev => (prev + 1) % imageSlides.length); }, 6000); return () => clearInterval(timer); }, [active]); const slide = imageSlides[active]; return (
{imageSlides.map((s, i) => (
{s.label}
))}

{slide.badge}

{slide.heading}

{slide.sub}

{slide.body}

{imageSlides.map((s, i) => (
{i < imageSlides.length - 1 &&
}
))}
); } function GrainientHero() { const centerRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 }); const containerRef = useRef(null); const handleMouseMove = useCallback((e: React.MouseEvent) => { const el = containerRef.current; if (!el) return; const rect = el.getBoundingClientRect(); centerRef.current = { x: ((e.clientX - rect.left) / rect.width - 0.5) * 0.3, y: -((e.clientY - rect.top) / rect.height - 0.5) * 0.3, }; }, []); const handleMouseLeave = useCallback(() => { centerRef.current = { x: 0, y: 0 }; }, []); return (

Next Generation

The future of
travel technology

AI-powered · Connected · Intelligent

A unified platform where every booking, every itinerary, and every guest interaction flows through one intelligent system.

); } export default function HeroDemo() { return ( <>

Platform

Build the travel business
your customers deserve

Kaptio Travel Platform

End-to-end travel technology for tour operators, cruise lines, and DMCs. From inventory to checkout, powered by one connected platform.

Platform

Build the travel business
your customers deserve

Kaptio Travel Platform

End-to-end travel technology for tour operators, cruise lines, and DMCs. From inventory to checkout, powered by one connected platform.

Components

Building blocks for Kaptio applications, styled with Flux design tokens.

New Release

Introducing Voyage

Multi-day travel, reimagined

Purpose-built for cruise and rail operators. Cabin inventory, deck plans, and operational workflows for premium multi-day travel experiences.

Full-screen intro slide for presentations and screen sharing. Open full screen →

); }