Skip to main content
Design System Case Study

Ictinus Design System

291Tokens
50+Components
4Tiers

A comprehensive token-based design system powering the music industry's most complex interfaces. Built from the ground up with a 4-tier token architecture spanning 291 variables across light and dark themes.

Orfium
V5.1.1
Light + Dark
40+ Pages
Ictinus design system interactive components illustration showing form input, toggle switch, button, and chip components with animated cursor interactions

Origin & Evolution

Ictinus was born from the need to unify a fragmented design language across Orfium's growing product ecosystem. Initially built to serve music copyright professionals, experts navigating dense, data-heavy interfaces for rights management, royalty tracking, and asset monitoring, the system needed to balance information density with clarity.

As Orfium expanded its reach beyond music rights into the broader entertainment industry, Ictinus evolved alongside it. What started as a shared color palette became a fully governed, token-driven system capable of powering diverse product verticals while maintaining a coherent visual language.

Version 5.1.1 represents the culmination of this evolution, a 4-tier token architecture separating raw values from semantic meaning, enabling multi-theme support, cross-platform consistency, and the flexibility to serve both the precision of copyright tools and the expressiveness of entertainment platforms.

Company Orfium
Industry Music & Entertainment
Collections 4 Token Tiers
Themes Light + Dark
Contributors K. Miliaraki, J. Anastasopoulou
P. Vourtsis, K. Danochristos

Token Architecture

A 4-tier token system that separates raw values from semantic meaning, enabling scalable theming and component-level control.

01

Global

Raw, immutable values. Color palettes, spacing steps, sizing scale, border primitives.

139 tokens
9 Color Palettes 23 Sizing Steps 13 Spacing Steps 7 Border Radii
02

Dimension

Semantic aliases for spatial values. Maps raw sizing/spacing to purpose-driven names.

31 tokens
Icon Sizes Spacing Scale Border Radius Border Width
03

Semantic

Context-aware color tokens with Light & Dark mode variants. The theming engine.

87 tokens
Background Colors Text Colors Border Colors Palette Colors
04

Component

Component-specific tokens. Fixed dimensions and aliases tailored to individual UI elements.

34 tokens
Button Sizes Field Heights Avatar Sizes Badge Sizes

Color Foundation

9 color palettes with 10-step ramps, each progressing from lightest tint to deepest shade. These raw values feed into the semantic layer.

Blue

10 stepsPrimary · Brand
1#E9EFFB
2#DAE4FB
3#B8CCFA
4#8EAAEC
5#5E8DF8
6#175BF5
7#194DCC
8#173DA0
9#173382
10#12204E

Red

10 stepsError · Caution
1#FFEBF1
2#FFD6E5
3#FFB2CE
4#FF80AD
5#FF4D8D
6#D4165F
7#BF1250
8#831650
9#601649
10#33123A

Orange

10 stepsWarning
1#FFF0D1
2#FFE2A8
3#FFC95C
4#F5A300
5#D67D00
6#9E4214
7#8B391D
8#66301E
9#4D2A24
10#29201E

Purple

10 stepsUpsell · Visited
1#F3EBFF
2#EBDBFF
3#D8BDFF
4#BD8FFF
5#A566FF
6#7531DE
7#5F33AC
8#492A89
9#38246E
10#211A47

Teal

10 stepsSuccess
1#DCF9F2
2#BFF4E7
3#86EAD1
4#3CDDB4
5#1EBE96
6#107962
7#11695B
8#0F514C
9#104042
10#0E2834

Light Blue

10 stepsFocus · Info
1#E1F5FE
2#BEE4FA
3#81D4FA
4#4FC3F7
5#29B6F6
6#03A9F4
7#039BE5
8#0288D1
9#0277BD
10#01579B

Green

10 stepsSuccess Alt
1#EAF5EA
2#CDE5CB
3#AED5AB
4#8FC58A
5#79B972
6#64AD5A
7#5A9E51
8#4E8C45
9#427B3B
10#2D5D28

Cool Gray

10 stepsNeutral · Text
1#F2F4FF
2#DDE0EE
3#CACCDB
4#B6B8CD
5#A2A5BC
6#8E91AB
7#7A7D9B
8#52567A
9#262C59
10#111530

White

3 stepsBackground
1#FFFFFF
2#F7F7F7
3#EFEFEF

Spacing & Sizing

A predictable, non-linear scale that ensures visual consistency. Spacing values control rhythm between elements, while sizing defines physical dimensions.

Spacing Scale

13 tokens · 0–44px

