Skip to content

feat(style): rebrand overrides for light, dark and black themes - #3545

Open
Mordech wants to merge 8 commits into
masterfrom
rebrand-theme
Open

Mordech wants to merge 8 commits into
masterfrom
rebrand-theme

Conversation

@Mordech

@Mordech Mordech commented Oct 25, 2026 •

Copy link
Copy Markdown
Member

Summary

Rebrand overrides (black logo, blue CTA) for the existing light, dark and black themes. This isn't a new theme: each block applies only when <body> also has rebrand-theme, which the monolith sets behind design_facelift.

body.light-app-theme.rebrand-theme { … }
body.dark-app-theme.rebrand-theme  { … }
body.black-app-theme.rebrand-theme { … }
  • Values: copied from mf-topbar/src/styles/themes/facelift.css (base block + [data-facelift-logo=black] layer), limited to tokens that exist in Vibe. Primary/brand: light #424ef9 with white text; dark #6a86ff / black #82a3ff with #201e24 text.
  • Interactions (M3 state-layer logic): neutral hover = text color at 8%, selected 8%, selected-hover 15%; fill hovers = color-mix(in srgb, var(--text-color-on-primary) 8%, <fill>); brand selected = #424ef9 at 10% / 19%. On-secondary variants follow their base tokens.
  • AA: every text color (text, placeholder, link, primary/positive/negative as text) is at least 4.5:1 on every background token, and every fill and its hover is at least 4.5:1 for its text, in light, dark and black.
  • New tokens: --surface-primary|positive|negative|warning|neutral (color-mix(<color> 8%, var(--primary-background-color))) and --border-radius-full: 9999px. They're defined in the stock light/dark/black/hacker themes (and :root for the radius), and the overrides restate them with rebrand colours. Radius in the overrides: 6 / 8 / 12 / full 9999px.
  • Title font: --title-font-family: "monday Saans", Figtree, Roboto, Noto Sans Hebrew, Noto Kufi Arabic, Noto Sans JP, sans-serif in all three blocks. Body text stays Figtree. The monolith declares --title-font-family on body#main.global-brand-font (an ID selector) which outranks this override, so DaPulse/dapulse#116378 restates it for .rebrand-theme and self-hosts the @font-face.
  • Prompt box radius: --border-radius-prompt-box: 12px on :root (border-radius.scss) and in the overrides, so consumers can migrate to the token before the flag; consumers use var(--border-radius-prompt-box, 12px).
  • generate-colors.ts skips .rebrand-theme rules. Their selectors contain the stock theme classes, so without this tokens.json would publish the override values as stock.

Not included

  • Hacker theme, fonts (DM Sans), mf-topbar-only tokens (--pulse-*, --facelift-*, --icon-hover).
  • default-app-theme or a body with no theme class gets no override.

Notes

  • --color-highlight_blue points at var(--primary-highlighted-color). mf-topbar routes it through --primary-highlight-color, which isn't a Vibe token; the resolved value is the same.
  • Counter's negative badge uses --fixed-light-color (white), which is fixed, so it stays below 4.5:1 on the lighter dark/black negative.

Verification

  • sass src/index.scss compiles. stylelint passes. generate-colors leaves tokens.json unchanged.

Consumed by DaPulse/dapulse#116378.

🤖 Generated with Claude Code

@Mordech
Mordech requested a review from a team as a code owner October 25, 2026 08:22
@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

PR Summary by Qodo

Add opt-in rebrand overrides for light, dark, and black themes

✨ Enhancement ⚙️ Configuration changes 🕐 20-40 Minutes

Grey Divider

AI Description

• Add facelift colors, interaction states, and title typography to three existing themes behind
 rebrand-theme.
• Define semantic surface and radius tokens for stock themes and migrating consumers.
• Exclude opt-in overrides from generated stock-theme colors to prevent token contamination.
Diagram

graph TD
  Flag{"Facelift enabled?"} --> Body["Body classes"] --> Stock["Stock theme tokens"] --> Override["Rebrand overrides"] --> UI["Vibe consumers"]
  Stock --> Generator["Color generator"]
  Override -.->|excluded| Generator
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Register separate facelift themes
  • ➕ Would make the facelift variants explicit in theme selection and token generation.
  • ➖ Would require changes to theme switching and duplicate existing theme behavior instead of using the monolith's opt-in class.

Recommendation: Keep the scoped overrides: they fit the existing theme classes and the monolith's feature flag without introducing a new theme identity. Separately registered themes would add integration work for little benefit here; verify contrast and hover states in rendered components because this PR adds no automated tests.

Files changed (9) +289 / -2

Enhancement (6) +271 / -0
border-radius.scssDefine full and prompt-box radius tokens +2/-0

Define full and prompt-box radius tokens

• Adds globally available '--border-radius-full' and '--border-radius-prompt-box' tokens so consumers can adopt them independently of the facelift flag.

packages/style/src/border-radius.scss

black-theme.scssAdd semantic surface tokens to the stock black theme +6/-0

Add semantic surface tokens to the stock black theme

• Defines five semantic surfaces as 8% color mixes over the black theme's primary background.

packages/style/src/themes/black-theme.scss

dark-theme.scssAdd semantic surface tokens to the stock dark theme +6/-0

Add semantic surface tokens to the stock dark theme

• Defines five semantic surfaces using the dark theme's existing semantic colors and primary background.

packages/style/src/themes/dark-theme.scss

hacker-theme.scssAdd semantic surface tokens to the stock hacker theme +6/-0

Add semantic surface tokens to the stock hacker theme

• Makes the five new semantic surface tokens available in hacker mode without adding rebrand overrides to that theme.

packages/style/src/themes/hacker-theme.scss

light-theme.scssAdd semantic surface tokens to the stock light theme +6/-0

Add semantic surface tokens to the stock light theme

• Defines five semantic surfaces from existing light-theme colors, making the tokens usable before rebrand opt-in.

packages/style/src/themes/light-theme.scss

rebrand-theme.scssDefine opt-in facelift values for three themes +245/-0

Define opt-in facelift values for three themes

• Adds body-scoped light, dark, and black overrides for brand and semantic colors, backgrounds, interaction states, title typography, semantic surfaces, and radii. The rules apply only alongside an existing theme class and '.rebrand-theme'; hacker and unthemed bodies receive no override.

packages/style/src/themes/rebrand-theme.scss

