Use Onycx UI
Browse 62 React components, try them with your own settings, and add the ones you need to your project.
Requirements
- Start with a React 19 project that supports TypeScript.
- Set up Tailwind CSS v4 so it picks up classes in your component files.
- Check the component’s installation section for extra packages such as GSAP, Motion, or Lenis.
Install a component
Copy a customized component
- Open a component and use Customize to try your settings in the preview.
- Install any packages listed under Installation.
- In Code, open the component’s TSX tab and copy it into your project. The file includes your settings as prop defaults.
- Open Usage for an import and JSX example. Adjust the import to match where you saved the file.
import { PillIconButton } from "@/components/onycx/pill-icon-button";export default function Example() { return <PillIconButton label="Explore the catalog" href="/catalog" />;}Install with shadcn
If your project already uses shadcn, run the command from the component’s installation section to add its default source. Here’s the command for Pill Icon Button.
npx shadcn@latest add https://ui.onycx.dev/r/pill-icon-button.jsonFind the full list of installable components in /r/registry.json.
Fonts
Components inherit your page font. To match the previews, the optional Next.js example below loads Inter for body text and Bodoni Moda for serif accents.
@import "tailwindcss";:root { /* Onycx components read these with safe fallbacks. */ /* Italic accent words. Swap in any serif you like, e.g. Playfair Display or Fraunces. */ --font-serif-accent: var(--font-bodoni), "Bodoni Moda", Didot, Georgia, serif;}body { font-family: var(--font-inter), system-ui, sans-serif; }import { Inter, Bodoni_Moda } from "next/font/google";import "./globals.css";const sans = Inter({ subsets: ["latin"], variable: "--font-inter" });const accent = Bodoni_Moda({ subsets: ["latin"], style: ["normal", "italic"], variable: "--font-bodoni" });export default function RootLayout({ children }: { children: React.ReactNode }) { return ( <html lang="en" className={`${sans.variable} ${accent.variable}`}> <body>{children}</body> </html> );}Smooth scroll
Scroll scenes use GSAP ScrollTrigger and work with native scrolling. If you want inertial wheel scrolling, mount Smooth Scroll once in your layout. It feeds Lenis into the GSAP ticker so every scene reads one clock, keeps native momentum on touch devices and stops entirely for reduced-motion visitors. Never mount two smooth-scroll engines.
Reduced motion
Many animated components check prefers-reduced-motion. Pinned scenes switch to stacked or click-through layouts, scrubs and parallax stop, loaders are skipped and marquees sit still. The catalog and docs are readable without JavaScript. Interactive previews need JavaScript. Pair this with the Motion Toggle to give visitors an on-page switch.
Testing different screen sizes
Type uses clamp(), grids use minmax(0, 1fr), and components that live in unknown widths measure their own container. Pinned and sticky scenes only engage above a minimum width and height, so short laptop screens and phones get a layout that scrolls normally. Use the workbench's desktop, tablet and phone frames to check your tweaks.
Accessibility
Buttons act and links navigate. Toggles use aria-pressed, tab sets support arrow keys, dialogs trap and return focus, carousels announce their position through live regions, and inactive scenes are inert. Aim for touch targets of at least 44px in the finished interface. Automated checks are a first pass; test with a keyboard and a screen reader in your own content.
Images and licenses
Copied files use embedded sample illustrations. Supply your own media URLs for production, including a video source if you use Framed Video Hero. The component source is MIT licensed.