Files
design/tsconfig.json
zeekayandHanzo Dev d595e3e7c7 feat: @luxfi/design is a layer over @hanzo/design, not a fork
Lux and Hanzo run the same greyscale — that is the estate's white-label
model, not an accident to tidy up. So this package now DEPENDS on
@hanzo/design and inherits its neutral ladder, opacity rungs, surface
recipes, type, spacing, elevation and motion at build time. One
hand-authored token file remains: tokens/brand.css, holding the two
things that are genuinely Lux — the gold and the mark constants.

The nine forked token files are deleted. They are what forking costs:
frozen at an older cut of the substrate, they carried a #333333 focus
ring (1.66:1 — a focus indicator nobody can see), a solid #1f1f1f border
that vanishes the moment it lands on a lifted surface, a #666666
"destructive" indistinguishable from a disabled control, and a card cut
at rgb(23 23 23 / .5) that composites to #101010 on the page. Upstream
had already fixed every one. None were decisions; they were drift.

The gold is RECOVERED, not chosen. #B8960C is the last one standing in
the estate: lux.financial still draws its brand badge with
linear-gradient(135deg, <brand> 0%, #B8960C 100%) in three places, beside
a constant reading `BRAND_COLOR = "#FFFFFF"; // Gold accent`. The comment
outlived the value — the accent slot survived every rebrand and the hue
in it was flattened to white. It lands in --brand and nowhere else: not
--accent, which is a surface here and would turn every dropdown row gold;
not --primary, which is the monochrome atom.

Three things happen to the inherited CSS, each load-bearing:
  - comments are stripped (the substrate's prose is Hanzo's)
  - hanzo- becomes lux- (a custom property is vocabulary; a Lux surface
    must not show --hanzo-black in DevTools). --hanzo-black is #0A0A0B,
    exactly what this package's press kit already called --lux-black.
  - @font-face blocks are dropped, and with them every url(). Geist is
    owned by @hanzo/design, which self-hosts it; an estate should hold
    one copy of a font binary, not one per brand. Shipping the rules
    without the files would fail every consumer's build on a missing
    module.

styles.css is generated and flattened, as upstream's is — no @import for
a consumer to resolve, no url() to rebase, no ordering to get wrong. The
brand layer is written LAST because :root and .light have identical
specificity and source order is the only thing deciding.

check-tokens.mjs is the gate, and it runs on the shipped artifacts rather
than the sources — the distinction already mattered once upstream, where
an @import-list entry point passed every source-level check for years
while no bundler could resolve a token from it. It caught a real defect
during this change: the light gold was tuned against the page ground and
measured 3.98:1 on --secondary. It is now #786108, 4.70:1 worst case.

18 checks pass. Four mutation probes confirm the gate fails loudly on a
dangling var(), a reintroduced Hanzo identifier, an unshipped url(), and
a missing .light restatement of the gold (2.23:1 — invisible, silent).

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-05 15:38:31 -07:00

16 lines
325 B
JSON

{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"lib": ["ES2022", "DOM"],
"strict": true,
"declaration": true,
"outDir": "dist",
"rootDir": "src",
"skipLibCheck": true,
"verbatimModuleSyntax": true
},
"include": ["src/**/*.ts"]
}