All work
04 / Design Library Audit · Independent assessment

From a colour library
to a system with intent.

An audit of colour foundations, semantic relationships and theme behaviour, turning visual inconsistencies into a structured improvement plan.

104Combinations tested
97Reported passing
2Themes reviewed
3Token deliverables

My contribution: colour analysis, semantic token restructuring, contrast review and proposed governance. This case study presents an independent library assessment, not a shipped product redesign.

01 / Audit story

A library can look complete and still leave decisions unresolved.

The starting point was a UI library with colour primitives and semantic roles for light and dark themes. Its visible structure suggested a reusable foundation. My task was to look beneath that structure: were the tones meaningfully differentiated, did named colour relationships remain readable, and could teams apply them without repeatedly making their own interpretations?

I treated the audit as a systems problem. An individual colour can be visually appealing while being unsuitable for a particular text or background role. A semantic name can sound clear while leaving its intended foreground undefined. Those gaps matter because they can be repeated wherever the library is reused.

The central question

Does the library give designers and developers enough information to make consistent, accessible colour decisions across themes and states?

I focused this assessment on the colour foundation and its relationship to components. I did not treat a colour review as proof that the whole product was accessible. Typography, keyboard behaviour, assistive technology support and interaction-level evaluation would require their own checks.

02 / Audit story

I examined the foundation, the relationships and the rules.

I organised the work around three connected layers. First, I reviewed the primitive ramps to understand their lightness progression and adjacent perceptual differences. Then I examined foreground/background combinations in each theme. Finally, I considered whether the token architecture could communicate intended use and support future changes.

01

Measure the palette

Compare lightness endpoints and adjacent tonal distances. Identify compressed steps and abrupt jumps.

02

Test the pairings

Review Surface / On Surface and Container / On Container relationships in both themes.

03

Clarify the system

Separate raw values, semantic purposes and component usage. Make unresolved relationships visible.

This sequence kept the recommendations connected. Rebuilding a ramp creates more usable colour choices, but those choices still need explicit semantic assignments. Likewise, renaming tokens cannot repair a pairing whose contrast remains insufficient.

03 / Audit story

Same identity.
More useful tonal choices.

The original blue ramp moved from light to dark, but the distance between tones was uneven. I retained its anchor colour and redistributed the surrounding tones to give semantic roles a more predictable foundation.

Blue

9 → 9 tones
Before
100#B0C5F0
200#8AA9E8
300#5481DE
400#3369D8
500#0043CE
600#003DBB
700#003092
800#002571
900#001C57
Proposed
100#DEF1FE
200#AFCFF7
300#82ADEF
400#588BE5
500#2E68DA
600#0043CE
700#002BA2
800#00157D
900#00005E
The compressed step · 500–6003.41 → 9.80

More distinction between neighbouring tones in the proposed scale.

The abrupt jump · 200–30013.07 → 11.02

A smaller jump brings this interval closer to the surrounding steps.

The anchor remains#0043CE

The existing blue moves from tone 500 to 600 in the revised scale.

Blue / Before & proposed

Compare the distance between tones.

Adjacent ΔE on the same 0–14 scale. A controlled progression creates more predictable choices; the aim is not to maximise every step.

BeforeProposed
Blue adjacent perceptual distance before and proposedBefore: [9.25, 13.07, 7.49, 10.2, 3.41, 7.59, 6.44, 5.34]. Proposed: [11.12, 11.02, 10.72, 10.54, 9.8, 9.2, 8.18, 7.26].0481214before: 9.25before: 13.07before: 7.49before: 10.20before: 3.41before: 7.59before: 6.44before: 5.34after: 11.12after: 11.02after: 10.72after: 10.54after: 9.80after: 9.20after: 8.18after: 7.26100–200200–300300–400400–500500–600600–700700–800800–900
View exact chart values
StepBeforeProposed
100–2009.2511.12
200–30013.0711.02
300–4007.4910.72
400–50010.2010.54
500–6003.419.80
600–7007.599.20
700–8006.448.18
800–9005.347.26

