Getting started
ui.particular.tech is a shadcn registry. You copy components into your project with the shadcn CLI and own the code from then on. Every item is built on Base UI and styled by the Particular.Tech theme.
Start from a shadcn project
Any React 19 app with Tailwind CSS v4 works; the examples assume Next.js App Router. Initialize shadcn with the Base UI component library.
npx shadcn@latest init -b base -p novaRegister the @particular namespace
Items reference each other as @particular/…, so the namespace has to be known before the first install.
npx shadcn@latest registry add @particular=https://ui.particular.tech/r/{name}.jsonThis writes the following to components.json:
{
"registries": {
"@particular": "https://ui.particular.tech/r/{name}.json"
}
}Install the theme and providers
The theme sets every color token for light and dark mode, the fonts, and the radius. Providers wires up theme switching, tooltips, and toasts.
npx shadcn@latest add @particular/theme @particular/providersLoad Geist and wrap your app
The theme reads --font-geist-sans and --font-geist-mono and falls back to system fonts.
import { Geist, Geist_Mono } from "next/font/google"
import { Providers } from "@/components/providers"
import "./globals.css"
const geistSans = Geist({ variable: "--font-geist-sans", subsets: ["latin"] })
const geistMono = Geist_Mono({ variable: "--font-geist-mono", subsets: ["latin"] })
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en" suppressHydrationWarning className={`${geistSans.variable} ${geistMono.variable} antialiased`}>
<body>
<Providers>{children}</Providers>
</body>
</html>
)
}Add components
Add what you need, or everything at once with @particular/all. Each item pulls in the registry items and npm packages it depends on.
npx shadcn@latest add @particular/button @particular/status-indicator @particular/log-viewerBrowse the components and blocks. Blocks install as components under components/; you render them from your own pages and pass data and callbacks as props.
Updating
Installed files are yours. To pull a newer version of an item, re-run the add command with --overwrite and review the diff, or preview it first with --diff.
npx shadcn@latest add @particular/button --diff