Skip to main content
vibld

Template

Whistlewood

The first conversation a new team member lands in inside a workplace AI assistant. The assistant greets them, recommends connecting a mail tool, offers quick replies, and the chrome shows trial time left and messages used so the user knows the limits.

AI assistant welcome conversation with trial banner · App screen: welcome · Small tools and apps · full-stack app (auth + DB)

A mock-up of the screen, drawn from its layout, palette and typefaces. A build follows the full prompt below.

Start from this screenRead the build prompt

Typefaces

The catalog's own faces. A screen composed into a template is drawn in that template's typefaces.

  • InterHeadings: Inter 700, 24px greeting heading
  • InterBody: Inter 400 16px / 1.6 for message prose

Patterns

  • top-left section tabs (Chat, Projects, Admin)
  • conversation list sidebar with search and New button
  • trial countdown banner with subscribe CTA
  • assistant welcome message with tool card
  • quick-reply chips
  • message reactions toolbar
  • composer with mention chip
  • usage meter in sidebar
  • collaboration tip card

States it is designed for

  • Streaming response with typing indicator
  • Tool connected: card shows 'Connected' badge and Manage
  • Tool connect failed: inline error in card
  • Trial nearly over (<=3 days): banner turns amber
  • Message cap reached: composer disabled with explanation and upgrade CTA
  • Offline: composer shows 'Reconnecting' and queues nothing
  • Empty conversation list for new users (only welcome thread)

Who it is for

  • knowledge workers in teams on a trial
  • team admins evaluating an AI assistant

Layout

  1. Left sidebar (200px): top tabs Chat / Projects / Admin; search + New button + overflow; 'Conversations' list; bottom: collaboration tip card with dismiss, trial messages meter (1 / 100), account row and Help menu
  2. Top banner across main: trial ends in 14 days notice on light blue with a blue 'Subscribe' button
  3. Conversation header: title and folder/overflow icons
  4. Message column (max 560px): assistant avatar, name, time, 'Answered in 6s' link; H2 greeting, paragraphs, tool card (icon, name, description, About + Configure), quick-reply chips, reaction toolbar
  5. Composer pinned bottom: text field with mention chip, attachment, tools, agent picker icons, mic, blue send button; scroll-to-previous/next arrows above
  6. Mobile: sidebar as drawer; banner collapses to one line with button

Palette

Helpful, upbeat and organised; bright blue actions on clean white with gentle tints.

  • canvas#ffffff
  • sidebar#f7f8fa
  • text#111418
  • muted#5b6370
  • banner-bg#eaf3fd
  • banner-text#11427a
  • primary#1573d8
  • on-primary#ffffff
  • mention-bg#dcebfb
  • mention-text#1257a8
  • input-border#8a929e
  • focus#1573d8

Every checked pair, measured again

SampleWhereRatioNeeds
Aabody text18.47:14.5:1
Aamuted timestamp6.06:14.5:1
Aasidebar text17.38:14.5:1
Aabanner text8.99:14.5:1
Aaprimary button label4.69:14.5:1
Aamention chip text5.86:14.5:1
input border3.14:13:1
focus ring4.69:13:1

As vibld’s tokens

The palette on the fifteen colour tokens vibld styles a project with, each text colour on the fill it is read on. Marked tokens are solved from the palette, because no swatch held that role at 4.5:1.

  • background
  • card
  • muted
  • primary
  • secondary
  • accent
  • destructive *

Type scale

Display
Inter 700, 24px greeting heading
Body
Inter 400 16px / 1.6 for message prose

Sidebar items 15px; timestamps 13px muted. Similar to the observed grotesk.

Spacing and imagery

Comfortable chat density; 4px base; message column 560px; tool card padding 16px radius 12px; chips radius 10px; composer radius 14px; banner height 48px; minimal shadows (tool card 0 2px 8px rgba(0,0,0,.06)).

App and tool icons as small rounded squares; no photography; emoji avoided in UI chrome.

Components

  • SectionTabs
  • ConversationSearch + NewButton
  • ConversationList
  • TrialBanner
  • MessageHeader
  • AssistantMessage
  • ToolCard (About, Configure)
  • QuickReplyChips
  • ReactionToolbar (like, dislike, copy, more)
  • Composer with MentionChip
  • UsageMeter
  • TipCard
  • AccountMenu

