Skip to content

Import Data

The flow between an empty product and a useful one, in the order it goes wrong: sample data offered with equal weight, a file, a URL, the column mapping everything stalls on, and an upload that survives the connection dropping.

7 blocks64 lineslucide-reactAdded 10 Sept 2026

What's included

  • app/import-data-page.tsx
  • 7 blocks it is built from, installed with it
  • Needs lucide-react

Works with

  • React
  • Next.js
  • Tailwind CSS
  • TypeScript

npx hoverlab add import-data-page

Or over MCP, from your editor's agent — no account needed.

License

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.

Was this useful?

Preview

Import

Sample data, a file, a URL, the mapping step everything stalls on, and an upload that survives the connection dropping.

Step 2 of 4

Bring your data across

Or don't — a sample workspace is a perfectly good way to look around first, and nothing here is permanent.

You can add or change a source at any time in Settings — this is not a one-off decision.

  • brand-guidelines.pdf2.3 MB

    Uploaded

  • hero-render.png8.5 MB

  • archive.zip142.0 MB

    Larger than the 20 MB limit

Import from a link

A file that already lives at a URL does not need to be downloaded to a laptop and uploaded again. The server fetches it, which also survives the tab being closed.

Must be publicly reachable. Signed links work; a login page does not.

Detected from the response, not the extension. Override only if it guesses wrong.

customers-export.csv

1,284 rows · 6 columns found

Step 2 of 3

Full Name

Ada Lovelace · Grace Hopper

Work Email

ada@analytical.co · grace@navy.mil

One address per row

Company

Analytical Engines · US Navy

Phone

+44 20 7946 0958 · +1 202 555 0114

Signed Up

2026-03-14 · 2026-04-02

Internal Notes

do not contact

3 columns mapped, everything required is covered

Send us the file

The limits are here rather than in the error you would otherwise meet after uploading. Rejecting a 400 MB file after transferring it is a failure of the form, not of the person.

CSV, XLSX or JSON. Up to 50 MB — larger files go through the import API.

Shown in the import history. The filename is kept either way.

Optional. Large imports finish long after you close the tab.

  • onboarding-deck.pdf4.2 MB

    Uploaded

  • team-offsite-photos.zip212 MB

    62%
  • homepage-hero.png8.7 MB

    18%
  • q3-financials.xlsx318 KB

    Queued — waiting for a slot

  • launch-video-draft.mp41.4 GB

    Connection lost at 34%

site-backup-2026-08-27.tar.zst

4.1 GB · 82 chunks · 2 retried

28%

Uploading 1.2 GB of 4.1 GB · time left is not worth guessing at this connection speed

You can close this tab. The upload is stored as up_9f2c41 and carries on from 1.2 GB when you come back — for the next 7 days.

The real page, rendered in your current theme — every section below is a live block, not a screenshot.

Built from

All blocks
  1. Import or Start EmptyThe empty product’s real first question. Sample data is offered with equal weight rather than as grey small print, every connector names its scope before the redirect, and each option carries the honest duration.
  2. Drag & Drop UploadDropzone with per-file progress and a drag counter that fixes the flicker every naive dragleave handler produces.
  3. Import From URL FormThe import path for a file that is already on the internet, which does not need to travel through the browser at all.
  4. CSV Column MapperThe screen between "file uploaded" and "data imported": source columns mapped to schema fields, with a sample value under each and required fields blocking the button.
  5. Upload Requirements FormAn upload form that states the constraints before the file is chosen, rather than rejecting it after a two-minute transfer.
  6. Upload Progress ListThe list that follows the dropzone: complete, uploading, queued and failed rows with cancel and retry — because hiding the failure is the classic upload bug.
  7. Resumable Large UploadOne big file on a connection that will drop: a bar allowed to go backwards when a chunk is retried, a time estimate that is a range or nothing, and a promise about closing the tab made before it is needed.

Only want one section? Open it and copy that block instead — browse Onboarding.

Source

app/import-data-page.tsx
/**
 * Getting data in — the screen between an empty product and a useful one.
 *
 * Import is the highest-stakes flow in most B2B products and the one most
 * likely to be a single file input with a spinner. The failure is never the
 * upload; it is everything either side of it. People arrive without a file
 * in the right shape, and they leave when a 40MB CSV dies at 90% on hotel
 * wifi with no way to resume.
 *
 * The order is the order it goes wrong in.
 *
 *   first question   sample data offered with equal weight, not as a greyed
 *                    afterthought. Someone evaluating the product does not
 *                    have their data yet and should not have to fake it
 *   dropzone         the obvious part
 *   from a URL       the other half of "get data in", routinely missing
 *   mapping          the screen between "file uploaded" and "data imported",
 *                    which is where every real import actually stalls
 *   requirements     stated before the failure rather than after it
 *   progress         complete, uploading, queued and failed, with retry
 *   resumable        one big file on a connection that will drop, with a
 *                    bar allowed to go backwards when a chunk is retried
 *
 * Requirements sitting *after* the mapper is deliberate and is the one
 * ordering choice here someone would argue with. Stating the constraints up
 * front reads as a wall of rules before anyone has a reason to care; stated
 * after the mapping screen, they answer a question the mapper has just made
 * concrete. The mapper is also where a person first sees their own columns,
 * which is the moment "must be UTF-8" stops being trivia.
 */

