From 410a3d27e8ca11c5ff42b76548123b8ed88ec4fc Mon Sep 17 00:00:00 2001
From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Date: Sat, 13 Dec 2025 10:23:09 +0000
Subject: [PATCH 1/3] feat: add Storybook stories for UI components
Add new Storybook stories for the following components:
- Alert: default, destructive, success, warning variants
- Avatar: with image, fallback, sizes, and group
- Badge: default, secondary, destructive, outline variants
- Card: compound component with header, content, footer
- Checkbox: checked, disabled, with label, group
- HighlightText: search query highlighting
- Input: text, password, email, disabled, with label
- Progress: various progress states (0-100%)
- Skeleton: card, avatar, list, form, table loading states
- Switch: checked, disabled, with label, group
- TemplateCard: with/without image, new badge, starred
- Textarea: default, disabled, with label
- Tooltip: positions, with/without arrow, delay
All stories follow the Storybook best practices with:
- Default story as first export
- Proper argTypes with descriptions
- Appropriate layout parameters
- fn() for callback props
Co-Authored-By: unknown <>
---
apps/web/client/src/stories/Alert.stories.tsx | 113 +++++++++++++
.../web/client/src/stories/Avatar.stories.tsx | 93 ++++++++++
apps/web/client/src/stories/Badge.stories.tsx | 78 +++++++++
apps/web/client/src/stories/Card.stories.tsx | 104 ++++++++++++
.../client/src/stories/Checkbox.stories.tsx | 95 +++++++++++
.../src/stories/HighlightText.stories.tsx | 86 ++++++++++
apps/web/client/src/stories/Input.stories.tsx | 109 ++++++++++++
.../client/src/stories/Progress.stories.tsx | 89 ++++++++++
.../client/src/stories/Skeleton.stories.tsx | 102 +++++++++++
.../web/client/src/stories/Switch.stories.tsx | 95 +++++++++++
.../src/stories/TemplateCard.stories.tsx | 160 ++++++++++++++++++
.../client/src/stories/Textarea.stories.tsx | 84 +++++++++
.../client/src/stories/Tooltip.stories.tsx | 118 +++++++++++++
13 files changed, 1326 insertions(+)
create mode 100644 apps/web/client/src/stories/Alert.stories.tsx
create mode 100644 apps/web/client/src/stories/Avatar.stories.tsx
create mode 100644 apps/web/client/src/stories/Badge.stories.tsx
create mode 100644 apps/web/client/src/stories/Card.stories.tsx
create mode 100644 apps/web/client/src/stories/Checkbox.stories.tsx
create mode 100644 apps/web/client/src/stories/HighlightText.stories.tsx
create mode 100644 apps/web/client/src/stories/Input.stories.tsx
create mode 100644 apps/web/client/src/stories/Progress.stories.tsx
create mode 100644 apps/web/client/src/stories/Skeleton.stories.tsx
create mode 100644 apps/web/client/src/stories/Switch.stories.tsx
create mode 100644 apps/web/client/src/stories/TemplateCard.stories.tsx
create mode 100644 apps/web/client/src/stories/Textarea.stories.tsx
create mode 100644 apps/web/client/src/stories/Tooltip.stories.tsx
diff --git a/apps/web/client/src/stories/Alert.stories.tsx b/apps/web/client/src/stories/Alert.stories.tsx
new file mode 100644
index 0000000000..53f4c04347
--- /dev/null
+++ b/apps/web/client/src/stories/Alert.stories.tsx
@@ -0,0 +1,113 @@
+import type { Meta, StoryObj } from '@storybook/nextjs-vite';
+import { Alert, AlertDescription, AlertTitle } from '@onlook/ui/alert';
+import { AlertCircle, CheckCircle2, Info, AlertTriangle } from 'lucide-react';
+
+const meta = {
+ component: Alert,
+ parameters: {
+ layout: 'centered',
+ },
+ tags: ['autodocs'],
+ decorators: [
+ (Story) => (
+
+
+
+ ),
+ ],
+ argTypes: {
+ variant: {
+ description: 'Visual style variant of the alert',
+ control: { type: 'select' },
+ options: ['default', 'destructive'],
+ },
+ },
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ render: () => (
+
+
+ Information
+
+ This is an informational alert message.
+
+
+ ),
+};
+
+export const Destructive: Story = {
+ render: () => (
+
+
+ Error
+
+ Something went wrong. Please try again later.
+
+
+ ),
+};
+
+export const Success: Story = {
+ render: () => (
+
+
+ Success
+
+ Your changes have been saved successfully.
+
+
+ ),
+};
+
+export const Warning: Story = {
+ render: () => (
+
+
+ Warning
+
+ This action may have unintended consequences.
+
+
+ ),
+};
+
+export const TitleOnly: Story = {
+ render: () => (
+
+
+ Alert with title only
+
+ ),
+};
+
+export const DescriptionOnly: Story = {
+ render: () => (
+
+
+
+ Alert with description only, no title.
+
+
+ ),
+};
+
+export const AllVariants: Story = {
+ render: () => (
+
+
+
+ Default Alert
+ This is the default alert style.
+
+
+
+ Destructive Alert
+ This is the destructive alert style.
+
+
+ ),
+};
diff --git a/apps/web/client/src/stories/Avatar.stories.tsx b/apps/web/client/src/stories/Avatar.stories.tsx
new file mode 100644
index 0000000000..adff485840
--- /dev/null
+++ b/apps/web/client/src/stories/Avatar.stories.tsx
@@ -0,0 +1,93 @@
+import type { Meta, StoryObj } from '@storybook/nextjs-vite';
+import { Avatar, AvatarFallback, AvatarImage } from '@onlook/ui/avatar';
+
+const meta = {
+ component: Avatar,
+ parameters: {
+ layout: 'centered',
+ },
+ tags: ['autodocs'],
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ render: () => (
+
+
+ JD
+
+ ),
+};
+
+export const WithFallback: Story = {
+ render: () => (
+
+
+ AB
+
+ ),
+};
+
+export const FallbackOnly: Story = {
+ render: () => (
+
+ CD
+
+ ),
+};
+
+export const Sizes: Story = {
+ render: () => (
+
+
+
+ SM
+
+
+
+ DF
+
+
+
+ LG
+
+
+
+ XL
+
+
+ ),
+};
+
+export const Group: Story = {
+ render: () => (
+
+
+
+ U1
+
+
+
+ U2
+
+
+
+ U3
+
+
+ +5
+
+
+ ),
+};
+
+export const WithRealImage: Story = {
+ render: () => (
+
+
+ JD
+
+ ),
+};
diff --git a/apps/web/client/src/stories/Badge.stories.tsx b/apps/web/client/src/stories/Badge.stories.tsx
new file mode 100644
index 0000000000..0b51229d20
--- /dev/null
+++ b/apps/web/client/src/stories/Badge.stories.tsx
@@ -0,0 +1,78 @@
+import type { Meta, StoryObj } from '@storybook/nextjs-vite';
+import { Badge } from '@onlook/ui/badge';
+
+const meta = {
+ component: Badge,
+ parameters: {
+ layout: 'centered',
+ },
+ tags: ['autodocs'],
+ argTypes: {
+ variant: {
+ description: 'Visual style variant of the badge',
+ control: { type: 'select' },
+ options: ['default', 'secondary', 'destructive', 'outline'],
+ },
+ asChild: {
+ description: 'Whether to render as a child component',
+ control: 'boolean',
+ },
+ },
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: {
+ children: 'Badge',
+ variant: 'default',
+ },
+};
+
+export const Secondary: Story = {
+ args: {
+ children: 'Secondary',
+ variant: 'secondary',
+ },
+};
+
+export const Destructive: Story = {
+ args: {
+ children: 'Destructive',
+ variant: 'destructive',
+ },
+};
+
+export const Outline: Story = {
+ args: {
+ children: 'Outline',
+ variant: 'outline',
+ },
+};
+
+export const AllVariants: Story = {
+ render: () => (
+
+ Default
+ Secondary
+ Destructive
+ Outline
+
+ ),
+};
+
+export const WithIcon: Story = {
+ render: () => (
+
+
+ *
+ New
+
+
+ !
+ Warning
+
+
+ ),
+};
diff --git a/apps/web/client/src/stories/Card.stories.tsx b/apps/web/client/src/stories/Card.stories.tsx
new file mode 100644
index 0000000000..5c7b478a1b
--- /dev/null
+++ b/apps/web/client/src/stories/Card.stories.tsx
@@ -0,0 +1,104 @@
+import type { Meta, StoryObj } from '@storybook/nextjs-vite';
+import { Button } from '@onlook/ui/button';
+import {
+ Card,
+ CardAction,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from '@onlook/ui/card';
+
+const meta = {
+ component: Card,
+ parameters: {
+ layout: 'centered',
+ },
+ tags: ['autodocs'],
+ decorators: [
+ (Story) => (
+
+
+
+ ),
+ ],
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ render: () => (
+
+
+ Card Title
+ Card description goes here
+
+
+ Card content with some text explaining the purpose of this card.
+
+
+
+
+
+ ),
+};
+
+export const WithAction: Story = {
+ render: () => (
+
+
+ Card with Action
+ This card has an action button in the header
+
+
+
+
+
+ The action button appears in the top right corner of the header.
+
+
+ ),
+};
+
+export const Simple: Story = {
+ render: () => (
+
+
+ Simple Card
+
+
+ A simple card with just a title and content.
+
+
+ ),
+};
+
+export const WithFooterActions: Story = {
+ render: () => (
+
+
+ Confirm Action
+ Are you sure you want to proceed?
+
+
+ This action cannot be undone. Please review before confirming.
+
+
+
+
+
+
+ ),
+};
+
+export const ContentOnly: Story = {
+ render: () => (
+
+
+ A card with only content, no header or footer.
+
+
+ ),
+};
diff --git a/apps/web/client/src/stories/Checkbox.stories.tsx b/apps/web/client/src/stories/Checkbox.stories.tsx
new file mode 100644
index 0000000000..d8cc39cea2
--- /dev/null
+++ b/apps/web/client/src/stories/Checkbox.stories.tsx
@@ -0,0 +1,95 @@
+import type { Meta, StoryObj } from '@storybook/nextjs-vite';
+import { fn } from '@storybook/test';
+import { Checkbox } from '@onlook/ui/checkbox';
+import { Label } from '@onlook/ui/label';
+
+const meta = {
+ component: Checkbox,
+ parameters: {
+ layout: 'centered',
+ },
+ tags: ['autodocs'],
+ argTypes: {
+ checked: {
+ description: 'Whether the checkbox is checked',
+ control: 'boolean',
+ },
+ disabled: {
+ description: 'Whether the checkbox is disabled',
+ control: 'boolean',
+ },
+ },
+ args: {
+ onCheckedChange: fn(),
+ },
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: {
+ checked: false,
+ },
+};
+
+export const Checked: Story = {
+ args: {
+ checked: true,
+ },
+};
+
+export const Disabled: Story = {
+ args: {
+ disabled: true,
+ },
+};
+
+export const DisabledChecked: Story = {
+ args: {
+ checked: true,
+ disabled: true,
+ },
+};
+
+export const WithLabel: Story = {
+ render: () => (
+
+
+
+
+ ),
+};
+
+export const WithDescription: Story = {
+ render: () => (
+
+
+
+
+
+ Get notified about new features and updates.
+
+
+
+ ),
+};
+
+export const CheckboxGroup: Story = {
+ render: () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ),
+};
diff --git a/apps/web/client/src/stories/HighlightText.stories.tsx b/apps/web/client/src/stories/HighlightText.stories.tsx
new file mode 100644
index 0000000000..956d4b7a25
--- /dev/null
+++ b/apps/web/client/src/stories/HighlightText.stories.tsx
@@ -0,0 +1,86 @@
+import type { Meta, StoryObj } from '@storybook/nextjs-vite';
+import { HighlightText } from '@/app/projects/_components/select/highlight-text';
+
+const meta = {
+ component: HighlightText,
+ parameters: {
+ layout: 'centered',
+ },
+ tags: ['autodocs'],
+ argTypes: {
+ text: {
+ description: 'The text to display',
+ control: 'text',
+ },
+ searchQuery: {
+ description: 'The search query to highlight within the text',
+ control: 'text',
+ },
+ },
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: {
+ text: 'E-commerce Dashboard',
+ searchQuery: 'dash',
+ },
+};
+
+export const NoMatch: Story = {
+ args: {
+ text: 'E-commerce Dashboard',
+ searchQuery: 'xyz',
+ },
+};
+
+export const EmptyQuery: Story = {
+ args: {
+ text: 'E-commerce Dashboard',
+ searchQuery: '',
+ },
+};
+
+export const FullMatch: Story = {
+ args: {
+ text: 'Dashboard',
+ searchQuery: 'Dashboard',
+ },
+};
+
+export const CaseInsensitive: Story = {
+ args: {
+ text: 'E-commerce Dashboard',
+ searchQuery: 'DASH',
+ },
+};
+
+export const MultipleMatches: Story = {
+ args: {
+ text: 'Dashboard for dashboard analytics',
+ searchQuery: 'dashboard',
+ },
+};
+
+export const PartialWord: Story = {
+ args: {
+ text: 'Portfolio Website Project',
+ searchQuery: 'port',
+ },
+};
+
+export const SpecialCharacters: Story = {
+ args: {
+ text: 'Project (v2.0) - Beta',
+ searchQuery: '(v2',
+ },
+};
+
+export const LongText: Story = {
+ args: {
+ text: 'This is a very long project name that contains the word dashboard somewhere in the middle of the text',
+ searchQuery: 'dashboard',
+ },
+};
diff --git a/apps/web/client/src/stories/Input.stories.tsx b/apps/web/client/src/stories/Input.stories.tsx
new file mode 100644
index 0000000000..b85fa3c6d8
--- /dev/null
+++ b/apps/web/client/src/stories/Input.stories.tsx
@@ -0,0 +1,109 @@
+import type { Meta, StoryObj } from '@storybook/nextjs-vite';
+import { Input } from '@onlook/ui/input';
+import { Label } from '@onlook/ui/label';
+
+const meta = {
+ component: Input,
+ parameters: {
+ layout: 'centered',
+ },
+ tags: ['autodocs'],
+ decorators: [
+ (Story) => (
+
+
+
+ ),
+ ],
+ argTypes: {
+ type: {
+ description: 'The type of input',
+ control: { type: 'select' },
+ options: ['text', 'email', 'password', 'number', 'search', 'tel', 'url'],
+ },
+ placeholder: {
+ description: 'Placeholder text',
+ control: 'text',
+ },
+ disabled: {
+ description: 'Whether the input is disabled',
+ control: 'boolean',
+ },
+ },
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: {
+ type: 'text',
+ placeholder: 'Enter text...',
+ },
+};
+
+export const WithLabel: Story = {
+ render: () => (
+
+
+
+
+ ),
+};
+
+export const Password: Story = {
+ args: {
+ type: 'password',
+ placeholder: 'Enter password',
+ },
+};
+
+export const Disabled: Story = {
+ args: {
+ type: 'text',
+ placeholder: 'Disabled input',
+ disabled: true,
+ },
+};
+
+export const WithValue: Story = {
+ args: {
+ type: 'text',
+ defaultValue: 'Pre-filled value',
+ },
+};
+
+export const Search: Story = {
+ args: {
+ type: 'search',
+ placeholder: 'Search...',
+ },
+};
+
+export const Number: Story = {
+ args: {
+ type: 'number',
+ placeholder: '0',
+ },
+};
+
+export const File: Story = {
+ args: {
+ type: 'file',
+ },
+};
+
+export const Invalid: Story = {
+ render: () => (
+
+
+
+
+ ),
+};
diff --git a/apps/web/client/src/stories/Progress.stories.tsx b/apps/web/client/src/stories/Progress.stories.tsx
new file mode 100644
index 0000000000..6deed46b69
--- /dev/null
+++ b/apps/web/client/src/stories/Progress.stories.tsx
@@ -0,0 +1,89 @@
+import type { Meta, StoryObj } from '@storybook/nextjs-vite';
+import { Progress } from '@onlook/ui/progress';
+
+const meta = {
+ component: Progress,
+ parameters: {
+ layout: 'centered',
+ },
+ tags: ['autodocs'],
+ decorators: [
+ (Story) => (
+
+
+
+ ),
+ ],
+ argTypes: {
+ value: {
+ description: 'Progress value (0-100)',
+ control: { type: 'range', min: 0, max: 100, step: 1 },
+ },
+ },
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: {
+ value: 50,
+ },
+};
+
+export const Empty: Story = {
+ args: {
+ value: 0,
+ },
+};
+
+export const Quarter: Story = {
+ args: {
+ value: 25,
+ },
+};
+
+export const Half: Story = {
+ args: {
+ value: 50,
+ },
+};
+
+export const ThreeQuarters: Story = {
+ args: {
+ value: 75,
+ },
+};
+
+export const Complete: Story = {
+ args: {
+ value: 100,
+ },
+};
+
+export const AllStates: Story = {
+ render: () => (
+
+ ),
+};
diff --git a/apps/web/client/src/stories/Skeleton.stories.tsx b/apps/web/client/src/stories/Skeleton.stories.tsx
new file mode 100644
index 0000000000..f80a3526e4
--- /dev/null
+++ b/apps/web/client/src/stories/Skeleton.stories.tsx
@@ -0,0 +1,102 @@
+import type { Meta, StoryObj } from '@storybook/nextjs-vite';
+import { Skeleton } from '@onlook/ui/skeleton';
+
+const meta = {
+ component: Skeleton,
+ parameters: {
+ layout: 'centered',
+ },
+ tags: ['autodocs'],
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ render: () => ,
+};
+
+export const Circle: Story = {
+ render: () => ,
+};
+
+export const Card: Story = {
+ render: () => (
+
+ ),
+};
+
+export const Avatar: Story = {
+ render: () => (
+
+ ),
+};
+
+export const List: Story = {
+ render: () => (
+
+ {[1, 2, 3].map((i) => (
+
+ ))}
+
+ ),
+};
+
+export const Form: Story = {
+ render: () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ),
+};
+
+export const Table: Story = {
+ render: () => (
+
+
+
+
+
+
+
+ {[1, 2, 3, 4].map((i) => (
+
+
+
+
+
+
+ ))}
+
+ ),
+};
diff --git a/apps/web/client/src/stories/Switch.stories.tsx b/apps/web/client/src/stories/Switch.stories.tsx
new file mode 100644
index 0000000000..b5930a8bf7
--- /dev/null
+++ b/apps/web/client/src/stories/Switch.stories.tsx
@@ -0,0 +1,95 @@
+import type { Meta, StoryObj } from '@storybook/nextjs-vite';
+import { fn } from '@storybook/test';
+import { Switch } from '@onlook/ui/switch';
+import { Label } from '@onlook/ui/label';
+
+const meta = {
+ component: Switch,
+ parameters: {
+ layout: 'centered',
+ },
+ tags: ['autodocs'],
+ argTypes: {
+ checked: {
+ description: 'Whether the switch is checked',
+ control: 'boolean',
+ },
+ disabled: {
+ description: 'Whether the switch is disabled',
+ control: 'boolean',
+ },
+ },
+ args: {
+ onCheckedChange: fn(),
+ },
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: {
+ checked: false,
+ },
+};
+
+export const Checked: Story = {
+ args: {
+ checked: true,
+ },
+};
+
+export const Disabled: Story = {
+ args: {
+ disabled: true,
+ },
+};
+
+export const DisabledChecked: Story = {
+ args: {
+ checked: true,
+ disabled: true,
+ },
+};
+
+export const WithLabel: Story = {
+ render: () => (
+
+
+
+
+ ),
+};
+
+export const WithDescription: Story = {
+ render: () => (
+
+
+
+
+
+ Receive push notifications for important updates.
+
+
+
+ ),
+};
+
+export const SwitchGroup: Story = {
+ render: () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ),
+};
diff --git a/apps/web/client/src/stories/TemplateCard.stories.tsx b/apps/web/client/src/stories/TemplateCard.stories.tsx
new file mode 100644
index 0000000000..5a12a10692
--- /dev/null
+++ b/apps/web/client/src/stories/TemplateCard.stories.tsx
@@ -0,0 +1,160 @@
+import type { Meta, StoryObj } from '@storybook/nextjs-vite';
+import { fn } from '@storybook/test';
+import { TemplateCard } from '@/app/projects/_components/templates/template-card';
+
+const meta = {
+ component: TemplateCard,
+ parameters: {
+ layout: 'centered',
+ backgrounds: {
+ default: 'dark',
+ },
+ },
+ tags: ['autodocs'],
+ argTypes: {
+ title: {
+ description: 'Title of the template',
+ control: 'text',
+ },
+ description: {
+ description: 'Description of the template',
+ control: 'text',
+ },
+ image: {
+ description: 'Preview image URL',
+ control: 'text',
+ },
+ isNew: {
+ description: 'Whether to show the "New" badge',
+ control: 'boolean',
+ },
+ isStarred: {
+ description: 'Whether the template is starred/favorited',
+ control: 'boolean',
+ },
+ },
+ args: {
+ onClick: fn(),
+ onToggleStar: fn(),
+ },
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: {
+ title: 'Next.js Starter',
+ description: 'A full-featured Next.js template with authentication and database integration.',
+ image: 'https://images.unsplash.com/photo-1633356122544-f134324a6cee?w=800&q=80',
+ isNew: false,
+ isStarred: false,
+ },
+};
+
+export const WithNewBadge: Story = {
+ args: {
+ title: 'React Dashboard',
+ description: 'Modern dashboard template with charts, tables, and analytics components.',
+ image: 'https://images.unsplash.com/photo-1551288049-bebda4e38f71?w=800&q=80',
+ isNew: true,
+ isStarred: false,
+ },
+};
+
+export const Starred: Story = {
+ args: {
+ title: 'Portfolio Template',
+ description: 'Clean and minimal portfolio template for showcasing your work.',
+ image: 'https://images.unsplash.com/photo-1507238691740-187a5b1d37b8?w=800&q=80',
+ isNew: false,
+ isStarred: true,
+ },
+};
+
+export const NewAndStarred: Story = {
+ args: {
+ title: 'E-commerce Starter',
+ description: 'Complete e-commerce solution with cart, checkout, and payment integration.',
+ image: 'https://images.unsplash.com/photo-1460925895917-afdab827c52f?w=800&q=80',
+ isNew: true,
+ isStarred: true,
+ },
+};
+
+export const NoImage: Story = {
+ args: {
+ title: 'Blank Template',
+ description: 'Start from scratch with a minimal setup.',
+ image: undefined,
+ isNew: false,
+ isStarred: false,
+ },
+};
+
+export const LongTitle: Story = {
+ args: {
+ title: 'Super Long Template Name That Should Truncate Properly',
+ description: 'A template with a very long name to test truncation behavior.',
+ image: 'https://images.unsplash.com/photo-1547658719-da2b51169166?w=800&q=80',
+ isNew: false,
+ isStarred: false,
+ },
+};
+
+export const LongDescription: Story = {
+ args: {
+ title: 'Documentation Site',
+ description: 'A comprehensive documentation template with search functionality, versioning support, multiple language support, and beautiful syntax highlighting for code blocks.',
+ image: 'https://images.unsplash.com/photo-1504868584819-f8e8b4b6d7e3?w=800&q=80',
+ isNew: false,
+ isStarred: false,
+ },
+};
+
+export const WithoutStarButton: Story = {
+ args: {
+ title: 'Simple Template',
+ description: 'A template without the star/favorite functionality.',
+ image: 'https://images.unsplash.com/photo-1512941937669-90a1b58e7e9c?w=800&q=80',
+ isNew: false,
+ isStarred: false,
+ onToggleStar: undefined,
+ },
+};
+
+export const AllVariants: Story = {
+ render: () => (
+
+
+
+
+
+
+ ),
+};
diff --git a/apps/web/client/src/stories/Textarea.stories.tsx b/apps/web/client/src/stories/Textarea.stories.tsx
new file mode 100644
index 0000000000..0c696afc1a
--- /dev/null
+++ b/apps/web/client/src/stories/Textarea.stories.tsx
@@ -0,0 +1,84 @@
+import type { Meta, StoryObj } from '@storybook/nextjs-vite';
+import { Textarea } from '@onlook/ui/textarea';
+import { Label } from '@onlook/ui/label';
+
+const meta = {
+ component: Textarea,
+ parameters: {
+ layout: 'centered',
+ },
+ tags: ['autodocs'],
+ decorators: [
+ (Story) => (
+
+
+
+ ),
+ ],
+ argTypes: {
+ placeholder: {
+ description: 'Placeholder text',
+ control: 'text',
+ },
+ disabled: {
+ description: 'Whether the textarea is disabled',
+ control: 'boolean',
+ },
+ rows: {
+ description: 'Number of visible text lines',
+ control: 'number',
+ },
+ },
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: {
+ placeholder: 'Enter your message...',
+ },
+};
+
+export const WithLabel: Story = {
+ render: () => (
+
+
+
+
+ ),
+};
+
+export const Disabled: Story = {
+ args: {
+ placeholder: 'Disabled textarea',
+ disabled: true,
+ },
+};
+
+export const WithValue: Story = {
+ args: {
+ defaultValue: 'This is some pre-filled content in the textarea that spans multiple lines to demonstrate how the component handles longer text.',
+ },
+};
+
+export const WithRows: Story = {
+ args: {
+ placeholder: 'Textarea with 6 rows',
+ rows: 6,
+ },
+};
+
+export const Invalid: Story = {
+ render: () => (
+
+
+
+
+ ),
+};
diff --git a/apps/web/client/src/stories/Tooltip.stories.tsx b/apps/web/client/src/stories/Tooltip.stories.tsx
new file mode 100644
index 0000000000..fa350c8bf5
--- /dev/null
+++ b/apps/web/client/src/stories/Tooltip.stories.tsx
@@ -0,0 +1,118 @@
+import type { Meta, StoryObj } from '@storybook/nextjs-vite';
+import { Button } from '@onlook/ui/button';
+import { Tooltip, TooltipContent, TooltipTrigger } from '@onlook/ui/tooltip';
+
+const meta = {
+ component: Tooltip,
+ parameters: {
+ layout: 'centered',
+ },
+ tags: ['autodocs'],
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ render: () => (
+
+
+
+
+
+ This is a tooltip
+
+
+ ),
+};
+
+export const WithArrow: Story = {
+ render: () => (
+
+
+
+
+
+ Tooltip with arrow
+
+
+ ),
+};
+
+export const WithoutArrow: Story = {
+ render: () => (
+
+
+
+
+
+ Tooltip without arrow
+
+
+ ),
+};
+
+export const Positions: Story = {
+ render: () => (
+
+
+
+
+
+
+ Top tooltip
+
+
+
+
+
+
+
+ Bottom tooltip
+
+
+
+
+
+
+
+ Left tooltip
+
+
+
+
+
+
+
+ Right tooltip
+
+
+
+ ),
+};
+
+export const WithDelay: Story = {
+ render: () => (
+
+
+
+
+
+ This tooltip has a 500ms delay
+
+
+ ),
+};
+
+export const LongContent: Story = {
+ render: () => (
+
+
+
+
+
+ This is a longer tooltip message that wraps to multiple lines when it exceeds the maximum width.
+
+
+ ),
+};
From 8e3c7592cc797e46fef593ea24488e401cb07e41 Mon Sep 17 00:00:00 2001
From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Date: Sat, 13 Dec 2025 10:27:30 +0000
Subject: [PATCH 2/3] chore: update lockfile
Co-Authored-By: unknown <>
---
bun.lockb | Bin 0 -> 1100064 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100755 bun.lockb
diff --git a/bun.lockb b/bun.lockb
new file mode 100755
index 0000000000000000000000000000000000000000..48405974a589c16cb617ca9218480191abb37ff5
GIT binary patch
literal 1100064
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 BrjxXrd
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