hero.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { Link } from '@tanstack/react-router'
  2. import { ArrowRight } from 'lucide-react'
  3. import { useTranslation } from 'react-i18next'
  4. import { useSystemConfig } from '@/hooks/use-system-config'
  5. import { Button } from '@/components/ui/button'
  6. import { HeroTerminalDemo } from '../hero-terminal-demo'
  7. interface HeroProps {
  8. className?: string
  9. isAuthenticated?: boolean
  10. }
  11. export function Hero(props: HeroProps) {
  12. const { t } = useTranslation()
  13. const { systemName } = useSystemConfig()
  14. return (
  15. <section className='relative z-10 flex flex-col items-center overflow-hidden px-6 pt-28 pb-16 md:pt-36 md:pb-24'>
  16. {/* Radial gradient background */}
  17. <div
  18. aria-hidden
  19. className='pointer-events-none absolute inset-0 -z-10 opacity-25 dark:opacity-[0.12]'
  20. style={{
  21. background: [
  22. 'radial-gradient(ellipse 60% 50% at 20% 20%, oklch(0.72 0.18 250 / 80%) 0%, transparent 70%)',
  23. 'radial-gradient(ellipse 50% 40% at 80% 15%, oklch(0.65 0.15 200 / 60%) 0%, transparent 70%)',
  24. 'radial-gradient(ellipse 40% 35% at 40% 80%, oklch(0.70 0.12 280 / 40%) 0%, transparent 70%)',
  25. ].join(', '),
  26. }}
  27. />
  28. {/* Grid pattern */}
  29. <div
  30. aria-hidden
  31. className='absolute inset-0 -z-10 bg-[linear-gradient(to_right,var(--border)_1px,transparent_1px),linear-gradient(to_bottom,var(--border)_1px,transparent_1px)] [mask-image:radial-gradient(ellipse_60%_50%_at_50%_30%,black_20%,transparent_100%)] bg-[size:4rem_4rem] opacity-[0.08]'
  32. />
  33. <div className='flex max-w-3xl flex-col items-center text-center'>
  34. <h1
  35. className='landing-animate-fade-up text-[clamp(2rem,5.5vw,3.5rem)] leading-[1.15] font-bold tracking-tight'
  36. style={{ animationDelay: '0ms' }}
  37. >
  38. {t('Unified API Gateway for')}
  39. <br />
  40. <span className='bg-gradient-to-r from-blue-400 via-violet-400 to-purple-500 bg-clip-text text-transparent'>
  41. {t('All Your AI Models')}
  42. </span>
  43. </h1>
  44. <p
  45. className='landing-animate-fade-up text-muted-foreground/80 mt-5 max-w-lg text-base leading-relaxed opacity-0 md:text-lg'
  46. style={{ animationDelay: '80ms' }}
  47. >
  48. {systemName}{' '}
  49. {t(
  50. 'is an open-source AI API gateway for self-hosted deployments. Connect multiple upstream services, manage models, keys, quotas, logs, and routing policies in one place.'
  51. )}
  52. </p>
  53. <div
  54. className='landing-animate-fade-up mt-8 flex items-center gap-3 opacity-0'
  55. style={{ animationDelay: '160ms' }}
  56. >
  57. {props.isAuthenticated ? (
  58. <Button className='group rounded-lg' asChild>
  59. <Link to='/dashboard'>
  60. {t('Go to Dashboard')}
  61. <ArrowRight className='ml-1 size-3.5 transition-transform duration-200 group-hover:translate-x-0.5' />
  62. </Link>
  63. </Button>
  64. ) : (
  65. <>
  66. <Button className='group rounded-lg' asChild>
  67. <Link to='/sign-up'>
  68. {t('Get Started')}
  69. <ArrowRight className='ml-1 size-3.5 transition-transform duration-200 group-hover:translate-x-0.5' />
  70. </Link>
  71. </Button>
  72. <Button
  73. variant='outline'
  74. className='border-border/50 hover:border-border hover:bg-muted/50 rounded-lg'
  75. asChild
  76. >
  77. <Link to='/pricing'>{t('View Pricing')}</Link>
  78. </Button>
  79. </>
  80. )}
  81. </div>
  82. </div>
  83. <div
  84. className='landing-animate-fade-up w-full opacity-0'
  85. style={{ animationDelay: '300ms' }}
  86. >
  87. <HeroTerminalDemo />
  88. </div>
  89. </section>
  90. )
  91. }