30 Commits
Author SHA1 Message Date
zeekay af68fa15fb v8.4.2 2026-10-22 18:56:01 -07:00
zeekay d9ee6a066b v8.4.1
Claude-Session: https://claude.ai/code/session_01BLLMyBFSvAfCt7ZGqYuiEz
2026-10-22 15:45:13 -07:00
zeekay af461eb5e4 v8.4.0
Claude-Session: https://claude.ai/code/session_01BLLMyBFSvAfCt7ZGqYuiEz
2026-10-22 13:02:19 -07:00
zooqueenandHanzo Dev 31ad1f039e Team is its own repo now
apps/team moved to hanzo-apps/team with its history, and builds there
against the published @hanzo/gui. It leaves the workspace list, the
lockfile, and the Written-at-Hanzo list in every NOTICE (ten names
become nine).


Co-authored-by: Hanzo Dev <[email protected]>
2026-09-23 15:53:45 -07:00
zeekayandHanzo Dev d1a39698ee Give the ramp every hue and boot it dark
Yellow and orange were dropped for failing 3:1 against the light ground at
one uniform rung, which was a fact about the rung. Each stop now names the
rung that shows it on each scheme, and every dot carries an ink hairline —
the edge that draws white on white, black on black, and the yellow that no
rung can both darken and keep yellow. White, grey and black join as stops;
grey still clears the accent, and none of the three washes the page, since
an absolute palette under the other scheme's ink is a page with its text
turned off.

Dark is the default a reader who has named neither scheme gets: the meta
hands the UA dark rather than the machine's own answer, and the setting
that meant "ask the machine" is dropped, since the pre-paint script and the
app resolved it differently and the page turned light a frame after booting.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-07 23:35:59 -07:00
zeekay ab754ba686 Every published package carries the license it is under
151 packages of Tamagui-derived code are on npm with no license text in
them. Checked four tarballs at 8.3.5 — @hanzogui/core, @hanzogui/web,
@hanzogui/shell and @hanzo/gui — and not one contains a LICENSE file.

MIT asks for one thing: "The above copyright notice and this permission
notice shall be included in all copies or substantial portions of the
Software." Shipping the code without it does not meet that.

The cause is mechanical rather than deliberate. npm includes a LICENSE
that sits in the package directory, and ours sits at the monorepo root,
where it reaches no tarball. So the license is now in each of the 153
publishable packages, and NOTICE beside it — that one npm will not take on
its own, so 152 manifests name it in `files`.

Verified by dry-run pack: 1.3kB LICENSE, 2.8kB NOTICE.

