@phill-component/icons 0.1.15 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/image/png/calendar.png +0 -0
  2. package/dist/image/png/file_fold.png +0 -0
  3. package/dist/image/png/home.png +0 -0
  4. package/dist/image/png/setting.png +0 -0
  5. package/dist/image/png/task.png +0 -0
  6. package/dist/image/png/to_landscape.png +0 -0
  7. package/dist/image/svg/calendar.svg +1 -0
  8. package/dist/image/svg/file_fold.svg +1 -0
  9. package/dist/image/svg/home.svg +1 -0
  10. package/dist/image/svg/setting.svg +1 -0
  11. package/dist/image/svg/task.svg +1 -0
  12. package/dist/image/svg/to_landscape.svg +1 -0
  13. package/dist/mobile/uvue/Calendar.uvue +66 -0
  14. package/dist/mobile/uvue/FileFold.uvue +66 -0
  15. package/dist/mobile/uvue/Home.uvue +66 -0
  16. package/dist/mobile/uvue/Setting.uvue +66 -0
  17. package/dist/mobile/uvue/Task.uvue +66 -0
  18. package/dist/mobile/uvue/ToLandscape.uvue +66 -0
  19. package/dist/mobile/uvue/index.uts +6 -0
  20. package/dist/mobile/vue/Calendar.vue +62 -0
  21. package/dist/mobile/vue/FileFold.vue +62 -0
  22. package/dist/mobile/vue/Home.vue +62 -0
  23. package/dist/mobile/vue/Setting.vue +62 -0
  24. package/dist/mobile/vue/Task.vue +62 -0
  25. package/dist/mobile/vue/ToLandscape.vue +62 -0
  26. package/dist/mobile/vue/index.js +6 -0
  27. package/dist/web/vue/Calendar.vue +57 -0
  28. package/dist/web/vue/FileFold.vue +57 -0
  29. package/dist/web/vue/Home.vue +57 -0
  30. package/dist/web/vue/Setting.vue +57 -0
  31. package/dist/web/vue/Task.vue +57 -0
  32. package/dist/web/vue/ToLandscape.vue +57 -0
  33. package/dist/web/vue/index.js +6 -0
  34. package/package.json +1 -1
  35. package/scripts/build.js +71 -89
  36. package/scripts/templates/mobile.uvue.tpl +66 -0
  37. package/scripts/templates/mobile.vue.tpl +62 -0
  38. package/scripts/templates/web.vue.tpl +57 -0
  39. package/dist/index.js +0 -6
  40. package/dist/uniapp/icons-custom.json +0 -8
  41. package/dist/uniapp/icons-generated.js +0 -1
  42. package/dist/uniapp/icons-generated.uts +0 -1
  43. package/dist/uniapp/icons-multicolor.json +0 -3
  44. package/dist/uniapp/icons-svg.js +0 -32
  45. package/dist/uniapp/icons-svg.uts +0 -32
  46. package/dist/uniapp/images/close-circle.svg +0 -1
  47. package/dist/uniapp/images/home.svg +0 -1
  48. package/dist/uniapp/images/success-color.svg +0 -1
  49. package/dist/uniapp/images//345/217/263/347/256/255/345/244/264.svg +0 -1
  50. package/dist/uniapp/images//345/272/227/351/223/272.svg +0 -1
  51. package/dist/uniapp/images//345/274/200/351/200/232/346/234/215/345/212/241.svg +0 -1
  52. package/dist/uniapp/svgs/close-circle.js +0 -5
  53. package/dist/uniapp/svgs/home.js +0 -5
  54. package/dist/uniapp/svgs/success-color.js +0 -5
  55. package/dist/uniapp/svgs//345/217/263/347/256/255/345/244/264.js +0 -5
  56. package/dist/uniapp/svgs//345/272/227/351/223/272.js +0 -5
  57. package/dist/uniapp/svgs//345/274/200/351/200/232/346/234/215/345/212/241.js +0 -5
  58. package/dist/vue/CloseCircle.vue +0 -6
  59. package/dist/vue/Home.vue +0 -6
  60. package/dist/vue/SuccessColor.vue +0 -6
  61. package/dist/vue//345/217/263/347/256/255/345/244/264.vue +0 -6
  62. package/dist/vue//345/272/227/351/223/272.vue +0 -6
  63. package/dist/vue//345/274/200/351/200/232/346/234/215/345/212/241.vue +0 -6
