Porto Design System
Porto is a dark, poster-style agency template that sells "multiple layouts". It feels like a studio's launch screen: an almost-black page, one enormous uppercase word, small uppercase corner labels and a thin fixed rail down the left edge. Colour appears only as small red marks: a starburst above the wordmark, a 1px red line that grows down the rail as you scroll, and red buttons and hovers on the inner pages. The demo index below the hero is a calm grid of flat #181818 cards with handwritten captions.
Four signatures make it recognisable:
- The left rail. A fixed 90px column, full height, with a 1px line border on its right and a hamburger made of three vertical white strokes in the middle. A 1px primary red line runs down the rail's right edge and grows with page scroll.
- The four-corner frame. A fixed top bar and a hero bottom bar put uppercase 15px labels in the corners: DIGITAL EXPERIENCE / DESIGN AGENCY top left, the PORTO logo top centre, INFO@PORTO.COM top right, MULTIPLE — LAYOUT and WEBFLOW TEMPLATE at the bottom, with a mouse-scroll icon between them.
- The giant wordmark with a red star. PORTO in Satoshi 700 at 300px, uppercase, under a 40px red starburst. A 20px uppercase subtitle at 50% white sits below it.
- Script captions on flat cards. Demo cards are flat surface-1 tiles with a screenshot and a centred caption (Home 1, Work 2) in Story Script, a slanted handwritten face. The whole card turns red (accent #FF384A) on hover.
Porto is a dark-only design.
Colors
Surfaces
#111111Page background, the left rail, the overlay menu
#181818Demo cards (pres-content)
#222222Form fields, the round go-top button, close buttons, the primary button's hover
#222222Form fields, the round go-top button, close buttons, the primary button's hover
Ink
#FFFFFFText on primary
#111111Text on secondary
#FFFFFFText on accent
#FFFFFFWordmark, section titles, footer titles, menu links
#FFFFFF · 80%Corner labels in the top bar and hero bottom bar
#FFFFFF · 70%Card captions, field labels, social links (opacity 0.7), menu-link hover
#FFFFFF · 60%Paragraphs (base p) and placeholders; footer links use #FFFFFF91 (57%), the same step
#FFFFFF · 50%The hero subtitle A COMPLETE MULTIPLE — LAYOUT…
#FFFFFFAction
#F64D52Filled buttons, the scroll-progress line, field focus underline (the starburst is a red PNG of the same hue)
#222222Filled buttons go dark grey on hover
#FFFFFFThe white button variant
#FF384ACard hover fill, go-top hover, the 1px red underline under button-line
Lines & effects
#FFFFFF · 20%Rail border, menu divider, underline fields, mobile top-bar border
#FFFFFF · 40%Blog dividers on inner pages
Typography
Satoshi · display-hero
The quick brown fox jumpsPORTO hero wordmark (title-1 vw x2). 300px · 700 · 1.1
Satoshi · headline-menu
The quick brown fox jumpsOverlay menu links (Home, About, Work, News, Contact). 80px · 700 · 1
Satoshi · title-md
The quick brown fox jumpsh3 on inner pages. 24px · 500 · 1.25
Satoshi · eyebrow
The quick brown fox jumpsHero subtitle, menu divider. 20px · 500 · 1.1
Satoshi · body-lg
The quick brown fox jumpsParagraphs, in ink-muted. 19px · 500 · 1.37
Satoshi · label
The quick brown fox jumpsCorner labels, the email link. 15px · 500 · 1.3
Spacing & shape
| Purpose | Value |
|---|---|
| Container | max 1200px, centred (3% side margins from 991px down) |
| Section rhythm | 120px top and bottom on desktop, 100px at ≤767px, 60px at ≤479px |
| Breakpoints | 991px, 767px and 479px |
Spacing scale
| Token | Value | Preview |
|---|---|---|
hair | 3px | |
xs | 10px | |
sm | 20px | |
md | 30px | |
lg | 40px | |
xl | 60px | |
2xl | 100px |
Layout spacing
| Token | Value | Preview |
|---|---|---|
card-gap | 10px | |
footer-gap | 40px | |
rail | 90px | |
section | 120px |
Border radius
Surfaces
How the surfaces stack, from the page background up. Hex codes and roles are in Colors above.
Motion
| Scroll reveal (hero lines, section titles, labels) | Start at opacity 0 (set inline), fade to 1 over 1000ms outQuart, moving to x 0, y 0 in the same 1000ms |
| Scroll progress line | The rail's 1px red page-loader grows in height with page scroll |
| Menu open | Panel moves in on x and fades (opacity 300ms ease); links settle from x 5–10% to 0% |
| Menu link underline | Size change 400ms outCubic |
| Button hover | transition: all .3s |
| Footer and social link hover | transition: all .2s |
| Newsletter arrow | Background position 50% → 90%, 300ms |
Do’s and don’ts
- Keep the fixed 90px left rail with its three-stroke hamburger and the red 1px progress line.
- Frame every hero with uppercase label text in the four corners and one huge uppercase Satoshi 700 word in the middle.
- Use #111111 for the page, #181818 for cards and #222222 for fields, with white text at 80 / 70 / 60 / 50%.
- Use primary #F64D52 for at most one filled button per view, and pair a single red starburst or dot with the headline.
- Keep cards and images square; use only 3px (buttons), 4px (fields) and full circles.
- Set card captions in Story Script and everything else in Satoshi 500 or 700.
- Add shadows, gradients, glass blur or rounded cards.
- Use red for large backgrounds outside hover states.
- Put the white-on-red button text below 17px bold: white on #F64D52 is only about 3.4:1, so keep label-button size and weight.
- Use the pastel variables (#FFC569, #548BF4, #FFAAC3) for UI text or buttons; they belong to illustration tiles.
- Use Story Script for headings, body or buttons.
- Track out text other than label-caps; Satoshi runs at 0 letter spacing.
Example prompt
Any page in the Porto style
More design systems like this
Agency design systems, the same colors first.
Bring any of them to your AI tool
All Access unlocks all 398 design systems, ready for Claude, ChatGPT, Gemini, Cursor, v0 and Lovable, plus 400+ templates on all 5 platforms.
Get All AccessUpgrade to All AccessHow to use the Porto design system
Pick a file to see what it’s for and where it goes.
What it is
The whole design system in one markdown file, written for AI: every color, type style, spacing value, component and motion rule, plus do's, don'ts and a ready prompt.
Best for
Claude, ChatGPT, Gemini, Cursor and v0, or any other AI tool that builds pages or code.
How to use it
- Put
DESIGN.mdin your project and mention it in your request, or save it as.cursor/rules/porto.mdc - For the rule file, start it with a front-matter block that sets
alwaysApply: true, so every chat uses it - Ask: “Build a pricing page using DESIGN.md.” Cursor follows the colors, fonts, spacing and rules
- Put
DESIGN.mdin the project root - Add one line to
CLAUDE.md: “Follow DESIGN.md for all UI.” - Ask for any page or component; Claude reads the file first
- Attach
DESIGN.mdto the chat (or paste it in) - Ask: “Build a landing page in this design system.”
- Keep the file in the chat or project knowledge, so follow-up pages stay on style
What it is
Every token as data, in the W3C Design Tokens format: colors with their roles, type styles, radius, spacing, and component tokens that point at them.
Best for
Figma (Tokens Studio), Style Dictionary and other design-token tools, and build scripts.
How to use it
- In Figma, open Tokens Studio, choose Import, and pick
tokens.json - Or point Style Dictionary’s
sourceat it to generate tokens for any platform - In code, import it like any JSON file
What it is
A Tailwind CSS v4 theme: every color, font, type style, radius and spacing value becomes a Tailwind utility, like bg-canvas, text-headline-lg or rounded-md.
Best for
Tailwind v4 projects, and AI builders that write Tailwind (v0, Lovable, Bolt).
How to use it
- Save
theme.cssnext to your main CSS file - Import it after Tailwind:
@import "tailwindcss"; @import "./theme.css"; - Use the classes:
bg-canvas text-ink rounded-md p-lg
What it is
The same tokens as plain CSS variables on :root. Component values point at the color variables, so changing one color updates everything that uses it.
Best for
Any website: plain CSS, Webflow custom code, Framer, WordPress.
How to use it
- Add it to your stylesheet, or in Webflow paste it into Site settings → Custom code inside a
<style>tag - Use the variables anywhere:
color: var(--color-ink) - Change a token once and every place that uses it follows






