Joel D'Silva
Design System

The system behind the work.

@joeldfs/react + @joeldfs/charts — colour, type, spacing, motion, brand, and the components that compose this portfolio. A living reference, rendered from the same tokens the site ships.
At a glance
v0.2.1react@joeldfs/react
v0.1.0charts@joeldfs/charts
18Text variantsEditorial + fluid
35+ComponentsComposable blocks
50+Chart typesStatistical + DV
/01 · Foundations

Color.

Six chromatic families on a 50–900 scale. Semantic aliases the components reference. The brand is monochrome by default — the hero gradient is the only place chromatic color appears.

iris

iris-50

#f2f5ff

iris-100

#dfe7ff

iris-200

#c1ceff

iris-300

#a1b2fe

iris-400

#8295fb

iris-500

#6878ee

iris-600

#515fcf

iris-700

#3f4aa2

iris-800

#2d3673

iris-900

#1c2248

azure

azure-50

#eaf8ff

azure-100

#ceedfe

azure-200

#9fdafa

azure-300

#67c4f2

azure-400

#00adeb

azure-500

#0094dc

azure-600

#0079be

azure-700

#005f95

azure-800

#00446a

azure-900

#002b42

jade

jade-50

#ecfaf1

jade-100

#d3f1de

jade-200

#a8e1be

jade-300

#76cd9c

jade-400

#2eba7a

jade-500

#00a45b

jade-600

#008943

jade-700

#006b34

jade-800

#004d26

jade-900

#003019

amber

amber-50

#fdf4e9

amber-100

#f8e5cb

amber-200

#efca9a

amber-300

#e1ad63

amber-400

#d58e00

amber-500

#c37000

amber-600

#a65700

amber-700

#824400

amber-800

#5c3100

amber-900

#3a2000

rose

rose-50

#fff1f2

rose-100

#ffdee1

rose-200

#febdc4

rose-300

#f599a5

rose-400

#ec7385

rose-500

#da4e69

rose-600

#bb3352

rose-700

#932840

rose-800

#691f2e

rose-900

#42151d

gray

gray-50

#f9fafb

gray-100

#f3f4f6

gray-200

#e5e7eb

gray-300

#d1d5db

gray-400

#9ca3af

gray-500

#6b7280

gray-600

#4b5563

gray-700

#374151

gray-800

#1f2937

gray-900

#111827

Semantic aliases

bg

#ffffff

fg

#111827

muted

#6b7280

muted-soft

#9ca3af

surface-soft

#f3f4f6

border

#e5e7eb

border-soft

#f3f4f6

accent

#515fcf

Hero gradient

hero-blue

#0043fa

hero-cyan

#daf5fe

hero-purple

#54187c

hero-magenta

#ab26a5

hero-pink

#f269a7

hero-blush

#fcc9c9

hero-cream

#fff4f0

/02 · Foundations

Typography.

One component — Text — with 18 variants. Geist Sans editorial, Geist Mono for data. Fluid variants interpolate with the viewport.

Editorial scale

display

Design that reasons.

heading

A system behind the work

kicker

Built to compose

row-title

Reaction-time study

stat

128 ms

pullquote

Clarity is a feature.

Fluid scale

display-fluid

Design that reasons.

heading-fluid

A system behind the work

kicker-fluid

Built to compose

row-title-fluid

Reaction-time study

stat-fluid

128 ms

pullquote-fluid

Clarity is a feature.

Body & utility

body

Body copy is the workhorse — long-form reading set for comfort and rhythm across the measure.

body-strong

Body-strong emphasises a line without leaving the body scale.

meta

Role · Year · Scope

eyebrow

Section eyebrow

eyebrow-strong

Strong eyebrow

mono

const token = value

Type scale

