@abi-software/mapintegratedvuer 0.7.1-demo.0 → 0.7.2-vue3.0-alpha.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.
- package/LICENSE +201 -201
- package/README.md +150 -142
- package/assets/gazelle-icons-no-background.css +32 -0
- package/assets/styleguide.css +19 -19
- package/cypress.config.js +23 -23
- package/dist/index.html +17 -17
- package/dist/mapintegratedvuer.js +60394 -59859
- package/dist/mapintegratedvuer.umd.cjs +515 -907
- package/dist/matterport.pdf +0 -0
- package/dist/style.css +1 -1
- package/dist/test.txt +0 -0
- package/package.json +135 -136
- package/public/index.html +17 -17
- package/public/matterport.pdf +0 -0
- package/public/test.txt +0 -0
- package/q.json +690 -0
- package/reporter-config.json +9 -9
- package/src/App.vue +245 -245
- package/src/assets/_variables.scss +43 -43
- package/src/assets/fonts/mapicon-species.eot +0 -0
- package/src/assets/fonts/mapicon-species.ttf +0 -0
- package/src/assets/fonts/mapicon-species.woff +0 -0
- package/src/assets/header-icon.scss +67 -67
- package/src/assets/mapicon-species-style.css +41 -41
- package/src/assets/styles.scss +9 -9
- package/src/components/ContentBar.vue +376 -376
- package/src/components/ContentVuer.vue +217 -217
- package/src/components/ContextCard.vue +385 -385
- package/src/components/ContextHelp.vue +73 -73
- package/src/components/CustomSplitter.vue +151 -151
- package/src/components/DatasetHeader.vue +97 -97
- package/src/components/DialogToolbarContent.vue +464 -464
- package/src/components/EventBus.js +3 -3
- package/src/components/FlatmapContextCard.vue +134 -134
- package/src/components/MapContent.vue +333 -285
- package/src/components/ResizeSensor.vue +47 -47
- package/src/components/SearchControls.vue +115 -115
- package/src/components/SimulatedData.js +721 -721
- package/src/components/SplitDialog.vue +287 -287
- package/src/components/SplitFlow.vue +414 -414
- package/src/components/index.js +7 -7
- package/src/components/markerZoomLevelsHardCoded.js +255 -255
- package/src/components/scripts/utilities.js +173 -173
- package/src/components/viewers/Flatmap.vue +145 -145
- package/src/components/viewers/Iframe.vue +31 -31
- package/src/components/viewers/MultiFlatmap.vue +384 -384
- package/src/components/viewers/Plot.vue +23 -23
- package/src/components/viewers/Scaffold.vue +198 -198
- package/src/components/viewers/Simulation.vue +21 -21
- package/src/icons/yellowstar.js +1 -1
- package/src/main.js +32 -22
- package/src/mixins/ContentMixin.js +438 -438
- package/src/mixins/DynamicMarkerMixin.js +88 -88
- package/src/mixins/RetrieveContextCardMixin.js +82 -0
- package/src/mixins/S3Bucket.vue +37 -37
- package/src/stores/entries.js +40 -40
- package/src/stores/index.js +24 -16
- package/src/stores/settings.js +144 -144
- package/src/stores/splitFlow.js +523 -523
- package/static.json +7 -7
- package/tsconfig.json +19 -0
- package/vite.config.js +70 -66
- package/vite.static-build.js +12 -12
- package/vitest.workspace.js +3 -3
- package/vuese-generator.js +65 -0
@@ -1,286 +1,334 @@
|
|
1
|
-
<template>
|
2
|
-
<div
|
3
|
-
ref="MapApp"
|
4
|
-
v-loading="!isReady"
|
5
|
-
class="mapcontent"
|
6
|
-
element-loading-text="Loading..."
|
7
|
-
element-loading-background="rgba(0, 0, 0, 0.3)"
|
8
|
-
>
|
9
|
-
<map-svg-sprite-color/>
|
10
|
-
<SplitFlow
|
11
|
-
v-if="isReady"
|
12
|
-
@onFullscreen="onFullscreen"
|
13
|
-
:state="stateToSet"
|
14
|
-
ref="flow"
|
15
|
-
@vue:mounted="flowMounted"
|
16
|
-
/>
|
17
|
-
</div>
|
18
|
-
</template>
|
19
|
-
|
20
|
-
<script>
|
21
|
-
/* eslint-disable no-alert, no-console */
|
22
|
-
import SplitFlow from './SplitFlow.vue';
|
23
|
-
import EventBus from './EventBus';
|
24
|
-
import { mapStores } from 'pinia';
|
25
|
-
import { useSettingsStore } from '../stores/settings';
|
26
|
-
import { findSpeciesKey } from './scripts/utilities.js';
|
27
|
-
import { MapSvgSpriteColor} from '@abi-software/svg-sprite';
|
28
|
-
import { initialState } from "./scripts/utilities.js";
|
29
|
-
import
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
},
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
}
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
//
|
186
|
-
//
|
187
|
-
//
|
188
|
-
//
|
189
|
-
//
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
}
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
.
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
1
|
+
<template>
|
2
|
+
<div
|
3
|
+
ref="MapApp"
|
4
|
+
v-loading="!isReady"
|
5
|
+
class="mapcontent"
|
6
|
+
element-loading-text="Loading..."
|
7
|
+
element-loading-background="rgba(0, 0, 0, 0.3)"
|
8
|
+
>
|
9
|
+
<map-svg-sprite-color/>
|
10
|
+
<SplitFlow
|
11
|
+
v-if="isReady"
|
12
|
+
@onFullscreen="onFullscreen"
|
13
|
+
:state="stateToSet"
|
14
|
+
ref="flow"
|
15
|
+
@vue:mounted="flowMounted"
|
16
|
+
/>
|
17
|
+
</div>
|
18
|
+
</template>
|
19
|
+
|
20
|
+
<script>
|
21
|
+
/* eslint-disable no-alert, no-console */
|
22
|
+
import SplitFlow from './SplitFlow.vue';
|
23
|
+
import EventBus from './EventBus';
|
24
|
+
import { mapStores } from 'pinia';
|
25
|
+
import { useSettingsStore } from '../stores/settings';
|
26
|
+
import { findSpeciesKey } from './scripts/utilities.js';
|
27
|
+
import { MapSvgSpriteColor} from '@abi-software/svg-sprite';
|
28
|
+
import { initialState } from "./scripts/utilities.js";
|
29
|
+
import RetrieveContextCardMixin from "../mixins/RetrieveContextCardMixin.js"
|
30
|
+
import {
|
31
|
+
ElLoading as Loading
|
32
|
+
} from "element-plus";
|
33
|
+
|
34
|
+
/**
|
35
|
+
* Content of the app. More work flows will be added here.
|
36
|
+
*/
|
37
|
+
export default {
|
38
|
+
name: "MapContent",
|
39
|
+
components: {
|
40
|
+
MapSvgSpriteColor,
|
41
|
+
Loading,
|
42
|
+
SplitFlow,
|
43
|
+
},
|
44
|
+
mixins: [RetrieveContextCardMixin],
|
45
|
+
props: {
|
46
|
+
/**
|
47
|
+
* A link (URL) to share.
|
48
|
+
*/
|
49
|
+
shareLink: {
|
50
|
+
type: String,
|
51
|
+
default: undefined
|
52
|
+
},
|
53
|
+
/**
|
54
|
+
* State containing state of the scaffold.
|
55
|
+
*/
|
56
|
+
state: {
|
57
|
+
type: Object,
|
58
|
+
default: undefined
|
59
|
+
},
|
60
|
+
/**
|
61
|
+
* The options include APIs and Keys.
|
62
|
+
*/
|
63
|
+
options: {
|
64
|
+
type: Object,
|
65
|
+
default: () => {},
|
66
|
+
required: true
|
67
|
+
},
|
68
|
+
/**
|
69
|
+
* New option to start the map in AC, FC or WholeBody.
|
70
|
+
*/
|
71
|
+
startingMap: {
|
72
|
+
type: String,
|
73
|
+
default: "AC"
|
74
|
+
}
|
75
|
+
},
|
76
|
+
data: function () {
|
77
|
+
return {
|
78
|
+
isReady: false,
|
79
|
+
initialState: undefined,
|
80
|
+
}
|
81
|
+
},
|
82
|
+
methods: {
|
83
|
+
/**
|
84
|
+
* @vuese
|
85
|
+
* Function to check whether it is in fullscreen mode or not.
|
86
|
+
*
|
87
|
+
*/
|
88
|
+
isFullscreen: function(){
|
89
|
+
return (document.fullscreenElement || document.webkitFullscreenElement ||
|
90
|
+
document.mozFullScreenElement || document.msFullscreenElement )
|
91
|
+
},
|
92
|
+
/**
|
93
|
+
* @vuese
|
94
|
+
* Function to toggle fullscreen.
|
95
|
+
* @arg fullscreenRequest
|
96
|
+
*/
|
97
|
+
onFullscreen: function(fullscreenReq) {
|
98
|
+
//If a request is sent, try it
|
99
|
+
if (fullscreenReq !== undefined){
|
100
|
+
if (fullscreenReq && !this.isFullscreen()){
|
101
|
+
this.goFullscreen()
|
102
|
+
}
|
103
|
+
if(!fullscreenReq && this.isFullscreen()){
|
104
|
+
this.leaveFullscreen()
|
105
|
+
}
|
106
|
+
}
|
107
|
+
// Else we toggle fullscreen
|
108
|
+
else{
|
109
|
+
if(this.isFullscreen()){
|
110
|
+
this.leaveFullscreen()
|
111
|
+
} else {
|
112
|
+
this.goFullscreen()
|
113
|
+
}
|
114
|
+
}
|
115
|
+
},
|
116
|
+
/**
|
117
|
+
* @vuese
|
118
|
+
* Function to leave fullscreen mode.
|
119
|
+
*/
|
120
|
+
leaveFullscreen: function(){
|
121
|
+
if (this.isFullscreen()) {
|
122
|
+
if (document.exitFullscreen) {
|
123
|
+
document.exitFullscreen();
|
124
|
+
} else if (document.mozCancelFullScreen) { /* Firefox */
|
125
|
+
document.mozCancelFullScreen();
|
126
|
+
} else if (document.webkitExitFullscreen) { /* Chrome, Safari and Opera */
|
127
|
+
document.webkitExitFullscreen();
|
128
|
+
} else if (document.msExitFullscreen) { /* IE/Edge */
|
129
|
+
document.msExitFullscreen();
|
130
|
+
}
|
131
|
+
}
|
132
|
+
},
|
133
|
+
/**
|
134
|
+
* @vuese
|
135
|
+
* Function to go to fullscreen mode.
|
136
|
+
*/
|
137
|
+
goFullscreen: function(){
|
138
|
+
let mapApp = this.$refs.MapApp;
|
139
|
+
if (mapApp.requestFullscreen) {
|
140
|
+
mapApp.requestFullscreen();
|
141
|
+
} else if (mapApp.mozRequestFullScreen) { /* Firefox */
|
142
|
+
mapApp.mozRequestFullScreen();
|
143
|
+
} else if (mapApp.webkitRequestFullscreen) { /* Chrome, Safari and Opera */
|
144
|
+
mapApp.webkitRequestFullscreen();
|
145
|
+
} else if (parent.msRequestFullscreen) { /* IE/Edge */
|
146
|
+
mapApp.msRequestFullscreen();
|
147
|
+
}
|
148
|
+
},
|
149
|
+
setState: function(state){
|
150
|
+
return this.$refs.flow.setState(state);
|
151
|
+
},
|
152
|
+
getState: function(){
|
153
|
+
return this.$refs.flow.getState();
|
154
|
+
},
|
155
|
+
/**
|
156
|
+
* @vuese
|
157
|
+
* Provide a way to set the current view, this is currently limited
|
158
|
+
* to setting view for flatmapm, multiflatmap or scaffold.
|
159
|
+
* In the case of the multiflatmap, it will not create a new entry and
|
160
|
+
* instead change the current entry by setting the state.
|
161
|
+
* @arg state
|
162
|
+
*/
|
163
|
+
setCurrentEntry: async function(state) {
|
164
|
+
if (state && state.type) {
|
165
|
+
if (state.type === "Scaffold" && state.url) {
|
166
|
+
//State for scaffold containing the following items:
|
167
|
+
// label - Setting the name of the dialog
|
168
|
+
// region - Which region/group currently focusing on
|
169
|
+
// resource - the url to metadata
|
170
|
+
// state - state to restore (viewport)
|
171
|
+
// viewUrl - relative path of the view file to metadata
|
172
|
+
let newView = {
|
173
|
+
type: state.type,
|
174
|
+
label: state.label,
|
175
|
+
region: state.region,
|
176
|
+
resource: state.url,
|
177
|
+
state: state.state,
|
178
|
+
viewUrl: state.viewUrl
|
179
|
+
};
|
180
|
+
// Add content from scicrunch for the context card
|
181
|
+
const contextCardInfo = await this.retrieveContextCardFromUrl(state.url);
|
182
|
+
newView = {...newView, ...contextCardInfo};
|
183
|
+
this.$refs.flow.createNewEntry(newView);
|
184
|
+
} else if (state.type === "MultiFlatmap") {
|
185
|
+
//State for scaffold containing the following items:
|
186
|
+
// label - Setting the name of the dialog
|
187
|
+
// taxo - taxo of species to set
|
188
|
+
// biologicalSex - biological sex to be displayed (PATO)
|
189
|
+
// organ - Target organ, flatmap will conduct a local search
|
190
|
+
// using this
|
191
|
+
|
192
|
+
//Look for the key in the available species array,
|
193
|
+
//it will use the taxo and biologicalSex as hints.
|
194
|
+
const key = findSpeciesKey(state);
|
195
|
+
if (key) {
|
196
|
+
const currentState = this.getState();
|
197
|
+
if (currentState && currentState.entries) {
|
198
|
+
for (let i = 0; i < currentState.entries.length; i++) {
|
199
|
+
const entry = currentState.entries[i];
|
200
|
+
if (entry.type === "MultiFlatmap") {
|
201
|
+
entry.resource = key;
|
202
|
+
entry.state = {species: key};
|
203
|
+
if (state.organ || state.uuid) {
|
204
|
+
entry.state.state = { searchTerm: state.organ, uuid: state.uuid };
|
205
|
+
//if it contains an uuid, use the taxo to help identify if the uuid
|
206
|
+
//is current
|
207
|
+
if (state.uuid) entry.state.state.entry = state.taxo;
|
208
|
+
}
|
209
|
+
this.$refs.flow.setState(currentState);
|
210
|
+
//Do not create a new entry, instead set the multiflatmap viewer
|
211
|
+
//to the primary slot
|
212
|
+
this.$refs.flow.setIdToPrimaryPane(entry.id);
|
213
|
+
break;
|
214
|
+
}
|
215
|
+
}
|
216
|
+
}
|
217
|
+
}
|
218
|
+
}
|
219
|
+
else if (state.type === "Flatmap") {
|
220
|
+
//State for scaffold containing the following items:
|
221
|
+
// label - Setting the name of the dialog
|
222
|
+
// region - Which region/group currently focusing on
|
223
|
+
// resource - the url to metadata
|
224
|
+
// state - state to restore (viewport)
|
225
|
+
// viewUrl - relative path of the view file to metadata
|
226
|
+
const newView = {
|
227
|
+
type: state.type,
|
228
|
+
resource: state.resource,
|
229
|
+
state: state.state,
|
230
|
+
label: state.label
|
231
|
+
};
|
232
|
+
this.$refs.flow.createNewEntry(newView);
|
233
|
+
}
|
234
|
+
}
|
235
|
+
},
|
236
|
+
/**
|
237
|
+
* @vuese
|
238
|
+
* Open the sidebar with the specified facets and query.
|
239
|
+
* @arg facets, query
|
240
|
+
*/
|
241
|
+
openSearch: function(facets, query) {
|
242
|
+
return this.$refs.flow.openSearch(facets, query);
|
243
|
+
},
|
244
|
+
/**
|
245
|
+
* @vuese
|
246
|
+
* Function to run when the component is mounted.
|
247
|
+
*/
|
248
|
+
flowMounted: function () {
|
249
|
+
this._flowMounted = true;
|
250
|
+
/**
|
251
|
+
* This event emit when the component is mounted.
|
252
|
+
*/
|
253
|
+
this.$emit("isReady");
|
254
|
+
},
|
255
|
+
},
|
256
|
+
computed: {
|
257
|
+
...mapStores(useSettingsStore),
|
258
|
+
stateToSet() {
|
259
|
+
return this.state ? this.state : this.initialState;
|
260
|
+
},
|
261
|
+
},
|
262
|
+
watch: {
|
263
|
+
"shareLink" : {
|
264
|
+
handler: function (newLink) {
|
265
|
+
this.settingsStore.updateShareLink(newLink);
|
266
|
+
},
|
267
|
+
immediate: true,
|
268
|
+
},
|
269
|
+
},
|
270
|
+
beforeMount: function() {
|
271
|
+
if (this.options) {
|
272
|
+
// Split options prop up to commit to the store
|
273
|
+
this.options.sparcApi ? this.settingsStore.updateSparcAPI(this.options.sparcApi) : null
|
274
|
+
this.options.algoliaIndex ? this.settingsStore.updateAlgoliaIndex(this.options.algoliaIndex) : null
|
275
|
+
this.options.algoliaKey ? this.settingsStore.updateAlgoliaKey(this.options.algoliaKey) : null
|
276
|
+
this.options.algoliaId ? this.settingsStore.updateAlgoliaId(this.options.algoliaId) : null
|
277
|
+
this.options.pennsieveApi ? this.settingsStore.updatePennsieveApi(this.options.pennsieveApi) : null
|
278
|
+
this.options.flatmapAPI ? this.settingsStore.updateFlatmapAPI(this.options.flatmapAPI) : null,
|
279
|
+
this.options.nlLinkPrefix ? this.settingsStore.updateNLLinkPrefix(this.options.nlLinkPrefix) : null
|
280
|
+
this.options.rootUrl ? this.settingsStore.updateRootUrl(this.options.rootUrl) : null
|
281
|
+
}
|
282
|
+
},
|
283
|
+
mounted: async function() {
|
284
|
+
EventBus.on("updateShareLinkRequested", () => {
|
285
|
+
/**
|
286
|
+
* This event emits when the share link is requested.
|
287
|
+
*/
|
288
|
+
this.$emit("updateShareLinkRequested");
|
289
|
+
});
|
290
|
+
if (!this.state) {
|
291
|
+
this.initialState = await initialState(this.startingMap, this.options.sparcApi);
|
292
|
+
}
|
293
|
+
this.isReady = true;
|
294
|
+
}
|
295
|
+
}
|
296
|
+
|
297
|
+
</script>
|
298
|
+
|
299
|
+
<style scoped lang="scss">
|
300
|
+
|
301
|
+
:deep(.el-loading-spinner) {
|
302
|
+
.path {
|
303
|
+
stroke: $app-primary-color;
|
304
|
+
}
|
305
|
+
.el-loading-text {
|
306
|
+
color: $app-primary-color;
|
307
|
+
}
|
308
|
+
}
|
309
|
+
|
310
|
+
.map-help-dialog {
|
311
|
+
position: fixed;
|
312
|
+
z-index: 20;
|
313
|
+
bottom: 30px;
|
314
|
+
right: 30px;
|
315
|
+
}
|
316
|
+
|
317
|
+
.mapcontent {
|
318
|
+
height: 100%;
|
319
|
+
width:100%;
|
320
|
+
z-index:1;
|
321
|
+
}
|
322
|
+
|
323
|
+
</style>
|
324
|
+
|
325
|
+
<style lang="scss">
|
326
|
+
|
327
|
+
.mapcontent {
|
328
|
+
--el-color-primary: #8300BF;
|
329
|
+
--el-color-primary-light-7: #dab3ec;
|
330
|
+
--el-color-primary-light-8: #e6ccf2;
|
331
|
+
--el-color-primary-light-9: #f3e6f9;
|
332
|
+
}
|
333
|
+
|
286
334
|
</style>
|