'use client'; import { useMemo } from 'react'; import { ArrowUpRight, Calendar, CheckCircle2, Clock3 } from 'lucide-react'; import { Avatar, AvatarFallback, AvatarImage } from '@kit/ui/avatar'; import { Badge } from '@kit/ui/badge'; import { Button } from '@kit/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@kit/ui/card'; import { Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, } from '@kit/ui/item'; import { Label } from '@kit/ui/label'; import { Separator } from '@kit/ui/separator'; import { Switch } from '@kit/ui/switch'; import { cn } from '@kit/ui/utils'; import { formatCodeBlock, generatePropsString, useStoryControls, } from '../lib/story-utils'; import { ComponentStoryLayout } from './story-layout'; import { SimpleStorySelect } from './story-select'; interface ItemControls { variant: 'default' | 'outline' | 'muted'; size: 'default' | 'sm'; showMedia: boolean; showDescription: boolean; showActions: boolean; showFooter: boolean; showSeparator: boolean; } const variantOptions = [ { value: 'default', label: 'Default', description: 'Unstyled surface' }, { value: 'outline', label: 'Outline', description: 'Bordered list item' }, { value: 'muted', label: 'Muted', description: 'Soft background highlight' }, ] as const; const sizeOptions = [ { value: 'default', label: 'Default', description: 'Spacious item' }, { value: 'sm', label: 'Small', description: 'Compact height' }, ] as const; export function ItemStory() { const { controls, updateControl } = useStoryControls({ variant: 'default', size: 'default', showMedia: true, showDescription: true, showActions: true, showFooter: true, showSeparator: true, }); const itemPropsString = useMemo( () => generatePropsString( { variant: controls.variant, size: controls.size, }, { variant: 'default', size: 'default', }, ), [controls.variant, controls.size], ); const generatedCode = useMemo(() => { const lines: string[] = []; lines.push(``); if (controls.showMedia) { lines.push( ' ', ' ', ' ', ); } lines.push(' '); lines.push(' '); lines.push(' Weekly planning'); if (controls.showActions) { lines.push( ' ', ' 12 tasks', ' ', ' ', ); } lines.push(' '); if (controls.showDescription) { lines.push( ' Plan upcoming sprints and capture blockers from the team sync.', ); } if (controls.showFooter) { lines.push( ' ', '
', ' ', ' Updated 2 hours ago', '
', ' In progress', '
', ); } lines.push('
'); lines.push(''); return formatCodeBlock(lines.join('\n'), [ "import { ArrowUpRight, Calendar, Clock3 } from 'lucide-react';", "import { Badge } from '@kit/ui/badge';", "import { Button } from '@kit/ui/button';", "import { Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemMedia, ItemTitle } from '@kit/ui/item';", ]); }, [controls, itemPropsString]); const preview = ( {controls.showMedia && ( )} Weekly planning Sprint {controls.showActions && ( 12 tasks )} {controls.showDescription && ( Plan upcoming sprints and capture blockers from the team sync. )} {controls.showFooter && (
Updated 2 hours ago
In progress
)}
{controls.showSeparator && } AL Ada Lovelace Owner {controls.showActions && ( )} {controls.showDescription && ( Building the analytics module. Next milestone due Friday. )} {controls.showFooter && ( Active Joined 2023 )}
); const controlsPanel = ( <>
updateControl('variant', value)} options={variantOptions} />
updateControl('size', value)} options={sizeOptions} />
updateControl('showMedia', checked)} />
updateControl('showDescription', checked) } />
updateControl('showActions', checked)} />
updateControl('showFooter', checked)} />
updateControl('showSeparator', checked)} />
); const examples = (
Checklist Stack compact items for task summaries or changelog entries. Deployment checklist Today Review release notes, QA smoke tests, and notify support. QA sign-off Pending Due 5pm Directory Combine avatar media with actions to build list views. GH Grace Hopper Staff engineer ยท Platform
); return ( ); } export default ItemStory;