xs0.75remThe quick brown fox
sm0.875remThe quick brown fox
md1remThe quick brown fox
lg1.125remThe quick brown fox
xl1.25remThe quick brown fox
2xl1.5remThe quick brown fox
3xl2remThe quick brown fox
4xl2.5remThe quick brown fox
5xl3remThe quick brown fox
6xl4remThe quick brown fox
7xl5remThe quick brown fox
8xl6remThe quick brown fox
9xl7remThe quick brown fox
/03 · Foundations

Spacing & Radius.

4px base spacing scale. Zero border-radius everywhere — no rounded corners is an explicit brand rule. Depth comes from layout and dividers, not shadows or blur.

Spacing scale

00
10.25rem
20.5rem
30.75rem
41rem
51.25rem
61.5rem
82rem
102.5rem
123rem
164rem
205rem
246rem
328rem

Radius

none0
sm2px
/04 · Foundations

Motion.

Five duration tokens tuned for an editorial pace. No shadows, no blur. Motion is additive, not decorative — useReducedMotion is respected across all animated components.

instant

Micro-feedback — taps, toggles

100ms

fast

Hovers, small state changes

200ms

normal

Default transitions

300ms

slow

Larger moves, overlays

500ms

entrance

First-paint reveals

600ms
/05 · Brand

Gradients.

Eight named gradients from @joeldfs/brand. Each is two linear-gradient layers composited at hard-light, generating perceptually smooth OKLCH blends. Horizon is the editorial signature — used once, at the top of every page.

Horizon · the signature blend

The editorial hero gradient — cool over warm, hard-light. The only place chromatic color appears across the brand.

Calm · trust

Cool blue over cyan. Onboarding, security, reassurance.

Focus · clarity

Indigo over violet — the brand's intellectual core. Research, depth.

Energy · drive

Amber over ember. Momentum, launches, calls to action.

Growth · renewal

Teal over green. Progress, metrics moving up, sustainability.

Optimism · warmth

Soft yellow over coral. Community, delight, human stories.

Passion · intensity

Rose over magenta. Brand moments, emphasis, craft.

Depth · focus

Deep violet over indigo. Premium, night, concentration.

/06 · Brand

Voice & Tone.

Calm, declarative, slightly distant. Every string in the portfolio follows these rules — from nav labels to case study headings.

Tone

Calm, declarative, slightly distant. Confident without selling.

Person

First person for the author (“I led”, “I designed”); third person for the work. Never address the reader as “you” or “we”.

Headings

Sentence case with a trailing period — “Design + Data.” The period is structural, not decorative.

Eyebrows

Uppercase, 0.18em tracking — “/02”, “SELECTED WORK”, “ROLE & SCOPE”.

Punctuation

Em-dash for asides. Middle-dot · for short inline series. Smart quotes for testimonials.

Cadence

Nouns over verbs. Three-clause rhythm. Short declaratives.

Avoid

Exclamation points. Emoji. Marketing verbs: transform, unlock, supercharge, revolutionize. Hedging: just, simply, basically.

/07 · Components

Layout.

Panda-powered layout primitives. Props accept token names; styles resolve at build-time.

Grid

columns + gap token

01
02
03
04
05
06

Stack

direction + gap token

A
B
C

Box

generic styled primitive

Box — any element, any token

Container

max-width constrained page wrapper

Container — constrained to page max-width
/08 · Components

Text & Prose.

Eyebrow

default + strong

Default eyebrowStrong eyebrow

Prose

long-form editorial HTML

Prose wraps editorial HTML — headings, lists, and links — in the system reading styles.

  • Comfortable measure and reading rhythm
  • Consistent link and emphasis treatment

PullQuote

quote + attribution

Pull quote
Clarity is a feature. The system exists so every page can earn it by default.Design principles
/09 · Components

Content.

Callout

note · tip · warning

CodeBlock

lang + title + caption + copy button

tsxdesign-system.ts
import { color, space, fontSize } from "@joeldfs/tokens"

export const palette = Object.entries(color)
  .filter(([k]) => k.startsWith("iris-"))
  .map(([name, value]) => ({ name, value }))
Importing tokens directly — not through the @joeldfs/react barrel.

MathBlock · MathInline

