Skip to main content
vibld

Template

Plumtide

The inbox of a personal and team task manager, the landing spot for new tasks before they are scheduled or filed into lists. First-time users see a short tip and three starter tasks. A large calming image panel on the right makes the space feel personal.

Personal task inbox with scenic side panel · App screen: inbox · Small tools and apps · front-end app (local state)

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.

  • Plus Jakarta SansHeadings: Plus Jakarta Sans 700, 36px/1.15, -0.02em
  • Plus Jakarta SansBody: Plus Jakarta Sans 400 16px/1.5

Patterns

  • floating rounded content card on tinted canvas
  • large page title
  • dismissible tip banner
  • inline 'new task' row with shortcut hint
  • task rows with list breadcrumb subtitle
  • emoji-labelled nested lists in sidebar
  • full-height scenic image panel
  • active nav edge marker

States it is designed for

  • first run (tip + three starter tasks)
  • empty inbox (friendly 'Inbox zero' message on the card)
  • adding task (inline input)
  • completed with undo
  • task with due date and assignee chips
  • filter applied (chip under title)
  • offline (local-first; sync badge shows pending changes)
  • image failed to load (panel shows soft gradient)

Who it is for

  • individuals organising work and life
  • small teams
  • students

Layout

  1. left sidebar (~160px) on tinted canvas: Inbox (active with coloured right-edge bar), Today, Tasks, Messages; 'Recent'; 'Lists' with emoji-labelled items and collapsible Work/Personal groups with nested lists; bottom avatar
  2. centre card (rounded, ~430px min): filter icon top-right, 36px 'Inbox' title, tip banner (icon, text, open and close buttons), 'New task' row with shortcut chip, task rows (checkbox, title, list subtitle, avatar, details icon)
  3. right panel: rounded full-height scenic image
  4. at <1100px the image panel hides; at <768px sidebar becomes a drawer and the card goes full width

Palette

Serene and personal; a quiet canvas beside a dreamy landscape.

  • canvas#f5f5f8
  • card surface#fbfbfd
  • primary text#1d1b22
  • secondary text#625f6d
  • active marker#d8343b
  • tip banner fill#efedfa
  • tip text#5040b8
  • checkbox border#858291
  • new-task row fill#f0eff4
  • avatar#0a84d6

Every checked pair, measured again

SampleWhereRatioNeeds
Aabody text on card16.49:14.5:1
Aamuted subtitle6.02:14.5:1
Aasidebar text on canvas15.66:14.5:1
Aatip text on tip fill6.57:14.5:1
checkbox border3.63:13:1
active marker4.31:13:1
Aaplaceholder in new-task row5.44:14.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
Plus Jakarta Sans 700, 36px/1.15, -0.02em
Body
Plus Jakarta Sans 400 16px/1.5

Sidebar 15px 500; task subtitles 13px muted with a small list icon; shortcut chip 12px mono-style in a pill.

Spacing and imagery

Relaxed: card 32px padding, 16px radius, no border, 0 1px 3px shadow; tip banner 12px radius; task rows 44px with 12px gap; image panel 16px radius with 8px outer gutter.

One large, softly lit landscape photo (dunes, water, moon-like light) in its own panel, decorative only; emoji as list icons; round initial avatars.

Components

  • Sidebar (NavItem with EdgeMarker, CollapsibleListGroup, EmojiListItem)
  • InboxCard
  • TipBanner (open, dismiss)
  • NewTaskRow with ShortcutChip
  • TaskRow (Checkbox, title, ListBreadcrumb, Avatar, DetailsButton)
  • FilterMenu
  • ScenicPanel
  • TaskDetailDrawer

Interactions

  • Ctrl+N or clicking 'New task' turns the row into an input; Enter adds and keeps focus for the next
  • checking a task strikes it through and slides it out after 1s (undo toast)
  • drag tasks onto a sidebar list to file them (dnd-kit)
  • tip banner dismiss persists; open arrow goes to a short guide
  • details icon opens a right drawer over the image panel
  • sidebar groups collapse with chevrons

Data

  • Task{id, title, notes, list_id|null, done bool, done_at, due_on, assignee, position, created_at, updated_at}
  • List{id, name, emoji, group (work|personal), position}
  • UiPrefs{tip_dismissed bool, collapsed_groups string[]}

Guardrails

Experience

  • New tasks land in Inbox by default; filing into lists is optional.
  • Keep the add-task input always one keystroke away and show the shortcut.
  • Provide undo for completion instead of a confirmation dialog.
  • Show each task's list as a subtle subtitle so context is never lost.
  • The image panel is decoration only; hide it before it squeezes the card.

Accessibility

  • Task list is a list of items with native checkboxes labelled by the task title.
  • Active nav uses aria-current and the edge marker plus bolder text.
  • Tip banner is a region with a heading; dismiss has a label.
  • Image panel has empty alt and is aria-hidden.
  • Drag-to-list has a keyboard alternative ('Move to…' menu).

Security

  • Validate imported/exported JSON with zod before loading.
  • Escape task titles and notes when rendering; render notes markdown with a safe renderer.
  • Wrap storage access in try/catch and never store secrets locally.

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 **Plumtide**, a local-first personal task manager focused on its Inbox. New tasks land here; users check them off, file them into emoji-labelled lists and open details. A scenic image panel on wide screens gives the app a calm, personal feel.

