Files
zeekay ac64d5d7dd Folds say one line: every first screen keeps its heading and a single lede
The owner's spec for a landing page is the models bento's: monochrome, the
words left and the art right, no extra prose. The folds carried two to four
sentences under each heading, and some a claim, a lede and a list besides.
Each now says one line: ProductLanding the tagline where a page states one
(the lede still describes it to search), a claim alone where the claim is
the line (/payments, /treasury, /zap, the extension), and elsewhere the
sentence that says what the thing is. /philosophy's two points, /dns' claim
that repeated its title, /calculator's capabilities line and the
Spare clauses on /research and /learn go.
2026-10-30 06:42:40 -07:00

48 lines
2.3 KiB
TypeScript

'use client'
import { ProductFooter } from "@/components/products/ProductFooter"
import { Lede } from "@/components/products/Lede"
import { AgentPrompt } from "@/components/product/AgentPrompt"
import { product } from '@/lib/product'
import { Box } from '@hanzo/ui'
import { phrase } from '@hanzo/i18n'
import { useI18n } from '@hanzo/i18n/react'
import { HardDrive } from 'lucide-react'
import { Steps } from '@/components/preview/steps'
/** The prompt's product, off the one table that holds a product's name, route,
* audited command and docs page. `ProductFooter` closes the page. */
const PRODUCT = product('s3')
/** How an object is kept, one part a step, walked beside the heading. */
const KEPT = [
{ title: phrase('One binary, four roles'), body: phrase('One binary in four roles: a master that tracks where everything is, volume servers that hold the bytes, a filer for the namespace and the HTTP gateway your code talks to.') },
{ title: phrase('Keys from KMS'), body: phrase('Server-side encryption whose keys are minted by Hanzo KMS rather than read out of a config file.') },
{ title: phrase('Ten data shards, four parity'), body: phrase('Objects are erasure-coded across ten data shards and four parity shards, so four can be lost and the object still reads.') },
{ title: phrase('One protocol'), body: phrase('Every call between the pieces speaks one binary protocol, with no gRPC anywhere: one transport to secure and one to debug.') },
]
export default function S3Page() {
const { t } = useI18n()
return (
<Box minH="100vh" $platform-web={{ color: 'var(--foreground)' }}>
<main>
<Lede
title="Hanzo Object Storage"
badge={phrase('Storage')}
badgeIcon={HardDrive}
actions={[
{ label: phrase('API reference'), href: 'https://docs.hanzo.ai/docs/openapi/s3' },
{ label: phrase('Source'), href: 'https://github.com/hanzoai/s3' },
]}
preview={<Steps title={phrase('An object, kept')} icon={<HardDrive size={12} color="currentColor" />} steps={KEPT} />}
>
{t('Buckets and objects, presigned links, multipart uploads, versioning and object lock.')}
</Lede>
{PRODUCT && <AgentPrompt product={PRODUCT} />}
<ProductFooter slug="s3" name="Object Storage" />
</main>
</Box>
)
}