{"_id":"@caprionlinesrl/puck-plugin-media","_rev":"8-4f2591f5698fa44b7ac1239ad8882cc7","name":"@caprionlinesrl/puck-plugin-media","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.4":{"name":"@caprionlinesrl/puck-plugin-media","version":"0.1.4","keywords":["puck","plugin","media","image","gallery","cms","editor"],"author":{"name":"Capri On Line S.r.l."},"license":"MIT","_id":"@caprionlinesrl/puck-plugin-media@0.1.4","maintainers":[{"name":"asterixcapri","email":"aleast@capri.it"}],"homepage":"https://github.com/caprionlinesrl/puck-plugin-media#readme","bugs":{"url":"https://github.com/caprionlinesrl/puck-plugin-media/issues"},"dist":{"shasum":"0e8075aeee403a8e6032fedb0dd0924806851cb9","tarball":"https://registry.npmjs.org/@caprionlinesrl/puck-plugin-media/-/puck-plugin-media-0.1.4.tgz","fileCount":11,"integrity":"sha512-8HgOCBGKTercn1N25kg3lqldpoEfOMVuQ5h8MlC1Ko1j96pBLum5YBP+CFSgzQe6cqw8tX/0Kt8Dj/E79dtP7A==","signatures":[{"sig":"MEYCIQCfCvkecNpQH8Rrkpfu2/sz1mo2UP2UEI5Aj4+GwWpLRwIhAOeFxoohpa6l/HMYpDgmc+VsiW/p3qgch7zK1zmL04SW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caprionlinesrl%2fpuck-plugin-media@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":826069},"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/index.css"},"gitHead":"d9a0d2d2ad5af4d4fe1b9a5c284a581257a176bd","scripts":{"dev":"tsup --watch","demo":"yarn workspace demo dev","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"yarn typecheck && yarn build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:92eea80c-52c3-44f9-8658-fa5114adfca7"}},"repository":{"url":"git+https://github.com/caprionlinesrl/puck-plugin-media.git","type":"git"},"workspaces":["demo"],"_npmVersion":"11.6.2","description":"Puck plugin for media library integration with grid-based image picker","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.12.0","dependencies":{"lucide-react":"^0.562.0"},"_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"tsup":"^8.5.1","react":"^19.2.3","react-dom":"^19.2.3","typescript":"^5.9.3","@types/react":"^19.2.9","@puckeditor/core":"^0.21.0","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@puckeditor/core":">=0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/puck-plugin-media_0.1.4_1769103407925_0.03022453984803275","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@caprionlinesrl/puck-plugin-media","version":"0.1.5","keywords":["puck","plugin","media","image","gallery","cms","editor"],"author":{"name":"Capri On Line S.r.l."},"license":"MIT","_id":"@caprionlinesrl/puck-plugin-media@0.1.5","maintainers":[{"name":"asterixcapri","email":"aleast@capri.it"}],"homepage":"https://github.com/caprionlinesrl/puck-plugin-media#readme","bugs":{"url":"https://github.com/caprionlinesrl/puck-plugin-media/issues"},"dist":{"shasum":"780594d3d1b7a2d0d586e13e023cdb2b8be02cbc","tarball":"https://registry.npmjs.org/@caprionlinesrl/puck-plugin-media/-/puck-plugin-media-0.1.5.tgz","fileCount":19,"integrity":"sha512-Mr4XgyaeZqbvkKPRwFcr8d+HRQLPOnYu6ZqHw6Glj1K3uxXkWjEyR5wWeFp0hTdX//irSn/cg6BHKmeRoYNzMA==","signatures":[{"sig":"MEYCIQDSiYu0YwlboQ0ustASyEaOeiRoVFSOGYp+FFsh2gIGYQIhAO3bC62LseaPeZL32gZGrZulj+HFlJcnrxiAMDkfV2fn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caprionlinesrl%2fpuck-plugin-media@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":929669},"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"},"./mocks":{"types":"./dist/mocks/index.d.ts","import":"./dist/mocks/index.mjs","require":"./dist/mocks/index.js"},"./styles.css":"./dist/index.css"},"gitHead":"9a2e5f5d2f9754a61bfa44fe8aae1ae508a398b2","scripts":{"dev":"tsup --watch","demo":"yarn workspace demo dev","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"yarn typecheck && yarn build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:92eea80c-52c3-44f9-8658-fa5114adfca7"}},"repository":{"url":"git+https://github.com/caprionlinesrl/puck-plugin-media.git","type":"git"},"workspaces":["demo"],"_npmVersion":"11.6.2","description":"Puck plugin for media library integration with grid-based image picker","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.12.0","dependencies":{"lucide-react":"^0.562.0"},"_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"tsup":"^8.5.1","react":"^19.2.3","react-dom":"^19.2.3","typescript":"^5.9.3","@types/react":"^19.2.9","@puckeditor/core":"^0.21.0","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@puckeditor/core":">=0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/puck-plugin-media_0.1.5_1769105436977_0.826142301041447","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@caprionlinesrl/puck-plugin-media","version":"0.1.6","keywords":["puck","plugin","media","image","gallery","cms","editor"],"author":{"name":"Capri On Line S.r.l."},"license":"MIT","_id":"@caprionlinesrl/puck-plugin-media@0.1.6","maintainers":[{"name":"asterixcapri","email":"aleast@capri.it"}],"homepage":"https://github.com/caprionlinesrl/puck-plugin-media#readme","bugs":{"url":"https://github.com/caprionlinesrl/puck-plugin-media/issues"},"dist":{"shasum":"77519ccdf5760c855c4502f2828a07e680a1e8a9","tarball":"https://registry.npmjs.org/@caprionlinesrl/puck-plugin-media/-/puck-plugin-media-0.1.6.tgz","fileCount":19,"integrity":"sha512-7xEkw8A9WwrtRTIKY1hpfW1S99i2h098aK0aivccyQI/YCwV4nKpt+2EQe8kP7WoA7t0DjVAh4fnmzmguLeYtA==","signatures":[{"sig":"MEUCIAM/T1Qz6oFX06/X7F7qAMwz43z8H50rlIP2SWDAkQRYAiEA+4cw6VbuuiQyHPmfp7NfhpPdik5pu9fDr16ejGUfSkQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caprionlinesrl%2fpuck-plugin-media@0.1.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":992722},"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"},"./mocks":{"types":"./dist/mocks/index.d.ts","import":"./dist/mocks/index.mjs","require":"./dist/mocks/index.js"},"./styles.css":"./dist/index.css"},"gitHead":"c172de45b1743c2ed162933c9e49392fdefd4096","scripts":{"dev":"tsup --watch","demo":"yarn workspace demo dev","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"yarn typecheck && yarn build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:92eea80c-52c3-44f9-8658-fa5114adfca7"}},"repository":{"url":"git+https://github.com/caprionlinesrl/puck-plugin-media.git","type":"git"},"workspaces":["demo"],"_npmVersion":"11.6.2","description":"Puck plugin for media library integration with grid-based image picker","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"tsup":"^8.5.1","react":"^19.2.3","react-dom":"^19.2.3","typescript":"^5.9.3","@types/react":"^19.2.9","lucide-react":"^0.468.0","@puckeditor/core":"^0.21.0","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","@puckeditor/core":">=0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/puck-plugin-media_0.1.6_1769161522366_0.5111132818931612","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@caprionlinesrl/puck-plugin-media","version":"0.1.7","keywords":["puck","plugin","media","image","gallery","cms","editor"],"author":{"name":"Capri On Line S.r.l."},"license":"MIT","_id":"@caprionlinesrl/puck-plugin-media@0.1.7","maintainers":[{"name":"asterixcapri","email":"aleast@capri.it"}],"homepage":"https://github.com/caprionlinesrl/puck-plugin-media#readme","bugs":{"url":"https://github.com/caprionlinesrl/puck-plugin-media/issues"},"dist":{"shasum":"2a000212537087e480f5c8cc520fb97b2be5c4ff","tarball":"https://registry.npmjs.org/@caprionlinesrl/puck-plugin-media/-/puck-plugin-media-0.1.7.tgz","fileCount":19,"integrity":"sha512-OaZz1rMpoGNQJVxjEO3Kx7E4TE3e9B755uasAyySROQ1SDlB9yc9thVtyBeddJeYz6ZgDIEDoxTmPO2d8tnJQA==","signatures":[{"sig":"MEQCIEORPapcdl6OjazzB/BZxpq7alKSqB1UFC3IHxc4kg3cAiA2pECNxTDbsy+vpkK+wKubGxTWaZ1vmKDH1HH/lEj7Jw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caprionlinesrl%2fpuck-plugin-media@0.1.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":993082},"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"},"./mocks":{"types":"./dist/mocks/index.d.ts","import":"./dist/mocks/index.mjs","require":"./dist/mocks/index.js"},"./styles.css":"./dist/index.css"},"gitHead":"b06bd7a5b8f64d203250b047789b961ee60cfb69","scripts":{"dev":"tsup --watch","demo":"yarn workspace demo dev","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"yarn typecheck && yarn build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:92eea80c-52c3-44f9-8658-fa5114adfca7"}},"repository":{"url":"git+https://github.com/caprionlinesrl/puck-plugin-media.git","type":"git"},"workspaces":["demo"],"_npmVersion":"11.6.2","description":"Puck plugin for media library integration with grid-based image picker","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"tsup":"^8.5.1","react":"^19.2.3","react-dom":"^19.2.3","typescript":"^5.9.3","@types/react":"^19.2.9","lucide-react":"^0.468.0","@puckeditor/core":"^0.21.0","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","@puckeditor/core":">=0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/puck-plugin-media_0.1.7_1769175693438_0.25731794585975387","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@caprionlinesrl/puck-plugin-media","version":"0.2.0","keywords":["puck","plugin","media","image","gallery","cms","editor"],"author":{"name":"Capri On Line S.r.l."},"license":"MIT","_id":"@caprionlinesrl/puck-plugin-media@0.2.0","maintainers":[{"name":"asterixcapri","email":"aleast@capri.it"}],"homepage":"https://github.com/caprionlinesrl/puck-plugin-media#readme","bugs":{"url":"https://github.com/caprionlinesrl/puck-plugin-media/issues"},"dist":{"shasum":"414acb9dc23a83a12ec9a3f80641fa2ccab6ee92","tarball":"https://registry.npmjs.org/@caprionlinesrl/puck-plugin-media/-/puck-plugin-media-0.2.0.tgz","fileCount":19,"integrity":"sha512-Waczp8y2OR4u3Z1gVh8F4VM/qzoRCSw0UMj/43zcGT6WfUmASX5fly5aTQNZtoCvsA6KlJEVziAy+KagYJP2pA==","signatures":[{"sig":"MEQCIEDL71b8PlNLaoa8GhK65hMLc7q5uAmv1DbKJUTB5UPXAiAP5vwLWcxv0JEZl1oBW6qUgkwUo0OqyfEXGIh9uYHBHA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caprionlinesrl%2fpuck-plugin-media@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":998429},"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"},"./mocks":{"types":"./dist/mocks/index.d.ts","import":"./dist/mocks/index.mjs","require":"./dist/mocks/index.js"},"./styles.css":"./dist/index.css"},"gitHead":"2396bfa11ad198a178ec1ac79616c1de36e1d02a","scripts":{"dev":"tsup --watch","demo":"yarn workspace demo dev","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"yarn typecheck && yarn build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:92eea80c-52c3-44f9-8658-fa5114adfca7"}},"repository":{"url":"git+https://github.com/caprionlinesrl/puck-plugin-media.git","type":"git"},"workspaces":["demo"],"_npmVersion":"11.6.2","description":"Puck plugin for media library integration with grid-based image picker","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"tsup":"^8.5.1","react":"^19.2.3","react-dom":"^19.2.3","typescript":"^5.9.3","@types/react":"^19.2.9","lucide-react":"^0.468.0","@puckeditor/core":"^0.21.0","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","@puckeditor/core":">=0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/puck-plugin-media_0.2.0_1769183913395_0.38334690108687286","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@caprionlinesrl/puck-plugin-media","version":"0.2.1","packageManager":"yarn@4.12.0","workspaces":["demo"],"description":"Puck plugin for media library integration with grid-based image picker","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"},"./mocks":{"types":"./dist/mocks/index.d.ts","import":"./dist/mocks/index.mjs","require":"./dist/mocks/index.js"},"./styles.css":"./dist/index.css"},"sideEffects":["*.css"],"peerDependencies":{"@puckeditor/core":">=0.21.0","react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"devDependencies":{"@puckeditor/core":"^0.21.0","@types/react":"^19.2.9","@types/react-dom":"^19.2.3","lucide-react":"^0.468.0","react":"^19.2.3","react-dom":"^19.2.3","tsup":"^8.5.1","typescript":"^5.9.3"},"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit","demo":"yarn workspace demo dev","prepublishOnly":"yarn typecheck && yarn build"},"keywords":["puck","plugin","media","image","gallery","cms","editor"],"author":{"name":"Capri On Line S.r.l."},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/caprionlinesrl/puck-plugin-media.git"},"bugs":{"url":"https://github.com/caprionlinesrl/puck-plugin-media/issues"},"homepage":"https://github.com/caprionlinesrl/puck-plugin-media#readme","gitHead":"50c19a8637d1a180be1247f3e0129987e20d254c","_id":"@caprionlinesrl/puck-plugin-media@0.2.1","_nodeVersion":"24.13.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-7qk7P7x3V00EbXY+cNPfIN1zeLELEl2Dn4SrvPg+3XyYtTah8zcJFwYKdkymL2jcrGoitzkystWuca+jKFXwIg==","shasum":"834ad814ca4d76bae518f28446669c7e3cbfb108","tarball":"https://registry.npmjs.org/@caprionlinesrl/puck-plugin-media/-/puck-plugin-media-0.2.1.tgz","fileCount":19,"unpackedSize":980919,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caprionlinesrl%2fpuck-plugin-media@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICFsRrk1po571BzfeD8Ybl/mFZmFKLLlJqcut7fsORmLAiEAl7lK3jg+7xqw+4ZRufx+xVmJ8GSRQFvKaHak84iuZMg="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:92eea80c-52c3-44f9-8658-fa5114adfca7"}},"directories":{},"maintainers":[{"name":"asterixcapri","email":"aleast@capri.it"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/puck-plugin-media_0.2.1_1769185147634_0.03211980619486732"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-22T17:13:45.225Z","modified":"2026-01-23T16:19:08.138Z","0.1.0":"2026-01-22T17:13:45.498Z","0.1.4":"2026-01-22T17:36:48.191Z","0.1.5":"2026-01-22T18:10:37.162Z","0.1.6":"2026-01-23T09:45:22.547Z","0.1.7":"2026-01-23T13:41:33.670Z","0.2.0":"2026-01-23T15:58:33.629Z","0.2.1":"2026-01-23T16:19:07.805Z"},"bugs":{"url":"https://github.com/caprionlinesrl/puck-plugin-media/issues"},"author":{"name":"Capri On Line S.r.l."},"license":"MIT","homepage":"https://github.com/caprionlinesrl/puck-plugin-media#readme","keywords":["puck","plugin","media","image","gallery","cms","editor"],"repository":{"type":"git","url":"git+https://github.com/caprionlinesrl/puck-plugin-media.git"},"description":"Puck plugin for media library integration with grid-based image picker","maintainers":[{"name":"asterixcapri","email":"aleast@capri.it"}],"readme":"# @caprionlinesrl/puck-plugin-media\n\nA Puck plugin for media management with support for images, galleries, and documents.\n\n## Features\n\n- **Image Field** - Select images with upload, multilingual alt text, and bulk delete\n- **Gallery Field** - Create and manage image galleries with drag & drop upload\n- **Document Field** - Upload and manage documents with multilingual titles\n- **Media Panel** - Browse and manage all media directly in Puck's sidebar\n- **Upload Support** - Drag & drop with progress tracking and file validation\n- **Multilingual** - Alt text and titles in multiple languages\n- **Search & Pagination** - Filter and load more items\n- **Manage Mode** - Bulk select and delete items\n- **Fully Typed** - Complete TypeScript support\n\n## Installation\n\n```bash\nnpm install @caprionlinesrl/puck-plugin-media\n# or\nyarn add @caprionlinesrl/puck-plugin-media\n```\n\n## Quick Start\n\n### 1. Create the plugin\n\n#### Option A: Using mock data (for demos/prototyping)\n\n```tsx\nimport { createMediaPlugin } from '@caprionlinesrl/puck-plugin-media';\nimport { mockMediaConfig } from '@caprionlinesrl/puck-plugin-media/mocks';\n\n// One-liner with mock data\nconst mediaPlugin = createMediaPlugin(mockMediaConfig);\n\n// Or with custom options\nconst mediaPlugin = createMediaPlugin({\n  ...mockMediaConfig,\n  languages: [\n    { code: 'en', label: 'English' },\n    { code: 'it', label: 'Italiano' },\n  ],\n  mediaImage: {\n    ...mockMediaConfig.mediaImage,\n    uploadConfig: {\n      accept: 'image/jpeg,image/png,image/webp',\n      maxSize: 10 * 1024 * 1024, // 10MB\n    },\n  },\n});\n```\n\n#### Option B: With your own API\n\n```tsx\nimport { createMediaPlugin } from '@caprionlinesrl/puck-plugin-media';\n\nconst mediaPlugin = createMediaPlugin({\n  languages: [\n    { code: 'en', label: 'English' },\n    { code: 'it', label: 'Italiano' },\n  ],\n\n  mediaImage: {\n    fetchList: async ({ query, page, pageSize }) => {\n      const res = await fetch(`/api/images?q=${query || ''}&page=${page}&limit=${pageSize}`);\n      const data = await res.json();\n      return { items: data.items, hasMore: data.hasMore };\n    },\n    upload: async (file, { onProgress }) => {\n      // Upload implementation with progress callback\n      const formData = new FormData();\n      formData.append('file', file);\n      const res = await fetch('/api/images/upload', { method: 'POST', body: formData });\n      return res.json();\n    },\n    update: async (id, data) => {\n      const res = await fetch(`/api/images/${id}`, {\n        method: 'PATCH',\n        body: JSON.stringify(data),\n      });\n      return res.json();\n    },\n    delete: async (id) => {\n      await fetch(`/api/images/${id}`, { method: 'DELETE' });\n    },\n  },\n\n  // Optional: Gallery support\n  mediaGallery: {\n    fetchList: async (params) => { /* ... */ },\n    fetch: async (id) => { /* ... */ },\n    create: async (name) => { /* ... */ },\n    delete: async (id) => { /* ... */ },\n    upload: async (galleryId, file, callbacks) => { /* ... */ },\n    removeImage: async (galleryId, imageId) => { /* ... */ },\n    updateImage: async (galleryId, imageId, data) => { /* ... */ },\n  },\n\n  // Optional: Document support\n  mediaDocument: {\n    fetchList: async (params) => { /* ... */ },\n    upload: async (file, callbacks) => { /* ... */ },\n    update: async (id, data) => { /* ... */ },\n    delete: async (id) => { /* ... */ },\n  },\n});\n```\n\n### 2. Add to Puck\n\n```tsx\nimport { Puck } from '@puckeditor/core';\nimport '@caprionlinesrl/puck-plugin-media/styles.css';\n\n<Puck\n  config={config}\n  data={pageData}\n  plugins={[mediaPlugin]}\n/>\n```\n\n### 3. Use fields in your blocks\n\n```tsx\nconst config = {\n  components: {\n    Hero: {\n      fields: {\n        backgroundImage: {\n          type: 'mediaImage',\n          label: 'Background Image',\n        },\n        title: {\n          type: 'text',\n          label: 'Title',\n        },\n      },\n      render: ({ backgroundImage, title }) => (\n        <div style={{ backgroundImage: `url(${backgroundImage?.url})` }}>\n          <h1>{title}</h1>\n        </div>\n      ),\n    },\n    \n    PhotoGallery: {\n      fields: {\n        gallery: {\n          type: 'mediaGallery',\n          label: 'Photo Gallery',\n        },\n      },\n      render: ({ gallery }) => (\n        <div className=\"gallery\">\n          {gallery?.images.map((img) => (\n            <img key={img.id} src={img.url} alt={img.alt?.en || ''} />\n          ))}\n        </div>\n      ),\n    },\n    \n    Download: {\n      fields: {\n        document: {\n          type: 'mediaDocument',\n          label: 'Download File',\n        },\n      },\n      render: ({ document }) => (\n        <a href={document?.url} download>\n          {document?.title?.en || document?.filename}\n        </a>\n      ),\n    },\n  },\n};\n```\n\n## Mock Data\n\nThe plugin includes mock data for quick prototyping and demos. Import from the `/mocks` subpath:\n\n```tsx\nimport { mockMediaConfig } from '@caprionlinesrl/puck-plugin-media/mocks';\n```\n\n`mockMediaConfig` provides:\n- **12 sample images** from Unsplash with multilingual alt text\n- **3 sample galleries** (Landscapes, Team, Portfolio)\n- **4 sample documents** (PDF files)\n- Full CRUD operations (in-memory, resets on page reload)\n- Simulated upload with progress\n- Search and pagination support\n\nThis is useful for:\n- Quick demos and prototypes\n- Testing your Puck configuration\n- Development without a backend\n\n> **Note:** Mock data is stored in memory and will reset on page reload.\n\n## Configuration\n\n### Languages\n\n```typescript\ninterface Language {\n  code: string;   // e.g., 'en', 'it', 'de'\n  label: string;  // e.g., 'English', 'Italiano', 'Deutsch'\n}\n\n// Default languages if not specified\nconst DEFAULT_LANGUAGES = [\n  { code: 'en', label: 'English' },\n  { code: 'it', label: 'Italiano' },\n];\n```\n\n### MediaImageOptions\n\n```typescript\ninterface MediaImageOptions {\n  // Required: Fetch paginated list of images\n  fetchList: (params: FetchListParams) => Promise<MediaImageItem[] | FetchListResult<MediaImageItem>>;\n  \n  // Optional: Upload new images\n  upload?: (file: File, callbacks: UploadCallbacks) => Promise<MediaImageItem | MediaImageItem[]>;\n  \n  // Optional: Update image metadata (alt text)\n  update?: (id: string, data: { alt?: LocalizedString }) => Promise<MediaImageItem>;\n  \n  // Optional: Delete an image (enables Manage mode)\n  delete?: (id: string) => Promise<void>;\n  \n  // Optional: Upload configuration\n  uploadConfig?: UploadConfig;\n}\n```\n\n### MediaGalleryOptions\n\n```typescript\ninterface MediaGalleryOptions {\n  // Required: Fetch paginated list of galleries\n  fetchList: (params: FetchListParams) => Promise<MediaGalleryItem[] | FetchListResult<MediaGalleryItem>>;\n  \n  // Required: Fetch single gallery with all images\n  fetch: (id: string) => Promise<MediaGalleryItem>;\n  \n  // Required: Create a new gallery\n  create: (name: string) => Promise<MediaGalleryItem>;\n  \n  // Optional: Delete a gallery (enables Manage mode)\n  delete?: (id: string) => Promise<void>;\n  \n  // Required: Upload images to a gallery\n  upload: (galleryId: string, file: File, callbacks: UploadCallbacks) => Promise<MediaImageItem | MediaImageItem[]>;\n  \n  // Optional: Remove an image from a gallery (enables image Manage mode)\n  removeImage?: (galleryId: string, imageId: string) => Promise<void>;\n  \n  // Optional: Update image metadata within a gallery\n  updateImage?: (galleryId: string, imageId: string, data: { alt?: LocalizedString }) => Promise<MediaImageItem>;\n}\n```\n\n### MediaDocumentOptions\n\n```typescript\ninterface MediaDocumentOptions {\n  // Required: Fetch paginated list of documents\n  fetchList: (params: FetchListParams) => Promise<MediaDocumentItem[] | FetchListResult<MediaDocumentItem>>;\n  \n  // Optional: Upload new documents\n  upload?: (file: File, callbacks: UploadCallbacks) => Promise<MediaDocumentItem | MediaDocumentItem[]>;\n  \n  // Optional: Update document metadata (title)\n  update?: (id: string, data: { title?: LocalizedString }) => Promise<MediaDocumentItem>;\n  \n  // Optional: Delete a document (enables Manage mode)\n  delete?: (id: string) => Promise<void>;\n  \n  // Optional: Upload configuration\n  uploadConfig?: UploadConfig;\n}\n```\n\n### Upload Configuration\n\n```typescript\ninterface UploadConfig {\n  // Accepted file types (default: 'image/*' for images, common doc types for documents)\n  accept?: string;\n  \n  // Maximum file size in bytes (default: 10MB for images, 20MB for documents)\n  maxSize?: number;\n  \n  // Allow multiple file selection (default: true)\n  multiple?: boolean;\n}\n```\n\n## Types\n\n### MediaImageItem\n\n```typescript\ninterface MediaImageItem {\n  id: string;\n  url: string;\n  filename?: string;\n  alt?: LocalizedString;      // { en: 'Alt text', it: 'Testo alt' }\n  width?: number;\n  height?: number;\n  size?: number;              // File size in bytes\n  thumbnailUrl?: string;      // For faster loading in grids\n  createdAt?: string;\n}\n```\n\n### MediaGalleryItem\n\n```typescript\ninterface MediaGalleryItem {\n  id: string;\n  name: string;\n  coverImage?: MediaImageItem;\n  images: MediaImageItem[];\n  imageCount?: number;\n  createdAt?: string;\n}\n```\n\n### MediaDocumentItem\n\n```typescript\ninterface MediaDocumentItem {\n  id: string;\n  url: string;\n  filename: string;\n  title?: LocalizedString;    // { en: 'Title', it: 'Titolo' }\n  mimeType: string;           // e.g., 'application/pdf'\n  size: number;               // File size in bytes\n  extension: string;          // e.g., 'pdf', 'docx'\n  createdAt?: string;\n}\n```\n\n### LocalizedString\n\n```typescript\ninterface LocalizedString {\n  [languageCode: string]: string;\n}\n\n// Example\nconst alt: LocalizedString = {\n  en: 'Coastal sunset',\n  it: 'Tramonto sulla costa',\n};\n```\n\n### FetchListParams\n\n```typescript\ninterface FetchListParams {\n  query?: string;     // Search query\n  page?: number;      // Page number (1-indexed)\n  pageSize?: number;  // Items per page (default: 20)\n}\n```\n\n### FetchListResult\n\n```typescript\ninterface FetchListResult<T> {\n  items: T[];\n  total?: number;\n  hasMore?: boolean;\n}\n```\n\n### UploadCallbacks\n\n```typescript\ninterface UploadCallbacks {\n  onProgress?: (percent: number) => void;\n}\n```\n\n## Styling\n\nThe plugin uses CSS Modules with vanilla CSS that matches Puck's design language. Import the styles in your app:\n\n```tsx\nimport '@caprionlinesrl/puck-plugin-media/styles.css';\n```\n\n## Browser Support\n\n- Chrome, Firefox, Safari, Edge (latest versions)\n- React 18+\n- Puck 0.21+\n\n## Development\n\n### Prerequisites\n\n- Node.js 18+\n- Yarn 4+\n\n### Setup\n\n```bash\ngit clone https://github.com/caprionlinesrl/puck-plugin-media.git\ncd puck-plugin-media\nyarn install\n```\n\n### Run the demo\n\n```bash\nyarn demo\n```\n\nOpen [http://localhost:3000](http://localhost:3000)\n\n### Build the library\n\n```bash\nyarn build\n```\n\n### Type check\n\n```bash\nyarn typecheck\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}