Skip to content

Claude/hansmartens market positioning mlt89z - #688

Merged
hansmartensdev merged 4 commits into
mainfrom
claude/hansmartens-market-positioning-mlt89z
Sep 14, 2026
Merged

hansmartensdev merged 4 commits into
mainfrom
claude/hansmartens-market-positioning-mlt89z

Conversation

@hansmartensdev

Copy link
Copy Markdown
Owner

What does this PR do?

A clear description of the change and why it was made.

Fixes # (issue number, if applicable)

Type of change

  • Bug fix
  • New feature or component
  • Documentation update
  • Refactor or code quality improvement
  • Other: ___

Checklist

  • pnpm lint passes with 0 errors
  • pnpm check passes with 0 errors
  • pnpm build completes successfully
  • I have tested this change in the browser
  • No unnecessary files are included in this PR

Screenshots (if relevant)

Add before/after screenshots for visual changes.

The wordmark beside the logo used brand-600, which falls below 4.5:1 on white
in four palettes - emerald 4.40, sky 4.45, cyan 4.27, teal 4.17. It renders at
17px bold, under the 18.66px that would let the large-text threshold of 3:1
apply, so axe reports a contrast violation and the Lighthouse accessibility
score drops below 100 for anyone using one of those four.

It was the only failing element. A sweep of nine pages across those four
palettes, mobile and desktop, returned 72 failing nodes and every one of them
was this span. The logo badge beside it passes.

brand-700 clears the threshold in every palette, the worst being teal at 6.03.
Applied in the header as well as the footer: the header wordmark clamps down
to 16px below a 345px viewport, where it stops counting as large text and
would fail the same way.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BwJB1u6U3vdEZ9LrHRebST
Removes Orange, Amber, Lime and Magenta. Emerald, Teal, Cyan, Sky, Blue,
Indigo, Violet and Purple stay, and their files are unchanged - the diff under
styles/themes/ is four deletions and nothing else.

Twelve read as more choice than it was. Cyan holds Teal's exact lightness and
chroma eighteen degrees away, Sky sits sixteen degrees from Blue, and five of
the twelve crowded into the stretch between hue 239 and 296. Amber and Lime
lose their hue at the dark end of their own scale, which is where this design
puts its surfaces: the hero gradient and the CTA band both travel to
brand-900.

Orange had no theme file of its own - it was the base scale in primitives.css,
which every theme file overrides. Deleting orange.css alone would have left an
orange fallback behind an unrecognised data-theme, so the base scale is now
Blue, matching the default BaseLayout already seeds. Nothing renders against
it in normal use.

A visitor holding a removed theme in sessionStorage is already handled: the
bootstrap validates against its allowlist before writing data-theme, so a
saved Orange falls back to the default rather than to nothing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BwJB1u6U3vdEZ9LrHRebST
The count was quoted in eleven places with nothing checking any of them - the
config, both locales, the project page, four blog posts, the README and
AGENTS.md. All now say eight, and the lists that named the palettes name the
eight that remain.

Three things the sweep turned up that were wrong before this change:

  - the getting-started post and the configuration guide both documented the
    default theme as indigo, where BaseLayout seeds blue
  - the configuration guide located the picker registry in ThemeSelector.astro,
    where it has been lib/themes.ts since the curation flag landed, and quoted
    a brand scale that had drifted from the file it claimed to show
  - the design-system post taught the token system with lime as the base brand
    colour, which it has not been

Every colour value quoted in the docs is now read from the file it names.

colour-themes.test.ts pins the set against four things that nothing compared
before: the files in styles/themes/, the import list in tokens/colors.css, the
allowlist the bootstrap validates sessionStorage against, and the registry the
pickers read. A file with no import ships nothing, an import with no registry
entry ships CSS no one can reach, and a registry entry missing from the
allowlist is a swatch that refuses to stick. It also checks the count in the
copy and that no per-theme CSS exception names a theme that is gone.

It earned its place while being written: it caught a listing of the theme
filenames buried in the README that the manual sweep had missed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BwJB1u6U3vdEZ9LrHRebST
The picker ran emerald to purple, ascending the hue wheel. It now runs the
other way, so the row opens on purple and ends on emerald.

One array in lib/themes.ts drives both the desktop dropdown and the mobile
row, so the order moves in both at once. The README and the configuration
guide list the set in that order too, and the guide's table and code block
follow.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BwJB1u6U3vdEZ9LrHRebST
@vercel

vercel Bot commented Sep 14, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
astro-rocket Ready Ready Preview Sep 14, 2026 11:09pm UTC

@hansmartensdev
hansmartensdev merged commit f6679a6 into main Sep 14, 2026
2 checks passed
@hansmartensdev
hansmartensdev deleted the claude/hansmartens-market-positioning-mlt89z branch September 14, 2026 23:13

This branch was successfully deployed

1 active deployment
Preview — 10e1de62 Deployed Sep 14, 2026 by vercel[bot]
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