# Adding New Icons to Creamlinux This guide explains how to add new icons to the Creamlinux project. ## Prerequisites - Basic knowledge of SVG files - Node.js and npm installed - Creamlinux project set up ## Step 1: Find or Create SVG Icons You can: - Create your own SVG icons using tools like Figma, Sketch, or Illustrator - Download icons from libraries like Heroicons, Material Icons, or Feather Icons - Use existing SVG files Ideally, icons should: - Be 24x24px or have a viewBox of "0 0 24 24" - Have a consistent style with existing icons - Use stroke-width of 2 for outline variants - Use solid fills for bold variants ## Step 2: Optimize SVG Files We have a script to optimize SVG files for the icon system: ```bash # Install dependencies npm install # Optimize a single SVG npm run optimize-svg path/to/icon.svg # Optimize all SVGs in a directory npm run optimize-svg src/components/icons/ui/outline ``` The optimizer will: - Remove unnecessary attributes - Set the viewBox to "0 0 24 24" - Add currentColor for fills/strokes for proper color inheritance - Remove width and height attributes for flexible sizing ## Step 3: Add SVG Files to the Project 1. Decide if your icon is a "bold" (filled) or "outline" (stroked) variant 2. Place the file in the appropriate directory: - For outline variants: `src/components/icons/ui/outline/` - For bold variants: `src/components/icons/ui/bold/` 3. Use a descriptive name like `download.svg` or `settings.svg` ## Step 4: Export the Icons 1. Open the index.ts file in the respective directory: - `src/components/icons/ui/outline/index.ts` for outline variants - `src/components/icons/ui/bold/index.ts` for bold variants 2. Add an export statement for your new icon: ```typescript // For outline variant export { ReactComponent as NewIconOutlineIcon } from './new-icon.svg' // For bold variant export { ReactComponent as NewIconBoldIcon } from './new-icon.svg' ``` Use a consistent naming pattern: - CamelCase - Descriptive name - Suffix with BoldIcon or OutlineIcon based on variant ## Step 5: Use the Icon in Your Components Now you can use your new icon in any component: ```tsx import { Icon } from '@/components/icons' import { NewIconOutlineIcon, NewIconBoldIcon } from '@/components/icons' // In your component: ``` ## Best Practices 1. **Create both variants**: When possible, create both bold and outline variants for consistency. 2. **Use semantic names**: Name icons based on their meaning, not appearance (e.g., "success" instead of "checkmark"). 3. **Be consistent**: Follow the existing icon style for visual harmony. 4. **Test different sizes**: Ensure icons look good at all standard sizes: xs, sm, md, lg, xl. 5. **Optimize manually if needed**: Sometimes automatic optimization may not work perfectly. You might need to manually edit SVG files. 6. **Add accessibility**: When using icons, provide proper accessibility: ```tsx ``` ## Troubleshooting **Problem**: Icon doesn't change color with CSS **Solution**: Make sure your SVG uses `currentColor` for fill or stroke **Problem**: Icon looks pixelated **Solution**: Ensure your SVG has a proper viewBox attribute **Problem**: Icon sizing is inconsistent **Solution**: Use the standard size props (xs, sm, md, lg, xl) instead of custom sizes **Problem**: SVG has complex gradients or effects that don't render correctly **Solution**: Simplify the SVG design; complex effects aren't ideal for UI icons ## Additional Resources - [SVGR documentation](https://react-svgr.com/docs/what-is-svgr/) - [SVGO documentation](https://github.com/svg/svgo) - [SVG MDN documentation](https://developer.mozilla.org/en-US/docs/Web/SVG)