km-card-layout-component-miniprogram 0.1.18 → 0.1.20

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 (62) hide show
  1. package/example/app.js +11 -1
  2. package/example/pages/home/index.js +324 -101
  3. package/example/pages/home/index.wxml +2 -1
  4. package/miniprogram_dist/components/card-layout/elements/custom-element/index.js +12 -6
  5. package/miniprogram_dist/components/card-layout/elements/custom-element/index.wxml +2 -2
  6. package/miniprogram_dist/components/card-layout/elements/custom-element/index.wxss +1 -1
  7. package/miniprogram_dist/components/card-layout/elements/icon-element/index.js +32 -15
  8. package/miniprogram_dist/components/card-layout/elements/icon-element/index.wxml +2 -4
  9. package/miniprogram_dist/components/card-layout/elements/icon-element/index.wxss +3 -17
  10. package/miniprogram_dist/components/card-layout/elements/icon-font.wxss +438 -0
  11. package/miniprogram_dist/components/card-layout/elements/image-element/index.js +18 -9
  12. package/miniprogram_dist/components/card-layout/elements/image-element/index.wxml +2 -2
  13. package/miniprogram_dist/components/card-layout/elements/image-element/index.wxss +1 -1
  14. package/miniprogram_dist/components/card-layout/elements/layout-panel-element/index.js +37 -0
  15. package/miniprogram_dist/components/card-layout/elements/layout-panel-element/index.json +3 -0
  16. package/miniprogram_dist/components/card-layout/elements/layout-panel-element/index.wxml +5 -0
  17. package/miniprogram_dist/components/card-layout/elements/layout-panel-element/index.wxss +10 -0
  18. package/miniprogram_dist/components/card-layout/elements/text-element/index.js +41 -17
  19. package/miniprogram_dist/components/card-layout/elements/text-element/index.wxml +8 -32
  20. package/miniprogram_dist/components/card-layout/elements/text-element/index.wxss +5 -22
  21. package/miniprogram_dist/components/card-layout/index.js +29 -38
  22. package/miniprogram_dist/components/card-layout/index.json +3 -1
  23. package/miniprogram_dist/components/card-layout/index.wxml +25 -29
  24. package/miniprogram_dist/components/card-layout/index.wxss +1 -455
  25. package/miniprogram_dist/vendor/wxml2canvas-2d/canvas.js +1116 -0
  26. package/miniprogram_dist/vendor/wxml2canvas-2d/constants.js +42 -0
  27. package/miniprogram_dist/vendor/wxml2canvas-2d/element.js +420 -0
  28. package/miniprogram_dist/vendor/wxml2canvas-2d/gradient.js +634 -0
  29. package/miniprogram_dist/vendor/wxml2canvas-2d/index.js +169 -0
  30. package/miniprogram_dist/vendor/wxml2canvas-2d/index.json +4 -0
  31. package/miniprogram_dist/vendor/wxml2canvas-2d/index.wxml +7 -0
  32. package/miniprogram_dist/vendor/wxml2canvas-2d/index.wxss +5 -0
  33. package/package.json +1 -1
  34. package/src/components/card-layout/elements/custom-element/index.ts +13 -7
  35. package/src/components/card-layout/elements/custom-element/index.wxml +2 -2
  36. package/src/components/card-layout/elements/custom-element/index.wxss +1 -1
  37. package/src/components/card-layout/elements/icon-element/index.ts +34 -16
  38. package/src/components/card-layout/elements/icon-element/index.wxml +2 -4
  39. package/src/components/card-layout/elements/icon-element/index.wxss +3 -17
  40. package/src/components/card-layout/elements/icon-font.wxss +438 -0
  41. package/src/components/card-layout/elements/image-element/index.ts +21 -11
  42. package/src/components/card-layout/elements/image-element/index.wxml +2 -2
  43. package/src/components/card-layout/elements/image-element/index.wxss +1 -1
  44. package/src/components/card-layout/elements/layout-panel-element/index.json +3 -0
  45. package/src/components/card-layout/elements/layout-panel-element/index.ts +40 -0
  46. package/src/components/card-layout/elements/layout-panel-element/index.wxml +5 -0
  47. package/src/components/card-layout/elements/layout-panel-element/index.wxss +10 -0
  48. package/src/components/card-layout/elements/text-element/index.ts +48 -19
  49. package/src/components/card-layout/elements/text-element/index.wxml +8 -32
  50. package/src/components/card-layout/elements/text-element/index.wxss +5 -22
  51. package/src/components/card-layout/index.json +3 -1
  52. package/src/components/card-layout/index.ts +34 -62
  53. package/src/components/card-layout/index.wxml +25 -29
  54. package/src/components/card-layout/index.wxss +1 -455
  55. package/src/vendor/wxml2canvas-2d/canvas.js +1116 -0
  56. package/src/vendor/wxml2canvas-2d/constants.js +42 -0
  57. package/src/vendor/wxml2canvas-2d/element.js +420 -0
  58. package/src/vendor/wxml2canvas-2d/gradient.js +634 -0
  59. package/src/vendor/wxml2canvas-2d/index.js +169 -0
  60. package/src/vendor/wxml2canvas-2d/index.json +4 -0
  61. package/src/vendor/wxml2canvas-2d/index.wxml +7 -0
  62. package/src/vendor/wxml2canvas-2d/index.wxss +5 -0
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("../../../../vendor/km-card-layout-core/index");
4
+ Component({
5
+ options: {
6
+ styleIsolation: "apply-shared",
7
+ },
8
+ properties: {
9
+ element: {
10
+ type: Object,
11
+ value: {},
12
+ },
13
+ rootData: {
14
+ type: Object,
15
+ value: {},
16
+ },
17
+ },
18
+ data: {
19
+ wrapperStyle: "",
20
+ contentStyle: "",
21
+ },
22
+ observers: {
23
+ element() {
24
+ this.rebuild();
25
+ },
26
+ },
27
+ methods: {
28
+ rebuild() {
29
+ const el = this.data.element;
30
+ if (!el)
31
+ return;
32
+ const wrapperStyle = (0, index_1.styleObjectToString)((0, index_1.buildWrapperStyle)(el, "rpx"), "rpx");
33
+ const contentStyle = (0, index_1.styleObjectToString)((0, index_1.buildPanelContentStyle)(el, "rpx"), "rpx");
34
+ this.setData({ wrapperStyle, contentStyle });
35
+ },
36
+ },
37
+ });
@@ -0,0 +1,5 @@
1
+ <view class="km-node itemClass" style="{{wrapperStyle}}">
2
+ <view class="km-node__panel itemClass" style="{{contentStyle}}">
3
+ <slot></slot>
4
+ </view>
5
+ </view>
@@ -0,0 +1,10 @@
1
+ .km-node {
2
+ box-sizing: border-box;
3
+ color: inherit;
4
+ }
5
+
6
+ .km-node__panel {
7
+ width: 100%;
8
+ height: 100%;
9
+ box-sizing: border-box;
10
+ }
@@ -2,17 +2,26 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const index_1 = require("../../../../vendor/km-card-layout-core/index");
4
4
  const icon_map_1 = require("../../icon-map");
