← Back to all projects
Firefly

Case Study · Design System

Firefly Design System

A scalable, WCAG-compliant design system built from the ground up for Civica's enterprise products. 33 fully documented components, Angular integration, and design tokens that eliminated 40% of sprint rework.

→ Click Here to view Design System

Role

Design System Lead

Platform

Web (Angular)

Tools

Figma · Angular · HTML/CSS

Scope

4 Product Lines

Standard

WCAG 2.1 AA

Overview

A foundation that scales.

Firefly emerged from a clear problem: 4 separate Civica products had built 6 different button styles, 3 incompatible icon sets, and 240+ inconsistent components. Designers were recreating work; developers were re-implementing patterns. 68% of existing components failed WCAG 2.1 AA contrast — making compliance an individual responsibility rather than a system property. Firefly addressed all three: consistency, velocity, and compliance.

33
Components documented
200+
Icons in library
↓40%
Sprint rework reduction
100%
WCAG 2.1 AA pass rate

Documentation

All Component Documentation

Each of the 33 components below ships with usage guidance, accessibility rules, and a live demo. Every component is keyboard-navigable, supports screen readers via proper ARIA roles, and meets 4.5:1 contrast minimums on all interactive states.

01

Accordion

When to use

Use when content can be hidden and revealed in stacked sections to reduce visual complexity. Ideal for FAQs, settings, and grouped content where users need to scan headers first.

Guidelines

Always show a clear expand/collapse indicator. Only one panel open at a time by default. Ensure ARIA-expanded states and keyboard support (Enter/Space toggle).

02

Avatar

When to use

Use to represent users, contacts, or entities. Provides quick visual recognition in lists, comments, and profile contexts.

Guidelines

Always include alt text describing the user. Use initials as fallback when no image. Maintain consistent sizing across contexts (32px, 40px, 48px).

03

Badge

When to use

Use to display short status indicators, counts, or labels attached to an element. Great for notification counts and tag-like statuses.

Guidelines

Keep text under 3 characters or short labels. Ensure 4.5:1 contrast against the background. Never rely on colour alone — pair with icon or text.

04

Card

When to use

Use as containers for grouped content — typically with an image or icon, title, description, and optional action. Forms the building block of dashboards and listings.

Guidelines

Maintain consistent padding (16-24px). Use elevation or border to define edges. Make whole card interactive only if the entire card has the same destination.

05

Calendar

When to use

Use for date selection in forms, scheduling, or event picking. Essential for booking flows and date-range filters.

Guidelines

Highlight today's date clearly. Disable invalid dates rather than allowing then erroring. Support keyboard navigation with arrow keys. Provide a clear month/year navigator.

06

Checkbox

When to use

Use for multiple-choice selections where users can pick zero, one, or many options independently. Also for binary yes/no decisions like terms agreement.

Guidelines

Always pair with a clickable label. Show clear focus and hover states. Use indeterminate state for parent checkboxes with mixed children. Minimum 24px touch target.

07

Chip

When to use

Use for compact entries representing filters, selections, or tags. Often used in filter bars and contact selection fields.

Guidelines

Make removable chips have a clear delete affordance. Group chips logically. Provide keyboard support — Tab to focus, Delete/Backspace to remove.

08

ColorPicker

When to use

Use when users need to choose a specific colour — common in theming, design tools, and content creators.

Guidelines

Provide both visual swatches and hex/RGB input. Show selected colour clearly. Include preset palettes alongside the custom picker.

09

Dropdown

When to use

Use when users select one option from a list of 5-15 items. For longer lists, consider multiselect with search instead.

Guidelines

Always include a default placeholder. Sort options logically (alphabetical or by frequency). Support keyboard navigation and ARIA listbox role.

10

Editor

When to use

Use for rich-text content creation — emails, descriptions, comments with formatting. Provides bold, italic, lists, and link insertion.

Guidelines

Include only the formatting options users genuinely need. Provide both markdown and visual modes for power users. Ensure all toolbar buttons are keyboard accessible.

11

Input Number

When to use

Use for any numeric input — quantities, prices, ages. Provides increment/decrement controls and number-specific validation.

Guidelines

Set sensible min/max bounds. Show formatted display (commas for thousands). Include step value appropriate to context. Support keyboard arrow keys.

12

Input Switch

When to use

Use for binary on/off settings where the change takes immediate effect (settings panels, feature toggles). Don't use for form submissions requiring save.

Guidelines

Show clear on/off visual states. Animate the transition smoothly (respect prefers-reduced-motion). Label clearly — never use the switch alone.

13

Input Text

When to use

Use for short single-line text — names, emails, search queries, form fields. The most foundational input type.

Guidelines

Always pair with a visible label (not placeholder-only). Show clear focus state. Use type='email', 'tel', 'url' for semantic types. Include helpful inline validation.

14

Input Textarea

When to use

Use for multi-line text — comments, descriptions, messages, long-form input. Allow vertical resize for longer content.

Guidelines

Show character count if there's a limit. Use rows attribute to set initial height. Allow vertical resize but disable horizontal. Maintain accessible labels.

15

Knob

When to use

Use for adjusting numeric values within a defined range — volume controls, settings dials. Less common than sliders; reserve for skeuomorphic contexts.

Guidelines

Show current value clearly. Provide keyboard support with arrow keys for fine control. Include a visible track showing range and current position.

16

Multiselect

