Template
Closerail
A single-tenant sales CRM built around a drag-and-drop pipeline board. Teams manage deals, contacts, companies, activities and tasks, see KPIs and a six-month weighted forecast, and use a calendar, global search and notifications. A friendly marketing page and an onboarding wizard help small sales teams adopt it quickly.
Drag-and-drop deal board · App · Small tools and apps · full-stack app (auth + DB)
A mock-up of the homepage, drawn from this design’s layout, palette and typefaces. A build follows the full prompt below.
Start from this templateRead the build prompt
Typefaces
Outfit is a rounded geometric sans that makes the CRM feel people-first; it keeps it here while other templates move off it.
- OutfitHeadings: display 48-56px bold at -0.025em
- OutfitBody: body 16-18px at line-height 1.6
Who it is for
- Startup sales teams
- Founders running their own pipeline
- Freelancers tracking proposals
- Agencies managing client deals
Layout
- Minimal header: outline monogram logo + wordmark; sticky white bar on scroll with a sign-in link and black pill CTA
- Split hero: large bold headline, grey subcopy, orange pill CTA left; rounded photo of two colleagues right with floating cards (pipeline value sparkline, stacked deal-won toasts)
- Rounded mint section with outline pill eyebrow and feature grid (quick setup, team-first design, forecasts)
- Stats (orange large numbers) beside a testimonial card with avatar
- Dark rounded-top CTA section with centered headline and orange pill
- App: dashboard KPIs, pipeline Kanban, deals, contacts, companies, activities, tasks, calendar, reports, settings, onboarding
Palette
friendly, energetic, clean, confident, human. A warm, people-first CRM rather than a spreadsheet in disguise.
- background
#ffffff - text
#171c1c - primary orange
#fd6435 - mint section
#eff5f4 - muted text
#60716f - dark section
#1a1f1f - chart teal
#3a9f80
Every checked pair, measured again
| Sample | Where | Ratio | Needs |
|---|---|---|---|
| Aa | body text on background | 17.22:1 | 4.5:1 |
| Aa | muted text on background | 5.14:1 | 4.5:1 |
| Aa | muted text on mint panel | 4.66:1 | 4.5:1 |
| Aa | dark label on orange button | 5.78:1 | 4.5:1 |
| Aa | orange text / stats on background | 5.18:1 | 4.5:1 |
| Aa | orange text on mint panel | 4.69:1 | 4.5:1 |
| Aa | text on dark CTA section | 14.87:1 | 4.5:1 |
| teal chart line on card | 3.26:1 | 3:1 | |
| focus ring on background | 5.18:1 | 3:1 | |
| input border on background | 3.25:1 | 3:1 | |
| Aa | dark mode text | 16.41: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
- Outfit Bold 48px, -1.2px tracking; H2 36px bold
- Body
- Outfit 16-18px, grey-green
A rounded geometric sans throughout makes it feel approachable and modern.
Spacing and imagery
1120px container, large 32px radius on section containers, 16px on cards, pill buttons, floating overlay cards with soft shadows, about 120px sections.
Warm candid photo of colleagues at a laptop with floating UI cards (sparkline, deal-won notifications); avatar on testimonial; charts in-app.
Components
- Sticky header with pill CTA
- Split hero with photo and floating UI cards
- Pill eyebrow tag
- Feature grid on mint panel
- Stats row
- Testimonial card
- Dark CTA section
- KPI cards
- Kanban pipeline with stage columns and totals
- Deal card (value, close date, probability, contact)
- Contacts and companies tables
- Activity log and tasks list
- Month calendar
- Global search and notification center
Interactions
- Drag deal cards between stages; totals update
- Rename, reorder, add and remove stages
- Filter dashboard by date range
- Log call/email/meeting/note on a deal
- Tasks with priority and due dates; complete toggle
- Calendar shows activities, tasks and close dates
- CSV import with column mapping; export
- Onboarding wizard; dark mode toggle
Data
Team{id, name, size}Stage{id, team_id, name, position, default_probability}Deal{id, team_id, title, value, currency, stage_id, probability, expected_close, contact_id, company_id, owner_id, status open|won|lost}Contact{id, team_id, name, email, phone, position, company_id, tags[]}Company{id, team_id, name, industry, website}Activity{id, team_id, type call|email|meeting|note, body, deal_id?, contact_id?, occurred_at, user_id}Task{id, team_id, title, priority, due_at, deal_id?, done}Notification{id, user_id, kind, payload, read_at}
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 a template'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 templates) - 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.
### Goal Build **Closerail**, a friendly CRM for small sales teams whose pipeline has outgrown a spreadsheet. The core is a visual pipeline board. Around it sit contacts, companies, activities, tasks, a calendar, a weighted forecast and a dashboard, with a short onboarding wizard. ### Stack React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Radix: Dialog, Command, Popover, Tabs, Calendar) and lucide-react. Use dnd-kit for the board and stage reordering, TanStack Query and Table, Recharts for KPIs, pipeline and forecast, react-hook-form + zod, date-fns and Papa Parse. Use Supabase for Auth (email), Postgres for all entities and Realtime so board moves appear for teammates. ### Pages & layout 1. **Landing**: - Sticky header: logo, Sign in, and a black pill CTA. - Split hero: headline, subcopy and an orange pill on the left; a rounded, warm photo with floating UI cards (a pipeline-value sparkline, stacked "deal won" toasts) on the right. - A mint rounded panel with a pill eyebrow and feature grid, a stats row next to a testimonial card, a dark rounded CTA section and a footer. 2. **Onboarding**: company name, team size, and a starting set of stages. 3. **Dashboard**: KPI cards (open deals, pipeline value, win rate, average cycle), value by stage, and the six-month weighted forecast. 4. **Pipeline**: columns with count and value totals, deal cards and quick add. 5. **Deal detail**: fields, activity timeline, tasks and linked contact/company. 6. **Contacts** and **Companies**: searchable tables with tags. 7. **Activities**, **Tasks**, **Calendar** (month view). 8. **Settings**: profile, stages and team. 9. A top bar with global search (⌘K) and a notification bell. ### Design system - Tokens: `--background: #ffffff`, `--foreground: #171c1c`, `--primary: #fd6435`, `--secondary: #eff5f4`, `--muted-fg: #60716f`, `--border: #e0e6e5` (decorative), `--input-border: #7a9490`, `--primary-text: #c2410c` for orange text and large stats, `--dark: #1a1f1f`, `--chart-teal: #3a9f80`, `--ring: #c2410c`; orange buttons carry `#171c1c` labels. - Dark mode: `#111515` background and `#eef3f2` text. - Font: Outfit (Google). Display 48-56px bold at -0.025em, H2 36px, body 16-18px at line-height 1.6. - Spacing on a 4px base; radius 32px on section containers, 16px on cards, full on buttons. - Shadows: floating cards `0 12px 32px -12px rgb(0 0 0 / .18)`. - Motion: 200ms card lift on drag, 150ms hovers, toast slide-ins. ### Components & interactions KanbanColumn (drop highlight, empty "Drag a deal here"), DealCard (hover, dragging, focus; overdue close date badge), StageManager (rename inline, reorder by drag or keyboard, delete with reassignment prompt), DealForm, ActivityComposer (type tabs), TaskItem (priority chip, overdue state), CalendarMonth (dots per type; day popover), DataTable (search, filter, pagination, empty/error), CsvImport (map columns, validate, summary), CommandSearch (grouped results), NotificationCenter (unread badge, mark all read), ThemeToggle, OnboardingWizard. ### Data & state Tables as listed: `teams`, `team_members(team_id, user_id, role)`, `stages`, `deals`, `contacts`, `companies`, `activities`, `tasks`, `notifications`. Weighted forecast = Σ value × probability, bucketed by the month of expected close. Keep the deal's position within a stage in a `rank` column (fractional indexing). Seed a fictional team with about 40 deals across seven stages and invented companies. ### Accessibility Orange buttons carry dark `#171c1c` labels (5.8:1), and orange text uses `#c2410c`. Board drag needs keyboard support (dnd-kit sensors) and a live-region announcement. Status and priority chips carry text. Grey-green muted text is `#60716f` (4.7:1 on the mint panel). Calendar days need accessible labels with event counts. Every photo has alt text. Verified contrast: body: #171c1c on #ffffff = 17.2:1; muted on mint: #60716f on #eff5f4 = 4.7:1; button label: #171c1c on #fd6435 = 5.8:1. ### Security Enable RLS on every table, with team membership checked through a security-definer function; only admins edit stages and members. Validate every form and CSV row with zod, on the client and in an Edge Function for imports (5 MB limit, formula-injection guard on export). Normalize website URLs to https and render them with `rel="noopener noreferrer"`. Render activity bodies as plain text. Keep only the anon key in the client. ### Performance & SEO Virtualize long columns and tables. Use optimistic drag updates with rollback. Index `(team_id, stage_id, rank)`. Split the landing page, the app and reports. Landing page: meta/OG tags and a responsive hero photo; noindex the app. Target Lighthouse 90+. ### Guardrails - Write fresh copy; use royalty-free photos, invented companies, and testimonials marked as samples. - No inflated usage stats presented as fact. - Keep components small and typed; no `any`. Show errors visibly. - Done when: (1) moving a deal persists and appears live for a teammate; (2) stage edits reassign deals safely; (3) the forecast matches a manual calculation; (4) CSV import validates and reports errors; (5) the board is operable by keyboard.