Skip to content
Demonstration site of EURL rhanb. All content is fictitious. About this demonstration
AubrignyTown website (demonstration)
Français

Public inquiry into the local development plan From 26 October to 27 November, have your say on the revised local plan. Read the notice

Design system

The tokens, components and rules that make this site look the way it does. This page is produced from the code: what it shows is what the site uses.

One base, eight charters: each changes the tokens — colours, typefaces, radii, shadows, sizes, ornaments — and nothing else. Pages, components and content stay the same; the components work with the keyboard and announce themselves to screen readers in every charter, light and dark.

Charters

Eight identities on the same site, five demonstration charters and three proposals. Each is chosen with the “Style” button in the header or through the address (?charte=verdane), applies through the page's data-palette attribute and comes in light and dark. A client town brings its own charter: these show what the base can carry.

Demonstration styles

Town hall

Institutional and plain: navy blue, light surfaces, Inter.

Accent
Typefaces
Inter — OFL-1.1, variable file, Latin set, 48.3 KB
Lowest text contrast: 5.44:1 in light, 6.43:1 in dark (threshold 4.5:1)
The twenty colours, light and dark
Tokenlightdark
canvas#F6F5F2#0F1317
surface#FFFFFF#171C22
surface-alt#ECEEF1#1F262E
border#D3D8DE#333D47
border-strong#767F8A#717C88
ink#1A1F26#EDF1F4
muted#525C66#A8B2BC
accent#1F4E79#8FBBE8
accent-text#FFFFFF#0C1A28
accent-soft#E1EAF3#1C2E42
accent-strong#163A5B#B7D4F2
success#1F6B45#86CBA1
success-soft#DDF0E4#173627
warning#7A4F00#EBBE6A
warning-soft#FBECC8#3D2F10
danger#A52A21#F09A92
danger-soft#F8DDDA#44201D
scrim#1A1F26B3#0F1317CC
focus#B4520A#F0A75C
motif#D5E0EB#1C2E42
blason#013B63#F7F6F2
blason-or#C79C2D#D6B56E
Show the site in this charter

Verdane riverside

A town of river and hillsides: deep greens, water blue, sand.

Accent
Typefaces
Commissioner — OFL-1.1, variable file, Latin set, 36.7 KB
Lowest text contrast: 5.41:1 in light, 6.54:1 in dark (threshold 4.5:1)
The twenty colours, light and dark
Tokenlightdark
canvas#F3EEE3#111814
surface#FFFCF5#18211C
surface-alt#E8E1D0#212C26
border#DBD1BC#334038
border-strong#857A62#6E8276
ink#1B2620#ECF1EC
muted#4C5850#AEBCB2
accent#1F5C45#8ED1AE
accent-text#FFFFFF#0B2117
accent-soft#DCEADF#1B3729
accent-strong#164532#B8E6CB
success#29683F#8FD3A0
success-soft#DDEFD9#183623
warning#7A4E00#E7C077
warning-soft#F7E7C2#3A2E12
danger#A3301F#F1A08F
danger-soft#F6DDD6#42221B
scrim#1B2620B3#111814CC
focus#1C6496#7CC4F2
motif#9CC3D8#24465A
blason#013B63#F7F6F2
blason-or#C79C2D#D6B56E
Show the site in this charter

Stone and heritage

An old town centre: ochres, stone greys, burgundy, serif headings.

