V3 pricing flow: blue-600 → dealops-primary
Replace hardcoded Tailwind blue-* classes with brand dealops-primary tokens across the rep-facing Select Products page so CTAs and selection states match the rest of the product.
blue-600/700 Tailwind classes for the brand dealops-primary token, matching DealopsButton.
PricingFlowV3.
1. Why this exists
PricingFlowV3 is the current rep-facing pricing UI. Several primitive components inside its Select Products page were styled with raw Tailwind bg-blue-600 / text-blue-600 utilities rather than the brand token used everywhere else (dealops-primary, which DealopsButton already consumes). That meant the Continue button, the active Use Case pill, and the modal link CTA rendered in a different blue from the surrounding chrome.
This PR is a straight token swap — no behavior changes, no new props.
2. Before / after
Swatches above approximate the Tailwind defaults (blue-600 ≈ #2563eb) and the dealops brand indigo. Exact dealops-primary value comes from the consuming theme config; the point is they are different, and the V3 page was using the wrong one.
3. Files touched
- page apps/client/src/dashboard/PricingFlowV3/components/ProductSelectionPage.tsx +1 / −1
- primitive apps/client/src/dashboard/PricingFlowV3/components/primitives/FacetBar.tsx +1 / −1
- primitive apps/client/src/dashboard/PricingFlowV3/components/primitives/SectionFacetBar.tsx +1 / −1
- primitive apps/client/src/dashboard/PricingFlowV3/components/primitives/UseCaseSelector.tsx +28 / −28
- section apps/client/src/dashboard/PricingFlowV3/components/sections/ModalSectionTrigger.tsx +2 / −2
4. The token swap, by file
| Component | Before | After |
|---|---|---|
ProductSelectionPageContinue / Finish button |
bg-blue-600 ... hover:bg-blue-700 |
bg-dealops-primary ... hover:bg-dealops-primary/90 |
FacetBarActive facet chip |
border-blue-600 bg-blue-600 text-white |
border-dealops-primary bg-dealops-primary text-dealops-primaryForeground |
SectionFacetBarSection-scoped facet chip |
border-blue-600 bg-blue-600 text-white |
border-dealops-primary bg-dealops-primary text-dealops-primaryForeground |
ModalSectionTriggerLink trigger + modal Confirm |
text-blue-600 hover:text-blue-700bg-blue-600 hover:bg-blue-700 |
text-dealops-primary hover:text-dealops-primary/90bg-dealops-primary hover:bg-dealops-primary/90 |
5. The one outlier: UseCaseSelector
Four of the five files are pure className swaps. UseCaseSelector.tsx is the exception: +28 / −28 reflects a small structural rewrite, not just a color change. The use-case picker was reshaped from a row of pill buttons + manual "clear" button into a Shadcn Select dropdown.
A horizontal flex-wrap row of <button> pills, one per use case. Active pill rendered in blue-600. A separate "clear" pill appeared when something was selected.
{values.map((v) => (
<button onClick={() => select(isOn ? null : v)}
className={isOn
? 'border-blue-600 bg-blue-600 text-white'
: 'border-gray-300 bg-white ...'}>
{v}
</button>
))}
{current ? <button>clear</button> : null}
A single <Select> with a 300px trigger. A sentinel value __all__ represents "no use case selected", since Radix Select rejects empty-string values.
<Select value={current ?? ALL_USE_CASES}
onValueChange={(val) =>
select(val === ALL_USE_CASES ? null : val)}>
<SelectTrigger className="w-[300px]">
<SelectValue placeholder="Select use case" />
</SelectTrigger>
<SelectContent>
<SelectItem value={ALL_USE_CASES}>All use cases</SelectItem>
{values.map((v) => (
<SelectItem key={v} value={v}>{v}</SelectItem>
))}
</SelectContent>
</Select>
UseCaseSelector also changes the control type (pill row → dropdown). That's a UX change worth flagging — long use-case lists no longer wrap; the user has to open a menu. Worth confirming this was intentional and not accidentally bundled into a styling PR.
6. What it doesn't change
- No tRPC routes, no API contracts, no Prisma changes.
- No changes to
PricingFlowV2or any Dealops 1 code path. productMatchesUseCase/ filter logic inUseCaseSelectoris untouched — only the rendered control changes.- No theme config changes;
dealops-primaryanddealops-primaryForegroundare existing Tailwind tokens already consumed byDealopsButton. - No tests added or modified.