Skip to content

feat: icon bubble colours follow one rule (TASK-22761) - #3457

Closed
kushagrasarathe wants to merge 20 commits into
devfrom
feat/icon-bubble-colours-22761
Closed

kushagrasarathe wants to merge 20 commits into
devfrom
feat/icon-bubble-colours-22761

Conversation

@kushagrasarathe

@kushagrasarathe kushagrasarathe commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Icon bubble colours meant different things on different screens: yellow was both "Peanut's own" and "needs attention", pink was ActionModal's silent default, and link rows swapped their icon for a check or a clock. This PR gives every bubble colour one meaning and applies it across the app. The definition was approved by Kush (TASK-22761) and now lives on /dev/ds/primitives/icon-bubble.

Task

TASK-22761

The rule

Colour Means Use for Never for
green done success screens, completed steps, success toasts a concept
yellow waiting or needs you pending, processing, loading, warnings, confirms, permissions a concept
red failed or blocked failed txns, errors, blocked flows, destructive confirms, error empty states something that resolves by waiting
blue a method, an identity object or plain information bank, crypto, exchange, QR, links, add money, withdraw, Pix key, verification, identity doc, security, support, info, help a state
pink (brand) Peanut's own Peanut user, friends, profile, invite, card, rewards (star), badges, points, balance, notifications, app install an error or warning; an implicit default
gray inactive not available, cancelled/refunded history, empty results, nothing selected, region restricted pending

Mixed lists (activity rows, receipt head, Unlock payments, identity verification): icon = the concept, colour = the state. Done or active = the concept colour, pending/processing = yellow, failed = red, cancelled/refunded/not available = gray.

What changed

  • Concept map (0_Bruddle/conceptIcons.tsx): peanutUser, friends, card, rewards, badges move to pink (brand). Rewards uses the points star instead of the trophy. New STATE_BUBBLE_COLORS + conceptBubbleFor(concept, status) carry the mixed-list rule in one place.
  • IconBubble: the unused logo colour is removed; each colour's meaning is documented in JSDoc.
  • ActionModal tone: new brand tone. tone is required by the type whenever an icon renders (discriminated props). The silent bg-action-primary default is gone. All product callers name a tone; raw iconContainerClassName bg overrides are removed.
  • EmptyState errors: failed-to-load states are red (home, history, rewards, invites, contacts, direct request, limits, recover funds). Empty stays gray.
  • Activity rows (TransactionAvatarBadge): LINK_STATE_BUBBLES is replaced by the state rule for every concept row (link, request, crypto, bank, QR, card). A statusless open request reads as pending. Flags, merchant logos and user avatars are unchanged.
  • KYC: the identity verification row and the KYC drawer head colour the badge by state (blue verified, yellow in review, red failed, gray region restricted).
  • Unlock payments: active/always-on/unlock rows take the concept colour (QR, Pix, crypto blue; P2P, card pink), processing/attention yellow, not available gray.
  • Rewards star: PerkIcon is now the rewards IconBubble (pink, star) at s/m/l; the off-scale 40px size is gone.
  • Avatar fallback: an external address or wallet counterparty is the crypto concept (coins on blue) instead of a wallet on yellow (activity, UserCard, ContributorCard, PeanutActionDetailsCard). A flag that fails to load falls back to a real bank IconBubble (AvatarWithBadge.fallback now takes a node).
  • Dev page: /dev/ds/primitives/icon-bubble documents when to use a bubble, the six colours, state icons, concepts, per-surface rules and current usage per colour. /dev/ds/patterns/modal documents the brand tone and the required tone.

