View
Back
On this page
Design Systems

EDULOG Design System

Making Edulog feel like one product

The Edulog design system is the shared foundation behind every tool in the platform: planning, places, operations, fleet, workforce and finance. It holds the type, icons, colour, space and layout decisions underneath the interface, the components built from them, and the patterns that decide how a list, a settings page or a long-running job behaves. I established those foundations, components and patterns, and the documentation the team designs from today.

Geocode, global search and the workflow builder: a map, a search and an approval canvas, built from the same parts.
Role
UX Designer
Company
Rocksteady-Edulog
Timeline
2025 – Present
Status
In production
Scope
Product design, design system
Team
9 cross functional teams
Responsibilities
User ResearchDesign SystemVisual DesignProduct StrategyInformation Architecture

Overview

Edulog became one product before it looked like one.

Edulog's tools had come together in one platform, but the interface still reflected where each product came from. Navigation separated Athena from Athena Classic. Similar tasks used different patterns. Moving between modules meant encountering another set of conventions.

My role was to establish the shared structure and interaction rules that could make these tools feel connected, and give the team a consistent foundation for future features.

Interaction

That same clarity needed to carry through to individual controls.

In early explorations, workflow objects had different colours by type. Combined with selection and status colours, the canvas offered too many competing signals. I moved toward neutral objects, a shared teal treatment for primary actions and interaction cues, and distinct status treatments.

Type colours sat next to status colours, so neither stood out.

Teal marks the step in focus. Amber and red only mean at risk or blocked.

I also removed text-weight changes between interaction states, so selecting a tab or option would not shift the surrounding content. These small decisions became reusable rules across the system.

Bold text takes more room, so every tab after it shifts as people click through.

State changes colour, border and background. Weight stays the same.

Focus is always the same 2 px teal ring. Errors always pair colour with an icon and a message.

A state should change how something looks, never where it sits.

Foundations

Start from the smallest decisions

Before buttons and form fields, there are the decisions they are made of: type, icons, colour, space, layout, motion, words and access. These came first, because every component inherits them, and a fix here reaches everything built on top.

01Typography

Inter carries the interface and Roboto Mono carries codes and IDs. Fifty styles in ten categories cover everything from a page title to a chart tick, and each one is bound to variables for family, size, weight and line height.

Real Edulog content at true size. Numeric styles use tabular figures, so times and counts line up in tables.

02Iconography

One family, Phosphor, with 1,513 icons. One rule decides the weight: Bold below 18 px so small icons stay crisp, Regular from 18 px up, and Fill only for status and selected items.

A sample of the icons Edulog uses most, from buses and stops to schools and shifts.

03Colour

Status colours only ever mean status. Teal is kept for focus, selection and the main action.

04Space, radius and depth

Spacing runs on a 4 px base, and inside components 12 and 16 do most of the work, which keeps dense screens compact without feeling cramped. Buttons use a 6 px radius, cards 12 and floating surfaces 16. Four levels of elevation separate what sits on the page from what floats above it.

05Layout

One shell holds every page: a 256 px side nav that collapses to a 64 px rail, a 64 px top bar, and a 420 px detail panel that pushes the page narrower instead of covering it. Four breakpoints follow the width of the main area, not the screen.

Below 1024 px the side nav moves behind a menu button, so the main area keeps its room.

The shell in its widest form. The tab row appears only when a page needs it, and the detail panel narrows the main area rather than covering it.

06Motion

Motion is quick, it never blocks work, and it switches off for anyone who asks their device to reduce motion. Six durations and four easing curves cover every animation, stored as variables so engineering uses the same values.

Almost everything finishes in 100 to 250 ms: fast enough that nobody waits, slow enough to follow.

Enter for things arriving, exit for things leaving, standard for moving in place, linear for vehicles gliding between GPS updates.

Curves are illustrative of each easing type. With reduced motion, movement becomes a fade and resizing is instant.

07Content

Words are part of the system too. People scan rather than read, so the important word comes first, everything is sentence case, and dates and times use one format that cannot be misread.

01 Use the words people use at work: route, stop, run, driver, rider.02 State the problem without alarm or blame.03 Give the number, the name and the time.
Green shows the format we use, red the one we replaced. One format per kind of value, everywhere.

08Accessibility

Every screen is checked against WCAG 2.2 AA while it is designed, not after. Most of the work is carried by the components, so a team assembling a screen inherits contrast, focus and target sizes by default.

01 Text 4.5 to 1. Icons, borders, focus rings and selected states 3 to 1.02 The same 2 px teal ring on every focusable element. Never removed.03 At least 24 by 24 for every pointer target. Icon buttons are 32 or larger.04 Status pairs colour with words or an icon, for the 1 in 12 men who can't tell red from green.
From the accessibility foundation: who we design for includes keyboard users, screen reader users, people zooming to 400% and people working fast in a second language.

Reusable parts

Turn decisions into reusable parts

Semantic tokens gave colours and surfaces names based on their purpose. Components brought those decisions into buttons, inputs, navigation and feedback. Shared patterns then addressed recurring situations such as filtering a list, editing settings, searching records and working with maps.

The token-to-button example illustrates the connection: a foundation decision carries through the component into the screen where someone uses it.

Every state is drawn once, inside the component, so nobody redraws a hover or a focus ring on a screen.

The same token in three places. The screen panel is assembled only from library parts.

The library is grouped by the job a part does, not by how it looks. Each family ships with every state it needs, so a team building a screen picks a part and gets its hover, focus, error and disabled states for free.