KaTeX rendering

Inline math \log_2(n + 1) sits in a sentence; block math is centred and numbered:

RT = a + b \cdot \log_2(n + 1)(1)
Hick's Law

RefList

numbered references

References
  1. [01]Hick, W. E. · On the rate of gain of information. Quarterly Journal of Experimental Psychology, 1952
  2. [02]Hyman, R. · Stimulus information as a determinant of reaction time, 1953
/10 · Components

Media.

GradientBand

hero gradient at any height

ImageFrame

bordered media container — images grayscale at rest

TripPlanner interface

ImageFrame fallbackGradient

hero gradient placeholder when no src

Figure

numbered exhibit — number · title · caption · source

Figure 01A framed exhibit
@joeldfs/react
Figure wraps any visual with a number, title, and caption.

GalleryStrip

pair · triple · asymmetric · wide layouts

Gallery

Visual storytelling.

Service hero
Hero image
Product
Product

AwardBadge

recognition marks

Red Dot AwardGood Design Award
/11 · Components

Data.

MetricsRow

bordered treatment

Outcomes
+38%ActivationFirst week
−21%Time to valueMedian
4.6CSATPost-launch

MetricsRow filled

full-bleed colour-cell treatment

128 ms
p95 latency
99.95%
Uptime
0
Sev-1s

DataTable

caption · columns · rows · footnote

ColumnTypeMeaning
set_sizeintNumber of on-screen choices
rtfloatReaction time in ms
correctboolWhether the response matched
Trial schemaSynthetic sample data.

MetaStrip

labelled key-value row

RoleProduct Designer
Year2024
ScopeResearch · Design · Delivery
StatusLive
/12 · Components

Editorial Blocks.

Larger compositions for case studies — challenge/approach/outcome, journey maps, team credits.

CAOBlock

Challenge · Approach · Outcome

ChallengeDesigners and developers worked from separate sources of truth, causing drift and rework on every release.
ApproachConsolidated all component definitions into a single design-to-code token pipeline, with Panda CSS as the bridge.
OutcomeSingle handoff artefact per component; rework eliminated; ship velocity increased by 40%.

RoleScope

role + scope label pair

RoleProduct Designer
Research · Design · Prototyping · Delivery

JourneyStrip

numbered process phases

Process
  1. /01Discovery.Stakeholder interviews, audit
  2. /02Definition.Problem framing, scope
  3. /03Design.Concepts, prototypes
  4. /04Delivery.Handoff, QA, launch

TeamCredits

role + name team list

Team
  • Product DesignJoel D'Silva
  • Engineering
  • Product Strategy
/13 · Components

Utility.

Link

default + muted

BackLink

detail-page return affordance

Divider

section rule

Above the rule.

Below the rule.

/14 · Charts

Stats & Sparklines.

Inline stat blocks, sparklines, and proportion strips — the glanceable layer used in study result summaries.

DVStatBlock

value · label · sub · delta · trend

p95 latency
128 ms
baseline
0.94+0.03
variance explained
Time to value
-21%
vs control

DVSparkline

mini trend line

165

DVRatioStack

proportional horizontal bar

Mobile58%Desktop32%Tablet10%
Traffic by device
SegmentValueShare
Mobile5858%
Desktop3232%
Tablet1010%
/15 · Charts

Line & Area.

Time-series and trend charts. Multi-series with annotations, single-series area, and stacked area with palette control.

DVLineChart

multi-series with annotations + legend

013.527036LaunchWeekRate (%)
ConversionBaseline
Line chart
SeriesWeekRate (%)
Conversion012
Conversion115
Conversion211
Conversion318
Conversion422
Conversion520
Conversion627
Baseline010
Baseline110
Baseline210
Baseline310
Baseline410
Baseline510
Baseline610

DVAreaChart

single-series area

07160MonthVolume
Area chart
MonthVolume
04
17
26
39
412
510
614
716

StackedArea

multi-series stacked area

