Skip to content

Commit 293c8f1

Browse files
committed
chore: brand + gui publish artifacts
1 parent 40a211b commit 293c8f1

28 files changed

+2082
-19
lines changed

pkg/brand/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@hanzo/brand",
3-
"version": "1.0.0",
3+
"version": "1.2.0",
44
"description": "Brand assets and configuration for Hanzo UI",
55
"main": "dist/index.js",
66
"module": "dist/index.mjs",

pkg/brand/src/index.ts

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,47 @@
1-
export const brandConfig = {
2-
name: "Hanzo",
3-
logo: "/hanzo-logo.svg",
4-
}
1+
/**
2+
* @hanzo/brand
3+
*
4+
* Brand assets and configuration for Hanzo, Lux, Zoo, and Pars organizations.
5+
*
6+
* Exports:
7+
* - SVG strings (mark, wordmark, favicon) in dark/light/currentColor variants
8+
* - Per-org BrandConfig objects
9+
* - TypeScript types for brand configuration
10+
* - svgToDataUri helper
11+
*/
12+
13+
// Types
14+
export type {
15+
OrgId,
16+
ColorMode,
17+
BrandColors,
18+
BrandLogo,
19+
BrandSocial,
20+
BrandSeo,
21+
BrandConfig,
22+
} from './types'
23+
24+
// SVG strings
25+
export {
26+
hanzoMark,
27+
hanzoMarkDark,
28+
hanzoMarkLight,
29+
hanzoWordmark,
30+
hanzoWordmarkDark,
31+
hanzoWordmarkLight,
32+
hanzoFavicon,
33+
svgToDataUri,
34+
} from './svg'
35+
36+
// Per-org configs
37+
export {
38+
hanzo,
39+
lux,
40+
zoo,
41+
pars,
42+
orgs,
43+
getOrg,
44+
} from './orgs'
45+
46+
// Default brand (backward compat with v1.0.0 stub)
47+
export { hanzo as defaultBrand } from './orgs'

