Installation
Add Manicat UI to a Next.js or Vite project with the shadcn CLI, or copy the source by hand.
Manicat UI is a fork of Arc: the components are still Arc's, we just rebranded the library and its install surface and publish the same source from this site's own registry.
Requirements
- React 19 with TypeScript
- Next.js (App Router) or Vite
- motion for animation. Some items also use lucide-react or a Radix UI primitive; the CLI installs whatever an item needs.
- The
@/*import alias, which Next.js and shadcn set up by default
No Tailwind is required. Manicat UI styles are CSS modules that read CSS variables.
With the shadcn CLI
Register the @manicat namespace once in components.json:
{
"registries": {
"@manicat": "https://manicat.dev/r/{name}.json"
}
}Then add items by name. Local dependencies, such as the components inside a block, come along automatically:
npx shadcn@latest add @manicat/button @manicat/dialogEvery item also installs from its full URL, without touching components.json:
npx shadcn@latest add https://manicat.dev/r/button.jsonYour first install adds manicat-foundation, the design and motion tokens. Import it once at the root of your app:
// Next.js. On Vite, use src/main.tsx.
import "@/components/manicat/foundation.css";Setting up a new project
Next.js
npx create-next-app@latest my-app
cd my-app
npx shadcn@latest initAccept the default @/* import alias.
Vite
npm create vite@latest my-app -- --template react-ts
cd my-app
npx shadcn@latest initMap @/* to src in tsconfig.json and vite.config.ts, as shadcn expects:
{
"compilerOptions": {
"baseUrl": ".",
"paths": { "@/*": ["./src/*"] }
}
}import path from "node:path";
import react from "@vitejs/plugin-react";
import { defineConfig } from "vite";
export default defineConfig({
plugins: [react()],
resolve: { alias: { "@": path.resolve(__dirname, "./src") } },
});Copy and paste
- Install the shared packages:
npm install motion lucide-react. - Copy
registry/foundation.css,registry/motion-tokens.tsandlib/motion-tokens.tsfrom this repository into the same paths under your@/root, and import the CSS once at the root. - Copy the item's folder from
registry/components/<id>/orregistry/blocks/<id>/, keeping the path. Copied files keep this repository's layout and import each other through@/; the CLI install rewrites that for you. The item'spublic/r/<id>.jsonfile lists every file and npm package it needs.
Every item page here has a Manual tab with the exact files.
Usage
The CLI puts every file in a manicat/ folder under the components alias in your components.json, for
example components/manicat/button/button.tsx, or src/components/manicat/... in a src/ project or monorepo
package. Manicat UI files import each other with relative paths, so any alias setup works, and you can move the
manicat/ folder as a whole. Use them like any local component:
import { Button } from "@/components/manicat/button/button";
export default function Page() {
return <Button>Save changes</Button>;
}The code is yours: edit it, rename it, move it.
React Native and Vue
Ports install as separate items, named after the framework:
npx shadcn@latest add @manicat/button-react-native
npx shadcn@latest add @manicat/button-vueSee Frameworks, React Native and Vue for setup.
React Native and Vue
Ports install as separate items, named after the framework:
npx shadcn@latest add @manicat/button-react-native
npx shadcn@latest add @manicat/button-vueSee Frameworks, React Native and Vue for setup.
Troubleshooting
Cannot find module @/registry/.... Manicat UI files import each other through the @/* alias. Map it to
your project root in tsconfig.json, and in vite.config.ts for Vite.
Components render without styles or colors. Import the tokens once at the root:
import "@/components/manicat/foundation.css";. If the file is missing, run
npx shadcn@latest add @manicat/manicat-foundation.
The CLI says @manicat is an unknown registry. Add the registries entry to components.json, or install
from the full URL: npx shadcn@latest add https://manicat.dev/r/<id>.json.
Dark mode does not switch. Manicat UI follows the data-theme attribute on <html>, not the dark class.
Set data-theme="dark" before the page paints to avoid a flash of the light theme.
Animations do not play. Manicat UI honors the reduced motion setting of your operating system and swaps
movement for simple fades. Turn it off to see the full motion, and make sure motion is installed.