050100JanMarMayJulMonthShare (%)MobileDesktopTablet
Stacked area
xMobileDesktopTablet
Jan305515
Feb355015
Mar384814
Apr404515
May434215
Jun483814
Jul523513
/16 · Charts

Bar & Distribution.

Categorical bars, frequency distributions, heatmaps. The workhorse layer for data journalism.

DVBarChart

labelled horizontal bars

Discover100Activate72Engage51Retain38Refer19
Bar chart
LabelValue
Discover100
Activate72
Engage51
Retain38
Refer19

DVDistribution

dot-plot distribution

238330RT (ms)n = 60
Distribution of RT (ms)
Bin startCount
2381
243.112
248.222
253.331
258.443
263.564
268.676
273.788
278.898
2848
289.115
294.223
299.332
304.442
309.561
314.672
319.780
324.892

Histogram

binned frequency with optional KDE

0611253.0316.0n = 80
Histogram
Bin startBin endCount
253257.23
257.2261.40
261.4265.62
265.6269.83
269.82748
274278.211
278.2282.411
282.4286.64
286.6290.87
290.82956
295299.27
299.2303.45
303.4307.66
307.6311.84
311.83163

DVHeatmap

grid heatmap — rows × cols × values

09:0011:0013:0015:0017:00MonTueWedThuFri1218252281524312812102028259816221975914114
Heatmap
Row09:0011:0013:0015:0017:00
Mon121825228
Tue1524312812
Wed102028259
Thu81622197
Fri5914114
/17 · Charts

Statistical.

Box plots, violins, scatter, ECDF, Q–Q, correlation matrix — the analysis layer for study reports.

BoxPlot

box-and-whisker across groups

260299338n=2n = 9n=4n = 9n=8n = 9Reaction time (ms)
Box plot
GroupMinQ1MedianQ3Max
n=2260270275280291
n=4270283290298312
n=8285298307316338

ViolinPlot

KDE violin with IQR + median

260299338n=2n=4n=8Reaction time (ms)
Violin plot
GroupQ1MedianQ3
n=2270275280
n=4283290298
n=8298307316

ScatterPlot

bivariate relationship

-1.313.768.8404.889.75xyn = 40
Scatter plot
xy
00
0.251.6183
0.52.8844
0.753.5325
13.4479
1.252.6954
1.51.5034
1.750.2077
2-0.8304
2.25-1.3126
2.5-1.0768
2.75-0.1366
31.3218
3.252.9854
3.54.491
3.755.514
45.8481
4.255.4555
4.54.4764
4.753.1945
51.9679
5.251.1409
5.50.96
5.751.5136
62.7103
6.254.301
6.55.9405
6.757.2714
78.0118
7.258.0247
7.57.3509
7.756.1994
84.8963
8.253.8046
8.53.2358
8.753.3731
94.227
9.255.6326
9.57.2896
9.758.8366

ECDF

empirical cumulative distribution function

0.000.250.500.751.00median = 280.50238.0330.0RT (ms)F(x)n = 60
Empirical CDF
QuantileValue
Q1270.75
Median280.5
Q3291.25

QQPlot

normal Q-Q plot

-2-2-1-1001122Theoretical quantilesSample quantilesn = 60
Q–Q plot
TheoreticalSample (z)
-2.391-2.285
-1.959-1.914
-1.731-1.755
-1.569-1.597
-1.44-1.544
-1.331-1.385
-1.236-1.173
-1.151-1.067
-1.073-0.962
-1.002-0.909
-0.935-0.803
-0.872-0.803
-0.812-0.697
-0.756-0.644
-0.701-0.591
-0.649-0.538
-0.598-0.538
-0.549-0.485
-0.501-0.432
-0.454-0.379
-0.408-0.379
-0.363-0.326
-0.319-0.326
-0.275-0.273
-0.232-0.221
-0.189-0.168
-0.147-0.168
-0.105-0.115
-0.063-0.115
-0.021-0.062
0.021-0.009
0.063-0.009
0.1050.044
0.1470.097
0.1890.097
0.2320.15
0.2750.15
0.3190.203
0.3630.256
0.4080.256
0.4540.309
0.5010.362
0.5490.415
0.5980.468
0.6490.52
0.7010.573
0.7560.626
0.8120.679
0.8720.732
0.9350.838
1.0020.891
1.0731.05
1.1511.103
1.2361.261
1.3311.42
1.441.526
1.5691.791
1.7311.95
1.9592.32
2.3912.585

