Skip to content

Commit 5b5e922

Browse files
authored
Make the upgrade banner neutral instead of gradient purple (#7696)
## What The `promo` banner tone was a full-bleed `indigo-500 → purple-500` gradient with white text and a black drop-shadow on the CTA. It was the only saturated fill in the app, and against the warm neutral palette it read as a foreign object above the workbench. The bar is now app chrome: | | Before | After | |---|---|---| | Background | 135° indigo→purple gradient | `--c-bg-raised` | | Border | `transparent` | `--c-border-subtle` hairline | | Icon | white glyph, no container | neutral glyph in a `--c-surface-sunken` chip | | Text | forced white | `--c-text` / `--c-text-muted` | | CTA | `premium` accent (violet gradient) | `default` accent (same primary button as the rest of the app) | Before <img width="1504" height="739" alt="Screenshot 2026-08-27 at 4 49 00 PM" src="https://github.com/user-attachments/assets/a912d9e9-9590-4e1d-8202-1abb22a00f23" /> After <img width="1061" height="665" alt="Screenshot 2026-08-27 at 4 48 30 PM" src="https://github.com/user-attachments/assets/3be14aec-ccfe-4448-93b3-339a57be4937" /> Only caller is the friendly variant of `UpgradeBanner` (self-hosted, under the free-tier user limit). ## Notes - **No new theme tokens.** Every value is an existing `--c-*` semantic token, so light and dark both follow automatically with no per-theme overrides. - The `premium` accent itself is untouched, so the upgrade CTAs in `OfflineActivationCard` and `PairingPanel` are unaffected. - `--c-hue-indigo` / `--c-hue-purple` are still used by `SaaSOnboardingSlides`, `PaygFree` and `UpgradeModal`, so no tokens are orphaned. - Deleted comments describe rules that no longer exist (the gradient, the white-on-gradient text overrides, the CTA shadow). No new comments added. ## Verification - `task frontend:check:all` passes (typecheck, oxlint, all four theme linters, stylelint, format, tests, build, storybook build). - `task frontend:storybook:a11y:changed` passes light and dark: 7 AppBanner stories, 0 violations. Both a11y baselines are empty, so this is zero known violations rather than a baselined pass. - Checked in Storybook under **Shared / AppBanner → All Top Bars**, which renders every top bar the app can show side by side, in both themes.
1 parent a215c30 commit 5b5e922

2 files changed

Lines changed: 14 additions & 19 deletions

File tree

frontend/editor/src/core/components/shared/AppBanner.css

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,10 @@
2424
--app-banner-icon: var(--c-accent-fg, var(--c-primary));
2525
}
2626

27-
/* The one bar meant to pop, so it takes the feature gradient rather than a tint.
28-
Fixed hues by design — it doesn't follow the chosen accent. */
2927
.app-banner--promo {
30-
--app-banner-bg: linear-gradient(
31-
135deg,
32-
var(--c-hue-indigo) 0%,
33-
var(--c-hue-purple) 100%
34-
);
35-
--app-banner-border: transparent;
36-
--app-banner-icon: var(--color-text-on-accent);
37-
color: var(--color-text-on-accent);
28+
--app-banner-bg: var(--c-bg-raised);
29+
--app-banner-border: var(--c-border-subtle);
30+
--app-banner-icon: var(--c-text-muted);
3831
}
3932

4033
.app-banner--warning {
@@ -86,16 +79,18 @@
8679
font-size: 0.75rem;
8780
}
8881

89-
/* On the gradient everything is white; muted grey would disappear. */
90-
.app-banner--promo .app-banner__message,
91-
.app-banner--promo .app-banner__actions .sui-btn--tertiary,
92-
.app-banner--promo .app-banner__actions .sui-ai {
93-
color: var(--color-text-on-accent);
82+
.app-banner--promo .app-banner__icon {
83+
width: 1.75rem;
84+
height: 1.75rem;
85+
justify-content: center;
86+
border-radius: var(--radius-md);
87+
background: var(--c-surface-sunken);
88+
box-shadow: inset 0 0 0 1px var(--c-border-subtle);
9489
}
9590

96-
/* Lifts the premium CTA off the gradient it sits on. */
97-
.app-banner--promo .app-banner__actions .sui-btn--primary {
98-
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);
91+
.app-banner--promo.app-banner--compact .app-banner__icon {
92+
width: 1.5rem;
93+
height: 1.5rem;
9994
}
10095

10196
.app-banner__actions {

frontend/editor/src/core/components/shared/AppBanner.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export type AppBannerTone = "info" | "promo" | "warning" | "danger";
1111
/** Tone decides the button too, so the CTA can't drift from the bar it sits on. */
1212
const TONE_BUTTON = {
1313
info: { variant: "secondary", accent: "default" },
14-
promo: { variant: "primary", accent: "premium" },
14+
promo: { variant: "primary", accent: "default" },
1515
warning: { variant: "primary", accent: "warning" },
1616
danger: { variant: "primary", accent: "danger" },
1717
} as const;

0 commit comments

Comments
 (0)