Accent
Typefaces
Newsreader — OFL-1.1, variable file, Latin set, 58.1 KB
Source Sans 3 — OFL-1.1, variable file, Latin set, 28.9 KB
Lowest text contrast: 5.61:1 in light, 6.59:1 in dark (threshold 4.5:1)
The twenty colours, light and dark
Tokenlightdark
canvas#F4F0E8#16120E
surface#FCFAF5#1E1914
surface-alt#EAE3D5#28221B
border#D6CBB8#3E352B
border-strong#857864#7F7261
ink#241E19#F1EBE1
muted#5A5047#BDB1A0
accent#7B2638#E8A2AE
accent-text#FFFFFF#2A0D14
accent-soft#F1E1DF#3A1D23
accent-strong#5C1A28#F4CCD2
success#2F6440#9BCFA6
success-soft#E0EDDC#1C3322
warning#7D4D00#E6BE72
warning-soft#F5E5C3#3A2C12
danger#A12A1E#F1A091
danger-soft#F5DCD4#45211B
scrim#241E19B3#16120ECC
focus#9B5A06#E5AE5E
motif#B9975F#8A6C3E
blason#013B63#F7F6F2
blason-or#C79C2D#D6B56E
Show the site in this charter

Active town

A town of services: charcoal, burnt orange, straight lines.

Accent
Typefaces
Archivo — OFL-1.1, variable file, Latin set, 34.9 KB
Lowest text contrast: 5.04:1 in light, 5.63:1 in dark (threshold 4.5:1)
The twenty colours, light and dark
Tokenlightdark
canvas#F3F3F1#121417
surface#FFFFFF#1B1E22
surface-alt#E7E7E4#25292E
border#A9ADB3#3D4248
border-strong#2E3136#8A9099
ink#16181B#F4F5F6
muted#4A4E55#B9BEC5
accent#A63A07#FF8A4C
accent-text#FFFFFF#1A0B02
accent-soft#FCE6D9#3C2213
accent-strong#7F2B04#FFB58C
success#1D6B40#7FD3A0
success-soft#DDF1E4#153526
warning#7A4C00#F2C46D
warning-soft#FBEACB#3D2E10
danger#B0261C#FF9A8F
danger-soft#FADCD8#47201C
scrim#16181BB3#121417CC
focus#16181B#F4F5F6
motif#A63A07#FF8A4C
blason#013B63#F7F6F2
blason-or#C79C2D#D6B56E
Show the site in this charter

Readable for all

Reading first: large type, stronger contrast, wide targets.

Accent
Typefaces
Atkinson Hyperlegible Next — OFL-1.1, variable file, Latin set, 34.0 KB
Lowest text contrast: 7.41:1 in light, 7.99:1 in dark (threshold 7.0:1)
The twenty colours, light and dark
Tokenlightdark
canvas#FAF9F6#0F1214
surface#FFFFFF#161A1D
surface-alt#EFF1F2#1F2428
border#C5CBD1#3A4148
border-strong#5E6670#7D8790
ink#111417#F5F7F8
muted#3A424B#CBD2D8
accent#0E4C66#9FD4EC
accent-text#FFFFFF#062130
accent-soft#E1EDF3#15303D
accent-strong#0A3A4F#C8E7F5
success#135232#9ADBB2
success-soft#E1F0E7#143222
warning#5E3D00#F0CB80
warning-soft#F8EBCF#382A0F
danger#8A1C14#FFAAA0
danger-soft#F9E0DC#40201C
scrim#111417B3#0F1214CC
focus#A84400#F2B26B
motif#E1EDF3#15303D
blason#013B63#F7F6F2
blason-or#C79C2D#D6B56E
Show the site in this charter

From our design proposals

Three of them take up design proposals rhanb submitted to public buyers in 2026, carried over to the imaginary town: their palettes, their shapes and free typefaces, without the original logo, name or photographs.

Grid and markers

Light gridded background, orange kept for actions, near-black ink, Inter.

