Product Collection
Sticky filter sidebar, sort toolbar and product grid — with the facets dropped rather than stacked on mobile, so a shopping page does not open as a form.
Checkout for the buyer who will not fill in a form: wallet buttons above the fields, and the address a wallet returns shown and changeable before the charge rather than after it.
app/express-checkout-page.tsxnpx hoverlab add express-checkout-page
Or over MCP, from your editor's agent — no account needed.
Free to read, copy and install, for personal and non-commercial projects. Shipping it in client work or a paid product needs Pro ($79 once). The source lands in your repo and stops being ours — no attribution, nothing to upgrade.
The bag, the wallets above the form, and the two fields that stop a gift order becoming a complaint.
Stone · M
1 × £89.00
£89.00
Sky · L
2 × £65.00
£130.00
Total £84.00
In the cart rather than at checkout, because a gift message added while someone is entering card details is a step between them and paying. Here it is part of choosing.
The real page, rendered in your current theme — every section below is a live block, not a screenshot.
Only want one section? Open it and copy that block instead — browse Cart & Checkout.
/**
* Checkout for the buyer who is not going to fill in a form.
*
* `checkout-page` is the full flow. This is the short one, and it is a
* different page rather than a variant because the ordering argument is
* inverted: the wallet buttons go *above* the form, not beside it.
*
* That placement is the entire conversion difference on mobile, and it has
* one consequence most implementations skip. A wallet returns an address,
* and that address is frequently not the one the buyer wants the parcel
* sent to — it is whatever was in their phone three years ago.
* <CheckoutExpressPayment> shows what came back and lets it be changed
* before the charge, rather than after, when changing it means a support
* conversation.
*
* cart the basket as a real dialog — focus trapped, focus returned,
* Escape closes. A drawer that loses focus to the page behind
* it is a keyboard user's dead end at the last step
* express the wallets, and what they did to the form
* gift the two fields that prevent two support emails
*
* <GiftOptionsForm> is last and is not an upsell. A gift order with no
* message and a price left in the box generates a complaint; asked at
* checkout it is one question, and asked afterwards it is impossible.
*/
import * as React from 'react'
import { CartDrawer } from '@/components/cart-drawer'
import { CheckoutExpressPayment } from '@/components/checkout-express-payment'
import { GiftOptionsForm } from '@/components/gift-options-form'
export default function ExpressCheckoutPage() {
return (
<main className="min-h-screen bg-background text-foreground">
{/*
A heading before the drawer, because <CartDrawer> opens onto its own
scrim — correct for the block, and a page that starts with 380px of
dimmed grey is a page whose catalog tile says nothing.
*/}
<section className="mx-auto w-full max-w-5xl px-6 pb-2 pt-12">
<h1 className="text-2xl font-bold tracking-tight">Express checkout</h1>
<p className="mt-1 text-sm text-muted-foreground">
The bag, the wallets above the form, and the two fields that stop a
gift order becoming a complaint.
</p>
</section>
<CartDrawer />
{/* Wallets above the form, and the address they return shown. */}
<CheckoutExpressPayment />
<GiftOptionsForm />
</main>
)
}
components/ — each block page has its own copy button.app/express-checkout-page.tsx. The imports already point at @/components/…, so they resolve with no edits.The component, its props, the design tokens it expects and the command that installs it — as one prompt. Paste it into Claude, Cursor, v0 or ChatGPT and what they build around it will match the rest of the catalog instead of inventing its own system.
Sticky filter sidebar, sort toolbar and product grid — with the facets dropped rather than stacked on mobile, so a shopping page does not open as a form.
Gallery, sticky buy box, details accordion and reviews — ordered by what a shopper needs before they can decide.
Editable lines beside a sticky summary, so the total and the checkout button survive a scroll through four quantity changes.
Address and payment with the site navigation stripped and the order summary moved above the form on mobile — both aimed squarely at completion rate.
The post-purchase screen, with navigation restored and a rail that shows what to buy next rather than what was just bought.
Order history in the settings shell rather than a second sidebar layout — an account area and a settings area are the same shape.
The page between a listing and a product detail, with the two questions a comparison table alone cannot answer: will it fit, and can I actually have it.
For the customer with an order number and no account — a lookup, an arrival range rather than a promised date, and the review form where the "how did we do" email actually lands.