mirror of
https://github.com/hanzo-apps/hanzo.ai.git
synced 2026-10-30 14:58:08 +00:00
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.
48 lines
2.3 KiB
TypeScript
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>
|
|
)
|
|
}
|