spacing/00
spacing/11
spacing/22
spacing/34
spacing/48
spacing/512
spacing/616
spacing/720
spacing/824
spacing/932
spacing/1036
spacing/1140
spacing/1244

Sizing Scale

23 tokens · 0–140px

sizing/00
sizing/14
sizing/28
sizing/312
sizing/416
sizing/520
sizing/624
sizing/728
sizing/832
sizing/936
sizing/1040
sizing/1144
sizing/1248
sizing/1352
sizing/1456
sizing/1560
sizing/1672
sizing/1780
sizing/1888
sizing/1992
sizing/20100
sizing/21120
sizing/22140

Border System

Unified border radii and widths that maintain visual cohesion across all components.

Border Radius

borderRadius/12px
borderRadius/24px
borderRadius/38px
borderRadius/416px
borderRadius/536px
borderRadius/648px
borderRadius/79999px

Border Width

borderWidth/11px, Default
borderWidth/22px, Active
borderWidth/34px, Focused

Semantic Colors

Context-aware tokens that abstract raw palette values into meaningful, theme-adaptive references. Instead of scattering hex codes across components, every color decision flows through a semantic layer that knows how to adapt.

Abstraction

Tokens alias global palette values, not raw hex. Change one alias and every surface, text, and border updates across the entire system.

Theme Adaptability

Each token resolves to different palette steps per mode. Dark mode doesn't just invert—it shifts scale positions to maintain perceived visual weight.

Accessibility

Every text–background pair validated to WCAG AA (4.5:1 normal, 3:1 large text). Contrast is a constraint, not an afterthought.

How Tokens Resolve

Component button.primary.bg
Semantic palette/primary/base
Global {colors.blue.6}
Value #175BF5

Semantic Palettes

Nine palettes, three tiers each. Muted for focused/hover states, Base for default surfaces, Contrast for active/pressed states. Each tier carries an accessibility rating.

Dark mode doesn't simply lighten every color. Instead, tokens shift to different scale positions to maintain perceived visual weight. For example, borderColor/default uses blue/4 in light mode but jumps to blue/6 in dark—a deeper, more saturated step that reads with equal prominence against the dark surface.

Primary

Core interactive elements
AA
Muted #5E8DF8 {colors.blue.5}
AA
Base #175BF5 {colors.blue.6}
AAA
Contrast #194DCC {colors.blue.7}

Primary Alt

Subtle primary backgrounds
AA
Muted #E9EFFB {colors.blue.1}
AA
Base #DAE4FB {colors.blue.2}
AAA
Contrast #B8CCFA {colors.blue.3}

Secondary

Ghost/transparent interactions
AA
Muted 20% opacity {transparent.2}
AA
Base 30% opacity {transparent.3}
AA
Contrast 45% opacity {transparent.4}

Tertiary

Minimal/text-only actions
AA
Muted 20% opacity {transparent.2}
Base 0% opacity {transparent.1}
AA
Contrast 30% opacity {transparent.3}

Success

Confirmations, valid states
AA
Muted #DCF9F2 {colors.teal.1}
AA
Base #BFF4E7 {colors.teal.2}
AAA
Contrast #86EAD1 {colors.teal.3}

Warning

Caution, attention needed
AA
Muted #FFF0D1 {colors.orange.1}
AA
Base #FFE2A8 {colors.orange.2}
AAA
Contrast #FFC95C {colors.orange.3}

Error

Errors, destructive actions
AA
Muted #FFEBF1 {colors.red.1}
AA
Base #FFD6E5 {colors.red.2}
AAA
Contrast #FFB2CE {colors.red.3}

Upsell

Promotional, premium features
AA
Muted #F3EBFF {colors.purple.1}
AA
Base #EBDBFF {colors.purple.2}
AAA
Contrast #D8BDFF {colors.purple.3}

Neutral

Text, borders, surfaces
AA
Muted #F2F4FF {colors.coolGray.1}
AA
Base #DDE0EE {colors.coolGray.2}
AAA
Contrast #CACCDB {colors.coolGray.3}

backgroundColor

3 tokens Non-interactive surfaces for pages and containers
defaultwhite/1 → coolGray/10
#FFFFFF
altcoolGray/1 → coolGray/9
#F2F4FF
invertedcoolGray/10 → coolGray/1
#111530

textColor

7 tokens All text meets AA contrast on its intended background
primarycoolGray/10 → coolGray/1
#111530
secondarycoolGray/9 → coolGray/3
#262C59
activeblue/7 → blue/4
#194DCC
errorred/7 → red/4
#BF1250
warningorange/7 → orange/4
#8B391D
successgreen/9 → teal/4
#427B3B
visitedpurple/7 → purple/4
#5F33AC

