Skip to main content
vibld

Template

Parleydesk

The main workspace of a customer help desk. Agents see their inbox and team queues, open a conversation, read an AI-written question-and-summary note, reply by email or chat, and manage assignment, links and attributes in a right sidebar. A welcome card nudges new workspaces to connect channels.

Help desk inbox with AI question/summary note and details sidebar · App screen: inbox · 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 600, 18px contact name; 16px panel titles
  • InterBody: Inter 400 16px/1.5 messages; 15px list and attributes

Patterns

  • four-column help desk layout (rail, nav, list, thread, details)
  • onboarding card pinned atop conversation list
  • team inboxes with emoji icons
  • AI note card with question and bullet summary
  • channel-select composer with shortcut hint
  • collapsible details sidebar with attributes list
  • assignee and team fields with inline add
  • linked tickets section

States it is designed for

  • new workspace (onboarding card + example conversations)
  • empty team inbox
  • conversation with AI note / note generating / note failed (hidden with retry link)
  • sending / sent / failed
  • assigned to someone else (banner with take-over)
  • closed conversation (reopen button)
  • missing attribute values shown as dashes with add
  • keyboard practice mode

Who it is for

  • support agents
  • support operations
  • small SaaS teams setting up support

Layout

  1. icon rail (~48px) for product areas
  2. nav (~220px): title with compose and search; Your inbox, Mentions, All, Unassigned, Dashboard with counts; Teams (emoji icons), Teammates, Views; bottom Spam, practice shortcuts, edit sidebar
  3. list (~300px): header with agent name; onboarding card (illustration, heading, text, dark 'Set up channels' button); status filter and sort; conversation rows (initial avatar, name · company, preview, age)
  4. thread: header (contact name, star, more, snooze, close, assign); messages; AI note card in pale yellow (Question, Summary bullets); composer with channel select, hint, AI tools icon, Send split
  5. details (~300px): Assignee, Team; Links (tracker ticket, back-office tickets, side conversations with add); Conversation attributes (subject, ID, brand, language, external ID, AI flags); Topics; collapsible User data and Recent conversations
  6. at <1440px details become a toggle sheet; <1024px list and thread swap

Palette

Warm, capable, a bit playful (emoji team icons, friendly onboarding card) on a strict grid.

  • page background#ffffff
  • rail / nav surface#f6f6f4
  • primary text#1a1a1a
  • secondary text#646464
  • selected row#e3e8f7
  • AI note fill#ffeda9
  • AI note text#3b2f00
  • dark button#111111
  • avatar orange#c2410c
  • section label#5a5a5a
  • divider#e6e6e6

Every checked pair, measured again

SampleWhereRatioNeeds
Aabody text17.40:14.5:1
Aamuted text on nav5.47:14.5:1
Aasection label6.90:14.5:1
Aatext on selected row14.22:14.5:1
AaAI note text11.26:14.5:1
Aadark button label18.88:14.5:1
Aaavatar initial5.18:14.5: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 600, 18px contact name; 16px panel titles
Body
Inter 400 16px/1.5 messages; 15px list and attributes

Section labels 12px uppercase 600 with 0.06em tracking; counts tabular; AI note headings 15px 700.

Spacing and imagery

Dense but breathable: nav rows 30px; list rows 64px; thread messages 16px padding; AI note 12px radius, 16px padding; details rows 32px key/value grid.

A small illustrated character in the onboarding card; emoji for teams and views; initial avatars in accent colours; line icons elsewhere.

Components

  • IconRail
  • HelpDeskNav (inbox items, TeamItem, ViewItem)
  • OnboardingCard
  • ConversationList (StatusFilter, SortSelect, ConversationRow)
  • ThreadHeader
  • MessageBubble
  • AiNoteCard
  • Composer (ChannelSelect, hint, AI tools, SendSplit)
  • DetailsSidebar (AssigneeField, TeamField, LinksSection, AttributesList, TopicsField, CollapsibleSection)

