mirror of
https://github.com/hanzo-apps/hanzo.ai.git
synced 2026-10-30 14:58:08 +00:00
The share card offers Hanzo, the products and the betas the member asked for, the rest under More by group. A topic picks the posts Shuffle offers, the link (/beta/for/<topic>, tagged utm_content) and the card it unfurls to: that page carries the topic's title, line and card, a canonical naming itself and the one noindex (lib/publish SHARES), and sends a person on to /beta with the query kept, so ref and the campaign land as before. lib/hanzo/topics is the list, its words the site's and BETAS's own. generate-og draws a card per topic from it, palette-quantized with sharp: 49 cards, 2.9 MB. The cards gate reads every card's rendered words. Claude-Session: https://claude.ai/code/session_017vrVus6PPBgP5YRzKV1iqW
35 lines
1.3 KiB
TypeScript
35 lines
1.3 KiB
TypeScript
import type { Metadata } from 'next'
|
|
import { notFound } from 'next/navigation'
|
|
import { pageMeta } from '@/lib/page-meta'
|
|
import { TOPICS, page, topic as find } from '@/lib/hanzo/topics'
|
|
import { Forward } from './forward'
|
|
|
|
/**
|
|
* /beta/for/<topic> — the address a member's post links to (components/beta/share.tsx).
|
|
*
|
|
* Its head is what a share unfurls to: the topic's title and line, its own card
|
|
* (lib/constants/og.ts), and a canonical naming itself, which is where Facebook
|
|
* and LinkedIn read the image from. A person is sent on to /beta with the link's
|
|
* query intact, so `ref` and the campaign tags land exactly as a link to /beta
|
|
* does. Withheld from the index by lib/publish (SHARES), never disallowed: a
|
|
* social crawler obeys robots.txt.
|
|
*/
|
|
|
|
export const dynamicParams = false
|
|
|
|
export function generateStaticParams() {
|
|
return TOPICS.map((t) => ({ topic: t.id }))
|
|
}
|
|
|
|
export async function generateMetadata({ params }: { params: Promise<{ topic: string }> }): Promise<Metadata> {
|
|
const t = find((await params).topic)
|
|
if (!t) notFound()
|
|
return pageMeta({ title: t.title, description: t.line, path: page(t.id) })
|
|
}
|
|
|
|
export default async function Page({ params }: { params: Promise<{ topic: string }> }) {
|
|
const t = find((await params).topic)
|
|
if (!t) notFound()
|
|
return <Forward id={t.id} />
|
|
}
|