feat: chat integration, tenant admin spec, backend chat service, miniprogram updates, DEMO moved to tmp, XCX-TEST removed, migrations & docs

This commit is contained in:
Neo
2026-03-20 09:02:10 +08:00
parent 3d2e5f8165
commit beb88d5bea
388 changed files with 6436 additions and 25458 deletions

View File

@@ -0,0 +1,13 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<!-- 白色填充版机器人(用于 ai-inline-icon 渐变背景上) -->
<rect x="5" y="7" width="14" height="12" rx="4" fill="white"/>
<path d="M12 7V4" stroke="white" stroke-width="2" stroke-linecap="round"/>
<circle cx="12" cy="3" r="1.5" fill="white"/>
<circle cx="9" cy="11.5" r="2" fill="white" opacity="0.5"/>
<circle cx="15" cy="11.5" r="2" fill="white" opacity="0.5"/>
<circle cx="9.5" cy="11" r="0.7" fill="white"/>
<circle cx="15.5" cy="11" r="0.7" fill="white"/>
<path d="M9.5 15C10 16 14 16 14.5 15" stroke="white" stroke-width="1.5" stroke-linecap="round" opacity="0.7"/>
<rect x="3" y="10" width="2" height="4" rx="1" fill="white"/>
<rect x="19" y="10" width="2" height="4" rx="1" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 840 B

View File

@@ -0,0 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none">
<!-- AI 机器人 title badge icon — indigo 配色,用于标题徽章 -->
<!-- 对齐 H5 ai-icons.css .ai-title-badge-icon, 默认 indigo: #667eea → #a78bfa -->
<rect x="5" y="7" width="14" height="12" rx="4" fill="white" stroke="currentColor" stroke-width="0.8"/>
<path d="M12 7V4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
<circle cx="12" cy="3" r="1.5" fill="white" stroke="currentColor" stroke-width="0.7"/>
<circle cx="9" cy="11.5" r="2" fill="#667eea"/>
<circle cx="15" cy="11.5" r="2" fill="#667eea"/>
<circle cx="9.5" cy="11" r="0.7" fill="white"/>
<circle cx="15.5" cy="11" r="0.7" fill="white"/>
<path d="M9.5 15C10 16 14 16 14.5 15" stroke="#667eea" stroke-width="1.5" stroke-linecap="round"/>
<circle cx="7" cy="13.5" r="1" fill="#f5a0c0" opacity="0.6"/>
<circle cx="17" cy="13.5" r="1" fill="#f5a0c0" opacity="0.6"/>
<rect x="3" y="10" width="2" height="4" rx="1" fill="white" stroke="currentColor" stroke-width="0.7"/>
<rect x="19" y="10" width="2" height="4" rx="1" fill="white" stroke="currentColor" stroke-width="0.7"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#4b4b4b" stroke-width="2">
<polyline points="15 18 9 12 15 6"/>
</svg>

After

Width:  |  Height:  |  Size: 153 B

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#00a870">
<path d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"/>
</svg>

After

Width:  |  Height:  |  Size: 294 B

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#a6a6a6">
<path d="M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z"/>
</svg>

After

Width:  |  Height:  |  Size: 185 B

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#ed7b2f">
<path d="M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z"/>
</svg>

After

Width:  |  Height:  |  Size: 185 B

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="3">
<polyline points="20 6 9 17 4 12"/>
</svg>

After

Width:  |  Height:  |  Size: 150 B

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="white">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/>
</svg>

After

Width:  |  Height:  |  Size: 213 B

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2">
<circle cx="12" cy="12" r="10"/>
<polyline points="12 6 12 12 16 14"/>
</svg>

After

Width:  |  Height:  |  Size: 187 B

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2">
<circle cx="12" cy="12" r="10"/>
<line x1="4.93" y1="4.93" x2="19.07" y2="19.07"/>
</svg>

After

Width:  |  Height:  |  Size: 199 B

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#a6a6a6">
<path d="M11 18h2v-2h-2v2zm1-16C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4z"/>
</svg>

After

Width:  |  Height:  |  Size: 341 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 B

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#0052d9">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/>
</svg>

After