@@ -0,0 +1,57 @@
1
+ <template>
2
+ <view class="icon" @tap="onTap" :hover-class="hoverClass" :style="wrapStyle">
3
+ <svg viewBox="0 0 24 24" :width="iconW" :height="iconH" xmlns="http://www.w3.org/2000/svg" v-bind="$attrs" :style="iconStyle">
4
+ <path fill="#8a94dc" d="M18.059 12.905a2 2 0 0 1 1.6 3.199h.001c-.01.014-.544.747-.595 1.514l-.003 1.258 1.712.383a1.645 1.645 0 0 1 1.287 1.605v.65a.275.275 0 0 1-.274.275h-7.45a.275.275 0 0 1-.274-.274v-.653c0-.77.534-1.437 1.285-1.605l1.714-.386.003-1.14h-.004a2.6 2.6 0 0 0-.5-1.501 2.001 2.001 0 0 1 1.498-3.324"/><path fill="#fff" d="M6.96 3.387c0-.598.431-1.082.962-1.082h5.77c.53 0 .96.484.96 1.082 0 .597-.43 1.082-.96 1.082h-5.77c-.53 0-.961-.485-.961-1.082"/><path fill="#6571c4" d="M6.157 3.062q-.019.132-.02.27c0 1.046.824 1.895 1.842 1.895h5.524c1.017 0 1.842-.849 1.842-1.895a2 2 0 0 0-.02-.27h1.222c1.205 0 2.182.976 2.183 2.181v6.197a3.363 3.363 0 0 0-3.235 5.47c.11.163.272.473.272.849v.24l-.87.195a2.99 2.99 0 0 0-2.332 2.724H4.932a2.18 2.18 0 0 1-2.182-2.182V5.243c0-1.205.977-2.181 2.182-2.181z"/><path fill="#6571c4" d="M6.95 3.332c0-.598.424-1.082.947-1.082h5.688c.523 0 .948.484.948 1.082s-.425 1.082-.948 1.082H7.897c-.523 0-.948-.484-.948-1.082"/><path fill="#fff" fill-rule="evenodd" d="M14.604 8.9a.77.77 0 0 1 .169 1.11l-3.103 3.975c-1.133 1.468-2.234 1.071-3.128.217l-1.487-1.42a.77.77 0 0 1 0-1.12.857.857 0 0 1 1.173 0l1.487 1.42c.178.17.474.15.625-.044l3.103-3.976a.855.855 0 0 1 1.16-.162" clip-rule="evenodd"/>
5
+ </svg>
6
+ <text v-if="label !== ''" class="icon__label" :style="labelStyle">{{ label }}</text>
7
+ </view>
8
+ </template>
9
+ <script setup>
10
+ import { computed } from 'vue'
11
+ const props = defineProps({
12
+ size: { type: [String, Number], default: '1em' },
13
+ color: { type: String, default: '' },
14
+ label: { type: [String, Number], default: '' },
15
+ labelPos: { type: String, default: 'right' },
16
+ labelSize: { type: [String, Number], default: '15px' },
17
+ labelColor: { type: String, default: '' },
18
+ space: { type: [String, Number], default: '3px' },
19
+ width: { type: [String, Number], default: '' },
20
+ height: { type: [String, Number], default: '' },
21
+ hoverClass: { type: String, default: '' },
22
+ index: { type: [String, Number], default: '' },
23
+ stop: { type: Boolean, default: false }
24
+ })
25
+ const emit = defineEmits(['click'])
26
+ const toPx = (v) => typeof v === 'number' ? (v + 'px') : (String(v||''));
27
+ const iconW = computed(() => props.width ? toPx(props.width) : toPx(props.size))
28
+ const iconH = computed(() => props.height ? toPx(props.height) : toPx(props.size))
29
+ const iconBoxStyle = computed(() => ({ width: iconW.value, height: iconH.value }))
30
+ const iconStyle = computed(() => {
31
+ const s = { }
32
+ if (props.color) s.color = props.color
33
+ return s
34
+ })
35
+ const wrapStyle = computed(() => {
36
+ const dirMap = { right: 'row', left: 'row-reverse', top: 'column-reverse', bottom: 'column' }
37
+ return { display: 'flex', alignItems: 'center', flexDirection: dirMap[props.labelPos] || 'row' }
38
+ })
39
+ const labelStyle = computed(() => {
40
+ return {
41
+ color: props.labelColor || '',
42
+ fontSize: toPx(props.labelSize),
43
+ marginLeft: props.labelPos === 'right' ? toPx(props.space) : 0,
44
+ marginTop: props.labelPos === 'bottom' ? toPx(props.space) : 0,
45
+ marginRight: props.labelPos === 'left' ? toPx(props.space) : 0,
46
+ marginBottom: props.labelPos === 'top' ? toPx(props.space) : 0
47
+ }
48
+ })
49
+ const imgSrc = '__IMG_SRC__'
50
+ function onTap(e) {
51
+ emit('click', props.index)
52
+ if (props.stop && e && e.stopPropagation) e.stopPropagation()
53
+ }
54
+ </script>
55
+ <style scoped>
56
+ .icon__label { line-height: 1; }
57
+ </style>
@@ -0,0 +1,57 @@
1
+ <template>
2
+ <view class="icon" @tap="onTap" :hover-class="hoverClass" :style="wrapStyle">
3
+ <svg viewBox="0 0 24 24" :width="iconW" :height="iconH" xmlns="http://www.w3.org/2000/svg" v-bind="$attrs" :style="iconStyle">
4
+ <path fill="#0a0a0a" d="M20 11a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2zM4 20h16v-7H4zm6-18a2 2 0 0 1 2 2v5a1 1 0 1 1-2 0V4H4v5a1 1 0 0 1-2 0V4a2 2 0 0 1 2-2zm8 0a1 1 0 0 1 1 .998l.006 3.23.954-.953a1 1 0 0 1 1.414 1.415l-2.657 2.657a1 1 0 0 1-1.414 0L14.646 6.69a1.001 1.001 0 0 1 1.415-1.415l.945.946L17.002 4H14.5a1 1 0 1 1 0-2z"/>
5
+ </svg>
6
+ <text v-if="label !== ''" class="icon__label" :style="labelStyle">{{ label }}</text>
7
+ </view>
8
+ </template>
9
+ <script setup>
10
+ import { computed } from 'vue'
11
+ const props = defineProps({
12
+ size: { type: [String, Number], default: '1em' },
13
+ color: { type: String, default: '' },
14
+ label: { type: [String, Number], default: '' },
15
+ labelPos: { type: String, default: 'right' },
16
+ labelSize: { type: [String, Number], default: '15px' },
17
+ labelColor: { type: String, default: '' },
18
+ space: { type: [String, Number], default: '3px' },
19
+ width: { type: [String, Number], default: '' },
20
+ height: { type: [String, Number], default: '' },
21
+ hoverClass: { type: String, default: '' },
22
+ index: { type: [String, Number], default: '' },
23
+ stop: { type: Boolean, default: false }
24
+ })
25
+ const emit = defineEmits(['click'])
26
+ const toPx = (v) => typeof v === 'number' ? (v + 'px') : (String(v||''));
27
+ const iconW = computed(() => props.width ? toPx(props.width) : toPx(props.size))
28
+ const iconH = computed(() => props.height ? toPx(props.height) : toPx(props.size))
29
+ const iconBoxStyle = computed(() => ({ width: iconW.value, height: iconH.value }))
30
+ const iconStyle = computed(() => {
31
+ const s = { }
32
+ if (props.color) s.color = props.color
33
+ return s
34
+ })
35
+ const wrapStyle = computed(() => {
36
+ const dirMap = { right: 'row', left: 'row-reverse', top: 'column-reverse', bottom: 'column' }
37
+ return { display: 'flex', alignItems: 'center', flexDirection: dirMap[props.labelPos] || 'row' }
38
+ })
39
+ const labelStyle = computed(() => {
40
+ return {
41
+ color: props.labelColor || '',
42
+ fontSize: toPx(props.labelSize),
43
+ marginLeft: props.labelPos === 'right' ? toPx(props.space) : 0,
44
+ marginTop: props.labelPos === 'bottom' ? toPx(props.space) : 0,
45
+ marginRight: props.labelPos === 'left' ? toPx(props.space) : 0,
46
+ marginBottom: props.labelPos === 'top' ? toPx(props.space) : 0
47
+ }
48
+ })
49
+ const imgSrc = '__IMG_SRC__'
50
+ function onTap(e) {
51
+ emit('click', props.index)
52
+ if (props.stop && e && e.stopPropagation) e.stopPropagation()
53
+ }
54
+ </script>
55
+ <style scoped>
56
+ .icon__label { line-height: 1; }
57
+ </style>
@@ -0,0 +1,6 @@
1
+ export { default as IconCalendar } from './Calendar.vue';
2
+ export { default as IconFileFold } from './FileFold.vue';
3
+ export { default as IconHome } from './Home.vue';
4
+ export { default as IconSetting } from './Setting.vue';
5
+ export { default as IconTask } from './Task.vue';
6
+ export { default as IconToLandscape } from './ToLandscape.vue';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phill-component/icons",
3
- "version": "0.1.15",
3
+ "version": "0.2.0",
4
4
  "description": "Unified icons for phillUI mobile and pc libraries",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
package/scripts/build.js CHANGED
@@ -1,4 +1,3 @@
1
- const svgtofont = require('svgtofont').default;
2
1
  const path = require('path');
3
2
  const fs = require('fs');
4
3
  const { optimize } = require('svgo');
@@ -7,30 +6,32 @@ const Case = require('case');
7
6
  const rootDir = path.resolve(__dirname, '..');
8
7
  const srcDir = path.resolve(rootDir, 'svg');
9
8
  const distDir = path.resolve(rootDir, 'dist');
