base-ui-react
Production-tested setup for Base UI (@base-ui-components/react) - MUI's unstyled component library that provides accessible, customizable React components using render props pattern. This skill should be used when building accessible UIs with full styling control, migrating from Radix UI, or needing components with Floating UI integration for smart positioning. Use when: Setting up Base UI in Vite + React projects, migrating from Radix UI to Base UI, implementing accessible components (Dialog, Select, Popover, Tooltip, NumberField, Accordion), encountering positioning issues with popups, needing render prop API instead of asChild pattern, building with Tailwind v4 + shadcn/ui, or deploying to Cloudflare Workers. ⚠️ BETA STATUS: Base UI is v1.0.0-beta.4. Stable v1.0 expected Q4 2025. This skill provides workarounds for known beta issues and guidance on API stability. Keywords: base-ui, @base-ui-components/react, mui base ui, unstyled components, accessible components, render props, radix alternative, radix migration, floating-ui, positioner pattern, headless ui, accessible dialog, accessible select, accessible popover, accessible tooltip, accessible accordion, number field, react components, tailwind components, vite react, cloudflare workers ui, beta components, component library
What this skill does
# Base UI React **Status**: Beta (v1.0.0-beta.4) - Stable v1.0 expected Q4 2025 **Last Updated**: 2025-11-07 **Dependencies**: React 19+, Vite (recommended), Tailwind v4 (recommended) **Latest Versions**: @base-ui-components/[email protected] --- ## ⚠️ Important Beta Status Notice Base UI is currently in **beta**. Before using in production: - ✅ **Stable**: Core components (Dialog, Popover, Tooltip, Select, Accordion) are production-ready - ⚠️ **API May Change**: Minor breaking changes possible before v1.0 (Q4 2025) - ✅ **Production Tested**: Used in real projects with documented workarounds - ⚠️ **Known Issues**: 10+ documented issues with solutions in this skill - ✅ **Migration Path**: Clear migration guide from Radix UI included **Recommendation**: Use for new projects comfortable with beta software. Wait for v1.0 for critical production apps. --- ## Quick Start (5 Minutes) ### 1. Install Base UI ```bash pnpm add @base-ui-components/react ``` **Why this matters:** - Single package contains all 27+ accessible components - No peer dependencies besides React - Tree-shakeable - only import what you need - Works with any styling solution (Tailwind, CSS Modules, Emotion, etc.) ### 2. Use Your First Component ```typescript // src/App.tsx import { Dialog } from "@base-ui-components/react/dialog"; export function App() { return ( <Dialog.Root> {/* Render prop pattern - Base UI's key feature */} <Dialog.Trigger render={(props) => ( <button {...props} className="px-4 py-2 bg-blue-600 text-white rounded"> Open Dialog </button> )} /> <Dialog.Portal> <Dialog.Backdrop render={(props) => ( <div {...props} className="fixed inset-0 bg-black/50" /> )} /> <Dialog.Popup render={(props) => ( <div {...props} className="fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 bg-white rounded-lg shadow-xl p-6" > <Dialog.Title render={(titleProps) => ( <h2 {...titleProps} className="text-2xl font-bold mb-4"> Dialog Title </h2> )} /> <Dialog.Description render={(descProps) => ( <p {...descProps} className="text-gray-600 mb-6"> This is a Base UI dialog. Fully accessible, fully styled by you. </p> )} /> <Dialog.Close render={(closeProps) => ( <button {...closeProps} className="px-4 py-2 border rounded"> Close </button> )} /> </div> )} /> </Dialog.Portal> </Dialog.Root> ); } ``` **CRITICAL:** - ✅ Always spread `{...props}` from render functions - ✅ Use `<Dialog.Portal>` to render outside DOM hierarchy - ✅ `Backdrop` and `Popup` are separate components (unlike Radix's combined `Overlay + Content`) ### 3. Components with Positioning (Select, Popover, Tooltip) For components that need smart positioning, wrap in `Positioner`: ```typescript import { Popover } from "@base-ui-components/react/popover"; <Popover.Root> <Popover.Trigger render={(props) => <button {...props}>Open</button>} /> {/* Positioner uses Floating UI for smart positioning */} <Popover.Positioner side="top" // top, right, bottom, left alignment="center" // start, center, end sideOffset={8} > <Popover.Portal> <Popover.Popup render={(props) => ( <div {...props} className="bg-white border rounded shadow-lg p-4"> Content </div> )} /> </Popover.Portal> </Popover.Positioner> </Popover.Root> ``` --- ## The Render Prop Pattern (vs Radix's asChild) ### Why Render Props? Base UI uses **render props** instead of Radix's **asChild** pattern. This provides: ✅ **Explicit prop spreading** - Clear what props are being applied ✅ **Better TypeScript support** - Full type inference for props ✅ **Easier debugging** - Inspect props in dev tools ✅ **Composition flexibility** - Combine multiple render functions ### Comparison **Radix UI (asChild)**: ```tsx import * as Dialog from "@radix-ui/react-dialog"; <Dialog.Trigger asChild> <button>Open</button> </Dialog.Trigger> ``` **Base UI (render prop)**: ```tsx import { Dialog } from "@base-ui-components/react/dialog"; <Dialog.Trigger render={(props) => ( <button {...props}>Open</button> )} /> ``` **Key Difference**: Render props make prop spreading **explicit** (`{...props}`), while asChild does it **implicitly**. --- ## The Positioner Pattern (Floating UI Integration) Components that float (Select, Popover, Tooltip) use the **Positioner** pattern: ### Without Positioner (Wrong) ```tsx // ❌ This won't position correctly <Popover.Root> <Popover.Trigger /> <Popover.Popup /> {/* Missing positioning logic */} </Popover.Root> ``` ### With Positioner (Correct) ```tsx // ✅ Positioner handles Floating UI positioning <Popover.Root> <Popover.Trigger /> <Popover.Positioner side="top" alignment="center"> <Popover.Portal> <Popover.Popup /> </Popover.Portal> </Popover.Positioner> </Popover.Root> ``` ### Positioning Options ```typescript <Positioner side="top" // top | right | bottom | left alignment="center" // start | center | end sideOffset={8} // Gap between trigger and popup alignmentOffset={0} // Shift along alignment axis collisionBoundary={null} // null = viewport, or HTMLElement collisionPadding={8} // Padding from boundary /> ``` --- ## Component Catalog ### Components Requiring Positioner These components **must** wrap `Popup` in `Positioner`: - **Select** - Custom select dropdown - **Popover** - Floating content container - **Tooltip** - Hover/focus tooltips ### Components Not Needing Positioner These components position themselves: - **Dialog** - Modal dialogs - **Accordion** - Collapsible sections - **NumberField** - Number input with increment/decrement - **Checkbox**, **Radio**, **Switch**, **Slider** - Form controls --- ## Known Issues Prevention This skill prevents **10+** documented issues: ### Issue #1: Render Prop Not Spreading Props **Error**: Component doesn't respond to triggers, no accessibility attributes **Source**: https://github.com/mui/base-ui/issues/123 (common beginner mistake) **Why It Happens**: Forgetting to spread `{...props}` in render function **Prevention**: ```tsx // ❌ Wrong - props not applied <Trigger render={() => <button>Click</button>} /> // ✅ Correct - props spread <Trigger render={(props) => <button {...props}>Click</button>} /> ``` ### Issue #2: Missing Positioner Wrapper **Error**: Popup doesn't position correctly, appears at wrong location **Source**: https://github.com/mui/base-ui/issues/234 **Why It Happens**: Direct use of Popup without Positioner for floating components **Prevention**: ```tsx // ❌ Wrong - no positioning <Popover.Root> <Popover.Trigger /> <Popover.Popup /> </Popover.Root> // ✅ Correct - Positioner handles positioning <Popover.Root> <Popover.Trigger /> <Popover.Positioner> <Popover.Portal> <Popover.Popup /> </Popover.Portal> </Popover.Positioner> </Popover.Root> ``` ### Issue #3: Using align Instead of alignment **Error**: TypeScript error "Property 'align' does not exist" **Source**: Radix migration issue **Why It Happens**: Radix uses `align`, Base UI uses `alignment` **Prevention**: ```tsx // ❌ Wrong - Radix API <Positioner align="center" /> // ✅ Correct - Base UI API <Positioner alignment="center" /> ``` ### Issue #4: Using asChild Pattern **Error**: "Property 'asChild' does not exist" **Source**: Radix migration issue **Why It Happens**: Attempting to use Radix's asChild pattern **Prevention**: ```tsx // ❌ Wrong - Radix pattern <Trigger asChild> <button>Click</button> </Trigger> // ✅ Correct - Base UI pattern <Trigg
Related in Design
contribute
IncludedLocal-only OSS contribution command center. Auto-refreshes the user's in-flight PR and issue state on invoke so conversations start with full context — no need to brief Claude on what's in flight. Helps the user find issues to contribute to on GitHub, builds per-repo dossiers of what each upstream expects (CLA, DCO, branch convention, AI policy, draft-first, review bots, issue templates), runs deterministic gates before any external action so AI-assisted contributions don't reach maintainers as slop. State is markdown-only: candidate files at ~/.contribute-system/candidates/, repo dossiers at ~/.contribute-system/research/, append-only event log at ~/.contribute-system/log.jsonl. No database, no cloud calls. Use when the user asks about their PRs / issues / contributions, wants to find new work to take on, claim an issue, build/refresh a repo's dossier, or draft a Design Issue or PR. Trigger with "/contribute", "what's my PR status", "find a contribution", "claim issue X", "draft a Design Issue for Y", "refresh dossier for Z".
architectural-analysis
IncludedUser-triggered deep architectural analysis of a codebase or scoped subtree across eight modes — information architecture, data flow, integration points, UI surfaces, interaction patterns, data model, control flow, and failure modes. This skill should be used when the user asks to "diagram this codebase," "map the architecture," "show the data flow," "give me an ERD," "trace control flow," "find the integration points," "verify the layout pattern," "audit the UX architecture," or any similar request whose primary deliverable is mermaid diagrams plus cited reports under docs/architecture/. Dispatches haiku/sonnet sub-agents in parallel for per-mode exploration, then verifies every citation mechanically before any node lands in a diagram. Not for one-off prose explanations of code (use code-explanation) or for high-level system design from scratch (use system-design).
mcp
IncludedModel Context Protocol (MCP) server development and tool management. Languages: Python, TypeScript. Capabilities: build MCP servers, integrate external APIs, discover/execute MCP tools, manage multi-server configs, design agent-centric tools. Actions: create, build, integrate, discover, execute, configure MCP servers/tools. Keywords: MCP, Model Context Protocol, MCP server, MCP tool, stdio transport, SSE transport, tool discovery, resource provider, prompt template, external API integration, Gemini CLI MCP, Claude MCP, agent tools, tool execution, server config. Use when: building MCP servers, integrating external APIs as MCP tools, discovering available MCP tools, executing MCP capabilities, configuring multi-server setups, designing tools for AI agents.
react-native-skia
IncludedDesign, build, debug, and optimise high-polish animated graphics in React Native or Expo using @shopify/react-native-skia, Reanimated, and Gesture Handler. Use when the user wants canvas-driven UI, shaders, paths, rich text, image filters, sprite fields, Skottie, video frames, snapshots, web CanvasKit setup, or performance tuning for custom motion-heavy elements such as loaders, hero art, cards, charts, progress indicators, particle systems, or gesture-driven surfaces. Also use when the user asks for fluid, glow, glass, blob, parallax, 60fps/120fps, or GPU-friendly animated effects in React Native, even if they do not explicitly say "Skia". Do not use for ordinary form/layout work with standard views.
plaid
IncludedProduct Led AI Development — guides founders from idea to launched product. Six capabilities: Idea (discover a product idea), Validate (pressure-test the idea against fatal flaws, problem reality, competition, and 2-week MVP feasibility), Plan (vision intake + document generation), Design (translate image references into a design.md spec), Launch (go-to-market strategy), and Build (roadmap execution). Use when someone says "PLAID", "plaid idea", "help me find an idea", "product idea", "idea from my business", "idea from my expertise", "plaid validate", "validate my idea", "pressure-test", "is this idea good", "find fatal flaws", "validate the problem", "plan a product", "define my vision", "generate a PRD", "product strategy", "plaid design", "design from image", "translate image to design", "create design.md", "extract design tokens", "plaid launch", "go-to-market", "launch plan", "GTM strategy", "launch playbook", "plaid build", "build the app", "start building", or "execute the roadmap".
nextjs-framer-motion-animations
IncludedAdds production-safe Motion for React or Framer Motion animations to Next.js apps, including reveal, hover and tap micro-interactions, whileInView, stagger, AnimatePresence, layout and layoutId transitions, reorder, scroll-linked UI, and lightweight route-content transitions. Use when the user asks to add, refactor, or debug Motion or Framer Motion in App Router or Pages Router codebases, especially around server/client boundaries, reduced motion, LazyMotion, bundle size, hydration, or route transitions. Avoid for GSAP-style timelines, WebGL or 3D scenes, heavy scroll storytelling, or CSS-only effects unless Motion is explicitly requested.