5
- const mapIconGlyph = (name, fallback) => {
5
+ const normalizeIconName = (name) => {
6
6
  if (!name)
7
- return fallback;
8
- const glyph = icon_map_1.ICON_CODE_MAP[name];
9
- if (glyph)
10
- return String.fromCharCode(parseInt(glyph, 16));
11
- return fallback || name;
7
+ return "";
8
+ return name.startsWith("icon-") ? name.slice(5) : name;
9
+ };
10
+ const buildIconClassName = (name) => {
11
+ const normalized = normalizeIconName(name);
12
+ if (!normalized)
13
+ return "";
14
+ return `icon-${normalized}`;
15
+ };
16
+ const buildIconCode = (name) => {
17
+ const normalized = normalizeIconName(name);
18
+ if (!normalized)
19
+ return "";
20
+ return icon_map_1.ICON_CODE_MAP[normalized] || "";
12
21
  };
13
22
  Component({
14
23
  options: {
15
- styleIsolation: 'apply-shared',
24
+ styleIsolation: "apply-shared",
16
25
  },
17
26
  properties: {
18
27
  element: {
@@ -25,28 +34,43 @@ Component({
25
34
  },
26
35
  },
27
36
  data: {
28
- wrapperStyle: '',
29
- contentStyle: '',
30
- textValue: '',
37
+ wrapperStyle: "",
38
+ contentStyle: "",
39
+ textValue: "",
40
+ textStyle: "",
31
41
  iconMeta: null,
32
42
  },
33
43
  observers: {
34
- element(el) {
44
+ element() {
45
+ this.rebuild();
46
+ },
47
+ rootData() {
48
+ this.rebuild();
49
+ },
50
+ },
51
+ methods: {
52
+ rebuild() {
53
+ const el = this.data.element;
35
54
  if (!el)
36
55
  return;
37
56
  const data = this.data.rootData || {};
38
- const wrapperStyle = (0, index_1.styleObjectToString)((0, index_1.buildWrapperStyle)(el, 'rpx'), 'rpx');
39
- const contentStyle = (0, index_1.styleObjectToString)((0, index_1.buildTextContentStyle)(el, 'rpx'), 'rpx');
57
+ const wrapperStyle = (0, index_1.styleObjectToString)((0, index_1.buildWrapperStyle)(el, "rpx"), "rpx");
58
+ const contentStyle = (0, index_1.styleObjectToString)((0, index_1.buildTextContentStyle)(el, "rpx"), "rpx");
40
59
  const textValue = (0, index_1.getTextValue)(el, data);
41
- const iconRaw = (0, index_1.buildTextIconMeta)(el, 'rpx');
60
+ const textStyle = (0, index_1.styleObjectToString)({
61
+ ...(0, index_1.buildTextContentStyle)(el, "rpx"),
62
+ ...(0, index_1.buildTextValueStyle)(el, "rpx"),
63
+ }, "rpx");
64
+ const iconRaw = (0, index_1.buildTextIconMeta)(el, "rpx");
42
65
  const iconMeta = iconRaw && iconRaw.name
43
66
  ? {
44
67
  ...iconRaw,
45
- text: mapIconGlyph(iconRaw.name, iconRaw.name),
46
- wrapperStyle: (0, index_1.styleObjectToString)(iconRaw.wrapperStyle, 'rpx'),
68
+ className: buildIconClassName(iconRaw.name),
69
+ iconCode: buildIconCode(iconRaw.name),
70
+ wrapperStyle: (0, index_1.styleObjectToString)(iconRaw.wrapperStyle, "rpx"),
47
71
  }
48
72
  : iconRaw;
49
- this.setData({ wrapperStyle, contentStyle, textValue, iconMeta });
73
+ this.setData({ wrapperStyle, contentStyle, textValue, textStyle, iconMeta });
50
74
  },
51
75
  },
52
76
  });
@@ -1,42 +1,18 @@
1
- <view class="km-node km-node--text" style="{{wrapperStyle}}">
2
- <view class="km-node__text" style="{{contentStyle}}">
3
- <block wx:if="{{(iconMeta && (iconMeta.name || iconMeta.text)) && (element.icon && element.icon.style !== 'text')}}">
4
- <view class="km-node__text-content">
5
-
6
- <!-- icon 在右侧 -->
7
- <block wx:if="{{iconMeta && iconMeta.align === 'right'}}">
8
- <text class="km-node__text-value">{{(element.icon && element.icon.style === 'text' && element.icon.enable) ? (element.label + ':') : ''}}{{textValue || ''}}</text>
1
+ <view class="km-node km-node--text canvas-item" style="{{wrapperStyle}}">
2
+ <view class="km-node__text canvas-item" style="{{contentStyle}}">
3
+ <block wx:if="{{iconMeta && iconMeta.name && (element.icon && element.icon.style !== 'text')}}">
4
+ <view class="km-node__text-content canvas-item">
9
5
  <view
10
- class="km-node__text-icon--wrapper"
6
+ class="km-node__text-icon--wrapper canvas-item"
11
7
  style="{{iconMeta.wrapperStyle}}"
12
8
  >
13
- <text
14
- class="km-node__text-icon icon"
15
- style="font-size: {{iconMeta.size || '16px'}}; color: {{iconMeta.color || ''}}; margin-right: {{iconMeta.gap || ''}};"
16
- >{{iconMeta.text || iconMeta.name || ''}}</text>
9
+ <i class="km-node__text-icon icon {{iconMeta.className}} canvas-item" style="font-size: {{iconMeta.size || '16px'}}; color: {{iconMeta.color || ''}}; margin-right: {{iconMeta.gap || ''}};" data-icon="{{iconMeta.iconCode}}" ></i>
17
10
  </view>
18
- </block>
19
-
20
- <!-- icon 在左侧 -->
21
- <block wx:else>
22
- <view
23
- class="km-node__text-icon--wrapper"
24
- style="{{iconMeta.wrapperStyle}}"
25
- >
26
- <text
27
- class="km-node__text-icon icon"
28
- style="font-size: {{iconMeta.size || '16px'}}; color: {{iconMeta.color || ''}}; margin-right: {{iconMeta.gap || ''}};"
29
- >{{iconMeta.text || iconMeta.name || ''}}</text>
30
- </view>
31
- <text class="km-node__text-value">{{textValue || ''}}</text>
32
- </block>
33
-
11
+ <text class="km-node__text-value canvas-item" style="{{textStyle}}" data-text="{{textValue || ''}}">{{textValue || ''}}</text>
34
12
  </view>
35
13
  </block>
36
-
37
- <!-- 无 icon -->
38
14
  <block wx:else>
39
- <text class="km-node__text-value">{{(element.icon && element.icon.style === 'text' && element.icon.enable) ? (element.label + ':') : ''}}{{textValue || ''}}</text>
15
+ <text class="km-node__text-value canvas-item" style="{{textStyle}}" data-text="{{(element.icon && element.icon.style === 'text' && element.icon.enable) ? (element.label + ':') : ''}}{{textValue || ''}}">{{(element.icon && element.icon.style === 'text' && element.icon.enable) ? (element.label + ':') : ''}}{{textValue || ''}}</text>
40
16
  </block>
41
17
  </view>
42
18
  </view>
@@ -1,12 +1,10 @@
1
+ @import "../icon-font.wxss";
2
+
1
3
  .km-node {
2
4
  box-sizing: border-box;
3
5
  color: inherit;
4
6
  }
5
7
 
6
- .km-node--text {
7
- /* overflow hidden if needed */
8
- }
9
-
10
8
  .km-node--text text {
11
9
  display: inline;
12
10
  }
@@ -23,6 +21,7 @@
23
21
  display: inline-block;
24
22
  vertical-align: middle;
25
23
  height: 100%;
24
+ display: inline-flex;
26
25
  }
27
26
 
28
27
  .km-node__text-icon {
@@ -38,22 +37,6 @@
38
37
  vertical-align: middle;
39
38
  }
40
39
 
41
- @font-face {
42
- font-family: 'km-icon';
43
- src: url('data:font/woff;charset=utf-8;base64,d09GRgABAAAAAEl4AA0AAAAAcmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAABJXAAAABoAAAAcrMtJV0dERUYAAEk8AAAAHgAAAB4AKQByT1MvMgAAAaQAAABGAAAAYDw3SVljbWFwAAAC7AAAAM8AAAIW8XL3K2dhc3AAAEk0AAAACAAAAAj//wADZ2x5ZgAABJgAAEBZAABkZPJymXJoZWFkAAABMAAAADEAAAA2MtZiFmhoZWEAAAFkAAAAIAAAACQNagmCaG10eAAAAewAAAD/AAABqqs3Ii9sb2NhAAADvAAAANoAAADaKv0P7G1heHAAAAGEAAAAHwAAACABmQHEbmFtZQAARPQAAAFGAAACgl6CAQJwb3N0AABGPAAAAvUAAATh1g15W3jaY2BkYGAA4lqffPd4fpuvDNwsDCDwVIyfA0b///i/gXMWcyeQy8HABBIFAAVdCfwAAAB42mNgZGBgbvjfwBDDOfP/x///OWcxAEVQQCYAuxgH/XjaY2BkYGDIYdzBoMwAAkxAzAWEDAz/wXwGACjlAl8AeNpjYGFRYJzAwMrAwNTJdIaBgaEfQjO+ZjBi5ACKMrAyM2AFAWmuKQwHnjE+y2Ju+N/AwMB8h6ERKMyIpESBgREAenQNCwAAeNo90cErBGEYx/Hf1LMH7MVxoigHtS600pzWnMjBlt2dFAeiNuWgXLgokgslbpyE/Aduyl38J3ty4aCs7/vOk6lPv+d5531n3nfGVF5JIZlUx9fAbawnEfIFq14/YhddFPjFmynZ9n4TbYzg2tcMW6Epr4NQT3jSJ2lcW9ec1fSEAheMnVume7KKBbQwiMye+5/kEpqYwQoOY59pn1xGw3Lt8NwHS7UY35frivqbet2fNYZp+4j76vj+GpUhjZJreLfxODecay/eTzVPzmIj9uX7VLnUmfdb/2fN4trcv0kYv8Oxe/V5Rzhg7inZ8wzjN5b0f6z8PV2d/AHivi0JAHja3dBFUoVRDITR88PD3d3d3d3d3d33zQqYwwVGbIGk8qV6kK7qIN7vlIsCRdlBRT865iPsWOig318/PwOjbwYd+7mKSZAoSbIUqdKky5ApS7YcufLkK1CoSLESpcqCZ4VKVarVqFWnXoNGTZq1aNWmXYdOXbr16NWn34BBQ4aNGDVm3IRJU6bNmDVn3oJFS5atWLVm3YZNW7bt2LVn34FDR46dOHXm3IVLV67duHXn3oNHT8Hv2YtXbyFaot9HfMeMC4jztyL/vr4AXx4eawAAAAAAAAAAAACwAPIDSgQ8BLIFUgWUBcIF/gY8BpIHCgdAB3wHoAgOCHAIxgk+CV4JzAnqCkQKrgtUC8QMEAxsDNQNFA1SDegONg6qDyQPgg/CEAIQxBEwEaQSHBLYE14T4hRcFPIVTBYMFkwWqBckGGAYxhmYGegaEBpeGuIbXhvwHPQd5B62Hygf6CBeILog9CFUIbgiBCJ0ItQjbCQSJGgkuCVsJcImKib0J44ocijOKSApUCo2KmQqtituK34sJixkLMgtdC3WLpgvPC+QMBww/DGCMagyMgAA') format('woff');
44
- font-weight: normal;
45
- font-style: normal;
46
- font-display: swap;
47
- }
48
-
49
- .icon {
50
- font-family: 'km-icon' !important;
51
- font-size: 16px;
52
- font-style: normal;
53
- -webkit-font-smoothing: antialiased;
54
- -moz-osx-font-smoothing: grayscale;
55
- }
56
-
57
- .km-node__text-icon--wrapper{
40
+ .km-node__text-icon--wrapper {
58
41
  display: inline-block;
59
- }
42
+ }
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.hasCompanyDutyKey = exports.normalizeMoreCompany = void 0;
4
4
  const index_1 = require("../../vendor/km-card-layout-core/index");
5
5
  const EMPTY_COMPANY_DUTY = {
6
- company: '',
7
- duty: '',
6
+ company: "",
7
+ duty: "",
8
8
  };
9
9
  /**
10
10
  * 规范化 moreCardInfo.company,保证长度始终为 2
@@ -43,77 +43,54 @@ const handleSpecialFields = (data) => {
43
43
  ...data,
44
44
  user: {
45
45
  ...user,
46
- baseCompanyDuty: user.company && user.duty
47
- ? `${user.company} ${user.duty}`
48
- : user.baseCompanyDuty,
46
+ baseCompanyDuty: user.company && user.duty ? `${user.company} ${user.duty}` : user.baseCompanyDuty,
49
47
  moreCardInfo: user.moreCardInfo
50
48
  ? {
51
49
  ...user.moreCardInfo,
52
50
  company: Array.isArray(user.moreCardInfo.company)
53
- ? user.moreCardInfo.company.map(item => `${item.company} ${item.duty}`)
51
+ ? user.moreCardInfo.company.map((item) => `${item.company} ${item.duty}`)
54
52
  : user.moreCardInfo.company,
55
53
  }
56
54
  : user.moreCardInfo,
57
55
  },
58
56
  };
59
57
  };
60
- const ensureArray = (input) => {
61
- if (!input)
62
- return [];
63
- return Array.isArray(input) ? input : [input];
64
- };
65
58
  const pickCardId = (layout, idx) => {
66
59
  if (layout && (layout.name || layout.id))
67
60
  return layout.name || layout.id;
68
61
  return `card-${idx}`;
69
62
  };
70
- const decorateElements = (children = []) => (children || []).map(el => {
71
- if (el.type === 'layout-panel') {
72
- const panel = el;
73
- return {
74
- ...panel,
75
- wrapperStyle: (0, index_1.styleObjectToString)((0, index_1.buildWrapperStyle)(panel, 'rpx'), 'rpx'),
76
- contentStyle: (0, index_1.styleObjectToString)((0, index_1.buildPanelContentStyle)(panel, 'rpx'), 'rpx'),
77
- children: decorateElements(panel.children || []),
78
- };
79
- }
80
- return el;
81
- });
82
63
  const buildCards = (layouts) => {
83
64
  return layouts.map((layout, idx) => ({
84
65
  id: pickCardId(layouts[idx], idx),
85
- cardStyle: (0, index_1.styleObjectToString)((0, index_1.buildCardStyle)(layout, 'rpx'), 'rpx'),
86
- backgroundImage: layout.backgroundImage || '',
87
- backgroundStyle: (0, index_1.styleObjectToString)((0, index_1.buildBackgroundStyle)(layout, 'rpx'), 'rpx'),
88
- elements: decorateElements(layout.children || []),
66
+ cardStyle: (0, index_1.styleObjectToString)((0, index_1.buildCardStyle)(layout, "rpx"), "rpx"),
67
+ backgroundImage: layout.backgroundImage || "",
68
+ backgroundStyle: (0, index_1.styleObjectToString)((0, index_1.buildBackgroundStyle)(layout, "rpx"), "rpx"),
69
+ elements: layout.children || [],
89
70
  }));
90
71
  };
91
72
  const hasCompanyDutyKey = (schemas) => {
92
- const TARGET_KEYS = new Set([
93
- 'company_duty_custom',
94
- 'company_duty_1',
95
- 'company_duty_2',
96
- ]);
73
+ const TARGET_KEYS = new Set(["company_duty_custom", "company_duty_1", "company_duty_2"]);
97
74
  const traverse = (elements) => {
98
- return elements.some(el => {
75
+ return elements.some((el) => {
99
76
  var _a;
100
77
  // 命中 key
101
78
  if (el.key && TARGET_KEYS.has(el.key)) {
102
79
  return true;
103
80
  }
104
81
  // 递归 layout-panel
105
- if (el.type === 'layout-panel' && ((_a = el.children) === null || _a === void 0 ? void 0 : _a.length)) {
82
+ if (el.type === "layout-panel" && ((_a = el.children) === null || _a === void 0 ? void 0 : _a.length)) {
106
83
  return traverse(el.children);
107
84
  }
108
85
  return false;
109
86
  });
110
87
  };
111
- return schemas.some(schema => traverse(schema.children));
88
+ return schemas.some((schema) => traverse(schema.children));
112
89
  };
113
90
  exports.hasCompanyDutyKey = hasCompanyDutyKey;
114
91
  Component({
115
92
  options: {
116
- styleIsolation: 'apply-shared',
93
+ styleIsolation: "apply-shared",
117
94
  },
118
95
  properties: {
119
96
  layout: {
@@ -131,6 +108,7 @@ Component({
131
108
  data: {
132
109
  cards: [],
133
110
  rootData: {},
111
+ firstCard: [],
134
112
  },
135
113
  observers: {
136
114
  layout() {
@@ -148,7 +126,9 @@ Component({
148
126
  methods: {
149
127
  rebuild() {
150
128
  const data = normalizeMoreCompany(this.data.data);
151
- const layoutInput = (0, exports.hasCompanyDutyKey)(this.data.layout) ? (0, index_1.processCardLayout)(this.data.layout, data) : this.data.layout;
129
+ const layoutInput = (0, exports.hasCompanyDutyKey)(this.data.layout)
130
+ ? (0, index_1.processCardLayout)(this.data.layout, data)
131
+ : this.data.layout;
152
132
  const rootData = handleSpecialFields(data);
153
133
  if (!layoutInput.length) {
154
134
  this.setData({ cards: [], rootData });
@@ -156,7 +136,18 @@ Component({
156
136
  }
157
137
  const normalizedLayouts = (0, index_1.normalizeLayout)(layoutInput);
158
138
  const cards = buildCards(normalizedLayouts);
159
- this.setData({ cards, rootData });
139
+ this.setData({ cards, rootData, firstCard: [cards[0]] });
140
+ },
141
+ async handleDrawCanvas() {
142
+ try {
143
+ const canvas = this.selectComponent(`#layout-canvas`);
144
+ await canvas.draw(this);
145
+ const filePath = await canvas.toTempFilePath();
146
+ return filePath;
147
+ }
148
+ catch (_a) {
149
+ wx.showToast({ title: "保存失败", icon: "error" });
150
+ }
160
151
  },
161
152
  },
162
153
  });
@@ -4,6 +4,8 @@
4
4
  "text-element": "./elements/text-element/index",
5
5
  "image-element": "./elements/image-element/index",
6
6
  "icon-element": "./elements/icon-element/index",
7
- "custom-element": "./elements/custom-element/index"
7
+ "custom-element": "./elements/custom-element/index",
8
+ "layout-panel-element": "./elements/layout-panel-element/index",
9
+ "wxml2canvas": "../../vendor/wxml2canvas-2d/index"
8
10
  }
9
11
  }
@@ -1,42 +1,38 @@
1
- <view class="km-card-layout">
2
- <block wx:for="{{cards}}" wx:key="id">
3
- <view class="km-card-layout__item">
4
- <view class="km-card" style="{{item.cardStyle}}">
5
- <image
6
- wx:if="{{item.backgroundImage}}"
7
- class="km-card__bg"
8
- style="{{item.backgroundStyle}}"
9
- src="{{item.backgroundImage}}"
10
- mode="aspectFill"
11
- />
12
- <block wx:for="{{item.elements}}" wx:key="id">
13
- <template wx:if="{{item.visible !== false}}" is="render-element" data="{{el:item, rootData: rootData}}" />
14
- </block>
1
+ <template name="layout-template">
2
+ <view class="km-card-layout layout-container">
3
+ <block wx:for="{{renderCards}}" wx:key="id">
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>
15
11
  </view>
16
- </view>
17
- </block>
18
- </view>
19
-
12
+ </block>
13
+ </view>
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>
20
18
  <template name="render-element">
21
19
  <block wx:if="{{el.type === 'image'}}">
22
- <image-element element="{{el}}" rootData="{{rootData}}" />
20
+ <image-element id="node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}" />
23
21
  </block>
24
22
  <block wx:elif="{{el.type === 'icon'}}">
25
- <icon-element element="{{el}}" rootData="{{rootData}}" />
23
+ <icon-element id="node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}" />
26
24
  </block>
27
25
  <block wx:elif="{{el.type === 'layout-panel'}}">
28
- <view class="km-node" style="{{el.wrapperStyle}}">
29
- <view class="km-node__panel" style="{{el.contentStyle}}">
30
- <block wx:for="{{el.children}}" wx:key="id">
31
- <template is="render-element" data="{{el:item, rootData: rootData}}" />
32
- </block>
33
- </view>
34
- </view>
26
+ <layout-panel-element id="node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}">
27
+ <block wx:for="{{el.children}}" wx:key="id">
28
+ <template is="render-element" data="{{el:item, rootData: rootData}}" />
29
+ </block>
30
+ </layout-panel-element>
35
31
  </block>
36
32
  <block wx:elif="{{el.type === 'custom'}}">
37
- <custom-element element="{{el}}" rootData="{{rootData}}" />
33
+ <custom-element id="node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}" />
38
34
  </block>
39
35
  <block wx:else>
40
- <text-element element="{{el}}" rootData="{{rootData}}" />
36
+ <text-element id="node-{{el.id}}" class="canvas-item" data-component="{{true}}" element="{{el}}" rootData="{{rootData}}" />
41
37
  </block>
42
38
  </template>