Width:  |  Height:  |  Size: 194 B

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#e34d59">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"/>
</svg>

After

Width:  |  Height:  |  Size: 194 B

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#ed7b2f">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"/>
</svg>

After

Width:  |  Height:  |  Size: 194 B

View File

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#5e5e5e" stroke-width="2">
<path d="M9 21H5a2 2 0 01-2-2V5a2 2 0 012-2h4"/>
<polyline points="16 17 21 12 16 7"/>
<line x1="21" y1="12" x2="9" y2="12"/>
</svg>

After

Width:  |  Height:  |  Size: 246 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 B

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#0052d9">
<path d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"/>
</svg>

After

Width:  |  Height:  |  Size: 238 B

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="white">
<path d="M8.691 2.188C3.891 2.188 0 5.476 0 9.53c0 2.212 1.17 4.203 3.002 5.55a.59.59 0 0 1 .213.665l-.39 1.48c-.019.07-.048.141-.048.213 0 .163.13.295.29.295a.32.32 0 0 0 .165-.054l1.9-1.106a.96.96 0 0 1 .465-.116.94.94 0 0 1 .272.04 10.6 10.6 0 0 0 2.822.384c.136 0 .271-.002.405-.009a6.9 6.9 0 0 1-.315-2.053c0-3.694 3.614-6.69 8.076-6.69.233 0 .463.01.691.027C16.964 4.837 13.132 2.188 8.691 2.188zm-2.97 5.28a1.03 1.03 0 1 1 0-2.06 1.03 1.03 0 0 1 0 2.06zm5.96 0a1.03 1.03 0 1 1 0-2.06 1.03 1.03 0 0 1 0 2.06zM24 14.2c0-3.355-3.4-6.08-7.59-6.08s-7.59 2.725-7.59 6.08c0 3.356 3.4 6.08 7.59 6.08.772 0 1.515-.094 2.215-.268a.77.77 0 0 1 .224-.033.79.79 0 0 1 .382.095l1.565.912a.26.26 0 0 0 .135.044c.13 0 .238-.108.238-.242 0-.06-.024-.117-.04-.175l-.32-1.218a.48.48 0 0 1 .175-.547C22.95 17.89 24 16.165 24 14.2zm-10.14-.426a.85.85 0 1 1 0-1.7.85.85 0 0 1 0 1.7zm5.1 0a.85.85 0 1 1 0-1.7.85.85 0 0 1 0 1.7z"/>
</svg>

After

Width:  |  Height:  |  Size: 998 B

View File

@@ -0,0 +1,28 @@
<svg width="30" height="30" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<!-- ????? - ???? + ????? -->
<rect x="5" y="7" width="14" height="12" rx="4" fill="white" stroke="#1e3a5f" stroke-width="1.8" stroke-opacity="0.5"/>
<!-- ?? - ?? + ????? -->
<path d="M12 7V4" stroke="white" stroke-width="2.8" stroke-linecap="round"/>
<path d="M12 7V4" stroke="#1e3a5f" stroke-width="1.4" stroke-linecap="round" stroke-opacity="0.5"/>
<circle cx="12" cy="3" r="1.5" fill="white" stroke="#1e3a5f" stroke-width="1.2" stroke-opacity="0.5"/>
<!-- ?? -->
<circle cx="9" cy="11.5" r="2" fill="#667eea"/>
<circle cx="15" cy="11.5" r="2" fill="#667eea"/>
<!-- ???? -->
<circle cx="9.5" cy="11" r="0.7" fill="white"/>
<circle cx="15.5" cy="11" r="0.7" fill="white"/>
<!-- ???? -->
<path d="M9.5 15C10 16 14 16 14.5 15" stroke="#667eea" stroke-width="1.5" stroke-linecap="round"/>
<!-- ?? -->
<circle cx="7" cy="13.5" r="1" fill="#f5a0c0" opacity="0.5"/>
<circle cx="17" cy="13.5" r="1" fill="#f5a0c0" opacity="0.5"/>
<!-- ?? - ?? + ????? -->
<rect x="3" y="10" width="2" height="4" rx="1" fill="white" stroke="#1e3a5f" stroke-width="1.2" stroke-opacity="0.5"/>
<rect x="19" y="10" width="2" height="4" rx="1" fill="white" stroke="#1e3a5f" stroke-width="1.2" stroke-opacity="0.5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none">
<!-- AI 机器人 inline icon — 白色版,用于深色背景行首 -->
<!-- 对齐 H5 task-list 中内联 SVG 结构 -->
<rect x="5" y="7" width="14" height="12" rx="4" fill="white"/>
<path d="M12 7V4" stroke="white" stroke-width="2" stroke-linecap="round"/>
<circle cx="12" cy="3" r="1.5" fill="white"/>
<circle cx="9" cy="11.5" r="2" fill="#667eea"/>
<circle cx="15" cy="11.5" r="2" fill="#667eea"/>
<circle cx="9.5" cy="11" r="0.7" fill="white"/>
<circle cx="15.5" cy="11" r="0.7" fill="white"/>
<path d="M9.5 15C10 16 14 16 14.5 15" stroke="#667eea" stroke-width="1.5" stroke-linecap="round"/>
<circle cx="7" cy="13.5" r="1" fill="#f5a0c0" opacity="0.6"/>
<circle cx="17" cy="13.5" r="1" fill="#f5a0c0" opacity="0.6"/>
<rect x="3" y="10" width="2" height="4" rx="1" fill="white"/>
<rect x="19" y="10" width="2" height="4" rx="1" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 983 B

