Skip to content

feat: accessibility, performance & design polish#16

Open
anirudhpareek wants to merge 2 commits intoLilFatFrank:mainfrom
anirudhpareek:feat/a11y-design-polish
Open

feat: accessibility, performance & design polish#16
anirudhpareek wants to merge 2 commits intoLilFatFrank:mainfrom
anirudhpareek:feat/a11y-design-polish

Conversation

@anirudhpareek
Copy link
Copy Markdown

Summary

  • Accessibility (WCAG 2.1): Focus trap in modals (role=dialog, aria-modal, Escape key, focus restore), role=tablist/tab + aria-selected on footer nav, aria-label on all icon-only buttons, htmlFor/id on all form inputs, role=alert on error states, global :focus-visible keyboard ring, aria-hidden on decorative canvas
  • Performance: /api/fee deduplicated via module-level promise cache, force-dynamic scoped to page level (not layout), modal components lazy-loaded via next/dynamic, useUserRegistration deps stabilized to primitives
  • Design: PrivacyBadge component (shield + "Private" pill) on home screen, "Available Balance:" label on balance display, granular fee breakdown (Network Fee + Privacy Routing with sublabel replacing "Partner Fees"), privacy confirmation banner on all send/claim success states, text labels on action buttons and footer tabs

Test plan

  • Open Send / Receive / Claim modals — Tab key cycles focus within modal, Escape closes it, focus returns to trigger
  • Footer tabs show text label when active, pill slides correctly
  • Action buttons show "Send" / "Receive" text + icon
  • Fee breakdown shows Network Fee + Privacy Routing rows with sublabel
  • Success states show "Sent privately — your wallet address was not revealed" banner
  • Home screen shows "Private" badge and "Available Balance:" label
  • Keyboard navigation: all interactive elements reachable and visually focused

🤖 Generated with Claude Code

Anirudh Pareek and others added 2 commits March 8, 2026 13:46
…ations

- Add CSS animation tokens and shimmer @Keyframes to globals.css
- Create lib/motionVariants.ts with shared fadeUp, scaleIn, stagger variants
- NumberPad: replace CSS active with Motion spring press physics per key
- ActionButton: Motion whileHover/whileTap spring (disabled-safe)
- Modal: responsive spring variants (bottom-sheet mobile, scale desktop)
- Footer: layoutId sliding pill indicator replaces static opacity
- page.tsx: amount display springs on keypress, balance shimmer skeleton, dropdown spring easing with scale
- p/page.tsx: layoutId tab switcher, wallet balance shimmer skeletons, staggered activity list
- SendModal/ReceiveModal/SendClaimModal: AnimatePresence mode="wait" with fadeUp/scaleIn per state
- Add SuccessParticles canvas confetti component, fired on success state in all send modals

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Accessibility:
- Modal: role=dialog, aria-modal, focus trap, Escape key, focus restore
- Footer: role=tablist/tab, aria-selected, aria-current, text labels
- ActionButton: aria-label, text label, h-11 touch target
- All modals: htmlFor/id on inputs, role=alert on error states
- QR scan buttons: aria-label="Scan QR code"
- SuccessParticles: aria-hidden on canvas
- globals.css: :focus-visible ring for keyboard nav

Design:
- PrivacyBadge component (shield + "Private" pill) on home screen
- "Available Balance:" label on balance display
- Granular fee breakdown: Network Fee + Privacy Routing (with sublabel)
- Privacy confirmation banner on all success states

Performance:
- /api/fee deduplicated via module-level promise cache (getCachedFee)
- force-dynamic moved from layout to individual pages
- Modal components lazy-loaded via next/dynamic (renamed to lazyLoad)
- useUserRegistration deps stabilized to primitives

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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.

1 participant