Files
zeekayandGitHub e20dc71ad8 i18n: /s* to /z*, the app's rooms and settings read their copy through t (#69)
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
2026-10-29 23:51:44 -07:00

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>
)
}