Per-site changes (47 spec rows; file:line is on the base branch, icon is today's)

Design notes / accepted trade-offs

  • This PR overrides the 2026-09-17 "link row" ruling in mono design/design.md (link rows take icon and colour from the link state). Link rows now keep the link icon and only the colour follows the state. The mono PR updates design.md.
  • The state map lives in conceptIcons.tsx, not in TransactionAvatarBadge.tsx, because the KYC row reads it too. TransactionCard and TransactionDetailsHeaderCard still both read it through TransactionAvatarBadge, so the two surfaces cannot drift.
  • QR pay KYC gate / provider rejection: when there is no method logo, the modal now shows the QR concept icon on blue / the error glyph on red. Before, it showed no bubble, which a required tone no longer allows.
  • PerkIcon small (40px) maps to s (32px) on the perk receipt banner.
  • Four pixel-identical bubbles (camera permission, passkey help, public profile, early user) move from a raw bg class to the color prop.
  • Out of scope, not changed: the home carousel CTAs (useHomeCarouselCTAs, dev/home-ctas) still set bubble colours through iconContainerClassName; they were not in the audit.

Risks

  • UI only, no API or data change. No cross-repo impact.
  • ActionModal props are now a discriminated union: any new caller that passes icon without tone fails typecheck (intended).
  • AvatarWithBadge.fallback changed shape (object -> node). Both callers are migrated.

QA

  • Activity: a request link in each state (pending, completed, cancelled, failed) shows the link glyph on yellow / blue / gray / red. A card spend without a merchant logo is a pink card; a pending one yellow.
  • Home: send drawer "Send to friends" is pink; activation CTA verify/deposit/QR steps blue, card step pink; getting-started checklist card + account pink, money steps blue.
  • Unlock payments: P2P and card pink, crypto/QR/Pix blue when active, yellow while processing, gray when not available.
  • Any modal with an icon shows a meaningful colour; none falls back to pink by default.
  • ds-lint ratchet: no metric increased (bareListLeading 18 = 18). eslint on changed files: 7 warnings, same as base.

Screenshots

375×667, headless Chromium, next dev --webpack. Before = origin/dev (140e604), after = this PR head (08bae36). Each image: before on the left, after on the right. "fixture" = ?__fixture=<name> with no backend; "surface" = /dev/surfaces gallery. The activity and receipt rows use a capture-only fixture built from TransactionDetails/__tests__/fixtures/render-baseline.json entries; it was not committed.

CI visual diff for all fixtures at 4 widths: ds-shots comment.

Note: origin/dev does not yet have the one-accordion PR (ui#3455) that this branch includes, so an accordion row can differ in a pair. Bubble colours are the change under review.

Screen Before → After What changed
Home activity (fixture) Link and request rows keep the link glyph; colour is the state (pending yellow, failed red, cancelled gray). Card CTA bubble yellow → pink.
Activity list, every row type (fixture) Concept rows take the state colour: card pink when done, yellow pending, red failed; failed crypto withdraw red; reward star green → pink.
Receipt head, pending link (fixture) Gray clock → link glyph on yellow.
Receipt head, failed link (fixture) Red alert → link glyph on red.
Receipt head, card spend without logo (fixture) Card bubble yellow → pink.
Receipt head, perk reward (fixture) PerkIcon is now the rewards IconBubble: green → pink star.
Home > Send drawer (fixture) Send to friends yellow → pink.
Send picker (fixture) Peanut user yellow → pink.
History error (fixture) Failed-to-load empty state gray → red.
Limits error (fixture) Failed-to-load empty state gray → red.
Accounts and payments / Unlock payments (fixture) Card yellow → pink; QR and Pix green → blue.
Accounts and payments, verification needed (fixture)
Same row rule with rails in processing and unlock states.
Get paid, claim account (fixture) Info rows gray → blue.
Activation steps + getting-started checklist (/dev/home-ctas)
Checklist and activation steps: yellow/pink → pink for Peanut-own steps, blue for money steps.
KYC failed modal (surface) Alert yellow → red.
KYC region restricted modal (surface) Globe pink → gray.
KYC advisory modal (surface) Badge pink → blue.
Unlock method modal (surface) Shield pink → blue.
KYC provide email (surface) ID icon pink → blue.
Bridge terms step (surface) Badge pink → blue.
Passkey info drawer (surface) Lock pink → blue.
Backup FAQ drawer (surface) Info pink → blue.
Balance warning drawer (surface) Wallet pink → yellow.
Unsupported browser modal (surface) Alert pink → yellow.
Residence change drawer (surface) Globe pink → blue.
/dev/ds/primitives/icon-bubble (full page, 6 slices)




The definition: six colours, state icons, concepts, per-surface rules, current usage per colour.
/dev/ds/patterns/modal (full page, 3 slices)

Brand tone and the required tone.

Checked, no visible change (pixel-identical or expected unchanged): KYC start, KYC processing, KYC in progress, KYC status drawer, invite friends (pink stays pink, now via brand tone), guest sign-in, early user, setup notifications, scan to download, camera permission, add money list, withdraw list, Send > Contacts (avatars, no bubble), empty-state gallery, rewards, limits page (fixture has no card row).

Not captured: post-signup check (#141), QR pay KYC gate / provider rejection (#50–52), crypto withdraw warning (#78), already-claimed view (#43), card re-enable (#121, gallery blocks it) and auto-balance banner (#122), corridor gate drawer (#84), Sumsub / iframe help (#111/112), pot "use Peanut balance" (#40), rewards/invites/contacts/direct-request/recover-funds error states, limits card row (#125), avatar fallback on UserCard / ContributorCard / PeanutActionDetailsCard. Each needs provider or backend state that no fixture or gallery entry serves; the sandbox API was not started.

The pr-assets-3457 branch holds these images only. It is deleted after merge.

🤖 Generated with Claude Code

Product surfaces fold content open four different ways today: the radix
Accordion, ListItem rows with a hand-rolled chevron and useState, the receipt's
underlined toggle (no aria-expanded), and the residence text link. Kush wants
one component for one job, so this extends 0_Bruddle/Accordion with what the
others need (ListItem row trigger, flush and kept-mounted content, ListGroup
position, a link variant) and adds /dev/accordion, which renders each real
surface before and after so the design owner can decide before any screen is
migrated. Existing Accordion call sites render unchanged; no product screen
uses the new props yet.
Kush ruled the country rows on add money and withdraw are their own card with the list a separate card below; the bordered item would wrap both, so the trigger carries the border instead. Radix's h3 header put a stray heading into pages like the setup residence step, where a row or in-card toggle is not a section heading. The offScaleSpacing baseline rises by the flush content's 1px border overlap (-mx-px -mb-px), which is geometry, not rhythm.
…oggle

One disclosure component for every product collapsible (TASK-23071). A search still opens the list and hides the row, as before.
Deletes the useState, rotating chevron and aria-expanded wiring. Other countries becomes its own card with the list below it, matching add money (kush, 2026-09-25). The shared-currency branch has no live currency today but stays, now tested with an appended currency.
Both were raw buttons with their own toggle state; the receipt one had no aria-expanded. Closing the residence toggle still clears the stored second pick, now in onValueChange.
Every disclosure row is an Accordion trigger now, which sets it itself.
… 2px border

The 2px border pushed the tile's content 1px on select (QA-42). An inset ring takes no layout; bare ring is redefined in globals.css, so inset-ring.
Other countries wrapped to two lines, and the add money body said "your". Both now read Pick a country in every locale; es-AR inherits the withdraw key from es-419.
… DS page

The proposal shipped, so its before/after page goes; the DS accordion page now shows the row-in-group, detached and link variants with the real list.
Inheriting es-419's "Elige un país" put two voices on one English string; the duplicate-value drift test flags it.
The -mx-px -mb-px on flush content is border-overlay geometry, the same
category as the tabs chip weld, so the ratchet log records it. TASK-23071
A bubble's colour now answers one question. Concepts are blue (a method,
an identity object, information) or pink (Peanut's own: the Peanut user,
friends, card, rewards, badges); yellow was doing double duty as both
'Peanut's own' and 'needs attention'. Rewards trades the trophy
placeholder for the points star, and PerkIcon becomes that same rewards
bubble on the s/m/l scale instead of a green circle with an off-scale 40px
size. STATE_BUBBLE_COLORS carries the mixed-list rule (icon = concept,
colour = state) so every surface reads it from one place. The unused
logo colour is gone.
Half the modals picked their bubble colour through a raw class, and the
rest fell through to pink, so pink meant nothing. tone is now required by
the type whenever an icon renders, a brand tone covers Peanut's own
moments, and every caller names its tone per the colour spec. Raw bg
iconContainerClassName overrides are gone from product callers.
…2761)

The link-state map drew a check or a clock instead of the thing the row
is, and only link rows carried state at all. Every concept bubble in
activity (link, request, crypto, bank, QR, card) now keeps its concept
glyph and takes yellow while pending, red when failed, gray when
cancelled or refunded, its own colour when done. The identity
verification row and drawer head follow the same rule. External address
and wallet counterparties read as the crypto concept instead of a wallet
on yellow, and a flag that fails to load falls back to a real bank
IconBubble.
…TASK-22761)

