Files
zeekay 6325fce333 The mark table is fetched when a mark is drawn; the focused bar stands unbounded
ProviderMark is one table of every lab's mark, about 32 KB after brotli, and
four client components imported it whole: the landing's agent strip and race,
/templates' prompt rows and /gen's roster, which put it in the first load of
/dev, /gen and /templates for a few marks below the fold. components/models/
Mark is the lazy one Maker already used, its footprint standing empty until
the table arrives; every client mark draws through it. /dev's first load is
406 KB (was 449), /gen's 387 (was 429). A server page renders ProviderMark
itself and ships none of it.

The focused bar (the previous commit) stood in a Suspense boundary, and that
boundary misbehaved twice. The prerender flushed it before the bar's module
had loaded, so the export carried an empty boundary where the bar goes and
the bar further down, swapped in by React's inline script: on a slow line it
arrived late and pushed /login's form down (CLS 0.15 on Fast 3G against 0.1).
And IAM settling is an update, so hydration threw the prerendered bar away
for the fallback until the chunk landed (focus.spec found no wordmark). With
no boundary the prerender holds the bar in place and a focused page hydrates
once its chunk, a preload in its head, has arrived: measured on /forget, the
bar is there from the first parse through hydration.

Claude-Session: https://claude.ai/code/session_01BLLMyBFSvAfCt7ZGqYuiEz
2026-10-22 13:05:18 -07:00

21 lines
982 B
TypeScript

'use client'
import { View } from '@/components/ui'
import { Mark } from './Mark'
/**
* The mark of the lab that makes a model, bare and in the page's ink, so it
* reads in both themes: Hanzo's H for ours (Enso, its tiers and Kai; owner,
* 2026-10-16), a lab's own mark for a price-list id, read through ProviderMark
* (`anthropic/claude-opus-4.8` wears Claude's, `openai/gpt-5.6-sol` OpenAI's,
* `deepseek/deepseek-v4-pro` DeepSeek's). Every row that draws one is drawn from
* a read the page makes after it loads, so the table is fetched then (./Mark).
* Its footprint stands empty while the table loads, and for a row with no id,
* so names stay in one column.
*/
export function Maker({ id, ours, size = 14 }: { id: string | null; ours: boolean; size?: number }) {
if (ours) return <Mark org="hanzo" size={size} ink />
if (id) return <Mark org={id.split('/')[0]} model={id} size={size} ink />
return <View aria-hidden width={size} height={size} shrink={0} />
}