Skip to main content
vibld

Template

Orlume

The home screen of a headless content platform's project studio. It welcomes the user to the project, lists recent schema changes, suggests documentation, and a notifications panel shows mentions from teammates with timestamps.

Headless CMS project home with notifications panel · App screen: dashboard · 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 700 24px welcome title
  • InterBody: Inter 400 16px / 1.5; list rows 15px

Patterns

  • environment badge in top bar
  • notifications slide-over panel from bell
  • recent schema updates list
  • documentation cards with dark thumbnails
  • compact left nav with icons
  • AI assist button in top bar

States it is designed for

  • no notifications (friendly empty)
  • unread vs read items
  • loading skeletons for cards
  • environment without schema (onboarding card)
  • panel error with retry
  • realtime new notification toast

Who it is for

  • content engineers and developers
  • editors collaborating on structured content

Layout

  1. Top bar (tinted): project avatar + name, environment chip, search with shortcut, history and saved icons, AI assist button, help, messages, bell with unread dot, avatar
  2. Left nav (~110px): product wordmark, Home (active), Schema, Content, Assets, API Playground
  3. Main (max 520px): welcome h1 and subtitle; card 'Recent schema updates' with rows (model name - type - count); card 'Explore documentation' with 2-column dark thumbnail cards and captions
  4. Notifications panel (~210px, right, full height): header with All filter and mark-all icon; mention items (avatar, message with @handle, relative time in pink with dot)
  5. Mobile: left nav becomes bottom tabs; notifications panel becomes full-screen

Palette

Modern, structured, collaborative; navy text with a mint top bar and purple accents.

  • page#ffffff
  • top bar tint#f1f8f7
  • text#0c152d
  • muted text#5e6275
  • primary purple#5b4de6
  • env green#1b7a4d
  • time pink#d6246e
  • doc thumb#0c152d
  • on dark#ffffff
  • border#dee0e7
  • focus ring#5b4de6

Every checked pair, measured again

SampleWhereRatioNeeds
Aabody text on white18.09:14.5:1
Aamuted text on white6.03:14.5:1
Aaenvironment label on tint4.95:14.5:1
Aatime label on white4.84:14.5:1
Aathumbnail title on dark18.09:14.5:1
Aaactive nav text5.75:14.5:1
focus ring on tint5.35: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 700 24px welcome title
Body
Inter 400 16px / 1.5; list rows 15px

Similar to the observed neo-grotesk; model type words muted.

Spacing and imagery

Comfortable; 4px base, 16px card padding, 12px row gap, 24px between cards; radius 8px cards and thumbnails; panel shadow -4px 0 24px rgba(12,21,45,.08).

Dark navy documentation thumbnails with abstract UI sketches (generated, no logos); avatars in notifications.

Components

  • TopBar with EnvironmentChip and AIAssistButton
  • SideNav
  • WelcomeHeader
  • SchemaUpdatesCard
  • DocCard
  • NotificationsPanel
  • NotificationItem
  • FilterMenu (All, Mentions, Assigned)

Interactions

  • Bell toggles the panel (slides in 200ms) and marks visible items read after 2s
  • Clicking a notification deep-links to the entry and field
  • Search opens a command palette (Cmd/Ctrl+K)
  • Environment chip opens a switcher; switching reloads data for that environment
  • Schema rows link to the model editor

Data

  • Project{id, name, avatar}
  • Environment{id, project_id, name (master|staging|...)}
  • SchemaChange{id, environment_id, model_name, kind (section|layout|component), change_count, changed_at}
  • Notification{id, user_id, actor_id, type (mention|assign|comment), entry_ref, body, read_at?, created_at}

Guardrails

Experience

  • Show environment prominently so users know where they are
  • Keep notifications scannable: who, what, where, when
  • Link every item to its exact place
  • Offer docs as a secondary, not primary, block
  • Mark read automatically but allow mark-unread

Accessibility

  • Panel is a non-modal complementary region or a dialog with focus management - pick dialog on mobile
  • Bell button name includes unread count
  • Relative times have absolute dates in title
  • Doc cards are links with the title as accessible name; thumbnails decorative
  • Environment chip announces current environment

Security

  • RLS: notifications readable only by recipient
  • Mentions render user text escaped; no HTML in bodies
  • Environment access limited by role (editors cannot see production secrets)
  • Realtime channel filters by user id server-side

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 **Orlume**, the project home of a headless CMS studio with a notifications slide-over. Seed a fictional bike-retailer project, several schema changes and mention notifications from invented teammates.

### Stack
Use React 18, TypeScript, Vite, Tailwind CSS, shadcn/ui, Radix, lucide-react, TanStack Query, react-hook-form, zod, Supabase, date-fns. New notifications arrive via Supabase Realtime subscriptions on the notifications table. Use Supabase for Auth, Postgres (row-level security on every table) and Storage where noted; keep only the anon key in the browser and run privileged work in Edge Functions.

### Pages & layout
1. **/:project/home**: this screen.
2. Schema, Content, Assets and API Playground as stub routes.

