Component Demo Skill
This skill guides the creation and maintenance of components and their demo pages in the Protobox component showcase.
When to Use This Skill
Use this skill when:
- Creating new custom components in
src/components/
- Creating new custom hooks in
src/hooks/
- Updating existing components or hooks
- Planning feature additions that involve reusable components
Component Development Workflow
Phase 1: Planning - Ask About Demo Pages
IMPORTANT: When planning to create a new component or hook, ALWAYS ask the user:
"Would you like me to create a demo page for this [component/hook] in the component showcase?"
Options to present:
- Yes, create demo page - Create both the component and a showcase demo
- Yes, standalone demo - Create component and a standalone demo page at
/[name]-demo
- Yes, playground - Create an interactive playground with props controls (Storybook-like)
- No demo needed - Just create the component/hook
Phase 2: Component Creation
Create the component in the appropriate location:
- Custom components:
src/components/[ComponentName].tsx
- Custom hooks:
src/hooks/[hookName].tsx
- UI components: Use
npx shadcn-ui@latest add [component] for shadcn components
Follow component best practices from src/components/README.md:
- Simple default usage with sensible defaults
- Accept
style, className, and native element props
- Use composition for icons (via props, not hardcoded)
- Standard heights: 16px, 20px, 40px
- Support dark mode with Tailwind
dark: variants
Phase 3: Demo Page Creation (if requested)
A. For Component Showcase (/components/[name])
Create Content Component in src/components/DemoShowcase/[Name]Content.tsx:
- Extract core demo functionality without page wrappers
- Remove:
min-h-screen, full-page padding, headers, back links
- Keep: interactive elements, controls, examples
- Use Card components to organize examples
- Include usage code examples
Register in Demo Registry (src/components/DemoShowcase/demoRegistry.tsx):
// Add lazy import
const [Name]Content = lazy(() => import('./[Name]Content'))
// Add to DEMO_REGISTRY array
{
id: '[name]',
label: '[Display Name]',
section: 'Hooks' | 'Components',
component: [Name]Content,
description: 'Brief description',
path: '/components/[name]',
}
Add Route in src/App.tsx:
// Add lazy import at top
const [Name]Content = lazy(() => import('./components/DemoShowcase/[Name]Content'))
// Add route inside <Route path="/components"> nested routes
<Route
path="[name]"
element={
<Suspense fallback={<div>Loading...</div>}>
<[Name]Content />
</Suspense>
}
/>
B. For Standalone Demo Page (/[name]-demo)
Create Page Component in src/pages/[Name]Demo.tsx:
- Include full-page wrapper with proper styling
- Add header with title and description
- Organize examples using Card components
- Include code examples showing usage
- Add back link to home
Add Route in src/App.tsx:
import [Name]Demo from './pages/[Name]Demo'
<Route path="/[name]-demo" Component={[Name]Demo} />
C. For Component Playground (/components/[name]-playground)
Playgrounds provide an interactive, Storybook-like environment with a canvas and props controls.
Analyze Component Props:
- Read the target component's source file
- Parse the TypeScript Props interface
- Categorize props as controllable or complex
Guide Prop Selection - Present to User:
"I analyzed [ComponentName] and found these props:
Recommended for playground (controllable):
variant: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link'
size: 'default' | 'sm' | 'lg' | 'icon'
disabled: boolean
Complex props (not controllable):
onClick: function
asChild: boolean (affects render behavior)
ref: React ref
Which props would you like to expose in the playground?"
Create Playground Content in src/components/DemoShowcase/[Name]PlaygroundContent.tsx:
import PlaygroundCanvas, { PropSchema } from './PlaygroundCanvas'
import { Button } from '@/components/ui/button'
const propSchema: PropSchema = {
variant: {
type: 'select',
options: ['default', 'destructive', 'outline', 'secondary', 'ghost', 'link'],
defaultValue: 'default',
},
size: {
type: 'select',
options: ['default', 'sm', 'lg', 'icon'],
defaultValue: 'default',
},
disabled: {
type: 'boolean',
defaultValue: false,
},
children: {
type: 'string',
defaultValue: 'Button',
},
}
export default function ButtonPlaygroundContent() {
return (
<PlaygroundCanvas
componentName="Button"
propSchema={propSchema}
defaultProps={{ children: 'Click Me' }}
>
{(props) => <Button {...props}>{props.children as string}</Button>}
</PlaygroundCanvas>
)
}
Register in Demo Registry (src/components/DemoShowcase/demoRegistry.tsx):
// Add lazy import
const [Name]PlaygroundContent = lazy(() => import('./[Name]PlaygroundContent'))
// Add to DEMO_REGISTRY array
{
id: '[name]-playground',
label: '[Name] Playground',
section: 'Components',
component: [Name]PlaygroundContent,
description: 'Interactive playground for [Name]',
path: '/components/[name]-playground',
type: 'playground',
}
Add Route in src/App.tsx:
const [Name]PlaygroundContent = lazy(() => import('./components/DemoShowcase/[Name]PlaygroundContent'))
<Route
path="[name]-playground"
element={
<Suspense fallback={<div>Loading...</div>}>
<[Name]PlaygroundContent />
</Suspense>
}
/>
Prop Type Mapping Reference
When analyzing TypeScript props, map types to Leva controls:
| TypeScript Type |
PropSchema Type |
Notes |
string |
'string' |
Text input |
number |
'number' |
Slider (add min/max/step) |
boolean |
'boolean' |
Checkbox toggle |
'a' | 'b' | 'c' |
'select' |
Dropdown with options array |
enum Foo { A, B } |
'select' |
Extract enum values as options |
React.ReactNode |
'string' |
For simple text children |
| Color strings |
'color' |
Color picker |
() => void |
Skip |
Not controllable |
| Complex objects |
Skip |
Not controllable |
React.Ref |
Skip |
Not controllable |
PropSchema Format
import { PropSchema } from '@/components/DemoShowcase/PlaygroundCanvas'
const schema: PropSchema = {
propName: {
type: 'string' | 'number' | 'boolean' | 'select' | 'color',
label?: string, // Custom label (defaults to propName)
defaultValue?: unknown, // Initial value
options?: string[], // For 'select' type
min?: number, // For 'number' type
max?: number, // For 'number' type
step?: number, // For 'number' type
}
}
Phase 4: Component Updates - Check for Existing Demos
CRITICAL: When updating an existing component or hook, ALWAYS check if demo pages exist:
Search for Demo Pages:
- Check
src/components/DemoShowcase/ for [Name]Content.tsx or [Name]PlaygroundContent.tsx
- Check
src/pages/ for [Name]Demo.tsx
- Check
demoRegistry.tsx for entries (including type: 'playground')
If Demo Pages Exist:
- Update them to reflect new functionality
- Add examples demonstrating new features
- Update code examples
- Test that demos still work correctly
Prompt User:
"I found existing demo pages for this [component/hook]. I'll update them to include the new [feature/changes]."
Demo Content Best Practices
Structure
Organize demo content with clear sections:
<div className="space-y-8">
{/* Example 1: Basic Usage */}
<Card className="p-6 space-y-3">
<div className="flex items-center gap-2">
<Badge variant="secondary">Basic</Badge>
<span className="text-xs text-zinc-500 dark:text-zinc-400">
Configuration details
</span>
</div>
{/* Demo content */}
</Card>
{/* More examples... */}
{/* Code Example */}
<Card className="p-6 space-y-3 bg-zinc-50 dark:bg-zinc-900">
<Badge variant="outline">Usage Example</Badge>
<pre className="text-xs text-zinc-700 dark:text-zinc-300 overflow-x-auto">
<code>{`// Code example here`}</code>
</pre>
</Card>
</div>
Example Categories
Include diverse examples:
- Basic - Simple default usage
- Advanced - Complex configurations
- Interactive - User-controlled examples
- Variants - Different visual styles or behaviors
- Edge Cases - Boundary conditions
- Code Examples - Implementation snippets
Styling
- Use Card components for grouping examples
- Add Badge components for labeling examples
- Include configuration details in muted text
- Support dark mode throughout
- Add visual indicators for interactive elements
- Show state changes clearly
Component Showcase Navigation
The navigation is automatically generated from demoRegistry.tsx:
- Hooks section: Custom React hooks
- Components section: UI components, libraries, demos
Demos are displayed in the order they appear in DEMO_REGISTRY.
Testing Checklist
After creating or updating component demos:
Additional Checks for Playgrounds
Examples
Example 1: Creating a New Hook with Demo
User: "Create a useDebounce hook"
Claude:
1. Asks: "Would you like me to create a demo page for this hook in the component showcase?"
2. User selects: "Yes, create demo page"
3. Creates:
- src/hooks/useDebounce.tsx (the hook)
- src/components/DemoShowcase/DebounceContent.tsx (demo)
- Updates demoRegistry.tsx
- Updates App.tsx with route
Example 2: Updating Existing Component
User: "Add a 'size' prop to the Button component"
Claude:
1. Searches for existing demos
2. Finds: N/A (Button is shadcn component, no custom demo)
3. Updates Button usage examples in existing demos if needed
Example 3: Updating Hook with Demo
User: "Add a 'delay' option to useTypewriter"
Claude:
1. Updates src/hooks/useTypewriter.tsx
2. Searches and finds: src/components/DemoShowcase/TypewriterContent.tsx
3. Announces: "I found the existing TypewriterContent demo. I'll add an example showing the new delay option."
4. Adds new Card with delay example
5. Updates code example to include delay option
Example 4: Creating a Component Playground
User: "Create a playground for the Badge component"
Claude:
1. Asks: "Would you like me to create a demo page for this component?"
2. User selects: "Yes, playground"
3. Claude reads src/components/ui/badge.tsx
4. Analyzes BadgeProps interface and presents:
"I found these props:
**Controllable:**
- variant: 'default' | 'secondary' | 'destructive' | 'outline'
- children: ReactNode (as string)
**Not controllable:**
- className: styling (skip)
Which props would you like to expose?"
5. User selects: "variant and children"
6. Creates:
- src/components/DemoShowcase/BadgePlaygroundContent.tsx
- Updates demoRegistry.tsx with type: 'playground'
- Updates App.tsx with route
File Locations Reference
- Component showcase layout:
src/pages/ComponentShowcase.tsx
- Demo registry:
src/components/DemoShowcase/demoRegistry.tsx
- Navigation:
src/components/DemoShowcase/DemoNavigation.tsx
- Demo content:
src/components/DemoShowcase/[Name]Content.tsx
- Playground content:
src/components/DemoShowcase/[Name]PlaygroundContent.tsx
- Playground canvas:
src/components/DemoShowcase/PlaygroundCanvas.tsx
- Standalone demos:
src/pages/[Name]Demo.tsx
- Routes:
src/App.tsx
Key Principles
- Always ask - Don't assume whether demos are wanted
- Always search - Check for existing demos before updating
- Keep demos updated - When components change, demos should reflect it
- Provide variety - Show multiple use cases, not just basic usage
- Make it interactive - Let users experiment with controls
- Include code - Show implementation examples
- Support dark mode - Test in both themes
- Organize clearly - Use consistent structure across demos
1---2name: component-demo3description: Create demonstration pages for components and hooks.4license: Proprietary5---6
7# Component Demo Skill
8
9This skill guides the creation and maintenance of components and their demo pages in the Protobox component showcase.
10
11## When to Use This Skill
12
13Use this skill when:
14- Creating new custom components in `src/components/`
15- Creating new custom hooks in `src/hooks/`
16- Updating existing components or hooks
17- Planning feature additions that involve reusable components
18
19## Component Development Workflow
20
21### Phase 1: Planning - Ask About Demo Pages
22
23**IMPORTANT:** When planning to create a new component or hook, ALWAYS ask the user:
24
25> "Would you like me to create a demo page for this [component/hook] in the component showcase?"
26
27Options to present:
281. **Yes, create demo page** - Create both the component and a showcase demo
292. **Yes, standalone demo** - Create component and a standalone demo page at `/[name]-demo`
303. **Yes, playground** - Create an interactive playground with props controls (Storybook-like)
314. **No demo needed** - Just create the component/hook
32
33### Phase 2: Component Creation
34
35Create the component in the appropriate location:
36- Custom components: `src/components/[ComponentName].tsx`
37- Custom hooks: `src/hooks/[hookName].tsx`
38- UI components: Use `npx shadcn-ui@latest add [component]` for shadcn components
39
40Follow component best practices from `src/components/README.md`:
41- Simple default usage with sensible defaults
42- Accept `style`, `className`, and native element props
43- Use composition for icons (via props, not hardcoded)
44- Standard heights: 16px, 20px, 40px
45- Support dark mode with Tailwind `dark:` variants
46
47### Phase 3: Demo Page Creation (if requested)
48
49#### A. For Component Showcase (`/components/[name]`)
50
511. **Create Content Component** in `src/components/DemoShowcase/[Name]Content.tsx`:
52 - Extract core demo functionality without page wrappers
53 - Remove: `min-h-screen`, full-page padding, headers, back links
54 - Keep: interactive elements, controls, examples
55 - Use Card components to organize examples
56 - Include usage code examples
57
582. **Register in Demo Registry** (`src/components/DemoShowcase/demoRegistry.tsx`):
59 ```tsx
60 // Add lazy import
61 const [Name]Content = lazy(() => import('./[Name]Content'))
62
63 // Add to DEMO_REGISTRY array
64 {
65 id: '[name]',
66 label: '[Display Name]',
67 section: 'Hooks' | 'Components',
68 component: [Name]Content,
69 description: 'Brief description',
70 path: '/components/[name]',
71 }
72 ```
73
743. **Add Route** in `src/App.tsx`:
75 ```tsx
76 // Add lazy import at top
77 const [Name]Content = lazy(() => import('./components/DemoShowcase/[Name]Content'))
78
79 // Add route inside <Route path="/components"> nested routes
80 <Route
81 path="[name]"
82 element={
83 <Suspense fallback={<div>Loading...</div>}>
84 <[Name]Content />
85 </Suspense>
86 }
87 />
88 ```
89
90#### B. For Standalone Demo Page (`/[name]-demo`)
91
921. **Create Page Component** in `src/pages/[Name]Demo.tsx`:
93 - Include full-page wrapper with proper styling
94 - Add header with title and description
95 - Organize examples using Card components
96 - Include code examples showing usage
97 - Add back link to home
98
992. **Add Route** in `src/App.tsx`:
100 ```tsx
101 import [Name]Demo from './pages/[Name]Demo'
102
103 <Route path="/[name]-demo" Component={[Name]Demo} />
104 ```
105
106#### C. For Component Playground (`/components/[name]-playground`)
107
108Playgrounds provide an interactive, Storybook-like environment with a canvas and props controls.
109
1101. **Analyze Component Props:**
111 - Read the target component's source file
112 - Parse the TypeScript Props interface
113 - Categorize props as controllable or complex
114
1152. **Guide Prop Selection - Present to User:**
116 > "I analyzed [ComponentName] and found these props:
117 >
118 > **Recommended for playground (controllable):**
119 > - `variant`: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link'
120 > - `size`: 'default' | 'sm' | 'lg' | 'icon'
121 > - `disabled`: boolean
122 >
123 > **Complex props (not controllable):**
124 > - `onClick`: function
125 > - `asChild`: boolean (affects render behavior)
126 > - `ref`: React ref
127 >
128 > Which props would you like to expose in the playground?"
129
1303. **Create Playground Content** in `src/components/DemoShowcase/[Name]PlaygroundContent.tsx`:
131 ```tsx
132 import PlaygroundCanvas, { PropSchema } from './PlaygroundCanvas'
133 import { Button } from '@/components/ui/button'
134
135 const propSchema: PropSchema = {
136 variant: {
137 type: 'select',
138 options: ['default', 'destructive', 'outline', 'secondary', 'ghost', 'link'],
139 defaultValue: 'default',
140 },
141 size: {
142 type: 'select',
143 options: ['default', 'sm', 'lg', 'icon'],
144 defaultValue: 'default',
145 },
146 disabled: {
147 type: 'boolean',
148 defaultValue: false,
149 },
150 children: {
151 type: 'string',
152 defaultValue: 'Button',
153 },
154 }
155
156 export default function ButtonPlaygroundContent() {
157 return (
158 <PlaygroundCanvas
159 componentName="Button"
160 propSchema={propSchema}
161 defaultProps={{ children: 'Click Me' }}
162 >
163 {(props) => <Button {...props}>{props.children as string}</Button>}
164 </PlaygroundCanvas>
165 )
166 }
167 ```
168
1694. **Register in Demo Registry** (`src/components/DemoShowcase/demoRegistry.tsx`):
170 ```tsx
171 // Add lazy import
172 const [Name]PlaygroundContent = lazy(() => import('./[Name]PlaygroundContent'))
173
174 // Add to DEMO_REGISTRY array
175 {
176 id: '[name]-playground',
177 label: '[Name] Playground',
178 section: 'Components',
179 component: [Name]PlaygroundContent,
180 description: 'Interactive playground for [Name]',
181 path: '/components/[name]-playground',
182 type: 'playground',
183 }
184 ```
185
1865. **Add Route** in `src/App.tsx`:
187 ```tsx
188 const [Name]PlaygroundContent = lazy(() => import('./components/DemoShowcase/[Name]PlaygroundContent'))
189
190 <Route
191 path="[name]-playground"
192 element={
193 <Suspense fallback={<div>Loading...</div>}>
194 <[Name]PlaygroundContent />
195 </Suspense>
196 }
197 />
198 ```
199
200### Prop Type Mapping Reference
201
202When analyzing TypeScript props, map types to Leva controls:
203
204| TypeScript Type | PropSchema Type | Notes |
205|-----------------|-----------------|-------|
206| `string` | `'string'` | Text input |
207| `number` | `'number'` | Slider (add min/max/step) |
208| `boolean` | `'boolean'` | Checkbox toggle |
209| `'a' \| 'b' \| 'c'` | `'select'` | Dropdown with options array |
210| `enum Foo { A, B }` | `'select'` | Extract enum values as options |
211| `React.ReactNode` | `'string'` | For simple text children |
212| Color strings | `'color'` | Color picker |
213| `() => void` | Skip | Not controllable |
214| Complex objects | Skip | Not controllable |
215| `React.Ref` | Skip | Not controllable |
216
217### PropSchema Format
218
219```tsx
220import { PropSchema } from '@/components/DemoShowcase/PlaygroundCanvas'
221
222const schema: PropSchema = {
223 propName: {
224 type: 'string' | 'number' | 'boolean' | 'select' | 'color',
225 label?: string, // Custom label (defaults to propName)
226 defaultValue?: unknown, // Initial value
227 options?: string[], // For 'select' type
228 min?: number, // For 'number' type
229 max?: number, // For 'number' type
230 step?: number, // For 'number' type
231 }
232}
233```
234
235### Phase 4: Component Updates - Check for Existing Demos
236
237**CRITICAL:** When updating an existing component or hook, ALWAYS check if demo pages exist:
238
2391. **Search for Demo Pages:**
240 - Check `src/components/DemoShowcase/` for `[Name]Content.tsx` or `[Name]PlaygroundContent.tsx`
241 - Check `src/pages/` for `[Name]Demo.tsx`
242 - Check `demoRegistry.tsx` for entries (including `type: 'playground'`)
243
2442. **If Demo Pages Exist:**
245 - Update them to reflect new functionality
246 - Add examples demonstrating new features
247 - Update code examples
248 - Test that demos still work correctly
249
2503. **Prompt User:**
251 > "I found existing demo pages for this [component/hook]. I'll update them to include the new [feature/changes]."
252
253## Demo Content Best Practices
254
255### Structure
256
257Organize demo content with clear sections:
258
259```tsx
260<div className="space-y-8">
261 {/* Example 1: Basic Usage */}
262 <Card className="p-6 space-y-3">
263 <div className="flex items-center gap-2">
264 <Badge variant="secondary">Basic</Badge>
265 <span className="text-xs text-zinc-500 dark:text-zinc-400">
266 Configuration details
267 </span>
268 </div>
269 {/* Demo content */}
270 </Card>
271
272 {/* More examples... */}
273
274 {/* Code Example */}
275 <Card className="p-6 space-y-3 bg-zinc-50 dark:bg-zinc-900">
276 <Badge variant="outline">Usage Example</Badge>
277 <pre className="text-xs text-zinc-700 dark:text-zinc-300 overflow-x-auto">
278 <code>{`// Code example here`}</code>
279 </pre>
280 </Card>
281</div>
282```
283
284### Example Categories
285
286Include diverse examples:
2871. **Basic** - Simple default usage
2882. **Advanced** - Complex configurations
2893. **Interactive** - User-controlled examples
2904. **Variants** - Different visual styles or behaviors
2915. **Edge Cases** - Boundary conditions
2926. **Code Examples** - Implementation snippets
293
294### Styling
295
296- Use Card components for grouping examples
297- Add Badge components for labeling examples
298- Include configuration details in muted text
299- Support dark mode throughout
300- Add visual indicators for interactive elements
301- Show state changes clearly
302
303## Component Showcase Navigation
304
305The navigation is automatically generated from `demoRegistry.tsx`:
306- **Hooks** section: Custom React hooks
307- **Components** section: UI components, libraries, demos
308
309Demos are displayed in the order they appear in `DEMO_REGISTRY`.
310
311## Testing Checklist
312
313After creating or updating component demos:
314
315- [ ] Navigate to the demo route
316- [ ] Verify all examples render correctly
317- [ ] Test interactive elements (buttons, inputs, controls)
318- [ ] Check dark mode appearance
319- [ ] Verify code examples are accurate
320- [ ] Test on different screen sizes
321- [ ] Check TypeScript compilation
322- [ ] Verify navigation active state
323
324### Additional Checks for Playgrounds
325
326- [ ] Verify Leva props panel appears (top-right corner)
327- [ ] Test that prop changes update the component in real-time
328- [ ] Verify navigation collapse toggle works
329- [ ] Check canvas centering at different sizes
330- [ ] Test all prop controls (selects, inputs, toggles)
331
332## Examples
333
334### Example 1: Creating a New Hook with Demo
335
336```
337User: "Create a useDebounce hook"
338
339Claude:
3401. Asks: "Would you like me to create a demo page for this hook in the component showcase?"
3412. User selects: "Yes, create demo page"
3423. Creates:
343 - src/hooks/useDebounce.tsx (the hook)
344 - src/components/DemoShowcase/DebounceContent.tsx (demo)
345 - Updates demoRegistry.tsx
346 - Updates App.tsx with route
347```
348
349### Example 2: Updating Existing Component
350
351```
352User: "Add a 'size' prop to the Button component"
353
354Claude:
3551. Searches for existing demos
3562. Finds: N/A (Button is shadcn component, no custom demo)
3573. Updates Button usage examples in existing demos if needed
358```
359
360### Example 3: Updating Hook with Demo
361
362```
363User: "Add a 'delay' option to useTypewriter"
364
365Claude:
3661. Updates src/hooks/useTypewriter.tsx
3672. Searches and finds: src/components/DemoShowcase/TypewriterContent.tsx
3683. Announces: "I found the existing TypewriterContent demo. I'll add an example showing the new delay option."
3694. Adds new Card with delay example
3705. Updates code example to include delay option
371```
372
373### Example 4: Creating a Component Playground
374
375```
376User: "Create a playground for the Badge component"
377
378Claude:
3791. Asks: "Would you like me to create a demo page for this component?"
3802. User selects: "Yes, playground"
3813. Claude reads src/components/ui/badge.tsx
3824. Analyzes BadgeProps interface and presents:
383 "I found these props:
384
385 **Controllable:**
386 - variant: 'default' | 'secondary' | 'destructive' | 'outline'
387 - children: ReactNode (as string)
388
389 **Not controllable:**
390 - className: styling (skip)
391
392 Which props would you like to expose?"
3935. User selects: "variant and children"
3946. Creates:
395 - src/components/DemoShowcase/BadgePlaygroundContent.tsx
396 - Updates demoRegistry.tsx with type: 'playground'
397 - Updates App.tsx with route
398```
399
400## File Locations Reference
401
402- Component showcase layout: `src/pages/ComponentShowcase.tsx`
403- Demo registry: `src/components/DemoShowcase/demoRegistry.tsx`
404- Navigation: `src/components/DemoShowcase/DemoNavigation.tsx`
405- Demo content: `src/components/DemoShowcase/[Name]Content.tsx`
406- Playground content: `src/components/DemoShowcase/[Name]PlaygroundContent.tsx`
407- Playground canvas: `src/components/DemoShowcase/PlaygroundCanvas.tsx`
408- Standalone demos: `src/pages/[Name]Demo.tsx`
409- Routes: `src/App.tsx`
410
411## Key Principles
412
4131. **Always ask** - Don't assume whether demos are wanted
4142. **Always search** - Check for existing demos before updating
4153. **Keep demos updated** - When components change, demos should reflect it
4164. **Provide variety** - Show multiple use cases, not just basic usage
4175. **Make it interactive** - Let users experiment with controls
4186. **Include code** - Show implementation examples
4197. **Support dark mode** - Test in both themes
4208. **Organize clearly** - Use consistent structure across demos