From 5af6154e8035703e4d195a71602461566444035f Mon Sep 17 00:00:00 2001 From: Saravana Achu Mac Date: Wed, 6 May 2026 11:30:51 -0700 Subject: [PATCH] test(ui): add primitive story coverage --- packages/ui/src/components/Badge.stories.tsx | 5 +- packages/ui/src/components/Button.stories.tsx | 7 +- packages/ui/src/components/Card.stories.tsx | 2 +- .../ui/src/components/Controls.stories.tsx | 92 ++++++++++++++ .../OperationalPrimitives.stories.tsx | 120 ++++++++++++++++++ 5 files changed, 222 insertions(+), 4 deletions(-) create mode 100644 packages/ui/src/components/Controls.stories.tsx create mode 100644 packages/ui/src/components/OperationalPrimitives.stories.tsx diff --git a/packages/ui/src/components/Badge.stories.tsx b/packages/ui/src/components/Badge.stories.tsx index 0e532fa1..7790112b 100644 --- a/packages/ui/src/components/Badge.stories.tsx +++ b/packages/ui/src/components/Badge.stories.tsx @@ -5,7 +5,10 @@ const meta: Meta = { title: 'Components/Badge', component: Badge, argTypes: { - variant: { control: 'select', options: ['success', 'warning', 'error', 'info', 'neutral'] }, + variant: { + control: 'select', + options: ['success', 'warning', 'error', 'danger', 'info', 'neutral', 'accent'], + }, size: { control: 'select', options: ['sm', 'md'] }, dot: { control: 'boolean' }, }, diff --git a/packages/ui/src/components/Button.stories.tsx b/packages/ui/src/components/Button.stories.tsx index 7c116043..c9148ef7 100644 --- a/packages/ui/src/components/Button.stories.tsx +++ b/packages/ui/src/components/Button.stories.tsx @@ -5,7 +5,10 @@ const meta: Meta = { title: 'Components/Button', component: Button, argTypes: { - variant: { control: 'select', options: ['primary', 'secondary', 'ghost', 'danger'] }, + variant: { + control: 'select', + options: ['primary', 'secondary', 'ghost', 'destructive', 'outline', 'subtle', 'link'], + }, size: { control: 'select', options: ['sm', 'md', 'lg'] }, loading: { control: 'boolean' }, disabled: { control: 'boolean' }, @@ -28,7 +31,7 @@ export const Ghost: Story = { }; export const Danger: Story = { - args: { children: 'Danger Button', variant: 'danger' }, + args: { children: 'Danger Button', variant: 'destructive' }, }; export const Loading: Story = { diff --git a/packages/ui/src/components/Card.stories.tsx b/packages/ui/src/components/Card.stories.tsx index 0f8a8f04..6b08e26f 100644 --- a/packages/ui/src/components/Card.stories.tsx +++ b/packages/ui/src/components/Card.stories.tsx @@ -24,7 +24,7 @@ export const WithHeader: Story = { Card Title A short description of this card. -

Body content

+

Body content

), }; diff --git a/packages/ui/src/components/Controls.stories.tsx b/packages/ui/src/components/Controls.stories.tsx new file mode 100644 index 00000000..ad27f127 --- /dev/null +++ b/packages/ui/src/components/Controls.stories.tsx @@ -0,0 +1,92 @@ +import * as React from 'react'; +import type { Meta, StoryObj } from '@storybook/react'; +import { MoreHorizontal } from 'lucide-react'; +import { Checkbox } from './Checkbox.js'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from './DropdownMenu.js'; +import { IconButton } from './IconButton.js'; +import { RadioGroup, RadioGroupItem } from './RadioGroup.js'; +import { SegmentedControl } from './SegmentedControl.js'; +import { Switch } from './Switch.js'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from './Tabs.js'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './Tooltip.js'; + +const meta: Meta = { + title: 'Components/Controls', +}; + +export default meta; +type Story = StoryObj; + +export const ChoiceControls: Story = { + render: () => { + const [mode, setMode] = React.useState('review'); + + return ( +
+ + + + + + + +
+ ); + }, +}; + +export const OverlaysAndTabs: Story = { + render: () => ( + +
+ + + Queue + Timeline + + + Queue content + + + Timeline content + + +
+ + + } label="More actions" /> + + More actions + + + + } label="Open menu" /> + + + Actions + + Approve + Reject + + +
+
+
+ ), +}; diff --git a/packages/ui/src/components/OperationalPrimitives.stories.tsx b/packages/ui/src/components/OperationalPrimitives.stories.tsx new file mode 100644 index 00000000..7574078c --- /dev/null +++ b/packages/ui/src/components/OperationalPrimitives.stories.tsx @@ -0,0 +1,120 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { Check, Clock } from 'lucide-react'; +import { Button } from './Button.js'; +import { DataList, DataListItem, DataListMeta } from './DataList.js'; +import { + DataTable, + DataTableBody, + DataTableCell, + DataTableHead, + DataTableHeader, + DataTableRow, +} from './DataTable.js'; +import { DiffCard } from './DiffCard.js'; +import { IconButton } from './IconButton.js'; +import { ListItemButton } from './ListItemButton.js'; +import { Panel, PanelBody, PanelDescription, PanelHeader, PanelTitle } from './Panel.js'; +import { StatusBadge } from './StatusBadge.js'; +import { Surface, SurfaceList, SurfaceListItem } from './Surface.js'; +import { Timeline } from './Timeline.js'; + +const meta: Meta = { + title: 'Components/Operational Primitives', +}; + +export default meta; +type Story = StoryObj; + +export const SurfacesAndLists: Story = { + render: () => ( +
+ + +
+ Review queue + Dense operator work surface +
+ } label="Approve selected" /> +
+ + +
Merge duplicate research notes
+
2 linked notes affected
+
+ + Selected surface row + Normal surface row + +
+
+ Reusable muted surface +
+ ), +}; + +export const StatusTimelineAndDiff: Story = { + render: () => ( +
+
+ + Approved + + + Needs review + +
+ + +
+ ), +}; + +export const DataDisplay: Story = { + render: () => ( +
+ + +
Workspace intelligence
+ + Updated 4 minutes ago + +
+ Inbox processing +
+ + + + Name + Status + + + + + Research notes + + Healthy + + + + + +
+ ), +};