CorrelationMatrix

Pearson r heatmap with hatch for negatives

RTRTSet sizeSet sizeAccuracyAccuracyFatigueFatigue0.87-0.340.210.87-0.280.18-0.34-0.28-0.420.210.18-0.42−10+1
Correlation matrix
VariableRTSet sizeAccuracyFatigue
RT10.87-0.340.21
Set size0.871-0.280.18
Accuracy-0.34-0.281-0.42
Fatigue0.210.18-0.421
/18 · Charts

UX Flows.

Funnel, Sankey, node-link diagram, treemap — mapping how users move through a product or system.

Funnel

conversion funnel with % of top step

Visited1,000100.0% of topSigned up52052.0% of topActivated31031.0% of topRetained18018.0% of top
Funnel
StepValue% of top
Visited1000100.0%
Signed up52052.0%
Activated31031.0%
Retained18018.0%

Sankey

multi-column flow diagram

Homepage450Blog200Pricing300Docs350Sign Up430
Sankey diagram
SourceTargetValue
ac300
ad150
bd200
ce250
de180

DVNodeGraph

manual-layout SVG node-link diagram

DesignResearchDataEngineering
Node graph
FromToRelation
dsresolid
dsdasolid
reendashed
daensolid

Treemap

recursive slice-and-dice area map

Discovery40Definition25Design20
Treemap
LabelValue
Discovery40
Definition25
Design20
Delivery15
/19 · Charts

Survey.

Likert diverging bars, NPS strip, SUS gauge — standardised UX measurement instruments rendered as composable chart components.

LikertStack

diverging Likert bar chart

100%50%0%50%100%DisagreeAgree
Easy to navigate
Clear information hierarchy
Would recommend
Likert responses
QuestionStrongly disagreeDisagreeNeutralAgreeStrongly agree
Easy to navigate58123837
Clear information hierarchy310184227
Would recommend46144432

NPSStrip

NPS score + proportion strip

Net promoter score+25n = 100Detractors25 · 25%Passives25 · 25%Promoters50 · 50%
Net promoter score
SegmentCountShare
Detractors2525%
Passives2525%
Promoters5050%

SUSGauge

System Usability Scale gauge with zones

SUS score74.0n = 32Not acceptable051Marginal5168Acceptable6880Excellent80100
SUS score
BandRange
Not acceptable0–51
Marginal51–68
Acceptable68–80
Excellent80–100
/20 · Charts

UX Research.

Priority matrix, task success matrix, radar, gaze plot, journey map — synthesis tools for qualitative and usability studies.

RadarChart

multi-axis polygon chart

Visual designUsabilityPerformanceAccessibilityContentCurrentTarget
Radar chart
AxisCurrentTarget
Visual design0.80.9
Usability0.720.85
Performance0.650.8
Accessibility0.580.9
Content0.750.85

PriorityMatrix

2x2 effort-impact matrix

Fill inMajor projectsQuick winsThankless tasksLow effortHigh effortLow impactHigh impactOnboardingSearchNotificationsSettingsExport
Priority matrix
ItemHigh effortHigh impact
Onboarding0.80.9
Search0.60.7
Notifications0.30.5
Settings0.20.2
Export0.50.3

TaskSuccessMatrix

pass / partial / fail / skip per task x user

P1P2P3P4Pass rateFind account settings88%Export data63%Invite a team member88%
Task success matrix
TaskPass rate
Find account settings88%
Export data63%
Invite a team member88%

GazePlot

