One system, every frame.
Colours, fonts, grid, logo, components and tone of voice for fabiostaiano.it, the Lab (my experiments), the newsletter and social media. This is my brand library: the values are written in the tables. At the bottom there’s a blank kit to download and build your own.
Rules
Eight rules that never break.
- Dark onlySite, social and promo: one dark theme, no switcher. The system’s high contrast and forced colours are respected.
- One accentBlue or yellow, never both up front.
- Colour in the visualsNever in small text. Text and graphics never share a colour.
- Biggest gets the most contrastWhite headline, grey secondary text, smaller mono labels.
- The avatar signs, the photo introducesThe face of the brand is the avatar logo. A real photo appears only in the About section.
- Accessible by rule4.5:1 contrast, 44 px targets, reduced motion respected.
- Centred on the glyphsText in a tile is centred on the letterforms.
- Light and vector firstSVG for logo, icons and graphics. Raster only for photos and covers, WOFF2 fonts, no third-party scripts.
Colour
Cool neutrals, one blue, colour only for visuals.
logo · newsletter · toast shadowDark theme · the only one
#0F1015page background#1B1D25surfaces#2C2F39borders#A0A4B0secondary text#ECEDF2text and headings#8F8FFFlinks and focusVisuals only · never for small text
#FFC53Dtrophies, keyword#8F8FFFchips, illustrations#FF7A66chips, illustrations#2DD4A7chips, illustrations#FF6EB4glows, illustrationsMeasured contrast
| Pair | Contrast | Use |
|---|---|---|
| ink on paper | 16.25:1 | main text |
| ink on wash | 14.38:1 | text in cards and panels |
| muted on paper | 7.63:1 | secondary text and labels |
| muted on wash | 6.75:1 | labels in cards |
| link on paper | 6.82:1 | links and focus outline |
| white on blue | 7.97:1 | newsletter and logo tile |
| line2 on paper | 2.29:1 | only in drawings, never for a border you need to understand the page |
Thresholds: 4.5:1 for text, 3:1 for large headings and for borders you need to understand the page. Calculated with the WCAG 2.1 formula on the values of the theme.
Typography
Wide to shout, narrow to explain.
Scale
| Role | Token | Font and weight | Size | Line height | Use |
|---|---|---|---|---|---|
| Page title | fluid | Anybody 800 · 900 on the home | fluid, clamp in DESIGN.md | 0.86–0.95 | one per page, at the top |
| Section title | fluid | Anybody 800 | fluid, clamp in DESIGN.md | 0.98 | opens each section |
| Card title | --fs-card | Anybody 700 · wdth 96 | 26 px | 1.1 | cards, roles, groups |
| Small heading | --fs-title-s | Anybody 700 | 20 px | 1.2 | rules, entries, dialog titles |
| Lead | fluid | Instrument Sans 400 | 16–22 px | 1.5 | under a heading, within 42 characters |
| Body | --fs-text | Instrument Sans 400 · 600 | 18 px | 1.6 | running text, within 64 characters |
| Interface | --fs-ui | Instrument Sans 400 · 600 | 16 px | 1.5 | buttons, fields, menus, cards |
| Note | --fs-note | Instrument Sans 400 | 14 px | 1.5 | captions, notes, footer |
| Label | --fs-label | Martian Mono 500 · uppercase | 12 px | 1.5 | above headings, in tags, code |
| Sizes in drawings | Martian Mono 500 | 10 px | 1 | only inside illustrations |
All other text uses the six fixed sizes, with their token. Declared exceptions: the name in the bar (18 px, part of the logo), measures inside drawings (10 px), samples inside pages, the book block (with its own sizes) and the hidden games. No interface text below 12 px.
Grid and spacing
One grid, multiples of 4.
Grid
- One container, one edge.1120 px at most, with 16-56 px on each side. The bar runs edge to edge, content and footer start from the same margin.
- Three breakpoints.560, 760 and 1100 px. A different value belongs to one component only and lives next to it.
- Space is counted.14-20 px between the cards of a grid. A section gets at least 48 px above and below.
Spacing · multiples of 4
--s-14--s-28--s-312--s-416between the cards of a grid--s-524--s-632--s-748above and below a section--s-864--s-996--s-10128Shape and depth
Sharp corners, one shadow.
Radii
--r-ui0Buttons, fields, toasts and dialogs. The interface is square.--r-pill999 pxTags and chips, the mono pill.--r-tile20%Icon tiles: logo and trophies.--r-window18 pxWindows and mockups, only in social graphics.Shadows · just one, hard and blue
--shadow-hard6 px · blueToasts, the bar menu and cards on hover. Always in the brand blue, never the link blue.--shadow-dialog10 px · blueDialogs. The same shadow, further away.--shadow-softSoft · 50% blackOnly in social graphics and on the logo tiles.Layers
z-index: 50BarAt the top, above the page.z-index: 60Skip linkAbove the bar, when it takes focus.z-index: 80ToastAbove everything else on the page.showModal()DialogIn the browser's top layer, with no z-index.Motion
One gesture, one scene.
- Quick at the start, soft at the end.One curve for everything: it starts fast and settles gently, like a hand putting down a card.
- Three timings.0.2 s for borders and colours, 0.35 s for fades, 0.5 s for drawings. With reduced motion they stop.
- Only the drawing moves.On hover, on focus and, on touch, at mid-screen. The other cards fade to 0.4.
Logo
The curly-haired face.
--ink. In the top bar at 26×28 px.Rules
Download the logo
The logo is my brand: use it to talk about me or the site, not for a project of yours.
Components
Square in the interface, round in the visuals.
Button states
Button: anatomy and variants
<button class="btn" type="button">Read the story</button>
<a class="btn ghost" href="#work">Skip the story</a>
Field: states
Write a full email address, like name@studio.com.
Error3 px outline and a sentence below saying what to do. No red.One moment…
WaitingThe button is disabled until the answer comes back.You’re in.
DoneThe field gives way to the confirmation and the next step.At least 44 px tall, like the button next to it; on phones both go full width. The label is tied to the field with for and id. An error sets aria-invalid="true" on the field and puts the sentence in a paragraph with role="status", so screen readers read it.
<form class="ff-form" novalidate>
<label for="email">Your email</label>
<input id="email" name="email" type="email" autocomplete="email" required aria-describedby="note">
<button type="submit">Subscribe</button>
<p id="note" role="status"></p>
</form>
Links
The kit is on the design system page.
In body text--link colour, underlined.ToolsDesign system
In the menu and footer--ink, weight 600; on hover --link, underlined 4 px below. 44 px tall hit area./Tools/Mockup 3D
BreadcrumbsMono 12 px uppercase in --muted; the last item is the page and is not a link.Focus: 2 px --link outline, 2 px away, like every other element.
When to use what
Icons
The SVG always has aria-hidden="true". No external set: a few icons drawn here.
<button type="button" aria-label="Close">×</button>
<svg viewBox="0 0 24 24" width="24" height="24" fill="none"
stroke="currentColor" stroke-width="1.5" aria-hidden="true">…</svg>
Bar and footer
import componenti as C
C.bar('en', crumbs=[('Tools', '/tools/'), ('Mockup 3D', None)])
C.footer('en')
Theme
Tools
Illustrations
One idea, one blue lead.
Yes and no
- Tools of the craft, not icons.A selection with handles says design. A light bulb says anything at all.
- People: the logo or a cursor.The avatar logo on a blue tile and grey cursors. Never colourful stick figures.
- One lead, in flat colour.One blue, the rest grey. No rainbows, gradients or soft shadows.
The eight rules
- 01Always on the stage.The drawing sits in a dark box with a dot grid every 12 px. A mono number in the top left corner when drawings come in a series.
- 02One idea, a few big objects.The drawing tells one thing with a few objects that fill the box. No scenes, no decoration around them.
- 03One blue lead, the rest grey.Blue goes to one object only, the one making the gesture. Everything else stays in the dark theme greys. A visual colour can replace the blue, never sit next to it.
- 04Tools of the craft, not icons.Draw with what a designer sees: real glyphs, dashed selections with handles, guides, Bézier curves, cursors, tiles, measurements. No stock icons such as light bulbs, gears, rockets or speech bubbles.
- 05People are the logo or a cursor.Fabio is the white avatar logo on a blue tile, or a cursor with his name. Everyone else is a grey cursor. Never stick figures or generic people.
- 06Solid shapes, sharp corners.Rectangles and circles in flat colour, no gradients, no shadows. Strokes only for guides, dashes and curves. Rounded corners only on tiles and chips.
- 07Inside, only measurements and names.Grey uppercase mono labels, like 44 PX, ×10 or 07 / 40, or one big glyph in Anybody. Never sentences: the drawing works in any language.
- 08The gesture tells the idea.On hover the lead makes the gesture of the idea, it grows, settles, nods or presses, and the rest fades or moves aside. One looping motion at most.
Tone of voice
Short, concrete, first person.
- 01I talk, to you.First person singular, and the reader is “you”. No corporate “we”, no “the user”.
“Scroll and I’ll tell you how I got here.”
- 02Short sentences, one idea each.Headlines are a few words long and end with a full stop.
“Tables.” “The method, live.”
- 03Two beats.The first sentence opens, the second one turns.
“Tools change. The craft doesn’t.”
- 04Real things, not adjectives.Names, numbers, objects: spacer.gif, ten buttons, thirty times a second. If a sentence stands without an adjective, the adjective goes.
“AI generates ten buttons in a few seconds. How many actually hold up?”
- 05Someone who tries, not someone who preaches.I tell what I tried and what held up, even when it didn’t work. AI generates, the designer decides. No promises, no stock enthusiasm.
“AI generates and you decide.”
- 06One joke, then back to business.Self-irony about the craft and the past, never about the reader. One per block at most.
“The client always wants a bigger logo.”
- 07Clear even when it’s boring.Privacy, confirmations and errors say what happens and what the reader does, without legalese.
“Until you confirm, you get nothing.”
- 08The button says what happens.One verb, two words at most, addressed to the reader. Never “Click here” or “Submit”.
Subscribe · Email me · Notify me · Download PNG
Words and punctuation
- Italian first. English stays where it is the name of the thing: Lab, Tools, mockup, workshop.
- Craft before tools: Figma and AI are tools, not an identity.
- Full stops and colons. No exclamation marks, except in period parodies. No dashes: split the sentence.
- Digits for sizes and data (4:5, 44 px), words in the story (ten years, three editions).
learnfigmanow.com
#192E5Fbackground#282179background#DB3716buttons#2E2E2Etext#F5F5F5backgroundSyne 800 and Open Sans, the characters from the cover. An identity of its own that never mixes with the site’s.
Download the blank kit
Building this system took me a lot of work. The kit is the part that works for anyone, without my brand: the base rules already written, room for your choices and neutral tokens that work straight away. It's free, so you start from here, not from zero.
What it's for
What's inside
Licence CC BY 4.0: use it and change it as you like, at work and for clients too, crediting fabiostaiano.it. It covers the kit: the logo, the illustrations and the rest of my brand stay mine. The fonts I use are free on Google Fonts under the OFL licence, here is the text for each: Anybody · Instrument Sans · Martian Mono.
← fabiostaiano.it · Version of 20 October 2026
Social graphics
4:5, visual on top, text on the left.
I rebuilt my website.
It only took me ten years.
Cover: a single keyword in yellow.
Not your usual portfolio.
It’s my story to scroll through, with hidden trophies.
Inside slides: white headline on 2 lines, grey below.