Design system

Tokens and components extracted from the Figma file "HUGE ONE" (canvas "MVP launch"). Three-layer architecture: primitive, semantic, component. Source code: css/styles.css.

Token architecture

A raw value (hex, px) should never appear directly in a component. It always goes through a semantic token, which itself is built on a primitive token.

LayerRoleExample
PrimitiveRaw value, no intent--blue-500: #3568b8;
SemanticAlias with meaning--color-accent: var(--blue-500);
ComponentSpecific use in one component--button-primary-bg: var(--color-accent);

Colors

15 named colors, grouped by what they're for rather than what they look like. Down from the 18 the raw Figma export used, most of them near-duplicates of each other, plus a full success/warning/error feedback set the export didn't have at all. Text runs on a neutral gray scale now, not the saturated blue the export shipped with; blue is reserved for interactive moments and surface tinting.

Text

Darkest to lightest. All four pass WCAG AA on both the page background and white.

heading#222224
text#404454
text-muted#585f6e
text-subtle#606485

Background & surface

Lightest to most present. bg is the page canvas; surface-tint is for anything that needs to visibly sit above it (cards, tables, badges, notes).

bg#f2f7ff
surface#ffffff
surface-tint / border#e2ecfe

Interactive (accent)

Buttons, links, active states, focus ring. Also reused as border-strong where a card needs to visibly separate from its own tint.

accent#3568b8
accent-hover#2a58a5

Feedback

Warning, success, error: three hues, each deliberately far from the brand blue so they never get mistaken for a clickable accent. Info has no color of its own here, it reuses accent (see above) rather than adding a fourth near-blue.

warning#8a5a2b
warning-tint#f8efe1
success#237246
success-tint#e3f3e8
error#a8322d
error-tint#fbe7e6

Not used anywhere in this MVP's specs yet (there are no forms or confirmations to show), but the app will need them: form validation errors in the admin back office, a confirmation toast after favoriting or publishing, a failed network request on the feed.

Published Failed V1, out of MVP scope
Success: "Startup profile published." Confirms an action completed, doesn't block anything.
Error: "Could not save changes. Check the required fields and try again." Explains what failed and what to do about it, not just that something went wrong.
Semantic tokenValueUsage
--color-accent#3568b8CTAs, active links, active tab, focus ring
--color-text#404454Content titles (startup name, post text)
--color-text-muted#585f6eNumeric values (KPIs)
--color-text-subtle#606485Secondary text, descriptions
--color-heading#222224Navigation labels, UI headings
--color-warning#8a5a2bRoadmap markers, open questions, pending states
--color-success#237246Confirmations, positive KPI trend, verified / published
--color-error#a8322dForm validation, failed requests, destructive actions

Typography

Two families: SF Pro Display for the interface, DM Serif Display for editorial moments (startup name, headings). Fonts are not embedded on this demo page (system fallback), they need to be sourced and licensed for the app.

Heading 20
DM Serif Display, 20/24
Nautilus
Body 16 Bold
SF Pro Display Bold, 16/21, +0.64px
Primary button label
Body 16 Regular
SF Pro Display, 16/22
Price comparison platform for boat charters & tours worldwide.
Body 15 Regular
SF Pro Display, 15/19, +0.25px
Search
Body 14 Semibold
SF Pro Display Semibold, 14/20
220,000€
Body 14 Regular
SF Pro Display, 14/20
Startup description text
Caption 12
Inter, 12/16
30 min

Spacing & radius

Scale observed in the components (button padding, list gaps).

--space-1 (4px)
--space-2 (8px)
--space-3 (12px)
--space-4 (16px)
--space-5 (20px)
--space-6 (24px)
--space-8 (32px)
TokenValueUsage
--radius-sm8pxSmall UI elements
--radius-md24pxInner cards, wide badges
--radius-lg32pxButtons, container cards, tab bar
--radius-pill999pxAvatars, round buttons, pill badges

Effects

Soft blue-tinted shadow on cards, blue glow on the primary CTA. Liquid glass (blur, saturation boost, bright top edge, soft elevation) on the tab bar, the secondary button, and tertiary icon buttons, in the style of iOS's layered glass surfaces.

shadow-card
•
•
•

Buttons

Primary and secondary, 4 states each (read directly from the "Button states" frame in Figma). Secondary uses the liquid glass treatment; see also the tertiary icon buttons under Swipe actions.

Badges: funding stage

