fix(frontend): Treasury Assets cards clip values and misalign on iPad #21

Closed
opened 2026-08-27 00:18:01 +00:00 by PlasticDigits · 10 comments
PlasticDigits commented 2026-08-27 00:18:01 +00:00 (Migrated from gitlab.com)

Summary

/treasury Treasury Assets cards clip primary amounts, LP pool-share copy, and CR haircut lines on tablet / iPad viewports. A three-column grid at the Tailwind lg breakpoint (1024px) plus a single-row card with a non-shrinking label leaves too little room for formatPoolShare / formatAmount / CR strings. Truncation uses CSS ellipsis, so readers cannot recover the missing text on iPad (no hover).

This is a display-only layout bug. Do not change CR math, available-supply, LP allowlisting, or on-chain behavior.


Current codebase

TreasuryPage (frontend/src/pages/TreasuryPage.tsx) renders TreasuryAssetsCard inside Layout (frontend/src/components/layout/Layout.tsx): container mx-auto px-4. Tailwind’s default container at lg is 1024px, so iPad landscape / iPad Pro 12.9" portrait (1024 CSS px) minus page padding (~32px) and CardContent padding (p-5 md:p-6) leaves ~900px for the grid.

The grid is:

grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3

At 1024px that is three columns. Each tile is a horizontal flex row (flex items-center justify-between gap-2 … min-w-0):

  • Left (flex-shrink-0): 40px TokenIcon, rank badge, and pairLabel / displayName (LP UST1/cUSTC, LP UST1/USTR, LP UST1/SpaceUSD from tokenlist.json pool.name via treasuryLp.ts → useTreasury).
  • Right (min-w-0 flex-1):
    • Primary: LP → formatPoolShare ("97.43% of pool", "100% of pool"); spot → formatAmount (up to 6 fraction digits, e.g. 41,190,153.481234). Classes include text-sm sm:text-base lg:text-lg … truncate.
    • USD via local formatUsd ($x.xx, or $x.xxxxxx when < 0.01).
    • LP haircut: CR counts ${formatUsd(crUsd)} (${haircutLegs.join(', ')} omitted) with truncate.

truncate (overflow: hidden; text-overflow: ellipsis; white-space: nowrap) is why production shows 100% of …, 97.43% o…, and CR counts $0.00000…. Spot rows (USTC, LUNC) also clip large balances. Loading skeleton uses the same 3-col grid; empty state does not.

Issuance and Key Ratios use md:grid-cols-2 and were not the reported failure. Keep them unchanged unless the same overflow appears after the assets-grid fix.

Related: #20 will add another long LP label (CL8Y/cUSTC). Same layout must accept that row.


Why a new implementation is needed

Treasury is the public CR / holdings surface. On iPad the grid looks uneven: short spot names fit, long LP names steal the row, and the numbers that matter (pool share, USD, what CR counts) disappear into ellipsis. Users cannot tap to expand; title is hover-only.

A breakpoint-only tweak or a copy-only tweak is not enough by itself: 2-col still fails if the left cluster never shrinks and the right cluster never wraps. The card chrome and the value typography need to share one tablet-safe layout.


Constraints / guardrails

  • Display-only. Do not change computeTreasuryRatios, computeLpNav, available-supply, haircut rules, skip-lists, or contract queries.
  • Do not hide CR disclosure to save space. Protocol / wrap legs stay visibly omitted from CR (copy may be shorter, meaning must stay).
  • Do not use hover title as the only fix. iPad has no hover.
  • Do not factory-discover LPs or invent tokenlist rows to shorten names.
  • pairLabel stays sourced from tokenlist (pool.name / name / symbol). Do not hardcode production pair names in the component.
  • formatPoolShare already treats share ≥ 0.99995 as 100% of pool (format.test.ts). Do not widen that rounding.
  • If display decimals on cards change, CR / NAV math and raw balances stay untouched. Do not round 99.99% up to 100% beyond the existing helper.
  • Keep loading, empty, rank badges, View Contract, Pair explorer links, NAV incomplete, and vFDUSD session oracle annotation.
  • Dust filter (shouldShowAsset) unchanged.
  • No new runtime dependencies for a layout fix. Match existing Tailwind / glass card language.
  • Render labels and amounts as React text (no dangerouslySetInnerHTML). Tokenlist strings are untrusted length.
  • Do not introduce page-level horizontal scroll that hides header CTAs or View Contract.
  • Do not shrink type below readable tablet body size.

