Skip to content

feat(tangle-cloud): iframe-first layout for blueprints with publisher-hosted apps#3236

Merged
drewstone merged 1 commit into
developfrom
feat/cloud-iframe-first-layout
May 25, 2026
Merged

feat(tangle-cloud): iframe-first layout for blueprints with publisher-hosted apps#3236
drewstone merged 1 commit into
developfrom
feat/cloud-iframe-first-layout

Conversation

@tangletools
Copy link
Copy Markdown
Contributor

Continuation of PR #3235

The mode-driven layout split for iframe blueprints did not make it into the #3235 squash — my follow-on commit pushed after the squash was triggered. Re-shipping as its own focused PR.

Why

When a blueprint ships a publisher-hosted iframe app, the publisher's app IS the product. Wrapping it in 300px of dapp hero + checkout-path sidebar + overview-cards stack was double-frosting: the iframe sat buried under ~700px of dapp chrome and the operator had to scroll to reach the actual product.

The split

  • Iframe blueprints (trading, sandbox) → new IframeBlueprintLayout. 52px identity strip at the top (← Catalog · Name · Mode picker · Create instance · Details), iframe fills remaining viewport height (calc(100vh - 108px), min 600px). Iframe is front-and-center on first paint.
  • Non-iframe blueprints → existing procedural layout. There we DO own the page surface; hero + checkout-path + overviewCards + ActionLauncher stack remains appropriate.

The shared BlueprintAppLandingPage branches on iframeConfig early.

Details slide-over

Closed by default. Opens from the right, 480px on desktop / full viewport on mobile. Contents:

  • Tagline + description
  • Repeated primary actions: Create instance, Open standalone ↗, View on-chain — so users who read context first don't have to scroll back to the strip to act
  • Publisher-declared actions[] as a tight row list (8 max)
  • Publisher-declared overviewCards[] as inline panels (narrow panel, text rows not the grid component)

Click-outside / Esc / explicit ✕ all close. Scrim dims the iframe but doesn't trap — iframe stays interactive behind it.

Why "Details" not "Direct" / "About" / "Spec"

  • "Direct" reads as jargon
  • "About" is soft on a tool surface
  • "Spec" reads dev-only
  • "Details" is the clearest neutral term and matches every catalog/app-store UI's labeling of the same disclosure

Test plan

  • yarn nx build/typecheck/test/lint tangle-cloud — clean (162/162 tests)
  • Local dev measurement: identity strip y=56..108, iframe y=108..828 (720px content area on a 900px viewport — was 280px before the fold)
  • Details panel: opens cleanly, scrim dims iframe, Esc/✕/click-outside all close, iframe stays interactive
  • After merge + Netlify deploy: visual confirmation on develop.cloud.tangle.tools/blueprints/trading and /blueprints/sandbox that the iframe is the dominant surface and the strip is 52px

…-hosted apps

When a blueprint ships a publisher-hosted iframe app, the publisher's
app IS the product. Wrapping it in 300px of dapp hero + checkout-path
sidebar + overview-cards stack was double-frosting: the iframe sat
buried under ~700px of dapp chrome and the operator had to scroll to
reach the actual product.

## The split

  - iframe blueprints (trading, sandbox) — `IframeBlueprintLayout`:
    52px identity strip at the top (← Catalog, name, mode picker,
    "Create instance" CTA, "Details" disclosure), iframe fills the
    remaining viewport height (`calc(100vh - 108px)`, min 600px).
    Iframe is front-and-center the moment the page loads.

  - non-iframe blueprints — the existing procedural layout. There we
    DO own the page surface, so a hero + checkout-path + overviewCards
    + ActionLauncher stack is appropriate.

Mode-driven layout split is the senior move: same component shape, two
very different visual hierarchies driven by whether the publisher
ships their own UI. The shared `BlueprintAppLandingPage` branches on
`iframeConfig` early.

## Details slide-over

Closed by default. Opens from the right, 480px wide on desktop / full
viewport on mobile. Contents:

  - tagline + description (one-line + paragraph)
  - "Create instance" + "Open standalone ↗" + "View on-chain"
    actions, repeated so users who read context first can act without
    scrolling back to the strip
  - publisher-declared `actions[]` as a tight row list (8 max,
    overflow lives on the deploy page)
  - publisher-declared `overviewCards[]` as inline panels — narrow
    panel so they're rendered as text rows rather than the grid
    component the procedural layout uses

The scrim is non-interactive on click-through (click-outside closes,
keyboard `Esc` closes, explicit ✕ closes); the iframe stays
interactive behind a dimmed backdrop. No modal trap.

## Why "Details" not "About" / "Spec" / "Direct"

  - "Direct" felt jargon-y — the operator doesn't think in terms of
    a "direct" view of a blueprint
  - "About" is soft and ambiguous on a tool surface
  - "Spec" reads as developer-only
  - "Details" is the clearest neutral term and matches how every
    catalog / app-store UI labels the same disclosure

## Verification

  - `yarn nx build/typecheck/test/lint tangle-cloud` — clean
    (162/162 tests, 2 pre-existing warnings, no errors)
  - Local dev measurement: identity strip at y=56..108, iframe at
    y=108..828 (720px content area on a 900px viewport). The iframe
    is 720px immediately visible on first paint; previously the
    iframe started at y=620 and only 280px was above the fold.
  - Details panel opens cleanly, scrim dims iframe, Esc/✕ both close,
    iframe stays interactive behind the panel.

## Why mobile mode picker lives below the iframe

The 52px identity strip can fit the compact mode picker on md+ width
but gets crowded on mobile. Below-iframe placement keeps the strip
clean on narrow viewports and the mode picker discoverable.
@tangletools tangletools requested a review from AtelyPham as a code owner May 25, 2026 11:25
@drewstone drewstone merged commit 5459970 into develop May 25, 2026
7 of 8 checks passed
@drewstone drewstone deleted the feat/cloud-iframe-first-layout branch May 25, 2026 11:37
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