Template
Yarrowmint
The first thing a new user sees in an AI agent platform: a small welcome dialog asking for an organisation name, shown over a greyed-out, skeleton-loaded Agents page. It gets a workspace created in one step and defers inviting teammates.
Welcome modal that creates the first organisation · 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 600, 18px dialog title; 26px page title
- InterBody: Inter 400 16px / 1.5
Patterns
- welcome dialog over skeleton workspace
- single-field setup form
- disabled primary until valid
- persistent left sidebar with grouped nav
- view toggle grid/list
- org switcher in top bar
States it is designed for
- Pristine: button disabled
- Validation: too short / too long / invalid characters
- Submitting
- Server error: inline message with Retry
- Name taken (slug): suggestion offered
- Success: dialog closes, empty agents state with 'New agent' CTA
Who it is for
- first users of an AI agent platform
- founders and team leads setting up a workspace
Layout
- Left sidebar (240px): wordmark, primary items, 'Agent', 'Workflow', 'Developer' groups, Settings; footer docs link, avatar, theme toggle
- Top bar: 'Select organization' switcher and breadcrumb
- Page behind: 'Agents' title, subtitle, grid/list toggle, dark 'New agent' button, skeleton rows
- Scrim over everything; centred dialog (440px): title, one-line explanation, labelled text field, right-aligned 'Create organization' button
- Mobile: dialog becomes full-width sheet from bottom
Palette
Minimal and welcoming; the product waits in the background while one question is asked.
- canvas
#f7f7f7 - surface
#ffffff - skeleton
#e6e6e6 - text
#171717 - muted
#606060 - input-border
#8c8c8c - primary
#1f1f1f - on-primary
#ffffff - disabled-bg
#8a8a8a - accent-green
#1f8a3a - focus
#1f8a3a
Every checked pair, measured again
| Sample | Where | Ratio | Needs |
|---|---|---|---|
| Aa | body text | 17.93:1 | 4.5:1 |
| Aa | muted explanation | 6.29:1 | 4.5:1 |
| Aa | button label | 16.48:1 | 4.5:1 |
| input border | 3.36:1 | 3:1 | |
| focus ring | 4.42:1 | 3:1 | |
| Aa | sidebar text on canvas | 5.87:1 | 4.5:1 |
| brand accent icon | 4.12:1 | 3: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 dialog title; 26px page title
- Body
- Inter 400 16px / 1.5
Field label 15px 500; placeholder italic muted. Sidebar group labels 12px uppercase 0.06em.
Spacing and imagery
Compact; 4px base; dialog padding 20px; field 40px tall; radius 10px dialog, 8px field and button; dialog shadow 0 16px 40px rgba(0,0,0,.18); scrim black at 35%.
No imagery; skeleton bars behind the dialog imply the workspace that's about to appear.
Components
- AppSidebar
- OrgSwitcher (empty)
- PageHeader with ViewToggle and NewAgentButton
- SkeletonRows
- WelcomeDialog
- OrgNameField
- CreateButton
Interactions
- Create button enables when the trimmed name is 2+ characters; Enter submits
- On submit, button shows spinner; on success dialog fades out and the page loads real (empty) content
- Dialog cannot be dismissed with Escape or scrim click until an organisation exists (with 'Sign out' link as escape hatch)
- Name auto-suggests a slug shown under the field
Data
Organization{id, name, slug, created_by, created_at}Membership{org_id, user_id, role (owner|admin|member)}
Guardrails
Experience
- Ask for one thing only; invite teammates later
- Say explicitly that teammates can be invited later
- Keep the product visible behind the dialog so users know where they're going
- Provide a sign-out escape hatch since the dialog is required
- Disabled button must look disabled and explain via helper text
Accessibility
- Dialog uses role='dialog' with aria-modal, labelled by the title and described by the explanation
- Field has a visible label; errors linked with aria-describedby
- Background skeleton is inert and aria-hidden
- Focus starts in the field
- Focus ring 2px #1f8a3a
Security
- Create org through an RPC that inserts org and owner membership atomically
- RLS: organizations visible to members; only owners update name
- Validate name length (2-60) and characters server-side; slugs unique
- Rate-limit org creation per user
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 **Yarrowmint**, the welcome dialog of an AI agent platform that creates the user's first organisation. It appears over a greyed skeleton of the Agents page and asks for one thing: an organisation name. ### Stack React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Radix Dialog), lucide-react, react-hook-form + zod, TanStack Query. Supabase Auth + Postgres with an RPC for org creation. ### Pages & layout 1. **Shell**: sidebar (wordmark; Trigger, Runs, Reviews, Monitoring; 'Agent' group; 'Workflow' group; 'Developer' group; Settings; footer docs link, avatar, theme toggle); top bar with empty 'Select organization' switcher and 'Agents' breadcrumb. 2. **Page behind**: 'Agents' title and subtitle, grid/list toggle, 'New agent' button, three skeleton rows; all inert. 3. **Dialog**: 'Welcome aboard!' title, 'Let's set up your organisation. You can invite teammates later.', label 'Organisation name', field with italic placeholder, slug preview, right-aligned 'Create organisation'; small 'Sign out' text link bottom-left. 4. **After success**: empty agents state with illustration-free message and 'New agent' CTA. ### Design system - Colors: `--canvas: #f7f7f7`, `--surface: #ffffff`, `--skeleton: #e6e6e6`, `--text: #171717`, `--muted: #606060`, `--input-border: #8c8c8c`, `--primary: #1f1f1f`, `--on-primary: #ffffff`, `--disabled-bg: #8a8a8a`, `--accent-green: #1f8a3a`, `--focus: #1f8a3a`. - Fonts: Inter 400/500/600; body 16px/1.5; dialog title 18px. - Spacing: 4px scale; dialog padding 20px; 12px field-to-button. - Radius: 10px dialog, 8px field/button. - Shadows: dialog 0 16px 40px rgba(0,0,0,.18); scrim rgba(0,0,0,.35). - Motion: dialog fade/scale 150ms; skeleton shimmer 1.2s; reduced motion stops shimmer. ### Components & interactions WelcomeDialog (non-dismissible until created), OrgNameField (zod: trim, 2-60 chars), SlugPreview, CreateButton (disabled, busy), InlineError, SignOutLink, SkeletonRows, EmptyAgentsState. The slug preview updates live (lowercase, hyphenated, max 40 chars) and shows availability after a 400ms debounce with a small check or a suggested alternative. The sidebar and page header behind the scrim render with real layout but disabled interactions, so the transition after creation is a simple fade of the scrim and skeleton into real content with no layout jump. After success, the org switcher shows the new name with a monogram avatar and the breadcrumb updates. ### Data & state Tables `organizations(id, name, slug unique, created_by)`, `memberships(org_id, user_id, role)`. RPC `create_organization(name)` inserts both in a transaction and returns the org. Current org id stored in the URL after creation. Slug availability is a read-only RPC returning boolean plus a suggestion. After creation, invalidate the org list query, set the current org id, and prefetch the agents list so the empty state appears instantly. ### Accessibility Modal dialog semantics, labelled field with linked errors, inert background, initial focus in field, visible focus ring, disabled state explained in helper text. Verified contrast: body text: #171717 on #ffffff = 17.93:1; muted explanation: #606060 on #ffffff = 6.29:1; button label: #ffffff on #1f1f1f = 16.48:1; input border: #8c8c8c on #ffffff = 3.36:1; focus ring: #1f8a3a on #ffffff = 4.42:1; sidebar text on canvas: #606060 on #f7f7f7 = 5.87:1; brand accent icon: #1f8a3a on #f7f7f7 = 4.12:1. ### Security RLS on `organizations` (select for members; update for owners) and `memberships` (select own org rows; insert only via RPC security definer that sets role owner for caller). Validate and rate-limit. ### Performance & SEO Skeleton is CSS only. Dialog code tiny. App routes noindex. ### Guardrails - Invented org names in examples. - Acceptance criteria: (1) button disabled until valid; (2) creation makes org + owner membership atomically; (3) errors show inline; (4) success reveals empty agents state; (5) keyboard-only completion works.