Calculated from the report’s hex values using Euclidean distance in OKLab × 100. The blue calculations reproduce the report’s labelled original values. Shading aids comparison and does not encode another measure.

More room at both ends of the blue scale.

Reported lightness endpoints on a 0–100 scale.

Before
25.4–82.2
Proposed
21.8–94.8

Orange needed more flexibility at the light end.

The revised lightest orange provides a subtler surface option. Its reported lightness rises from 91.22 to 96.02, while the central orange remains unchanged.

Orange

9 → 9 tones
Before
100#FCDCB8
200#FCD0A1
300#FBC082
400#F9AB58
500#F78F20
600#E57A08
700#C36807
800#A55806
900#8D4B05
Proposed
100#FDEFE4
200#F9D9BF
300#F6C297
400#F6A968
500#F78F20
600#D7802B
700#B57338
800#95663F
900#8C4F0D
Orange / Before & proposed

Compare the distance between tones.

Adjacent ΔE on the same 0–14 scale. A controlled progression creates more predictable choices; the aim is not to maximise every step.

BeforeProposed
Orange adjacent perceptual distance before and proposedBefore: [3.4, 4.45, 5.59, 6.54, 5.98, 7.88, 7.18, 5.94]. Proposed: [6.19, 6.4, 6.7, 6.72, 7.0, 7.23, 7.04, 6.73].0481214before: 3.40before: 4.45before: 5.59before: 6.54before: 5.98before: 7.88before: 7.18before: 5.94after: 6.19after: 6.40after: 6.70after: 6.72after: 7.00after: 7.23after: 7.04after: 6.73100–200200–300300–400400–500500–600600–700700–800800–900
View exact chart values
StepBeforeProposed
100–2003.406.19
200–3004.456.40
300–4005.596.70
400–5006.546.72
500–6005.987.00
600–7007.887.23
700–8007.187.04
800–9005.946.73

Calculated from the report’s hex values using Euclidean distance in OKLab × 100. The blue calculations reproduce the report’s labelled original values. Shading aids comparison and does not encode another measure.

A shared foundation across semantic colours.

Red, green, yellow and violet extend to nine tones each. Lighter and darker options give teams more scope to define surfaces, content and states without inventing extra colours.

Red

6 → 9 tones
Before
100#E96E6E
200#E55151
300#DE2626
400#CA2323
500#9E1B1B
600#7A1515
Proposed
100#FDEEEE
200#FAD2D2
300#F4A7A7
400#EB6E6E
500#DE2626
600#C41616
700#A30F0F
800#7E0C0C
900#5A0808

Green

6 → 9 tones
Before
100#54B18E
200#33A279
300#008B57
400#007E4F
500#00633E
600#004C30
Proposed
100#E8F8EF
200#C9EFD8
300#97E0B7
400#58CD93
500#33A279
600#0E8B57
700#007E4F
800#00633E
900#004C30

Yellow

4 → 9 tones
Before
100#FFF2B3
200#FFE45B
300#FFDE3B
400#FFD60A
Proposed
100#FFF9D9
200#FFF2B3
300#FFE45B
400#FFD60A
500#F9C000
600#DCA000
700#B48000
800#8F6400
900#6B4A00

Violet

4 → 9 tones
Before
100#D4BBDD
200#A36CB6
300#914FA8
400#752396
Proposed
100#F3E8FC
200#E1C9F5
300#C89CEB
400#A36CB6
500#914FA8
600#7A3394
700#63247D
800#4C1866
900#34104A
Primitives create options. Semantics define their use.

A broader palette does not make every pairing accessible. The next step is to assign foreground and background roles, then validate those relationships in each theme.

Swatches reproduce the original and revised hex values shown in the audit. Tone numbers are positions within each scale; matching numbers do not guarantee equivalent lightness across colour families.

04 / Audit story

The more consequential gaps were between colours.

