32 Commits
Author SHA1 Message Date
zeekayandHanzo Dev e75d231b0c Wait for the page before timing the tests
Playwright was told a port, so it started the suite as soon as the socket
opened and turbopack compiled the route inside the first test. A test's
time also covers its hooks, so that first test paid for launching chromium
on top of the two dev-server navigations every test makes.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-08 13:03:39 -07:00
zeekay 2de0604a52 v8.3.5 2026-09-07 02:06:21 -07:00
zeekay b424fd5871 v8.3.4 2026-09-06 18:54:23 -07:00
zeekay c4074a9dd0 v8.3.3 2026-09-06 13:48:41 -07:00
zeekay 02c920b06d Leave the optimizer fixtures unbuilt 2026-09-06 08:21:47 -07:00
zeekay c183da5389 Drop webpack from the stack
The loader and the Next plugin only existed to drive webpack; Next runs
on Turbopack and Vite has its own plugin. kitchen-sink and the
integration app serve through vite, the optimizer suite drops the
webpack name, and its fixture packages join the workspace so a fresh
checkout links @my/ui.
2026-09-06 08:17:57 -07:00
zeekay 5a07cee3b1 v8.3.2 2026-09-05 03:11:37 -07:00
zeekayandHanzo Dev bad164a516 Give the turbopack suite time to spawn the CLI
Co-authored-by: Hanzo Dev <[email protected]>
2026-09-05 02:08:57 -07:00
zeekayandHanzo Dev dab83dc050 Run the optimizer's native pass under Node again
Node's require never selects a package's react-native condition and
cannot load an ES module whose sources say a bare require, so the
extractor resolves that entry itself and translates such a file to
CommonJS as it loads. Directories are walked with the filesystem's
glob, negative numbers become AST through valueToNode, the swallowed
load error is named under DEBUG, and the optimize fixture is its
source again with the suite restoring it after each run.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-05 02:00:02 -07:00
zeekayandHanzo Dev af24fc040a Emit the native build as CommonJS
Native sources say a bare require, which Metro provides and an ES
module cannot; marking dist/native CommonJS like dist/cjs lets Node
load it as written, so the optimizer's native pass runs again. The
.cjs sibling answers there too, the CLI imports its commands, the
loader names its css file by the emitted name, and the extractor
tolerates a dependency whose tsconfig extends a preset it lacks.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-05 00:14:46 -07:00
zeekay 834a904e48 Format with oxfmt 2026-09-04 09:04:51 -07:00
zeekay 698b2ff854 every Hanzo dependency is the version npm serves
Ranges drift once nothing moves them: a caret that has not been rewritten
since it was written pins whatever was current that day, and an exact pin
cannot even take a patch. Both are updated here.

One line per package, so a surface reads the same components, the same
tokens and the same face as every other one.
2026-09-01 16:22:28 -07:00
zeekay 0243d68060 State a version once
A version written into a manifest is written into every manifest that wants it,
which is how eslint came to exist in a hundred and four forms across this estate
and how a package came to resolve twice at run time. The catalog moves the number
out of the manifest: a manifest names the package, the workspace names the
version.

Four are held below their latest because the newer release cannot be used, and
the reason is recorded rather than the version alone: @noble/hashes 2 renamed
every subpath the web3 stack imports, @splinetool/runtime 2 depends on a package
that was never published, @dynamic-labs 5.4.1 the same, and react-resizable-panels
3 points its types condition at the bundle.
2026-08-29 18:13:47 -07:00
zeekay 666424e71b One version per package, on the current release
Every dependency on a @hanzo/@luxfi/@zooai package now names the same version
across the repo: a catalog entry where pnpm supports one, an exact pin where it
does not, and a range only where a peer genuinely means one.

pnpm itself is pinned too — the estate ran eighteen different versions, five of
them too old to read a catalog.
2026-08-28 14:43:31 -07:00
zeekay 1620fff61e drop Inter and Geist from the docs, the artifacts and the snapshot
The estate renders in Zen, and the config sources here already did — but the
surfaces that teach the config had not moved with them. Every createFont example
in the docs still named Inter, so a reader copying one out wrote an app in a face
we do not ship, and the Expo guide sent them to @hanzogui/font-inter, a package
that does not exist in this repo at all; the one that does is @hanzogui/font-zen.

The tracked .gui configs and the two public/hanzogui.css files were stale output.
The compiler writes .hanzogui/hanzogui.config.json now and the apps emit
hanzogui.generated.css, so nothing produced or read either set any more; they had
simply frozen in place with the pre-Zen families still in them, and .gitignore had
already been taught to ignore .gui without the files being untracked to match.

