
Installs all 112 components. Without our CLI, run instead.
mischief publishes a shadcn registry at ui.tinkererslabs.com, with 112 components installable through the shadcn CLI.
Copy a prompt for your agent, copy the install command, or open the docs that ship it.
Mischief
Good interfaces deserve a little mischief.
Browse the live components and documentation at ui.tinkererslabs.com.
Mischief is a small collection of playful, production-ready React components. The components use Base UI where behavior is complex, Tailwind CSS for styling, and shadcn theme tokens so they fit the project that receives them.
Install the catalog as an agent skill:
npx skills add Tinkerers-Labs/mischief-ui --skill mischief-ui
Then ask for what you need:
Use $mischief-ui to add the impossible-checkbox component to this project.
Mischief is a public GitHub registry for shadcn CLI v4. Install a component directly from this repository:
npx shadcn@latest add Tinkerers-Labs/mischief-ui/magnetic-tabs
npx shadcn@latest add Tinkerers-Labs/mischief-ui/conversation
npx shadcn@latest add Tinkerers-Labs/mischief-ui/questionnaire
npx shadcn@latest add Tinkerers-Labs/mischief-ui/redaction
Every component is listed at ui.tinkererslabs.com, and each page carries the command for it.
Use pnpm dlx, yarn dlx, or bunx if that is what your project uses. The shadcn CLI reads components.json and places the source in the configured UI directory.
Mischief is also available as mischief-ui:
npm install mischief-ui
Import mischief-ui/styles.css in your Tailwind CSS entry file, then use a direct entry such as mischief-ui/magnetic-tabs. The root export remains available when one import path is more convenient. The registry remains the recommended path when you want to own and adapt the source.
import { MagneticTabs } from "@/components/ui/magnetic-tabs"
const items = [
{ value: "overview", label: "Overview", content: Ready to go. },
{ value: "activity", label: "Activity", content: No new activity. },
]
export function Example() {
return
}
The component supports controlled and uncontrolled selection through value, defaultValue, and onValueChange.
import { ElasticSlider } from "@/components/ui/elastic-slider"
export function Example() {
return
}
Use value and onValueChange for a controlled slider. min, max, step, formatValue, and onValueCommitted are available for common form needs.
import { HoldButton } from "@/components/ui/hold-button"
export function Example() {
return (
Hold to remove download
)
}
Pointer users hold for 900ms by default. Keyboard and assistive technology users activate the native button once. Set duration to change the hold time, with a minimum of 500ms.
import { SignatureFooter } from "@/components/ui/signature-footer"
export function Footer() {
return (
...}
brand={Northstar}
wordmark="Northstar"
/>
)
}
Pass ordinary React nodes for the action, navigation, compact brand, and metadata. The footer owns the composition while your app owns its links and language.
import { ImpossibleCheckbox } from "@/components/ui/impossible-checkbox"
export function Demo() {
return
}
The bear always turns it back off. Use it for demos and harmless jokes, never for consent or a setting someone needs to change.
import { FloatingIndex } from "@/components/ui/floating-index"
const items = [
{ id: "introduction", label: "Introduction" },
{ id: "details", label: "Details" },
{ id: "examples", label: "Examples" },
]
export function PageIndex() {
return
}
The index tracks page progress and the active section. Pass containerRef when the content scrolls inside an element instead of the page.
import { Apple } from "lucide-react"
import { ShiftButton } from "@/components/ui/shift-button"
export function DownloadButton() {
return (
}
leadingIcon={}
>
Download for Mac
)
}
The component uses Base UI so the same interaction can remain a button or render as a real link.
import { ScrollToTopButton } from "@/components/ui/scroll-to-top-button"
export function LongPage() {
return (
<>
{/* Long page content */}
</>
)
}
Pass containerRef to target a scroll area instead of the page. The button appears after scrolling down and switches to immediate scrolling when reduced motion is preferred.
import { AskAi } from "@/components/ui/ask-ai"
const prompt =
"Explain Acme using current sources. Cite claims and flag anything unverified."
export function AskAboutAcme() {
return
}
The default destinations are ChatGPT, Claude, Perplexity, and Grok. Pass targets to provide another set. The copy action keeps the same prompt available for any other assistant.
import { FileUpload } from "@/components/ui/file-upload"
export function Attachments() {
return
}
The component validates file type, size, count, and duplicates before adding anything to its queue. Pass uploadFile to connect storage and enable progress, cancel, and retry behavior. Its return value is stored on the completed entry and passed to onUploadComplete. Use value and onValueChange when the queue belongs to application state.
Repeat file type, size, and authorization checks on the server. Browser validation is user feedback, not a security boundary.
import { FileThumbnail } from "@/components/ui/file-thumbnail"
export function Preview() {
return
}
Pass a browser image File to preview it directly, or use previewImageUrl for an image that already lives elsewhere. Loading and failed images have clear fallback states.
import { ImageGallery } from "@/components/ui/image-gallery"
const images = [
{
id: "studio",
src: "/photos/studio.jpg",
alt: "Sunlight across the studio table",
width: 1600,
height: 1200,
caption: "The studio",
},
]
export function WorkGallery() {
return
}
The lightbox traps focus, locks page scroll, restores focus on close, and supports Left Arrow, Right Arrow, and Escape.
For reproducible GitHub installs, append a release tag or full commit SHA to the item address. Unpinned commands intentionally install the current version from main.
Use Node 24 or any supported Node release from 20.18.1 onward.
pnpm install
pnpm dev
Before committing:
pnpm check
The check formats, lints, type-checks, validates the registry build, and creates a production Next.js build.
Read DESIGN.md before changing the interface or its copy. Read CONTRIBUTING.md before opening a pull request.
MIT
The packages and primitives its components pull in, counted across the registry.
Every appearance and removal our crawl has seen in the registry index.
mischief is a component library on 21st.dev by tinkerers-labs with 3 public React components. Every component ships with a live interactive preview and full TSX source — copy the code, install it through the shadcn CLI, or pull it into Cursor or Claude Code over MCP.