"Funding round status" component, 4 variants depending on the startup's stage.

🫘 Pre-seed 🌱 Seed 🪴 Series A 🌴 Series B+

Tab bar (bottom navigation)

Blurred glass background, active dot highlighted. Used for the app's main navigation.

Touch target raised to 44×44px (the original Figma trace was 42px, below the WCAG 2.5.8 threshold). aria-label is required since these buttons carry no visible text, only an icon.

Cards & avatar

White card, 24px rounded corners, soft shadow. Circular avatar with a verification badge (not recreated here, SVG icon sourced from Figma).

NNautilus

Price comparison platform for boat charters & tours worldwide.

Swipe actions (tertiary)

Floating circular icon buttons above the card stack (discovery feed). Tertiary action style: liquid glass, same recipe as the tab bar and the secondary button.

Icons

Reference library: Hugeicons (59,000+ icons), replacing the ad hoc icons from the original Figma file (Phosphor Icons and a custom $icon-line-* set). This site's own nav icons are inlined straight from the Hugeicons free SVG source, not the icon font, to avoid any external font-loading dependency.

Default styleStroke Rounded, the only style included in the free tier and consistent with the line-icon style already used in the mockups
Flutter integrationthe hugeicons package on pub.dev (free), or the Pro guide if premium styles are needed
LicenseFree: Stroke Rounded style only. Pro (paid): 9 other styles (Bulk, Solid, Twotone, Duotone, Sharp...)
Open question: if a screen needs a style outside Stroke Rounded (for example a filled icon for an active state), the choice is either the Hugeicons Pro plan or a one-off exception. To decide case by case during implementation.

Accessibility

Target: WCAG 2.1 level AA. Checked against the real tokens (computed contrast ratios, not visual guesses). Several gaps were found and fixed in the tokens above.

Contrast fixes

TokenBeforeAfterWhy
--color-accentFigma export #5790df, 3.25:1 on white#3568b8, 5.49:1Used as button text, link, and label color, below the AA threshold (4.5:1) as it stood
--color-text-subtleFigma export #6b6f8c, 4.58:1 on app background#606485, 5.35:1Margin too thin (AA cutoff is 4.5:1), a different font rendering could have pushed it below. Also desaturated toward neutral gray along with the rest of the text scale, see below
Note code chipssame tint as their own background, invisiblewhite with a border, always visibleCode chips reused the surrounding tint, so they disappeared inside table headers and notes
The raw Figma blue (#5790df) isn't kept as a usable token: every place that used to reference it was measured and given an accessible replacement instead, so there's no leftover "looks right but fails AA" option sitting in the palette.

Keyboard focus

A real :focus-visible rule was added on every interactive element (buttons, tabs, tab bar, nav links): a 3px ring in --color-focus-ring, 2px offset. This is separate from the "Focused" variant in Figma, which documents a visual design state rather than actual keyboard behavior.

Touch targets

44×44px minimum (token --touch-target-min) on every interactive element. The Figma tab bar drew dots at 42px, raised to 44px in the tokens.

Semantics & keyboard

  • Tabs (startup profile, tab bar): ARIA tablist/tab/tabpanel pattern, arrow-key navigation, only one element in the tab order at a time.
  • Icon-only buttons with no visible label (tab bar): aria-label is required.
  • Heading hierarchy: one h1 per page, no level skipped (h2 to h3 directly, never h2 to h4).

Open questions

  • Admin back-office forms (not yet designed): every field will need an associated <label> and a clear error message, not a placeholder used as the only label.
  • Startup logos, photos, and uploaded documents: alt text to be entered by the internal team at upload time (needs a field in the back office).
  • Swipe action icons (♥ / ✕ / ↺) sit over a variable photo background in production. Contrast needs checking against real startup photos, not just the dark demo background used here.
  • No animation is defined yet. Once swipe transitions are implemented, plan a prefers-reduced-motion alternative that keeps the information instead of just cutting the animation to 0ms.

Usage notes

  • SF Pro Display and DM Serif Display need to be sourced and licensed before integrating them into the app. This page uses a system fallback for the demo.
  • This extraction covers the components visible on the screens reviewed so far (Feed, buttons, navigation, badges). Other components in the file still need documenting as we go (inputs, modals, empty states).
  • Native Figma variables (linked colors/effects) aren't reachable remotely without the desktop app. The tokens above were rebuilt from the resolved values in the design context.