Input, select, multi select, text area, checkbox, radio and toggleBadge, tag, stat card, avatar group and job statusToast, save bar, empty state and inline errorsSide nav, rail, tabs, breadcrumb and paginationTooltip, popover, action menu and drawerCanvas, zoom control, markers and layer controls
Live instances from the library, shown at true size.

Patterns

Solve a situation once, then reuse the answer

Components answer "what does a button look like". Patterns answer "what happens when someone needs to narrow a list of 4,000 stops" or "how do I know my changes were saved". They combine components into a fixed arrangement with rules, so the same situation behaves the same way in every tool.

01List pattern

Every list page opens with the same page header and the same filter bar. Applied filters stay visible as highlighted chips beside the search, with Clear all next to them and the result count at the end.

Search sits first, filters second and the result count last, in the same order on routes, stops, students and vehicles.

Page header and filter bar, both live components, at true size.

02Settings pattern

Settings pages group fields into labelled sections with a description on the left. Changes collect in a save bar that appears only when something has changed, so nothing is saved by accident and nothing is lost by navigating away.

The save bar appears with the first change and holds both actions until the person saves or discards.

A settings layout example and the save bar, both from the library. The save bar also has saving, saved and error states.

03Work that runs in the background

Reports, imports and route optimisation can take minutes. They never block the page: the status lives on the row, and a toast says when the work is done, with the next step in it.

Status where the work is, news where the person is. The row keeps the full history. The toast is short-lived and only carries the result and one action.

Job status and toast, both from the library. Failed jobs offer Retry in the row, so nothing has to be started again from scratch.

04Empty states

An empty table tells people nothing. Each empty state says why the space is empty and what to do next, in one of four designed cases: first use, no results, an error and no access.

Three of the four empty state types at section size.

Put the system to work

The real test was the next product, not the library

A library proves nothing until someone builds with it. Three very different tools were designed on top of the system: Geocode, a map editor for addresses and roads; global search, which finds any record from anywhere; and the workflow builder, a canvas for automating approvals. Each one is shown below with the parts it took from the system and the parts it had to add.

01Geocode

The most demanding tool in Edulog: a full-screen map with a floating editor. It used the shell, form fields and controls as they were, and its new map parts were later promoted into the system so other tools could use them.

Reused
01 Side nav, collapsed to a rail for canvas work02 Entity header for the floating editor
New
01 Map canvas and layers02 Map controls — both later promoted to the system
Built for Geocode, then promoted into the system for every tool that shows a map.

02Global search

Search had to work over any page in any tool. It opens over the current page on the shared scrim, and it needed only three new parts: a result row, a group header and a footer with keyboard hints. Everything around it was already in the system.

Reused
01 Top bar, where search opens from02 Page header and filter bar on the page below03 Scrim, shared with dialogs and drawers
New
01 Result row, group header and footer
Result row, group header and footer. The rest came from the system.

03Workflow builder

The newest and most different tool: a canvas that lives inside Settings. It reused the Settings nav, the floating drawer and every form field. It needed four new parts, all built from existing tokens: the workflow node, the step option, the step library and the canvas controls.

Reused
01 Settings nav, collapsed for canvas work02 Floating drawer with input, select and text area
New
01 Workflow node, with default, hover, selected and error states02 Step library, made of step options
Node, step option, step library and canvas controls, all built from existing tokens.

A note on "in use" — these tools were designed by the design team on top of the system. The library is the source for design work today. Engineering adoption in production is the next stage, covered in the reflection.

Documentation

Make the reasoning available to the next designer

A system that lives in one person's head stops at that person. Each component's documentation includes its introduction, specimen, guidelines and examples. Changelogs record what changed and when, page statuses communicate readiness, and archived versions preserve earlier decisions instead of deleting them.

01Four frames per component

The Toast page, all four frames shown whole. Every component page follows the same four-frame structure, so readers always know where to look.

02Guidelines written for decisions, not decoration

Guidelines answer the questions people actually ask in review: when to use the part, when not to, where it goes, how long it stays and what it should say.

The top of the Toast guidelines at near true size. The frame continues with timing, writing, accessibility and the tokens the part uses.

03Changelog, statuses and archive

The changelog records what changed and when, in plain language. Every page carries one of four statuses, so nobody hands off something still being designed. Retired work moves to Archive with a date, never deleted, so the reasoning behind a past decision is still there to read.

  • Still being designed. Explore with it, never hand it off.
  • Reviewed, documented and safe to hand to developers.
  • Earlier decisions stay readable, with the date they were replaced.
The changelog from the file: how statuses work, then the Nov 6 and Oct 29, 2026 entries, which added maps, global search and the workflow builder to the system.

Reflection

The work established a shared foundation for designing across Edulog. Three very different tools were built on it without inventing their own conventions. The next challenge is extending that consistency into implementation and contribution, so the system can keep developing without relying on me in every review.

Starting with navigation. It made the fragmentation visible to everyone, and every later rule could point back to one principle: the structure should explain the work.

Router and Routing, and Map and Mapping, still sit next to each other in the side nav. The grouping is clearer, but the naming needs testing with planners and dispatchers before I would call it solved.

I used AI to audit the file at scale: renaming 330 layers from Athena to Edulog, checking every contrast pair and drafting documentation. Every change was reviewed by me, and every design decision stayed mine.

Bringing the tokens and components into code with engineering, a contribution process for other designers, and measuring task time with real users so impact is shown, not assumed.

More Works