### Stack
React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Checkbox, Sheet, DropdownMenu, Collapsible, Toast), lucide-react, dnd-kit, Motion, date-fns, zod. State in a reducer persisted to IndexedDB (with an in-memory fallback). No backend.

### Pages & layout
1. **Shell**: sidebar, centre card, image panel.
2. **/inbox** (this screen), **/today**, **/lists/:id** sharing the same card layout.
3. **Task detail drawer**.
4. Responsive per the layout breakpoints.

### Design system
- Colors: `--bg: #f5f5f8` (canvas), `--card: #fbfbfd` (card surface), `--fg: #1d1b22` (primary text), `--muted: #625f6d` (secondary text), `--marker: #d8343b` (active marker), `--tip-bg: #efedfa` (tip banner fill), `--tip-fg: #5040b8` (tip text), `--check: #858291` (checkbox border), `--row: #f0eff4` (new-task row fill), `--avatar: #0a84d6` (avatar).
- Fonts: Plus Jakarta Sans 700, 36px/1.15, -0.02em for headings; Plus Jakarta Sans 400 16px/1.5 for body. Sidebar 15px 500; task subtitles 13px muted with a small list icon; shortcut chip 12px mono-style in a pill.
- Spacing: Relaxed: card 32px padding, 16px radius, no border, 0 1px 3px shadow; tip banner 12px radius; task rows 44px with 12px gap; image panel 16px radius with 8px outer gutter.
- Radius: 16px card and image panel, 12px tip banner, 6px checkboxes, full pills for chips.
- Shadows: card 0 1px 3px rgba(29,27,34,0.06) only.
- Motion: completion slide-out 200ms after 1s; drawer 200ms; reduced motion removes slides.

### Components & interactions
Sidebar, NavItem, EdgeMarker, CollapsibleListGroup, EmojiListItem, InboxCard, TipBanner, NewTaskRow, ShortcutChip, TaskRow, FilterMenu, ScenicPanel, TaskDetailDrawer, UndoToast.

Interactions: Ctrl+N or clicking 'New task' turns the row into an input; Enter adds and keeps focus for the next; checking a task strikes it through and slides it out after 1s (undo toast); drag tasks onto a sidebar list to file them (dnd-kit); tip banner dismiss persists; open arrow goes to a short guide; details icon opens a right drawer over the image panel; sidebar groups collapse with chevrons.

States to build: first run (tip + three starter tasks); empty inbox (friendly 'Inbox zero' message on the card); adding task (inline input); completed with undo; task with due date and assignee chips; filter applied (chip under title); offline (local-first; sync badge shows pending changes); image failed to load (panel shows soft gradient).

### Data & state
Seed three starter tasks in a 'Getting started' list (connect a calendar, try the phone app, send feedback) plus sample lists (This week, Meeting notes, Groceries, Reading list, Habits). Positions use fractional indexing for drag reorder. Export/import JSON from settings.

Model: `Task{id, title, notes, list_id|null, done bool, done_at, due_on, assignee, position, created_at, updated_at}`; `List{id, name, emoji, group (work|personal), position}`; `UiPrefs{tip_dismissed bool, collapsed_groups string[]}`.

### Accessibility
Task list is a list of items with native checkboxes labelled by the task title. Active nav uses aria-current and the edge marker plus bolder text. Tip banner is a region with a heading; dismiss has a label. Image panel has empty alt and is aria-hidden. Drag-to-list has a keyboard alternative ('Move to…' menu).
Verified contrast: body text on card: #1d1b22 on #fbfbfd = 16.49:1; muted subtitle: #625f6d on #fbfbfd = 6.02:1; sidebar text on canvas: #1d1b22 on #f5f5f8 = 15.66:1; tip text on tip fill: #5040b8 on #efedfa = 6.57:1; checkbox border: #858291 on #fbfbfd = 3.63:1; active marker: #d8343b on #f5f5f8 = 4.31:1; placeholder in new-task row: #625f6d on #f0eff4 = 5.44:1.

### Security
Validate imported/exported JSON with zod before loading. Escape task titles and notes when rendering; render notes markdown with a safe renderer. Wrap storage access in try/catch and never store secrets locally. No server; all data stays on the device. Validate any imported file and cap its size (2 MB).

### Performance & SEO
Bundle under 150 kB gzipped; serve the scenic image as responsive AVIF/WebP with width descriptors and lazy decoding; skip loading it below 1100px. Set title and meta description on the public landing route; app routes noindex.

### Guardrails
- New tasks land in Inbox by default; filing into lists is optional.
- Keep the add-task input always one keystroke away and show the shortcut.
- Provide undo for completion instead of a confirmation dialog.
- Show each task's list as a subtle subtitle so context is never lost.
- The image panel is decoration only; hide it before it squeezes the card.
- Write all copy fresh; use invented people, companies and numbers only. No real brands, logos, wordmarks or third-party product names anywhere in the UI or seed data.
- Do not trace or copy any existing product's layout assets, icons or illustrations; draw generic ones.
- Acceptance criteria:
  - [ ] Tasks can be added with the keyboard shortcut and Enter
  - [ ] Completing a task offers undo
  - [ ] Dragging or 'Move to…' files a task into a list
  - [ ] Data survives reload and works offline
  - [ ] Image panel hides at narrow widths without layout jumps

Open the builderAll templatesThis palette on its own