Skip to content

feat(design-tokens): rebrand Flow after the mittwald brand guide - #3398

Closed
mfal wants to merge 10 commits into
nextfrom
claude/flow-components-rebrand
Closed

mfal wants to merge 10 commits into
nextfrom
claude/flow-components-rebrand

Conversation

@mfal

@mfal mfal commented Oct 6, 2026

Copy link
Copy Markdown
Member

Warning

No-brainer first pass. Nobody from UX or design was involved. This may miss what UX and design want entirely — sorry for that. Treat it as a conversation starter, not a proposal to merge as is.

Flow's tokens and components follow the mittwald brand guide. Brand values win unless they break WCAG AA; where they do, the nearest compliant value is used and named below. Split out of #3284, which keeps the Styleguide (flow.mittwald.de) part and builds on this one.

Colors

  • New color.mittwald-blue scale replaces hosting-blue as primary and info. Brand #2D23E8 sits at 800; the brand tones #B3B4F3 / #8D8BF0 (light) and #171842 / #1D1B6B (dark) are anchors, the steps between are interpolated in OKLab.
  • Dark 800 is #AAAAF3, not #2D23E8: on dark ground #2D23E8 reaches 2.2:1, so links and the focus ring would fail. Dark solid buttons are light blue with dark text, as before.
  • New color.brand.*: the guide's values per theme, unchanged. Body text uses text-primary (64 % black / white), headings text-highlight.
  • Neutral: light gray 300 → #EBEFF3, 1100 → #1D1E1F; dark gray 100 → #141516 (also the dark backdrop of Storybook and the visual tests).
  • AccentBox blue / navy / green / lilac use brand 100 surfaces (color.brand-surface). Three deviate so text and links keep 4.5:1: light blue lifted 10 % towards white, dark green / lilac moved 22 / 24 % towards neutral base.
  • The current menu item (Navigation, ContextMenu) uses text-highlight: with text-primary it would reach 3.26:1 in dark.
  • Categorical chart colors stay: the brand secondaries fall below 3:1 on white.

Imagery

  • color.gradient becomes the brand Simple Gradient in light, measured from the brand guide's reference (9eafc.webp, Bildwelt › mittwald Gradient): linear, #D48E75 → #986C97. In dark it is an Abstract Gradient (brand glows on a dark ground). background-gradient becomes flat neutral base.
  • New grain.* tokens carry the brand's film grain, on AccentBox's gradient only. The noise is black or white per pixel, its alpha the distance from the middle; in normal blending that adds grey grain without shifting the gradient's colour or mean. Matched to the reference at 1x (luma noise / chroma-luma / autocorrelation at 1 px): 5.03 / 0.15 / 0.20 vs. 5.17 / 0.07 / 0.22, then one step finer: baseFrequency 0.8, grain about two thirds of a CSS pixel. The grain sits below the content, so text contrast is unchanged. It is hidden under prefers-contrast: more and forced-colors: active, and ships as a data: image: a CSP blocking data: images only drops the grain.

Typography and shapes

  • New font-family.body|heading|code, font-weight.semibold. Headings: Proxima Nova Semibold, falling back to Inter.
  • Buttons are pills (corner-radius.pill); NumberField steppers keep the form-control radius. LayoutCard, Modal and AccentBox use the new corner-radius.xl (24 px).

All existing tokens stay, hosting-blue included. No API changes.

Open questions for UX / design

  • Base tokens are design authority. They changed here at the product side's request; the interpolated blue steps and the three adjusted brand surfaces need a design sign-off.
  • Proxima Nova is not on cdn.mittwald.de (404) and its licence for this use is unclear. Until it is hosted, headings render in Inter everywhere.
  • Body text at 64 % is the brand rule and passes AA (6.7:1 on white, 7.9:1 on dark ground), but it is visibly lighter than before across all of mStudio.
  • Icons: the brand uses Font Awesome Sharp; switching touches the whole icon pipeline and is not part of this PR.
  • Colored words on the gradient. The Color docs recommend highlighting words in AccentBox headings with Color. On the brand gradient, violet reaches only 1.09–1.76:1 (2.9:1 on the former pastel). Brand primary text (64 %) reaches 3.28:1 at the darkest stop; AccentBox's default dark (100 %) 4.93:1. Either the gradient, the guidance or the example has to give.

Checks

  • Token contrast audit over every declared content / background pair, both themes, before vs. after: no new failures. The raw pair text-primary on dark neutral.400 is below 4.5:1; its only text consumer (current menu item) now uses text-highlight.
  • axe color-contrast on all 114 default stories in light and dark (1,164 text nodes): one finding, the CodeEditor's dark active line (4.42:1), unchanged by this PR.
  • Checked by hand in Storybook, light and dark.
  • The visual baselines are the ones update-screenshots produced on docs: rebrand the Styleguide after the mittwald brand guide #3284; nothing outside packages/ changed there that renders in the suite.

🤖 Generated with Claude Code