Accent
Typefaces
Inter — OFL-1.1, variable file, Latin set, 48.3 KB
Lowest text contrast: 4.70:1 in light, 5.68:1 in dark (threshold 4.5:1)
The twenty colours, light and dark
Tokenlightdark
canvas#F6F5F1#1A1A1A
surface#FFFFFF#262626
surface-alt#EDEBE5#303030
border#D9D6CE#3F3F3F
border-strong#7E7A72#7D7D7D
ink#262626#F3F2EF
muted#57534E#BFBBB4
accent#BA3008#FF8A5C
accent-text#FFFFFF#2A0C02
accent-soft#FCE7DD#3D2216
accent-strong#8E2406#FFB797
success#1E6B3A#86CF9C
success-soft#DFF0E2#173622
warning#7A4E00#F0C46E
warning-soft#FBEBC9#3B2D10
danger#A8231B#FF9C90
danger-soft#F9DEDB#45201C
scrim#262626B3#1A1A1ACC
focus#6D2077#D7A6E0
motif#E4E1D9#2E2E2E
blason#013B63#F7F6F2
blason-or#C79C2D#D6B56E
Show the site in this charter

Deep teal

Deep teal, an orange half-moon, very bold headings, rounded shapes.

Accent
Typefaces
Nunito — OFL-1.1, variable file, Latin set, 39.1 KB
Lowest text contrast: 5.52:1 in light, 4.59:1 in dark (threshold 4.5:1)
The twenty colours, light and dark
Tokenlightdark
canvas#F1F6F5#04403C
surface#FFFFFF#066863
surface-alt#E3EEEC#07534F
border#C8D6D4#2F807A
border-strong#5F7370#93C6C0
ink#122523#F5FAF9
muted#4A5957#D2E6E3
accent#066863#FFD23F
accent-text#FFFFFF#122523
accent-soft#DCEEEB#0A3431
accent-strong#054E4A#FFE48A
success#356B1C#CDEA94
success-soft#E6F2DA#173A14
warning#7A4A00#FFDC8F
warning-soft#FFF0C7#3A2E0A
danger#B42318#FFD4CE
danger-soft#FDECEA#4A1D18
scrim#122523B3#04403CCC
focus#122523#FFFFFF
motif#F48926#F48926
blason#013B63#F7F6F2
blason-or#C79C2D#D6B56E
Show the site in this charter

Signal

Red for calls and actions, grey for the base, 18-pixel body text.

Accent
Typefaces
Source Sans 3 — OFL-1.1, variable file, Latin set, 28.9 KB
Lowest text contrast: 4.99:1 in light, 4.96:1 in dark (threshold 4.5:1)
The twenty colours, light and dark
Tokenlightdark
canvas#FFFFFF#25292B
surface#FFFFFF#30363A
surface-alt#F2F3F3#3A4145
border#D5D9DB#4C5458
border-strong#7A858B#8C979C
ink#141414#FFFFFF
muted#525C61#D2D7DA
accent#BE1622#FF959D
accent-text#FFFFFF#2A0306
accent-soft#FFE1AA#3F2E12
accent-strong#8E0F18#FFC6CA
success#1C6B3C#8FD3A6
success-soft#E0F1E5#17372A
warning#7A4A00#FFD48A
warning-soft#FFF0D6#3E300F
danger#9B1B12#FFA59B
danger-soft#FBE0DD#4B1E19
scrim#141414B3#1A1C1DCC
focus#614FA1#BCB0E8
motif#FFE1AA#5C4A24
blason#013B63#F7F6F2
blason-or#C79C2D#D6B56E
Show the site in this charter

Measured contrast

Every pair of tokens a screen draws, measured with the WCAG formula on every test run (tools/contrast.test.ts): 4.5:1 for text, 7:1 in the “Readable for all” charter, 3:1 for field borders, buttons and focus. Each cell gives the ratio in light, then in dark.

