Template
Rakemoor
While a news-events search job runs, the user sees which step it is on, and the configuration used (mode, validators, sources) locked in a side panel. A floating quick-start checklist rewards finishing the first search.
Search-run progress screen with locked configuration panel · App screen: loading · 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 500, 18px query title; 20px panel headings
- InterBody: Inter 400, 16px, line-height 1.5
Patterns
- query as page title
- step counter progress message
- faded skeleton rows behind status
- locked right configuration panel
- segmented control (disabled)
- validator list with snake_case keys
- collapsible panel sections
- floating quick-start checklist with reward
- grouped left sidebar with project picker
States it is designed for
- queued (Step 1)
- running steps 2-4 with messages
- completed with results
- failed with reason and 'Run again'
- no results: empty state suggesting broader validators
- cancelled by user
- credits exhausted before run
Who it is for
- analysts and developers using a news data API
- risk and research teams monitoring events
Layout
- left sidebar: logo, grouped nav (Events: project picker, New search, Past searches, Monitoring, Watchlist; News: Overview, Playground; Manage: Keys, Usage, Billing), quick-start trigger at bottom
- header: the natural-language query as title
- main results pane: faded skeleton rows with centred 'Step 4 of 4: Finishing…' and a sub-message
- right panel (~290px): Configuration with lock icon, Search mode segmented control, Validators section, Sources section, Additional settings
- quick-start popover anchored bottom-left over main
- below 1100px the configuration panel becomes a toggleable drawer; below 768px sidebar collapses to a menu button
Palette
Focused and transparent: the tool shows exactly what it's doing and with which rules.
- bg
#ffffff - canvas
#f6f7fb - text
#171a24 - muted
#5b6173 - accent
#4b57d6 - segment
#eef0f4 - warn
#b7791f - border
#8a90a2 - skeleton
#eceef3
Every checked pair, measured again
| Sample | Where | Ratio | Needs |
|---|---|---|---|
| Aa | body text | 17.36:1 | 4.5:1 |
| Aa | muted text | 6.17:1 | 4.5:1 |
| Aa | validator description | 5.78:1 | 4.5:1 |
| Aa | segment label | 5.41:1 | 4.5:1 |
| mode icon | 3.19:1 | 3:1 | |
| input border | 3.19:1 | 3:1 | |
| focus ring | 5.78: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 500, 18px query title; 20px panel headings
- Body
- Inter 400, 16px, line-height 1.5
Section labels 12px uppercase 600 with 0.06em tracking; validator keys in JetBrains Mono 14px 500.
Spacing and imagery
Density: Medium-dense data tool. Grid: 4px base; panel padding 16px; section gaps 16px. Container: fluid; right panel fixed 300px. Radius: 10px panels, 6px segmented control, 12px popover. Shadows: Popover 0 12px 32px rgba(15,20,40,0.16); panels flat.
Small line icons; no images. Skeleton rows hint at the shape of results.
Components
- AppSidebar with ProjectPicker
- QueryTitle
- RunProgress (step n of m, message)
- SkeletonResults
- ConfigPanel (locked)
- SegmentedControl
- ValidatorList
- SourcesSection
- QuickStartPopover (0/2, reward, steps with View)
Interactions
- Progress polls the run; when done, skeleton swaps to the results table
- Lock icon tooltip explains config is frozen during a run
- Sections collapse with chevrons
- Quick-start 'View' jumps to the running search; dismiss X hides the popover
- Esc closes the popover
Data
Search{id, project_id, query, mode (lite|base), status (queued|running|done|failed|cancelled), step, step_total, created_at}Validator{id, search_id, key, description}SourceList{id, name, kind (all|curated)}OnboardingTask{user_id, key, done_at}
Guardrails
Experience
- Always show which step is running and what it does
- Freeze and visibly lock configuration during a run
- Show cost per run next to the mode
- Let the user leave the page; the run continues and appears in Past searches
- Keep the quick-start popover dismissible and never modal
Accessibility
- Step message in an aria-live=polite region
- Segmented control disabled state conveyed with aria-disabled and the lock tooltip
- Skeleton region has aria-busy=true
- Validator keys readable (monospace but not tiny)
- Popover is a non-modal dialog with a labelled close button
Security
- RLS: searches readable only by project members
- Validate validator definitions server-side (length, allowed fields)
- Charge credits server-side only
- Rate-limit concurrent runs per project
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 **Rakemoor**, the in-progress view of an events search in a news data product. The query is the title, the main pane shows step progress over faint result skeletons, and a locked panel on the right shows mode, validators and sources. Build the sidebar shell, this view and the quick-start popover, using a mock run that advances through four steps.
### Stack
React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui on Radix primitives and lucide-react icons. TanStack Query for server state, react-hook-form + zod for every form, date-fns for relative times. Supabase for Auth, Postgres with row-level security and Edge Functions for anything that needs a secret. Run searches in a background job; the client polls status or subscribes to a realtime channel.
### Pages & layout
1. **Sidebar** with three groups and a project picker; quick-start trigger showing 0/2 at the bottom.
2. **Run view**: query title; main pane with skeleton rows and a centred 'Step 4 of 4: Finishing…' plus sub-message.
3. **Configuration panel**: lock icon; Search mode segmented (fast vs thorough) with a cost line; Validators (key + one-line rule); Sources ('all sources' note); Additional settings disclosure.
4. **Quick-start popover**: title, counter, reward line, two steps (current one highlighted with spinner and a View button).
### Design system
- Colors: `--bg: #ffffff` (panels), `--canvas: #f6f7fb` (page), `--text: #171a24` (primary text), `--muted: #5b6173` (descriptions), `--accent: #4b57d6` (validator descriptions and links), `--segment: #eef0f4` (segmented control track), `--warn: #b7791f` (mode icon), `--border: #8a90a2` (inputs and dividers that matter), `--skeleton: #eceef3` (skeleton bars).
- Fonts: Inter 500, 18px query title; 20px panel headings for headings; Inter 400, 16px, line-height 1.5 for body. Section labels 12px uppercase 600 with 0.06em tracking; validator keys in JetBrains Mono 14px 500.
- Spacing: Medium-dense data tool. 4px base; panel padding 16px; section gaps 16px. Container: fluid; right panel fixed 300px.
- Radius: 10px panels, 6px segmented control, 12px popover.
- Shadows: Popover 0 12px 32px rgba(15,20,40,0.16); panels flat.
- Motion: Step text crossfades between steps; skeleton shimmer 1.2s (off with reduced motion); quick-start checklist item ticks with a 150ms check draw.
### Components & interactions
ConfigPanel reuses the same fields as the new-search form but renders them read-only with a lock. ValidatorList shows monospace keys with a one-line plain-English rule in accent colour.
- Progress polls the run; when done, skeleton swaps to the results table
- Lock icon tooltip explains config is frozen during a run
- Sections collapse with chevrons
- Quick-start 'View' jumps to the running search; dismiss X hides the popover
- Esc closes the popover
### Data & state
Mock a run moving through steps every 3 seconds, then show 12 invented result rows. Validators are invented (e.g. trade-policy topic, date window). TanStack Query polls every 2s while running.
Entities: `Search{id, project_id, query, mode (lite|base), status (queued|running|done|failed|cancelled), step, step_total, created_at}`; `Validator{id, search_id, key, description}`; `SourceList{id, name, kind (all|curated)}`; `OnboardingTask{user_id, key, done_at}`.
States to build and show in a dev-only state switcher:
- queued (Step 1)
- running steps 2-4 with messages
- completed with results
- failed with reason and 'Run again'
- no results: empty state suggesting broader validators
- cancelled by user
- credits exhausted before run
### Accessibility
- Step message in an aria-live=polite region
- Segmented control disabled state conveyed with aria-disabled and the lock tooltip
- Skeleton region has aria-busy=true
- Validator keys readable (monospace but not tiny)
- Popover is a non-modal dialog with a labelled close button
Verified contrast: body text: #171a24 on #ffffff = 17.36:1; muted text: #5b6173 on #ffffff = 6.17:1; validator description: #4b57d6 on #ffffff = 5.78:1; segment label: #5b6173 on #eef0f4 = 5.41:1; mode icon: #b7791f on #eef0f4 = 3.19:1; input border: #8a90a2 on #ffffff = 3.19:1; focus ring: #4b57d6 on #ffffff = 5.78:1.
### Security
- RLS: searches readable only by project members
- Validate validator definitions server-side (length, allowed fields)
- Charge credits server-side only
- Rate-limit concurrent runs per project
RLS detail: `searches` and `validators` select/insert for project members, update only by the service role (status/step); `onboarding_tasks` owner-only.
### Performance & SEO
Stop polling on completion; virtualise results beyond 100 rows. Private route: noindex.
### Guardrails
- Always show which step is running and what it does
- Freeze and visibly lock configuration during a run
- Show cost per run next to the mode
- Let the user leave the page; the run continues and appears in Past searches
- Keep the quick-start popover dismissible and never modal
- Write fresh, generic copy and invented sample data; no real brands, logos, product names or people.
- Keep components small and typed (no `any`); surface every error visibly with a way to recover.
Acceptance criteria:
- Step text advances and is announced
- Config is locked during run and editable on 'Run again'
- Completion swaps skeleton for results
- Failures show a reason and retry
- Quick-start ticks the first task when the run completes