Skip to content

fix(ipfs2filecoin): design review follow-ups for the landing page - #350

Open
gmoranxyz wants to merge 14 commits into
FilOzone:feat/ipfs2filecoin-landing-pagefrom
gmoranxyz:ipfs2filecoin-design-review
Open

fix(ipfs2filecoin): design review follow-ups for the landing page#350
gmoranxyz wants to merge 14 commits into
FilOzone:feat/ipfs2filecoin-landing-pagefrom
gmoranxyz:ipfs2filecoin-design-review

Conversation

@gmoranxyz

@gmoranxyz gmoranxyz commented Aug 1, 2026

Copy link
Copy Markdown

📝 Description

Design review follow-ups for /ipfs2filecoin, from a walkthrough of the page with @filipagr on 31 July, plus two rounds of polish since.

This targets feat/ipfs2filecoin-landing-page rather than main on purpose, so it feeds #346 instead of competing with it. Merging here means #346 carries the polish through to main as one piece.

Filipa's overall read was that the structure, content and calls to action are right — opening with "paste your CIDs" instead of a wall of reading is the correct choice. Almost everything below is layout and type hierarchy, plus one genuine functional gap and one drift risk.

  • Type: Bug fix

Two things to know before reviewing:

  1. This currently conflicts with the base, in src/app/ipfs2filecoin/page.tsx. The base branch has gained four commits this head doesn't have (bc84838 runbook rewrite for the direct-upload flow, abbe4ca flat data set fee charged once, b67a9fb unpin the CLI, 55dcabd re-verify competitor rates), and they touch the same file as the layout rework. CostEstimator.tsx, constants/migration.ts and data/pricing-comparison.ts all auto-merge; only page.tsx needs hand-resolving.
  2. The diff includes changes that aren't mine. This branch merged FilOzone:main, and the base is behind main, so the diff against the base also shows .github/CODEOWNERS (chore: set CODEOWNERS #349), the @filoz/synapse-sdk 1.1.1 bump (chore: update @filoz/synapse-sdk to v1.1.1 #348), and the temporary hiding of the Service Providers page with its redirect in next.config.ts (Temporarily hide the Service Providers page #347). Those aren't part of this work and will disappear once the base catches up with main. Reviewable scope is src/app/ipfs2filecoin/** plus src/components/{Accordion,Faq}.tsx and .gitignore.

🛠️ Key Changes

Three rounds, each commit scoped to one concern and independently revertable.

Round 1 — design review follow-ups (31 July)

fix(faq) — accordion dividers and chevrons were invisible. Faq hardcoded divide-white/20 and Accordion hardcoded text-zinc-200/text-zinc-300. All three assume a dark background, which held while the homepage was the only consumer; this page mounts the FAQ on a gray section, where they disappear. Now uses the --color-border-base / --color-text-base / --color-paragraph-text tokens, which already flip off the .light-section / .dark-section class Section sets — so no isDark branching was needed. Moving the colour onto the item rather than the parent also fixes the first divider: divide-* targets every child after the first, so item one's border was falling back to currentColor and rendering at full brightness on dark.

fix(ipfs2filecoin) — layout and type hierarchy.

  • The hero and "Estimate your deposit" sat 60px inset from their siblings: PageSection already wraps children in a Container and page.tsx nested a second one, doubling the horizontal padding.
  • Unit/Funded-for selects had the native arrow jammed against the border with a cavern between it and the value. Local SelectField goes appearance-none with a Phosphor caret inset to match the field's text.
  • Both tables move off text-sm to text-base, service names to text-lg.
  • Monospace figures dropped for the body font with tabular-nums.
  • Step numbers sit above each title in the accent colour, which needed a new StepList — the shared Card types title as a plain string, so the number could otherwise only be inlined as "01. Hand over the list".
  • Reason cards take Phosphor icons, following how agents/ and warm-storage-service/ already pass icons to Card.
  • The agent column takes two thirds with "Talk to us" as a one third call-out.
  • "What this does not do" constrained to max-w-5xl — lines ran past 15 words at desktop.

feat(ipfs2filecoin) — a checked CID list now produces something. parseCidList already validated, deduped and stripped gateway prefixes, but the verdict reported only a count, so the top of the page had no purpose — you still built cids.txt by hand. The prompt was in fact only offered on the over-cap branch, so the one outcome that succeeded was the one with no output. A checked list now yields the agent prompt with your own CIDs inlined via buildAgentPrompt, plus a cids.txt download of the cleaned list. AGENT_PROMPT stays as the fallback for the empty and over-cap cases, where pointing at a file is the right shape rather than inlining hundreds of lines. The instruction to "estimate what they cost to store below" is gone: a check reads the CIDs, not the bytes behind them, so it cannot price anything on its own.

chore — ignores CLAUDE.md and a local todo.md.

Round 2 — @filipagr's polish (#1, 3 August)

CID checker becomes one input surface. Label, textarea and action fold into a single bordered panel with a live "X of Y lines are CIDs" readout and a Cmd/Ctrl+Enter shortcut. The verdict moves into its own CidListVerdict component with an icon per outcome, and pluralize is extracted so the readout and the verdict agree.

Pricing table compares providers, not plan names. Each row gains a detail sub-line so the provider is what you compare on and the plan tier stays secondary, and rows are keyed by provider plus tier now that two Pinata tiers share a name. Below md the three columns don't fit, so each provider becomes a stacked card; the full table returns at md.

Estimator pairs with the table. It moves into a companion card beside the comparison table — the table is the market rate, the card prices it for your data — at lg:grid-cols-3 with the table on two columns and the estimator on one, its two inputs side by side and a compact stacked result that fits the narrow column. Also: a faint brand glow along the bottom of the hero (--color-brand-500 mixed to 12%, so it reads as light on the surface rather than a coloured panel), reason-card and agent-warning copy stepped down a size, and "How it works" four across at lg (2×2 from sm).

Round 3 — kill the hardcoded rate (#2, 5 August)

$2.50 was restated as a literal in the rate footnote, one reason card, and the SEO description, so all three could silently drift from the comparison table and estimator, which already derive from the constant. All now go through formatUsd(USD_PER_TIB_MONTH_PER_COPY).

📌 To-Do Before Merging

  • Resolve the conflict in page.tsx against the base's four newer commits. Worth doing as a merge of the base into this branch rather than a rebase, since the history is shared with @filipagr.
  • @filipagr — the monospace figures were dropped rather than resized. The reported problem was numbers looking larger than the service names beside them; that was a typeface illusion rather than a size difference, so matching the typeface removes it at the root while tabular-nums keeps the columns aligned. Still the most debatable call here, and easy to revert.
  • @filipagrAccordion/Faq are shared, so the homepage FAQ changes too: chevron zinc-200zinc-50, body zinc-300zinc-400. Both now match the site's own tokens, but worth eyeballing since it's outside this page's scope.
  • The external-link arrow beside Filebase/Pinata is fixed with a local override in page.tsx. It's sized for button text inside ExternalTextLink in ui-filecoin, so the real fix belongs upstream — worth a follow-up issue.

Closed since the original review: the hero background treatment, now handled by the brand glow rather than a produced asset; and table whitespace, which the responsive stacked cards and settled type sizes addressed.

Still not attempted, both needing a call rather than code:

  • The optional illustration beside "Nobody should migrate an archive by clicking" — Filipa's crowding caution stands.
  • Resolving a CID to its actual byte size, so the estimate reflects the real list rather than a number the user guesses. Needs backend capability and is a separate conversation.

🧪 How to Test

  • Setup: nvm use && npm install && npm run dev, then open /ipfs2filecoin.
  • Steps to Test:
    1. CID check. Paste a deliberately messy list into the hero panel — a bare CID, an https://ipfs.io/ipfs/… gateway URL, a duplicate, and a junk line. Watch the "X of Y lines are CIDs" readout as you type, then submit with Cmd/Ctrl+Enter rather than the button.
    2. Cost section. At lg the comparison table should occupy two thirds with the "Estimate your deposit" card beside it on one third, tops aligned. Narrow the window: the card drops below the table, and below md the table itself becomes one stacked card per provider.
    3. Pricing rows. Both Pinata tiers should render distinctly, each with its plan tier as a sub-line under the provider name.
    4. How it works. Four across at lg, 2×2 from sm, step numbers above each title in the accent colour.
    5. FAQ. Dividers and chevrons should be clearly visible against the gray section, including the divider above the first item. Compare with the homepage FAQ on its dark section.
    6. Hero. A faint blue lift along the bottom edge, carrying into the section below — not a visible panel edge.
  • Expected Results: step 1 resolves to the unique CIDs with the gateway prefix stripped, reports both the skipped line and the removed duplicate, and renders a prompt containing your actual CIDs plus a Download cids.txt link.
  • Verified: npm run build (TypeScript, twoslash'd Synapse snippet, all 25 routes) passes at 2a8113a, the PR Bump the dependencies group with 11 updates #1 merge. The head has since taken Build Main Components #2 and a main merge and hasn't been rebuilt locally — the conflict resolution will need a fresh build anyway.

📸 Screenshots

Verified in-browser at 1284px. Not attached here — CLI-created PR. Happy to add before/afters for the FAQ, the steps grid, the table/estimator pairing and the CID-check flow if useful.

🔖 Resources

🤖 Generated with Claude Code

beck-8 and others added 7 commits July 30, 2026 08:05
* Temporarily hide the Service Providers page

Redirect /service-providers to the homepage and remove its links from
the header/mobile nav, the homepage product grid, and the warm storage
service page. The route itself is left in place so this is easy to
revert once the page is ready to come back.

* Address review comment from @rjan90

Switch the homepage "Compose the Building Blocks" grid to the
three-column variant now that only three cards remain, and add short
comments marking the hidden /service-providers route and its redirect
so it isn't mistaken for dead code.
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Faq hardcoded divide-white/20, and Accordion hardcoded text-zinc-200 on the
chevron and text-zinc-300 on the body. All three assume a dark background, which
held while the homepage was the only consumer since it mounts the FAQ on a dark
section. On a light or gray section the dividers and chevrons are effectively
invisible.

They now use --color-border-base, --color-text-base and --color-paragraph-text,
which flip off the .light-section / .dark-section class that Section already
sets, so no isDark branching is needed. Faq keeps useBackground purely for
prose-invert.

Moving the colour onto the item rather than the parent also fixes the first
divider. divide-* targets every child after the first, so item one's border was
falling back to currentColor and rendering at full brightness on dark.

The homepage FAQ shifts slightly as a result: chevron zinc-200 to zinc-50, body
zinc-300 to zinc-400, both now matching the tokens used everywhere else. That
page is worth a look alongside this one.

Review: @filipagr
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Follow-ups from a walkthrough of the page with Filipa Ribeiro.

Alignment and spacing

- "Estimate your deposit" and the hero sat 60px inset from their siblings,
  because PageSection already wraps children in a Container and page.tsx nested
  a second one, doubling the horizontal padding. Removed both, plus the
  now-unused import.
- The Unit and Funded-for selects had the native arrow jammed against the border
  with a cavern between it and the value. A local SelectField goes
  appearance-none with a Phosphor caret inset to match the field's text, and the
  grid drops from three equal columns to 2fr/1fr/2fr so Unit is no longer a
  full-width field holding three characters.
- "What this does not do" is constrained to max-w-5xl; lines ran past 15 words
  at desktop.

Type

- Both tables move off text-sm to text-base, with service names at text-lg.
- Monospace figures dropped for the body font with tabular-nums. The reported
  problem was numbers appearing larger than the names beside them, which was a
  typeface illusion rather than a size difference, so matching the typeface
  removes it at the root while tabular-nums keeps the columns aligned. Flagging
  this one as the most debatable call in the batch.
- The highlighted Filecoin row carries weight instead of a marginally darker
  grey, which read as a mistake rather than emphasis.

Visual interest

- How it works renders 2x2 rather than 3-up with an orphaned fourth, and step
  numbers sit above each title in the accent colour. This needs a new StepList
  component because the shared Card types title as a plain string, so the number
  could only ever be inlined as "01. Hand over the list".
- Reason cards take icons, following how agents/ and warm-storage-service/
  already pass Phosphor icons to Card.
- The agent column takes two thirds and "Talk to us" becomes a one third
  call-out, giving the path with more to say more room.

The external-link arrow beside Filebase and Pinata is tightened with a local
override. It is sized for button text inside ExternalTextLink in ui-filecoin, so
the real fix belongs upstream; this is a commented stopgap.

Still open from the review and deliberately not attempted here: table whitespace
now that the type sizes are settled, the hero background treatment, and the
optional illustration beside the agent heading.

Review: @filipagr
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
parseCidList already validated, deduped and stripped gateway prefixes, but the
verdict box reported only a count. The successful path gave you nothing to act
on, so the top of the page had no purpose: you still assembled cids.txt by hand.
The prompt was in fact offered only on the over-cap branch, so the one outcome
that succeeded was the one outcome with no output.

A checked list now produces the agent prompt with your own CIDs inlined, via
buildAgentPrompt, plus a cids.txt download of the cleaned and deduped list.
AGENT_PROMPT stays as the fallback for the empty and over-cap cases, where
pointing at a file is the right shape rather than inlining hundreds of lines.

The instruction to "estimate what they cost to store below" is replaced. A check
reads the CIDs and not the bytes behind them, so it cannot price anything on its
own, and implying otherwise was the most confusing part of the flow. Resolving a
CID to its actual size needs backend capability and is a separate conversation.

Hero polish in the same component: "one per line" sits beside the label in the
accent colour rather than surfacing only after a failed check, the button is
centred, the empty textarea is shorter, and the free-check facts read as a
scannable list instead of fine print. Copy prompt demotes from a full-width
button to an icon in the code block's corner.

Verified against deliberately messy input: a bare CID, a gateway URL, a
duplicate and a junk line resolve to three unique CIDs, with the URL prefix
stripped and both the skipped line and the duplicate reported.

Review: @filipagr
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
CLAUDE.md is per-machine guidance for Claude Code, and todo.md is the working
list of design review actions for /ipfs2filecoin. Neither belongs in the repo.

Note that this keeps todo.md local, so it does not travel to reviewers via git.

Review: @filipagr
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Aug 1, 2026

Copy link
Copy Markdown

@gmoranxyz is attempting to deploy a commit to the FilOz Team on Vercel.

A member of the Team first needs to authorize it.

@FilOzzy FilOzzy added this to FOC Aug 1, 2026
@github-project-automation github-project-automation Bot moved this to 📌 Triage in FOC Aug 1, 2026
@gmoranxyz
gmoranxyz marked this pull request as draft August 1, 2026 10:49
@gmoranxyz

Copy link
Copy Markdown
Author

@filipagr take a look and let me know what you think as a first pass!

filipagr and others added 3 commits August 3, 2026 19:47
Fold the label, textarea and action into a single bordered panel with a live "X of Y lines are CIDs" readout and a Cmd/Ctrl+Enter shortcut. Move the verdict into its own CidListVerdict component with an icon per outcome, and extract pluralize so the readout and verdict agree.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… responsive

Give each pricing row a detail sub-line so the provider is what you compare on and the plan tier stays secondary, and key rows by provider plus tier now that two Pinata tiers share a name. On mobile the three columns do not fit, so each provider becomes a stacked card; the full table returns at md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… hero and type

Move the estimator into a companion card beside the comparison table (the table is the market rate, the card prices it for your data), with the two inputs side by side and a compact stacked result that fits the narrow column. Add a faint brand glow along the bottom of the hero, step the reason-card and agent-warning copy down a size, and render How it works four across on desktop.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
gmoranxyz and others added 4 commits August 5, 2026 14:36
fix(ipfs2filecoin): estimator beside the table, responsive pricing, hero polish
…COPY

The rate footnote, one reason card, and the SEO description each restated
$2.50 as a literal, so they could silently drift from the comparison table
and estimator, which already derive from the constant.
fix(ipfs2filecoin): derive the $2.50 rate from USD_PER_TIB_MONTH_PER_COPY
@gmoranxyz
gmoranxyz marked this pull request as ready for review August 5, 2026 14:30
@gmoranxyz

Copy link
Copy Markdown
Author

@jennijuju I think this is ready for you to take a look! Please forgive anything we broke with our clumsy vibe coding!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: 📌 Triage

Development

Successfully merging this pull request may close these issues.

6 participants