Build FiftyOne UIs using VOODO (Voxel Official Design Ontology), the official React component library. Use when building plugin panels, creating interactive UIs, or styling FiftyOne applications...
VOODO (@voxel51/voodo) is the official React component library for FiftyOne applications. Source: https://github.com/voxel51/design-system
ALWAYS fetch the LLM reference BEFORE writing any UI code:
WebFetch(
url="https://voodo.dev.fiftyone.ai/voodo-llm-reference.md",
prompt="Read the complete VOODO component API, design tokens, and composition patterns"
)
This gives you:
WebFetch(
url="https://voodo.dev.fiftyone.ai/voodo-llm-reference.md",
prompt="What VOODO components and tokens are available for building [describe UI]?"
)
Always import from @voxel51/voodo. Always use enum values — never pass raw strings.
import { Button, Input, Stack, Text, FormField } from "@voxel51/voodo";
import { Orientation, Size, Spacing, Variant, TextColor } from "@voxel51/voodo";
The reference includes patterns for:
<FormField>, group with <FormFieldGroup><Stack> with orientation, spacing, align, justify props — not Tailwind flex classes<Card> / <RichCard> for contained contentDescriptor<T>[] pattern with <RichList> or <RichButtonGroup><Toast>, <Tooltip>, <EmptyState>{
"dependencies": {
"@voxel51/voodo": "latest"
}
}
Import the theme CSS in your app entry point:
import "@voxel51/voodo/theme.css";
Variant.Success, Variant.Danger, Variant.Secondary for actionsSpacing.Md, Size.Sm) — never arbitrary CSS values<Stack> with align and justify props instead of Tailwind items-* / justify-* classesimport { useRecoilValue } from "recoil";
import * as fos from "@fiftyone/state"; // Standard FiftyOne alias
import { Button, Text, Stack, FormField, Input } from "@voxel51/voodo";
import { Orientation, Spacing, Size, Variant, TextColor } from "@voxel51/voodo";
const MyPanel: React.FC = () => {
const dataset = useRecoilValue(fos.dataset);
return (
<Stack orientation={Orientation.Column} spacing={Spacing.Md}>
<Text color={TextColor.Secondary}>{dataset?.name}</Text>
<FormField
label="Filter"
control={<Input size={Size.Sm} placeholder="Search..." />}
/>
<Button variant={Variant.Primary} size={Size.Sm}>
Process
</Button>
</Stack>
);
};
| Resource | URL |
|---|---|
| LLM Reference (fetch first) | https://voodo.dev.fiftyone.ai/voodo-llm-reference.md |
| Source repo | https://github.com/voxel51/design-system |
| Interactive Storybook | https://voodo.dev.fiftyone.ai/ |
| npm package | @voxel51/voodo |
Related: Use fiftyone-develop-plugin skill for full plugin setup.
| Problem | Solution |
|---|---|
| Component not found | Fetch the LLM reference to verify current component name |
| Wrong prop value | Use enum members (e.g. Size.Md), not strings (e.g. "md") |
| Layout not working | Use <Stack> with orientation, spacing, align, justify props |
| Styles not applying | Ensure @voxel51/voodo/theme.css is imported; test in dark mode |