Active rows were green and processing rows blue, so the same method
changed colour with its status in a way no other list did. Available
and unlockable rows now show their concept colour (QR, Pix, crypto blue;
P2P and card pink), waiting is yellow, not available is gray.
… used (TASK-22761)

The showcase said yellow was for warnings while half the app used it for
Peanut's own things. It now states the six colours with what each means,
what to use it for and what never, the state glyphs, the per-surface
rules, and a current-usage list per colour, and drops the logo colour
from the props table.
The remaining audited call sites: the home activation CTAs and the
getting-started checklist (card pink, verify and money moves blue),
receipt more actions, claim account and residence change (blue), corridor
gate (review yellow, support blue), additional verification pending
(yellow), KYC failed (red), region restricted (gray), unlock method,
backup FAQ, passkey info and already claimed (blue), the balance warning
(yellow). Error empty states turn red so failed-to-load no longer reads
like nothing-here. Four same-pixel bubbles move off raw bg classes onto
the colour prop.
@notion-workspace

Copy link
Copy Markdown

@vercel

vercel Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
peanut-wallet Ready Ready Preview Sep 25, 2026 10:38am UTC

Request Review

@coderabbitai

coderabbitai Bot commented Sep 25, 2026

Copy link
Copy Markdown
Contributor

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

…rs-22761

# Conflicts:
#	src/components/0_Bruddle/Accordion.tsx
#	src/components/0_Bruddle/__tests__/Accordion.test.tsx
@kushagrasarathe
kushagrasarathe changed the base branch from feat/one-accordion-23071 to dev September 25, 2026 10:32
@github-actions

Copy link
Copy Markdown
Contributor

Code-analysis diff

Painscore total: 8870.53 → 8876.39 (+5.86)
Findings: 0 net (+118 new, -118 resolved)

🆕 New findings (118)

  • critical complexity — src/app/(mobile-ui)/withdraw/crypto/page.tsx — CC 166, MI 49.06, SLOC 664
  • critical complexity — src/components/Profile/views/UnlockPayments.view.tsx — CC 145, MI 58.86, SLOC 465
  • critical complexity — src/components/Home/ActivationCTAs.tsx — CC 97, MI 55.26, SLOC 326
  • critical complexity — src/components/Global/PeanutActionDetailsCard/index.tsx — CC 87, MI 54.61, SLOC 119
  • critical complexity — src/components/TransactionDetails/TransactionCard.tsx — CC 72, MI 51.07, SLOC 148
  • critical complexity — src/app/(mobile-ui)/recover-funds/page.tsx — CC 50, MI 54.21, SLOC 219
  • high hotspot — src/app/(mobile-ui)/withdraw/crypto/page.tsx — 84 commits, +1172/-521 lines since 6 months ago
  • high hotspot — src/components/TransactionDetails/TransactionDetailsReceipt.tsx — 83 commits, +981/-2246 lines since 6 months ago
  • high hotspot — src/components/Profile/views/UnlockPayments.view.tsx — 73 commits, +1924/-1169 lines since 6 months ago
  • high hotspot — src/components/Home/ActivationCTAs.tsx — 65 commits, +992/-451 lines since 6 months ago
  • high hotspot — src/components/TransactionDetails/TransactionCard.tsx — 61 commits, +532/-447 lines since 6 months ago
  • high hotspot — src/features/deposit-accounts/components/DepositAccountsListScreen.tsx — 53 commits, +1660/-1456 lines since 6 months ago
  • high hotspot — src/components/Setup/Views/Residence.tsx — 51 commits, +970/-461 lines since 6 months ago
  • high complexity — src/components/Global/IframeWrapper/index.tsx — CC 41, MI 65.34, SLOC 170
  • high complexity — src/components/Migration/MigrationDownloadModal.tsx — CC 36, MI 53.94, SLOC 90
  • high complexity — src/components/Profile/views/ResidenceChangeDrawer.tsx — CC 34, MI 58.46, SLOC 87
  • high complexity — src/features/rewards/RewardsPage.tsx — CC 34, MI 59.91, SLOC 126
  • high complexity — src/components/Global/ActionModal/index.tsx — CC 33, MI 57.04, SLOC 54
  • high complexity — src/components/TransactionDetails/TransactionAvatarBadge.tsx — CC 28, MI 49.09, SLOC 77
  • high complexity — src/components/0_Bruddle/conceptIcons.tsx — CC 4, MI 49.94, SLOC 60

…and 98 more.

