km-card-layout-component-miniprogram 0.1.39 → 0.1.42

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 (28) hide show
  1. package/README.md +2 -2
  2. package/example/app.js +1 -8
  3. package/example/app.json +2 -1
  4. package/example/pages/home/testfont/testfont.js +60 -0
  5. package/example/pages/home/testfont/testfont.json +6 -0
  6. package/example/pages/home/testfont/testfont.wxml +29 -0
  7. package/example/pages/home/testfont/testfont.wxss +3 -0
  8. package/miniprogram_dist/components/card-layout/elements/icon-element/index.js +2 -2
  9. package/miniprogram_dist/components/card-layout/elements/icon-element/index.wxml +1 -1
  10. package/miniprogram_dist/components/card-layout/elements/icon-font.wxss +8 -4
  11. package/miniprogram_dist/components/card-layout/icon-map.js +1 -0
  12. package/miniprogram_dist/components/card-layout/index.js +142 -16
  13. package/miniprogram_dist/components/card-layout/index.wxml +46 -22
  14. package/miniprogram_dist/components/card-layout/index.wxss +83 -1
  15. package/miniprogram_dist/vendor/km-card-layout-core/index.js +2 -1
  16. package/miniprogram_dist/vendor/km-card-layout-core/ops/changeBackground.js +55 -50
  17. package/package.json +1 -1
  18. package/src/components/card-layout/elements/icon-element/index.ts +2 -2
  19. package/src/components/card-layout/elements/icon-element/index.wxml +1 -1
  20. package/src/components/card-layout/elements/icon-font.wxss +8 -4
  21. package/src/components/card-layout/icon-map.ts +1 -0
  22. package/src/components/card-layout/index.ts +160 -18
  23. package/src/components/card-layout/index.wxml +46 -22
  24. package/src/components/card-layout/index.wxss +83 -1
  25. package/src/vendor/km-card-layout-core/index.ts +1 -1
  26. package/src/vendor/km-card-layout-core/interface/elements.ts +1 -1
  27. package/src/vendor/km-card-layout-core/ops/changeBackground.ts +57 -51
  28. package/src/vendor/km-card-layout-core/types.d.ts +4 -1
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # TDesign Miniprogram Starter
1
+ # cardLayout Miniprogram Starter
2
2
 
3
- 本仓库只保留了 TDesign 小程序组件库的**编译、发布与 Demo 骨架**,方便你快速复用发布流程,再按需补充自己的组件代码。
3
+ 宽脉名片布局组件,
4
4
 
5
5
  ## 包含内容
6
6
 
package/example/app.js CHANGED
@@ -1,15 +1,8 @@
1
1
  App({
2
2
  onLaunch() {
3
- this.loadFont();
4
3
  },
5
4
 
6
5
  async loadFont() {
7
- await wx.loadFontFace({
8
- global: true,
9
- family: "iconfont",
10
- scopes:[ 'native' ,'skyline','webview'],
11
- // 可以为 https 链接或者 Data URL
12
- source: "data:font/woff;charset=utf-8;base64,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",
13
- });
6
+
14
7
  },
15
8
  });
package/example/app.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "pages": [
3
3
  "pages/home/index",
4
- "pages/testicon/testicon"
4
+ "pages/testicon/testicon",
5
+ "pages/testfont/testfont"
5
6
  ],
