Skip to content

feat(design): iOS-26 glass pass — AssetPage, dashboards, dialogs#269

Merged
BitHighlander merged 9 commits into
developfrom
feat/asset-page-glass-style
Jun 20, 2026
Merged

feat(design): iOS-26 glass pass — AssetPage, dashboards, dialogs#269
BitHighlander merged 9 commits into
developfrom
feat/asset-page-glass-style

Conversation

@BitHighlander

Copy link
Copy Markdown
Collaborator

Vendored from sktbrd's fork PR #265 (sktbrd/keepkey-vault-defi@feat/asset-page-glass-style), rebased onto current develop (post #267/#268 sign-gating merges) and brought into this repo. All 9 commits preserved with original authorship (@sktbrd / xvlad).

What's in it

iOS-26 "glass" design pass:

  • New glass tokens (.v3-glass-*) for cards, pills, rows, overlays (tokens.css)
  • AssetPage glass surfaces, inline sync badge, action pills
  • Dashboard chain-picker dialog + drilled aggregate fallback
  • Account selector compact dropdown + per-token DeFi amounts
  • Borderless inputs + glass PIN dialog (SendForm, PinEntry)
  • Swap controls/dialog glass treatment + positioning fixes
  • Nav/wallet-selector contrast, toned-down ambient glow

Rebase notes

Supersedes #265.

sktbrd and others added 9 commits June 19, 2026 19:27
… rows, overlays

New CSS utilities scoped to .v3-* class names so existing screens stay
untouched. Each token has a single responsibility:

  .v3-glass-card           — page-level surface (low-opacity fill + blur).
  .v3-glass-card-overlay   — popover/dropdown variant with near-solid fill
                              so menus over busy content stay legible.
  .v3-glass-pill           — pill-shaped glass for toggles + action buttons.
  .v3-glass-row            — hairline row separator + hover state for lists.
  .v3-glass-chip           — inline chip surface for tags / status badges.
  .v3-glass-orb            — radial glow utility for icon orbs.

Consumed by AssetPage, DefiPositionsPanel, EvmAddressSelector, PinEntry,
SendForm, WalletSelector and the new ChainPickerDialog. Background of the
page itself stays the existing graphite — only the surfaces shift.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
… pills

Header
- Wrap the chain identity row in its own .v3-glass-card so it reads as a
  pill alongside the rest of the panels.
- Synced badge moves inline next to the chain name (.v3-glass-chip), the
  duplicate ETH symbol and right-column duplicate badge are removed.
- Balance + USD now sit on one baseline-aligned row (tabular-nums) with
  a smaller chain symbol and a `title` tooltip showing full precision.
- Multi-address total folds into a single subdued mono line below.
- Chain icon: drop the dark backplate and colored glow → hairline ring.

Action row
- Receive/Send/Swap/Privacy pills neutralised — no brand colours.
  Inactive: muted text on transparent; active: white text on 6% fill with
  a 14% hairline; hover: subtle white-4% fill. Icons inherit currentColor.
- Account selector now lives inline with the pill row (compact variant)
  so the AssetPage is tighter vertically.

Content + lists
- Main content card uses .v3-glass-card (replaces the linear-gradient
  ink stack).
- Tokens + DeFi positions render inside .v3-glass-card surfaces.
- Per-row treatment: hard bordered boxes → transparent rows with a
  .v3-glass-row hairline + a 2px chain-tint left edge for funded rows,
  orange for spam, red for hidden. Gap drops to 0 so rows feel like one
  table.

DefiPositionsPanel
- Glass-row layout to match tokens.
- Surfaces absolute amount + USD side by side: looks at pos.balance
  first, falls back to single-constituent token amount, then combines
  multi-leg labels. Full-precision balance available via `title` on hover.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…unts