import * as React from 'react'
import { OnboardingImportData } from '@/components/onboarding-import-data'
import { FileDropzone } from '@/components/file-dropzone'
import { ImportFromUrlForm } from '@/components/import-from-url-form'
import { CsvImportMapper } from '@/components/csv-import-mapper'
import { UploadRequirementsForm } from '@/components/upload-requirements-form'
import { UploadProgressList } from '@/components/upload-progress-list'
import { UploadResumable } from '@/components/upload-resumable'

export default function ImportDataPage() {
  return (
    <main className="min-h-screen bg-background text-foreground">
      <section className="mx-auto w-full max-w-5xl px-6 pb-2 pt-12">
        <h1 className="text-2xl font-bold tracking-tight">Import</h1>
        <p className="mt-1 text-sm text-muted-foreground">
          Sample data, a file, a URL, the mapping step everything stalls on,
          and an upload that survives the connection dropping.
        </p>
      </section>

      <OnboardingImportData />
      <FileDropzone />
      <ImportFromUrlForm />

      <CsvImportMapper />
      <UploadRequirementsForm />

      <UploadProgressList />
      <UploadResumable />
    </main>
  )
}

How to use it

  1. 1. Copy each of the 7 blocks above into components/ — each block page has its own copy button.
  2. 2. Drop this file at app/import-data-page.tsx. The imports already point at @/components/…, so they resolve with no edits.
  3. 3. Delete the sections you do not want. Every block takes props, so the copy changes without the layout moving.

For AI

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.

See the prompt

More App Screens

Open the full page for this page

Dashboard Overview

The screen an app opens on: shell, header, KPI row, chart and activity feed — numbers first, shape second, changes last.

App Screens5 blocks47 lines
Open the full page for this page

AI Assistant Screen

An agent working inside a real app: a transcript down the middle — reasoning, answer, then the one card that can act — with what it may read and what it noticed demoted to a rail.

App Screens7 blocks110 lines
Open the full page for this page

Project Board

A kanban board inside the app shell, with tabs that admit the board is one view among several and a header whose primary action is creating work.

App Screens3 blocks42 lines
Open the full page for this page

Customer List Screen

The canonical CRUD list — header, toolbar, sortable table and pagination framed as one panel instead of three stacked cards.

App Screens5 blocks37 lines
Open the full page for this page

Onboarding

A wizard for the session someone finishes and a checklist for the one they do not, with the only genuinely blocking step in front of both.

App Screens3 blocks45 lines
Open the full page for this page

Search Results

Built around the state a search page is in most of the time — empty — so recent queries lead and the facets sit in a sidebar that survives growing to twelve.

App Screens4 blocks47 lines
Open the full page for this page

Agent Run Detail

One run opened up in the order you would debug it — intent, actions, the retries that are invisible in both, then cost.

App Screens4 blocks49 lines
Open the full page for this page

Approvals Inbox

The queue, the same queue sorted by how long things have waited, and the policy that decided both — with the policy last so it is not scrolled past forever.

App Screens3 blocks45 lines
Open the full page for this page

Assistant Chat

The blank thread answered with real starter prompts, the model picker with the three numbers the choice turns on, and the four surfaces a session grows into — attachments, branches, canvas, threads.

App Screens6 blocks68 lines
Open the full page for this page

Agent Run Inspector

The three states an agent screen usually omits: the wait before the first token, the trace after something broke with retries costed in the open, and the diff it wants a person to accept.

App Screens5 blocks61 lines
Open the full page for this page

Retrieval Console

Why the answer said what it said: what is connected, how stale it is, what the query was allowed to see, what fitted in the window and what fell out — plus the failed-search state a debugging tool is most needed in.

App Screens7 blocks66 lines
Open the full page for this page

AI Editor

Five ways to reach a model without the cursor leaving the sentence — slash menu, inline completion, selection toolbar, action menu, property inspector — and the two surfaces that say where the answer came from.

App Screens7 blocks64 lines
Open the full page for this page

Records Table

A table after real people have used it — columns reordered from the keyboard, a selection bar that asks page-or-all, subtotals that survive collapsing, cells edited in place, and the empty state its own filters produced.

App Screens8 blocks71 lines
Open the full page for this page

Analytics

The saved view and the comparison window first, because every figure below depends on both — then six charts, none of which load a charting library.

App Screens8 blocks68 lines
Open the full page for this page

Alerting

Thresholds with how often each has actually fired, what that produced, where it went — and the digest settings that exist because of the answer.

App Screens5 blocks54 lines
Open the full page for this page

Account Setup

A profile form where the role options state what they actually change, the avatar crop works from the keyboard, and a navigation guard names the fields it is about to throw away.

App Screens4 blocks53 lines
Open the full page for this page

App Shell

The furniture that is on every screen and belongs to none — navbar, mobile drawer, command palette, shortcut sheet, header search, scope switcher, and the two shapes a detail view takes without losing the list.

App Screens8 blocks68 lines
Open the full page for this page

Workspace Activity

Backwards from now and forwards from it on one screen — a day-grouped timeline, a month grid where a busy Tuesday never changes the row height, and the state both are in on day one.

App Screens3 blocks51 lines
Open the full page for this page

First Run

What the product looks like while onboarding happens: a tour step anchored to the control it explains, the skeletons of the slowest load it will ever do, and the checklist that outlives both.

App Screens3 blocks50 lines