Files
zooqueen 02bb6b2900 the globe takes the fold, and the front door docks to the bottom
The apex opened on a composer with the globe dimmed behind it — a radial mask
punched the middle out at 82% black so a text field would stay legible on top
of the one thing on the page worth looking at. Those two swap places here.

`Fold` is the globe at full contrast, sized to FIT: the canvas used to run to
124% of a fold that is itself the viewport, which put the sphere's equator
below the bottom edge and its sides past both others, so what rendered was a
dotted dome rather than a body. `Composer` is one line — an <input>, which has
no second row to grow into — docked with `.hz-dock`, hanzo.app's own sticky, so
it rides the whole page and comes to rest above the footer. The three pills
that used to sit under the hero are now what the [+] holds; the mic is
`@hanzo/voice` on its browser leg, the same microphone hanzo.chat and hanzo.app
draw, and it writes the field rather than sending, because "send" here is a
cross-origin navigation and a pause in speech should not carry anyone off the
site.

A montage of hanzo.agency's case-study films was the other candidate and was
measured rather than assumed: they are third-party 480p YouTube embeds with no
masters in any repo, and a film cannot be both a 0.46 phone and a 1.6 laptop
without showing the middle quarter of itself on one of them.

PointGlobe's point budget now follows how large the globe RENDERS instead of
how large the window is. Its own comment already said a sphere reads as a
sphere only when its silhouette is crowded; density is N over the silhouette's
AREA, and the silhouette tracks the canvas height, so N tracks that ratio
squared. Both call sites get a globe that cannot thin into a starfield by being
asked to fill a hero.

Research reaches the front page. `scripts/sync-papers.mjs` re-fetches
papers.hanzo.ai at prebuild, the same shape as the pricing and catalog
snapshots and for the same reason — a static export cannot read the library at
request time. /research had six hand-typed titles under a comment promising
they mirrored the library; not one was a title it serves and every card pointed
at its root. Both surfaces now read the snapshot, so adding a paper to the
library is the whole of adding it here.

The bar keeps clear of the corner launcher below 560px: hanzo.app/edit.js pins
a 44px button bottom-right at z-index 2147483000, which lands exactly on the
send button once the composer runs the full width of a phone.
2026-08-13 20:51:07 -07:00

35 lines
1.1 KiB
TypeScript

/**
* The research library, as this site reads it.
*
* `papers.json` is written by `scripts/sync-papers.mjs` at prebuild from
* papers.hanzo.ai, which is where a paper is actually published. This file only
* gives that snapshot a type and a name — it owns no titles and no prose, the
* way `cloud-primitives.ts` owns prose and never membership.
*/
import snapshot from './papers.json' with { type: 'json' }
export interface Paper {
/** The library's own path segment: papers.hanzo.ai/<slug>/ */
slug: string
title: string
/** The author's one-line statement of what the paper is. */
subtitle: string
/** As the library prints it, e.g. `Jun 2026`. */
date: string
tags: string[]
/** Absolute on the library's host, e.g. `/pdfs/<id>.pdf`. */
pdf: string
}
export interface Library {
/** The host the snapshot came from — every link on this site is built off it. */
source: string
/** ISO date of the fetch. A snapshot that cannot say how old it is rots invisibly. */
fetched: string
papers: Paper[]
}
export const papers: Library = snapshot as Library
export const PAPERS: Paper[] = papers.papers