Skip to main content
vibld

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

  1. Left sidebar (240px): wordmark, primary items, 'Agent', 'Workflow', 'Developer' groups, Settings; footer docs link, avatar, theme toggle
  2. Top bar: 'Select organization' switcher and breadcrumb
  3. Page behind: 'Agents' title, subtitle, grid/list toggle, dark 'New agent' button, skeleton rows
  4. Scrim over everything; centred dialog (440px): title, one-line explanation, labelled text field, right-aligned 'Create organization' button
  5. 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

SampleWhereRatioNeeds
Aabody text17.93:14.5:1
Aamuted explanation6.29:14.5:1
Aabutton label16.48:14.5:1
input border3.36:13:1
focus ring4.42:13:1
Aasidebar text on canvas5.87:14.5:1
brand accent icon4.12: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 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.

Open the builderAll templatesThis palette on its own