Skip to content

Commit 298d9a4

Browse files
refactor(webapp): harden brand asset ownership
1 parent dfaeeea commit 298d9a4

22 files changed

Lines changed: 118 additions & 162 deletions

.changeset/brand-review-board.md

Lines changed: 0 additions & 5 deletions
This file was deleted.

.changeset/signal-blue-heph.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"hephaestus": patch
3+
---
4+
5+
Hephaestus now uses the signal-blue Heph mark across the web app, documentation, README, browser and installable-app icons, and link previews.

.github/workflows/ci-tests.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,11 +162,18 @@ jobs:
162162
run: |
163163
timeout --kill-after=30s 15m pnpm --filter webapp run test:storybook
164164
pnpm --filter webapp run export:readme-assets
165+
pnpm --filter webapp run export:brand-assets
165166
if [[ -n "$(git status --porcelain --untracked-files=all -- docs/images/readme)" ]]; then
166167
echo "::error::README or documentation images are stale. Run 'pnpm --filter webapp run export:readme-assets' and commit the result."
167168
git status --short --untracked-files=all -- docs/images/readme
168169
exit 1
169170
fi
171+
BRAND_ASSETS=(webapp/brand webapp/public docs/static/img/brand docs/static/img/favicon.png docs/static/img/hephaestus-social-card.png)
172+
if [[ -n "$(git status --porcelain --untracked-files=all -- "${BRAND_ASSETS[@]}")" ]]; then
173+
echo "::error::Brand assets are stale. Run 'pnpm --filter webapp run export:brand-assets' and commit the result."
174+
git status --short --untracked-files=all -- "${BRAND_ASSETS[@]}"
175+
exit 1
176+
fi
170177
- name: Build Storybook with dependency stats
171178
run: |
172179
pnpm --filter webapp run build-storybook

README.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
<div align="center">
2-
<picture>
3-
<source media="(prefers-color-scheme: dark)" srcset="./docs/static/img/brand/hephaestus-lockup-dark.svg">
4-
<source media="(prefers-color-scheme: light)" srcset="./docs/static/img/brand/hephaestus-lockup-light.svg">
5-
<img alt="Hephaestus" height="100" src="./docs/static/img/brand/hephaestus-lockup-light.svg">
6-
</picture>
2+
<h1>
3+
<picture>
4+
<source media="(prefers-color-scheme: dark)" srcset="./docs/static/img/brand/hephaestus-lockup-dark.png">
5+
<source media="(prefers-color-scheme: light)" srcset="./docs/static/img/brand/hephaestus-lockup-light.png">
6+
<img alt="Hephaestus" height="100" src="./docs/static/img/brand/hephaestus-lockup-light.png">
7+
</picture>
8+
</h1>
79
<p><strong>Learn from the work you're already doing</strong></p>
810

911
<p>

docker/compose.proxy.yaml

