perf(ui): migrate icons to SVG sprite system

Replace @remixicon/react with a shared Icon component that renders
via <use href> references to a single hidden SVG sprite. This reduces
DOM node count by replacing inline SVGs with lightweight references.

- Create Icon component with sprite injection (packages/ui/src/components/icon/)
- Migrate all 164 files from @remixicon/react to Icon component
- Auto-generate sprite data from remixicon bundle (scripts/generate-icon-sprite.mjs)
- Add bun run icons:generate to package.json
- Move @remixicon/react to devDependencies
- Add icon usage instructions to theme-system skill
This commit is contained in:
Bohdan Triapitsyn
2026-05-13 13:26:35 +03:00
parent b4cbd7f0d6
commit 14357257ae
173 changed files with 2342 additions and 2227 deletions
@@ -1,8 +1,8 @@
import React from 'react';
import { RiChat3Line, RiRestartLine } from '@remixicon/react';
import { Button } from '../ui/button';
import { Card, CardContent, CardHeader, CardTitle } from '../ui/card';
import { useI18n } from '@/lib/i18n';
import { Icon } from "@/components/icon/Icon";
interface ChatErrorBoundaryState {
hasError: boolean;
@@ -57,7 +57,7 @@ class ChatErrorBoundaryView extends React.Component<ChatErrorBoundaryViewProps,
<Card className="w-full max-w-md">
<CardHeader className="text-center">
<CardTitle className="flex items-center justify-center gap-2 text-destructive">
<RiChat3Line className="h-5 w-5" />
<Icon name="chat-3" className="h-5 w-5" />
{this.props.texts.title}
</CardTitle>
</CardHeader>
@@ -83,7 +83,7 @@ class ChatErrorBoundaryView extends React.Component<ChatErrorBoundaryViewProps,
<div className="flex gap-2">
<Button onClick={this.handleReset} variant="outline" className="flex-1">
<RiRestartLine className="h-4 w-4 mr-2" />
<Icon name="restart" className="h-4 w-4 mr-2" />
{this.props.texts.resetAction}
</Button>
</div>