@phill-component/icons 0.1.15 → 0.2.1
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.
- package/dist/image/png/calendar.png +0 -0
- package/dist/image/png/file_fold.png +0 -0
- package/dist/image/png/home.png +0 -0
- package/dist/image/png/setting.png +0 -0
- package/dist/image/png/task.png +0 -0
- package/dist/image/png/to_landscape.png +0 -0
- package/dist/image/svg/calendar.svg +1 -0
- package/dist/image/svg/file_fold.svg +1 -0
- package/dist/image/svg/home.svg +1 -0
- package/dist/image/svg/setting.svg +1 -0
- package/dist/image/svg/task.svg +1 -0
- package/dist/image/svg/to_landscape.svg +1 -0
- package/dist/mobile/uvue/Calendar.uvue +66 -0
- package/dist/mobile/uvue/FileFold.uvue +66 -0
- package/dist/mobile/uvue/Home.uvue +66 -0
- package/dist/mobile/uvue/Setting.uvue +66 -0
- package/dist/mobile/uvue/Task.uvue +66 -0
- package/dist/mobile/uvue/ToLandscape.uvue +66 -0
- package/dist/mobile/uvue/index.uts +6 -0
- package/dist/mobile/vue/Calendar.vue +62 -0
- package/dist/mobile/vue/FileFold.vue +62 -0
- package/dist/mobile/vue/Home.vue +62 -0
- package/dist/mobile/vue/Setting.vue +62 -0
- package/dist/mobile/vue/Task.vue +62 -0
- package/dist/mobile/vue/ToLandscape.vue +62 -0
- package/dist/mobile/vue/index.js +6 -0
- package/dist/web/vue/Calendar.vue +57 -0
- package/dist/web/vue/FileFold.vue +57 -0
- package/dist/web/vue/Home.vue +57 -0
- package/dist/web/vue/Setting.vue +57 -0
- package/dist/web/vue/Task.vue +57 -0
- package/dist/web/vue/ToLandscape.vue +57 -0
- package/dist/web/vue/index.js +6 -0
- package/package.json +1 -1
- package/scripts/build.js +71 -89
- package/scripts/templates/mobile.uvue.tpl +66 -0
- package/scripts/templates/mobile.vue.tpl +62 -0
- package/scripts/templates/web.vue.tpl +57 -0
- package/dist/index.js +0 -6
- package/dist/uniapp/icons-custom.json +0 -8
- package/dist/uniapp/icons-generated.js +0 -1
- package/dist/uniapp/icons-generated.uts +0 -1
- package/dist/uniapp/icons-multicolor.json +0 -3
- package/dist/uniapp/icons-svg.js +0 -32
- package/dist/uniapp/icons-svg.uts +0 -32
- package/dist/uniapp/images/close-circle.svg +0 -1
- package/dist/uniapp/images/home.svg +0 -1
- package/dist/uniapp/images/success-color.svg +0 -1
- package/dist/uniapp/images//345/217/263/347/256/255/345/244/264.svg +0 -1
- package/dist/uniapp/images//345/272/227/351/223/272.svg +0 -1
- package/dist/uniapp/images//345/274/200/351/200/232/346/234/215/345/212/241.svg +0 -1
- package/dist/uniapp/svgs/close-circle.js +0 -5
- package/dist/uniapp/svgs/home.js +0 -5
- package/dist/uniapp/svgs/success-color.js +0 -5
- package/dist/uniapp/svgs//345/217/263/347/256/255/345/244/264.js +0 -5
- package/dist/uniapp/svgs//345/272/227/351/223/272.js +0 -5
- package/dist/uniapp/svgs//345/274/200/351/200/232/346/234/215/345/212/241.js +0 -5
- package/dist/vue/CloseCircle.vue +0 -6
- package/dist/vue/Home.vue +0 -6
- package/dist/vue/SuccessColor.vue +0 -6
- package/dist/vue//345/217/263/347/256/255/345/244/264.vue +0 -6
- package/dist/vue//345/272/227/351/223/272.vue +0 -6
- 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
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
|
-
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
-
|
|
106
|
-
|
|
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.
|
|
110
|
-
|
|
111
|
-
fs.writeFileSync(path.join(
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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 +0,0 @@
|
|
|
1
|
-
export default {}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default {} as UTSJSONObject
|
package/dist/uniapp/icons-svg.js
DELETED
|
@@ -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>
|