ux: /trade ticket defaults to Market; flatten nested chrome; token-logo heading wash #693

Closed
opened 2026-08-28 05:28:45 +00:00 by PlasticDigits · 9 comments
PlasticDigits commented 2026-08-28 05:28:45 +00:00 (Migrated from gitlab.com)

Summary

The /trade order ticket is Limit-first, uses full-width tab-glass pills, and stacks nested cards (Side panel + Top buy/Top sell + Market/Limit TicketSection + a second “Market” heading + quote card-glass). The Buy {base} header has no token logo and a hard-coded orange wash that ignores the asset. Flatten the ticket: default Market, compact underline Market/Limit text, logo + logo-derived heading wash, Buy/Sell directly in the parent (no Side chrome, no Top buy/Top sell), one Market Docs / Limit Docs line (not a card, not a second title), and move Slippage protection plus other non-blocking amount chrome into Advanced.

Styling / IA only. Do not change escrow mapping, quote payloads, hybrid always-on, footer CTA dock, or on-chain side.

Related (do not re-open): #152 Market tab, #153 radiogroup, #155 side amount, #489 copy density, #497 / #528 slippage, #524 invert, #527 footer dock, #563 heading + green/red Buy/Sell (T563-6 tab-glass rule is amended here), #653 one chrome layer, #378 logo allowlist, #596 hybrid always on, #501 GET /route/solve.

Current codebase

Default tab is Limit

TradeOrderTicket.tsx initializes orderTab to 'limit'. Fresh /trade/:pair therefore shows the resting-book form (price, expiry, pre-submit) and the footer Place limit CTA. Market (taker swap + hybrid quote) is a second click. Book Edit already forces setOrderTab('limit') — keep that.

Tests assume Limit-first: TradePage.test.tsx finds trade-limit-submit / trade-limit-pre-submit-summary without clicking the Limit tab; Market footer tests click trade-order-tab-market first.

Market / Limit are nested full-width pills

When pairAddr is terra1…, a 2-column grid with rounded-2xl border + tab-glass / tab-glass-active hosts Limit then Market (role="tablist", trade-order-tab-*). docs/frontend.md T563-6 and the Bid/Ask side table say Limit/Market tabs stay tab-glass*. That uses a full ticket-width row for two words.

Heading: text only + hard-coded orange wash

data-testid="trade-ticket-header" sets

radial-gradient(… rgba(251, 146, 60, 0.18) …)

