UX: Bridge button stays enabled and receive quote still displays across invalid form states #119
Labels
No labels
agent:implement
agent:ready
backend
bug
cannot-reproduce
confirmed
desktop
docs
documentation
duplicate
enhancement
feature
frontend
good first issue
help wanted
high-risk
in-review
invalid
mobile
needs-triage
P0-critical
P1-high
P2-medium
P3-low
qa
QA
question
ready
report
responsive
security
security-escalate
smart-contract
solana
tablet
test-pass
ux
wallet-issue
wallet:keplr
wallet:metamask
wallet:station
wallet:walletconnect
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
code/cl8y-bridge-monorepo#119
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found during Bridge #116 E2E walkthrough — grouped findings for form validation and CTA-enable state.
Summary
The 'BRIDGE ...' CTA button remains visually active and clickable across multiple invalid form states. Additionally, 'YOU WILL RECEIVE' continues to calculate and display values during invalid states, creating a misleading impression that the transfer is ready to submit.
Findings
1. CTA stays active across invalid states
Observed in live mainnet walkthrough on https://bridge.cl8y.com/ (v0.1.82,
8efb987):The CTA 'disabled' state appears absent or visually identical to enabled across all these paths.
2. YOU WILL RECEIVE calculates during invalid states
3. MAX button produces over-limit error
4. Over-precision decimal input unclear visual state
5. MIN button value fails HTML5 step validation
stepattribute is too coarse for its own MIN value — form validates its own MIN value as invalid.Why this matters
Users can click Bridge with invalid amounts/recipients and:
Proposed fix scope
stepattribute to token's actual decimals, or drop it and rely on JS validationScreenshots
Attached via web UI — states covered: over-balance, under-min, invalid EVM address, short EVM address, empty recipient, MAX-overshoot, over-precision input, MIN+step-conflict.
cc @PlasticDigits
mentioned in issue #116
mentioned in commit
11cb57a4dementioned in commit
8e0c040ee2GL-119 fix merged to
main(8e0c040)@brouie Please verify on staging / production when convenient — issue left open per request.
What changed
recipient.trim()only. Empty field + connected wallet no longer enables submit; users must type an address or Autofill.step:step=\any\on the amount input so HTML5 stepping does not reject token-accurate MIN values.parseAmount).Docs / agent cross-links
docs/FRONTEND_BRIDGE_INVARIANTS.md(merged with GL-118 cross-links).skills/agent-bridge-recipient-validation.mdupdated for INV-UX1 + GL-119.packages/frontend/src/utils/amountInputLimits.ts; tests inamountInputLimits.test.ts+TransferForm.test.tsx.Verification checklist
stepvalidation popup on the amount field.npm run test:unitinpackages/frontendpasses (610 tests on the merge machine).Thanks!
@PlasticDigits verified on the live fix — 4 of 5 findings confirmed resolved:
Bonus: the chain-specific helper text on invalid recipients is a strong touch — users get actionable guidance instead of generic error.
Remaining items from the original filing:
Closing as substantially verified. The core CTA-stays-enabled-across-invalid-states concern is resolved — the form now behaves as a coherent gated flow. If you want the two remaining minor items addressed, happy to file them as a separate minor-UX follow-up, otherwise this can close.
mentioned in commit
417b6bd208mentioned in commit
496f371494GL-119 follow-up merged to
main(417b6bd)@brouie Please verify when convenient — issue left open per workflow.
Focus (latest comments)
type="text"+inputMode=decimal. When fractional digits exceed the token, the field gets an amber ring,aria-invalid, a Transfer uses <exact floored value> SYMBOL — floored to token precision line (viaformatBaseUnitsAsExactDecimalString), plus the existing rose copy about ignored digits.numbervalidation is no longer used for the amount field, so the browser should not show "Please enter a valid value. The two nearest valid values are …" when MIN fills a long exact decimal.Docs / invariants
docs/FRONTEND_BRIDGE_INVARIANTS.md(text amount field + precision line).skills/agent-bridge-recipient-validation.mdcross-linked to INV-UX1 / GL-119.AmountInput.tsx,TransferForm.tsx,amountInputLimits.ts; tests:TransferForm.test.tsx,amountInputLimits.test.ts.Checklist for verification
inputMode=decimalstill opens a numeric-style keyboard where supported.npm run test:unitinpackages/frontend— 612 tests green on the merge box.Thanks!
@PlasticDigits closing on
417b6bd. The two minor items I left as polish on the previous round are now addressed.AmountInput.tsx walkthrough:
formatBaseUnitsAsExactDecimalString helper at amountInputLimits.ts:37, imported at TransferForm.tsx:76, used at TransferForm.tsx:1899.
Docs:
Tests: cd packages/frontend && npm run test:unit -> 618/618 passing (you cited 612, we have 618 - small drift from address.test.ts that landed alongside
cb7f871for #117).Mobile inputMode=decimal numeric-keyboard behavior is the W3C-standard attribute, deferred to the next live mobile session for a visual confirmation but no concern at the source level.
Closing.
mentioned in issue #132
mentioned in issue #134