Files
zeekayandHanzo Dev 0a3ebececd Ship the real Hanzo mark, and stop the chat button sitting on it
The favicon was hand-made. `6c17299` replaced the generated scaffold icon with a
drawn "Hanzo H mark" whose blob is byte-identical to what production still
serves: three layers, fully opaque, polarity inverted, and offset about half a
cell so two of the four corner squares fall off the canvas. At its real 16px
tab size it is a pale smear. Take the mark from `@hanzo/logo` instead — already
a dependency here, already the source of the header logo — and ship the whole
set it publishes: favicon.ico (6 layers, 16→256), favicon.svg, apple-touch-icon.
`<head>` now declares all three; it previously declared one 696px opaque PNG and
nothing else, which also suppressed `app/icon.svg` (deleted — the mark has one
home now).

The header mark was invisible, and the fix on main only moved which theme it was
invisible in. `variant="mono"` does not inherit `currentColor` as Logo.tsx
claimed — it is hardcoded #000000, so main rendered black on the black page.
It is one ink on transparency, exactly like every mark in `partner-logos.ts`, so
it is carried the same way: `hz-ink-black`, none on light and invert(1) on dark.
The inversion lands on #ffffff/#DDDDDD, which is the `white` variant byte for
byte.

The chat launcher was covering the logo. `hz-fixed` sets `position: fixed` and
nothing else, so a fixed element with no offsets stays where it was: top-left,
48px square, directly over the mark, on every page and both themes. Nothing
could catch it — every class on the button had a rule, the missing one was never
written. Added `hz-dock` as that one rule, and sized the panel against the
viewport so it cannot grow past the screen it is docked to. The panel also took
`hz-bg` from `hz-bg-surface`, whose dark value is rgba(38,38,38,.5): right for a
card on the page, wrong for one floating over it.

A fabricated trademark is gone. `lux-network.svg` was hand-coded rects and
polygons spelling "LUX", nothing like the real mark, duplicated under three
filenames. Lux and Zoo Labs are sibling orgs in this estate, not our clients —
their marks and their entries in `clients` are both removed. A Hanzo surface
carries Hanzo branding.

Every share card 404'd: og:image pointed at `/opengraph-image`, a file-convention
route this app does not have, while the real `/og-image.png` sat declared and
unused. og:site_name was carrying the tagline and twitter:title disagreed with
og:title; both now say what they are.

The repo count contradicted itself in one viewport — "727+" in the hero, "2,500+"
in a tile 200px below it, 3.4x apart, and both in `<head>`. Neither survives
measurement: 535 non-archived public repos across the six orgs the site names.
Stated once now, as a floor, with the query that produced it.

"All systems operational" was a hardcoded string on every page with no health
check behind it — it would have said that straight through an outage. It links
to /status as "System status" instead.

Verified in a real browser at 390 and 1280, light and dark: the mark matches an
isolated render of the same SVG (mean abs diff 0.05/255) and dark is its exact
inverse; `elementFromPoint` at the mark's centre returns its own path; the
served .ico is 2b734c3b, six layers. Routes 60/60, no overflow, no console
errors.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-05 16:27:35 -07:00

112 lines
5.5 KiB
TypeScript