10
- const vueDir = path.resolve(distDir, 'vue');
11
- const uniappDir = path.resolve(distDir, 'uniapp');
12
- const uniappCompDir = path.resolve(distDir, 'uniapp-components');
13
- const uniappImgDir = path.resolve(uniappDir, 'images');
14
-
15
- // Ensure directories exist
16
- [distDir, vueDir, uniappDir, uniappCompDir, uniappImgDir].forEach(dir => {
17
- if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
18
- });
19
-
20
- function isMultiColor(svgContent) {
21
- const colorRegex = /(fill|stroke)="(?!none|currentColor|\$)(#[0-9a-fA-F]{3,6}|rgba?|hsla?)/gi;
22
- const matches = svgContent.match(colorRegex);
23
- if (!matches) return false;
24
- const colors = new Set(matches.map(m => m.split('"')[1].toLowerCase()));
25
- return colors.size > 1;
26
- }
9
+ // web: 仅供 PC/Web 使用(始终内联 SVG)
10
+ const webDir = path.resolve(distDir, 'web');
11
+ const webVueDir = path.resolve(webDir, 'vue');
12
+ // mobile:供 uni-app 使用(H5 内联 SVG;非 H5 用 PNG/SVG)
13
+ const mobileDir = path.resolve(distDir, 'mobile');
14
+ const mobileVueDir = path.resolve(mobileDir, 'vue');
15
+ const mobileUvueDir = path.resolve(mobileDir, 'uvue');
16
+ // 静态资源输出到 dist/image/{svg,png}
17
+ const imageDir = path.resolve(distDir, 'image');
18
+ const svgDir = path.resolve(imageDir, 'svg');
19
+ const pngDir = path.resolve(imageDir, 'png');
27
20
 
