# @fish-render/icons

一个现代化的 Vue 3 图标库，提供内置图标组件和动态 SVG 加载功能。

## ✨ 特性

- 🎯 **零配置**：内置图标组件，无需任何配置即可使用
- 🚀 **高性能**：SVG 图标直接内联，无额外网络请求
- 🎨 **CSS 控制**：通过 `font-size` 控制图标大小，通过 `color` 控制颜色
- 📦 **动态加载**：支持从静态文件和 assets 目录动态加载 SVG
- 🔧 **TypeScript**：完整的 TypeScript 支持
- 📱 **响应式**：支持各种尺寸和颜色配置
- 🛠️ **插件支持**：SvgIcon 组件支持 vite-plugin-svg-icons

## 📦 安装

```bash
npm install @fish-render/icons
# 或
yarn add @fish-render/icons
# 或
pnpm add @fish-render/icons
```

## 🚀 快速开始

### 内置图标组件

```vue
<template>
  <div>
    <!-- 直接使用内置图标组件 -->
    <Add />
    <Search />
    <Refresh />
    <Trash />
    <More />
  </div>
</template>

<script setup>
import { Add, Search, Refresh, Trash, More } from '@fish-render/icons'
</script>

<style>
/* 通过 CSS 控制图标大小和颜色 */
.icon-large {
  font-size: 32px;
}
.icon-small {
  font-size: 16px;
}
.icon-white {
  color: white;
}
.icon-red {
  color: #f44336;
}
</style>
```

### PathIcon 组件 - 动态加载静态资源

用于从静态目录动态加载 SVG 文件的组件。

```vue
<template>
  <div>
    <!-- 从静态文件加载 -->
    <PathIcon name="external" />

    <!-- 从 assets 目录加载 -->
    <PathIcon name="user" />
  </div>
</template>

<script setup>
import { PathIcon, setIconConfig } from '@fish-render/icons'

// 配置默认路径
setIconConfig({
  path: '/icons/',
  prefix: '',
})
</script>
```

### SvgIcon 组件 - 配合 vite-plugin-svg-icons

**注意：SvgIcon 组件需要配合 `vite-plugin-svg-icons` 和 `virtual:svg-icons-register` 使用。**

#### 1. 安装依赖

```bash
npm install vite-plugin-svg-icons -D
# 或
yarn add vite-plugin-svg-icons -D
# 或
pnpm add vite-plugin-svg-icons -D
```

#### 2. 配置 Vite

```typescript
// vite.config.ts
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'

export default defineConfig({
  plugins: [
    createSvgIconsPlugin({
      iconDirs: [path.resolve(process.cwd(), 'src/icons')],
      symbolId: 'icon-[dir]-[name]',
    }),
  ],
})
```

#### 3. 在 main.ts 中注册

```typescript
// main.ts
import 'virtual:svg-icons-register'
```

#### 4. 使用 SvgIcon 组件

```vue
<template>
  <div>
    <!-- 使用 SvgIcon 组件 -->
    <SvgIcon name="user" />
    <SvgIcon name="settings" color="#1890ff" />
    <SvgIcon name="heart" prefix="custom" />
  </div>
</template>

<script setup>
import { SvgIcon } from '@fish-render/icons'
</script>

<style>
/* 通过 CSS 控制图标大小 */
.svg-icon {
  font-size: 24px;
}
</style>
```

## 📚 API 文档

### 内置图标组件

所有内置图标组件都支持以下特性：

- **无 props**：无需传递任何属性
- **CSS 控制**：通过 `font-size` 控制大小，通过 `color` 控制颜色
- **响应式**：支持各种尺寸和颜色配置

#### 可用图标

```javascript
import {
  Add,
  Search,
  Refresh,
  Trash,
  More,
  Left,
  Right,
  Up,
  Under,
  Selected,
  DeleteIcon,
  Fillin,
  InformationAdd,
  More1,
} from '@fish-render/icons'
```

#### 使用示例

```vue
<template>
  <!-- 基本使用 -->
  <Add />

  <!-- 通过 CSS 类控制大小和颜色 -->
  <Add class="icon-large icon-red" />

  <!-- 通过内联样式控制 -->
  <Add style="font-size: 24px; color: blue;" />
</template>

<script setup>
import { Add } from '@fish-render/icons'
</script>

<style>
.icon-large {
  font-size: 32px;
}
.icon-red {
  color: #f44336;
}
</style>
```

### PathIcon 组件

用于动态加载外部 SVG 文件的组件。

#### Props

| 属性   | 类型     | 默认值 | 说明                     |
| ------ | -------- | ------ | ------------------------ |
| `name` | `string` | -      | SVG 文件名（不含扩展名） |

