From e85406e7b0180c374802aac4ac0acbb1373f7334 Mon Sep 17 00:00:00 2001 From: Ben Vinegar <2153+benvinegar@users.noreply.github.com> Date: Sun, 4 Oct 2026 16:12:52 -0400 Subject: [PATCH 1/2] feat(website): adopt new hunk logo, flat favicon, and brand guide Co-Authored-By: Claude Sonnet 5.5 --- .changeset/grumpy-crabs-beg.md | 2 + docs/brand.md | 93 +++++++++++++++++++++++ website/public/apple-icon.png | Bin 1479 -> 2301 bytes website/public/brand/logo-lockup.svg | 1 + website/public/brand/logo-mark-3d.svg | 1 + website/public/brand/logo-mark.svg | 1 + website/public/brand/logo-wordmark.svg | 1 + website/public/favicon.svg | 2 +- website/public/icon.png | Bin 5429 -> 7001 bytes website/src/components/BrandHeader.astro | 7 +- website/src/components/PageHead.astro | 1 + website/src/styles/brand.css | 3 + 12 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 .changeset/grumpy-crabs-beg.md create mode 100644 docs/brand.md create mode 100644 website/public/brand/logo-lockup.svg create mode 100644 website/public/brand/logo-mark-3d.svg create mode 100644 website/public/brand/logo-mark.svg create mode 100644 website/public/brand/logo-wordmark.svg diff --git a/.changeset/grumpy-crabs-beg.md b/.changeset/grumpy-crabs-beg.md new file mode 100644 index 000000000..a845151cc --- /dev/null +++ b/.changeset/grumpy-crabs-beg.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/docs/brand.md b/docs/brand.md new file mode 100644 index 000000000..9e70cc8c1 --- /dev/null +++ b/docs/brand.md @@ -0,0 +1,93 @@ +# Hunk brand guide + +Where Hunk's logo files live, which version to use where, and the colors and type the website is built on. Source of truth for the site look is `website/src/styles/brand.css`; this page records the intent. + +## Voice and feel + +- Terminal-first, "modern desktop diff tool in a terminal". Monospace everywhere, hard edges, paper-and-ink contrast with one green accent. +- Plain, concrete copy. Tagline: **Made for review.** Eyebrow: **Terminal diffs.** Domain: `hunk.dev`. +- The wordmark is always lowercase and monospace: `hunk`. That applies to the logo and to the header text next to the mark. Running prose, docs, and release notes keep their existing style (`Hunk` as the product name); this rule is about the logo, not copy. + +## Logo versions + +All files are in `website/public/brand/` and served at `https://hunk.dev/brand/`. They are filled with the ink color `#16140f`; recolor by editing the `fill`, or inline the SVG and use `currentColor`. + +| File | What it is | Use it for | +| ------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | +| `logo-mark.svg` | Flat "h" mark: a framed square with a stem and top-right bar. No outline. | Header, favicon, app icons, avatars, anything under ~40px. | +| `logo-mark-3d.svg` | The "h" block with its offset outline shadow. | Large placements only (about 40px and up): hero art, slides, social cards, stickers. | +| `logo-wordmark.svg` | The lowercase `hunk` letters on their own. | Next to the mark when the lockup is too heavy; text-only contexts. | +| `logo-lockup.svg` | 3D mark plus wordmark. | Open Graph images, README banner, talk title slides. | + +Other places the mark appears: + +| Path | Purpose | +| ------------------------------------------ | ----------------------------------------------------------------------- | +| `website/public/favicon.svg` | Browser tab icon. Flat mark in `#65d291` on a `#111a15` rounded square. | +| `website/public/icon.png` | 512px PNG of the favicon (fallback for browsers that skip SVG icons). | +| `website/public/apple-icon.png` | 180px apple-touch icon. | +| `website/src/components/BrandHeader.astro` | Header logo: inline flat mark (24px) plus `hunk` text. | +| `website/public/og.png` | 1200×630 social card. Not yet on the new logo. | +| `website/public/docs/favicon.svg` | Docs favicon. Not yet updated. | + +Regenerate the PNG icons after changing `favicon.svg`: + +```bash +rsvg-convert -w 512 -h 512 website/public/favicon.svg -o website/public/icon.png +rsvg-convert -w 180 -h 180 website/public/favicon.svg -o website/public/apple-icon.png +``` + +### Rules + +Clear space and minimum sizes are proposed guidance, not something the site enforces yet. + +- **Small means flat.** Below ~40px the 3D outline turns into a smudge; use `logo-mark.svg`. +- **Clear space:** keep at least the width of the stem (about 8% of the mark's width) free on every side. In the lockup, the gap between mark and wordmark is the mark's top-right bar height. +- **Minimum size:** 16px for the flat mark, 40px for the 3D mark, 48px wide for the wordmark. +- **Don't** stretch, rotate, outline, add shadows or gradients, recolor outside the palette below, or retype the wordmark in another font. The wordmark is outlined paths, not live text. +- **Don't** put the mark inside a circle. A rounded square (radius about 19%) is the only container, as in the favicon. + +## Color + +Light is the default. Dark mode is toggled with `data-theme="dark"`. Tokens live in `website/src/styles/brand.css`. + +| Role | Light | Dark | Token | +| ------------------ | --------- | --------- | -------------------- | +| Background (paper) | `#f4f1ea` | `#0c0e10` | `--hunk-bg` | +| Surface | `#fffdf8` | `#14181b` | `--hunk-paper` | +| Panel | `#e9e4d8` | `#1b1f24` | `--hunk-panel` | +| Ink | `#16140f` | `#f2f4f6` | `--hunk-ink` | +| Body text | `#3a352b` | `#c3c9cf` | `--hunk-body` | +| Muted text | `#6b6557` | `#9aa4af` | `--hunk-muted` | +| Rule | `#dcd6c8` | `#262d34` | `--hunk-rule` | +| Accent green | `#1f7a35` | `#5dd06a` | `--hunk-accent` | +| Accent soft | `#bfe9c6` | `#2c6b34` | `--hunk-accent-soft` | +| Accent ink | `#0d3a18` | `#b9f2c0` | `--hunk-accent-ink` | + +- Use the accent green sparingly: the current nav item, the highlighted word in the hero, primary controls. +- The diff colors in screenshots come from the terminal theme, not the brand palette. +- The favicon uses a darker green pair (`#111a15` / `#65d291`) that is not a site token. Align it with the table above or add it as a token if it stays. +- The logo exploration files (C51/C59) were drawn on a saturated blue (`#1F3DFF`). That blue is not part of the site palette; decide before using it anywhere. + +## Typography + +- **JetBrains Mono** (variable) for everything: headings, body, nav, code, docs. Loaded from `@fontsource-variable/jetbrains-mono` and exposed as `--hunk-font`. +- Fallback stack: `"JetBrains Mono Variable", "JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace`. +- Header logo text is 18px, weight 700, `-0.02em` letter-spacing. Check `marketing.css` and `starlight.css` for the other weights in use. +- Eyebrows (like `TERMINAL DIFFS`) are 13px, uppercase, `0.15em` letter-spacing. +- Use the font via `var(--hunk-font)`; never hard-code another family. + +## UI details that make it look like Hunk + +- Hard 1px ink borders with a solid offset shadow (`--hunk-shadow`) on cards and the install panel, not blur shadows. +- Minimal chrome: a thin top bar and a single rule under it, no redundant headers. +- Terminal screenshots sit in a window frame with three hollow dots. + +## Related branding + +- **Modem** ("Built by") uses `website/public/modem-light.svg` in the footer. Keep it at its own aspect ratio and don't merge it with the Hunk mark. +- Product name in prose: Hunk. Wordmark and logo text: `hunk`, lowercase. npm package: `hunkdiff`. Command: `hunk`. Repo: `modem-dev/hunk`. + +## Updating this guide + +When the palette, font, or logo files change, update the tables above in the same change. The site media rituals (OG image, screenshots) are in `website/MEDIA.md`. diff --git a/website/public/apple-icon.png b/website/public/apple-icon.png index 881e1de458b99e3c15a2e053dbe4090df68a943d..4846222577d74b9d844dc59bc02f80a8895a6a20 100644 GIT binary patch literal 2301 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 PKr?u{`njxgN@xNAstTMD diff --git a/website/public/brand/logo-lockup.svg b/website/public/brand/logo-lockup.svg new file mode 100644 index 000000000..408ad399b --- /dev/null +++ b/website/public/brand/logo-lockup.svg @@ -0,0 +1 @@ + diff --git a/website/public/brand/logo-mark-3d.svg b/website/public/brand/logo-mark-3d.svg new file mode 100644 index 000000000..125688745 --- /dev/null +++ b/website/public/brand/logo-mark-3d.svg @@ -0,0 +1 @@ + diff --git a/website/public/brand/logo-mark.svg b/website/public/brand/logo-mark.svg new file mode 100644 index 000000000..3bfb071e8 --- /dev/null +++ b/website/public/brand/logo-mark.svg @@ -0,0 +1 @@ + diff --git a/website/public/brand/logo-wordmark.svg b/website/public/brand/logo-wordmark.svg new file mode 100644 index 000000000..6efe7286a --- /dev/null +++ b/website/public/brand/logo-wordmark.svg @@ -0,0 +1 @@ + diff --git a/website/public/favicon.svg b/website/public/favicon.svg index 6aba517ec..5e64b53cb 100644 --- a/website/public/favicon.svg +++ b/website/public/favicon.svg @@ -1,4 +1,4 @@ - + diff --git a/website/public/icon.png b/website/public/icon.png index 492991dad0829f84b8ca81832b82a42a848dcb3b..589a79efdc144f0a011966fb0851f258ffa92764 100644 GIT binary patch literal 7001 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 literal 5429 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 - +