From 063179933c25175b32244cb2b1fd0d8acfc19b22 Mon Sep 17 00:00:00 2001 From: kurihada Date: Thu, 19 Mar 2026 16:56:27 +0800 Subject: [PATCH] feat: add core UI components and baseline tests --- apps/docs/src/components/checkbox.stories.tsx | 57 + apps/docs/src/components/dialog.stories.tsx | 46 + .../src/components/dropdown-menu.stories.tsx | 66 + apps/docs/src/components/field.stories.tsx | 50 + apps/docs/src/components/input.stories.tsx | 71 + apps/docs/src/components/label.stories.tsx | 43 + apps/docs/src/components/popover.stories.tsx | 32 + .../src/components/radio-group.stories.tsx | 53 + apps/docs/src/components/select.stories.tsx | 66 + .../docs/src/components/separator.stories.tsx | 81 + apps/docs/src/components/skeleton.stories.tsx | 50 + apps/docs/src/components/spinner.stories.tsx | 49 + apps/docs/src/components/switch.stories.tsx | 57 + apps/docs/src/components/tabs.stories.tsx | 36 + apps/docs/src/components/textarea.stories.tsx | 71 + apps/docs/src/components/toast.stories.tsx | 46 + apps/docs/src/components/tooltip.stories.tsx | 31 + apps/docs/src/preview.css | 1 + package.json | 9 +- packages/tokens/src/motion.css | 10 + packages/ui/package.json | 20 +- packages/ui/src/components/button.test.tsx | 52 + packages/ui/src/components/checkbox.test.tsx | 52 + packages/ui/src/components/checkbox.tsx | 37 + .../ui/src/components/checkbox.variants.ts | 18 + packages/ui/src/components/dialog.test.tsx | 108 ++ packages/ui/src/components/dialog.tsx | 111 ++ packages/ui/src/components/dialog.variants.ts | 33 + .../ui/src/components/dropdown-menu.test.tsx | 91 + packages/ui/src/components/dropdown-menu.tsx | 231 +++ .../src/components/dropdown-menu.variants.ts | 68 + packages/ui/src/components/field.test.tsx | 50 + packages/ui/src/components/field.tsx | 174 ++ packages/ui/src/components/input.test.tsx | 55 + packages/ui/src/components/input.tsx | 66 + packages/ui/src/components/input.variants.ts | 28 + packages/ui/src/components/label.test.tsx | 42 + packages/ui/src/components/label.tsx | 56 + packages/ui/src/components/popover.test.tsx | 57 + packages/ui/src/components/popover.tsx | 51 + .../ui/src/components/popover.variants.ts | 21 + .../ui/src/components/radio-group.test.tsx | 65 + packages/ui/src/components/radio-group.tsx | 60 + .../ui/src/components/radio-group.variants.ts | 30 + packages/ui/src/components/select.test.tsx | 131 ++ packages/ui/src/components/select.tsx | 141 ++ packages/ui/src/components/select.variants.ts | 38 + packages/ui/src/components/separator.test.tsx | 28 + packages/ui/src/components/separator.tsx | 38 + .../ui/src/components/separator.variants.ts | 18 + packages/ui/src/components/skeleton.test.tsx | 26 + packages/ui/src/components/skeleton.tsx | 58 + packages/ui/src/components/spinner.test.tsx | 23 + packages/ui/src/components/spinner.tsx | 57 + packages/ui/src/components/switch.test.tsx | 70 + packages/ui/src/components/switch.tsx | 35 + packages/ui/src/components/switch.variants.ts | 19 + packages/ui/src/components/tabs.test.tsx | 54 + packages/ui/src/components/tabs.tsx | 66 + packages/ui/src/components/tabs.variants.ts | 20 + packages/ui/src/components/textarea.test.tsx | 54 + packages/ui/src/components/textarea.tsx | 66 + .../ui/src/components/textarea.variants.ts | 28 + packages/ui/src/components/toast.test.tsx | 69 + packages/ui/src/components/toast.tsx | 104 ++ packages/ui/src/components/toast.variants.ts | 42 + packages/ui/src/components/tooltip.test.tsx | 62 + packages/ui/src/components/tooltip.tsx | 50 + .../ui/src/components/tooltip.variants.ts | 21 + packages/ui/src/index.ts | 156 ++ packages/ui/src/test/setup.ts | 64 + pnpm-lock.yaml | 1663 +++++++++++++++++ vitest.config.ts | 56 + 73 files changed, 5756 insertions(+), 2 deletions(-) create mode 100644 apps/docs/src/components/checkbox.stories.tsx create mode 100644 apps/docs/src/components/dialog.stories.tsx create mode 100644 apps/docs/src/components/dropdown-menu.stories.tsx create mode 100644 apps/docs/src/components/field.stories.tsx create mode 100644 apps/docs/src/components/input.stories.tsx create mode 100644 apps/docs/src/components/label.stories.tsx create mode 100644 apps/docs/src/components/popover.stories.tsx create mode 100644 apps/docs/src/components/radio-group.stories.tsx create mode 100644 apps/docs/src/components/select.stories.tsx create mode 100644 apps/docs/src/components/separator.stories.tsx create mode 100644 apps/docs/src/components/skeleton.stories.tsx create mode 100644 apps/docs/src/components/spinner.stories.tsx create mode 100644 apps/docs/src/components/switch.stories.tsx create mode 100644 apps/docs/src/components/tabs.stories.tsx create mode 100644 apps/docs/src/components/textarea.stories.tsx create mode 100644 apps/docs/src/components/toast.stories.tsx create mode 100644 apps/docs/src/components/tooltip.stories.tsx create mode 100644 packages/ui/src/components/button.test.tsx create mode 100644 packages/ui/src/components/checkbox.test.tsx create mode 100644 packages/ui/src/components/checkbox.tsx create mode 100644 packages/ui/src/components/checkbox.variants.ts create mode 100644 packages/ui/src/components/dialog.test.tsx create mode 100644 packages/ui/src/components/dialog.tsx create mode 100644 packages/ui/src/components/dialog.variants.ts create mode 100644 packages/ui/src/components/dropdown-menu.test.tsx create mode 100644 packages/ui/src/components/dropdown-menu.tsx create mode 100644 packages/ui/src/components/dropdown-menu.variants.ts create mode 100644 packages/ui/src/components/field.test.tsx create mode 100644 packages/ui/src/components/field.tsx create mode 100644 packages/ui/src/components/input.test.tsx create mode 100644 packages/ui/src/components/input.tsx create mode 100644 packages/ui/src/components/input.variants.ts create mode 100644 packages/ui/src/components/label.test.tsx create mode 100644 packages/ui/src/components/label.tsx create mode 100644 packages/ui/src/components/popover.test.tsx create mode 100644 packages/ui/src/components/popover.tsx create mode 100644 packages/ui/src/components/popover.variants.ts create mode 100644 packages/ui/src/components/radio-group.test.tsx create mode 100644 packages/ui/src/components/radio-group.tsx create mode 100644 packages/ui/src/components/radio-group.variants.ts create mode 100644 packages/ui/src/components/select.test.tsx create mode 100644 packages/ui/src/components/select.tsx create mode 100644 packages/ui/src/components/select.variants.ts create mode 100644 packages/ui/src/components/separator.test.tsx create mode 100644 packages/ui/src/components/separator.tsx create mode 100644 packages/ui/src/components/separator.variants.ts create mode 100644 packages/ui/src/components/skeleton.test.tsx create mode 100644 packages/ui/src/components/skeleton.tsx create mode 100644 packages/ui/src/components/spinner.test.tsx create mode 100644 packages/ui/src/components/spinner.tsx create mode 100644 packages/ui/src/components/switch.test.tsx create mode 100644 packages/ui/src/components/switch.tsx create mode 100644 packages/ui/src/components/switch.variants.ts create mode 100644 packages/ui/src/components/tabs.test.tsx create mode 100644 packages/ui/src/components/tabs.tsx create mode 100644 packages/ui/src/components/tabs.variants.ts create mode 100644 packages/ui/src/components/textarea.test.tsx create mode 100644 packages/ui/src/components/textarea.tsx create mode 100644 packages/ui/src/components/textarea.variants.ts create mode 100644 packages/ui/src/components/toast.test.tsx create mode 100644 packages/ui/src/components/toast.tsx create mode 100644 packages/ui/src/components/toast.variants.ts create mode 100644 packages/ui/src/components/tooltip.test.tsx create mode 100644 packages/ui/src/components/tooltip.tsx create mode 100644 packages/ui/src/components/tooltip.variants.ts create mode 100644 packages/ui/src/test/setup.ts create mode 100644 vitest.config.ts diff --git a/apps/docs/src/components/checkbox.stories.tsx b/apps/docs/src/components/checkbox.stories.tsx new file mode 100644 index 0000000..c9a4f65 --- /dev/null +++ b/apps/docs/src/components/checkbox.stories.tsx @@ -0,0 +1,57 @@ +import { Checkbox, Label } from "@ai-ui/ui"; +import type { Meta, StoryObj } from "@storybook/react"; + +const meta = { + title: "Components/Checkbox", + component: Checkbox, + args: { + defaultChecked: true + }, + argTypes: { + className: { + control: false + }, + defaultChecked: { + control: "boolean" + }, + disabled: { + control: "boolean" + }, + invalid: { + control: "boolean" + } + }, + parameters: { + layout: "centered" + }, + tags: ["autodocs"] +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Playground: Story = {}; + +export const States: Story = { + render: () => ( +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ ) +}; diff --git a/apps/docs/src/components/dialog.stories.tsx b/apps/docs/src/components/dialog.stories.tsx new file mode 100644 index 0000000..d0947d9 --- /dev/null +++ b/apps/docs/src/components/dialog.stories.tsx @@ -0,0 +1,46 @@ +import { + Button, + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger +} from "@ai-ui/ui"; +import type { Meta, StoryObj } from "@storybook/react"; + +const meta = { + title: "Components/Dialog", + component: Dialog, + parameters: { + layout: "centered" + }, + tags: ["autodocs"] +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Playground: Story = { + render: () => ( + + + + + + + Launch this release? + + This will notify the routing team and publish the release note to the activity feed. + + + + + + + + + ) +}; diff --git a/apps/docs/src/components/dropdown-menu.stories.tsx b/apps/docs/src/components/dropdown-menu.stories.tsx new file mode 100644 index 0000000..6d59028 --- /dev/null +++ b/apps/docs/src/components/dropdown-menu.stories.tsx @@ -0,0 +1,66 @@ +import { + Button, + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuTrigger +} from "@ai-ui/ui"; +import type { Meta, StoryObj } from "@storybook/react"; + +const meta = { + title: "Components/DropdownMenu", + component: DropdownMenu, + parameters: { + layout: "centered" + }, + tags: ["autodocs"] +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Playground: Story = { + render: () => ( + + + + + + Launch actions + + Review summary + R + + + Share preview + S + + + Notify stakeholders + + + Staged rollout + Global rollout + + + + More actions + + Duplicate release + Archive release + + + + + ) +}; diff --git a/apps/docs/src/components/field.stories.tsx b/apps/docs/src/components/field.stories.tsx new file mode 100644 index 0000000..4474128 --- /dev/null +++ b/apps/docs/src/components/field.stories.tsx @@ -0,0 +1,50 @@ +import { Field, FieldControl, FieldDescription, FieldError, Input, Label, Textarea } from "@ai-ui/ui"; +import type { Meta, StoryObj } from "@storybook/react"; + +function FieldExamples() { + return ( +
+ + + + + + This appears in your internal release log and changelog. + + + + + + + + + Use lowercase letters, numbers, and hyphens only. + Slug cannot contain spaces or punctuation. + + + + + + +