Interactions

  • Quick-reply chips post as the user's message and the assistant responds with streaming text
  • Configure opens the tool connection flow in a side sheet (OAuth via a hosted connector)
  • Typing @ opens a mention menu of assistants and teammates
  • Reaction buttons toggle with pressed state; copy shows toast
  • Up/down arrows jump between messages; banner dismiss hides for the day

Data

  • Workspace{id, name, plan (trial|pro|enterprise), trial_ends_at, message_cap, messages_used}
  • Conversation{id, workspace_id, title, created_by, updated_at}
  • Message{id, conversation_id, author_type (user|assistant), author_id, body, status (streaming|done|error), created_at}
  • ToolConnection{id, workspace_id, user_id, tool (mail|calendar|docs), status (connected|revoked)}
  • Reaction{message_id, user_id, kind (up|down)}

Guardrails

Experience

  • Greet with one clear suggestion, plus 'I already have a task' and 'Maybe later' options
  • Keep trial and usage limits visible but calm
  • Tool connection explains scope before connecting
  • Composer always reachable; never covered by tips
  • Quick replies disappear once used

Accessibility

  • Message list is a log region (role='log', aria-live='polite') announcing new assistant messages once complete
  • Chips and reactions are buttons with aria-pressed where toggles
  • Mention menu follows combobox/listbox pattern
  • Banner has role='region' with a label; not an alert
  • Focus ring 2px #1573d8 on all controls

Security

  • RLS: conversations and messages visible only to workspace members with access to the conversation
  • Tool OAuth tokens stored encrypted server-side; minimal scopes; revoke available
  • Enforce message caps server-side
  • Sanitize rendered markdown in messages; no raw HTML
  • Audit tool connections and plan changes

Build prompt

The baseline every prompt in the catalog assumes, then this design’s own ten sections, from goal to guardrails.

The baseline
### How to use these prompts
Paste an entry's build prompt into your coding agent as the first message. Each prompt names its own stack, tokens and acceptance criteria; the rules below apply to all of them and can be prepended once per project.

### Engineering baseline
- TypeScript strict mode, no `any`, small typed components, feature folders, and one source of truth for design tokens (CSS variables consumed by Tailwind).
- Validate every input with a shared zod schema on the client and again on the server or edge function. Never trust client-side checks alone.
- Show loading, empty and error states for every async view. Surface errors in plain language with a retry, and log details to the console in development only.
- Keep secrets out of the bundle. Only publishable keys (for example a Supabase anon key) belong in client code; service-role keys, API keys and webhooks live in server or edge-function environment variables.

### Data and auth baseline (full-stack entries)
- Enable Row Level Security on every table before inserting data. Default-deny, then add owner-scoped policies (`auth.uid() = user_id`) and explicit role checks for admin views.
- Store roles in a separate table checked by a security-definer function, never in a user-editable profile field.
- Upload files to private storage buckets with size and MIME limits, and serve them through signed URLs.
- Rate-limit public endpoints (forms, auth, AI calls) and add a honeypot field or captcha to anonymous forms.
- Take payments through a hosted checkout and verify webhooks by signature. Never handle raw card data.

### Accessibility and UX baseline
- Target WCAG 2.2 AA: 4.5:1 contrast for normal text and 3:1 for large text, input borders, focus rings and meaningful icons or chart lines. Every palette in this catalog lists its verified pairs; re-check with a contrast tool after any colour change.
- Keep body text at 16px or larger with 1.5 line height, nothing below 12px, no light weights under 24px, and uppercase only for short labels.
- Give every interactive element a visible focus ring, full keyboard support, semantic landmarks, labelled form fields, and alt text on meaningful images.
- Respect `prefers-reduced-motion` for every animation. Give drag-and-drop and carousels keyboard and button alternatives.
- Build mobile-first and test at 375px, 768px and 1280px.

### Content guardrails
- Use original copy, fictional sample data and placeholder or licensed imagery. Do not reuse another product's name, logo, screenshots or marketing text.
- Label demo testimonials and metrics as samples. Collect the minimum personal data the feature needs.