@mfal mfal added the run-visual-tests Runs the full visual regression suite against the existing baselines and fails the check on mismatch label Oct 6, 2026
@mfal mfal self-assigned this Oct 6, 2026
@mfal mfal added the run-visual-tests Runs the full visual regression suite against the existing baselines and fails the check on mismatch label Oct 6, 2026
@github-actions github-actions Bot removed the run-visual-tests Runs the full visual regression suite against the existing baselines and fails the check on mismatch label Oct 6, 2026
@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

🚀 Preview Deployment

Preview environments are ready:

Type URL
docs pr-3398.docs.review.flow-components.de
storybook pr-3398.storybook.review.flow-components.de

Images:

  • docs: ghcr.io/mittwald/flow/docs:pr-3398
  • storybook: ghcr.io/mittwald/flow/storybook:pr-3398

@github-actions

github-actions Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

❌ Visual Regression Tests Failed

At least one shard did not pass. If snapshots differ from the committed baselines, download the visual-diffs-* artifacts from this run to inspect the actual/diff images (a shard that failed before comparison, e.g. during install or browser setup, leaves none).

If the differences are intentional, update the baselines by adding the update-screenshots label to the PR.

Run details

No-brainer first pass, without UX or design: it may miss what they want
entirely. The base tokens changed at the product side's request and
need a design sign-off.

- The mittwald rebranding in the design tokens: brand palette, neutral
  ground, text colours (primary 64 %, highlight), radii, headings.
- Simple Gradient (light) taken from the brand guide's reference
  (branding.mittwald.de/assets/figma/9eafc.webp): linear, #D48E75 to
  #986C97, instead of a pastel stand-in.
- Film grain as a token, on AccentBox's gradient only. Black/white noise
  with alpha as the distance from the middle, in normal blending, adds
  grey grain without shifting the gradient's colour or mean. Matched to
  the reference at 1x (luma noise 5.03 vs 5.17, chroma/luma 0.15 vs
  0.07), then one step finer: baseFrequency 0.8, grain about two thirds
  of a CSS pixel.
- Text on the new gradient: AccentBox's default `dark` reaches 4.93:1 at
  the darkest stop; brand primary (64 %) 3.28:1 and Color violet
  1.09-1.76:1 do not (violet was 2.9:1 on the pastel).