Bug fix (1) +8 / -0
generate-colors.tsExclude opt-in rules from stock color generation +8/-0

Exclude opt-in rules from stock color generation

• Skips selectors containing '.rebrand-theme' before collecting theme variables. This prevents their stock-theme class names from causing rebrand colors to appear in generated stock entries.

packages/style/scripts/generate-colors.ts

Other (2) +10 / -2
index.scssInclude rebrand overrides in the theme stylesheet +1/-0

Include rebrand overrides in the theme stylesheet

• Imports the opt-in overrides after the stock themes so they are included in the style package's compiled CSS.

packages/style/src/themes/index.scss

props-to-allowed-vars.jsRecognize new radius tokens in stylelint guidance +9/-2

Recognize new radius tokens in stylelint guidance

• Allows the full and prompt-box radius variables for border-radius properties and adds the existing 12px token to recommended replacements.

packages/style/stylelint-config/rules/use-defined-css-var-when-available/props-to-allowed-vars.js

@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Code Review by Qodo

🐞 Bugs (6) 📘 Rule violations (0) 📜 Skill insights (0)

Grey Divider


Action required

1. Some light pages never receive the rebrand 🐞 Bug ≡ Correctness
Description
body.light-app-theme.rebrand-theme is the only light override selector, so it does not match a
body using the supported default-app-theme alias or a body with no theme class. Both still receive
stock light variables from :root or .default-app-theme when rebrand-theme is enabled.
Code

packages/style/src/themes/rebrand-theme.scss[7]