— orange, not the displayed base. h3.trade-ticket-heading is {verb} {displayBase} or Select a pair (T563-1). No TokenLogo / TokenDisplay. Invert stays in the row (T563-4). Logo allowlist + blockie fallback already exist (#378, useTokenDisplayInfo).

Side panel + Top buy / Top sell

TicketSection title="Side" wraps LimitOrderBidAskSideSelector (idPrefix="trade-ticket", compact) and two TicketStat tiles: Top buy / Top sell (bestBidLabel / bestAskLabel). TicketSection is a second rounded-2xl border + wash inside the ticket card-glass. Book head already lives on the sibling order-book panel.

Market / Limit cards duplicate the mode word

Market: TicketSection title="Market" tone="action" plus TradeMarketOrderPanel.tsx <h3>Market</h3> and a “Taker swap at {n}% slippage protection… Docs” paragraph.

Limit: TicketSection title="Limit" tone="action" around price / pay / receive / expiry / advanced / LimitOrderPreSubmitSummary (another card-glass, its own Docs).

Mode name appears twice; Docs is buried in lecture copy or the pre-submit card.

Slippage and amount chrome sit on the default Market path

Always visible on Market (above Advanced):

  • SlippageProtectionPresets (trade-market-slippage-presets, 0.5 / 1 / 5 — #528)
  • Taker-swap lecture sentence
  • LimitOrderEscrowAmountField: Pay ({symbol}), USD notional, balance + 25/50/75/100%
  • Quote card-glass (trade-market-quote): expected receive, min after slippage, disclosure, hop spread, Route
  • SwapPreSubmitSummary

Advanced today is only hybrid book-leg override + max makers (#501 / #596).

Limit default path still shows expiry, % deviation chips, ref/%/USD context, side-flip, receive USD, and the pre-submit fee card. LimitOrderAdvancedLimitSettings already holds placement gas + raw expires_at.

Why the new implementation is needed

  1. Wrong default for a trade desk. /trade is the execution page; Market (immediate taker) is the common path. Limit-first trains users into resting-book fields and a Place limit CTA they did not ask for.
  2. Nested chrome is visual noise. Ticket card-glass → Side section → stat tiles → Market/Limit action card → quote/pre-submit card-glass is a card-of-cards. That fights #653 / #489 and wastes the narrow ticket column.
  3. Mode switch should be text, not a second toolbar. Full-width pills duplicate the mode title that the card repeats. Small underlined Market / Limit uses less horizontal space and reads as a mode, not a primary action (Buy/Sell and the footer CTA stay primary).
  4. Heading identity. Buy {base} without a logo is weaker than Swap/picker rows. The orange wash is leftover warm chrome (#488 forbids gold/orange fills) and does not track the asset after invert / pair switch.
  5. Top buy / Top sell are redundant. The book panel is the book. Duplicating best bid/ask on the ticket adds a Side section that exists only to nest the radiogroup.
  6. Slippage is power-user chrome on Market. Default 5% already applies (#497). The chips and lecture sentence crowd the amount field. They belong under Advanced with hybrid override — not deleted.

Constraints / guardrails

  1. Scope = /trade ticket. Do not restyle /limits place card except where a shared primitive must change; /limits stays Limit-only. Do not change Swap Settings slippage placement.
  2. Default Market on fresh mount only. Book Edit / limit draft (limitBookDraftKey) still setOrderTab('limit') and prefills (L561-11, #178). Place another after a successful limit stays on Limit and still focuses the price field (#161). Pair remount (keyed Outlet) → Market again.
  3. Do not change money semantics. Bid still escrows token1; ask token0. Side change still clears / MAX-reapplies (#155). Click Buy still onSideChange('bid'). Quotes stay GET /route/solve (Advanced typed book → POST). Hybrid stays always on — no opt-out (#596). max_spread = slippage/100; default 5%; presets [0.5, 1, 5] (#497 / #528).
  4. Keep a11y. Market/Limit remain role="tablist" / tab / tabpanel (or an equivalent labelled switch). Buy/Sell stay the #153 radiogroup (aria-checked, Arrow/Home/End). New text tabs need :focus-visible (#144). Selected mode = underline + aria-selected (not color-only).
  5. Buy/Sell stay green/red side-control* (T563-5). Do not paint them with the token wash. Do not paint footer Market buy/sell / Place limit green/red. Do not restyle book Bid/Ask columns.
  6. Heading stays text nodes — {verb} {displayBase} plus a sibling TokenLogo (no dangerouslySetInnerHTML). T563-1 wrap still applies; logo is shrink-0. Invert stays tappable. Logo via allowlisted TokenLogo only (#378); blockie when no safe URI. Wash from the displayed base after invert (#524).
  7. Logo color is a muted wash, not a trust signal. Clamp luminance/alpha so heading stays --ink on dark and light. Fallback: deterministic hue from token id / blockie, never the current orange rgba(251, 146, 60, 0.18). No CSS/url() injection from metadata. Canvas extract only from allowlisted https images; tainted/CORS failure → fallback. Do not fetch arbitrary logo_url hosts.
  8. One chrome layer inside the ticket. Delete TicketSection / TicketStat on this ticket (or stop using them). No Market/Limit wrapper card. Quote / pre-submit must not be a second card-glass on the default path — typography or Advanced. Ticket shell card-glass / sibling Trade panels stay (L561). Do not wrap PriceChart. Update scripts/chrome_nesting_allowlist.txt / check_chrome_nesting.py if the flatten adds or removes a same-file nest.
  9. Single mode + Docs line. One Market + Docs (or Limit + Docs) — not TicketSection title and an inner <h3>Market</h3> and a lecture sentence. Docs is optional depth (#489); it must not replace pause / blacklist / code-id-frozen / tax extra-debit / hop-spread blocking errors.
  10. Default Market path (keep): heading+logo, Market/Limit text, Buy/Sell, Pay amount + Max, one expected-receive line, footer CTA, blocking alerts (pause, frozen, blacklist, tax extra-debit, quote error, book-leg exceeds pay).
  11. Advanced Market (move, do not delete): Slippage chips (keep trade-market-slippage-* testids and #528 grid-cols-3 when open; still in ticket body, not footer), hybrid book leg + max makers, min-after-slippage / disclosure / hop spread / Route extras / pre-submit fee grid / taker lecture (or delete the lecture).
  12. Default Limit path (keep): heading+logo, tabs, Buy/Sell, price input, Pay + Max, Receive, footer CTA, invalid buy/sell alert. Advanced Limit: expiry (remove the always-on LimitOrderExpiryField duplicate), placement gas, % chips + ref/USD context if they crowd the price row, pre-submit fee card. Side-flip may stay compact between Pay/Receive.
  13. Do not hide safety. Community-tax extra-debit hint, pause, code-id freeze, trading blacklist, indexer outage banner, and submit guards stay on the default path. Outage copy still must not leak VITE_INDEXER_URL (#164).
  14. One TradeOrderTicket mount. Hidden desktop ticket stays inert + interactive={false} (L561-6). Flattened DOM must not create a second submit or a focusable control inside inert.
  15. Amend docs that freeze tab-glass tabs: T563-6, docs/frontend.md Bid/Ask “Limit vs Market tabs stay tab-glass*”, AGENTS_FRONTEND_TRADE_TICKET_HEADING.md. Playbook + make verify-issue-* for this issue.
  16. No lecture banners. Do not add “Market is now the default” copy on the page.

Relevant files

Path Role
frontend-dapp/src/components/trade/TradeOrderTicket.tsx Default tab, header wash, TicketSection / TicketStat, tablist, Side wrapper
frontend-dapp/src/components/trade/TradeMarketOrderPanel.tsx Duplicate Market heading, slippage, quote card, Advanced
frontend-dapp/src/components/trade/LimitOrderBidAskSideSelector.tsx Buy/Sell — keep behavior; parent loses Side chrome
frontend-dapp/src/components/trade/LimitOrderEscrowAmountField.tsx Pay input chrome
frontend-dapp/src/components/trade/LimitOrderPriceField.tsx Limit price + deviation chips
frontend-dapp/src/components/trade/LimitOrderExpiryField.tsx Always-on expiry — move under Advanced on /trade
frontend-dapp/src/components/trade/LimitOrderAdvancedLimitSettings.tsx Limit Advanced
frontend-dapp/src/components/trade/LimitOrderPreSubmitSummary.tsx Nested card-glass + Docs
frontend-dapp/src/components/swap/SwapPreSubmitSummary.tsx Market pre-submit card
frontend-dapp/src/components/common/SlippageProtectionPresets.tsx Shared chips — move call site only
frontend-dapp/src/components/ui/TokenLogo.tsx / TokenDisplay.tsx Heading logo
frontend-dapp/src/hooks/useTokenDisplayInfo.ts Logo URI + blockie seed
frontend-dapp/src/utils/tokenLogoAllowlist.ts Host allowlist
frontend-dapp/src/index.css .trade-ticket-heading, new text-tab + wash primitives
frontend-dapp/src/theme-dark.css / theme-light.css Contrast
frontend-dapp/src/pages/TradePage.test.tsx Limit-first assumptions
frontend-dapp/src/components/trade/__tests__/TradeMarketOrderPanel.slippagePresets.test.tsx Chips now under Advanced
frontend-dapp/e2e/trade-page-responsive.spec.ts Heading / ticket
docs/frontend.md § ticket heading + market context Amend T563-6; new ticket IA subsection
docs/design-system.md No orange fill; one chrome layer
skills/AGENTS_FRONTEND_TRADE_TICKET_HEADING.md Tab style + logo
skills/AGENTS_FRONTEND_TRADE_PAGE_LAYOUT.md Cross-link
skills/AGENTS_FRONTEND_CHROME_NESTING.md Inner ticket flatten
skills/AGENTS_FRONTEND_SLIPPAGE_PRESET_ALIGN.md Chips under Advanced
QA_TEMPLATE.md Limit-place-card / tab checks
  1. useState('market'). Update tests that assumed Limit-first: click trade-order-tab-limit where the case is Limit-only; assert trade-order-tab-market aria-selected="true" on fresh mount. Keep book-Edit → Limit.
  2. Replace the bordered 2-col tab-glass row with a compact inline text pair: small type, selected = underline + aria-selected, idle = muted, intrinsic width (not w-full). Keep testids trade-order-tab-limit / trade-order-tab-market.
  3. Heading row: TokenLogo (displayed base) + existing h3 text + invert. Drive header background from a clamped accent (logo sample or id-hash). Delete the orange radial. Select a pair = no logo, neutral wash.
  4. Unwrap Side: render LimitOrderBidAskSideSelector as a direct child of trade-order-ticket-scroll. Delete Top buy / Top sell and TicketStat if unused.
  5. Unwrap Market/Limit: drop TicketSection. One line: Market + Docs or Limit + Docs. Remove the inner <h3>Market</h3> and the always-on taker paragraph.
  6. Move SlippageProtectionPresets into trade-market-advanced (open section). Keep #528 geometry when expanded. Same for quote extras / SwapPreSubmitSummary. Leave a single expected-receive line on the default path (not a nested card).
  7. Limit /trade: move expiry + pre-submit card + crowding price context into Advanced; keep price + Pay + Receive on the default path.
  8. Docs/skills/QA as in guardrail 15. Add make verify-issue-<id> (Vitest + targeted e2e).

Acceptance criteria

  • T1 Default Market. Fresh /trade/:pair (valid terra1) has trade-order-tab-market aria-selected="true"; Market pay field + footer Market CTA; no limit price input until Limit is selected.
  • T2 Limit still reachable. Clicking Limit shows price / Pay / Place limit; Market unmounts from the tabpanel (one money CTA). Book Edit and limit draft still select Limit and prefill.
  • T3 Compact tabs. Market/Limit are small underlined text (selected underline; not tab-glass pills; not a full-width 2-col bordered toolbar). Less horizontal space than today’s grid-cols-2 pills. Keyboard + aria-* remain.
  • T4 Heading logo. With a selected pair, trade-ticket-heading row shows allowlisted TokenLogo (or blockie) for the displayed base beside Buy {base} / Sell {base}. Invert updates logo + verb/base together. Select a pair has no logo.
  • T5 Wash from token, not orange. trade-ticket-header has no rgba(251, 146, 60 / warm orange radial. Wash tracks displayed-base identity across pair switch and invert. Heading contrast holds on dark and light. Fallback never returns to the orange constant.
  • T6 No Side chrome. No “Side” section title. No Top buy / Top sell. Buy/Sell radiogroup is a direct child of the ticket scroll (or heading stack), not wrapped in TicketSection.
  • T7 No mode card; mode word once. No TicketSection Market/Limit card. Visible mode title appears once with a single Docs link (Market + Docs or Limit + Docs). No second <h3>Market</h3>.
  • T8 Slippage in Advanced. Default Market path does not show trade-market-slippage-presets. Opening Advanced shows the same 0.5/1/5 group (#528). Changing a chip still writes useDexStore.slippageTolerance and the next quote/submit max_spread. Default remains 5% when Advanced stays closed.
  • T9 Amount path declutter. Default Market: Pay + Max + one expected-receive line + blocking errors. Lecture / min-after-slippage / Route extras / pre-submit card live under Advanced (or are removed if they only repeat the receive line). Default Limit: price + Pay + Receive; expiry / fee grid / crowding ref chips under Advanced. No extra card-glass around the amount input.
  • T10 Behavior unchanged. Escrow, hybrid always-on, GET vs POST quote, footer dock (#527), one ticket mount (#178), pause/blacklist/frozen, tax extra-debit hint, Connect Wallet paths (T563-3) unchanged.
  • T11 Docs. docs/frontend.md + design-system + skills + QA updated; T563-6 amended; make verify-issue-<id> exists.

Test plan — all paths

  1. Fresh desktop /trade/:pair. Market selected; Market pay + Market footer CTA; no limit-order-price-input; no Side / Top buy / Top sell; no Market TicketSection card; heading has logo + non-orange wash.
  2. Click Limit. Price + Pay + Place limit; one Limit + Docs; Market panel gone; Buy/Sell still work.
  3. Click Market again. Pay field restores (or empty per current state rules); footer Market CTA; slippage still hidden until Advanced.
  4. Buy → Sell → invert. Heading verb/base/logo and side labels track displayed base; escrow still bid=token1 / ask=token0 in factory space; footer stays docked.
  5. Book Edit while on Market (ticket visible and ticket hidden). Ticket shows Limit, price/amount prefilled, Update/Place in footer (L561-11).
  6. Place another after a successful limit. Stays Limit; price focused; fields reset per #161.
  7. Pair switch (keyed remount). New ticket defaults Market; wash/logo follow the new displayed base.
  8. Disconnected. Footer Connect Wallet on Market and Limit; no header wallet chip.
  9. Advanced Market. Toggle open: slippage chips aligned; 0.5/1/5 update store + quote min receive; book-leg + max makers still work; GET vs POST unchanged. Toggle closed: chips gone; last slippage still applies to submit.
  10. Advanced Limit. Expiry + gas reachable; default Limit path has no duplicate expiry row / pre-submit card.
  11. Phone + tablet (trade-sub-lg-workspace) and desktop (lg). Tabs stay compact; heading wraps (T563-1); logo does not cover invert or Sell.
  12. Light + dark. Wash + heading + idle/selected tabs + Buy/Sell contrast.
  13. No pair / invalid pair / paused / frozen / blacklist / indexer outage. Existing banners and CTAs; flatten does not hide them.
  14. Community-tax listed pair. Extra-debit hint still on default Market sell path.
  15. /limits. Unchanged place-card IA (unless a shared component forced a surgical prop).
  16. Regression: make test-frontend (TradePage, TradeMarketOrderPanel slippage + submit snapshot, LimitOrderBidAskSideSelector, TokenLogo allowlist), make verify-issue-563 (amended tab rule), make verify-issue-528 (chips when Advanced open), make verify-issue-561, make verify-issue-653, python3 scripts/check_design_tokens.py, python3 scripts/check_chrome_nesting.py.

Test plan — attack, hack, and abuse

  • A1 Accidental market. Default Market must not auto-submit. Footer stays disabled / Connect Wallet until a valid amount + gates. Switching to Limit must not leave a Market mutate pending that can fire.
  • A2 Hidden slippage. Closed Advanced still applies store default 5% (or last user choice) to max_spread / min receive. Do not silently submit max_spread=0 or 50%. Quote vs execute snapshot tests stay.
  • A3 Logo / wash XSS. No dangerouslySetInnerHTML. logo_url only via allowlist (https + TOKEN_LOGO_ALLOWED_HOSTS). Reject javascript:, data:, http, and off-allowlist hosts. Color path must not inject raw metadata into style except numeric rgba(...) the app computed. Canvas from tainted image → fallback, no exception leak.
  • A4 Wash as phishing / contrast attack. Extreme palettes (white, near-black, neon) must clamp so heading and pause/alert-error stay readable. Token wash must not recolor Buy/Sell or the money CTA (direction spoof).
  • A5 Side / invert fund direction. Flattened DOM must not swap bid/ask handlers. Invert still converts display price, not factory side (T563-7 / #524). Click Buy still bid.
  • A6 Second submit / inert leak. Flatten must not mount two Market or two Limit CTAs. Hidden ticket (inert) must not focus tabs, Advanced, or submit.
  • A7 Docs instead of errors. Single Docs link must not replace pause / blacklist / freeze / tax / hop-spread / book-exceeds-pay alerts.
  • A8 Book Edit while Market default. Edit must not submit a market swap with the draft amount. It must switch tab first, then apply draft.
  • A9 Pair / logo race. Stale color or logo from the previous pair must not paint the new heading (abort or key off pairAddr + displayed base id).
  • A10 Privacy. Color extract must not send the logo to a third-party API. No new network beyond existing allowlisted <img>.
  • A11 /limits regression. Shared selector/amount changes must not alter /limits escrow or add Market default there.

Verification criteria

  • make lint-frontend and scoped make test-frontend green (Trade ticket / Market panel / TokenLogo / heading tests).
  • New make verify-issue-<id> covers T1–T11 (unit + targeted Playwright if layout needs geometry).
  • make verify-issue-563 (updated), make verify-issue-528, make verify-issue-561, make verify-issue-653 green.
  • python3 scripts/check_design_tokens.py and python3 scripts/check_chrome_nesting.py green.
  • Manual: dark + light, ~375px and ~1280px /trade — Market default, compact tabs, logo+wash, no Side/Top buy, no mode card, slippage only in Advanced, footer docked.
  • No orange header wash in source (rgba(251, 146, 60 gone from the ticket header).
## Summary The `/trade` order ticket is **Limit-first**, uses **full-width `tab-glass` pills**, and stacks **nested cards** (Side panel + Top buy/Top sell + Market/Limit `TicketSection` + a second “Market” heading + quote `card-glass`). The **Buy {base}** header has **no token logo** and a **hard-coded orange** wash that ignores the asset. Flatten the ticket: default **Market**, compact underline Market/Limit text, logo + logo-derived heading wash, Buy/Sell directly in the parent (no Side chrome, no Top buy/Top sell), one **Market Docs** / **Limit Docs** line (not a card, not a second title), and move **Slippage protection** plus other non-blocking amount chrome into **Advanced**. Styling / IA only. **Do not** change escrow mapping, quote payloads, hybrid always-on, footer CTA dock, or on-chain `side`. Related (do not re-open): [#152](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/152) Market tab, [#153](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/153) radiogroup, [#155](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/155) side amount, [#489](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/489) copy density, [#497](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/497) / [#528](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/528) slippage, [#524](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/524) invert, [#527](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/527) footer dock, [#563](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/563) heading + green/red Buy/Sell (**T563-6** tab-glass rule is **amended** here), [#653](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/653) one chrome layer, [#378](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/378) logo allowlist, [#596](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/596) hybrid always on, [#501](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/501) GET `/route/solve`. ## Current codebase ### Default tab is Limit [`TradeOrderTicket.tsx`](frontend-dapp/src/components/trade/TradeOrderTicket.tsx) initializes `orderTab` to `'limit'`. Fresh `/trade/:pair` therefore shows the resting-book form (price, expiry, pre-submit) and the footer **Place limit** CTA. Market (taker swap + hybrid quote) is a second click. Book **Edit** already forces `setOrderTab('limit')` — keep that. Tests assume Limit-first: [`TradePage.test.tsx`](frontend-dapp/src/pages/TradePage.test.tsx) finds `trade-limit-submit` / `trade-limit-pre-submit-summary` without clicking the Limit tab; Market footer tests click `trade-order-tab-market` first. ### Market / Limit are nested full-width pills When `pairAddr` is `terra1…`, a 2-column `grid` with `rounded-2xl border` + `tab-glass` / `tab-glass-active` hosts **Limit** then **Market** (`role="tablist"`, `trade-order-tab-*`). [`docs/frontend.md`](docs/frontend.md) **T563-6** and the Bid/Ask side table say Limit/Market tabs **stay `tab-glass*`**. That uses a full ticket-width row for two words. ### Heading: text only + hard-coded orange wash `data-testid="trade-ticket-header"` sets `radial-gradient(… rgba(251, 146, 60, 0.18) …)` — orange, not the displayed base. `h3.trade-ticket-heading` is `{verb} {displayBase}` or `Select a pair` (**T563-1**). No [`TokenLogo`](frontend-dapp/src/components/ui/TokenLogo.tsx) / [`TokenDisplay`](frontend-dapp/src/components/ui/TokenDisplay.tsx). Invert stays in the row (**T563-4**). Logo allowlist + blockie fallback already exist ([#378](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/378), `useTokenDisplayInfo`). ### Side panel + Top buy / Top sell `TicketSection title="Side"` wraps [`LimitOrderBidAskSideSelector`](frontend-dapp/src/components/trade/LimitOrderBidAskSideSelector.tsx) (`idPrefix="trade-ticket"`, compact) **and** two `TicketStat` tiles: **Top buy** / **Top sell** (`bestBidLabel` / `bestAskLabel`). `TicketSection` is a second `rounded-2xl border` + wash **inside** the ticket `card-glass`. Book head already lives on the sibling order-book panel. ### Market / Limit cards duplicate the mode word Market: `TicketSection title="Market" tone="action"` **plus** [`TradeMarketOrderPanel.tsx`](frontend-dapp/src/components/trade/TradeMarketOrderPanel.tsx) `<h3>Market</h3>` and a “Taker swap at {n}% slippage protection… **Docs**” paragraph. Limit: `TicketSection title="Limit" tone="action"` around price / pay / receive / expiry / advanced / [`LimitOrderPreSubmitSummary`](frontend-dapp/src/components/trade/LimitOrderPreSubmitSummary.tsx) (another `card-glass`, its own Docs). Mode name appears twice; Docs is buried in lecture copy or the pre-submit card. ### Slippage and amount chrome sit on the default Market path Always visible on Market (above Advanced): - `SlippageProtectionPresets` (`trade-market-slippage-presets`, 0.5 / 1 / 5 — [#528](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/528)) - Taker-swap lecture sentence - [`LimitOrderEscrowAmountField`](frontend-dapp/src/components/trade/LimitOrderEscrowAmountField.tsx): **Pay ({symbol})**, USD notional, balance + 25/50/75/100% - Quote `card-glass` (`trade-market-quote`): expected receive, min after slippage, disclosure, hop spread, Route - [`SwapPreSubmitSummary`](frontend-dapp/src/components/swap/SwapPreSubmitSummary.tsx) Advanced today is only hybrid book-leg override + max makers ([#501](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/501) / [#596](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/596)). Limit default path still shows expiry, % deviation chips, ref/%/USD context, side-flip, receive USD, and the pre-submit fee card. `LimitOrderAdvancedLimitSettings` already holds placement gas + raw `expires_at`. ## Why the new implementation is needed 1. **Wrong default for a trade desk.** `/trade` is the execution page; Market (immediate taker) is the common path. Limit-first trains users into resting-book fields and a **Place limit** CTA they did not ask for. 2. **Nested chrome is visual noise.** Ticket `card-glass` → Side section → stat tiles → Market/Limit action card → quote/pre-submit `card-glass` is a card-of-cards. That fights [#653](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/653) / [#489](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/489) and wastes the narrow ticket column. 3. **Mode switch should be text, not a second toolbar.** Full-width pills duplicate the mode title that the card repeats. Small underlined Market / Limit uses less horizontal space and reads as a mode, not a primary action (Buy/Sell and the footer CTA stay primary). 4. **Heading identity.** **Buy {base}** without a logo is weaker than Swap/picker rows. The orange wash is leftover warm chrome ([#488](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/488) forbids gold/orange fills) and does not track the asset after invert / pair switch. 5. **Top buy / Top sell are redundant.** The book panel is the book. Duplicating best bid/ask on the ticket adds a Side section that exists only to nest the radiogroup. 6. **Slippage is power-user chrome on Market.** Default 5% already applies ([#497](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/497)). The chips and lecture sentence crowd the amount field. They belong under **Advanced** with hybrid override — not deleted. ## Constraints / guardrails 1. **Scope = `/trade` ticket.** Do **not** restyle `/limits` place card except where a shared primitive must change; `/limits` stays Limit-only. Do not change Swap Settings slippage placement. 2. **Default Market on fresh mount only.** Book **Edit** / limit draft (`limitBookDraftKey`) still `setOrderTab('limit')` and prefills (**L561-11**, [#178](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/178)). **Place another** after a successful limit stays on Limit and still focuses the price field ([#161](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/161)). Pair remount (keyed Outlet) → Market again. 3. **Do not change money semantics.** Bid still escrows token1; ask token0. Side change still clears / MAX-reapplies ([#155](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/155)). Click Buy still `onSideChange('bid')`. Quotes stay GET `/route/solve` (Advanced typed book → POST). Hybrid stays always on — no opt-out ([#596](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/596)). `max_spread = slippage/100`; default **5%**; presets `[0.5, 1, 5]` ([#497](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/497) / [#528](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/528)). 4. **Keep a11y.** Market/Limit remain `role="tablist"` / `tab` / `tabpanel` (or an equivalent labelled switch). Buy/Sell stay the #153 radiogroup (`aria-checked`, Arrow/Home/End). New text tabs need `:focus-visible` ([#144](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/144)). Selected mode = underline + `aria-selected` (not color-only). 5. **Buy/Sell stay green/red `side-control*`** (**T563-5**). Do **not** paint them with the token wash. Do **not** paint footer **Market buy/sell** / **Place limit** green/red. Do **not** restyle book Bid/Ask columns. 6. **Heading stays text nodes** — `{verb} {displayBase}` plus a sibling `TokenLogo` (no `dangerouslySetInnerHTML`). **T563-1** wrap still applies; logo is `shrink-0`. Invert stays tappable. Logo via allowlisted `TokenLogo` only ([#378](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/378)); blockie when no safe URI. Wash from the **displayed base** after invert ([#524](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/524)). 7. **Logo color is a muted wash, not a trust signal.** Clamp luminance/alpha so heading stays `--ink` on dark **and** light. Fallback: deterministic hue from token id / blockie, **never** the current orange `rgba(251, 146, 60, 0.18)`. No CSS/`url()` injection from metadata. Canvas extract only from allowlisted `https` images; tainted/CORS failure → fallback. Do not fetch arbitrary `logo_url` hosts. 8. **One chrome layer inside the ticket.** Delete `TicketSection` / `TicketStat` on this ticket (or stop using them). No Market/Limit wrapper card. Quote / pre-submit must not be a second `card-glass` on the default path — typography or Advanced. Ticket shell `card-glass` / sibling Trade panels stay (**L561**). Do not wrap `PriceChart`. Update [`scripts/chrome_nesting_allowlist.txt`](scripts/chrome_nesting_allowlist.txt) / `check_chrome_nesting.py` if the flatten adds or removes a same-file nest. 9. **Single mode + Docs line.** One **Market** + **Docs** (or **Limit** + **Docs**) — not `TicketSection` title **and** an inner `<h3>Market</h3>` **and** a lecture sentence. Docs is optional depth ([#489](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/489)); it must not replace pause / blacklist / code-id-frozen / tax extra-debit / hop-spread blocking errors. 10. **Default Market path (keep):** heading+logo, Market/Limit text, Buy/Sell, Pay amount + Max, one expected-receive line, footer CTA, blocking alerts (pause, frozen, blacklist, tax extra-debit, quote error, book-leg exceeds pay). 11. **Advanced Market (move, do not delete):** Slippage chips (keep `trade-market-slippage-*` testids and #528 `grid-cols-3` when open; still in ticket body, not footer), hybrid book leg + max makers, min-after-slippage / disclosure / hop spread / Route extras / pre-submit fee grid / taker lecture (or delete the lecture). 12. **Default Limit path (keep):** heading+logo, tabs, Buy/Sell, price input, Pay + Max, Receive, footer CTA, invalid buy/sell alert. **Advanced Limit:** expiry (remove the always-on `LimitOrderExpiryField` duplicate), placement gas, % chips + ref/USD context if they crowd the price row, pre-submit fee card. Side-flip may stay compact between Pay/Receive. 13. **Do not hide safety.** Community-tax extra-debit hint, pause, code-id freeze, trading blacklist, indexer outage banner, and submit guards stay on the default path. Outage copy still must not leak `VITE_INDEXER_URL` ([#164](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/164)). 14. **One `TradeOrderTicket` mount.** Hidden desktop ticket stays `inert` + `interactive={false}` (**L561-6**). Flattened DOM must not create a second submit or a focusable control inside `inert`. 15. **Amend docs that freeze `tab-glass` tabs:** **T563-6**, `docs/frontend.md` Bid/Ask “Limit vs Market tabs stay `tab-glass*`”, [`AGENTS_FRONTEND_TRADE_TICKET_HEADING.md`](skills/AGENTS_FRONTEND_TRADE_TICKET_HEADING.md). Playbook + `make verify-issue-*` for this issue. 16. **No lecture banners.** Do not add “Market is now the default” copy on the page. ## Relevant files | Path | Role | |------|------| | [`frontend-dapp/src/components/trade/TradeOrderTicket.tsx`](frontend-dapp/src/components/trade/TradeOrderTicket.tsx) | Default tab, header wash, `TicketSection` / `TicketStat`, tablist, Side wrapper | | [`frontend-dapp/src/components/trade/TradeMarketOrderPanel.tsx`](frontend-dapp/src/components/trade/TradeMarketOrderPanel.tsx) | Duplicate Market heading, slippage, quote card, Advanced | | [`frontend-dapp/src/components/trade/LimitOrderBidAskSideSelector.tsx`](frontend-dapp/src/components/trade/LimitOrderBidAskSideSelector.tsx) | Buy/Sell — keep behavior; parent loses Side chrome | | [`frontend-dapp/src/components/trade/LimitOrderEscrowAmountField.tsx`](frontend-dapp/src/components/trade/LimitOrderEscrowAmountField.tsx) | Pay input chrome | | [`frontend-dapp/src/components/trade/LimitOrderPriceField.tsx`](frontend-dapp/src/components/trade/LimitOrderPriceField.tsx) | Limit price + deviation chips | | [`frontend-dapp/src/components/trade/LimitOrderExpiryField.tsx`](frontend-dapp/src/components/trade/LimitOrderExpiryField.tsx) | Always-on expiry — move under Advanced on `/trade` | | [`frontend-dapp/src/components/trade/LimitOrderAdvancedLimitSettings.tsx`](frontend-dapp/src/components/trade/LimitOrderAdvancedLimitSettings.tsx) | Limit Advanced | | [`frontend-dapp/src/components/trade/LimitOrderPreSubmitSummary.tsx`](frontend-dapp/src/components/trade/LimitOrderPreSubmitSummary.tsx) | Nested `card-glass` + Docs | | [`frontend-dapp/src/components/swap/SwapPreSubmitSummary.tsx`](frontend-dapp/src/components/swap/SwapPreSubmitSummary.tsx) | Market pre-submit card | | [`frontend-dapp/src/components/common/SlippageProtectionPresets.tsx`](frontend-dapp/src/components/common/SlippageProtectionPresets.tsx) | Shared chips — move call site only | | [`frontend-dapp/src/components/ui/TokenLogo.tsx`](frontend-dapp/src/components/ui/TokenLogo.tsx) / [`TokenDisplay.tsx`](frontend-dapp/src/components/ui/TokenDisplay.tsx) | Heading logo | | [`frontend-dapp/src/hooks/useTokenDisplayInfo.ts`](frontend-dapp/src/hooks/useTokenDisplayInfo.ts) | Logo URI + blockie seed | | [`frontend-dapp/src/utils/tokenLogoAllowlist.ts`](frontend-dapp/src/utils/tokenLogoAllowlist.ts) | Host allowlist | | [`frontend-dapp/src/index.css`](frontend-dapp/src/index.css) | `.trade-ticket-heading`, new text-tab + wash primitives | | [`frontend-dapp/src/theme-dark.css`](frontend-dapp/src/theme-dark.css) / [`theme-light.css`](frontend-dapp/src/theme-light.css) | Contrast | | [`frontend-dapp/src/pages/TradePage.test.tsx`](frontend-dapp/src/pages/TradePage.test.tsx) | Limit-first assumptions | | [`frontend-dapp/src/components/trade/__tests__/TradeMarketOrderPanel.slippagePresets.test.tsx`](frontend-dapp/src/components/trade/__tests__/TradeMarketOrderPanel.slippagePresets.test.tsx) | Chips now under Advanced | | [`frontend-dapp/e2e/trade-page-responsive.spec.ts`](frontend-dapp/e2e/trade-page-responsive.spec.ts) | Heading / ticket | | [`docs/frontend.md`](docs/frontend.md) § ticket heading + market context | Amend T563-6; new ticket IA subsection | | [`docs/design-system.md`](docs/design-system.md) | No orange fill; one chrome layer | | [`skills/AGENTS_FRONTEND_TRADE_TICKET_HEADING.md`](skills/AGENTS_FRONTEND_TRADE_TICKET_HEADING.md) | Tab style + logo | | [`skills/AGENTS_FRONTEND_TRADE_PAGE_LAYOUT.md`](skills/AGENTS_FRONTEND_TRADE_PAGE_LAYOUT.md) | Cross-link | | [`skills/AGENTS_FRONTEND_CHROME_NESTING.md`](skills/AGENTS_FRONTEND_CHROME_NESTING.md) | Inner ticket flatten | | [`skills/AGENTS_FRONTEND_SLIPPAGE_PRESET_ALIGN.md`](skills/AGENTS_FRONTEND_SLIPPAGE_PRESET_ALIGN.md) | Chips under Advanced | | [`QA_TEMPLATE.md`](QA_TEMPLATE.md) | Limit-place-card / tab checks | ## Recommended direction 1. **`useState('market')`.** Update tests that assumed Limit-first: click `trade-order-tab-limit` where the case is Limit-only; assert `trade-order-tab-market` `aria-selected="true"` on fresh mount. Keep book-Edit → Limit. 2. **Replace the bordered 2-col `tab-glass` row** with a compact inline text pair: small type, selected = underline + `aria-selected`, idle = muted, **intrinsic width** (not `w-full`). Keep testids `trade-order-tab-limit` / `trade-order-tab-market`. 3. **Heading row:** `TokenLogo` (displayed base) + existing `h3` text + invert. Drive header `background` from a **clamped** accent (logo sample or id-hash). Delete the orange radial. `Select a pair` = no logo, neutral wash. 4. **Unwrap Side:** render `LimitOrderBidAskSideSelector` as a direct child of `trade-order-ticket-scroll`. Delete **Top buy** / **Top sell** and `TicketStat` if unused. 5. **Unwrap Market/Limit:** drop `TicketSection`. One line: **Market** + Docs **or** **Limit** + Docs. Remove the inner `<h3>Market</h3>` and the always-on taker paragraph. 6. **Move `SlippageProtectionPresets`** into `trade-market-advanced` (open section). Keep #528 geometry when expanded. Same for quote extras / `SwapPreSubmitSummary`. Leave a single expected-receive line on the default path (not a nested card). 7. **Limit `/trade`:** move expiry + pre-submit card + crowding price context into Advanced; keep price + Pay + Receive on the default path. 8. **Docs/skills/QA** as in guardrail 15. Add `make verify-issue-<id>` (Vitest + targeted e2e). ## Acceptance criteria - [ ] **T1 Default Market.** Fresh `/trade/:pair` (valid `terra1`) has `trade-order-tab-market` `aria-selected="true"`; Market pay field + footer Market CTA; no limit price input until Limit is selected. - [ ] **T2 Limit still reachable.** Clicking Limit shows price / Pay / Place limit; Market unmounts from the tabpanel (one money CTA). Book Edit and limit draft still select Limit and prefill. - [ ] **T3 Compact tabs.** Market/Limit are small underlined text (selected underline; not `tab-glass` pills; not a full-width 2-col bordered toolbar). Less horizontal space than today’s `grid-cols-2` pills. Keyboard + `aria-*` remain. - [ ] **T4 Heading logo.** With a selected pair, `trade-ticket-heading` row shows allowlisted `TokenLogo` (or blockie) for the **displayed** base beside **Buy {base}** / **Sell {base}**. Invert updates logo + verb/base together. `Select a pair` has no logo. - [ ] **T5 Wash from token, not orange.** `trade-ticket-header` has **no** `rgba(251, 146, 60` / warm orange radial. Wash tracks displayed-base identity across pair switch and invert. Heading contrast holds on dark and light. Fallback never returns to the orange constant. - [ ] **T6 No Side chrome.** No “Side” section title. No **Top buy** / **Top sell**. Buy/Sell radiogroup is a direct child of the ticket scroll (or heading stack), not wrapped in `TicketSection`. - [ ] **T7 No mode card; mode word once.** No `TicketSection` Market/Limit card. Visible mode title appears **once** with a single Docs link (**Market** + Docs or **Limit** + Docs). No second `<h3>Market</h3>`. - [ ] **T8 Slippage in Advanced.** Default Market path does **not** show `trade-market-slippage-presets`. Opening Advanced shows the same 0.5/1/5 group (#528). Changing a chip still writes `useDexStore.slippageTolerance` and the next quote/submit `max_spread`. Default remains 5% when Advanced stays closed. - [ ] **T9 Amount path declutter.** Default Market: Pay + Max + one expected-receive line + blocking errors. Lecture / min-after-slippage / Route extras / pre-submit card live under Advanced (or are removed if they only repeat the receive line). Default Limit: price + Pay + Receive; expiry / fee grid / crowding ref chips under Advanced. No extra `card-glass` around the amount input. - [ ] **T10 Behavior unchanged.** Escrow, hybrid always-on, GET vs POST quote, footer dock (#527), one ticket mount (#178), pause/blacklist/frozen, tax extra-debit hint, Connect Wallet paths (**T563-3**) unchanged. - [ ] **T11 Docs.** `docs/frontend.md` + design-system + skills + QA updated; **T563-6** amended; `make verify-issue-<id>` exists. ## Test plan — all paths 1. **Fresh desktop `/trade/:pair`.** Market selected; Market pay + Market footer CTA; no `limit-order-price-input`; no Side / Top buy / Top sell; no Market `TicketSection` card; heading has logo + non-orange wash. 2. **Click Limit.** Price + Pay + Place limit; one **Limit** + Docs; Market panel gone; Buy/Sell still work. 3. **Click Market again.** Pay field restores (or empty per current state rules); footer Market CTA; slippage still hidden until Advanced. 4. **Buy → Sell → invert.** Heading verb/base/logo and side labels track displayed base; escrow still bid=token1 / ask=token0 in factory space; footer stays docked. 5. **Book Edit** while on Market (ticket visible and ticket hidden). Ticket shows Limit, price/amount prefilled, Update/Place in footer (**L561-11**). 6. **Place another** after a successful limit. Stays Limit; price focused; fields reset per #161. 7. **Pair switch** (keyed remount). New ticket defaults Market; wash/logo follow the new displayed base. 8. **Disconnected.** Footer Connect Wallet on Market and Limit; no header wallet chip. 9. **Advanced Market.** Toggle open: slippage chips aligned; 0.5/1/5 update store + quote min receive; book-leg + max makers still work; GET vs POST unchanged. Toggle closed: chips gone; last slippage still applies to submit. 10. **Advanced Limit.** Expiry + gas reachable; default Limit path has no duplicate expiry row / pre-submit card. 11. **Phone + tablet** (`trade-sub-lg-workspace`) and desktop (`lg`). Tabs stay compact; heading wraps (T563-1); logo does not cover invert or Sell. 12. **Light + dark.** Wash + heading + idle/selected tabs + Buy/Sell contrast. 13. **No pair / invalid pair / paused / frozen / blacklist / indexer outage.** Existing banners and CTAs; flatten does not hide them. 14. **Community-tax listed pair.** Extra-debit hint still on default Market sell path. 15. **`/limits`.** Unchanged place-card IA (unless a shared component forced a surgical prop). 16. **Regression:** `make test-frontend` (TradePage, TradeMarketOrderPanel slippage + submit snapshot, LimitOrderBidAskSideSelector, TokenLogo allowlist), `make verify-issue-563` (amended tab rule), `make verify-issue-528` (chips when Advanced open), `make verify-issue-561`, `make verify-issue-653`, `python3 scripts/check_design_tokens.py`, `python3 scripts/check_chrome_nesting.py`. ## Test plan — attack, hack, and abuse - [ ] **A1 Accidental market.** Default Market must not auto-submit. Footer stays disabled / Connect Wallet until a valid amount + gates. Switching to Limit must not leave a Market mutate pending that can fire. - [ ] **A2 Hidden slippage.** Closed Advanced still applies store default 5% (or last user choice) to `max_spread` / min receive. Do not silently submit `max_spread=0` or 50%. Quote vs execute snapshot tests stay. - [ ] **A3 Logo / wash XSS.** No `dangerouslySetInnerHTML`. `logo_url` only via allowlist (`https` + `TOKEN_LOGO_ALLOWED_HOSTS`). Reject `javascript:`, `data:`, http, and off-allowlist hosts. Color path must not inject raw metadata into `style` except numeric `rgba(...)` the app computed. Canvas from tainted image → fallback, no exception leak. - [ ] **A4 Wash as phishing / contrast attack.** Extreme palettes (white, near-black, neon) must clamp so heading and pause/`alert-error` stay readable. Token wash must not recolor Buy/Sell or the money CTA (direction spoof). - [ ] **A5 Side / invert fund direction.** Flattened DOM must not swap bid/ask handlers. Invert still converts display price, not factory side (**T563-7** / #524). Click Buy still bid. - [ ] **A6 Second submit / inert leak.** Flatten must not mount two Market or two Limit CTAs. Hidden ticket (`inert`) must not focus tabs, Advanced, or submit. - [ ] **A7 Docs instead of errors.** Single Docs link must not replace pause / blacklist / freeze / tax / hop-spread / book-exceeds-pay alerts. - [ ] **A8 Book Edit while Market default.** Edit must not submit a market swap with the draft amount. It must switch tab first, then apply draft. - [ ] **A9 Pair / logo race.** Stale color or logo from the previous pair must not paint the new heading (abort or key off `pairAddr` + displayed base id). - [ ] **A10 Privacy.** Color extract must not send the logo to a third-party API. No new network beyond existing allowlisted `<img>`. - [ ] **A11 `/limits` regression.** Shared selector/amount changes must not alter `/limits` escrow or add Market default there. ## Verification criteria - [ ] `make lint-frontend` and scoped `make test-frontend` green (Trade ticket / Market panel / TokenLogo / heading tests). - [ ] New `make verify-issue-<id>` covers T1–T11 (unit + targeted Playwright if layout needs geometry). - [ ] `make verify-issue-563` (updated), `make verify-issue-528`, `make verify-issue-561`, `make verify-issue-653` green. - [ ] `python3 scripts/check_design_tokens.py` and `python3 scripts/check_chrome_nesting.py` green. - [ ] Manual: dark + light, ~375px and ~1280px `/trade` — Market default, compact tabs, logo+wash, no Side/Top buy, no mode card, slippage only in Advanced, footer docked. - [ ] No orange header wash in source (`rgba(251, 146, 60` gone from the ticket header).
PlasticDigits commented 2026-08-29 04:06:36 +00:00 (Migrated from gitlab.com)

mentioned in merge request !1194

mentioned in merge request !1194
PlasticDigits commented 2026-08-29 04:56:14 +00:00 (Migrated from gitlab.com)

mentioned in issue #701

mentioned in issue #701
PlasticDigits commented 2026-08-29 04:56:26 +00:00 (Migrated from gitlab.com)

Heads-up: !1195 (#692 /pool Vol USD) merged to main (f4fa6788). !1194 is still open and was left alone.

Overlaps with that merge: Makefile, AGENTS.md, docs/frontend.md (verify-target / docs lists). Rebase feat/693-trade-ticket-flatten onto current main before merging !1194. Ticket flatten itself does not overlap the Vol USD UI.

Heads-up: !1195 (#692 `/pool` Vol USD) merged to `main` (`f4fa6788`). !1194 is still open and was left alone. Overlaps with that merge: `Makefile`, `AGENTS.md`, `docs/frontend.md` (verify-target / docs lists). Rebase `feat/693-trade-ticket-flatten` onto current `main` before merging !1194. Ticket flatten itself does not overlap the Vol USD UI.
PlasticDigits commented 2026-08-29 05:14:08 +00:00 (Migrated from gitlab.com)

Merge review (!1194)

Rebased onto current main (includes !1195). Makefile help conflict resolved by keeping verify-issue-692 on the Cloud Agent line and verify-issue-693 on the Frontend line.

Local AC: make verify-issue-693 9/9 PASS. Related make verify-issue-563 13/13 and make verify-issue-653 14/14 PASS. T1–T11 / A1–A11 look met in source (Market default, compact text tabs, logo+wash, flatten Side/mode, slippage/expiry under Advanced, /limits unchanged).

Follow-up in-branch: e2e/trade-page-responsive.spec.ts now opens Limit Advanced before measuring #trade-ticket-expiry-dt (expiry moved off the default path per T9).

Not merge-blocking: Playwright /trade geometry (375 / 1280) and manual dark+light QA 10.2.19 were not run here. Track those on a leftover after merge. Do not reopen this issue for ops/QA.

## Merge review (!1194) Rebased onto current `main` (includes !1195). Makefile help conflict resolved by keeping `verify-issue-692` on the Cloud Agent line and `verify-issue-693` on the Frontend line. Local AC: `make verify-issue-693` **9/9 PASS**. Related `make verify-issue-563` 13/13 and `make verify-issue-653` 14/14 PASS. T1–T11 / A1–A11 look met in source (Market default, compact text tabs, logo+wash, flatten Side/mode, slippage/expiry under Advanced, `/limits` unchanged). **Follow-up in-branch:** `e2e/trade-page-responsive.spec.ts` now opens Limit **Advanced** before measuring `#trade-ticket-expiry-dt` (expiry moved off the default path per T9). **Not merge-blocking:** Playwright `/trade` geometry (375 / 1280) and manual dark+light QA **10.2.19** were not run here. Track those on a leftover after merge. Do not reopen this issue for ops/QA.
PlasticDigits commented 2026-08-29 05:14:22 +00:00 (Migrated from gitlab.com)

mentioned in commit e6ddbf1d4c

mentioned in commit e6ddbf1d4cccf8fc6093efbf4bf48b4de03da652
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-08-29 05:14:22 +00:00
PlasticDigits commented 2026-08-29 05:14:43 +00:00 (Migrated from gitlab.com)

mentioned in issue #702

mentioned in issue #702
PlasticDigits commented 2026-08-29 05:14:43 +00:00 (Migrated from gitlab.com)

marked as related to #702

marked as related to #702
PlasticDigits commented 2026-08-29 05:14:50 +00:00 (Migrated from gitlab.com)

Merged

!1194 is on main (e6ddbf1d). Local make verify-issue-693 was 9/9. Ops leftovers (Coolify frontend rebuild, /trade 10.2.19 visual QA) tracked on #702. Do not reopen this issue for ops/QA.

## Merged !1194 is on `main` (`e6ddbf1d`). Local `make verify-issue-693` was 9/9. Ops leftovers (Coolify frontend rebuild, `/trade` 10.2.19 visual QA) tracked on #702. Do not reopen this issue for ops/QA.
PlasticDigits commented 2026-08-31 05:36:04 +00:00 (Migrated from gitlab.com)

mentioned in issue #713

mentioned in issue #713
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
code/cl8y-dex-terraclassic#693
No description provided.