Files
zeekayandHanzo Dev 6c3c2cf107 feat: converge onto the Hanzo 8.x UI stack (TypeScript 7 native)
Catch this repo up to the published 8.x fleet standard.

Packages (verified latest on npm, not assumed):
  @hanzo/gui        ^7.3.0 → ^8.0.1
  @hanzo/ui         ^8.0.0 → ^8.0.39
  @hanzogui/config  ^7.3.0 → ^8.0.1
  @hanzogui/next-theme ^7.3.0 → ^8.0.0
  @hanzo/data       ^1.2.0 → ^1.2.2
  @hanzogui/lucide-icons-2 — dropped; it is a hard dependency of @hanzo/ui now,
  so naming it here was a second place for one fact to live.

8.x moved DataTable / LineChart / Sparkline off the root barrel (the root is a
client boundary and Next 16 refuses `export *` across one), so those imports
now come from @hanzo/ui/product. The product barrel hard-imports
react-native-svg with no declared dependency on it, so web declares it.

ONE gui config. Both packages carried their own `createGui(defaultConfig)` —
exactly the fork @hanzo/ui/gui-config exists to prevent ("a second app that
copied it would fork it"). Both copies are deleted; gui.d.ts and GuiRoot read
the canonical scale, so the finance board now renders with the type ladder,
radii and spacing the console renders it with.

ONE Hanzo mark. web/src/components/Logo.tsx hand-copied the 7-path glyph
byte-for-byte; it now re-exports @hanzo/ui/product's HanzoMark. No bundle cost —
/signin and /auth/callback stayed at 104 kB.

Post-Tailwind theming: @hanzo/ui 8.x ships its identity as plain CSS custom
properties, so the app imports @hanzo/ui/theme.css + the motion/skeleton rules
and marks <html class="dark">. Body type binds --font-geist-sans. Verified in
the built CSS bundle: --background, --font-geist-sans, .dark and .hz-skeleton
all land alongside the finance brand chrome. (No Tailwind, shadcn or Radix was
ever present in this repo — nothing to strip.)

TypeScript 7 native: @typescript/native-preview, and typecheck/build run tsgo.
Both packages are clean under it. tsgo is stricter than tsc about side-effect
imports of unresolvable modules (TS2882), which is what web/css.d.ts declares —
Next only ships a `*.module.css` declaration.

next.config: @hanzo/gui and all ~114 @hanzogui/* packages ship built dist in
8.x, so the readdirSync sweep that fed transpilePackages is gone. Only the two
packages that publish raw TypeScript source (@hanzo/finance-ui, @hanzo/data)
still need transpiling.

Also: POS/NEG sign colors are exported from one place instead of the hex being
re-spelled in cards.tsx, and ad-hoc `as never` color casts go through
@hanzo/ui's sanctioned `asColor`.

Verified: pnpm install --frozen-lockfile, then the exact web/Dockerfile CI gate —
finance-ui tsgo + 27/27 vitest + next build, 11/11 static pages, exit 0. Booted
the standalone server and rendered the landing page and /signin.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-03 17:57:15 -07:00

33 lines
1.1 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// The @hanzo/ui identity is self-contained CSS custom properties (`@hanzo/ui/theme.css`)
// plus the motion/skeleton rules its components name — imported BEFORE the finance
// brand chrome so `globals.css` layers on top of the fleet tokens, not under them.
import '@hanzo/ui/theme.css'
import '@hanzo/ui/styles/motion.css'
import './globals.css'
import type { Metadata, Viewport } from 'next'
import { resolveConfig } from '~/config'
import { GuiRoot } from '~/components/GuiRoot'
const cfg = resolveConfig()
export const metadata: Metadata = {
title: `${cfg.productName} — one ledger for your money operations`,
description:
'A native double-entry ledger, payment connectors, and a treasury dashboard — run your organization’s financial operations on Hanzo.',
applicationName: cfg.productName,
}
export const viewport: Viewport = {
themeColor: '#08080a',
}
export default function RootLayout({ children }: { children: React.ReactNode }): React.JSX.Element {
return (
<html lang="en" className="dark">
<body>
<GuiRoot>{children}</GuiRoot>
</body>
</html>
)
}