import type { Meta, StoryObj } from '@storybook/react'; import { FileUpload } from './file-upload'; import { useFileUpload } from './use-file-upload'; import React from 'react'; import { Upload, X, FileIcon, AlertCircle } from 'lucide-react'; const meta: Meta = { title: 'UI/FileUpload', component: FileUpload, render: args => , argTypes: { multiple: { control: 'boolean' }, disabled: { control: 'boolean' }, size: { control: 'radio', options: ['default', 'compact'] }, }, }; export default meta; type Story = StoryObj; export const Default: Story = { args: { accept: 'image/*,.pdf', multiple: false, }, render: args => (
console.log('Files:', files)} />
), }; export const Multiple: Story = { args: { accept: '*', multiple: true, }, render: args => (
console.log('Multiple Files:', files)} />
), }; export const ImageOnly: Story = { args: { accept: 'image/*', multiple: false, maxSize: 1024 * 1024, // 1MB }, render: args => (
console.log('Image:', files)} />
), }; export const Compact: Story = { args: { accept: '*', multiple: true, size: 'compact', }, render: args => (
console.log('Files:', files)} />
), }; export const CustomLabels: Story = { args: { accept: '*', multiple: true, }, render: args => (
console.log('Files:', files)} />
), }; /** * ## useFileUpload — Headless Hook * * Use `useFileUpload` when you need the full drag-and-drop logic but want to * render a completely custom drop-zone UI. The hook returns all state and * handlers; you wire them to whatever markup you like. * * ```tsx * import { useFileUpload } from '@xertica/ui/file-upload'; * * const { * files, dragActive, errorMessage, inputRef, * handleDrag, handleDrop, handleChange, removeFile, openFileDialog, * } = useFileUpload({ maxFiles: 3, maxSize: 10 * 1024 * 1024 }); * ``` */ export const HeadlessHook: Story = { name: 'useFileUpload (headless)', render: () => { const { files, dragActive, errorMessage, inputRef, handleDrag, handleDrop, handleChange, removeFile, openFileDialog, } = useFileUpload({ maxFiles: 3, maxSize: 2 * 1024 * 1024, // 2MB onFilesChange: f => console.log('files changed', f), }); return (
{/* Custom drop-zone — completely different from the default FileUpload UI */}

{dragActive ? 'Drop files here…' : 'Drag files or click to browse'}

Up to 3 files · Max 2 MB each

{errorMessage && (
{errorMessage}
)} {files.length > 0 && (
    {files.map((file, i) => (
  • {file.name}
  • ))}
)}
); }, };