@hanzo/design 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +57 -0
- package/assets/brand/hero-visualization.png +0 -0
- package/assets/brand/industry-cloud.png +0 -0
- package/assets/brand/industry-engineering.png +0 -0
- package/assets/brand/industry-infrastructure.png +0 -0
- package/assets/brand/og-image.png +0 -0
- package/assets/favicon.svg +8 -0
- package/assets/logo-dark.svg +9 -0
- package/assets/logo-light.svg +9 -0
- package/assets/logo-wordmark.png +0 -0
- package/assets/logo.svg +9 -0
- package/assets/logos/anthropic.svg +3 -0
- package/assets/logos/deepseek.svg +4 -0
- package/assets/logos/google.svg +6 -0
- package/assets/logos/groq.svg +3 -0
- package/assets/logos/huggingface.svg +3 -0
- package/assets/logos/mistral.svg +22 -0
- package/assets/logos/openai.svg +3 -0
- package/assets/logos/openrouter.svg +1 -0
- package/assets/logos/partners/aws.svg +12 -0
- package/assets/logos/partners/googlecloud.svg +3 -0
- package/assets/logos/partners/lux.svg +6 -0
- package/assets/logos/partners/nvidia.svg +7 -0
- package/assets/logos/partners/techstars.svg +1 -0
- package/assets/logos/partners/zoo-labs-foundation.svg +7 -0
- package/assets/logos/qwen.svg +1 -0
- package/assets/logos/replicate.svg +3 -0
- package/assets/logos/together.svg +6 -0
- package/assets/logos/xai.svg +3 -0
- package/assets/providers/claude.svg +3 -0
- package/assets/providers/codex.svg +3 -0
- package/assets/providers/copilot.svg +3 -0
- package/assets/providers/cursor.svg +3 -0
- package/assets/providers/gemini.svg +3 -0
- package/assets/providers/grok.svg +4 -0
- package/assets/providers/ollama.svg +7 -0
- package/components/core/Avatar.d.ts +5 -0
- package/components/core/Avatar.jsx +15 -0
- package/components/core/Avatar.prompt.md +8 -0
- package/components/core/Badge.d.ts +10 -0
- package/components/core/Badge.jsx +47 -0
- package/components/core/Badge.prompt.md +9 -0
- package/components/core/Button.d.ts +9 -0
- package/components/core/Button.jsx +48 -0
- package/components/core/Button.prompt.md +9 -0
- package/components/core/Card.d.ts +15 -0
- package/components/core/Card.jsx +46 -0
- package/components/core/Card.prompt.md +13 -0
- package/components/core/ChromeText.d.ts +10 -0
- package/components/core/ChromeText.jsx +29 -0
- package/components/core/ChromeText.prompt.md +8 -0
- package/components/core/HanzoLogo.d.ts +11 -0
- package/components/core/HanzoLogo.jsx +28 -0
- package/components/core/HanzoLogo.prompt.md +8 -0
- package/components/core/Icon.d.ts +10 -0
- package/components/core/Icon.jsx +43 -0
- package/components/core/Icon.prompt.md +9 -0
- package/components/core/Progress.d.ts +8 -0
- package/components/core/Progress.jsx +11 -0
- package/components/core/Progress.prompt.md +8 -0
- package/components/core/Table.d.ts +11 -0
- package/components/core/Table.jsx +30 -0
- package/components/core/Table.prompt.md +10 -0
- package/components/core/core.card.html +56 -0
- package/components/forms/Checkbox.d.ts +10 -0
- package/components/forms/Checkbox.jsx +33 -0
- package/components/forms/Checkbox.prompt.md +8 -0
- package/components/forms/Input.d.ts +3 -0
- package/components/forms/Input.jsx +21 -0
- package/components/forms/Input.prompt.md +8 -0
- package/components/forms/Label.d.ts +3 -0
- package/components/forms/Label.jsx +9 -0
- package/components/forms/Label.prompt.md +8 -0
- package/components/forms/Select.d.ts +9 -0
- package/components/forms/Select.jsx +33 -0
- package/components/forms/Select.prompt.md +7 -0
- package/components/forms/Slider.d.ts +7 -0
- package/components/forms/Slider.jsx +22 -0
- package/components/forms/Slider.prompt.md +7 -0
- package/components/forms/Textarea.d.ts +3 -0
- package/components/forms/Textarea.jsx +21 -0
- package/components/forms/Textarea.prompt.md +7 -0
- package/components/forms/forms.card.html +39 -0
- package/components/navigation/Accordion.d.ts +11 -0
- package/components/navigation/Accordion.jsx +37 -0
- package/components/navigation/Accordion.prompt.md +10 -0
- package/components/navigation/Tabs.d.ts +10 -0
- package/components/navigation/Tabs.jsx +47 -0
- package/components/navigation/Tabs.prompt.md +11 -0
- package/components/navigation/navigation.card.html +31 -0
- package/components/overlays/Dialog.d.ts +12 -0
- package/components/overlays/Dialog.jsx +41 -0
- package/components/overlays/Dialog.prompt.md +13 -0
- package/components/overlays/DropdownMenu.d.ts +13 -0
- package/components/overlays/DropdownMenu.jsx +49 -0
- package/components/overlays/DropdownMenu.prompt.md +11 -0
- package/components/overlays/Sheet.d.ts +12 -0
- package/components/overlays/Sheet.jsx +31 -0
- package/components/overlays/Sheet.prompt.md +10 -0
- package/components/overlays/Toaster.d.ts +12 -0
- package/components/overlays/Toaster.jsx +49 -0
- package/components/overlays/Toaster.prompt.md +9 -0
- package/components/overlays/overlays.card.html +44 -0
- package/content/README.md +13 -0
- package/content/taglines.md +46 -0
- package/content/voice.md +52 -0
- package/docs/README.md +44 -0
- package/docs/integrate.md +86 -0
- package/guidelines/brand-elevation.card.html +14 -0
- package/guidelines/brand-imagery.card.html +16 -0
- package/guidelines/brand-mark.card.html +21 -0
- package/guidelines/brand-motion.card.html +14 -0
- package/guidelines/brand-partner-logos.card.html +23 -0
- package/guidelines/brand-radii.card.html +17 -0
- package/guidelines/color-borders.card.html +16 -0
- package/guidelines/color-neutrals.card.html +24 -0
- package/guidelines/color-opacity-ladder.card.html +22 -0
- package/guidelines/color-semantic.card.html +17 -0
- package/guidelines/color-surfaces.card.html +17 -0
- package/guidelines/color-text-ranks.card.html +16 -0
- package/guidelines/iconography.card.html +30 -0
- package/guidelines/layout-containers.card.html +15 -0
- package/guidelines/spacing-golden.card.html +19 -0
- package/guidelines/spacing-scale.card.html +23 -0
- package/guidelines/type-body.card.html +14 -0
- package/guidelines/type-chrome.card.html +14 -0
- package/guidelines/type-display.card.html +14 -0
- package/guidelines/type-eyebrow.card.html +14 -0
- package/guidelines/type-mono.card.html +14 -0
- package/guidelines/type-scale.card.html +20 -0
- package/package.json +45 -0
- package/prompts/README.md +26 -0
- package/prompts/pages.md +53 -0
- package/prompts/rules.md +58 -0
- package/prompts/system.md +102 -0
- package/styles.css +11 -0
- package/tokens/base.css +12 -0
- package/tokens/colors.css +125 -0
- package/tokens/elevation.css +19 -0
- package/tokens/fonts.css +13 -0
- package/tokens/motion.css +24 -0
- package/tokens/radius.css +10 -0
- package/tokens/spacing.css +45 -0
- package/tokens/typography.css +46 -0
- package/tokens/z.css +14 -0
- package/ui_kits/hanzo_ai_site/SiteChrome.jsx +131 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/* TIGHT app-first type scale — the compact developer-app register (linear.app /
|
|
2
|
+
vercel.com / the Codex desktop look), the Hanzo default across chat / app /
|
|
3
|
+
desktop. Base is 14px, nav 13px, labels 11px; display sizes tightened. Kept in
|
|
4
|
+
lockstep with @hanzo/brand (styles/variables.css --font-size-* + typography.ts)
|
|
5
|
+
— the two are the SAME scale, mirrored. A surface/tenant overrides any --text-*
|
|
6
|
+
on :root to retune density on demand. */
|
|
7
|
+
:root{
|
|
8
|
+
--text-xs:0.6875rem; --leading-xs:1rem; /* 11px — eyebrows / section labels */
|
|
9
|
+
--text-sm:0.8125rem; --leading-sm:1.15rem; /* 13px — nav labels, dense body */
|
|
10
|
+
--text-base:0.875rem; --leading-base:1.35rem; /* 14px — base app text (was 16px) */
|
|
11
|
+
--text-lg:0.9375rem; --leading-lg:1.4rem; /* 15px */
|
|
12
|
+
--text-xl:1.0625rem; --leading-xl:1.55rem; /* 17px */
|
|
13
|
+
--text-2xl:1.3125rem; --leading-2xl:1.7rem; /* 21px */
|
|
14
|
+
--text-3xl:1.625rem; --leading-3xl:1.95rem; /* 26px */
|
|
15
|
+
--text-4xl:2rem; --leading-4xl:2.25rem; /* 32px */
|
|
16
|
+
--text-5xl:2.5rem; --leading-5xl:1.05; /* 40px */
|
|
17
|
+
--text-6xl:3.25rem; --leading-6xl:1; /* 52px */
|
|
18
|
+
--text-7xl:4rem; --leading-7xl:1; /* 64px */
|
|
19
|
+
|
|
20
|
+
--weight-normal:400;
|
|
21
|
+
--weight-medium:500;
|
|
22
|
+
--weight-semibold:600;
|
|
23
|
+
--weight-bold:700;
|
|
24
|
+
|
|
25
|
+
--tracking-tight:-0.025em;
|
|
26
|
+
--tracking-normal:0em;
|
|
27
|
+
--tracking-wide:0.025em;
|
|
28
|
+
--tracking-widest:0.1em; /* eyebrows / uppercase category labels */
|
|
29
|
+
|
|
30
|
+
--leading-none:1;
|
|
31
|
+
--leading-tight:1.25;
|
|
32
|
+
--leading-snug:1.375;
|
|
33
|
+
--leading-normal:1.5;
|
|
34
|
+
--leading-relaxed:1.625;
|
|
35
|
+
--leading-golden:1.618;
|
|
36
|
+
|
|
37
|
+
/* named roles */
|
|
38
|
+
--type-hero:600 var(--text-5xl)/1.05 var(--font-display);
|
|
39
|
+
--type-h2:700 var(--text-4xl)/var(--leading-4xl) var(--font-display);
|
|
40
|
+
--type-h3:600 var(--text-xl)/var(--leading-xl) var(--font-display);
|
|
41
|
+
--type-lead:400 var(--text-lg)/var(--leading-relaxed) var(--font-sans);
|
|
42
|
+
--type-body:400 var(--text-sm)/var(--leading-sm) var(--font-sans);
|
|
43
|
+
--type-caption:400 var(--text-xs)/var(--leading-xs) var(--font-sans);
|
|
44
|
+
--type-code:400 var(--text-sm)/var(--leading-relaxed) var(--font-mono);
|
|
45
|
+
--type-eyebrow:600 0.625rem/1 var(--font-sans);
|
|
46
|
+
}
|
package/tokens/z.css
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/* Stacking order — the one z-index ladder. Layers are named by role, never by a
|
|
2
|
+
magic number, so a dropdown opened from the fixed header always sits above it
|
|
3
|
+
and nothing ever reaches for 9999. Below --z-raised is ordinary document flow. */
|
|
4
|
+
:root{
|
|
5
|
+
--z-base:0;
|
|
6
|
+
--z-raised:10; /* hover-lifted cards, sticky table headers */
|
|
7
|
+
--z-sticky:200; /* pinned section rails */
|
|
8
|
+
--z-header:300; /* the fixed site header */
|
|
9
|
+
--z-dropdown:400; /* menus, selects, comboboxes */
|
|
10
|
+
--z-overlay:500; /* dialog / sheet scrim */
|
|
11
|
+
--z-modal:600; /* dialogs, sheets, command palette */
|
|
12
|
+
--z-popover:700; /* popovers, tooltips (also when anchored in modals)*/
|
|
13
|
+
--z-toast:800; /* toasts / notifications — always on top */
|
|
14
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
|
|
3
|
+
/** hanzo.ai's openai-style landing header: fixed, blurred, hairline-bottomed. */
|
|
4
|
+
export function SiteNav({ nav = [], active, onOpen, onFocusComposer, scrolled = false }) {
|
|
5
|
+
const { HanzoLogo, Button, Icon, DropdownMenu, DropdownMenuItem } = window.HanzoDesignSystem_0a9445
|
|
6
|
+
return (
|
|
7
|
+
<header
|
|
8
|
+
onMouseLeave={() => onOpen && onOpen(null)}
|
|
9
|
+
style={{ position: 'sticky', top: 0, zIndex: 50, borderBottom: '1px solid rgb(38 38 38 / .8)', background: 'var(--surface-header)', backdropFilter: 'blur(12px)' }}
|
|
10
|
+
>
|
|
11
|
+
<nav style={{ display: 'flex', alignItems: 'center', gap: 8, height: 64, maxWidth: 'var(--container-max)', margin: '0 auto', padding: '0 32px' }}>
|
|
12
|
+
<a href="#" style={{ display: 'inline-flex', alignItems: 'center', flexShrink: 0, textDecoration: 'none' }}>
|
|
13
|
+
<HanzoLogo size={22} />
|
|
14
|
+
<span style={{ overflow: 'hidden', whiteSpace: 'nowrap', marginLeft: scrolled ? 0 : 8, width: scrolled ? 0 : 'auto', opacity: scrolled ? 0 : 1, fontSize: 15, fontWeight: 600, letterSpacing: 'var(--tracking-tight)', color: '#fff', transition: 'all .25s var(--ease-in-out)' }}>Hanzo AI</span>
|
|
15
|
+
</a>
|
|
16
|
+
|
|
17
|
+
<div style={{ marginLeft: 16, display: 'flex', alignItems: 'center' }}>
|
|
18
|
+
{nav.map((item) => (
|
|
19
|
+
item.href ? (
|
|
20
|
+
<a key={item.label} href={item.href} onMouseEnter={() => onOpen && onOpen(null)}
|
|
21
|
+
style={{ display: 'inline-flex', alignItems: 'center', gap: 2, borderRadius: 'var(--radius-full)', padding: '8px 12px', fontSize: 'var(--text-sm)', color: 'var(--neutral-300)', textDecoration: 'none' }}>
|
|
22
|
+
{item.label}<Icon name="ArrowUpRight" size={14} color="var(--neutral-500)" />
|
|
23
|
+
</a>
|
|
24
|
+
) : (
|
|
25
|
+
<button key={item.label} onMouseEnter={() => onOpen && onOpen(item.label)} aria-expanded={active === item.label}
|
|
26
|
+
style={{ display: 'inline-flex', alignItems: 'center', gap: 4, border: 'none', background: 'transparent', cursor: 'pointer', borderRadius: 'var(--radius-full)', padding: '8px 12px', fontFamily: 'var(--font-sans)', fontSize: 'var(--text-sm)', color: active === item.label ? '#fff' : 'var(--neutral-300)', transition: 'color var(--duration-fast) var(--ease-out)' }}>
|
|
27
|
+
{item.label}<Icon name="ChevronDown" size={14} color="var(--neutral-500)" />
|
|
28
|
+
</button>
|
|
29
|
+
)
|
|
30
|
+
))}
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
<div style={{ marginLeft: 'auto', display: 'flex', alignItems: 'center', gap: 8 }}>
|
|
34
|
+
<button onClick={onFocusComposer} aria-label="Search" style={{ display: 'inline-flex', border: 'none', background: 'transparent', cursor: 'pointer', borderRadius: 'var(--radius-full)', padding: 8, color: 'var(--neutral-300)' }}>
|
|
35
|
+
<Icon name="Search" size={16} />
|
|
36
|
+
</button>
|
|
37
|
+
<DropdownMenu hover align="right" trigger={
|
|
38
|
+
<button style={{ display: 'inline-flex', alignItems: 'center', gap: 4, border: 'none', background: 'transparent', cursor: 'pointer', borderRadius: 'var(--radius-full)', padding: '8px 12px', fontFamily: 'var(--font-sans)', fontSize: 'var(--text-sm)', color: 'var(--neutral-300)' }}>
|
|
39
|
+
Log in<Icon name="ChevronDown" size={14} color="var(--neutral-500)" />
|
|
40
|
+
</button>}>
|
|
41
|
+
<DropdownMenuItem>Hanzo Chat</DropdownMenuItem>
|
|
42
|
+
<DropdownMenuItem>API Platform</DropdownMenuItem>
|
|
43
|
+
<DropdownMenuItem>Cloud</DropdownMenuItem>
|
|
44
|
+
</DropdownMenu>
|
|
45
|
+
<DropdownMenu hover align="right" trigger={<Button pill>Try Hanzo <Icon name="ChevronDown" size={16} /></Button>}>
|
|
46
|
+
<DropdownMenuItem desc="Chat with frontier models">Hanzo Chat</DropdownMenuItem>
|
|
47
|
+
<DropdownMenuItem desc="One model to command them all">Enso</DropdownMenuItem>
|
|
48
|
+
<DropdownMenuItem desc="Build and ship AI apps">Hanzo App</DropdownMenuItem>
|
|
49
|
+
<DropdownMenuItem desc="The creative AI studio">Hanzo Studio</DropdownMenuItem>
|
|
50
|
+
<DropdownMenuItem desc="The full open-source AI cloud">Hanzo Cloud</DropdownMenuItem>
|
|
51
|
+
</DropdownMenu>
|
|
52
|
+
</div>
|
|
53
|
+
</nav>
|
|
54
|
+
|
|
55
|
+
{active && <MegaPanel item={nav.find((i) => i.label === active)} />}
|
|
56
|
+
</header>
|
|
57
|
+
)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** The full-width dropout: one big "Explore <section>" column, then link columns. */
|
|
61
|
+
function MegaPanel({ item }) {
|
|
62
|
+
if (!item || !item.explore) return null
|
|
63
|
+
const cols = item.columns || []
|
|
64
|
+
return (
|
|
65
|
+
<div style={{ position: 'absolute', left: 0, right: 0, top: '100%', borderBottom: '1px solid var(--neutral-800)', background: '#000', boxShadow: 'var(--shadow-floating)', animation: 'hanzo-fade-down var(--duration-fast) var(--ease-out)' }}>
|
|
66
|
+
<div style={{ display: 'grid', gridTemplateColumns: cols.length ? 'minmax(0,1.1fr) minmax(0,2fr)' : '1fr', gap: 40, maxWidth: 'var(--container-max)', margin: '0 auto', padding: '40px 32px' }}>
|
|
67
|
+
<div>
|
|
68
|
+
<div style={{ marginBottom: 20, fontSize: 'var(--text-xs)', fontWeight: 500, textTransform: 'uppercase', letterSpacing: 'var(--tracking-widest)', color: 'var(--neutral-500)' }}>Explore {item.label}</div>
|
|
69
|
+
<ul style={{ listStyle: 'none', margin: 0, padding: 0, display: 'flex', flexDirection: 'column', gap: 2 }}>
|
|
70
|
+
{item.explore.map((l) => (
|
|
71
|
+
<li key={l.label}>
|
|
72
|
+
<a href="#" style={{ display: 'flex', flexDirection: 'column', borderRadius: 'var(--radius-md)', padding: '6px 8px', margin: '0 -8px', textDecoration: 'none' }}>
|
|
73
|
+
<span style={{ fontSize: 'var(--text-2xl)', fontWeight: 500, color: '#fff' }}>{l.label}</span>
|
|
74
|
+
{l.desc && <span style={{ fontSize: 'var(--text-xs)', color: 'var(--neutral-500)' }}>{l.desc}</span>}
|
|
75
|
+
</a>
|
|
76
|
+
</li>
|
|
77
|
+
))}
|
|
78
|
+
</ul>
|
|
79
|
+
</div>
|
|
80
|
+
{cols.length > 0 && (
|
|
81
|
+
<div style={{ display: 'grid', gap: 32, gridTemplateColumns: `repeat(${cols.length}, minmax(0,1fr))` }}>
|
|
82
|
+
{cols.map((col) => (
|
|
83
|
+
<div key={col.title}>
|
|
84
|
+
<div style={{ marginBottom: 12, fontSize: 'var(--text-xs)', fontWeight: 500, textTransform: 'uppercase', letterSpacing: 'var(--tracking-widest)', color: 'var(--neutral-500)' }}>{col.title}</div>
|
|
85
|
+
<ul style={{ listStyle: 'none', margin: 0, padding: 0, display: 'flex', flexDirection: 'column', gap: 4 }}>
|
|
86
|
+
{col.links.map((link) => (
|
|
87
|
+
<li key={link.label}>
|
|
88
|
+
<a href="#" style={{ display: 'block', borderRadius: 'var(--radius-md)', padding: '6px 8px', margin: '0 -8px', textDecoration: 'none' }}>
|
|
89
|
+
<span style={{ fontSize: 'var(--text-sm)', fontWeight: 500, color: 'var(--neutral-100)' }}>{link.label}</span>
|
|
90
|
+
{link.desc && <span style={{ display: 'block', marginTop: 2, fontSize: 'var(--text-xs)', color: 'var(--neutral-500)' }}>{link.desc}</span>}
|
|
91
|
+
</a>
|
|
92
|
+
</li>
|
|
93
|
+
))}
|
|
94
|
+
</ul>
|
|
95
|
+
</div>
|
|
96
|
+
))}
|
|
97
|
+
</div>
|
|
98
|
+
)}
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** The minimal apex footer: mark + one line, four link columns, hairline base. */
|
|
105
|
+
export function SiteFooter({ columns = [] }) {
|
|
106
|
+
const { HanzoLogo, Icon } = window.HanzoDesignSystem_0a9445
|
|
107
|
+
return (
|
|
108
|
+
<footer style={{ borderTop: '1px solid var(--neutral-900)', padding: '56px 32px' }}>
|
|
109
|
+
<div style={{ maxWidth: 'var(--container-wide)', margin: '0 auto' }}>
|
|
110
|
+
<div style={{ display: 'grid', gap: 40, gridTemplateColumns: 'repeat(5, minmax(0,1fr))' }}>
|
|
111
|
+
<div>
|
|
112
|
+
<span style={{ display: 'inline-flex', alignItems: 'center', gap: 8 }}><HanzoLogo size={22} /><span style={{ fontSize: 15, fontWeight: 600, letterSpacing: 'var(--tracking-tight)', color: '#fff' }}>Hanzo</span></span>
|
|
113
|
+
<p style={{ marginTop: 12, maxWidth: '16rem', fontSize: 'var(--text-sm)', color: 'var(--neutral-500)' }}>The AI cloud for agents and apps.</p>
|
|
114
|
+
</div>
|
|
115
|
+
{columns.map((col) => (
|
|
116
|
+
<div key={col.title}>
|
|
117
|
+
<div style={{ marginBottom: 12, fontSize: 'var(--text-xs)', fontWeight: 500, textTransform: 'uppercase', letterSpacing: 'var(--tracking-wide)', color: 'var(--neutral-500)' }}>{col.title}</div>
|
|
118
|
+
<ul style={{ listStyle: 'none', margin: 0, padding: 0, display: 'flex', flexDirection: 'column', gap: 8 }}>
|
|
119
|
+
{col.links.map((l) => <li key={l}><a href="#" style={{ fontSize: 'var(--text-sm)', color: 'var(--neutral-400)', textDecoration: 'none' }}>{l}</a></li>)}
|
|
120
|
+
</ul>
|
|
121
|
+
</div>
|
|
122
|
+
))}
|
|
123
|
+
</div>
|
|
124
|
+
<div style={{ marginTop: 48, paddingTop: 32, borderTop: '1px solid var(--neutral-900)', display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
|
|
125
|
+
<p style={{ fontSize: 'var(--text-sm)', color: 'var(--neutral-500)' }}>© {new Date().getFullYear()} Hanzo AI, Inc. All rights reserved.</p>
|
|
126
|
+
<a href="#" aria-label="Hanzo on GitHub" style={{ color: 'var(--neutral-500)' }}><Icon name="Github" size={20} /></a>
|
|
127
|
+
</div>
|
|
128
|
+
</div>
|
|
129
|
+
</footer>
|
|
130
|
+
)
|
|
131
|
+
}
|