borderColor

6 tokens Interactive element boundaries and dividers
defaultblue/4 → blue/6
#8EAAEC
activeblue/6 → blue/5
#175BF5
errorred/7 → red/4
#BF1250
focusedpurple/5 → purple/5
#A566FF
successteal/5 → teal/4
#1EBE96
warningorange/5 → orange/4
#D67D00

Accessibility as a Constraint

Every text–background combination was validated with the Stark plugin to meet WCAG AA. This isn't a final QA pass—it's a structural constraint baked into the token system. If a token can't pass 4.5:1 on its intended surface, it doesn't ship.

indicators

6 types Status signals for data-dense interfaces
brand Active states, selections
#5E8DF8#175BF5
success Confirmations, valid states
#1EBE96#107962
warning Caution, attention needed
#F5A300#D67D00
error Errors, destructive actions
#FF4D8D#D4165F
pending In-progress, loading
#BD8FFF#A566FF
inactive Disabled, non-interactive
#B6B8CD#52567A

Iconography

149 icons across 8 categories, organized for interactive and decorative use. Every icon ships in the published Figma library with 4 standardized sizes.

01

Color Application

Interactive icons (e.g. icon buttons) must use a textColor token to ensure AA compliance. Decorative icons may use any global color token.

02

Usage Rules

Interactive icons use the dedicated InteractiveIcon component with built-in sizing. Decorative icons are picked directly from the iconography library and set to preferred size.

03

Sizing Scale

XS 12px
S 16px
M 20px
L 24px
15 User & Status
9 Data & Finance
16 Navigation
20 Generic
29 Basic Actions
23 Toggled Actions
8 Audio Controls
26 Music Business

Components & Organisms

A selection of the components we designed and developed for Ictinus. Click a category to explore.

50+Components
3Categories
v5.1Storybook

Navigation

TabsHorizontal and vertical tab patterns with multiple style variants
StepperMulti-step process navigation with horizontal and vertical orientations
Side NavigationCollapsible sidebar with nested menu items and icons
Top NavigationHorizontal top bar with links and actions
BreadcrumbsHierarchical path display for deep navigation
Text LinkInline and standalone navigational links
List ItemInteractive list rows for menus and selections
Tabs — properties Tabs — usage patterns Tabs — style variants Tabs — interaction states Stepper — horizontal orientation Stepper — vertical orientation Stepper — states Stepper — variants Side Navigation — structure Side Navigation — expanded Side Navigation — collapsed Side Navigation — variants

Inputs

Text Button4 variants (Primary, Secondary, Tertiary, Caution) across multiple states
Icon ButtonRound and square styles with type, state, and icon properties
CheckboxSingle and select-all patterns with component flow
Radio ButtonSingle selection with component flow
SwitchToggle control with component flow
Date PickerCalendar date selection with field and popup
Date Range & Time PickerRange and time selection flows
Multitext InputMulti-value text field with state and status properties
Select & MultiselectSingle, searchable, and multi-select dropdowns
SliderRange selection with single and dual handles
Text Button — description and interaction states Text Button — size normal and compact, all icon and state combinations Icon Button — round and square styles across sizes and states Checkbox — component flow and select-all pattern Radio Button — component flow Switch — component flow Date Picker and Date Range Picker structure Date Picker — component flow Date Range Picker — component flow Time Picker — component flow Multitext Input — component properties Select — component properties Searchable Select — component flow Multiselect — component flow Multiselect — component properties Slider — component properties

Datagrid

DatagridFeature-rich data table with sorting, filtering, column management, row expansion, and bulk actions
Datagrid — table header cell Datagrid — header cell sorting and filtering interactions Datagrid — sorting and multilevel sorting Datagrid — marking a column Datagrid — freezing and unfreezing a column Datagrid — column resizing Datagrid — sticky header Datagrid — headless table variant Datagrid — grouped column headers Datagrid — expandable rows Datagrid — row actions and detailed view Datagrid — deep dive page pattern Datagrid — tooltips and popovers Datagrid — table title selection options Datagrid — table title actions and bulk actions Datagrid — column chooser Datagrid — interactive styles and hover states Datagrid — select all and bulk selection

Patterns

Reusable interaction patterns that combine multiple components to solve common UX challenges across products.

Sidesheet

A surface anchored to the viewport edge for secondary tasks like forms, help panels, and multi-step wizards.

