Sargam PrakashContact me

Building a design system

Teams Admin Center’s UI library had drifted away from Fluent, Microsoft’s design system. I co-led the work to decide, component by component, where to follow Fluent and where admins needed something different.

Fluent’s switch is On or Off. We added the marked row: Mixed.
Role
Design co-lead: strategy, audit, decisions, governance
Team
2 designers, 2 engineers, with PM and partner feature teams
Timeline
November 2025 – July 2026
Status
Migration under way when I moved teams in July 2026

The product

Teams Admin Center is where IT admins set up Microsoft Teams for their whole organisation.

  1. Info buttons everywhere

    The terms are technical, so almost every setting explains itself.

  2. Links to the docs

    Deeper help sits right next to the setting.

  3. Switches, in bulk

    Often changed for many teams at once.

The design system

A design system is a kit of shared parts, like LEGO bricks: buttons, switches and dropdowns that fit together, with rules for using them.

  1. Teams Admin CenterWhat only Teams admins need
  2. Admin design system layerWhat Microsoft’s admin tools share
  3. FluentMicrosoft’s design system
Improve a brick at the bottom, and everything above it gets the improvement.

The problem

Fluent wasn’t built for admin work, so designers filled the gaps themselves. Take one dropdown.

  1. In the library

    No status icon.

  2. Copy 1

    Detached (copied out of the library), icon added.

  3. Copy 2

    Copied from copy 1. New spacing.

  4. Copy 3

    Copied again. Icon moved.

Three versions, none written down. Multiply that by every component: outdated parts, colours that failed contrast, and code on Fluent versions no longer supported.

The approach

Not “just use Fluent”. Not another design system. A decision for each of the library’s 36 components, written down with its reason.

  • 17Adopt

    Use Fluent as it is.

  • 9Adapt

    Change Fluent, only for a real admin need.

  • 10Invent

    Build our own, only when Fluent has nothing.

Nearly half the old library could simply be retired in favour of Fluent.
The stack rank
Our componentCallClosest in Fluent
ActionsAdoptButton
AlertAdoptMessage bar
AvatarsAdoptAvatar
BannerInventCarousel
BreadcrumbAdaptBreadcrumb
ButtonsAdoptButton
CardInventCard
CheckboxAdoptCheckbox
ChicletAdaptTag, Tag picker
Coach markAdoptPopover, Teaching popover
Copilot prompt pillInventNone
DialogAdoptDialog
DropdownAdoptDropdown
InputAdoptInput
Key valueAdaptCAB & Multicount
LinkAdoptLink
NavigationInventNav
PickerAdaptMenu, Dropdown
PillsAdoptBadge
ProgressAdoptSpinner, Skeleton
RadioAdoptRadio group, Switch
RatingAdoptRating
SearchAdoptSearch
SectionAdaptLabel, Accordion, Module
Side panelInventDrawer
SliderAdaptSlider
Status labelsAdoptStatus indicator
TableInventToolbar, Data grid
TabsAdaptTab list
TagsAdoptTag
TemplateInventNone
Text lineInventNone
Title and descriptionInventNone
ToggleAdaptSwitch
TooltipAdaptTooltip
WidgetsInventCard

Three examples

Design system calls are subjective. The right one depends on the product, its users and how the team works, so the same component can be Adopt for one team and Invent for another. Three of ours:

Switch: a new component

Admins often edit several teams at once. When those teams disagree, Fluent’s switch can only say On or Off. Without an in-between state, we were functionally lacking.

Microsoft 365 admin center: checkboxes
Teams Admin Center: switches

Fluent’s answer is a checkbox, as the Microsoft 365 admin center uses. But every setting in Teams Admin Center is a switch, and swapping them all would disrupt a huge number of admins.

So we built a net new component, outside Fluent: a switch with a Mixed state, made from Fluent’s own colours and accessibility rules, and documented.

Team A

Edit sent messagesOn
Delete sent messagesOn

Team B

Edit sent messagesOff
Delete sent messagesOn

Team A + Team B

Edit sent messagesMixed
Delete sent messagesOn
Mixed where the teams differ, On where they agree.

Cost: one more component we maintain ourselves.

Padding: kept as Fluent’s

Fluent leaves space around some components for the keyboard focus ring. At rest, a form’s left edge goes ragged.

A settings pane at rest

By hand: The same pane with the spacing removed by hand: labels and controls line up on one left edge.
Fluent: A settings pane built from unmodified Fluent components: the labels start further left than the slider, the switch and the checkbox, so the left edge is ragged.

Fluent. Ragged edge.

By hand. One clean edge.

At rest: an 8px gap.
In focus: the ring fills it.

Lined up looked better, and the Fluent team agreed. We still kept Fluent’s spacing: hand-made fixes drift between teams, and when Fluent fixes it, every screen gets the fix.

Cost: a ragged edge, for now.

Table checkboxes: fixed once

A quality audit found a select-all that didn’t look clickable, and round checkmarks that suggested picking only one row.

Selecting rows in a table

After: The same table with square checkboxes on the two selected rows and a select-all control in the header.
Before: A table with two rows selected using round checkmarks; the select-all in the header is a bare checkmark that doesn’t look clickable.

Before. Round checkmarks; a select-all that hides.

After. Square checkboxes; a real select-all.

We fixed the table component, not each page, so every table got the fix.

More decisions

  • Dropdown Adopt

    Ours caused the three copies above.

  • Tabs Adapt

    A clearer selected tab, for accessibility.

  • Tooltip Adapt

    Room for a “Learn more” link.

  • Section Adapt

    Three components merged into one.

  • Card Invent

    Ours, with fewer variants.

  • Side panel Invent, then Adopt

    The need was size, so Fluent’s drawer in three sizes.

Keeping it consistent

Outcome

No branded launch, by design. I moved teams mid-migration and handed over the tools and open questions.

What I’d do differently

Want the deep dive?I’ll walk you through it.