6
7
  "window": {
7
8
  "navigationBarTitleText": "Demo",
@@ -0,0 +1,60 @@
1
+ Page({
2
+ data: {
3
+ isCompare: false,
4
+ outputImage: '',
5
+ },
6
+ async onLoad() {
7
+ try {
8
+ // await this.onLoadFontFace();
9
+ } catch (err) {
10
+ console.log(err);
11
+ }
12
+ },
13
+ async onLoadFontFace() {
14
+ wx.showLoading({
15
+ title: '加载字体..',
16
+ });
17
+ // await wx.loadFontFace({
18
+ // family: 'QianTuXianMoTi',
19
+ // source: 'https://bsvote.yolewa.com/QianTuXianMoTi-2.ttf',
20
+ // global: true,
21
+ // });
22
+ wx.hideLoading();
23
+ },
24
+ async onDrawCanvas() {
25
+ try {
26
+ const canvas = this.selectComponent('#wxml2canvas');
27
+ wx.showLoading({
28
+ title: '生成中..',
29
+ });
30
+ console.time('生成耗时');
31
+ await canvas.draw();
32
+ console.timeEnd('生成耗时');
33
+ let timer = setTimeout(async () => {
34
+ try {
35
+ const url = await canvas.toTempFilePath();
36
+ this.setData({ outputImage: url });
37
+ } catch (err) {
38
+ console.error(err);
39
+ }
40
+ wx.hideLoading();
41
+ clearTimeout(timer);
42
+ timer = null;
43
+ }, 300);
44
+ } catch (err) {
45
+ console.error(err);
46
+ }
47
+ },
48
+ onPreviewCanvas() {
49
+ const { outputImage } = this.data;
50
+ wx.previewImage({
51
+ urls: [outputImage],
52
+ });
53
+ },
54
+ onCanvasTouch() {
55
+ this.setData({ isCompare: true });
56
+ },
57
+ onCanvasLeave() {
58
+ this.setData({ isCompare: false });
59
+ },
60
+ });
@@ -0,0 +1,6 @@
1
+ {
2
+ "navigationBarTitleText": "自定义字体示例",
3
+ "usingComponents": {
4
+ "wxml2canvas": "/miniprogram_dist/vendor/wxml2canvas-2d/index"
5
+ }
6
+ }
@@ -0,0 +1,29 @@
1
+ <view class="container">
2
+ <view class="example">
3
+ <view wx:if="{{outputImage}}" class="example-hint">{{isCompare ? '生成' : '原'}}内容</view>
4
+ <view class="canvas custom-font wxml2canvas-container" catchtouchstart="onCanvasTouch" catchtouchend="onCanvasLeave">
5
+ <image src="{{outputImage}}" mode="widthFix" class="wxml2canvas {{isCompare && 'compared'}}" />
6
+ <view class="canvas-title wxml2canvas-item" data-text="GGGGGGGGGGGGgggggggggg">GGGGGGGGGGGGgggggggggg</view>
7
+ <!-- <image class="canvas-image wxml2canvas-item" src="/images/U3e6ny.jpg" mode="aspectFill" /> -->
8
+ <view class="canvas-row">
9
+ <view class="canvas-qrcode">
10
+ <!-- <image class="qrcode-image wxml2canvas-item" src="/images/qrcode.png" /> -->
11
+ </view>
12
+ <view class="canvas-content">
13
+ <view class="canvas-subtitle wxml2canvas-item" data-text="这是小标题">这是小标题</view>
14
+ <view class="canvas-descr wxml2canvas-item" data-text="填充测试内容填充测试内容填充测试内容填充测试内容填充测试内容">
15
+ <text>填充测试内容填充测试内容填充测试内容填充测试内容填充测试内容</text>
16
+ </view>
17
+ <view class="canvas-hint wxml2canvas-item" data-text="扫描左侧二维码">扫描左侧二维码</view>
18
+ </view>
19
+ </view>
20
+ </view>
21
+ <view wx:if="{{outputImage}}" class="example-hint">↑↑ 按住卡片实时对比 ↑↑</view>
22
+ </view>
23
+ <view class="buttons">
24
+ <button catchtap="onDrawCanvas">生成画布内容</button>
25
+ <button disabled="{{!outputImage}}" catchtap="onPreviewCanvas">查看生成内容</button>
26
+ </view>
27
+ </view>
28
+
29
+ <wxml2canvas id="wxml2canvas" />
@@ -0,0 +1,3 @@
1
+ .custom-font {
2
+ /* font-family: 'QianTuXianMoTi'; */
3
+ }
@@ -5,13 +5,13 @@ const icon_map_1 = require("../../icon-map");
5
5
  const normalizeIconName = (name) => {
6
6
  if (!name)
7
7
  return "";
8
- return name.startsWith("icon-") ? name.slice(5) : name;
8
+ return name.startsWith("layout-icon-") ? name.slice(5) : name;
9
9
  };
10
10
  const buildIconClassName = (name) => {
11
11
  const normalized = normalizeIconName(name);
12
12
  if (!normalized)
13
13
  return "";
14
- return `icon-${normalized}`;
14
+ return `layout-icon-${normalized}`;
15
15
  };
16
16
  const buildIconCode = (name) => {
17
17
  const normalized = normalizeIconName(name);
@@ -1,3 +1,3 @@
1
1
  <view class="km-node km-node--icon canvas-item" style="{{wrapperStyle}}">
2
- <view class="km-node__icon icon {{iconClass}} canvas-item" style="{{contentStyle}}" data-icon="{{iconCode}}"></view>
2
+ <view class="km-node__icon layoutIconFont {{iconClass}} canvas-item" style="{{contentStyle}}" data-icon="{{iconCode}}"></view>
3
3
  </view>
@@ -1,9 +1,9 @@
1
1
  @font-face {
2
2
  font-family: "layoutIconFont"; /* Project id 5095635 */
3
- src: url('//at.alicdn.com/t/c/font_5095635_ztv7ro0zm59.woff2?t=1766563440291') format('woff2'),
4
- url('//at.alicdn.com/t/c/font_5095635_ztv7ro0zm59.woff?t=1766563440291') format('woff'),
5
- url('//at.alicdn.com/t/c/font_5095635_ztv7ro0zm59.ttf?t=1766563440291') format('truetype'),
6
- url('//at.alicdn.com/t/c/font_5095635_ztv7ro0zm59.svg?t=1766563440291#layoutIconFont') format('svg');
3
+ src: url('//at.alicdn.com/t/c/font_5095635_0u3b33ft9ub.woff2?t=1770624313420') format('woff2'),
4
+ url('//at.alicdn.com/t/c/font_5095635_0u3b33ft9ub.woff?t=1770624313420') format('woff'),
5
+ url('//at.alicdn.com/t/c/font_5095635_0u3b33ft9ub.ttf?t=1770624313420') format('truetype'),
6
+ url('//at.alicdn.com/t/c/font_5095635_0u3b33ft9ub.svg?t=1770624313420#layoutIconFont') format('svg');
7
7
  }
8
8
 
9
9
  .layoutIconFont {
@@ -14,6 +14,10 @@
14
14
  -moz-osx-font-smoothing: grayscale;
15
15
  }
16
16
 
17
+ .layout-icon-refresh:before {
18
+ content: "\e62b";
19
+ }
20
+
17
21
  .layout-icon-round:before {
18
22
  content: "\e608";
19
23
  }
@@ -13,4 +13,5 @@ exports.ICON_CODE_MAP = {
13
13
  address: "e628",
14
14
  "website-line": "e679",
15
15
  website: "e643",
16
+ refresh: "e62b",
16
17
  };
@@ -7,17 +7,18 @@ const EMPTY_COMPANY_DUTY = {
7
7
  company: "",
8
8
  duty: "",
9
9
  };
10
+ const SWITCH_ANIMATION_MS = 420;
11
+ const SWIPE_MIN_DISTANCE = 40;
12
+ const SWIPE_DIRECTION_RATIO = 1.2;
10
13
  /**
11
- * 规范化 moreCardInfo.company,保证长度始终为 2
14
+ * 规范�?moreCardInfo.company,保证长度始终为 2
12
15
  */
13
16
  function normalizeMoreCompany(data) {
14
17
  var _a, _b;
15
18
  const origin = (_b = (_a = data.user) === null || _a === void 0 ? void 0 : _a.moreCardInfo) === null || _b === void 0 ? void 0 : _b.company;
16
- // 不存在 / 不是数组 → 不处理
17
19
  if (!Array.isArray(origin)) {
18
20
  return data;
19
21
  }
20
- // 长度 === 0 → 不处理
21
22
  if (origin.length === 0) {
22
23
  return data;
23
24
  }
@@ -43,13 +44,22 @@ const pickCardId = (layout, idx) => {
43
44
  return `card-${idx}`;
44
45
  };
45
46
  const buildCards = (layouts) => {
46
- return layouts.map((layout, idx) => ({
47
- id: pickCardId(layouts[idx], idx),
48
- cardStyle: (0, index_1.styleObjectToString)((0, index_1.buildCardStyle)(layout, "rpx"), "rpx"),
49
- backgroundImage: layout.backgroundImage || "",
50
- backgroundStyle: (0, index_1.styleObjectToString)((0, index_1.buildBackgroundStyle)(layout, "rpx"), "rpx"),
51
- elements: layout.children || [],
52
- }));
47
+ return layouts.map((layout, idx) => {
48
+ const baseCardStyle = (0, index_1.buildCardStyle)(layout, "rpx");
49
+ const cardStyle = (0, index_1.styleObjectToString)(baseCardStyle, "rpx");
50
+ const sizeStyle = (0, index_1.styleObjectToString)({
51
+ width: baseCardStyle.width,
52
+ height: baseCardStyle.height,
53
+ }, "rpx");
54
+ return {
55
+ id: pickCardId(layouts[idx], idx),
56
+ cardStyle,
57
+ sizeStyle,
58
+ backgroundImage: layout.backgroundImage || "",
59
+ backgroundStyle: (0, index_1.styleObjectToString)((0, index_1.buildBackgroundStyle)(layout, "rpx"), "rpx"),
60
+ elements: layout.children || [],
61
+ };
62
+ });
53
63
  };
54
64
  const nextTick = () => new Promise((resolve) => {
55
65
  wx.nextTick(() => resolve());
@@ -76,6 +86,20 @@ Component({
76
86
  rootData: {},
77
87
  firstCard: [],
78
88
  shareImage: "",
89
+ activeCard: null,
90
+ canvasCard: null,
91
+ frontCard: null,
92
+ backCard: null,
93
+ activeIndex: 0,
94
+ flipEnabled: false,
95
+ showToggle: false,
96
+ isFlipped: false,
97
+ isSwitching: false,
98
+ switch: {
99
+ name: "refresh",
100
+ size: 14,
101
+ style: "fill",
102
+ },
79
103
  },
80
104
  observers: {
81
105
  layout() {
@@ -100,18 +124,112 @@ Component({
100
124
  return self._fontReady;
101
125
  },
102
126
  rebuild() {
127
+ const self = this;
128
+ if (self._switchTimer) {
129
+ clearTimeout(self._switchTimer);
130
+ self._switchTimer = null;
131
+ }
103
132
  const data = normalizeMoreCompany(this.data.data);
104
133
  const layoutInput = (0, helpers_1.hasCompanyDutyKey)(this.data.layout)
105
134
  ? (0, index_1.processCardLayout)(this.data.layout, data)
106
135
  : this.data.layout;
107
136
  const rootData = (0, index_1.handleSpecialFields)(data);
108
137
  if (!layoutInput.length) {
109
- this.setData({ cards: [], rootData });
138
+ this.setData({
139
+ cards: [],
140
+ rootData,
141
+ activeCard: null,
142
+ canvasCard: null,
143
+ frontCard: null,
144
+ backCard: null,
145
+ activeIndex: 0,
146
+ flipEnabled: false,
147
+ showToggle: false,
148
+ isFlipped: false,
149
+ isSwitching: false,
150
+ });
110
151
  return;
111
152
  }
112
153
  const normalizedLayouts = (0, index_1.normalizeLayout)(layoutInput);
113
154
  const cards = buildCards(normalizedLayouts);
114
- this.setData({ cards, rootData, firstCard: [cards[0]] });
155
+ const activeIndex = 0;
156
+ const flipEnabled = cards.length > 1;
157
+ const activeCard = cards[activeIndex] || null;
158
+ const frontCard = cards[0] || null;
159
+ const backCard = cards[1] || null;
160
+ this.setData({
161
+ cards,
162
+ rootData,
163
+ firstCard: [cards[0]],
164
+ activeIndex,
165
+ activeCard,
166
+ canvasCard: activeCard,
167
+ frontCard,
168
+ backCard,
169
+ flipEnabled,
170
+ showToggle: flipEnabled,
171
+ isFlipped: false,
172
+ isSwitching: false,
173
+ });
174
+ },
175
+ handleToggleCard() {
176
+ const cards = this.data.cards;
177
+ if (!cards || cards.length < 2)
178
+ return;
179
+ if (this.data.isSwitching)
180
+ return;
181
+ const self = this;
182
+ if (self._switchTimer) {
183
+ clearTimeout(self._switchTimer);
184
+ self._switchTimer = null;
185
+ }
186
+ const nextIndex = this.data.activeIndex === 0 ? 1 : 0;
187
+ this.setData({
188
+ activeIndex: nextIndex,
189
+ activeCard: cards[nextIndex],
190
+ canvasCard: cards[nextIndex],
191
+ isFlipped: nextIndex === 1,
192
+ isSwitching: true,
193
+ });
194
+ self._switchTimer = setTimeout(() => {
195
+ self._switchTimer = null;
196
+ this.setData({ isSwitching: false });
197
+ }, SWITCH_ANIMATION_MS);
198
+ },
199
+ onToggleTap() {
200
+ this.handleToggleCard();
201
+ },
202
+ onTouchStart(event) {
203
+ const touch = event.touches && event.touches[0];
204
+ if (!touch)
205
+ return;
206
+ const self = this;
207
+ self._touchStartX = touch.clientX;
208
+ self._touchStartY = touch.clientY;
209
+ },
210
+ onTouchEnd(event) {
211
+ const self = this;
212
+ const touch = event.changedTouches && event.changedTouches[0];
213
+ if (!touch)
214
+ return;
215
+ const startX = self._touchStartX;
216
+ const startY = self._touchStartY;
217
+ self._touchStartX = null;
218
+ self._touchStartY = null;
219
+ if (typeof startX !== "number" || typeof startY !== "number")
220
+ return;
221
+ const dx = touch.clientX - startX;
222
+ const dy = touch.clientY - startY;
223
+ const absDx = Math.abs(dx);
224
+ const absDy = Math.abs(dy);
225
+ if (absDx > SWIPE_MIN_DISTANCE && absDx > absDy * SWIPE_DIRECTION_RATIO) {
226
+ this.handleToggleCard();
227
+ }
228
+ },
229
+ onTouchCancel() {
230
+ const self = this;
231
+ self._touchStartX = null;
232
+ self._touchStartY = null;
115
233
  },
116
234
  async handleDrawCanvas(options) {
117
235
  const self = this;
@@ -138,16 +256,22 @@ Component({
138
256
  self._isDrawing = false;
139
257
  }
140
258
  }
141
- },
142
- async handleDrawShareCanvas() {
259
+ }, async handleDrawShareCanvas() {
143
260
  var _a, _b, _c;
144
261
  const self = this;
145
262
  if (self._isDrawing)
146
263
  return;
147
264
  self._isDrawing = true;
265
+ let previousCanvasCard;
148
266
  try {
149
267
  // wait for setData / component render
150
268
  await nextTick();
269
+ const frontCard = this.data.frontCard || this.data.activeCard;
270
+ previousCanvasCard = this.data.canvasCard;
271
+ if (frontCard && frontCard !== previousCanvasCard) {
272
+ await new Promise((resolve) => this.setData({ canvasCard: frontCard }, resolve));
273
+ await nextTick();
274
+ }
151
275
  const layoutPath = await this.handleDrawCanvas({ waitForReady: false, skipDrawingGuard: true });
152
276
  if (!layoutPath)
153
277
  return;
@@ -165,6 +289,9 @@ Component({
165
289
  return filePath;
166
290
  }
167
291
  finally {
292
+ if (previousCanvasCard && previousCanvasCard !== this.data.canvasCard) {
293
+ this.setData({ canvasCard: previousCanvasCard });
294
+ }
168
295
  self._isDrawing = false;
169
296
  }
170
297
  },
@@ -173,8 +300,7 @@ Component({
173
300
  global: true,
174
301
  family: "layoutIconFont",
175
302
  scopes: ["native"],
176
- // 可以为 https 链接或者 Data URL
177
- source: "https://at.alicdn.com/t/c/font_5095635_ztv7ro0zm59.ttf?t=1766563440291",
303
+ source: "https://at.alicdn.com/t/c/font_5095635_0u3b33ft9ub.ttf?t=1770624313420",
178
304
  });
179
305
  },
180
306
  },
@@ -1,39 +1,63 @@
1
- <template name="layout-template">
2
- <block wx:for="{{renderCards}}" wx:key="id">
3
- <view class="km-card-layout layout-container">
4
- <view class="km-card-layout__item canvas-item">
5
- <view class="km-card canvas-item" style="{{item.cardStyle}}">
6
- <image wx:if="{{item.backgroundImage}}" class="km-card__bg canvas-item" style="{{item.backgroundStyle}}" src="{{item.backgroundImage}}" mode="aspectFill" />
7
- <block wx:for="{{item.elements}}" wx:key="id">
8
- <template wx:if="{{item.visible !== false}}" is="render-element" data="{{el:item, rootData: rootData}}" />
9
- </block>
10
- </view>
1
+ <view class="km-card-layout layout-view-container" bindtouchstart="onTouchStart" bindtouchend="onTouchEnd" bindtouchcancel="onTouchCancel">
2
+ <view class="km-card-layout__item canvas-item">
3
+ <view wx:if="{{flipEnabled}}" class="km-card-layout__flip {{isFlipped ? 'is-flipped' : ''}} {{isSwitching ? 'is-switching' : ''}}" style="{{frontCard.sizeStyle}}">
4
+ <view class="km-card-layout__face km-card-layout__face--front">
5
+ <template is="card-content" data="{{ idPrefix: 'view', card: frontCard, rootData: rootData }}" />
6
+ </view>
7
+ <view class="km-card-layout__face km-card-layout__face--back">
8
+ <template is="card-content" data="{{ idPrefix: 'view', card: backCard, rootData: rootData }}" />
11
9
  </view>
12
10
  </view>
13
- </block>
14
- </template>
15
- <template is="layout-template" data="{{ renderCards: cards, rootData: rootData }}"></template>
16
- <!-- 暂时只绘制第一张卡片 -->
17
- <wxml2canvas id="layout-canvas" container-class="layout-container" item-class="canvas-item"></wxml2canvas>
11
+ <view wx:else class="km-card-layout__single">
12
+ <template is="card-content" data="{{ idPrefix: 'view', card: activeCard, rootData: rootData }}" />
13
+ </view>
14
+ <view wx:if="{{showToggle}}" class="km-card-layout__toggle" catchtap="onToggleTap">
15
+ <icon-element element="{{switch}}" > </icon-element>
16
+ <text class="km-card-layout__toggle-text">{{activeIndex === 0?'反面':'正面'}}</text>
17
+ </view>
18
+ </view>
19
+ </view>
20
+
21
+ <view class="km-card-layout layout-canvas-container" style="{{canvasCard.sizeStyle}}">
22
+ <view class="km-card-layout__item canvas-item">
23
+ <view class="km-card-layout__single">
24
+ <template is="card-content" data="{{ idPrefix: 'canvas', card: canvasCard, rootData: rootData }}" />
25
+ </view>
26
+ </view>
27
+ </view>
28
+
29
+ <wxml2canvas id="layout-canvas" container-class="layout-canvas-container" item-class="canvas-item"></wxml2canvas>
18
30
  <share-canvas id="share-canvas"></share-canvas>
31
+
32
+ <template name="card-content">
33
+ <view wx:if="{{card}}" class="km-card canvas-item" style="{{card.cardStyle}}">
34
+ <image wx:if="{{card.backgroundImage}}" class="km-card__bg canvas-item" style="{{card.backgroundStyle}}" src="{{card.backgroundImage}}" mode="aspectFill" />
35
+ <block wx:for="{{card.elements}}" wx:key="id">
36
+ <template wx:if="{{item.visible !== false}}" is="render-element" data="{{el:item, rootData: rootData, idPrefix: idPrefix}}" />
37
+ </block>
38
+ </view>
39
+ </template>
40
+
19
41
  <template name="render-element">
20
42
  <block wx:if="{{el.type === 'image'}}">
21
- <image-element id="node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}" />
43
+ <image-element id="{{idPrefix}}-node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}" />
22
44
  </block>
23
45
  <block wx:elif="{{el.type === 'icon'}}">
24
- <icon-element id="node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}" />
46
+ <icon-element id="{{idPrefix}}-node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}" />
25
47
  </block>
26
48
  <block wx:elif="{{el.type === 'layout-panel'}}">
27
- <layout-panel-element id="node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}">
49
+ <layout-panel-element id="{{idPrefix}}-node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}">
28
50
  <block wx:for="{{el.children}}" wx:key="id">
29
- <template is="render-element" data="{{el:item, rootData: rootData}}" />
51
+ <template is="render-element" data="{{el:item, rootData: rootData, idPrefix: idPrefix}}" />
30
52
  </block>
31
53
  </layout-panel-element>
32
54
  </block>
33
55
  <block wx:elif="{{el.type === 'custom'}}">
34
- <custom-element id="node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}" />
56
+ <custom-element id="{{idPrefix}}-node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}" />
35
57
  </block>
36
58
  <block wx:else>
37
- <text-element id="node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}" />
59
+ <text-element id="{{idPrefix}}-node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}" />
38
60
  </block>
39
- </template>
61
+ </template>
62
+
63
+