km-card-layout-component-miniprogram 0.1.5

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 (35) hide show
  1. package/.editorconfig +15 -0
  2. package/.gitmodules +3 -0
  3. package/LICENSE +9 -0
  4. package/README.md +37 -0
  5. package/example/app.js +5 -0
  6. package/example/app.json +11 -0
  7. package/example/app.wxss +4 -0
  8. package/example/pages/home/index.js +270 -0
  9. package/example/pages/home/index.json +6 -0
  10. package/example/pages/home/index.wxml +7 -0
  11. package/example/pages/home/index.wxss +22 -0
  12. package/example/project.config.json +19 -0
  13. package/example/sitemap.json +9 -0
  14. package/miniprogram_dist/components/card-layout/icon-map.js +121 -0
  15. package/miniprogram_dist/components/card-layout/index.js +80 -0
  16. package/miniprogram_dist/components/card-layout/index.json +3 -0
  17. package/miniprogram_dist/components/card-layout/index.wxml +66 -0
  18. package/miniprogram_dist/components/card-layout/index.wxss +521 -0
  19. package/miniprogram_dist/index.js +12 -0
  20. package/miniprogram_dist/utils/card-schema.js +10 -0
  21. package/miniprogram_dist/vendor/km-card-layout-core/index.js +511 -0
  22. package/package.json +37 -0
  23. package/script/gulpfile.js +57 -0
  24. package/script/sync-core.js +35 -0
  25. package/src/components/card-layout/icon-map.ts +118 -0
  26. package/src/components/card-layout/index.json +3 -0
  27. package/src/components/card-layout/index.ts +96 -0
  28. package/src/components/card-layout/index.wxml +66 -0
  29. package/src/components/card-layout/index.wxss +521 -0
  30. package/src/index.ts +9 -0
  31. package/src/utils/card-schema.ts +17 -0
  32. package/src/vendor/km-card-layout-core/index.ts +768 -0
  33. package/src/vendor/km-card-layout-core/types.d.ts +191 -0
  34. package/tsconfig.json +16 -0
  35. package/types/index.d.ts +7 -0