### SaaS screen baseline
- Design every screen for its full set of states: first-run empty, loading skeleton, partial data, error with retry, permission-denied, and success feedback. Each entry lists the states its screen needs.
- Keep destructive actions (delete, revoke, downgrade, remove member) behind a confirmation that names the object, and prefer undo over a second dialog where the action is reversible.
- Enforce authorisation on the server for every action a screen exposes. Hiding a button is not access control; check the role again in the API or RLS policy.
- Never show secrets (API keys, tokens) in full after creation. Show them once, then mask them, and offer rotate and revoke.
- Keep the app shell (navigation, workspace switcher, account menu) consistent across screens, and preserve filters, sort and scroll position when the user navigates back.
### Goal
Build **Whistlewood**, the welcome conversation of a team AI assistant. A new user lands in a thread where the assistant greets them, suggests connecting a mail tool, and offers quick replies, while the shell shows trial days left and messages used.

### Stack
React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Radix), lucide-react, TanStack Query, Motion for message entrance, react-hook-form for the composer, zod. Supabase Auth, Postgres and realtime for messages; an Edge Function streams assistant replies from a model provider.

### Pages & layout
1. **Sidebar**: tabs Chat / Projects / Admin; search, New, overflow; 'Conversations' list (one 'Welcome' item); tip card about tagging teammates (dismissible); usage meter 'Trial messages used 1 / 100'; account row + Help.
2. **Trial banner**: 'Your trial ends in 14 days' + consequence line + 'Subscribe' button.
3. **Thread**: header with title and icons; assistant message (avatar, name, time, 'Answered in 6s'), H2 greeting, two paragraphs, tool card (generic mail icon, 'Mail tool', description, About, Configure), chips 'I already have a task' and 'Maybe later', reaction toolbar.
4. **Composer**: pinned bottom, mention chip, attachment/tool/agent icons, mic, send.
5. Mobile: drawer sidebar, compact banner.

### Design system
- Colors: `--canvas: #ffffff`, `--sidebar: #f7f8fa`, `--text: #111418`, `--muted: #5b6370`, `--banner-bg: #eaf3fd`, `--banner-text: #11427a`, `--primary: #1573d8`, `--on-primary: #ffffff`, `--mention-bg: #dcebfb`, `--mention-text: #1257a8`, `--input-border: #8a929e`, `--focus: #1573d8`.
- Fonts: Inter 400/600/700; message prose 16px/1.6; greeting 24px.
- Spacing: 4px scale; 24px between message blocks; composer padding 12px.
- Radius: 12px tool card, 10px chips/buttons, 14px composer.
- Shadows: tool card 0 2px 8px rgba(0,0,0,.06); composer 0 -1px 0 border only.
- Motion: messages fade-rise 150ms; streaming caret; reduced motion shows instant text.

### Components & interactions
SectionTabs, ConversationList, TrialBanner (normal, amber, ended), AssistantMessage (markdown, streaming), ToolCard (idle, connecting, connected, error), QuickReplyChips, ReactionToolbar, Composer (mentions, attachments, disabled at cap), UsageMeter, TipCard, ToolConnectSheet.

### Data & state
Tables `workspaces`, `memberships`, `conversations`, `messages`, `reactions`, `tool_connections`. Seed the welcome thread on workspace creation via a trigger. Messages stream via server-sent events then persist; TanStack Query caches thread pages; realtime updates other tabs. Mock: trial 14 days, 1/100 messages.
Keep the composer draft per conversation in local state (and optionally localStorage wrapped in try/catch) so switching threads never loses text.

### Accessibility
Log region for messages, pressed states for toggles, combobox mentions, labelled banner region, visible focus, and all icon buttons labelled (attach, tools, mic, send). Streaming text announced only when complete.
Verified contrast: body text: #111418 on #ffffff = 18.47:1; muted timestamp: #5b6370 on #ffffff = 6.06:1; sidebar text: #111418 on #f7f8fa = 17.38:1; banner text: #11427a on #eaf3fd = 8.99:1; primary button label: #ffffff on #1573d8 = 4.69:1; mention chip text: #1257a8 on #dcebfb = 5.86:1; input border: #8a929e on #ffffff = 3.14:1; focus ring: #1573d8 on #ffffff = 4.69:1.

### Security
RLS on all chat tables by workspace membership; tool tokens encrypted server-side with least scopes; message cap and trial checks in the Edge Function; sanitise markdown; rate-limit sends; audit tool connects.

### Performance & SEO
Virtualise long threads; lazy-load tool sheet; stream replies. App routes noindex.

### Guardrails
- Generic tool names only (mail tool, calendar tool); invented teammates.
- Acceptance criteria: (1) welcome thread seeded; (2) chips post and hide; (3) tool connect states render; (4) cap disables composer with explanation; (5) banner reflects days left.

Open the builderAll templatesThis palette on its own