When to use

Use when users can select multiple options from a list — tag selection, category filtering. Combine with search for long lists.

Guidelines

Show selected items as chips with remove buttons. Maintain a clear count of selections. Support keyboard navigation and bulk select/deselect actions.

17

Modal

When to use

Use for content requiring user attention or action that interrupts the current flow — confirmations, forms, important info. Don't use for non-critical content.

Guidelines

Provide a clear close button. Trap focus inside the modal. Close on Escape key. Dim and disable the background content. Set ARIA role='dialog'.

18

Messages

When to use

Use for inline feedback within forms or content areas — success notes, errors, warnings, informational tips. Different from toasts which are transient.

Guidelines

Use semantic colour (green/red/yellow/blue) plus icon plus text — never colour alone. Position close to the related content. Allow dismissal where appropriate.

19

Panel

When to use

Use to group related content with a title and optional toolbar — common in dashboards and forms. Different from cards in that panels are larger and may contain other components.

Guidelines

Maintain consistent header height. Include header actions (collapse, more menu) where relevant. Use elevation or border for definition.

20

Paginator

When to use

Use to navigate through long lists of results — tables, search results, archives. Provides page numbers and prev/next controls.

Guidelines

Always show total result count. Include first/last shortcuts for long lists. Disable prev on first page and next on last page rather than hiding.

21

ProgressBar

When to use

Use to indicate completion of a task with known duration — file uploads, form completion percentage, multi-step processes.

Guidelines

Show numeric percentage alongside the visual bar. Use ARIA progressbar role with value attributes. Indicate indeterminate state with animation.

22

Progress Spinner

When to use

Use for indeterminate loading states where duration is unknown — initial page loads, API calls. Use ProgressBar when duration is known.

Guidelines

Always pair with descriptive text (e.g. 'Loading...'). Ensure it spins even with prefers-reduced-motion (slowed but visible). Set ARIA live region for screen readers.

23

Radio Button

When to use

Use when users must select exactly one option from 2-7 mutually exclusive choices. For more than 7 options, use a dropdown.

Guidelines

Group radios with a clear group label. Default to a sensible option where possible. Use ARIA radiogroup role. Minimum 24px touch targets.

24

Rating

When to use

Use for collecting or displaying user ratings — products, content, services. Typically 5-star but can be any range.

Guidelines

Allow keyboard input via arrow keys. Show numeric value alongside stars for clarity. Use partial-fill states for granular ratings. Make read-only state visually distinct.

25

Select Button

When to use

Use to display 2-5 mutually exclusive options as visible buttons — view toggles, time period selection, alignment controls. Replaces dropdowns when space allows.

Guidelines

Show clear selected state. Use consistent button widths. Group buttons visually with shared borders. Mark selected with ARIA pressed='true'.

26

Slider

When to use

Use for selecting a numeric value or range within bounds — volume, price filters, brightness. Better than input number when precision is flexible.

Guidelines

Show current value clearly above or beside the thumb. Support keyboard arrow keys with reasonable step values. Provide both single and range modes.

27

TabView

When to use

Use to organise related content into separate panes the user can switch between — settings sections, product details. Avoid deeply nested tabs.

Guidelines

Show clear active tab indicator. Support keyboard navigation with arrow keys. Use ARIA roles (tab, tablist, tabpanel). Don't hide critical information in non-default tabs.

28

Tag

When to use

Use to label, categorise, or mark items with semantic meaning — status, category, priority. Smaller and more decorative than chips.

Guidelines

Keep text concise (1-2 words). Use distinct colours for semantic categories consistently. Pair with icons for non-colour-dependent meaning.

29

Table

When to use

Use for structured data with multiple attributes per row — user lists, transaction logs, reports. Provides sorting, filtering, and pagination.

Guidelines

Make column headers clickable for sorting where useful. Show sort direction. Support keyboard navigation. Use proper table semantics (th, scope).

30

Toast

When to use

Use for transient, non-blocking feedback — save confirmations, network errors. Auto-dismiss after 4-6 seconds. Don't use for critical actions that need user response.

Guidelines

Position consistently (typically top-right or bottom-centre). Allow manual dismiss. Stack multiple toasts cleanly. Use ARIA live='polite' for screen reader announcements.

31

Toggle

When to use

Use as a more visual alternative to checkboxes for binary settings. Similar to Input Switch but with text labels showing both states.

Guidelines

Show both possible states (on/off labels). Animate the slider smoothly. Make the active state visually distinct (colour + position). Support keyboard activation.

32

Tree

When to use

Use to display hierarchical data — file systems, category navigation, org charts. Provides expand/collapse for nested levels.

Guidelines

Show clear expand/collapse indicators. Indent consistently for each level. Support keyboard arrow keys for navigation. Use ARIA tree role.

33

Tree Select

When to use

Use when users need to select from hierarchical options — categories with subcategories, organisational units. Combines Tree and Dropdown.

Guidelines

Show selected items as chips above the tree. Allow selecting both parent and child nodes. Maintain expand/collapse state per session. Support search across all levels.

Conclusion

Compliance built into the foundation.

Firefly proved that consistency, velocity, and accessibility are not competing priorities — they're complementary when compliance lives at the token level. Every component inherits WCAG-passing contrast automatically. Every interaction state is documented with ARIA requirements. Every team building on Firefly inherits accessibility as a given, not a goal.

→ Explore the live design system