@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
package/content/voice.md
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Voice
|
|
2
|
+
|
|
3
|
+
Direct, technical, understated. Hanzo builds enterprise AI infrastructure and
|
|
4
|
+
frontier models; the writing sounds like the people who build it, not the people
|
|
5
|
+
who market it.
|
|
6
|
+
|
|
7
|
+
## The five rules
|
|
8
|
+
|
|
9
|
+
1. **Numbers over adjectives.** "92.9% on GPQA" beats "incredibly smart."
|
|
10
|
+
"40ms p50" beats "blazing fast." If you cannot measure it, question whether
|
|
11
|
+
it belongs.
|
|
12
|
+
2. **Say the thing, then stop.** Lead with the claim. Cut the throat-clearing
|
|
13
|
+
("We're excited to announce…", "In today's world…"). The reader is busy.
|
|
14
|
+
3. **No exclamation marks. No emoji.** Enthusiasm is carried by substance, not
|
|
15
|
+
punctuation. This is a hard rule, the same way monochrome is a hard rule.
|
|
16
|
+
4. **Verbs, active, present.** "Deploy a model in one command." Not "Models can
|
|
17
|
+
be deployed."
|
|
18
|
+
5. **Concrete nouns.** "inference," "agents," "the C-Chain," "an SQLite
|
|
19
|
+
database" — name the real thing rather than "solutions," "offerings," or
|
|
20
|
+
"capabilities."
|
|
21
|
+
|
|
22
|
+
## Before / after
|
|
23
|
+
|
|
24
|
+
| Instead of | Write |
|
|
25
|
+
|------------|-------|
|
|
26
|
+
| "Blazing-fast, next-gen AI cloud!" | "The AI cloud. Inference at 40ms p50." |
|
|
27
|
+
| "We're thrilled to introduce our new models 🚀" | "New frontier models. Available today." |
|
|
28
|
+
| "Leverage our powerful suite of solutions" | "Run models, agents, and search on one platform." |
|
|
29
|
+
| "Sign up now and get started on your journey!" | "Start free. No card." |
|
|
30
|
+
| "Revolutionary paradigm-shifting technology" | (delete — show the benchmark instead) |
|
|
31
|
+
|
|
32
|
+
## Words
|
|
33
|
+
|
|
34
|
+
- **Product names, capitalized:** Hanzo, Hanzo Cloud, Enso, Base, KMS, IAM.
|
|
35
|
+
- **Lowercase the plumbing:** inference, agents, models, tokens, endpoints.
|
|
36
|
+
- **One space, one period.** Sentence case for headings and buttons — "Get
|
|
37
|
+
started," not "Get Started" or "GET STARTED." Eyebrows are the one exception:
|
|
38
|
+
small uppercase category labels (see `--type-eyebrow`).
|
|
39
|
+
- **Never** "revolutionary," "cutting-edge," "game-changing," "seamless,"
|
|
40
|
+
"unleash," "supercharge," "delve," "in today's fast-paced world."
|
|
41
|
+
|
|
42
|
+
## Length
|
|
43
|
+
|
|
44
|
+
- **Hero headline:** ≤ 7 words.
|
|
45
|
+
- **Hero subline / tagline:** ≤ 140 characters, one sentence.
|
|
46
|
+
- **Body:** short paragraphs, two to four sentences. If a paragraph needs a
|
|
47
|
+
scrollbar, split it.
|
|
48
|
+
|
|
49
|
+
## The test
|
|
50
|
+
|
|
51
|
+
Read it aloud. If it sounds like a person explaining their work to a smart
|
|
52
|
+
colleague, keep it. If it sounds like a press release, rewrite it.
|
package/docs/README.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# docs — how to use the system
|
|
2
|
+
|
|
3
|
+
The design system is one idea applied without exception: **Hanzo is monochrome,
|
|
4
|
+
true black, white type, and color is a signal — never a decoration.** Everything
|
|
5
|
+
else is machinery in service of that idea.
|
|
6
|
+
|
|
7
|
+
If you remember one thing: **import one file, then reach for a token instead of a
|
|
8
|
+
literal.** Do that and your surface is already 90% on-brand.
|
|
9
|
+
|
|
10
|
+
```css
|
|
11
|
+
@import "@hanzoai/design/styles.css";
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## The map
|
|
15
|
+
|
|
16
|
+
| You want | Go to |
|
|
17
|
+
|----------|-------|
|
|
18
|
+
| To wire the tokens into an app | [`integrate.md`](integrate.md) |
|
|
19
|
+
| The raw values (color, type, space, radius, motion, z, elevation) | [`../tokens/`](../tokens/) |
|
|
20
|
+
| A component and how to use it | [`../components/`](../components/) + its `*.prompt.md` |
|
|
21
|
+
| To *see* a rule rendered | [`../guidelines/`](../guidelines/) specimen cards |
|
|
22
|
+
| An AI to generate an on-brand screen | [`../prompts/`](../prompts/) |
|
|
23
|
+
| The words — voice, taglines | [`../content/`](../content/) |
|
|
24
|
+
| The mark, wordmark, logos | [`../assets/`](../assets/) |
|
|
25
|
+
|
|
26
|
+
## Why it is built this way
|
|
27
|
+
|
|
28
|
+
- **One import.** A single `styles.css` pulls the whole token layer in a fixed
|
|
29
|
+
order. There is no partial setup to get wrong.
|
|
30
|
+
- **Tokens, not literals.** Every value is a CSS custom property whose name
|
|
31
|
+
matches hanzo.ai's own variables. Code copies between the app and this system
|
|
32
|
+
1:1, because they speak the same names.
|
|
33
|
+
- **Dark by construction.** Surfaces mount dark. Light is a `.light` override for
|
|
34
|
+
the few brand and docs pages that need it.
|
|
35
|
+
- **Opacity is the palette.** One neutral ladder plus an opacity ladder is the
|
|
36
|
+
entire non-semantic color system. Rank reads as opacity. This is why Hanzo
|
|
37
|
+
looks like Hanzo and not like a theme.
|
|
38
|
+
- **The parts are self-contained.** Components carry their own inline styles, so
|
|
39
|
+
one drops into Next, Vite, Tamagui, or nothing and renders identically.
|
|
40
|
+
|
|
41
|
+
## The one rule that overrides the rest
|
|
42
|
+
|
|
43
|
+
When a decision is unclear, return to the atom. Monochrome, true black, white
|
|
44
|
+
type. If the work reinforces it, keep the work. If it doesn't, change the work.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Integrate
|
|
2
|
+
|
|
3
|
+
## 1. Install
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
pnpm add @hanzoai/design
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## 2. Import the tokens — once
|
|
10
|
+
|
|
11
|
+
```css
|
|
12
|
+
/* app/globals.css, or the root of your styles */
|
|
13
|
+
@import "@hanzoai/design/styles.css";
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
That one file pulls in, in order: fonts (Geist + Geist Mono), color, typography,
|
|
17
|
+
spacing, radius, elevation, motion, z, and base element defaults. After it,
|
|
18
|
+
every token below is a live CSS custom property.
|
|
19
|
+
|
|
20
|
+
## 3. Build with tokens, not literals
|
|
21
|
+
|
|
22
|
+
```css
|
|
23
|
+
.panel{
|
|
24
|
+
background: var(--surface-card);
|
|
25
|
+
border: 1px solid var(--border-card);
|
|
26
|
+
border-radius: var(--radius-lg);
|
|
27
|
+
padding: var(--space-6);
|
|
28
|
+
color: var(--text-secondary);
|
|
29
|
+
font: var(--type-body);
|
|
30
|
+
}
|
|
31
|
+
.panel h3{ font: var(--type-h3); color: var(--text-primary); }
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
There is a token for color, type, space, radius, elevation, motion, and stacking
|
|
35
|
+
order. If you find yourself typing a hex, a px font-size, or a bare z-index,
|
|
36
|
+
there is a variable for it — use that instead.
|
|
37
|
+
|
|
38
|
+
## 4. Theme
|
|
39
|
+
|
|
40
|
+
Dark is the default; the tokens are already the dark values at `:root`. To render
|
|
41
|
+
a subtree light, add `.light` to an ancestor:
|
|
42
|
+
|
|
43
|
+
```html
|
|
44
|
+
<body> <!-- dark: the Hanzo default -->
|
|
45
|
+
<article class="light"> … </article> <!-- inverted, for brand/docs pages -->
|
|
46
|
+
</body>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Nothing else changes — the same token names resolve to inverted values.
|
|
50
|
+
|
|
51
|
+
## 5. Use a component
|
|
52
|
+
|
|
53
|
+
Each part ships as `.jsx` + `.d.ts` + a `.prompt.md` usage guide. They are
|
|
54
|
+
self-contained (inline styles), so they need no framework:
|
|
55
|
+
|
|
56
|
+
```jsx
|
|
57
|
+
import { Button } from "@hanzoai/design/components/core/Button.jsx";
|
|
58
|
+
import { HanzoLogo } from "@hanzoai/design/components/core/HanzoLogo.jsx";
|
|
59
|
+
|
|
60
|
+
<HanzoLogo />
|
|
61
|
+
<Button pill>Get started</Button>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Read the neighboring `Button.prompt.md` for variants and rules before you place
|
|
65
|
+
one.
|
|
66
|
+
|
|
67
|
+
## 6. Extend without breaking the brand
|
|
68
|
+
|
|
69
|
+
- Add a new component? Consume the tokens; do not introduce a value that is not
|
|
70
|
+
already one. Ship it with a `.prompt.md`.
|
|
71
|
+
- Need a color the ladder does not have? You almost certainly don't. The only
|
|
72
|
+
new hues allowed are the reserved semantics in `prompts/rules.md`.
|
|
73
|
+
- Building on Tamagui / `@hanzo/gui`? Map these CSS custom properties to your
|
|
74
|
+
Tamagui tokens 1:1 — same names, same values — so the two layers never drift.
|
|
75
|
+
|
|
76
|
+
## 7. Generate with AI
|
|
77
|
+
|
|
78
|
+
Give a model `prompts/system.md` as its system prompt, hand it the relevant
|
|
79
|
+
`prompts/pages.md` block, and check the result against `prompts/rules.md`. The
|
|
80
|
+
constraints are written so an agent can satisfy every one of them with a token.
|
|
81
|
+
|
|
82
|
+
## Reference
|
|
83
|
+
|
|
84
|
+
- Values: [`../tokens/`](../tokens/)
|
|
85
|
+
- Rendered specimens: [`../guidelines/`](../guidelines/)
|
|
86
|
+
- Voice: [`../content/voice.md`](../content/voice.md)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!-- @dsCard group="Brand" viewport="700x180" name="Elevation & glow" subtitle="A hairline, one deep shadow, and the ambient hero radial" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Elevation</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<style>body{margin:0;padding:16px 20px;background:#000;font-family:var(--font-sans);color:var(--foreground)}
|
|
4
|
+
.g{display:flex;gap:10px;flex-wrap:wrap}.sw{flex:1;min-width:64px}.chip{height:56px;border-radius:8px;border:1px solid var(--white-10)}
|
|
5
|
+
.n{margin-top:6px;font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--neutral-300);font-family:var(--font-mono)}
|
|
6
|
+
.v{font-size:9px;color:var(--neutral-600);font-family:var(--font-mono)}
|
|
7
|
+
.row{display:flex;align-items:baseline;gap:14px}.mono{font-family:var(--font-mono)}
|
|
8
|
+
.meta{font-size:10px;color:var(--neutral-600);font-family:var(--font-mono);white-space:nowrap}
|
|
9
|
+
</style></head><body>
|
|
10
|
+
<div style="display:flex;gap:16px;align-items:stretch">
|
|
11
|
+
<div style="flex:1;padding:14px;background:var(--surface-card);border:1px solid var(--border-hairline);border-radius:var(--radius-lg);font-size:12px;color:var(--neutral-400)">flat — hairline only<div class="n" style="margin-top:8px">--shadow-none</div></div>
|
|
12
|
+
<div style="flex:1;padding:14px;background:var(--surface-overlay);border:1px solid var(--border-hairline);border-radius:var(--radius-xl);box-shadow:var(--shadow-floating);font-size:12px;color:var(--neutral-400)">floating — menu, dialog, composer<div class="n" style="margin-top:8px">--shadow-floating</div></div>
|
|
13
|
+
<div style="flex:1;position:relative;overflow:hidden;background:#000;border:1px solid var(--border-hairline);border-radius:var(--radius-lg)"><div style="position:absolute;left:50%;top:50%;width:220px;height:220px;transform:translate(-50%,-50%);background:var(--glow-hero);filter:blur(60px)"></div><div style="position:relative;padding:14px;font-size:12px;color:var(--neutral-300)">ambient glow<div class="n" style="margin-top:8px">--glow-hero</div></div></div>
|
|
14
|
+
</div></body></html>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!-- @dsCard group="Brand" viewport="700x200" name="Imagery" subtitle="Cool, near-black renders — imagery is rare and never decorative" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Imagery</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<style>body{margin:0;padding:16px 20px;background:#000;font-family:var(--font-sans);color:var(--foreground)}
|
|
4
|
+
.g{display:flex;gap:10px;flex-wrap:wrap}.sw{flex:1;min-width:64px}.chip{height:56px;border-radius:8px;border:1px solid var(--white-10)}
|
|
5
|
+
.n{margin-top:6px;font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--neutral-300);font-family:var(--font-mono)}
|
|
6
|
+
.v{font-size:9px;color:var(--neutral-600);font-family:var(--font-mono)}
|
|
7
|
+
.row{display:flex;align-items:baseline;gap:14px}.mono{font-family:var(--font-mono)}
|
|
8
|
+
.meta{font-size:10px;color:var(--neutral-600);font-family:var(--font-mono);white-space:nowrap}
|
|
9
|
+
</style></head><body>
|
|
10
|
+
<div style="display:flex;gap:10px">
|
|
11
|
+
<img src="../assets/brand/hero-visualization.png" alt="" style="width:33%;height:150px;object-fit:cover;border-radius:var(--radius-lg);border:1px solid var(--border-hairline)">
|
|
12
|
+
<img src="../assets/brand/industry-cloud.png" alt="" style="width:33%;height:150px;object-fit:cover;border-radius:var(--radius-lg);border:1px solid var(--border-hairline)">
|
|
13
|
+
<img src="../assets/brand/industry-infrastructure.png" alt="" style="width:33%;height:150px;object-fit:cover;border-radius:var(--radius-lg);border:1px solid var(--border-hairline)">
|
|
14
|
+
</div>
|
|
15
|
+
<div class="meta" style="margin-top:10px">assets/brand/* · cool-toned, low-key, no warm gradients, no illustration style</div>
|
|
16
|
+
</body></html>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<!-- @dsCard group="Brand" viewport="700x170" name="The mark" subtitle="Press-kit logo, its sizes and the wordmark lockup" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Mark</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<style>body{margin:0;padding:16px 20px;background:#000;font-family:var(--font-sans);color:var(--foreground)}
|
|
4
|
+
.g{display:flex;gap:10px;flex-wrap:wrap}.sw{flex:1;min-width:64px}.chip{height:56px;border-radius:8px;border:1px solid var(--white-10)}
|
|
5
|
+
.n{margin-top:6px;font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--neutral-300);font-family:var(--font-mono)}
|
|
6
|
+
.v{font-size:9px;color:var(--neutral-600);font-family:var(--font-mono)}
|
|
7
|
+
.row{display:flex;align-items:baseline;gap:14px}.mono{font-family:var(--font-mono)}
|
|
8
|
+
.meta{font-size:10px;color:var(--neutral-600);font-family:var(--font-mono);white-space:nowrap}
|
|
9
|
+
</style></head><body>
|
|
10
|
+
<div style="display:flex;align-items:center;gap:34px">
|
|
11
|
+
<div style="text-align:center"><img src="../assets/logo.svg" width="56" height="56" alt="Hanzo mark" style="filter:invert(1) brightness(2)"><div class="n" style="margin-top:8px">assets/logo.svg</div></div>
|
|
12
|
+
<div style="display:flex;align-items:center;gap:8px"><img src="../assets/logo.svg" width="22" height="22" alt="" style="filter:invert(1) brightness(2)"><span style="font-size:15px;font-weight:600;letter-spacing:-.02em">Hanzo AI</span><span class="meta" style="margin-left:10px">nav lockup · 22px</span></div>
|
|
13
|
+
<div style="display:flex;align-items:flex-end;gap:14px">
|
|
14
|
+
<img src="../assets/logo.svg" width="16" height="16" alt="" style="filter:invert(1) brightness(2)">
|
|
15
|
+
<img src="../assets/logo.svg" width="22" height="22" alt="" style="filter:invert(1) brightness(2)">
|
|
16
|
+
<img src="../assets/logo.svg" width="32" height="32" alt="" style="filter:invert(1) brightness(2)">
|
|
17
|
+
<span class="meta">16 · 22 · 32</span>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="meta" style="margin-top:14px">Hanzo Black #0A0A0B · Hanzo White #FFFFFF · monochrome only, never stretched or re-hued</div>
|
|
21
|
+
</body></html>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!-- @dsCard group="Brand" viewport="700x160" name="Motion" subtitle="Fade + small rise. No springs, no bounce, no parallax" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Motion</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<style>body{margin:0;padding:16px 20px;background:#000;font-family:var(--font-sans);color:var(--foreground)}
|
|
4
|
+
.g{display:flex;gap:10px;flex-wrap:wrap}.sw{flex:1;min-width:64px}.chip{height:56px;border-radius:8px;border:1px solid var(--white-10)}
|
|
5
|
+
.n{margin-top:6px;font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--neutral-300);font-family:var(--font-mono)}
|
|
6
|
+
.v{font-size:9px;color:var(--neutral-600);font-family:var(--font-mono)}
|
|
7
|
+
.row{display:flex;align-items:baseline;gap:14px}.mono{font-family:var(--font-mono)}
|
|
8
|
+
.meta{font-size:10px;color:var(--neutral-600);font-family:var(--font-mono);white-space:nowrap}
|
|
9
|
+
.dm{animation:hanzo-slide-up-fade 1.6s var(--ease-out) infinite}.dg{animation:hanzo-glow 9s var(--ease-in-out) infinite}</style></head><body>
|
|
10
|
+
<div style="display:flex;gap:16px;align-items:stretch">
|
|
11
|
+
<div style="flex:1;padding:14px;background:var(--surface-card);border:1px solid var(--border-hairline);border-radius:var(--radius-lg);overflow:hidden"><div class="dm" style="font-size:12px;color:var(--neutral-200)">entry: opacity 0→1, y 20→0</div><div class="n" style="margin-top:10px">500ms · ease-out · 60ms stagger</div></div>
|
|
12
|
+
<div style="flex:1;padding:14px;background:var(--surface-card);border:1px solid var(--border-hairline);border-radius:var(--radius-lg);position:relative;overflow:hidden"><div class="dg" style="position:absolute;inset:-40px;background:var(--glow-hero);filter:blur(50px)"></div><div style="position:relative;font-size:12px;color:var(--neutral-200)">ambient glow breathe</div><div class="n" style="position:relative;margin-top:10px">9s · scale 1→1.08</div></div>
|
|
13
|
+
<div style="flex:1;padding:14px;background:var(--surface-card);border:1px solid var(--border-hairline);border-radius:var(--radius-lg)"><div style="font-size:12px;color:var(--neutral-200)">hover: colour only</div><div class="n" style="margin-top:10px">150ms · transition-colors</div></div>
|
|
14
|
+
</div></body></html>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<!-- @dsCard group="Brand" viewport="700x160" name="Third-party logos" subtitle="Provider and partner marks keep their own identity" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Third-party logos</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<style>body{margin:0;padding:16px 20px;background:#000;font-family:var(--font-sans);color:var(--foreground)}
|
|
4
|
+
.g{display:flex;gap:10px;flex-wrap:wrap}.sw{flex:1;min-width:64px}.chip{height:56px;border-radius:8px;border:1px solid var(--white-10)}
|
|
5
|
+
.n{margin-top:6px;font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--neutral-300);font-family:var(--font-mono)}
|
|
6
|
+
.v{font-size:9px;color:var(--neutral-600);font-family:var(--font-mono)}
|
|
7
|
+
.row{display:flex;align-items:baseline;gap:14px}.mono{font-family:var(--font-mono)}
|
|
8
|
+
.meta{font-size:10px;color:var(--neutral-600);font-family:var(--font-mono);white-space:nowrap}
|
|
9
|
+
img{filter:invert(1) brightness(2);opacity:.75}</style></head><body>
|
|
10
|
+
<div style="display:flex;flex-wrap:wrap;align-items:center;gap:22px">
|
|
11
|
+
<img src="../assets/logos/openai.svg" alt="OpenAI" height="20">
|
|
12
|
+
<img src="../assets/logos/anthropic.svg" alt="Anthropic" height="20">
|
|
13
|
+
<img src="../assets/logos/google.svg" alt="Google" height="20">
|
|
14
|
+
<img src="../assets/logos/mistral.svg" alt="Mistral" height="20">
|
|
15
|
+
<img src="../assets/logos/deepseek.svg" alt="DeepSeek" height="20">
|
|
16
|
+
<img src="../assets/logos/qwen.svg" alt="Qwen" height="20">
|
|
17
|
+
<img src="../assets/logos/groq.svg" alt="Groq" height="20">
|
|
18
|
+
<img src="../assets/logos/partners/nvidia.svg" alt="NVIDIA" height="20">
|
|
19
|
+
<img src="../assets/logos/partners/aws.svg" alt="AWS" height="22">
|
|
20
|
+
<img src="../assets/logos/partners/techstars.svg" alt="Techstars" height="18">
|
|
21
|
+
</div>
|
|
22
|
+
<div class="meta" style="margin-top:14px">assets/logos · assets/providers — rendered mono at 75% on dark; official colour only when recognition demands it</div>
|
|
23
|
+
</body></html>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!-- @dsCard group="Brand" viewport="700x150" name="Radii" subtitle="Six steps, from the 6px button to the 28px composer" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Radii</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<style>body{margin:0;padding:16px 20px;background:#000;font-family:var(--font-sans);color:var(--foreground)}
|
|
4
|
+
.g{display:flex;gap:10px;flex-wrap:wrap}.sw{flex:1;min-width:64px}.chip{height:56px;border-radius:8px;border:1px solid var(--white-10)}
|
|
5
|
+
.n{margin-top:6px;font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--neutral-300);font-family:var(--font-mono)}
|
|
6
|
+
.v{font-size:9px;color:var(--neutral-600);font-family:var(--font-mono)}
|
|
7
|
+
.row{display:flex;align-items:baseline;gap:14px}.mono{font-family:var(--font-mono)}
|
|
8
|
+
.meta{font-size:10px;color:var(--neutral-600);font-family:var(--font-mono);white-space:nowrap}
|
|
9
|
+
</style></head><body>
|
|
10
|
+
<div class="g">
|
|
11
|
+
<div class="sw"><div style="height:48px;background:var(--surface-card);border:1px solid var(--border-hairline);border-radius:6px"></div><div class="n">6px</div><div class="v">button · input</div></div>
|
|
12
|
+
<div class="sw"><div style="height:48px;background:var(--surface-card);border:1px solid var(--border-hairline);border-radius:12px"></div><div class="n">12px</div><div class="v">card</div></div>
|
|
13
|
+
<div class="sw"><div style="height:48px;background:var(--surface-card);border:1px solid var(--border-hairline);border-radius:16px"></div><div class="n">16px</div><div class="v">panel</div></div>
|
|
14
|
+
<div class="sw"><div style="height:48px;background:var(--surface-card);border:1px solid var(--border-hairline);border-radius:24px"></div><div class="n">24px</div><div class="v">story card</div></div>
|
|
15
|
+
<div class="sw"><div style="height:48px;background:var(--surface-card);border:1px solid var(--border-hairline);border-radius:28px"></div><div class="n">28px</div><div class="v">composer</div></div>
|
|
16
|
+
<div class="sw"><div style="height:48px;background:var(--surface-card);border:1px solid var(--border-hairline);border-radius:999px"></div><div class="n">999px</div><div class="v">pill · avatar</div></div>
|
|
17
|
+
</div></body></html>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!-- @dsCard group="Colors" viewport="700x150" name="Borders" subtitle="Three hairline weights carry all the structure" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Borders</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<style>body{margin:0;padding:16px 20px;background:#000;font-family:var(--font-sans);color:var(--foreground)}
|
|
4
|
+
.g{display:flex;gap:10px;flex-wrap:wrap}.sw{flex:1;min-width:64px}.chip{height:56px;border-radius:8px;border:1px solid var(--white-10)}
|
|
5
|
+
.n{margin-top:6px;font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--neutral-300);font-family:var(--font-mono)}
|
|
6
|
+
.v{font-size:9px;color:var(--neutral-600);font-family:var(--font-mono)}
|
|
7
|
+
.row{display:flex;align-items:baseline;gap:14px}.mono{font-family:var(--font-mono)}
|
|
8
|
+
.meta{font-size:10px;color:var(--neutral-600);font-family:var(--font-mono);white-space:nowrap}
|
|
9
|
+
</style></head><body>
|
|
10
|
+
<div class="g">
|
|
11
|
+
<div class="sw"><div class="chip" style="background:var(--card);border:1px solid var(--border)"></div><div class="n">--border</div><div class="v">#1f1f1f</div></div>
|
|
12
|
+
<div class="sw"><div class="chip" style="background:var(--card);border:1px solid var(--border-hairline)"></div><div class="n">--border-hairline</div><div class="v">neutral-800</div></div>
|
|
13
|
+
<div class="sw"><div class="chip" style="background:var(--card);border:1px solid var(--border-card)"></div><div class="n">--border-card</div><div class="v">white/10</div></div>
|
|
14
|
+
<div class="sw"><div class="chip" style="background:var(--card);border:1px solid var(--border-strong)"></div><div class="n">--border-strong</div><div class="v">neutral-700 · hover</div></div>
|
|
15
|
+
<div class="sw"><div class="chip" style="background:var(--card);border:1px solid var(--ring)"></div><div class="n">--ring</div><div class="v">#333 · focus</div></div>
|
|
16
|
+
</div></body></html>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<!-- @dsCard group="Colors" viewport="700x150" name="Neutral ladder" subtitle="Tailwind neutral 50–950, the only base ramp" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Neutrals</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<style>body{margin:0;padding:16px 20px;background:#000;font-family:var(--font-sans);color:var(--foreground)}
|
|
4
|
+
.g{display:flex;gap:10px;flex-wrap:wrap}.sw{flex:1;min-width:64px}.chip{height:56px;border-radius:8px;border:1px solid var(--white-10)}
|
|
5
|
+
.n{margin-top:6px;font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--neutral-300);font-family:var(--font-mono)}
|
|
6
|
+
.v{font-size:9px;color:var(--neutral-600);font-family:var(--font-mono)}
|
|
7
|
+
.row{display:flex;align-items:baseline;gap:14px}.mono{font-family:var(--font-mono)}
|
|
8
|
+
.meta{font-size:10px;color:var(--neutral-600);font-family:var(--font-mono);white-space:nowrap}
|
|
9
|
+
</style></head><body>
|
|
10
|
+
<div class="g" style="gap:6px">
|
|
11
|
+
<div class="sw" style="min-width:38px"><div class="chip" style="background:#FAFAFA"></div><div class="n">50</div></div>
|
|
12
|
+
<div class="sw" style="min-width:38px"><div class="chip" style="background:#F5F5F5"></div><div class="n">100</div></div>
|
|
13
|
+
<div class="sw" style="min-width:38px"><div class="chip" style="background:#E5E5E5"></div><div class="n">200</div></div>
|
|
14
|
+
<div class="sw" style="min-width:38px"><div class="chip" style="background:#D4D4D4"></div><div class="n">300</div></div>
|
|
15
|
+
<div class="sw" style="min-width:38px"><div class="chip" style="background:#A3A3A3"></div><div class="n">400</div></div>
|
|
16
|
+
<div class="sw" style="min-width:38px"><div class="chip" style="background:#737373"></div><div class="n">500</div></div>
|
|
17
|
+
<div class="sw" style="min-width:38px"><div class="chip" style="background:#525252"></div><div class="n">600</div></div>
|
|
18
|
+
<div class="sw" style="min-width:38px"><div class="chip" style="background:#404040"></div><div class="n">700</div></div>
|
|
19
|
+
<div class="sw" style="min-width:38px"><div class="chip" style="background:#262626"></div><div class="n">800</div></div>
|
|
20
|
+
<div class="sw" style="min-width:38px"><div class="chip" style="background:#171717"></div><div class="n">900</div></div>
|
|
21
|
+
<div class="sw" style="min-width:38px"><div class="chip" style="background:#0A0A0A"></div><div class="n">950</div></div>
|
|
22
|
+
</div>
|
|
23
|
+
<div class="meta" style="margin-top:10px">700 = strong border · 800 = hairline border · 900 = card fill · 950 = card base</div>
|
|
24
|
+
</body></html>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<!-- @dsCard group="Colors" viewport="700x150" name="Opacity ladder" subtitle="The real palette: one hue, nine steps. Rank = opacity" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Opacity ladder</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<style>body{margin:0;padding:16px 20px;background:#000;font-family:var(--font-sans);color:var(--foreground)}
|
|
4
|
+
.g{display:flex;gap:10px;flex-wrap:wrap}.sw{flex:1;min-width:64px}.chip{height:56px;border-radius:8px;border:1px solid var(--white-10)}
|
|
5
|
+
.n{margin-top:6px;font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--neutral-300);font-family:var(--font-mono)}
|
|
6
|
+
.v{font-size:9px;color:var(--neutral-600);font-family:var(--font-mono)}
|
|
7
|
+
.row{display:flex;align-items:baseline;gap:14px}.mono{font-family:var(--font-mono)}
|
|
8
|
+
.meta{font-size:10px;color:var(--neutral-600);font-family:var(--font-mono);white-space:nowrap}
|
|
9
|
+
</style></head><body>
|
|
10
|
+
<div class="g">
|
|
11
|
+
<div class="sw" style="min-width:44px"><div class="chip" style="background:rgb(255 255 255 / 0.05)"></div><div class="n">/5</div></div>
|
|
12
|
+
<div class="sw" style="min-width:44px"><div class="chip" style="background:rgb(255 255 255 / 0.1)"></div><div class="n">/10</div></div>
|
|
13
|
+
<div class="sw" style="min-width:44px"><div class="chip" style="background:rgb(255 255 255 / 0.15)"></div><div class="n">/15</div></div>
|
|
14
|
+
<div class="sw" style="min-width:44px"><div class="chip" style="background:rgb(255 255 255 / 0.2)"></div><div class="n">/20</div></div>
|
|
15
|
+
<div class="sw" style="min-width:44px"><div class="chip" style="background:rgb(255 255 255 / 0.3)"></div><div class="n">/30</div></div>
|
|
16
|
+
<div class="sw" style="min-width:44px"><div class="chip" style="background:rgb(255 255 255 / 0.4)"></div><div class="n">/40</div></div>
|
|
17
|
+
<div class="sw" style="min-width:44px"><div class="chip" style="background:rgb(255 255 255 / 0.6)"></div><div class="n">/60</div></div>
|
|
18
|
+
<div class="sw" style="min-width:44px"><div class="chip" style="background:rgb(255 255 255 / 0.8)"></div><div class="n">/80</div></div>
|
|
19
|
+
<div class="sw" style="min-width:44px"><div class="chip" style="background:rgb(255 255 255 / 1)"></div><div class="n">white</div></div>
|
|
20
|
+
</div>
|
|
21
|
+
<div class="meta" style="margin-top:10px">tier badges: /5 edge · /15 pro · /20 ultra — never hue</div>
|
|
22
|
+
</body></html>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!-- @dsCard group="Colors" viewport="700x150" name="Semantic hues" subtitle="The only places hue is permitted" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Semantic hues</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<style>body{margin:0;padding:16px 20px;background:#000;font-family:var(--font-sans);color:var(--foreground)}
|
|
4
|
+
.g{display:flex;gap:10px;flex-wrap:wrap}.sw{flex:1;min-width:64px}.chip{height:56px;border-radius:8px;border:1px solid var(--white-10)}
|
|
5
|
+
.n{margin-top:6px;font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--neutral-300);font-family:var(--font-mono)}
|
|
6
|
+
.v{font-size:9px;color:var(--neutral-600);font-family:var(--font-mono)}
|
|
7
|
+
.row{display:flex;align-items:baseline;gap:14px}.mono{font-family:var(--font-mono)}
|
|
8
|
+
.meta{font-size:10px;color:var(--neutral-600);font-family:var(--font-mono);white-space:nowrap}
|
|
9
|
+
</style></head><body>
|
|
10
|
+
<div class="g">
|
|
11
|
+
<div class="sw"><div class="chip" style="background:var(--state-error-bg);border-color:var(--state-error);display:flex;align-items:center;justify-content:center;color:var(--state-error-text);font-size:11px">Error</div><div class="n">--state-error</div><div class="v">red-500 / red-300</div></div>
|
|
12
|
+
<div class="sw"><div class="chip" style="background:#000;display:flex;align-items:center;justify-content:center;gap:6px;color:var(--state-online);font-size:11px"><span style="width:8px;height:8px;border-radius:99px;background:var(--state-online)"></span>Online</div><div class="n">--state-online</div><div class="v">green-400</div></div>
|
|
13
|
+
<div class="sw"><div class="chip" style="background:#000;display:flex;align-items:center;justify-content:center;color:var(--state-success);font-size:11px">Save 20%</div><div class="n">--state-success</div><div class="v">green-500</div></div>
|
|
14
|
+
<div class="sw"><div class="chip" style="background:var(--card);display:flex;align-items:center;gap:5px;padding-left:10px"><span style="width:9px;height:9px;border-radius:99px;background:var(--chrome-dot-red)"></span><span style="width:9px;height:9px;border-radius:99px;background:var(--chrome-dot-yellow)"></span><span style="width:9px;height:9px;border-radius:99px;background:var(--chrome-dot-green)"></span></div><div class="n">--chrome-dot-*</div><div class="v">window mocks only</div></div>
|
|
15
|
+
</div>
|
|
16
|
+
<div class="meta" style="margin-top:10px">everything else — tiers, categories, accents — uses the opacity ladder</div>
|
|
17
|
+
</body></html>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!-- @dsCard group="Colors" viewport="700x150" name="Surfaces" subtitle="Page, card fills and overlay — the whole brand lives here" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Surfaces</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<style>body{margin:0;padding:16px 20px;background:#000;font-family:var(--font-sans);color:var(--foreground)}
|
|
4
|
+
.g{display:flex;gap:10px;flex-wrap:wrap}.sw{flex:1;min-width:64px}.chip{height:56px;border-radius:8px;border:1px solid var(--white-10)}
|
|
5
|
+
.n{margin-top:6px;font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--neutral-300);font-family:var(--font-mono)}
|
|
6
|
+
.v{font-size:9px;color:var(--neutral-600);font-family:var(--font-mono)}
|
|
7
|
+
.row{display:flex;align-items:baseline;gap:14px}.mono{font-family:var(--font-mono)}
|
|
8
|
+
.meta{font-size:10px;color:var(--neutral-600);font-family:var(--font-mono);white-space:nowrap}
|
|
9
|
+
</style></head><body>
|
|
10
|
+
<div class="g">
|
|
11
|
+
<div class="sw"><div class="chip" style="background:var(--background)"></div><div class="n">--background</div><div class="v">#000000</div></div>
|
|
12
|
+
<div class="sw"><div class="chip" style="background:var(--card)"></div><div class="n">--card</div><div class="v">#0a0a0a</div></div>
|
|
13
|
+
<div class="sw"><div class="chip" style="background:var(--surface-card)"></div><div class="n">--surface-card</div><div class="v">n-900 / 50%</div></div>
|
|
14
|
+
<div class="sw"><div class="chip" style="background:var(--surface-card-emphasis)"></div><div class="n">--surface-card-emphasis</div><div class="v">n-900 / 80%</div></div>
|
|
15
|
+
<div class="sw"><div class="chip" style="background:var(--secondary)"></div><div class="n">--secondary</div><div class="v">#1a1a1a</div></div>
|
|
16
|
+
<div class="sw"><div class="chip" style="background:var(--muted)"></div><div class="n">--muted</div><div class="v">#101010</div></div>
|
|
17
|
+
</div></body></html>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!-- @dsCard group="Colors" viewport="700x150" name="Text ranks" subtitle="Four ranks of white, plus helper grey" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Text ranks</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<style>body{margin:0;padding:16px 20px;background:#000;font-family:var(--font-sans);color:var(--foreground)}
|
|
4
|
+
.g{display:flex;gap:10px;flex-wrap:wrap}.sw{flex:1;min-width:64px}.chip{height:56px;border-radius:8px;border:1px solid var(--white-10)}
|
|
5
|
+
.n{margin-top:6px;font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--neutral-300);font-family:var(--font-mono)}
|
|
6
|
+
.v{font-size:9px;color:var(--neutral-600);font-family:var(--font-mono)}
|
|
7
|
+
.row{display:flex;align-items:baseline;gap:14px}.mono{font-family:var(--font-mono)}
|
|
8
|
+
.meta{font-size:10px;color:var(--neutral-600);font-family:var(--font-mono);white-space:nowrap}
|
|
9
|
+
</style></head><body>
|
|
10
|
+
<div style="display:flex;flex-direction:column;gap:7px">
|
|
11
|
+
<div class="row"><span style="color:var(--text-primary);font-size:15px;font-weight:600">Primary — headings and key copy</span><span class="meta">--text-primary · white</span></div>
|
|
12
|
+
<div class="row"><span style="color:var(--text-secondary);font-size:15px">Secondary — body copy</span><span class="meta">--text-secondary · white/80</span></div>
|
|
13
|
+
<div class="row"><span style="color:var(--text-tertiary);font-size:15px">Tertiary — captions</span><span class="meta">--text-tertiary · white/60</span></div>
|
|
14
|
+
<div class="row"><span style="color:var(--text-helper);font-size:15px">Helper — labels, hints, meta</span><span class="meta">--text-helper · #888888</span></div>
|
|
15
|
+
<div class="row"><span style="color:var(--text-disabled);font-size:15px">Disabled</span><span class="meta">--text-disabled · white/30</span></div>
|
|
16
|
+
</div></body></html>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<!-- @dsCard group="Brand" viewport="700x180" name="Iconography" subtitle="lucide-react 0.462.0, default stroke, four sizes" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Iconography</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<script src="https://unpkg.com/lucide@0.462.0/dist/umd/lucide.js"></script>
|
|
4
|
+
<style>body{margin:0;padding:16px 20px;background:#000;font-family:var(--font-sans);color:var(--neutral-300)}
|
|
5
|
+
.set{display:flex;flex-wrap:wrap;gap:20px;align-items:center}.i{display:flex;flex-direction:column;align-items:center;gap:7px;width:64px}
|
|
6
|
+
.n{font-size:9px;font-family:var(--font-mono);color:var(--neutral-600)}
|
|
7
|
+
.meta{margin-top:16px;font-size:10px;font-family:var(--font-mono);color:var(--neutral-600)}
|
|
8
|
+
[data-lucide]{stroke:currentColor}</style></head><body>
|
|
9
|
+
<div class="set">
|
|
10
|
+
<div class="i"><i data-lucide="arrow-right" style="width:22px;height:22px"></i><span class="n">arrow-right</span></div>
|
|
11
|
+
<div class="i"><i data-lucide="arrow-up-right" style="width:22px;height:22px"></i><span class="n">arrow-up-right</span></div>
|
|
12
|
+
<div class="i"><i data-lucide="terminal" style="width:22px;height:22px"></i><span class="n">terminal</span></div>
|
|
13
|
+
<div class="i"><i data-lucide="code" style="width:22px;height:22px"></i><span class="n">code</span></div>
|
|
14
|
+
<div class="i"><i data-lucide="file-text" style="width:22px;height:22px"></i><span class="n">file-text</span></div>
|
|
15
|
+
<div class="i"><i data-lucide="settings" style="width:22px;height:22px"></i><span class="n">settings</span></div>
|
|
16
|
+
<div class="i"><i data-lucide="user-check" style="width:22px;height:22px"></i><span class="n">user-check</span></div>
|
|
17
|
+
<div class="i"><i data-lucide="shield-check" style="width:22px;height:22px"></i><span class="n">shield-check</span></div>
|
|
18
|
+
<div class="i"><i data-lucide="lock" style="width:22px;height:22px"></i><span class="n">lock</span></div>
|
|
19
|
+
<div class="i"><i data-lucide="key-round" style="width:22px;height:22px"></i><span class="n">key-round</span></div>
|
|
20
|
+
<div class="i"><i data-lucide="cloud" style="width:22px;height:22px"></i><span class="n">cloud</span></div>
|
|
21
|
+
<div class="i"><i data-lucide="database" style="width:22px;height:22px"></i><span class="n">database</span></div>
|
|
22
|
+
<div class="i"><i data-lucide="bot" style="width:22px;height:22px"></i><span class="n">bot</span></div>
|
|
23
|
+
<div class="i"><i data-lucide="boxes" style="width:22px;height:22px"></i><span class="n">boxes</span></div>
|
|
24
|
+
<div class="i"><i data-lucide="message-square" style="width:22px;height:22px"></i><span class="n">message-square</span></div>
|
|
25
|
+
<div class="i"><i data-lucide="search" style="width:22px;height:22px"></i><span class="n">search</span></div>
|
|
26
|
+
<div class="i"><i data-lucide="chevron-down" style="width:22px;height:22px"></i><span class="n">chevron-down</span></div>
|
|
27
|
+
<div class="i"><i data-lucide="zap" style="width:22px;height:22px"></i><span class="n">zap</span></div>
|
|
28
|
+
</div>
|
|
29
|
+
<div class="meta">sizes 12 inline · 16 CTA · 24 card eyebrow · 40 section accent — stroke stays default, colour inherits</div>
|
|
30
|
+
<script>lucide.createIcons()</script></body></html>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<!-- @dsCard group="Spacing" viewport="700x170" name="Containers" subtitle="1280 grid, 768 prose, and the section rhythm" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Containers</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<style>body{margin:0;padding:16px 20px;background:#000;font-family:var(--font-sans);color:var(--foreground)}
|
|
4
|
+
.g{display:flex;gap:10px;flex-wrap:wrap}.sw{flex:1;min-width:64px}.chip{height:56px;border-radius:8px;border:1px solid var(--white-10)}
|
|
5
|
+
.n{margin-top:6px;font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--neutral-300);font-family:var(--font-mono)}
|
|
6
|
+
.v{font-size:9px;color:var(--neutral-600);font-family:var(--font-mono)}
|
|
7
|
+
.row{display:flex;align-items:baseline;gap:14px}.mono{font-family:var(--font-mono)}
|
|
8
|
+
.meta{font-size:10px;color:var(--neutral-600);font-family:var(--font-mono);white-space:nowrap}
|
|
9
|
+
</style></head><body>
|
|
10
|
+
<div style="display:flex;flex-direction:column;gap:8px">
|
|
11
|
+
<div><div style="height:22px;background:var(--white-10);border:1px solid var(--white-20);border-radius:4px;width:100%"></div><div class="meta" style="margin-top:4px">--container-max · max-w-7xl · 1280px — grids and nav</div></div>
|
|
12
|
+
<div><div style="height:22px;background:var(--white-15);border:1px solid var(--white-20);border-radius:4px;width:90%"></div><div class="meta" style="margin-top:4px">--container-wide · max-w-6xl · 1152px — landing sections</div></div>
|
|
13
|
+
<div><div style="height:22px;background:var(--white-20);border:1px solid var(--white-30);border-radius:4px;width:60%"></div><div class="meta" style="margin-top:4px">--container-prose · max-w-3xl · 768px — centred copy</div></div>
|
|
14
|
+
<div class="meta">gutters px-4 → sm:px-6 → lg:px-8 · sections py-16/py-24 · heroes py-20 → lg:py-32</div>
|
|
15
|
+
</div></body></html>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<!-- @dsCard group="Spacing" viewport="700x150" name="Golden ramp" subtitle="φ ramp from tailwind.config.ts — editorial layouts only" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Golden ramp</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<style>body{margin:0;padding:16px 20px;background:#000;font-family:var(--font-sans);color:var(--foreground)}
|
|
4
|
+
.g{display:flex;gap:10px;flex-wrap:wrap}.sw{flex:1;min-width:64px}.chip{height:56px;border-radius:8px;border:1px solid var(--white-10)}
|
|
5
|
+
.n{margin-top:6px;font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--neutral-300);font-family:var(--font-mono)}
|
|
6
|
+
.v{font-size:9px;color:var(--neutral-600);font-family:var(--font-mono)}
|
|
7
|
+
.row{display:flex;align-items:baseline;gap:14px}.mono{font-family:var(--font-mono)}
|
|
8
|
+
.meta{font-size:10px;color:var(--neutral-600);font-family:var(--font-mono);white-space:nowrap}
|
|
9
|
+
</style></head><body>
|
|
10
|
+
<div style="display:flex;align-items:flex-end;gap:10px">
|
|
11
|
+
<div style="text-align:center"><div style="width:0.25rem;height:0.25rem;background:var(--white-10);border:1px solid var(--white-20);border-radius:3px"></div><div class="n" style="margin-top:6px">1</div></div>
|
|
12
|
+
<div style="text-align:center"><div style="width:0.405rem;height:0.405rem;background:var(--white-10);border:1px solid var(--white-20);border-radius:3px"></div><div class="n" style="margin-top:6px">2</div></div>
|
|
13
|
+
<div style="text-align:center"><div style="width:0.654rem;height:0.654rem;background:var(--white-10);border:1px solid var(--white-20);border-radius:3px"></div><div class="n" style="margin-top:6px">3</div></div>
|
|
14
|
+
<div style="text-align:center"><div style="width:1.059rem;height:1.059rem;background:var(--white-10);border:1px solid var(--white-20);border-radius:3px"></div><div class="n" style="margin-top:6px">4</div></div>
|
|
15
|
+
<div style="text-align:center"><div style="width:1.713rem;height:1.713rem;background:var(--white-10);border:1px solid var(--white-20);border-radius:3px"></div><div class="n" style="margin-top:6px">5</div></div>
|
|
16
|
+
<div style="text-align:center"><div style="width:2.772rem;height:2.772rem;background:var(--white-10);border:1px solid var(--white-20);border-radius:3px"></div><div class="n" style="margin-top:6px">6</div></div>
|
|
17
|
+
<div style="text-align:center"><div style="width:4.487rem;height:4.487rem;background:var(--white-10);border:1px solid var(--white-20);border-radius:3px"></div><div class="n" style="margin-top:6px">7</div></div>
|
|
18
|
+
<div style="margin-left:14px"><div style="display:grid;grid-template-columns:38.2% 61.8%;gap:4px;width:200px"><div style="height:28px;background:var(--white-10);border-radius:3px"></div><div style="height:28px;background:var(--white-20);border-radius:3px"></div></div><div class="n" style="margin-top:6px">--golden-split</div></div>
|
|
19
|
+
</div></body></html>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<!-- @dsCard group="Spacing" viewport="700x150" name="Spacing ramp" subtitle="The 4px ramp that ships" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Spacing ramp</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<style>body{margin:0;padding:16px 20px;background:#000;font-family:var(--font-sans);color:var(--foreground)}
|
|
4
|
+
.g{display:flex;gap:10px;flex-wrap:wrap}.sw{flex:1;min-width:64px}.chip{height:56px;border-radius:8px;border:1px solid var(--white-10)}
|
|
5
|
+
.n{margin-top:6px;font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--neutral-300);font-family:var(--font-mono)}
|
|
6
|
+
.v{font-size:9px;color:var(--neutral-600);font-family:var(--font-mono)}
|
|
7
|
+
.row{display:flex;align-items:baseline;gap:14px}.mono{font-family:var(--font-mono)}
|
|
8
|
+
.meta{font-size:10px;color:var(--neutral-600);font-family:var(--font-mono);white-space:nowrap}
|
|
9
|
+
</style></head><body>
|
|
10
|
+
<div style="display:flex;align-items:flex-end;gap:10px">
|
|
11
|
+
<div style="text-align:center"><div style="width:4px;height:4px;background:var(--white-15);border:1px solid var(--white-20);border-radius:3px"></div><div class="n" style="margin-top:6px">4</div></div>
|
|
12
|
+
<div style="text-align:center"><div style="width:8px;height:8px;background:var(--white-15);border:1px solid var(--white-20);border-radius:3px"></div><div class="n" style="margin-top:6px">8</div></div>
|
|
13
|
+
<div style="text-align:center"><div style="width:12px;height:12px;background:var(--white-15);border:1px solid var(--white-20);border-radius:3px"></div><div class="n" style="margin-top:6px">12</div></div>
|
|
14
|
+
<div style="text-align:center"><div style="width:16px;height:16px;background:var(--white-15);border:1px solid var(--white-20);border-radius:3px"></div><div class="n" style="margin-top:6px">16</div></div>
|
|
15
|
+
<div style="text-align:center"><div style="width:24px;height:24px;background:var(--white-15);border:1px solid var(--white-20);border-radius:3px"></div><div class="n" style="margin-top:6px">24</div></div>
|
|
16
|
+
<div style="text-align:center"><div style="width:32px;height:32px;background:var(--white-15);border:1px solid var(--white-20);border-radius:3px"></div><div class="n" style="margin-top:6px">32</div></div>
|
|
17
|
+
<div style="text-align:center"><div style="width:48px;height:48px;background:var(--white-15);border:1px solid var(--white-20);border-radius:3px"></div><div class="n" style="margin-top:6px">48</div></div>
|
|
18
|
+
<div style="text-align:center"><div style="width:64px;height:64px;background:var(--white-15);border:1px solid var(--white-20);border-radius:3px"></div><div class="n" style="margin-top:6px">64</div></div>
|
|
19
|
+
<div style="text-align:center"><div style="width:80px;height:80px;background:var(--white-15);border:1px solid var(--white-20);border-radius:3px"></div><div class="n" style="margin-top:6px">80</div></div>
|
|
20
|
+
<div style="text-align:center"><div style="width:96px;height:96px;background:var(--white-15);border:1px solid var(--white-20);border-radius:3px"></div><div class="n" style="margin-top:6px">96</div></div>
|
|
21
|
+
</div>
|
|
22
|
+
<div class="meta" style="margin-top:8px">--space-1 … --space-24 · component padding always lands on this ramp</div>
|
|
23
|
+
</body></html>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!-- @dsCard group="Type" viewport="700x200" name="Body & lead" subtitle="Lead 18px, body 14px, caption 12px" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Body type</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<style>body{margin:0;padding:16px 20px;background:#000;font-family:var(--font-sans);color:var(--foreground)}
|
|
4
|
+
.g{display:flex;gap:10px;flex-wrap:wrap}.sw{flex:1;min-width:64px}.chip{height:56px;border-radius:8px;border:1px solid var(--white-10)}
|
|
5
|
+
.n{margin-top:6px;font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--neutral-300);font-family:var(--font-mono)}
|
|
6
|
+
.v{font-size:9px;color:var(--neutral-600);font-family:var(--font-mono)}
|
|
7
|
+
.row{display:flex;align-items:baseline;gap:14px}.mono{font-family:var(--font-mono)}
|
|
8
|
+
.meta{font-size:10px;color:var(--neutral-600);font-family:var(--font-mono);white-space:nowrap}
|
|
9
|
+
</style></head><body>
|
|
10
|
+
<div style="display:flex;flex-direction:column;gap:12px;max-width:62ch">
|
|
11
|
+
<div><p style="font-size:var(--text-lg);color:var(--neutral-300);line-height:var(--leading-relaxed)">Build, deploy, and govern AI agents with unified access to models, tools, memory, and audit logs.</p><span class="meta">lead · 18px / relaxed · neutral-300</span></div>
|
|
12
|
+
<div><p style="font-size:var(--text-sm);color:var(--text-helper);line-height:var(--leading-sm)">Every request is scoped to the caller's org. A teammate in your org sees the row; other orgs cannot.</p><span class="meta">body · 14px · --text-helper</span></div>
|
|
13
|
+
<div><p style="font-size:var(--text-xs);color:var(--text-helper)">Pay-as-you-go. No minimums.</p><span class="meta">caption · 12px</span></div>
|
|
14
|
+
</div></body></html>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!-- @dsCard group="Type" viewport="700x180" name="Chrome headline" subtitle="The one permitted gradient — white to white/60" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Chrome headline</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<style>body{margin:0;padding:16px 20px;background:#000;font-family:var(--font-sans);color:var(--foreground)}
|
|
4
|
+
.g{display:flex;gap:10px;flex-wrap:wrap}.sw{flex:1;min-width:64px}.chip{height:56px;border-radius:8px;border:1px solid var(--white-10)}
|
|
5
|
+
.n{margin-top:6px;font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--neutral-300);font-family:var(--font-mono)}
|
|
6
|
+
.v{font-size:9px;color:var(--neutral-600);font-family:var(--font-mono)}
|
|
7
|
+
.row{display:flex;align-items:baseline;gap:14px}.mono{font-family:var(--font-mono)}
|
|
8
|
+
.meta{font-size:10px;color:var(--neutral-600);font-family:var(--font-mono);white-space:nowrap}
|
|
9
|
+
</style></head><body>
|
|
10
|
+
<div style="display:flex;flex-direction:column;gap:12px">
|
|
11
|
+
<span style="font-size:10px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--text-helper)">AI cloud</span>
|
|
12
|
+
<span style="font-size:var(--text-5xl);font-weight:700;letter-spacing:var(--tracking-tight);line-height:1.05;background-image:var(--gradient-chrome);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent">From model to shipped product</span>
|
|
13
|
+
<span class="meta">--gradient-chrome · ChromeText · never a saturated or rainbow gradient</span>
|
|
14
|
+
</div></body></html>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!-- @dsCard group="Type" viewport="700x220" name="Display" subtitle="Geist Sans, hero and section headlines" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Display type</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<style>body{margin:0;padding:16px 20px;background:#000;font-family:var(--font-sans);color:var(--foreground)}
|
|
4
|
+
.g{display:flex;gap:10px;flex-wrap:wrap}.sw{flex:1;min-width:64px}.chip{height:56px;border-radius:8px;border:1px solid var(--white-10)}
|
|
5
|
+
.n{margin-top:6px;font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--neutral-300);font-family:var(--font-mono)}
|
|
6
|
+
.v{font-size:9px;color:var(--neutral-600);font-family:var(--font-mono)}
|
|
7
|
+
.row{display:flex;align-items:baseline;gap:14px}.mono{font-family:var(--font-mono)}
|
|
8
|
+
.meta{font-size:10px;color:var(--neutral-600);font-family:var(--font-mono);white-space:nowrap}
|
|
9
|
+
</style></head><body>
|
|
10
|
+
<div style="display:flex;flex-direction:column;gap:10px">
|
|
11
|
+
<div class="row"><span style="font-size:var(--text-6xl);font-weight:700;letter-spacing:var(--tracking-tight);line-height:1">Enso</span><span class="meta">6xl / 60px · 700 · tracking-tight</span></div>
|
|
12
|
+
<div class="row"><span style="font-size:var(--text-4xl);font-weight:700;letter-spacing:var(--tracking-tight);line-height:1.1">The AI cloud for agents</span><span class="meta">4xl / 36px · 700</span></div>
|
|
13
|
+
<div class="row"><span style="font-size:var(--text-2xl);font-weight:600">Section subhead</span><span class="meta">2xl / 24px · 600</span></div>
|
|
14
|
+
</div></body></html>
|