The babel native snapshot recorded fontFamily "Inter" for the same reason. The
compiler emits "Zen" today — the snapshot was just never re-run.
2026-08-28 11:19:40 -07:00
zeekay 4eb260d86e fix(font): the site asks for a face it never loads
apps/gui.hanzo.ai inlines @font-face for 'Zen', 'Zen Mono' and 'Zen Pixel
Square' and preloads all three, then app.css opens its stack with Inter and
DocSearch sets the hit titles to Inter. Neither name is registered anywhere,
so every one of those lines falls through to -apple-system and the three
downloaded faces render nothing. apps/tests/next-site carries the same stack.

The @hanzo/font ranges were still on 1.8.x, which predates the sans binding
being renamed ZenSans -> Zen, and the remix starter's copy had never made it
into bun.lock at all.
2026-08-28 08:49:07 -07:00
zeekay f0fc7f0a04 v8.3.0 2026-08-27 08:06:19 -07:00
zeekay e83cb58508 v8.2.1 2026-08-25 13:28:47 -07:00
zeekayandHanzo Dev ffb28707a2 v8.2.0
Co-authored-by: Hanzo Dev <[email protected]>
2026-08-24 11:47:43 -07:00
zeekayandHanzo Dev 56e004e4b2 feat(fonts): Zen only — delete the nine faces that were not ours
The kit shipped ten typefaces. One is ours.

Deleted: font-inter, font-silkscreen, font-cherry-bomb, font-nohemi,
font-dm-sans, font-dm-serif-display, font-fira-mono, font-glusp, font-munro.
Six of those had no dependent in the workspace at all. font-zen stays, and so do
font-size, get-font-sized and font, which size and register rather than name a
face. Published versions remain on the registry, so anything pinned to one keeps
resolving.

@hanzogui/config's DEFAULT entry built heading and body from Inter — v4 was
already system fonts and v5 already Zen, so an app on the default got a face
nobody chose. It builds from Zen now. dev-config, which drives gui.hanzo.ai, was
worse: Inter for text, Berkeley Mono for code, plus Cherry Bomb and Silkscreen.
Every size, weight, letter-spacing and transform value is unchanged — only the
faces moved.

The pixel ROLE was worth keeping and only its face was borrowed, so font-zen
gained Zen Pixel Square (createZenPixelFont, --font-zen-pixel-*) and the token is
`$pixel`. `$silkscreen` and `$cherryBomb` are gone across ~35 call sites. Cherry
Bomb had no role of its own and no Zen counterpart, so it is deleted rather than
substituted.

gui.hanzo.ai now self-hosts three Zen files in place of four foreign ones — one
variable file per family instead of a weight per request — and its OG-image
route renders cards in the same faces as the pages they link to. The Inter,
Berkeley, Silkscreen and glusp binaries are gone from public/fonts, including an
otf directory of 20 Inter cuts.

Native is honestly short: @hanzo/font ships woff2 and react-native wants
otf/ttf, so the expo starter and kitchen-sink's native entry load no custom face
and say why, rather than keeping Inter because it happened to be there.

bun install 0 · build 161/161 · typecheck passed.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-24 11:44:08 -07:00
zeekayandzooqueen 62d3ae6622 test: the preview server binds where the dev server does, so both are reachable 2026-08-16 17:21:15 -07:00
zeekay 1f409aba2e test: give the integration tests a budget that covers their own build 2026-08-16 10:08:03 -07:00
zeekayandHanzo Dev 89b9132c26 v8.1.1
Co-authored-by: Hanzo Dev <[email protected]>
2026-08-05 19:27:01 -07:00
Gui Release 85519508c8 v8.1.0 2026-08-05 02:20:37 +00:00
zeekayandHanzo Dev 8df6f77162 test: regenerate the two snapshots the transplant left on upstream's fonts and pre-data-slot markup
Co-authored-by: Hanzo Dev <[email protected]>
2026-08-04 17:09:40 -07:00
zeekayandHanzo Dev 907cf6bbea style: oxfmt the repo
Co-authored-by: Hanzo Dev <[email protected]>
2026-08-02 10:43:58 -07:00
zeekayandHanzo Dev 4715616640 fix(deps): align the nine cross-package range mismatches, and narrow react-dom off the wildcard
Co-authored-by: Hanzo Dev <[email protected]>
2026-08-02 10:40:47 -07:00
zeekayandHanzo Dev da9d6f135b fix(tsconfig): re-anchor project references onto pkgs/ after the apps/ split
Co-authored-by: Hanzo Dev <[email protected]>
2026-08-02 10:39:51 -07:00
zeekayandHanzo Dev 751ef5c778 rename the framework to @hanzo/gui and the loader to @hanzogui/loader
Both old names are owned by a different npm account (artemis-prime), so
publishing them returns 403 — which is how this surfaced: the 8.0.0 run
shipped @hanzogui/logo and @hanzogui/demos depending on [email protected], a
version that cannot be published and therefore does not exist. Those two
were uninstallable.

