Design System.

Every element of the site on one page. Each one shows what it looks like, which properties you can change, the exact token that controls it, and the HTML to copy.

Edit values in styles.csspart 1 · Tokens for colors, type and spacing (they cascade everywhere); part 2 · Components to reshape one element. Reload to preview.

token / class name — edit in CSS
current value
HTML to copy

01 · Colors

edit in :root → COLOR
Ink — text
--ink
#111111
Primary text
--ink-soft
#4a4a4a
Secondary text, body
--ink-faint
#8a8a8a
Labels, captions
--line-strong
#101010
Strong dividers
Surfaces
--bg
#fdfdfd
Page background
--bg-warm
#f6f6f4
Warm surface
--card-bg
#ffffff
Card surface
--works-bg
#dde9fc
Work band
Accent & lines
--accent
#2b4ee6
Primary accent
--accent-ink
#16308f
Accent on hover/active
--ok
#18b45a
"Available" status dot
--line
#e4e4e4
Hairline dividers

All colors are defined once in :root. Change a hex value and every element using that token updates. To re-theme the whole site, the two that matter most are --accent (every blue) and --ink / --bg (the base contrast).

02 · Typography

edit in :root → TYPE
Inter Tight — Display  ·  --font-display
--text-hero
Tight 500 · clamp(58→168px)
ls −0.045em · lh 0.92
Giorgio.
--text-title
Tight 500 · clamp(34→56px)
ls −0.03em · lh 1.02
Three case studies.
--text-lead
Tight 500 · clamp(26→40px)
ls −0.03em · lh 1.12
Nine years across startups, corporations and consulting.
--text-card
Tight 600 · clamp(24→30px)
ls −0.025em · lh 1.1
Energy Manager
Inter — Body  ·  --font-body
--text-body
Inter 300 · clamp(19→22px)
lh 1.5
I started as an industrial product designer, which gave me a strong foundation for understanding how digital products interface with physical technologies.
Nav links
Inter 400 · 17px
WorkAboutContact
Mono — Labels & tags  ·  --font-mono
Eyebrow
Mono 400 · 13px
ls 0.14em · uppercase
02 Projects
Card CTA
Mono 500 · 15px
ls 0.04em · uppercase
VIEW CASE STUDY →
.ds-tag
Mono 400 · 11.5px · ls 0.04em
Product DesignCompunet

Three families: --font-display (Inter Tight) for headings, --font-body (Inter) for prose, --font-mono for labels. Sizes are fluid clamp(min, vw, max) — the middle number scales with viewport width; raise the max to make a size bigger on large screens. Swap a family by changing one variable; every element follows.

03 · Spacing & tokens

edit in :root → LAYOUT / RADIUS / MOTION
Layout
--maxw
1140px
Maximum page width
--measure
880px
Readable text column
--nav-h
78px
Fixed nav height
--gutter
clamp(20px, 5vw, 56px)
Horizontal page padding
--base
22.5px
Base font size
Spacing scale — key values used across the site
12px — small gap (nav)
16px — minimum card gap
24px — card padding
48px — minimum contact padding
56px — maximum gutter
92px — maximum hero padding
128px — maximum section gap
Border radius
--radius-xs
6px
--radius-sm
10px
--radius-md
14px
--radius
16px
--radius-pill
999px
Motion
--ease
cubic-bezier(.22,1,.36,1)
Curve for every transition
--dur-fast
0.28s
Hover, link, nav
--dur-slow
0.4s
Card lift, reveal

05 · Buttons & links

.btn-* · .link-*
Language toggle  ·  .btn-lang
← hover: border turns --accent
border
1.5px --line
Default outline; hover → --accent.
color
--ink-soft
Hover → --accent-ink.
radius
--radius-pill
Fully rounded pill.
Filter pill  ·  .btn-filter

Toggle filter. Active state is .is-on: solid --ink fill, white text, × symbol. Inactive: outline + + symbol.

<button class="btn-filter is-on"><span class="btn-filter__sym">×</span>Technology</button>
<button class="btn-filter"><span class="btn-filter__sym">+</span>Work</button>
Inline link  ·  .link-text
The best way to reach me is by email or phone.

Underline in --accent, offset 0.22em, thickness 1.5px. Hover text → --accent-ink.

"See all work" CTA  ·  .link-view-all

Mono uppercase. On hover the gap widens 0.55 → 0.85em and the arrow slides translateX(4px).

Contact headline link  ·  .link-contact

Display size --text-display with a 2px --accent bottom border; hover text → --accent.

06 · Status & eyebrow

.ds-status · .ds-eyebrow
Availability status  ·  .ds-status
Available for work — Jun 2026

Hero status line with a pulsing dot.

--ok
#18b45a
Dot colour (the green).
color
--ink-soft
Label text.
animation
2.4s
Pulse speed — the duration in .ds-status__dot.
<span class="ds-status"><span class="ds-status__dot"></span> Available for work — Jun 2026</span>
Eyebrow label  ·  .ds-eyebrow
01 About 02 Projects 04 Contact

Small mono label that opens each section. A 26×1px rule precedes the text; the index number is in --accent.

<span class="ds-eyebrow"><span class="ds-eyebrow__idx">02</span> Projects</span>

07 · Section heading

.ds-section-head
Eyebrow + title + sub
02 Selected work

Three case studies.

End-to-end design across startups, corporations and consulting.

The standard opener for every major block: eyebrow, big display title, optional one-line sub.

.ds-section-title
--text-title
Display 500, clamp(34→56px).
.ds-section-sub
--text-body
Capped at 52ch for readability.
<div class="ds-section-head">
  <span class="ds-eyebrow"><span class="ds-eyebrow__idx">02</span> Selected work</span>
  <h2 class="ds-section-title">Three case studies.</h2>
  <p class="ds-section-sub">Optional one-line description.</p>
