Design tokens stay in charge
Color, spacing, radius, and elevation all resolve from @takeoff-design/tokens. Rebrand and theme at the token layer instead of patching components one by one.
@takeoff-ui/react-spar brings Spar primitives, Takeoff design tokens, and a stable compound API together in one React 19 library. It is built to theme cleanly, compose predictably, and stay understandable as the component set grows.
pnpm add @takeoff-ui/react-sparDocumentation
Every preview below is the real component, rendered live from @takeoff-ui/react-spar — Button, Input, Badge, Switch, Alert, and the TanStack-backed Table. Nothing ships without docs, examples, and API coverage in place.
The promise is not “everything for everyone.” It is a narrower, more durable guarantee: React 19 only, compound composition, token-driven styling, and customization that stays additive over time.
Color, spacing, radius, and elevation all resolve from @takeoff-design/tokens. Rebrand and theme at the token layer instead of patching components one by one.
Roots own state, named parts own content and layout. That keeps the surface close to the rendered anatomy and avoids convenience props that drift over time.
ARIA wiring, keyboard behavior, focus management, and reduced-motion expectations come from Spar primitives and remain intact in the React layer.
Props, slot names, and documented data-* hooks are typed from the same public surface these docs describe, so autocomplete reflects the contract instead of tribal knowledge.
The library targets React 19 on purpose. Peer dependencies, examples, and documentation all align around the same baseline instead of splitting across legacy branches.
Components read CSS custom properties and expose classNames and slotProps where customization is expected. You extend the surface without replacing the owner nodes it depends on.
Same design system, three surfaces. @turkish-technology/spar is the headless core, Takeoff UI Core ships framework-agnostic web components, and @takeoff-ui/react-spar is the typed React wrapper — pick the layer that fits your stack.
// React wrapper — typed props, variants, theming defaults.import { Accordion } from '@takeoff-ui/react-spar';export function FareDetails() {return (<Accordion defaultValue="baggage"><Accordion.Item value="baggage"><Accordion.Header><Accordion.Trigger>Baggage allowance</Accordion.Trigger></Accordion.Header><Accordion.Content>Cabin and checked bag limits per fare family.</Accordion.Content></Accordion.Item></Accordion>);}
These are the rules behind every shipped surface in the library. They explain why the API reads consistently, why styling hooks stay stable, and why customization does not turn into migration debt later.
Components expose structure where structure is real, not where a convenience prop would be easier to add.
React surfaces stay aligned with Takeoff UI Core on the contracts consumers actually depend on: state, slots, and styling hooks.
React-only enhancements stay additive, so customization never breaks the owner nodes and selectors the system relies on.
Install the React package with the token package, import one theme file, and wrap your app once. Spar primitives are pulled in by the React package unless you import them directly.
$pnpm add @takeoff-ui/react-spar @takeoff-design/tokensimport '@takeoff-design/tokens/css/default/theme.css';import { TakeoffSparProvider } from '@takeoff-ui/react-spar';import '@takeoff-design/tokens/css/default/theme.css'; export function App({ children }) { return ( <TakeoffSparProvider colorMode="light"> {children} </TakeoffSparProvider> );}Variants, slot names, and component overrides resolve from the public API itself. That means autocomplete follows the documented contract instead of a parallel, accidental type layer.
Apache-2.0 licensed · React 19 · public docs
Installation guides, component references, philosophy notes, migration paths, and changelog all point at the same contract. That alignment is what makes the library usable in real product work.