pkg/brand/src/orgs.ts

Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
/**
2+
* Per-org brand configurations.
3+
*/
4+
import type { BrandConfig, OrgId } from './types'
5+
import {
6+
hanzoMark,
7+
hanzoMarkDark,
8+
hanzoMarkLight,
9+
hanzoWordmark,
10+
hanzoWordmarkDark,
11+
hanzoWordmarkLight,
12+
hanzoFavicon,
13+
} from './svg'
14+
15+
// ---------------------------------------------------------------------------
16+
// Hanzo
17+
// ---------------------------------------------------------------------------
18+
19+
export const hanzo: BrandConfig = {
20+
id: 'hanzo',
21+
name: 'Hanzo',
22+
orgName: 'Hanzo AI',
23+
orgHandle: 'hanzoai',
24+
tagline: 'AI infrastructure for the future',
25+
description: 'Frontier AI infrastructure, foundational models, and developer tools.',
26+
27+
npmOrg: '@hanzo',
28+
29+
domain: 'hanzo.ai',
30+
iamDomain: 'hanzo.id',
31+
githubOrg: 'hanzoai',
32+
docsUrl: 'https://docs.hanzo.ai',
33+
34+
logo: {
35+
mark: hanzoMark,
36+
markDark: hanzoMarkDark,
37+
markLight: hanzoMarkLight,
38+
wordmark: hanzoWordmark,
39+
wordmarkDark: hanzoWordmarkDark,
40+
wordmarkLight: hanzoWordmarkLight,
41+
favicon: hanzoFavicon,
42+
width: 67,
43+
height: 67,
44+
},
45+
46+
colors: {
47+
primary: '222.2 47.4% 11.2%',
48+
primaryForeground: '210 40% 98%',
49+
secondary: '210 40% 96.1%',
50+
secondaryForeground: '222.2 47.4% 11.2%',
51+
accent: '210 40% 96.1%',
52+
accentForeground: '222.2 47.4% 11.2%',
53+
},
54+
55+
social: {
56+
twitter: '@hanzoai',
57+
discord: 'https://discord.gg/hanzo',
58+
github: 'https://github.com/hanzoai',
59+
},
60+
61+
seo: {
62+
title: 'Hanzo AI - Frontier AI Infrastructure',
63+
description: 'AI infrastructure, foundational models, and developer tools from Hanzo.',
64+
keywords: ['ai', 'infrastructure', 'llm', 'hanzo', 'mcp', 'agents'],
65+
},
66+
}
67+
68+
// ---------------------------------------------------------------------------
69+
// Lux
70+
// ---------------------------------------------------------------------------
71+
72+
export const lux: BrandConfig = {
73+
id: 'lux',
74+
name: 'Lux',
75+
orgName: 'Lux Network',
76+
orgHandle: 'luxfi',
77+
tagline: 'Multi-consensus blockchain',
78+
description: 'High-performance blockchain with post-quantum cryptography and multi-consensus architecture.',
79+
80+
npmOrg: '@luxfi',
81+
82+
domain: 'lux.network',
83+
iamDomain: 'lux.id',
84+
githubOrg: 'luxfi',
85+
docsUrl: 'https://docs.lux.network',
86+
87+
logo: {
88+
mark: hanzoMark,
89+
markDark: hanzoMarkDark,
90+
markLight: hanzoMarkLight,
91+
wordmark: hanzoWordmark,
92+
wordmarkDark: hanzoWordmarkDark,
93+
wordmarkLight: hanzoWordmarkLight,
94+
favicon: hanzoFavicon,
95+
width: 67,
96+
height: 67,
97+
},
98+
99+
colors: {
100+
primary: '250 60% 50%',
101+
primaryForeground: '0 0% 100%',
102+
secondary: '250 30% 95%',
103+
secondaryForeground: '250 60% 20%',
104+
accent: '250 60% 60%',
105+
accentForeground: '0 0% 100%',
106+
},
107+
108+
social: {
109+
twitter: '@luxnetwork',
110+
discord: 'https://discord.gg/lux',
111+
github: 'https://github.com/luxfi',
112+
},
113+
114+
seo: {
115+
title: 'Lux Network - Multi-Consensus Blockchain',
116+
description: 'High-performance blockchain with post-quantum cryptography.',
117+
keywords: ['blockchain', 'lux', 'consensus', 'post-quantum', 'defi'],
118+
},
119+
}
120+
121+
// ---------------------------------------------------------------------------
122+
// Zoo
123+
// ---------------------------------------------------------------------------
124+
125+
export const zoo: BrandConfig = {
126+
id: 'zoo',
127+
name: 'Zoo',
128+
orgName: 'Zoo Labs Foundation',
129+
orgHandle: 'zoolabs',
130+
tagline: 'Open AI research network',
131+
description: 'Decentralized AI and decentralized science research through community-driven governance.',
132+
133+
npmOrg: '@zoo',
134+
135+
domain: 'zoo.ngo',
136+
iamDomain: 'zoo.id',
137+
githubOrg: 'zoolabs',
138+
docsUrl: 'https://docs.zoo.ngo',
139+
140+
logo: {
141+
mark: hanzoMark,
142+
markDark: hanzoMarkDark,
143+
markLight: hanzoMarkLight,
144+
wordmark: hanzoWordmark,
145+
wordmarkDark: hanzoWordmarkDark,
146+
wordmarkLight: hanzoWordmarkLight,
147+
favicon: hanzoFavicon,
148+
width: 67,
149+
height: 67,
150+
},
151+
152+
colors: {
153+
primary: '142 60% 40%',
154+
primaryForeground: '0 0% 100%',
155+
secondary: '142 30% 95%',
156+
secondaryForeground: '142 60% 20%',
157+
accent: '142 60% 50%',
158+
accentForeground: '0 0% 100%',
159+
},
160+
161+
social: {
162+
twitter: '@zoolabs',
163+
github: 'https://github.com/zoolabs',
164+
},
165+
166+
seo: {
167+
title: 'Zoo Labs Foundation - Open AI Research',
168+
description: 'Decentralized AI research and decentralized science.',
169+
keywords: ['deai', 'desci', 'research', 'zoo', 'foundation', 'governance'],
170+
},
171+
}
172+
173+
// ---------------------------------------------------------------------------
174+
// Pars
175+
// ---------------------------------------------------------------------------
176+
177+
export const pars: BrandConfig = {
178+
id: 'pars',
179+
name: 'Pars',
180+
orgName: 'Pars',
181+
orgHandle: 'pars',
182+
tagline: 'Identity and access',
183+
description: 'Identity, access management, and authentication infrastructure.',
184+
185+
npmOrg: '@pars',
186+
187+
domain: 'pars.id',
188+
iamDomain: 'pars.id',
189+
githubOrg: 'parsid',
190+
docsUrl: 'https://docs.pars.id',
191+
192+
logo: {
193+
mark: hanzoMark,
194+
markDark: hanzoMarkDark,
195+
markLight: hanzoMarkLight,
196+
wordmark: hanzoWordmark,
197+
wordmarkDark: hanzoWordmarkDark,
198+
wordmarkLight: hanzoWordmarkLight,
199+
favicon: hanzoFavicon,
200+
width: 67,
201+
height: 67,
202+
},
203+
204+
colors: {
205+
primary: '30 90% 50%',
206+
primaryForeground: '0 0% 100%',
207+
secondary: '30 40% 95%',
208+
secondaryForeground: '30 90% 20%',
209+
accent: '30 90% 60%',
210+
accentForeground: '0 0% 100%',
211+
},
212+
213+
social: {
214+
github: 'https://github.com/parsid',
215+
},
216+
217+
seo: {
218+
title: 'Pars - Identity & Access',
219+
description: 'Identity, access management, and authentication infrastructure.',
220+
keywords: ['identity', 'iam', 'auth', 'oidc', 'pars'],
221+
},
222+
}
223+
224+
// ---------------------------------------------------------------------------
225+
// Registry
226+
// ---------------------------------------------------------------------------
227+
228+
/** All org brand configs indexed by org ID */
229+
export const orgs: Record<OrgId, BrandConfig> = {
230+
hanzo,
231+
lux,
232+
zoo,
233+
pars,
234+
}
235+
236+
/** Look up an org brand config by ID. Throws if unknown. */
237+
export function getOrg(id: OrgId): BrandConfig {
238+
const config = orgs[id]
239+
if (!config) {
240+
throw new Error(`Unknown org: ${id}`)
241+
}
242+
return config
243+
}