#### 使用示例

```vue
<template>
  <!-- 使用配置的默认路径 -->
  <PathIcon name="user" />

  <!-- 从 assets 目录加载 -->
  <PathIcon name="settings" />
</template>

<script setup>
import { PathIcon, setIconConfig } from '@fish-render/icons'

// 设置默认配置
setIconConfig({
  path: '/icons/',
  prefix: '',
})
</script>
```

### SvgIcon 组件

**需要配合 vite-plugin-svg-icons 使用**

#### Props

| 属性     | 类型     | 默认值   | 说明                           |
| -------- | -------- | -------- | ------------------------------ |
| `name`   | `string` | -        | 图标名称（对应 SVG 文件名）    |
| `color`  | `string` | -        | 图标颜色                       |
| `prefix` | `string` | `'icon'` | 图标前缀（对应 symbolId 前缀） |

#### 使用示例

```vue
<template>
  <!-- 基本使用 -->
  <SvgIcon name="user" />

  <!-- 自定义颜色 -->
  <SvgIcon name="heart" color="#ff4d4f" />

  <!-- 自定义前缀 -->
  <SvgIcon name="logo" prefix="custom" />

  <!-- 通过 CSS 控制大小 -->
  <SvgIcon name="settings" class="icon-large" />
</template>

<script setup>
import { SvgIcon } from '@fish-render/icons'
</script>

<style>
.icon-large {
  font-size: 32px;
}
</style>
```

### 配置函数

#### setIconConfig(config)

设置全局图标配置（仅对 PathIcon 有效）。

```javascript
import { setIconConfig } from '@fish-render/icons'

setIconConfig({
  path: '/public/icons/', // 静态文件路径
  prefix: 'icon-', // 文件名前缀
})
```

#### getIconConfig()

获取当前图标配置。

```javascript
import { getIconConfig } from '@fish-render/icons'

const config = getIconConfig()
console.log(config)
// { path: '/public/icons/', prefix: '' }
```

## 🎨 样式指南

### 图标大小控制

```css
/* 通过 font-size 控制图标大小 */
.icon-16 {
  font-size: 16px;
}
.icon-24 {
  font-size: 24px;
}
.icon-32 {
  font-size: 32px;
}
.icon-48 {
  font-size: 48px;
}
.icon-64 {
  font-size: 64px;
}
```

### 图标颜色控制

```css
/* 通过 color 控制图标颜色 */
.icon-white {
  color: white;
}
.icon-black {
  color: black;
}
.icon-red {
  color: #f44336;
}
.icon-blue {
  color: #2196f3;
}
.icon-green {
  color: #4caf50;
}
```

### 图标对齐

```css
/* 图标垂直对齐 */
.icon-component {
  vertical-align: middle;
}
```

## 📁 目录结构

### PathIcon 使用时的目录结构

```
your-project/
├── public/
│   └── icons/              # 静态 SVG 图标
│       ├── user.svg
│       ├── logo.svg
│       └── settings.svg
└── src/
    └── components/
        └── MyComponent.vue
```

### SvgIcon 使用时的目录结构

```
your-project/
├── src/
│   ├── icons/              # SVG 图标目录（由 vite-plugin-svg-icons 处理）
│   │   ├── user.svg
│   │   ├── settings.svg
│   │   └── heart.svg
│   ├── main.ts             # 需要导入 'virtual:svg-icons-register'
│   └── components/
│       └── MyComponent.vue
└── vite.config.ts          # 需要配置 vite-plugin-svg-icons
```

## 🔧 开发指南

### 添加新图标

1. 将 SVG 文件放入 `packages/icons/src/icons/` 目录
2. 运行生成命令：

```bash
pnpm generate
```

3. 重新构建包：

```bash
pnpm build:icons
```

### 自定义构建

```bash
# 生成图标组件
pnpm generate

# 构建图标包
pnpm build:icons

# 发布图标包
pnpm publish:icons
```

## 🚨 注意事项

1. **SVG 格式**：确保 SVG 文件格式正确，包含 `viewBox` 属性
2. **文件命名**：使用 kebab-case 命名 SVG 文件
3. **路径配置**：确保图标路径正确配置
4. **错误处理**：为缺失的图标提供备用方案
5. **SvgIcon 依赖**：SvgIcon 组件必须配合 `vite-plugin-svg-icons` 使用
6. **插件注册**：使用 SvgIcon 时必须在 main.ts 中导入 `'virtual:svg-icons-register'`

## 🤝 贡献

欢迎提交 Issue 和 Pull Request！

## �� 许可证

MIT License