Regions, in order:
- Top bar (tinted): project avatar + name, environment chip, search with shortcut, history and saved icons, AI assist button, help, messages, bell with unread dot, avatar
- Left nav (~110px): product wordmark, Home (active), Schema, Content, Assets, API Playground
- Main (max 520px): welcome h1 and subtitle; card 'Recent schema updates' with rows (model name - type - count); card 'Explore documentation' with 2-column dark thumbnail cards and captions
- Notifications panel (~210px, right, full height): header with All filter and mark-all icon; mention items (avatar, message with @handle, relative time in pink with dot)
- Mobile: left nav becomes bottom tabs; notifications panel becomes full-screen

### Design system
- Colors: `--page: #ffffff` (page), `--top-bar-tint: #f1f8f7` (top bar tint), `--text: #0c152d` (text), `--muted-text: #5e6275` (muted text), `--primary-purple: #5b4de6` (primary purple), `--env-green: #1b7a4d` (env green), `--time-pink: #d6246e` (time pink), `--doc-thumb: #0c152d` (doc thumb), `--on-dark: #ffffff` (on dark), `--border: #dee0e7` (border), `--focus-ring: #5b4de6` (focus ring).
- Fonts: Inter 700 24px welcome title for headings; Inter 400 16px / 1.5; list rows 15px for body. Similar to the observed neo-grotesk; model type words muted.
- Spacing, radius and shadows: Comfortable; 4px base, 16px card padding, 12px row gap, 24px between cards; radius 8px cards and thumbnails; panel shadow -4px 0 24px rgba(12,21,45,.08).
- Motion: 150-200 ms ease-out for hover, focus and overlay transitions; overlays fade and scale from 98% to 100%; everything collapses to an instant change under prefers-reduced-motion.
- Mood: Modern, structured, collaborative; navy text with a mint top bar and purple accents. Imagery: Dark navy documentation thumbnails with abstract UI sketches (generated, no logos); avatars in notifications.

### Components & interactions
Build these components: TopBar with EnvironmentChip and AIAssistButton; SideNav; WelcomeHeader; SchemaUpdatesCard; DocCard; NotificationsPanel; NotificationItem; FilterMenu (All, Mentions, Assigned).

- Bell toggles the panel (slides in 200ms) and marks visible items read after 2s
- Clicking a notification deep-links to the entry and field
- Search opens a command palette (Cmd/Ctrl+K)
- Environment chip opens a switcher; switching reloads data for that environment
- Schema rows link to the model editor

### Data & state
Model: `Project{id, name, avatar}`; `Environment{id, project_id, name (master|staging|...)}`; `SchemaChange{id, environment_id, model_name, kind (section|layout|component), change_count, changed_at}`; `Notification{id, user_id, actor_id, type (mention|assign|comment), entry_ref, body, read_at?, created_at}`.

Notifications page by 20 with cursor pagination; unread count comes from a view. Environment selection is a URL segment.

States to implement and demo:
- no notifications (friendly empty)
- unread vs read items
- loading skeletons for cards
- environment without schema (onboarding card)
- panel error with retry
- realtime new notification toast

### Accessibility
- Panel is a non-modal complementary region or a dialog with focus management - pick dialog on mobile
- Bell button name includes unread count
- Relative times have absolute dates in title
- Doc cards are links with the title as accessible name; thumbnails decorative
- Environment chip announces current environment
- Body text is 16px with line-height 1.5 (15px only inside dense tables), nothing renders below 12px, weights of 300 or lighter appear only at 24px and above, and uppercase is limited to short labels with at least 0.05em tracking.
Verified contrast: body text on white: #0c152d on #ffffff = 18.09:1; muted text on white: #5e6275 on #ffffff = 6.03:1; environment label on tint: #1b7a4d on #f1f8f7 = 4.95:1; time label on white: #d6246e on #ffffff = 4.84:1; thumbnail title on dark: #ffffff on #0c152d = 18.09:1; active nav text: #5b4de6 on #ffffff = 5.75:1; focus ring on tint: #5b4de6 on #f1f8f7 = 5.35:1.

### Security
- RLS: notifications readable only by recipient
- Mentions render user text escaped; no HTML in bodies
- Environment access limited by role (editors cannot see production secrets)
- Realtime channel filters by user id server-side

RLS: `notifications` - select/update(read_at) where `user_id = auth.uid()`; `schema_changes` - select for project members; `projects`/`environments` - members select.

### Performance & SEO
Load notifications panel lazily on first open; prefetch count. Thumbnails as small WebP. Noindex.

### Guardrails
- Show environment prominently so users know where they are
- Keep notifications scannable: who, what, where, when
- Link every item to its exact place
- Offer docs as a secondary, not primary, block
- Mark read automatically but allow mark-unread
- Use the product name Orlume and fresh, generic copy throughout; all people, companies, amounts and IDs are invented, and no third-party brand, logo or wordmark appears.
- Keep components small and typed (no `any`), and surface every failure visibly instead of swallowing it.

Acceptance criteria:
- [ ] Panel opens, filters and deep-links
- [ ] Realtime notification appears without reload
- [ ] Environment switch reloads data
- [ ] Mobile layout works
- [ ] Contrast pairs pass

Open the builderAll templatesThis palette on its own