View File

@@ -0,0 +1,21 @@
<svg width="30" height="30" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<!-- 机器人头部 -->
<rect x="5" y="7" width="14" height="12" rx="4" fill="white"/>
<!-- 天线 -->
<path d="M12 7V4" stroke="white" stroke-width="2" stroke-linecap="round"/>
<circle cx="12" cy="3" r="1.5" fill="white"/>
<!-- 眼睛 -->
<circle cx="9" cy="11.5" r="2" fill="#667eea"/>
<circle cx="15" cy="11.5" r="2" fill="#667eea"/>
<!-- 眼睛高光 -->
<circle cx="9.5" cy="11" r="0.7" fill="white"/>
<circle cx="15.5" cy="11" r="0.7" fill="white"/>
<!-- 微笑嘴巴 -->
<path d="M9.5 15C10 16 14 16 14.5 15" stroke="#667eea" stroke-width="1.5" stroke-linecap="round"/>
<!-- 腮红 -->
<circle cx="7" cy="13.5" r="1" fill="#f5a0c0" opacity="0.6"/>
<circle cx="17" cy="13.5" r="1" fill="#f5a0c0" opacity="0.6"/>
<!-- 耳朵 -->
<rect x="3" y="10" width="2" height="4" rx="1" fill="white"/>
<rect x="19" y="10" width="2" height="4" rx="1" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1001 B

View File

@@ -0,0 +1,18 @@
<!-- 黑色台球 - 大号8 -->
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<defs>
<radialGradient id="ballGradient" cx="35%" cy="35%">
<stop offset="0%" style="stop-color:#3a3a3a;stop-opacity:1" />
<stop offset="70%" style="stop-color:#1f2937;stop-opacity:1" />
<stop offset="100%" style="stop-color:#0f0f0f;stop-opacity:1" />
</radialGradient>
</defs>
<!-- 球体 -->
<circle cx="24" cy="24" r="18" fill="url(#ballGradient)"/>
<!-- 高光 -->
<ellipse cx="18" cy="16" rx="6" ry="4" fill="white" opacity="0.3"/>
<!-- 白色圆圈 -->
<circle cx="24" cy="24" r="8" fill="white"/>
<!-- 数字8 -->
<text x="24" y="29" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#1f2937" text-anchor="middle">8</text>
</svg>

After

Width:  |  Height:  |  Size: 833 B

View File