Content
Size
Placement
Create entity Optional subtitle providing context
×
Number
Label
Hint message
Label
Label
Label
Send me notifications
Cancel
Create entity

Modal

An overlay dialog for focused interactions — confirmations, danger actions, custom forms, and informational content.

Type
Size

Asset Matching

Side-by-side comparison workflow for matching music assets — linking recordings to compositions, resolving conflicts, and confirming metadata.

95.7%
Review later
Reject
Confirm
Recording from: Universal Music
♬ Midnight Serenade (Remastered) ↗
Play count: 1.2K
Artists
Kevin BriggsJordyn TorffMaria SantosLiam Chen
Writers (4)
Kevin BriggsJordyn TorffMaria SantosPriya Nair
Music entityN/A
ISRC
T077823982CT077823983CT077823984C+50 more
ISWC
AR456863256
Composition from: Warner Chappell
♫ Midnight Serenade ↗
Artists
Kevin BriggsJordyn TorffMaria SantosL. Chen Jr.
Writers (4)
Kevin BriggsJordyn TorffMaria SantosPriya Nair
Music entityN/A
ISRC
T077823982CT099811234CT077823984C+50 more
ISWC
AR456863256
72.3%
Review later
Reject
Confirm
Recording from: Sony Music
♬ Echoes of Tomorrow ↗
Play count: 856
Artists
Marcus BellSarah CohenAiko TanakaRavi Patel
Writers (3)
Marcus BellSarah CohenElena Rossi
Music entityN/A
ISRC
USSM19804327USSM19804328USSM19804329
ISWC
T0701234567
Composition from: BMG Rights
♫ Echoes of Tomorrow (Alt) ↗
Artists
Marcus BellR. Patel Jr.Aiko Tanaka
Writers (3)
Marcus BellS. Cohen-WrightElena Rossi
Music entityN/A
ISRC
USSM19804327USSM19804328USSM19804329
ISWC
T0701234567
34.1%
Review later
Reject
Confirm
Recording from: Kobalt Music
♬ Neon Lights (Radio Edit)
Play count: 3.4K
Artists
DJ PulseLuna VoxFelix Ray
Writers (2)
Luna VoxFelix Ray
Music entityN/A
ISRC
GBKPL2100459GBKPL2100460
Composition from: Unmatched
♫ No composition found
Artists
Writers
ISRC
No match

Design Principles

The governance model, conventions, and strategies that keep the system coherent, accessible, and scalable across teams.

01

Token Naming Convention

A strict {tier}/{category}/{property}/{variant} naming schema. Semantic tokens use sem/, component tokens use comp/. Slashes create natural groupings in Figma's variable panel.

02

Theming Strategy

Light and Dark modes are achieved purely through semantic token swapping; global raw values never change. Adding a new theme requires zero component modifications.

03

Alias Architecture

Every component token aliases a global primitive, never a raw value. This creates a traceable chain: comp/button/normal/size → sizing/9 → 36px. One change cascades everywhere.

04

Documentation Standard

Each component page follows a fixed structure: Token table, Anatomy, Description, When to use / When not to use, Properties reference, and Interactive examples.

05

Scale Progression

Sizing and spacing use a non-linear 4px-base progression. Values densify at small increments (4, 8, 12, 16) for micro spacing, then expand at larger values (72, 80, 100, 140) for macro layout.

06

Governance & Review

New tokens require justification. Component tokens must alias globals; hardcoded values are flagged during reviews. A quarterly audit ensures token hygiene and consolidates duplicates.

07

Accessibility First

Every color combination is validated against WCAG 2.1 AA (4.5:1 for text, 3:1 for large text). Focus states use a dedicated token (borderColor/interactive/focused) visible in both themes.

08

Adoption & Migration

Adoption is driven through enablement. A Storybook instance provides a living reference. Lint rules flag hardcoded values. Training sessions ensure questions are resolved within hours.

Reflection

Building Ictinus taught me that a design system's true power lies not in its components, but in its token architecture. The 4-tier system (Global, Dimension, Semantic, Component) creates a single source of truth that makes theming trivial and consistency automatic.

The most impactful decision was enforcing semantic aliases throughout. When every component references tokens by meaning rather than value, you unlock the ability to reshape an entire product's visual identity by changing a handful of global primitives. That's the promise of design tokens, fully realized.

Version 5.1.1 represents years of iteration, pruning, and governance. The 291 tokens we have today aren't the result of addition; they're the result of relentless subtraction, ensuring every token earns its place in the system.