Interactions

  • Cmd/Ctrl+K opens a command menu (assign, snooze, close, macros)
  • clicking an attribute's '+ Add' edits inline
  • AI note can be regenerated or copied into a reply
  • send split menu: send and close, send and snooze
  • details sections collapse and remember state
  • onboarding card dismisses after channels are connected

Data

  • Conversation{id, workspace_id, contact_id, team_id, assignee_id, status (open|snoozed|closed), subject, language, brand, external_id, created_at}
  • Message{id, conversation_id, author_type (contact|agent|ai_note|system), body, channel (email|chat), created_at}
  • Contact{id, name, company, email}
  • Team{id, name, emoji}
  • ConversationLink{id, conversation_id, kind (tracker|back_office|side), url_or_ref}
  • AttributeValue{conversation_id, key, value}

Guardrails

Experience

  • Put the AI note directly in the thread as a visually distinct internal card, never sent to the customer.
  • Label the note 'Internal' and show its source (AI) and time.
  • Keep the details sidebar scannable as a two-column key/value list with dashes for empty.
  • Use the onboarding card only until setup is done, then remove it.
  • Offer send-and-close as the default for agents working queues.

Accessibility

  • Each column is a landmark with skip links between them.
  • AI note card is labelled 'Internal note, generated' and its bullets are a real list.
  • Attribute list uses dl/dt/dd; add buttons have names ('Add subject').
  • Composer channel select is labelled; shortcut hint is also in the help dialog.
  • Initial avatars have text alternatives and white initials meet 4.5:1.

Security

  • RLS: conversations and messages visible to workspace members with access to the team; notes never exposed through the customer-facing API.
  • Redact payment and credential data before sending text to the summarisation service.
  • Sanitise inbound email HTML and linkify safely.
  • Audit assignment, status and attribute 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 **Parleydesk**, the main help desk workspace. Agents triage their inbox and team queues, open a conversation that includes an AI-generated internal note (the customer's question plus a bullet summary), reply by email or chat, and manage assignment, links and attributes in a details sidebar.

### Stack
React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Command, Select, Collapsible, DropdownMenu, Sheet), lucide-react, Tiptap composer, TanStack Query, react-hook-form + zod for attributes, date-fns. Supabase Auth, Postgres, a realtime service for new messages, and an Edge Function that calls a hosted language-model API for notes.

### Pages & layout
1. **/inbox/:queue/:conversationId?** four-column workspace.
2. **Command menu** and **shortcut practice** dialog.
3. **/settings/channels** placeholder reached from the onboarding card.
4. Responsive per layout breakpoints.

### Design system
- Colors: `--bg: #ffffff` (page background), `--nav: #f6f6f4` (rail / nav surface), `--fg: #1a1a1a` (primary text), `--muted: #646464` (secondary text), `--selected: #e3e8f7` (selected row), `--note-bg: #ffeda9` (AI note fill), `--note-fg: #3b2f00` (AI note text), `--primary: #111111` (dark button), `--avatar: #c2410c` (avatar orange), `--label: #5a5a5a` (section label), `--divider: #e6e6e6` (divider).
- Fonts: Inter 600, 18px contact name; 16px panel titles for headings; Inter 400 16px/1.5 messages; 15px list and attributes for body. Section labels 12px uppercase 600 with 0.06em tracking; counts tabular; AI note headings 15px 700.
- Spacing: Dense but breathable: nav rows 30px; list rows 64px; thread messages 16px padding; AI note 12px radius, 16px padding; details rows 32px key/value grid.
- Radius: 12px AI note and onboarding card, 8px rows and buttons.
- Shadows: none; dividers #e6e6e6.
- Motion: 150ms section collapse; note shimmer while generating.

### Components & interactions
IconRail, HelpDeskNav, TeamItem, OnboardingCard, ConversationList, ConversationRow, ThreadHeader, MessageBubble, AiNoteCard, Composer, ChannelSelect, SendSplit, DetailsSidebar, AssigneeField, TeamField, LinksSection, AttributesList, TopicsField, CommandMenu.

Interactions: Cmd/Ctrl+K opens a command menu (assign, snooze, close, macros); clicking an attribute's '+ Add' edits inline; AI note can be regenerated or copied into a reply; send split menu: send and close, send and snooze; details sections collapse and remember state; onboarding card dismisses after channels are connected.

States to build: new workspace (onboarding card + example conversations); empty team inbox; conversation with AI note / note generating / note failed (hidden with retry link); sending / sent / failed; assigned to someone else (banner with take-over); closed conversation (reopen button); missing attribute values shown as dashes with add; keyboard practice mode.

### Data & state
Notes are stored as messages with `author_type = 'ai_note'` and are excluded from customer-visible queries. Attribute values upsert per key. Seed a workspace 'Harbor & Pine' (invented) with three emoji teams and two example conversations, one about an expired payment card.

Model: `Conversation{id, workspace_id, contact_id, team_id, assignee_id, status (open|snoozed|closed), subject, language, brand, external_id, created_at}`; `Message{id, conversation_id, author_type (contact|agent|ai_note|system), body, channel (email|chat), created_at}`; `Contact{id, name, company, email}`; `Team{id, name, emoji}`; `ConversationLink{id, conversation_id, kind (tracker|back_office|side), url_or_ref}`; `AttributeValue{conversation_id, key, value}`.

### Accessibility
Each column is a landmark with skip links between them. AI note card is labelled 'Internal note, generated' and its bullets are a real list. Attribute list uses dl/dt/dd; add buttons have names ('Add subject'). Composer channel select is labelled; shortcut hint is also in the help dialog. Initial avatars have text alternatives and white initials meet 4.5:1.
Verified contrast: body text: #1a1a1a on #ffffff = 17.4:1; muted text on nav: #646464 on #f6f6f4 = 5.47:1; section label: #5a5a5a on #ffffff = 6.9:1; text on selected row: #1a1a1a on #e3e8f7 = 14.22:1; AI note text: #3b2f00 on #ffeda9 = 11.26:1; dark button label: #ffffff on #111111 = 18.88:1; avatar initial: #ffffff on #c2410c = 5.18:1.

### Security
RLS: conversations and messages visible to workspace members with access to the team; notes never exposed through the customer-facing API. Redact payment and credential data before sending text to the summarisation service. Sanitise inbound email HTML and linkify safely. Audit assignment, status and attribute changes. RLS per table: `conversations`, `messages`, `conversation_links`, `attribute_values` select/update for workspace members in the conversation's team; `messages` with `ai_note` insertable only by the Edge Function; `teams` and `contacts` managed by admins; customer portal reads a view that excludes notes.

### Performance & SEO
Virtualise list; code-split details sidebar and Tiptap. App routes noindex.

### Guardrails
- Put the AI note directly in the thread as a visually distinct internal card, never sent to the customer.
- Label the note 'Internal' and show its source (AI) and time.
- Keep the details sidebar scannable as a two-column key/value list with dashes for empty.
- Use the onboarding card only until setup is done, then remove it.
- Offer send-and-close as the default for agents working queues.
- Write all copy fresh; use invented people, companies and numbers only. No real brands, logos, wordmarks or third-party product names anywhere in the UI or seed data.
- Do not trace or copy any existing product's layout assets, icons or illustrations; draw generic ones.
- Acceptance criteria:
  - [ ] Queues filter conversations with correct counts
  - [ ] AI note appears as an internal card with question and bullets
  - [ ] Attributes can be added inline
  - [ ] Send-and-close works and updates the list
  - [ ] Notes never appear in customer-facing responses

Open the builderAll templatesThis palette on its own