km-card-layout-component-miniprogram 0.1.8 → 0.1.9

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 (66) hide show
  1. package/example/pages/home/index.js +107 -16
  2. package/miniprogram_dist/components/card-layout/elements/custom-element/index.js +27 -0
  3. package/miniprogram_dist/components/card-layout/elements/custom-element/index.json +3 -0
  4. package/miniprogram_dist/components/card-layout/elements/custom-element/index.wxml +5 -0
  5. package/miniprogram_dist/components/card-layout/elements/custom-element/index.wxss +14 -0
  6. package/miniprogram_dist/components/card-layout/elements/icon-element/index.js +39 -0
  7. package/miniprogram_dist/components/card-layout/elements/icon-element/index.json +3 -0
  8. package/miniprogram_dist/components/card-layout/elements/icon-element/index.wxml +5 -0
  9. package/miniprogram_dist/components/card-layout/elements/icon-element/index.wxss +37 -0
  10. package/miniprogram_dist/components/card-layout/elements/image-element/index.js +31 -0
  11. package/miniprogram_dist/components/card-layout/elements/image-element/index.json +3 -0
  12. package/miniprogram_dist/components/card-layout/elements/image-element/index.wxml +8 -0
  13. package/miniprogram_dist/components/card-layout/elements/image-element/index.wxss +10 -0
  14. package/miniprogram_dist/components/card-layout/elements/text-element/index.js +47 -0
  15. package/miniprogram_dist/components/card-layout/elements/text-element/index.json +3 -0
  16. package/miniprogram_dist/components/card-layout/elements/text-element/index.wxml +29 -0
  17. package/miniprogram_dist/components/card-layout/elements/text-element/index.wxss +59 -0
  18. package/miniprogram_dist/components/card-layout/index.js +19 -36
  19. package/miniprogram_dist/components/card-layout/index.json +7 -1
  20. package/miniprogram_dist/components/card-layout/index.wxml +15 -63
  21. package/miniprogram_dist/components/card-layout/index.wxss +0 -65
  22. package/miniprogram_dist/utils/card-schema.js +12 -3
  23. package/miniprogram_dist/vendor/km-card-layout-core/bindings.js +4 -0
  24. package/miniprogram_dist/vendor/km-card-layout-core/index.js +37 -6
  25. package/miniprogram_dist/vendor/km-card-layout-core/interface/index.js +1 -1
  26. package/miniprogram_dist/vendor/km-card-layout-core/ops/changeBackground.js +8 -1
  27. package/miniprogram_dist/vendor/km-card-layout-core/render/helpers.js +133 -0
  28. package/miniprogram_dist/vendor/km-card-layout-core/render/tool.js +16 -0
  29. package/package.json +1 -1
  30. package/script/sync-core.js +3 -0
  31. package/src/components/card-layout/elements/custom-element/index.json +3 -0
  32. package/src/components/card-layout/elements/custom-element/index.ts +30 -0
  33. package/src/components/card-layout/elements/custom-element/index.wxml +5 -0
  34. package/src/components/card-layout/elements/custom-element/index.wxss +14 -0
  35. package/src/components/card-layout/elements/icon-element/index.json +3 -0
  36. package/src/components/card-layout/elements/icon-element/index.ts +42 -0
  37. package/src/components/card-layout/elements/icon-element/index.wxml +5 -0
  38. package/src/components/card-layout/elements/icon-element/index.wxss +37 -0
  39. package/src/components/card-layout/elements/image-element/index.json +3 -0
  40. package/src/components/card-layout/elements/image-element/index.ts +35 -0
  41. package/src/components/card-layout/elements/image-element/index.wxml +8 -0
  42. package/src/components/card-layout/elements/image-element/index.wxss +10 -0
  43. package/src/components/card-layout/elements/text-element/index.json +3 -0
  44. package/src/components/card-layout/elements/text-element/index.ts +52 -0
  45. package/src/components/card-layout/elements/text-element/index.wxml +29 -0
  46. package/src/components/card-layout/elements/text-element/index.wxss +59 -0
  47. package/src/components/card-layout/index.json +7 -1
  48. package/src/components/card-layout/index.ts +36 -45
  49. package/src/components/card-layout/index.wxml +15 -63
  50. package/src/components/card-layout/index.wxss +0 -65
  51. package/src/utils/card-schema.ts +11 -4
  52. package/src/vendor/km-card-layout-core/bindings.ts +3 -0
  53. package/src/vendor/km-card-layout-core/data.ts +2 -1
  54. package/src/vendor/km-card-layout-core/index.ts +37 -5
  55. package/src/vendor/km-card-layout-core/interface/context.ts +6 -0
  56. package/src/vendor/km-card-layout-core/interface/data/payload.ts +1 -0
  57. package/src/vendor/km-card-layout-core/interface/index.ts +2 -2
  58. package/src/vendor/km-card-layout-core/ops/changeBackground.ts +14 -4
  59. package/src/vendor/km-card-layout-core/render/helpers.ts +144 -0
  60. package/src/vendor/km-card-layout-core/render/tool.ts +21 -0
  61. package/src/vendor/km-card-layout-core/types.d.ts +71 -12
  62. package/src/vendor/km-card-layout-core/utils.ts +4 -0
  63. package/miniprogram_dist/vendor/km-card-layout-core/render/builder.js +0 -210
  64. package/src/vendor/km-card-layout-core/interface/render.ts +0 -53
  65. package/src/vendor/km-card-layout-core/render/builder.ts +0 -288
  66. /package/miniprogram_dist/vendor/km-card-layout-core/interface/{render.js → context.js} +0 -0