Measured contrast
PairThresholdTown hallVerdane riversideStone and heritageActive townReadable for allGrid and markersDeep tealSignal
ink / canvas4.5:115.19 / 16.4213.50 / 15.7714.49 / 15.7216.01 / 16.9017.55 / 17.5013.87 / 15.5514.64 / 11.0518.42 / 14.68
ink / surface4.5:116.56 / 15.0915.24 / 14.4215.79 / 14.7117.79 / 15.3218.48 / 16.2915.13 / 13.5215.97 / 6.2918.42 / 12.25
ink / surface-alt4.5:114.25 / 13.4511.98 / 12.6412.90 / 13.2714.36 / 13.4016.31 / 14.5712.69 / 11.7913.47 / 8.4516.57 / 10.39
muted / canvas4.5:16.25 / 8.676.44 / 9.136.91 / 8.847.52 / 9.879.68 / 12.316.99 / 9.106.73 / 8.966.86 / 10.12
muted / surface4.5:16.81 / 7.967.27 / 8.357.53 / 8.278.36 / 8.9510.19 / 11.467.63 / 7.917.35 / 5.106.86 / 8.44
muted / surface-alt4.5:15.86 / 7.105.72 / 7.326.15 / 7.466.75 / 7.838.99 / 10.256.40 / 6.906.20 / 6.856.17 / 7.16
accent / canvas4.5:17.95 / 9.276.78 / 10.208.49 / 9.065.85 / 7.908.89 / 11.735.48 / 7.496.07 / 8.066.31 / 7.02
accent / surface4.5:18.66 / 8.527.66 / 9.339.25 / 8.486.50 / 7.169.36 / 10.925.98 / 6.526.63 / 4.596.31 / 5.85
accent / surface-alt4.5:17.45 / 7.596.02 / 8.187.56 / 7.655.25 / 6.268.26 / 9.775.01 / 5.685.59 / 6.165.68 / 4.96
accent / accent-soft4.5:17.12 / 6.876.31 / 7.317.62 / 7.405.41 / 6.297.85 / 8.615.01 / 6.285.52 / 9.394.99 / 6.23
accent / warning-soft4.5:17.40 / 6.486.42 / 7.527.75 / 6.595.49 / 5.637.92 / 8.705.07 / 5.765.85 / 9.235.62 / 6.14
accent / success-soft4.5:17.28 / 6.556.51 / 7.477.96 / 6.605.50 / 5.737.94 / 8.685.04 / 5.705.71 / 8.805.37 / 6.21
accent / danger-soft4.5:16.74 / 7.106.07 / 8.057.38 / 6.875.04 / 6.037.45 / 9.094.70 / 6.125.80 / 9.835.05 / 6.70
accent-text / accent4.5:18.66 / 8.747.85 / 9.559.65 / 8.766.50 / 8.239.36 / 10.335.98 / 7.856.63 / 11.066.31 / 9.01
accent-text / accent-strong4.5:111.73 / 11.4810.87 / 12.2312.86 / 12.369.33 / 11.2012.13 / 12.788.73 / 10.839.57 / 12.729.41 / 12.73
accent-text / danger4.5:17.11 / 8.167.00 / 8.177.33 / 8.736.69 / 9.409.30 / 9.087.19 / 9.046.57 / 11.848.21 / 9.97
accent-strong / accent-soft4.5:19.64 / 9.038.74 / 9.3710.15 / 10.457.76 / 8.5610.17 / 10.657.32 / 8.677.96 / 10.807.44 / 8.80
accent-strong / surface4.5:111.73 / 11.1910.61 / 11.9512.32 / 11.979.33 / 9.7512.13 / 13.518.73 / 8.999.57 / 5.289.41 / 8.27
accent-strong / canvas4.5:110.76 / 12.189.40 / 13.0711.31 / 12.798.40 / 10.7511.52 / 14.518.00 / 10.348.77 / 9.279.41 / 9.91
ink / accent-soft4.5:113.62 / 12.1712.55 / 11.3013.00 / 12.8314.79 / 13.4515.50 / 12.8412.69 / 13.0413.29 / 12.8714.56 / 13.04
muted / accent-soft4.5:15.60 / 6.435.99 / 6.546.20 / 7.226.95 / 7.858.54 / 9.036.40 / 7.636.11 / 10.445.42 / 8.98
ink / success-soft4.5:113.93 / 11.6012.96 / 11.5413.58 / 11.4615.06 / 12.2615.68 / 12.9512.76 / 11.8213.75 / 12.0615.69 / 12.99
ink / warning-soft4.5:114.14 / 11.4712.76 / 11.6213.24 / 11.4315.02 / 12.0515.64 / 12.9712.85 / 11.9614.10 / 12.6516.39 / 12.85
ink / danger-soft4.5:112.89 / 12.5812.07 / 12.4412.61 / 11.9213.80 / 12.9014.72 / 13.5611.89 / 12.7113.97 / 13.4614.75 / 14.01
success / success-soft4.5:15.44 / 6.955.54 / 7.545.74 / 7.685.50 / 7.477.81 / 8.715.50 / 7.195.53 / 9.565.56 / 7.45
warning / warning-soft4.5:16.09 / 7.515.88 / 7.735.75 / 7.736.20 / 8.078.29 / 9.006.11 / 8.186.61 / 10.096.66 / 9.20
danger / danger-soft4.5:15.54 / 6.635.41 / 6.895.61 / 6.855.19 / 6.897.41 / 7.995.65 / 7.055.75 / 10.516.57 / 7.41
success / surface4.5:16.47 / 9.036.51 / 9.426.67 / 9.866.50 / 9.349.21 / 10.966.52 / 8.236.42 / 4.986.53 / 7.02
danger / surface4.5:17.11 / 7.956.83 / 7.987.03 / 8.456.69 / 8.189.30 / 9.597.19 / 7.506.57 / 4.918.21 / 6.48
danger / canvas4.5:16.52 / 8.656.05 / 8.736.45 / 9.036.02 / 9.028.84 / 10.306.59 / 8.636.02 / 8.638.21 / 7.76
canvas / ink4.5:115.19 / 16.4213.50 / 15.7714.49 / 15.7216.01 / 16.9017.55 / 17.5013.87 / 15.5514.64 / 11.0518.42 / 14.68
border-strong / canvas3.0:13.72 / 4.393.66 / 4.393.80 / 3.9811.75 / 5.745.52 / 5.143.92 / 4.234.61 / 6.143.78 / 4.91
border-strong / surface3.0:14.06 / 4.034.13 / 4.024.14 / 3.7213.05 / 5.205.82 / 4.794.27 / 3.685.03 / 3.503.78 / 4.10
border-strong / surface-alt3.0:13.49 / 3.593.25 / 3.523.38 / 3.3610.54 / 4.555.13 / 4.283.58 / 3.214.24 / 4.703.40 / 3.47
focus / canvas3.0:14.64 / 9.235.48 / 9.484.79 / 9.3616.01 / 16.905.71 / 10.179.07 / 8.6414.64 / 11.646.69 / 7.35
focus / surface3.0:15.06 / 8.476.19 / 8.675.22 / 8.7617.79 / 15.326.01 / 9.479.89 / 7.5115.97 / 6.636.69 / 6.13
focus / surface-alt3.0:14.35 / 7.554.86 / 7.604.26 / 7.9014.36 / 13.405.31 / 8.478.30 / 6.5513.47 / 8.906.01 / 5.20
agenda date (tokens chosen by each style)4.5:19.64 / 9.038.74 / 9.379.25 / 8.4816.01 / 16.9010.17 / 10.6512.69 / 11.796.43 / 6.436.86 / 8.44

