Files
hanzo.ai/components/about/AboutHero.tsx
zeekay 0910c3cc68 agents: a start page for AI agents, and the site describes itself to them
/agents is where an agent lands: get a key (device flow or HTTP sign-up),
the free tier as /v1/billing/plans states it, a first call, the MCP server
for Claude Code, Codex, Cursor and Zed, Kai and its harness, a campaign
draft, and how an owner pays and bounds spend. The Agents SDK page moves
to /agents/sdk.

The prompt an agent pastes is lib/agents.ts, drawn on /agents and written
into llms.txt, which now keeps every hand-written section. robots.txt names
the AI crawlers; JSON-LD carries the positioning, 2014, the founders as
/about names them, and drops a SearchAction /search never answered;
/.well-known/api-catalog points at the OpenAPI document. /about gains a
track-record band, each line beside its source.

Claude-Session: https://claude.ai/code/session_017vrVus6PPBgP5YRzKV1iqW
2026-10-26 11:45:15 -07:00

142 lines
5.3 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'use client'
import React from "react";
import { motion } from "@/components/motion";
import { ArrowRight, Sparkles } from "lucide-react";
import { useI18n } from '@hanzo/i18n/react'
import { View, XStack, YStack } from '@hanzo/ui'
import { Action, Display, Lede } from '@hanzo/ui/marketing'
import { Words } from '@/components/marketing/band'
import { Line } from '@/components/type'
/** The house glow, a positioned disc centred on its point, and the corner's fainter one. */
const GLOW = 'radial-gradient(circle, var(--primary) 0%, transparent 70%)'
const CORNER = 'radial-gradient(circle, var(--pure-white) 0%, transparent 70%)'
/**
* The badge above the heading. NOT `Chip` — that role draws a hairline and
* takes its ink from the neutral ramp, and this one is a tinted fill with no
* edge at all. Borrowing the role would put a border on it that has never been
* there, so it keeps its own two declarations.
*
* `alignSelf` because the block it sits in is a gui stack now: an inline-flex
* badge centres itself inside a `text-align: center` BLOCK, but inside a flex
* column it is an item, and an item with no alignment of its own stretches the
* full measure.
*/
const BADGE = {
display: 'inline-flex',
self: 'center',
items: 'center',
gap: 8,
mb: 24,
px: 12,
py: 4,
rounded: 9999,
fontSize: '$1',
weight: '500',
bg: 'color-mix(in srgb, var(--primary) 15%, transparent)',
color: 'var(--primary)',
} as const
const LEDE = { maxW: 768, mx: "auto", mb: 40 } as const
const AboutHero = () => {
const { t } = useI18n()
return (
<YStack
render="section"
position="relative"
overflow="hidden"
pt={96}
pb={64}
px={16}
$md={{ px: 32 }}
$lg={{ px: 48 }}
>
{/* Background gradients */}
<View aria-hidden position="absolute" t="20%" l="50%" width={640} height={640} x="-50%" y="-50%" pointerEvents="none" opacity={0.16} background={GLOW} filter="blur(100px)" />
<View aria-hidden position="absolute" t={0} r="12%" width={440} height={440} pointerEvents="none" opacity={0.08} background={CORNER} filter="blur(80px)" />
<YStack position="relative" z="var(--z-raised)" width="100%" maxW={1024} mx="auto">
<View
render={<motion.div initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.4 }} />}
display="block"
$platform-web={{ textAlign: 'center' }}
>
<Words render={<motion.span initial={{ opacity: 0, y: 16 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.4 }} />} {...BADGE}>
<Sparkles width={14} height={14} />
{t("Techstars '17")}
</Words>
<Display
render={<motion.h1 initial={{ opacity: 0, y: 16 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.4, delay: 0.05 }} />}
mb={24}
>
{t('Building business software since 2014. {br}Now the AI operating system for business.', { br: <br /> })}
</Display>
<Lede
render={<motion.p initial={{ opacity: 0, y: 16 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.4, delay: 0.1 }} />}
{...LEDE}
>
{t('Started in 2014 with SKULLY and open-source commerce, through Techstars ’17, Zoo Labs Foundation in 2021, to 824+ open repositories and the sovereign AI cloud today. Led by CEO Antje Worring and CTO Zach Kelling.')}
</Lede>
<XStack
render={<motion.div initial={{ opacity: 0, y: 16 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.4, delay: 0.15 }} />}
flexWrap="wrap"
justify="center"
gap={16}
>
<Action href="https://cal.com/hanzo" fill>
{t('Book a call')}
<ArrowRight width={16} height={16} data-i18n-mirror />
</Action>
<Action href="#timeline">
{t('Explore the journey')}
</Action>
<Action href="/oss">
{t('Open Source & Research')}
</Action>
<Action href="/zen">
{t('The Zen of Hanzo')}
</Action>
</XStack>
{/* Track record summary stats */}
<XStack
render={<motion.div initial={{ opacity: 0, y: 16 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.4, delay: 0.2 }} />}
flexWrap="wrap"
justify="center"
gap={28}
mt={48}
pt={32}
borderTopWidth={1}
borderColor="var(--border)"
>
{[
{ value: '100+', label: t('Startups Built & Funded') },
{ value: '$1B+', label: t('Revenue Generated') },
{ value: '9', label: t('Unicorns') },
{ value: '2', label: t('IPO Exits') },
{ value: '824+', label: t('Open Repositories') },
].map((stat) => (
<YStack key={stat.label} items="center" px={8}>
<Line size="x2" weight="700" color="var(--foreground)" display="block">
{stat.value}
</Line>
<Line size="sm" tone="muted" display="block">
{stat.label}
</Line>
</YStack>
))}
</XStack>
</View>
</YStack>
</YStack>
);
};
export default AboutHero;