Relevant files

File Role
frontend/src/components/treasury/TreasuryAssetsCard.tsx Grid breakpoints, card flex, truncate, CR / USD / share rendering
frontend/src/pages/TreasuryPage.tsx Page composition, LP footnote
frontend/src/components/layout/Layout.tsx container mx-auto px-4 width budget
frontend/src/components/common/Card.tsx CardContent padding
frontend/src/utils/format.ts formatPoolShare, formatAmount
frontend/src/utils/format.test.ts Existing share-copy fixtures
frontend/src/types/treasury.ts TreasuryAsset (kind, pairLabel, poolShare, crUsd, haircutLegs)
frontend/src/services/treasuryLp.ts pairLabel from tokenlist
frontend/src/hooks/useTreasury.ts Builds LP asset rows
frontend/public/assets/tokenlist.json Live pair names (LP UST1/USTR, LP UST1/cUSTC, LP UST1/SpaceUSD)
frontend/src/index.css .font-mono-numbers (tabular / wide digits)
frontend/tailwind.config.js Default screens (sm 640, md 768, lg 1024, xl 1280)

Prefer all three (they are one layout change, not three features):

  1. Breakpoints. Keep 1-col on narrow phones, 2-col through tablet including 1024px (lg). Move 3-col to xl (1280+) so classic iPad landscape is not forced into three cramped tiles. Apply the same classes to the loading skeleton.
  2. Card structure. Stop treating the label cluster as flex-shrink-0 on a single cramped row. On tablet, stack: identity (icon + name) on one line, values on the next, full width, wrap allowed. Desktop xl may stay a two-column row if values still fit.
  3. Typography / copy (display only). Remove truncate from primary amount, USD, and CR lines, or wrap them. Optional: put "of pool" on a second line or shorten CR to e.g. CR $0.00 · cUSTC omitted without dropping the omitted-leg list. Optional: fewer display fraction digits on large spot balances in the card only.

Do not ship tooltip-only, scale tricks, or a horizontal scroller inside each tile.


Acceptance criteria

  • On iPad-class widths (768, 820, 834, 1024 CSS px, portrait and landscape), every visible Treasury Assets primary value, USD line, and CR / haircut line is fully readable — no ellipsis for current production spot + LP rows, including worst-case LP UST1/SpaceUSD and formatPoolShare strings.
  • Cards in the same row share a consistent alignment (icon/name vs values). Rows may grow in height; they must not overlap or overflow the card.
  • 3-col grid is not used at 1024px. 3-col is reserved for widths that actually fit the longest current labels + values (expected: xl / 1280+).
  • Loading skeleton uses the same column breakpoints as the loaded grid.
  • Empty state, rank badges, View Contract, Pair links, dust filter, NAV incomplete, and vFDUSD session-oracle note still behave as today.
  • CR haircut meaning is unchanged and still visible on LP rows that omit protocol/wrap legs.
  • No change to CR / NAV / available-supply / tokenlist allowlist / on-chain queries.
  • formatPoolShare rounding contract unchanged unless tests are deliberately updated for a shorter display string that still matches ≥ 0.99995 → 100% and rejects non-finite / negative.
  • Layout still works if #20 adds CL8Y/cUSTC (long label + haircut).

Test plan (all paths)

Unit (vitest)

  • If formatPoolShare or card-local USD/CR copy changes: extend frontend/src/utils/format.test.ts (and any new helper tests). Keep: 0.985497 → two-decimal percent; ≥ 0.99995 → 100%; null / NaN / negative → —.
  • formatAmount card-display changes: large USTC/LUNC-style integers, dust < 0.01 USD still six-decimal if that helper stays.