@@ -0,0 +1,18 @@
<!-- 灰色台球 - 大号8 -->
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<defs>
<radialGradient id="ballGrayGradient" cx="35%" cy="35%">
<stop offset="0%" style="stop-color:#d0d0d0;stop-opacity:1" />
<stop offset="70%" style="stop-color:#c5c5c5;stop-opacity:1" />
<stop offset="100%" style="stop-color:#a6a6a6;stop-opacity:1" />
</radialGradient>
</defs>
<!-- 球体 -->
<circle cx="24" cy="24" r="18" fill="url(#ballGrayGradient)" opacity="0.5"/>
<!-- 高光 -->
<ellipse cx="18" cy="16" rx="6" ry="4" fill="white" opacity="0.3"/>
<!-- 白色圆圈 -->
<circle cx="24" cy="24" r="8" fill="white" opacity="0.6"/>
<!-- 数字8 -->
<text x="24" y="29" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#a6a6a6" text-anchor="middle" opacity="0.6">8</text>
</svg>

After

Width:  |  Height:  |  Size: 883 B

View File

@@ -0,0 +1,97 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80" fill="none">
<defs>
<!-- 主背景渐变:橙色 -->
<linearGradient id="ag" x1="0" y1="0" x2="80" y2="80" gradientUnits="userSpaceOnUse">
<stop offset="0%" stop-color="#ffab5e"/>
<stop offset="100%" stop-color="#e05a00"/>
</linearGradient>
<!-- 头部面板渐变 -->
<linearGradient id="head" x1="20" y1="26" x2="60" y2="66" gradientUnits="userSpaceOnUse">
<stop offset="0%" stop-color="#fff3e0"/>
<stop offset="100%" stop-color="#ffe0b2"/>
</linearGradient>
<!-- 眼睛渐变 -->
<linearGradient id="eye" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#ff8c42"/>
<stop offset="100%" stop-color="#c94f00"/>
</linearGradient>
<!-- 口部渐变 -->
<linearGradient id="mouth" x1="0" y1="0" x2="1" y2="0">
<stop offset="0%" stop-color="#ff8c42"/>
<stop offset="100%" stop-color="#e05a00"/>
</linearGradient>
<!-- 投影 -->
<filter id="as" x="-20%" y="-20%" width="140%" height="140%">
<feDropShadow dx="0" dy="3" stdDeviation="3" flood-color="#c94f00" flood-opacity="0.32"/>
</filter>
<!-- 头部光泽 -->
<filter id="hs" x="-10%" y="-10%" width="120%" height="120%">
<feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#ffab5e" flood-opacity="0.5"/>
</filter>
<!-- 眼睛外发光 -->
<filter id="eyeglow" x="-60%" y="-60%" width="220%" height="220%">
<feGaussianBlur stdDeviation="1.5" result="blur"/>
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
<!-- 天线发光 -->
<filter id="antglow" x="-80%" y="-80%" width="360%" height="360%">
<feGaussianBlur stdDeviation="2" result="blur"/>
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
</defs>
<!-- ── 外层背景圆角面板 ── -->
<rect x="8" y="8" width="64" height="64" rx="18" fill="url(#ag)" filter="url(#as)"/>
<!-- ── 顶部高光条 ── -->
<rect x="8" y="8" width="64" height="22" rx="18" fill="white" opacity="0.10"/>
<!-- ── 天线(高对比度,纯白单杆,辨识度优先) ── -->
<line x1="40" y1="23" x2="40" y2="10" stroke="white" stroke-width="5" stroke-linecap="round"/>
<!-- 天线球:白色大球 + 橙色芯 + 高光 -->
<circle cx="40" cy="7" r="6" fill="white"/>
<circle cx="40" cy="7" r="3.2" fill="#ff8c42"/>
<circle cx="38.8" cy="5.8" r="1.1" fill="white" opacity="0.9"/>
<!-- ── 机器人头部主体 ── -->
<rect x="18" y="24" width="44" height="36" rx="10" fill="url(#head)" filter="url(#hs)"/>
<!-- 头部顶部高光线 -->
<rect x="24" y="25" width="32" height="3" rx="1.5" fill="white" opacity="0.55"/>
<!-- ── 耳朵(只保留外轮廓三面,内侧开口贴合头部无边界线) ── -->
<!-- 左耳:填充先铺,再用外轮廓 path 三面描边(左/上/下弧),右侧开口不画线 -->
<rect x="11" y="33" width="8" height="14" rx="4" fill="#ffd4a8"/>
<!-- 用头部同色覆盖右侧接缝描边区域 -->
<rect x="17" y="33" width="3" height="14" fill="#ffd4a8"/>
<path d="M19 33 Q11 33 11 37 L11 43 Q11 47 19 47" stroke="#ffab5e" stroke-width="1.8" fill="none" stroke-linecap="round"/>
<!-- 右耳:同理,左侧开口不画线 -->
<rect x="61" y="33" width="8" height="14" rx="4" fill="#ffd4a8"/>
<rect x="61" y="33" width="3" height="14" fill="#ffd4a8"/>
<path d="M61 33 Q69 33 69 37 L69 43 Q69 47 61 47" stroke="#ffab5e" stroke-width="1.8" fill="none" stroke-linecap="round"/>
<!-- ── 眼睛(渐变 + 双高光 + 发光) ── -->
<!-- 左眼 -->
<circle cx="31" cy="37" r="5.5" fill="url(#eye)" filter="url(#eyeglow)"/>
<circle cx="31" cy="37" r="4.5" fill="url(#eye)"/>
<circle cx="29.5" cy="35.5" r="1.6" fill="white" opacity="0.9"/>
<circle cx="33" cy="38.5" r="0.8" fill="white" opacity="0.5"/>
<!-- 右眼 -->
<circle cx="49" cy="37" r="5.5" fill="url(#eye)" filter="url(#eyeglow)"/>
<circle cx="49" cy="37" r="4.5" fill="url(#eye)"/>
<circle cx="47.5" cy="35.5" r="1.6" fill="white" opacity="0.9"/>
<circle cx="51" cy="38.5" r="0.8" fill="white" opacity="0.5"/>
<!-- ── 腮红(红色系,更明显) ── -->
<ellipse cx="23.5" cy="46" rx="5" ry="3.2" fill="#f4756a" opacity="0.65"/>
<ellipse cx="56.5" cy="46" rx="5" ry="3.2" fill="#f4756a" opacity="0.65"/>
<!-- ── 微笑嘴巴 ── -->
<path d="M30 49 Q40 56 50 49" stroke="url(#mouth)" stroke-width="2.2" stroke-linecap="round" fill="none"/>
<path d="M34 50.5 Q40 55 46 50.5" fill="white" opacity="0.55"/>
<!-- ── 右上角单颗星形闪光 ── -->
<path d="M65 13 L66.2 16 L69.5 16 L67 18 L68 21 L65 19.2 L62 21 L63 18 L60.5 16 L63.8 16 Z"
fill="#fff3e0" opacity="0.65"/>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@@ -0,0 +1,40 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80" fill="none">
<defs>
<linearGradient id="bg" x1="0" y1="0" x2="80" y2="80" gradientUnits="userSpaceOnUse">
<stop offset="0%" stop-color="#00c896"/>
<stop offset="100%" stop-color="#008c6a"/>
</linearGradient>
<linearGradient id="bar1" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#6fffd4"/>
<stop offset="100%" stop-color="#00c896"/>
</linearGradient>
<linearGradient id="bar2" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#fff" stop-opacity="0.9"/>
<stop offset="100%" stop-color="#a0ffe0"/>
</linearGradient>
<linearGradient id="bar3" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#6fffd4"/>
<stop offset="100%" stop-color="#00a870"/>
</linearGradient>
<filter id="bs" x="-20%" y="-20%" width="140%" height="140%">
<feDropShadow dx="0" dy="3" stdDeviation="3" flood-color="#008c6a" flood-opacity="0.35"/>
</filter>
</defs>
<!-- background panel -->
<rect x="10" y="10" width="60" height="60" rx="14" fill="url(#bg)" filter="url(#bs)"/>
<!-- grid lines -->
<line x1="18" y1="55" x2="62" y2="55" stroke="white" stroke-opacity="0.2" stroke-width="1"/>
<line x1="18" y1="45" x2="62" y2="45" stroke="white" stroke-opacity="0.15" stroke-width="1"/>
<line x1="18" y1="35" x2="62" y2="35" stroke="white" stroke-opacity="0.1" stroke-width="1"/>
<!-- bars -->
<rect x="20" y="38" width="10" height="17" rx="3" fill="url(#bar2)" opacity="0.85"/>
<rect x="34" y="28" width="10" height="27" rx="3" fill="white" opacity="0.95"/>
<rect x="48" y="33" width="10" height="22" rx="3" fill="url(#bar2)" opacity="0.85"/>
<!-- trend line -->
<polyline points="25,37 39,25 53,30" stroke="#ffffcc" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none" opacity="0.7"/>
<circle cx="25" cy="37" r="2.5" fill="#fff" opacity="0.9"/>
<circle cx="39" cy="25" r="2.5" fill="#fff" opacity="0.9"/>
<circle cx="53" cy="30" r="2.5" fill="#fff" opacity="0.9"/>
<!-- bottom axis -->
<line x1="18" y1="57" x2="62" y2="57" stroke="white" stroke-opacity="0.4" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,28 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80" fill="none">
<defs>
<linearGradient id="tg" x1="0" y1="0" x2="80" y2="80" gradientUnits="userSpaceOnUse">
<stop offset="0%" stop-color="#4f8ef7"/>
<stop offset="100%" stop-color="#1a5fd8"/>
</linearGradient>
<linearGradient id="tg2" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#7ab4ff"/>
<stop offset="100%" stop-color="#4f8ef7"/>
</linearGradient>
<filter id="ts" x="-20%" y="-20%" width="140%" height="140%">
<feDropShadow dx="0" dy="3" stdDeviation="3" flood-color="#1a5fd8" flood-opacity="0.35"/>
</filter>
</defs>
<!-- clipboard body -->
<rect x="16" y="14" width="48" height="56" rx="8" fill="url(#tg)" filter="url(#ts)"/>
<!-- clip top tab -->
<rect x="28" y="10" width="24" height="12" rx="6" fill="#7ab4ff"/>
<!-- white card shine -->
<rect x="22" y="28" width="36" height="5" rx="2.5" fill="white" opacity="0.9"/>
<rect x="22" y="38" width="28" height="4" rx="2" fill="white" opacity="0.6"/>
<rect x="22" y="47" width="32" height="4" rx="2" fill="white" opacity="0.6"/>
<rect x="22" y="56" width="20" height="4" rx="2" fill="white" opacity="0.4"/>
<!-- check circle -->
<circle cx="60" cy="58" r="12" fill="#fff" opacity="0.15"/>
<circle cx="60" cy="58" r="9" fill="#e8f1ff" stroke="#7ab4ff" stroke-width="1.5"/>
<polyline points="55.5,58 58.5,61 64.5,55" stroke="#1a5fd8" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,11 @@
<!-- 空心爱心 - 华丽版 -->
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="heartStroke" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#ff6b9d;stop-opacity:1" />
<stop offset="50%" style="stop-color:#e34d59;stop-opacity:1" />
<stop offset="100%" style="stop-color:#c9184a;stop-opacity:1" />
</linearGradient>
</defs>
<path d="M24 42L20.55 38.85C11.4 30.48 5.25 24.87 5.25 18C5.25 12.39 9.39 8.25 15 8.25C18.09 8.25 21.06 9.69 23.25 12C25.44 9.69 28.41 8.25 31.5 8.25C37.11 8.25 41.25 12.39 41.25 18C41.25 24.87 35.1 30.48 25.95 38.85L24 42Z" stroke="url(#heartStroke)" stroke-width="2.5" fill="none"/>
</svg>

After

Width:  |  Height:  |  Size: 749 B

View File

@@ -0,0 +1,22 @@
<!-- 实心爱心 - 华丽版 -->
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<!-- 外发光 -->
<defs>
<filter id="glow">
<feGaussianBlur stdDeviation="2" result="coloredBlur"/>
<feMerge>
<feMergeNode in="coloredBlur"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
<linearGradient id="heartGradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#ff6b9d;stop-opacity:1" />
<stop offset="50%" style="stop-color:#e34d59;stop-opacity:1" />
<stop offset="100%" style="stop-color:#c9184a;stop-opacity:1" />
</linearGradient>
</defs>
<!-- 主体爱心 -->
<path d="M24 42L20.55 38.85C11.4 30.48 5.25 24.87 5.25 18C5.25 12.39 9.39 8.25 15 8.25C18.09 8.25 21.06 9.69 23.25 12C25.44 9.69 28.41 8.25 31.5 8.25C37.11 8.25 41.25 12.39 41.25 18C41.25 24.87 35.1 30.48 25.95 38.85L24 42Z" fill="url(#heartGradient)" filter="url(#glow)"/>
<!-- 高光 -->
<path d="M15 8.25C12.5 8.25 10.3 9.2 8.8 10.8C10.5 9.5 12.6 8.8 15 8.8C17.5 8.8 19.8 9.8 21.5 11.5C20 9.5 17.7 8.25 15 8.25Z" fill="white" opacity="0.4"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2">
<circle cx="12" cy="12" r="10"/>
<polyline points="12 6 12 12 16 14"/>
</svg>

After

Width:  |  Height:  |  Size: 187 B

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2">
<circle cx="12" cy="12" r="10"/>
<line x1="4.93" y1="4.93" x2="19.07" y2="19.07"/>
</svg>

After

Width:  |  Height:  |  Size: 199 B

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="white">
<path d="M8.691 2.188C3.891 2.188 0 5.476 0 9.53c0 2.212 1.17 4.203 3.002 5.55a.59.59 0 0 1 .213.665l-.39 1.48c-.019.07-.048.141-.048.213 0 .163.13.295.29.295a.32.32 0 0 0 .165-.054l1.9-1.106a.96.96 0 0 1 .465-.116.94.94 0 0 1 .272.04 10.6 10.6 0 0 0 2.822.384c.136 0 .271-.002.405-.009a6.9 6.9 0 0 1-.315-2.053c0-3.694 3.614-6.69 8.076-6.69.233 0 .463.01.691.027C16.964 4.837 13.132 2.188 8.691 2.188zm-2.97 5.28a1.03 1.03 0 1 1 0-2.06 1.03 1.03 0 0 1 0 2.06zm5.96 0a1.03 1.03 0 1 1 0-2.06 1.03 1.03 0 0 1 0 2.06zM24 14.2c0-3.355-3.4-6.08-7.59-6.08s-7.59 2.725-7.59 6.08c0 3.356 3.4 6.08 7.59 6.08.772 0 1.515-.094 2.215-.268a.77.77 0 0 1 .224-.033.79.79 0 0 1 .382.095l1.565.912a.26.26 0 0 0 .135.044c.13 0 .238-.108.238-.242 0-.06-.024-.117-.04-.175l-.32-1.218a.48.48 0 0 1 .175-.547C22.95 17.89 24 16.165 24 14.2zm-10.14-.426a.85.85 0 1 1 0-1.7.85.85 0 0 1 0 1.7zm5.1 0a.85.85 0 1 1 0-1.7.85.85 0 0 1 0 1.7z"/>
</svg>

After

Width:  |  Height:  |  Size: 998 B

View File

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="white">
<circle cx="12" cy="12" r="10" fill="white" opacity="0.3"/>
<circle cx="12" cy="12" r="6" fill="white"/>
<circle cx="12" cy="12" r="2" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 237 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36" fill="none"><path d="M6 9a3 3 0 013-3h14a3 3 0 013 3v11a3 3 0 01-3 3h-5l-5 4v-4H9a3 3 0 01-3-3V9z" stroke="#00a870" stroke-width="2" fill="none"/><path d="M10.5 12.5h11" stroke="#00a870" stroke-width="1.6" stroke-linecap="round" opacity="0.6"/><path d="M10.5 16h7" stroke="#00a870" stroke-width="1.6" stroke-linecap="round" opacity="0.6"/><path d="M27 5l1 2.5 2.5 1-2.5 1L27 12l-1-2.5L23.5 8.5l2.5-1L27 5z" fill="#00a870"/></svg>

After

Width:  |  Height:  |  Size: 513 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36" fill="none"><path d="M12.5 10.5A11 11 0 1023.5 10.5" stroke="#e34d59" stroke-width="2.2" stroke-linecap="round" fill="none"/><path d="M18 7v10" stroke="#e34d59" stroke-width="2.4" stroke-linecap="round"/><circle cx="18" cy="23" r="2" fill="#e34d59" opacity="0.25"/></svg>

