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
- icon rail (~48px) for product areas
- 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
- 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)
- 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
- 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
- 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
| Sample | Where | Ratio | Needs |
|---|---|---|---|
| Aa | body text | 17.40:1 | 4.5:1 |
| Aa | muted text on nav | 5.47:1 | 4.5:1 |
| Aa | section label | 6.90:1 | 4.5:1 |
| Aa | text on selected row | 14.22:1 | 4.5:1 |
| Aa | AI note text | 11.26:1 | 4.5:1 |
| Aa | dark button label | 18.88:1 | 4.5:1 |
| Aa | avatar initial | 5.18:1 | 4.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