Skip to main content
vibld

Template

Wren Adeyemi

A bright, magazine-style portfolio for a product designer. Bracketed monospace controls ([ General Info ], [ Dark Mode ]) and role/location labels sit at the top; a self-deprecating bio is right-aligned above a huge condensed serif name; a full-width hero render follows. Experience, personal projects, education, about and contact are laid out in asymmetric editorial rows.

Masthead-style product designer portfolio · Website · Portfolio · static site

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

Condensed display serif, sturdy text serif and typewriter mono are the magazine contents-page idea, and this trio is unique in the catalog.

  • Instrument SerifHeadings: uppercase name 48-160px at 0.05em
  • Source Serif 4Body: paragraphs 17-18px at 1.6
  • Space MonoFigures and code: 12px uppercase metadata

Who it is for

  • Freelance designers justifying premium pricing
  • Product designers with notable experience
  • Small teams building credibility without a designer
  • Creatives who like editorial, type-led layouts

Layout

  1. Top bar: [ General Info ] and [ Dark Mode ] bracketed mono buttons left; role @ company and city/country right
  2. Hero: right-aligned short bio paragraph, then giant condensed serif name spanning the right side; 'Selected works 2017-2024' label left
  3. Full-width hero image/render
  4. Experience: rows with company, years, role and one-line description (interactive cards)
  5. Personal Projects row: title + status, type, description in columns
  6. Education: label column left; degree/school and years
  7. About and Contact sections with live time
  8. Asymmetric case study pages

Palette

Editorial, witty, achromatic, precise, airy. It reads like the contents page of a design magazine.

  • background#ffffff
  • text#000000
  • label gray#595959
  • secondary surface#f5f5f5
  • border#e6e6e6
  • hero render (violet)#8a6fd1

Every checked pair, measured again

SampleWhereRatioNeeds
Aabody text on white21.00:14.5:1
Aalabel gray on white7.00:14.5:1
Aalabel gray on row hover surface6.42:14.5:1
Aainverted bracket button (white on black)21.00:14.5:1
focus outline on white21.00:13:1
Aadark mode body text17.58:14.5:1
Aadark mode labels7.80:14.5:1
Aadark mode labels on hover surface6.90: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
Instrument Serif 400, fluid 48-160px, uppercase name with 0.05em tracking
Body
Source Serif 4 at 17-18px (1.6 line-height) for paragraphs; Space Mono 12px uppercase with 1.2-1.8px tracking for nav and labels

A condensed editorial serif for display, a sturdy text serif for reading and a typewriter mono for metadata makes it feel like a magazine masthead.

Spacing and imagery

40px margins, 12-column grid with labels in the first 3 columns and content offset, generous 120px+ row spacing, hairline row dividers, no radius.

A single large abstract 3D render (glass cubes and spheres in violet) as the hero; case studies use asymmetric image offsets.

Components

  • Bracketed mono buttons
  • Dark mode toggle
  • Role and location labels
  • Right-aligned bio
  • Fluid giant serif name
  • Section labels in mono
  • Full-width hero render
  • Experience rows/cards
  • Personal projects row
  • Education rows
  • About section
  • Contact with live time
  • Asymmetric case study layout

Interactions

  • [ Dark Mode ] toggles achromatic dark theme
  • [ General Info ] opens an info panel/overlay
  • Experience cards expand or highlight on hover
  • Scroll-triggered fade/slide reveals
  • Name scales fluidly with viewport
  • Live time updates in contact

Data

  • Role{company, start, end, title, description}
  • Project{title, status, type, description, slug}
  • Education{degree, school, years}
  • Profile{name, role, company, city, bio, email, timezone}

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 a light, magazine-inspired portfolio for a fictional product designer, "Wren Adeyemi". It is for clients and hiring teams who value craft and personality. The page reads like a masthead: bracketed monospace controls, a witty third-person bio, a huge condensed serif name and one striking hero render. Career details follow in neatly aligned editorial rows, and case studies use asymmetric image layouts.

### Stack
React 18 + TypeScript + Vite, Tailwind CSS with class dark mode, shadcn/ui (Radix Sheet for the General Info panel) and lucide-react. Use Framer Motion for reveals, date-fns-tz for live time and React Router. Static only.