Component / visual (no Playwright in repo today — use Vite preview + DevTools device mode or real iPad)

Path What to check
Loading Skeleton column count matches loaded grid at 375 / 768 / 1024 / 1280
Empty No treasury assets found centered; no stray grid
Spot large USTC / LUNC full amount + USD, no clip
Spot unpriced Balance shown when USD hidden (px <= 0)
Dust hidden Sub-$1 priced spots / LP displayUsd < 1 stay hidden
LP ~100% 100% of pool (or agreed shorter form) fully visible
LP mid share e.g. 97.43% of pool fully visible
LP tiny share four-decimal branch of formatPoolShare if exercised
LP CR $0 + haircut Full omitted-leg list readable (cUSTC / UST1 / USTR / wraps)
LP CR > 0 + haircut e.g. SpaceUSD: USD + CR counts … both complete
LP navIncomplete Amber NAV incomplete wraps, does not overflow
vFDUSD · session oracle does not collide with USD
Rank badges Gold/silver/bronze + numeric ranks stay on the icon, not on the value
View Contract Header link still right-aligned; opens scanner
Pair link Still scanner/address/{explorerAddress}; tappable on iPad
1-col 320–639px: stacked cards, no page X-scroll
2-col tablet 640–1023 and 1024: two columns, values readable
3-col desktop ≥1280: three columns still readable
iPad Safari Mini / Air / 11" / 12.9", portrait + landscape, 100% zoom
Future label Mentally / fixture: LP CL8Y/cUSTC from #20