Already-published tarballs are immutable, so this corrects on the next
publish and not before.
2026-09-07 23:06:05 -07:00
zeekayandHanzo Dev 3e6e277b08 Make every tint stop read on both grounds
Three of the seven stops were yellow, which over the dark ground is an
olive, and the swatches sat in a Group, whose zeroed radii cut a straight
edge through each selection ring. The ramp now sweeps one arc of the
wheel and every stop is measured: the dimmest clears 3:1 against each of
the seven grounds the page can paint, on both schemes. Picking one writes
the accent through @hanzo/appearance, so the choice outlives the visit.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-07 19:48:14 -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 5a07cee3b1 v8.3.2 2026-09-05 03:11:37 -07:00
zeekayandHanzo Dev 42bd70986b Ship source, ESM, CommonJS and types from each package
Every published manifest now states the same exports: types, the
native emit where the package builds one, ESM under import and
CommonJS under require, with src, types and dist in files. The nine
packages that read import.meta do so in one here.ts each, with a
here.cjs.ts sibling for the CommonJS emit; the stragglers on bun,
esbuild, plain tsc or hand-written shims build with the runner like
everything else, and the root-level .cjs shims that pointed at emits
no build produces are gone, as is the vite-plugin-cjs mirror.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-04 21:07:06 -07:00
zeekayandHanzo Dev fd796e3eb4 Emit CommonJS for every package
The CJS pass ran only where a manifest named a require entry, so an
ESM-only package could drift into the tree and a package marked
commonjs could carry ESM files. Now every package gets all three emits
from tsgo; a .cjs.ts sibling answers for the one file that needs
import.meta, and the CommonJS output is parsed as a script so a module
that cannot load there fails the build by name.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-04 21:07:03 -07:00
zeekay 834a904e48 Format with oxfmt 2026-09-04 09:04:51 -07:00
zeekay e4b4e50911 Name the siblings a build reads
turbo orders a build by declared dependencies, and a forced rebuild found
three packages typechecking against siblings they never named, one of them
through a subpath the types package no longer exports.
2026-09-04 09:04:41 -07:00
zeekay de489abd1e Resolve every sibling package through node_modules
The project files inherited the root paths map, so a package's typecheck
read its siblings' source instead of their published declarations and
failed on files that were never its own. An ESM-only manifest now names
no dist/cjs path under any condition, the native emit names its renamed
map, and the runner has a test of its own again.
2026-09-03 18:02:50 -07:00
zeekay 77e8398deb Build every package with the TypeScript compiler alone
Babel and esbuild were never here for TypeScript. Babel carried the static
optimizing compiler and one plugin that appended extensions to esbuild's
emitted imports; source now names its own extensions and the compiler rewrites
them on emit. A sixty-line runner replaces the tool: an ESM emit with
declarations, a CommonJS emit where a manifest states a require entry, and a
native emit where a .native sibling takes its sibling's name. The compiler
packages keep Babel as their own substrate; nothing else runs over the code.
Eighteen packages still carry type errors the previous tool never checked.
2026-09-03 17:14:57 -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 56fc65d9ce v5 names what it re-exports, so the names survive
@hanzogui/config/v5 starred both @hanzogui/themes/v5 and ./v5-base, and
v5-base re-exports a dozen names it takes from themes/v5 — createThemes,
tokens, the palette helpers, the theme types. ESM calls a doubly-starred name
ambiguous and omits it rather than picking one, so every shared name silently
left the module: `import { tokens } from '@hanzogui/config/v5'` compiled and
resolved to undefined.

It ships as a patch in at least one consumer, which is the wrong home for it —
a fix in a patch file is a fix exactly one app gets, and only until its
overrides drift. So v5 now names the nine things themes/v5 carries that
v5-base does not, and everything they share arrives through v5-base, which is
the module that already curates it.

8.3.1.
2026-08-28 14:23:46 -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 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
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 1cb6bc9b9a fix(chrome): delete the second nav, and kill all-caps at the font token (8.0.4)
Two packages both claimed to be "the ONE public chrome". @hanzogui/chrome's
HanzoNav was a whole parallel header — uppercase section heads, its own hover
palette, a "Log in" dropdown beside a second CTA dropdown — i.e. exactly the
menu the owner screenshotted. It had zero consumers, so it is deleted rather
than restyled; @hanzogui/shell's HanzoHeader is the header.

The all-caps had a deeper cause than any component. The heading font's transform
scale said `6: 'uppercase'`, and that scale spreads DOWN — steps 1-6 all
inherited it — so every small heading (<H6>, menu and command-group heads) went
caps from a token no surface could see or override locally. Fixed at the token,
which is how the fix reaches every surface at once instead of one nav at a time.

  pkgs/core/config/src/fonts.ts, pkgs/dev-config/src/fonts.ts  transform 6 -> none
  pkgs/ui/chrome/src/styles.tsx  the `kicker` head is sentence case, ranked by
    weight and brightness, matching shell's LABEL token
  shell 8.0.3 -> 8.0.4 (HEAD carried the sentence-case fix unversioned)
  chrome 8.0.1 -> 8.0.2

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-03 17:55:19 -07:00
zeekayandHanzo Dev ed3e545e34 release: 8.0.1 for the closure the undeclared-sibling fix had to move
The six manifest fixes are only reachable if every package that pins one
of them moves too: intra-workspace deps publish as exact versions, so
@hanzo/[email protected] asks for [email protected] by number and would keep resolving
the broken copy no matter what 8.0.1 said. Walking the exact-pin edges
back from the six gives 76 packages, all bumped here to the versions now
on npm.

Published from the 8.0.0 release point (15c59decd) rather than this
branch, so the patch carries the manifest fix and nothing else — main has
since gained the Geist typeface and the brand themes, which are features
and do not belong in a patch. Source for the six is identical between the
two points; 625 of the published packages diff clean against the release
point, and the 17 that do not are the hanzogui -> @hanzo/gui rename that
8.0.0 shipped half-applied.

Versions recorded here so the next release computes from what exists.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-03 11:02:10 -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 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