Summary
Improve the icon library upload UX so users can add many SVGs quickly without repeatedly using the file picker.
Scope
Implement in the library editor upload section:
- Drag-and-drop upload for one or many SVG files
- Paste upload support for:
- clipboard SVG files (
image/svg+xml)
- raw pasted SVG markup (
<svg ...>...</svg>)
- Keep existing file-picker upload path working
- Support bulk uploads (20+ files in one action) with clear user feedback for partial failures
Non-goals
- URL/link-based imports (tracked separately / explicitly out of scope here)
- SVG clipping/render fixes (keep #153 as a separate bug)
Acceptance criteria
- User can drag/drop multiple
.svg files into the upload area and all valid files are ingested
- User can paste valid raw SVG text and it uploads as a new icon
- User can paste clipboard SVG files and they upload
- Invalid SVGs are rejected with clear errors, without blocking valid files in the same batch
- Existing upload button behavior remains unchanged
Suggested file touchpoints
apps/web/src/components/icon-library/svg-uploader.tsx
apps/web/src/app/library-generator/[id]/page.tsx
apps/web/src/lib/icon-library/svg-validate.ts (reuse validation logic)
Testing
- Extend e2e coverage for upload flows in
tests/e2e/src/scenarios/unauthenticated/icon-library-generator-happy-path.ts
- Add/extend invalid upload scenario coverage in
tests/e2e/src/scenarios/unauthenticated/icon-library-generator-invalid-svg.ts
Summary
Improve the icon library upload UX so users can add many SVGs quickly without repeatedly using the file picker.
Scope
Implement in the library editor upload section:
image/svg+xml)<svg ...>...</svg>)Non-goals
Acceptance criteria
.svgfiles into the upload area and all valid files are ingestedSuggested file touchpoints
apps/web/src/components/icon-library/svg-uploader.tsxapps/web/src/app/library-generator/[id]/page.tsxapps/web/src/lib/icon-library/svg-validate.ts(reuse validation logic)Testing
tests/e2e/src/scenarios/unauthenticated/icon-library-generator-happy-path.tstests/e2e/src/scenarios/unauthenticated/icon-library-generator-invalid-svg.ts