mirror of
https://github.com/zoriya/v10.git
synced 2026-08-05 13:48:14 +00:00
Replace manually-coded React icon components with SVGR-generated ones from shared SVG assets. This establishes a maintainable, single-source-of-truth system for icons across the monorepo. ## Key Changes ### ✨ SVGR Integration - Add @svgr/cli with custom configuration for React component generation - Generate components from packages/core/icons/assets/ SVG files - Implement custom templates with generation warnings and JSDoc @generated tags - Replace manual src/icons/ with auto-generated src/generated-icons/ ### 🎨 Complete Styling Support - Add fill="currentColor" to all SVG source files in core package - Configure replaceAttrValues to transform currentColor → {color} in React components - Restore full color prop functionality (fill={color} on path elements) - Maintain backwards compatibility with existing IconProps interface ### 📚 Developer Experience - Add comprehensive README.md with usage examples and development workflow - Include clear "DO NOT EDIT" warnings in all generated files - Add .gitignore to exclude generated files from version control - Provide detailed generation instructions and architecture explanation ### 🏗️ Build System Integration - Update package.json scripts: npm run generate creates React components - Integrate generation into build pipeline (npm run build runs generate first) - Add SVGR dependencies: @svgr/cli, plugins, and babel-plugin-add-jsx-attribute - Maintain existing rollup + TypeScript build chain ## Technical Implementation - **Source**: SVG files in packages/core/icons/assets/ (single source of truth) - **Generator**: SVGR v8 with custom TypeScript React templates - **Output**: Auto-generated components in src/generated-icons/ with full JSDoc - **Styling**: fill={color} props + currentColor inheritance for dynamic theming - **Types**: Preserved IconProps interface with SVGAttributes<SVGElement> + color prop ## Verification ✅ Playwright testing confirms icons render correctly with proper colors ✅ All 5 icons (Play, Pause, VolumeHigh, VolumeLow, VolumeOff) generate successfully ✅ Color prop functionality verified (fill attribute updates dynamically) ✅ Build system integration working across full monorepo ✅ Backwards compatibility maintained with existing components This implementation provides automatic React component generation while maintaining full feature parity with the original manually-coded icons. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
@vjs-10/react-icons
React-specific icon components derived from @vjs-10/icons.
Overview
This package provides React components for media player icons that are automatically generated from SVG files. All icon components are built using SVGR to transform SVG assets into optimized React components.
🔄 Auto-Generated Components
Important: The React components in this package are automatically generated. Do not edit them directly.
Generated Files Location
src/generated-icons/
├── index.ts # Auto-generated exports (DO NOT EDIT)
├── Play.tsx # Auto-generated component (DO NOT EDIT)
├── Pause.tsx # Auto-generated component (DO NOT EDIT)
├── VolumeHigh.tsx # Auto-generated component (DO NOT EDIT)
├── VolumeLow.tsx # Auto-generated component (DO NOT EDIT)
└── VolumeOff.tsx # Auto-generated component (DO NOT EDIT)
Source of Truth
All icons originate from SVG files located in:
packages/core/icons/assets/
├── play.svg
├── pause.svg
├── volume-high.svg
├── volume-low.svg
└── volume-off.svg
Usage
import { PlayIcon, PauseIcon, VolumeHighIcon } from '@vjs-10/react-icons';
function MediaControls() {
return (
<div>
<PlayIcon color="blue" width={24} height={24} />
<PauseIcon color="red" className="pause-btn" />
<VolumeHighIcon />
</div>
);
}
IconProps Interface
All generated icon components accept the following props:
interface IconProps extends SVGAttributes<SVGElement> {
children?: never;
color?: string;
}
color: Sets the icon color (default:'currentColor')- All SVG attributes:
width,height,className,onClick, etc. - No children: Icon components don't accept children
🔧 Development Workflow
Adding New Icons
- Add SVG file to
packages/core/icons/assets/filename.svg - Regenerate components: Run
npm run generatein this package - New component will be available as
FilenameIcon
Modifying Existing Icons
- Edit SVG file in
packages/core/icons/assets/ - Regenerate components: Run
npm run generatein this package - Component updates automatically
Build Process
# Generate React components from SVG files
npm run generate
# Build the package (includes generation step)
npm run build
# Clean generated files and dist
npm run clean
📦 Package Scripts
generate: Transform SVG files into React components using SVGRbuild: Generate components + build distribution filesclean: Remove generated components and build artifacts
🏗️ Architecture
This package follows the monorepo's dependency hierarchy:
- Depends on:
@vjs-10/icons(for shared SVG assets) - Peer dependency:
react(>=16.8.0) - Build tool: SVGR for SVG-to-React transformation
🚫 What NOT to Edit
src/generated-icons/- All files are auto-generated- Generated components have
@generatedJSDoc tags - Generated files include clear "DO NOT EDIT" warnings
✅ What You CAN Edit
src/types.d.ts- TypeScript interface definitionssrc/index.ts- Main export file (if needed)svgr.config.js- SVGR configurationpackage.json- Package configuration- This
README.md
🎯 Icon Naming Convention
SVG filename → React component name:
play.svg→PlayIconvolume-high.svg→VolumeHighIconmy-custom-icon.svg→MyCustomIconIcon
🔍 Technical Details
- Generator: SVGR v8
- Output: TypeScript React components
- Optimization: Automatic SVG optimization via SVGO
- Styling: Uses
currentColorfor easy theming - Size: Icons default to
1emwidth/height for text alignment