{"_id":"@daniellim0510/filebox","_rev":"4-88eba6ec913e53bf9839eda3a7b2defb","name":"@daniellim0510/filebox","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.0":{"name":"@daniellim0510/filebox","version":"1.0.0","keywords":["nextjs","react","filebox","zip","file-upload","virus-scan","file-validation"],"author":{"name":"Daniel Lim"},"license":"MIT","_id":"@daniellim0510/filebox@1.0.0","maintainers":[{"name":"daniellim0510","email":"daniellim0510@gmail.com"}],"homepage":"https://github.com/daniellim051000/kami-filebox#readme","bugs":{"url":"https://github.com/daniellim051000/kami-filebox/issues"},"dist":{"shasum":"44fa2fb314122d1fb1c2e10b9467be286572dbb2","tarball":"https://registry.npmjs.org/@daniellim0510/filebox/-/filebox-1.0.0.tgz","fileCount":8,"integrity":"sha512-8jxblWxkc93osvgVlWqTjfcfvQJtqXwbf6tNH2dp/NF7GJEUsr2JuEFZdf2ALIlDNTR/1UG7ygAHaDgMatbP2g==","signatures":[{"sig":"MEUCIEyOSMipJOT7zZ7fJwrF0s2Ei/YJAqUSy7I5BLm3uV5zAiEAt+wyRdfjG0EwotYioxFpy4In1Kl4P/bNg1Abj2/Fw8s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":204478},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"cdb8be8c3dbb87e593bd2ee3aaa27e7e0781a4fe","scripts":{"dev":"next dev","lint":"eslint","build":"next build","start":"next start","build:lib":"tsup"},"_npmUser":{"name":"daniellim0510","email":"daniellim0510@gmail.com"},"repository":{"url":"git+https://github.com/daniellim051000/kami-filebox.git","type":"git"},"_npmVersion":"11.6.0","description":"A NextJS library for collecting, validating, and archiving files into a ZIP with virus scanning","directories":{},"_nodeVersion":"24.8.0","dependencies":{"jszip":"^3.10.1","react-dropzone":"^14.3.8","react-hot-toast":"^2.6.0","@headlessui/react":"^2.2.9"},"_hasShrinkwrap":false,"devDependencies":{"next":"16.0.1","tsup":"^8.5.0","react":"19.2.0","eslint":"^9","react-dom":"19.2.0","typescript":"^5","@types/node":"^20","tailwindcss":"^4","@types/jszip":"^3.4.0","@types/react":"^19","@types/react-dom":"^19","eslint-config-next":"16.0.1","@tailwindcss/postcss":"^4"},"peerDependencies":{"next":"^14.0.0 || ^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/filebox_1.0.0_1761984972371_0.6407721193672042","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@daniellim0510/filebox","version":"1.0.1","keywords":["nextjs","react","filebox","zip","file-upload","virus-scan","file-validation"],"author":{"name":"Daniel Lim"},"license":"MIT","_id":"@daniellim0510/filebox@1.0.1","maintainers":[{"name":"daniellim0510","email":"daniellim0510@gmail.com"}],"homepage":"https://github.com/daniellim051000/kami-filebox#readme","bugs":{"url":"https://github.com/daniellim051000/kami-filebox/issues"},"dist":{"shasum":"04f61d6229dde2014848bac5bd864d5488885085","tarball":"https://registry.npmjs.org/@daniellim0510/filebox/-/filebox-1.0.1.tgz","fileCount":9,"integrity":"sha512-hmh/OwuVYBO9DbeZ6ushaAoOfUCNqgdej3HmqdZYLWWsrprWeFpquIvWyBtW2CBM7YY6x/PlZf6aNhCZdoKXww==","signatures":[{"sig":"MEUCIBZHyt8NuG+OwH5yb/0hu9NqVKXVviilOJTd4V/EUtHyAiEA9xR8rWgjg7CKiLvht0stLs0GDckMtRujH34Gao4OM9c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":358421},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles.css":"./dist/styles.css"},"gitHead":"5a16457054edc8d8008ecf729e859a02dc21ca67","scripts":{"dev":"next dev","lint":"eslint","build":"next build","start":"next start","build:css":"tailwindcss --input src/styles.css --output dist/styles.css --minify","build:lib":"tsup && npm run build:css"},"_npmUser":{"name":"daniellim0510","email":"daniellim0510@gmail.com"},"repository":{"url":"git+https://github.com/daniellim051000/kami-filebox.git","type":"git"},"_npmVersion":"11.6.0","description":"A NextJS library for collecting, validating, and archiving files into a ZIP with virus scanning","directories":{},"_nodeVersion":"24.8.0","dependencies":{"jszip":"^3.10.1","react-dropzone":"^14.3.8","react-hot-toast":"^2.6.0","@headlessui/react":"^2.2.9"},"_hasShrinkwrap":false,"devDependencies":{"next":"16.0.1","tsup":"^8.5.0","react":"19.2.0","eslint":"^9","react-dom":"19.2.0","typescript":"^5","@types/node":"^20","tailwindcss":"^4","@types/jszip":"^3.4.0","@types/react":"^19","@types/react-dom":"^19","eslint-config-next":"16.0.1","@tailwindcss/postcss":"^4"},"peerDependencies":{"next":"^14.0.0 || ^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/filebox_1.0.1_1762000195326_0.3156775249019157","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@daniellim0510/filebox","version":"1.0.2","keywords":["nextjs","react","filebox","zip","file-upload","virus-scan","file-validation"],"author":{"name":"Daniel Lim"},"license":"MIT","_id":"@daniellim0510/filebox@1.0.2","maintainers":[{"name":"daniellim0510","email":"daniellim0510@gmail.com"}],"homepage":"https://github.com/daniellim051000/kami-filebox#readme","bugs":{"url":"https://github.com/daniellim051000/kami-filebox/issues"},"dist":{"shasum":"672e21b890789eb4e15fcb80fc186026d48f60f4","tarball":"https://registry.npmjs.org/@daniellim0510/filebox/-/filebox-1.0.2.tgz","fileCount":9,"integrity":"sha512-e2Kv2+RNd54G7/K1AXLAw9Jf39v5ZRPADp3MFfK5Q5aeWqfh6gFXLrp2ZAV6hcRa6Wxr35aZZNKY2QWnjL2Ftw==","signatures":[{"sig":"MEYCIQDsbE/zd7sYQujqTU0geM0O3BR+TAw3xs/i4qZd6qNnvwIhAItkvDnP68lSKUaeLhsyjNxh6Uu2wMlvNwgy6OOixrDb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":356627},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles.css":"./dist/styles.css"},"gitHead":"e6f59f030555b0a9e476a09daad4ecf09581df48","scripts":{"dev":"next dev","lint":"eslint","build":"next build","start":"next start","build:css":"tailwindcss --input src/styles.css --output dist/styles.css --minify","build:lib":"tsup && npm run build:css"},"_npmUser":{"name":"daniellim0510","email":"daniellim0510@gmail.com"},"repository":{"url":"git+https://github.com/daniellim051000/kami-filebox.git","type":"git"},"_npmVersion":"11.6.0","description":"A NextJS library for collecting, validating, and archiving files into a ZIP with virus scanning","directories":{},"_nodeVersion":"24.8.0","dependencies":{"jszip":"^3.10.1","react-dropzone":"^14.3.8","react-hot-toast":"^2.6.0","@headlessui/react":"^2.2.9"},"_hasShrinkwrap":false,"devDependencies":{"next":"16.0.1","tsup":"^8.5.0","react":"19.2.0","eslint":"^9","react-dom":"19.2.0","typescript":"^5","@types/node":"^20","tailwindcss":"^4","@types/jszip":"^3.4.0","@types/react":"^19","@types/react-dom":"^19","eslint-config-next":"16.0.1","@tailwindcss/postcss":"^4"},"peerDependencies":{"next":"^14.0.0 || ^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/filebox_1.0.2_1762000862172_0.6857797029624944","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@daniellim0510/filebox","version":"1.0.3","description":"A NextJS library for collecting, validating, and archiving files into a ZIP with virus scanning","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles.css":"./dist/styles.css"},"keywords":["nextjs","react","filebox","zip","file-upload","virus-scan","file-validation"],"author":{"name":"Daniel Lim"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/daniellim051000/kami-filebox.git"},"scripts":{"dev":"next dev","build":"next build","build:css":"tailwindcss --input src/styles.css --output dist/styles.css --minify","build:lib":"tsup && npm run build:css","start":"next start","lint":"eslint"},"dependencies":{"@headlessui/react":"^2.2.9","jszip":"^3.10.1","react-dropzone":"^14.3.8","react-hot-toast":"^2.6.0"},"peerDependencies":{"next":"^14.0.0 || ^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"devDependencies":{"@tailwindcss/postcss":"^4","@types/jszip":"^3.4.0","@types/node":"^20","@types/react":"^19","@types/react-dom":"^19","eslint":"^9","eslint-config-next":"16.0.1","next":"16.0.1","react":"19.2.0","react-dom":"19.2.0","tailwindcss":"^4","tsup":"^8.5.0","typescript":"^5"},"_id":"@daniellim0510/filebox@1.0.3","gitHead":"28f7df992587fe3438e710469a918da0a967cc77","bugs":{"url":"https://github.com/daniellim051000/kami-filebox/issues"},"homepage":"https://github.com/daniellim051000/kami-filebox#readme","_nodeVersion":"24.8.0","_npmVersion":"11.6.0","dist":{"integrity":"sha512-gMChcEYKPSZK5MBgS+KmqKyQYIOUs0R5hxvStJ9MDXl1gNNgrC2DmXTfgbpuHAdEnlLJJzJ+24pwvdzwudEWpQ==","shasum":"bfeec0f967f5ea1118d1f919a02721c207e07524","tarball":"https://registry.npmjs.org/@daniellim0510/filebox/-/filebox-1.0.3.tgz","fileCount":9,"unpackedSize":356627,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDC/We5knP3ugsXQOEvGaAUgcDe4D+MzyVeShM9r3AG6gIgKNg8lGSEeWTXMCJgSiq4e3qZuuAnP/9NSSRfhmy+V0M="}]},"_npmUser":{"name":"daniellim0510","email":"daniellim0510@gmail.com"},"directories":{},"maintainers":[{"name":"daniellim0510","email":"daniellim0510@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/filebox_1.0.3_1762094379761_0.4559265865229081"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-01T08:16:12.212Z","modified":"2025-11-02T14:39:40.213Z","1.0.0":"2025-11-01T08:16:12.584Z","1.0.1":"2025-11-01T12:29:55.531Z","1.0.2":"2025-11-01T12:41:02.398Z","1.0.3":"2025-11-02T14:39:39.999Z"},"bugs":{"url":"https://github.com/daniellim051000/kami-filebox/issues"},"author":{"name":"Daniel Lim"},"license":"MIT","homepage":"https://github.com/daniellim051000/kami-filebox#readme","keywords":["nextjs","react","filebox","zip","file-upload","virus-scan","file-validation"],"repository":{"type":"git","url":"git+https://github.com/daniellim051000/kami-filebox.git"},"description":"A NextJS library for collecting, validating, and archiving files into a ZIP with virus scanning","maintainers":[{"name":"daniellim0510","email":"daniellim0510@gmail.com"}],"readme":"# KAMI FileBox\n\nA secure, client-side file collection and archiving library for Next.js applications. Easily collect, validate, scan, and package multiple files into a ZIP archive with a beautiful modal interface.\n\n## Features\n\n- **Secure File Validation**: Whitelist-based file type validation by extension and MIME type\n- **Client-Side Security Scanning**: Basic security checks including file signature verification and content scanning\n- **Drag & Drop Interface**: Intuitive file selection with drag-and-drop support\n- **ZIP Archive Creation**: Automatic packaging of validated files into a ZIP archive\n- **Real-time Status Updates**: Visual feedback for validation and scanning progress\n- **Toast Notifications**: User-friendly notifications for all operations\n- **TypeScript Support**: Full TypeScript support with comprehensive type definitions\n- **Customizable**: Configurable file size limits, allowed types, and scanning options\n- **Dark Mode Support**: Built-in dark mode styling\n\n## Development\n\nTo run the demo application:\n\n```bash\n# Install dependencies\nnpm install\n\n# Run development server\nnpm run dev\n\n# Build the library\nnpm run build:lib\n\n# Build the Next.js app\nnpm run build\n```\n\nOpen [http://localhost:3000](http://localhost:3000) to see the demo.\n\n## Installation\n\n```bash\nnpm install @daniellim0510/filebox\n# or\nyarn add @daniellim0510/filebox\n# or\npnpm add @daniellim0510/filebox\n```\n\n## Quick Start\n\n```tsx\n'use client';\n\nimport { useState } from 'react';\nimport { FileBoxModal } from '@daniellim0510/filebox';\n\nexport default function MyComponent() {\n  const [isOpen, setIsOpen] = useState(false);\n\n  const handleComplete = (zipBlob: Blob, filenames: string[]) => {\n    // Handle the created ZIP archive\n    console.log('Archive created with files:', filenames);\n\n    // Download the archive\n    const url = URL.createObjectURL(zipBlob);\n    const link = document.createElement('a');\n    link.href = url;\n    link.download = 'my-archive.zip';\n    link.click();\n    URL.revokeObjectURL(url);\n  };\n\n  return (\n    <>\n      <button onClick={() => setIsOpen(true)}>\n        Open FileBox\n      </button>\n\n      <FileBoxModal\n        isOpen={isOpen}\n        onClose={() => setIsOpen(false)}\n        onComplete={handleComplete}\n      />\n    </>\n  );\n}\n```\n\n## Supported File Types\n\n### Documents\n- PDF (`.pdf`)\n- Text (`.txt`)\n- Word (`.docx`)\n- Excel (`.xlsx`)\n- PowerPoint (`.pptx`)\n- HTML (`.html`)\n- Markdown (`.md`)\n- JSON (`.json`)\n\n### Images\n- JPEG (`.jpg`, `.jpeg`)\n- PNG (`.png`)\n- GIF (`.gif`)\n- WebP (`.webp`)\n- SVG (`.svg`)\n- BMP (`.bmp`)\n- HEIF (`.heif`)\n\n### Audio\n- MP3 (`.mp3`)\n- WAV (`.wav`)\n- OGG (`.ogg`)\n- AIFF (`.aiff`)\n- AAC (`.aac`)\n- FLAC (`.flac`)\n\n### Video\n- QuickTime (`.mov`)\n- MP4 (`.mp4`)\n- AVI (`.avi`)\n- WMV (`.wmv`)\n- MKV (`.mkv`)\n\n## Configuration\n\nYou can customize FileBox behavior by passing a `config` prop:\n\n```tsx\n<FileBoxModal\n  isOpen={isOpen}\n  onClose={onClose}\n  onComplete={handleComplete}\n  config={{\n    maxFileSize: 10 * 1024 * 1024,      // 10MB per file\n    maxTotalSize: 50 * 1024 * 1024,     // 50MB total\n    maxFiles: 20,                        // Maximum 20 files\n    allowedExtensions: ['.pdf', '.jpg'], // Custom allowed extensions\n    allowedMimeTypes: ['application/pdf', 'image/jpeg'], // Custom MIME types\n    virusScanner: {\n      enabled: true,                     // Enable/disable scanning\n      apiEndpoint: '/api/scan',          // Custom scan API endpoint\n      timeout: 30000,                    // Scan timeout in ms\n    },\n  }}\n/>\n```\n\n## API Reference\n\n### FileBoxModal Props\n\n| Prop | Type | Required | Description |\n|------|------|----------|-------------|\n| `isOpen` | `boolean` | Yes | Controls modal visibility |\n| `onClose` | `() => void` | Yes | Callback when modal should close |\n| `onComplete` | `(zipBlob: Blob, filenames: string[]) => void` | Yes | Callback when archive is created |\n| `config` | `FileBoxConfig` | No | Configuration options |\n| `className` | `string` | No | Additional CSS classes |\n\n### FileBoxConfig\n\n```typescript\ninterface FileBoxConfig {\n  maxFileSize?: number;        // Max size per file in bytes (default: 10MB)\n  maxTotalSize?: number;       // Max total size in bytes (default: 50MB)\n  maxFiles?: number;           // Max number of files (default: unlimited)\n  allowedExtensions?: string[]; // Allowed file extensions\n  allowedMimeTypes?: string[];  // Allowed MIME types\n  virusScanner?: VirusScannerConfig;\n}\n\ninterface VirusScannerConfig {\n  enabled?: boolean;    // Enable scanning (default: true)\n  apiEndpoint?: string; // Custom API endpoint for server-side scanning\n  timeout?: number;     // Scan timeout in ms (default: 30000)\n}\n```\n\n## Security Notes\n\n1. **Client-Side Scanning Limitations**: The built-in client-side scanning performs basic security checks but is NOT a replacement for proper virus scanning. For production use, integrate with a server-side virus scanner like ClamAV.\n\n2. **File Validation**: Always validate files on both client and server side. Never trust client-side validation alone.\n\n3. **MIME Type Spoofing**: The library checks both file extensions and MIME types, but determined attackers can still spoof these. Use server-side scanning for critical applications.\n\n4. **File Size Limits**: Configure appropriate file size limits to prevent memory issues and DoS attacks.\n\n\n\n## License\n\nMIT\n\n## Author\n\nDaniel Lim\n\n## Repository\n\n[https://github.com/daniellim051000/kami-filebox](https://github.com/daniellim051000/kami-filebox)\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## Support\n\nFor issues and questions, please use the [GitHub issue tracker](https://github.com/daniellim051000/kami-filebox/issues).\n","readmeFilename":"README.md"}