Regression (unchanged math)

  • Independent CR check still matches Key Ratios when prices are complete (#16 / #18 rules).
  • Issuance cards and Key Ratios layout unchanged unless a new overflow is found.

Tooling

  • cd frontend && npm test && npm run check

Test plan (attack, hack, and abuse vectors)

This surface is public and read-only, but clipped numbers are a deception / integrity bug. Treat the following as required checks:

Vector Why it matters Check
Truncation as false share 100% of … can be read as certainty when the rest of the string is gone; a later 10% position must never look like 100% Long and short shares fully visible; no CSS that clips mid-token
Hidden $0 CR Ellipsis on CR counts $0.00… can hide that protocol legs do not count Haircut line complete; $0 CR still explicit
Hover-only disclosure title / tooltips do not exist for iPad tap No acceptance that relies on hover
Tokenlist / label XSS pool.name is external JSON Stay in React text nodes; no HTML injection; long strings wrap, do not break out of the card
Overlay / stolen taps Overflow or negative margin covering Pair / View Contract Hit targets remain the intended <a href>
Precision wash “Fixing” layout by rounding share or USD so it fits Do not change formatPoolShare 0.99995 rule; do not change CR inputs
Scope creep into CR Layout PR must not retouch treasuryRatios.ts, lpNav.ts, or allowlist discovery Diff limited to presentation
Horizontal scroll phishing Page X-scroll can hide View Contract / wallet chrome document width ≤ viewport at listed breakpoints
Unreadable shrink Tiny fonts “fit” but fail accessibility / abuse of trust Tablet body ≥ existing text-sm / text-xs CR line

Out of scope for this issue: wallet connect, tx signing, contract admin.


Verification criteria

Issue may close only when all of the following are recorded on the MR or this issue:

  1. Screenshots or screen recordings of /treasury at 768, 1024, and 1280 CSS px (and at least one real iPad Safari capture, portrait + landscape if available) showing USTC/LUNC and the three current LP rows with no ellipsis on primary / USD / CR lines.
  2. Confirmation that 1024px is not three columns.
  3. npm test and npm run check green; any format-copy change has unit coverage.
  4. Reviewer confirms the diff does not alter CR / NAV / available-supply / tokenlist allowlist logic.
  5. Pair and View Contract links still open the correct columbus-5 scanner URLs after the layout change.
  6. Production or Coolify preview (ust1cmm.com/treasury or equivalent) re-checked after deploy — local-only is not sufficient to close.

Out of scope

  • On-chain CR, swap, or staking gates.
  • Pinning new LPs (#20 CL8Y/cUSTC) except that this layout must tolerate that label.
  • Issuance / Key Ratios redesign (file a follow-up only if the same clip appears there after this fix).
  • Playwright introduction (optional later; not required to close).

Owner type

frontend / UX

## Summary `/treasury` **Treasury Assets** cards clip primary amounts, LP pool-share copy, and CR haircut lines on tablet / iPad viewports. A three-column grid at the Tailwind `lg` breakpoint (1024px) plus a single-row card with a non-shrinking label leaves too little room for `formatPoolShare` / `formatAmount` / CR strings. Truncation uses CSS ellipsis, so readers cannot recover the missing text on iPad (no hover). This is a **display-only** layout bug. Do not change CR math, available-supply, LP allowlisting, or on-chain behavior. --- ## Current codebase `TreasuryPage` (`frontend/src/pages/TreasuryPage.tsx`) renders `TreasuryAssetsCard` inside `Layout` (`frontend/src/components/layout/Layout.tsx`): `container mx-auto px-4`. Tailwind’s default container at `lg` is 1024px, so iPad landscape / iPad Pro 12.9" portrait (1024 CSS px) minus page padding (~32px) and `CardContent` padding (`p-5 md:p-6`) leaves ~900px for the grid. The grid is: ``` grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3 ``` At 1024px that is **three columns**. Each tile is a horizontal flex row (`flex items-center justify-between gap-2 … min-w-0`): - **Left** (`flex-shrink-0`): 40px `TokenIcon`, rank badge, and `pairLabel` / `displayName` (`LP UST1/cUSTC`, `LP UST1/USTR`, `LP UST1/SpaceUSD` from `tokenlist.json` `pool.name` via `treasuryLp.ts` → `useTreasury`). - **Right** (`min-w-0 flex-1`): - Primary: LP → `formatPoolShare` (`"97.43% of pool"`, `"100% of pool"`); spot → `formatAmount` (up to 6 fraction digits, e.g. `41,190,153.481234`). Classes include `text-sm sm:text-base lg:text-lg … truncate`. - USD via local `formatUsd` (`$x.xx`, or `$x.xxxxxx` when `< 0.01`). - LP haircut: `CR counts ${formatUsd(crUsd)} (${haircutLegs.join(', ')} omitted)` with `truncate`. `truncate` (`overflow: hidden; text-overflow: ellipsis; white-space: nowrap`) is why production shows `100% of …`, `97.43% o…`, and `CR counts $0.00000…`. Spot rows (USTC, LUNC) also clip large balances. Loading skeleton uses the same 3-col grid; empty state does not. Issuance and Key Ratios use `md:grid-cols-2` and were not the reported failure. Keep them unchanged unless the same overflow appears after the assets-grid fix. Related: `#20` will add another long LP label (`CL8Y/cUSTC`). Same layout must accept that row. --- ## Why a new implementation is needed Treasury is the public CR / holdings surface. On iPad the grid looks uneven: short spot names fit, long LP names steal the row, and the numbers that matter (pool share, USD, what CR counts) disappear into ellipsis. Users cannot tap to expand; `title` is hover-only. A breakpoint-only tweak or a copy-only tweak is not enough by itself: 2-col still fails if the left cluster never shrinks and the right cluster never wraps. The card chrome and the value typography need to share one tablet-safe layout. --- ## Constraints / guardrails - **Display-only.** Do not change `computeTreasuryRatios`, `computeLpNav`, available-supply, haircut rules, skip-lists, or contract queries. - **Do not hide CR disclosure** to save space. Protocol / wrap legs stay visibly omitted from CR (copy may be shorter, meaning must stay). - **Do not use hover `title` as the only fix.** iPad has no hover. - **Do not factory-discover LPs** or invent tokenlist rows to shorten names. - `pairLabel` stays sourced from tokenlist (`pool.name` / `name` / `symbol`). Do not hardcode production pair names in the component. - `formatPoolShare` already treats share `≥ 0.99995` as `100% of pool` (`format.test.ts`). Do not widen that rounding. - If display decimals on cards change, CR / NAV math and raw balances stay untouched. Do not round 99.99% up to 100% beyond the existing helper. - Keep loading, empty, rank badges, View Contract, Pair explorer links, `NAV incomplete`, and vFDUSD `session oracle` annotation. - Dust filter (`shouldShowAsset`) unchanged. - No new runtime dependencies for a layout fix. Match existing Tailwind / glass card language. - Render labels and amounts as React text (no `dangerouslySetInnerHTML`). Tokenlist strings are untrusted length. - Do not introduce page-level horizontal scroll that hides header CTAs or View Contract. - Do not shrink type below readable tablet body size. --- ## Relevant files | File | Role | |------|------| | `frontend/src/components/treasury/TreasuryAssetsCard.tsx` | Grid breakpoints, card flex, `truncate`, CR / USD / share rendering | | `frontend/src/pages/TreasuryPage.tsx` | Page composition, LP footnote | | `frontend/src/components/layout/Layout.tsx` | `container mx-auto px-4` width budget | | `frontend/src/components/common/Card.tsx` | `CardContent` padding | | `frontend/src/utils/format.ts` | `formatPoolShare`, `formatAmount` | | `frontend/src/utils/format.test.ts` | Existing share-copy fixtures | | `frontend/src/types/treasury.ts` | `TreasuryAsset` (`kind`, `pairLabel`, `poolShare`, `crUsd`, `haircutLegs`) | | `frontend/src/services/treasuryLp.ts` | `pairLabel` from tokenlist | | `frontend/src/hooks/useTreasury.ts` | Builds LP asset rows | | `frontend/public/assets/tokenlist.json` | Live pair names (`LP UST1/USTR`, `LP UST1/cUSTC`, `LP UST1/SpaceUSD`) | | `frontend/src/index.css` | `.font-mono-numbers` (tabular / wide digits) | | `frontend/tailwind.config.js` | Default screens (`sm` 640, `md` 768, `lg` 1024, `xl` 1280) | --- ## Recommended direction Prefer **all three** (they are one layout change, not three features): 1. **Breakpoints.** Keep 1-col on narrow phones, 2-col through tablet including 1024px (`lg`). Move 3-col to `xl` (1280+) so classic iPad landscape is not forced into three cramped tiles. Apply the same classes to the loading skeleton. 2. **Card structure.** Stop treating the label cluster as `flex-shrink-0` on a single cramped row. On tablet, stack: identity (icon + name) on one line, values on the next, full width, wrap allowed. Desktop `xl` may stay a two-column row if values still fit. 3. **Typography / copy (display only).** Remove `truncate` from primary amount, USD, and CR lines, or wrap them. Optional: put `"of pool"` on a second line or shorten CR to e.g. `CR $0.00 · cUSTC omitted` **without** dropping the omitted-leg list. Optional: fewer *display* fraction digits on large spot balances in the card only. Do **not** ship tooltip-only, `scale` tricks, or a horizontal scroller inside each tile. --- ## Acceptance criteria - [ ] On iPad-class widths (768, 820, 834, 1024 CSS px, portrait and landscape), every visible Treasury Assets primary value, USD line, and CR / haircut line is fully readable — no ellipsis for current production spot + LP rows, including worst-case `LP UST1/SpaceUSD` and `formatPoolShare` strings. - [ ] Cards in the same row share a consistent alignment (icon/name vs values). Rows may grow in height; they must not overlap or overflow the card. - [ ] 3-col grid is not used at 1024px. 3-col is reserved for widths that actually fit the longest current labels + values (expected: `xl` / 1280+). - [ ] Loading skeleton uses the same column breakpoints as the loaded grid. - [ ] Empty state, rank badges, View Contract, Pair links, dust filter, `NAV incomplete`, and vFDUSD session-oracle note still behave as today. - [ ] CR haircut meaning is unchanged and still visible on LP rows that omit protocol/wrap legs. - [ ] No change to CR / NAV / available-supply / tokenlist allowlist / on-chain queries. - [ ] `formatPoolShare` rounding contract unchanged unless tests are deliberately updated for a shorter *display* string that still matches `≥ 0.99995` → 100% and rejects non-finite / negative. - [ ] Layout still works if `#20` adds `CL8Y/cUSTC` (long label + haircut). --- ## Test plan (all paths) **Unit (vitest)** - If `formatPoolShare` or card-local USD/CR copy changes: extend `frontend/src/utils/format.test.ts` (and any new helper tests). Keep: `0.985497` → two-decimal percent; `≥ 0.99995` → 100%; `null` / `NaN` / negative → `—`. - `formatAmount` card-display changes: large USTC/LUNC-style integers, dust `< 0.01` USD still six-decimal if that helper stays. **Component / visual (no Playwright in repo today — use Vite preview + DevTools device mode or real iPad)** | Path | What to check | |------|----------------| | Loading | Skeleton column count matches loaded grid at 375 / 768 / 1024 / 1280 | | Empty | `No treasury assets found` centered; no stray grid | | Spot large | USTC / LUNC full amount + USD, no clip | | Spot unpriced | Balance shown when USD hidden (`px <= 0`) | | Dust hidden | Sub-$1 priced spots / LP `displayUsd < 1` stay hidden | | LP ~100% | `100% of pool` (or agreed shorter form) fully visible | | LP mid share | e.g. `97.43% of pool` fully visible | | LP tiny share | four-decimal branch of `formatPoolShare` if exercised | | LP CR $0 + haircut | Full omitted-leg list readable (cUSTC / UST1 / USTR / wraps) | | LP CR &gt; 0 + haircut | e.g. SpaceUSD: USD + `CR counts …` both complete | | LP `navIncomplete` | Amber `NAV incomplete` wraps, does not overflow | | vFDUSD | `· session oracle` does not collide with USD | | Rank badges | Gold/silver/bronze + numeric ranks stay on the icon, not on the value | | View Contract | Header link still right-aligned; opens scanner | | Pair link | Still `scanner/address/{explorerAddress}`; tappable on iPad | | 1-col | 320–639px: stacked cards, no page X-scroll | | 2-col tablet | 640–1023 and **1024**: two columns, values readable | | 3-col desktop | ≥1280: three columns still readable | | iPad Safari | Mini / Air / 11" / 12.9", portrait + landscape, 100% zoom | | Future label | Mentally / fixture: `LP CL8Y/cUSTC` from `#20` | **Regression (unchanged math)** - Independent CR check still matches Key Ratios when prices are complete (`#16` / `#18` rules). - Issuance cards and Key Ratios layout unchanged unless a new overflow is found. **Tooling** - `cd frontend && npm test && npm run check` --- ## Test plan (attack, hack, and abuse vectors) This surface is public and read-only, but clipped numbers are a **deception / integrity** bug. Treat the following as required checks: | Vector | Why it matters | Check | |--------|----------------|-------| | Truncation as false share | `100% of …` can be read as certainty when the rest of the string is gone; a later 10% position must never look like 100% | Long and short shares fully visible; no CSS that clips mid-token | | Hidden $0 CR | Ellipsis on `CR counts $0.00…` can hide that protocol legs do not count | Haircut line complete; $0 CR still explicit | | Hover-only disclosure | `title` / tooltips do not exist for iPad tap | No acceptance that relies on hover | | Tokenlist / label XSS | `pool.name` is external JSON | Stay in React text nodes; no HTML injection; long strings wrap, do not break out of the card | | Overlay / stolen taps | Overflow or negative margin covering Pair / View Contract | Hit targets remain the intended `<a href>` | | Precision wash | “Fixing” layout by rounding share or USD so it fits | Do not change `formatPoolShare` 0.99995 rule; do not change CR inputs | | Scope creep into CR | Layout PR must not retouch `treasuryRatios.ts`, `lpNav.ts`, or allowlist discovery | Diff limited to presentation | | Horizontal scroll phishing | Page X-scroll can hide View Contract / wallet chrome | `document` width ≤ viewport at listed breakpoints | | Unreadable shrink | Tiny fonts “fit” but fail accessibility / abuse of trust | Tablet body ≥ existing `text-sm` / `text-xs` CR line | Out of scope for this issue: wallet connect, tx signing, contract admin. --- ## Verification criteria Issue may close only when **all** of the following are recorded on the MR or this issue: 1. Screenshots or screen recordings of `/treasury` at **768, 1024, and 1280** CSS px (and at least one real iPad Safari capture, portrait + landscape if available) showing USTC/LUNC and the three current LP rows with **no ellipsis** on primary / USD / CR lines. 2. Confirmation that 1024px is **not** three columns. 3. `npm test` and `npm run check` green; any format-copy change has unit coverage. 4. Reviewer confirms the diff does **not** alter CR / NAV / available-supply / tokenlist allowlist logic. 5. Pair and View Contract links still open the correct columbus-5 scanner URLs after the layout change. 6. Production or Coolify preview (`ust1cmm.com/treasury` or equivalent) re-checked after deploy — local-only is not sufficient to close. --- ## Out of scope - On-chain CR, swap, or staking gates. - Pinning new LPs (`#20` CL8Y/cUSTC) except that this layout must tolerate that label. - Issuance / Key Ratios redesign (file a follow-up only if the same clip appears there after this fix). - Playwright introduction (optional later; not required to close). ## Owner type frontend / UX
PlasticDigits commented 2026-08-27 00:35:23 +00:00 (Migrated from gitlab.com)

mentioned in merge request !37

mentioned in merge request !37
PlasticDigits commented 2026-08-27 00:35:44 +00:00 (Migrated from gitlab.com)

mentioned in merge request !38

mentioned in merge request !38
PlasticDigits commented 2026-08-27 00:36:35 +00:00 (Migrated from gitlab.com)

Implementation is in !38 (21-fix-treasury-assets-ipad-layout).

Done (acceptance): tablet/iPad widths wrap instead of ellipsis; 2-col through 1024px; 3-col only at xl; skeleton matches; CR haircut still visible (shorter copy); no CR/NAV/query changes; formatPoolShare rounding unchanged.

Not done here: real iPad Safari capture; production/Coolify re-check after deploy (close criterion 6); Playwright not added to the repo; #20 pin itself.

Local verify: npm test && npm run check green (91 tests). Playwright + browser at 375/768/834/1024/1280: expected column counts, full 100% of pool / CR lines, no page X-scroll.

Implementation is in !38 (`21-fix-treasury-assets-ipad-layout`). **Done (acceptance):** tablet/iPad widths wrap instead of ellipsis; 2-col through 1024px; 3-col only at `xl`; skeleton matches; CR haircut still visible (shorter copy); no CR/NAV/query changes; `formatPoolShare` rounding unchanged. **Not done here:** real iPad Safari capture; production/Coolify re-check after deploy (close criterion 6); Playwright not added to the repo; #20 pin itself. Local verify: `npm test && npm run check` green (91 tests). Playwright + browser at 375/768/834/1024/1280: expected column counts, full `100% of pool` / CR lines, no page X-scroll.
PlasticDigits commented 2026-08-27 10:24:21 +00:00 (Migrated from gitlab.com)

mentioned in merge request !40

mentioned in merge request !40
PlasticDigits commented 2026-08-27 10:24:33 +00:00 (Migrated from gitlab.com)

Implementation is in !40 (21-treasury-assets-ipad-layout). Supersedes !38.

Done (acceptance): tablet/iPad widths wrap instead of ellipsis; 2-col through 1024px; 3-col only at xl; skeleton matches; CR haircut still visible (shorter copy); no CR/NAV/query changes; formatPoolShare rounding unchanged; e2e testids kept.

Not done here: real iPad Safari capture; production/Coolify re-check after deploy (close criterion 6); #20 pin itself.

Local verify: npm test && npm run check green (99 tests). Playwright --workers=5 at 375/768/834/1024/1280: expected column counts, full 100% of pool / CR lines, no page X-scroll. Browser check: View Contract opens columbus-5 treasury scanner.

Implementation is in !40 (`21-treasury-assets-ipad-layout`). Supersedes !38. **Done (acceptance):** tablet/iPad widths wrap instead of ellipsis; 2-col through 1024px; 3-col only at `xl`; skeleton matches; CR haircut still visible (shorter copy); no CR/NAV/query changes; `formatPoolShare` rounding unchanged; e2e testids kept. **Not done here:** real iPad Safari capture; production/Coolify re-check after deploy (close criterion 6); #20 pin itself. Local verify: `npm test && npm run check` green (99 tests). Playwright `--workers=5` at 375/768/834/1024/1280: expected column counts, full `100% of pool` / CR lines, no page X-scroll. Browser check: View Contract opens columbus-5 treasury scanner.
PlasticDigits commented 2026-08-27 10:36:03 +00:00 (Migrated from gitlab.com)

mentioned in commit 476d992430

mentioned in commit 476d992430a91782f0ea76590efd8693213d0de3
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-08-27 10:36:04 +00:00
PlasticDigits commented 2026-08-27 10:45:36 +00:00 (Migrated from gitlab.com)

Merged via !40 into master @ 476d992 after merging master (!39) into the source branch and resolving conflicts. Did not use auto-merge; did not wait for CI/Coolify.

Code-level acceptance (local): met. Display-only: no CR/NAV/tokenlist math changes. Conflict resolution kept this layout rewrite and folded in !39 missingPriceLegs on the NAV incomplete line (wrap, not truncate).

Local Vite @ 768 / 1024: 2-col (not 3 at 1024); 100% of pool / 98.32% of pool / CR haircut lines fully visible; no truncate; no page X-scroll. 1280+ is 3-col. View Contract and Pair hrefs are columbus-5 scanner addresses. LP CL8Y-cb/cUSTC from #20 wraps.

Problems / still open (GitLab auto-closed this issue on merge):

  1. Close criterion 6: production ust1cmm.com/treasury is still the pre-!40 UI (no treasury-assets-grid testid / still 1.3.2 tokenlist). Coolify re-check after deploy is required.
  2. Close criterion 1: no real iPad Safari capture (portrait + landscape) from this pass.
  3. E2E viewport 820 not in the Playwright matrix (768 / 834 / 1024 cover the 2-col band).

Follow-up tracked in a new post-merge issue.

Merged via !40 into `master` @ `476d992` after merging master (!39) into the source branch and resolving conflicts. Did not use auto-merge; did not wait for CI/Coolify. **Code-level acceptance (local):** met. Display-only: no CR/NAV/tokenlist math changes. Conflict resolution kept this layout rewrite and folded in !39 `missingPriceLegs` on the NAV incomplete line (wrap, not truncate). Local Vite @ 768 / 1024: **2-col** (not 3 at 1024); `100% of pool` / `98.32% of pool` / CR haircut lines fully visible; no `truncate`; no page X-scroll. 1280+ is 3-col. View Contract and Pair hrefs are columbus-5 scanner addresses. `LP CL8Y-cb/cUSTC` from #20 wraps. **Problems / still open (GitLab auto-closed this issue on merge):** 1. Close criterion 6: production `ust1cmm.com/treasury` is still the pre-!40 UI (no `treasury-assets-grid` testid / still 1.3.2 tokenlist). Coolify re-check after deploy is required. 2. Close criterion 1: no real iPad Safari capture (portrait + landscape) from this pass. 3. E2E viewport 820 not in the Playwright matrix (768 / 834 / 1024 cover the 2-col band). Follow-up tracked in a new post-merge issue.
PlasticDigits commented 2026-08-27 10:46:27 +00:00 (Migrated from gitlab.com)

mentioned in issue #18

mentioned in issue #18
PlasticDigits commented 2026-08-27 10:46:29 +00:00 (Migrated from gitlab.com)

mentioned in issue #22

mentioned in issue #22
PlasticDigits commented 2026-08-27 10:46:30 +00:00 (Migrated from gitlab.com)

marked as related to #22

marked as related to #22
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/ustr-cmm#21
No description provided.