Files
zeekay 11265a21fd Highlight every code sample with shiki in the code theme
Code on hanzo.ai was plain monospace: 285 blocks across 200 pages, one of
them hand-inked in four greys. components/code now renders each sample
at build with shiki and @hanzo/ui's codeTheme (Dracula dark, GitHub
Light light), every colour written as light-dark() so the page's
color-scheme picks it, on the theme's own ground. The page ships the
coloured spans and no highlighter; e2e/gates/code.spec.ts holds both.

A client page that shows code is split into a server page.tsx that owns
the sample and a client view.tsx that takes the highlighted node:
ProductLanding's code.source, the blockchain pages' codeExamples, the
models kit Sample, the guest-key card, realtime, analytics, payments,
sdks and the rest. Transcripts, agent prompts and ASCII diagrams are not
code and keep their markup.

Takes @hanzo/ui 8.27.83 for codeTheme and @hanzo/design 0.5.35 with it,
regenerates app/gui.css for the new theme keys, and lowers the raw-colour
allowance to 58: the samples' literal inks are gone.
2026-10-05 01:31:58 -07:00

51 lines
1.5 KiB
TypeScript

import { Code } from '@/components/code'
import Realtime from './view'
/** The subscription the hero shows beside its clients. */
const WATCH = `// Watch a collection
const stop = await base
.collection('messages')
.subscribe('*', (e) => {
console.log(e.action, e.record.id);
render(e.record);
});
// create | update | delete`
/** The protocol without the SDK: mint a grant, spend it, name what you want. */
const WIRE = `// 1. mint a grant on an ordinary authenticated request
const { token } = await post('/v1/realtime/token');
// 2. spend it — once, and within thirty seconds
const es = new EventSource('/v1/realtime?token=' + token);
es.addEventListener('CONNECT', (ev) => {
const { clientId } = JSON.parse(ev.data);
// 3. name the collections and records you want
post('/v1/realtime', {
clientId,
subscriptions: [
'messages', // the whole collection
'orders/ord_42', // one record
],
});
});
// records arrive as events named for the topic
es.addEventListener('messages', (ev) => {
const { action, record } = JSON.parse(ev.data);
if (action === 'delete') remove(record.id);
else render(record);
});
// a grant is spent; a dropped stream reopens with a new one
es.onerror = () => reconnect();`
/** The page, with both samples highlighted where they are built (components/code). */
export default function Page() {
return (
<Realtime
watch={<Code lang="javascript" code={WATCH} fontSize="$1" lineHeight="1.4" p={12} />}
wire={<Code lang="javascript" code={WIRE} />}
/>
)
}