Skip to content

Reskin the site to Brand Guidelines v2.0 with design tokens - #159

Merged
vpetersson merged 7 commits into
sbomify:masterfrom
vpetersson-bot:feat/brand-v2-reskin
Oct 23, 2026
Merged

vpetersson merged 7 commits into
sbomify:masterfrom
vpetersson-bot:feat/brand-v2-reskin

Conversation

@vpetersson-bot

@vpetersson-bot vpetersson-bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

What

Reskins sbomify.com to the sbomify Brand Guidelines v2.0, built on a design token layer instead of hard-coded colours.

Why

The site still used the old purple-on-dark theme (purple #8A7DFF, pink/orange gradients, Inter), with colours hard-coded as hexes and one-off Tailwind names across templates, content and <style> blocks. The v2.0 guide calls for a white canvas with navy type, Mist surfaces, Signal Orange kept for emphasis, Figtree, and a system mono for code.

How

Tokens (_assets/css/tokens.css, imported via postcss-import)

  • Primitives: the published navy, mist and orange scales, plus the semantic full/tint pairs. Values outside the guide are marked derived (e.g. Navy 5, the Orange 700 hover) and only extend a published scale.
  • Roles: ink, ink-muted, canvas, surface, line, inverse, accent, accent-strong, focus, code-*, plus type (Figtree, the product's mono stack, weights, tracking, leading), radii and shadows.
  • tailwind.config.js replaces the default palette with these tokens, so classes like indigo-500 no longer exist. Opacity modifiers still work.

Components in tailwind.css: btn-primary, btn-navy, btn-secondary, btn-inverse, link, eyebrow, eyebrow-chip, tag, card, hero. These carry the guide's rules:

  • Type on orange is always white, on an Orange 700 fill (5.2:1).
  • Orange text on white is Orange 700.
  • Body copy is Navy 80 or darker.
  • Orange gets one moment per layout: the primary CTA. Section CTAs are navy.
  • Success, danger, warning and info are used for status only.

Templates and content

  • Every legacy colour class and hex is migrated to the tokens. A grep for raw hexes in layouts/ and content/ now only finds third-party brand colours (the LinkedIn blue) and code samples.
  • The animated aurora and gradient headlines are replaced by light heroes with a static orange haze, as on the guide's cover. This also removes three animated compositor layers.
  • The header uses the navy-on-white lockup. The footer, the testimonial and the blog bands are white on navy.
  • On the pricing page, the featured plan is the only navy card and holds the page's one orange CTA.

Assets

  • Inter is replaced by self-hosted Figtree Variable, still font-display: swap and preloaded.
  • New Chroma theme (native.css): Regular on navy, strings in Orange 300.
  • _d2/theme.d2 moved to brand colours, and all diagrams were regenerated.
  • Added navy variants of the logo, OSV and Dependency-Track marks for light surfaces.

CLAUDE.md documents the token system and the brand rules.

Follow-up work in this PR

Code review fixes (92c0c60)

  • The base <button> hover fill had enough specificity to override a button's own bg-* utility. It now uses :where(button:hover), with zero specificity.
  • The FAQ "Clear search" button is no longer navy text on orange.
  • The Signal Orange focus ring now covers every navy surface.
  • A bare border defaults to the line token and a bare ring to the focus token.
  • The FAQ placeholder text now meets contrast.
  • The hand-rolled buttons and links use .btn-primary and .link.
  • The header backdrop blur is gone.

UI/UX pass (117e382, 54f30ad)

  • The nav marks the current section with aria-current.
  • Cards that aren't clickable no longer lift on hover.
  • Section pages use the same centred hero and 4xl reading width as single pages.
  • Blog, tag and taxonomy grids sit on the surface background.
  • Hero CTAs are full width on mobile, and the homepage hero has two of them (Slack moves to the footer).
  • Integration logos are monochrome, and footer social icons have 40px tap targets.
  • The homepage is wider. Trust Center puts its copy beside the mock, and the CRA and Self-Host sections sit side by side.
  • Pricing shows the featured plan first below 1200px, and Enterprise reads "Custom / quote".
  • Long pages get an "On this page" table of contents: a sticky sidebar at xl and a <details> block below it, with no JS. It needs at least 5 entries and 1000 words, and pages can opt out with toc: false.
  • Blog cards show their category.
  • The footer is now three labelled columns.
  • The hero haze is smaller on phones.

Trust center (0167aa3, 9cfef5b, fab8db9)

  • The artifacts mock is now a single product panel: a header, divided document rows with mono file metadata, dot-plus-label statuses and a gated "Request access" row. It replaces the tray of floating cards.
  • /features/trust-center/ uses the wide layout. Its markup was being squeezed into the 4xl prose card.

Verification

  • bun run build:css, bun run build:d2 and hugo --minify --environment production all build cleanly. bun run lint:markdown passes.
  • axe-core colour-contrast reports 0 violations on 16 key pages and on a 44-page sample of the sitemap. I re-ran it after each follow-up commit on the pages that commit touched.
  • Checked visually at 1440px and 390px: home, pricing, integrations, trust center, about, blog, a post, FAQ, case studies, compliance, author and 404.

Not in this PR

  • Raster social and OG images and blog cover art still use the old palette.
  • assets/images/d2/tea-architecture.svg has no D2 source and isn't referenced anywhere, so I left it alone.
  • package-lock.json is stale (CI and Docker use bun) and still lists Inter. I didn't touch it because npm is not the package manager here.

🤖 Generated with Claude Code

vpetersson-bot and others added 7 commits October 23, 2026 18:18
Move the marketing site off the purple-on-dark theme and onto the v2.0
brand: white canvas with navy type, Mist surfaces, and Signal Orange kept
to one moment per layout.

- Add _assets/css/tokens.css: the published palette as primitives
  (navy scale, mist, orange scale, semantic full/tint pairs) plus role
  tokens (ink, canvas, surface, line, inverse, accent, focus, code),
  typography (Figtree, the product's mono stack, weights, tracking,
  leading), radii and shadows. Imported via postcss-import.
- tailwind.config.js now replaces the default palette with the tokens,
  so off-brand classes cannot creep back. Legacy purple/primary*/gray-*
  classes across layouts and content are migrated to the role tokens,
  and hard-coded hexes in templates and <style> blocks are gone.
- Shared components (btn-primary/-navy/-secondary/-inverse, link,
  eyebrow, eyebrow-chip, tag, card, hero) carry the brand rules: white
  type on Orange 700 fills, orange text on white in Orange 700, body
  copy Navy 80 or darker, status colours for status only.
- Swap Inter for self-hosted Figtree Variable; code uses the
  ui-monospace / SF Mono stack at ~90%.
- Light page heroes with a static orange haze replace the animated
  aurora and gradient headline text. Header is the navy-on-white
  lockup; footer and select bands stay white on navy.
- Pricing page restyled light, with the featured plan as the single
  navy card and the page's one orange CTA.
- Chroma code theme: Regular on navy, strings in Orange 300.
- D2 theme moved to brand colours and all diagrams regenerated.
- Navy variants of the logo, OSV and Dependency-Track marks for light
  surfaces.
- Document the token system and brand rules in CLAUDE.md.

axe colour-contrast reports zero violations on 16 key pages plus a
44-page sample of the sitemap.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
- The base <button> hover fill now has zero specificity
  (:where(button:hover)), so a button's own bg-* utility still wins.
  Before this, hovering the footer "Cookie settings" or the FAQ
  "Show more" button painted it orange.
- FAQ "Clear search" unwinds the base button fill instead of showing
  navy text on orange.
- The inverse focus ring (Signal Orange) now also applies on the
  cookie banner, the featured pricing card and .cta-box, where Orange
  700 is below 3:1 against navy.
- A bare `border` / `divide-*` defaults to the line token again, and
  a bare `ring` to the focus token. Replacing the palette had left them
  on currentColor and Tailwind's blue.
- FAQ search placeholder moves from Navy 40 (2.4:1) to ink-subtle.
- Hand-rolled orange CTAs use .btn-primary (new .btn-lg size) and the
  14 pasted link recipes on the integrations page use .link.
- The trust-center inline link stops using the info colour as
  decoration.
- Drop the header backdrop-blur (a per-scroll re-composite over a white
  page), no-op hovers and blur on the author social links, and the
  unused .btn-inverse.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
- Show where you are: the desktop and mobile nav mark the current
  section with aria-current="page" and a filled pill (blog posts count
  as Blog, since they live under /YYYY/MM/DD/).
- Stop non-clickable cards from behaving like links. Homepage section
  cards, feature/impact/artifact cards and the trust-center mock lifted,
  scaled or grew a shadow on hover, which signals "click me" on
  elements that do nothing. Hover feedback stays on real links and
  buttons.
- Section pages (_default/list.html: guides, compliance,
  sbomify-action, features) use the same centred hero and 4xl reading
  measure as single pages. They ran at 7xl, about 130 characters a
  line on desktop for long-form prose.
- Blog, tag and taxonomy grids sit on the surface background, so the
  hero ends visibly instead of trailing into ~190px of blank canvas.
- Homepage hero CTAs stack full-width on mobile instead of three
  ragged pill widths, using btn-primary/btn-secondary at btn-lg.
- Integration marks render monochrome like the press row and take
  colour on hover, so the row no longer mixes pink, red and green
  third-party colours next to the brand.
- Footer social icons get 40px hit areas (were 20px).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
- Homepage hero has two calls to action (Get Started Free, Contact Us).
  Slack moves to the footer's Company column.
- Homepage rhythm: sections widen to 6xl with prose held to a 3xl
  measure. Trust Center puts its copy beside the artifact mock, and
  the two text-only sections (CRA, Self-Host or Cloud) sit side by
  side instead of stacking as five near-identical cards.
- Pricing: below 1200px the featured Business plan comes first, and
  Enterprise reads "Custom / quote" on one line.
- Long-form pages get an "On this page" table of contents (h2/h3 from
  Hugo's TableOfContents): a sticky sidebar at xl and a collapsible
  <details> block below it, no JavaScript. It shows when a page has
  at least 5 entries and 1000 words (79 pages today). Opt out with
  `toc: false`.
- Blog cards show their category as an eyebrow above the title.
- Footer becomes brand plus three labelled columns (Product, Resources,
  Company), with legal and social on one bottom row.
- The hero's orange haze shrinks to a corner glow below the sm
  breakpoint.
- .eyebrow-chip is w-fit so it does not stretch inside flex columns.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
Replace the grey tray of three floating cards with a single product
panel that reads like a real trust center:

- Header with the organisation, its mono domain and a Public status.
- Divided document rows: icon, title, mono version/file metadata, and a
  status on the right (dot plus label, the semantic pairing from the
  brand guide), with "Request access" on the gated pentest report to
  show access control.
- A navy footer strip showing the same documents over the Transparency
  Exchange API, set as code (Regular on navy, strings in Orange 300).
- Drop the decorative orange blur blob.

The code-* role tokens are now exposed to Tailwind (bg-code-bg,
text-code-text, text-code-string, text-code-muted). The mock is marked
aria-hidden since the surrounding copy carries the meaning.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
The strip showed an invented endpoint (/tea/v1/products); TEA discovery
starts at /.well-known/tea, so it was both decorative and wrong. Without
it the panel is narrower on phones, so the homepage cards use p-6 below
sm, the CI status reads "Synced" and "Request access" shortens to
"Request" on small screens to keep titles from truncating.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
The page rendered through _default/single.html, which wraps content in
a 4xl prose card. Its markup (three-up feature cards, two-column
sections, the artifacts panel) was written for full width, so cards
wrapped about one word per line and the panel was squeezed into a
narrow column. It now uses the same wide layout as the Integrations
page. The "Built on Open Principles" block and the cta-ready card become
white cards so they no longer disappear into the grey surface.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
@vpetersson
vpetersson merged commit e466c4d into sbomify:master Oct 23, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants