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
- 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
- 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)
- right panel: rounded full-height scenic image
- 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
| Sample | Where | Ratio | Needs |
|---|---|---|---|
| Aa | body text on card | 16.49:1 | 4.5:1 |
| Aa | muted subtitle | 6.02:1 | 4.5:1 |
| Aa | sidebar text on canvas | 15.66:1 | 4.5:1 |
| Aa | tip text on tip fill | 6.57:1 | 4.5:1 |
| checkbox border | 3.63:1 | 3:1 | |
| active marker | 4.31:1 | 3:1 | |
| Aa | placeholder in new-task row | 5.44: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
- 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