Skip to content

Commit d25e362

Browse files
LEANDERANTONYclaude
andcommitted
Landing pricing: tone down Pro card + work around Chrome dark-mode
Polishes the pricing section we just shipped. Five iterations baked into one commit so the diff stays readable: 1. Pro card gradient: was linear-gradient(var(--accent), #114be9) which read as bright electric blue. Pulled to a deep navy (#0c1530 -> #050a1c) — same family as --accent but pulled WAY down. Feels premium / "tuxedo" rather than carnival. 2. Outer card glow + Pro card drop shadow tightened. 32px / 45% blur was bleeding across card boundaries — adjacent cards looked like one wash of blue. 18px / 28% alpha keeps each card's halo inside its lane with a clean gap. 3. Pro CTA + badge switched from "punch-through" black (the HelpmateAI pattern) to the bright --accent blue with white text — on the dark navy card a black button would visually merge into the surface. The bright blue is the strongest contrast available without leaving the brand palette. 4. .l-shell gains --accent-fg / --accent-tint / --accent-glow / --bg-page tokens so the pricing CSS can reference them by name instead of hex literals. 5. Chrome 148+ workaround: in dark color-scheme, the browser silently replaces background-color on <button> elements with the system "ButtonFace" dark gray, beating even author !important. appearance:none alone doesn't fix it. Primary- tier CTAs (Free + Pro) now render as <a role="button" href="#"> instead of <button>; anchors don't inherit the dark form-control treatment so our CSS bg actually paints. The onClick still routes through the same onPrimaryCta auth handoff. .l-pricing-cta also gets appearance:none + color-scheme:light as belt-and-suspenders. The HelpmateAI pricing landing got the matching tone-down + defensive bits in a separate commit on its repo so the two products read as siblings. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 7f47f04 commit d25e362

2 files changed

Lines changed: 66 additions & 22 deletions

File tree

frontend/src/app/globals.css

Lines changed: 48 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4287,10 +4287,14 @@ code {
42874287
/* Free + Business cards: accent border + outer glow, interior stays
42884288
neutral dark. The Pro card sits between them solid-filled, so the
42894289
accent rim on the outers ties the row into one coherent group
4290-
without diluting the focal anchor. */
4290+
without diluting the focal anchor.
4291+
Tight glow: 18px blur at ~28% alpha keeps the halo inside the
4292+
gap between cards. The earlier 32px / 45% halo bled across card
4293+
boundaries and made adjacent cards look like they were sharing
4294+
one wash of blue. */
42914295
.l-pricing-card:not(.is-featured) {
42924296
border-color: var(--accent);
4293-
box-shadow: 0 0 32px var(--accent-glow);
4297+
box-shadow: 0 0 18px rgba(48, 100, 255, 0.28);
42944298
}
42954299

42964300
.l-pricing-card-head {
@@ -4347,6 +4351,18 @@ code {
43474351
font-weight: 500;
43484352
text-decoration: none;
43494353
cursor: pointer;
4354+
/* Chrome's modern <button> rendering applies a dark "ButtonFace"
4355+
background (rgb(28, 30, 31)) whenever the element's inherited
4356+
color-scheme is "dark" — even author `!important` background-
4357+
color is ignored. `appearance: none` alone doesn't fix it
4358+
because the dark-control style is keyed on color-scheme, not on
4359+
-webkit-appearance. The fix is to opt this button out of the
4360+
parent color-scheme so Chrome treats it as a normal styleable
4361+
control: `color-scheme: light` makes our white-bg + blue-text
4362+
inversion actually paint. */
4363+
appearance: none;
4364+
-webkit-appearance: none;
4365+
color-scheme: light;
43504366
transition:
43514367
background var(--l-duration) var(--l-ease),
43524368
box-shadow var(--l-duration) var(--l-ease);
@@ -4403,10 +4419,20 @@ code {
44034419
/* ---------- Featured (Pro) — filled accent ---------- */
44044420

44054421
.l-pricing-card.is-featured {
4406-
background: linear-gradient(135deg, var(--accent), #114be9);
4422+
/* Deep navy — bluer than the page bg (#04070f) so the card still
4423+
reads as "filled" and distinct from the outer Free/Business
4424+
cards' neutral dark surface, but pulled WAY down from the
4425+
vivid --accent gradient we started with. Feels premium /
4426+
"tuxedo" rather than carnival. Outer cards keep their brighter
4427+
--accent rim glow so the contrast between "bright rim" and
4428+
"dark interior" reads as deliberate layering.
4429+
Tightened drop shadow: 28px blur instead of 48px, lower alpha,
4430+
so the Pro card's halo lands UNDER it rather than bleeding into
4431+
the neighbors. */
4432+
background: linear-gradient(135deg, #0c1530, #050a1c);
44074433
border-color: transparent;
44084434
box-shadow:
4409-
0 24px 48px -16px var(--accent-glow),
4435+
0 16px 28px -14px rgba(48, 100, 255, 0.28),
44104436
0 0 0 1px rgba(255, 255, 255, 0.08) inset;
44114437
transform: translateY(-6px);
44124438
}
@@ -4425,28 +4451,33 @@ code {
44254451
.l-pricing-card.is-featured .l-pricing-features svg {
44264452
color: var(--accent-fg);
44274453
}
4428-
/* Pro CTA + badge punch through to the page color, reading as
4429-
near-black windows cut into the filled card. Same trick as
4430-
HelpmateAI — pulls the eye to the conversion target. */
4454+
/* Pro CTA + badge use the brand --accent (bright blue) with white
4455+
text — same treatment as the Free/Business buttons. With the Pro
4456+
card now a deep navy, a black "punch-through" button would visually
4457+
merge into it; the bright blue is the strongest contrast available
4458+
without leaving the brand palette. Visual hierarchy still belongs
4459+
to the Pro card via its bluer tint, translateY lift, the MOST
4460+
POPULAR pill, and the outer cards' rim-vs-interior contrast. */
44314461
.l-pricing-card.is-featured .l-pricing-cta {
4432-
background: var(--bg-page);
4433-
color: var(--accent);
4462+
background: var(--accent);
4463+
color: var(--accent-fg);
44344464
border-color: transparent;
44354465
}
44364466
.l-pricing-card.is-featured .l-pricing-cta:hover {
4437-
background: #000;
4467+
background: var(--accent-strong);
44384468
box-shadow:
4439-
0 0 0 1px rgba(255, 255, 255, 0.1) inset,
4440-
0 0 24px rgba(0, 0, 0, 0.5);
4469+
0 0 0 1px rgba(255, 255, 255, 0.12) inset,
4470+
0 0 24px var(--accent-glow);
44414471
}
4442-
.l-pricing-card.is-featured .l-pricing-cta:disabled {
4443-
background: var(--bg-page);
4444-
color: var(--accent);
4472+
.l-pricing-card.is-featured .l-pricing-cta:disabled,
4473+
.l-pricing-card.is-featured .l-pricing-cta[aria-disabled="true"] {
4474+
background: var(--accent);
4475+
color: var(--accent-fg);
44454476
opacity: 0.65;
44464477
}
44474478
.l-pricing-card.is-featured .l-pricing-badge {
4448-
background: var(--bg-page);
4449-
color: var(--accent);
4479+
background: var(--accent);
4480+
color: var(--accent-fg);
44504481
}
44514482

44524483
/* Mobile: stack to one column, drop the featured card's translateY so

frontend/src/components/landing-page.tsx

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,15 +1181,28 @@ function PricingSection({
11811181
<span className="num">${tier.price}</span>
11821182
<span className="per">/month</span>
11831183
</p>
1184+
{/* Chrome 148+ in dark color-scheme refuses to honor
1185+
background-color on <button> elements — even hex !important
1186+
gets clobbered to the system "ButtonFace" dark gray. We
1187+
side-step the bug by rendering an <a role="button"> for
1188+
primary CTAs too; anchors respect CSS normally. The
1189+
onClick still triggers the auth handoff, just without
1190+
the native <button> semantics. */}
11841191
{tier.ctaKind === "primary" ? (
1185-
<button
1192+
<a
11861193
className="l-pricing-cta"
1187-
disabled={primaryDisabled}
1188-
onClick={onPrimaryCta}
1189-
type="button"
1194+
role="button"
1195+
href="#"
1196+
tabIndex={primaryDisabled ? -1 : 0}
1197+
aria-disabled={primaryDisabled || undefined}
1198+
onClick={(event) => {
1199+
event.preventDefault();
1200+
if (primaryDisabled) return;
1201+
onPrimaryCta();
1202+
}}
11901203
>
11911204
{tier.ctaLabel}
1192-
</button>
1205+
</a>
11931206
) : (
11941207
<a className="l-pricing-cta" href={tier.ctaHref}>
11951208
{tier.ctaLabel}

0 commit comments

Comments
 (0)