After

Width:  |  Height:  |  Size: 355 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36" fill="none"><rect x="6" y="8" width="18" height="22" rx="3" stroke="#0052d9" stroke-width="2" fill="none"/><path d="M10 14h10" stroke="#0052d9" stroke-width="1.8" stroke-linecap="round"/><path d="M10 18h10" stroke="#0052d9" stroke-width="1.8" stroke-linecap="round"/><path d="M10 22h6" stroke="#0052d9" stroke-width="1.8" stroke-linecap="round"/><path d="M22 6l4 4-9 9-5 1 1-5 9-9z" fill="#0052d9" opacity="0.9"/><path d="M22 6l4 4" stroke="white" stroke-width="1" opacity="0.4"/><rect x="24.5" y="4" width="3" height="3" rx="1" fill="#60a5fa" transform="rotate(45 26 5.5)"/></svg>

After

Width:  |  Height:  |  Size: 665 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40" fill="none"><path d="M6 20L34 8 22 34 18 22 6 20z" fill="#bbbbbb"/></svg>

After

Width:  |  Height:  |  Size: 156 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40" fill="none"><path d="M6 20L34 8 22 34 18 22 6 20z" fill="#ffffff"/></svg>

After

Width:  |  Height:  |  Size: 156 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40" fill="none"><path d="M6 20L34 8 22 34 18 22 6 20z" fill="currentColor"/></svg>

After

Width:  |  Height:  |  Size: 162 B

View File

@@ -0,0 +1,5 @@
<svg viewBox="0 0 24 24" width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="4" y="13" width="4" height="8" rx="1" fill="#0052d9" stroke="#0052d9" stroke-width="1"/>
<rect x="10" y="8" width="4" height="13" rx="1" fill="#0052d9" stroke="#0052d9" stroke-width="1"/>
<rect x="16" y="3" width="4" height="18" rx="1" fill="#0052d9" stroke="#0052d9" stroke-width="1"/>
</svg>

After

Width:  |  Height:  |  Size: 405 B

View File

@@ -0,0 +1,5 @@
<svg viewBox="0 0 24 24" width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="4" y="13" width="4" height="8" rx="1" stroke="#8b8b8b" stroke-width="1.5"/>
<rect x="10" y="8" width="4" height="13" rx="1" stroke="#8b8b8b" stroke-width="1.5"/>
<rect x="16" y="3" width="4" height="18" rx="1" stroke="#8b8b8b" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 366 B

View File

@@ -0,0 +1,4 @@
<svg viewBox="0 0 24 24" width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="7" r="4" fill="#0052d9" stroke="#0052d9" stroke-width="1"/>
<path d="M5.5 21a6.5 6.5 0 0113 0h-13z" fill="#0052d9" stroke="#0052d9" stroke-width="1"/>
</svg>

After

Width:  |  Height:  |  Size: 278 B

View File

@@ -0,0 +1,4 @@
<svg viewBox="0 0 24 24" width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="7" r="4" stroke="#8b8b8b" stroke-width="1.5"/>
<path d="M5.5 21a6.5 6.5 0 0113 0h-13z" stroke="#8b8b8b" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 252 B

View File

@@ -0,0 +1,5 @@
<svg viewBox="0 0 24 24" width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="5" y="4" width="14" height="17" rx="2" fill="#0052d9" stroke="#0052d9" stroke-width="1"/>
<rect x="8" y="2" width="8" height="4" rx="1" fill="#0052d9" stroke="#0052d9" stroke-width="1"/>
<path d="M9 12l2 2 4-4" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 410 B

View File

@@ -0,0 +1,5 @@
<svg viewBox="0 0 24 24" width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="5" y="4" width="14" height="17" rx="2" stroke="#8b8b8b" stroke-width="1.5"/>
<rect x="8" y="2" width="8" height="4" rx="1" stroke="#8b8b8b" stroke-width="1.5"/>
<path d="M9 12l2 2 4-4" stroke="#8b8b8b" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 386 B