</div>

08 · Project card

.ds-card-grid · .ds-card
3-column grid — the middle card is in hover state

Cards sit on a --works-bg band. They lift and cast a shadow on hover. The grid drops to one column below 880px.

.ds-card-grid
repeat(3, 1fr)
Column count; gap clamp(16→22px).
radius
--radius
Card corners (16px).
border
--line-card
Resting border on the band.
hover
translateY(-6px)
Lift + box-shadow; speed = --dur-slow.
.ds-card__thumb
160px
Cover height; holds an image or .ds-ph.
<a class="ds-card" href="#">
  <div class="ds-card__thumb"><!-- img or .ds-ph --></div>
  <div class="ds-card__num">01 / 2024–</div>
  <h3 class="ds-card__title">Civic</h3>
  <div class="ds-card__tags"><span class="ds-tag">Product Design</span></div>
  <p class="ds-card__desc">Short summary…</p>
  <span class="ds-card__cta">View case study →</span>
</a>

09 · Pillars · stats · clients

.ds-pillars · .ds-stat · .ds-clients
Pillars list  ·  .ds-pillars
  1. Lead end-to-end design across the full product lifecycle.
  2. Turn complexity into clear, AI-ready information architecture.
  3. Grow design culture — mentoring teams and documenting frameworks.
  4. Act as product owner — bridging design and development end-to-end.

Inter 300 list with auto decimal-leading-zero counters in --accent and hairline rules between items.

Stat  ·  .ds-stat
9+
Years of experience in design
45
Screens redesigned for Civic
3
Continents covered by research

Big Inter Tight 500 number (56px, ls −0.04em) over a small caption. Wrap part of the number in .accent to colour it.

<div class="ds-stat"><div class="ds-stat__num">9<span class="accent">+</span></div>
  <div class="ds-stat__cap">Years of experience</div></div>
Clients row  ·  .ds-clients
Worked with SiemensCompunetTelereadingLavazzaBoltonWhirlpool
Worked for Manpower ExperisVMLYRConnexiaEngineering

Mono --ink-faint label beside a wrapping list of Inter Tight 500 names; a --line rule sits on top.

10 · Contact & footer

.ds-contact · .ds-footer
Contact block  ·  .ds-contact
04 Contact

Let's talk.

The best way to reach me is by email — I usually reply within a day.

Closing call-to-action. Display headline with the email underlined in --accent (hover turns the whole word accent).

.ds-contact__headline
--text-display
clamp(40→104px).
.ds-contact__mail
2px --accent
Bottom border on the link.
border-top
--line-strong
The rule that separates it from the page above.
<section class="ds-contact">
  <span class="ds-eyebrow"><span class="ds-eyebrow__idx">04</span> Contact</span>
  <h2 class="ds-contact__headline">Let's <a class="ds-contact__mail" href="mailto:#">talk.</a></h2>
  <p class="ds-contact__sub">Best reached by email.</p>
</section>
Footer  ·  .ds-footer

Mono meta row — copyright left, links right; collapses and wraps on narrow screens. Links hover to --accent-ink.

11 · Project page

.ds-crumb · .ds-meta · .ds-proj-section · .ds-next
Breadcrumb  ·  .ds-crumb

Back link on inner pages; the arrow nudges 3px left on hover, colour → --accent-ink.

Meta list  ·  .ds-meta
Role
Lead Product Designer
Year
2024 — present
Team
Compunet
Scope
Research → UI → handoff

Definition list of project facts; auto-fits as many 160px columns as the width allows.

<dl class="ds-meta">
  <div><dt>Role</dt><dd>Lead Product Designer</dd></div>
  <div><dt>Year</dt><dd>2024 — present</dd></div>
</dl>
Content section  ·  .ds-proj-section

01 Challenge

A 25-year-old platform handled the full lifecycle of fines across 700+ fields and 45 screens, with no shared structure.

The goal was to make it learnable for new operators while keeping experts fast — without losing any of the legal detail.

Two columns: a numbered heading on the left, prose (max 60ch) on the right. Collapses to one column below 880px.

<section class="ds-proj-section">
  <h2><span class="s-idx">01</span> Challenge</h2>
  <div class="ds-proj-body"><p></p></div>
</section>
Figure  ·  .ds-figure
Before / after — fine detail screen
The redesigned detail view: 700+ fields grouped into a predictable left-to-right reading order.

Media block (image or .ds-ph) with a mono caption. Media height is fluid clamp(240→400px), radius --radius-md.

Next link  ·  .ds-next
Next project Energy Manager

Large "next case study" link at the foot of a project; the arrow (in --accent) slides 6px right on hover.

12 · Bullets & filters

.ds-bullets · .btn-filter
Filterable bullet list (the "More" page)
  • Good information architecture is invisible — you only notice it when it's missing.
  • The fastest way to align a team is a shared artifact, not a longer meeting.
  • Constraints are a gift: they turn an infinite problem into a solvable one.

A dash-marked list with hairline rules. The marker is coloured --accent. Pair it with .btn-filter pills to filter items (toggle .is-on in JS).

<ul class="ds-bullets">
  <li>A single point on its own line.</li>
  <li>Another point.</li>
</ul>

13 · Image placeholder

.ds-ph
Striped stand-in  ·  .ds-ph
Project shot — 1600×1000

A diagonal-stripe placeholder with a mono caption of what belongs there. Drop it inside any sized, position:relative; overflow:hidden box (card thumb, figure, hero). Replace with a real <img> when ready.

<div style="position:relative;height:200px;overflow:hidden">
  <div class="ds-ph"></div>
  <div class="ds-ph__label">Project shot — 1600×1000</div>
</div>