Base neutral surface pairings met the audit’s AA checks, but positive, negative and link text did not perform consistently across the two surfaces and themes. This demonstrated why checking a colour in isolation was insufficient. The same foreground could work against one background and fail against another.

For example, positive text on the first light surface was reported at 3.19:1, while the proposed pairing reached 7.36:1. On the second light surface, link text moved from a reported 3.13:1 to 6.48:1. These were targeted pairing changes, not evidence that every combination in the library had passed.

Selected light-surface contrast checks

Reported before/proposed ratios for two specific pairings. Higher values mean greater contrast; these examples are not a whole-library score.

Positive · original
3.19:1
Positive · proposed
7.36:1
Link · original
3.13:1
Link · proposed
6.48:1
08:1
From the audit / Surface pairings

A colour’s role depends on what sits behind it.

The neutral foundation was workable. The inconsistency appeared in semantic text: positive feedback, negative feedback and links behaved differently across surfaces and themes.

Light theme · Surface 1

Positive text

Positive feedback

3.19:1 → 7.36:1
The proposed darker foreground creates a stronger relationship with the light surface.

Dark theme · Surface 1

Positive text

Positive feedback

5.78:1 → 9.27:1
A lighter foreground serves the same semantic purpose against a dark surface.

Ratios are transcribed from the assessment. These native colour samples illustrate the proposed pairings, not a complete component test.

Missing pairings were a documentation problem as well as a colour problem.

The container review exposed three distinct situations: defined pairings that could be tested, container roles without an explicit foreground counterpart, and foreground tokens without a corresponding container. I separated these categories because they require different fixes. A failing pair needs colour adjustment; an undefined relationship first needs an intended-use decision.

One light-theme negative pairing used the same colour for foreground and background, producing a reported ratio of 1.00:1. Other secondary and positive pairings also failed the audit’s checks. In the dark theme, several existing combinations remained difficult to distinguish. I proposed explicit pairings for primary and secondary actions, information, positive and negative roles, including interaction-state variations.

From the audit / Container pairings

Three kinds of gap. Three different decisions.

Testable, but failing

Adjust the pair

A role and its counterpart exist, but their combination does not pass the audit’s contrast check.

Background without content

Define the foreground

A container exists without an explicit On Container role. The relationship needs to be specified before it can be evaluated.

Content without background

Clarify the intended use

A foreground token exists without a corresponding container. Its scope needs a decision rather than an assumed pairing.

Selected container checks

Original and proposed contrast ratios reported in the assessment
RelationshipOriginalProposedDesign response
Light · Secondary default3.89:115.31:1Darker content on the light neutral container
Light · Negative1.00:19.58:1Separate the foreground from the background
Dark · Secondary default1.50:17.00:1Light content on the dark neutral container
Dark · Positive1.22:19.20:1A defined light foreground and deep-green container

Selected examples show different issues, not a representative sample or a whole-library average.

The recommendation was to preserve proximity to the existing palette where possible while choosing combinations that supported the intended role. The goal was a usable relationship between colours, rather than unnecessary extremes at either end of a ramp.

05 / Audit story

I separated immediate alignment from the longer-term architecture.

The deliverables followed two levels of semantic maturity. The first retained the supplied structure so the improvements could remain recognisable. The second proposed a clearer extension for borders, interaction states and accessibility-driven roles. Keeping these levels separate made the difference between a requirement-aligned revision and a future evolution explicit.

Foundation

Primitive colour system

Rebuilt tonal choices around the existing anchors. Raw values provide the available palette, rather than prescribing every use.

v1.1

Requirement-aligned semantics

Light and dark mappings for Surface, On Surface, Container, On Container and Transparency.

v1.2 · Proposed

A clearer expansion path

Additional border, state and accessibility-driven roles to reduce ambiguity as the library grows.

This distinction is central to how I approach Design Systems. A semantic token describes purpose. Its underlying value may change by theme, but the component should retain a stable reference to that purpose. When components bypass the semantic layer and use raw palette values directly, every later theme or contrast adjustment becomes harder to manage.