Visual baselines are regenerated with `update-screenshots`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mfal added a commit that referenced this pull request Oct 7, 2026
No-brainer first pass, without UX or design. Builds on the token and
component rebranding (#3398).

- Homepage in the mittwald.de look, composed of Flow components
  (AccentBox, ColumnLayout, Section, Heading, Text, Link, Image, Color).
  The stylesheet keeps only what has no prop: the brand headline scale,
  the hero's height and glow, the teasers overlapping the hero, and the
  fades under copy on images.
- Every page opens with a dark stage (PageStage) carrying its section's
  visual; brand neutral ground, rounder frame cards, brand heading
  scale in MDX, dark footer. Body text inherits the brand primary.
- Visuals from the brand's Lightnodes share, chosen per section by
  concept (Components 121, "Warum Flow" 073, Developer Portal 103,
  Releases 086, Get Started 059 mirrored so the door shows in the
  stage), re-encoded as WebP. Grain only on CSS gradients.
- Contrast, measured against the pixels under each text element in both
  themes at 1440 and 390px: a shade behind the hero copy keeps the
  horizon's light from its links and lead (was 3.6:1), the release tile's
  body text is white on #5D4ABF (64 % reached 3.6:1), the extensions
  tile's text follows the theme, since its brand tokens turn dark in dark
  mode. Remaining hits are older code-syntax colours.
- Stages and the portal band fade the visual's left edge, which ends
  inside the box; bright edges showed as a hard seam before.
- Teasers: the hero's lower edge cuts them at the golden section
  (38.2 % on the hero). The release tile is shifted as a whole in
  OKLab from its violet to soft-contrast violet 800 (#5D4ABF), WebP
  instead of a 1.3 MB PNG; the extensions tile runs from brand navy 100
  to brand orange 100, sky into the hero's horizon glow.
- Developer Experience: from 1200px the self-composing example sits
  beside the copy with preview and code stacked; below it spans the
  width and puts its panes side by side from 850px of card width. The
  preview reserves 312px from 550px of card width (tallest example:
  310px); the IllustratedMessage centers across the pane.

Reviewed in Chromium at 1920, 1280, 1024, 768 and 390 px, light and
dark: no horizontal scroll, no console errors.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@mfal
mfal force-pushed the claude/flow-components-rebrand branch from f94c53b to a0f20b1 Compare October 7, 2026 09:13
@mfal mfal added the run-visual-tests Runs the full visual regression suite against the existing baselines and fails the check on mismatch label Oct 7, 2026
@github-actions github-actions Bot removed the run-visual-tests Runs the full visual regression suite against the existing baselines and fails the check on mismatch label Oct 7, 2026
@mfal mfal added the update-screenshots Label a PR to update the screenshots used for visual regression testing label Oct 7, 2026
@github-actions github-actions Bot removed the update-screenshots Label a PR to update the screenshots used for visual regression testing label Oct 7, 2026
github-actions Bot and others added 2 commits October 7, 2026 09:31
Co-authored-by: mfal <4696750+mfal@users.noreply.github.com>
@mfal mfal added the update-screenshots Label a PR to update the screenshots used for visual regression testing label Oct 12, 2026
@github-actions github-actions Bot removed the update-screenshots Label a PR to update the screenshots used for visual regression testing label Oct 12, 2026
github-actions Bot and others added 2 commits October 12, 2026 07:21
Co-authored-by: mfal <4696750+mfal@users.noreply.github.com>
…onents-rebrand

# Conflicts:
#	packages/remote-react-components/src/tests/visual/__screenshots__/SkeletonModeText.browser.test.tsx/SkeletonMode-text-firefox-linux.png
#	packages/remote-react-components/src/tests/visual/__screenshots__/SkeletonModeText.browser.test.tsx/SkeletonMode-text-webkit-linux.png
#	packages/remote-react-components/src/tests/visual/__screenshots__/SkeletonModeVisual.browser.test.tsx/SkeletonMode-visual-webkit-linux.png
@mfal mfal added the update-screenshots Label a PR to update the screenshots used for visual regression testing label Oct 12, 2026
@github-actions github-actions Bot removed the update-screenshots Label a PR to update the screenshots used for visual regression testing label Oct 12, 2026
github-actions Bot and others added 2 commits October 12, 2026 07:40
Co-authored-by: mfal <4696750+mfal@users.noreply.github.com>
…onents-rebrand

# Conflicts:
#	packages/remote-react-components/src/tests/visual/__screenshots__/Modal.browser.test.tsx/Modal-confirmOnClose-confirmation-opened-firefox-linux.png
#	packages/remote-react-components/src/tests/visual/__screenshots__/Modal.browser.test.tsx/Modal-confirmOnClose-confirmation-opened-webkit-linux.png
@mfal mfal added the update-screenshots Label a PR to update the screenshots used for visual regression testing label Oct 12, 2026
@github-actions github-actions Bot removed the update-screenshots Label a PR to update the screenshots used for visual regression testing label Oct 12, 2026
github-actions Bot and others added 2 commits October 12, 2026 08:15
Co-authored-by: mfal <4696750+mfal@users.noreply.github.com>
…onents-rebrand

# Conflicts:
#	packages/remote-react-components/src/tests/visual/__screenshots__/NumberField.browser.test.tsx/NumberField-states-firefox-linux.png
#	packages/remote-react-components/src/tests/visual/__screenshots__/NumberField.browser.test.tsx/NumberField-states-webkit-linux.png
@mfal mfal added the update-screenshots Label a PR to update the screenshots used for visual regression testing label Oct 12, 2026
@github-actions github-actions Bot removed the update-screenshots Label a PR to update the screenshots used for visual regression testing label Oct 12, 2026
Co-authored-by: mfal <4696750+mfal@users.noreply.github.com>
@mfal mfal closed this Oct 13, 2026
mfal added a commit that referenced this pull request Oct 13, 2026
No-brainer first pass, without UX or design. Builds on main's tokens:
the token rebranding it used to stack on (#3398) is closed, and the
brand palette is coming in #3459.

- Homepage in the mittwald.de look, composed of Flow components
  (AccentBox, ColumnLayout, Section, Heading, Text, Link, Image, Color).
  The stylesheet keeps only what has no prop: the brand headline scale,
  the hero's height and glow, the teasers overlapping the hero, and the
  fades under copy on images.
- Every page opens with a dark stage (PageStage) carrying its section's
  visual; brand neutral ground, rounder frame cards, brand heading
  scale in MDX, dark footer.
- Visuals from the brand's Lightnodes share, chosen per section by
  concept (Components 121, "Warum Flow" 073, Developer Portal 103,
  Releases 086, Get Started 059 mirrored so the door shows in the
  stage), re-encoded as WebP.
- Tokens: grain comes from `--texture--grain` (#3493), only on CSS
  gradients. The brand colors that follow the theme (neutral base, text
  highlight, navy 100, orange 100) are `--styleguide--*` properties set
  per theme in `_lib/brand.scss`, until Flow's tokens carry them. The
  tile radius is `--size-px--l` (24px). The page ground is flat neutral
  base, so the layout drops main's gradient background.
- Contrast: a shade behind the hero copy keeps the horizon's light from
  its links and lead (was 3.6:1); the release tile's body text is white
  on #5D4ABF; the extensions tile's text follows the theme.
- Stages and the portal band fade the visual's left edge, which ends
  inside the box; bright edges showed as a hard seam before.
- Teasers: the hero's lower edge cuts them at the golden section
  (38.2 % on the hero). The release tile is shifted as a whole in
  OKLab from its violet to soft-contrast violet 800 (#5D4ABF), WebP
  instead of a 1.3 MB PNG; the extensions tile runs from brand navy 100
  to brand orange 100, sky into the hero's horizon glow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

1 participant