EvmAddressSelector
- New `compact` prop renders a single trigger button shaped like the
  design study (#N · Account #N · 0x…), opens a glass popover listing
  every account with ✓ on the selected one and an "+ Add account" row.
- Click-outside and Escape close the menu. Address snippets use a
  brighter shade (--text-2) so they stay legible on the overlay variant.
- Default (chip-row) layout is preserved for any other caller.

DefiPositionToken / server merge
- Extend the shared DefiPositionToken shape with optional `balance` and
  `balanceUsd` so the panel can surface the absolute amount alongside
  USD when the server reports per-constituent figures.
- Forward the new fields in both server-merge attribution sites in
  src/bun/index.ts; older server responses degrade to USD-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
SendForm
- Available balance is now centered, label-as-overline; the black-card
  surround is gone — the figure itself is the focal point. Balance is
  passed through formatBalance + carries a `title` tooltip with full
  precision.
- Recipient / Amount / labeled inputs lose their solid ink-0 fills.
  Each input is transparent with a hairline border that brightens on
  hover and lifts to gold on focus (subtle white-2% inner fill while
  focused). Same treatment applied to the shared LabeledInput helper.

PinEntry
- Backdrop: heavier blur (20px) + low-opacity graphite scrim instead of
  the flat gray 30%-black wash. Content behind reads as soft-frosted.
- Modal card: true glass — translucent fill (linear-gradient white tint
  over rgba(16,16,21,0.62)) + 32px backdrop blur + gold halo shadow.
- PIN strip + 9-grid buttons: transparent fills, soft 10%-white borders,
  per-button backdrop blur so each cell is its own glass pill. Hover
  brings a gold-tinted glass; active still snaps to full gold.
- Backspace pill matches the digit buttons; Unlock retains gold but
  gains a soft gold-glow on hover.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
WalletSelector
- The dropdown blended into the sidebar behind it because the wallet rows
  share structure with chain rows (icon + label + hex + USD). Push the
  popover to a near-solid linear-gradient fill with a 28px backdrop blur,
  brighter border, layered drop shadow.
- "WALLETS" header now sits above a hairline divider with a small wallet
  glyph + bolder type, so the menu reads as a distinct surface.

App ambient glow
- The full-screen radial behind everything was emitting a 22%-gold wash
  that read as a yellow cast across the whole UI. Drop the gold stop to
  6% and the teal mid-stop to 3% so the lighting is still subtly warm
  without dominating.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ck-only drill

Sidebar
- Hide built-in chains with zero balance. The current sidebar listed
  Monad, Hyperliquid, Mayachain et al as "No balance" filler rows; they
  now live behind a "+ Add a blockchain · N" tile at the end of the
  list. Picking one promotes it (sticks in sidebar) AND drills in.
- Click is no longer a toggle: clicking the active chain stays drilled
  instead of unselecting. Use the explicit "All Chains" row to leave.

ChainPickerDialog (new)
- Glass modal with a 2/3/4-col responsive grid of empty-balance chains
  (icon, name, symbol). Distinct from AddChainDialog, which keeps its
  role for adding *custom* EVM chains via Pioneer's registry.

Drilled-chain center — aggregate fallback
- When the selected EVM account is empty but the chain aggregate has
  funds on a different account, surface the aggregate USD + native total
  AND offer one-click "switch account" chips for each funded address.
  No more "$0.00 — No <chain> balance yet" when the sidebar clearly
  shows balance for the same chain.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Position bug
- SwapDialog mounts INSIDE the AssetPage subtree, which used to set
  `transform: translateY(…)` via the .v3-page-enter animation. CSS spec
  says a non-`none` transform on an ancestor becomes the containing
  block for `position: fixed` descendants — so the dialog's `inset: 0`
  was being anchored to the AssetPage's box (which lives below the
  TopNav), making the dialog drop to the bottom half of the viewport.
- Rewrite the .v3-page-enter keyframe to use opacity only — no
  transform on the page root ever. Fixed-position overlays mounted
  inside the page now anchor to the viewport again.

Glass styling
- Both SwapDialog branches (main dialog + "not supported" prompt) now
  use the same iOS-26 glass treatment as PinEntry: graphite scrim with
  20px backdrop blur for the dim layer, translucent fill +
  blur(32px) saturate(160%) on the modal card, soft white border, layered
  drop shadow. Old `linear-gradient(ink-2 → ink-1)` + mint glow shadow
  retired.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…e USD

- AssetSelector now stacks icon-over-symbol-over-name and centers the
  whole block within the column. Each token reads as a visual focal
  point of its half of the swap instead of a left-aligned cluster.
- MAX button shrinks to match the ETH / \$ segmented selector's height
  (h="22px", py="0.5", lineHeight="1") so the action row reads as a
  single 22px-tall horizontal control instead of mismatched chips.
- Amount input + ≈ USD-equivalent now sit side by side on one Flex.
  The converted value pulls right onto the same baseline (whiteSpace
  no-wrap so it doesn't break), and the click-to-flip-mode affordance
  is preserved.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@BitHighlander
BitHighlander merged commit a6c1ae1 into develop Jun 20, 2026
1 check passed
@BitHighlander
BitHighlander deleted the feat/asset-page-glass-style branch June 20, 2026 00:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants