@manohub/icon 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * `icon-from-svg` —— 把一批 `.svg` 文件转成项目自带的字形表(TS 源码)。
4
- *
5
- * 为什么要有这一步:字形表的片段口径(24 视口、单色 `currentColor`、坐标不重写)跟
6
- * 设计工具导出的完整 SVG 差 7 件事,其中「算多层 transform 的净矩阵」「保住 fill-rule」
7
- * 「跨文件查重」手工几乎必错。生成物是 **进 git 的静态源码**,可 review、可 diff。
3
+ * `icon-from-svg` —— 把一批 `.svg` 转成项目自带的字形表(**进 git 的静态源码**,可 review、可 diff)。
4
+ * 片段口径(24 视口、单色 `currentColor`、坐标不重写)与设计工具导出的完整 SVG 差 7 件事,
5
+ * 其中多层 `transform` 的净矩阵 / `fill-rule` / 查重手工几乎必错,故做成命令。
8
6
  *
9
7
  * 用法:
10
8
  * icon-from-svg src/assets/icons --out src/icons.ts
@@ -1,24 +1,15 @@
1
1
  /**
2
- * 设计稿来源的图标片段(**自绘资产**,与 `./glyphs.ts` 里取自 lucide 的字形分开存放)。
2
+ * 设计稿来源的图标片段(**自绘资产**,与 `glyphs.ts` 里取自 lucide 的字形分开存放):
3
+ * 出处「智能集成平台 260930」的 23 份原稿(11 组 × 主题色 / 反白 / 中性姿态)归并。
3
4
  *
4
- * 出处:「智能集成平台 260930」设计交付的 assets —— 23 份原稿(11 组 × 主题色 / 反白 / 中性姿态)归并而来。
5
+ * 命名:单个英文单词、不带连字符复合;要能看出是哪块业务。
6
+ * ⚠️ `application`(应用管理页)与 `apps`(九宫格入口)名相邻但不同义。`publish` 已删 —— 规范对它和
7
+ * `server` 用了同一图形(命令序列逐字相同、144 点整体平移),该菜单直接用 `server`。
5
8
  *
6
- * **命名:一律单个英文单词,不带连字符复合**,且**要能看出是哪块业务**(`service` / `schema` / `compose` / `log` /
7
- * `mcp` / `agent` / `server` / `exposure` / `openapi`)。两条要留意的:
8
- * - `application` 与既有 `apps`(九点宫格入口)**名相邻但不同义**:前者是"应用管理"页,后者是宫格入口;
9
- * - 开放侧只剩 `exposure`(开放工具管理)一条 —— 原还有 `publish`(开放智能体管理),
10
- * 但**设计对它和 `server` 用了同一个图形**(逐点比对:命令序列逐字相同,144 个点整体平移 `(0.1, 0.5)`),
11
- * 故删除 `publish`;「开放智能体管理」菜单位直接用 `server`,将来若要区分再由设计补净稿。
12
- *
13
- * 转换口径见 `docs/plans/2026-10-09-icon-supplement.md`:
14
- * - **颜色一律 `currentColor`**:原稿的「-主题色 / -反白」是同一路径的两种填色,只保留一版,
15
- * 换色由消费方 class 承担(`text-primary` / `text-white`)。
16
- * - **实心字形**:统一 `fill="currentColor" stroke="none"`(这些原稿画的是填充轮廓,没有描边)。
17
- * - **坐标**:原稿画板为 16×16 且元素矩阵为零偏移,故片段包一层 `transform="scale(1.5)"`
18
- * 映射到 24 网格(与 `page-title` / `settings` 用 transform 包装同例)。
19
- * - 已剥掉的 InDesign 导出残留:外层画板偏移 `<g>`、`<title>`、`opacity="0"` 的占位 `<rect>`、`id`、`xmlns:xlink`。
20
- *
21
- * 设计若后续交出净稿,只替换本文件对应条目即可。
9
+ * 转换口径:颜色一律 `currentColor`(换色由消费方 class 承担);实心 `fill=currentColor stroke=none`;
10
+ * 原稿 16 画板 ⇒ 片段包 `transform="scale(1.5)"` 映射到 24 网格;已剥掉 InDesign 导出残留
11
+ * (画板偏移 `<g>` / `<title>` / 占位 `<rect>` / `id` / `xmlns:xlink`)。设计交净稿时只替换对应条目
12
+ * —— 依据见 `docs/plans/2026-10-09-icon-supplement.md`。
22
13
  */
23
14
  export declare const BUSINESS_GLYPHS: {
24
15
  readonly application: "<g transform=\"scale(1.5)\" fill=\"currentColor\" stroke=\"none\" fill-rule=\"evenodd\"><path d=\"M11.4653333,1.00000005 C10.866,1.00000005 10.3666667,1.00000005 9.97066667,1.05333338 C9.552,1.10933338 9.174,1.23333338 8.87066667,1.53666671 C8.56666667,1.84066671 8.44266667,2.21866671 8.38666667,2.63666671 C8.33333333,3.03333338 8.33333333,3.53333338 8.33333333,4.13200005 L8.33333333,4.20133338 C8.33333333,4.80000005 8.33333333,5.30000005 8.38666667,5.69600005 C8.44266667,6.11466671 8.56666667,6.49266671 8.87066667,6.79600005 C9.174,7.10000005 9.552,7.22400005 9.97066667,7.28000005 C10.3666667,7.33333338 10.866,7.33333338 11.4653333,7.33333338 L11.5346667,7.33333338 C12.134,7.33333338 12.6333333,7.33333338 13.0293333,7.28000005 C13.448,7.22400005 13.826,7.10000005 14.1293333,6.79600005 C14.4333333,6.49266671 14.5573333,6.11466671 14.6133333,5.69600005 C14.6666667,5.30000005 14.6666667,4.80000005 14.6666667,4.20133338 L14.6666667,4.13200005 C14.6666667,3.53333338 14.6666667,3.03333338 14.6133333,2.63733338 C14.5573333,2.21866671 14.4333333,1.84066671 14.1293333,1.53733338 C13.826,1.23333338 13.448,1.10933338 13.0293333,1.05333338 C12.6333333,1.00000005 12.134,1.00000005 11.5346667,1.00000005 L11.4653333,1.00000005 Z M9.57733333,2.24400005 C9.664,2.15733338 9.796,2.08600005 10.104,2.04400005 C10.4253333,2.00133338 10.8573333,2.00000005 11.5,2.00000005 C12.1426667,2.00000005 12.5746667,2.00133338 12.8966667,2.04466671 C13.204,2.08600005 13.336,2.15733338 13.4226667,2.24466671 C13.5093333,2.33200005 13.5806667,2.46266671 13.6226667,2.77000005 C13.6653333,3.09200005 13.6666667,3.52400005 13.6666667,4.16666671 C13.6666667,4.80933338 13.6653333,5.24133338 13.622,5.56333338 C13.5806667,5.87066671 13.5093333,6.00266671 13.422,6.08933338 C13.3346667,6.17600005 13.204,6.24733338 12.8966667,6.28933338 C12.5746667,6.33200005 12.1426667,6.33333338 11.5,6.33333338 C10.8573333,6.33333338 10.4253333,6.33200005 10.1033333,6.28866671 C9.796,6.24733338 9.664,6.17600005 9.57733333,6.08866671 C9.49066667,6.00133338 9.41933333,5.87066671 9.37733333,5.56333338 C9.33466667,5.24133338 9.33333333,4.80933338 9.33333333,4.16666671 C9.33333333,3.52400005 9.33466667,3.09200005 9.37733333,2.77000005 C9.41933333,2.46266671 9.49066667,2.33066671 9.57733333,2.24400005 M4.132,8.33333338 C3.53333333,8.33333338 3.03333333,8.33333338 2.63733333,8.38666671 C2.21866667,8.44266671 1.84066667,8.56666671 1.53733333,8.87066671 C1.23333333,9.17400005 1.10933333,9.55200005 1.05333333,9.97066671 C1,10.3666667 1,10.866 1,11.4653334 L1,11.5346667 C1,12.134 1,12.6333334 1.05333333,13.0293334 C1.10933333,13.448 1.23333333,13.826 1.53666667,14.1293334 C1.84066667,14.4333334 2.21866667,14.5573334 2.63666667,14.6133334 C3.03333333,14.6666667 3.53333333,14.6666667 4.132,14.6666667 L4.20133333,14.6666667 C4.8,14.6666667 5.3,14.6666667 5.696,14.6133334 C6.11466667,14.5573334 6.49266667,14.4333334 6.796,14.1293334 C7.1,13.826 7.224,13.448 7.28,13.0293334 C7.33333333,12.6333334 7.33333333,12.134 7.33333333,11.5346667 L7.33333333,11.4653334 C7.33333333,10.866 7.33333333,10.3666667 7.28,9.97066671 C7.224,9.55200005 7.1,9.17400005 6.796,8.87066671 C6.49266667,8.56666671 6.11466667,8.44266671 5.696,8.38666671 C5.3,8.33333338 4.8,8.33333338 4.20133333,8.33333338 L4.132,8.33333338 Z M2.244,9.57733338 C2.33066667,9.49066671 2.46266667,9.41933338 2.77066667,9.37733338 C3.092,9.33466671 3.524,9.33333338 4.16666667,9.33333338 C4.80933333,9.33333338 5.24133333,9.33466671 5.56333333,9.37733338 C5.87066667,9.41933338 6.00266667,9.49066671 6.08933333,9.57733338 C6.176,9.66400005 6.24733333,9.79600005 6.28933333,10.104 C6.332,10.4253334 6.33333333,10.8573334 6.33333333,11.5 C6.33333333,12.1426667 6.332,12.5746667 6.28866667,12.8966667 C6.24733333,13.204 6.176,13.336 6.08866667,13.4226667 C6.00133333,13.5093334 5.87066667,13.5806667 5.56333333,13.6226667 C5.24133333,13.6653334 4.80933333,13.6666667 4.16666667,13.6666667 C3.524,13.6666667 3.092,13.6653334 2.77,13.622 C2.46266667,13.5806667 2.33066667,13.5093334 2.244,13.422 C2.15733333,13.3346667 2.086,13.204 2.044,12.8966667 C2.00133333,12.5746667 2,12.1426667 2,11.5 C2,10.8573334 2.00133333,10.4253334 2.04466667,10.1033334 C2.086,9.79600005 2.15733333,9.66400005 2.24466667,9.57733338 M1,4.16666671 C1,3.03532567 1.60356324,1.98992342 2.58333332,1.4242529 C3.5631034,0.858582368 4.77022993,0.858582368 5.75000001,1.4242529 C6.7297701,1.98992342 7.33333333,3.03532567 7.33333333,4.16666671 C7.33333333,5.9155684 5.91556836,7.33333333 4.16666667,7.33333333 C2.41776498,7.33333333 1,5.9155684 1,4.16666671 M4.16666667,2.00000005 C2.97004971,2.00000005 2,2.97004976 2,4.16666671 C2,5.36328367 2.97004971,6.33333338 4.16666667,6.33333338 C5.36328362,6.33333338 6.33333333,5.36328367 6.33333333,4.16666671 C6.33333333,2.97004976 5.36328362,2.00000005 4.16666667,2.00000005 M8.33333333,11.5 C8.33333333,9.75109834 9.75109829,8.33333338 11.5,8.33333338 C13.2489017,8.33333338 14.6666667,9.75109834 14.6666667,11.5 C14.6666667,13.2489018 13.2489017,14.6666667 11.5,14.6666667 C9.75109829,14.6666667 8.33333333,13.2489018 8.33333333,11.5 M11.5,9.33333338 C10.303383,9.33333338 9.33333333,10.3033831 9.33333333,11.5 C9.33333333,12.696617 10.303383,13.6666667 11.5,13.6666667 C12.696617,13.6666667 13.6666667,12.696617 13.6666667,11.5 C13.6666667,10.3033831 12.696617,9.33333338 11.5,9.33333338\"/></g>";
@@ -1,24 +1,15 @@
1
1
  /**
2
- * 设计稿来源的图标片段(**自绘资产**,与 `./glyphs.ts` 里取自 lucide 的字形分开存放)。
2
+ * 设计稿来源的图标片段(**自绘资产**,与 `glyphs.ts` 里取自 lucide 的字形分开存放):
3
+ * 出处「智能集成平台 260930」的 23 份原稿(11 组 × 主题色 / 反白 / 中性姿态)归并。
3
4
  *
4
- * 出处:「智能集成平台 260930」设计交付的 assets —— 23 份原稿(11 组 × 主题色 / 反白 / 中性姿态)归并而来。
5
+ * 命名:单个英文单词、不带连字符复合;要能看出是哪块业务。
6
+ * ⚠️ `application`(应用管理页)与 `apps`(九宫格入口)名相邻但不同义。`publish` 已删 —— 规范对它和
7
+ * `server` 用了同一图形(命令序列逐字相同、144 点整体平移),该菜单直接用 `server`。
5
8
  *
6
- * **命名:一律单个英文单词,不带连字符复合**,且**要能看出是哪块业务**(`service` / `schema` / `compose` / `log` /
7
- * `mcp` / `agent` / `server` / `exposure` / `openapi`)。两条要留意的:
8
- * - `application` 与既有 `apps`(九点宫格入口)**名相邻但不同义**:前者是"应用管理"页,后者是宫格入口;
9
- * - 开放侧只剩 `exposure`(开放工具管理)一条 —— 原还有 `publish`(开放智能体管理),
10
- * 但**设计对它和 `server` 用了同一个图形**(逐点比对:命令序列逐字相同,144 个点整体平移 `(0.1, 0.5)`),
11
- * 故删除 `publish`;「开放智能体管理」菜单位直接用 `server`,将来若要区分再由设计补净稿。
12
- *
13
- * 转换口径见 `docs/plans/2026-10-09-icon-supplement.md`:
14
- * - **颜色一律 `currentColor`**:原稿的「-主题色 / -反白」是同一路径的两种填色,只保留一版,
15
- * 换色由消费方 class 承担(`text-primary` / `text-white`)。
16
- * - **实心字形**:统一 `fill="currentColor" stroke="none"`(这些原稿画的是填充轮廓,没有描边)。
17
- * - **坐标**:原稿画板为 16×16 且元素矩阵为零偏移,故片段包一层 `transform="scale(1.5)"`
18
- * 映射到 24 网格(与 `page-title` / `settings` 用 transform 包装同例)。
19
- * - 已剥掉的 InDesign 导出残留:外层画板偏移 `<g>`、`<title>`、`opacity="0"` 的占位 `<rect>`、`id`、`xmlns:xlink`。
20
- *
21
- * 设计若后续交出净稿,只替换本文件对应条目即可。
9
+ * 转换口径:颜色一律 `currentColor`(换色由消费方 class 承担);实心 `fill=currentColor stroke=none`;
10
+ * 原稿 16 画板 ⇒ 片段包 `transform="scale(1.5)"` 映射到 24 网格;已剥掉 InDesign 导出残留
11
+ * (画板偏移 `<g>` / `<title>` / 占位 `<rect>` / `id` / `xmlns:xlink`)。设计交净稿时只替换对应条目
12
+ * —— 依据见 `docs/plans/2026-10-09-icon-supplement.md`。
22
13
  */
23
14
  export const BUSINESS_GLYPHS = {
24
15
  // 应用管理(设计稿 icon-应用管理.svg,2026-09-30)
package/dist/glyphs.d.ts CHANGED
@@ -95,20 +95,14 @@ export interface IconRenderOptions {
95
95
  strokeWidth?: number;
96
96
  }
97
97
  /**
98
- * 图标 → 完整 `<svg>` 字符串(不引入 Vue)。
99
- *
100
- * 给非组件场景用:静态页 / 模板串拼接 / 任何框架的 `innerHTML`。
101
- * 属性与 `<Icon>` 组件逐字对齐,两版产物可直接对照。
102
- *
103
- * 自带片段要在这儿渲染时,用同一套容器属性自己包一层即可(口径见 README「三个入口」):
98
+ * 图标 → 完整 `<svg>` 字符串(不引入 Vue):给非组件场景用(静态页 / 模板串拼接 / 别的框架的
99
+ * `innerHTML`)。属性与 `<Icon>` 组件逐字对齐,两版产物可直接对照。
100
+ * 自带片段要在这儿渲染时,用同一套容器属性自己包一层:
104
101
  * `'<svg viewBox="0 0 24 24" width="16" height="16">' + frag + '</svg>'`。
105
102
  */
106
103
  export declare function renderIconSvg(name: IconName, options?: IconRenderOptions): string;
107
104
  /**
108
- * 取单个图标的片段串。
109
- *
110
- * 未知名字返回空串(**与旧版行为一致**:渲染成空图标而不抛错)——
111
- * 消费方可能把业务侧来的字符串透传给 `icon`(如头像的图标档),抛错会把整棵组件树带崩。
112
- * 拼写错误由 `IconName` 类型在编译期拦住,运行期不再二次设防。
105
+ * 取单个图标的片段串。未知名字返回空串(渲染成空图标而不抛错):消费方可能把业务侧字符串透传给
106
+ * `icon`,抛错会把整棵组件树带崩。拼写错误由 `IconName` 类型在编译期拦住。
113
107
  */
114
108
  export declare function getIconGlyph(name: IconName): string;
package/dist/glyphs.js CHANGED
@@ -1,39 +1,27 @@
1
1
  /**
2
- * 图标资产:**纯数据(SVG 片段字符串)+ 纯字符串渲染器**。
2
+ * 图标资产:**纯数据(SVG 片段字符串)+ 纯字符串渲染器**(不需要 JSX 的那一半)。
3
+ * 表就是对象、值就是字符串,任何栈拿 `ICON_GLYPHS[name]` 直接 `innerHTML` 即可用;
4
+ * `renderIconSvg` 另外给出完整 `<svg>` 串,Vue 组件版见 `./icon.ts`。
3
5
  *
4
- * 本文件是「不需要 JSX」的那一半:
5
- * - 零框架、零依赖、零 JSX —— 表就是对象,值就是字符串,任何栈(Vue / React / 原生 HTML / 静态页)
6
- * 拿 `ICON_GLYPHS[name]` 直接 `innerHTML` 即可用;`renderIconSvg` 另外给出完整 `<svg>` 串。
7
- * - Vue 组件版见 `./icon.ts`(用 `h()` + `innerHTML` 渲染,同样不经过任何 JSX 编译)。
6
+ * 约定:片段内不写容器属性(`viewBox` / `width` / `stroke` 由渲染方统一给);线性图标继承
7
+ * `currentColor`,实心图标显式 `fill="currentColor" stroke="none"`;名一律 kebab-case,
8
+ * 路径数据取自 lucide(ISC License),自绘图标在条目上方注明出处。
8
9
  *
9
- * 约定:片段内不写容器属性(`viewBox` / `width` / `stroke` 由渲染方统一给);
10
- * 线性图标继承 `currentColor`;实心图标显式 `fill="currentColor" stroke="none"`。
11
- * 名一律 kebab-case,线性路径数据取自 lucide(ISC License),自绘图标在条目上方注明出处。
12
- *
13
- * **命名按用途,不按形状**(0.7.0 起收紧):
14
- * - 动作给业务动词(`edit` / `delete` / `copy` / `refresh` / `upload`),不给「画的是什么」——
15
- * lucide 原名 `x` / `pencil` / `trash-2` 在本仓就是 `close` / `edit` / `delete`;
16
- * 0.7.0 又把 `bell` → `notification`、`wrench` → `tool`、`heart` / `heart-filled` → `favorite` / `favorite-filled`、
17
- * `eye` → `preview`、`sparkles` → `ai` 一并收口。
18
- * - **一处只承担一个语义**:`grid-dots` 曾同时当「宫格入口」与「拖拽手柄」,
19
- * 0.7.0 拆成 `apps`(9 点宫格)与 `drag-handle`(6 点手柄)两个字形。
20
- * - 符号族(`plus` / `minus` / `check` / `close` / `info` / `alert` / `more`)**保留符号名** ——
21
- * 符号本身就是语义的最小载体,改叫 `add` / `subtract` 反而啰嗦,且与动作族撞构词;
22
- * 同理 `plus-circle` / `close-circle` 与 `plus` / `close` 同族,不改成 `add-circle` / `remove-circle`。
10
+ * **命名按用途不按形状**:动作给业务动词(`edit` / `delete` / `refresh` / `upload`,不用
11
+ * lucide 的 `pencil` / `trash-2` / `x`);`bell` → `notification`、`wrench` → `tool`、
12
+ * `eye` → `preview`、`sparkles` → `ai`。**一处只承担一个语义**(`apps` 宫格入口 与 `drag-handle`
13
+ * 手柄是两个字形)。符号族(`plus` / `minus` / `check` / `close` / `info` / `alert` / `more`)
14
+ * 保留符号名 —— 符号本身就是语义的最小载体,`plus-circle` 等同族也不改名。
23
15
  */
24
16
  import { BUSINESS_GLYPHS } from './business-glyphs.js';
25
17
  export const ICON_GLYPHS = {
26
18
  loading: '<circle cx="12" cy="12" r="10" stroke-opacity="0.25"/><path d="M12 2a10 10 0 0 1 10 10"/>',
27
19
  close: '<path d="M18 6 6 18"/><path d="m6 6 12 12"/>',
28
- /*
29
- * 状态符号有**两族**,挑哪族看容器有没有那一圈色底:
30
- * - **裸字形**(`info` / `alert` / `check` / `close`):给**自带圆形色底**的容器用(`Toast` 的 18px 圆底)——
31
- * 容器自己就是那一圈,字形再自带一圈会叠成双圈。裸符号按 24 视口撑满(上下 5–19),
32
- * 缩到 12px 才不显小;
33
- * - **带圈字形**(`info-circle` / `check-circle` / `alert-circle` / `close-circle`):给**没有色底**的
34
- * 光图标用(`Notice` / `Notification` / `Dialog` 的语义图标)—— 缺了那一圈,裸符号看上去只是一个
35
- * 孤零零的勾 / 感叹号,撑不住「状态」那点分量。
36
- * 两族路径都取自 lucide(ISC),线重与 24 视口口径一致。
20
+ /* 状态符号有**两族**,挑哪族看容器有没有那一圈色底:
21
+ * - **裸字形**(`info` / `alert` / `check` / `close`):给自带圆形色底的容器用(`Toast` 的 18px 圆底)
22
+ * —— 容器自己就是那一圈,字形再自带一圈会叠成双圈;
23
+ * - **带圈字形**(`info-circle` / `check-circle` / `alert-circle` / `close-circle`):给没有色底的
24
+ * 光图标用(`Notice` / `Notification` / `Dialog`)—— 缺那一圈,裸符号撑不住「状态」那点分量。
37
25
  */
38
26
  info: '<path d="M12 10v9"/><path d="M12 5h.01"/>',
39
27
  alert: '<path d="M12 5v9"/><path d="M12 19h.01"/>',
@@ -70,8 +58,7 @@ export const ICON_GLYPHS = {
70
58
  'page-title': '<g transform="scale(0.9230769)" stroke="none"><rect width="26" height="26" rx="4" fill="currentColor"/><path fill="#fff" fill-rule="evenodd" clip-rule="evenodd" d="M6.78947 6C6.35346 6 6 6.35346 6 6.78947V19.2105C6 19.6465 6.35346 20 6.78947 20H15.8182H16.2045C16.1524 20 16.1016 19.9947 16.0525 19.9846C15.9758 19.9948 15.8976 20 15.8182 20C14.814 20 14 19.1605 14 18.125C14 17.0895 14.814 16.25 15.8182 16.25C15.9428 16.25 16.0645 16.2629 16.1821 16.2876L16.1818 16.25C16.1818 15.0074 17.1587 14 18.3636 14C18.4543 14 18.5438 14.0057 18.6316 14.0168V6.78947C18.6316 6.35346 18.2781 6 17.8421 6H6.78947ZM15.8684 8.72222H8.76316V9.88889H15.8684V8.72222ZM8.76316 11.4444H12.7105V12.6111H8.76316V11.4444Z"/><g opacity="0.8"><mask id="ak-icon-page-title-cut" maskUnits="userSpaceOnUse" x="12" y="12" width="12" height="10" fill="black"><rect fill="white" x="12" y="12" width="12" height="10"/><path fill-rule="evenodd" clip-rule="evenodd" d="M16.0525 19.9846C15.9758 19.9948 15.8976 20 15.8182 20C14.814 20 14 19.1605 14 18.125C14 17.0895 14.814 16.25 15.8182 16.25C15.9428 16.25 16.0645 16.2629 16.1821 16.2876L16.1818 16.25C16.1818 15.0074 17.1587 14 18.3636 14C19.5686 14 20.5455 15.0074 20.5455 16.25L20.5452 16.2874C21.3752 16.4611 22 17.2178 22 18.125C22 19.1605 21.186 20 20.1818 20C20.1772 20 20.1726 20 20.1681 19.9999C20.1651 20 20.1621 20 20.1591 20H16.2045C16.1524 20 16.1016 19.9947 16.0525 19.9846Z"/></mask><path fill="#fff" fill-rule="evenodd" clip-rule="evenodd" d="M16.0525 19.9846C15.9758 19.9948 15.8976 20 15.8182 20C14.814 20 14 19.1605 14 18.125C14 17.0895 14.814 16.25 15.8182 16.25C15.9428 16.25 16.0645 16.2629 16.1821 16.2876L16.1818 16.25C16.1818 15.0074 17.1587 14 18.3636 14C19.5686 14 20.5455 15.0074 20.5455 16.25L20.5452 16.2874C21.3752 16.4611 22 17.2178 22 18.125C22 19.1605 21.186 20 20.1818 20C20.1772 20 20.1726 20 20.1681 19.9999C20.1651 20 20.1621 20 20.1591 20H16.2045C16.1524 20 16.1016 19.9947 16.0525 19.9846Z"/><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" mask="url(#ak-icon-page-title-cut)" d="M16.0525 19.9846C15.9758 19.9948 15.8976 20 15.8182 20C14.814 20 14 19.1605 14 18.125C14 17.0895 14.814 16.25 15.8182 16.25C15.9428 16.25 16.0645 16.2629 16.1821 16.2876L16.1818 16.25C16.1818 15.0074 17.1587 14 18.3636 14C19.5686 14 20.5455 15.0074 20.5455 16.25L20.5452 16.2874C21.3752 16.4611 22 17.2178 22 18.125C22 19.1605 21.186 20 20.1818 20C20.1772 20 20.1726 20 20.1681 19.9999C20.1651 20 20.1621 20 20.1591 20H16.2045C16.1524 20 16.1016 19.9947 16.0525 19.9846Z"/></g></g>',
71
59
  'favorite-filled': '<g fill="currentColor" stroke="none"><path d="M12.0409 5.54069C13.1383 4.44662 14.682 3.87338 16.2685 4.02409C18.2956 4.21669 20.0315 5.55741 20.7294 7.47037C21.4272 9.38357 20.9627 11.5281 19.5272 12.9889L12.4872 19.9489C12.1756 20.257 11.6739 20.257 11.3622 19.9489L4.31436 12.9801C2.88709 11.5275 2.42223 9.38356 3.12002 7.47037C3.81793 5.55742 5.55377 4.21666 7.58096 4.02409C9.16741 3.87341 10.7111 4.44659 11.8085 5.54069L11.9247 5.66178L12.0409 5.54069Z"/></g>',
72
60
  // ===== 操作(编辑 / 内容) =====
73
- /* 拖拽手柄(6 点 = 2 列 × 3 行,点径与 apps 一致)。
74
- 原 `grid-dots` 一名两用(宫格入口 + 拖拽手柄);0.7.0 拆开:宫格入口 → `apps`(9 点 3×3),手柄 → 本字形。 */
61
+ /* 拖拽手柄(6 点 = 2 列 × 3 行,点径与 `apps` 一致);宫格入口是另一个字形 `apps`(9 点 3×3) */
75
62
  'drag-handle': '<g fill="currentColor" stroke="none"><circle cx="9" cy="5" r="1.5"/><circle cx="9" cy="12" r="1.5"/><circle cx="9" cy="19" r="1.5"/><circle cx="15" cy="5" r="1.5"/><circle cx="15" cy="12" r="1.5"/><circle cx="15" cy="19" r="1.5"/></g>',
76
63
  edit: '<path d="M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"/><path d="m15 5 4 4"/>',
77
64
  delete: '<path d="M3 6h18"/><path d="M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6"/><path d="M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2"/><line x1="10" x2="10" y1="11" y2="17"/><line x1="14" x2="14" y1="11" y2="17"/>',
@@ -115,22 +102,17 @@ export const ICON_GLYPHS = {
115
102
  'shield-alert': '<path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"/><path d="M12 8v4"/><path d="M12 16h.01"/>',
116
103
  history: '<path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"/><path d="M3 3v5h5"/><path d="M12 7v5l4 2"/>',
117
104
  /* ===== 业务导航(智能集成平台 260930 设计稿)=====
118
- 11 条真实片段在 `./business-glyphs.ts`(**设计稿来源的自绘资产**,与上表取自 lucide 的字形分开存放)——
119
- 片段已剥掉原稿的硬编码色值 / 渐变 / 画板偏移,统一为 `currentColor` 实心字形。
120
- 每条的字形名、中文名、原稿文件名与「与既有名相邻」的说明见该文件的条目注释;
121
- 取名依据、净稿口径与定名结论见 `docs/plans/2026-10-09-icon-supplement.md`。 */
105
+ 片段在 `./business-glyphs.ts`(设计稿来源的自绘资产,与上表取自 lucide 的字形分开存放):
106
+ 逐条出处见该文件的条目注释,取名依据与净稿口径见 `docs/plans/2026-10-09-icon-supplement.md`。 */
122
107
  ...BUSINESS_GLYPHS,
123
108
  };
124
109
  export const IconNameList = Object.keys(ICON_GLYPHS);
125
110
  /** 基底内联样式:不依赖任何 CSS 框架,两种栈取值一致 */
126
111
  const BASE_STYLE = 'display:inline-block;flex-shrink:0';
127
112
  /**
128
- * 图标 → 完整 `<svg>` 字符串(不引入 Vue)。
129
- *
130
- * 给非组件场景用:静态页 / 模板串拼接 / 任何框架的 `innerHTML`。
131
- * 属性与 `<Icon>` 组件逐字对齐,两版产物可直接对照。
132
- *
133
- * 自带片段要在这儿渲染时,用同一套容器属性自己包一层即可(口径见 README「三个入口」):
113
+ * 图标 → 完整 `<svg>` 字符串(不引入 Vue):给非组件场景用(静态页 / 模板串拼接 / 别的框架的
114
+ * `innerHTML`)。属性与 `<Icon>` 组件逐字对齐,两版产物可直接对照。
115
+ * 自带片段要在这儿渲染时,用同一套容器属性自己包一层:
134
116
  * `'<svg viewBox="0 0 24 24" width="16" height="16">' + frag + '</svg>'`。
135
117
  */
136
118
  export function renderIconSvg(name, options = {}) {
@@ -155,11 +137,8 @@ export function renderIconSvg(name, options = {}) {
155
137
  return '<svg ' + attrs + '>' + ICON_GLYPHS[name] + '</svg>';
156
138
  }
157
139
  /**
158
- * 取单个图标的片段串。
159
- *
160
- * 未知名字返回空串(**与旧版行为一致**:渲染成空图标而不抛错)——
161
- * 消费方可能把业务侧来的字符串透传给 `icon`(如头像的图标档),抛错会把整棵组件树带崩。
162
- * 拼写错误由 `IconName` 类型在编译期拦住,运行期不再二次设防。
140
+ * 取单个图标的片段串。未知名字返回空串(渲染成空图标而不抛错):消费方可能把业务侧字符串透传给
141
+ * `icon`,抛错会把整棵组件树带崩。拼写错误由 `IconName` 类型在编译期拦住。
163
142
  */
164
143
  export function getIconGlyph(name) {
165
144
  return ICON_GLYPHS[name] ?? '';
package/dist/icon.d.ts CHANGED
@@ -28,23 +28,13 @@ export type IconProps = ExtractPropTypes<typeof iconProps>;
28
28
  * <Icon>{'<path d="M2 2h6v6H2z"/>'}</Icon> // 自带图形(片段串)
29
29
  * ```
30
30
  *
31
- * - **槽里有内容就以槽为准**(显式给的图形胜过 `name`);两者都不给 → 空图标,不抛错。
32
- * - 容器口径由本组件统一给:`viewBox="0 0 24 24"`、`fill="none"`、`stroke="currentColor"`、
33
- * 圆头端点、尺寸、以及 `display:inline-block` + `flex-shrink:0` 的基底内联样式。
34
- * 所以槽里的图形请按 **24 网格**给 —— 原稿是 16 画板就自己包一层 `<g transform="scale(1.5)">`。
35
- * - 槽里的图形**颜色靠继承**(用 `currentColor`),别写死色值。
36
- * - `size` 控制尺寸(默认 16px,同时设置 width / height),也可经 class / style 覆盖。
37
- *
38
- * ## 为什么 `name` 走 `innerHTML`、槽走子节点
39
- *
40
- * 内置数据是**字符串**(`ICON_GLYPHS`)—— 这是本包"不需要 JSX 编译"的根:同一份数据既能给本组件用,
41
- * 也能给任意非 Vue 场景(静态页 / 别的框架 / 模板串)直接 `innerHTML`。代价是内容以 `innerHTML`
42
- * 注入(数据是包内静态常量,不含任何外部输入,无注入面),且**片段必须自带合法闭合**
43
- * (表里的串按此约定生成,SSR 与浏览器解析结果一致)。槽内容是调用方自己的 vnode,交由 Vue 正常渲染,
44
- * 不走 `innerHTML`;唯一的例外是「槽里全是字符串」(直接贴片段串那种用法),那时按片段串注入,
45
- * 与 `name` 同一路径。
46
- *
47
- * 未知图标名按旧版行为处理:渲染成空图标,不抛错(消费方可能透传业务侧字符串)。
31
+ * - **槽里有内容就以槽为准**(胜过 `name`);两者都不给 → 空图标,不抛错(未知 `name` 同此处理)。
32
+ * - 容器口径由本组件统一给(`viewBox 0 0 24 24` / `fill:none` / `stroke:currentColor` / 圆头端点 /
33
+ * 尺寸 / 基底内联样式),故槽里的图形请按 **24 网格**给 —— 16 画板自己包 `<g transform="scale(1.5)">`;
34
+ * 颜色靠 `currentColor` 继承,别写死。
35
+ * - `size` 控尺寸(默认 16,同时设 width / height),也可经 class / style 覆盖。
36
+ * - `name` 走 `innerHTML`:内置数据是字符串常量(不含外部输入),代价是**片段必须自带合法闭合**;
37
+ * 槽里的 vnode 走 Vue 正常渲染,只有「槽里全是字符串」时与 `name` 同一路径。
48
38
  */
49
39
  export declare const Icon: import("vue").DefineComponent<ExtractPropTypes<{
50
40
  /** 内置图标名。**不传**时以默认插槽给的图形内容为准(见组件注释) */
package/dist/icon.js CHANGED
@@ -1,11 +1,7 @@
1
1
  import { defineComponent, h, Text } from 'vue';
2
2
  import { getIconGlyph } from './glyphs.js';
3
- /**
4
- * 内建基底样式(内联 style,**不依赖任何 CSS 框架**)。
5
- *
6
- * 代价:内联 style 优先级高于 class,消费方**无法再用 class 覆盖 `display` / `flex-shrink`**
7
- * (需要覆盖时传 `style`,Vue 会把 attrs 回退的 style 与本对象合并、同键以后者为准)。
8
- */
3
+ /** 基底内联样式(不依赖任何 CSS 框架)。⚠️ 内联优先级高于 class ⇒ 消费方改不了 `display` /
4
+ * `flex-shrink`,要覆盖请传 `style`(Vue 会把 attrs 的 style 与本对象合并,同键以后者为准)。 */
9
5
  const BASE_STYLE = { display: 'inline-block', flexShrink: '0' };
10
6
  /** `<svg>` 容器属性:与 `renderIconSvg`(纯字符串版)逐字对齐,两版产物可直接对照 */
11
7
  const SVG_ATTRS = {
@@ -44,31 +40,19 @@ const isBlankText = (child) => isText(child) && textOf(child).trim() === '';
44
40
  * <Icon>{'<path d="M2 2h6v6H2z"/>'}</Icon> // 自带图形(片段串)
45
41
  * ```
46
42
  *
47
- * - **槽里有内容就以槽为准**(显式给的图形胜过 `name`);两者都不给 → 空图标,不抛错。
48
- * - 容器口径由本组件统一给:`viewBox="0 0 24 24"`、`fill="none"`、`stroke="currentColor"`、
49
- * 圆头端点、尺寸、以及 `display:inline-block` + `flex-shrink:0` 的基底内联样式。
50
- * 所以槽里的图形请按 **24 网格**给 —— 原稿是 16 画板就自己包一层 `<g transform="scale(1.5)">`。
51
- * - 槽里的图形**颜色靠继承**(用 `currentColor`),别写死色值。
52
- * - `size` 控制尺寸(默认 16px,同时设置 width / height),也可经 class / style 覆盖。
53
- *
54
- * ## 为什么 `name` 走 `innerHTML`、槽走子节点
55
- *
56
- * 内置数据是**字符串**(`ICON_GLYPHS`)—— 这是本包"不需要 JSX 编译"的根:同一份数据既能给本组件用,
57
- * 也能给任意非 Vue 场景(静态页 / 别的框架 / 模板串)直接 `innerHTML`。代价是内容以 `innerHTML`
58
- * 注入(数据是包内静态常量,不含任何外部输入,无注入面),且**片段必须自带合法闭合**
59
- * (表里的串按此约定生成,SSR 与浏览器解析结果一致)。槽内容是调用方自己的 vnode,交由 Vue 正常渲染,
60
- * 不走 `innerHTML`;唯一的例外是「槽里全是字符串」(直接贴片段串那种用法),那时按片段串注入,
61
- * 与 `name` 同一路径。
62
- *
63
- * 未知图标名按旧版行为处理:渲染成空图标,不抛错(消费方可能透传业务侧字符串)。
43
+ * - **槽里有内容就以槽为准**(胜过 `name`);两者都不给 → 空图标,不抛错(未知 `name` 同此处理)。
44
+ * - 容器口径由本组件统一给(`viewBox 0 0 24 24` / `fill:none` / `stroke:currentColor` / 圆头端点 /
45
+ * 尺寸 / 基底内联样式),故槽里的图形请按 **24 网格**给 —— 16 画板自己包 `<g transform="scale(1.5)">`;
46
+ * 颜色靠 `currentColor` 继承,别写死。
47
+ * - `size` 控尺寸(默认 16,同时设 width / height),也可经 class / style 覆盖。
48
+ * - `name` 走 `innerHTML`:内置数据是字符串常量(不含外部输入),代价是**片段必须自带合法闭合**;
49
+ * 槽里的 vnode 走 Vue 正常渲染,只有「槽里全是字符串」时与 `name` 同一路径。
64
50
  */
65
51
  export const Icon = defineComponent({
66
52
  name: 'AIcon',
67
53
  props: iconProps,
68
- /**
69
- * **只为类型**(运行期不读):声明默认插槽,TSX 里 `<Icon><path …/></Icon>` 才通得过检查 ——
70
- * 不声明的话 JSX 会把 children 当成一个不存在的 prop 直接报 TS2559。
71
- */
54
+ /** **只为类型**(运行期不读):声明默认插槽,TSX 里 `<Icon><path …/></Icon>` 才通得过检查
55
+ * (不声明会报 TS2559:children 被当成不存在的 prop)。 */
72
56
  slots: Object,
73
57
  setup(props, { slots }) {
74
58
  return () => {
package/dist/index.d.ts CHANGED
@@ -1,15 +1,10 @@
1
1
  /**
2
- * @manohub/icon 对外导出面(**Vue 组件版**入口)。
2
+ * @manohub/icon 对外导出面(Vue 组件版入口):图标表(`ICON_GLYPHS` / `IconName` / `IconNameList`)
3
+ * + `<Icon>` 组件 + 纯字符串渲染器 `renderIconSvg`。零运行时依赖(仅 peer `vue`),不含 CSS。
3
4
  *
4
- * 交付:内置 SVG 图标表(`ICON_GLYPHS` / `IconName` / `IconNameList`)+ `<Icon>` 组件
5
- * + 纯字符串渲染器(`renderIconSvg`)。零运行时依赖(仅 peer `vue`),不含任何 CSS。
6
- *
7
- * 源码是 TS 但**不含 JSX**(图标数据是字符串、组件用 `h()` 渲染),故 `tsc` 一个命令
8
- * 就能产出 `dist/*.js` 与 `dist/*.d.ts` —— 不需要 vite,也不需要 JSX 编译插件,
9
- * 消费方拿到的产物与普通 JS 包无异。
10
- *
11
- * 不用 Vue 的场景走子路径入口 `@manohub/icon/glyphs`:同一份图标数据 + `renderIconSvg()`,
12
- * 该入口**不引用 `vue`**(静态页 / 别的框架 / 任何 `innerHTML` 处都能直接用)。
5
+ * 源码是 TS 但**不含 JSX**(数据是字符串、组件用 `h()` 渲染)⇒ `tsc` 一个命令直出
6
+ * `dist/*.js` 与 `dist/*.d.ts`,不需要 vite 与 JSX 插件。
7
+ * 不用 Vue 的场景走子路径 `@manohub/icon/glyphs`(同一份数据 + `renderIconSvg()`,不引 `vue`)。
13
8
  */
14
9
  export * from './glyphs.js';
15
10
  export * from './icon.js';
package/dist/index.js CHANGED
@@ -1,15 +1,10 @@
1
1
  /**
2
- * @manohub/icon 对外导出面(**Vue 组件版**入口)。
2
+ * @manohub/icon 对外导出面(Vue 组件版入口):图标表(`ICON_GLYPHS` / `IconName` / `IconNameList`)
3
+ * + `<Icon>` 组件 + 纯字符串渲染器 `renderIconSvg`。零运行时依赖(仅 peer `vue`),不含 CSS。
3
4
  *
4
- * 交付:内置 SVG 图标表(`ICON_GLYPHS` / `IconName` / `IconNameList`)+ `<Icon>` 组件
5
- * + 纯字符串渲染器(`renderIconSvg`)。零运行时依赖(仅 peer `vue`),不含任何 CSS。
6
- *
7
- * 源码是 TS 但**不含 JSX**(图标数据是字符串、组件用 `h()` 渲染),故 `tsc` 一个命令
8
- * 就能产出 `dist/*.js` 与 `dist/*.d.ts` —— 不需要 vite,也不需要 JSX 编译插件,
9
- * 消费方拿到的产物与普通 JS 包无异。
10
- *
11
- * 不用 Vue 的场景走子路径入口 `@manohub/icon/glyphs`:同一份图标数据 + `renderIconSvg()`,
12
- * 该入口**不引用 `vue`**(静态页 / 别的框架 / 任何 `innerHTML` 处都能直接用)。
5
+ * 源码是 TS 但**不含 JSX**(数据是字符串、组件用 `h()` 渲染)⇒ `tsc` 一个命令直出
6
+ * `dist/*.js` 与 `dist/*.d.ts`,不需要 vite 与 JSX 插件。
7
+ * 不用 Vue 的场景走子路径 `@manohub/icon/glyphs`(同一份数据 + `renderIconSvg()`,不引 `vue`)。
13
8
  */
14
9
  export * from './glyphs.js';
15
10
  export * from './icon.js';
package/dist/svg.d.ts CHANGED
@@ -1,18 +1,13 @@
1
1
  /**
2
- * SVG 归一:把「完整 `.svg`」转成图标内容表要的**片段串**。
2
+ * SVG 归一:把「完整 `.svg`」转成内容表要的**片段串**。
3
3
  *
4
- * 为什么需要它:表里存的是**片段**(不含 `<svg>` 壳、不含硬编码颜色),而项目手上多半是
5
- * 设计工具 / 图标站导出的**完整文件**。手工剥壳有 7 件事要做,其中三件几乎必错
6
- * (算多层 `transform` 的净矩阵、保住 `fill-rule`、查重),所以做成工具。
4
+ * 表里存的是片段(不含 `<svg>` 壳、不含硬编码颜色),而手上多半是设计工具导出的完整文件;
5
+ * 手工剥壳要处理「多层 `transform` 的净矩阵 / `fill-rule` / 查重」等 7 件事(三件几乎必错)。
6
+ * 只在**构建期**用:`icon-from-svg` 读目录产出静态 `.ts` 表(片段进 git,可 review、可 diff),
7
+ * 片段再交给 `<Icon>` 的插槽 —— 不在运行期归一(那会让每个消费方都背一遍解析器)。
7
8
  *
8
- * 用法只有一条:**构建期** —— `icon-from-svg` 读一个目录,产出静态的 `.ts` 表(片段进 git,可 review、可 diff),
9
- * 片段再交给 `<Icon>` 的默认插槽渲染。本包**不在运行期做归一** —— 那是每个消费方的包里都要背一遍的解析器。
10
- *
11
- * 本文件是**纯字符串处理**:不引 `vue`、不引 `node:*`、零依赖 —— 所以浏览器与 Node 都能用
12
- * (读文件那半边在 `bin/icon-from-svg.mjs`)。
13
- *
14
- * 口径与「设计净稿规范」一致:只接收**单色**图形;渐变 / 滤镜 / 遮罩 / 多色一律**拒绝**
15
- * (那类属于产品专属图形,应留在消费方 assets,不进字形表)。
9
+ * 纯字符串处理:不引 `vue`、不引 `node:*`,浏览器与 Node 都能用(读文件在 `bin/icon-from-svg.mjs`)。
10
+ * 口径:只接收**单色**图形;渐变 / 滤镜 / 遮罩 / 多色一律拒绝(属产品专属图形,放应用侧 assets)。
16
11
  */
17
12
  /** `svgToFragment` 的结果 */
18
13
  export interface SvgFragmentResult {
@@ -71,9 +66,7 @@ export declare function buildTableSource(entries: GlyphEntry[], options?: {
71
66
  }): string;
72
67
  /**
73
68
  * 同一图形的两条条目(命令序列逐字相同 + 所有点位移一致 ⇒ 只是画板里挪了位置)。
74
- *
75
- * 设计稿常对多个菜单位复用同一图形(本仓 2026-10-09 就抓到过一处:`server` vs 已删的 `publish`),
76
- * 所以生成时要顺带报出来 —— 同形只留一条,另一处直接复用同名字形。
69
+ * 设计稿常对多个菜单位复用同一图形,生成时顺带报出来:同形只留一条,另一处复用同名字形。
77
70
  */
78
71
  export declare function findDuplicatePairs(entries: GlyphEntry[]): Array<{
79
72
  a: string;
package/dist/svg.js CHANGED
@@ -1,18 +1,13 @@
1
1
  /**
2
- * SVG 归一:把「完整 `.svg`」转成图标内容表要的**片段串**。
2
+ * SVG 归一:把「完整 `.svg`」转成内容表要的**片段串**。
3
3
  *
4
- * 为什么需要它:表里存的是**片段**(不含 `<svg>` 壳、不含硬编码颜色),而项目手上多半是
5
- * 设计工具 / 图标站导出的**完整文件**。手工剥壳有 7 件事要做,其中三件几乎必错
6
- * (算多层 `transform` 的净矩阵、保住 `fill-rule`、查重),所以做成工具。
4
+ * 表里存的是片段(不含 `<svg>` 壳、不含硬编码颜色),而手上多半是设计工具导出的完整文件;
5
+ * 手工剥壳要处理「多层 `transform` 的净矩阵 / `fill-rule` / 查重」等 7 件事(三件几乎必错)。
6
+ * 只在**构建期**用:`icon-from-svg` 读目录产出静态 `.ts` 表(片段进 git,可 review、可 diff),
7
+ * 片段再交给 `<Icon>` 的插槽 —— 不在运行期归一(那会让每个消费方都背一遍解析器)。
7
8
  *
8
- * 用法只有一条:**构建期** —— `icon-from-svg` 读一个目录,产出静态的 `.ts` 表(片段进 git,可 review、可 diff),
9
- * 片段再交给 `<Icon>` 的默认插槽渲染。本包**不在运行期做归一** —— 那是每个消费方的包里都要背一遍的解析器。
10
- *
11
- * 本文件是**纯字符串处理**:不引 `vue`、不引 `node:*`、零依赖 —— 所以浏览器与 Node 都能用
12
- * (读文件那半边在 `bin/icon-from-svg.mjs`)。
13
- *
14
- * 口径与「设计净稿规范」一致:只接收**单色**图形;渐变 / 滤镜 / 遮罩 / 多色一律**拒绝**
15
- * (那类属于产品专属图形,应留在消费方 assets,不进字形表)。
9
+ * 纯字符串处理:不引 `vue`、不引 `node:*`,浏览器与 Node 都能用(读文件在 `bin/icon-from-svg.mjs`)。
10
+ * 口径:只接收**单色**图形;渐变 / 滤镜 / 遮罩 / 多色一律拒绝(属产品专属图形,放应用侧 assets)。
16
11
  */
17
12
  /** 可绘制的元素 */
18
13
  const DRAWABLE = new Set(['path', 'rect', 'circle', 'ellipse', 'polygon', 'polyline', 'line']);
@@ -279,9 +274,7 @@ ${rows}
279
274
  /* ============================ 查重 ============================ */
280
275
  /**
281
276
  * 同一图形的两条条目(命令序列逐字相同 + 所有点位移一致 ⇒ 只是画板里挪了位置)。
282
- *
283
- * 设计稿常对多个菜单位复用同一图形(本仓 2026-10-09 就抓到过一处:`server` vs 已删的 `publish`),
284
- * 所以生成时要顺带报出来 —— 同形只留一条,另一处直接复用同名字形。
277
+ * 设计稿常对多个菜单位复用同一图形,生成时顺带报出来:同形只留一条,另一处复用同名字形。
285
278
  */
286
279
  export function findDuplicatePairs(entries) {
287
280
  // 只取路径 `d` 里的坐标:整串里的数字(如包装层的 `scale(1.5)`)会让点位错配,查重就失效了
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@manohub/icon",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "AIHub 图标包:内置 SVG 图标内容表 + 纯字符串渲染器 + <Icon> 组件。零运行时依赖(仅 peer vue),供任意 UI 栈消费",