feat(send): give the zero fee the prominence it earns (#561) - #709
Merged
Conversation
bobodread876
pushed a commit
that referenced
this pull request
Aug 24, 2026
…ll raw translations Review fix for PR #709: the dead feeLabel key was removed from the source dictionary in round 1, but no locale sync exists to drop it from the 23 raw translation JSONs (check-translation-drift only flags missing keys, never extras), so the stale key would persist and could silently resurrect as mistranslations if feeLabel were ever reintroduced with a different meaning. The JSON round-trip also dedupes a pre-existing exact-duplicate TopUpAmountScreen allowanceExhausted key (identical value in both occurrences of every file), which is semantics-preserving. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NEoz7nBtdtsHyuYG5wNPQV
Lori's app-audit P1: the fee row carried the same visual weight as every other data row, on the screen where Flash's zero fee IS the product moment — a transfer that costs J$1,500-2,000 through a typical remittance service costs nothing here. The row now reads 'Flash fee', the value renders in the theme's green, bold, and a small gray line underneath says 'Typical remittance services charge J$1,500-2,000 for this.' Copy chosen with Jabari: the comparison lands without naming a competitor in-app (brand rule: no punching). THE INTEGRATION DECISION, pinned by a property test: celebration and the fee-from-amount disclosure (#694) are mutually exclusive by construction. shouldCelebrateZeroFee fires only on a settled zero that shouldDiscloseFeeFromAmount has nothing to say about — a row that says '$0.00, we're proud of it' directly above 'the network fee is deducted from the amount' would be the app contradicting itself on a money screen. The test sweeps every paymentType x currency combination and asserts both never fire together. Color note: #561 asked for #3ab54a, which is not in the theme palette; uses colors.green (defined for light AND dark) rather than hardcoding an off-theme hex. One-line palette add if the exact brand hex is wanted. i18n at the source, 23 locales filled (es translated), drift green. Based on fix/fee-from-amount-disclosure — merges after #708. 88 suites / 884 tests green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NEoz7nBtdtsHyuYG5wNPQV
…bel, revert drive-by churn - send-confirmation.spec.tsx: assert the rendered celebration (green fee + 'Zero Fee Comparison' with the real copy) on the Intraledger story, and that an external-USD probed zero renders the fee-from-amount caveat with no celebration — pinning the ConfirmationWalletFee wiring the predicate unit tests cannot see (both cases verified to fail under a wired-wrong component) - i18n: delete the now-dead SendBitcoinConfirmationScreen.feeLabel from the source dictionary and regenerate types; stale key in translation files is dropped by the locale sync - revert unrelated style refactors in ConfirmationError.tsx and DetailDestination.tsx to keep the PR surface at #561 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NEoz7nBtdtsHyuYG5wNPQV
…ll raw translations Review fix for PR #709: the dead feeLabel key was removed from the source dictionary in round 1, but no locale sync exists to drop it from the 23 raw translation JSONs (check-translation-drift only flags missing keys, never extras), so the stale key would persist and could silently resurrect as mistranslations if feeLabel were ever reintroduced with a different meaning. The JSON round-trip also dedupes a pre-existing exact-duplicate TopUpAmountScreen allowanceExhausted key (identical value in both occurrences of every file), which is semantics-preserving. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NEoz7nBtdtsHyuYG5wNPQV
islandbitcoin
force-pushed
the
feat/fee-row-prominence
branch
from
August 24, 2026 23:33
85c2cc3 to
378e8dc
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #561 (Lori's app-audit P1). Based on
fix/fee-from-amount-disclosure— merges after #708, because the two features share the fee row and must agree.What changes
Fee— same weight as every rowFlash fee— value in theme green, boldCopy decided with Jabari: the comparison lands without naming a competitor in-app (brand rule).
The integration decision, pinned by a property test
Celebration and #708's fee-from-amount disclosure are mutually exclusive by construction.
shouldCelebrateZeroFeefires only on a settled zero thatshouldDiscloseFeeFromAmounthas nothing to say about. A row that says "$0.00, we're proud of it" directly above "the network fee is deducted from the amount" would be the app contradicting itself on a money screen. The test sweeps everypaymentType × currencycombination and asserts both predicates never fire together — so a future edit to either can't silently reintroduce the contradiction.Concretely: intraledger sends and Flash-to-Flash lightning (payee-node suppressed) celebrate; an external USD send with a probed zero shows the caveat, never the green.
Color note
#561 asked for
#3ab54a, which isn't in the theme. This usescolors.green(defined for light and dark) rather than hardcoding an off-theme hex — a one-line palette addition if the exact brand hex is wanted, and I'd rather that be a deliberate design call.i18n
Two keys at the source, types regenerated, all 23 locales filled (Spanish translated: "Los servicios de remesas típicos cobran J$1,500–2,000 por esto."), drift check green.
88 suites / 884 tests.