✅ Resolved (118)

  • src/app/(mobile-ui)/withdraw/crypto/page.tsx — CC 166, MI 49.05, SLOC 664
  • src/components/Profile/views/UnlockPayments.view.tsx — CC 146, MI 59.01, SLOC 458
  • src/components/Home/ActivationCTAs.tsx — CC 97, MI 55.31, SLOC 325
  • src/components/Global/PeanutActionDetailsCard/index.tsx — CC 86, MI 54.45, SLOC 121
  • src/components/TransactionDetails/TransactionCard.tsx — CC 72, MI 51.08, SLOC 148
  • src/app/(mobile-ui)/withdraw/crypto/page.tsx — 83 commits, +1171/-521 lines since 6 months ago
  • src/components/TransactionDetails/TransactionDetailsReceipt.tsx — 82 commits, +980/-2245 lines since 6 months ago
  • src/components/Profile/views/UnlockPayments.view.tsx — 72 commits, +1910/-1158 lines since 6 months ago
  • src/components/Home/ActivationCTAs.tsx — 64 commits, +981/-442 lines since 6 months ago
  • src/components/TransactionDetails/TransactionCard.tsx — 60 commits, +531/-446 lines since 6 months ago
  • src/features/deposit-accounts/components/DepositAccountsListScreen.tsx — 52 commits, +1625/-1423 lines since 6 months ago
  • src/components/Setup/Views/Residence.tsx — 50 commits, +947/-434 lines since 6 months ago
  • src/app/(mobile-ui)/recover-funds/page.tsx — CC 49, MI 54.22, SLOC 219
  • src/components/Global/IframeWrapper/index.tsx — CC 41, MI 65.36, SLOC 170
  • src/components/Migration/MigrationDownloadModal.tsx — CC 36, MI 53.93, SLOC 90
  • src/components/Global/ActionModal/index.tsx — CC 34, MI 57.05, SLOC 54
  • src/components/Profile/views/ResidenceChangeDrawer.tsx — CC 34, MI 58.47, SLOC 87
  • src/components/TransactionDetails/TransactionAvatarBadge.tsx — CC 34, MI 44.51, SLOC 107
  • src/features/rewards/RewardsPage.tsx — CC 34, MI 59.92, SLOC 126
  • src/components/TransactionDetails/TransactionAvatarBadge.tsx:72 — CC 32 SLOC 85

…and 98 more.

📈 Painscore deltas (top movers)

File Before After Δ
src/app/(mobile-ui)/dev/ds/primitives/icon-bubble/page.tsx 4.6 5.9 +1.3
src/components/Kyc/KYCStatusIcon.tsx 1.4 2.3 +0.9
src/components/TransactionDetails/TransactionAvatarBadge.tsx 9.8 9.1 -0.8
src/components/TransactionDetails/PerkIcon.tsx 4.2 1.9 -2.3

@github-actions

Copy link
Copy Markdown
Contributor

🧪 UI test report — ✅ all green

Suites

  • ✅ unit: 10028 ran, 0 failed, 0 skipped, 3.5m

📊 Coverage (unit)

metric %
statements 82.3%
branches 71.9%
functions 77.6%
lines 83.5%
⏱ 10 slowest test cases
time test
🐢 9.0s src/app/(mobile-ui)/qr-pay/__tests__/qr-pay-states.test.tsx › Network failure keeps loading while retries remain, then shows the generic error
4.1s src/components/Card/share-asset/__tests__/shareAssetLayout.test.ts › never places two stickers in heavy overlap (broad seed sweep)
4.0s src/app/(mobile-ui)/qr-pay/__tests__/qr-pay-states.test.tsx › MANTECA_SOURCE_OVER_MONTHLY_CAP fails fast with copy that names the real cause
4.0s src/app/(mobile-ui)/qr-pay/__tests__/qr-pay-states.test.tsx › MANTECA_MERCHANT_RECENT_REFUND fails fast with copy that names the real cause
4.0s src/app/(mobile-ui)/qr-pay/__tests__/qr-pay-states.test.tsx › MANTECA_USER_NOT_PROVISIONED fails fast with copy that names the real cause
4.0s src/app/(mobile-ui)/qr-pay/__tests__/qr-pay-states.test.tsx › MANTECA_MERCHANT_VOLUME_NEAR_CAP fails fast with copy that names the real cause
4.0s src/app/(mobile-ui)/qr-pay/__tests__/qr-pay-states.test.tsx › routes the KYC rejection on its wire code, and does not retry it
4.0s src/app/(mobile-ui)/qr-pay/__tests__/qr-pay-states.test.tsx › User KYC not approved fails fast with copy that names the real cause
4.0s src/app/(mobile-ui)/qr-pay/__tests__/qr-pay-states.test.tsx › a refused idempotency key tells the user to scan again, not to contact support
3.0s src/app/(mobile-ui)/qr-pay/__tests__/qr-pay-states.test.tsx › Going offline blames the connection, and reconnecting clears it for the recovered scan
📍 Inline annotations are in the **Unit test report** check above. Coverage artifact: `coverage-unit`. Generated by `.github/workflows/tests.yml`.

@kushagrasarathe

