Introduction
What Propel is and how the library is put together.
Propel is Plane’s React component library: accessible behavior from
Base UI, styled with a Tailwind CSS v4 token system, published as
@makeplane/propel. It is the set of primitives Plane itself is built from — this site documents
each one as a live, working instance beside its exact source.
How it’s put together
Every interactive component grafts a Base UI primitive onto a styled element, so keyboard
behavior, focus management, and ARIA semantics come from Base UI while the look comes from
Propel’s design tokens. The tokens are OKLCH throughout, semantic first (bg-canvas,
text-primary, border-subtle), and carry four themes — light, dark, light-contrast, and
dark-contrast — from a single data-theme attribute.
Explicit by design
Propel keeps styling axes explicit. An axis is a required prop unless a genuine, documented
default exists (a handful do — e.g. Toggle/Avatar default to md), so the look is spelled
out at the call site:
<Button stretch="auto" variant="primary" size="md" label="Save" />
The axis vocabulary is shared across the library — variant for visual form, variant for
color intent, size for how big it is, stretch for auto-versus-full — so knowing one
component means knowing all of them. What a component renders is never implicit, and impossible
combinations aren’t representable.
Subpath imports
There’s no root barrel. Each component lives at its own subpath, so a bundle only ever contains what a page actually imports:
import { Dialog, DialogContent } from "@makeplane/propel/components/dialog";
import { Tooltip } from "@makeplane/propel/components/tooltip";
Where to go next
Head to Installation to wire Propel into your app, or jump straight into the components — Button is a good first read for the axis vocabulary in practice.