@@ -0,0 +1,35 @@
1
+ import {
2
+ buildImageContentStyle,
3
+ buildWrapperStyle,
4
+ getImageSrc,
5
+ styleObjectToString,
6
+ type ImageElement,
7
+ } from '../../../../vendor/km-card-layout-core/index';
8
+
9
+ Component({
10
+ options: {
11
+ styleIsolation: 'apply-shared',
12
+ },
13
+ properties: {
14
+ element: {
15
+ type: Object,
16
+ value: {},
17
+ },
18
+ },
19
+ data: {
20
+ wrapperStyle: '',
21
+ contentStyle: '',
22
+ imageSrc: '',
23
+ mode: 'aspectFill',
24
+ },
25
+ observers: {
26
+ element(el: ImageElement) {
27
+ if (!el) return;
28
+ const wrapperStyle = styleObjectToString(buildWrapperStyle(el, 'rpx'), 'rpx');
29
+ const contentStyle = styleObjectToString(buildImageContentStyle(el), 'rpx');
30
+ const imageSrc = getImageSrc(el);
31
+ const mode = el.fit === 'contain' ? 'aspectFit' : 'aspectFill';
32
+ this.setData({ wrapperStyle, contentStyle, imageSrc, mode });
33
+ },
34
+ },
35
+ });
@@ -0,0 +1,8 @@
1
+ <view class="km-node" style="{{wrapperStyle}}">
2
+ <image
3
+ class="km-node__image"
4
+ style="{{contentStyle}}"
5
+ src="{{imageSrc}}"
6
+ mode="{{mode}}"
7
+ />
8
+ </view>
@@ -0,0 +1,10 @@
1
+ .km-node {
2
+ box-sizing: border-box;
3
+ color: inherit;
4
+ }
5
+
6
+ .km-node__image {
7
+ width: 100%;
8
+ height: 100%;
9
+ display: block;
10
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "component": true
3
+ }
@@ -0,0 +1,52 @@
1
+ import {
2
+ buildTextContentStyle,
3
+ buildTextIconMeta,
4
+ buildWrapperStyle,
5
+ getTextValue,
6
+ styleObjectToString,
7
+ type TextElement,
8
+ } from '../../../../vendor/km-card-layout-core/index';
9
+ import { ICON_CODE_MAP } from '../../icon-map';
10
+
11
+ const mapIconGlyph = (name?: string, fallback?: string) => {
12
+ if (!name) return fallback;
13
+ const glyph = ICON_CODE_MAP[name];
14
+ if (glyph) return String.fromCharCode(parseInt(glyph, 16));
15
+ return fallback || name;
16
+ };
17
+
18
+ Component({
19
+ options: {
20
+ styleIsolation: 'apply-shared',
21
+ },
22
+ properties: {
23
+ element: {
24
+ type: Object,
25
+ value: {},
26
+ },
27
+ },
28
+ data: {
29
+ wrapperStyle: '',
30
+ contentStyle: '',
31
+ textValue: '',
32
+ iconMeta: null as any,
33
+ },
34
+ observers: {
35
+ element(el: TextElement) {
36
+ if (!el) return;
37
+ const wrapperStyle = styleObjectToString(buildWrapperStyle(el, 'rpx'), 'rpx');
38
+ const contentStyle = styleObjectToString(buildTextContentStyle(el, 'rpx'), 'rpx');
39
+ const textValue = getTextValue(el);
40
+ const iconRaw = buildTextIconMeta(el, 'rpx');
41
+ const iconMeta =
42
+ iconRaw && iconRaw.name
43
+ ? {
44
+ ...iconRaw,
45
+ text: mapIconGlyph(iconRaw.name, iconRaw.name),
46
+ wrapperStyle: styleObjectToString(iconRaw.wrapperStyle, 'rpx'),
47
+ }
48
+ : iconRaw;
49
+ this.setData({ wrapperStyle, contentStyle, textValue, iconMeta });
50
+ },
51
+ },
52
+ });
@@ -0,0 +1,29 @@
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}}">
4
+ <view class="km-node__text-content">
5
+ <block wx:if="{{iconMeta.align === 'right'}}">
6
+ <text class="km-node__text-value">{{textValue || ''}}</text>
7
+ <view style="{{iconMeta.wrapperStyle}}" class="km-node__text-icon--wrapper" >
8
+ <text
9
+ class="km-node__text-icon icon"
10
+ style="font-size: {{iconMeta.size || '16px'}}; color: {{iconMeta.color || ''}}; margin-right: {{iconMeta.gap || ''}};"
11
+ >{{iconMeta.text || iconMeta.name || ''}}</text>
12
+ </view>
13
+ </block>
14
+ <block wx:else>
15
+ <view style="{{iconMeta.wrapperStyle}}" class="km-node__text-icon--wrapper">
16
+ <text
17
+ class="km-node__text-icon icon"
18
+ style="font-size: {{iconMeta.size || '16px'}}; color: {{iconMeta.color || ''}}; margin-right: {{iconMeta.gap || ''}};"
19
+ >{{iconMeta.text || iconMeta.name || ''}}</text>
20
+ </view>
21
+ <text class="km-node__text-value">{{textValue || ''}}</text>
22
+ </block>
23
+ </view>
24
+ </block>
25
+ <block wx:else>
26
+ <text class="km-node__text-value">{{textValue || ''}}</text>
27
+ </block>
28
+ </view>
29
+ </view>
@@ -0,0 +1,59 @@
1
+ .km-node {
2
+ box-sizing: border-box;
3
+ color: inherit;
4
+ }
5
+
6
+ .km-node--text {
7
+ /* overflow hidden if needed */
8
+ }
9
+
10
+ .km-node--text text {
11
+ display: inline;
12
+ }
13
+
14
+ .km-node__text {
15
+ width: 100%;
16
+ height: 100%;
17
+ display: block;
18
+ box-sizing: border-box;
19
+ text-align: inherit;
20
+ }
21
+
22
+ .km-node__text-content {
23
+ display: inline-block;
24
+ vertical-align: middle;
25
+ height: 100%;
26
+ }
27
+
28
+ .km-node__text-icon {
29
+ display: inline-flex;
30
+ align-items: center;
31
+ justify-content: center;
32
+ }
33
+
34
+ .km-node__text-value {
35
+ display: inline-block;
36
+ white-space: pre-wrap;
37
+ word-break: break-word;
38
+ vertical-align: middle;
39
+ }
40
+
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{
58
+ display: inline-block;
59
+ }
@@ -1,3 +1,9 @@
1
1
  {
2
- "component": true
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
+ }
3
9
  }