### Pages & layout
1. Top bar, 40px margins, 12px Space Mono uppercase with 0.15em tracking. Left: "[ General Info ]" and "[ Dark Mode ]" buttons. Right: "Role @ Company" and "City, Country".
2. Hero: a right-aligned bio of 3-4 short lines, max 440px wide. Under it, the name in uppercase serif at clamp(48px, 12vw, 160px) with 0.05em tracking, aligned right. At the far left, on the baseline row, a mono label "Selected works 20XX-20XX".
3. A full-width 16:9 hero render.
4. Experience: rows on a 12-column grid. Columns 1-3 hold the mono label (first row only). Columns 4-12 hold the company (serif 24px), years (mono, muted), title and a one-line description, with hairline dividers. Rows expand on click to show 2-3 highlights.
5. Personal Projects: title with status below, type and description across columns.
6. Education: the same grid as Experience.
7. About (2 paragraphs) and Contact (email, socials, live time).
8. Case study: images offset left and right in alternation, with captions in mono.

### Design system
- Light: `--background: #fff`, `--foreground: #000`, `--muted-foreground: #595959`, `--secondary: #f5f5f5`, `--border: #e6e6e6`.
- Dark: #0b0b0b background, #f2f2f2 text, #a3a3a3 labels. Achromatic only; the hero image supplies color.
- Fonts: Instrument Serif 400 (and italic) for display and names only, Source Serif 4 400 for paragraphs, plus Space Mono 400, all from Google Fonts, with Georgia and monospace fallbacks. Scale: 12 / 14 / 16 / 20 / 24 / 48 / 160px.
- Spacing: 8px base, 40px margins, 120px between sections. Radius 0.
- Motion: 600ms ease-out reveals and 250ms row expansion.

### Components & interactions
- BracketButton: text wrapped in brackets. Hover inverts (black fill, white text). Focus gets an outline. `aria-pressed` on the dark-mode button.
- InfoSheet: slides from the left with contact, availability and links. Esc closes it.
- ExperienceRow: collapsed or expanded (an accordion with `aria-expanded`). Hover shifts the background to `--secondary`.
- LiveTime: minute ticks and a fallback.
- Empty sections hide.

### Data & state
`Role{company, start, end, title, description, highlights}`, `Project{title, status, type, description, slug}`, `Education` and `Profile`. The theme is stored in localStorage. Seed four invented companies, one ongoing personal project and two fictional schools.

### Accessibility
- The label gray #595959 on white is 7:1 (6.42:1 on the hover surface). Dark mode labels use #a3a3a3 (7.8:1).
- Bracket characters should be hidden from screen readers (`aria-hidden` spans) so buttons read cleanly.
- The accordion uses proper button semantics. Keep one H1 (the name).
- The hero render needs alt text or `alt=""` if decorative. Honor reduced motion.
- Verified contrast: body #000000 on #ffffff = 21.0:1; labels #595959 on #ffffff = 7.0:1; dark body #f2f2f2 on #0b0b0b = 17.58:1; dark labels #a3a3a3 on #0b0b0b = 7.8:1.

### Security
- No forms. `mailto:` only.
- External links use `rel="noopener noreferrer"`. No secrets.

### Performance & SEO
Serve the hero render as AVIF with `srcset` and `fetchpriority="high"`. Preload Instrument Serif and subset Space Mono. Add Person JSON-LD and per-case OG images.

### Guardrails
- Do write all copy yourself and use placeholder imagery (Unsplash-style stock or generated); no trademarked names, client logos or real people.
- Don't present invented testimonials or awards as real; label sample content as sample.
- Keep components small and fully typed; no `any`. Surface errors visibly instead of failing silently.
- Don't collect or store more personal data than the contact form needs.
- Done when:
  - [ ] Top bar buttons toggle dark mode and open the info sheet
  - [ ] Name scales fluidly from 48px to 160px without overflow
  - [ ] Experience rows expand/collapse accessibly
  - [ ] Both themes pass AA contrast
  - [ ] Case study images alternate asymmetric offsets

Open the builderAll templatesThis palette on its own