pkg/brand/src/svg.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/**
2+
* Raw SVG strings for brand marks.
3+
*
4+
* These are plain strings, not React components.
5+
* Consumers can use dangerouslySetInnerHTML, inline them in <img> via data URIs,
6+
* or pass them to any framework.
7+
*/
8+
9+
// ---------------------------------------------------------------------------
10+
// Hanzo H-mark (viewBox 0 0 67 67)
11+
// ---------------------------------------------------------------------------
12+
13+
/** Hanzo H-mark -- white fill on transparent, for dark backgrounds */
14+
export const hanzoMarkDark = `<svg viewBox="0 0 67 67" xmlns="http://www.w3.org/2000/svg"><path d="M22.21 67V44.6369H0V67H22.21Z" fill="#ffffff"/><path d="M0 44.6369L22.21 46.8285V44.6369H0Z" fill="#DDDDDD"/><path d="M66.7038 22.3184H22.2534L0.0878906 44.6367H44.4634L66.7038 22.3184Z" fill="#ffffff"/><path d="M22.21 0H0V22.3184H22.21V0Z" fill="#ffffff"/><path d="M66.7198 0H44.5098V22.3184H66.7198V0Z" fill="#ffffff"/><path d="M66.6753 22.3185L44.5098 20.0822V22.3185H66.6753Z" fill="#DDDDDD"/><path d="M66.7198 67V44.6369H44.5098V67H66.7198Z" fill="#ffffff"/></svg>`
15+
16+
/** Hanzo H-mark -- dark fill on transparent, for light backgrounds */
17+
export const hanzoMarkLight = `<svg viewBox="0 0 67 67" xmlns="http://www.w3.org/2000/svg"><path d="M22.21 67V44.6369H0V67H22.21Z" fill="#111113"/><path d="M0 44.6369L22.21 46.8285V44.6369H0Z" fill="#333333"/><path d="M66.7038 22.3184H22.2534L0.0878906 44.6367H44.4634L66.7038 22.3184Z" fill="#111113"/><path d="M22.21 0H0V22.3184H22.21V0Z" fill="#111113"/><path d="M66.7198 0H44.5098V22.3184H66.7198V0Z" fill="#111113"/><path d="M66.6753 22.3185L44.5098 20.0822V22.3185H66.6753Z" fill="#333333"/><path d="M66.7198 67V44.6369H44.5098V67H66.7198Z" fill="#111113"/></svg>`
18+
19+
/** Hanzo H-mark -- currentColor fill, inherits CSS color */
20+
export const hanzoMark = `<svg viewBox="0 0 67 67" xmlns="http://www.w3.org/2000/svg"><path d="M22.21 67V44.6369H0V67H22.21Z" fill="currentColor"/><path d="M0 44.6369L22.21 46.8285V44.6369H0Z" fill="currentColor" opacity="0.85"/><path d="M66.7038 22.3184H22.2534L0.0878906 44.6367H44.4634L66.7038 22.3184Z" fill="currentColor"/><path d="M22.21 0H0V22.3184H22.21V0Z" fill="currentColor"/><path d="M66.7198 0H44.5098V22.3184H66.7198V0Z" fill="currentColor"/><path d="M66.6753 22.3185L44.5098 20.0822V22.3185H66.6753Z" fill="currentColor" opacity="0.85"/><path d="M66.7198 67V44.6369H44.5098V67H66.7198Z" fill="currentColor"/></svg>`
21+
22+
// ---------------------------------------------------------------------------
23+
// Hanzo wordmark (text-based SVG)
24+
// ---------------------------------------------------------------------------
25+
26+
/** Hanzo wordmark -- white, for dark backgrounds */
27+
export const hanzoWordmarkDark = `<svg viewBox="0 0 200 40" xmlns="http://www.w3.org/2000/svg"><text x="0" y="32" font-family="system-ui,-apple-system,sans-serif" font-size="36" font-weight="700" fill="#ffffff" letter-spacing="-0.02em">HANZO</text></svg>`
28+
29+
/** Hanzo wordmark -- dark, for light backgrounds */
30+
export const hanzoWordmarkLight = `<svg viewBox="0 0 200 40" xmlns="http://www.w3.org/2000/svg"><text x="0" y="32" font-family="system-ui,-apple-system,sans-serif" font-size="36" font-weight="700" fill="#111113" letter-spacing="-0.02em">HANZO</text></svg>`
31+
32+
/** Hanzo wordmark -- currentColor */
33+
export const hanzoWordmark = `<svg viewBox="0 0 200 40" xmlns="http://www.w3.org/2000/svg"><text x="0" y="32" font-family="system-ui,-apple-system,sans-serif" font-size="36" font-weight="700" fill="currentColor" letter-spacing="-0.02em">HANZO</text></svg>`
34+
35+
// ---------------------------------------------------------------------------
36+
// Favicon (viewBox 0 0 67 67, same as mark -- suitable for <link rel="icon">)
37+
// ---------------------------------------------------------------------------
38+
39+
/** Favicon SVG -- white on dark background with rounded rect */
40+
export const hanzoFavicon = `<svg viewBox="0 0 67 67" xmlns="http://www.w3.org/2000/svg"><rect width="67" height="67" rx="12" fill="#111113"/><path d="M22.21 67V44.6369H0V67H22.21Z" fill="#ffffff" transform="scale(0.7) translate(13,13)"/><path d="M0 44.6369L22.21 46.8285V44.6369H0Z" fill="#DDDDDD" transform="scale(0.7) translate(13,13)"/><path d="M66.7038 22.3184H22.2534L0.0878906 44.6367H44.4634L66.7038 22.3184Z" fill="#ffffff" transform="scale(0.7) translate(13,13)"/><path d="M22.21 0H0V22.3184H22.21V0Z" fill="#ffffff" transform="scale(0.7) translate(13,13)"/><path d="M66.7198 0H44.5098V22.3184H66.7198V0Z" fill="#ffffff" transform="scale(0.7) translate(13,13)"/><path d="M66.6753 22.3185L44.5098 20.0822V22.3185H66.6753Z" fill="#DDDDDD" transform="scale(0.7) translate(13,13)"/><path d="M66.7198 67V44.6369H44.5098V67H66.7198Z" fill="#ffffff" transform="scale(0.7) translate(13,13)"/></svg>`
41+
42+
// ---------------------------------------------------------------------------
43+
// Helpers
44+
// ---------------------------------------------------------------------------
45+
46+
/** Convert an SVG string to a data URI for use in <img src> or CSS url() */
47+
export function svgToDataUri(svg: string): string {
48+
return `data:image/svg+xml,${encodeURIComponent(svg)}`
49+
}

0 commit comments

Comments
 (0)