@hanzo/gui and @hanzogui/* are ours, so the framework now carries the name
it is imported by everywhere downstream, and the loader moves under the
scope we control.

The rewrite is limited to package references. `DEBUG?.startsWith('hanzogui')`
is a log-namespace filter and join(dir, 'hanzogui') is a path — rewriting
either would change behaviour, so both are untouched.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-30 20:23:18 -07:00
zeekayandHanzo Dev 8556db6732 release: converge the gui lineage on 8.0.0
Aligns @hanzogui/* and the four unscoped gui packages with @hanzo/ui@8,
which is already on the 8.x line. @hanzo_network/* and @hanzo/booker keep
their own version streams — they are not part of this framework's lineage.

The lockfile is regenerated deliberately: bun resolves workspace:* from it
at publish time, so bumping versions without re-resolving would have
published 8.0.0 packages whose deps pin 2.6.0 — versions never published
under this scope, so every install would 404.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-30 19:56:20 -07:00
zeekayandHanzo Dev 38a546e67c restore @hanzo_network packages and team app dropped by the transplant
The transplant rebuilt the tree on upstream tamagui and carried our own
packages forward by hand, which silently lost seven @hanzo_network/*
packages and apps/team — 735 files with no other home in the workspace.
They are back at the tip of the old lineage's content.

pkgs/ai is NOT restored: @hanzo/ai is published from hanzo-js/ai, so a
copy here would be the duplicate we are trying to avoid.
templates/expo-router is NOT restored: apps/starters/expo-router already
declares that exact package name upstream.

Also fixes a rebrand defect: the blanket tamagui->hanzogui rule rewrote
upstream's GitHub path into github.com/hanzogui/hanzogui, a repo that has
never existed, and it shipped in repository.url for every published
package. The transform now maps the remote to hanzoai/gui and repairs a
tree already branded wrong, so a future sync cannot reintroduce it.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-30 19:53:12 -07:00
zeekayandHanzo Dev 69c6e860d7 transplant onto tamagui v2.6.0, brand as a re-runnable transform
This repo could never sync. There was NO merge-base with tamagui — 372 commits
here against 15,791 there, unrelated histories — because it began as a
copy-paste rebrand with a flattened layout. Every "sync" since was a hand
re-application that drifted, which is why the tree sat on 7.3.1 while upstream
shipped fixes we then rediscovered by hand.

This commit's PARENT IS TAMAGUI. A future sync is `git merge tama/main` then
`node scripts/rebrand.mjs` — a real merge, because the history is now shared.

174 packages: 166 upstream, our 8 restored (chrome, shell, telemetry, recipes,
get, font-geist-{sans,mono}, @hanzo/booker), bento-get gained. 170/170 build.

Our patches to files UPSTREAM ALSO OWNS are carried, which the package-level
delta missed and which was where the value actually was:
  - useMedia's server snapshot (`initState ?? getMedia()`). Upstream still
    returns undefined there, so every Tamagui Dialog kills a prerender — the
    exact crash hanzo.app spent a day on.
  - data-slot on web host nodes, absent upstream entirely.
Both applied ONTO upstream's newer files (it rewrote useMedia +150/-63 and
createComponent +160/-55), marked `PATCH (ours, carried across the transplant)`.

Seven traps are encoded in scripts/rebrand.mjs, each found by a gate:
skip itself and lockfiles; special-case the double-branded names in BOTH scoped
and bare form; map path strings, not just paths; drop a level for the flattened
group; check disk rather than a stale index.

Rust build artifacts are NOT committed. An earlier draft of this commit swept
apps/desktop/src-tauri/target/debug in via `git add -A` — 3,859 files including
a 272MB .a, over GitHub's 100MB cap, so the push could never have landed. They
are gitignored now.

Co-Authored-By: Hanzo Dev <[email protected]>
2026-07-30 18:25:06 -07:00