TimeCurve Simple view: aggressive simplification pass — buy-button-first UX with worldbuilding intact (review checklist) #62
Labels
No labels
agent:fix_bugfix
agent:fix_conflicts
agent:fix_security
agent:gap_analysis
agent:implement
agent:open_issues
agents
agent:security_audit
agent:verify
area
timecurve
arena
arena-v2
audit
block:feature_review
block:security
bug
contracts
design
devops
docs
documentation
enhancement
epic
feature
frontend
indexer
low priority
megaeth
operations
ops
performance
QA
qa checklist
referrals
removal
security
smart-contracts
tech-debt
testing
time-arena
timecurve
visual-qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
code/yieldomega#62
Loading…
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?
Context
The
/timecurveSimple view (TimeCurveSimplePage) has been through one full design pass (issue #44) and an asset wiring pass (issue #45 → #57) plus several iterative UX rounds. The page already hosts only a TimeCurveSubnav, the timer + buy "sale hub", aPageHerostrip, an optional "Your stake at launch" panel, and a 3-row "Recent buys" ticker. The global footer is hidden on this route.It is still too dense for the canonical persona we are designing for: a first-time visitor who wants to buy CHARM the way they would buy any token in a normal sale, without learning the curve, the launch anchor, the timer-extension rules, or the difference between Simple / Arena / Protocol.
This issue is the review and aggressive-simplification pass for that persona, with one explicit constraint: the worldbuilding and design philosophy are non-negotiable — the arcade leprechaun-bunny mascot system, the deep-green / gold "stickered playing card" surface, the Bungee/Plex Mono numerals, and the custom cursors are part of what makes Yieldomega Yieldomega and have to survive the cuts.
Authoritative references that frame this work (must read before checking off items):
docs/frontend/timecurve-views.md— current Simple-view layout contract.docs/frontend/design.md— global frontend patterns (no raw wei, plain timestamps, etc.).docs/product/vision.md— joy / participation / agent-friendly tone.frontend/public/art/README.md— full asset catalog with consumer table.frontend/src/pages/TimeCurveSimplePage.tsx— page under review.docs/qa/YO-TimeCurve-QA-Checklist.md(C7, C11) — current acceptance criteria.Baseline commit at the time this issue was written:
88e4eb6.1. Research foundation — simplicity principles to apply
Every checklist item below is grounded in one of these established UX/UI principles. Skim the named principle when an item is unclear; do not re-derive a rationale from scratch.
log2(n+1)choices. Applied: count the visible decisions in the buy flow; we want ≤ 3 before "Buy CHARM" tap.log2(D/W + 1). Applied: primary CTA gets the largest touch target on the page; the slider thumb gets a custom cursor and adequate hit area.<details>or modal. Applied: pay-with picker, slippage, referral, balance row already in<details>; verify nothing else leaks above it.2. Worldbuilding & design philosophy — non-negotiable preserves
Every cut below must survive these. If a simplification proposal would damage one of these, it is rejected.
2.1 Brand voice
2.2 Mascot, motif, and scene system
scenes/timecurve-simple.jpg(low-opacity backplate behind the timer hero). Acceptable. Not acceptable: stripping it for a flat green panel./art/cursors/primary-cta.png) and the slider thumb (/art/cursors/slider-grab.png) at@media (hover: hover)breakpoints.PageBadgeicons (status-{live, prelanch, ended, cooldown, etc.}) stay; they are the cheapest worldbuilding pixels on the page.2.3 Color, font, art-style invariants
--bg-deep,--card, thelinear-gradient(165deg, #122e1d → #1d4329 → #2c5d3f)timer stage) is the dominant page color.--arcade-gold-200/400/600) is used only for: the primary CTA cursor/style, the timer hero days chip, the Simple-tab pill in the subnav, and the rate board's at-launch row. No gold creep into secondary chrome.font-variant-numeric: tabular-numson every live-updating number on the page (timer digits, rate-board prices, stake values). Already true today; keep it true.3. Section-by-section component review
For every section currently rendered by
TimeCurveSimplePage, decide: keep / simplify / move-to-disclosure / remove. Every "remove" must justify against §2.3.1
TimeCurveSubnav(Simple / Arena / Protocol)3.2 Sale hub — Timer panel (
.timecurve-simple__timer-panel)lede(currentlyphaseNarrative()output) — review: is one sentence sufficient? Can we cut the header lede entirely on Simple and let the timer-hero foot line do the talking? ThePageSectionheader eyebrow ("TIME REMAINING") + title ("TIME LEFT") may be redundant with each other.Nd) only appears whensecondsRemaining ≥ 86400. Confirmed inTimeCurveTimerHero.tsx. No change.PageBadge("TIME REMAINING") AND a panel title ("TIME LEFT")? At least one is redundant.3.3 Sale hub — Buy CHARM panel (
.timecurve-simple__buy-panel)This panel is where almost all the simplification work lives.
<details>?hat-coin-front.pngglyph next to the CL8Y figure.primary-cta.pngcursor and the gold-glow class.walletCooldownRemainingSec > 0. Already gated. No change.<details>Advanced disclosure — keep. Audit each item inside it (pay-with, slippage, referral, wallet balance) for whether it should even be on the Simple view at all (vs. living only on/timecurve/arena). For the buy persona, every advanced control we move off the Simple page is a win.<WalletConnectButton />. Keep both, but verify the copy is the first thing read (above the rate board) when no wallet is connected. Today the rate board renders only insaleActive, so the order is fine; double-check onsaleStartPendingandsaleEnded.3.4
PageHero(title + lede + chain-time deadline)HERO_LEDEcopy — review against §2.1; trim to one sentence if it has grown to two.coinSrc="/art/token-logo.png"— keep, it is a worldbuilding pixel (§2.2).headerContent(chain-time deadline) — review: a buy persona reads the timer for "when". The chain-time deadline is operator-tier info. Consider moving into the timer hero foot OR into the Advanced disclosure OR removing entirely on Simple.3.5 "Your stake at launch" panel (gated on
walletConnected && charmWeightWad)<strong>highlights. Trim to 1 sentence ("Your CHARM is worth at least this much in CL8Y when DOUB lists.") for the buy persona; full lore stays indocs/frontend/timecurve-views.md.DoubLPIncentives; see the Protocol view…") — review: keep the link to Protocol (escape hatch for power users), but drop the contract name from the visible string (it is meaningless to the buy persona).3.6 "Recent buys" ticker
cutouts/cutout-bunnyleprechaungirl-playful.pngmascot for personality.+Nsextension OR "hard reset" · tx link. The "hard reset" /+Nscolumn is lore-y; for a buy persona it is opaque. Decide: keep (because it visually rewards big buys), or simplify to a small icon (e.g. lightning glyph for hard reset).3.7 Global app footer (currently hidden on
/timecurve)/timecurveonly viaRootLayout.showFooter. Confirm still hidden after this pass and that operator info is one click away (Protocol view).3.8 Header /
RootLayoutchrome (brand, primary nav, chain pill, wallet button)ConnectButton, brand wordmark, and the cross-app nav stay visible and functional.4. Common simplicity heuristics — checklist (3 levels)
4.1 Information hierarchy
btn-primary--priorityon the Simple view. Verify byrg "btn-primary--priority" frontend/src/pages/TimeCurveSimplePage.tsx(must return 1 hit, on the buy/redeem button).4.2 Cognitive load reduction
<details>. Add an audit grep:rg "session.payWith" frontend/src/pages/TimeCurveSimplePage.tsx | wc -lshould match what's inside the<details>block, no more.WAD,wei,bps,revertReason,endSale(), contract names. Runrg "WAD|wei\\b|bps|revertReason|endSale|DoubLPIncentives|TimeCurve\\.sol" frontend/src/pages/TimeCurveSimplePage.tsxand confirm hits are inside<details>, comments, or test-ids only.4.3 "I just want to buy" decision support
useTimeCurveSaleSession.4.4 Trust signals (smaller surface, same strength)
TxHash. Keep.4.5 Accessibility & inclusivity
/timecurveagainst the deep-green panels.@media (prefers-reduced-motion: reduce). Verify timer hero, button motion, and any new animations introduced by this pass.aria-live="polite". Verify after any layout reorder.4.6 Performance & speed perception
Loading sale state…and the live numbers).scenes/timecurve-simple.jpgalready usesloading="eager". AddfetchPriority="high"if not already set.loading="lazy"anddecoding="async".5. Theming checklist (3 levels)
5.1 Color tokens
var(--bg-deep),var(--card),var(--ink),var(--text-main). No new hex literals introduced for surface colors.var(--arcade-gold-200/400/600)reserved for: primary CTA, days chip, Simple-tab pill, at-launch rate row. Audit:rg "arcade-gold" frontend/src/index.cssand confirm no creep.timer-hero--warning, red undertimer-hero--critical. Only on the timer hero. Confirm no other component uses these urgency hues.--card≥ 4.5:1, white on gold-CTA ≥ 4.5:1, white on green-spotlight ≥ 4.5:1.5.2 Typography
rg "Bungee" frontend/src/index.css.<code>spans, and the rate-board numerals where digit alignment matters.font-variant-numeric: tabular-numson the parent or the value class).5.3 Spacing & rhythm
clamp(min, vw, max)for every padding that has to scale across desktop and mobile (already used in the timer hero; verify Buy panel uses the same scale).5.4 Surface & depth
data-panelbase — white card with hard offset shadow. Used by stake + recent buys panels.data-panel--spotlight— gold-glow border + accent. Used by timer + buy panels (the two spotlight items above the fold). Confirm exactly twodata-panel--spotlighton this page.6. Style checklist — CSS hygiene (3 levels)
6.1 Naming
.timecurve-simple__<block>__<element>--<modifier>. Audit:rg "class.*timecurve-simple" frontend/src/pages/TimeCurveSimplePage.tsxshould not surface ad-hoc unprefixed classes.data-testidparity — every visible block that has e2e or vitest coverage keeps itsdata-testid; removed blocks remove theirdata-testidfrom the spec files.6.2 Layout primitives
@mediafallback. Already in place after the timer-hero pass — confirm no new container queries introduced that try to query their own container.6.3 Animations & motion
@keyframespaired with a@media (prefers-reduced-motion: reduce)killswitch.6.4 Design-token discipline
var(--*)rather than hex literals for any color reused 2+ times on the page.style={{...}}literal values in JSX (acceptable:style={{ ["--fx-i" as string]: i }}for keyframe-staggering).6.5 Dead code & orphaned rules
rg "timecurve-simple__" frontend/src/pages/TimeCurveSimplePage.tsx⊆rg "timecurve-simple__" frontend/src/index.css(every used class exists in CSS)..timecurve-simple__*rule inindex.cssis referenced from the page (no orphan rules left behind from prior passes — e.g. the__timer-value/__timer-footcleanup just done is the kind of audit we want to do for any block we remove).6.6 Responsive behavior
align-items: stretchon the hub grid + container query stack.)7. Image usage checklist (3 levels) — with recommendations
7.1 Required (must keep — worldbuilding glue)
7.1.1
scenes/timecurve-simple.jpg— already wired as the timer hero backplate at low opacity. Keep.7.1.2
token-logo.png—PageHerocoinSrc, the DOUB coin glyph anchoring the hero. Keep (or consciously remove if §3.4 cuts the hero entirely).7.1.3 Status icon set used by
phaseBadge():icons/status-live.png,icons/status-prelanch.png,icons/status-ended.png,icons/status-cooldown.png. Keep — at least one is always shown.7.1.4
cursors/primary-cta.png— leprechaun cursor on the Buy CHARM button. Worldbuilding micro-detail. Keep wired via.btn-primary--priorityinindex.css.7.1.5
cursors/slider-grab.png— slider thumb cursor at@media (hover: hover). Keep unless we move the slider behind disclosure (then re-evaluate).7.1.6
icons/nav-simple.png(subnav) — keep, it is the sole "you are here" worldbuilding pixel for the active tab.7.2 Recommended additions (worldbuilding push, low ink-cost)
7.2.1
cutouts/leprechaun-bag-bunny-pair.png— already noted infrontend/public/art/README.mdas the Simple-view sidekick. Add as a small corner cutout on the timer panel (mirrors the LaunchCountdown pattern that usescutout-bunnyleprechaungirl-full.png+bunny-jump.png). Tucked into the bottom-left, behind the digits, at low z-index, withcutout-decoration--float.7.2.2
hat-coin-stack.pngorhat-coin-front.png— small coin glyph in the buy preview row next to the CL8Y figure ("≈ 12.34 CL8Y"). Reinforces "you are getting tokens" without copy.7.2.3
cutouts/cutout-bunnyleprechaungirl-playful.png— empty-state mascot for the "Recent buys" placeholder. Replaces the text-only "Waiting for the first buy of this round." with a mascot + caption.7.2.4
cutouts/bunny-podium-win.png— only when the post-sale "Redeem CHARM" state is active; tucked alongside the CTA to celebrate the win. Conditional render so it never appears for a buy persona.7.2.5
icons/token-charm.pngandicons/token-cl8y.png— small inline glyphs adjacent to "CHARM" and "CL8Y" labels in the buy preview / stake panel. Cheap worldbuilding, replaces some plain-text noise.7.3 Candidates to REMOVE / re-evaluate
PageHero coinSrc— if §3.4.1 cuts the hero title, the floating coin goes with it. Justify either way.PageBadges above the fold — timer panel has one ("TIME REMAINING") and buy panel has one ("PRIMARY ACTION"). Decide whether both earn their visual weight; consider dropping one.rg "[\\x{2600}-\\x{27BF}]|[\\x{1F300}-\\x{1F9FF}]" frontend/src/pages/TimeCurveSimplePage.tsx.7.4 Image discipline & performance (per
<img>)<img>haswidth,height,alt,decoding, andloadingattributes set. Audit:rg "<img" frontend/src/pages/TimeCurveSimplePage.tsx frontend/src/pages/timecurve/TimeCurveTimerHero.tsx frontend/src/components/CutoutDecoration.tsx.decoding="async"for all non-LCP,decoding="sync"only for the LCP image.fetchPriority="high"on the LCP image only (today:scenes/timecurve-simple.jpginside the timer hero).<picture>+mediafor any image that is wider than 480px on a portrait viewport.CutoutDecorationhelper (which provides reduced-motion-safe animations) rather than inline<img>.7.5 Cursors (worldbuilding micro-detail)
primary-cta.pngon the Buy CHARM button via.btn-primary--priority— confirm.slider-grab.pngon the slider thumb via.timecurve-simple__slider— confirm at@media (hover: hover)only.danger-pvp.pngon the Simple view (PvP cursors live on Arena).8. Worldbuilding & design philosophy preservation — final guardrails
8.1 Brand voice
8.2 Color personality
8.3 Information density (worldbuilding ↔ simplicity bargain)
8.4 Mascot affordances
9. Acceptance criteria (final cut)
/timecurveagainst a local production build./timecurve.WAD,wei,bps,revertReason,endSale,DoubLPIncentives, orTimeCurve.solin visible above-the-fold copy. (Inside<details>, comments, test-ids, and tooltips: allowed.)data-testidin tests, no broken doc cross-link.width,height,alt,decoding,loading, and is registered infrontend/public/art/README.mdconsumer table.npx tsc -b --noEmitclean,npx vitest rungreen,npx playwright test e2e/timecurve.spec.tsgreen.docs/frontend/timecurve-views.md,docs/qa/YO-TimeCurve-QA-Checklist.md(C7, C11), andfrontend/public/art/README.mdupdated in the same MR as the code change.10. Cross-links
docs/frontend/timecurve-views.md— current Simple-view layout contract (must stay in sync with this issue's outcome).docs/frontend/design.md— global frontend design patterns.docs/product/vision.md— joy / participation / agent-friendly tone.frontend/public/art/README.md— full asset catalog and consumer table.frontend/src/pages/TimeCurveSimplePage.tsx— page under review.frontend/src/pages/timecurve/TimeCurveTimerHero.tsx— shared timer hero (sibling ofLaunchCountdownPage).