Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Reference-grade survey of the named design systems (Material 3, Apple HIG, Fluent 2, Carbon, SLDS, Polaris, Atlassian, Primer, Ant, Spectrum) and the modern build stack (Tailwind, shadcn/ui, Radix/React Aria/Ark, MUI/Chakra/Mantine/Base) — each system's actual philosophy and rules, plus how to choose adopt-vs-adapt-vs-build.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 332% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 406% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 342% | 0% |
| case-22 | ✗→✓ | ▲ Improved | 336% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 312% | 0% |
A design system framework is a position, not a component grab-bag. Every named system below is opinionated about something — Material about physics and motion, HIG about deference, Carbon about enterprise density, Polaris about merchant content. When you adopt one you inherit its opinions; the friction teams feel is almost always the gap between the system's worldview and theirs. This skill is the field guide: what each system actually believes, the concrete rules that fall out of that belief, and the decision of whether to adopt it, adapt it, or build your own on a headless layer.
The single most important framing: a design system is a set of constraints you're agreeing to. Adopting Material and then re-skinning every component to fight its elevation model costs more than building from scratch. The win comes from picking a system whose opinions you mostly agree with, then theming the parts that are pure brand (color, type, radius, motion personality) while leaving the parts that are pure UX (touch targets, focus order, state layers, a11y semantics) alone.
Philosophy: UI as tactile physical material — surfaces have thickness, cast light, and move with believable motion. M3 dropped literal drop-shadows-as-status for tonal elevation (higher surfaces get a lighter tint of the primary color) and made dynamic color the headline: a single seed (the user's wallpaper on Android, or a brand color) generates a full tonal palette via HCT (Hue-Chroma-Tone) color space. Material 3 Expressive (2025) pushes louder color, larger shapes, springier motion, and emphasized type.
The actual rules:
dp = density-independent pixels; sp = scalable pixels for text (respects user font scale — never use dp for type).primary, onPrimary, surface, surfaceContainerHighest, outline…). You theme by seed + scheme, not by hand-picking hex.onSurface) over the component — every interactive component must implement them.Best for: Android-first or Android-heavy products; teams that want a complete, opinionated, well-documented system with first-party Compose/Flutter/Web implementations. Worst for: strongly-branded products that will fight the elevation/state-layer model, or iOS apps (Material on iOS reads as a non-native port).
Philosophy: three pillars — clarity (legible at every size, precise, content-first), deference (the UI yields to content; chrome is minimal, translucent, out of the way), depth (layered translucency and motion convey hierarchy and place). HIG is a guideline, not a code library — it tells you how to behave native, and you implement with UIKit/SwiftUI/AppKit.
The actual rules:
.ultraThinMaterial→.thickMaterial), semantic colors (.label, .systemBackground), light/dark via semantic tokens.Best for: any app that ships natively on Apple platforms and wants App Store goodwill + free accessibility. Worst for: as a cross-platform web system — there is no official web component library; you'd be reimplementing the feel without the engine.
Philosophy: one coherent language spanning Windows, web, mobile, and the whole Microsoft 365 surface — warm, light, and material-aware. Fluent 2 unified the previously-fragmented Fluent UI React + Windows design into a shared token system.
The actual rules:
@fluentui/react-components), with light/dark/high-contrast and brand ramps generated from a seed.Windows 11 rounded geometry; react-components is the modern v9 (griffel CSS-in-JS, tree-shakeable) — avoid the legacy v8 (@fluentui/react) for new work.Best for: Windows apps, Microsoft-ecosystem and enterprise productivity web apps, anything that should feel "at home" in Office/Teams. Worst for: consumer brand-led products (it reads corporate/Microsoft).
Philosophy: open-source, enterprise/productivity-first — built for dense data, complex workflows, and IBM's own product portfolio. Carbon is unfashionably rigorous: everything snaps to a grid, tokens are exhaustive, and the system optimizes for information density and consistency at scale over expressiveness.
The actual rules:
$spacing-01…$spacing-13).layer tokens for nested surfaces — a model many enterprise systems copy.Best for: B2B/enterprise SaaS, dashboards, admin consoles, data-heavy internal tools, anything in the IBM orbit. Worst for: marketing sites, playful consumer apps, anything that needs to feel warm or distinctive.
Philosophy: the design system of the Salesforce platform — built so thousands of third-party AppExchange apps look native inside Salesforce. Enterprise, CRM-shaped, density-tolerant, and historically delivered as utility classes + BEM-style component CSS (slds-button slds-button_brand) rather than a JS component lib.
The actual rules:
Best for: anything built on or alongside Salesforce/AppExchange. Worst for: general-purpose products with no Salesforce relationship — you'd inherit CRM-shaped opinions for nothing.
sp. Don't hardcode hex, fake elevation with drop shadows, or skip state layers — those are the tells of a broken Material implementation.17pt.react-components. Don't stack Acrylic on Acrylic, or start new work on legacy v8.layer tokens for nested surfaces, lean on its data tables. Don't loosen the grid for "breathing room" — Carbon's value is the density discipline.| System | Owner | Opinionated about | Notable artifact | |---|---|---|---| | Polaris | Shopify | Merchant admin clarity; content/voice guidelines are as important as components | App Bridge (embed apps in Shopify admin), exhaustive content guidance | | Atlassian Design System | Atlassian | Productivity at scale; tokens-first theming across Jira/Confluence | Mature design token system, ADG heritage | | Primer | GitHub | Dev-tool density, keyboard-first, monospace-aware | Primer CSS + Primer React + Primer Primitives (tokens) | | Ant Design | Ant Group | Data-dense enterprise React; tables/forms/everything-included | antd (huge component set), ProComponents, algorithm-based theming | | Spectrum | Adobe | Cross-platform consistency + accessibility-forward; creative-tool ergonomics | Spectrum tokens, React Spectrum (built on React Aria), S2 refresh |
antd ships ~70+ components plus ProComponents (page-level patterns), so a data-heavy admin can be built in days. Costs: a strong, recognizable visual signature (everything reads "Ant") and a heavy footprint. Its v5 algorithm-based theming — design tokens computed from a small set of seed tokens via algorithms (default/dark/compact) — is genuinely worth studying as an alternative to hand-authoring every token.The reusable takeaway across all five: the durable, portable part of a design system is its tokens + content/interaction rules, not its rendered components. You can carry Atlassian-style token architecture, Polaris-style content rules, and Spectrum-style a11y into a system that looks nothing like any of them. Components are downstream of tokens; tokens are the thing worth getting right first (see the design-tokens skill).
Three architectures, and the central decision of this whole skill:
| Layer | What you get | What you owe | Examples | |---|---|---|---| | Headless / unstyled primitives | Behavior, a11y, keyboard, focus mgmt, ARIA — zero styles | All visuals (you bring tokens + CSS) | Radix UI, React Aria (Components), Ark UI, Headless UI | | Utility-first CSS | A styling engine + constraint-based token scale; no components | Component structure + composition | Tailwind CSS | | Styled component libraries | Looks + behavior in one import | Fighting the theme when you outgrow it | MUI, Chakra, Mantine, Ant | | Copy-in components | Real source in your repo, on a headless+utility base | Maintenance (it's your code now) | shadcn/ui |
What it is: a utility-class engine where the config is your token system — spacing scale, color ramp, type scale, breakpoints, radii all live in one place and compile to atomic classes. v4 moved config to CSS-first (@theme in CSS, @import "tailwindcss"), a new Oxide/Rust engine, and native cascade-layer/container-query support.
What it is: the "own your components" model. You run a CLI that copies component source (Radix primitives + Tailwind + CVA variants) into your repo. It's not an npm dependency — there's no version to bump, no black box. You edit the code directly.
The most important layer to get right. These ship the hard part — WAI-ARIA roles, keyboard interaction, focus trapping, collision-aware positioning, type-ahead, RTL — with no styles.
sx/theme system. Great velocity, but everything looks like Material until you invest heavily in theming, and deep customization fights the engine. For the unstyled layer, note the naming: MUI's older in-repo primitives shipped as @mui/base, and the team is consolidating on a standalone Base UI (@base-ui-components/react) — a fresh unstyled/accessible primitive set. Either way, reach for the unstyled tier if you want MUI's engineering without Material's skin.The styled-lib trap: picking a styled library and then overriding 80% of it. If you're re-theming every component, you wanted a headless layer + your own tokens — you're now paying the library's bundle and fighting its specificity for nothing.
@theme as your token source of truth and wrap utilities in components; pair with shadcn/Radix. Don't ship raw utilities everywhere with no component layer, or duplicate the same 12-class string across 40 files.The choice is most concrete on a hard component (combobox: filtering, keyboard nav, listbox ARIA, type-ahead, mobile behavior):
aria-activedescendant, screen-reader announcements, and RTL subtly wrong. Almost never the right call.useComboBox / Radix): ~hours. Behavior + a11y are solved; you write the markup and style it with your tokens. Result: on-brand, accessible, no dead weight. This is the default for a real design system.Autocomplete): ~minutes to working, then hours fighting the theme if your brand diverges. Great for a single product on a deadline; a liability for a multi-surface system you'll re-skin.The pattern generalizes: the harder and more a11y-laden the component, the more a headless base pays off; the simpler and more disposable the product, the more a styled lib's velocity wins.
| System | Philosophy (opinionated about) | Best for | Grid / Type | Tokens? | License / delivery | |---|---|---|---|---|---| | Material 3 | Physical material, dynamic color, motion | Android & cross-platform product | 8dp / Roboto, sp | Yes (color roles + full token set) | Apache-2.0; Compose/Flutter/Web | | Apple HIG | Clarity / deference / depth, native fidelity | Native Apple apps | 8pt / SF Pro, Dynamic Type | Semantic system colors/text styles | Guideline only; UIKit/SwiftUI | | Fluent 2 | Coherent MS ecosystem, materials | Windows + MS-ecosystem web | 4px base / Segoe UI Variable | Yes (alias/global tokens) | MIT; Fluent UI React v9 | | Carbon | Enterprise density, rigor | B2B/data-heavy SaaS | 2x Grid, 16-col / IBM Plex | Yes (deep theme tokens) | Apache-2.0; React/WC/Angular/Vue | | SLDS / Lightning | Native inside Salesforce | Salesforce/AppExchange apps | SLDS grid / Salesforce Sans | Yes (styling hooks) | BSD-3 CSS; LWC | | Polaris | Merchant clarity + content | Shopify apps | 4px base / system font stack | Yes | Custom; React + App Bridge | | Atlassian | Productivity at scale, tokens | Atlassian-ecosystem / large product | 8px / Charlie Display + system | Yes (mature) | Apache-2.0; React | | Primer | Dev-tool density, keyboard | Developer tools | 8px / Mona Sans + Hubot/mono | Yes (Primitives) | MIT; CSS + React | | Ant Design | Data-dense enterprise, complete | Admin/data apps (React) | 8px / system stack + algorithm | Yes (seed→algorithm) | MIT; antd React | | Spectrum | Cross-platform + a11y-forward | Creative/cross-platform | 8px / Adobe Clean | Yes | Apache-2.0; React Spectrum | | shadcn/ui | Own-your-components | New React/Tailwind systems | Tailwind config / your choice | Your tokens | MIT (copy-in) | | Radix / React Aria / Ark | Headless behavior + a11y | The base layer of a custom system | n/a (unstyled) | Bring your own | MIT |
Two dimensions sink more "we'll just adopt X" decisions than philosophy ever does: which frameworks the system actually ships for, and how it themes (which dictates runtime cost, RSC compatibility, and how you override).
| System | Framework availability | Theming mechanism | Official Figma kit? | |---|---|---|---| | Material 3 | Compose, Flutter, Web (MDC/MWC) | Seed → HCT-computed color roles + tokens | Yes | | Apple HIG | UIKit / SwiftUI / AppKit (no web) | Semantic system colors/text styles | Yes (Apple UI kits) | | Fluent 2 | React (v9), Windows native, web | Zero-runtime CSS-in-JS (griffel) + alias tokens | Yes | | Carbon | React, Web Components, Angular, Vue, Svelte | CSS custom properties (--cds-*) + theme tokens | Yes | | SLDS | LWC + framework-agnostic CSS classes | CSS styling hooks (custom props) | Yes | | Polaris | React only | CSS custom properties / tokens | Yes | | Atlassian | React only | Tokens via CSS vars + @atlaskit/tokens | Yes | | Primer | React + CSS (framework-agnostic classes) | CSS custom properties (Primitives) | Yes | | Ant Design | React only (Vue/Angular are 3rd-party ports) | Seed → algorithm-computed tokens (CSS-in-JS) | Yes | | Spectrum | React (React Spectrum/Aria) + Web Components + CSS | CSS custom properties (Spectrum tokens) | Yes | | Tailwind | Framework-agnostic (any) | Utility classes from @theme tokens | n/a | | shadcn/ui | React (+ ports: Svelte, Vue) | CSS vars + Tailwind, CVA variants | n/a (you own) | | Radix | React only | Unstyled — bring any (commonly CSS vars + CVA) | n/a | | React Aria | React only | Unstyled — bring any | n/a | | Ark UI | React, Vue, Solid, Svelte (Zag.js state machines) | Unstyled — bring any | n/a |
Read this table before anything else if you're not a React shop. Most product systems (Polaris, Atlassian, Ant, React Spectrum, shadcn, Radix, React Aria, Chakra, Mantine, MUI) are React-only — for a Vue/Svelte/Solid team the real menu is much shorter: Carbon (multi-framework first-party), Ark UI (multi-framework headless via Zag state machines), Material (Compose/Flutter/Web), or Web-Components systems (Carbon WC, Spectrum WC, Fluent/FAST). This single constraint kills more adoptions than any aesthetic objection.
Theming mechanism decides runtime cost and RSC fit:
Variants live in your component layer, not the framework: the modern pattern is CVA (class-variance-authority) or tailwind-variants to declare variant/size/state → class mappings (this is exactly what shadcn ships). Headless behavior (Radix/Aria/Ark) + tokens (CSS vars) + variant mapping (CVA) + styling (Tailwind/Panda) is the canonical 2024–2025 custom-system stack.
Official Figma-kit parity as an adoption criterion: Material, HIG, Carbon, Fluent, SLDS, Polaris, Atlassian, Primer, Ant, and Spectrum all ship maintained Figma libraries — so designers and code stay in sync out of the box. Headless layers (Radix/Aria/Ark) and shadcn ship no official kit — you build and maintain the Figma↔code parity yourself (see the design-tokens and design-system-governance skills). For a design-led org, an official, in-sync kit is a real reason to adopt a named system over rolling your own.
Decision order (do this in sequence):
Adopt = take it as-is, theme only color/type/radius. Cheapest, fastest, but you live inside its opinions. Adapt = fork/copy and modify (shadcn is adapt-by-design; forking MUI's theme is adapt-by-force). Mid cost; you own divergence. Build = headless primitives + your tokens + your components. Highest cost, only justified at multi-product scale or when brand is the product.
The opinionated default for a typical new React web product (2024–2026): start from shadcn/ui (Radix behavior + Tailwind v4 tokens + CVA variants), own the copied code, and grow it into your system. It gives you headless a11y, zero lock-in, CSS-var theming, and an explicit ownership model — the four things this whole skill argues for — without committing to a styled lib you'll outgrow or a from-scratch build you can't justify.
The cost of forking a 3rd-party system is the part teams underestimate: every upstream a11y fix, security patch, and new-component release now requires a manual merge. Fork only what you'll maintain. This is exactly why shadcn's copy-in model is honest — it makes "you own this now" explicit instead of pretending an override layer is free.
Theming a 3rd-party system to your brand: the safe surface to change is color, type, radius, spacing scale, motion personality, and elevation values — the brand layer. The dangerous surface is component structure, interaction states, focus order, and ARIA — the UX/a11y layer. Re-theme the first; leave the second alone. If your brand requires re-architecting the second, you chose the wrong base — drop to a headless layer.
Signals you picked the wrong system (catch these early): your theme override file is longer than the components would have been; you're using !important or deep descendant selectors to beat the lib's specificity; designers describe the result as "fighting the framework"; you've disabled or rebuilt the system's accessibility behavior; the same component looks different in two places because overrides drifted. Any two of these = re-evaluate the base, ideally before you've built 50 screens on it.
Accessibility track record as a selection criterion (weight this heavily): prefer systems with a demonstrated a11y engine — React Aria/Spectrum (deepest), Radix, Carbon, Fluent, Polaris all take it seriously. A system's a11y is the most expensive thing to retrofit and the easiest to get wrong; inheriting a tested keyboard/focus/ARIA layer is often the single biggest reason to adopt rather than build. Verify with real screen-reader testing, not the marketing page.
Teams rarely choose on a greenfield — they inherit a system or need to escape one. The moves that work:
<Button> keeps its props, swaps its guts). A big-bang rewrite of a live system fails; the strangler pattern (new components on the new base, old ones untouched until touched) ships.@theme tokens before copying components so they inherit your scale.Other measured skills in the registry, with their headline benchmark lift.