Colours

Each colour is a token named for its role, never its hue; the swatches below are those of the charter on display. Text reaches at least 4.5:1 contrast (RGAA 3.2) in every charter and both themes, 7:1 in the “Readable for all” charter; the boundary of interface components (fields, bordered buttons) is a token of its own, border-strong, at 3:1 or better on every background (RGAA 3.3), border staying the decorative rule; the focus colour reaches 3:1 and stays distinct from the accent so it shows on an accented button.

  • canvas
  • surface
  • surface-alt
  • border
  • border-strong
  • ink
  • muted
  • accent
  • accent-text
  • accent-soft
  • accent-strong
  • success
  • success-soft
  • warning
  • warning-soft
  • danger
  • danger-soft
  • scrim
  • focus
  • motif
  • blason
  • blason-or

Mini-site accents

A mini-site changes four accent tokens and nothing else: the library is green, the cultural centre plum. Each charter redefines these two accents so they stay readable on its backgrounds.

  • vert
  • prune

Typography

Each charter loads one or two free typefaces (SIL Open Font License 1.1), self-hosted as variable files, Latin set only; the browser downloads only those of the charter on display. Sizes follow a nine-step scale of each charter's own; line height tightens as size grows.

A home page title, at the largest size

A page title

A heading

A subheading

