Roadie is the design system for Oztix applications. It exists to make building consistent, accessible, and beautiful UI the path of least resistance. Teams ship faster without sacrificing quality.
Roadie is not a styling abstraction on top of Tailwind. It is Tailwind.
Custom @utility directives extend Tailwind v4 with semantic color, emphasis,
and interaction utilities. You write the same classes you already know, with a
design-system vocabulary layered on top.
This is the most important concept in Roadie.
Intent sets the color context. It picks what palette to use. Apply intent-accent,
intent-danger, or intent-success to a container and every child inherits
that palette automatically.
Emphasis sets the visual weight. It decides how prominent an element
should be.
emphasis-strong is a solid fill, emphasis-subtle is a light tint,
emphasis-raised floats with a shadow.
Together they form a two-axis system: intent controls which color, emphasis controls how much color. See Colors and Interactions for full details.
You won't find bg-gray-100 or text-blue-500 in Roadie code. Instead,
utilities like bg-normal, text-subtle, and border-subtle describe
purpose, not appearance. These resolve differently depending on the
active intent, light/dark mode, and theme. No conditional classes are
needed.
See Tokens for the full set of semantic values.
Intent flows through the DOM via CSS custom properties. Wrap a section in
intent-accent and every button, badge, and input inside it picks up the
accent palette. There are no props to pass and no context providers to wire
up. This
keeps component APIs small and composable.
Components are built on Base UI which provides keyboard navigation, focus management, and ARIA semantics out of the box. Roadie layers styling on top without breaking those guarantees. The foundation is always semantic HTML.
See Accessibility for guidelines and testing advice.
Theming is pure CSS. Colors, dark mode, and intent switching need zero
JavaScript runtime. Components are tree-shakeable ESM. Typography scales
fluidly with clamp() instead of breakpoint overrides.
See Performance for optimisation principles.
A quick map of the building blocks and where to learn more:
neutral, brand, accent, danger,
success, warning, info). See Colors.strong, normal, subtle,
raised, floating, etc). See Colors.grid gap-* is the default stack. flex
is for content-driven rows. See Layout.is-interactive for buttons and
is-interactive-field for inputs. See
Interactions.