Skip to content
Selected work

06 · AppsCode · Design System

AppsCode UI modernization

I designed and built AppsCode (opens in a new tab)’s new design system: a Tailwind CSS v4 theme and 109 typed Vue 3 components, made to replace the old Bulma library in every console without breaking a page.

Repos moved to it: 4 apps, 3 libraries
7Repos moved to it: 4 apps, 3 libraries
SCSS blocks removed, none left
175SCSS blocks removed, none left
Month, with a team of 5
1Month, with a team of 5
Designer
Mohin Uddin
Role
Design System, UI Modernization, Vue Components
Timeline
AppsCode · migration project
Technology
Vue 3, Tailwind CSS v4, TypeScript, Vite
Before · Bulma
The old Bulma design system: the Button page with fill, outlined, light and loading variants
After · Tailwind CSS v4
A databases console page built only from the new design system: stat cards, a warning, filter tabs and a table

My role

What I did
Designed and built the system: a Tailwind CSS v4 theme and 109 typed Vue 3 components, plus compat.css so new components run inside old pages.
Team
5 people
Duration
1 month

Key result

0

Changes in behaviour for users while 7 repos moved to the new system

At a glance

  1. 01 · The problem

    Replace the foundation under four apps and three shared libraries without stopping any of them.

    Read the problem
  2. 02 · The approach

    Keep the names; change only how variants are passed.

    See the approach
  3. 03 · The result

    Every front-end moved off Bulma and SCSS, and users noticed nothing but a cleaner UI.

    See the result

01 · Context

Every AppsCode console ran on one Bulma and SCSS library.

  • kubedb-ui, cluster-ui, platform-ui, billing-ui and selfhost-ui all load @appscode/design-system 2.x globally.
  • Its components took Bulma class strings, like modifier-classes="is-danger is-light is-small".
  • The apps import it by deep path in hundreds of files, so it couldn’t simply be swapped out.
The old Bulma design system: the Button page with fill, outlined, light and loading variants
The old Bulma design system: the Button page with fill, outlined, light and loading variants
The new Tailwind design system: the Button page with a live playground and its Vue code
The new Tailwind design system: the Button page with a live playground and its Vue code

02 · Challenge

Replace the foundation under four apps and three shared libraries without stopping any of them.

  • Both libraries use class names like mt-4: 4px !important in the old one, 16px in the new.
  • The old apps set a 13px root font size and keep their own spin and pulse animations.
  • Every old page had to keep working while new ones moved over.
  • This round moved kubedb-ui, cluster-ui, platform-ui and billing-ui, plus the ui-modules, form-builder and vue-openapi-form libraries.

03 · Thinking

Keep the names; change only how variants are passed.

  • AcButton is still AcButton. Bulma class strings become typed props: color, variant, size, loading.
  • Match the cloud console exactly, checked against cloud-ui’s own source: colours, fonts, sizes, spacing and voice.
  • Props are typed, so a wrong colour or size is a type error in the editor, not a class typo that ships.
  • A Migration page maps every old prop to its new one, component by component.
  1. 01 · Install

    Next to the old package

    Under a second name, so old imports keep working

  2. 02 · Load

    compat.css after the old styles

    No Tailwind setup needed in the app

  3. 03 · Adopt

    New components, page by page

    Old pages stay exactly as they were

  4. 04 · Finish

    Switch to theme.css

    Once an app stops loading the old styles

The Migration page: the same AcButton before and after, then every old prop mapped to its new one
The Migration page: the same AcButton before and after, then every old prop mapped to its new one

04 · Design

Whole console pages, built only from the system.

  • Six example pages: database list and detail, a create form, settings, empty and error states, and the app shell.
  • Every example uses real AppsCode data, so a developer can copy a page and start from it.
  • Charts run on Apache ECharts, the engine cloud-ui already uses.
A databases console page built only from the new design system: stat cards, a warning, filter tabs and a table
A databases console page built only from the new design system: stat cards, a warning, filter tabs and a table
A database detail page from the new design system: status, tabs, details and resource usage
A database detail page from the new design system: status, tabs, details and resource usage

05 · System

One Tailwind CSS v4 theme, in light, dark and the brand colour.

  • Colours, Roboto and Google Sans Flex type, spacing, radius and shadows live in one theme.css.
  • The brand hue can change at runtime, and old and new components re-hue together.
  • Tailwind’s default palette, radii and shadows are cleared, so an off-brand class like bg-indigo-500 simply doesn’t exist.
  • The brand green and success colour were darkened so white text passes WCAG AA.
  • Drag across the page below to see the same screen in both themes.
The same databases page in the dark themeLightDark
A databases console page built only from the new design system: stat cards, a warning, filter tabs and a table, compared with The same databases page in the dark theme

06 · Engineering

compat.css lets new components live inside old pages.

  • Its styles apply only inside new components, under a root marked data-ac-ds.
  • Its utilities sit in a cascade layer, which beats the old unlayered !important rules.
  • Sizes are in px and keyframes are renamed ac-*, so the old 13px root and animations are untouched.
  • Charts and editors ship as separate entries, so apps that don’t use them don’t download them.
Existing Apps: how compat.css fences the new styles in, so old pages stay pixel-identical
Existing Apps: how compat.css fences the new styles in, so old pages stay pixel-identical

07 · Outcome

Every front-end moved off Bulma and SCSS, and users noticed nothing but a cleaner UI.

  • No Bulma or SCSS left: 175 SCSS blocks removed across the 7 repos, and the old styling packages are gone.
  • One look for tables, modals, forms, buttons, the navbar and sidebars, with shared dark mode and text-size tokens.
  • No functional behaviour changed, and the apps now ship noticeably lighter.
  • Published on npm as @ac-design/design-system (opens in a new tab): 1.0.1 for the migration, now at 2.11.
  • One docs site for all of it: a page per component with a live playground, examples, guidelines, accessibility notes and API tables.

08 · Reflection

A migration works when nobody notices the old pages.

  • Matching the console people already use mattered more than a fresh look.
  • Next: merge the branches, run the end-to-end tests, and load cluster-ui’s heavy editors only on the pages that use them.

From the person who managed this work

“Mohin is not only a talented UI/UX engineer, but also a team player and communicator. He used various tools and methods to conduct user research, create wireframes and prototypes, test usability, and implement feedback.”
M. A. Muhaimin SakibEngineering Manager, now at Anwar Group · Managed Mohin directly at AppsCodeRead it on LinkedIn(opens in a new tab)