mirror of
https://github.com/hanzo-apps/hanzo.ai.git
synced 2026-10-29 07:20:43 +00:00
The focused landing keeps its seven parts and adds back three: Backing under the hero (the fold gate holds "Backed by" at the first scroll), the open-source section with this build's counts, and a band for agents: sign up with a wallet, a key from POST /v1/account/keys, a top-up address from POST /v1/billing/crypto/deposit, no human. The Platform menu and its footer column lead with "Agents: get an API key in one call" again. The description says the agent path and the track record; the home cards are redrawn for the new title and every card takes address v5.
67 lines
2.3 KiB
TypeScript
67 lines
2.3 KiB
TypeScript
import { TOPICS, page, picture } from '../hanzo/topics.ts'
|
|
|
|
/**
|
|
* The social preview cards: one per page that has its own, drawn by
|
|
* scripts/generate-og.mjs into public/og/, and the default card at
|
|
* public/og-image.png for every other page. Each is 2400x1260 (a 1.9:1 card at
|
|
* 2x), measured from the files.
|
|
*
|
|
* A share preview is cached by its address, so a redraw raises VERSION and
|
|
* every card takes a new one.
|
|
*/
|
|
const VERSION = 5
|
|
|
|
/** A card's address: its file in `public/`, at the cards' version. */
|
|
const card = (file: string) => `${file}?v=${VERSION}`
|
|
|
|
export const OG_IMAGE = {
|
|
url: card('/og-image.png'),
|
|
width: 2400,
|
|
height: 1260,
|
|
} as const
|
|
|
|
/** The pages with a card of their own. */
|
|
export const OG_IMAGES_BY_PATH: Record<string, string> = {
|
|
'/': card('/og/home.png'),
|
|
'/beta': card('/og/beta.png'),
|
|
'/referral': card('/og/beta.png'),
|
|
'/login': card('/og/login.png'),
|
|
'/signup': card('/og/signup.png'),
|
|
'/pricing': card('/og/pricing.png'),
|
|
'/models': card('/og/models.png'),
|
|
'/api': card('/og/api.png'),
|
|
'/enterprise': card('/og/enterprise.png'),
|
|
'/contact-sales': card('/og/enterprise.png'),
|
|
'/careers': card('/og/careers.png'),
|
|
'/research': card('/og/research.png'),
|
|
'/security': card('/og/security.png'),
|
|
'/products': card('/og/products.png'),
|
|
'/about': card('/og/about.png'),
|
|
// A share topic's page (app/beta/for/[topic]) unfurls to that topic's card;
|
|
// Hanzo's, the beta as a whole, is the beta page's own.
|
|
...Object.fromEntries(TOPICS.map((t) => [page(t.id), card(`/og/${picture(t.id)}.png`)])),
|
|
}
|
|
|
|
/** Resolves the OG card URL for a given path, defaulting to `/og-image.png`. */
|
|
export function getOgImageUrl(path?: string): string {
|
|
if (!path) return OG_IMAGE.url
|
|
const clean = path.replace(/\/+$/, '') || '/'
|
|
return OG_IMAGES_BY_PATH[clean] ?? OG_IMAGE.url
|
|
}
|
|
|
|
/** `openGraph.images` for a page — accepts an optional card URL override. */
|
|
export const ogImages = (alt: string, imageUrl?: string) => [
|
|
{
|
|
url: imageUrl ?? OG_IMAGE.url,
|
|
width: OG_IMAGE.width,
|
|
height: OG_IMAGE.height,
|
|
alt,
|
|
},
|
|
]
|
|
|
|
/** `twitter.images` — Twitter takes bare URLs. Defaults to the canonical card. */
|
|
export const twitterImages = [OG_IMAGE.url]
|
|
|
|
/** Helper to generate twitter.images with an explicit or path-resolved URL. */
|
|
export const getTwitterImages = (imageUrl?: string) => [imageUrl ?? OG_IMAGE.url]
|