@iam-com/snack-scripts 1.0.0

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.
@@ -0,0 +1,164 @@
1
+ // @ts-nocheck
2
+
3
+ import React from 'react';
4
+ import logo from "template/logo.svg";
5
+ import Core from '@iam-com/snack-core';
6
+
7
+ interface Props {
8
+ settingPanel: { snack: any, FC: React.FunctionComponent } | null,
9
+ router: string
10
+ sdk: any
11
+ projectPkg: any[]
12
+ packages: any[]
13
+ version: string
14
+ mosuleMaps: any
15
+ }
16
+
17
+ const App = (props: Props) => {
18
+ const {router, sdk, projectPkg, packages, version, mosuleMaps, settingPanel} = props;
19
+ const packageList = () => {
20
+ return packages.map((item: any) => {
21
+ return (
22
+ <div className={'package-item'} key={item.dirName}>
23
+ <div className={'item-name'}>
24
+ <div>{item.info.name}</div>
25
+ <div style={{fontSize: '12px', opacity: .6}}>{item.dirName} v.{item.info.version}</div>
26
+ </div>
27
+ <div className={'item-btn'} onClick={() => open(item.name)}>
28
+ 主模块
29
+ </div>
30
+ {typeof mosuleMaps[item.name]?.setting === 'function' ? (
31
+ <div className={'item-btn'} onClick={() => open(item.name, true)}>
32
+ 设置模块
33
+ </div>
34
+ ) : null}
35
+ </div>
36
+ )
37
+ })
38
+ }
39
+ /**
40
+ * 打开模块调试页面
41
+ * @param name 模块名称
42
+ * @param isSetting 是否打开模块设置
43
+ */
44
+ const open = (name: string, isSetting: boolean = false) => {
45
+ window.location.hash = `name=${name}&setting=${isSetting.toString()}`;
46
+ }
47
+
48
+ const getSnackConfig = () => {
49
+ if (!projectPkg.snack) return;
50
+ return (
51
+ <>
52
+ {projectPkg.snack.externals ?
53
+ <div>
54
+ <span className={'info-label'}>Externals:</span>
55
+ <pre>{JSON.stringify(projectPkg.snack.externals, null, 4)}</pre>
56
+ </div> : null}
57
+ {projectPkg.snack.buildIgnore ?
58
+ <div>
59
+ <span className={'info-label'}>BuildIgnore:</span>
60
+ <pre>{JSON.stringify(projectPkg.snack.buildIgnore, null, 4)}</pre>
61
+ </div> : null}
62
+ {projectPkg.snack.devPackage ?
63
+ <div>
64
+ <span className={'info-label'}>DevPackage:</span>
65
+ <pre>{JSON.stringify(projectPkg.snack.devPackage, null, 4)}</pre>
66
+ </div> : null}
67
+ </>
68
+ )
69
+ }
70
+
71
+ // 路由监听
72
+ const content = React.useMemo(() => {
73
+ const arg = resolveRouter(router)
74
+ if (!arg) {
75
+ return (
76
+ <div className={'snack-dev'}>
77
+ <div className={'snack-title'}>
78
+ <span className={'title'}>
79
+ <img src={logo} />
80
+ <span>nack Developer</span>
81
+ </span>
82
+ <span className={'sub'}>Powered by @iam-com/snack-scripts@{version} @iam-com/snack-core@{Core.version}</span>
83
+ </div>
84
+ <div className={'snack-tips'}>请选择所要调试的模块</div>
85
+ <div className={'package-list'}>
86
+ {packageList()}
87
+ </div>
88
+ <div className={'snack-info'}>
89
+ <div className={'into-title'}>Project Info</div>
90
+ <div><span className={'info-label'}>Name:</span>{projectPkg.name}</div>
91
+ <div><span className={'info-label'}>Author:</span>{projectPkg.author}</div>
92
+ <div><span className={'info-label'}>Version:</span>{projectPkg.version}</div>
93
+ {getSnackConfig()}
94
+ </div>
95
+ </div>
96
+ )
97
+ } else {
98
+ // 解析路由
99
+ module = mosuleMaps[arg.name];
100
+ if (!module) return <div>Snack Module is Missing</div>;
101
+ let SnackClass = module.index, SnackSettingClass = module.setting;
102
+ const snack = new SnackClass({$snackSDK: sdk});
103
+ const Module = () => snack.FC();
104
+ let sanckSetting;
105
+ if (arg.setting) {
106
+ sanckSetting = new SnackSettingClass(snack, {$snackSDK: sdk});
107
+ const ModuleSetting = () => sanckSetting.FC();
108
+ let Setting, tips = null;
109
+ if (settingPanel) {
110
+ Setting = settingPanel.FC;
111
+ setTimeout(() => {
112
+ settingPanel.snack.render({M: snack, S: sanckSetting, SFC: ModuleSetting});
113
+
114
+ }, 0);
115
+ } else {
116
+ Setting = ModuleSetting;
117
+ const style = {
118
+ fontSize: '14px',
119
+ border: '1px solid #ffc676',
120
+ background: '#FFD70061',
121
+ borderRadius: '6px',
122
+ padding: '10px',
123
+ color: '#855718',
124
+ margin: '5px 0',
125
+ textAlign: 'center'
126
+ }
127
+ tips = (
128
+ <div style={style}>
129
+ 注意:当前调试环境缺少{'{type: basics, name: settingpanel}'}模块,无法渲染model配置的设置
130
+ </div>
131
+ )
132
+ }
133
+ return (
134
+ <>
135
+ <div className={'snack-dev-setting-left'}>
136
+ <Module />
137
+ </div>
138
+ <div className={'snack-dev-setting-right'}>
139
+ {tips}
140
+ <Setting />
141
+ </div>
142
+ </>
143
+ );
144
+ } else {
145
+ return <Module />;
146
+ }
147
+ }
148
+
149
+ }, [router]);
150
+
151
+ return content;
152
+ }
153
+ export default App;
154
+
155
+ const resolveRouter = (hash: string) => {
156
+ if (!hash) return null;
157
+ let name = '', setting = false;
158
+ hash.split('&').forEach(item => {
159
+ const sp = item.split('=');
160
+ if (sp[0] === 'name') name = sp[1];
161
+ else if (sp[0] === 'setting') setting = sp[1] === 'true' ? true : false;
162
+ });
163
+ return {name, setting};
164
+ }
@@ -0,0 +1,34 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <link rel="shortcut icon" type="image/svg" href="./favicon.svg">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
7
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
8
+ <meta name="description" content="Paraview FED" />
9
+ <!--
10
+ Notice the use of %PUBLIC_URL% in the tags above.
11
+ It will be replaced with the URL of the `public` folder during the build.
12
+ Only files inside the `public` folder can be referenced from the HTML.
13
+
14
+ Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
15
+ work correctly both with client-side routing and a non-root public URL.
16
+ Learn how to configure a non-root public URL by running `npm run build`.
17
+ -->
18
+ <title>Snack Developer</title>
19
+ </head>
20
+ <body>
21
+ <noscript>You need to enable JavaScript to run this app.</noscript>
22
+ <div id="app"></div>
23
+ <!--
24
+ This HTML file is a template.
25
+ If you open it directly in the browser, you will see an empty page.
26
+
27
+ You can add webfonts, meta tags, or analytics to this file.
28
+ The build step will place the bundled scripts into the <body> tag.
29
+
30
+ To begin the development, run `npm start` or `yarn start`.
31
+ To create a production bundle, use `npm run build` or `yarn build`.
32
+ -->
33
+ </body>
34
+ </html>
@@ -0,0 +1,126 @@
1
+ .snack-dev {
2
+ padding: 20px;
3
+ height: 100%;
4
+ width: 100%;
5
+ background-color: #e0e5ec;
6
+ overflow-y: auto;
7
+
8
+ .snack-title {
9
+
10
+ .title {
11
+ font-size: 30px;
12
+ font-weight: bold;
13
+ color: #47dab5;
14
+ background: linear-gradient(to right, #47dab5, #509bf6);
15
+ -webkit-background-clip: text;
16
+ color: transparent;
17
+
18
+ img {
19
+ width: 50px;
20
+ vertical-align: bottom;
21
+ margin-right: -11px;
22
+ margin-bottom: -3px;
23
+ }
24
+ }
25
+
26
+ .sub {
27
+ margin-left: 20px;
28
+ font-size: 12px;
29
+ color: #000;
30
+ opacity: .2;
31
+ }
32
+ }
33
+
34
+ .snack-tips {
35
+ font-size: 18px;
36
+ color: #000;
37
+ opacity: .3;
38
+ padding: 20px;
39
+ }
40
+
41
+ .package-list {
42
+ padding: 0 20px;
43
+ display: inline-block;
44
+ width: calc(100% - 350px);
45
+ box-sizing: border-box;
46
+ overflow: auto;
47
+ height: calc(100vh - 160px);
48
+
49
+ .package-item {
50
+ width: 200px;
51
+ display: inline-block;
52
+ user-select: none;
53
+ font-size: 17px;
54
+ margin: 10px 20px;
55
+ text-align: center;
56
+
57
+ .item-name {
58
+ color: #909090;
59
+ }
60
+
61
+ .item-btn {
62
+ width: 42%;
63
+ height: 25px;
64
+ text-align: center;
65
+ background-color: #e0e5ec;
66
+ box-shadow: rgba(163, 177, 198, .5) 3px 3px 6px 0px, white -3px -3px 6px 0px;
67
+ border-radius: 4px;
68
+ font-size: 13px;
69
+ line-height: 26px;
70
+ box-sizing: border-box;
71
+ cursor: pointer;
72
+ color: #676767;
73
+ transition: background-color .2s;
74
+ font-weight: normal;
75
+ display: inline-block;
76
+ margin: 10px 3%;
77
+
78
+ &:hover {
79
+ background-color: #e9ecf1;
80
+ }
81
+
82
+ &:active {
83
+ box-shadow: rgba(163, 177, 198, 0.5) 3px 3px 6px 0px inset, rgb(255, 255, 255) -3px -3px 6px 0px inset;
84
+ }
85
+ }
86
+ }
87
+ }
88
+
89
+ .snack-info {
90
+ display: inline-block;
91
+ width: 350px;
92
+ vertical-align: top;
93
+ color: #000;
94
+ opacity: .8;
95
+
96
+ .into-title {
97
+ font-size: 19px;
98
+ font-weight: bold;
99
+ margin-bottom: 10px;
100
+ color: #000;
101
+ }
102
+
103
+ .info-label {
104
+ display: inline-block;
105
+ width: 85px;
106
+ color: #000;
107
+ opacity: .5;
108
+ }
109
+
110
+ pre {
111
+ overflow: auto;
112
+ }
113
+ }
114
+ }
115
+
116
+ .snack-dev-setting-left, .snack-dev-setting-right {
117
+ display: inline-block;
118
+ width: 50%;
119
+ height: 100%;
120
+ vertical-align: top;
121
+ box-sizing: border-box;
122
+ }
123
+
124
+ .snack-dev-setting-right {
125
+ border-left: 1px dashed #dbdbdb;
126
+ }
@@ -0,0 +1,66 @@
1
+ // @ts-nocheck
2
+
3
+ import React from 'react';
4
+ import ReactDOM from 'react-dom';
5
+ import {Context} from '@iam-com/lib';
6
+ import Debugger from '@iam-com/lib/debugger';
7
+ import App from './App';
8
+
9
+ /** import snack modules **/
10
+
11
+ import {SnackSDK} from "@iam-com/snack-core";
12
+
13
+ import 'template/normalize.scss';
14
+ import './index.scss';
15
+
16
+ /** import plugin js **/
17
+ /** import plugin css **/
18
+
19
+ const version = '/** snack scripts version **/';
20
+ /** snack module maps **/
21
+ ;
22
+ const projectPkg = JSON.parse(`/** vers projectpkg **/`);
23
+ const packages = JSON.parse(`/** vers packages **/`);
24
+
25
+
26
+ async function init() {
27
+ await Debugger.init(projectPkg.dev.debug || []);
28
+ const sdk = new SnackSDK({
29
+ service: Context.get('snackbar'),
30
+ importMaps: {
31
+ 'react': React,
32
+ 'react-dom': ReactDOM
33
+ },
34
+ importModules: {
35
+ /** vers importmodule **/
36
+ }
37
+ });
38
+ // 加载设置渲染模块
39
+ const settingPanel = await sdk.createModule({type: 'basics', name: 'settingpanel'});
40
+ const Main = () => {
41
+ const [router, setRouter] = React.useState(window.location.hash?.substr(1) || '');
42
+
43
+ React.useEffect(() => {
44
+ window.onhashchange = () => {
45
+ setRouter(window.location.hash?.substr(1) || '');
46
+ }
47
+ }, []);
48
+ const settingPanelConfig = settingPanel ? {snack: settingPanel, FC: () => settingPanel.FC()} : null
49
+ return (
50
+ <App
51
+ settingPanel={settingPanelConfig}
52
+ router={router}
53
+ sdk={sdk}
54
+ packages={packages}
55
+ projectPkg={projectPkg}
56
+ version={version}
57
+ mosuleMaps={mosuleMaps}
58
+ />
59
+ );
60
+ }
61
+
62
+ ReactDOM.render(<Main />, document.getElementById('app'));
63
+
64
+ }
65
+
66
+ init();
@@ -0,0 +1,94 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8"/>
5
+ <link rel="shortcut icon" type="image/x-icon" href="<%= htmlWebpackPlugin.options.jsvers.favicon %>">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1"/>
7
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
8
+ <meta name="description" content="Paraview FED"/>
9
+ <!--
10
+ Notice the use of %PUBLIC_URL% in the tags above.
11
+ It will be replaced with the URL of the `public` folder during the build.
12
+ Only files inside the `public` folder can be referenced from the HTML.
13
+
14
+ Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
15
+ work correctly both with client-side routing and a non-root public URL.
16
+ Learn how to configure a non-root public URL by running `npm run build`.
17
+ -->
18
+ <title><%= htmlWebpackPlugin.options.title %></title>
19
+ </head>
20
+ <body>
21
+ <noscript>You need to enable JavaScript to run this app.</noscript>
22
+ <div id="app"></div>
23
+ <!--
24
+ This HTML file is a template.
25
+ If you open it directly in the browser, you will see an empty page.
26
+
27
+ You can add webfonts, meta tags, or analytics to this file.
28
+ The build step will place the bundled scripts into the <body> tag.
29
+
30
+ To begin the development, run `npm start` or `yarn start`.
31
+ To create a production bundle, use `npm run build` or `yarn build`.
32
+ -->
33
+ </body>
34
+ <script>
35
+ window.DevServer = '<%= htmlWebpackPlugin.options.jsvers.devServer %>';
36
+ // 默认页面id
37
+ window.Id = '<%= htmlWebpackPlugin.options.jsvers.id %>';
38
+ window.Type = '<%= htmlWebpackPlugin.options.jsvers.type %>';
39
+ // 移动端页面id,可选配置
40
+ window.MobileId = '<%= htmlWebpackPlugin.options.jsvers.mobile.id %>';
41
+ window.MobileType = '<%= htmlWebpackPlugin.options.jsvers.mobile.type %>';
42
+ // Snack服务地址
43
+ window.Service = '<%= htmlWebpackPlugin.options.jsvers.service %>';
44
+ (function () {
45
+ function loadJS(url, callback) {
46
+ var script = document.createElement('script'),
47
+ fn = callback || function () {};
48
+ script.type = 'text/javascript';
49
+ // 兼容国际化
50
+ try {
51
+ var language = window.localStorage.getItem('language');
52
+ var title = JSON.parse(document.title);
53
+ if (title) document.title = title[language] || title['zh-CN'] || '';
54
+ } catch (e) {
55
+ console.log(e);
56
+ }
57
+ //IE
58
+ if (script.readyState) {
59
+ script.onreadystatechange = function () {
60
+ if (script.readyState == 'loaded' || script.readyState == 'complete') {
61
+ script.onreadystatechange = null;
62
+ fn();
63
+ }
64
+ };
65
+ } else {
66
+ //其他浏览器
67
+ script.onload = function () {
68
+ fn();
69
+ };
70
+ }
71
+ script.src = url;
72
+ document.getElementsByTagName('head')[0].appendChild(script);
73
+ }
74
+
75
+ function loadMain() {
76
+ loadJS('<%= htmlWebpackPlugin.options.jsvers.loaderjs %>', function () {
77
+ window.SnackRender();
78
+ });
79
+ }
80
+
81
+ if (!window.Promise) {
82
+ loadJS('minified.min.js', function () {
83
+ if (!window.Proxy) {
84
+ loadJS('proxy.min.js', loadMain);
85
+ } else {
86
+ loadMain();
87
+ }
88
+ });
89
+ } else {
90
+ loadMain();
91
+ }
92
+ })();
93
+ </script>
94
+ </html>
File without changes
@@ -0,0 +1,69 @@
1
+ // @ts-nocheck
2
+ import React from 'react';
3
+ import ReactDOM from 'react-dom';
4
+ import {Context, GetURLParameters} from '@iam-com/lib';
5
+ import * as ParaLib from '@iam-com/lib';
6
+
7
+ import {SnackSDK} from '@iam-com/snack-core';
8
+ import '../normalize.scss';
9
+
10
+ /** import plugin js **/
11
+ /** import plugin css **/
12
+
13
+ (({Id, Type, Service, MobileId, MobileType}) => {
14
+ const params = GetURLParameters();
15
+ let id, type, service;
16
+ // 移动端
17
+ if (isMobile() && MobileId) {
18
+ id = MobileId;
19
+ type = MobileType;
20
+ } else {
21
+ id = Id;
22
+ type = Type;
23
+ }
24
+ // url 参数
25
+ if (params['snack_id'])
26
+ id = params['snack_id'];
27
+ if (params['snack_type'])
28
+ type = params['snack_type'];
29
+ // snack 服务地址
30
+ if (params['snack_service'])
31
+ service = params['snack_service'];
32
+ else
33
+ service = Service;
34
+
35
+ async function init() {
36
+ await Context.load();
37
+ const sdk = new SnackSDK({
38
+ service: service || Context.get('snackbar'),
39
+ importMaps: {
40
+ 'react': React,
41
+ 'react-dom': ReactDOM
42
+ }
43
+ });
44
+ window.snackSDK = sdk;
45
+ const Page = await sdk.createPageComponent({id, type});
46
+
47
+ ReactDOM.render((
48
+ <Page/>
49
+ ), document.getElementById('app'));
50
+ }
51
+
52
+ /**
53
+ * 移动端判定
54
+ * 竖屏或宽度小于1024
55
+ */
56
+ function isMobile() {
57
+ const vertical = window.innerWidth / window.innerHeight < 0.8;
58
+ if (vertical || window.innerWidth < 1024) return true;
59
+ return false;
60
+ }
61
+
62
+ window.SnackSDK = SnackSDK;
63
+ window.React = React;
64
+ window.ReactDOM = ReactDOM;
65
+ window.Context = Context;
66
+ window.SnackRender = init;
67
+ window.ParaLib = ParaLib;
68
+ })(window);
69
+
@@ -0,0 +1,7 @@
1
+ declare module '*.svg'
2
+ declare module '*.png'
3
+ declare module '*.jpg'
4
+ declare module '*.jpeg'
5
+ declare module '*.gif'
6
+ declare module '*.bmp'
7
+ declare module '*.tiff'
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 220"><defs><style>.cls-1{fill:none;}.cls-2{fill:#3d97b7;}.cls-3{fill:#28a593;}.cls-4{fill:#3cc5a1;}.cls-5{fill:#43afd3;}.cls-6{fill:#41d8c5;}.cls-7{fill:#47dab5;}.cls-8{fill:#437dc6;}.cls-9{fill:#509bf6;}</style></defs><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><rect class="cls-1" width="220" height="220"/><path class="cls-2" d="M152.91,49.57s5.27,6,11.27,5c-3,1-10,4-18,1S152.91,49.57,152.91,49.57Z"/><path class="cls-2" d="M167.43,53.79s8.68-1.13,9.79-2.07c.64-.45,2.59-.86,2.95-4s-4.94-4.06-6.28-.71a5.89,5.89,0,0,1-1.54,2.37A64.15,64.15,0,0,1,167.43,53.79Z"/><path class="cls-3" d="M96.55,162.8,77.81,181.54A77.62,77.62,0,0,1,51.87,165.2L64,150.69a7.71,7.71,0,0,1,10.54-1.22A61.46,61.46,0,0,0,95.71,159.8,1.79,1.79,0,0,1,96.55,162.8Z"/><path class="cls-4" d="M160.26,142c0,24.2-20.2,44.8-54.39,44.8a78.42,78.42,0,0,1-28.06-5.26l19.66-19.66a3.82,3.82,0,0,1,3.22-1.1,40.45,40.45,0,0,0,5.78.42c15.4,0,23.59-6.6,23.59-17a13.81,13.81,0,0,0-2.72-8.69,2.82,2.82,0,0,1,.23-3.73l19.92-19.92C155.53,118.9,160.26,128.45,160.26,142Z"/><path class="cls-2" d="M155.53,52.37l-9.66,12a8.73,8.73,0,0,1-11.56,1.76,44.74,44.74,0,0,0-25-7.51c-.87,0-1.72,0-2.55.08l22.43-22.43A63.67,63.67,0,0,1,155.51,52,.25.25,0,0,1,155.53,52.37Z"/><path class="cls-5" d="M145.87,64.35h0a8.73,8.73,0,0,1-11.56,1.76,44.74,44.74,0,0,0-25-7.51c-.87,0-1.72,0-2.55.08L121.28,44.1A16.67,16.67,0,0,1,141,41.2l.27.15A15.27,15.27,0,0,1,145.87,64.35Z"/><path class="cls-6" d="M86.24,173.1l-8.43,8.44A77.62,77.62,0,0,1,51.87,165.2L56.22,160a21.66,21.66,0,0,1,26.85-5.1l.3.16A11.31,11.31,0,0,1,86.24,173.1Z"/><path class="cls-7" d="M160.26,142c0,24.2-20.2,44.8-54.39,44.8q-3.18,0-6.34-.27A11.45,11.45,0,0,1,92.33,167h0a19.84,19.84,0,0,1,14.06-5.82h.08c15.4,0,23.59-6.6,23.59-17a14.48,14.48,0,0,0-1.46-6.66,7.14,7.14,0,0,1,1.41-8.21h0c11.07-11.07,30.13-3.39,30.24,12.26C160.25,141.73,160.26,141.86,160.26,142Z"/><path class="cls-2" d="M116.74,96l-20.6,20.6a3.91,3.91,0,0,1-4.27.83l-3.8-1.62c-8.27-3.42-16.54-8.6-22.3-16.18L88.19,77.2C90,85.58,99.74,89.1,111.07,93.6Z"/><path class="cls-3" d="M147.49,111.86l-20.24,20.23a2.38,2.38,0,0,1-3.14.24c-3.91-3-9.53-5.28-16.24-8.13l-10.75-4.56a2.08,2.08,0,0,1-.66-3.38L116.74,96l13.73,5.81A59.86,59.86,0,0,1,147.49,111.86Z"/><path class="cls-8" d="M129.14,36.25,106.71,58.68c-11.53.72-18.84,6.38-18.84,15.52a13.66,13.66,0,0,0,.32,3L68.7,96.69a3.41,3.41,0,0,1-5.33-.62A38.49,38.49,0,0,1,58.07,76c0-24.2,21.2-42.8,51.19-42.8A66.68,66.68,0,0,1,129.14,36.25Z"/><path class="cls-6" d="M54.33,167.45s-9.15-7.9-9.15-14.9c3,4,6,9,18,6S54.33,167.45,54.33,167.45Z"/><path class="cls-6" d="M43.88,149.58s-4.07-7.74-3.94-9.18c0-.79-.79-2.63,1.57-4.73s6.17,1.7,4.2,4.72a5.92,5.92,0,0,0-1,2.63A62,62,0,0,0,43.88,149.58Z"/><path class="cls-6" d="M142.94,116.4l14.05-14c.09.71-15.7,9.32-34.81,5.19C130.23,112.72,142.94,116.4,142.94,116.4Z"/><path class="cls-6" d="M158.18,100.55s3-5,3-9,5-7,6-6,0,3-2,6S158.18,100.55,158.18,100.55Z"/><path class="cls-8" d="M68.7,96.69s-2.19,3.14-13.36,0c1.84-.14,6.28,1.86,11.56-6.14S68.7,96.69,68.7,96.69Z"/><path class="cls-8" d="M51.74,96.05s-4.38-.62-4.94-1.1a2.31,2.31,0,0,1-1.47-2c-.16-1.59,2.53-2,3.19-.32a3,3,0,0,0,.76,1.21A32.46,32.46,0,0,0,51.74,96.05Z"/><path class="cls-9" d="M116,49.38l-1.11,1.1a40.77,40.77,0,0,1-16,9.64c-6.92,2.33-11,7.23-11,14.08v0a7.65,7.65,0,0,1-2.19,5.47l-5.51,5.52c-8.08,8.08-22,2.5-22.1-8.93V76c0-24.2,21.2-42.8,51.19-42.8h.2C117.83,33.23,121.93,43.46,116,49.38Z"/><path class="cls-5" d="M112.38,100.34,99.06,113.66a10,10,0,0,1-11,2.14h0A61.91,61.91,0,0,1,74.19,108a10.48,10.48,0,0,1-1-15.75l.17-.18a21.66,21.66,0,0,1,25.3-3.74c3.62,1.86,7.89,3.5,12.43,5.3h0A4.14,4.14,0,0,1,112.38,100.34Z"/><path class="cls-6" d="M147.49,111.86l-5.93,5.93a30.51,30.51,0,0,1-33.47,6.51l-.22-.1h0A9.94,9.94,0,0,1,104.72,108l1.47-1.48a22.15,22.15,0,0,1,24.28-4.73h0A59.86,59.86,0,0,1,147.49,111.86Z"/></g></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 220"><defs><style>.cls-1{fill:none;}.cls-2{fill:#3d97b7;}.cls-3{fill:#28a593;}.cls-4{fill:#3cc5a1;}.cls-5{fill:#43afd3;}.cls-6{fill:#41d8c5;}.cls-7{fill:#47dab5;}.cls-8{fill:#437dc6;}.cls-9{fill:#509bf6;}</style></defs><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><rect class="cls-1" width="220" height="220"/><path class="cls-2" d="M152.91,49.57s5.27,6,11.27,5c-3,1-10,4-18,1S152.91,49.57,152.91,49.57Z"/><path class="cls-2" d="M167.43,53.79s8.68-1.13,9.79-2.07c.64-.45,2.59-.86,2.95-4s-4.94-4.06-6.28-.71a5.89,5.89,0,0,1-1.54,2.37A64.15,64.15,0,0,1,167.43,53.79Z"/><path class="cls-3" d="M96.55,162.8,77.81,181.54A77.62,77.62,0,0,1,51.87,165.2L64,150.69a7.71,7.71,0,0,1,10.54-1.22A61.46,61.46,0,0,0,95.71,159.8,1.79,1.79,0,0,1,96.55,162.8Z"/><path class="cls-4" d="M160.26,142c0,24.2-20.2,44.8-54.39,44.8a78.42,78.42,0,0,1-28.06-5.26l19.66-19.66a3.82,3.82,0,0,1,3.22-1.1,40.45,40.45,0,0,0,5.78.42c15.4,0,23.59-6.6,23.59-17a13.81,13.81,0,0,0-2.72-8.69,2.82,2.82,0,0,1,.23-3.73l19.92-19.92C155.53,118.9,160.26,128.45,160.26,142Z"/><path class="cls-2" d="M155.53,52.37l-9.66,12a8.73,8.73,0,0,1-11.56,1.76,44.74,44.74,0,0,0-25-7.51c-.87,0-1.72,0-2.55.08l22.43-22.43A63.67,63.67,0,0,1,155.51,52,.25.25,0,0,1,155.53,52.37Z"/><path class="cls-5" d="M145.87,64.35h0a8.73,8.73,0,0,1-11.56,1.76,44.74,44.74,0,0,0-25-7.51c-.87,0-1.72,0-2.55.08L121.28,44.1A16.67,16.67,0,0,1,141,41.2l.27.15A15.27,15.27,0,0,1,145.87,64.35Z"/><path class="cls-6" d="M86.24,173.1l-8.43,8.44A77.62,77.62,0,0,1,51.87,165.2L56.22,160a21.66,21.66,0,0,1,26.85-5.1l.3.16A11.31,11.31,0,0,1,86.24,173.1Z"/><path class="cls-7" d="M160.26,142c0,24.2-20.2,44.8-54.39,44.8q-3.18,0-6.34-.27A11.45,11.45,0,0,1,92.33,167h0a19.84,19.84,0,0,1,14.06-5.82h.08c15.4,0,23.59-6.6,23.59-17a14.48,14.48,0,0,0-1.46-6.66,7.14,7.14,0,0,1,1.41-8.21h0c11.07-11.07,30.13-3.39,30.24,12.26C160.25,141.73,160.26,141.86,160.26,142Z"/><path class="cls-2" d="M116.74,96l-20.6,20.6a3.91,3.91,0,0,1-4.27.83l-3.8-1.62c-8.27-3.42-16.54-8.6-22.3-16.18L88.19,77.2C90,85.58,99.74,89.1,111.07,93.6Z"/><path class="cls-3" d="M147.49,111.86l-20.24,20.23a2.38,2.38,0,0,1-3.14.24c-3.91-3-9.53-5.28-16.24-8.13l-10.75-4.56a2.08,2.08,0,0,1-.66-3.38L116.74,96l13.73,5.81A59.86,59.86,0,0,1,147.49,111.86Z"/><path class="cls-8" d="M129.14,36.25,106.71,58.68c-11.53.72-18.84,6.38-18.84,15.52a13.66,13.66,0,0,0,.32,3L68.7,96.69a3.41,3.41,0,0,1-5.33-.62A38.49,38.49,0,0,1,58.07,76c0-24.2,21.2-42.8,51.19-42.8A66.68,66.68,0,0,1,129.14,36.25Z"/><path class="cls-6" d="M54.33,167.45s-9.15-7.9-9.15-14.9c3,4,6,9,18,6S54.33,167.45,54.33,167.45Z"/><path class="cls-6" d="M43.88,149.58s-4.07-7.74-3.94-9.18c0-.79-.79-2.63,1.57-4.73s6.17,1.7,4.2,4.72a5.92,5.92,0,0,0-1,2.63A62,62,0,0,0,43.88,149.58Z"/><path class="cls-6" d="M142.94,116.4l14.05-14c.09.71-15.7,9.32-34.81,5.19C130.23,112.72,142.94,116.4,142.94,116.4Z"/><path class="cls-6" d="M158.18,100.55s3-5,3-9,5-7,6-6,0,3-2,6S158.18,100.55,158.18,100.55Z"/><path class="cls-8" d="M68.7,96.69s-2.19,3.14-13.36,0c1.84-.14,6.28,1.86,11.56-6.14S68.7,96.69,68.7,96.69Z"/><path class="cls-8" d="M51.74,96.05s-4.38-.62-4.94-1.1a2.31,2.31,0,0,1-1.47-2c-.16-1.59,2.53-2,3.19-.32a3,3,0,0,0,.76,1.21A32.46,32.46,0,0,0,51.74,96.05Z"/><path class="cls-9" d="M116,49.38l-1.11,1.1a40.77,40.77,0,0,1-16,9.64c-6.92,2.33-11,7.23-11,14.08v0a7.65,7.65,0,0,1-2.19,5.47l-5.51,5.52c-8.08,8.08-22,2.5-22.1-8.93V76c0-24.2,21.2-42.8,51.19-42.8h.2C117.83,33.23,121.93,43.46,116,49.38Z"/><path class="cls-5" d="M112.38,100.34,99.06,113.66a10,10,0,0,1-11,2.14h0A61.91,61.91,0,0,1,74.19,108a10.48,10.48,0,0,1-1-15.75l.17-.18a21.66,21.66,0,0,1,25.3-3.74c3.62,1.86,7.89,3.5,12.43,5.3h0A4.14,4.14,0,0,1,112.38,100.34Z"/><path class="cls-6" d="M147.49,111.86l-5.93,5.93a30.51,30.51,0,0,1-33.47,6.51l-.22-.1h0A9.94,9.94,0,0,1,104.72,108l1.47-1.48a22.15,22.15,0,0,1,24.28-4.73h0A59.86,59.86,0,0,1,147.49,111.86Z"/></g></g></svg>