Skip to content

Fix Account dropdown trigger contrast in dark mode#7088

Draft
talissoncosta wants to merge 8 commits intomainfrom
fix/account-dropdown-contrast-6902
Draft

Fix Account dropdown trigger contrast in dark mode#7088
talissoncosta wants to merge 8 commits intomainfrom
fix/account-dropdown-contrast-6902

Conversation

@talissoncosta
Copy link
Copy Markdown
Contributor

  • I have read the Contributing Guide.
  • I have added information to docs/ if required so people know about the feature.
  • I have filled in the "Changes" section below.
  • I have filled in the "How did you test this code" section below.

Changes

Closes #6902

Replace btn btn-link with scoped .account-dropdown-trigger styles using semantic design tokens:

  • Uses --color-text-default for theme-aware text colour (dark in light mode, white in dark mode)
  • Purple hover state (--color-text-action) on label text only, not the icon
  • Removes dependency on Bootstrap button classes that forced low-contrast brand purple

How did you test this code?

Manually verified in both light and dark mode:

  • "Account" text is readable against the navbar background in both themes
  • Hover state turns only the "Account" label purple, icon remains unchanged
  • Button behaviour (click to open dropdown) unchanged

🤖 Generated with Claude Code

talissoncosta and others added 8 commits March 30, 2026 15:47
Single source of truth: common/theme/tokens.json defines all 109
design tokens (41 colour + 68 non-colour) with values, dark mode
overrides, and usage descriptions.

Codegen script (scripts/generate-tokens.mjs) generates:
- common/theme/tokens.ts — TypeScript exports
- web/styles/_tokens.scss — CSS custom properties (:root + .dark)
- documentation/TokenReference.generated.stories.tsx — flat JSX for MCP

Token categories:
- Colour: surface, text, border, icon (with light/dark variants)
- Spacing: Tailwind naming convention (--space-1 = 4px, --space-4 = 16px)
- Border radius: none through full (8 values)
- Typography: headings h1-h6, body, caption, label, font weights
- Elevation: 4 shadow levels with dark mode overrides
- Motion: 3 durations + 3 easing curves

Primitive colour palette (_primitives.scss) provides 7 families
(slate, purple, red, green, gold, blue, orange) with 50-950 scales.

lint-staged auto-runs codegen when tokens.json is committed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Set up Storybook 10 with webpack5, SWC compiler, and a11y addon.
Chromatic CI workflow captures visual regression on every PR.
Storybook UI respects OS colour scheme preference (light/dark).
Chromatic modes capture every component story in both themes.

Components with stories:
- Banner — 4 variants (success, warning, danger, info) with CTA
- Button — 7 themes, 4 sizes, disabled states, icon variants
- Switch — on, off, disabled, controlled
- Skeleton — text, badge, circle variants
- SettingRow — pattern component using React 19 useId()
- Icons — categorised searchable catalogue of all 61 icons

New components:
- Banner — variant-driven alert with semantic colour tokens
- SettingRow — accessible settings toggle with ARIA labels
- Skeleton — loading placeholder with reduced motion support
- RequireFeatureOwnershipSetting — project setting (#4432)

Shared Storybook utilities:
- DocPage, ScaleRow, Swatch, TokenGroup helper components
- docs.scss dogfooding 79 token references (spacing, colour, font,
  radius, motion)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Visual stories for each token category:
- Palette — primitive colour scales (auto-generated from _primitives.scss)
- Semantic Colour Tokens — runtime CSS var reading with theme toggle
- Tag & Project Colours — categorical swatches
- Spacing, Border Radius, Elevation, Motion — import from tokens.ts

Token Reference (MCP) — auto-generated flat JSX with all 109 tokens
inlined for Storybook MCP consumption by AI agents.

All documentation stories have Chromatic snapshots disabled.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Introduction — welcome page with getting started guide
- Decision Framework — where does a new colour go? + how to create
  a semantic token (HTML tables for MDX3 compat)
- Token Maintenance — codegen workflow, adding/modifying/removing tokens
- Typography — token reference for --font-* tokens (audit findings
  moved to Notion/Slides, issue #7077 for future components)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add _token-utilities.scss with utility classes consuming the design
tokens for colours, borders, icons, radius, shadows, font weights, and
transitions. These fill the gap Bootstrap doesn't cover — semantic
surface colours, icon colours, border radius tokens, etc.

Remove spacing tokens entirely — Bootstrap handles spacing via its
existing utility classes. This avoids two competing sources of truth
for the same concern.

- Create web/styles/_token-utilities.scss (no !important, no spacing)
- Remove space key from tokens.json
- Update generate-tokens.mjs to skip spacing generation
- Delete SpacingTokens.stories.tsx
- Regenerate _tokens.scss, tokens.ts, and MCP reference story
- Update TokenMaintenance.mdx and docs.scss

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add utility class generation to the codegen pipeline. When tokens.json
changes, the pre-commit hook now generates _token-utilities.scss
alongside _tokens.scss, tokens.ts, and the MCP reference story.

Adding a new token to tokens.json automatically creates its utility
class — no manual SCSS to write.

- Add generateUtilities() to generate-tokens.mjs
- Update lint-staged to auto-stage _token-utilities.scss
- Update TokenMaintenance.mdx to document the 4-file pipeline

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The text-on-fill token was the only token that described a surface
context rather than a semantic role, breaking the consistent
{category}-{role} naming pattern. It also had no dark mode variant
(always #ffffff), unlike other semantic tokens.

Removed from tokens.json, _tokens.scss, _token-utilities.scss,
tokens.ts, and all documentation references.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace btn btn-link with scoped styles using semantic design tokens.
The trigger now uses --color-text-default for proper theme-aware
contrast and --color-text-action (purple) on hover for the label only.

Closes #6902

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown

vercel bot commented Mar 31, 2026

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

Project Deployment Actions Updated (UTC)
flagsmith-frontend-preview Ready Ready Preview, Comment Mar 31, 2026 10:48pm
flagsmith-frontend-staging Ready Ready Preview, Comment Mar 31, 2026 10:48pm
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
docs Ignored Ignored Mar 31, 2026 10:48pm

Request Review

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

front-end Issue related to the React Front End Dashboard

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fix Account dropdown trigger contrast in dark mode

1 participant