Skip to content

Commit 3d779f5

Browse files
leex279claude
andauthored
docs(brand): add brand foundation page on archon.diy (#1745)
* docs(brand): add brand foundation page on archon.diy - Mount the canonical Archon brand sheet at `/brand/` in the docs site (Penpot-exported standalone HTML, top-right "Console →" cross-link surgically removed via a re-runnable patch script). - Add a Starlight overview page with a Quick reference (gradient, surface) and an embedded full brand sheet. - Sidebar gains a "🎨 Brand" entry between Roadmap and The Book of Archon. - Fix the dark-mode active sidebar link being unreadable (`color: var(--sl-color-white)`). - Require future UI changes to align with the brand foundation (new "UI and Visual Design" section in root CLAUDE.md). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(brand): switch foundation.html to plain source files, drop decoder scripts The brand sheet now ships as plain Penpot-exported source (Brand.html shell, brand-app.jsx, logo.jsx, tweaks-panel.jsx, standalone-tweaks-toggle.jsx, app.css, archon-logo.png) and is edited like any other code in the repo: open the JSX, change it, refresh the page. - public/brand/foundation.html now loads React + Babel from unpkg (with integrity hashes) and compiles the JSX in the browser. Adds one local override: hide the Penpot Tweaks toggle on the public site. - brand-app.jsx carries our single local delta: the top-right "Console →" cross-link is removed (the sibling Archon Console doc isn't published). - public/brand/README.md documents what each file owns and the local delta. - The 1.5 MB self-extracting bundle and the scripts/brand/ decoder pipeline (_find-console.ts, _dump.ts, _patch.ts) are deleted. Net: the repo loses ~1.5 MB of opaque base64 + 4 maintenance scripts; gains ~85 KB of editable source. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent da31993 commit 3d779f5

12 files changed

Lines changed: 1956 additions & 0 deletions

File tree

CLAUDE.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,15 @@ curl http://localhost:3637/api/conversations/<conversationId>/messages
587587

588588
## Development Guidelines
589589

590+
### UI and Visual Design
591+
592+
All UI changes — production web (`packages/web/`), experiments (`packages/web/src/experiments/`), the docs site, marketing surfaces, and any future visual surface — must align with the Archon brand foundation.
593+
594+
- **Canonical brand guide:** https://archon.diy/brand/ (source: `packages/docs-web/src/content/docs/brand/index.md` + `packages/docs-web/public/brand/foundation.html`).
595+
- **Use brand tokens, not ad-hoc values.** Colors, gradients, surfaces, and typography must come from the established design tokens (`packages/web/src/index.css`) or the brand guide. Don't hard-code hex values that aren't in the system.
596+
- **Introducing a new visual token** (color, font, radius, spacing) means updating both the token source and the brand guide. Don't fork the palette per package.
597+
- **When in doubt, consult the brand guide first** before inventing new visual treatments. Open a discussion if the guide doesn't cover your case.
598+
590599
### When Creating New Features
591600

592601
**Quick reference:**

packages/docs-web/astro.config.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export default defineConfig({
2525
sidebar: [
2626
{ label: '✦ Marketplace', link: '/workflows/' },
2727
{ label: '🗺️ Roadmap', link: '/roadmap/' },
28+
{ label: '🎨 Brand', link: '/brand/' },
2829
{
2930
label: 'The Book of Archon',
3031
autogenerate: { directory: 'book' },
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Brand foundation source
2+
3+
Live at https://archon.diy/brand/foundation.html. Embedded into the docs Brand page via iframe (see `packages/docs-web/src/content/docs/brand/index.md`).
4+
5+
These are the original Penpot-exported source files — plain JSX compiled in the browser by Babel-standalone. No build step, no bundling. **To change the brand sheet, edit these files directly and refresh the page.**
6+
7+
| File | Owns |
8+
| --- | --- |
9+
| `foundation.html` | HTML shell. Loads React + Babel from CDN, wires up the JSX scripts, and applies our docs-site overrides (hides the Tweaks toggle). |
10+
| `brand-app.jsx` | The full brand sheet: header, sections, gradient swatches, type scale, do's & don'ts. Where you edit copy and section layout. |
11+
| `logo.jsx` | `ArchonMark`, `ArchonGlyph`, `ArchonLockup` components. SVG path data lives here. |
12+
| `app.css` | Design tokens (oklch palette, surfaces, typography). Where you edit colors and spacing. |
13+
| `tweaks-panel.jsx` | Generic tweak-panel widget shipped with Penpot exports. Brand sheet uses `useTweaks` for live customisation in the editor; the floating toggle is hidden on archon.diy via `foundation.html`. |
14+
| `standalone-tweaks-toggle.jsx` | Companion floating button for `tweaks-panel.jsx`. Hidden on archon.diy. |
15+
| `assets/archon-logo.png` | Rasterised logo fallback (the inline SVGs in `logo.jsx` are the canonical mark). |
16+
17+
## Local customisations
18+
19+
We carry exactly one delta on top of the upstream Penpot export:
20+
21+
- `brand-app.jsx`: removed the top-right "Console →" cross-link in the page header, since the sibling "Archon Console" doc isn't published here.
22+
23+
If you re-export from Penpot, re-apply that single change (or accept the cross-link).
Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
/* Archon — design tokens
2+
*
3+
* Brand thread: a magenta → teal gradient drawn from the shield logo.
4+
* magenta oklch(0.625 0.330 328) #ED10EC
5+
* teal oklch(0.736 0.175 168) #06CE94
6+
*
7+
* The duotone IS the brand. Use the gradient for hero moments (logo, hero
8+
* heading, primary CTA hover, focus rings on key actions). Use the magenta
9+
* or teal solid as the working accent depending on context — magenta for
10+
* presence/identity, teal for "go / approve / completed".
11+
*
12+
* Surfaces are cool charcoals with the faintest blue cast — neutral enough
13+
* that the saturated brand thread carries the whole identity without
14+
* competition.
15+
*/
16+
17+
:root,
18+
[data-theme="dark"] {
19+
/* Surfaces — cool charcoal */
20+
--bg: oklch(0.145 0.006 265);
21+
--surface: oklch(0.175 0.007 265);
22+
--surface-2: oklch(0.205 0.009 265);
23+
--surface-3: oklch(0.235 0.011 265);
24+
--surface-hover: oklch(0.225 0.010 265);
25+
26+
/* Borders */
27+
--border: oklch(0.275 0.012 265);
28+
--border-strong: oklch(0.355 0.016 265);
29+
--divider: oklch(0.230 0.010 265);
30+
31+
/* Text */
32+
--text: oklch(0.975 0.004 265);
33+
--text-secondary: oklch(0.745 0.014 265);
34+
--text-tertiary: oklch(0.560 0.017 265);
35+
--text-quaternary: oklch(0.430 0.017 265);
36+
37+
/* Brand identity — the duotone */
38+
--brand-magenta: oklch(0.640 0.295 330);
39+
--brand-magenta-2: oklch(0.720 0.260 335); /* lighter, used near purple transition */
40+
--brand-violet: oklch(0.560 0.215 305); /* the midpoint */
41+
--brand-teal: oklch(0.755 0.165 168);
42+
--brand-teal-2: oklch(0.700 0.150 175); /* darker teal */
43+
--brand-gradient: linear-gradient(135deg, var(--brand-magenta) 0%, var(--brand-violet) 50%, var(--brand-teal) 100%);
44+
--brand-gradient-soft: linear-gradient(135deg,
45+
oklch(0.640 0.295 330 / 0.18) 0%,
46+
oklch(0.560 0.215 305 / 0.12) 50%,
47+
oklch(0.755 0.165 168 / 0.18) 100%);
48+
49+
/* Accent — defaults to brand magenta. The dataset attr swaps it. */
50+
--accent: var(--brand-magenta);
51+
--accent-hover: oklch(0.700 0.280 330);
52+
--accent-soft: oklch(0.640 0.295 330 / 0.14);
53+
--accent-ring: oklch(0.640 0.295 330 / 0.30);
54+
--on-accent: oklch(0.985 0 0);
55+
56+
/* Status — separate from accent so brand swaps don't break meaning.
57+
- success uses the brand teal (intentional — affirmative IS brand)
58+
- running is a calm electric blue, distinct from brand magenta
59+
- warning is amber, error is hot red. */
60+
--running: oklch(0.720 0.155 245);
61+
--running-soft: oklch(0.720 0.155 245 / 0.14);
62+
--success: var(--brand-teal);
63+
--success-soft: oklch(0.755 0.165 168 / 0.14);
64+
--warning: oklch(0.800 0.140 85);
65+
--warning-soft: oklch(0.800 0.140 85 / 0.14);
66+
--error: oklch(0.680 0.215 18);
67+
--error-soft: oklch(0.680 0.215 18 / 0.14);
68+
69+
/* Shadows */
70+
--shadow-sm: 0 1px 2px 0 oklch(0 0 0 / 0.4);
71+
--shadow-md: 0 4px 12px -2px oklch(0 0 0 / 0.45);
72+
--shadow-lg: 0 20px 40px -12px oklch(0 0 0 / 0.55);
73+
--shadow-brand: 0 8px 32px -8px oklch(0.640 0.295 330 / 0.30);
74+
}
75+
76+
[data-theme="light"] {
77+
--bg: oklch(0.985 0.003 265);
78+
--surface: oklch(1.000 0 0);
79+
--surface-2: oklch(0.975 0.004 265);
80+
--surface-3: oklch(0.955 0.006 265);
81+
--surface-hover: oklch(0.965 0.005 265);
82+
83+
--border: oklch(0.910 0.007 265);
84+
--border-strong: oklch(0.855 0.010 265);
85+
--divider: oklch(0.940 0.005 265);
86+
87+
--text: oklch(0.180 0.010 265);
88+
--text-secondary: oklch(0.420 0.014 265);
89+
--text-tertiary: oklch(0.560 0.015 265);
90+
--text-quaternary: oklch(0.680 0.014 265);
91+
92+
--brand-magenta: oklch(0.555 0.310 328);
93+
--brand-magenta-2: oklch(0.620 0.270 335);
94+
--brand-violet: oklch(0.480 0.230 305);
95+
--brand-teal: oklch(0.620 0.165 168);
96+
--brand-teal-2: oklch(0.560 0.150 175);
97+
--brand-gradient: linear-gradient(135deg, var(--brand-magenta) 0%, var(--brand-violet) 50%, var(--brand-teal) 100%);
98+
--brand-gradient-soft: linear-gradient(135deg,
99+
oklch(0.555 0.310 328 / 0.12) 0%,
100+
oklch(0.480 0.230 305 / 0.08) 50%,
101+
oklch(0.620 0.165 168 / 0.12) 100%);
102+
103+
--accent: var(--brand-magenta);
104+
--accent-hover: oklch(0.500 0.310 328);
105+
--accent-soft: oklch(0.555 0.310 328 / 0.10);
106+
--accent-ring: oklch(0.555 0.310 328 / 0.26);
107+
--on-accent: oklch(1 0 0);
108+
109+
--running: oklch(0.520 0.185 245);
110+
--running-soft: oklch(0.520 0.185 245 / 0.10);
111+
--success: var(--brand-teal);
112+
--success-soft: oklch(0.620 0.165 168 / 0.10);
113+
--warning: oklch(0.650 0.155 75);
114+
--warning-soft: oklch(0.650 0.155 75 / 0.10);
115+
--error: oklch(0.570 0.220 22);
116+
--error-soft: oklch(0.570 0.220 22 / 0.10);
117+
118+
--shadow-sm: 0 1px 2px 0 oklch(0.2 0.01 265 / 0.06);
119+
--shadow-md: 0 4px 12px -2px oklch(0.2 0.01 265 / 0.10);
120+
--shadow-lg: 0 20px 40px -12px oklch(0.2 0.01 265 / 0.18);
121+
--shadow-brand: 0 8px 32px -8px oklch(0.555 0.310 328 / 0.25);
122+
}
123+
124+
/* Accent variants — driven by tweaks. "brand" is the default; user can
125+
commit to the magenta or teal solid for a single-color treatment. */
126+
[data-accent="teal"] {
127+
--accent: var(--brand-teal);
128+
--accent-hover: oklch(0.810 0.165 168);
129+
--accent-soft: oklch(0.755 0.165 168 / 0.14);
130+
--accent-ring: oklch(0.755 0.165 168 / 0.30);
131+
--on-accent: oklch(0.180 0.040 168);
132+
}
133+
[data-accent="violet"] {
134+
--accent: var(--brand-violet);
135+
--accent-hover: oklch(0.620 0.220 305);
136+
--accent-soft: oklch(0.560 0.215 305 / 0.14);
137+
--accent-ring: oklch(0.560 0.215 305 / 0.30);
138+
--on-accent: oklch(0.985 0 0);
139+
}
140+
[data-accent="mono"] {
141+
--accent: oklch(0.945 0.005 265);
142+
--accent-hover: oklch(1 0 0);
143+
--accent-soft: oklch(0.945 0.005 265 / 0.10);
144+
--accent-ring: oklch(0.945 0.005 265 / 0.25);
145+
--on-accent: oklch(0.145 0.006 265);
146+
}
147+
[data-theme="light"][data-accent="teal"] {
148+
--accent: var(--brand-teal);
149+
--accent-hover: oklch(0.560 0.165 168);
150+
--on-accent: oklch(0.985 0 0);
151+
}
152+
[data-theme="light"][data-accent="violet"] {
153+
--accent: var(--brand-violet);
154+
--accent-hover: oklch(0.430 0.230 305);
155+
--on-accent: oklch(0.985 0 0);
156+
}
157+
[data-theme="light"][data-accent="mono"] {
158+
--accent: oklch(0.180 0.010 265);
159+
--accent-hover: oklch(0.080 0.010 265);
160+
--accent-soft: oklch(0.180 0.010 265 / 0.08);
161+
--on-accent: oklch(0.985 0 0);
162+
}
163+
164+
* { box-sizing: border-box; }
165+
html, body { margin: 0; padding: 0; }
166+
167+
body {
168+
font-family: "Geist", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
169+
background: var(--bg);
170+
color: var(--text);
171+
font-size: 14px;
172+
line-height: 1.5;
173+
font-feature-settings: "ss01", "cv11";
174+
-webkit-font-smoothing: antialiased;
175+
-moz-osx-font-smoothing: grayscale;
176+
text-rendering: optimizeLegibility;
177+
letter-spacing: -0.005em;
178+
}
179+
180+
.mono { font-family: "Geist Mono", ui-monospace, "SF Mono", Menlo, monospace; font-feature-settings: "ss01", "ss02"; }
181+
182+
button { font-family: inherit; cursor: pointer; }
183+
input, textarea { font-family: inherit; }
184+
185+
::selection { background: var(--accent-ring); color: var(--text); }
186+
187+
*::-webkit-scrollbar { width: 10px; height: 10px; }
188+
*::-webkit-scrollbar-track { background: transparent; }
189+
*::-webkit-scrollbar-thumb {
190+
background: var(--border);
191+
border-radius: 999px;
192+
border: 2px solid transparent;
193+
background-clip: padding-box;
194+
}
195+
*::-webkit-scrollbar-thumb:hover { background: var(--border-strong); background-clip: padding-box; border: 2px solid transparent; }
196+
197+
:focus-visible {
198+
outline: 2px solid var(--accent-ring);
199+
outline-offset: 2px;
200+
border-radius: 6px;
201+
}
202+
203+
/* Brand utility — apply gradient as text/fill */
204+
.brand-text {
205+
background: var(--brand-gradient);
206+
-webkit-background-clip: text;
207+
background-clip: text;
208+
color: transparent;
209+
-webkit-text-fill-color: transparent;
210+
}
211+
212+
.brand-bar {
213+
background: var(--brand-gradient);
214+
}
215+
216+
/* Animations */
217+
@keyframes pulse-dot {
218+
0%, 100% { opacity: 1; transform: scale(1); }
219+
50% { opacity: 0.6; transform: scale(0.85); }
220+
}
221+
@keyframes pulse-glow {
222+
0%, 100% { box-shadow: 0 0 0 0 var(--accent-ring); }
223+
50% { box-shadow: 0 0 0 6px transparent; }
224+
}
225+
@keyframes fade-in {
226+
from { opacity: 0; transform: translateY(2px); }
227+
to { opacity: 1; transform: translateY(0); }
228+
}
229+
@keyframes scale-in {
230+
from { opacity: 0; transform: scale(0.96); }
231+
to { opacity: 1; transform: scale(1); }
232+
}
233+
@keyframes shimmer {
234+
0% { background-position: 0% 50%; }
235+
50% { background-position: 100% 50%; }
236+
100% { background-position: 0% 50%; }
237+
}
47.1 KB
Loading

0 commit comments

Comments
 (0)