mirror of
https://github.com/MoonshotAI/kimi-code.git
synced 2026-07-09 17:29:12 +00:00
refactor(web): replace hand-written icons with Remix Icon (#1293)
* refactor(web): replace hand-written icons with Remix Icon Generate a tree-shaken Remix Icon subset at build time via @iconify/utils + @iconify-json/ri, keeping the <Icon>/iconSvg() API. Add a chat-new icon for the new-chat buttons and reveal the workspace 'new chat in group' button on hover. Unify the message copy and undo buttons (matching hover style and tooltip, drop the undo hover label, align sizes). Switch the mobile switcher kebab to the horizontal dots icon and tweak sidebar search colors. Regenerate the design-system icon catalog. * fix(web): address PR review feedback Restore accessible names (aria-label) on the message copy and undo buttons. Keep the workspace add button reachable for keyboard users by revealing it on header focus-within. Update the nix pnpmDeps hash for the newly added icon dependencies. * fix(web): address follow-up review feedback Keep the workspace add/more buttons focusable without hover by revealing them via opacity instead of display:none, so keyboard and non-hover users can reach the control. Drop explicit .ts extensions in icon imports to satisfy oxlint, and read the design-system icon catalog directly from the generated icon data.
This commit is contained in:
parent
93ec6cb652
commit
6a469b3e07
16 changed files with 639 additions and 424 deletions
5
.changeset/refresh-web-icons.md
Normal file
5
.changeset/refresh-web-icons.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
"@moonshot-ai/kimi-code": patch
|
||||
---
|
||||
|
||||
Refresh the web UI icon set and unify the message copy and undo button hover states and tooltips.
|
||||
|
|
@ -1039,79 +1039,82 @@
|
|||
</table>
|
||||
|
||||
<h4 class="mini">图标 Icon</h4>
|
||||
<p>图标一律从集中注册表 <code>lib/icons.ts</code> 取用:模板中用 <code><Icon name size /></code> 组件(<code>components/ui/Icon.vue</code>),<code>v-html</code> 场景(如工具 glyph)用 <code>iconSvg(name, size)</code>。<b>禁止手写 <code><svg></code></b>——<code>scripts/check-style.mjs</code> 的 <code>icon-from-registry</code> 规则会对游离 SVG 告警。默认线稿风格:描边 1.5px、<code>stroke="currentColor"</code>、<code>stroke-linecap/linejoin: round</code>、无 fill,颜色跟随文字;尺寸走下方三档 token。少数「实心即语义」的图标(<code>play / stop / star</code>)为 fill 例外。</p>
|
||||
<p>图标一律从集中注册表 <code>lib/icons.ts</code> 取用:模板中用 <code><Icon name size /></code> 组件(<code>components/ui/Icon.vue</code>),<code>v-html</code> 场景(如工具 glyph)用 <code>iconSvg(name, size)</code>。<b>禁止手写 <code><svg></code></b>——<code>scripts/check-style.mjs</code> 的 <code>icon-from-registry</code> 规则会对游离 SVG 告警。图标来自 <a href="https://remixicon.com/">Remix Icon</a>(Apache-2.0),统一为 fill 风格(<code>fill="currentColor"</code>、24×24 源网格),颜色跟随文字;尺寸走下方三档 token。注册表由 <code>scripts/gen-icon-data.mjs</code> 从 <code>@iconify-json/ri</code> 按需生成,离线且 tree-shaken。</p>
|
||||
|
||||
<h4 class="mini">尺寸阶梯 Size scale</h4>
|
||||
<div class="icon-sizes">
|
||||
<div class="sz"><svg class="p-ic" style="width:14px;height:14px" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3v10M3 8h10"/></svg>sm · 14</div>
|
||||
<div class="sz"><svg class="p-ic" style="width:16px;height:16px" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3v10M3 8h10"/></svg>md · 16</div>
|
||||
<div class="sz"><svg class="p-ic" style="width:20px;height:20px" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3v10M3 8h10"/></svg>lg · 20</div>
|
||||
<div class="sz"><svg class="p-ic" style="width:14px;height:14px" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"/></svg>sm · 14</div>
|
||||
<div class="sz"><svg class="p-ic" style="width:16px;height:16px" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"/></svg>md · 16</div>
|
||||
<div class="sz"><svg class="p-ic" style="width:20px;height:20px" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"/></svg>lg · 20</div>
|
||||
</div>
|
||||
|
||||
<h4 class="mini">图标库 Icon library</h4>
|
||||
<p>当前注册的图标(按用途分组)。新增图标时,把图形以 <code>name → body</code> 加入 <code>lib/icons.ts</code>,按需补 <code>viewBox</code>(默认 16×16)/<code>fill</code>,再用 <code>node --experimental-strip-types scripts/gen-icon-catalog.mjs</code> 重新生成本目录,保证注册表与文档不漂移。</p>
|
||||
<p>当前注册的图标(按用途分组)。图标数据由 <code>scripts/gen-icon-data.mjs</code> 中的 <code>NAME_TO_REMIX</code> 映射决定,运行 <code>pnpm gen:icons</code> 生成 <code>lib/icon-data.ts</code>;本目录由 <code>node --experimental-strip-types scripts/gen-icon-catalog.mjs</code> 重新生成,保证注册表与文档不漂移。</p>
|
||||
<div class="icon-grid">
|
||||
<div class="icon-group-label">Actions</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3v10M3 8h10"/></svg><span class="ic-name">plus</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4l8 8M12 4l-8 8"/></svg><span class="ic-name">close</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 8.5l3.5 3.5L13 4.5"/></svg><span class="ic-name">check</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="7" cy="7" r="4.5"/><path d="m10.5 10.5 3 3"/></svg><span class="ic-name">search</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="9" height="9" rx="1.5"/><path d="M6 1h7a1 1 0 0 1 1 1v7"/></svg><span class="ic-name">copy</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6.5 9.5a3 3 0 0 0 4.2.3l2-2a3 3 0 0 0-4.2-4.2l-1 1"/><path d="M9.5 6.5a3 3 0 0 0-4.2-.3l-2 2a3 3 0 0 0 4.2 4.2l1-1"/></svg><span class="ic-name">link</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M9.5 2.5h4v4"/><path d="M13.5 2.5 7.5 8.5"/><path d="M12 8.7V12a1.5 1.5 0 0 1-1.5 1.5H4A1.5 1.5 0 0 1 2.5 12V5.5A1.5 1.5 0 0 1 4 4h3.3"/></svg><span class="ic-name">external-link</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 2v8"/><path d="M4.5 6.5 8 10l3.5-3.5"/><path d="M2.5 13.5h11"/></svg><span class="ic-name">download</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6.5 2.5 3 6l3.5 3.5"/><path d="M3 6h6.5a3.8 3.8 0 1 1 0 7.6H7.5"/></svg><span class="ic-name">undo</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3l6 5.5M8 3L2 8.5M8 3v10"/></svg><span class="ic-name">send</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="12" height="10" rx="1.5"/><circle cx="5" cy="6" r="1.2"/><path d="M2 10.5l3-2.5L8 11l2.5-2L14 11"/></svg><span class="ic-name">image</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l-.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09A1.65 1.65 0 0 0 15 4.6a1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09A1.65 1.65 0 0 0 19.4 15z"/></svg><span class="ic-name">settings</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><line x1="4" y1="8" x2="20" y2="8"/><circle cx="10" cy="8" r="2.5" fill="var(--color-bg)" stroke="none"/><line x1="4" y1="16" x2="20" y2="16"/><circle cx="15" cy="16" r="2.5" fill="var(--color-bg)" stroke="none"/></svg><span class="ic-name">sliders</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6 3h5a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2H6"/><path d="M9 8H2"/><path d="M5 5l3 3-3 3"/></svg><span class="ic-name">log-in</span></div>
|
||||
<div class="icon-group-label">Navigation & layout</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 6l4 4 4-4"/></svg><span class="ic-name">chevron-down</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6 4l4 4-4 4"/></svg><span class="ic-name">chevron-right</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 12V4M4 7l4-3 4 3"/></svg><span class="ic-name">arrow-up</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 4v8m0 0 3.5-3.5M8 12l-3.5-3.5"/></svg><span class="ic-name">arrow-down</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M2 8h10"/><path d="M8 4l4 4-4 4"/></svg><span class="ic-name">arrow-right</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 8h10"/></svg><span class="ic-name">minus</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M11 6h9"/><path d="M11 12h9"/><path d="M11 18h9"/><path d="M7 9l-3 3 3 3"/></svg><span class="ic-name">panel-collapse</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 6h9"/><path d="M4 12h9"/><path d="M4 18h9"/><path d="M17 9l3 3-3 3"/></svg><span class="ic-name">panel-expand</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M15 3h6v6"/><path d="M9 21H3v-6"/><path d="M21 3l-7 7"/><path d="M3 21l7-7"/></svg><span class="ic-name">expand</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 14h6v6"/><path d="M20 10h-6V4"/><path d="M14 10l7-7"/><path d="M3 21l7-7"/></svg><span class="ic-name">collapse</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M2 4h12M2 8h12M2 12h8"/></svg><span class="ic-name">list</span></div>
|
||||
<div class="icon-group-label">Files & tools</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M1 3.5V2.5A1 1 0 0 1 2 1.5h3.5l1.3 2h5.2a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1z"/><path d="M1 5.5h12"/></svg><span class="ic-name">folder</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="3.5" width="12" height="8.5" rx="1"/><path d="M1 5V3.5A1 1 0 0 1 2 2.5h3.5l1.3 2"/></svg><span class="ic-name">folder-closed</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M1 3.5V2.5A1 1 0 0 1 2 1.5h3.5l1.3 2h5.2a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1z"/><path d="M1 5.5h12"/><path d="M8 7.25v4.5M5.75 9.5h4.5"/></svg><span class="ic-name">folder-plus</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="currentColor"><path d="M1.5 3.5h3l1.5 2h7a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1v-8a1 1 0 0 1 1-1z"/></svg><span class="ic-name">folder-solid</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 1.5h5l3 3v10H4z"/><polyline points="9,1.5 9,4.5 12,4.5"/></svg><span class="ic-name">file</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2.5" y="1.5" width="9" height="13" rx="1"/><line x1="5" y1="5" x2="9" y2="5"/><line x1="5" y1="7.5" x2="11" y2="7.5"/><line x1="5" y1="10" x2="10" y2="10"/></svg><span class="ic-name">file-text</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12V4.5L8 2l5 2.5V12H3z"/><line x1="6" y1="7" x2="10" y2="7"/><line x1="8" y1="5" x2="8" y2="9"/></svg><span class="ic-name">file-plus</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 3h7l4 4v10H5V3z"/><path d="M12 3v4h4"/></svg><span class="ic-name">file-off</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="2" width="16" height="16" rx="2"/><path d="M7 10h6M10 7v6"/></svg><span class="ic-name">image-off</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="5.5,5 2.5,8 5.5,11"/><polyline points="10.5,5 13.5,8 10.5,11"/></svg><span class="ic-name">code</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="1.5" y="2.5" width="13" height="11" rx="1.5"/><polyline points="4,6 6.5,8 4,10"/><line x1="8" y1="10" x2="12" y2="10"/></svg><span class="ic-name">terminal</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M10.5 2.5l3 3-8 8H2.5v-3l8-8z"/><line x1="8.5" y1="4.5" x2="11.5" y2="7.5"/></svg><span class="ic-name">pencil</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 2.5C3.5 2.5 3.5 5 3.5 6.5S2.5 8 2.5 8s1 0 1 1.5S3.5 13.5 5 13.5"/><path d="M11 2.5c1.5 0 1.5 2.5 1.5 4S13.5 8 13.5 8s-1 0-1 1.5.5 4-1.5 4"/><line x1="8" y1="6" x2="8" y2="10"/><line x1="6.3" y1="6.8" x2="9.7" y2="9.2"/><line x1="9.7" y1="6.8" x2="6.3" y2="9.2"/></svg><span class="ic-name">glob</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="8" cy="8" r="6"/><path d="M8 2c-2 2-3 3.6-3 6s1 4 3 6"/><path d="M8 2c2 2 3 3.6 3 6s-1 4-3 6"/><line x1="2" y1="8" x2="14" y2="8"/></svg><span class="ic-name">globe</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="2,4.5 3.5,6 5.5,3"/><polyline points="2,11 3.5,12.5 5.5,9.5"/><line x1="8" y1="4.5" x2="14" y2="4.5"/><line x1="8" y1="11" x2="14" y2="11"/></svg><span class="ic-name">check-list</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8.5 1L3 9h4l-1.5 6 5.5-8h-4l1.5-6z"/></svg><span class="ic-name">bolt</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="5" cy="6" r="3"/><path d="M5 9v12"/><circle cx="19" cy="18" r="3"/><path d="m15 9-3-3 3-3"/><path d="M12 6h5a2 2 0 0 1 2 2v7"/></svg><span class="ic-name">git-pull-request</span></div>
|
||||
<div class="icon-group-label">Communication</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 2.5h8a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2H8.5l-2.5 2V11.5H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2z"/></svg><span class="ic-name">message</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M2 4l6 4 6-4"/><rect x="2" y="4" width="12" height="8" rx="1.5"/></svg><span class="ic-name">mail</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="8" cy="5" r="3"/><path d="M3 14c0-3 2.2-5 5-5s5 2 5 5"/></svg><span class="ic-name">user</span></div>
|
||||
<div class="icon-group-label">Status & media</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="6" cy="6" r="5"/><line x1="6" y1="3.5" x2="6" y2="6.5"/><circle cx="6" cy="8.5" r="0.5" fill="currentColor"/></svg><span class="ic-name">info</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="8" cy="8" r="6.5"/><path d="M6.2 6a1.8 1.8 0 0 1 3.5.6c0 1.2-1.7 1.4-1.7 2.6"/><circle cx="8" cy="11.5" r=".7" fill="currentColor"/></svg><span class="ic-name">help-circle</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 2 14 13H2L8 2Z"/><path d="M8 6v3"/><circle cx="8" cy="11" r=".6" fill="currentColor"/></svg><span class="ic-name">alert-triangle</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="8" cy="8" r="5.5"/><path d="M8 4.5V8l2.5 1.5"/></svg><span class="ic-name">clock</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 2l1.5 4.5L14 8l-4.5 1.5L8 14l-1.5-4.5L2 8l4.5-1.5z"/></svg><span class="ic-name">sparkles</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="currentColor"><path d="M5 3.5v9l7-4.5z"/></svg><span class="ic-name">play</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="currentColor"><rect x="3" y="3" width="10" height="10" rx="1.5"/></svg><span class="ic-name">stop</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg><span class="ic-name">star</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg><span class="ic-name">star-outline</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="currentColor"><circle cx="8" cy="3" r="1.3"/><circle cx="8" cy="8" r="1.3"/><circle cx="8" cy="13" r="1.3"/></svg><span class="ic-name">dots-vertical</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="currentColor"><circle cx="3" cy="8" r="1.3"/><circle cx="8" cy="8" r="1.3"/><circle cx="13" cy="8" r="1.3"/></svg><span class="ic-name">dots-horizontal</span></div>
|
||||
<div class="icon-group-label">Actions</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"/></svg><span class="ic-name">plus</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M14 3v2H4v13.385L5.763 17H20v-7h2v8a1 1 0 0 1-1 1H6.455L2 22.5V4a1 1 0 0 1 1-1zm5 0V0h2v3h3v2h-3v3h-2V5h-3V3z"/></svg><span class="ic-name">chat-new</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m12 10.587l4.95-4.95l1.414 1.414l-4.95 4.95l4.95 4.95l-1.415 1.414l-4.95-4.95l-4.949 4.95l-1.414-1.415l4.95-4.95l-4.95-4.95L7.05 5.638z"/></svg><span class="ic-name">close</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m10 15.17l9.192-9.191l1.414 1.414L10 17.999l-6.364-6.364l1.414-1.414z"/></svg><span class="ic-name">check</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m18.031 16.617l4.283 4.282l-1.415 1.415l-4.282-4.283A8.96 8.96 0 0 1 11 20c-4.968 0-9-4.032-9-9s4.032-9 9-9s9 4.032 9 9a8.96 8.96 0 0 1-1.969 5.617m-2.006-.742A6.98 6.98 0 0 0 18 11c0-3.867-3.133-7-7-7s-7 3.133-7 7s3.133 7 7 7a6.98 6.98 0 0 0 4.875-1.975z"/></svg><span class="ic-name">search</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M7 6V3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1h-3v3c0 .552-.45 1-1.007 1H4.007A1 1 0 0 1 3 21l.003-14c0-.552.45-1 1.006-1zM5.002 8L5 20h10V8zM9 6h8v10h2V4H9z"/></svg><span class="ic-name">copy</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m13.06 8.111l1.415 1.414a7 7 0 0 1 0 9.9l-.354.353a7 7 0 1 1-9.9-9.9l1.415 1.415a5 5 0 1 0 7.071 7.071l.354-.354a5 5 0 0 0 0-7.07l-1.415-1.415zm6.718 6.01l-1.414-1.414a5 5 0 0 0-7.071-7.07l-.354.353a5 5 0 0 0 0 7.07l1.415 1.415l-1.415 1.414l-1.414-1.414a7 7 0 0 1 0-9.9l.354-.353a7 7 0 1 1 9.9 9.9"/></svg><span class="ic-name">link</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M10 6v2H5v11h11v-5h2v6a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1zm11-3v8h-2V6.413l-7.793 7.794l-1.414-1.414L17.585 5H13V3z"/></svg><span class="ic-name">external-link</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M3 19h18v2H3zm10-5.828L19.071 7.1l1.414 1.414L12 17L3.515 8.515L4.929 7.1L11 13.173V2h2z"/></svg><span class="ic-name">download</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m5.828 7l2.536 2.535L6.95 10.95L2 6l4.95-4.95l1.414 1.415L5.828 5H13a8 8 0 1 1 0 16H4v-2h9a6 6 0 0 0 0-12z"/></svg><span class="ic-name">undo</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m21.727 2.957l-5.454 19.086c-.15.529-.475.553-.717.07L11 13L1.923 9.37c-.51-.205-.503-.51.034-.689L21.043 2.32c.529-.176.832.12.684.638m-2.692 2.14L6.812 9.17l5.637 2.255l3.04 6.08z"/></svg><span class="ic-name">send</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M2.992 21A.993.993 0 0 1 2 20.007V3.993A1 1 0 0 1 2.992 3h18.016c.548 0 .992.445.992.993v16.014a1 1 0 0 1-.992.993zM20 15V5H4v14L14 9zm0 2.828l-6-6L6.828 19H20zM8 11a2 2 0 1 1 0-4a2 2 0 0 1 0 4"/></svg><span class="ic-name">image</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M3.34 17a10 10 0 0 1-.979-2.326a3 3 0 0 0 .003-5.347a10 10 0 0 1 2.5-4.337a3 3 0 0 0 4.632-2.674a10 10 0 0 1 5.007.003a3 3 0 0 0 4.632 2.671a10.06 10.06 0 0 1 2.503 4.336a3 3 0 0 0-.002 5.347a10 10 0 0 1-2.501 4.337a3 3 0 0 0-4.632 2.674a10 10 0 0 1-5.007-.002a3 3 0 0 0-4.631-2.672A10 10 0 0 1 3.339 17m5.66.196a5 5 0 0 1 2.25 2.77q.75.07 1.499.002a5 5 0 0 1 2.25-2.772a5 5 0 0 1 3.526-.564q.435-.614.748-1.298A5 5 0 0 1 18 12c0-1.26.47-2.437 1.273-3.334a8 8 0 0 0-.75-1.298A5 5 0 0 1 15 6.804a5 5 0 0 1-2.25-2.77q-.75-.071-1.5-.001A5 5 0 0 1 9 6.804a5 5 0 0 1-3.526.564q-.436.614-.747 1.298A5 5 0 0 1 6 12c0 1.26-.471 2.437-1.273 3.334a8 8 0 0 0 .75 1.298A5 5 0 0 1 9 17.196M12 15a3 3 0 1 1 0-6a3 3 0 0 1 0 6m0-2a1 1 0 1 0 0-2a1 1 0 0 0 0 2"/></svg><span class="ic-name">settings</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M6.17 18a3.001 3.001 0 0 1 5.66 0H22v2H11.83a3.001 3.001 0 0 1-5.66 0H2v-2zm6-7a3.001 3.001 0 0 1 5.66 0H22v2h-4.17a3.001 3.001 0 0 1-5.66 0H2v-2zm-6-7a3.001 3.001 0 0 1 5.66 0H22v2H11.83a3.001 3.001 0 0 1-5.66 0H2V4zM9 6a1 1 0 1 0 0-2a1 1 0 0 0 0 2m6 7a1 1 0 1 0 0-2a1 1 0 0 0 0 2m-6 7a1 1 0 1 0 0-2a1 1 0 0 0 0 2"/></svg><span class="ic-name">sliders</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M4 15h2v5h12V4H6v5H4V3a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1zm6-4V8l5 4l-5 4v-3H2v-2z"/></svg><span class="ic-name">log-in</span></div>
|
||||
<div class="icon-group-label">Navigation & layout</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m12 13.171l4.95-4.95l1.414 1.415L12 16L5.636 9.636L7.05 8.222z"/></svg><span class="ic-name">chevron-down</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m13.172 12l-4.95-4.95l1.414-1.413L16 12l-6.364 6.364l-1.414-1.415z"/></svg><span class="ic-name">chevron-right</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M13 7.828V20h-2V7.828l-5.364 5.364l-1.414-1.414L12 4l7.778 7.778l-1.414 1.414z"/></svg><span class="ic-name">arrow-up</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m13 16.172l5.364-5.364l1.414 1.414L12 20l-7.778-7.778l1.414-1.414L11 16.172V4h2z"/></svg><span class="ic-name">arrow-down</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m16.172 11l-5.364-5.364l1.414-1.414L20 12l-7.778 7.778l-1.414-1.414L16.172 13H4v-2z"/></svg><span class="ic-name">arrow-right</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M5 11v2h14v-2z"/></svg><span class="ic-name">minus</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m15.071 4.929l1.414 1.414L11.83 11H21v2h-9.17l4.656 4.657l-1.414 1.414L8.001 12zm-11.07 14.07V5h2v14z"/></svg><span class="ic-name">panel-collapse</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m17.172 11l-4.657-4.657l1.414-1.414L21 12l-7.071 7.071l-1.414-1.414L17.172 13H8v-2zM4 19V5h2v14z"/></svg><span class="ic-name">panel-expand</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M17.586 5H14V3h7v7h-2V6.414l-4.293 4.293l-1.414-1.414zM3 14h2v3.586l4.293-4.293l1.414 1.414L6.414 19H10v2H3z"/></svg><span class="ic-name">expand</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M15 4h-2v7h7V9h-3.586l4.293-4.293l-1.414-1.414L15 7.586zM4 15h3.586l-4.293 4.293l1.414 1.414L9 16.414V20h2v-7H4z"/></svg><span class="ic-name">collapse</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M8 4h13v2H8zM4.5 6.5a1.5 1.5 0 1 1 0-3a1.5 1.5 0 0 1 0 3m0 7a1.5 1.5 0 1 1 0-3a1.5 1.5 0 0 1 0 3m0 6.9a1.5 1.5 0 1 1 0-3a1.5 1.5 0 0 1 0 3M8 11h13v2H8zm0 7h13v2H8z"/></svg><span class="ic-name">list</span></div>
|
||||
<div class="icon-group-label">Files & tools</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M3 21a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7.414l2 2H20a1 1 0 0 1 1 1v3h-2V7h-7.414l-2-2H4v11.998L5.5 11h17l-2.31 9.243a1 1 0 0 1-.97.757zm16.938-8H7.062l-1.5 6h12.876z"/></svg><span class="ic-name">folder</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M4 5v14h16V7h-8.414l-2-2zm8.414 0H21a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7.414z"/></svg><span class="ic-name">folder-closed</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M12.414 5H21a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7.414zM4 5v14h16V7h-8.414l-2-2zm7 7V9h2v3h3v2h-3v3h-2v-3H8v-2z"/></svg><span class="ic-name">folder-plus</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M12.414 5H21a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7.414z"/></svg><span class="ic-name">folder-solid</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M9 2.003V2h10.998C20.55 2 21 2.455 21 2.992v18.016a.993.993 0 0 1-.993.992H3.993A1 1 0 0 1 3 20.993V8zM5.83 8H9V4.83zM11 4v5a1 1 0 0 1-1 1H5v10h14V4z"/></svg><span class="ic-name">file</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M21 8v12.993A1 1 0 0 1 20.007 22H3.993A.993.993 0 0 1 3 21.008V2.992C3 2.455 3.449 2 4.002 2h10.995zm-2 1h-5V4H5v16h14zM8 7h3v2H8zm0 4h8v2H8zm0 4h8v2H8z"/></svg><span class="ic-name">file-text</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M15 4H5v16h14V8h-4zM3 2.992C3 2.444 3.447 2 3.999 2H16l5 5v13.993A1 1 0 0 1 20.007 22H3.993A1 1 0 0 1 3 21.008zM11 11V8h2v3h3v2h-3v3h-2v-3H8v-2z"/></svg><span class="ic-name">file-plus</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M9 2.003V2h10.998C20.55 2 21 2.455 21 2.992v18.016a.993.993 0 0 1-.993.992H3.993A1 1 0 0 1 3 20.993V8zM5.83 8H9V4.83zM11 4v5a1 1 0 0 1-1 1H5v10h14V4z"/></svg><span class="ic-name">file-off</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M2.992 21A.993.993 0 0 1 2 20.007V3.993A1 1 0 0 1 2.992 3h18.016c.548 0 .992.445.992.993v16.014a1 1 0 0 1-.992.993zM20 15V5H4v14L14 9zm0 2.828l-6-6L6.828 19H20zM8 11a2 2 0 1 1 0-4a2 2 0 0 1 0 4"/></svg><span class="ic-name">image-off</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m23 12l-7.071 7.071l-1.414-1.414L20.172 12l-5.657-5.657l1.414-1.414zM3.828 12l5.657 5.657l-1.414 1.414L1 12l7.071-7.071l1.414 1.414z"/></svg><span class="ic-name">code</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M3 3h18a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1m1 2v14h16V5zm8 10h6v2h-6zm-3.333-3L5.838 9.172l1.415-1.415L11.495 12l-4.242 4.243l-1.415-1.415z"/></svg><span class="ic-name">terminal</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m15.728 9.576l-1.414-1.414L5 17.476v1.414h1.414zm1.414-1.414l1.414-1.414l-1.414-1.414l-1.414 1.414zm-9.9 12.728H3v-4.243L16.435 3.212a1 1 0 0 1 1.414 0l2.829 2.829a1 1 0 0 1 0 1.414z"/></svg><span class="ic-name">pencil</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M4 18v-3.7a1.5 1.5 0 0 0-1.5-1.5H2v-1.6h.5A1.5 1.5 0 0 0 4 9.7V6a3 3 0 0 1 3-3h1v2H7a1 1 0 0 0-1 1v4.1A2 2 0 0 1 4.626 12A2 2 0 0 1 6 13.9V18a1 1 0 0 0 1 1h1v2H7a3 3 0 0 1-3-3m16-3.7V18a3 3 0 0 1-3 3h-1v-2h1a1 1 0 0 0 1-1v-4.1a2 2 0 0 1 1.374-1.9A2 2 0 0 1 18 10.1V6a1 1 0 0 0-1-1h-1V3h1a3 3 0 0 1 3 3v3.7a1.5 1.5 0 0 0 1.5 1.5h.5v1.6h-.5a1.5 1.5 0 0 0-1.5 1.5"/></svg><span class="ic-name">glob</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10s-4.477 10-10 10m-2.29-2.333A17.9 17.9 0 0 1 8.027 13H4.062a8.01 8.01 0 0 0 5.648 6.667M10.03 13c.151 2.439.848 4.73 1.97 6.752A15.9 15.9 0 0 0 13.97 13zm9.908 0h-3.965a17.9 17.9 0 0 1-1.683 6.667A8.01 8.01 0 0 0 19.938 13M4.062 11h3.965A17.9 17.9 0 0 1 9.71 4.333A8.01 8.01 0 0 0 4.062 11m5.969 0h3.938A15.9 15.9 0 0 0 12 4.248A15.9 15.9 0 0 0 10.03 11m4.259-6.667A17.9 17.9 0 0 1 15.973 11h3.965a8.01 8.01 0 0 0-5.648-6.667"/></svg><span class="ic-name">globe</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M8 4h13v2H8zm-5-.5h3v3H3zm0 7h3v3H3zm0 7h3v3H3zM8 11h13v2H8zm0 7h13v2H8z"/></svg><span class="ic-name">check-list</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M13 9h8L11 24v-9H4l9-15zm-2 2V7.22L7.532 13H13v4.394L17.263 11z"/></svg><span class="ic-name">bolt</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M15 5h2a2 2 0 0 1 2 2v8.17a3.001 3.001 0 1 1-2 0V7h-2v3l-4.5-4L15 2zM5 8.83a3.001 3.001 0 1 1 2 0v6.34a3.001 3.001 0 1 1-2 0zM6 7a1 1 0 1 0 0-2a1 1 0 0 0 0 2m0 12a1 1 0 1 0 0-2a1 1 0 0 0 0 2m12 0a1 1 0 1 0 0-2a1 1 0 0 0 0 2"/></svg><span class="ic-name">git-pull-request</span></div>
|
||||
<div class="icon-group-label">Communication</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M6.455 19L2 22.5V4a1 1 0 0 1 1-1h18a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1zm-.692-2H20V5H4v13.385zM8 10h8v2H8z"/></svg><span class="ic-name">message</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M3 3h18a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1m17 4.238l-7.928 7.1L4 7.216V19h16zM4.511 5l7.55 6.662L19.502 5z"/></svg><span class="ic-name">mail</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M4 22a8 8 0 1 1 16 0h-2a6 6 0 0 0-12 0zm8-9c-3.315 0-6-2.685-6-6s2.685-6 6-6s6 2.685 6 6s-2.685 6-6 6m0-2c2.21 0 4-1.79 4-4s-1.79-4-4-4s-4 1.79-4 4s1.79 4 4 4"/></svg><span class="ic-name">user</span></div>
|
||||
<div class="icon-group-label">Status & media</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10s-4.477 10-10 10m0-2a8 8 0 1 0 0-16a8 8 0 0 0 0 16M11 7h2v2h-2zm0 4h2v6h-2z"/></svg><span class="ic-name">info</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10s-4.477 10-10 10m0-2a8 8 0 1 0 0-16a8 8 0 0 0 0 16m-1-5h2v2h-2zm2-1.645V14h-2v-1.5a1 1 0 0 1 1-1a1.5 1.5 0 1 0-1.471-1.794l-1.962-.393A3.501 3.501 0 1 1 13 13.355"/></svg><span class="ic-name">help-circle</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m12.866 3l9.526 16.5a1 1 0 0 1-.866 1.5H2.474a1 1 0 0 1-.866-1.5L11.134 3a1 1 0 0 1 1.732 0m-8.66 16h15.588L12 5.5zM11 16h2v2h-2zm0-7h2v5h-2z"/></svg><span class="ic-name">alert-triangle</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10s-4.477 10-10 10m0-2a8 8 0 1 0 0-16a8 8 0 0 0 0 16m1-8h4v2h-6V7h2z"/></svg><span class="ic-name">clock</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M14 4.438A2.437 2.437 0 0 0 16.438 2h1.125A2.437 2.437 0 0 0 20 4.438v1.125A2.437 2.437 0 0 0 17.563 8h-1.125A2.437 2.437 0 0 0 14 5.563zM1 11a6 6 0 0 0 6-6h2a6 6 0 0 0 6 6v2a6 6 0 0 0-6 6H7a6 6 0 0 0-6-6zm3.876 1A8.04 8.04 0 0 1 8 15.124A8.04 8.04 0 0 1 11.124 12A8.04 8.04 0 0 1 8 8.876A8.04 8.04 0 0 1 4.876 12m12.374 2A3.25 3.25 0 0 1 14 17.25v1.5A3.25 3.25 0 0 1 17.25 22h1.5A3.25 3.25 0 0 1 22 18.75v-1.5A3.25 3.25 0 0 1 18.75 14z"/></svg><span class="ic-name">sparkles</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M19.376 12.416L8.777 19.482A.5.5 0 0 1 8 19.066V4.934a.5.5 0 0 1 .777-.416l10.599 7.066a.5.5 0 0 1 0 .832"/></svg><span class="ic-name">play</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M6 5h12a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1"/></svg><span class="ic-name">stop</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m12 18.26l-7.053 3.948l1.575-7.928L.588 8.792l8.027-.952L12 .5l3.385 7.34l8.027.952l-5.934 5.488l1.575 7.928z"/></svg><span class="ic-name">star</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m12 18.26l-7.053 3.948l1.575-7.928L.588 8.792l8.027-.952L12 .5l3.385 7.34l8.027.952l-5.934 5.488l1.575 7.928zm0-2.292l4.247 2.377l-.948-4.773l3.573-3.305l-4.833-.573l-2.038-4.419l-2.039 4.42l-4.833.572l3.573 3.305l-.948 4.773z"/></svg><span class="ic-name">star-outline</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M4.5 10.5c-.825 0-1.5.675-1.5 1.5s.675 1.5 1.5 1.5S6 12.825 6 12s-.675-1.5-1.5-1.5m15 0c-.825 0-1.5.675-1.5 1.5s.675 1.5 1.5 1.5S21 12.825 21 12s-.675-1.5-1.5-1.5m-7.5 0c-.825 0-1.5.675-1.5 1.5s.675 1.5 1.5 1.5s1.5-.675 1.5-1.5s-.675-1.5-1.5-1.5"/></svg><span class="ic-name">dots-horizontal</span></div>
|
||||
<div class="icon-group-label">Other</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M20 4v12h3l-4 5l-4-5h3V4zm-8 14v2H3v-2zm2-7v2H3v-2zm0-7v2H3V4z"/></svg><span class="ic-name">sort</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M8.5 7a1.5 1.5 0 1 0 0-3a1.5 1.5 0 0 0 0 3m0 6.5a1.5 1.5 0 1 0 0-3a1.5 1.5 0 0 0 0 3m1.5 5a1.5 1.5 0 1 1-3 0a1.5 1.5 0 0 1 3 0M15.5 7a1.5 1.5 0 1 0 0-3a1.5 1.5 0 0 0 0 3m1.5 5a1.5 1.5 0 1 1-3 0a1.5 1.5 0 0 1 3 0m-1.5 8a1.5 1.5 0 1 0 0-3a1.5 1.5 0 0 0 0 3"/></svg><span class="ic-name">grip</span></div>
|
||||
</div>
|
||||
|
||||
<p>禁止用 emoji 充当功能图标(唯一例外:月相 🌑…🌘,仅用于「等待 Agent 响应」聊天态)。Kimi 品牌标记(32×22 的眼睛 logo)属于品牌资产,不在此线稿图标体系内。</p>
|
||||
|
|
|
|||
|
|
@ -10,11 +10,15 @@
|
|||
"build": "vite build",
|
||||
"typecheck": "vue-tsc --noEmit",
|
||||
"test": "vitest run",
|
||||
"check:style": "node scripts/check-style.mjs"
|
||||
"check:style": "node scripts/check-style.mjs",
|
||||
"gen:icons": "node scripts/gen-icon-data.mjs"
|
||||
},
|
||||
"dependencies": {
|
||||
"@fontsource-variable/inter": "^5.2.8",
|
||||
"@fontsource-variable/jetbrains-mono": "^5.2.8",
|
||||
"@iconify-json/ri": "^1.2.10",
|
||||
"@iconify/utils": "^3.1.3",
|
||||
"@iconify/vue": "^5.0.1",
|
||||
"@xterm/addon-fit": "^0.11.0",
|
||||
"@xterm/xterm": "^6.0.0",
|
||||
"katex": "^0.17.0",
|
||||
|
|
|
|||
|
|
@ -1038,79 +1038,82 @@
|
|||
</table>
|
||||
|
||||
<h4 class="mini">图标 Icon</h4>
|
||||
<p>图标一律从集中注册表 <code>lib/icons.ts</code> 取用:模板中用 <code><Icon name size /></code> 组件(<code>components/ui/Icon.vue</code>),<code>v-html</code> 场景(如工具 glyph)用 <code>iconSvg(name, size)</code>。<b>禁止手写 <code><svg></code></b>——<code>scripts/check-style.mjs</code> 的 <code>icon-from-registry</code> 规则会对游离 SVG 告警。默认线稿风格:描边 1.5px、<code>stroke="currentColor"</code>、<code>stroke-linecap/linejoin: round</code>、无 fill,颜色跟随文字;尺寸走下方三档 token。少数「实心即语义」的图标(<code>play / stop / star</code>)为 fill 例外。</p>
|
||||
<p>图标一律从集中注册表 <code>lib/icons.ts</code> 取用:模板中用 <code><Icon name size /></code> 组件(<code>components/ui/Icon.vue</code>),<code>v-html</code> 场景(如工具 glyph)用 <code>iconSvg(name, size)</code>。<b>禁止手写 <code><svg></code></b>——<code>scripts/check-style.mjs</code> 的 <code>icon-from-registry</code> 规则会对游离 SVG 告警。图标来自 <a href="https://remixicon.com/">Remix Icon</a>(Apache-2.0),统一为 fill 风格(<code>fill="currentColor"</code>、24×24 源网格),颜色跟随文字;尺寸走下方三档 token。注册表由 <code>scripts/gen-icon-data.mjs</code> 从 <code>@iconify-json/ri</code> 按需生成,离线且 tree-shaken。</p>
|
||||
|
||||
<h4 class="mini">尺寸阶梯 Size scale</h4>
|
||||
<div class="icon-sizes">
|
||||
<div class="sz"><svg class="p-ic" style="width:14px;height:14px" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3v10M3 8h10"/></svg>sm · 14</div>
|
||||
<div class="sz"><svg class="p-ic" style="width:16px;height:16px" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3v10M3 8h10"/></svg>md · 16</div>
|
||||
<div class="sz"><svg class="p-ic" style="width:20px;height:20px" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3v10M3 8h10"/></svg>lg · 20</div>
|
||||
<div class="sz"><svg class="p-ic" style="width:14px;height:14px" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"/></svg>sm · 14</div>
|
||||
<div class="sz"><svg class="p-ic" style="width:16px;height:16px" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"/></svg>md · 16</div>
|
||||
<div class="sz"><svg class="p-ic" style="width:20px;height:20px" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"/></svg>lg · 20</div>
|
||||
</div>
|
||||
|
||||
<h4 class="mini">图标库 Icon library</h4>
|
||||
<p>当前注册的图标(按用途分组)。新增图标时,把图形以 <code>name → body</code> 加入 <code>lib/icons.ts</code>,按需补 <code>viewBox</code>(默认 16×16)/<code>fill</code>,再用 <code>node --experimental-strip-types scripts/gen-icon-catalog.mjs</code> 重新生成本目录,保证注册表与文档不漂移。</p>
|
||||
<p>当前注册的图标(按用途分组)。图标数据由 <code>scripts/gen-icon-data.mjs</code> 中的 <code>NAME_TO_REMIX</code> 映射决定,运行 <code>pnpm gen:icons</code> 生成 <code>lib/icon-data.ts</code>;本目录由 <code>node --experimental-strip-types scripts/gen-icon-catalog.mjs</code> 重新生成,保证注册表与文档不漂移。</p>
|
||||
<div class="icon-grid">
|
||||
<div class="icon-group-label">Actions</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3v10M3 8h10"/></svg><span class="ic-name">plus</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4l8 8M12 4l-8 8"/></svg><span class="ic-name">close</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 8.5l3.5 3.5L13 4.5"/></svg><span class="ic-name">check</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="7" cy="7" r="4.5"/><path d="m10.5 10.5 3 3"/></svg><span class="ic-name">search</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="9" height="9" rx="1.5"/><path d="M6 1h7a1 1 0 0 1 1 1v7"/></svg><span class="ic-name">copy</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6.5 9.5a3 3 0 0 0 4.2.3l2-2a3 3 0 0 0-4.2-4.2l-1 1"/><path d="M9.5 6.5a3 3 0 0 0-4.2-.3l-2 2a3 3 0 0 0 4.2 4.2l1-1"/></svg><span class="ic-name">link</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M9.5 2.5h4v4"/><path d="M13.5 2.5 7.5 8.5"/><path d="M12 8.7V12a1.5 1.5 0 0 1-1.5 1.5H4A1.5 1.5 0 0 1 2.5 12V5.5A1.5 1.5 0 0 1 4 4h3.3"/></svg><span class="ic-name">external-link</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 2v8"/><path d="M4.5 6.5 8 10l3.5-3.5"/><path d="M2.5 13.5h11"/></svg><span class="ic-name">download</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6.5 2.5 3 6l3.5 3.5"/><path d="M3 6h6.5a3.8 3.8 0 1 1 0 7.6H7.5"/></svg><span class="ic-name">undo</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3l6 5.5M8 3L2 8.5M8 3v10"/></svg><span class="ic-name">send</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="12" height="10" rx="1.5"/><circle cx="5" cy="6" r="1.2"/><path d="M2 10.5l3-2.5L8 11l2.5-2L14 11"/></svg><span class="ic-name">image</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l-.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09A1.65 1.65 0 0 0 15 4.6a1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09A1.65 1.65 0 0 0 19.4 15z"/></svg><span class="ic-name">settings</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><line x1="4" y1="8" x2="20" y2="8"/><circle cx="10" cy="8" r="2.5" fill="var(--color-bg)" stroke="none"/><line x1="4" y1="16" x2="20" y2="16"/><circle cx="15" cy="16" r="2.5" fill="var(--color-bg)" stroke="none"/></svg><span class="ic-name">sliders</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6 3h5a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2H6"/><path d="M9 8H2"/><path d="M5 5l3 3-3 3"/></svg><span class="ic-name">log-in</span></div>
|
||||
<div class="icon-group-label">Navigation & layout</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 6l4 4 4-4"/></svg><span class="ic-name">chevron-down</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6 4l4 4-4 4"/></svg><span class="ic-name">chevron-right</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 12V4M4 7l4-3 4 3"/></svg><span class="ic-name">arrow-up</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 4v8m0 0 3.5-3.5M8 12l-3.5-3.5"/></svg><span class="ic-name">arrow-down</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M2 8h10"/><path d="M8 4l4 4-4 4"/></svg><span class="ic-name">arrow-right</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 8h10"/></svg><span class="ic-name">minus</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M11 6h9"/><path d="M11 12h9"/><path d="M11 18h9"/><path d="M7 9l-3 3 3 3"/></svg><span class="ic-name">panel-collapse</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 6h9"/><path d="M4 12h9"/><path d="M4 18h9"/><path d="M17 9l3 3-3 3"/></svg><span class="ic-name">panel-expand</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M15 3h6v6"/><path d="M9 21H3v-6"/><path d="M21 3l-7 7"/><path d="M3 21l7-7"/></svg><span class="ic-name">expand</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 14h6v6"/><path d="M20 10h-6V4"/><path d="M14 10l7-7"/><path d="M3 21l7-7"/></svg><span class="ic-name">collapse</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M2 4h12M2 8h12M2 12h8"/></svg><span class="ic-name">list</span></div>
|
||||
<div class="icon-group-label">Files & tools</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M1 3.5V2.5A1 1 0 0 1 2 1.5h3.5l1.3 2h5.2a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1z"/><path d="M1 5.5h12"/></svg><span class="ic-name">folder</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="3.5" width="12" height="8.5" rx="1"/><path d="M1 5V3.5A1 1 0 0 1 2 2.5h3.5l1.3 2"/></svg><span class="ic-name">folder-closed</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M1 3.5V2.5A1 1 0 0 1 2 1.5h3.5l1.3 2h5.2a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1z"/><path d="M1 5.5h12"/><path d="M8 7.25v4.5M5.75 9.5h4.5"/></svg><span class="ic-name">folder-plus</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="currentColor"><path d="M1.5 3.5h3l1.5 2h7a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1v-8a1 1 0 0 1 1-1z"/></svg><span class="ic-name">folder-solid</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 1.5h5l3 3v10H4z"/><polyline points="9,1.5 9,4.5 12,4.5"/></svg><span class="ic-name">file</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2.5" y="1.5" width="9" height="13" rx="1"/><line x1="5" y1="5" x2="9" y2="5"/><line x1="5" y1="7.5" x2="11" y2="7.5"/><line x1="5" y1="10" x2="10" y2="10"/></svg><span class="ic-name">file-text</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12V4.5L8 2l5 2.5V12H3z"/><line x1="6" y1="7" x2="10" y2="7"/><line x1="8" y1="5" x2="8" y2="9"/></svg><span class="ic-name">file-plus</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 3h7l4 4v10H5V3z"/><path d="M12 3v4h4"/></svg><span class="ic-name">file-off</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="2" width="16" height="16" rx="2"/><path d="M7 10h6M10 7v6"/></svg><span class="ic-name">image-off</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="5.5,5 2.5,8 5.5,11"/><polyline points="10.5,5 13.5,8 10.5,11"/></svg><span class="ic-name">code</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="1.5" y="2.5" width="13" height="11" rx="1.5"/><polyline points="4,6 6.5,8 4,10"/><line x1="8" y1="10" x2="12" y2="10"/></svg><span class="ic-name">terminal</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M10.5 2.5l3 3-8 8H2.5v-3l8-8z"/><line x1="8.5" y1="4.5" x2="11.5" y2="7.5"/></svg><span class="ic-name">pencil</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 2.5C3.5 2.5 3.5 5 3.5 6.5S2.5 8 2.5 8s1 0 1 1.5S3.5 13.5 5 13.5"/><path d="M11 2.5c1.5 0 1.5 2.5 1.5 4S13.5 8 13.5 8s-1 0-1 1.5.5 4-1.5 4"/><line x1="8" y1="6" x2="8" y2="10"/><line x1="6.3" y1="6.8" x2="9.7" y2="9.2"/><line x1="9.7" y1="6.8" x2="6.3" y2="9.2"/></svg><span class="ic-name">glob</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="8" cy="8" r="6"/><path d="M8 2c-2 2-3 3.6-3 6s1 4 3 6"/><path d="M8 2c2 2 3 3.6 3 6s-1 4-3 6"/><line x1="2" y1="8" x2="14" y2="8"/></svg><span class="ic-name">globe</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="2,4.5 3.5,6 5.5,3"/><polyline points="2,11 3.5,12.5 5.5,9.5"/><line x1="8" y1="4.5" x2="14" y2="4.5"/><line x1="8" y1="11" x2="14" y2="11"/></svg><span class="ic-name">check-list</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8.5 1L3 9h4l-1.5 6 5.5-8h-4l1.5-6z"/></svg><span class="ic-name">bolt</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="5" cy="6" r="3"/><path d="M5 9v12"/><circle cx="19" cy="18" r="3"/><path d="m15 9-3-3 3-3"/><path d="M12 6h5a2 2 0 0 1 2 2v7"/></svg><span class="ic-name">git-pull-request</span></div>
|
||||
<div class="icon-group-label">Communication</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 2.5h8a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2H8.5l-2.5 2V11.5H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2z"/></svg><span class="ic-name">message</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M2 4l6 4 6-4"/><rect x="2" y="4" width="12" height="8" rx="1.5"/></svg><span class="ic-name">mail</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="8" cy="5" r="3"/><path d="M3 14c0-3 2.2-5 5-5s5 2 5 5"/></svg><span class="ic-name">user</span></div>
|
||||
<div class="icon-group-label">Status & media</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="6" cy="6" r="5"/><line x1="6" y1="3.5" x2="6" y2="6.5"/><circle cx="6" cy="8.5" r="0.5" fill="currentColor"/></svg><span class="ic-name">info</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="8" cy="8" r="6.5"/><path d="M6.2 6a1.8 1.8 0 0 1 3.5.6c0 1.2-1.7 1.4-1.7 2.6"/><circle cx="8" cy="11.5" r=".7" fill="currentColor"/></svg><span class="ic-name">help-circle</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 2 14 13H2L8 2Z"/><path d="M8 6v3"/><circle cx="8" cy="11" r=".6" fill="currentColor"/></svg><span class="ic-name">alert-triangle</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="8" cy="8" r="5.5"/><path d="M8 4.5V8l2.5 1.5"/></svg><span class="ic-name">clock</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 2l1.5 4.5L14 8l-4.5 1.5L8 14l-1.5-4.5L2 8l4.5-1.5z"/></svg><span class="ic-name">sparkles</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="currentColor"><path d="M5 3.5v9l7-4.5z"/></svg><span class="ic-name">play</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="currentColor"><rect x="3" y="3" width="10" height="10" rx="1.5"/></svg><span class="ic-name">stop</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg><span class="ic-name">star</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg><span class="ic-name">star-outline</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="currentColor"><circle cx="8" cy="3" r="1.3"/><circle cx="8" cy="8" r="1.3"/><circle cx="8" cy="13" r="1.3"/></svg><span class="ic-name">dots-vertical</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 16 16" fill="currentColor"><circle cx="3" cy="8" r="1.3"/><circle cx="8" cy="8" r="1.3"/><circle cx="13" cy="8" r="1.3"/></svg><span class="ic-name">dots-horizontal</span></div>
|
||||
<div class="icon-group-label">Actions</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"/></svg><span class="ic-name">plus</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M14 3v2H4v13.385L5.763 17H20v-7h2v8a1 1 0 0 1-1 1H6.455L2 22.5V4a1 1 0 0 1 1-1zm5 0V0h2v3h3v2h-3v3h-2V5h-3V3z"/></svg><span class="ic-name">chat-new</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m12 10.587l4.95-4.95l1.414 1.414l-4.95 4.95l4.95 4.95l-1.415 1.414l-4.95-4.95l-4.949 4.95l-1.414-1.415l4.95-4.95l-4.95-4.95L7.05 5.638z"/></svg><span class="ic-name">close</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m10 15.17l9.192-9.191l1.414 1.414L10 17.999l-6.364-6.364l1.414-1.414z"/></svg><span class="ic-name">check</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m18.031 16.617l4.283 4.282l-1.415 1.415l-4.282-4.283A8.96 8.96 0 0 1 11 20c-4.968 0-9-4.032-9-9s4.032-9 9-9s9 4.032 9 9a8.96 8.96 0 0 1-1.969 5.617m-2.006-.742A6.98 6.98 0 0 0 18 11c0-3.867-3.133-7-7-7s-7 3.133-7 7s3.133 7 7 7a6.98 6.98 0 0 0 4.875-1.975z"/></svg><span class="ic-name">search</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M7 6V3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1h-3v3c0 .552-.45 1-1.007 1H4.007A1 1 0 0 1 3 21l.003-14c0-.552.45-1 1.006-1zM5.002 8L5 20h10V8zM9 6h8v10h2V4H9z"/></svg><span class="ic-name">copy</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m13.06 8.111l1.415 1.414a7 7 0 0 1 0 9.9l-.354.353a7 7 0 1 1-9.9-9.9l1.415 1.415a5 5 0 1 0 7.071 7.071l.354-.354a5 5 0 0 0 0-7.07l-1.415-1.415zm6.718 6.01l-1.414-1.414a5 5 0 0 0-7.071-7.07l-.354.353a5 5 0 0 0 0 7.07l1.415 1.415l-1.415 1.414l-1.414-1.414a7 7 0 0 1 0-9.9l.354-.353a7 7 0 1 1 9.9 9.9"/></svg><span class="ic-name">link</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M10 6v2H5v11h11v-5h2v6a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1zm11-3v8h-2V6.413l-7.793 7.794l-1.414-1.414L17.585 5H13V3z"/></svg><span class="ic-name">external-link</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M3 19h18v2H3zm10-5.828L19.071 7.1l1.414 1.414L12 17L3.515 8.515L4.929 7.1L11 13.173V2h2z"/></svg><span class="ic-name">download</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m5.828 7l2.536 2.535L6.95 10.95L2 6l4.95-4.95l1.414 1.415L5.828 5H13a8 8 0 1 1 0 16H4v-2h9a6 6 0 0 0 0-12z"/></svg><span class="ic-name">undo</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m21.727 2.957l-5.454 19.086c-.15.529-.475.553-.717.07L11 13L1.923 9.37c-.51-.205-.503-.51.034-.689L21.043 2.32c.529-.176.832.12.684.638m-2.692 2.14L6.812 9.17l5.637 2.255l3.04 6.08z"/></svg><span class="ic-name">send</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M2.992 21A.993.993 0 0 1 2 20.007V3.993A1 1 0 0 1 2.992 3h18.016c.548 0 .992.445.992.993v16.014a1 1 0 0 1-.992.993zM20 15V5H4v14L14 9zm0 2.828l-6-6L6.828 19H20zM8 11a2 2 0 1 1 0-4a2 2 0 0 1 0 4"/></svg><span class="ic-name">image</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M3.34 17a10 10 0 0 1-.979-2.326a3 3 0 0 0 .003-5.347a10 10 0 0 1 2.5-4.337a3 3 0 0 0 4.632-2.674a10 10 0 0 1 5.007.003a3 3 0 0 0 4.632 2.671a10.06 10.06 0 0 1 2.503 4.336a3 3 0 0 0-.002 5.347a10 10 0 0 1-2.501 4.337a3 3 0 0 0-4.632 2.674a10 10 0 0 1-5.007-.002a3 3 0 0 0-4.631-2.672A10 10 0 0 1 3.339 17m5.66.196a5 5 0 0 1 2.25 2.77q.75.07 1.499.002a5 5 0 0 1 2.25-2.772a5 5 0 0 1 3.526-.564q.435-.614.748-1.298A5 5 0 0 1 18 12c0-1.26.47-2.437 1.273-3.334a8 8 0 0 0-.75-1.298A5 5 0 0 1 15 6.804a5 5 0 0 1-2.25-2.77q-.75-.071-1.5-.001A5 5 0 0 1 9 6.804a5 5 0 0 1-3.526.564q-.436.614-.747 1.298A5 5 0 0 1 6 12c0 1.26-.471 2.437-1.273 3.334a8 8 0 0 0 .75 1.298A5 5 0 0 1 9 17.196M12 15a3 3 0 1 1 0-6a3 3 0 0 1 0 6m0-2a1 1 0 1 0 0-2a1 1 0 0 0 0 2"/></svg><span class="ic-name">settings</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M6.17 18a3.001 3.001 0 0 1 5.66 0H22v2H11.83a3.001 3.001 0 0 1-5.66 0H2v-2zm6-7a3.001 3.001 0 0 1 5.66 0H22v2h-4.17a3.001 3.001 0 0 1-5.66 0H2v-2zm-6-7a3.001 3.001 0 0 1 5.66 0H22v2H11.83a3.001 3.001 0 0 1-5.66 0H2V4zM9 6a1 1 0 1 0 0-2a1 1 0 0 0 0 2m6 7a1 1 0 1 0 0-2a1 1 0 0 0 0 2m-6 7a1 1 0 1 0 0-2a1 1 0 0 0 0 2"/></svg><span class="ic-name">sliders</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M4 15h2v5h12V4H6v5H4V3a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1zm6-4V8l5 4l-5 4v-3H2v-2z"/></svg><span class="ic-name">log-in</span></div>
|
||||
<div class="icon-group-label">Navigation & layout</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m12 13.171l4.95-4.95l1.414 1.415L12 16L5.636 9.636L7.05 8.222z"/></svg><span class="ic-name">chevron-down</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m13.172 12l-4.95-4.95l1.414-1.413L16 12l-6.364 6.364l-1.414-1.415z"/></svg><span class="ic-name">chevron-right</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M13 7.828V20h-2V7.828l-5.364 5.364l-1.414-1.414L12 4l7.778 7.778l-1.414 1.414z"/></svg><span class="ic-name">arrow-up</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m13 16.172l5.364-5.364l1.414 1.414L12 20l-7.778-7.778l1.414-1.414L11 16.172V4h2z"/></svg><span class="ic-name">arrow-down</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m16.172 11l-5.364-5.364l1.414-1.414L20 12l-7.778 7.778l-1.414-1.414L16.172 13H4v-2z"/></svg><span class="ic-name">arrow-right</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M5 11v2h14v-2z"/></svg><span class="ic-name">minus</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m15.071 4.929l1.414 1.414L11.83 11H21v2h-9.17l4.656 4.657l-1.414 1.414L8.001 12zm-11.07 14.07V5h2v14z"/></svg><span class="ic-name">panel-collapse</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m17.172 11l-4.657-4.657l1.414-1.414L21 12l-7.071 7.071l-1.414-1.414L17.172 13H8v-2zM4 19V5h2v14z"/></svg><span class="ic-name">panel-expand</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M17.586 5H14V3h7v7h-2V6.414l-4.293 4.293l-1.414-1.414zM3 14h2v3.586l4.293-4.293l1.414 1.414L6.414 19H10v2H3z"/></svg><span class="ic-name">expand</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M15 4h-2v7h7V9h-3.586l4.293-4.293l-1.414-1.414L15 7.586zM4 15h3.586l-4.293 4.293l1.414 1.414L9 16.414V20h2v-7H4z"/></svg><span class="ic-name">collapse</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M8 4h13v2H8zM4.5 6.5a1.5 1.5 0 1 1 0-3a1.5 1.5 0 0 1 0 3m0 7a1.5 1.5 0 1 1 0-3a1.5 1.5 0 0 1 0 3m0 6.9a1.5 1.5 0 1 1 0-3a1.5 1.5 0 0 1 0 3M8 11h13v2H8zm0 7h13v2H8z"/></svg><span class="ic-name">list</span></div>
|
||||
<div class="icon-group-label">Files & tools</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M3 21a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7.414l2 2H20a1 1 0 0 1 1 1v3h-2V7h-7.414l-2-2H4v11.998L5.5 11h17l-2.31 9.243a1 1 0 0 1-.97.757zm16.938-8H7.062l-1.5 6h12.876z"/></svg><span class="ic-name">folder</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M4 5v14h16V7h-8.414l-2-2zm8.414 0H21a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7.414z"/></svg><span class="ic-name">folder-closed</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M12.414 5H21a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7.414zM4 5v14h16V7h-8.414l-2-2zm7 7V9h2v3h3v2h-3v3h-2v-3H8v-2z"/></svg><span class="ic-name">folder-plus</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M12.414 5H21a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7.414z"/></svg><span class="ic-name">folder-solid</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M9 2.003V2h10.998C20.55 2 21 2.455 21 2.992v18.016a.993.993 0 0 1-.993.992H3.993A1 1 0 0 1 3 20.993V8zM5.83 8H9V4.83zM11 4v5a1 1 0 0 1-1 1H5v10h14V4z"/></svg><span class="ic-name">file</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M21 8v12.993A1 1 0 0 1 20.007 22H3.993A.993.993 0 0 1 3 21.008V2.992C3 2.455 3.449 2 4.002 2h10.995zm-2 1h-5V4H5v16h14zM8 7h3v2H8zm0 4h8v2H8zm0 4h8v2H8z"/></svg><span class="ic-name">file-text</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M15 4H5v16h14V8h-4zM3 2.992C3 2.444 3.447 2 3.999 2H16l5 5v13.993A1 1 0 0 1 20.007 22H3.993A1 1 0 0 1 3 21.008zM11 11V8h2v3h3v2h-3v3h-2v-3H8v-2z"/></svg><span class="ic-name">file-plus</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M9 2.003V2h10.998C20.55 2 21 2.455 21 2.992v18.016a.993.993 0 0 1-.993.992H3.993A1 1 0 0 1 3 20.993V8zM5.83 8H9V4.83zM11 4v5a1 1 0 0 1-1 1H5v10h14V4z"/></svg><span class="ic-name">file-off</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M2.992 21A.993.993 0 0 1 2 20.007V3.993A1 1 0 0 1 2.992 3h18.016c.548 0 .992.445.992.993v16.014a1 1 0 0 1-.992.993zM20 15V5H4v14L14 9zm0 2.828l-6-6L6.828 19H20zM8 11a2 2 0 1 1 0-4a2 2 0 0 1 0 4"/></svg><span class="ic-name">image-off</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m23 12l-7.071 7.071l-1.414-1.414L20.172 12l-5.657-5.657l1.414-1.414zM3.828 12l5.657 5.657l-1.414 1.414L1 12l7.071-7.071l1.414 1.414z"/></svg><span class="ic-name">code</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M3 3h18a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1m1 2v14h16V5zm8 10h6v2h-6zm-3.333-3L5.838 9.172l1.415-1.415L11.495 12l-4.242 4.243l-1.415-1.415z"/></svg><span class="ic-name">terminal</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m15.728 9.576l-1.414-1.414L5 17.476v1.414h1.414zm1.414-1.414l1.414-1.414l-1.414-1.414l-1.414 1.414zm-9.9 12.728H3v-4.243L16.435 3.212a1 1 0 0 1 1.414 0l2.829 2.829a1 1 0 0 1 0 1.414z"/></svg><span class="ic-name">pencil</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M4 18v-3.7a1.5 1.5 0 0 0-1.5-1.5H2v-1.6h.5A1.5 1.5 0 0 0 4 9.7V6a3 3 0 0 1 3-3h1v2H7a1 1 0 0 0-1 1v4.1A2 2 0 0 1 4.626 12A2 2 0 0 1 6 13.9V18a1 1 0 0 0 1 1h1v2H7a3 3 0 0 1-3-3m16-3.7V18a3 3 0 0 1-3 3h-1v-2h1a1 1 0 0 0 1-1v-4.1a2 2 0 0 1 1.374-1.9A2 2 0 0 1 18 10.1V6a1 1 0 0 0-1-1h-1V3h1a3 3 0 0 1 3 3v3.7a1.5 1.5 0 0 0 1.5 1.5h.5v1.6h-.5a1.5 1.5 0 0 0-1.5 1.5"/></svg><span class="ic-name">glob</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10s-4.477 10-10 10m-2.29-2.333A17.9 17.9 0 0 1 8.027 13H4.062a8.01 8.01 0 0 0 5.648 6.667M10.03 13c.151 2.439.848 4.73 1.97 6.752A15.9 15.9 0 0 0 13.97 13zm9.908 0h-3.965a17.9 17.9 0 0 1-1.683 6.667A8.01 8.01 0 0 0 19.938 13M4.062 11h3.965A17.9 17.9 0 0 1 9.71 4.333A8.01 8.01 0 0 0 4.062 11m5.969 0h3.938A15.9 15.9 0 0 0 12 4.248A15.9 15.9 0 0 0 10.03 11m4.259-6.667A17.9 17.9 0 0 1 15.973 11h3.965a8.01 8.01 0 0 0-5.648-6.667"/></svg><span class="ic-name">globe</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M8 4h13v2H8zm-5-.5h3v3H3zm0 7h3v3H3zm0 7h3v3H3zM8 11h13v2H8zm0 7h13v2H8z"/></svg><span class="ic-name">check-list</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M13 9h8L11 24v-9H4l9-15zm-2 2V7.22L7.532 13H13v4.394L17.263 11z"/></svg><span class="ic-name">bolt</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M15 5h2a2 2 0 0 1 2 2v8.17a3.001 3.001 0 1 1-2 0V7h-2v3l-4.5-4L15 2zM5 8.83a3.001 3.001 0 1 1 2 0v6.34a3.001 3.001 0 1 1-2 0zM6 7a1 1 0 1 0 0-2a1 1 0 0 0 0 2m0 12a1 1 0 1 0 0-2a1 1 0 0 0 0 2m12 0a1 1 0 1 0 0-2a1 1 0 0 0 0 2"/></svg><span class="ic-name">git-pull-request</span></div>
|
||||
<div class="icon-group-label">Communication</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M6.455 19L2 22.5V4a1 1 0 0 1 1-1h18a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1zm-.692-2H20V5H4v13.385zM8 10h8v2H8z"/></svg><span class="ic-name">message</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M3 3h18a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1m17 4.238l-7.928 7.1L4 7.216V19h16zM4.511 5l7.55 6.662L19.502 5z"/></svg><span class="ic-name">mail</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M4 22a8 8 0 1 1 16 0h-2a6 6 0 0 0-12 0zm8-9c-3.315 0-6-2.685-6-6s2.685-6 6-6s6 2.685 6 6s-2.685 6-6 6m0-2c2.21 0 4-1.79 4-4s-1.79-4-4-4s-4 1.79-4 4s1.79 4 4 4"/></svg><span class="ic-name">user</span></div>
|
||||
<div class="icon-group-label">Status & media</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10s-4.477 10-10 10m0-2a8 8 0 1 0 0-16a8 8 0 0 0 0 16M11 7h2v2h-2zm0 4h2v6h-2z"/></svg><span class="ic-name">info</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10s-4.477 10-10 10m0-2a8 8 0 1 0 0-16a8 8 0 0 0 0 16m-1-5h2v2h-2zm2-1.645V14h-2v-1.5a1 1 0 0 1 1-1a1.5 1.5 0 1 0-1.471-1.794l-1.962-.393A3.501 3.501 0 1 1 13 13.355"/></svg><span class="ic-name">help-circle</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m12.866 3l9.526 16.5a1 1 0 0 1-.866 1.5H2.474a1 1 0 0 1-.866-1.5L11.134 3a1 1 0 0 1 1.732 0m-8.66 16h15.588L12 5.5zM11 16h2v2h-2zm0-7h2v5h-2z"/></svg><span class="ic-name">alert-triangle</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10s-4.477 10-10 10m0-2a8 8 0 1 0 0-16a8 8 0 0 0 0 16m1-8h4v2h-6V7h2z"/></svg><span class="ic-name">clock</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M14 4.438A2.437 2.437 0 0 0 16.438 2h1.125A2.437 2.437 0 0 0 20 4.438v1.125A2.437 2.437 0 0 0 17.563 8h-1.125A2.437 2.437 0 0 0 14 5.563zM1 11a6 6 0 0 0 6-6h2a6 6 0 0 0 6 6v2a6 6 0 0 0-6 6H7a6 6 0 0 0-6-6zm3.876 1A8.04 8.04 0 0 1 8 15.124A8.04 8.04 0 0 1 11.124 12A8.04 8.04 0 0 1 8 8.876A8.04 8.04 0 0 1 4.876 12m12.374 2A3.25 3.25 0 0 1 14 17.25v1.5A3.25 3.25 0 0 1 17.25 22h1.5A3.25 3.25 0 0 1 22 18.75v-1.5A3.25 3.25 0 0 1 18.75 14z"/></svg><span class="ic-name">sparkles</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M19.376 12.416L8.777 19.482A.5.5 0 0 1 8 19.066V4.934a.5.5 0 0 1 .777-.416l10.599 7.066a.5.5 0 0 1 0 .832"/></svg><span class="ic-name">play</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M6 5h12a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1"/></svg><span class="ic-name">stop</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m12 18.26l-7.053 3.948l1.575-7.928L.588 8.792l8.027-.952L12 .5l3.385 7.34l8.027.952l-5.934 5.488l1.575 7.928z"/></svg><span class="ic-name">star</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="m12 18.26l-7.053 3.948l1.575-7.928L.588 8.792l8.027-.952L12 .5l3.385 7.34l8.027.952l-5.934 5.488l1.575 7.928zm0-2.292l4.247 2.377l-.948-4.773l3.573-3.305l-4.833-.573l-2.038-4.419l-2.039 4.42l-4.833.572l3.573 3.305l-.948 4.773z"/></svg><span class="ic-name">star-outline</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M4.5 10.5c-.825 0-1.5.675-1.5 1.5s.675 1.5 1.5 1.5S6 12.825 6 12s-.675-1.5-1.5-1.5m15 0c-.825 0-1.5.675-1.5 1.5s.675 1.5 1.5 1.5S21 12.825 21 12s-.675-1.5-1.5-1.5m-7.5 0c-.825 0-1.5.675-1.5 1.5s.675 1.5 1.5 1.5s1.5-.675 1.5-1.5s-.675-1.5-1.5-1.5"/></svg><span class="ic-name">dots-horizontal</span></div>
|
||||
<div class="icon-group-label">Other</div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M20 4v12h3l-4 5l-4-5h3V4zm-8 14v2H3v-2zm2-7v2H3v-2zm0-7v2H3V4z"/></svg><span class="ic-name">sort</span></div>
|
||||
<div class="icon-cell"><svg class="p-ic" viewBox="0 0 24 24" fill="currentColor"><path fill="currentColor" d="M8.5 7a1.5 1.5 0 1 0 0-3a1.5 1.5 0 0 0 0 3m0 6.5a1.5 1.5 0 1 0 0-3a1.5 1.5 0 0 0 0 3m1.5 5a1.5 1.5 0 1 1-3 0a1.5 1.5 0 0 1 3 0M15.5 7a1.5 1.5 0 1 0 0-3a1.5 1.5 0 0 0 0 3m1.5 5a1.5 1.5 0 1 1-3 0a1.5 1.5 0 0 1 3 0m-1.5 8a1.5 1.5 0 1 0 0-3a1.5 1.5 0 0 0 0 3"/></svg><span class="ic-name">grip</span></div>
|
||||
</div>
|
||||
|
||||
<p>禁止用 emoji 充当功能图标(唯一例外:月相 🌑…🌘,仅用于「等待 Agent 响应」聊天态)。Kimi 品牌标记(32×22 的眼睛 logo)属于品牌资产,不在此线稿图标体系内。</p>
|
||||
|
|
|
|||
|
|
@ -1,24 +1,21 @@
|
|||
// scripts/gen-icon-catalog.mjs — generate the design-system §02 icon catalog
|
||||
// HTML from the canonical registry (lib/icons.ts) so the two can never drift.
|
||||
// Run: node --experimental-strip-types scripts/gen-icon-catalog.mjs
|
||||
import { ICONS } from '../src/lib/icons.ts';
|
||||
import { ICON_DATA } from '../src/lib/icon-data.ts';
|
||||
|
||||
// Display order + grouping. Names not listed here are appended under "Other".
|
||||
const GROUPS = [
|
||||
['Actions', ['plus', 'close', 'check', 'search', 'copy', 'link', 'external-link', 'download', 'undo', 'send', 'image', 'settings', 'sliders', 'log-in']],
|
||||
['Actions', ['plus', 'chat-new', 'close', 'check', 'search', 'copy', 'link', 'external-link', 'download', 'undo', 'send', 'image', 'settings', 'sliders', 'log-in']],
|
||||
['Navigation & layout', ['chevron-down', 'chevron-right', 'arrow-up', 'arrow-down', 'arrow-right', 'minus', 'panel-collapse', 'panel-expand', 'expand', 'collapse', 'list']],
|
||||
['Files & tools', ['folder', 'folder-closed', 'folder-plus', 'folder-solid', 'file', 'file-text', 'file-plus', 'file-off', 'image-off', 'code', 'terminal', 'pencil', 'glob', 'globe', 'check-list', 'bolt', 'git-pull-request']],
|
||||
['Communication', ['message', 'mail', 'user']],
|
||||
['Status & media', ['info', 'help-circle', 'alert-triangle', 'clock', 'sparkles', 'play', 'stop', 'star', 'star-outline', 'dots-vertical', 'dots-horizontal']],
|
||||
['Status & media', ['info', 'help-circle', 'alert-triangle', 'clock', 'sparkles', 'play', 'stop', 'star', 'star-outline', 'dots-horizontal']],
|
||||
];
|
||||
|
||||
function render(name) {
|
||||
const def = ICONS[name];
|
||||
const vb = def.viewBox ?? '0 0 16 16';
|
||||
const fillAttrs = def.fill
|
||||
? 'fill="currentColor"'
|
||||
: 'fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"';
|
||||
return `<svg class="p-ic" viewBox="${vb}" ${fillAttrs}>${def.body}</svg>`;
|
||||
const d = ICON_DATA[name];
|
||||
const vb = `0 0 ${d.width ?? 24} ${d.height ?? 24}`;
|
||||
return `<svg class="p-ic" viewBox="${vb}" fill="currentColor">${d.body}</svg>`;
|
||||
}
|
||||
|
||||
const seen = new Set();
|
||||
|
|
@ -31,7 +28,7 @@ for (const [label, names] of GROUPS) {
|
|||
lines.push(` <div class="icon-cell">${render(name)}<span class="ic-name">${name}</span></div>`);
|
||||
}
|
||||
}
|
||||
const rest = Object.keys(ICONS).filter((n) => !seen.has(n));
|
||||
const rest = Object.keys(ICON_DATA).filter((n) => !seen.has(n));
|
||||
if (rest.length) {
|
||||
lines.push(' <div class="icon-group-label">Other</div>');
|
||||
for (const name of rest) {
|
||||
|
|
|
|||
155
apps/kimi-web/scripts/gen-icon-data.mjs
Normal file
155
apps/kimi-web/scripts/gen-icon-data.mjs
Normal file
|
|
@ -0,0 +1,155 @@
|
|||
#!/usr/bin/env node
|
||||
// scripts/gen-icon-data.mjs — generate src/lib/icon-data.ts, the tree-shaken
|
||||
// Remix Icon (ri) subset that backs apps/kimi-web's icon registry.
|
||||
//
|
||||
// Single source of truth for "which existing icon name maps to which Remix
|
||||
// icon" is the NAME_TO_REMIX map below. The SVG bytes are pulled straight from
|
||||
// @iconify-json/ri at generation time, so the registry stays library-sourced
|
||||
// (no hand-copied SVG) yet fully offline and tree-shaken (only the icons we
|
||||
// list here end up in the bundle).
|
||||
//
|
||||
// Run after changing the map: pnpm gen:icons
|
||||
|
||||
import { writeFileSync } from 'node:fs';
|
||||
import { resolve, dirname } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import ri from '@iconify-json/ri/icons.json' with { type: 'json' };
|
||||
import { getIconData } from '@iconify/utils';
|
||||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
const OUT = resolve(__dirname, '../src/lib/icon-data.ts');
|
||||
|
||||
// Existing icon name → Remix icon name (ri:<name>, prefix omitted here).
|
||||
// Keep keys sorted within their group; the generated IconName union follows
|
||||
// this order. Every value must exist in @iconify-json/ri (validated below).
|
||||
const GROUPS = [
|
||||
['Actions', {
|
||||
plus: 'add-line',
|
||||
'chat-new': 'chat-new-line',
|
||||
close: 'close-line',
|
||||
check: 'check-line',
|
||||
search: 'search-line',
|
||||
copy: 'file-copy-line',
|
||||
link: 'links-line',
|
||||
'external-link': 'external-link-line',
|
||||
download: 'download-line',
|
||||
undo: 'arrow-go-back-line',
|
||||
send: 'send-plane-line',
|
||||
image: 'image-line',
|
||||
settings: 'settings-3-line',
|
||||
sliders: 'equalizer-line',
|
||||
'log-in': 'login-box-line',
|
||||
}],
|
||||
['Navigation & layout', {
|
||||
'chevron-down': 'arrow-down-s-line',
|
||||
'chevron-right': 'arrow-right-s-line',
|
||||
'arrow-up': 'arrow-up-line',
|
||||
'arrow-down': 'arrow-down-line',
|
||||
'arrow-right': 'arrow-right-line',
|
||||
minus: 'subtract-line',
|
||||
'panel-collapse': 'contract-left-line',
|
||||
'panel-expand': 'expand-right-line',
|
||||
expand: 'expand-diagonal-line',
|
||||
collapse: 'collapse-diagonal-line',
|
||||
list: 'list-unordered',
|
||||
sort: 'sort-desc',
|
||||
grip: 'draggable',
|
||||
}],
|
||||
['Files & tools', {
|
||||
folder: 'folder-open-line',
|
||||
'folder-closed': 'folder-line',
|
||||
'folder-plus': 'folder-add-line',
|
||||
'folder-solid': 'folder-fill',
|
||||
file: 'file-line',
|
||||
'file-text': 'file-text-line',
|
||||
'file-plus': 'file-add-line',
|
||||
'file-off': 'file-line',
|
||||
'image-off': 'image-line',
|
||||
code: 'code-line',
|
||||
terminal: 'terminal-box-line',
|
||||
pencil: 'pencil-line',
|
||||
glob: 'braces-line',
|
||||
globe: 'global-line',
|
||||
'check-list': 'list-check',
|
||||
bolt: 'flashlight-line',
|
||||
'git-pull-request': 'git-pull-request-line',
|
||||
}],
|
||||
['Communication', {
|
||||
message: 'message-line',
|
||||
mail: 'mail-line',
|
||||
user: 'user-line',
|
||||
}],
|
||||
['Status & media', {
|
||||
info: 'information-line',
|
||||
'help-circle': 'question-line',
|
||||
'alert-triangle': 'alert-line',
|
||||
clock: 'time-line',
|
||||
sparkles: 'sparkling-line',
|
||||
play: 'play-fill',
|
||||
stop: 'stop-fill',
|
||||
star: 'star-fill',
|
||||
'star-outline': 'star-line',
|
||||
'dots-horizontal': 'more-line',
|
||||
}],
|
||||
];
|
||||
|
||||
const NAME_TO_REMIX = Object.assign({}, ...GROUPS.map(([, m]) => m));
|
||||
|
||||
// --- resolve + validate ----------------------------------------------------
|
||||
const missing = [];
|
||||
const data = {};
|
||||
for (const [name, riName] of Object.entries(NAME_TO_REMIX)) {
|
||||
const icon = getIconData(ri, riName);
|
||||
if (!icon) {
|
||||
missing.push(`${name} → ri:${riName}`);
|
||||
continue;
|
||||
}
|
||||
data[name] = { body: icon.body, width: icon.width ?? 24, height: icon.height ?? 24 };
|
||||
}
|
||||
|
||||
if (missing.length) {
|
||||
console.error('gen-icon-data: the following Remix icons were not found in @iconify-json/ri:');
|
||||
for (const m of missing) console.error(` ${m}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// --- emit ------------------------------------------------------------------
|
||||
const names = Object.keys(data);
|
||||
const keyOf = (n) => (/^[a-zA-Z_$][\w$]*$/.test(n) ? n : JSON.stringify(n));
|
||||
|
||||
const lines = [];
|
||||
lines.push('// GENERATED FILE — do not edit by hand.');
|
||||
lines.push('// Source of truth: scripts/gen-icon-data.mjs (run `pnpm gen:icons`).');
|
||||
lines.push('// Icons are Remix Icon (ri) — https://remixicon.com/ — Apache-2.0.');
|
||||
lines.push('');
|
||||
lines.push('export type IconName =');
|
||||
for (let i = 0; i < names.length; i++) {
|
||||
const suffix = i === names.length - 1 ? ';' : '';
|
||||
lines.push(` | ${JSON.stringify(names[i])}${suffix}`);
|
||||
}
|
||||
lines.push('');
|
||||
lines.push('export interface IconData {');
|
||||
lines.push(' /** Inner SVG markup (paths/shapes), rendered inside our <svg> wrapper. */');
|
||||
lines.push(' body: string;');
|
||||
lines.push(' /** Source grid width in px. Remix icons are 24. */');
|
||||
lines.push(' width?: number;');
|
||||
lines.push(' /** Source grid height in px. Remix icons are 24. */');
|
||||
lines.push(' height?: number;');
|
||||
lines.push('}');
|
||||
lines.push('');
|
||||
lines.push('/** Existing name → fully-qualified Remix icon id. */');
|
||||
lines.push('export const NAME_TO_REMIX: Record<IconName, string> = {');
|
||||
for (const name of names) lines.push(` ${keyOf(name)}: ${JSON.stringify('ri:' + NAME_TO_REMIX[name])},`);
|
||||
lines.push('};');
|
||||
lines.push('');
|
||||
lines.push('/** Per-icon SVG data, pulled from @iconify-json/ri. */');
|
||||
lines.push('export const ICON_DATA: Record<IconName, IconData> = {');
|
||||
for (const name of names) {
|
||||
const { body, width, height } = data[name];
|
||||
lines.push(` ${keyOf(name)}: { body: ${JSON.stringify(body)}, width: ${width}, height: ${height} },`);
|
||||
}
|
||||
lines.push('};');
|
||||
lines.push('');
|
||||
|
||||
writeFileSync(OUT, lines.join('\n'));
|
||||
console.log(`gen-icon-data: wrote ${names.length} icons to src/lib/icon-data.ts`);
|
||||
|
|
@ -582,7 +582,7 @@ onBeforeUnmount(() => {
|
|||
<!-- New chat + new workspace buttons -->
|
||||
<div class="btn-wrap" :class="{ 'btn-wrap--scrolled': sessionsScrolled }">
|
||||
<button class="btn-new-chat" type="button" @click.stop="emit('create')">
|
||||
<Icon name="plus" />
|
||||
<Icon name="chat-new" />
|
||||
<span>{{ t('sidebar.newChat') }}</span>
|
||||
</button>
|
||||
<Tooltip :text="t('sidebar.newWorkspace')">
|
||||
|
|
@ -924,7 +924,7 @@ onBeforeUnmount(() => {
|
|||
border: none;
|
||||
border-radius: var(--radius-md);
|
||||
background: transparent;
|
||||
color: var(--color-text-muted);
|
||||
color: var(--color-text);
|
||||
font: inherit;
|
||||
text-align: left;
|
||||
cursor: pointer;
|
||||
|
|
@ -942,7 +942,7 @@ onBeforeUnmount(() => {
|
|||
.search-input {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
color: var(--faint);
|
||||
color: var(--color-text);
|
||||
font-family: var(--mono);
|
||||
font-size: var(--ui-font-size);
|
||||
overflow: hidden;
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ function onHeaderDragStart(event: DragEvent): void {
|
|||
:label="t('workspace.newInGroup')"
|
||||
@click.stop="emit('createInWorkspace', group.workspace.id)"
|
||||
>
|
||||
<Icon name="plus" />
|
||||
<Icon name="chat-new" />
|
||||
</IconButton>
|
||||
</Tooltip>
|
||||
</div>
|
||||
|
|
@ -259,12 +259,24 @@ function onHeaderDragStart(event: DragEvent): void {
|
|||
opacity: 1;
|
||||
}
|
||||
|
||||
/* More button — hidden until hover (or while its menu is open / focused).
|
||||
`.gh .gh-more` out-specificities IconButton's display so the hidden default wins. */
|
||||
.gh .gh-more { display: none; }
|
||||
/* More + add buttons — hidden until hover (or while the more menu is open /
|
||||
focused). `.gh .gh-more` / `.gh .gh-add` out-specificity IconButton's display
|
||||
so the hidden default wins. */
|
||||
.gh .gh-more,
|
||||
.gh .gh-add {
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
}
|
||||
.gh:hover .gh-more,
|
||||
.gh:hover .gh-add,
|
||||
.gh:focus-within .gh-more,
|
||||
.gh:focus-within .gh-add,
|
||||
.gh-more.open,
|
||||
.gh-more:focus-visible { display: inline-flex; }
|
||||
.gh-more:focus-visible,
|
||||
.gh-add:focus-visible {
|
||||
opacity: 1;
|
||||
pointer-events: auto;
|
||||
}
|
||||
.gh-more.open { color: var(--color-text); background: var(--color-line); }
|
||||
|
||||
.group-empty {
|
||||
|
|
|
|||
|
|
@ -579,9 +579,9 @@ function isStreamingRenderBlock(turn: ChatTurn, block: { sourceIndex: number }):
|
|||
<button
|
||||
type="button"
|
||||
class="u-edit"
|
||||
:aria-label="t('conversation.undoTooltip')"
|
||||
@click="onUndo(turn)"
|
||||
>
|
||||
<span class="u-edit-text">{{ t('conversation.undo') }}</span>
|
||||
<Icon name="undo" size="sm" />
|
||||
</button>
|
||||
</Tooltip>
|
||||
|
|
@ -593,6 +593,7 @@ function isStreamingRenderBlock(turn: ChatTurn, block: { sourceIndex: number }):
|
|||
<button
|
||||
type="button"
|
||||
class="u-copy"
|
||||
:aria-label="t('filePreview.copy')"
|
||||
@click.stop="copyUserMessage(turn)"
|
||||
>
|
||||
<Icon v-if="copiedTurn !== turn.id" name="copy" size="sm" />
|
||||
|
|
@ -649,16 +650,19 @@ function isStreamingRenderBlock(turn: ChatTurn, block: { sourceIndex: number }):
|
|||
<Tooltip :text="`${turn.durationMs} ms`">
|
||||
<span v-if="turn.durationMs !== undefined" class="a-duration">{{ formatDuration(turn.durationMs) }}</span>
|
||||
</Tooltip>
|
||||
<button
|
||||
<Tooltip
|
||||
v-if="assistantRunFinalText(ti).trim().length > 0"
|
||||
class="a-cpbtn"
|
||||
tabindex="-1"
|
||||
@click="copyAssistantRun(ti)"
|
||||
:text="t('filePreview.copy')"
|
||||
>
|
||||
<Icon v-if="copiedTurn !== turn.id" name="copy" size="sm" />
|
||||
<Icon v-else name="check" size="sm" />
|
||||
<span class="a-cpbtn-text">{{ t('filePreview.copy') }}</span>
|
||||
</button>
|
||||
<button
|
||||
class="a-cpbtn"
|
||||
:aria-label="t('filePreview.copy')"
|
||||
@click="copyAssistantRun(ti)"
|
||||
>
|
||||
<Icon v-if="copiedTurn !== turn.id" name="copy" size="sm" />
|
||||
<Icon v-else name="check" size="sm" />
|
||||
</button>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -874,16 +878,6 @@ function isStreamingRenderBlock(turn: ChatTurn, block: { sourceIndex: number }):
|
|||
min-height: 22px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.u-meta .u-edit svg {
|
||||
margin-top: -1.5px;
|
||||
}
|
||||
.u-meta .u-edit-text {
|
||||
max-width: 0;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
transition: max-width 0.15s ease;
|
||||
}
|
||||
.u-meta .u-edit:hover .u-edit-text { max-width: 120px; }
|
||||
/* User input is shown verbatim — preserve newlines, break long tokens. */
|
||||
.u-text {
|
||||
white-space: pre-wrap;
|
||||
|
|
@ -896,7 +890,7 @@ function isStreamingRenderBlock(turn: ChatTurn, block: { sourceIndex: number }):
|
|||
.u-edit {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
justify-content: center;
|
||||
padding: 2px 5px;
|
||||
background: none;
|
||||
border: none;
|
||||
|
|
@ -904,6 +898,7 @@ function isStreamingRenderBlock(turn: ChatTurn, block: { sourceIndex: number }):
|
|||
color: var(--muted);
|
||||
font: inherit;
|
||||
font-size: var(--text-base);
|
||||
line-height: 1;
|
||||
cursor: pointer;
|
||||
opacity: 0.7;
|
||||
transition: opacity 0.12s, color 0.12s, background-color 0.12s;
|
||||
|
|
@ -912,7 +907,6 @@ function isStreamingRenderBlock(turn: ChatTurn, block: { sourceIndex: number }):
|
|||
display: block;
|
||||
flex: none;
|
||||
}
|
||||
.u-edit span { line-height: 1; }
|
||||
.u-edit:hover { opacity: 1; color: var(--color-accent); background: var(--hover); }
|
||||
/* Copy button — icon-only, shares the undo button's muted→hover style. */
|
||||
.u-copy {
|
||||
|
|
@ -933,7 +927,7 @@ function isStreamingRenderBlock(turn: ChatTurn, block: { sourceIndex: number }):
|
|||
min-height: 22px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.u-copy svg { display: block; flex: none; transform: translateY(1.3px); }
|
||||
.u-copy svg { display: block; flex: none; }
|
||||
.u-copy:hover { opacity: 1; color: var(--color-accent); background: var(--hover); }
|
||||
/* Mobile bubble layout: right-align the undo button below the bubble. */
|
||||
.u-edit-wrap { display: flex; justify-content: flex-end; }
|
||||
|
|
@ -1004,38 +998,35 @@ function isStreamingRenderBlock(turn: ChatTurn, block: { sourceIndex: number }):
|
|||
line-height: 1;
|
||||
}
|
||||
|
||||
/* Copy button — icon-only, shares the undo button's muted→hover style so the
|
||||
message-stream action buttons (copy / undo) all read as one family. */
|
||||
.a-cpbtn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
justify-content: center;
|
||||
padding: 2px 5px;
|
||||
background: none;
|
||||
border: none;
|
||||
color: var(--faint);
|
||||
cursor: pointer;
|
||||
border-radius: var(--radius-sm);
|
||||
color: var(--muted);
|
||||
font: inherit;
|
||||
font-size: var(--text-base);
|
||||
padding: 2px 6px 2px 0;
|
||||
border-radius: 4px;
|
||||
line-height: 1;
|
||||
cursor: pointer;
|
||||
opacity: 0.7;
|
||||
transition: opacity 0.12s, color 0.12s, background-color 0.12s;
|
||||
min-height: 22px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.a-cpbtn:hover {
|
||||
color: var(--color-text);
|
||||
}
|
||||
.a-cpbtn svg,
|
||||
.a-cpbtn-text {
|
||||
pointer-events: none;
|
||||
opacity: 1;
|
||||
color: var(--color-accent);
|
||||
background: var(--hover);
|
||||
}
|
||||
.a-cpbtn svg {
|
||||
display: block;
|
||||
flex: none;
|
||||
}
|
||||
.a-cpbtn-text {
|
||||
opacity: 0;
|
||||
max-width: none;
|
||||
overflow: visible;
|
||||
white-space: nowrap;
|
||||
transition: opacity 0.15s ease;
|
||||
}
|
||||
.a-cpbtn:hover .a-cpbtn-text {
|
||||
opacity: 1;
|
||||
}
|
||||
/* Touch devices: always show the copy buttons (no hover to reveal them) and
|
||||
give the bubble-layout button a comfortable tap size. */
|
||||
@media (hover: none) {
|
||||
|
|
@ -1174,10 +1165,6 @@ function isStreamingRenderBlock(turn: ChatTurn, block: { sourceIndex: number }):
|
|||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.a-cpbtn-text {
|
||||
opacity: 1;
|
||||
max-width: 120px;
|
||||
}
|
||||
.u-edit-confirm {
|
||||
flex-wrap: wrap;
|
||||
justify-content: flex-end;
|
||||
|
|
|
|||
|
|
@ -205,7 +205,7 @@ async function onDeleteWorkspace(ws: WorkspaceView): Promise<void> {
|
|||
:label="t('sidebar.options')"
|
||||
@click.stop="toggleWsMenu(g.workspace.id)"
|
||||
>
|
||||
<Icon name="dots-vertical" size="md" />
|
||||
<Icon name="dots-horizontal" size="md" />
|
||||
</IconButton>
|
||||
</Tooltip>
|
||||
|
||||
|
|
@ -250,7 +250,7 @@ async function onDeleteWorkspace(ws: WorkspaceView): Promise<void> {
|
|||
:label="t('sidebar.options')"
|
||||
@click.stop="toggleMenu(s.id)"
|
||||
>
|
||||
<Icon name="dots-vertical" size="md" />
|
||||
<Icon name="dots-horizontal" size="md" />
|
||||
</IconButton>
|
||||
</Tooltip>
|
||||
|
||||
|
|
|
|||
196
apps/kimi-web/src/lib/icon-data.ts
Normal file
196
apps/kimi-web/src/lib/icon-data.ts
Normal file
|
|
@ -0,0 +1,196 @@
|
|||
// GENERATED FILE — do not edit by hand.
|
||||
// Source of truth: scripts/gen-icon-data.mjs (run `pnpm gen:icons`).
|
||||
// Icons are Remix Icon (ri) — https://remixicon.com/ — Apache-2.0.
|
||||
|
||||
export type IconName =
|
||||
| "plus"
|
||||
| "chat-new"
|
||||
| "close"
|
||||
| "check"
|
||||
| "search"
|
||||
| "copy"
|
||||
| "link"
|
||||
| "external-link"
|
||||
| "download"
|
||||
| "undo"
|
||||
| "send"
|
||||
| "image"
|
||||
| "settings"
|
||||
| "sliders"
|
||||
| "log-in"
|
||||
| "chevron-down"
|
||||
| "chevron-right"
|
||||
| "arrow-up"
|
||||
| "arrow-down"
|
||||
| "arrow-right"
|
||||
| "minus"
|
||||
| "panel-collapse"
|
||||
| "panel-expand"
|
||||
| "expand"
|
||||
| "collapse"
|
||||
| "list"
|
||||
| "sort"
|
||||
| "grip"
|
||||
| "folder"
|
||||
| "folder-closed"
|
||||
| "folder-plus"
|
||||
| "folder-solid"
|
||||
| "file"
|
||||
| "file-text"
|
||||
| "file-plus"
|
||||
| "file-off"
|
||||
| "image-off"
|
||||
| "code"
|
||||
| "terminal"
|
||||
| "pencil"
|
||||
| "glob"
|
||||
| "globe"
|
||||
| "check-list"
|
||||
| "bolt"
|
||||
| "git-pull-request"
|
||||
| "message"
|
||||
| "mail"
|
||||
| "user"
|
||||
| "info"
|
||||
| "help-circle"
|
||||
| "alert-triangle"
|
||||
| "clock"
|
||||
| "sparkles"
|
||||
| "play"
|
||||
| "stop"
|
||||
| "star"
|
||||
| "star-outline"
|
||||
| "dots-horizontal";
|
||||
|
||||
export interface IconData {
|
||||
/** Inner SVG markup (paths/shapes), rendered inside our <svg> wrapper. */
|
||||
body: string;
|
||||
/** Source grid width in px. Remix icons are 24. */
|
||||
width?: number;
|
||||
/** Source grid height in px. Remix icons are 24. */
|
||||
height?: number;
|
||||
}
|
||||
|
||||
/** Existing name → fully-qualified Remix icon id. */
|
||||
export const NAME_TO_REMIX: Record<IconName, string> = {
|
||||
plus: "ri:add-line",
|
||||
"chat-new": "ri:chat-new-line",
|
||||
close: "ri:close-line",
|
||||
check: "ri:check-line",
|
||||
search: "ri:search-line",
|
||||
copy: "ri:file-copy-line",
|
||||
link: "ri:links-line",
|
||||
"external-link": "ri:external-link-line",
|
||||
download: "ri:download-line",
|
||||
undo: "ri:arrow-go-back-line",
|
||||
send: "ri:send-plane-line",
|
||||
image: "ri:image-line",
|
||||
settings: "ri:settings-3-line",
|
||||
sliders: "ri:equalizer-line",
|
||||
"log-in": "ri:login-box-line",
|
||||
"chevron-down": "ri:arrow-down-s-line",
|
||||
"chevron-right": "ri:arrow-right-s-line",
|
||||
"arrow-up": "ri:arrow-up-line",
|
||||
"arrow-down": "ri:arrow-down-line",
|
||||
"arrow-right": "ri:arrow-right-line",
|
||||
minus: "ri:subtract-line",
|
||||
"panel-collapse": "ri:contract-left-line",
|
||||
"panel-expand": "ri:expand-right-line",
|
||||
expand: "ri:expand-diagonal-line",
|
||||
collapse: "ri:collapse-diagonal-line",
|
||||
list: "ri:list-unordered",
|
||||
sort: "ri:sort-desc",
|
||||
grip: "ri:draggable",
|
||||
folder: "ri:folder-open-line",
|
||||
"folder-closed": "ri:folder-line",
|
||||
"folder-plus": "ri:folder-add-line",
|
||||
"folder-solid": "ri:folder-fill",
|
||||
file: "ri:file-line",
|
||||
"file-text": "ri:file-text-line",
|
||||
"file-plus": "ri:file-add-line",
|
||||
"file-off": "ri:file-line",
|
||||
"image-off": "ri:image-line",
|
||||
code: "ri:code-line",
|
||||
terminal: "ri:terminal-box-line",
|
||||
pencil: "ri:pencil-line",
|
||||
glob: "ri:braces-line",
|
||||
globe: "ri:global-line",
|
||||
"check-list": "ri:list-check",
|
||||
bolt: "ri:flashlight-line",
|
||||
"git-pull-request": "ri:git-pull-request-line",
|
||||
message: "ri:message-line",
|
||||
mail: "ri:mail-line",
|
||||
user: "ri:user-line",
|
||||
info: "ri:information-line",
|
||||
"help-circle": "ri:question-line",
|
||||
"alert-triangle": "ri:alert-line",
|
||||
clock: "ri:time-line",
|
||||
sparkles: "ri:sparkling-line",
|
||||
play: "ri:play-fill",
|
||||
stop: "ri:stop-fill",
|
||||
star: "ri:star-fill",
|
||||
"star-outline": "ri:star-line",
|
||||
"dots-horizontal": "ri:more-line",
|
||||
};
|
||||
|
||||
/** Per-icon SVG data, pulled from @iconify-json/ri. */
|
||||
export const ICON_DATA: Record<IconName, IconData> = {
|
||||
plus: { body: "<path fill=\"currentColor\" d=\"M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z\"/>", width: 24, height: 24 },
|
||||
"chat-new": { body: "<path fill=\"currentColor\" d=\"M14 3v2H4v13.385L5.763 17H20v-7h2v8a1 1 0 0 1-1 1H6.455L2 22.5V4a1 1 0 0 1 1-1zm5 0V0h2v3h3v2h-3v3h-2V5h-3V3z\"/>", width: 24, height: 24 },
|
||||
close: { body: "<path fill=\"currentColor\" d=\"m12 10.587l4.95-4.95l1.414 1.414l-4.95 4.95l4.95 4.95l-1.415 1.414l-4.95-4.95l-4.949 4.95l-1.414-1.415l4.95-4.95l-4.95-4.95L7.05 5.638z\"/>", width: 24, height: 24 },
|
||||
check: { body: "<path fill=\"currentColor\" d=\"m10 15.17l9.192-9.191l1.414 1.414L10 17.999l-6.364-6.364l1.414-1.414z\"/>", width: 24, height: 24 },
|
||||
search: { body: "<path fill=\"currentColor\" d=\"m18.031 16.617l4.283 4.282l-1.415 1.415l-4.282-4.283A8.96 8.96 0 0 1 11 20c-4.968 0-9-4.032-9-9s4.032-9 9-9s9 4.032 9 9a8.96 8.96 0 0 1-1.969 5.617m-2.006-.742A6.98 6.98 0 0 0 18 11c0-3.867-3.133-7-7-7s-7 3.133-7 7s3.133 7 7 7a6.98 6.98 0 0 0 4.875-1.975z\"/>", width: 24, height: 24 },
|
||||
copy: { body: "<path fill=\"currentColor\" d=\"M7 6V3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1h-3v3c0 .552-.45 1-1.007 1H4.007A1 1 0 0 1 3 21l.003-14c0-.552.45-1 1.006-1zM5.002 8L5 20h10V8zM9 6h8v10h2V4H9z\"/>", width: 24, height: 24 },
|
||||
link: { body: "<path fill=\"currentColor\" d=\"m13.06 8.111l1.415 1.414a7 7 0 0 1 0 9.9l-.354.353a7 7 0 1 1-9.9-9.9l1.415 1.415a5 5 0 1 0 7.071 7.071l.354-.354a5 5 0 0 0 0-7.07l-1.415-1.415zm6.718 6.01l-1.414-1.414a5 5 0 0 0-7.071-7.07l-.354.353a5 5 0 0 0 0 7.07l1.415 1.415l-1.415 1.414l-1.414-1.414a7 7 0 0 1 0-9.9l.354-.353a7 7 0 1 1 9.9 9.9\"/>", width: 24, height: 24 },
|
||||
"external-link": { body: "<path fill=\"currentColor\" d=\"M10 6v2H5v11h11v-5h2v6a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1zm11-3v8h-2V6.413l-7.793 7.794l-1.414-1.414L17.585 5H13V3z\"/>", width: 24, height: 24 },
|
||||
download: { body: "<path fill=\"currentColor\" d=\"M3 19h18v2H3zm10-5.828L19.071 7.1l1.414 1.414L12 17L3.515 8.515L4.929 7.1L11 13.173V2h2z\"/>", width: 24, height: 24 },
|
||||
undo: { body: "<path fill=\"currentColor\" d=\"m5.828 7l2.536 2.535L6.95 10.95L2 6l4.95-4.95l1.414 1.415L5.828 5H13a8 8 0 1 1 0 16H4v-2h9a6 6 0 0 0 0-12z\"/>", width: 24, height: 24 },
|
||||
send: { body: "<path fill=\"currentColor\" d=\"m21.727 2.957l-5.454 19.086c-.15.529-.475.553-.717.07L11 13L1.923 9.37c-.51-.205-.503-.51.034-.689L21.043 2.32c.529-.176.832.12.684.638m-2.692 2.14L6.812 9.17l5.637 2.255l3.04 6.08z\"/>", width: 24, height: 24 },
|
||||
image: { body: "<path fill=\"currentColor\" d=\"M2.992 21A.993.993 0 0 1 2 20.007V3.993A1 1 0 0 1 2.992 3h18.016c.548 0 .992.445.992.993v16.014a1 1 0 0 1-.992.993zM20 15V5H4v14L14 9zm0 2.828l-6-6L6.828 19H20zM8 11a2 2 0 1 1 0-4a2 2 0 0 1 0 4\"/>", width: 24, height: 24 },
|
||||
settings: { body: "<path fill=\"currentColor\" d=\"M3.34 17a10 10 0 0 1-.979-2.326a3 3 0 0 0 .003-5.347a10 10 0 0 1 2.5-4.337a3 3 0 0 0 4.632-2.674a10 10 0 0 1 5.007.003a3 3 0 0 0 4.632 2.671a10.06 10.06 0 0 1 2.503 4.336a3 3 0 0 0-.002 5.347a10 10 0 0 1-2.501 4.337a3 3 0 0 0-4.632 2.674a10 10 0 0 1-5.007-.002a3 3 0 0 0-4.631-2.672A10 10 0 0 1 3.339 17m5.66.196a5 5 0 0 1 2.25 2.77q.75.07 1.499.002a5 5 0 0 1 2.25-2.772a5 5 0 0 1 3.526-.564q.435-.614.748-1.298A5 5 0 0 1 18 12c0-1.26.47-2.437 1.273-3.334a8 8 0 0 0-.75-1.298A5 5 0 0 1 15 6.804a5 5 0 0 1-2.25-2.77q-.75-.071-1.5-.001A5 5 0 0 1 9 6.804a5 5 0 0 1-3.526.564q-.436.614-.747 1.298A5 5 0 0 1 6 12c0 1.26-.471 2.437-1.273 3.334a8 8 0 0 0 .75 1.298A5 5 0 0 1 9 17.196M12 15a3 3 0 1 1 0-6a3 3 0 0 1 0 6m0-2a1 1 0 1 0 0-2a1 1 0 0 0 0 2\"/>", width: 24, height: 24 },
|
||||
sliders: { body: "<path fill=\"currentColor\" d=\"M6.17 18a3.001 3.001 0 0 1 5.66 0H22v2H11.83a3.001 3.001 0 0 1-5.66 0H2v-2zm6-7a3.001 3.001 0 0 1 5.66 0H22v2h-4.17a3.001 3.001 0 0 1-5.66 0H2v-2zm-6-7a3.001 3.001 0 0 1 5.66 0H22v2H11.83a3.001 3.001 0 0 1-5.66 0H2V4zM9 6a1 1 0 1 0 0-2a1 1 0 0 0 0 2m6 7a1 1 0 1 0 0-2a1 1 0 0 0 0 2m-6 7a1 1 0 1 0 0-2a1 1 0 0 0 0 2\"/>", width: 24, height: 24 },
|
||||
"log-in": { body: "<path fill=\"currentColor\" d=\"M4 15h2v5h12V4H6v5H4V3a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1zm6-4V8l5 4l-5 4v-3H2v-2z\"/>", width: 24, height: 24 },
|
||||
"chevron-down": { body: "<path fill=\"currentColor\" d=\"m12 13.171l4.95-4.95l1.414 1.415L12 16L5.636 9.636L7.05 8.222z\"/>", width: 24, height: 24 },
|
||||
"chevron-right": { body: "<path fill=\"currentColor\" d=\"m13.172 12l-4.95-4.95l1.414-1.413L16 12l-6.364 6.364l-1.414-1.415z\"/>", width: 24, height: 24 },
|
||||
"arrow-up": { body: "<path fill=\"currentColor\" d=\"M13 7.828V20h-2V7.828l-5.364 5.364l-1.414-1.414L12 4l7.778 7.778l-1.414 1.414z\"/>", width: 24, height: 24 },
|
||||
"arrow-down": { body: "<path fill=\"currentColor\" d=\"m13 16.172l5.364-5.364l1.414 1.414L12 20l-7.778-7.778l1.414-1.414L11 16.172V4h2z\"/>", width: 24, height: 24 },
|
||||
"arrow-right": { body: "<path fill=\"currentColor\" d=\"m16.172 11l-5.364-5.364l1.414-1.414L20 12l-7.778 7.778l-1.414-1.414L16.172 13H4v-2z\"/>", width: 24, height: 24 },
|
||||
minus: { body: "<path fill=\"currentColor\" d=\"M5 11v2h14v-2z\"/>", width: 24, height: 24 },
|
||||
"panel-collapse": { body: "<path fill=\"currentColor\" d=\"m15.071 4.929l1.414 1.414L11.83 11H21v2h-9.17l4.656 4.657l-1.414 1.414L8.001 12zm-11.07 14.07V5h2v14z\"/>", width: 24, height: 24 },
|
||||
"panel-expand": { body: "<path fill=\"currentColor\" d=\"m17.172 11l-4.657-4.657l1.414-1.414L21 12l-7.071 7.071l-1.414-1.414L17.172 13H8v-2zM4 19V5h2v14z\"/>", width: 24, height: 24 },
|
||||
expand: { body: "<path fill=\"currentColor\" d=\"M17.586 5H14V3h7v7h-2V6.414l-4.293 4.293l-1.414-1.414zM3 14h2v3.586l4.293-4.293l1.414 1.414L6.414 19H10v2H3z\"/>", width: 24, height: 24 },
|
||||
collapse: { body: "<path fill=\"currentColor\" d=\"M15 4h-2v7h7V9h-3.586l4.293-4.293l-1.414-1.414L15 7.586zM4 15h3.586l-4.293 4.293l1.414 1.414L9 16.414V20h2v-7H4z\"/>", width: 24, height: 24 },
|
||||
list: { body: "<path fill=\"currentColor\" d=\"M8 4h13v2H8zM4.5 6.5a1.5 1.5 0 1 1 0-3a1.5 1.5 0 0 1 0 3m0 7a1.5 1.5 0 1 1 0-3a1.5 1.5 0 0 1 0 3m0 6.9a1.5 1.5 0 1 1 0-3a1.5 1.5 0 0 1 0 3M8 11h13v2H8zm0 7h13v2H8z\"/>", width: 24, height: 24 },
|
||||
sort: { body: "<path fill=\"currentColor\" d=\"M20 4v12h3l-4 5l-4-5h3V4zm-8 14v2H3v-2zm2-7v2H3v-2zm0-7v2H3V4z\"/>", width: 24, height: 24 },
|
||||
grip: { body: "<path fill=\"currentColor\" d=\"M8.5 7a1.5 1.5 0 1 0 0-3a1.5 1.5 0 0 0 0 3m0 6.5a1.5 1.5 0 1 0 0-3a1.5 1.5 0 0 0 0 3m1.5 5a1.5 1.5 0 1 1-3 0a1.5 1.5 0 0 1 3 0M15.5 7a1.5 1.5 0 1 0 0-3a1.5 1.5 0 0 0 0 3m1.5 5a1.5 1.5 0 1 1-3 0a1.5 1.5 0 0 1 3 0m-1.5 8a1.5 1.5 0 1 0 0-3a1.5 1.5 0 0 0 0 3\"/>", width: 24, height: 24 },
|
||||
folder: { body: "<path fill=\"currentColor\" d=\"M3 21a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7.414l2 2H20a1 1 0 0 1 1 1v3h-2V7h-7.414l-2-2H4v11.998L5.5 11h17l-2.31 9.243a1 1 0 0 1-.97.757zm16.938-8H7.062l-1.5 6h12.876z\"/>", width: 24, height: 24 },
|
||||
"folder-closed": { body: "<path fill=\"currentColor\" d=\"M4 5v14h16V7h-8.414l-2-2zm8.414 0H21a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7.414z\"/>", width: 24, height: 24 },
|
||||
"folder-plus": { body: "<path fill=\"currentColor\" d=\"M12.414 5H21a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7.414zM4 5v14h16V7h-8.414l-2-2zm7 7V9h2v3h3v2h-3v3h-2v-3H8v-2z\"/>", width: 24, height: 24 },
|
||||
"folder-solid": { body: "<path fill=\"currentColor\" d=\"M12.414 5H21a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7.414z\"/>", width: 24, height: 24 },
|
||||
file: { body: "<path fill=\"currentColor\" d=\"M9 2.003V2h10.998C20.55 2 21 2.455 21 2.992v18.016a.993.993 0 0 1-.993.992H3.993A1 1 0 0 1 3 20.993V8zM5.83 8H9V4.83zM11 4v5a1 1 0 0 1-1 1H5v10h14V4z\"/>", width: 24, height: 24 },
|
||||
"file-text": { body: "<path fill=\"currentColor\" d=\"M21 8v12.993A1 1 0 0 1 20.007 22H3.993A.993.993 0 0 1 3 21.008V2.992C3 2.455 3.449 2 4.002 2h10.995zm-2 1h-5V4H5v16h14zM8 7h3v2H8zm0 4h8v2H8zm0 4h8v2H8z\"/>", width: 24, height: 24 },
|
||||
"file-plus": { body: "<path fill=\"currentColor\" d=\"M15 4H5v16h14V8h-4zM3 2.992C3 2.444 3.447 2 3.999 2H16l5 5v13.993A1 1 0 0 1 20.007 22H3.993A1 1 0 0 1 3 21.008zM11 11V8h2v3h3v2h-3v3h-2v-3H8v-2z\"/>", width: 24, height: 24 },
|
||||
"file-off": { body: "<path fill=\"currentColor\" d=\"M9 2.003V2h10.998C20.55 2 21 2.455 21 2.992v18.016a.993.993 0 0 1-.993.992H3.993A1 1 0 0 1 3 20.993V8zM5.83 8H9V4.83zM11 4v5a1 1 0 0 1-1 1H5v10h14V4z\"/>", width: 24, height: 24 },
|
||||
"image-off": { body: "<path fill=\"currentColor\" d=\"M2.992 21A.993.993 0 0 1 2 20.007V3.993A1 1 0 0 1 2.992 3h18.016c.548 0 .992.445.992.993v16.014a1 1 0 0 1-.992.993zM20 15V5H4v14L14 9zm0 2.828l-6-6L6.828 19H20zM8 11a2 2 0 1 1 0-4a2 2 0 0 1 0 4\"/>", width: 24, height: 24 },
|
||||
code: { body: "<path fill=\"currentColor\" d=\"m23 12l-7.071 7.071l-1.414-1.414L20.172 12l-5.657-5.657l1.414-1.414zM3.828 12l5.657 5.657l-1.414 1.414L1 12l7.071-7.071l1.414 1.414z\"/>", width: 24, height: 24 },
|
||||
terminal: { body: "<path fill=\"currentColor\" d=\"M3 3h18a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1m1 2v14h16V5zm8 10h6v2h-6zm-3.333-3L5.838 9.172l1.415-1.415L11.495 12l-4.242 4.243l-1.415-1.415z\"/>", width: 24, height: 24 },
|
||||
pencil: { body: "<path fill=\"currentColor\" d=\"m15.728 9.576l-1.414-1.414L5 17.476v1.414h1.414zm1.414-1.414l1.414-1.414l-1.414-1.414l-1.414 1.414zm-9.9 12.728H3v-4.243L16.435 3.212a1 1 0 0 1 1.414 0l2.829 2.829a1 1 0 0 1 0 1.414z\"/>", width: 24, height: 24 },
|
||||
glob: { body: "<path fill=\"currentColor\" d=\"M4 18v-3.7a1.5 1.5 0 0 0-1.5-1.5H2v-1.6h.5A1.5 1.5 0 0 0 4 9.7V6a3 3 0 0 1 3-3h1v2H7a1 1 0 0 0-1 1v4.1A2 2 0 0 1 4.626 12A2 2 0 0 1 6 13.9V18a1 1 0 0 0 1 1h1v2H7a3 3 0 0 1-3-3m16-3.7V18a3 3 0 0 1-3 3h-1v-2h1a1 1 0 0 0 1-1v-4.1a2 2 0 0 1 1.374-1.9A2 2 0 0 1 18 10.1V6a1 1 0 0 0-1-1h-1V3h1a3 3 0 0 1 3 3v3.7a1.5 1.5 0 0 0 1.5 1.5h.5v1.6h-.5a1.5 1.5 0 0 0-1.5 1.5\"/>", width: 24, height: 24 },
|
||||
globe: { body: "<path fill=\"currentColor\" d=\"M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10s-4.477 10-10 10m-2.29-2.333A17.9 17.9 0 0 1 8.027 13H4.062a8.01 8.01 0 0 0 5.648 6.667M10.03 13c.151 2.439.848 4.73 1.97 6.752A15.9 15.9 0 0 0 13.97 13zm9.908 0h-3.965a17.9 17.9 0 0 1-1.683 6.667A8.01 8.01 0 0 0 19.938 13M4.062 11h3.965A17.9 17.9 0 0 1 9.71 4.333A8.01 8.01 0 0 0 4.062 11m5.969 0h3.938A15.9 15.9 0 0 0 12 4.248A15.9 15.9 0 0 0 10.03 11m4.259-6.667A17.9 17.9 0 0 1 15.973 11h3.965a8.01 8.01 0 0 0-5.648-6.667\"/>", width: 24, height: 24 },
|
||||
"check-list": { body: "<path fill=\"currentColor\" d=\"M8 4h13v2H8zm-5-.5h3v3H3zm0 7h3v3H3zm0 7h3v3H3zM8 11h13v2H8zm0 7h13v2H8z\"/>", width: 24, height: 24 },
|
||||
bolt: { body: "<path fill=\"currentColor\" d=\"M13 9h8L11 24v-9H4l9-15zm-2 2V7.22L7.532 13H13v4.394L17.263 11z\"/>", width: 24, height: 24 },
|
||||
"git-pull-request": { body: "<path fill=\"currentColor\" d=\"M15 5h2a2 2 0 0 1 2 2v8.17a3.001 3.001 0 1 1-2 0V7h-2v3l-4.5-4L15 2zM5 8.83a3.001 3.001 0 1 1 2 0v6.34a3.001 3.001 0 1 1-2 0zM6 7a1 1 0 1 0 0-2a1 1 0 0 0 0 2m0 12a1 1 0 1 0 0-2a1 1 0 0 0 0 2m12 0a1 1 0 1 0 0-2a1 1 0 0 0 0 2\"/>", width: 24, height: 24 },
|
||||
message: { body: "<path fill=\"currentColor\" d=\"M6.455 19L2 22.5V4a1 1 0 0 1 1-1h18a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1zm-.692-2H20V5H4v13.385zM8 10h8v2H8z\"/>", width: 24, height: 24 },
|
||||
mail: { body: "<path fill=\"currentColor\" d=\"M3 3h18a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1m17 4.238l-7.928 7.1L4 7.216V19h16zM4.511 5l7.55 6.662L19.502 5z\"/>", width: 24, height: 24 },
|
||||
user: { body: "<path fill=\"currentColor\" d=\"M4 22a8 8 0 1 1 16 0h-2a6 6 0 0 0-12 0zm8-9c-3.315 0-6-2.685-6-6s2.685-6 6-6s6 2.685 6 6s-2.685 6-6 6m0-2c2.21 0 4-1.79 4-4s-1.79-4-4-4s-4 1.79-4 4s1.79 4 4 4\"/>", width: 24, height: 24 },
|
||||
info: { body: "<path fill=\"currentColor\" d=\"M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10s-4.477 10-10 10m0-2a8 8 0 1 0 0-16a8 8 0 0 0 0 16M11 7h2v2h-2zm0 4h2v6h-2z\"/>", width: 24, height: 24 },
|
||||
"help-circle": { body: "<path fill=\"currentColor\" d=\"M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10s-4.477 10-10 10m0-2a8 8 0 1 0 0-16a8 8 0 0 0 0 16m-1-5h2v2h-2zm2-1.645V14h-2v-1.5a1 1 0 0 1 1-1a1.5 1.5 0 1 0-1.471-1.794l-1.962-.393A3.501 3.501 0 1 1 13 13.355\"/>", width: 24, height: 24 },
|
||||
"alert-triangle": { body: "<path fill=\"currentColor\" d=\"m12.866 3l9.526 16.5a1 1 0 0 1-.866 1.5H2.474a1 1 0 0 1-.866-1.5L11.134 3a1 1 0 0 1 1.732 0m-8.66 16h15.588L12 5.5zM11 16h2v2h-2zm0-7h2v5h-2z\"/>", width: 24, height: 24 },
|
||||
clock: { body: "<path fill=\"currentColor\" d=\"M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10s-4.477 10-10 10m0-2a8 8 0 1 0 0-16a8 8 0 0 0 0 16m1-8h4v2h-6V7h2z\"/>", width: 24, height: 24 },
|
||||
sparkles: { body: "<path fill=\"currentColor\" d=\"M14 4.438A2.437 2.437 0 0 0 16.438 2h1.125A2.437 2.437 0 0 0 20 4.438v1.125A2.437 2.437 0 0 0 17.563 8h-1.125A2.437 2.437 0 0 0 14 5.563zM1 11a6 6 0 0 0 6-6h2a6 6 0 0 0 6 6v2a6 6 0 0 0-6 6H7a6 6 0 0 0-6-6zm3.876 1A8.04 8.04 0 0 1 8 15.124A8.04 8.04 0 0 1 11.124 12A8.04 8.04 0 0 1 8 8.876A8.04 8.04 0 0 1 4.876 12m12.374 2A3.25 3.25 0 0 1 14 17.25v1.5A3.25 3.25 0 0 1 17.25 22h1.5A3.25 3.25 0 0 1 22 18.75v-1.5A3.25 3.25 0 0 1 18.75 14z\"/>", width: 24, height: 24 },
|
||||
play: { body: "<path fill=\"currentColor\" d=\"M19.376 12.416L8.777 19.482A.5.5 0 0 1 8 19.066V4.934a.5.5 0 0 1 .777-.416l10.599 7.066a.5.5 0 0 1 0 .832\"/>", width: 24, height: 24 },
|
||||
stop: { body: "<path fill=\"currentColor\" d=\"M6 5h12a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1\"/>", width: 24, height: 24 },
|
||||
star: { body: "<path fill=\"currentColor\" d=\"m12 18.26l-7.053 3.948l1.575-7.928L.588 8.792l8.027-.952L12 .5l3.385 7.34l8.027.952l-5.934 5.488l1.575 7.928z\"/>", width: 24, height: 24 },
|
||||
"star-outline": { body: "<path fill=\"currentColor\" d=\"m12 18.26l-7.053 3.948l1.575-7.928L.588 8.792l8.027-.952L12 .5l3.385 7.34l8.027.952l-5.934 5.488l1.575 7.928zm0-2.292l4.247 2.377l-.948-4.773l3.573-3.305l-4.833-.573l-2.038-4.419l-2.039 4.42l-4.833.572l3.573 3.305l-.948 4.773z\"/>", width: 24, height: 24 },
|
||||
"dots-horizontal": { body: "<path fill=\"currentColor\" d=\"M4.5 10.5c-.825 0-1.5.675-1.5 1.5s.675 1.5 1.5 1.5S6 12.825 6 12s-.675-1.5-1.5-1.5m15 0c-.825 0-1.5.675-1.5 1.5s.675 1.5 1.5 1.5S21 12.825 21 12s-.675-1.5-1.5-1.5m-7.5 0c-.825 0-1.5.675-1.5 1.5s.675 1.5 1.5 1.5s1.5-.675 1.5-1.5s-.675-1.5-1.5-1.5\"/>", width: 24, height: 24 },
|
||||
};
|
||||
|
|
@ -14,16 +14,22 @@ describe('ICONS registry', () => {
|
|||
expect(def.body.toLowerCase(), `${name}`).not.toContain('<svg');
|
||||
}
|
||||
});
|
||||
|
||||
it('every entry is fill-based on a 24x24 grid (Remix)', () => {
|
||||
for (const [name, def] of Object.entries(ICONS)) {
|
||||
expect(def.fill, `${name} fill`).toBe(true);
|
||||
expect(def.viewBox, `${name} viewBox`).toBe('0 0 24 24');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('iconSvg', () => {
|
||||
it('renders a line icon with the registry defaults', () => {
|
||||
it('renders a Remix icon with the registry defaults', () => {
|
||||
const svg = iconSvg('plus');
|
||||
expect(svg.startsWith('<svg class="kw-icon"')).toBe(true);
|
||||
expect(svg).toContain('viewBox="0 0 16 16"');
|
||||
expect(svg).toContain('fill="none"');
|
||||
expect(svg).toContain('stroke="currentColor"');
|
||||
expect(svg).toContain('stroke-width="1.5"');
|
||||
expect(svg).toContain('viewBox="0 0 24 24"');
|
||||
expect(svg).toContain('fill="currentColor"');
|
||||
expect(svg).not.toContain('stroke=');
|
||||
expect(svg).toContain(ICONS.plus.body);
|
||||
});
|
||||
|
||||
|
|
@ -33,11 +39,7 @@ describe('iconSvg', () => {
|
|||
expect(iconSvg('plus', 'lg')).toContain('width="20" height="20"');
|
||||
});
|
||||
|
||||
it('keeps a custom viewBox for off-grid icons', () => {
|
||||
expect(iconSvg('settings')).toContain('viewBox="0 0 24 24"');
|
||||
});
|
||||
|
||||
it('renders filled icons with currentColor and no stroke', () => {
|
||||
it('renders a filled icon with currentColor and no stroke', () => {
|
||||
const svg = iconSvg('star');
|
||||
expect(svg).toContain('fill="currentColor"');
|
||||
expect(svg).not.toContain('stroke=');
|
||||
|
|
|
|||
|
|
@ -1,229 +1,57 @@
|
|||
// apps/kimi-web/src/lib/icons.ts
|
||||
// Single source of truth for apps/kimi-web line icons (design-system §02).
|
||||
// Single source of truth for apps/kimi-web icons (design-system §02).
|
||||
//
|
||||
// Icons are line glyphs: stroke="currentColor", stroke-width 1.5, round caps/joins,
|
||||
// no fill — colour follows text. Most sit on a 16x16 grid; a few keep a different
|
||||
// source grid (24x24 for settings / expand / collapse / panel-* / git-pull-request /
|
||||
// star-*, 12x12 for info, 20x20 for image-off / file-off). The rendered size is always
|
||||
// the token size, and the global `.kw-icon * { vector-effect: non-scaling-stroke }` rule
|
||||
// (style.css) keeps the 1.5px stroke visually identical across grids.
|
||||
// Icons come from Remix Icon (https://remixicon.com/, Apache-2.0). The per-icon
|
||||
// SVG data is generated into ./icon-data.ts by scripts/gen-icon-data.mjs — a
|
||||
// tree-shaken subset of @iconify-json/ri — so the registry is library-sourced,
|
||||
// offline, and only bundles the icons we actually use.
|
||||
//
|
||||
// Remix icons are fill-based (fill="currentColor") on a 24x24 source grid; the
|
||||
// rendered size is always the token size. Colour follows text.
|
||||
//
|
||||
// Two consumers share this registry:
|
||||
// - the <Icon> Vue component (components/ui/Icon.vue) for template use;
|
||||
// - iconSvg() below, for v-html contexts (e.g. lib/toolMeta.ts).
|
||||
|
||||
export type IconSize = 'sm' | 'md' | 'lg';
|
||||
import { iconToSVG } from '@iconify/utils';
|
||||
import { ICON_DATA, type IconData, type IconName } from './icon-data';
|
||||
|
||||
export interface IconDef {
|
||||
/** Inner SVG markup only — no outer <svg>, no stroke/fill attributes (the
|
||||
* renderer adds those). Mixed icons may override fill on individual shapes. */
|
||||
body: string;
|
||||
/** Source grid. Defaults to "0 0 16 16". */
|
||||
viewBox?: string;
|
||||
/** Solid icon (fill="currentColor", no stroke). Defaults to line style. */
|
||||
fill?: boolean;
|
||||
}
|
||||
export type { IconName } from './icon-data';
|
||||
export { NAME_TO_REMIX } from './icon-data';
|
||||
|
||||
export type IconSize = 'sm' | 'md' | 'lg';
|
||||
|
||||
export const SIZE_PX: Record<IconSize, number> = { sm: 14, md: 16, lg: 20 };
|
||||
|
||||
export const ICONS = {
|
||||
// --- Actions (16-grid, line) --------------------------------------------
|
||||
plus: { body: '<path d="M8 3v10M3 8h10"/>' },
|
||||
close: { body: '<path d="M4 4l8 8M12 4l-8 8"/>' },
|
||||
check: { body: '<path d="M3 8.5l3.5 3.5L13 4.5"/>' },
|
||||
search: { body: '<circle cx="7" cy="7" r="4.5"/><path d="m10.5 10.5 3 3"/>' },
|
||||
folder: {
|
||||
body: '<path d="M1 3.5V2.5A1 1 0 0 1 2 1.5h3.5l1.3 2h5.2a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1z"/><path d="M1 5.5h12"/>',
|
||||
},
|
||||
image: {
|
||||
body: '<rect x="2" y="3" width="12" height="10" rx="1.5"/><circle cx="5" cy="6" r="1.2"/><path d="M2 10.5l3-2.5L8 11l2.5-2L14 11"/>',
|
||||
},
|
||||
'chevron-down': { body: '<path d="M4 6l4 4 4-4"/>' },
|
||||
send: { body: '<path d="M8 3l6 5.5M8 3L2 8.5M8 3v10"/>' },
|
||||
sort: { body: '<path d="M3 4h10M3 8h7M3 12h4"/>' },
|
||||
grip: {
|
||||
body: '<circle cx="6" cy="4" r="1.2"/><circle cx="10" cy="4" r="1.2"/><circle cx="6" cy="8" r="1.2"/><circle cx="10" cy="8" r="1.2"/><circle cx="6" cy="12" r="1.2"/><circle cx="10" cy="12" r="1.2"/>',
|
||||
fill: true,
|
||||
},
|
||||
export interface IconDef {
|
||||
/** Inner SVG markup only — no outer <svg>. Remix icons are fill-based. */
|
||||
body: string;
|
||||
/** Source grid. Remix icons are "0 0 24 24". */
|
||||
viewBox?: string;
|
||||
/** Solid icon (fill="currentColor", no stroke). Always true for Remix. */
|
||||
fill?: boolean;
|
||||
}
|
||||
|
||||
// --- Tool glyphs (16-grid, line) ----------------------------------------
|
||||
'file-text': {
|
||||
body: '<rect x="2.5" y="1.5" width="9" height="13" rx="1"/><line x1="5" y1="5" x2="9" y2="5"/><line x1="5" y1="7.5" x2="11" y2="7.5"/><line x1="5" y1="10" x2="10" y2="10"/>',
|
||||
},
|
||||
terminal: {
|
||||
body: '<rect x="1.5" y="2.5" width="13" height="11" rx="1.5"/><polyline points="4,6 6.5,8 4,10"/><line x1="8" y1="10" x2="12" y2="10"/>',
|
||||
},
|
||||
pencil: {
|
||||
body: '<path d="M10.5 2.5l3 3-8 8H2.5v-3l8-8z"/><line x1="8.5" y1="4.5" x2="11.5" y2="7.5"/>',
|
||||
},
|
||||
'file-plus': {
|
||||
body: '<path d="M3 12V4.5L8 2l5 2.5V12H3z"/><line x1="6" y1="7" x2="10" y2="7"/><line x1="8" y1="5" x2="8" y2="9"/>',
|
||||
},
|
||||
glob: {
|
||||
body: '<path d="M5 2.5C3.5 2.5 3.5 5 3.5 6.5S2.5 8 2.5 8s1 0 1 1.5S3.5 13.5 5 13.5"/><path d="M11 2.5c1.5 0 1.5 2.5 1.5 4S13.5 8 13.5 8s-1 0-1 1.5.5 4-1.5 4"/><line x1="8" y1="6" x2="8" y2="10"/><line x1="6.3" y1="6.8" x2="9.7" y2="9.2"/><line x1="9.7" y1="6.8" x2="6.3" y2="9.2"/>',
|
||||
},
|
||||
globe: {
|
||||
body: '<circle cx="8" cy="8" r="6"/><path d="M8 2c-2 2-3 3.6-3 6s1 4 3 6"/><path d="M8 2c2 2 3 3.6 3 6s-1 4-3 6"/><line x1="2" y1="8" x2="14" y2="8"/>',
|
||||
},
|
||||
'check-list': {
|
||||
body: '<polyline points="2,4.5 3.5,6 5.5,3"/><polyline points="2,11 3.5,12.5 5.5,9.5"/><line x1="8" y1="4.5" x2="14" y2="4.5"/><line x1="8" y1="11" x2="14" y2="11"/>',
|
||||
},
|
||||
bolt: { body: '<path d="M8.5 1L3 9h4l-1.5 6 5.5-8h-4l1.5-6z"/>' },
|
||||
function viewBoxOf(d: IconData): string {
|
||||
return `0 0 ${d.width ?? 24} ${d.height ?? 24}`;
|
||||
}
|
||||
|
||||
// --- 24-grid line icons -------------------------------------------------
|
||||
'panel-collapse': {
|
||||
viewBox: '0 0 24 24',
|
||||
body: '<path d="M11 6h9"/><path d="M11 12h9"/><path d="M11 18h9"/><path d="M7 9l-3 3 3 3"/>',
|
||||
},
|
||||
settings: {
|
||||
viewBox: '0 0 24 24',
|
||||
body: '<circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l-.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09A1.65 1.65 0 0 0 15 4.6a1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09A1.65 1.65 0 0 0 19.4 15z"/>',
|
||||
},
|
||||
expand: {
|
||||
viewBox: '0 0 24 24',
|
||||
body: '<path d="M15 3h6v6"/><path d="M9 21H3v-6"/><path d="M21 3l-7 7"/><path d="M3 21l7-7"/>',
|
||||
},
|
||||
collapse: {
|
||||
viewBox: '0 0 24 24',
|
||||
body: '<path d="M4 14h6v6"/><path d="M20 10h-6V4"/><path d="M14 10l7-7"/><path d="M3 21l7-7"/>',
|
||||
},
|
||||
/** Back-compat registry view over the generated Remix data. */
|
||||
export const ICONS: Record<IconName, IconDef> = Object.fromEntries(
|
||||
(Object.entries(ICON_DATA) as [IconName, IconData][]).map(([name, d]) => [
|
||||
name,
|
||||
{ body: d.body, viewBox: viewBoxOf(d), fill: true },
|
||||
]),
|
||||
) as Record<IconName, IconDef>;
|
||||
|
||||
// --- Mixed / solid ------------------------------------------------------
|
||||
info: {
|
||||
viewBox: '0 0 12 12',
|
||||
body: '<circle cx="6" cy="6" r="5"/><line x1="6" y1="3.5" x2="6" y2="6.5"/><circle cx="6" cy="8.5" r="0.5" fill="currentColor"/>',
|
||||
},
|
||||
play: { body: '<path d="M5 3.5v9l7-4.5z"/>', fill: true },
|
||||
stop: { body: '<rect x="3" y="3" width="10" height="10" rx="1.5"/>', fill: true },
|
||||
star: {
|
||||
viewBox: '0 0 24 24',
|
||||
body: '<path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/>',
|
||||
fill: true,
|
||||
},
|
||||
|
||||
// --- More actions (16-grid, line) ---------------------------------------
|
||||
'log-in': {
|
||||
body: '<path d="M6 3h5a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2H6"/><path d="M9 8H2"/><path d="M5 5l3 3-3 3"/>',
|
||||
},
|
||||
message: {
|
||||
body: '<path d="M4 2.5h8a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2H8.5l-2.5 2V11.5H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2z"/>',
|
||||
},
|
||||
mail: {
|
||||
body: '<path d="M2 4l6 4 6-4"/><rect x="2" y="4" width="12" height="8" rx="1.5"/>',
|
||||
},
|
||||
code: {
|
||||
body: '<polyline points="5.5,5 2.5,8 5.5,11"/><polyline points="10.5,5 13.5,8 10.5,11"/>',
|
||||
},
|
||||
file: {
|
||||
body: '<path d="M4 1.5h5l3 3v10H4z"/><polyline points="9,1.5 9,4.5 12,4.5"/>',
|
||||
},
|
||||
copy: {
|
||||
body: '<rect x="3" y="3" width="9" height="9" rx="1.5"/><path d="M6 1h7a1 1 0 0 1 1 1v7"/>',
|
||||
},
|
||||
link: {
|
||||
body: '<path d="M6.5 9.5a3 3 0 0 0 4.2.3l2-2a3 3 0 0 0-4.2-4.2l-1 1"/><path d="M9.5 6.5a3 3 0 0 0-4.2-.3l-2 2a3 3 0 0 0 4.2 4.2l1-1"/>',
|
||||
},
|
||||
'external-link': {
|
||||
body: '<path d="M9.5 2.5h4v4"/><path d="M13.5 2.5 7.5 8.5"/><path d="M12 8.7V12a1.5 1.5 0 0 1-1.5 1.5H4A1.5 1.5 0 0 1 2.5 12V5.5A1.5 1.5 0 0 1 4 4h3.3"/>',
|
||||
},
|
||||
download: {
|
||||
body: '<path d="M8 2v8"/><path d="M4.5 6.5 8 10l3.5-3.5"/><path d="M2.5 13.5h11"/>',
|
||||
},
|
||||
undo: {
|
||||
body: '<path d="M6.5 2.5 3 6l3.5 3.5"/><path d="M3 6h6.5a3.8 3.8 0 1 1 0 7.6H7.5"/>',
|
||||
},
|
||||
clock: {
|
||||
body: '<circle cx="8" cy="8" r="5.5"/><path d="M8 4.5V8l2.5 1.5"/>',
|
||||
},
|
||||
sparkles: {
|
||||
body: '<path d="M8 2l1.5 4.5L14 8l-4.5 1.5L8 14l-1.5-4.5L2 8l4.5-1.5z"/>',
|
||||
},
|
||||
list: { body: '<path d="M2 4h12M2 8h12M2 12h8"/>' },
|
||||
user: {
|
||||
body: '<circle cx="8" cy="5" r="3"/><path d="M3 14c0-3 2.2-5 5-5s5 2 5 5"/>',
|
||||
},
|
||||
'folder-plus': {
|
||||
body: '<path d="M1 3.5V2.5A1 1 0 0 1 2 1.5h3.5l1.3 2h5.2a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1z"/><path d="M1 5.5h12"/><path d="M8 7.25v4.5M5.75 9.5h4.5"/>',
|
||||
},
|
||||
'folder-closed': {
|
||||
body: '<path d="M1.5 6V3.5a1 1 0 0 1 1-1h3.6l1.3 1.5h5.1a1 1 0 0 1 1 1v1"/><rect x="1.5" y="6" width="13" height="7" rx="1"/>',
|
||||
},
|
||||
|
||||
// --- Navigation & arrows (16-grid, line) --------------------------------
|
||||
'chevron-right': { body: '<path d="M6 4l4 4-4 4"/>' },
|
||||
'arrow-up': { body: '<path d="M8 12V4M4 7l4-3 4 3"/>' },
|
||||
'arrow-down': { body: '<path d="M8 4v8m0 0 3.5-3.5M8 12l-3.5-3.5"/>' },
|
||||
'arrow-right': { body: '<path d="M2 8h10"/><path d="M8 4l4 4-4 4"/>' },
|
||||
minus: { body: '<path d="M3 8h10"/>' },
|
||||
|
||||
// --- More 24-grid line icons --------------------------------------------
|
||||
'panel-expand': {
|
||||
viewBox: '0 0 24 24',
|
||||
body: '<path d="M4 6h9"/><path d="M4 12h9"/><path d="M4 18h9"/><path d="M17 9l3 3-3 3"/>',
|
||||
},
|
||||
'git-pull-request': {
|
||||
viewBox: '0 0 24 24',
|
||||
body: '<circle cx="5" cy="6" r="3"/><path d="M5 9v12"/><circle cx="19" cy="18" r="3"/><path d="m15 9-3-3 3-3"/><path d="M12 6h5a2 2 0 0 1 2 2v7"/>',
|
||||
},
|
||||
sliders: {
|
||||
viewBox: '0 0 24 24',
|
||||
body: '<line x1="4" y1="8" x2="20" y2="8"/><circle cx="10" cy="8" r="2.5" fill="currentColor"/><line x1="4" y1="16" x2="20" y2="16"/><circle cx="15" cy="16" r="2.5" fill="currentColor"/>',
|
||||
},
|
||||
'star-outline': {
|
||||
viewBox: '0 0 24 24',
|
||||
body: '<path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/>',
|
||||
},
|
||||
|
||||
|
||||
// --- Mixed / solid ------------------------------------------------------
|
||||
'alert-triangle': {
|
||||
body: '<path d="M8 2 14 13H2L8 2Z"/><path d="M8 6v3"/><circle cx="8" cy="11" r=".6" fill="currentColor"/>',
|
||||
},
|
||||
'help-circle': {
|
||||
body: '<circle cx="8" cy="8" r="6.5"/><path d="M6.2 6a1.8 1.8 0 0 1 3.5.6c0 1.2-1.7 1.4-1.7 2.6"/><circle cx="8" cy="11.5" r=".7" fill="currentColor"/>',
|
||||
},
|
||||
'dots-vertical': {
|
||||
body: '<circle cx="8" cy="3" r="1.3"/><circle cx="8" cy="8" r="1.3"/><circle cx="8" cy="13" r="1.3"/>',
|
||||
fill: true,
|
||||
},
|
||||
'dots-horizontal': {
|
||||
body: '<circle cx="3" cy="8" r="1.3"/><circle cx="8" cy="8" r="1.3"/><circle cx="13" cy="8" r="1.3"/>',
|
||||
fill: true,
|
||||
},
|
||||
'folder-solid': {
|
||||
body: '<path d="M1.5 3.5h3l1.5 2h7a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1v-8a1 1 0 0 1 1-1z"/>',
|
||||
fill: true,
|
||||
},
|
||||
|
||||
// --- Placeholders (20-grid, line) ---------------------------------------
|
||||
'image-off': {
|
||||
viewBox: '0 0 20 20',
|
||||
body: '<rect x="2" y="2" width="16" height="16" rx="2"/><path d="M7 10h6M10 7v6"/>',
|
||||
},
|
||||
'file-off': {
|
||||
viewBox: '0 0 20 20',
|
||||
body: '<path d="M5 3h7l4 4v10H5V3z"/><path d="M12 3v4h4"/>',
|
||||
},
|
||||
} as const satisfies Record<string, IconDef>;
|
||||
|
||||
export type IconName = keyof typeof ICONS;
|
||||
|
||||
const DEFAULT_VIEWBOX = '0 0 16 16';
|
||||
|
||||
/** Typed accessor: `ICONS[name]` is a narrow literal union (some entries lack
|
||||
* optional fields), so we widen to IconDef here — safe because the registry
|
||||
* is `satisfies Record<string, IconDef>`. */
|
||||
export function getIcon(name: IconName): IconDef {
|
||||
return ICONS[name] as IconDef;
|
||||
return ICONS[name];
|
||||
}
|
||||
|
||||
/** Render an icon to a full <svg> string for v-html contexts. Mirrors <Icon>. */
|
||||
export function iconSvg(name: IconName, size: IconSize = 'md'): string {
|
||||
const def = getIcon(name);
|
||||
const px = SIZE_PX[size];
|
||||
const viewBox = def.viewBox ?? DEFAULT_VIEWBOX;
|
||||
if (def.fill) {
|
||||
return `<svg class="kw-icon" width="${px}" height="${px}" viewBox="${viewBox}" fill="currentColor" aria-hidden="true" xmlns="http://www.w3.org/2000/svg">${def.body}</svg>`;
|
||||
}
|
||||
return `<svg class="kw-icon" width="${px}" height="${px}" viewBox="${viewBox}" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" xmlns="http://www.w3.org/2000/svg">${def.body}</svg>`;
|
||||
const svg = iconToSVG(ICON_DATA[name], { width: px, height: px });
|
||||
const viewBox = svg.attributes.viewBox;
|
||||
return `<svg class="kw-icon" width="${px}" height="${px}" viewBox="${viewBox}" fill="currentColor" aria-hidden="true" xmlns="http://www.w3.org/2000/svg">${svg.body}</svg>`;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -213,16 +213,13 @@ summary {
|
|||
|
||||
/* -- icon primitive (design-system §02) -------------------------------------
|
||||
Shared by the <Icon> component and iconSvg() v-html strings (lib/icons.ts).
|
||||
non-scaling-stroke keeps the 1.5px stroke identical whether an icon's source
|
||||
grid is 16, 24 or 12, so every icon renders at a uniform weight. */
|
||||
Icons are Remix Icon (fill="currentColor" on a 24x24 grid), so colour follows
|
||||
text and the rendered size comes from the width/height attributes. */
|
||||
.kw-icon {
|
||||
display: inline-block;
|
||||
flex: none;
|
||||
vertical-align: -0.15em;
|
||||
}
|
||||
.kw-icon > * {
|
||||
vector-effect: non-scaling-stroke;
|
||||
}
|
||||
|
||||
/* color-scheme drives UA-rendered parts (scrollbars, form controls, etc.).
|
||||
An explicit choice must pin it to a single value — otherwise a dark-mode
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@
|
|||
inherit (finalAttrs) pname version src pnpmWorkspaces;
|
||||
inherit pnpm;
|
||||
fetcherVersion = 3;
|
||||
hash = "sha256-o753txNKfBcn/fiJOWFU0lyrSqTUJ/GU1ed1DPVPZ2U=";
|
||||
hash = "sha256-+hTrX3pa8fjK+eh4q2BqOEAm9C7zvMXrKf4bwbJoG98=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
|
|
|
|||
28
pnpm-lock.yaml
generated
28
pnpm-lock.yaml
generated
|
|
@ -172,6 +172,15 @@ importers:
|
|||
'@fontsource-variable/jetbrains-mono':
|
||||
specifier: ^5.2.8
|
||||
version: 5.2.8
|
||||
'@iconify-json/ri':
|
||||
specifier: ^1.2.10
|
||||
version: 1.2.10
|
||||
'@iconify/utils':
|
||||
specifier: ^3.1.3
|
||||
version: 3.1.3
|
||||
'@iconify/vue':
|
||||
specifier: ^5.0.1
|
||||
version: 5.0.1(vue@3.5.35(typescript@6.0.2))
|
||||
'@xterm/addon-fit':
|
||||
specifier: ^0.11.0
|
||||
version: 0.11.0
|
||||
|
|
@ -1608,6 +1617,9 @@ packages:
|
|||
peerDependencies:
|
||||
hono: ^4
|
||||
|
||||
'@iconify-json/ri@1.2.10':
|
||||
resolution: {integrity: sha512-WWMhoncVVM+Xmu9T5fgu2lhYRrKTEWhKk3Com0KiM111EeEsRLiASjpsFKnC/SrB6covhUp95r2mH8tGxhgd5Q==}
|
||||
|
||||
'@iconify-json/simple-icons@1.2.84':
|
||||
resolution: {integrity: sha512-v4JVu6xIewGoETD4mm2k6UAdFAbTlY1duw5ZNSxYORfs2yFsHDhoU9Omn/BgrV0nR/ptWkF3ZIr/ZHoYXI/6Jw==}
|
||||
|
||||
|
|
@ -1617,6 +1629,11 @@ packages:
|
|||
'@iconify/utils@3.1.3':
|
||||
resolution: {integrity: sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw==}
|
||||
|
||||
'@iconify/vue@5.0.1':
|
||||
resolution: {integrity: sha512-aumwwooJlFJ5H5qYWB6ZTAyM0C8hpfcSVLB9/a3qnH1GGvIJ+FEbpEs4s/HfErYe/M5qZeLjwmESR5fFm3lXEw==}
|
||||
peerDependencies:
|
||||
vue: '>=3.0.0'
|
||||
|
||||
'@inquirer/external-editor@1.0.3':
|
||||
resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==}
|
||||
engines: {node: '>=18'}
|
||||
|
|
@ -8477,6 +8494,10 @@ snapshots:
|
|||
dependencies:
|
||||
hono: 4.12.14
|
||||
|
||||
'@iconify-json/ri@1.2.10':
|
||||
dependencies:
|
||||
'@iconify/types': 2.0.0
|
||||
|
||||
'@iconify-json/simple-icons@1.2.84':
|
||||
dependencies:
|
||||
'@iconify/types': 2.0.0
|
||||
|
|
@ -8489,6 +8510,11 @@ snapshots:
|
|||
'@iconify/types': 2.0.0
|
||||
import-meta-resolve: 4.2.0
|
||||
|
||||
'@iconify/vue@5.0.1(vue@3.5.35(typescript@6.0.2))':
|
||||
dependencies:
|
||||
'@iconify/types': 2.0.0
|
||||
vue: 3.5.35(typescript@6.0.2)
|
||||
|
||||
'@inquirer/external-editor@1.0.3(@types/node@22.19.17)':
|
||||
dependencies:
|
||||
chardet: 2.1.1
|
||||
|
|
@ -9877,7 +9903,7 @@ snapshots:
|
|||
obug: 2.1.1
|
||||
std-env: 4.0.0
|
||||
tinyrainbow: 3.1.0
|
||||
vitest: 4.1.4(@types/node@22.19.17)(@vitest/coverage-v8@4.1.4)(jsdom@25.0.1)(vite@8.0.8(@types/node@22.19.17)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
vitest: 4.1.4(@types/node@22.19.17)(@vitest/coverage-v8@4.1.4)(jsdom@25.0.1)(vite@6.4.2(@types/node@22.19.17)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3))
|
||||
|
||||
'@vitest/expect@4.1.4':
|
||||
dependencies:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue