用法
sag-icons 只有一个核心元素 <sag-icon>。它是一个 Web Component,React / Vue / 原生 HTML 用法几乎一致——区别只在少数属性写法。
React
import '@jujiuyey/sag-icons';
import '@jujiuyey/sag-icons/css/svg-icon.css';
export default function Sidebar() {
return (
<nav>
<sag-icon name="workbench" />
<sag-icon name="settings" className="is-active" />
</nav>
);
}
要点:
- React 用
className,序列化到 DOM 后是 class="is-active",CSS 选择器照常生效
<sag-icon> 在 JSX 中有 TypeScript 类型补全(name 必须是有效图标名)
- 无需引入任何
*Icon 组件——<sag-icon> 就是组件
Vue 3
<script setup lang="ts">
import '@jujiuyey/sag-icons';
import '@sag-icons/css/svg-icon.css';
</script>
<template>
<nav>
<sag-icon name="workbench" />
<sag-icon name="settings" :class="{ 'is-active': isActive }" />
</nav>
</template>
要点:
- 模板里直接用
class(HTML 原生属性)
- 条件类用 Vue 的对象语法
:class="{ 'is-active': isActive }"
- 如果项目用
<script setup lang="ts"> 且开启了 TS 检查,name 也会被校验
原生 HTML / 其他框架
<script type="module">
import 'https://esm.sh/@jujiuyey/sag-icons';
import 'https://esm.sh/@jujiuyey/sag-icons/css/svg-icon.css';
</script>
<sag-icon name="workbench"></sag-icon>
<sag-icon name="settings" class="is-active"></sag-icon>
任意能输出 HTML 的环境都能用:Svelte、 Solid、Preact、Alpine.js、甚至服务端模板。
通用:激活状态
切换 is-active 类即可在"默认灰"和"激活彩色"之间切换,三种环境写法一致:
<sag-icon name="workbench" class="is-active"></sag-icon>
通用:尺寸控制
sag-icon 的默认尺寸是 1.25rem(20px)。通过 CSS 覆盖即可,三种环境都一样:
/* 全局 */
sag-icon { width: 1.5rem; height: 1.5rem; }
或在 JSX/模板里用 inline style(需 sag-icon 元素接受 style 属性):
// React
<sag-icon name="workbench" style={{ width: '1.5rem', height: '1.5rem' }} />
<!-- Vue -->
<sag-icon name="workbench" :style="{ width: '1.5rem', height: '1.5rem' }" />
通用:与路由库集成
激活态由你控制——把 is-active 接到路由的"激活"判断上。
React Router v6
import { NavLink } from 'react-router-dom';
<NavLink to="/workbench" className={({ isActive }) => isActive ? 'is-active' : ''}>
<sag-icon name="workbench" />
</NavLink>
@tanstack/react-router
import { Link } from '@tanstack/react-router';
<Link to="/workbench" activeProps={{ className: 'is-active' }}>
<sag-icon name="workbench" />
</Link>
Vue Router 4
<template>
<RouterLink
to="/workbench"
active-class="is-active"
custom
v-slot="{ navigate, isActive }"
>
<sag-icon
name="workbench"
:class="{ 'is-active': isActive }"
@click="navigate"
/>
</RouterLink>
</template>
通用:父容器尺寸(响应式)
把尺寸控制交给父元素,sag-icon 自动填充。例如 shadcn/ui 的可折叠侧边栏:
<div className="group-data-[collapsible=icon]:!size-6">
<sag-icon name="workbench" />
</div>
<div class="group-data-[collapsible=icon]:!size-6">
<sag-icon name="workbench" />
</div>
命名约定
图标名用 kebab-case(多词用 - 分隔):
name="customer-service" 对应 ICON_PATHS["customer-service"]
name="workbench" 对应数据键 ICON_PATHS.workbench
完整的 78 个图标名见 图标预览。