+body.light-app-theme.rebrand-theme {
Evidence
The stock light rule explicitly supports the root and default alias, whereas every new rebrand block
requires a themed body.

packages/style/src/themes/light-theme.scss[1-4]
packages/style/src/themes/rebrand-theme.scss[7-8]
packages/style/src/themes/rebrand-theme.scss[62-62]
packages/style/src/themes/rebrand-theme.scss[117-117]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The rebrand light override misses bodies using `default-app-theme` or no theme class.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[7-7]
- packages/style/src/themes/light-theme.scss[1-4]
## Recommended Fix
Add rebrand selectors for the default light alias and for a rebranded body without a theme class, preserving the existing light override values.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Status buttons have unreadable white text ✓ Resolved
Description
--positive-color and its hover value become light greens in the dark and black rebrands, while
negative hover values also become lighter reds without changing --text-color-on-primary from
white. Primary status buttons use those colors as backgrounds with white text, and positive alert
banners use the same pairing; several combinations fall below 4.5:1 contrast.
Code

packages/style/src/themes/rebrand-theme.scss[R63-66]

+  --positive-color: #2aad52;
+  --positive-color-hover: #35c060;
+  --negative-color: #e8003a;
+  --negative-color-hover: #f52050;
Evidence
The button stylesheet pairs --text-color-on-primary with positive and negative background tokens,
including their hover states. Alert banners also pair positive and negative backgrounds with
on-primary text.

packages/style/src/themes/rebrand-theme.scss[63-69]
packages/style/src/themes/rebrand-theme.scss[118-124]
packages/components/button/src/Button/Button.module.scss[130-171]
packages/components/alert-banner/src/AlertBanner/AlertBanner.tsx[63-75]
packages/components/alert-banner/src/AlertBanner/AlertBanner.module.scss[13-21]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Existing buttons and banners pair white text with rebrand status backgrounds that are too light for readable normal text.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[63-66]
- packages/style/src/themes/rebrand-theme.scss[118-121]
- packages/components/button/src/Button/Button.module.scss[130-171]
## Recommended Fix
Choose dark and black positive and negative background and hover colors that provide at least 4.5:1 contrast with the white text used by these components, or provide a compatible foreground strategy.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Dark outlined labels become hard to read ✓ Resolved
Description
The dark rebrand sets --primary-color to #2b06e5, a blue with roughly 1.5:1 contrast against its
#2a2a28 primary background. Dark-mode outlined primary labels use that token for their text and
icons, so enabling the theme makes both difficult to distinguish on the normal background.
Code

packages/style/src/themes/rebrand-theme.scss[71]

+  --primary-color: #2b06e5;
Evidence
The new dark theme defines both the dark background and primary blue; the outlined label explicitly
renders the primary color as text and icon fill without a background of its own.

packages/style/src/themes/rebrand-theme.scss[70-71]
packages/style/src/themes/rebrand-theme.scss[94-94]
packages/components/label/src/Label/Label.module.scss[92-106]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The dark CTA blue is also used as foreground text and icon color on dark surfaces, where it has very low contrast.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[70-72]
- packages/style/src/themes/rebrand-theme.scss[94-94]
- packages/components/label/src/Label/Label.module.scss[92-106]
## Recommended Fix
Provide a contrasting dark-mode foreground token for components that currently render `--primary-color` as text or icons, while retaining the intended blue for filled CTA backgrounds. Verify outlined primary labels on the dark background.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

4. New surfaces are absent from color docs 🐞 Bug ⚙ Maintainability
Description
The new --surface-* declarations are not added to the shared or core color registries or to the
semantic-colors page’s key list. When readers look up the newly available surface tokens in the
color documentation, the page omits them, and description lookups for those names return no value.
Code

packages/style/src/themes/light-theme.scss[R11-12]

+  --surface-primary: color-mix(in srgb, var(--primary-color) 8%, var(--primary-background-color));
+  --surface-positive: color-mix(in srgb, var(--positive-color) 8%, var(--primary-background-color));
Evidence
The theme declares the five tokens, but neither color registry lists them. The documentation renders
only its explicit key list and obtains descriptions from the shared registry, so it cannot display
or describe the new surfaces.

packages/style/src/themes/light-theme.scss[11-15]
packages/shared/src/utils/colors-vars-map.ts[3-43]
packages/core/src/utils/colors-vars-map.ts[1-43]
packages/docs/src/pages/foundations/colors/semantic-colors/semantic-colors.tsx[4-24]
packages/docs/src/pages/foundations/colors/colors-description/colors-description.tsx[18-29]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The new semantic surface tokens exist in theme CSS but are absent from the color registries and semantic-colors documentation.
## Fix Focus Areas
- packages/style/src/themes/light-theme.scss[11-15]
- packages/shared/src/utils/colors-vars-map.ts[3-43]
- packages/core/src/utils/colors-vars-map.ts[1-43]
- packages/docs/src/pages/foundations/colors/semantic-colors/semantic-colors.tsx[4-24]
## Recommended Fix
Add all five surface tokens with descriptions to both color registries and include them in the semantic-colors page’s key list.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


5. On-color buttons lose readable hover text 🐞 Bug ≡ Correctness
Description
The dark and black rebrands use a dark --text-color-on-primary, but primary on-color buttons
retain a hard-coded pale hover background while their text color is taken from the parent surface.
When such a button sits directly on a primary-colored surface, hovering or focusing it places the
new light-blue text on #e6e9ef, reducing contrast to approximately 2.7:1 in dark mode and 2.0:1 in
black mode.
Code

packages/style/src/themes/rebrand-theme.scss[73]

+  --text-color-on-primary: #201e24;
Evidence
The rebrand sets light-blue primary surfaces and a dark on-primary background. The button reads its
text color from its parent surface, but its hover and focus rule replaces the dark background with a
fixed pale color; the documented on-color button example places the button directly on a colored
parent.

packages/style/src/themes/rebrand-theme.scss[71-73]
packages/style/src/themes/rebrand-theme.scss[130-132]
packages/components/button/src/Button/Button.module.scss[191-200]
packages/components/button/src/Button/Button.tsx[150-156]
packages/components/button/src/Button/helper/dom-helpers.ts[3-23]
packages/docs/src/pages/components/Button/Button.stories.tsx[184-190]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Dark and black rebrand on-color buttons can have light-blue text on a pale hover background, making their labels difficult to read.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[71-73]
- packages/style/src/themes/rebrand-theme.scss[130-132]
- packages/components/button/src/Button/Button.module.scss[191-200]
## Recommended Fix
Give the on-color primary button a theme-aware hover and focus background that preserves contrast with its parent-derived text color. Keep the stock themes' existing hover appearance unless intentionally changing it.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


6. Black-theme input hints are hard to read ✓ Resolved
Description
The black rebrand sets --placeholder-color to #73706c, which has approximately 3.9:1 contrast
against its #0f0f0f secondary background. TextField and TextArea use those tokens together for
their input backgrounds and placeholder text, so their hints fall below the 4.5:1 normal-text
contrast target when the black rebrand is enabled.
Code

packages/style/src/themes/rebrand-theme.scss[159]

+  --placeholder-color: #73706c;
Evidence
The black rebrand supplies both the low-luminance placeholder color and the secondary background.
Both input components paint their placeholders directly over that background.

packages/style/src/themes/rebrand-theme.scss[148-159]
packages/components/text-inputs/src/TextField/TextField.module.scss[62-95]
packages/components/text-inputs/src/TextArea/TextArea.module.scss[35-45]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Black rebrand input placeholders have insufficient contrast against their input backgrounds.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[148-159]
## Recommended Fix
Choose a lighter black-theme `--placeholder-color` that achieves at least 4.5:1 contrast against `--secondary-background-color`, and verify it in TextField and TextArea.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


View review recommended (12)
7. Selected status buttons are hard to read 🐞 Bug ≡ Correctness
Description
The dark and black rebrand blocks change --positive-color and --negative-color but leave their
selected-background tokens at the stock theme values. When a secondary status button is selected,
hovered, or focused, it displays the new foreground on an inherited dark surface; the positive
pairing is approximately 1.6:1 contrast.
Code

packages/style/src/themes/rebrand-theme.scss[R67-69]

+  --positive-color: #007e23;
+  --positive-color-hover: color-mix(in srgb, var(--text-color-on-primary) 8%, var(--positive-color));
+  --negative-color: #e70039;
Evidence
Both stock dark themes define the selected status backgrounds directly, and neither rebrand block
replaces them. The secondary-button rules combine those inherited backgrounds with the rebrand's new
status foregrounds on active, hover, and focus states.

packages/style/src/themes/rebrand-theme.scss[66-70]
packages/style/src/themes/rebrand-theme.scss[125-129]
packages/style/src/themes/dark-theme.scss[39-46]
packages/style/src/themes/black-theme.scss[39-46]
packages/components/button/src/Button/Button.module.scss[315-334]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The dark and black rebrands change status foreground colors while retaining stock selected-state backgrounds, leaving selected secondary status buttons difficult to read.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[67-70]
- packages/style/src/themes/rebrand-theme.scss[126-129]
## Recommended Fix
Define selected and selected-hover status backgrounds in both rebrand blocks that remain distinguishable with their new foreground colors. Check the resulting secondary-button selected, hover, and focus states for both positive and negative variants.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


8. Nested themed panels revert to stock colors 🐞 Bug ≡ Correctness
Description
The rebrand rules match themed bodies but not a theme-classed descendant of a rebranded body. A
nested dark, light, or black subtree receives the stock theme declarations directly instead of the
corresponding rebrand overrides.
Code

packages/style/src/themes/rebrand-theme.scss[62]

+body.dark-app-theme.rebrand-theme {
Evidence
Stock theme classes set variables on the descendant itself, overriding values inherited from the
rebranded body; none of the rebrand selectors target that descendant.

packages/style/src/themes/rebrand-theme.scss[7-7]
packages/style/src/themes/rebrand-theme.scss[62-62]
packages/style/src/themes/rebrand-theme.scss[117-117]
packages/style/src/themes/dark-theme.scss[1-10]
packages/style/src/themes/light-theme.scss[1-10]
packages/style/src/themes/black-theme.scss[1-10]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Nested theme subtrees under a rebranded body use stock theme colors.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[7-7]
- packages/style/src/themes/rebrand-theme.scss[62-62]
- packages/style/src/themes/rebrand-theme.scss[117-117]
## Recommended Fix
Extend each override block with a `.rebrand-theme .{theme}-app-theme` selector so its variables apply directly to nested subtrees.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


9. Selected tints disagree across token forms ✓ Resolved
Description
--primary-selected-color-rgb and --color-highlight_blue-rgb use the same hard-coded triplet even
though their corresponding colors are different 8% and 6% transparent mixes. In the light rebrand,
the selected mix painted over #fffffb is approximately 237, 236, 233, not the supplied `230,
229, 225`, so consumers painting an opaque RGB token get a different tint.
Code

packages/style/src/themes/rebrand-theme.scss[R47-50]

+  --primary-selected-color-rgb: 230, 229, 225;
+  --primary-background-color-rgb: 255, 255, 251;
+  --secondary-background-color-rgb: 255, 255, 251;
+  --color-highlight_blue-rgb: 230, 229, 225; /* stylelint-disable-line custom-property-pattern */
Evidence
The new selected and highlighted mixes use different percentages but share RGB triplets in each
theme; the stock light theme keeps its selected color and RGB companion equal.

packages/style/src/themes/rebrand-theme.scss[18-24]
packages/style/src/themes/rebrand-theme.scss[40-50]
packages/style/src/themes/rebrand-theme.scss[96-105]
packages/style/src/themes/light-theme.scss[4-9]
packages/style/src/themes/light-theme.scss[282-288]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The RGB counterparts do not match the selected and highlighted colors painted over their theme backgrounds.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[47-50]
- packages/style/src/themes/rebrand-theme.scss[102-105]
- packages/style/src/themes/rebrand-theme.scss[157-160]
## Recommended Fix
Calculate the opaque selected and highlighted RGB values separately for each theme, using the specified mix percentages and their backgrounds.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


10. Consumers cannot obtain a logo color 🐞 Bug ≡ Correctness
Description
The new light rebrand block does not define --logo-color, despite presenting black-logo styling as
part of this layer. No stock theme defines that token either, so a consumer using the advertised
variable receives no value, and the available logo SVG instead relies on an inherited
currentColor.
Code

packages/style/src/themes/rebrand-theme.scss[R7-8]

+body.light-app-theme.rebrand-theme {
+  --primary-color: #3543fc;
Evidence
The rebrand file contains no logo-color declaration in any of its three blocks, while the
repository's logo SVG uses inherited currentColor rather than defining a rebrand color itself.

packages/style/src/themes/rebrand-theme.scss[1-60]
packages/style/src/themes/rebrand-theme.scss[62-115]
packages/style/src/themes/rebrand-theme.scss[117-170]
packages/icons/src/react/MondayLogoOutline.tsx[7-12]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The advertised logo-color token is absent, leaving consumers without a theme-controlled logo value.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[7-10]
- packages/style/src/themes/rebrand-theme.scss[62-69]
- packages/style/src/themes/rebrand-theme.scss[117-124]
## Recommended Fix
Define `--logo-color` in stock themes and override it with the intended black light-rebrand and white dark/black-rebrand values.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


11. Stock themes lack the new surface tokens ✓ Resolved
Description
--surface-* and --border-radius-full are declared only inside opt-in rebrand blocks, rather than
in the stock themes or at the root. A consumer using these new tokens with an ordinary light, dark,
black, or hacker theme gets unset variables; there is no in-repository consumer yet, but the new
tokens are not available across the themes as advertised.
Code

packages/style/src/themes/rebrand-theme.scss[R51-54]

+  --surface-primary: color-mix(in srgb, var(--primary-color) 8%, var(--primary-background-color));
+  --surface-positive: color-mix(in srgb, var(--positive-color) 8%, var(--primary-background-color));
+  --surface-negative: color-mix(in srgb, var(--negative-color) 8%, var(--primary-background-color));
+  --surface-warning: color-mix(in srgb, var(--warning-color) 8%, var(--primary-background-color));
Evidence
All declarations of these new properties are scoped to the three rebrand body selectors. The stock
theme selectors do not match a rebranded body requirement and provide no definitions of these
properties.

packages/style/src/themes/rebrand-theme.scss[51-59]
packages/style/src/themes/rebrand-theme.scss[106-114]
packages/style/src/themes/rebrand-theme.scss[161-169]
packages/style/src/themes/light-theme.scss[1-4]
packages/style/src/themes/dark-theme.scss[1-4]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
New surface and full-radius tokens exist only when the rebrand layer matches.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[51-59]
- packages/style/src/themes/light-theme.scss[1-4]
- packages/style/src/themes/dark-theme.scss[1-4]
- packages/style/src/themes/black-theme.scss[1-4]
- packages/style/src/themes/hacker-theme.scss[1-4]
## Recommended Fix
Define the surface tokens in each stock theme and the full-radius token at the root, keeping rebrand declarations as value overrides.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


12. Selected controls fade on dark hover ✓ Resolved
Description
The dark and black rebrand set --primary-hover-color to #2b06e5, which selected checkboxes use
as their fill and checked radios and slider thumbs use as their hover border. On either dark
surface, those indicators have less than 3:1 contrast with their surroundings, so hovering or
focusing a selected control makes its shape difficult to distinguish.
Code

packages/style/src/themes/rebrand-theme.scss[64]

+  --primary-hover-color: #2b06e5;
Evidence
Both rebrand variants assign the dark blue hover value while setting near-black backgrounds. The
checkbox removes its border and fills with that value on selected hover; the checked radio and
slider thumb use it for their hover borders. The button also consumes the same token for its hover
fill, so changing the shared value alone would alter the intended button hover.

packages/style/src/themes/rebrand-theme.scss[61-76]
packages/style/src/themes/rebrand-theme.scss[124-140]
packages/components/checkbox/src/Checkbox/Checkbox.module.scss[4-7]
packages/components/checkbox/src/Checkbox/Checkbox.module.scss[109-119]
packages/components/radio-button/src/RadioButton/RadioButton.module.scss[72-78]
packages/components/slider/src/Slider/SliderBase/SliderThumb.module.scss[20-35]
packages/components/button/src/Button/Button.module.scss[141-146]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The dark and black button hover color is too dark to distinguish selected control fills and borders from their surroundings.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[63-64]
- packages/style/src/themes/rebrand-theme.scss[126-127]
- packages/components/checkbox/src/Checkbox/Checkbox.module.scss[4-7]
- packages/components/radio-button/src/RadioButton/RadioButton.module.scss[72-78]
- packages/components/slider/src/Slider/SliderBase/SliderThumb.module.scss[20-35]
## Recommended Fix
Give selected controls a contrasting hover color in the dark and black rebrand variants without changing the intended button hover color. Update the affected control styles to use the separate color and verify their fill and border contrast against both dark surfaces.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


13. Idle light-theme controls lose their outlines ✓ Resolved
Description
The light rebrand sets --ui-border-color to #e2e4e3, making default control borders barely
distinguishable from their inherited white background. When the rebrand is enabled, unchecked
checkboxes and unfocused text fields rely on that border to show their boundaries, while their hover
and focus states use different colors.
Code

packages/style/src/themes/rebrand-theme.scss[28]

+  --ui-border-color: #e2e4e3;
Evidence
The light theme supplies a white secondary background, and the rebrand replaces its existing
#c3c6d4 control border with the much lighter #e2e4e3. Text fields and unchecked checkboxes use
that token for their default border.

packages/style/src/themes/light-theme.scss[20-27]
packages/style/src/themes/rebrand-theme.scss[28-28]
packages/components/text-inputs/src/TextField/TextField.module.scss[60-68]
packages/components/checkbox/src/Checkbox/Checkbox.module.scss[24-38]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The light rebrand's control border is too close to the white surface for idle controls to retain a clear outline.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[28-28]
## Recommended Fix
Choose a darker light-theme `--ui-border-color` that keeps default text fields, buttons, checkboxes, and radio buttons visibly bounded against their white backgrounds.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


14. Open brand split buttons lose readable text ✓ Resolved
Description
The dark and black rebrand blocks set --brand-color to #2b06e5, which the split-button styles
use for the secondary button’s text when an active tertiary brand button is open. With
--brand-selected-color providing only an 8% white overlay on a dark background, that text has very
low contrast in both variants.
Code

packages/style/src/themes/rebrand-theme.scss[R107-109]

+  --brand-color: #2b06e5;
+  --brand-hover-color: #2203be;
+  --brand-selected-color: rgba(255, 255, 255, 0.08);
Evidence
The split-button selector explicitly assigns the rebrand's dark blue brand token to text in the
active, open state; its selected background is a translucent light overlay rather than a light
surface.

packages/components/split-button/src/SplitButton/SplitButton.module.scss[48-65]
packages/style/src/themes/rebrand-theme.scss[107-110]
packages/style/src/themes/rebrand-theme.scss[162-178]
packages/components/split-button/src/SplitButton/SplitButton.tsx[162-183]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Active tertiary brand split buttons use `--brand-color` as text when their secondary content is open, but the dark and black rebrand values have low contrast against the selected background.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[107-110]
- packages/style/src/themes/rebrand-theme.scss[175-178]
- packages/components/split-button/src/SplitButton/SplitButton.module.scss[48-65]
## Recommended Fix
Provide a lighter foreground token for brand text in this dark split-button state while preserving the intended blue CTA fill. Verify the active, open state in both dark and black themes.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


15. Dark status-surface text is hard to read ✓ Resolved
Description
The dark rebrand defines status surfaces as 8% mixes over --primary-background-color, then assigns
their text tokens the inherited dark-theme semantic colors. Pairing the positive or info text token
with its matching surface places saturated, relatively dark text on a nearly dark background;
downstream consumers of these newly introduced pairs will render low-contrast text.
Code

packages/style/src/themes/rebrand-theme.scss[R84-88]

+  --text-on-surface-positive: var(--positive-color);
+  --text-on-surface-negative: var(--negative-color);
+  --text-on-surface-warning: var(--warning-color);
+  --text-on-surface-neutral: var(--primary-text-color);
+  --text-on-surface-info: var(--info-color);
Evidence
The dark block mixes each semantic color into the dark primary background at only 8%, while
assigning the unchanged positive and info colors to foreground text. The stock theme defines
positive as #00854d; the rebrand defines info as #0073ea, both dark against surfaces based on
#2a2a28. No repository component currently consumes these new pairs.

packages/style/src/themes/rebrand-theme.scss[77-88]
packages/style/src/themes/rebrand-theme.scss[94-94]
packages/style/src/themes/rebrand-theme.scss[111-111]
packages/style/src/themes/dark-theme.scss[30-36]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The dark rebrand's positive and info text-on-surface tokens reuse semantic colors that are too dark for their paired, nearly dark surfaces.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[77-88]
- packages/style/src/themes/rebrand-theme.scss[144-155]
## Recommended Fix
Set dark-theme text-on-surface colors to lighter foreground values with sufficient contrast against their computed surfaces. Check the corresponding black-theme pairs as well.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


16. Stock theme exports show rebrand colors ✓ Resolved
Description
generate-colors.ts uses substring matching to classify the new compound selectors as ordinary
light and dark theme rules, then places their declarations after the stock declarations. When
@vibe/style builds, the published tokens.json can therefore report #2b06e5 as a stock theme’s
primary color instead of #0073ea, even though the rebrand is opt-in.
Code

packages/style/src/themes/rebrand-theme.scss[R9-10]

+body.light-app-theme.rebrand-theme {
+  --primary-color: #2b06e5;
Evidence
The generator matches selectors with includes, appends matching declarations in stylesheet order,
and writes the result to a JSON file included in the package build. The new selectors match the
stock patterns while assigning a different primary color.

packages/style/scripts/generate-colors.ts[14-18]
packages/style/scripts/generate-colors.ts[82-98]
packages/style/scripts/generate-colors.ts[48-51]
packages/style/src/themes/light-theme.scss[1-6]
packages/style/src/themes/rebrand-theme.scss[9-10]
packages/style/package.json[23-32]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The color generator treats opt-in rebrand selectors as stock light and dark theme selectors, corrupting the generated stock theme entries.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[9-10]
- packages/style/scripts/generate-colors.ts[82-95]
## Recommended Fix
Match stock theme selectors as complete selectors rather than substrings, and generate a separate rebrand entry if its colors need a JSON export. Verify generated stock primary colors remain `#0073ea`.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


17. Dark links lose readable contrast ✓ Resolved
Description
The dark rebrand changes --link-color to #7e68ee, which has roughly 3.5:1 contrast against its
#2a2a28 background, down from roughly 5.7:1 for the stock dark link color. Link components and
anchors inside typography use this token for normal-size text, so their default state falls below
the 4.5:1 text-contrast threshold when the theme is enabled.
Code

packages/style/src/themes/rebrand-theme.scss[106]

+  --link-color: #7e68ee;
Evidence
The new foreground and background values determine the contrast, and existing link and typography
styles apply the link token directly to text. The stock dark link value provides the comparison.

packages/style/src/themes/rebrand-theme.scss[94-106]
packages/style/src/themes/dark-theme.scss[18-35]
packages/components/link/src/Link/Link.module.scss[3-8]
packages/components/typography/src/Typography/Typography.module.scss[3-11]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The new dark link foreground has insufficient contrast against the new dark background for normal-size link text.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[94-94]
- packages/style/src/themes/rebrand-theme.scss[106-106]
- packages/components/link/src/Link/Link.module.scss[3-8]
## Recommended Fix
Choose a lighter dark-mode link color that retains the rebrand hue and reaches at least 4.5:1 contrast against the primary and secondary dark backgrounds.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


18. Light warning-surface text is too faint ✓ Resolved
Description
--text-on-surface-warning is #e1a314, while its paired surface mixes only 8% warning yellow into
the light theme’s white background, yielding roughly 2:1 text contrast. Any consumer rendering
normal-size warning text with these newly introduced paired tokens will get a hard-to-read result;
there is no consumer of the pair in this repository yet.
Code

packages/style/src/themes/rebrand-theme.scss[25]

+  --text-on-surface-warning: #e1a314;
Evidence
The new tokens explicitly pair the warning foreground with an 8% warning-color surface; the stock
light theme supplies a white primary background and the warning-color input.

packages/style/src/themes/rebrand-theme.scss[19-25]
packages/style/src/themes/light-theme.scss[18-21]
packages/style/src/themes/light-theme.scss[48-53]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The new light warning foreground is too pale against its nearly white paired surface for normal text.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[19-25]
- packages/style/src/themes/light-theme.scss[18-21]
- packages/style/src/themes/light-theme.scss[48-53]
## Recommended Fix
Select a darker light-mode `--text-on-surface-warning` value and check its contrast against the computed `--surface-warning` color at normal text size.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Context sources
❌ Tickets: failed to load — Ticket collection could not establish complete evidence
Review mode: Auto: ⚖️ Balanced: Downgraded extended -> standard: change is below the extended eligibility bar (hunks 11/18, lines 291/200; both must reach the floor). Router rationale: Broad theme behavior, token generation, and many independent styling paths create dense defect risk.

Grey Divider

⚠️ Warning | Comment size exceeded, non finding content trimmed Learn more

Grey Divider

Qodo Logo

Comment on lines +9 to +10
body.light-app-theme.rebrand-theme {
--primary-color: #2b06e5;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

2. Stock theme exports show rebrand colors 🐞 Bug ≡ Correctness

generate-colors.ts uses substring matching to classify the new compound selectors as ordinary
light and dark theme rules, then places their declarations after the stock declarations. When
@vibe/style builds, the published tokens.json can therefore report #2b06e5 as a stock theme’s
primary color instead of #0073ea, even though the rebrand is opt-in.
Agent Prompt
## Issue description
The color generator treats opt-in rebrand selectors as stock light and dark theme selectors, corrupting the generated stock theme entries.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[9-10]
- packages/style/scripts/generate-colors.ts[82-95]
## Recommended Fix
Match stock theme selectors as complete selectors rather than substrings, and generate a separate rebrand entry if its colors need a JSON export. Verify generated stock primary colors remain `#0073ea`.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

--placeholder-color: var(--secondary-text-color);
--icon-color: var(--secondary-text-color);
--disabled-background-color: #323230;
--link-color: #7e68ee;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

3. Dark links lose readable contrast 🐞 Bug ≡ Correctness

The dark rebrand changes --link-color to #7e68ee, which has roughly 3.5:1 contrast against its
#2a2a28 background, down from roughly 5.7:1 for the stock dark link color. Link components and
anchors inside typography use this token for normal-size text, so their default state falls below
the 4.5:1 text-contrast threshold when the theme is enabled.
Agent Prompt
## Issue description
The new dark link foreground has insufficient contrast against the new dark background for normal-size link text.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[94-94]
- packages/style/src/themes/rebrand-theme.scss[106-106]
- packages/components/link/src/Link/Link.module.scss[3-8]
## Recommended Fix
Choose a lighter dark-mode link color that retains the rebrand hue and reaches at least 4.5:1 contrast against the primary and secondary dark backgrounds.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +107 to +109
--brand-color: #2b06e5;
--brand-hover-color: #2203be;
--brand-selected-color: rgba(255, 255, 255, 0.08);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

2. Open brand split buttons lose readable text 🐞 Bug ≡ Correctness

The dark and black rebrand blocks set --brand-color to #2b06e5, which the split-button styles
use for the secondary button’s text when an active tertiary brand button is open. With
--brand-selected-color providing only an 8% white overlay on a dark background, that text has very
low contrast in both variants.
Agent Prompt
## Issue description
Active tertiary brand split buttons use `--brand-color` as text when their secondary content is open, but the dark and black rebrand values have low contrast against the selected background.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[107-110]
- packages/style/src/themes/rebrand-theme.scss[175-178]
- packages/components/split-button/src/SplitButton/SplitButton.module.scss[48-65]
## Recommended Fix
Provide a lighter foreground token for brand text in this dark split-button state while preserving the intended blue CTA fill. Verify the active, open state in both dark and black themes.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit d63ff43

--text-on-surface-neutral: var(--primary-text-color);
--allgrey-background-color: #f4f5f3;
--backdrop-color: rgba(50, 51, 56, 0.7);
--ui-border-color: #e2e4e3;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

2. Idle light-theme controls lose their outlines 🐞 Bug ≡ Correctness

The light rebrand sets --ui-border-color to #e2e4e3, making default control borders barely
distinguishable from their inherited white background. When the rebrand is enabled, unchecked
checkboxes and unfocused text fields rely on that border to show their boundaries, while their hover
and focus states use different colors.
Agent Prompt
## Issue description
The light rebrand's control border is too close to the white surface for idle controls to retain a clear outline.

## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[28-28]

## Recommended Fix
Choose a darker light-theme `--ui-border-color` that keeps default text fields, buttons, checkboxes, and radio buttons visibly bounded against their white backgrounds.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit a4909c6

@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit bbd3223

@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Code Review by Qodo

Grey Divider

New Review Started

This review has been superseded by a new analysis

Grey Divider

Qodo Logo

body.dark-app-theme.rebrand-theme,
.rebrand-theme .dark-app-theme {
--primary-color: #4d63ff;
--primary-hover-color: #2b06e5;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

2. Selected controls fade on dark hover 🐞 Bug ≡ Correctness

The dark and black rebrand set --primary-hover-color to #2b06e5, which selected checkboxes use
as their fill and checked radios and slider thumbs use as their hover border. On either dark
surface, those indicators have less than 3:1 contrast with their surroundings, so hovering or
focusing a selected control makes its shape difficult to distinguish.
Agent Prompt
## Issue description
The dark and black button hover color is too dark to distinguish selected control fills and borders from their surroundings.

## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[63-64]
- packages/style/src/themes/rebrand-theme.scss[126-127]
- packages/components/checkbox/src/Checkbox/Checkbox.module.scss[4-7]
- packages/components/radio-button/src/RadioButton/RadioButton.module.scss[72-78]
- packages/components/slider/src/Slider/SliderBase/SliderThumb.module.scss[20-35]

## Recommended Fix
Give selected controls a contrasting hover color in the dark and black rebrand variants without changing the intended button hover color. Update the affected control styles to use the separate color and verify their fill and border contrast against both dark surfaces.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit 95527a2

@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit 5d1f8bd

Adds body.<theme>-app-theme.rebrand-theme override blocks (black logo,
blue CTA), applied by the monolith behind design_facelift. Values are
taken from mf-topbar's facelift theme (base block + black logo layer).

generate-colors skips .rebrand-theme rules: their selectors contain the
stock theme classes, so the substring match would merge the overrides
into the stock entries of tokens.json.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Mordech Mordech changed the title feat(style): add rebrand theme (black logo, blue CTA) feat(style): rebrand overrides for light, dark and black themes Oct 25, 2026
--border-radius-full: 9999px;
}

body.dark-app-theme.rebrand-theme {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

4. Nested themed panels revert to stock colors 🐞 Bug ≡ Correctness

The rebrand rules match themed bodies but not a theme-classed descendant of a rebranded body. A
nested dark, light, or black subtree receives the stock theme declarations directly instead of the
corresponding rebrand overrides.
Agent Prompt
## Issue description
Nested theme subtrees under a rebranded body use stock theme colors.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[7-7]
- packages/style/src/themes/rebrand-theme.scss[62-62]
- packages/style/src/themes/rebrand-theme.scss[117-117]
## Recommended Fix
Extend each override block with a `.rebrand-theme .{theme}-app-theme` selector so its variables apply directly to nested subtrees.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +7 to +8
body.light-app-theme.rebrand-theme {
--primary-color: #3543fc;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

6. Consumers cannot obtain a logo color 🐞 Bug ≡ Correctness

The new light rebrand block does not define --logo-color, despite presenting black-logo styling as
part of this layer. No stock theme defines that token either, so a consumer using the advertised
variable receives no value, and the available logo SVG instead relies on an inherited
currentColor.
Agent Prompt
## Issue description
The advertised logo-color token is absent, leaving consumers without a theme-controlled logo value.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[7-10]
- packages/style/src/themes/rebrand-theme.scss[62-69]
- packages/style/src/themes/rebrand-theme.scss[117-124]
## Recommended Fix
Define `--logo-color` in stock themes and override it with the intended black light-rebrand and white dark/black-rebrand values.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit 4218c46

Synced with mf-topbar facelift.css (base + black logo layer):
- Neutral hovers are the text color at 8%, selected-hover 15%; fill hovers
  are the on-color at 8% over the fill. On-secondary variants follow their
  base tokens.
- Primary/brand/light link #424ef9 with white text; brand selected tints
  #424ef9 10% / 19%; dark/black positive and negative pass AA with white
  text, hover included.
- RGB companions match the selected/highlight mixes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Comment on lines +67 to +69
--positive-color: #007e23;
--positive-color-hover: color-mix(in srgb, var(--text-color-on-primary) 8%, var(--positive-color));
--negative-color: #e70039;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

4. Selected status buttons are hard to read 🐞 Bug ≡ Correctness

The dark and black rebrand blocks change --positive-color and --negative-color but leave their
selected-background tokens at the stock theme values. When a secondary status button is selected,
hovered, or focused, it displays the new foreground on an inherited dark surface; the positive
pairing is approximately 1.6:1 contrast.
Agent Prompt
## Issue description
The dark and black rebrands change status foreground colors while retaining stock selected-state backgrounds, leaving selected secondary status buttons difficult to read.
## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[67-70]
- packages/style/src/themes/rebrand-theme.scss[126-129]
## Recommended Fix
Define selected and selected-hover status backgrounds in both rebrand blocks that remain distinguishable with their new foreground colors. Check the resulting secondary-button selected, hover, and focus states for both positive and negative variants.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit da30324

…emes

The rebrand overrides introduce --surface-primary|positive|negative|warning|
neutral and --border-radius-full. Define them in the stock light, dark,
black and hacker themes (and :root for the radius) so they resolve without
the rebrand class. Surfaces use the same formula, so each theme gets its
own colours.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit dd976c7

Synced with mf-topbar facelift.css:
- Placeholder: light #6c6b68, black #a9a5a1.
- Dark/black: primary #6a86ff / #82a3ff, positive #3ca349 / #56bb5c,
  negative #ff4e60 / #ff7d8d, with --text-color-on-primary #201e24, so
  they pass 4.5:1 as small text on every surface and as fills (hover
  included).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
--negative-color-hover: color-mix(in srgb, var(--text-color-on-primary) 8%, var(--negative-color));
--primary-color: #6a86ff;
--primary-hover-color: color-mix(in srgb, var(--text-color-on-primary) 8%, var(--primary-color));
--text-color-on-primary: #201e24;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

4. On-color buttons lose readable hover text 🐞 Bug ≡ Correctness

The dark and black rebrands use a dark --text-color-on-primary, but primary on-color buttons
retain a hard-coded pale hover background while their text color is taken from the parent surface.
When such a button sits directly on a primary-colored surface, hovering or focusing it places the
new light-blue text on #e6e9ef, reducing contrast to approximately 2.7:1 in dark mode and 2.0:1 in
black mode.
Agent Prompt
## Issue description
Dark and black rebrand on-color buttons can have light-blue text on a pale hover background, making their labels difficult to read.

## Fix Focus Areas
- packages/style/src/themes/rebrand-theme.scss[71-73]
- packages/style/src/themes/rebrand-theme.scss[130-132]
- packages/components/button/src/Button/Button.module.scss[191-200]

## Recommended Fix
Give the on-color primary button a theme-aware hover and focus background that preserves contrast with its parent-derived text color. Keep the stock themes' existing hover appearance unless intentionally changing it.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit 3941a2f

Synced with mf-topbar facelift.css:
- --title-font-family: "monday Saans", Figtree, Roboto, ... in all three
  override blocks (body text stays Figtree). The host must also declare it
  where it sets its own fonts (DaPulse/dapulse#116378 does).
- --border-radius-prompt-box: 12px. Not defined in the stock themes; consumers
  use var(--border-radius-prompt-box, 12px).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit 4af2e62

12px on :root as well as in the rebrand overrides, so prompt boxes can
migrate to the token before the flag is on.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Code Review by Qodo

Grey Divider

New Review Started

This review has been superseded by a new analysis

Grey Divider

Qodo Logo

Same declarations, ordered under typography / primary & brand / semantic /
interaction states / backgrounds / borders / text / rgb companions /
surfaces / radius.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Comment on lines +11 to +12
--surface-primary: color-mix(in srgb, var(--primary-color) 8%, var(--primary-background-color));
--surface-positive: color-mix(in srgb, var(--positive-color) 8%, var(--primary-background-color));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

4. New surfaces are absent from color docs 🐞 Bug ⚙ Maintainability

The new --surface-* declarations are not added to the shared or core color registries or to the
semantic-colors page’s key list. When readers look up the newly available surface tokens in the
color documentation, the page omits them, and description lookups for those names return no value.
Agent Prompt
## Issue description
The new semantic surface tokens exist in theme CSS but are absent from the color registries and semantic-colors documentation.

## Fix Focus Areas
- packages/style/src/themes/light-theme.scss[11-15]
- packages/shared/src/utils/colors-vars-map.ts[3-43]
- packages/core/src/utils/colors-vars-map.ts[1-43]
- packages/docs/src/pages/foundations/colors/semantic-colors/semantic-colors.tsx[4-24]

## Recommended Fix
Add all five surface tokens with descriptions to both color registries and include them in the semantic-colors page’s key list.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit a1ec2c3

--border-radius-full and --border-radius-prompt-box are now :root tokens,
so the use-defined-css-var-when-available rule must know which props may
use them. --border-radius-12 becomes the recommended var for a literal
12px now that --border-radius-prompt-box shares that value.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit 34a678c

--title-font-family: "monday Saans", Figtree, Roboto, Noto Sans Hebrew, Noto Kufi Arabic, Noto Sans JP, sans-serif;

/* Primary, brand and links */
--primary-color: #424ef9;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Mordech don't we want to give hard coded value a primitive value - like
--lilach-purple:#424ef9; and then use it ?

/* Primary, brand and links */
--primary-color: #424ef9;
--primary-hover-color: color-mix(in srgb, var(--text-color-on-primary) 8%, var(--primary-color));
--text-color-on-primary: #ffffff;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same comment about whites ? give variable and then use it in the semantic tokens

--primary-on-secondary-color: var(--primary-color);
--primary-hover-on-secondary-color: var(--primary-hover-color);
--link-on-secondary-color: var(--link-color);
--link-color: #424ef9;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same comment for all hard coded values

"--border-radius-16"
"--border-radius-16",
"--border-radius-full",
"--border-radius-prompt-box"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not use the existing 12?

--border-radius-medium: var(--border-radius-8);
--border-radius-big: var(--border-radius-16);
--border-radius-full: 9999px;
--border-radius-prompt-box: 12px;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not use theexisting 12?

@rivka-ungar

Copy link
Copy Markdown
Contributor

Review: rebrand overrides

The scoping looks right. Everything needs body.<theme>.rebrand-theme, the color-mix tokens resolve without circular references, and skipping .rebrand-theme rules in generate-colors is needed so they don't leak into stock tokens. I have a few questions and some accessibility findings.

Accessibility

The description says every text and fill pair is at least 4.5:1, but the PR has no script or test behind that. I computed the ratios from the hex values in the diff (hovers resolved by hand). Most pairs pass, with these exceptions:

  1. Black theme, --disabled-background-color (#3f3f3f): placeholder, brand, positive and negative text come out at 4.30–4.34:1. Disabled controls are exempt from WCAG contrast, so this may be fine, but it contradicts "every background token". Either narrow the claim or lighten the text.
  2. Dark theme hovers are marginal: primary, positive and negative hovers land at 4.51–4.54:1 (--text-color-on-primary is dark and the hover mixes 8% of it in). Any tweak to the mix breaks AA.
  3. Light --ui-border-color: #8f9098 is 2.69–2.95:1 on surface, allgrey, grey, ui and disabled (it's about 3.2:1 on the page background). WCAG 1.4.11 needs 3:1 where the border is the only boundary indicator, such as inputs on those surfaces.
  4. Counter negative badge (documented in Notes):
    • White (--fixed-light-color) on #ff4e60 is about 3.2:1, and on #ff7d8d about 2.4:1. That is a real failure in dark and black, not just a caveat.
    • Could Counter use --text-color-on-primary for this variant so it follows the theme?
  5. Not covered: alpha-based selected and hover states (contrast depends on what's underneath) and the focus ring color.

Could we add a small script in packages/style that parses the rebrand blocks, resolves color-mix, and fails CI below 4.5:1 for text or 3:1 for non-text? That would replace the manual claim with a check that stays true.

Storybook

There's no way to see this in Storybook. withThemeByClassName (packages/docs/.storybook/preview.tsx) only toggles light, dark and black. The overrides need body.<theme>.rebrand-theme, and the addon's default parent is html, so just adding map entries won't match. Suggest a toolbar toggle (global) that adds rebrand-theme to document.body, so all three themes can be checked with it on. It would also let Chromatic cover the overrides. Also check that the .light-app-theme { background-color: var(--sb-primary-background-color) } rules in preview-head.html don't mask the rebrand background.

Tokens

  1. --surface-* are added to the stock light, dark, black and hacker themes, but src/files/tokens.json has no surface-* entries and isn't in the diff. The description says generate-colors "leaves tokens.json unchanged". Is that because the generator drops color-mix(...) values, or is the committed file stale? If tokens don't reach tokens.json, token consumers won't see them.
  2. The radius overrides only change --border-radius-small, -medium and -big (to 6, 8 and 12px). Core uses those aliases 164 times, but anything using --border-radius-4/8/12/16 stays as it was. Is that intended?
  3. The selected and hover tokens become translucent color-mix(... transparent) instead of opaque. Components that layer them over other content (sticky Table rows, overlapping List items) may show what's underneath. Worth checking Table, List, Menu and Dropdown in Chromatic with the class on.

Smaller things

  • The --surface-* block is repeated in four stock themes and three rebrand blocks. A shared partial would be easier to maintain.
  • props-to-allowed-vars.js also adds --border-radius-12 to the recommended radii. That changes lint suggestions for all consumers and isn't mentioned in the description. Please call it out or split it out.

This branch has not been deployed

No deployments
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.

3 participants