@ctrl-ui/react
v0.8.0
Published
Control UI components, blocks, and primitives with the Refined skin, as a versioned package.
Readme
@ctrl-ui/react
Every Control UI component, block, and primitive with the Refined skin, as a versioned package. Same source as the registry, built from the all-refined install set. Prefer the registry when you want to own and edit the source or run another skin.
Install
bun add @ctrl-ui/reactRequires React 19 and Tailwind CSS v4. Wire the styles once in app/globals.css:
@import "tailwindcss";
@import "@ctrl-ui/react/styles/index.css";
@source "../node_modules/@ctrl-ui/react/dist";Stamp the skin on the root element:
<html lang="en" data-skin="refined">Use
Import paths mirror the registry tree, so any docs example works after replacing @/components/control-ui/ with @ctrl-ui/react/.
import { ChatMessage } from "@ctrl-ui/react/chat-message";
import { Button } from "@ctrl-ui/react/ui/button";styles/index.css imports every recipe. To ship less CSS, import the four base sheets and only the recipes you use:
@import "@ctrl-ui/react/styles/theme.css";
@import "@ctrl-ui/react/styles/effects.css";
@import "@ctrl-ui/react/styles/skin-theme.css";
@import "@ctrl-ui/react/styles/skin.css";
@import "@ctrl-ui/react/styles/recipes/button.css";Customize
Override tokens after the imports, and tune a component through its typed knobs:
[data-skin="refined"] {
--cui-accent: oklch(0.6 0.2 260);
}<Button style={{ "--cui-button-radius": "4px" }}>Save</Button>Optional peers
Install a peer only when you import the component that needs it.
| Component | Peer |
| --- | --- |
| ui/calendar | react-day-picker |
| ui/code, ui/code-diff | @tanstack/react-virtual, diff, shiki |
| ui/command | cmdk |
| ui/markdown | streamdown |
| ui/phone-input | react-phone-number-input, libphonenumber-js, zod |
| ui/resizable | react-resizable-panels |
| chat-composer | prosemirror-* |