A lead paragraph, introducing a page and reading easily over two or three lines.

Body text, on lines of 70 characters at most.

A caption or a date

An overline in capitals

Scales per charter

Radii, sizes, line heights, control heights and shadows vary per charter; the components read them through variables, so the same button takes on each charter's look with no exception in its code.

Scales per charter
TokenTown hallVerdane riversideStone and heritageActive townReadable for allGrid and markersDeep tealSignal
type-xs12px13px12px13px15px12px13px14px
type-sm14px15px14px15px16px14px15px16px
type-base16px17px17px17px19px16px17px18px
type-md18px19px19px19px21px18px19px20px
type-lg20px21px21px21px23px20px21px23px
type-xl24px25px25px26px27px24px24px29px
type-2xl30px31px33px34px32px28px30px37px
type-3xl38px40px44px44px40px40px38px47px
type-display48px50px58px58px48px56px52px60px
leading-tight1.151.151.11.051.21.11.11.2
leading-snug1.31.31.251.21.351.31.251.38
leading-normal1.551.61.61.551.651.51.61.618
leading-relaxed1.71.751.751.651.81.651.71.75
radius-xs2px4px002px2px4px2px
radius-sm4px8px1px04px2px6px3px
radius-md8px12px2px06px4px10px4px
radius-lg12px20px2px010px4px16px6px
radius-xl20px28px3px014px6px24px8px
radius-pill999px999px2px0999px999px999px999px
control-sm32px34px32px40px48px36px36px40px
control-md44px46px44px52px52px44px46px46px
control-lg52px54px52px60px60px52px54px56px

Spacing

Eight steps, from 2 to 96 pixels, the same in every charter. No margin is hard-coded: a repository guard refuses a value off the scale.

  • space-2xs2px
  • space-xs4px
  • space-sm8px
  • space-md16px
  • space-lg24px
  • space-xl40px
  • space-2xl64px
  • space-3xl96px

Radii

  • radius-xs
  • radius-sm
  • radius-md
  • radius-lg
  • radius-xl
  • radius-pill

Elevations

  • shadow-elevation-sm
  • shadow-elevation-md
  • shadow-elevation-lg

Widths and heights

  • layout-form28rem
  • layout-narrow38rem
  • layout-prose46rem
  • layout-content60rem
  • layout-page76rem

Components

Built on React Aria Components: roles, states and keyboard navigation come from the library, the styling from the tokens, following the charter chosen in the header. Each component is tested for its accessible behaviour.

Buttons

Tags

NeutralAccentSuccessWarningError

Icons

Fields

A hint, announced with the field.
District

Messages

Information

The message says what happened and what to do.

Success

The message says what happened and what to do.

Warning

The message says what happened and what to do.

Dialog

Tabs

Arrow keys change tab; the panel receives focus.

States

  • Focus: a two-pixel outline in the focus colour, offset from the component, on every interactive element.
  • Error: the field is marked invalid, the message is tied to the field and announced.
  • Empty: a list with no result says so in words and offers a way out.
  • Loading: pages are server-rendered and complete; there is no loading state to hide.

Sources and licences

Inter, Commissioner, Newsreader, Source Sans 3, Archivo, Atkinson Hyperlegible Next and Nunito (SIL Open Font License 1.1, files from Fontsource), React Aria Components (Apache 2.0), Tailwind CSS (MIT), Lucide icons (ISC). The tokens are in packages/ui/src/tokens.ts in the repository.