@@ -1,25 +1,33 @@
1
1
  import type {
2
+ CardElement,
2
3
  CardLayoutInput,
3
4
  CardLayoutSchema,
4
- RenderNode,
5
+ LayoutPanelElement,
5
6
  } from '../../vendor/km-card-layout-core/index';
6
7
  import {
7
- buildRenderResult,
8
+ buildBackgroundStyle,
9
+ buildCardStyle,
10
+ buildPanelContentStyle,
11
+ buildWrapperStyle,
8
12
  normalizeLayout,
13
+ styleObjectToString,
9
14
  } from '../../vendor/km-card-layout-core/index';
10
- import { ICON_CODE_MAP } from './icon-map';
11
15
 
12
- type LayoutData = {
13
- [key: string]: any;
16
+ type PanelElement = LayoutPanelElement & {
17
+ wrapperStyle: string;
18
+ contentStyle: string;
19
+ children?: RenderElement[];
14
20
  };
15
21
 
16
- interface RenderCard {
22
+ type RenderElement = CardElement | PanelElement;
23
+
24
+ type RenderCard = {
17
25
  id: string;
18
26
  cardStyle: string;
19
27
  backgroundImage?: string;
20
28
  backgroundStyle: string;
21
- nodes: RenderNode[];
22
- }
29
+ elements: RenderElement[];
30
+ };
23
31
 
24
32
  const ensureArray = (input: CardLayoutInput | any): CardLayoutInput => {
25
33
  if (!input) return [];
@@ -31,43 +39,27 @@ const pickCardId = (layout: any, idx: number) => {
31
39
  return `card-${idx}`;
32
40
  };
33
41
 
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
-
41
- const mapRenderNode = (node: RenderNode): RenderNode => {
42
- const icon = node.icon
43
- ? {
44
- ...node.icon,
45
- text: mapIconGlyph(node.icon.name, node.icon.text),
46
- }
47
- : undefined;
48
- const children = node.children?.map(mapRenderNode);
49
- const mappedText =
50
- node.type === 'icon' ? mapIconGlyph(node.name, node.text) : node.text;
51
-
52
- return {
53
- ...node,
54
- text: mappedText,
55
- icon,
56
- children,
57
- };
58
- };
59
-
60
- const mapRenderTree = (nodes: RenderNode[]) =>
61
- Array.isArray(nodes) ? nodes.map(mapRenderNode) : [];
42
+ const decorateElements = (children: CardElement[] = []): RenderElement[] =>
43
+ (children || []).map(el => {
44
+ if (el.type === 'layout-panel') {
45
+ const panel = el as LayoutPanelElement;
46
+ return {
47
+ ...panel,
48
+ wrapperStyle: styleObjectToString(buildWrapperStyle(panel, 'rpx'), 'rpx'),
49
+ contentStyle: styleObjectToString(buildPanelContentStyle(panel, 'rpx'), 'rpx'),
50
+ children: decorateElements(panel.children || []),
51
+ };
52
+ }
53
+ return el;
54
+ });
62
55
 
63
- const buildCards = (layouts: CardLayoutSchema[], data: LayoutData) => {
64
- const renders = buildRenderResult(layouts as CardLayoutInput, data, 'rpx');
65
- return renders.map((render, idx) => ({
56
+ const buildCards = (layouts: CardLayoutSchema[]) => {
57
+ return layouts.map((layout, idx) => ({
66
58
  id: pickCardId(layouts[idx], idx),
67
- cardStyle: render.cardStyle,
68
- backgroundImage: render.backgroundImage || '',
69
- backgroundStyle: render.backgroundStyle,
70
- nodes: mapRenderTree(render.renderTree),
59
+ cardStyle: styleObjectToString(buildCardStyle(layout, 'rpx'), 'rpx'),
60
+ backgroundImage: layout.backgroundImage || '',
61
+ backgroundStyle: styleObjectToString(buildBackgroundStyle(layout, 'rpx'), 'rpx'),
62
+ elements: decorateElements(layout.children || []),
71
63
  }));
72
64
  };
73
65
 
@@ -107,7 +99,6 @@ Component({
107
99
  methods: {
108
100
  rebuild() {
109
101
  const layoutInput = ensureArray(this.data.layout as CardLayoutInput);
110
- const dataInput = (this.data.data || {}) as LayoutData;
111
102
 
112
103
  if (!layoutInput.length) {
113
104
  this.setData({ cards: [] });
@@ -115,7 +106,7 @@ Component({
115
106
  }
116
107
 
117
108
  const normalizedLayouts = normalizeLayout(layoutInput);
118
- const cards = buildCards(normalizedLayouts, dataInput);
109
+ const cards = buildCards(normalizedLayouts);
119
110
 
120
111
  this.setData({ cards });
121
112
  },
@@ -9,82 +9,34 @@
9
9
  src="{{item.backgroundImage}}"
10
10
  mode="aspectFill"
11
11
  />
12
- <block wx:for="{{item.nodes}}" wx:key="id">
13
- <template is="render-node" data="{{node:item}}" />
12
+ <block wx:for="{{item.elements}}" wx:key="id">
13
+ <template is="render-element" data="{{el:item}}" />
14
14
  </block>
15
15
  </view>
16
16
  </view>
17
17
  </block>
18
18
  </view>
19
19
 
20
- <template name="render-node">
21
- <block wx:if="{{node.type === 'image'}}">
22
- <view class="km-node" style="{{node.wrapperStyle}}">
23
- <image
24
- class="km-node__image"
25
- style="{{node.contentStyle}}"
26
- src="{{node.src}}"
27
- mode="{{node.mode || 'aspectFill'}}"
28
- />
29
- </view>
20
+ <template name="render-element">
21
+ <block wx:if="{{el.type === 'image'}}">
22
+ <image-element element="{{el}}" />
30
23
  </block>
31
- <block wx:elif="{{node.type === 'icon'}}">
32
- <view class="km-node km-node--icon" style="{{node.wrapperStyle}}">
33
- <view
34
- wx:if="{{node.name === 'dot' || node.name === 'round'}}"
35
- class="km-node__icon-dot"
36
- style="{{node.contentStyle}}"
37
- />
38
- <view
39
- wx:else
40
- class="km-node__icon icon"
41
- style="{{node.contentStyle}}"
42
- >{{node.text || ''}}</view>
43
- </view>
24
+ <block wx:elif="{{el.type === 'icon'}}">
25
+ <icon-element element="{{el}}" />
44
26
  </block>
45
- <block wx:elif="{{node.type === 'layout-panel'}}">
46
- <view class="km-node" style="{{node.wrapperStyle}}">
47
- <view class="km-node__panel" style="{{node.contentStyle}}">
48
- <block wx:for="{{node.children}}" wx:key="id">
49
- <template is="render-node" data="{{node:item}}" />
27
+ <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}}" />
50
32
  </block>
51
33
  </view>
52
34
  </view>
53
35
  </block>
54
- <block wx:elif="{{node.type === 'custom'}}">
55
- <view class="km-node km-node--custom" style="{{node.wrapperStyle}}">
56
- <view class="km-node__custom" style="{{node.contentStyle}}">
57
- <slot name="{{node.id}}"></slot>
58
- </view>
59
- </view>
36
+ <block wx:elif="{{el.type === 'custom'}}">
37
+ <custom-element element="{{el}}" />
60
38
  </block>
61
39
  <block wx:else>
62
- <view class="km-node km-node--text" style="{{node.wrapperStyle}}">
63
- <view class="km-node__text" style="{{node.contentStyle}}">
64
- <block wx:if="{{node.icon && node.icon.name}}">
65
- <view class="km-node__text-content">
66
- <block wx:if="{{node.icon.align === 'right'}}">
67
- <text class="km-node__text-value">{{node.text || ''}}</text>
68
- <view style="{{node.icon.wrapperStyle}}">
69
- <text
70
- class="km-node__text-icon icon"
71
- style="font-size: {{node.icon.size || '16px'}}; color: {{node.icon.color || ''}}; margin-right: {{node.icon.gap || ''}};">{{node.icon.text || node.icon.name || ''}}</text>
72
- </view>
73
- </block>
74
- <block wx:else>
75
- <view style="{{node.icon.wrapperStyle}}">
76
- <text
77
- class="km-node__text-icon icon"
78
- style="font-size: {{node.icon.size || '16px'}}; color: {{node.icon.color || ''}}; margin-right: {{node.icon.gap || ''}};">{{node.icon.text || node.icon.name || ''}}</text>
79
- </view>
80
- <text class="km-node__text-value">{{node.text || ''}}</text>
81
- </block>
82
- </view>
83
- </block>
84
- <block wx:else>
85
- <text class="km-node__text-value">{{node.text || ''}}</text>
86
- </block>
87
- </view>
88
- </view>
40
+ <text-element element="{{el}}" />
89
41
  </block>
90
42
  </template>
@@ -1,9 +1,6 @@
1
-
2
-
3
1
  .km-card-layout {
4
2
  display: flex;
5
3
  flex-direction: column;
6
- gap: 16rpx;
7
4
  }
8
5
 
9
6
  .km-card-layout__item {
@@ -33,76 +30,14 @@
33
30
  color: inherit;
34
31
  }
35
32
 
36
- .km-node--icon {
37
- display: flex;
38
- align-items: center;
39
- justify-content: center;
40
- }
41
-
42
- .km-node__image {
43
- width: 100%;
44
- height: 100%;
45
- display: block;
46
- }
47
-
48
- .km-node__icon {
49
- display: inline-flex;
50
- align-items: center;
51
- justify-content: center;
52
- width: 100%;
53
- height: 100%;
54
- font-family: 'km-icon', 'PingFang SC', 'Microsoft Yahei', sans-serif;
55
- font-style: normal;
56
- font-weight: normal;
57
- }
58
-
59
- .km-node__icon-dot {
60
- width: 100%;
61
- height: 100%;
62
- border-radius: 50%;
63
- background-color: #999;
64
- }
65
-
66
33
  .km-node__panel {
67
34
  width: 100%;
68
35
  height: 100%;
69
36
  box-sizing: border-box;
70
37
  }
71
38
 
72
- .km-node__custom {
73
- width: 100%;
74
- height: 100%;
75
- box-sizing: border-box;
76
- }
77
39
 
78
- .km-node__text {
79
- width: 100%;
80
- height: 100%;
81
- display: block;
82
- box-sizing: border-box;
83
- text-align: inherit;
84
- }
85
-
86
- .km-node__text-content {
87
- display: inline-block;
88
- vertical-align: middle;
89
- height: 100%;
90
- }
91
-
92
- .km-node__text-value {
93
- display: inline-block;
94
- white-space: pre-wrap;
95
- word-break: break-word;
96
- vertical-align: middle;
97
- }
98
- .km-node--text{
99
- /* 溢出隐藏 */
100
- }
101
- .km-node--text text {
102
- display: inline;
103
- }
104
40
 
105
- /* ICON */
106
41
 
107
42
 
108
43
  @font-face {
@@ -3,14 +3,21 @@ export type {
3
3
  CardElementType,
4
4
  CardLayoutInput,
5
5
  CardLayoutSchema,
6
- RenderNode,
7
- RenderResult
8
6
  } from '../vendor/km-card-layout-core/index'
9
7
 
10
8
  export {
11
9
  addUnit,
12
- buildRenderNodes,
13
- buildRenderResult,
10
+ buildWrapperStyle,
11
+ buildCardStyle,
12
+ buildBackgroundStyle,
13
+ buildBaseContentStyle,
14
+ buildPanelContentStyle,
15
+ buildTextContentStyle,
16
+ buildImageContentStyle,
17
+ buildTextIconMeta,
18
+ getTextValue,
19
+ getImageSrc,
20
+ getIconName,
14
21
  normalizeLayout,
15
22
  resolveBindingValue,
16
23
  styleObjectToString
@@ -54,6 +54,9 @@ export function applyItemCollectBindings(
54
54
  else delete base.defaultValue;
55
55
  if (key !== undefined) base.key = key;
56
56
  else delete base.key;
57
+ if (el.type === 'text' && meta?.extra?.icon) {
58
+ base.icon = { ...(base.icon || {}), name: meta.extra.icon };
59
+ }
57
60
 
58
61
  if (el.type === 'layout-panel') {
59
62
  return {
@@ -1,4 +1,5 @@
1
1
  import { isObject } from './helpers';
2
+ import type { BindingContext } from './interface';
2
3
 
3
4
  const pathToSegments = (path: string): string[] =>
4
5
  `${path || ''}`
@@ -30,7 +31,7 @@ const readByPath = (data: any, path: string): any => {
30
31
  export const resolveBindingValue = (
31
32
  binding: string | undefined,
32
33
  rootData: Record<string, any>,
33
- context?: Record<string, any>
34
+ context?: BindingContext
34
35
  ): any => {
35
36
  if (!binding) return undefined;
36
37
  const value = readByPath(rootData, binding);
@@ -5,11 +5,30 @@
5
5
  * - 职责:将布局 Schema 与业务数据合成可渲染树,外层只需将节点映射到各端组件。
6
6
  */
7
7
 
8
+
9
+
10
+
11
+
8
12
  export * from './interface/index';
9
- export * from './helpers';
10
- export * from './layout';
11
- export * from './data';
12
- export * from './bindings';
13
+ export { addUnit, styleObjectToString, toNumber, isObject } from './helpers';
14
+ export {
15
+ normalizeLayout,
16
+ sanitizeLayout,
17
+ sanitizeElement,
18
+ roundToInt,
19
+ getAbsLayout,
20
+ collectBindings,
21
+ normalizeId,
22
+ parseLayout,
23
+ areChildrenEqual,
24
+ } from './layout';
25
+ export { resolveBindingValue } from './data';
26
+ export {
27
+ stripLayoutBindings,
28
+ applyItemCollectBindings,
29
+ getTemplateItems,
30
+ getTemplateBackgrounds,
31
+ } from './bindings';
13
32
  export {
14
33
  backgroundChange,
15
34
  DEFAULT_DECOR_COLOR,
@@ -18,4 +37,17 @@ export {
18
37
  applyBackground,
19
38
  updateElementsStyle,
20
39
  } from './ops/changeBackground';
21
- export * from './render/builder';
40
+ export { buildRenderData } from './render/tool';
41
+ export {
42
+ buildWrapperStyle,
43
+ buildCardStyle,
44
+ buildBackgroundStyle,
45
+ buildBaseContentStyle,
46
+ buildPanelContentStyle,
47
+ buildTextContentStyle,
48
+ buildImageContentStyle,
49
+ getTextValue,
50
+ getImageSrc,
51
+ getIconName,
52
+ buildTextIconMeta,
53
+ } from './render/helpers';
@@ -0,0 +1,6 @@
1
+ export interface BindingContext {
2
+ // Optional binding prefix for nested contexts
3
+ contextBinding?: string;
4
+ // Optional nested context data
5
+ contextData?: any;
6
+ }
@@ -21,6 +21,7 @@ export interface TemplateItem {
21
21
  bind: string;
22
22
  key?: string;
23
23
  icon?: string;
24
+ extra?: { icon?: string };
24
25
  default?: string;
25
26
  type: 'text' | 'image';
26
27
  cate: number;
@@ -1,4 +1,4 @@
1
1
  export * from './elements';
2
2
  export * from './layout';
3
- export * from './render';
4
- export * from './data/payload';
3
+ export * from './data/payload';
4
+ export * from './context';