mcpField
P
panelui

panelui

github.com/panel-uiDesign & UI897184 installsUpdated today
Repository

About panelui

PanelUI is a React Native component library for Expo projects, aimed at developers building mobile interfaces with TypeScript. It provides over a hundred composable components, semantic theme tokens, and UI-thread animations; its CLI also offers an MCP server.

Key features

  1. 01100+ composable interface components
  2. 02Six light and dark themes
  3. 03Semantic styling tokens
  4. 04UI-thread animations with Reanimated
  5. 05CLI component source management

Use cases

  1. 01Build settings and form screens
  2. 02Compose chat and assistant interfaces
  3. 03Add charts and data displays
  4. 04Install or copy components into an app

MCP support

PanelUI's CLI includes an MCP server with six tools. It provides agent access to PanelUI component and project workflows.

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/panel-ui/panelui --skill panelui

After installing, type/paneluiin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

cli.md
components.md
components/
accordion.md
ai-input.md
alert.md
animated-badge.md
area-chart.md
attachment.md
avatar-cropper.md
avatar.md
badge.md
bar-chart.md
bottom-sheet.md
breadcrumb.md
bubble-chart.md
bump-chart.md
button-group.md
button.md
calendar.md
camera.md
candlestick-chart.md
card.md
carousel.md
checkbox.md
chip.md
circular-text.md
code-block.md
collapsible.md
color-picker.md
combobox.md

Details

From the project README

PanelUI

A React Native component library for Expo, styled with Tailwind CSS through Uniwind and animated on the UI thread with Reanimated. Pure TypeScript, no native modules, runs in Expo Go.

Run every CLI command with the project's own runner — npx panelui-cli@latest, pnpm dlx panelui-cli@latest or bunx panelui-cli@latest, matching its packageManager. Examples below use npx.

Is anything styled?

If the user says nothing is styled, className does nothing, the screen is blank, or Uniwind cannot find --color-background: go straight to setup.md. There is no error for this and it is a wrong path in metro.config.js almost every time. Do not start reading component code.

First, find out how this project consumes it

There are two ways in and they are both fully supported, so do not assume:

npx panelui-cli@latest mcp   # the MCP server, if the agent supports it

or, without MCP, read package.json and look for panelui.json:

What you findWhat it meansHow to import
panelui-native in dependenciesThe package. The default.import { Button } from 'panelui-native'
A panelui.jsonSource copied into the repo, owned and editableimport { Button } from '@/components/ui/button'
BothNormal — the package, with one component forkedWhichever the file is

If neither is there, the project has not installed it: npx create-panelui-app@latest for a new app, or setup.md for an existing one. Do not hand-write component source into a project that has not been set up — nothing will be styled, and the reason will not be obvious.

Principles

  1. Look before you build. components.md lists every one of them, and there are more than a hundred. Search it before writing custom UI — a "custom" sheet, picker, chart or chat transcript is almost always one that exists.
  2. Read the props from this skill, not from memory. Every component has a file at components/<slug>.md with its anatomy, every prop with its type and default, its variants and its parts, generated from the library's TypeScript. Read the one you are about to use. A remembered prop name usually is not right, and nothing here needs a network request.
  3. Compose the parts. A settings screen is Frame + Frame.Panel + Frame.Row. A chat is MessageScroller + Message. recipes.md has those screens written out. Reach for a compound part before a View.
  4. Never hardcode a colour. Every colour is a semantic token — bg-card, text-muted-foreground, border-border. A literal breaks all six themes at once.

Critical rules

Each links to a file with wrong/right pairs.

Styling → rules/styling.md
  • Semantic tokens only. bg-card, not bg-neutral-900. No dark: overrides — the token already knows, and dark: does not resolve at all inside the named themes.
  • gap-*, never space-y-*. React Native has no space-*.
  • className is for layout, not for restyling a component's colours or type.
  • cn() for conditional classes, not template-literal ternaries.
  • Resolve a dynamic colour with useCSSVariable, never by reading a hex out of the theme.
  • A new arbitrary value needs a restart. h-[330px] in a file a running dev server started before compiles to nothing — no error, no warning, the element silently loses the property.
Composition → rules/composition.md
  • PanelUIProvider at the root, exactly one. Overlays render into its portal host; without it Dialog, BottomSheet, Popover, Select and Toast mount and never appear.
  • Compound parts belong to their root. Card.Header inside Card, Select.Item inside Select.Content. Using one outside throws with the part's name.
  • Overlays take open + onOpenChange, or run uncontrolled with defaultOpen. Do not conditionally render an overlay to close it — it has an exit animation to finish.
  • A field is Field + Label + the control, not a View with a Text above it.
Animation → rules/animation.md
  • Reanimated 4 only. Never React Native's core Animated — the two do not compose, and core Animated puts the work back on the JS thread, which is the thing this library is for.
  • Shared values and useAnimatedStyle, not state in an animation loop.
  • tv() at module scope, never inside render.
Native controls → rules/native.md
  • "Native" means Liquid Glass on iOS. native alone is not enough — pass glass too.
  • A native control ignores className and every token. The platform owns its look; spacing has to come from the container.
  • Never host elements inside a labelled native button. It has no definite width, and the app dies in native code where a JS try cannot catch it.

The theme

Six themes in three families — Panel, Moon, Grass — each in light and dark. A family sets its own radius scale as well as its palette, so switching one changes the shape of the UI too. Switch at runtime with useThemeMode(); named themes have to be listed in extraThemes in metro.config.js first, and the dev server restarted. See theming.md.

Adding a component

npx panelui-cli@latest add bottom-sheet     # copies the source in
npx panelui-cli@latest list                 # everything available

Nothing to install when the project uses the package — import it and go. Full command reference in cli.md; the MCP server and its tools in mcp.md.

Which component

The full list, with a line on each and a link to its reference, is in components.md. The common cases:

NeedUse
An actionButton, or ButtonGroup for a segmented run or a split button
A panel from the bottom edgeBottomSheet
A modalDialog
A panel anchored to what opened itPopover, or Menu for a list of actions
A value picked from a listSelect, or Combobox when it needs filtering
A search over somethingSearchBar, whose results open above the field and above the keyboard
Text inInput, Textarea, InputGroup, NumberInput, OtpInput, TagInput
A date or a timeCalendar, DatePicker, TimePicker, DateTimePicker
Form state and validationForm + Field
A list rowItem, or Swipe when it has actions behind it
A settings screenFrame + Frame.Panel + Frame.Row
A metricKpi
A seriesLineChart, AreaChart, BarChart, PieChart, RingChart, and eleven more
A conversationMessageScroller + Message, with Marker between turns
Assistant outputResponse, Reasoning, Sources, Task, Plan, CodeBlock
LoadingSkeleton for layout, Spinner or Loader for work, Shimmer for streaming text
Nothing to showEmptyState
A transient messageToast
A hook, a utility, a primitivehooks.md

Detailed references

Everything above is in this folder. The documentation is also on the web, as markdown, if a page with every example is wanted: https://panelui.dev/llms.mdx/<group>/<slug>, indexed at https://panelui.dev/llms.txt.

Comments

Markdown supported