km-card-layout-component-miniprogram 0.1.18 → 0.1.19
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/miniprogram_dist/components/card-layout/elements/custom-element/index.wxml +6 -4
- package/miniprogram_dist/components/card-layout/elements/icon-element/index.wxml +6 -4
- package/miniprogram_dist/components/card-layout/elements/image-element/index.wxml +10 -8
- package/miniprogram_dist/components/card-layout/elements/text-element/index.wxml +2 -0
- package/miniprogram_dist/components/card-layout/elements/text-element/index.wxss +0 -4
- package/miniprogram_dist/components/card-layout/index.js +83 -15
- package/miniprogram_dist/components/card-layout/index.json +1 -7
- package/miniprogram_dist/components/card-layout/index.wxml +21 -4
- package/miniprogram_dist/components/card-layout/index.wxss +83 -0
- package/miniprogram_dist/vendor/wxml2canvas-2d/canvas.js +1116 -0
- package/miniprogram_dist/vendor/wxml2canvas-2d/constants.js +42 -0
- package/miniprogram_dist/vendor/wxml2canvas-2d/element.js +420 -0
- package/miniprogram_dist/vendor/wxml2canvas-2d/gradient.js +634 -0
- package/miniprogram_dist/vendor/wxml2canvas-2d/index.js +169 -0
- package/miniprogram_dist/vendor/wxml2canvas-2d/index.json +4 -0
- package/miniprogram_dist/vendor/wxml2canvas-2d/index.wxml +7 -0
- package/miniprogram_dist/vendor/wxml2canvas-2d/index.wxss +5 -0
- package/package.json +1 -1
- package/src/components/card-layout/elements/custom-element/index.wxml +6 -4
- package/src/components/card-layout/elements/icon-element/index.wxml +6 -4
- package/src/components/card-layout/elements/image-element/index.wxml +10 -8
- package/src/components/card-layout/elements/text-element/index.wxml +2 -0
- package/src/components/card-layout/elements/text-element/index.wxss +0 -4
- package/src/components/card-layout/index.json +1 -7
- package/src/components/card-layout/index.ts +108 -16
- package/src/components/card-layout/index.wxml +21 -4
- package/src/components/card-layout/index.wxss +83 -0
- package/src/vendor/wxml2canvas-2d/canvas.js +1116 -0
- package/src/vendor/wxml2canvas-2d/constants.js +42 -0
- package/src/vendor/wxml2canvas-2d/element.js +420 -0
- package/src/vendor/wxml2canvas-2d/gradient.js +634 -0
- package/src/vendor/wxml2canvas-2d/index.js +169 -0
- package/src/vendor/wxml2canvas-2d/index.json +4 -0
- package/src/vendor/wxml2canvas-2d/index.wxml +7 -0
- package/src/vendor/wxml2canvas-2d/index.wxss +5 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import Element from './element';
|
|
2
|
+
import Canvas from './canvas';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 绘制 wxml 元素
|
|
6
|
+
* @param {Canvas} canvas 画布对象
|
|
7
|
+
* @param {Element} element wxml 元素
|
|
8
|
+
* @param {PageObject} page 页面实例对象
|
|
9
|
+
* @param {ComponentObject} component 组件实例对象
|
|
10
|
+
*/
|
|
11
|
+
const drawElement = async (canvas, element, page, component) => {
|
|
12
|
+
// 设置画布的当前 wxml 元素上下文(必要)
|
|
13
|
+
canvas.setElement(element);
|
|
14
|
+
|
|
15
|
+
canvas.setTransform();
|
|
16
|
+
canvas.drawBoxShadow();
|
|
17
|
+
canvas.drawBackgroundColor();
|
|
18
|
+
await canvas.drawBackgroundImage();
|
|
19
|
+
if ('src' in element) {
|
|
20
|
+
if ('objectFit' in element) {
|
|
21
|
+
await canvas.drawVideo();
|
|
22
|
+
} else {
|
|
23
|
+
await canvas.drawImage();
|
|
24
|
+
}
|
|
25
|
+
} else if ('text' in element.dataset || 'icon' in element.dataset) {
|
|
26
|
+
canvas.drawText();
|
|
27
|
+
} else if ('canvasId' in element) {
|
|
28
|
+
await canvas.drawCanvas(component ?? page);
|
|
29
|
+
}
|
|
30
|
+
canvas.drawBorder();
|
|
31
|
+
canvas.resetTransform();
|
|
32
|
+
canvas.restoreContext();
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
Component({
|
|
36
|
+
externalClasses: ['box-class'],
|
|
37
|
+
properties: {
|
|
38
|
+
// 根节点(容器)样式类名称
|
|
39
|
+
containerClass: {
|
|
40
|
+
type: String,
|
|
41
|
+
value: 'wxml2canvas-container',
|
|
42
|
+
},
|
|
43
|
+
// 内部节点样式类名称
|
|
44
|
+
itemClass: {
|
|
45
|
+
type: String,
|
|
46
|
+
value: 'wxml2canvas-item',
|
|
47
|
+
},
|
|
48
|
+
// 画布缩放比例
|
|
49
|
+
scale: {
|
|
50
|
+
type: Number,
|
|
51
|
+
value: 1,
|
|
52
|
+
},
|
|
53
|
+
// 是否使用离屏画布
|
|
54
|
+
offscreen: Boolean,
|
|
55
|
+
},
|
|
56
|
+
data: {
|
|
57
|
+
// 画布宽度
|
|
58
|
+
canvasWidth: 300,
|
|
59
|
+
// 画布高度
|
|
60
|
+
canvasHeight: 150,
|
|
61
|
+
},
|
|
62
|
+
methods: {
|
|
63
|
+
/**
|
|
64
|
+
* setData 同步版
|
|
65
|
+
* @param {Object} data
|
|
66
|
+
* @returns {Promise<void>}
|
|
67
|
+
*/
|
|
68
|
+
setDataSync(data) {
|
|
69
|
+
return new Promise((resolve) => {
|
|
70
|
+
this.setData(data, resolve);
|
|
71
|
+
});
|
|
72
|
+
},
|
|
73
|
+
/**
|
|
74
|
+
* 绘制画布内容
|
|
75
|
+
* @param {PageObject} page 页面实例对象,默认当前页面实例
|
|
76
|
+
* @param {ComponentObject} component 组件实例对象
|
|
77
|
+
*/
|
|
78
|
+
async draw(page, component) {
|
|
79
|
+
// 获取当前页面实例、组件实例
|
|
80
|
+
if (page && !page.route && !component) {
|
|
81
|
+
component = page;
|
|
82
|
+
} if (!page || !page.route) {
|
|
83
|
+
[page] = getCurrentPages().slice(-1);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const {
|
|
87
|
+
containerClass, itemClass, scale, offscreen,
|
|
88
|
+
} = this.data;
|
|
89
|
+
const fields = {
|
|
90
|
+
id: true,
|
|
91
|
+
size: true,
|
|
92
|
+
rect: true,
|
|
93
|
+
dataset: true,
|
|
94
|
+
properties: [
|
|
95
|
+
...Element.COMMON_PROPERTIES,
|
|
96
|
+
...Element.TEXT_PROPERTIES,
|
|
97
|
+
...Element.IMAGE_PROPERTIES,
|
|
98
|
+
...Element.VIDEO_PROPERTIES,
|
|
99
|
+
...Element.CANVAS_PROPERTIES,
|
|
100
|
+
...Element.RICHTEXT_PROPERTIES,
|
|
101
|
+
],
|
|
102
|
+
computedStyle: [
|
|
103
|
+
...Element.COMMON_COMPUTED_STYLE,
|
|
104
|
+
...Element.TEXT_COMPUTED_STYLE,
|
|
105
|
+
...Element.IMAGE_COMPUTED_STYLE,
|
|
106
|
+
...Element.VIDEO_COMPUTED_STYLE,
|
|
107
|
+
...Element.CANVAS_COMPUTED_STYLE,
|
|
108
|
+
...Element.RICHTEXT_COMPUTED_STYLE,
|
|
109
|
+
],
|
|
110
|
+
};
|
|
111
|
+
const [container] = await Element.getNodesRef(`.${containerClass}`, fields, page, component);
|
|
112
|
+
await this.setDataSync({
|
|
113
|
+
canvasWidth: container.width * scale,
|
|
114
|
+
canvasHeight: container.height * scale,
|
|
115
|
+
});
|
|
116
|
+
const nodes = await Element.getNodesRef(`.${containerClass} .${itemClass}`, fields, page, component);
|
|
117
|
+
|
|
118
|
+
const canvas = this.canvas = new Canvas(...(offscreen ? [this] : [this, '#wxml2canvas']));
|
|
119
|
+
await canvas.init(container, scale);
|
|
120
|
+
|
|
121
|
+
nodes.unshift(container);
|
|
122
|
+
await this.drawElements(nodes, fields, component ?? page);
|
|
123
|
+
},
|
|
124
|
+
/**
|
|
125
|
+
* 绘制元素节点合集
|
|
126
|
+
* @param {Array} elements 元素节点合集
|
|
127
|
+
* @param {Object} fields 元素节点相关信息
|
|
128
|
+
* @param {Object} parent 父节点实例
|
|
129
|
+
*/
|
|
130
|
+
async drawElements(elements, fields, parent) {
|
|
131
|
+
const { itemClass } = this.data;
|
|
132
|
+
// 绘制内层各 wxml 元素
|
|
133
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
134
|
+
for (const item of elements) {
|
|
135
|
+
const itemElement = new Element(item);
|
|
136
|
+
if (item.dataset.component) {
|
|
137
|
+
const child = parent.selectComponent(`#${item.id}`);
|
|
138
|
+
const childElements = await Element.getNodesRef(`.${itemClass}`, fields, child);
|
|
139
|
+
await this.drawElements(childElements, fields, child);
|
|
140
|
+
} else {
|
|
141
|
+
await drawElement(this.canvas, itemElement, parent);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
/**
|
|
146
|
+
* 把画布内容导出生成图片
|
|
147
|
+
* @param {Boolean} original 是否使用实机表现作为导出图片的尺寸
|
|
148
|
+
* @returns {Promise<String>} 图片临时路径
|
|
149
|
+
*/
|
|
150
|
+
async toTempFilePath(original = true) {
|
|
151
|
+
const tempFilePath = await this.canvas.toTempFilePath(original);
|
|
152
|
+
return tempFilePath;
|
|
153
|
+
},
|
|
154
|
+
/**
|
|
155
|
+
* 导出画布至 Data URI
|
|
156
|
+
* @returns {String} Data URI
|
|
157
|
+
*/
|
|
158
|
+
toDataURL() {
|
|
159
|
+
return this.canvas.toDataURL();
|
|
160
|
+
},
|
|
161
|
+
/**
|
|
162
|
+
* 获取画布的像素数据
|
|
163
|
+
* @returns {ImageData} imageData
|
|
164
|
+
*/
|
|
165
|
+
getImageData() {
|
|
166
|
+
return this.canvas.getImageData();
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
});
|
package/package.json
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
<
|
|
2
|
-
<view class="km-
|
|
3
|
-
<
|
|
1
|
+
<template name="custom-element">
|
|
2
|
+
<view class="km-node km-node--custom" style="{{wrapperStyle}}">
|
|
3
|
+
<view class="km-node__custom" style="{{contentStyle}}">
|
|
4
|
+
<slot name="{{element.id}}"></slot>
|
|
5
|
+
</view>
|
|
4
6
|
</view>
|
|
5
|
-
</
|
|
7
|
+
</template>
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
<
|
|
2
|
-
<view class="km-
|
|
3
|
-
{{
|
|
1
|
+
<template name="icon-element">
|
|
2
|
+
<view class="km-node km-node--icon" style="{{wrapperStyle}}">
|
|
3
|
+
<view class="km-node__icon icon" style="{{contentStyle}}">
|
|
4
|
+
{{iconText}}
|
|
5
|
+
</view>
|
|
4
6
|
</view>
|
|
5
|
-
</
|
|
7
|
+
</template>
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
<
|
|
2
|
-
<
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
<template name="image-element">
|
|
2
|
+
<view class="km-node" style="{{wrapperStyle}}">
|
|
3
|
+
<image
|
|
4
|
+
class="km-node__image"
|
|
5
|
+
style="{{contentStyle}}"
|
|
6
|
+
src="{{imageSrc}}"
|
|
7
|
+
mode="{{mode}}"
|
|
8
|
+
/>
|
|
9
|
+
</view>
|
|
10
|
+
</template>
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
<template name="text-element">
|
|
1
2
|
<view class="km-node km-node--text" style="{{wrapperStyle}}">
|
|
2
3
|
<view class="km-node__text" style="{{contentStyle}}">
|
|
3
4
|
<block wx:if="{{(iconMeta && (iconMeta.name || iconMeta.text)) && (element.icon && element.icon.style !== 'text')}}">
|
|
@@ -40,3 +41,4 @@
|
|
|
40
41
|
</block>
|
|
41
42
|
</view>
|
|
42
43
|
</view>
|
|
44
|
+
</template>
|
|
@@ -1,9 +1,3 @@
|
|
|
1
1
|
{
|
|
2
|
-
"component": true
|
|
3
|
-
"usingComponents": {
|
|
4
|
-
"text-element": "./elements/text-element/index",
|
|
5
|
-
"image-element": "./elements/image-element/index",
|
|
6
|
-
"icon-element": "./elements/icon-element/index",
|
|
7
|
-
"custom-element": "./elements/custom-element/index"
|
|
8
|
-
}
|
|
2
|
+
"component": true
|
|
9
3
|
}
|
|
@@ -2,23 +2,42 @@ import type {
|
|
|
2
2
|
CardElement,
|
|
3
3
|
CardLayoutInput,
|
|
4
4
|
CardLayoutSchema,
|
|
5
|
+
CustomElement,
|
|
6
|
+
IconElement,
|
|
7
|
+
ImageElement,
|
|
5
8
|
LayoutPanelElement,
|
|
9
|
+
TextElement,
|
|
6
10
|
} from '../../vendor/km-card-layout-core/index';
|
|
7
11
|
import {
|
|
8
12
|
buildBackgroundStyle,
|
|
13
|
+
buildBaseContentStyle,
|
|
9
14
|
buildCardStyle,
|
|
15
|
+
buildImageContentStyle,
|
|
10
16
|
buildPanelContentStyle,
|
|
17
|
+
buildTextContentStyle,
|
|
18
|
+
buildTextIconMeta,
|
|
11
19
|
buildWrapperStyle,
|
|
20
|
+
getIconName,
|
|
21
|
+
getImageSrc,
|
|
22
|
+
getTextValue,
|
|
12
23
|
normalizeLayout,
|
|
13
24
|
processCardLayout,
|
|
14
25
|
styleObjectToString,
|
|
15
26
|
} from '../../vendor/km-card-layout-core/index';
|
|
27
|
+
import { ICON_CODE_MAP } from './icon-map';
|
|
16
28
|
|
|
17
29
|
type CompanyDuty = {
|
|
18
30
|
company: string;
|
|
19
31
|
duty: string;
|
|
20
32
|
};
|
|
21
33
|
|
|
34
|
+
const mapIconGlyph = (name?: string, fallback?: string) => {
|
|
35
|
+
if (!name) return fallback;
|
|
36
|
+
const glyph = ICON_CODE_MAP[name];
|
|
37
|
+
if (glyph) return String.fromCharCode(parseInt(glyph, 16));
|
|
38
|
+
return fallback || name;
|
|
39
|
+
};
|
|
40
|
+
|
|
22
41
|
|
|
23
42
|
|
|
24
43
|
const EMPTY_COMPANY_DUTY: CompanyDuty = {
|
|
@@ -85,14 +104,23 @@ const handleSpecialFields = (data: { user: Record<string, any> }) => {
|
|
|
85
104
|
};
|
|
86
105
|
};
|
|
87
106
|
|
|
107
|
+
type RenderElement = CardElement & {
|
|
108
|
+
wrapperStyle?: string;
|
|
109
|
+
contentStyle?: string;
|
|
110
|
+
imageSrc?: string;
|
|
111
|
+
mode?: string;
|
|
112
|
+
iconText?: string;
|
|
113
|
+
textValue?: string;
|
|
114
|
+
iconMeta?: any;
|
|
115
|
+
children?: RenderElement[];
|
|
116
|
+
};
|
|
117
|
+
|
|
88
118
|
type PanelElement = LayoutPanelElement & {
|
|
89
119
|
wrapperStyle: string;
|
|
90
120
|
contentStyle: string;
|
|
91
121
|
children?: RenderElement[];
|
|
92
122
|
};
|
|
93
123
|
|
|
94
|
-
type RenderElement = CardElement | PanelElement;
|
|
95
|
-
|
|
96
124
|
type RenderCard = {
|
|
97
125
|
id: string;
|
|
98
126
|
cardStyle: string;
|
|
@@ -111,27 +139,91 @@ const pickCardId = (layout: any, idx: number) => {
|
|
|
111
139
|
return `card-${idx}`;
|
|
112
140
|
};
|
|
113
141
|
|
|
114
|
-
const decorateElements = (
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
142
|
+
const decorateElements = (
|
|
143
|
+
children: CardElement[] = [],
|
|
144
|
+
rootData: Record<string, any>
|
|
145
|
+
): RenderElement[] => {
|
|
146
|
+
const data = rootData || {};
|
|
147
|
+
|
|
148
|
+
return (children || []).map(el => {
|
|
149
|
+
const wrapperStyle = styleObjectToString(buildWrapperStyle(el, 'rpx'), 'rpx');
|
|
150
|
+
|
|
151
|
+
switch (el.type) {
|
|
152
|
+
case 'layout-panel': {
|
|
153
|
+
const panel = el as LayoutPanelElement;
|
|
154
|
+
return {
|
|
155
|
+
...panel,
|
|
156
|
+
wrapperStyle,
|
|
157
|
+
contentStyle: styleObjectToString(buildPanelContentStyle(panel, 'rpx'), 'rpx'),
|
|
158
|
+
children: decorateElements(panel.children || [], rootData),
|
|
159
|
+
} as PanelElement;
|
|
160
|
+
}
|
|
161
|
+
case 'image': {
|
|
162
|
+
const imageEl = el as ImageElement;
|
|
163
|
+
const contentStyle = styleObjectToString(buildImageContentStyle(imageEl), 'rpx');
|
|
164
|
+
const imageSrc = getImageSrc(imageEl, data);
|
|
165
|
+
const mode = imageEl.fit === 'contain' ? 'aspectFit' : 'aspectFill';
|
|
166
|
+
return {
|
|
167
|
+
...imageEl,
|
|
168
|
+
wrapperStyle,
|
|
169
|
+
contentStyle,
|
|
170
|
+
imageSrc,
|
|
171
|
+
mode,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
case 'icon': {
|
|
175
|
+
const iconEl = el as IconElement;
|
|
176
|
+
const contentStyle = styleObjectToString(buildBaseContentStyle(iconEl), 'rpx');
|
|
177
|
+
const name = getIconName(iconEl);
|
|
178
|
+
const iconText = mapIconGlyph(name, name || '');
|
|
179
|
+
return {
|
|
180
|
+
...iconEl,
|
|
181
|
+
wrapperStyle,
|
|
182
|
+
contentStyle,
|
|
183
|
+
iconText,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
case 'custom': {
|
|
187
|
+
const customEl = el as CustomElement;
|
|
188
|
+
const contentStyle = styleObjectToString(buildBaseContentStyle(customEl), 'rpx');
|
|
189
|
+
return {
|
|
190
|
+
...customEl,
|
|
191
|
+
wrapperStyle,
|
|
192
|
+
contentStyle,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
default: {
|
|
196
|
+
const textEl = el as TextElement;
|
|
197
|
+
const contentStyle = styleObjectToString(buildTextContentStyle(textEl, 'rpx'), 'rpx');
|
|
198
|
+
const textValue = getTextValue(textEl, data);
|
|
199
|
+
const iconRaw = buildTextIconMeta(textEl, 'rpx');
|
|
200
|
+
const iconMeta =
|
|
201
|
+
iconRaw && iconRaw.name
|
|
202
|
+
? {
|
|
203
|
+
...iconRaw,
|
|
204
|
+
text: mapIconGlyph(iconRaw.name, iconRaw.name),
|
|
205
|
+
wrapperStyle: styleObjectToString(iconRaw.wrapperStyle, 'rpx'),
|
|
206
|
+
}
|
|
207
|
+
: iconRaw;
|
|
208
|
+
return {
|
|
209
|
+
...textEl,
|
|
210
|
+
wrapperStyle,
|
|
211
|
+
contentStyle,
|
|
212
|
+
textValue,
|
|
213
|
+
iconMeta,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
124
216
|
}
|
|
125
|
-
return el;
|
|
126
217
|
});
|
|
218
|
+
};
|
|
127
219
|
|
|
128
|
-
const buildCards = (layouts: CardLayoutSchema[]) => {
|
|
220
|
+
const buildCards = (layouts: CardLayoutSchema[], rootData: Record<string, any>) => {
|
|
129
221
|
return layouts.map((layout, idx) => ({
|
|
130
222
|
id: pickCardId(layouts[idx], idx),
|
|
131
223
|
cardStyle: styleObjectToString(buildCardStyle(layout, 'rpx'), 'rpx'),
|
|
132
224
|
backgroundImage: layout.backgroundImage || '',
|
|
133
225
|
backgroundStyle: styleObjectToString(buildBackgroundStyle(layout, 'rpx'), 'rpx'),
|
|
134
|
-
elements: decorateElements(layout.children || []),
|
|
226
|
+
elements: decorateElements(layout.children || [], rootData),
|
|
135
227
|
}));
|
|
136
228
|
};
|
|
137
229
|
|
|
@@ -209,7 +301,7 @@ Component({
|
|
|
209
301
|
return;
|
|
210
302
|
}
|
|
211
303
|
const normalizedLayouts = normalizeLayout(layoutInput);
|
|
212
|
-
const cards = buildCards(normalizedLayouts);
|
|
304
|
+
const cards = buildCards(normalizedLayouts, rootData);
|
|
213
305
|
this.setData({ cards, rootData });
|
|
214
306
|
},
|
|
215
307
|
},
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
<import src="./elements/custom-element/index.wxml" />
|
|
2
|
+
<import src="./elements/icon-element/index.wxml" />
|
|
3
|
+
<import src="./elements/image-element/index.wxml" />
|
|
4
|
+
<import src="./elements/text-element/index.wxml" />
|
|
5
|
+
|
|
1
6
|
<view class="km-card-layout">
|
|
2
7
|
<block wx:for="{{cards}}" wx:key="id">
|
|
3
8
|
<view class="km-card-layout__item">
|
|
@@ -19,10 +24,16 @@
|
|
|
19
24
|
|
|
20
25
|
<template name="render-element">
|
|
21
26
|
<block wx:if="{{el.type === 'image'}}">
|
|
22
|
-
<
|
|
27
|
+
<template
|
|
28
|
+
is="image-element"
|
|
29
|
+
data="{{wrapperStyle: el.wrapperStyle, contentStyle: el.contentStyle, imageSrc: el.imageSrc, mode: el.mode}}"
|
|
30
|
+
/>
|
|
23
31
|
</block>
|
|
24
32
|
<block wx:elif="{{el.type === 'icon'}}">
|
|
25
|
-
<
|
|
33
|
+
<template
|
|
34
|
+
is="icon-element"
|
|
35
|
+
data="{{wrapperStyle: el.wrapperStyle, contentStyle: el.contentStyle, iconText: el.iconText}}"
|
|
36
|
+
/>
|
|
26
37
|
</block>
|
|
27
38
|
<block wx:elif="{{el.type === 'layout-panel'}}">
|
|
28
39
|
<view class="km-node" style="{{el.wrapperStyle}}">
|
|
@@ -34,9 +45,15 @@
|
|
|
34
45
|
</view>
|
|
35
46
|
</block>
|
|
36
47
|
<block wx:elif="{{el.type === 'custom'}}">
|
|
37
|
-
<
|
|
48
|
+
<template
|
|
49
|
+
is="custom-element"
|
|
50
|
+
data="{{wrapperStyle: el.wrapperStyle, contentStyle: el.contentStyle, element: el}}"
|
|
51
|
+
/>
|
|
38
52
|
</block>
|
|
39
53
|
<block wx:else>
|
|
40
|
-
<
|
|
54
|
+
<template
|
|
55
|
+
is="text-element"
|
|
56
|
+
data="{{wrapperStyle: el.wrapperStyle, contentStyle: el.contentStyle, textValue: el.textValue, iconMeta: el.iconMeta, element: el}}"
|
|
57
|
+
/>
|
|
41
58
|
</block>
|
|
42
59
|
</template>
|
|
@@ -36,7 +36,90 @@
|
|
|
36
36
|
box-sizing: border-box;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
.km-node__image {
|
|
40
|
+
width: 100%;
|
|
41
|
+
height: 100%;
|
|
42
|
+
display: block;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.km-node--text text {
|
|
46
|
+
display: inline;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.km-node__text {
|
|
50
|
+
width: 100%;
|
|
51
|
+
height: 100%;
|
|
52
|
+
display: block;
|
|
53
|
+
box-sizing: border-box;
|
|
54
|
+
text-align: inherit;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.km-node__text-content {
|
|
58
|
+
display: inline-block;
|
|
59
|
+
vertical-align: middle;
|
|
60
|
+
height: 100%;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.km-node__text-icon {
|
|
64
|
+
display: inline-flex;
|
|
65
|
+
align-items: center;
|
|
66
|
+
justify-content: center;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.km-node__text-value {
|
|
70
|
+
display: inline-block;
|
|
71
|
+
white-space: pre-wrap;
|
|
72
|
+
word-break: break-word;
|
|
73
|
+
vertical-align: middle;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.icon {
|
|
77
|
+
font-family: 'km-icon' !important;
|
|
78
|
+
font-size: 16px;
|
|
79
|
+
font-style: normal;
|
|
80
|
+
-webkit-font-smoothing: antialiased;
|
|
81
|
+
-moz-osx-font-smoothing: grayscale;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.km-node__text-icon--wrapper{
|
|
85
|
+
display: inline-block;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
.km-node--icon {
|
|
90
|
+
display: flex;
|
|
91
|
+
align-items: center;
|
|
92
|
+
justify-content: center;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.km-node__icon {
|
|
96
|
+
display: inline-flex;
|
|
97
|
+
align-items: center;
|
|
98
|
+
justify-content: center;
|
|
99
|
+
width: 100%;
|
|
100
|
+
height: 100%;
|
|
101
|
+
font-family: 'km-icon', 'PingFang SC', 'Microsoft Yahei', sans-serif;
|
|
102
|
+
font-style: normal;
|
|
103
|
+
font-weight: normal;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.icon {
|
|
107
|
+
font-family: 'km-icon' !important;
|
|
108
|
+
font-size: 16px;
|
|
109
|
+
font-style: normal;
|
|
110
|
+
-webkit-font-smoothing: antialiased;
|
|
111
|
+
-moz-osx-font-smoothing: grayscale;
|
|
112
|
+
}
|
|
39
113
|
|
|
114
|
+
.km-node--custom {
|
|
115
|
+
box-sizing: border-box;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.km-node__custom {
|
|
119
|
+
width: 100%;
|
|
120
|
+
height: 100%;
|
|
121
|
+
box-sizing: border-box;
|
|
122
|
+
}
|
|
40
123
|
|
|
41
124
|
|
|
42
125
|
|