Lines changed: 2 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -170,64 +170,10 @@ configs:
170170
article { display: block; width: 700px; padding: 50px; margin: 0 auto; }
171171
a { color: #fff; font-weight: bold;}
172172
a:hover { text-decoration: none; }
173-
svg.warning {
174-
width: 75px;
175-
margin-top: 1em;
176-
animation: warning-impact 1s infinite;
177-
}
178-
svg.hammer {
179-
translate: -135px -35px;
180-
position: absolute;
181-
width: 75px;
182-
margin-top: 1em;
183-
transform-origin: bottom left;
184-
animation: hammer-swing 1s infinite;
185-
}
186-
@keyframes hammer-swing {
187-
0% {
188-
transform: rotate(0deg);
189-
}
190-
20% {
191-
transform: rotate(-60deg);
192-
}
193-
30% {
194-
transform: rotate(-60deg);
195-
}
196-
40% {
197-
transform: rotate(0deg);
198-
}
199-
100% {
200-
transform: rotate(0deg);
201-
}
202-
}
203-
@keyframes warning-impact {
204-
0%, 37% {
205-
transform: scale(1) rotate(0deg);
206-
}
207-
40% {
208-
transform: scale(1.3) rotate(15deg);
209-
}
210-
42% {
211-
transform: scale(1.0) rotate(-10deg);
212-
}
213-
44% {
214-
transform: scale(1.2) rotate(5deg);
215-
}
216-
46%, 100% {
217-
transform: scale(1) rotate(0deg);
218-
}
219-
}
173+
svg.brand { width: 96px; }
220174
</style>
221175
<article>
222-
<div style="position: relative;">
223-
<svg class="warning" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 202.24 202.24"><defs><style>.cls-1{fill:#fff;}</style></defs><title>Asset 3</title><g id="Layer_2" data-name="Layer 2"><g id="Capa_1" data-name="Capa 1"><path class="cls-1" d="M101.12,0A101.12,101.12,0,1,0,202.24,101.12,101.12,101.12,0,0,0,101.12,0ZM159,148.76H43.28a11.57,11.57,0,0,1-10-17.34L91.09,31.16a11.57,11.57,0,0,1,20.06,0L169,131.43a11.57,11.57,0,0,1-10,17.34Z"/><path class="cls-1" d="M101.12,36.93h0L43.27,137.21H159L101.13,36.94Zm0,88.7a7.71,7.71,0,1,1,7.71-7.71A7.71,7.71,0,0,1,101.12,125.63Zm7.71-50.13a7.56,7.56,0,0,1-.11,1.3l-3.8,22.49a3.86,3.86,0,0,1-7.61,0l-3.8-22.49a8,8,0,0,1-.11-1.3,7.71,7.71,0,1,1,15.43,0Z"/></g></g></svg>
224-
<svg class="hammer" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24" fill="none"
225-
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
226-
<path d="m15 12-8.373 8.373a1 1 0 1 1-3-3L12 9"></path>
227-
<path d="m18 15 4-4"></path>
228-
<path d="m21.5 11.5-1.914-1.914A2 2 0 0 1 19 8.172V7l-2.26-2.26a6 6 0 0 0-4.202-1.756L9 2.96l.92.82A6.18 6.18 0 0 1 12 8.4V10l2 2h1.172a2 2 0 0 1 1.414.586L18.5 14.5"></path>
229-
</svg>
230-
</div>
176+
<svg class="brand" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" role="img" aria-label="Hephaestus"><circle cx="64" cy="64" r="64" fill="#315FDC"/><g transform="translate(24 20) scale(3.3333)" fill="none" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 7.2V3.6"/><circle cx="12" cy="2.8" r="1" fill="#fff"/><rect x="4" y="8" width="16" height="12" rx="3"/><path d="M2 14h2M20 14h2M8.6 13.5h.8M14.6 13.5h.8M9.7 16.8c1.1 1.1 3.5 1.1 4.6 0M6.8 15.2h.6M16.6 15.2h.6"/></g></svg>
231177
<h1>We&rsquo;ll be back soon!</h1>
232178
<div>
233179
<p>We&rsquo;re performing some maintenance at the moment. Sorry for the inconvenience.</p>

docs/contributor/brand-assets.mdx

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,50 +4,44 @@ title: Brand assets
44

55
# Brand assets
66

7-
Hephaestus uses one identity system:
7+
Hephaestus uses the solid signal-blue Heph mark for product identity. The bare, animated Heph drawing
8+
is reserved for the mentor persona.
89

9-
- the **solid signal-blue Heph mark** for product identity, app icons, favicons, and external profiles;
10-
- the **Heph-accent wordmark** for lockups; and
11-
- the bare, animated Heph drawing only when Heph is acting as the mentor persona.
10+
## Source and generation
1211

13-
The vector sources live in `webapp/brand/`. Do not edit the copies or PNG derivatives under
14-
`webapp/public/` or `docs/static/img/` directly. Regenerate them with:
12+
`webapp/brand/hephaestus-mark.svg` is the source for the static mark. The React `HephMark` renders
13+
that file directly. `webapp/scripts/export-brand-assets.ts` produces the tracked browser, app,
14+
documentation, README, social-card, and external-profile assets:
1515

1616
```bash
1717
pnpm --filter webapp run export:brand-assets
1818
```
1919

20-
The solid mark keeps `#315FDC` in both color modes. UI text uses the mode-aware `brand-accent` token,
21-
so the wordmark remains legible on dark surfaces. Product prose always spells the name normally as
22-
“Hephaestus”; the accent is visual identity, not punctuation or a new product name.
20+
Do not edit generated files under `webapp/public/` or `docs/static/img/`. CI regenerates them and
21+
fails when the committed output differs.
2322

24-
White on signal blue has a 5.52:1 contrast ratio. This clears the WCAG 2.2 AA threshold for normal
25-
text and the mark's essential shapes clear the 3:1 non-text threshold; see the W3C guidance for
26-
[text contrast](https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html) and
27-
[non-text contrast](https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html).
28-
29-
## Choosing an asset
23+
## Usage
3024

3125
| Context | Asset |
3226
|---|---|
33-
| App header, sign-in, product page | React `HephaestusLogo` or `HephMark` |
34-
| Mentor conversation | React `HephIcon` |
35-
| README | Theme-aware lockup SVGs |
36-
| Documentation navbar | Docusaurus `logo.src` and `logo.srcDark` |
27+
| In-app product lockup | `HephaestusLogo` or `HephMark` |
28+
| Mentor conversation | `HephIcon` |
29+
| README and documentation navbar | Light/dark lockup PNGs |
3730
| Browser tab | `favicon.png` |
38-
| Installed web app | 192px, 512px, and maskable PNGs declared in the manifest |
39-
| GitHub App or another external profile | `hephaestus-app-icon-1024.png` |
31+
| Installed web app | 192px, 512px, and maskable PNGs from `webapp/public/manifest.json` |
4032
| Link preview | `hephaestus-social-card.png` |
33+
| GitHub App profile | `docs/static/img/brand/github-app-icon-1024.png` |
34+
35+
The static mark remains signal blue (`#315FDC`) in both color modes. UI wordmarks use the
36+
mode-aware `brand-accent` token from `webapp/src/styles.css`; prose always spells the product name
37+
“Hephaestus.” Unlabelled React marks are decorative. Informative uses need a concise accessible name.
38+
39+
The README uses [GitHub's theme-aware picture sources](https://github.blog/changelog/2021-11-24-specify-theme-context-for-images-in-markdown/),
40+
the documentation navbar uses [Docusaurus light/dark logo sources](https://docusaurus.io/docs/api/themes/configuration),
41+
and the installed-app exports follow the manifest [icon-purpose contract](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Manifest/Reference/icons)
42+
and [maskable safe zone](https://web.dev/articles/maskable-icon).
43+
44+
## External surfaces
4145

42-
These choices follow the native surfaces rather than adding theme-detection code: GitHub supports
43-
[theme-specific README pictures](https://github.blog/changelog/2021-11-24-specify-theme-context-for-images-in-markdown/),
44-
Docusaurus supports [`favicon`, `logo.src`, and `logo.srcDark`](https://docusaurus.io/docs/api/themes/configuration),
45-
and web app manifests support icon sizes and purposes including
46-
[`maskable`](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Manifest/Reference/icons).
47-
The maskable export keeps the drawing inside the platform
48-
[safe zone](https://web.dev/articles/maskable-icon). Decorative copies use empty alternative text or
49-
are hidden from assistive technology; informative images follow the
50-
[W3C image text-alternative guidance](https://www.w3.org/WAI/tutorials/images/).
51-
Opaque app-icon exports also follow Apple's guidance to keep icons simple and recognizable and to
52-
let each platform apply its own mask; see the
53-
[Apple app-icon guidance](https://developer.apple.com/design/human-interface-guidelines/app-icons).
46+
Generated files do not update third-party accounts. After changing the static mark, a repository
47+
maintainer must upload `github-app-icon-1024.png` in the GitHub App settings.

docs/docusaurus.config.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ const envBaseUrl = process.env.DOCUSAURUS_BASE_URL;
1111
*/
1212
const baseUrl = envBaseUrl === undefined || envBaseUrl === "" ? "/" : envBaseUrl;
1313

14-
/** The site's one-sentence definition of the product, kept in step with the README's opening. */
1514
const DESCRIPTION =
1615
"Hephaestus is an open-source AI mentor for software teams. It reads the work developers already do against the practices their project cares about, and writes back feedback they can act on.";
1716

@@ -173,8 +172,8 @@ const config: Config = {
173172
navbar: {
174173
logo: {
175174
alt: "Hephaestus",
176-
src: "img/brand/hephaestus-lockup-light.svg",
177-
srcDark: "img/brand/hephaestus-lockup-dark.svg",
175+
src: "img/brand/hephaestus-lockup-light.png",
176+
srcDark: "img/brand/hephaestus-lockup-dark.png",
178177
width: 155,
179178
height: 32,
180179
},
File renamed without changes.
26.1 KB
Loading

docs/static/img/brand/hephaestus-lockup-dark.svg

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)