diff --git a/packages/design-system/package.json b/packages/design-system/package.json index cd6db22..81ed7df 100644 --- a/packages/design-system/package.json +++ b/packages/design-system/package.json @@ -26,7 +26,8 @@ "date-fns": "3.6.0", "react-colorful": "5.6.1", "react-countdown": "2.3.5", - "react-day-picker": "8.10.1" + "react-day-picker": "8.10.1", + "react-resizable-panels": "2.0.22" }, "devDependencies": { "@ladle/react": "4.1.0", diff --git a/packages/design-system/src/ui/resizable.stories.tsx b/packages/design-system/src/ui/resizable.stories.tsx new file mode 100644 index 0000000..2cdc79e --- /dev/null +++ b/packages/design-system/src/ui/resizable.stories.tsx @@ -0,0 +1,39 @@ +import { + ResizableHandle, + ResizablePanel, + ResizablePanelGroup, +} from '@/ui/resizable' +import type { Story, StoryDefault } from '@ladle/react' + +export default { + title: 'Shadcn/Resizable', +} satisfies StoryDefault + +export const Default: Story = () => ( + + +
+ One +
+
+ + + + +
+ Two +
+
+ + +
+ Three +
+
+
+
+
+) diff --git a/packages/design-system/src/ui/resizable.tsx b/packages/design-system/src/ui/resizable.tsx new file mode 100644 index 0000000..cd3cb0e --- /dev/null +++ b/packages/design-system/src/ui/resizable.tsx @@ -0,0 +1,43 @@ +import { GripVertical } from "lucide-react" +import * as ResizablePrimitive from "react-resizable-panels" + +import { cn } from "@/lib/utils" + +const ResizablePanelGroup = ({ + className, + ...props +}: React.ComponentProps) => ( + +) + +const ResizablePanel = ResizablePrimitive.Panel + +const ResizableHandle = ({ + withHandle, + className, + ...props +}: React.ComponentProps & { + withHandle?: boolean +}) => ( + div]:rotate-90", + className + )} + {...props} + > + {withHandle && ( +
+ +
+ )} +
+) + +export { ResizablePanelGroup, ResizablePanel, ResizableHandle } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4ebcf69..dda56f5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -137,6 +137,9 @@ importers: react-dom: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) + react-resizable-panels: + specifier: 2.0.22 + version: 2.0.22(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tailwind-merge: specifier: ^2.4.0 version: 2.4.0 @@ -5261,6 +5264,12 @@ packages: '@types/react': optional: true + react-resizable-panels@2.0.22: + resolution: {integrity: sha512-G8x8o7wjQxCG+iF4x4ngKVBpe0CY+DAZ/SaiDoqBEt0yuKJe9OE/VVYMBMMugQ3GyQ65NnSJt23tujlaZZe75A==} + peerDependencies: + react: ^16.14.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 + react-style-singleton@2.2.1: resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} @@ -12347,6 +12356,11 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + react-resizable-panels@2.0.22(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-style-singleton@2.2.1(@types/react@18.3.3)(react@18.3.1): dependencies: get-nonce: 1.0.1