Template
Bidwell
A proposal and quote builder for service businesses: pick a template, attach a client, draft sections with AI help, price line items with discounts and tax, then send a secure link and see when the client opens it. It turns ad-hoc Word docs and spreadsheets into a tracked sales pipeline.
Proposal and quote builder · 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
Two friendly geometric faces: Urbanist for punchy headlines and the minimal Mulish for readable UI copy, keeping the polished B2B tone.
- UrbanistHeadings: headlines 800 at 60px, section titles 700 at 36px
- MulishBody: UI copy 16px, slate-grey secondary text
Who it is for
- Freelancers and consultants
- Small creative and dev agencies
- Service-business sales teams
- Growing teams needing proposal roles
Layout
- Frosted sticky nav: blue rounded-square logo + wordmark left, 'Sign in' text and blue 'Get started' button right
- Centered hero: sparkle badge chip, two-line 60px headline with the second line in a blue gradient, subcopy, primary 'Start for free' + outline 'Sign in'
- Large framed product UI mock on a soft blue gradient panel
- Logo strip of fictional placeholder companies
- A 3x2 grid of white feature cards with indigo icon tiles
- Three-step Create / Send / Accept section
- Comparison block contrasting the tool with ad-hoc documents and spreadsheets
- Final CTA and footer
- App: dashboard with stats, proposals list by status, 5-step builder (template, client, content, pricing, review), client directory, templates library, public proposal view
Palette
Polished, optimistic, professional, friendly. A bright, trustworthy B2B product page that feels ready to show to clients.
- background
#f9fafb - card
#ffffff - text
#131720 - primary indigo-blue
#3550d4 - accent tint
#eef0fb - hero gradient light blue
#b3c8fb - border
#e5e7eb
Every checked pair, measured again
| Sample | Where | Ratio | Needs |
|---|---|---|---|
| Aa | body text on background | 17.16:1 | 4.5:1 |
| Aa | muted slate text on background | 5.69:1 | 4.5:1 |
| Aa | white text on primary button | 6.46:1 | 4.5:1 |
| Aa | primary link text on background | 6.18:1 | 4.5:1 |
| Aa | primary text on accent tint | 5.69:1 | 4.5:1 |
| Aa | gradient headline end stop on background | 6.12:1 | 4.5:1 |
| Aa | viewed badge text on amber tint | 6.37:1 | 4.5:1 |
| input border on background | 3.03: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
- Urbanist 800, 60px, -1.5px tracking; section titles 700 at 36px
- Body
- Mulish 400 at 16px, slate-grey secondary
Two friendly geometric sans faces: Jakarta for punchy headlines, Mulish for readable UI copy; gradient text used once for emphasis. Accessibility: body copy 16px or larger at 1.5+ line height with a ~70ch max measure; no text below 12px; weights under 400 only at 32px+; uppercase reserved for short labels with 0.05em+ tracking.
Spacing and imagery
Comfortable SaaS rhythm in a ~1100px container; 3-column cards with ~32px gaps; 10px radius cards, 8px buttons; thin grey borders instead of heavy shadows.
A product UI mock of a proposal document set in a browser window over a periwinkle gradient; line icons in pale indigo tiles; placeholder company wordmarks.
Components
- Announcement badge chip
- Gradient headline text
- Framed product UI mock
- Logo cloud
- Feature card grid
- Step-by-step section
- Multi-step proposal wizard with progress
- Rich-text section editor with AI generate button
- Line-item table with qty, unit price, discount, totals
- Status badges (draft/sent/viewed/accepted/rejected)
- Share dialog with password + expiry
- Client directory table
- Dashboard stat cards and charts
- Public proposal viewer with accept/decline
Interactions
- Wizard next/back with per-step validation
- AI generate with streaming text and regenerate
- Add/remove/reorder line items with live totals
- Copy share link toast
- Password gate on public link
- View events logged and shown in activity feed
- Accept/decline with confirmation
- Filter proposals by status
Data
Organization{id, name, logo_url, brand_color, tax_rate, currency}Member{org_id, user_id, role: owner|editor|viewer}Client{org_id, name, company, email, notes}Template{org_id, name, category, sections[]}Proposal{org_id, client_id, title, status, sections[], valid_until, created_by}LineItem{proposal_id, position, description, qty, unit_price, discount_pct}ShareLink{proposal_id, token, password_hash, expires_at}ViewEvent{share_link_id, viewed_at, ip_hash}
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 **Bidwell**, a proposal and quoting tool for freelancers and small agencies. Users start from reusable templates, attach a client, write or AI-draft sections, price deliverables with quantities, discounts and tax, then send a secure link. They see when the client opens it and whether it was accepted, so proposals become a trackable pipeline rather than loose attachments. ### Stack React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Radix), lucide-react. react-hook-form + zod for the wizard and line items (`useFieldArray`), TanStack Query, dnd-kit for reordering items and sections, Recharts for win-rate and pipeline charts, a lightweight rich-text editor (Tiptap) for sections. Supabase: Auth, Postgres, Storage for org logos, and Edge Functions for AI section drafting (call the model provider server-side) and for serving public proposals by token. ### Pages & layout 1. **Landing**: frosted sticky nav; centered hero with a sparkle badge, two-line headline whose second line uses a blue-to-violet gradient (`#3550d4` to `#6d3fd1`), subcopy, two buttons; large product UI mock on a soft gradient panel; logo strip of fictional companies; 3x2 feature cards; three-step section; comparison block; CTA; footer. 2. **Dashboard**: stat cards (open value, sent this month, win rate, avg response time), recent activity, pipeline bar chart. 3. **Proposals**: table with status filter tabs and search. 4. **Builder**: five-step wizard with a top stepper: Template → Client → Content → Pricing → Review. Pricing shows the line-item table with subtotal, discount, tax and grand total pinned to the bottom. 5. **Templates** and **Clients**: CRUD lists with detail drawers. 6. **Settings**: organisation name, logo, brand colour, tax rate, currency, members. 7. **Public proposal** `/p/:token`: branded read-only document, optional password gate, Accept / Decline buttons. ### Design system Light. Tokens: `--background: #f9fafb`, `--card: #ffffff`, `--foreground: #131720`, `--primary: #3550d4`, `--primary-foreground: #ffffff`, `--accent: #eef0fb`, `--border: #e5e7eb`; status colours for draft (slate), sent (blue), viewed (amber), accepted (green), rejected (red). Fonts: Urbanist 700/800 headings, Mulish 400/500 body. Scale 14/16/18/24/36/60. Radius 10px cards, 8px inputs and buttons. Borders over shadows; hover shadow `0 4px 12px rgb(19 23 32 / .06)`. Motion 150-200ms ease-out. Add `--muted-foreground: #5b6477` for slate secondary text and `--input-border: #8891a3` for inputs and line-item fields. Status badges use 700-level text on 100-level tints (e.g. viewed `#92400e` on `#fef3c7`). Gradient headline stops `#3550d4` to `#6d3fd1`. ### Components & interactions Stepper (complete, current, upcoming, error). Line-item rows with drag handle, numeric inputs that reject negatives, remove button, and totals that update as you type. AI button shows a loading shimmer, streams text, and offers Insert or Discard; failures show a retry toast. Share dialog: toggle password, date picker for expiry, copy link. Empty states for no proposals/templates/clients with a clear first action. ### Data & state Organization, Member(role), Client, Template(sections JSON), Proposal(status enum, sections JSON, valid_until), LineItem(position, qty, unit_price, discount_pct), ShareLink(token, password_hash, expires_at), ViewEvent. Compute totals in one pure, unit-tested function used by both builder and public view. Seed three templates (web design, retainer, workshop) and a few fictional clients. ### Accessibility Stepper announces "Step 3 of 5". Line-item table uses proper `th` headers and labelled numeric inputs; drag reordering has keyboard alternatives. Both gradient headline stops pass 4.5:1 on the page background, so the gradient never dips below AA. Status badges include text. Public view is fully readable with zoom to 200%. Type: body 16px+, line height 1.5+, max ~70ch, nothing under 12px. Verified contrast: body text #131720 on #f9fafb = 17.16:1; muted slate text #5b6477 on #f9fafb = 5.69:1; white text #ffffff on #3550d4 = 6.46:1; primary link text #3550d4 on #f9fafb = 6.18:1. ### Security RLS: org members read/write their org's rows; viewers read only; owners manage members. Public proposals are never read directly by the anon role; an Edge Function looks up the token, checks expiry and a bcrypt-hashed password, returns a sanitized payload, and logs a view with a hashed IP. Rate-limit password attempts. Sanitize rich-text HTML with DOMPurify before rendering. AI keys live only in function secrets; cap prompt length and per-user daily calls. Logo uploads: PNG/SVG-sanitized/JPEG, ≤1 MB. Validate money fields with zod on client and function. ### Performance & SEO Code-split builder and editor; lazy-load charts. Public proposal pages are `noindex`. Landing gets meta and OG image; compress the hero image. ### Guardrails - Original copy; fictional logos and clients; no invented testimonials. - Typed components, no `any`, visible error states. - Don't store client data beyond what a proposal needs. - Done when: a proposal can be built through all five steps with correct totals; a password-protected link opens only with the right password and expires on time; opening it logs a view; accepting updates status on the dashboard; viewers cannot edit.