Raw valuePrimitiveAvailable colour
Intended purposeSemantic roleTheme-aware pairing
Applied behaviourComponentUses the semantic role
The architecture in practice

One purpose. Different values by theme.

Positive feedback keeps its meaning when the interface changes theme. Its foreground and container need to change together.

Light theme
Positive feedback
Container
#E8F8EF
On Container
#004C30
Reported contrast
9.20:1
Dark theme
Positive feedback
Container
#004C30
On Container
#E8F8EF
Reported contrast
9.20:1

Values and ratios from the proposed container pairings in the assessment. The example illustrates the semantic relationship without reproducing a product screen.

In a design library, this structure also supports review. A reviewer can ask whether a component references the correct role, whether its matching foreground exists, and whether that relationship is supported in each theme. Those questions are more actionable than asking whether a chosen colour simply looks right.

06 / Audit story

The validation result was strong, but it was not complete.

The assessment recorded 97 passing combinations out of 104 tested across contrast, theme consistency and UI states. That is a calculated pass rate of 93.3%, with seven combinations not passing. I would keep those remaining cases visible rather than describe the system as fully accessible.

104 combinations reviewed

97 passing · 7 not passing

93.3% is calculated as 97 ÷ 104. The seven remaining cases are calculated as 104 − 97.

The report supplies the aggregate result, not a full row-by-row record of all 104 checks. This figure is not an overall product accessibility score.

The surface and container evidence shows where specific pairings improved, while the aggregate result gives a broader view of validation coverage. Those are complementary forms of evidence. Neither establishes how the library performed after implementation or how users experienced the final product.

Before release, the next step would be to identify the seven outstanding combinations, resolve or document each case, and repeat the relevant checks in actual components. That follow-through matters because a token can be valid in one documented pairing and be applied incorrectly elsewhere.

07 / Audit story

A clearer library also needs a clear way to maintain it.

The audit defined semantic-first usage: components should reference semantic tokens rather than primitives. I would operationalise that principle through a small set of review expectations, making it easier to recognise acceptable use and to assess additions consistently.

Document the relationship

For each role, specify its purpose, supported background or foreground, theme mapping and applicable state. Keep ambiguous or unpaired roles visible until resolved.

Review the component in context

Check that the intended pairing survives in the actual component, including default, hover and pressed states. Token-level results should inform component review, not replace it.

Make changes traceable

Record which roles changed, why they changed and which components depend on them. Keep the requirement-aligned revision distinct from the proposed architectural extension.

Close the validation loop

Keep unresolved checks in an explicit follow-up list. Recheck affected combinations when palette values, semantic mappings or component usage change.

These are the implementation and maintenance steps I recommend from the findings. The assessment demonstrates the audit and proposed system direction; it does not establish that a team adopted these processes or completed a production migration.

08 / Audit story

What this work demonstrates about my approach.

This assessment shows how I connect visual craft with measurable evidence and system structure. I moved from identifying irregular tonal spacing to reviewing semantic relationships, then shaped the findings into a clearer architecture for two themes. The work made the reasoning behind the changes visible, rather than presenting a revised palette without explanation.

The most important lesson was that a Design System is not simply a collection of well-arranged assets. Its value depends on the relationships and rules that help other people use those assets correctly. Colour foundations, paired semantic roles and component references need to work together.

My contribution

I diagnosed colour and pairing issues, proposed rebuilt ramps, developed two semantic architecture directions and communicated validation results with their remaining gaps.

The resulting assessment offers a concrete basis for the next conversation: which changes can be adopted within the existing structure, which need broader architecture agreement, and what must be validated before implementation. It is a foundation for informed delivery decisions, with the remaining work clearly identified.

Source: my Design Library Audit assessment, pages 2–9. Figures are reported measurements or explicitly labelled calculations. Client identity is omitted. Proposed architecture and pairings are presented as assessment outputs, not verified production outcomes.