eye-tracking fixation plot with scan path

Region · Page5 fixations · 2640 ms total1Logo2Nav3Hero4CTA5Imageradius ∝ dwell time
Gaze plot
OrderDwell (ms)Label
1320Logo
2480Nav
3920Hero
4640CTA
5280Image

JourneyMap

phased CX journey with sentiment curve

PhaseGoalActionSentimentPain pointOpportunity+2−201 · Aware
Discover the product
Sees ad, visits site
+1
Too much noise
Clearer positioning
02 · Consider
Evaluate fit
Reads docs, demo
0
Missing comparison
Add feature matrix
03 · Activate
Get started
Signs up, setup
-1
Long onboarding
Shorten flow
04 · Use
Achieve value
Uses core features
+2
Upsell tier
Journey map
PhaseGoalSentimentPainOpportunity
AwareDiscover the product1Too much noiseClearer positioning
ConsiderEvaluate fit0Missing comparisonAdd feature matrix
ActivateGet started-1Long onboardingShorten flow
UseAchieve value2Upsell tier
/21 · Charts

Retention.

Cohort retention curves and heatmap grid — the standard instrument for measuring product stickiness over time.

RetentionCurve

multi-cohort retention curves

0%25%50%75%100%0123456Avg = 31.7% at week 6Weeks since signupRetention
Retention curve
WeekAvg retention
0100.0%
171.7%
257.7%
347.3%
440.7%
535.7%
631.7%

CohortGrid

heatmap-style cohort retention table

W0W1W2W3W4W5Jann = 2401000072005800470040003500Febn = 3101000068005400440038003300Marn = 2801000075006100510044003900Aprn = 1951000070005600450038003300
Cohort retention grid
CohortSizeW0W1W2W3W4W5
Jan24010000%7200%5800%4700%4000%3500%
Feb31010000%6800%5400%4400%3800%3300%
Mar28010000%7500%6100%5100%4400%3900%
Apr19510000%7000%5600%4500%3800%3300%
/22 · Charts

Wrappers & Diagnostic.

Accessible chart containers, presentational frames, and ML evaluation charts — ROC curve, calibration, confusion matrix.

ChartFigure

accessible wrapper — figure + aria + visually-hidden table

013.527036WeekRate (%)
ConversionBaseline
Line chart
SeriesWeekRate (%)
Conversion012
Conversion115
Conversion211
Conversion318
Conversion422
Conversion520
Conversion627
Baseline010
Baseline110
Baseline210
Baseline310
Baseline410
Baseline510
Baseline610

DVFrame

eyebrow · title · caption · source

Figure 1

Reaction-time distribution

Hicks-law study
238330RT (ms)n = 60
Distribution of RT (ms)
Bin startCount
2381
243.752
249.53
255.251
2615
266.756
272.59
278.258
2848
289.756
295.53
301.252
3072
312.752
318.50
324.252
Pooled across 6 set sizes — right skew is typical of RT data.

ROC curve

receiver operating characteristic with AUC

0.000.000.250.250.500.500.750.751.001.00False positive rateTrue positive rateModel · AUC = 0.910Random · AUC = 0.500
ROC curve
FPRTPR
00
0.050.42
0.10.62
0.20.78
0.350.88
0.50.93
0.70.97
11

Calibration

predicted vs observed probability — circle radius proportional to bin n

0.000.000.250.250.500.500.750.751.001.00Predicted probabilityObserved frequencyBrier score = 0.080marker size ∝ bin n
Calibration curve
PredictedObservedn
0.10.08120
0.30.2795
0.50.4880
0.70.7465
0.90.9140

ConfusionMatrix

2x2 matrix with accuracy · precision · recall · F1

PredictedNegativePositiveActualNegativePositiveTN4242.0%FP88.0%FN55.0%TP4545.0%Accuracy87.0%Precision84.9%Recall90.0%F187.4%
Confusion matrix
Actual ╲ PredictedPred NegativePred Positive
Actual Negative428
Actual Positive545