package/.editorconfig ADDED
@@ -0,0 +1,15 @@
1
+ # http://editorconfig.org
2
+ root = true
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ indent_size = 2
7
+ indent_style = space
8
+ insert_final_newline = true
9
+ max_line_length = 100
10
+ trim_trailing_whitespace = true
11
+ [*.md]
12
+ max_line_length = 0
13
+ trim_trailing_whitespace = false
14
+ [COMMIT_EDITMSG]
15
+ max_line_length = 0
package/.gitmodules ADDED
@@ -0,0 +1,3 @@
1
+ [submodule "src/_common"]
2
+ path = src/_common
3
+ url = https://github.com/Tencent/tdesign-common.git
package/LICENSE ADDED
@@ -0,0 +1,9 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021-present TDesign
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # TDesign Miniprogram Starter
2
+
3
+ 本仓库只保留了 TDesign 小程序组件库的**编译、发布与 Demo 骨架**,方便你快速复用发布流程,再按需补充自己的组件代码。
4
+
5
+ ## 包含内容
6
+
7
+ - `src/`:干净的组件源码目录,当前自带一个 `demo-card` 示例组件。
8
+ - `script/gulpfile.js`:精简版构建流程,负责编译 `src`、同步到 `miniprogram_dist`,并把结果拷贝到 Demo。
9
+ - `example/`:最小可运行示例,会自动依赖 `miniprogram_dist` 中的组件。
10
+
11
+ ## 快速开始
12
+
13
+ ```bash
14
+ npm install
15
+ npm run dev # 实时监听 src/ 与 example/,输出到 miniprogram_dist / example_dist
16
+ npm run build # 进行一次完整的编译与 Demo 同步
17
+ ```
18
+
19
+ > 首次或执行 `npm run build` 之后,将 `example_dist` 目录导入微信开发者工具即可预览。
20
+
21
+ ## 开发自己的组件
22
+
23
+ 1. 在 `src/components` 下复制 `demo-card`,调整文件名与实现代码。
24
+ 2. 在 `example/pages/home/index.json`(或你自己的页面)里通过 `usingComponents` 引入新的组件。
25
+ 3. 运行 `npm run dev`,组件改动会实时同步到 Demo。
26
+
27
+ ## 发布流程
28
+
29
+ 1. `npm run build`
30
+ 2. 检查 `miniprogram_dist`(产物)与 `example_dist`(示例)是否符合预期。
31
+ 3. `miniprogram_dist` 可直接发布到 npm / 私有仓库,`example_dist` 可作为 WeChat Demo。
32
+
33
+ ## 下一步可以做什么?
34
+
35
+ - 增加更多组件文件夹并在 `example` 中编写页面示例。
36
+ - 根据项目需要扩展 `script/gulpfile.js`(如压缩、Less、单测等)。
37
+ - 接入你自己的发布脚本或 CI。
package/example/app.js ADDED
@@ -0,0 +1,5 @@
1
+ App({
2
+ onLaunch() {
3
+ console.log('Demo bootstrap ready');
4
+ },
5
+ });
@@ -0,0 +1,11 @@
1
+ {
2
+ "pages": [
3
+ "pages/home/index"
4
+ ],
5
+ "window": {
6
+ "navigationBarTitleText": "TDesign Demo",
7
+ "navigationBarBackgroundColor": "#0052d9",
8
+ "navigationBarTextStyle": "white",
9
+ "backgroundTextStyle": "light"
10
+ }
11
+ }
@@ -0,0 +1,4 @@
1
+ page {
2
+ background-color: #f7f8fa;
3
+ min-height: 100%;
4
+ }
@@ -0,0 +1,270 @@
1
+ const layouts = [
2
+ {
3
+ "id": "3",
4
+ "name": "内置布局-右侧logo",
5
+ "width": 343,
6
+ "height": 210,
7
+ "children": [
8
+ {
9
+ "id": "f2dd3515-2147-460a-b788-3f58dd5f858b",
10
+ "type": "custom",
11
+ "style": {
12
+ "borderRadius": 0,
13
+ "backgroundColor": "currentColor"
14
+ },
15
+ "layout": {
16
+ "x": 20,
17
+ "y": 104,
18
+ "mode": "absolute",
19
+ "width": 12,
20
+ "height": 1,
21
+ "zIndex": 8
22
+ },
23
+ "binding": "decor-1764137606935"
24
+ },
25
+ {
26
+ "id": "7fd4c8cd-6bea-42d0-9a80-b1ba27f4abd3",
27
+ "type": "custom",
28
+ "style": {
29
+ "borderRadius": 0,
30
+ "backgroundColor": "currentColor"
31
+ },
32
+ "layout": {
33
+ "x": 37,
34
+ "y": 104,
35
+ "mode": "absolute",
36
+ "width": 105,
37
+ "height": 1,
38
+ "zIndex": 9
39
+ },
40
+ "binding": "decor-1764137663972"
41
+ },
42
+ {
43
+ "id": "4985e0b1-8200-4f15-b18e-e1dcccce56a4",
44
+ "name": "mobile",
45
+ "type": "icon",
46
+ "style": {
47
+ "color": "",
48
+ "fontSize": 11
49
+ },
50
+ "layout": {
51
+ "x": 20,
52
+ "y": 124,
53
+ "mode": "absolute",
54
+ "width": 11,
55
+ "height": 11,
56
+ "zIndex": 10
57
+ },
58
+ "binding": "decor-icon-1764137759247"
59
+ },
60
+ {
61
+ "id": "a5fbea00-26d1-4f68-8cea-053e8541ae5c",
62
+ "name": "email",
63
+ "type": "icon",
64
+ "style": {
65
+ "color": "",
66
+ "fontSize": 10
67
+ },
68
+ "layout": {
69
+ "x": 20,
70
+ "y": 147,
71
+ "mode": "absolute",
72
+ "width": 10,
73
+ "height": 10,
74
+ "zIndex": 11
75
+ },
76
+ "binding": "decor-icon-1764137817702"
77
+ },
78
+ {
79
+ "id": "ce82ffa0-3e48-48aa-81c2-a5fbe07271a7",
80
+ "name": "address",
81
+ "type": "icon",
82
+ "style": {
83
+ "color": "",
84
+ "fontSize": 10
85
+ },
86
+ "layout": {
87
+ "x": 20,
88
+ "y": 169,
89
+ "mode": "absolute",
90
+ "width": 10,
91
+ "height": 10,
92
+ "zIndex": 12
93
+ },
94
+ "binding": "decor-icon-1764137829061"
95
+ },
96
+ {
97
+ "id": "1",
98
+ "type": "text",
99
+ "style": {
100
+ "color": "",
101
+ "fontSize": 16,
102
+ "textAlign": "left",
103
+ "fontWeight": "bold",
104
+ "lineHeight": 22
105
+ },
106
+ "layout": {
107
+ "x": 20,
108
+ "y": 45,
109
+ "mode": "absolute",
110
+ "width": 210,
111
+ "height": 22,
112
+ "zIndex": 1
113
+ },
114
+ "binding": "user.name",
115
+ "defaultValue": "名片君"
116
+ },
117
+ {
118
+ "id": "2",
119
+ "type": "text",
120
+ "style": {
121
+ "color": "",
122
+ "fontSize": 11,
123
+ "textAlign": "left",
124
+ "fontWeight": "normal",
125
+ "lineHeight": 15
126
+ },
127
+ "layout": {
128
+ "x": 20,
129
+ "y": 74,
130
+ "mode": "absolute",
131
+ "width": 210,
132
+ "height": 15,
133
+ "zIndex": 3
134
+ },
135
+ "binding": "user.company",
136
+ "defaultValue": "合肥魅客网络有限公司"
137
+ },
138
+ {
139
+ "id": "4",
140
+ "type": "text",
141
+ "style": {
142
+ "color": "",
143
+ "fontSize": 10,
144
+ "textAlign": "left",
145
+ "fontWeight": "normal",
146
+ "lineHeight": 15
147
+ },
148
+ "layout": {
149
+ "x": 20,
150
+ "y": 21,
151
+ "mode": "absolute",
152
+ "width": 210,
153
+ "height": 15,
154
+ "zIndex": 2
155
+ },
156
+ "binding": "user.duty",
157
+ "defaultValue": "销售经理"
158
+ },
159
+ {
160
+ "id": "3",
161
+ "type": "text",
162
+ "style": {
163
+ "color": "",
164
+ "fontSize": 10,
165
+ "textAlign": "left",
166
+ "fontWeight": "normal",
167
+ "lineHeight": 15
168
+ },
169
+ "layout": {
170
+ "x": 36,
171
+ "y": 123,
172
+ "mode": "absolute",
173
+ "width": 280,
174
+ "height": 15,
175
+ "zIndex": 5
176
+ },
177
+ "binding": "user.mobile",
178
+ "defaultValue": "18888888888"
179
+ },
180
+ {
181
+ "id": "5",
182
+ "type": "text",
183
+ "style": {
184
+ "color": "",
185
+ "fontSize": 10,
186
+ "textAlign": "left",
187
+ "fontWeight": "normal",
188
+ "lineHeight": 15
189
+ },
190
+ "layout": {
191
+ "x": 36,
192
+ "y": 145,
193
+ "mode": "absolute",
194
+ "width": 280,
195
+ "height": 15,
196
+ "zIndex": 6
197
+ },
198
+ "binding": "user.email",
199
+ "defaultValue": "km@kuanmai.com"
200
+ },
201
+ {
202
+ "id": "8",
203
+ "url": "https://km-1257079185.cos.ap-chengdu.myqcloud.com/local/image/202511/4c71811adfa51e1e3ab4181a88cebc87.png",
204
+ "type": "image",
205
+ "style": {
206
+ "color": "#000000",
207
+ "objectFit": "contain",
208
+ "borderRadius": 0
209
+ },
210
+ "layout": {
211
+ "x": 263,
212
+ "y": 20,
213
+ "mode": "absolute",
214
+ "width": 60,
215
+ "height": 60,
216
+ "zIndex": 4
217
+ },
218
+ "binding": "user.logo",
219
+ "defaultValue": "https://km-1257079185.cos.ap-chengdu.myqcloud.com/local/image/202511/4c71811adfa51e1e3ab4181a88cebc87.png"
220
+ },
221
+ {
222
+ "id": "9",
223
+ "type": "text",
224
+ "style": {
225
+ "color": "",
226
+ "fontSize": 10,
227
+ "textAlign": "left",
228
+ "fontWeight": "normal",
229
+ "lineHeight": 15
230
+ },
231
+ "layout": {
232
+ "x": 36,
233
+ "y": 167,
234
+ "mode": "absolute",
235
+ "width": 280,
236
+ "height": 33,
237
+ "zIndex": 7
238
+ },
239
+ "binding": "user.address",
240
+ "defaultValue": "安徽省合肥市包河区硅谷大厦"
241
+ }
242
+ ],
243
+ "container": {
244
+ "mode": "absolute"
245
+ },
246
+ "fontColor": "#333333",
247
+ "backgroundImage": "https://km-1257079185.cos.ap-chengdu.myqcloud.com/local/image/202511/0a7331e2e1a9a4cbc828afe6c338aaae.png",
248
+ "backgroundZIndex": 1
249
+ }
250
+ ]
251
+
252
+ const cardData = {
253
+ user: {
254
+ company: 'Kuanmai Networks',
255
+ name: 'Ada Lovelace',
256
+ duty: 'Product Lead',
257
+ phone: '+86 188-0000-0000',
258
+ email: 'ada@kuanmai.com',
259
+ address: '1 Infinite Loop, Shenzhen',
260
+ avatar: 'https://picsum.photos/200/200?random=12'
261
+ }
262
+ }
263
+
264
+ Page({
265
+ data: {
266
+ layouts,
267
+ cardData,
268
+ description: 'CardLayoutInput + data.user binding with stacked cards.'
269
+ }
270
+ })
@@ -0,0 +1,6 @@
1
+ {
2
+ "navigationBarTitleText": "Demo",
3
+ "usingComponents": {
4
+ "card-layout": "/miniprogram_dist/components/card-layout/index"
5
+ }
6
+ }
@@ -0,0 +1,7 @@
1
+ <view class="page">
2
+ <view class="page__header">
3
+ <view class="title">KM Card Layout</view>
4
+ <view class="subtitle">CardLayoutInput + { user } data</view>
5
+ </view>
6
+ <card-layout layout="{{layouts}}" data="{{cardData}}" />
7
+ </view>
@@ -0,0 +1,22 @@
1
+ .page {
2
+ padding: 48rpx;
3
+ background: #0b0d13;
4
+ min-height: 100vh;
5
+ box-sizing: border-box;
6
+ }
7
+
8
+ .page__header {
9
+ margin-bottom: 32rpx;
10
+ color: #e6ecff;
11
+ }
12
+
13
+ .title {
14
+ font-size: 36rpx;
15
+ font-weight: 700;
16
+ margin-bottom: 8rpx;
17
+ }
18
+
19
+ .subtitle {
20
+ font-size: 26rpx;
21
+ color: #9fb4ff;
22
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "description": "TDesign miniprogram starter demo",
3
+ "appid": "touristappid",
4
+ "projectname": "km-card-layout-miniprogram-demo",
5
+ "compileType": "miniProgram",
6
+ "miniprogramRoot": "./",
7
+ "libVersion": "3.5.0",
8
+ "setting": {
9
+ "urlCheck": true,
10
+ "es6": true,
11
+ "enhance": true,
12
+ "postcss": true,
13
+ "preloadBackgroundData": false,
14
+ "minified": true,
15
+ "newFeature": true,
16
+ "coverView": true
17
+ },
18
+ "condition": {}
19
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "desc": "TDesign starter demo sitemap",
3
+ "rules": [
4
+ {
5
+ "action": "allow",
6
+ "page": "*"
7
+ }
8
+ ]
9
+ }
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ICON_CODE_MAP = void 0;
4
+ exports.ICON_CODE_MAP = {
5
+ Frame4: 'e674',
6
+ chain: 'e673',
7
+ 'swap-setting': 'e672',
8
+ email1: 'e670',
9
+ mobile1: 'e671',
10
+ website: 'e66f',
11
+ calendar: 'e66e',
12
+ 'contact-fill': 'e66d',
13
+ 'card-holder': 'e66c',
14
+ link: 'e66b',
15
+ 'buy-vip-13': 'e66a',
16
+ 'buy-vip-11': 'e669',
17
+ 'buy-vip-12': 'e668',
18
+ 'contact-phone': 'e666',
19
+ 'contact-wechat': 'e667',
20
+ group: 'e665',
21
+ bag: 'e605',
22
+ 'column-group': 'e664',
23
+ minichat: 'e617',
24
+ helper: 'e663',
25
+ 'remove-module': 'e660',
26
+ 'add-module': 'e662',
27
+ drag: 'e661',
28
+ 'switch-company': 'e65f',
29
+ 'switch-person': 'e65e',
30
+ 'manual-entry': 'e65d',
31
+ play: 'e65c',
32
+ 'file-pdf': 'e65b',
33
+ 'file-video': 'e65a',
34
+ plus: 'e659',
35
+ upload: 'e650',
36
+ 'cert-company': 'e64f',
37
+ 'qr-code': 'e658',
38
+ 'company-card': 'e657',
39
+ 'card-import': 'e64e',
40
+ camera: 'e655',
41
+ 'card-apply': 'e632',
42
+ 'check-2': 'e616',
43
+ check: 'e614',
44
+ 'buy-vip-4': 'e613',
45
+ 'buy-vip-10': 'e656',
46
+ 'weixin-2': 'e653',
47
+ 'qrcode-1': 'e654',
48
+ local: 'e652',
49
+ 'cert-job': 'e64d',
50
+ 'cert-name': 'e651',
51
+ 'card-style-1': 'e64c',
52
+ 'add-pic': 'e646',
53
+ 'add-text': 'e647',
54
+ 'buy-vip-2': 'e648',
55
+ 'company-upload-logo': 'e649',
56
+ 'Headset-one': 'e64a',
57
+ 'edit-info': 'e64b',
58
+ 'more-action': 'e645',
59
+ 'upload-video': 'e644',
60
+ 'upload-image': 'e643',
61
+ 'company-info': 'e62a',
62
+ contact: 'e642',
63
+ 'notice-1': 'e641',
64
+ visitor: 'e640',
65
+ 'mobile-2': 'e63e',
66
+ 'weixin-1': 'e63f',
67
+ share: 'e63d',
68
+ 'refund-mistake': 'e637',
69
+ 'buy-vip-7': 'e63b',
70
+ 'table-import': 'e63c',
71
+ misService: 'e63a',
72
+ 'buy-vip-6': 'e634',
73
+ import: 'e638',
74
+ download: 'e639',
75
+ image: 'e636',
76
+ 'buy-vip-9': 'e635',
77
+ 'buy-vip-5': 'e62f',
78
+ 'buy-vip-3': 'e630',
79
+ 'buy-vip-1': 'e631',
80
+ 'buy-vip-8': 'e633',
81
+ companyWx: 'e62b',
82
+ dingding: 'e62c',
83
+ shui: 'e62d',
84
+ gongzhang: 'e62e',
85
+ wait: 'e629',
86
+ addImg: 'e628',
87
+ copy: 'e625',
88
+ 'mobile-1': 'e627',
89
+ 'functional-config': 'e604',
90
+ 'module-config': 'e601',
91
+ 'select-right': 'e626',
92
+ like: 'e624',
93
+ weixin: 'e620',
94
+ 'column-user': 'e621',
95
+ 'column-card': 'e622',
96
+ 'column-company-card': 'e623',
97
+ 'on-job': 'e61e',
98
+ person: 'e61f',
99
+ wallet: 'e615',
100
+ opinion: 'e618',
101
+ 'sys-set': 'e619',
102
+ 'sys-msg': 'e61d',
103
+ add: 'e61a',
104
+ search: 'e61b',
105
+ delete: 'e61c',
106
+ enter: 'e60f',
107
+ 'card-style': 'e610',
108
+ switch: 'e612',
109
+ 'card-edit': 'e60a',
110
+ close: 'e60d',
111
+ notice: 'e611',
112
+ edit: 'e60b',
113
+ 'help-info': 'e60c',
114
+ 'tag-filtering': 'e60e',
115
+ 'kuanmai-logo': 'e603',
116
+ company: 'e606',
117
+ email: 'e607',
118
+ round: 'e608',
119
+ address: 'e609',
120
+ mobile: 'e602',
121
+ };
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("../../vendor/km-card-layout-core/index");
4
+ const icon_map_1 = require("./icon-map");
5
+ const ensureArray = (input) => {
6
+ if (!input)
7
+ return [];
8
+ return Array.isArray(input) ? input : [input];
9
+ };
10
+ const pickCardId = (layout, idx) => {
11
+ if (layout && (layout.name || layout.id))
12
+ return layout.name || layout.id;
13
+ return `card-${idx}`;
14
+ };
15
+ Component({
16
+ options: {
17
+ styleIsolation: 'apply-shared'
18
+ },
19
+ properties: {
20
+ layout: {
21
+ type: Array,
22
+ optionalTypes: [Object],
23
+ value: []
24
+ },
25
+ data: {
26
+ type: Object,
27
+ value: {
28
+ user: {}
29
+ }
30
+ }
31
+ },
32
+ data: {
33
+ cards: []
34
+ },
35
+ observers: {
36
+ layout() {
37
+ this.rebuild();
38
+ },
39
+ data() {
40
+ this.rebuild();
41
+ }
42
+ },
43
+ lifetimes: {
44
+ attached() {
45
+ this.rebuild();
46
+ }
47
+ },
48
+ methods: {
49
+ normalizeIconGlyph(nodes) {
50
+ return nodes.map(node => {
51
+ if (node.type === 'icon') {
52
+ const glyph = icon_map_1.ICON_CODE_MAP[node.name || node.text || ''];
53
+ const text = glyph ? String.fromCharCode(parseInt(glyph, 16)) : node.text;
54
+ return { ...node, text };
55
+ }
56
+ if (node.children && node.children.length) {
57
+ return { ...node, children: this.normalizeIconGlyph(node.children) };
58
+ }
59
+ return node;
60
+ });
61
+ },
62
+ rebuild() {
63
+ const layoutInput = ensureArray(this.data.layout);
64
+ const dataInput = (this.data.data || {});
65
+ if (!layoutInput.length) {
66
+ this.setData({ cards: [] });
67
+ return;
68
+ }
69
+ const rendered = (0, index_1.buildRenderResult)(layoutInput, dataInput, 'rpx');
70
+ const cards = rendered.map((card, idx) => ({
71
+ id: pickCardId(layoutInput[idx], idx),
72
+ cardStyle: card.cardStyle,
73
+ backgroundImage: card.backgroundImage,
74
+ backgroundStyle: card.backgroundStyle,
75
+ nodes: this.normalizeIconGlyph(card.renderTree)
76
+ }));
77
+ this.setData({ cards });
78
+ }
79
+ }
80
+ });
@@ -0,0 +1,3 @@
1
+ {
2
+ "component": true
3
+ }