mirror of
https://github.com/hanzo-apps/hanzo.ai.git
synced 2026-10-30 14:58:08 +00:00
The product pages from /s3 to /zap, /university and its course data, /trust, /security, /sdks, /support, /tasks, /startups, /sms-opt-in, the buying specialist, Zen, Kai's guide, Studio, the settings pages, and the shared sales, solutions, zap and ui pieces. Client code draws with t(), server components with <T>, copy held as data is marked with phrase() and drawn through t() where it lands. A link or a figure inside a sentence is a value, so a translator reorders the whole sentence. Rebased on main: every page main moved onto Fold or Steps keeps main's layout, with its words wrapped (label, title, lede, points). Steps now draws a step's body through t, as it already drew the title. Settings keeps main's usage panel, refresh, rewards wallet and sign-in wallet rows, each label wrapped. Left English: the skills page's install line (a command and two URLs), and the solution eyebrow and sibling heading built from a kind label. Claude-Session: https://claude.ai/code/session_015XYKLjZtDTJEnMo4eK3AFH
55 lines
2.0 KiB
TypeScript
55 lines
2.0 KiB
TypeScript
import { CardGrid, Cta, Page, PageHero, Section } from '@/components/marketing/page-kit'
|
|
import { Doors } from '@/components/solutions/Solution'
|
|
import { Steps } from '@/components/preview/steps'
|
|
import { INDEX, KINDS, href, ofKind } from '@/lib/data/solutions'
|
|
import { pageMeta } from '@/lib/page-meta'
|
|
import { Spare } from '@/components/type'
|
|
import { phrase } from '@hanzo/i18n'
|
|
import { T } from '@hanzo/i18n/react'
|
|
|
|
const TITLE = phrase('Solutions for every team and industry')
|
|
const SAYS = 'What Hanzo does for each team, each industry and each kind of work'
|
|
const MORE = phrase('the workflows it takes over, the products underneath, and what is true about security')
|
|
const LEDE = `${SAYS}: ${MORE}.`
|
|
|
|
export const metadata = pageMeta({ title: TITLE, description: LEDE, path: INDEX })
|
|
|
|
/** All Solutions: every entry in lib/data/solutions.ts, grouped by kind. A kind of
|
|
* one (the reserved tier) is its own section rather than a heading over one card. */
|
|
export default function Solutions() {
|
|
return (
|
|
<Page>
|
|
<PageHero
|
|
eyebrow={phrase('Solutions')}
|
|
title={TITLE}
|
|
lede={
|
|
<T values={{ more: <Spare>: <T>{MORE}</T></Spare> }}>
|
|
{'What Hanzo does for each team, each industry and each kind of work{more}.'}
|
|
</T>
|
|
}
|
|
visual={<Steps title={KINDS[0].label} steps={ofKind(KINDS[0].id).map((s) => ({ title: s.name, body: s.hint }))} />}
|
|
>
|
|
<Doors />
|
|
</PageHero>
|
|
{KINDS.map((k) => {
|
|
const all = ofKind(k.id)
|
|
if (all.length === 1) {
|
|
const [s] = all
|
|
return (
|
|
<Section key={k.id} title={s.name} lede={s.lede}>
|
|
<Cta href={href(s)}>
|
|
<T values={{ name: s.name.toLowerCase() }}>{'Explore the {name}'}</T>
|
|
</Cta>
|
|
</Section>
|
|
)
|
|
}
|
|
return (
|
|
<Section key={k.id} title={k.label}>
|
|
<CardGrid columns={3} items={all.map((s) => ({ title: s.name, description: s.hint, href: href(s) }))} />
|
|
</Section>
|
|
)
|
|
})}
|
|
</Page>
|
|
)
|
|
}
|