Skip to content

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.

6 blocks68 lineslucide-reactAdded 10 Sept 2026

What's included

  • app/assistant-chat-page.tsx
  • 6 blocks it is built from, installed with it
  • Needs lucide-react

Works with

  • React
  • Next.js
  • Tailwind CSS
  • TypeScript

npx hoverlab add assistant-chat-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

Assistant

A blank thread, the model behind it, and the four surfaces a real session grows into.

What can I look into?

Connected to your warehouse, docs and support inbox. Ask in plain language — I will show the query I ran.

Analyse

Find

Draft

Explain

Answers cite their sources. Nothing is written back without your approval.

Changing model applies to your next message. Earlier replies in this thread stay as the model that wrote them left them.

  • q3-renewals.pdf

    820 KB · about 14,200 tokens

  • dashboard-screenshot.png

    1.4 MB · uploading 62%

  • walkthrough.mov

    41 MB

    Video is not readable by this model. Attach a screenshot or a transcript.

37,200 / 128,000 tokens · 15,800 from attachments29%
Summarise the Q3 churn report for the board — one paragraph, and no numbers in the first line.
Edited
3 of 3
Churn rose this quarter for a single, traceable reason: the accounts we discounted in March did not stay. The headline figure is 4.1% against 3.6% last quarter, and every point of the increase sits in that one cohort. Renewals elsewhere, including all enterprise accounts, were flat.

After editing the question

3 of 3

Thread

  • Build me a pricing card, three plans side by side.

  • Here it is — one heading, one price, one call to action per plan.

  • Add a monthly / yearly toggle.

  • Added. The heading says which period is showing rather than only the switch.

  • A screen reader reads the per-seat note as part of the price.

  • Moved it out of the price and linked the two with aria-describedby.

Ask for another change…

PriceCard.tsx

v2 · 14:06

You are looking at v2. The assistant's latest answer is about v3 — anything you ask now applies to that one.

export function PriceCard({ plan, annual }) {
  // price derived from the period rather than hard-coded
  // the heading names the period, so the switch is not
  // the only place the state is visible
}

Versions

Revenue assistant

Connected to Warehouse · gpt-class model

You said: Which of our regions missed their Q3 target, and by how much?
Assistant said: Two of the five missed. EMEA came in at 91% of target (−$412k) and APAC at 88% (−$260k). AMER, LATAM and ANZ all cleared, with LATAM the strongest at 118%. The EMEA gap is almost entirely one deal that slipped into October.
Queried 2 tables · 1.4s
You said: Is that slipped deal still open?
Assistant said: Yes — it moved to Contracting on 4 October and is forecast to close this quarter. Booking it in Q3 would have put EMEA at 103%.
Queried 1 table · 0.8s

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

Built from

All blocks
  1. Assistant Starter ScreenThe blank thread, answered: grouped starter prompts as real lists of buttons, each group labelled, so the highest-leverage screen in an AI product is not a centred logo.
  2. Model Picker with Trade-offsModel selection with the three numbers the choice actually turns on — capability, latency and cost per message — and locked models explained rather than greyed out.
  3. Prompt Attachment TrayFiles staged against a prompt with a running context-token budget, unreadable files flagged before send, removal allowed mid-upload, and a send button that names its one blocker.
  4. Message Version SwitcherThe answers a regenerate throws away — siblings rather than replacements, an edited question that branches in place, and a plain sentence about what happens to the replies below.
  5. Chat Beside a CanvasThe two-pane assistant layout, with the mismatch nobody else states: the canvas names the version it is showing and says so when that is not the one the conversation is about. Versions link back to the turn that made them.
  6. Assistant Thread with ComposerA scrolling conversation with per-turn actions, announced as a polite log restricted to additions — so a streaming reply is not re-read on every token — and auto-scroll that only pins when the user is already at the bottom.

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

Source

app/assistant-chat-page.tsx
/**
 * The assistant, as a whole screen rather than a message list.
 *
 * Every chat UI looks the same in a screenshot and diverges completely the
 * moment someone uses it, because the interesting parts are the ones a
 * screenshot cannot show: what the blank thread offers, where the files
 * you attached went, what happened to the answer you regenerated.
 *
 * So the running order here is the order a real session goes through, not
 * the order the components look best in.
 *
 * The empty state is first and it is not decorative. A blank thread is the
 * highest-abandonment moment in the product — a cursor blinking in a box
 * that could accept anything is a worse prompt than no box at all — and
 * <ChatEmptyState> answers it with grouped starter prompts rather than a
 * slogan.
 *
 * The model picker sits directly under it because choosing a model is a
 * decision made before the first message and almost never after, and it
 * carries the three numbers the choice actually turns on. Burying it in a
 * settings menu is how people end up paying frontier prices for
 * autocomplete.
 *
 * Attachments, branches and the canvas are the running conversation, in
 * increasing order of how far they are from "a list of messages":
 *
 *   attachments  what you staged, and what it costs you in context
 *   branches     the answers regenerate would otherwise have thrown away
 *   canvas       the two-pane layout, once an answer becomes an artifact
 *
 * The thread panel is last, deliberately, and it is the one people expect
 * first. It is the navigation *between* conversations, and navigation
 * between things is only interesting once there is more than one — putting
 * it at the top of this page would frame the product as a filing cabinet.
 */

import * as React from 'react'
import { ChatEmptyState } from '@/components/chat-empty-state'
import { ChatModelPicker } from '@/components/chat-model-picker'
import { ChatAttachmentTray } from '@/components/chat-attachment-tray'
import { ChatMessageBranches } from '@/components/chat-message-branches'
import { ChatArtifactCanvas } from '@/components/chat-artifact-canvas'
import { ChatThreadPanel } from '@/components/chat-thread-panel'

export default function AssistantChatPage() {
  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">Assistant</h1>
        <p className="mt-1 text-sm text-muted-foreground">
          A blank thread, the model behind it, and the four surfaces a real
          session grows into.
        </p>
      </section>

      <ChatEmptyState />
      <ChatModelPicker />

      <ChatAttachmentTray />
      <ChatMessageBranches />
      <ChatArtifactCanvas />

      {/* Navigation between conversations — last, see the note above. */}
      <ChatThreadPanel />
    </main>
  )
}

How to use it

  1. 1. Copy each of the 6 blocks above into components/ — each block page has its own copy button.
  2. 2. Drop this file at app/assistant-chat-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

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

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.

App Screens7 blocks64 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