- Batch 6: FAB, FormField, FloatingInput, AvatarUpload - Batch 7: Modal, ConfirmationDialog, ImageViewerModal, ErrorDisplay, LoadingState - Batch 8: DataList, WaveformVisualizer, OptimizedImage, VirtualizedList - Batch 9: ImageCropper, LoadingSpinner, FocusTrap - Achieved total coverage for src/components/ui
67 lines
2 KiB
TypeScript
67 lines
2 KiB
TypeScript
import type { Meta, StoryObj } from '@storybook/react';
|
|
import { ImageCropper } from './ImageCropper';
|
|
import { Button } from './button';
|
|
import { useState } from 'react';
|
|
|
|
const meta = {
|
|
title: 'UI/ImageCropper',
|
|
component: ImageCropper,
|
|
tags: ['autodocs'],
|
|
argTypes: {
|
|
aspectRatio: { control: 'number' },
|
|
circularCrop: { control: 'boolean' },
|
|
},
|
|
} satisfies Meta<typeof ImageCropper>;
|
|
|
|
export default meta;
|
|
type Story = StoryObj<typeof meta>;
|
|
|
|
export const Default: Story = {
|
|
render: (args) => {
|
|
const [open, setOpen] = useState(false);
|
|
|
|
return (
|
|
<>
|
|
<Button onClick={() => setOpen(true)}>Open Cropper</Button>
|
|
{open && (
|
|
<ImageCropper
|
|
{...args}
|
|
imageSrc="https://images.unsplash.com/photo-1620121692029-d088224ddc74"
|
|
onCancel={() => setOpen(false)}
|
|
onCropComplete={(area) => {
|
|
console.log('Cropped area:', area);
|
|
setOpen(false);
|
|
}}
|
|
/>
|
|
)}
|
|
</>
|
|
);
|
|
},
|
|
args: {
|
|
aspectRatio: 1,
|
|
}
|
|
};
|
|
|
|
export const BannerCrop: Story = {
|
|
render: (args) => {
|
|
const [open, setOpen] = useState(false);
|
|
|
|
return (
|
|
<>
|
|
<Button onClick={() => setOpen(true)}>Crop Banner (3:1)</Button>
|
|
{open && (
|
|
<ImageCropper
|
|
{...args}
|
|
imageSrc="https://images.unsplash.com/photo-1620121692029-d088224ddc74"
|
|
aspectRatio={3}
|
|
onCancel={() => setOpen(false)}
|
|
onCropComplete={(area) => {
|
|
console.log('Cropped area:', area);
|
|
setOpen(false);
|
|
}}
|
|
/>
|
|
)}
|
|
</>
|
|
);
|
|
},
|
|
};
|