Review: CL8Y DEX Visual UX Verification Checklist v1.0 (draft)
@PlasticDigits draft per this morning's meeting request: visual UX checklist for cl8y-dex-terraclassic covering your priority areas (charting / hybrid swaps / adding LP / limit orders) plus broader UX coverage.
Review inline here. Once approved I'll commit to `cl8y-ecosystem-qa/specs/` and open mirror tracking issue on cl8y-dex-terraclassic per the usual pattern.
CL8Y DEX Terra Classic — Visual UX Verification Checklist
Flow: End-to-end DEX user experience — Charting, Swaps (pool + hybrid), Liquidity Provision, Limit Orders, and supporting surfaces Author: @Brouie (AVE) Version: 1.0 — 2026-04-22 Repo: cl8y-dex-terraclassic Status: Draft for dev review
1. Purpose & Scope
This checklist covers visual / manual UX verification of the CL8Y DEX frontend-dapp across all primary user flows that a mainnet user will execute. It is meant to be run before each deployment to mainnet, after significant frontend or indexer changes, and as part of release-gate QA.
Automated E2E coverage (Playwright, Vitest, contract tests, indexer tests) covers correctness of values, state, and happy-path flows. This spec focuses on what those tests don't catch: visual correctness, progressive disclosure, error-state clarity, responsive layout, and accessibility.
In-scope flows
- A. Charting (price, volume, pair info)
- B. Swap (pool-only)
- C. Swap (hybrid: pool + on-chain limit book)
- D. Liquidity provision (add / remove)
- E. Limit orders (place / view / cancel)
- F. Pair selector + global navigation
- G. Wallet connection + account state
- H. Error, loading, and empty states
- I. Responsive layout (mobile / tablet / desktop)
- J. Accessibility basics
Out-of-scope
- Contract-level correctness (covered by Foundry / cargo test suites)
- Indexer API correctness (covered by indexer integration tests)
- Automated Playwright E2E coverage (separate from this checklist)
- Cross-chain flows (bridge UX is a separate spec)
Required evidence per item
- Screenshot or short screen recording
- Viewport / browser noted per capture (e.g. `Desktop / Chrome`, `Mobile / Safari 375px`)
- Transaction hash for any on-chain action (for traceability)
2. Prerequisites
- DEX deployed to target environment (LocalTerra for dev, Columbus-5 for mainnet verification)
- Indexer online and caught up
- At least 3 seeded pairs with non-trivial liquidity and recent swap history
- Test wallet with sufficient uluna + at least 2 test tokens
- Wallet extension installed: Station (primary). Others if supported: Keplr, Leap
- Clean cache / incognito session for the 'first-time visitor' checks
3. A. Charting
A1. Price chart renders
- Chart renders within ~2 seconds on broadband
- Candles / line visible with ≥24h of data (if pair has history)
- Current price prominent, matches latest on-chain swap
- Y and X axis labels readable, reasonable tick density
A2. Timeframe selection
- Timeframe selector (1h / 4h / 1d / 7d / 30d / all)
- Each timeframe loads without flicker or stale data
- Active timeframe visually distinguished
- Selection persists sensibly across pair changes
A3. Volume chart
- Volume bars visible below or alongside price chart
- Volume scale readable
- Volume correlates with swap events from indexer
A4. Pair metadata
- Token pair symbols (e.g. EMBER / JADE)
- Pair contract address accessible (link or copy)
- Liquidity depth (total reserves, USD-equivalent if applicable)
- 24h volume, 24h price change, 24h high/low
- Fee tier / pool type if relevant
A5. Chart interaction
- Hover / tap shows OHLCV tooltip
- Tooltip doesn't obscure the candle
- Dismisses cleanly when pointer leaves
A6. Pair with no recent activity
- Empty state renders gracefully, not a broken chart
- Empty-state copy is clear
4. B. Swap — Pool-Only
B1. Quote display
- Output amount quoted within ~1 second
- Quote updates as input changes without flicker
- Price impact shown in percent
- Minimum received (after slippage) shown
- Fee breakdown visible (protocol + LP fee)
B2. Slippage control
- Preset values + custom input
- Changing slippage updates min-received live
- High slippage (>5%) shows warning
B3. Price impact warnings
- <1%: informational
- 1-3%: visible warning
- 3-5%: stronger warning
- `>`5%: requires explicit confirmation
B4. Route visibility
- Swap route displayed (direct or multi-hop)
- Intermediate tokens labeled correctly
B5. Execute
- Wallet prompts with clear tx preview
- Loading state during broadcast + confirmation
- Success state shows tx hash + explorer link
- Failure shows readable error, not raw revert
B6. Post-swap UX
- Balance updates shortly after confirmation
- Swap appears in transaction history
- Chart reflects new price
5. C. Swap — Hybrid (Pool + On-Chain Limit Book)
C1. Hybrid mode discovery
- UI indicates hybrid is in use when book improves the quote (toggle, badge, inline label)
- Hybrid vs pool-only toggle (if exposed) is clear
C2. Hybrid quote decomposition
- Quote breakdown shows pool leg vs book leg amounts
- Effective price blends both correctly vs pool-only
- Fee breakdown separates pool LP fee from limit maker/taker fees
C3. Hybrid-specific warnings
- Thin book depth → informed user
- All book orders consumed → remaining falls through to pool cleanly
C4. Execute hybrid
- Single wallet prompt for the hybrid operation
- Tx preview shows both pool + book interaction
- Success state shows both legs in the receipt
C5. Post-hybrid UX
- Limit book visually updates to reflect filled orders
- Recent swaps shows the hybrid fill with labeling
6. D. Liquidity Provision
D1. Add LP — single-pair flow
- Reachable from nav or pair page
- Two token input fields with symbol + balance
- Auto-balancing on single-side input
- Estimated LP tokens received shown
- Your share of pool (%) after deposit
- Current ratio + price displayed
D2. Add LP warnings
- Thin pool (significant relative liquidity) → warning
- Price moved since load (stale quote) → warning
- Token approval step clear and separate from deposit
D3. Add LP execute
- Approve button per non-native token
- Existing sufficient allowance is reused
- Final Supply / Add Liquidity button with sensible tx preview
- Success state shows LP tokens received + tx hash
D4. Remove LP flow
- Accessible from pair page or LP positions list
- Percentage slider or amount input
- Estimated token outputs in real time
- Slippage protection on output estimates
- Execute → success with tx hash
D5. LP positions list
- Reachable from nav / account
- Each position shows pair, LP token balance, underlying amounts, current value
- Empty state renders cleanly
D6. LP metadata
- Pool APR / fee yield indicator if available
- Historical earnings or link to that info
7. E. Limit Orders
E1. Order form
- Reachable from pair page
- Inputs: side, amount, target price
- Expected output computed live
- Validity / expiry control if supported
- Fee structure for limit orders displayed
E2. Order validation
- Below minimum: inline error + disabled submit + tooltip (mirror bridge #113 pattern)
- Above balance: inline error
- Price at or worse than current spot: warning or gated confirm
- Price unreasonably far from spot: stronger warning
E3. Place order execute
- Wallet prompt with tx preview
- Success shows order ID + tx hash
- Order appears in open orders list within ~1 second
E4. Open orders list
- Shows side, amount, price, filled, remaining, status
- Sort by recent, price, expiry
- Filter by pair
E5. Cancel order
- Cancel button per open order
- Success → order moves to cancelled or is removed
- Cancel tx hash available
E6. Fill visibility
- Partial fill updates filled/remaining
- Full fill moves order to filled with received amount
E7. Order book display
- Aggregated ladder on pair page
- User's own orders highlighted
- Book updates in ~real time
8. F. Pair Selector + Global Nav
F1. Pair selector
- Accessible from all top-level pages
- Search by symbol works
- Recently used pairs surface
- Low-liquidity / suspicious pairs flagged
F2. Global nav
- Swap / Liquidity / Limit Orders / Chart / Account reachable
- Active section highlighted
- Collapses cleanly on narrow viewports
F3. Theme toggle
- Light / dark toggle accessible and persistent
- Contrast meets WCAG AA in both modes
- No unstyled flicker on first load
9. G. Wallet Connection + Account
G1. Initial connect
- Connect button visible on every page when disconnected
- Wallet options listed (Station primary, Keplr/Leap if supported)
- Install link if extension not detected
- Auto-reconnect works
G2. Account display
- Connected address shown (truncated)
- Click-to-copy
- Explorer link
- Relevant token balances visible
G3. Disconnect
- Reachable within 1 click
- UI returns to disconnected state cleanly
G4. Network mismatch
- Wrong-network prompt + Switch Network action
- Triggers wallet-side network change if supported
10. H. Error, Loading, and Empty States
H1. Loading
- Every async fetch shows indicator
- Loading doesn't leak into final state
- Slow network still surfaces a sensible state within ~5 seconds
H2. Errors
- Indexer down → clear error + retry
- LCD timeout → clear message
- Tx simulation failure → human-readable
- Tx broadcast failure → retry affordance
- Rate limited → backoff message
H3. Empty states
- No liquidity → empty state + add-liquidity CTA
- No trading history → empty state
- No LP positions → onboarding CTA
- No open limit orders → empty state
H4. First-time visitor
- Incognito → landing is understandable without prior context
- No stale wallet prompts
11. I. Responsive Layout
I1. Desktop (≥1280px)
- Primary actions above the fold
- Chart and form don't overlap
- Modals center and size sensibly
I2. Tablet (768-1279px)
- Nav adapts (inline vs hamburger)
- Chart and form stack or scroll cleanly
- Touch targets ≥44px
I3. Mobile (320-767px)
- Bottom-nav or hamburger
- Swap form thumb-reachable, no horizontal scroll
- Chart renders or gracefully simplifies
- Wallet connect works on mobile wallet deep links
I4. Orientation
- Portrait + landscape without overflow
- Safe-area (notch) respected on iOS
12. J. Accessibility Basics
J1. Keyboard
- All interactive elements reachable via Tab
- Focus indicators visible
- Enter / Space activate buttons and links
- Modals trap focus and restore on close
J2. Screen reader smoke
- Landmarks present (nav, main, complementary)
- Form fields labeled
- Decorative icons aria-hidden
- Dynamic content announced via aria-live
J3. Color contrast
- Body text ≥4.5:1
- Large text ≥3:1
- Interactive elements have a state not relying on color alone
J4. Motion
- `prefers-reduced-motion` respected
- No auto-playing unpausable animation
13. Execution Guidelines
Test environments
- Pre-mainnet (required): LocalTerra with full deploy-dex-local.sh stack + indexer + laptop-frontend
- Mainnet smoke (required): Columbus-5 production deploy with read-only or small-value wallet
- Mobile physical (recommended): at least one real iOS + one real Android
Browser coverage (minimum)
- Chrome (latest)
- Firefox (latest)
- Safari (latest) — especially mobile Safari
Capture standard
- Full-page screenshots preferred
- Short recordings (≤15s) for multi-step flows
- Naming: `
---.png`
Sign-off
- Each section (A-J) needs ≥1 green pass before deployment
- Filed issues linked back to checklist execution
- Broken flows / missing error states = blocking
- Polish / minor UX / a11y improvements = backlog
14. Open Questions for Your Review
- Wallet scope: Station only, or also Keplr / Leap?
- Hybrid UI: explicit 'use hybrid' toggle, or automatic based on book depth?
- LP positions page: what historical data (earned fees, impermanent loss) surfaces vs defer?
- Limit order expiry: GTC-only, or user-selectable?
- Mobile wallet flow: deep-link to Station mobile, or WalletConnect QR?
- Chart library: TradingView widget, recharts, custom? (affects a11y attainability)
15. References
- Frontend source: `frontend-dapp/` in cl8y-dex-terraclassic
- Contracts: `smartcontracts/` — pair, router, factory, limit-book
- Indexer API: `docs/integrators.md`
- ADR 0001 (hybrid): `docs/adr/0001-hybrid-quoting-and-routing.md`
- Closed superseded: `#50 Full QA Pass v3`
- Sister specs: UST1-Window-Security-Checklist.md, YO-DOUB-Launch-UX-Flows.md, YO-TimeCurve-Verification-Spec.md