Circuit UI

SumUp's open-source React system for payments and merchant software, shipped as a monorepo of components, tokens, icons and illustrations under Apache-2.0.

Why we like it

Circuit UI is one of the clearer examples of a fintech taking its system seriously as a product. The repo is a public monorepo with the component library, design tokens, icons, illustrations and a bespoke ESLint plugin all shipped side by side, so a team adopting it gets lint rules enforcing the system's conventions on day one, not as a six-month follow-up.

The split into @sumup-oss/circuit-ui and @sumup-oss/design-tokens is also worth paying attention to. The tokens package is published separately, so non-React surfaces (marketing sites, legacy apps, native platforms over time) can consume the primitives without pulling in the component layer. It's a small architectural move that keeps the system useful outside its main runtime.

Where it fits

Circuit UI fits React web teams in payments, fintech or merchant software who want a system that's been pressure-tested at production scale and properly open source. The ESLint plugin is a particularly useful reference for any team thinking about how to encode system rules in a way tooling can enforce.

Good to know: it's React and web only, so native mobile or non-React stacks will only get mileage out of the tokens package rather than the components themselves.

Ideas to borrow

  1. 01.

    Governance

    Publish an ESLint plugin alongside your component library that encodes the system's rules (prefer this prop, avoid this pattern, use this token), so adoption and quality show up in CI rather than code review.

  2. 02.

    Architecture

    Split tokens, icons and illustrations into separate packages from the components, so surfaces outside your main runtime can consume the primitives without inheriting the component layer.

Screenshots

Fig. 1The docs page for Circuit UI's ESLint plugin, showing how to switch it on and listing its eight rules, from component-lifecycle-imports to no-deprecated-spacing-mixin, which catch deprecated props, renamed components and invalid custom properties.
Fig. 2Circuit UI's theme page, which lists each color token from the separate @sumup-oss/design-tokens package with its CSS custom property, hex value and a swatch, and points to the ESLint rules that check token usage.
Fig. 3Circuit UI's component lifecycle, which tags every component as Stable, Internal, Experimental, Under Review, Legacy or Deprecated and spells out the quality bar and versioning promise that comes with each stage.

Further reading

Related