'use client'
import Link from 'next/link'
import { Activity, Github, FileText, Award, ExternalLink } from 'lucide-react'
import Logo from './Logo'
import { cn } from '@hanzo/ui'
import site from '@/site.config'
const linkCn = 'hz-t-sm hz-link'
export default function Footer() {
return (
<footer className="hz-border-t hz-bg hz-fg">
<div className="hz-container hz-py-7">
<div className="hz-grid hz-grid-5 hz-gap-6">
<div className="">
<Logo size="md" showText={true} className="hz-mb-5" />
<p className="hz-mb-5 hz-mw-sm hz-fg">
{site.brand.description}
</p>
<div className="hz-row hz-ai-center hz-inline-4">
<Link href="/open-source" className="hz-row hz-ai-center hz-inline-2">
<Github className="hz-sq-3 hz-transition hz-fg hz-hoverable" />
<span className="hz-t-sm hz-transition hz-fg hz-hoverable">Open Source</span>
</Link>
<Link href="/research#papers" className="hz-row hz-ai-center hz-inline-2">
<FileText className="hz-sq-3 hz-transition hz-fg hz-hoverable" />
<span className="hz-t-sm hz-transition hz-fg hz-hoverable">130+ Papers</span>
</Link>
</div>
</div>
<div>
<h4 className="hz-w-semibold hz-mb-4">Products</h4>
<ul className="hz-stack-3">
<li><a href={site.links.platform} target="_blank" rel="noopener noreferrer" className={linkCn}>Hanzo AI</a></li>
<li><a href={site.links.bot} target="_blank" rel="noopener noreferrer" className={linkCn}>Hanzo Bot</a></li>
<li><a href={site.links.dev} target="_blank" rel="noopener noreferrer" className={linkCn}>Hanzo Dev</a></li>
<li><a href={site.links.team} target="_blank" rel="noopener noreferrer" className={linkCn}>Hanzo Team</a></li>
<li><a href={site.links.chat} target="_blank" rel="noopener noreferrer" className={linkCn}>Hanzo Chat</a></li>
<li><Link href="/models" className={linkCn}>Zen Models</Link></li>
</ul>
</div>
<div>
<h4 className="hz-w-semibold hz-mb-4">Research</h4>
<ul className="hz-stack-3">
<li><Link href="/research#ai" className={linkCn}>AI & Machine Learning</Link></li>
<li><Link href="/research#crypto" className={linkCn}>Cryptography</Link></li>
<li><Link href="/research#consensus" className={linkCn}>Consensus & Networks</Link></li>
<li><Link href="/research#papers" className={linkCn}>Papers</Link></li>
<li><a href={site.links.docs} target="_blank" rel="noopener noreferrer" className={linkCn}>Documentation</a></li>
</ul>
</div>
<div>
<h4 className="hz-w-semibold hz-mb-4">Company</h4>
<ul className="hz-stack-3">
<li><Link href="/about" className={linkCn}>About Us</Link></li>
<li><Link href="/team" className={linkCn}>Team</Link></li>
<li><Link href="/careers" className={linkCn}>Careers</Link></li>
<li><Link href="/press" className={linkCn}>Press</Link></li>
<li><Link href="/contact" className={linkCn}>Contact</Link></li>
</ul>
</div>
</div>
{/* Powered by Zen banner */}
<div className="hz-mt-7 hz-pt-6 hz-border-t">
<div className="hz-col-row hz-ai-center hz-jc-center hz-gap-3 hz-mb-6">
<span className="hz-t-sm hz-fg-soft">Powered by</span>
<a href={site.links.zenModels} target="_blank" rel="noopener noreferrer"
className="hz-btn hz-btn-primary hz-gap-2 hz-transition hz-fg"
>
<span className="hz-fg hz-t-sm">&#9889;</span>
<span className="hz-t-sm hz-w-medium">Zen 4 Models</span>
<span className="hz-t-xs hz-fg">600M-1T+ params</span>
</a>
</div>
</div>
<div className="hz-pt-6 hz-border-t">
<div className="hz-col-row hz-jc-between hz-ai-center hz-stack-4">
<div className="hz-row hz-wrap hz-ai-center hz-gap-6 hz-gap-2">
<div className="hz-t-sm hz-fg">
&copy; {site.brand.foundedYear}-{new Date().getFullYear()} {site.brand.legalName}. All rights reserved.
</div>
{/* A link to the status page, not a verdict about it. This read
"All systems operational" as a hardcoded string on every page
of the site, with no health check behind it — it would have
gone on saying that straight through an outage. */}
<Link href="/status" className="hz-inline hz-ai-center hz-inline-2 hz-t-sm hz-transition hz-fg hz-hoverable">
<Activity className="hz-sq-2 hz-fg" />
<span>System status</span>
</Link>
</div>
<div className="hz-row hz-wrap hz-ai-center hz-gap-5 hz-gap-2">
<div className="hz-row hz-ai-center hz-inline-2">
<Award className="hz-sq-2 hz-fg" />
<span className="hz-t-sm hz-fg">{site.brand.badge}</span>
</div>
<Link href="/privacy" className={linkCn}>Privacy Policy</Link>
<Link href="/terms" className={linkCn}>Terms of Service</Link>
<Link href="/security" className={linkCn}>Security</Link>
</div>
</div>
</div>
</div>
</footer>
)
}