28
21
  async function build() {
22
+ // clean dist first, then (re)create subdirs to avoid writeFileSync ENOENT
23
+ if (fs.existsSync(distDir)) fs.rmSync(distDir, { recursive: true, force: true });
24
+ [distDir, webDir, webVueDir, mobileDir, mobileVueDir, mobileUvueDir, imageDir, svgDir, pngDir].forEach(dir => {
25
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
26
+ });
27
+
28
+ // read image files
29
29
  const files = fs.readdirSync(srcDir).filter(f => f.endsWith('.svg'));
30
- const singleColorIcons = [];
31
- const multiColorIcons = [];
32
30
  const iconData = [];
33
31
  const svgMappings = {};
32
+ // Optional rasterizer
33
+ let sharp = null;
34
+ try { sharp = require('sharp'); } catch (e) { sharp = null; }
34
35
 
35
36
  console.log(`Building icons from ${srcDir} to ${distDir}...`);
36
37
 
@@ -38,17 +39,8 @@ async function build() {
38
39
  const name = file.replace('.svg', '');
39
40
  const pascalName = Case.pascal(name);
40
41
  const content = fs.readFileSync(path.join(srcDir, file), 'utf-8');
41
-
42
- const multi = isMultiColor(content);
43
-
44
- // Optimize
42
+ // Optimize(不区分单/多色,统一按默认优化)
45
43
  const svgoPlugins = ['preset-default', 'removeDimensions'];
46
- if (!multi) {
47
- svgoPlugins.push({
48
- name: 'convertColors',
49
- params: { currentColor: true }
50
- });
51
- }
52
44
 
53
45
  let optimized = optimize(content, {
54
46
  path: file,
@@ -56,69 +48,59 @@ async function build() {
56
48
  }).data;
57
49
 
58
50
  const innerSvg = optimized.replace(/<svg[^>]*>|<\/svg>/g, '');
59
- const base64Data = Buffer.from(optimized, 'utf8').toString('base64');
60
- const dataUri = `data:image/svg+xml;base64,${base64Data}`;
61
-
62
- // 1. Generate Standard Vue Component using <image> with base64 URI
63
- const vueContent = `<template>
64
- <image :src="src" v-bind="$attrs" />
65
- </template>
66
- <script setup>
67
- const src = ${JSON.stringify(dataUri)};
68
- </script>`;
69
- fs.writeFileSync(path.join(vueDir, `${pascalName}.vue`), vueContent);
70
-
71
- // 2. Optimized Standalone SVG for Native/MP
72
- // Always include image version and base64 mapping
73
- if (multi) multiColorIcons.push(name);
74
- svgMappings[name] = { dataUri, inner: innerSvg, multi };
75
- // Also emit standalone image for fallback
76
- fs.writeFileSync(path.join(uniappImgDir, file), optimized);
77
-
78
- iconData.push({ name, pascalName, multi });
79
- }
80
51
 
81
- // 3. Generate Vue Entry
82
- const entryContent = iconData.map(i => `export { default as Icon${i.pascalName} } from './vue/${i.pascalName}.vue';`).join('\n');
83
- fs.writeFileSync(path.join(distDir, 'index.js'), entryContent);
84
-
85
- // 4. Build Native Font (UniApp Native Single-color)
86
- let fontMappings = {};
87
- if (singleColorIcons.length > 0) {
88
- const tempFontSrc = path.join(rootDir, 'temp-font-src');
89
- if (!fs.existsSync(tempFontSrc)) fs.mkdirSync(tempFontSrc);
90
- singleColorIcons.forEach(f => fs.copyFileSync(path.join(srcDir, f), path.join(tempFontSrc, f)));
91
-
92
- await svgtofont({
93
- src: tempFontSrc,
94
- dist: uniappDir,
95
- fontName: 'upicon-custom',
96
- css: false,
97
- outSVGReact: false,
98
- outSVGPath: false,
99
- typescript: true,
100
- emptyDist: false,
101
- getIconUnicode: (name, unicode) => {
102
- fontMappings[name] = unicode;
52
+ // 1) web/vue:始终内联 SVG,供 PC/Web 使用(模板)
53
+ const webTpl = fs.readFileSync(path.join(__dirname, 'templates/web.vue.tpl'), 'utf-8');
54
+ const webOut = webTpl.replace('__INNER_SVG__', innerSvg);
55
+ fs.writeFileSync(path.join(webVueDir, `${pascalName}.vue`), webOut);
56
+
57
+ // 2) mobile/vue(模板)
58
+ const mobileVueTpl = fs.readFileSync(path.join(__dirname, 'templates/mobile.vue.tpl'), 'utf-8');
59
+ // 计算运行时图片 URL(非 H5 使用)
60
+ const runtimePngUrl = `@/uni_modules/@phill-component/icons/dist/image/png/${name}.png`;
61
+ const runtimeSvgUrl = `@/uni_modules/@phill-component/icons/dist/image/svg/${name}.svg`;
62
+ const mobileVueImgUrl = sharp ? runtimePngUrl : runtimeSvgUrl;
63
+
64
+ const mobileVueOut = mobileVueTpl
65
+ .replace('__INNER_SVG__', innerSvg)
66
+ .replace(/__IMG_SRC__/g, mobileVueImgUrl);
67
+ fs.writeFileSync(path.join(mobileVueDir, `${pascalName}.vue`), mobileVueOut);
68
+
69
+ // 3) mobile/uvue:H5 用 SVG;非 H5 用 PNG/SVG
70
+ let targetImgFile = runtimeSvgUrl;
71
+ if (sharp) {
72
+ try {
73
+ const pngPath = path.join(pngDir, `${name}.png`);
74
+ await sharp(Buffer.from(optimized)).resize(128, 128, { fit: 'contain' }).png().toFile(pngPath);
75
+ targetImgFile = runtimePngUrl;
76
+ } catch (e) {
77
+ console.warn(`[icons] PNG rasterize failed for ${name}:`, e.message);
103
78
  }
104
- });
105
- fs.rmSync(tempFontSrc, { recursive: true, force: true });
106
- console.log('Native font generated.');
79
+ } else {
80
+ console.warn('[icons] "sharp" not found, skip PNG rasterization; X will use SVG image fallback.');
81
+ }
82
+ const mobileUvueTpl = fs.readFileSync(path.join(__dirname, 'templates/mobile.uvue.tpl'), 'utf-8');
83
+ const mobileUvueOut = mobileUvueTpl
84
+ .replace('__INNER_SVG__', innerSvg)
85
+ .replace(/__IMG_SRC__/g, targetImgFile);
86
+ fs.writeFileSync(path.join(mobileUvueDir, `${pascalName}.uvue`), mobileUvueOut);
87
+
88
+ // 4) 输出独立 SVG 文件与 PNG(若已生成)
89
+ svgMappings[name] = { inner: innerSvg };
90
+ fs.writeFileSync(path.join(svgDir, file), optimized);
91
+
92
+ iconData.push({ name, pascalName });
107
93
  }
108
94
 
109
- // 5. Generate Mappings and per-icon modules for on-demand loading
110
- fs.writeFileSync(path.join(uniappDir, 'icons-svg.js'), `export default ${JSON.stringify(svgMappings, null, 2)}`);
111
- fs.writeFileSync(path.join(uniappDir, 'icons-svg.uts'), `export default ${JSON.stringify(svgMappings, null, 2)} as UTSJSONObject`);
112
- const svgsDir = path.join(uniappDir, 'svgs');
113
- if (!fs.existsSync(svgsDir)) fs.mkdirSync(svgsDir, { recursive: true });
114
- Object.entries(svgMappings).forEach(([n, rec]) => {
115
- const mod = `export default ${JSON.stringify(rec, null, 2)};`;
116
- fs.writeFileSync(path.join(svgsDir, `${n}.js`), mod);
117
- });
118
- fs.writeFileSync(path.join(uniappDir, 'icons-generated.js'), `export default ${JSON.stringify(fontMappings, null, 2)}`);
119
- fs.writeFileSync(path.join(uniappDir, 'icons-generated.uts'), `export default ${JSON.stringify(fontMappings, null, 2)} as UTSJSONObject`);
120
- fs.writeFileSync(path.join(uniappDir, 'icons-custom.json'), JSON.stringify(iconData.map(i => i.name), null, 2));
121
- fs.writeFileSync(path.join(uniappDir, 'icons-multicolor.json'), JSON.stringify(multiColorIcons, null, 2));
95
+ // 5) 生成入口:web/index.js、mobile/vue/index.js、mobile/uvue/index.uts
96
+ const webEntry = iconData.map(i => `export { default as Icon${i.pascalName} } from './${i.pascalName}.vue';`).join('\n');
97
+ fs.writeFileSync(path.join(webVueDir, 'index.js'), webEntry);
98
+ const mobileVueEntry = iconData.map(i => `export { default as Icon${i.pascalName} } from './${i.pascalName}.vue';`).join('\n');
99
+ fs.writeFileSync(path.join(mobileVueDir, 'index.js'), mobileVueEntry);
100
+ const mobileUtsEntry = iconData.map(i => `export { default as Icon${i.pascalName} } from './${i.pascalName}.uvue'`).join('\n');
101
+ fs.writeFileSync(path.join(mobileUvueDir, 'index.uts'), mobileUtsEntry);
102
+
103
+ // 不再输出 icons-svg.js/uts 等映射与其它冗余目录
122
104
 
123
105
  console.log('All icons built to dist successfully.');
124
106
  }
@@ -0,0 +1,66 @@
1
+ <template>
2
+ <view class="icon" @tap="onTap" :hover-class="hoverClass" :style="wrapStyle">
3
+ <!-- #ifdef H5 -->
4
+ <svg viewBox="0 0 24 24" :width="iconW" :height="iconH" xmlns="http://www.w3.org/2000/svg">
5
+ __INNER_SVG__
6
+ </svg>
7
+ <!-- #endif -->
8
+ <!-- #ifndef H5 -->
9
+ <image :src="imgSrc" :style="iconBoxStyle" />
10
+ <!-- #endif -->
11
+ <text v-if="label != ''" class="icon__label" :style="labelStyle">{{ label }}</text>
12
+ </view>
13
+ </template>
14
+ <script setup lang="uts">
15
+ import { computed } from 'vue'
16
+ import imgSrc from '__IMG_SRC__'
17
+ const props = defineProps({
18
+ size: { type: [String, Number], default: '1em' },
19
+ color: { type: String, default: '' },
20
+ label: { type: [String, Number], default: '' },
21
+ labelPos: { type: String, default: 'right' },
22
+ labelSize: { type: [String, Number], default: '15px' },
23
+ labelColor: { type: String, default: '' },
24
+ space: { type: [String, Number], default: '3px' },
25
+ width: { type: [String, Number], default: '' },
26
+ height: { type: [String, Number], default: '' },
27
+ hoverClass: { type: String, default: '' },
28
+ index: { type: [String, Number], default: '' },
29
+ stop: { type: Boolean, default: false }
30
+ })
31
+ const emit = defineEmits(['click'])
32
+ function toPx(v: any): string {
33
+ if (typeof v === 'number') return (v as number).toString() + 'px'
34
+ const s = (v as string)
35
+ return s != '' ? s : ''
36
+ }
37
+ const iconW = computed((): string => (props.width != '' ? toPx(props.width) : toPx(props.size)))
38
+ const iconH = computed((): string => (props.height != '' ? toPx(props.height) : toPx(props.size)))
39
+ const iconBoxStyle = computed((): UTSJSONObject => ({ width: iconW.value, height: iconH.value } as UTSJSONObject))
40
+ const wrapStyle = computed((): UTSJSONObject => {
41
+ const map = { right: 'row', left: 'row-reverse', top: 'column-reverse', bottom: 'column' } as UTSJSONObject
42
+ let dir: string = 'row'
43
+ const cand = map[props.labelPos] as string | null
44
+ if (cand != null && cand.length > 0) {
45
+ dir = cand
46
+ }
47
+ return { display: 'flex', alignItems: 'center', flexDirection: dir } as UTSJSONObject
48
+ })
49
+ const labelStyle = computed((): UTSJSONObject => {
50
+ const out = {} as UTSJSONObject
51
+ if (props.labelColor != '') out['color'] = props.labelColor
52
+ out['fontSize'] = toPx(props.labelSize)
53
+ out['marginLeft'] = props.labelPos == 'right' ? toPx(props.space) : 0
54
+ out['marginTop'] = props.labelPos == 'bottom' ? toPx(props.space) : 0
55
+ out['marginRight'] = props.labelPos == 'left' ? toPx(props.space) : 0
56
+ out['marginBottom'] = props.labelPos == 'top' ? toPx(props.space) : 0
57
+ return out
58
+ })
59
+ function onTap(e: UniPointerEvent) {
60
+ emit('click', props.index)
61
+ if (props.stop) e.stopPropagation()
62
+ }
63
+ </script>
64
+ <style scoped>
65
+ .icon__label { line-height: 1; }
66
+ </style>
@@ -0,0 +1,62 @@
1
+ <template>
2
+ <view class="icon" @tap="onTap" :hover-class="hoverClass" :style="wrapStyle">
3
+ <!-- #ifdef H5 -->
4
+ <svg viewBox="0 0 24 24" :width="iconW" :height="iconH" xmlns="http://www.w3.org/2000/svg" v-bind="$attrs" :style="iconStyle">
5
+ __INNER_SVG__
6
+ </svg>
7
+ <!-- #endif -->
8
+ <!-- #ifndef H5 -->
9
+ <image :src="imgSrc" :style="iconBoxStyle" v-bind="$attrs" />
10
+ <!-- #endif -->
11
+ <text v-if="label !== ''" class="icon__label" :style="labelStyle">{{ label }}</text>
12
+ </view>
13
+ </template>
14
+ <script setup>
15
+ import { computed } from 'vue'
16
+ const props = defineProps({
17
+ size: { type: [String, Number], default: '1em' },
18
+ color: { type: String, default: '' },
19
+ label: { type: [String, Number], default: '' },
20
+ labelPos: { type: String, default: 'right' },
21
+ labelSize: { type: [String, Number], default: '15px' },
22
+ labelColor: { type: String, default: '' },
23
+ space: { type: [String, Number], default: '3px' },
24
+ width: { type: [String, Number], default: '' },
25
+ height: { type: [String, Number], default: '' },
26
+ hoverClass: { type: String, default: '' },
27
+ index: { type: [String, Number], default: '' },
28
+ stop: { type: Boolean, default: false }
29
+ })
30
+ const emit = defineEmits(['click'])
31
+ const toPx = (v) => typeof v === 'number' ? (v + 'px') : (String(v||''));
32
+ const iconW = computed(() => props.width ? toPx(props.width) : toPx(props.size))
33
+ const iconH = computed(() => props.height ? toPx(props.height) : toPx(props.size))
34
+ const iconBoxStyle = computed(() => ({ width: iconW.value, height: iconH.value }))
35
+ const iconStyle = computed(() => {
36
+ const s = { }
37
+ if (props.color) s.color = props.color
38
+ return s
39
+ })
40
+ const wrapStyle = computed(() => {
41
+ const dirMap = { right: 'row', left: 'row-reverse', top: 'column-reverse', bottom: 'column' }
42
+ return { display: 'flex', alignItems: 'center', flexDirection: dirMap[props.labelPos] || 'row' }
43
+ })
44
+ const labelStyle = computed(() => {
45
+ return {
46
+ color: props.labelColor || '',
47
+ fontSize: toPx(props.labelSize),
48
+ marginLeft: props.labelPos === 'right' ? toPx(props.space) : 0,
49
+ marginTop: props.labelPos === 'bottom' ? toPx(props.space) : 0,
50
+ marginRight: props.labelPos === 'left' ? toPx(props.space) : 0,
51
+ marginBottom: props.labelPos === 'top' ? toPx(props.space) : 0
52
+ }
53
+ })
54
+ const imgSrc = '__IMG_SRC__'
55
+ function onTap(e) {
56
+ emit('click', props.index)
57
+ if (props.stop && e && e.stopPropagation) e.stopPropagation()
58
+ }
59
+ </script>
60
+ <style scoped>
61
+ .icon__label { line-height: 1; }
62
+ </style>
@@ -0,0 +1,57 @@
1
+ <template>
2
+ <view class="icon" @tap="onTap" :hover-class="hoverClass" :style="wrapStyle">
3
+ <svg viewBox="0 0 24 24" :width="iconW" :height="iconH" xmlns="http://www.w3.org/2000/svg" v-bind="$attrs" :style="iconStyle">
4
+ __INNER_SVG__
5
+ </svg>
6
+ <text v-if="label !== ''" class="icon__label" :style="labelStyle">{{ label }}</text>
7
+ </view>
8
+ </template>
9
+ <script setup>
10
+ import { computed } from 'vue'
11
+ const props = defineProps({
12
+ size: { type: [String, Number], default: '1em' },
13
+ color: { type: String, default: '' },
14
+ label: { type: [String, Number], default: '' },
15
+ labelPos: { type: String, default: 'right' },
16
+ labelSize: { type: [String, Number], default: '15px' },
17
+ labelColor: { type: String, default: '' },
18
+ space: { type: [String, Number], default: '3px' },
19
+ width: { type: [String, Number], default: '' },
20
+ height: { type: [String, Number], default: '' },
21
+ hoverClass: { type: String, default: '' },
22
+ index: { type: [String, Number], default: '' },
23
+ stop: { type: Boolean, default: false }
24
+ })
25
+ const emit = defineEmits(['click'])
26
+ const toPx = (v) => typeof v === 'number' ? (v + 'px') : (String(v||''));
27
+ const iconW = computed(() => props.width ? toPx(props.width) : toPx(props.size))
28
+ const iconH = computed(() => props.height ? toPx(props.height) : toPx(props.size))
29
+ const iconBoxStyle = computed(() => ({ width: iconW.value, height: iconH.value }))
30
+ const iconStyle = computed(() => {
31
+ const s = { }
32
+ if (props.color) s.color = props.color
33
+ return s
34
+ })
35
+ const wrapStyle = computed(() => {
36
+ const dirMap = { right: 'row', left: 'row-reverse', top: 'column-reverse', bottom: 'column' }
37
+ return { display: 'flex', alignItems: 'center', flexDirection: dirMap[props.labelPos] || 'row' }
38
+ })
39
+ const labelStyle = computed(() => {
40
+ return {
41
+ color: props.labelColor || '',
42
+ fontSize: toPx(props.labelSize),
43
+ marginLeft: props.labelPos === 'right' ? toPx(props.space) : 0,
44
+ marginTop: props.labelPos === 'bottom' ? toPx(props.space) : 0,
45
+ marginRight: props.labelPos === 'left' ? toPx(props.space) : 0,
46
+ marginBottom: props.labelPos === 'top' ? toPx(props.space) : 0
47
+ }
48
+ })
49
+ const imgSrc = '__IMG_SRC__'
50
+ function onTap(e) {
51
+ emit('click', props.index)
52
+ if (props.stop && e && e.stopPropagation) e.stopPropagation()
53
+ }
54
+ </script>
55
+ <style scoped>
56
+ .icon__label { line-height: 1; }
57
+ </style>
package/dist/index.js DELETED
@@ -1,6 +0,0 @@
1
- export { default as IconCloseCircle } from './vue/CloseCircle.vue';
2
- export { default as IconHome } from './vue/Home.vue';
3
- export { default as IconSuccessColor } from './vue/SuccessColor.vue';
4
- export { default as Icon右箭头 } from './vue/右箭头.vue';
5
- export { default as Icon店铺 } from './vue/店铺.vue';
6
- export { default as Icon开通服务 } from './vue/开通服务.vue';
@@ -1,8 +0,0 @@
1
- [
2
- "close-circle",
3
- "home",
4
- "success-color",
5
- "右箭头",
6
- "店铺",
7
- "开通服务"
8
- ]
@@ -1 +0,0 @@
1
- export default {}
@@ -1 +0,0 @@
1
- export default {} as UTSJSONObject
@@ -1,3 +0,0 @@
1
- [
2
- "success-color"
3
- ]
@@ -1,32 +0,0 @@
1
- export default {
2
- "close-circle": {
3
- "dataUri": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJtNSAxMy41OUwxNS41OSAxNyAxMiAxMy40MSA4LjQxIDE3IDcgMTUuNTkgMTAuNTkgMTIgNyA4LjQxIDguNDEgNyAxMiAxMC41OSAxNS41OSA3IDE3IDguNDEgMTMuNDEgMTJ6Ii8+PC9zdmc+",
4
- "inner": "<path d=\"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2m5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12z\"/>",
5
- "multi": false
6
- },
7
- "home": {
8
- "dataUri": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9ImN1cnJlbnRDb2xvciIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTAgMjB2LTZoNHY2aDV2LThoM0wxMiAzIDIgMTJoM3Y4eiIvPjwvc3ZnPg==",
9
- "inner": "<path d=\"M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z\"/>",
10
- "multi": false
11
- },
12
- "success-color": {
13
- "dataUri": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMTAiIGZpbGw9IiM0MmI4ODMiLz48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMiIgZD0ibTE3IDgtNyA3LTMtMyIvPjwvc3ZnPg==",
14
- "inner": "<circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#42b883\"/><path fill=\"none\" stroke=\"#fff\" stroke-width=\"2\" d=\"m17 8-7 7-3-3\"/>",
15
- "multi": true
16
- },
17
- "右箭头": {
18
- "dataUri": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0Ij48cGF0aCBkPSJtNzM5Ljg0IDQ3Ni4xNi0zODQtMzg0Yy0yMC40OC0yMC40OC01MS4yLTIwLjQ4LTcxLjY4IDBzLTIwLjQ4IDUxLjIgMCA3MS42OEw2MzIuMzIgNTEyIDI4NC4xNiA4NjAuMTZjLTIwLjQ4IDIwLjQ4LTIwLjQ4IDUxLjIgMCA3MS42OEMyOTQuNCA5NDIuMDggMzA3LjIgOTQ3LjIgMzIwIDk0Ny4yczI1LjYtNS4xMiAzNS44NC0xNS4zNmwzODQtMzg0YzIwLjQ4LTIwLjQ4IDIwLjQ4LTUxLjIgMC03MS42OCIvPjwvc3ZnPg==",
19
- "inner": "<path d=\"m739.84 476.16-384-384c-20.48-20.48-51.2-20.48-71.68 0s-20.48 51.2 0 71.68L632.32 512 284.16 860.16c-20.48 20.48-20.48 51.2 0 71.68C294.4 942.08 307.2 947.2 320 947.2s25.6-5.12 35.84-15.36l384-384c20.48-20.48 20.48-51.2 0-71.68\"/>",
20
- "multi": false
21
- },
22
- "店铺": {
23
- "dataUri": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0Ij48cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik04MjEuOTEgODUuMzMzYzEyLjg0MiAwIDIyLjQ4NSA2LjQgMjguOTA2IDE2bDEwNS45NjMgMjA0LjhjMi42NDUgNS4yMjcgMy4xMTQgMTkuMDUxIDMuMiAyNS42NDNsLjAyMSA4Ni4zNTdjMCA4MC02Ny40MzUgMTQ3LjItMTQ3LjczMyAxNDcuMmgtNDEuNzVjLTQ4LjE3IDAtODYuNjk4LTE2LTExMi40MDUtNDEuNi0yNS42ODUgMjguOC03MC42MzUgNDQuOC0xMjUuMjI3IDQ0LjhoLTQxLjc0OWMtNTQuNjEzIDAtOTkuNTYzLTE2LTEyNS4yNDgtNDQuOC0yNS43MDcgMjguOC02NC4yMzUgNDQuOC0xMTIuNDI3IDQ0LjhoLTQxLjcwNmMtODAuMzQyIDAtMTQ3Ljc1NS02Ny4yLTE0Ny43NTUtMTQ3LjJ2LTgxLjI4Yy4wNDMtNC44NDIuMzItMTcuNzA2IDMuMi0yNC4zMmw4My41Mi0yMDhjMy4yLTEyLjggMTYuMDQzLTIyLjQgMjguODg1LTIyLjR6bS0xOC4zMjYgNjRoLTYwMC42NGwtNzQuNzczIDE4Ni4yNC0uMTA3IDEuNzA3LS4wNjQgMi43NzN2ODEuMjhjMCA0NC41ODcgMzguNzQxIDgzLjIgODMuNzMzIDgzLjJoNDEuNzVjMzAuMTQ0IDAgNTEuNDEzLTguNTU0IDY0LjY0LTIzLjQwMmw0Ny43NjUtNTMuNTQ3IDQ3Ljc0NCA1My41NDdjMTIuMTE3IDEzLjU4OSAzOS42MTYgMjMuNDAyIDc3LjUwNCAyMy40MDJoNDEuNzVjMzcuODY2IDAgNjUuMzY1LTkuODEzIDc3LjQ4Mi0yMy40MDJsNDUuMDEzLTUwLjQ3NSA0Ny45MTUgNDcuNzQ0YzE0LjI5MyAxNC4yMyAzNy4xMiAyMi45MzMgNjcuMjIxIDIyLjkzM2g0MS43NWM0NS4wMTMgMCA4My43MzMtMzguNjEzIDgzLjczMy04My4ydi04My4ybC0uMDIxLTMuNDc3LS4xNzEtMy45MDR6bTY0LjIzNSA0NTEuMzA3YTMyIDMyIDAgMCAxIDMyIDMyVjgzMmE5NiA5NiAwIDAgMS05NiA5NkgyMjEuMTRhOTYgOTYgMCAwIDEtOTYtOTZWNjMyLjY0YTMyIDMyIDAgMCAxIDY0IDBWODMyYTMyIDMyIDAgMCAwIDMyIDMySDgwMy44MmEzMiAzMiAwIDAgMCAzMi0zMlY2MzIuNjRhMzIgMzIgMCAwIDEgMzItMzIiLz48cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik05MTAuNTA3IDI4OHY2NEg4My41MnYtNjR6Ii8+PC9zdmc+",
24
- "inner": "<path fill=\"currentColor\" d=\"M821.91 85.333c12.842 0 22.485 6.4 28.906 16l105.963 204.8c2.645 5.227 3.114 19.051 3.2 25.643l.021 86.357c0 80-67.435 147.2-147.733 147.2h-41.75c-48.17 0-86.698-16-112.405-41.6-25.685 28.8-70.635 44.8-125.227 44.8h-41.749c-54.613 0-99.563-16-125.248-44.8-25.707 28.8-64.235 44.8-112.427 44.8h-41.706c-80.342 0-147.755-67.2-147.755-147.2v-81.28c.043-4.842.32-17.706 3.2-24.32l83.52-208c3.2-12.8 16.043-22.4 28.885-22.4zm-18.326 64h-600.64l-74.773 186.24-.107 1.707-.064 2.773v81.28c0 44.587 38.741 83.2 83.733 83.2h41.75c30.144 0 51.413-8.554 64.64-23.402l47.765-53.547 47.744 53.547c12.117 13.589 39.616 23.402 77.504 23.402h41.75c37.866 0 65.365-9.813 77.482-23.402l45.013-50.475 47.915 47.744c14.293 14.23 37.12 22.933 67.221 22.933h41.75c45.013 0 83.733-38.613 83.733-83.2v-83.2l-.021-3.477-.171-3.904zm64.235 451.307a32 32 0 0 1 32 32V832a96 96 0 0 1-96 96H221.14a96 96 0 0 1-96-96V632.64a32 32 0 0 1 64 0V832a32 32 0 0 0 32 32H803.82a32 32 0 0 0 32-32V632.64a32 32 0 0 1 32-32\"/><path fill=\"currentColor\" d=\"M910.507 288v64H83.52v-64z\"/>",
25
- "multi": false
26
- },
27
- "开通服务": {
28
- "dataUri": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0Ij48cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik01MTIgNzQuNjY3YzI0MS41MzYgMCA0MzcuMzMzIDE5NS43OTcgNDM3LjMzMyA0MzcuMzMzUzc1My41MzYgOTQ5LjMzMyA1MTIgOTQ5LjMzM2E0MzYuMSA0MzYuMSAwIDAgMS0yNDIuOTg3LTczLjY4NSAzMiAzMiAwIDEgMSAzNS41ODQtNTMuMTYzQTM3Mi4xIDM3Mi4xIDAgMCAwIDUxMiA4ODUuMzMzYzIwNi4xODcgMCAzNzMuMzMzLTE2Ny4xNDYgMzczLjMzMy0zNzMuMzMzUzcxOC4xODcgMTM4LjY2NyA1MTIgMTM4LjY2NyAxMzguNjY3IDMwNS44MTMgMTM4LjY2NyA1MTJhMzcyLjEgMzcyLjEgMCAwIDAgNjIuODQ4IDIwNy40MDMgMzIgMzIgMCAwIDEtNTMuMTYzIDM1LjYwNUE0MzYuMSA0MzYuMSAwIDAgMSA3NC42NjcgNTEyQzc0LjY2NyAyNzAuNDQzIDI3MC40NjQgNzQuNjQ1IDUxMiA3NC42NDV6Ii8+PHBhdGggZmlsbD0iY3VycmVudENvbG9yIiBkPSJNNjk0LjMxNSA0MTkuMDcyYTMyIDMyIDAgMCAxIDQzLjIyMSA0Ny4yMUw1NDAuOCA2NDYuMzhhMTE3LjMzMyAxMTcuMzMzIDAgMCAxLTE2MS4zNDQtMi43MzFsLTgzLjA5My04MS40M2EzMiAzMiAwIDEgMSA0NC44LTQ1LjcxN2w4My4wOTMgODEuNDNhNTMuMzMzIDUzLjMzMyAwIDAgMCA3My4zNDQgMS4yMzd6Ii8+PC9zdmc+",
29
- "inner": "<path fill=\"currentColor\" d=\"M512 74.667c241.536 0 437.333 195.797 437.333 437.333S753.536 949.333 512 949.333a436.1 436.1 0 0 1-242.987-73.685 32 32 0 1 1 35.584-53.163A372.1 372.1 0 0 0 512 885.333c206.187 0 373.333-167.146 373.333-373.333S718.187 138.667 512 138.667 138.667 305.813 138.667 512a372.1 372.1 0 0 0 62.848 207.403 32 32 0 0 1-53.163 35.605A436.1 436.1 0 0 1 74.667 512C74.667 270.443 270.464 74.645 512 74.645z\"/><path fill=\"currentColor\" d=\"M694.315 419.072a32 32 0 0 1 43.221 47.21L540.8 646.38a117.333 117.333 0 0 1-161.344-2.731l-83.093-81.43a32 32 0 1 1 44.8-45.717l83.093 81.43a53.333 53.333 0 0 0 73.344 1.237z\"/>",
30
- "multi": false
31
- }
32
- }
@@ -1,32 +0,0 @@
1
- export default {
2
- "close-circle": {
3
- "dataUri": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJtNSAxMy41OUwxNS41OSAxNyAxMiAxMy40MSA4LjQxIDE3IDcgMTUuNTkgMTAuNTkgMTIgNyA4LjQxIDguNDEgNyAxMiAxMC41OSAxNS41OSA3IDE3IDguNDEgMTMuNDEgMTJ6Ii8+PC9zdmc+",
4
- "inner": "<path d=\"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2m5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12z\"/>",
5
- "multi": false
6
- },
7
- "home": {
8
- "dataUri": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9ImN1cnJlbnRDb2xvciIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTAgMjB2LTZoNHY2aDV2LThoM0wxMiAzIDIgMTJoM3Y4eiIvPjwvc3ZnPg==",
9
- "inner": "<path d=\"M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z\"/>",
10
- "multi": false
11
- },
12
- "success-color": {
13
- "dataUri": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMTAiIGZpbGw9IiM0MmI4ODMiLz48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMiIgZD0ibTE3IDgtNyA3LTMtMyIvPjwvc3ZnPg==",
14
- "inner": "<circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#42b883\"/><path fill=\"none\" stroke=\"#fff\" stroke-width=\"2\" d=\"m17 8-7 7-3-3\"/>",
15
- "multi": true
16
- },
17
- "右箭头": {
18
- "dataUri": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0Ij48cGF0aCBkPSJtNzM5Ljg0IDQ3Ni4xNi0zODQtMzg0Yy0yMC40OC0yMC40OC01MS4yLTIwLjQ4LTcxLjY4IDBzLTIwLjQ4IDUxLjIgMCA3MS42OEw2MzIuMzIgNTEyIDI4NC4xNiA4NjAuMTZjLTIwLjQ4IDIwLjQ4LTIwLjQ4IDUxLjIgMCA3MS42OEMyOTQuNCA5NDIuMDggMzA3LjIgOTQ3LjIgMzIwIDk0Ny4yczI1LjYtNS4xMiAzNS44NC0xNS4zNmwzODQtMzg0YzIwLjQ4LTIwLjQ4IDIwLjQ4LTUxLjIgMC03MS42OCIvPjwvc3ZnPg==",
19
- "inner": "<path d=\"m739.84 476.16-384-384c-20.48-20.48-51.2-20.48-71.68 0s-20.48 51.2 0 71.68L632.32 512 284.16 860.16c-20.48 20.48-20.48 51.2 0 71.68C294.4 942.08 307.2 947.2 320 947.2s25.6-5.12 35.84-15.36l384-384c20.48-20.48 20.48-51.2 0-71.68\"/>",
20
- "multi": false
21
- },
22
- "店铺": {
23
- "dataUri": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0Ij48cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik04MjEuOTEgODUuMzMzYzEyLjg0MiAwIDIyLjQ4NSA2LjQgMjguOTA2IDE2bDEwNS45NjMgMjA0LjhjMi42NDUgNS4yMjcgMy4xMTQgMTkuMDUxIDMuMiAyNS42NDNsLjAyMSA4Ni4zNTdjMCA4MC02Ny40MzUgMTQ3LjItMTQ3LjczMyAxNDcuMmgtNDEuNzVjLTQ4LjE3IDAtODYuNjk4LTE2LTExMi40MDUtNDEuNi0yNS42ODUgMjguOC03MC42MzUgNDQuOC0xMjUuMjI3IDQ0LjhoLTQxLjc0OWMtNTQuNjEzIDAtOTkuNTYzLTE2LTEyNS4yNDgtNDQuOC0yNS43MDcgMjguOC02NC4yMzUgNDQuOC0xMTIuNDI3IDQ0LjhoLTQxLjcwNmMtODAuMzQyIDAtMTQ3Ljc1NS02Ny4yLTE0Ny43NTUtMTQ3LjJ2LTgxLjI4Yy4wNDMtNC44NDIuMzItMTcuNzA2IDMuMi0yNC4zMmw4My41Mi0yMDhjMy4yLTEyLjggMTYuMDQzLTIyLjQgMjguODg1LTIyLjR6bS0xOC4zMjYgNjRoLTYwMC42NGwtNzQuNzczIDE4Ni4yNC0uMTA3IDEuNzA3LS4wNjQgMi43NzN2ODEuMjhjMCA0NC41ODcgMzguNzQxIDgzLjIgODMuNzMzIDgzLjJoNDEuNzVjMzAuMTQ0IDAgNTEuNDEzLTguNTU0IDY0LjY0LTIzLjQwMmw0Ny43NjUtNTMuNTQ3IDQ3Ljc0NCA1My41NDdjMTIuMTE3IDEzLjU4OSAzOS42MTYgMjMuNDAyIDc3LjUwNCAyMy40MDJoNDEuNzVjMzcuODY2IDAgNjUuMzY1LTkuODEzIDc3LjQ4Mi0yMy40MDJsNDUuMDEzLTUwLjQ3NSA0Ny45MTUgNDcuNzQ0YzE0LjI5MyAxNC4yMyAzNy4xMiAyMi45MzMgNjcuMjIxIDIyLjkzM2g0MS43NWM0NS4wMTMgMCA4My43MzMtMzguNjEzIDgzLjczMy04My4ydi04My4ybC0uMDIxLTMuNDc3LS4xNzEtMy45MDR6bTY0LjIzNSA0NTEuMzA3YTMyIDMyIDAgMCAxIDMyIDMyVjgzMmE5NiA5NiAwIDAgMS05NiA5NkgyMjEuMTRhOTYgOTYgMCAwIDEtOTYtOTZWNjMyLjY0YTMyIDMyIDAgMCAxIDY0IDBWODMyYTMyIDMyIDAgMCAwIDMyIDMySDgwMy44MmEzMiAzMiAwIDAgMCAzMi0zMlY2MzIuNjRhMzIgMzIgMCAwIDEgMzItMzIiLz48cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik05MTAuNTA3IDI4OHY2NEg4My41MnYtNjR6Ii8+PC9zdmc+",
24
- "inner": "<path fill=\"currentColor\" d=\"M821.91 85.333c12.842 0 22.485 6.4 28.906 16l105.963 204.8c2.645 5.227 3.114 19.051 3.2 25.643l.021 86.357c0 80-67.435 147.2-147.733 147.2h-41.75c-48.17 0-86.698-16-112.405-41.6-25.685 28.8-70.635 44.8-125.227 44.8h-41.749c-54.613 0-99.563-16-125.248-44.8-25.707 28.8-64.235 44.8-112.427 44.8h-41.706c-80.342 0-147.755-67.2-147.755-147.2v-81.28c.043-4.842.32-17.706 3.2-24.32l83.52-208c3.2-12.8 16.043-22.4 28.885-22.4zm-18.326 64h-600.64l-74.773 186.24-.107 1.707-.064 2.773v81.28c0 44.587 38.741 83.2 83.733 83.2h41.75c30.144 0 51.413-8.554 64.64-23.402l47.765-53.547 47.744 53.547c12.117 13.589 39.616 23.402 77.504 23.402h41.75c37.866 0 65.365-9.813 77.482-23.402l45.013-50.475 47.915 47.744c14.293 14.23 37.12 22.933 67.221 22.933h41.75c45.013 0 83.733-38.613 83.733-83.2v-83.2l-.021-3.477-.171-3.904zm64.235 451.307a32 32 0 0 1 32 32V832a96 96 0 0 1-96 96H221.14a96 96 0 0 1-96-96V632.64a32 32 0 0 1 64 0V832a32 32 0 0 0 32 32H803.82a32 32 0 0 0 32-32V632.64a32 32 0 0 1 32-32\"/><path fill=\"currentColor\" d=\"M910.507 288v64H83.52v-64z\"/>",
25
- "multi": false
26
- },
27
- "开通服务": {
28
- "dataUri": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0Ij48cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik01MTIgNzQuNjY3YzI0MS41MzYgMCA0MzcuMzMzIDE5NS43OTcgNDM3LjMzMyA0MzcuMzMzUzc1My41MzYgOTQ5LjMzMyA1MTIgOTQ5LjMzM2E0MzYuMSA0MzYuMSAwIDAgMS0yNDIuOTg3LTczLjY4NSAzMiAzMiAwIDEgMSAzNS41ODQtNTMuMTYzQTM3Mi4xIDM3Mi4xIDAgMCAwIDUxMiA4ODUuMzMzYzIwNi4xODcgMCAzNzMuMzMzLTE2Ny4xNDYgMzczLjMzMy0zNzMuMzMzUzcxOC4xODcgMTM4LjY2NyA1MTIgMTM4LjY2NyAxMzguNjY3IDMwNS44MTMgMTM4LjY2NyA1MTJhMzcyLjEgMzcyLjEgMCAwIDAgNjIuODQ4IDIwNy40MDMgMzIgMzIgMCAwIDEtNTMuMTYzIDM1LjYwNUE0MzYuMSA0MzYuMSAwIDAgMSA3NC42NjcgNTEyQzc0LjY2NyAyNzAuNDQzIDI3MC40NjQgNzQuNjQ1IDUxMiA3NC42NDV6Ii8+PHBhdGggZmlsbD0iY3VycmVudENvbG9yIiBkPSJNNjk0LjMxNSA0MTkuMDcyYTMyIDMyIDAgMCAxIDQzLjIyMSA0Ny4yMUw1NDAuOCA2NDYuMzhhMTE3LjMzMyAxMTcuMzMzIDAgMCAxLTE2MS4zNDQtMi43MzFsLTgzLjA5My04MS40M2EzMiAzMiAwIDEgMSA0NC44LTQ1LjcxN2w4My4wOTMgODEuNDNhNTMuMzMzIDUzLjMzMyAwIDAgMCA3My4zNDQgMS4yMzd6Ii8+PC9zdmc+",
29
- "inner": "<path fill=\"currentColor\" d=\"M512 74.667c241.536 0 437.333 195.797 437.333 437.333S753.536 949.333 512 949.333a436.1 436.1 0 0 1-242.987-73.685 32 32 0 1 1 35.584-53.163A372.1 372.1 0 0 0 512 885.333c206.187 0 373.333-167.146 373.333-373.333S718.187 138.667 512 138.667 138.667 305.813 138.667 512a372.1 372.1 0 0 0 62.848 207.403 32 32 0 0 1-53.163 35.605A436.1 436.1 0 0 1 74.667 512C74.667 270.443 270.464 74.645 512 74.645z\"/><path fill=\"currentColor\" d=\"M694.315 419.072a32 32 0 0 1 43.221 47.21L540.8 646.38a117.333 117.333 0 0 1-161.344-2.731l-83.093-81.43a32 32 0 1 1 44.8-45.717l83.093 81.43a53.333 53.333 0 0 0 73.344 1.237z\"/>",
30
- "multi": false
31
- }
32
- } as UTSJSONObject
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2m5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12z"/></svg>
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24"><path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/></svg>