Copy link
Copy Markdown
Contributor Author

/chip review

@chip-peanut-bot chip-peanut-bot Bot left a comment

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.

Chip review — no blocking findings — this is not an approval

The icon-color refactor is largely consistent, but it reverts two gate-drawer QA decisions already present on dev.

Findings

  • MAJOR · src/features/deposit-accounts/components/CorridorGateDrawer.tsx:183 · Keep the selected currency in account-gate titles
    For a pending-review, wait, or support gate on EUR, the heading is now generic (for example, “We are setting this up”) and the corridor appears only in a caption below the buttons. Base commit 167d013 explicitly removed that caption and required the selected currency in these headings; this head also deletes those regression assertions. Restore the currency-specific title copy/interpolation and remove the post-button rail caption, keeping the base tests.

  • MINOR · src/components/Kyc/modals/KycProcessingModal.tsx:78 · Keep support as the tertiary escape after a primary action
    When verification is stale and can resume, Contact support is now a full-width secondary button beside Continue verification. The base-branch QA change deliberately made it a tertiary link below the primary action; the same reversal occurs in the failed Unlock payments retry and account-limit drawer, with the old assertions removed. Preserve the base support-link hierarchy while applying the icon-color changes.

Inline anchors unavailable for 2 finding(s); the findings remain in this summary.

Checked clean

  • Pinned head and base verified; reviewed the changed icon/state mapping and affected callers.
  • Unit, typecheck, lint, format, and aggregate CI checks succeeded at this head; visual capture jobs were still running.
  • No new security, privacy, money, or API surface in the diff.

Security review by moonshotai/kimi-k3: 0 finding(s), marked with the model name. It reads the diff only and answers only security, privacy and money, so treat its findings as advice.

Third opinion: did not run — claude-api_error. This review is one reviewer short.

Exact head: 08bae3623bb4 · Context: repo · Took 8m

@github-actions

Copy link
Copy Markdown
Contributor

English · Español · Español (Argentina) · Português (Brasil)

Open screen library dashboard

Review preview: 92eb273 → 08bae36. Capture complete in all locales.

@github-actions

Copy link
Copy Markdown
Contributor

🖼 Visual diff — 16 screens moved

29 of 164 shots changed · 135 identical · baseline 167d013 → head 08bae36

worst % screen widths
69.73% early-user 320, 430
51.83% avatar-picker 320, 430
1.58% guest-invite 320, 430
0.84% card-access 320, 430
0.84% empty-home 320, 430
0.84% home-avatar 320, 430
0.84% home 320, 430
0.60% get-paid-claim 320, 430
0.55% get-paid-claim-eur 320, 430
0.38% home-verification-needed 430
0.35% error-history 320, 430
0.35% error-limits 320, 430
0.34% home-send-drawer 320, 430
0.28% send 320, 430
0.03% identity-awaiting-upload 430
0.03% unverified 430

job summary · before/after/diff images — artifact

Fixture screenshots, no backend. Advisory — this check never blocks a merge. Posted from the default branch by ds-shots-comment.yml; the report it renders is untrusted data.

@Hugo0

Hugo0 commented Sep 25, 2026

Copy link
Copy Markdown
Contributor

Closing in favour of #3456 (merged as 9b7a2b1). Thanks Kush, a lot of this lives on there, credited to you and TASK-22761.

Taken from this PR:

  • ActionModal: an icon needs a tone or a concept, so there is no silent pink default.
  • Failed-to-load empty states are red.
  • An address counterparty shows the crypto bubble, and a flag that fails to load falls back to the bank bubble.
  • IconBubble: the unused logo colour is gone and each colour is documented.
  • The /dev/ds icon-bubble and modal pages.
  • Your per-site consistency fixes where they agree with the rule below.

Different, on Hugo's call (2026-09-25):

  • QR is brand pink, like the nav button, not blue.
  • Rewards is the star on yellow.
  • Peanut's own (card, friends, badges) stays yellow; your brand tone became a yellow peanut tone.
  • A concept's colour never follows status: the badge says the status. So the "mixed lists: colour = state" rule (STATE_BUBBLE_COLORS / conceptBubbleFor) did not go in. Status-coloured rows are what made the QR green in Accounts and payments.

Six open design calls are listed in the #3456 body; they're yours when you have a minute.

@Hugo0 Hugo0 closed this Sep 25, 2026

This branch was successfully deployed

1 active deployment
Preview — 08bae362 Deployed Sep 25, 2026 by vercel[bot]
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.

2 participants