@abi-software/map-side-bar 2.5.3-beta.1 → 2.5.3-beta.10

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abi-software/map-side-bar",
3
- "version": "2.5.3-beta.1",
3
+ "version": "2.5.3-beta.10",
4
4
  "files": [
5
5
  "dist/*",
6
6
  "src/*",
@@ -39,7 +39,7 @@
39
39
  },
40
40
  "dependencies": {
41
41
  "@abi-software/gallery": "^1.1.2",
42
- "@abi-software/map-utilities": "^1.2.1",
42
+ "@abi-software/map-utilities": "^1.2.2-beta.2",
43
43
  "@abi-software/svg-sprite": "^1.0.1",
44
44
  "@element-plus/icons-vue": "^2.3.1",
45
45
  "algoliasearch": "^4.10.5",
@@ -81,7 +81,7 @@
81
81
  </div>
82
82
  </div>
83
83
 
84
- <div class="content-container content-container-connectivity" v-if="activeView === 'listView'">
84
+ <div class="content-container content-container-connectivity" v-show="activeView === 'listView'">
85
85
  {{ entry.paths }}
86
86
  <div v-if="entry.origins && entry.origins.length > 0" class="block">
87
87
  <div class="attribute-title-container">
@@ -209,13 +209,15 @@
209
209
  </div>
210
210
  </div>
211
211
 
212
- <div class="content-container" v-if="activeView === 'graphView'">
213
- <connectivity-graph
214
- :entry="entry.featureId[0]"
215
- :mapServer="envVars.FLATMAPAPI_LOCATION"
216
- @tap-node="onTapNode"
217
- ref="connectivityGraphRef"
218
- />
212
+ <div class="content-container" v-show="activeView === 'graphView'">
213
+ <template v-if="graphViewLoaded">
214
+ <connectivity-graph
215
+ :entry="entry.featureId[0]"
216
+ :mapServer="envVars.FLATMAPAPI_LOCATION"
217
+ @tap-node="onTapNode"
218
+ ref="connectivityGraphRef"
219
+ />
220
+ </template>
219
221
  </div>
220
222
  </div>
221
223
  </template>
@@ -304,6 +306,7 @@ export default {
304
306
  uberons: [{ id: undefined, name: undefined }],
305
307
  connectivityError: null,
306
308
  timeoutID: undefined,
309
+ graphViewLoaded: false,
307
310
  }
308
311
  },
309
312
  watch: {
@@ -406,13 +409,11 @@ export default {
406
409
  switchConnectivityView: function (val) {
407
410
  this.activeView = val;
408
411
 
409
- if (val === 'graphView') {
410
- const connectivityGraphRef = this.$refs.connectivityGraphRef;
411
- if (connectivityGraphRef && connectivityGraphRef.$el) {
412
- connectivityGraphRef.$el.scrollIntoView({
413
- behavior: 'smooth',
414
- });
415
- }
412
+ if (val === 'graphView' && !this.graphViewLoaded) {
413
+ // to load the connectivity graph only after the container is in view
414
+ this.$nextTick(() => {
415
+ this.graphViewLoaded = true;
416
+ });
416
417
  }
417
418
  },
418
419
  onTapNode: function (data) {
@@ -168,6 +168,7 @@ export default {
168
168
  showFiltersText: true,
169
169
  cascadeSelected: [],
170
170
  cascadeSelectedWithBoolean: [],
171
+ filterTimeout: null,
171
172
  numberShown: 10,
172
173
  filters: [],
173
174
  facets: ['Species', 'Gender', 'Organ', 'Datasets'],
@@ -477,10 +478,18 @@ export default {
477
478
  filters = [];
478
479
  }
479
480
 
481
+ // timeout: add delay for filter checkboxes
482
+ if (this.filterTimeout) {
483
+ clearTimeout(this.filterTimeout);
484
+ }
485
+
480
486
  this.$emit('loading', true) // let sidebarcontent wait for the requests
481
- this.$emit('filterResults', filters) // emit filters for apps above sidebar
482
487
  this.setCascader(filterKeys) //update our cascader v-model if we modified the event
483
- this.cssMods() // update css for the cascader
488
+
489
+ this.filterTimeout = setTimeout(() => {
490
+ this.$emit('filterResults', filters) // emit filters for apps above sidebar
491
+ this.cssMods() // update css for the cascader
492
+ }, 400);
484
493
  }
485
494
  },
486
495
  //this fucntion is needed as we previously stored booleans in the array of event that
@@ -1008,6 +1017,8 @@ export default {
1008
1017
 
1009
1018
  .sidebar-cascader-popper .el-checkbox__input.is-checked .el-checkbox__inner,
1010
1019
  .el-checkbox__input.is-indeterminate .el-checkbox__inner {
1020
+ --el-checkbox-checked-bg-color: #{$app-primary-color};
1021
+ --el-checkbox-checked-input-border-color: #{$app-primary-color};
1011
1022
  background-color: $app-primary-color;
1012
1023
  border-color: $app-primary-color;
1013
1024
  }
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <div class="history-container" v-if="searchHistory.length">
3
3
  <div class="saved-search-history" v-if="savedSearchHistory.length">
4
- <template v-for="(item, i) in savedSearchHistory">
4
+ <template v-for="(item, i) in savedSearchHistory" :key="item.id">
5
5
  <el-tag
6
6
  class="search-tag"
7
7
  v-if="i < 2"
@@ -13,6 +13,8 @@
13
13
  <el-popover
14
14
  width="auto"
15
15
  trigger="hover"
16
+ :show-after="200"
17
+ :persistent="false"
16
18
  popper-class="popover-dropdown"
17
19
  >
18
20
  <template #reference>
@@ -30,7 +32,7 @@
30
32
  <div v-else>
31
33
  <span class="empty-saved-search">No Saved Searches</span>
32
34
  </div>
33
- <el-dropdown trigger="click" :max-height="350" :hide-on-click="false">
35
+ <el-dropdown trigger="click" :hide-on-click="false">
34
36
  <span class="el-dropdown-select">
35
37
  Search history
36
38
  <el-icon class="el-icon--right">
@@ -39,22 +41,28 @@
39
41
  </span>
40
42
  <template #dropdown>
41
43
  <el-dropdown-menu>
42
- <el-dropdown-item v-for="(item, i) in searchHistory">
44
+ <el-dropdown-item v-for="item in searchHistory" :key="item.id">
43
45
  <div>
44
46
  <template v-if="item.longLabel">
45
47
  <el-popover
46
48
  width="auto"
47
49
  trigger="hover"
50
+ :show-after="200"
51
+ :persistent="false"
48
52
  popper-class="popover-dropdown"
49
53
  >
50
54
  <template #reference>
51
- {{ item.label }}
55
+ <span class="dropdown-clickable-item" @click="search(item)">
56
+ {{ item.label }}
57
+ </span>
52
58
  </template>
53
59
  {{ item.longLabel }}
54
60
  </el-popover>
55
61
  </template>
56
62
  <template v-else>
57
- {{ item.label }}
63
+ <span class="dropdown-clickable-item" @click="search(item)">
64
+ {{ item.label }}
65
+ </span>
58
66
  </template>
59
67
  </div>
60
68
  <div>
@@ -62,7 +70,8 @@
62
70
  width="auto"
63
71
  trigger="hover"
64
72
  :teleported="true"
65
- :show-after="100"
73
+ :show-after="200"
74
+ :persistent="false"
66
75
  popper-class="popover-dropdown"
67
76
  >
68
77
  <template #reference>
@@ -71,8 +80,20 @@
71
80
  :disabled="savedSearchHistory.length > 1 && !item.saved"
72
81
  >
73
82
  <el-icon color="#8300BF">
74
- <el-icon-star-filled v-if="item.saved" />
75
- <el-icon-star v-else />
83
+ <template v-if="item.saved">
84
+ <svg
85
+ viewBox="0 0 24 24"
86
+ >
87
+ <path d="m12 21.35-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54z"></path>
88
+ </svg>
89
+ </template>
90
+ <template v-else>
91
+ <svg
92
+ viewBox="0 0 24 24"
93
+ >
94
+ <path d="M16.5 3c-1.74 0-3.41.81-4.5 2.09C10.91 3.81 9.24 3 7.5 3 4.42 3 2 5.42 2 8.5c0 3.78 3.4 6.86 8.55 11.54L12 21.35l1.45-1.32C18.6 15.36 22 12.28 22 8.5 22 5.42 19.58 3 16.5 3m-4.4 15.55-.1.1-.1-.1C7.14 14.24 4 11.39 4 8.5 4 6.5 5.5 5 7.5 5c1.54 0 3.04.99 3.57 2.36h1.87C13.46 5.99 14.96 5 16.5 5c2 0 3.5 1.5 3.5 3.5 0 2.89-3.14 5.74-7.9 10.05"></path>
95
+ </svg>
96
+ </template>
76
97
  </el-icon>
77
98
  </el-button>
78
99
  </template>
@@ -90,11 +111,14 @@
90
111
  width="auto"
91
112
  trigger="hover"
92
113
  :teleported="true"
93
- :show-after="100"
114
+ :show-after="200"
115
+ :persistent="false"
94
116
  popper-class="popover-dropdown"
95
117
  >
96
118
  <template #reference>
97
- <el-button circle text size="small" @click="removeFromSavedSearch(item)">
119
+ <el-button circle text size="small"
120
+ @click="removeFromSavedSearch(item)"
121
+ >
98
122
  <el-icon color="#8300BF">
99
123
  <el-icon-delete />
100
124
  </el-icon>
@@ -117,12 +141,14 @@
117
141
  import {
118
142
  ElTag as Tag,
119
143
  ElSelect as Select,
120
- ElDropdown as Dropdown,
121
- ElIcon as Icon,
144
+ ElDropdown,
145
+ ElIcon,
122
146
  } from 'element-plus'
123
147
 
124
148
  import EventBus from './EventBus.js'
125
149
 
150
+ const MAX_SEARCH_HISTORY = 12;
151
+
126
152
  function generateUUID() {
127
153
  const arr = new Uint8Array(16);
128
154
  window.crypto.getRandomValues(arr);
@@ -171,13 +197,50 @@ export default {
171
197
  localStorage.removeItem('sparc.science-sidebar-search-history')
172
198
  this.searchHistory = []
173
199
  },
200
+ sortFilters(a, b) {
201
+ return a.facetPropPath.localeCompare(b.facetPropPath);
202
+ },
203
+ // Sort by saved and updated
204
+ sortSearchHistory(a, b) {
205
+ if (a.saved !== b.saved) {
206
+ return b.saved - a.saved;
207
+ }
208
+ if (a.updated !== b.updated) {
209
+ return b.updated - a.updated;
210
+ }
211
+ return 0;
212
+ },
213
+ formatFilters(filterItem) {
214
+ // because filters do not work correctly with facet2
215
+ if (filterItem.facet2) {
216
+ filterItem.facet = filterItem.facet2;
217
+ delete filterItem.facet2;
218
+ }
219
+ return filterItem;
220
+ },
174
221
  addSearchToHistory(filters = [], search = '') {
175
222
  search = search.trim() // remove whitespace
176
223
 
177
- const isExistingItem = this.searchHistory.some((item) => (
178
- item.search === search &&
179
- JSON.stringify(item.filters) === JSON.stringify(filters)
180
- ));
224
+ const isExistingItem = this.searchHistory.some((item) => {
225
+ let historyFilters = item.filters;
226
+ let newFilters = filters;
227
+
228
+ // make all filters same format
229
+ historyFilters.forEach((filter) => this.formatFilters(filter));
230
+ newFilters.forEach((filter) => this.formatFilters(filter));
231
+
232
+ // sort filters (to check duplicates in string format)
233
+ historyFilters = historyFilters.sort(this.sortFilters);
234
+ newFilters = newFilters.sort(this.sortFilters);
235
+
236
+ const historyFiltersString = JSON.stringify(historyFilters);
237
+ const newFiltersString = JSON.stringify(newFilters);
238
+
239
+ return (
240
+ item.search === search &&
241
+ historyFiltersString === newFiltersString
242
+ );
243
+ });
181
244
 
182
245
  if (!isExistingItem) {
183
246
  const {label, longLabel} = this.searchHistoryItemLabel(search, filters);
@@ -193,6 +256,11 @@ export default {
193
256
 
194
257
  this.searchHistory.push(newItem);
195
258
 
259
+ this.searchHistory = this.searchHistory.sort(this.sortSearchHistory);
260
+
261
+ // trim search history to 12 items
262
+ this.trimSearchHistory();
263
+
196
264
  // Save new data
197
265
  localStorage.setItem(
198
266
  'sparc.science-sidebar-search-history',
@@ -200,35 +268,91 @@ export default {
200
268
  );
201
269
  }
202
270
  },
271
+ /**
272
+ * Remove the duplicate items in search history.
273
+ */
274
+ removeDuplicateSearchHistory: function () {
275
+ const keys = [];
276
+ const duplicateItemIDs = [];
277
+
278
+ this.searchHistory.forEach((item) => {
279
+ const key = `${item.search}-${JSON.stringify(item.filters)}`;
280
+ const existingItem = keys.find(k => k.key === key);
281
+ // duplicate item
282
+ if (existingItem) {
283
+ // if current item is saved item
284
+ // add the other item into duplicates
285
+ if (item.saved) {
286
+ duplicateItemIDs.push(existingItem.id);
287
+ } else {
288
+ duplicateItemIDs.push(item.id);
289
+ }
290
+ } else {
291
+ keys.push({
292
+ id: item.id,
293
+ key: key
294
+ });
295
+ }
296
+ });
297
+
298
+ if (duplicateItemIDs.length) {
299
+ this.searchHistory = this.searchHistory.filter((item) => !duplicateItemIDs.includes(item.id));
300
+ }
301
+ },
302
+ /**
303
+ * Function to trim search history to maximum items,
304
+ */
305
+ trimSearchHistory: function () {
306
+ // since saved has max 2
307
+ // remove extra from unsaved
308
+ if (this.searchHistory.length > MAX_SEARCH_HISTORY) {
309
+ const savedItems = this.searchHistory.filter((item) => item.saved);
310
+ const unsavedItems = this.searchHistory.filter((item) => !item.saved);
311
+ const extra = MAX_SEARCH_HISTORY - this.searchHistory.length;
312
+
313
+ this.searchHistory = [
314
+ ...savedItems,
315
+ ...unsavedItems.slice(0, extra),
316
+ ];
317
+ }
318
+ },
203
319
  updateSearchHistory: function () {
204
320
  // Update for missing attributes
205
321
  this.searchHistory.forEach((item) => {
206
322
  if (!item.id) {
207
323
  item['id'] = generateUUID();
208
324
  }
325
+
209
326
  if (!item.label) {
210
327
  const {label, longLabel} = this.searchHistoryItemLabel(item.search, item.filters);
211
328
  item['label'] = label;
212
329
  item['longLabel'] = longLabel;
213
330
  }
331
+
332
+ // make all filters same format
333
+ item.filters.forEach((filter) =>
334
+ this.formatFilters(filter)
335
+ );
336
+
337
+ // sort filters (to check duplicates in string format)
338
+ item.filters = item.filters.sort(this.sortFilters);
339
+
214
340
  if (!item.saved) {
215
341
  item['saved'] = false;
216
342
  }
343
+
217
344
  if (!item.updated) {
218
345
  item['updated'] = (new Date()).getTime();
219
346
  }
220
347
  });
221
348
 
222
- // Sort by saved and updated
223
- this.searchHistory = this.searchHistory.sort((a, b) => {
224
- if (a.saved !== b.saved) {
225
- return b.saved - a.saved;
226
- }
227
- if (a.updated !== b.updated) {
228
- return a.updated - b.updated;
229
- }
230
- return 0;
231
- });
349
+ this.searchHistory = this.searchHistory.sort(this.sortSearchHistory);
350
+
351
+ // check and remove duplicates
352
+ this.removeDuplicateSearchHistory();
353
+
354
+ // trim search history to 12 items
355
+ this.trimSearchHistory();
232
356
 
233
357
  // Save updated data
234
358
  localStorage.setItem(
@@ -315,7 +439,7 @@ export default {
315
439
 
316
440
  .search-tag.el-tag {
317
441
  margin: 0;
318
- cursor: pointer;
442
+ cursor: pointer !important;
319
443
  background: #f9f2fc!important;
320
444
  border-color: $app-primary-color!important;
321
445
  color:$app-primary-color!important;
@@ -324,6 +448,7 @@ export default {
324
448
  max-width: 15ch;
325
449
  overflow: hidden;
326
450
  text-overflow: ellipsis;
451
+ line-height: 24px;
327
452
  }
328
453
  }
329
454
 
@@ -351,7 +476,6 @@ export default {
351
476
  transition: var(--el-transition-duration);
352
477
  transform: translateZ(0);
353
478
  box-shadow: 0 0 0 1px var(--el-border-color) inset;
354
- cursor: pointer;
355
479
  }
356
480
 
357
481
  .el-dropdown-select {
@@ -385,6 +509,14 @@ export default {
385
509
  overflow: hidden;
386
510
  }
387
511
 
512
+ .dropdown-clickable-item {
513
+ cursor: pointer;
514
+
515
+ &:hover {
516
+ color: $app-primary-color;
517
+ }
518
+ }
519
+
388
520
  + .el-dropdown-menu__item {
389
521
  &::before {
390
522
  content: "";
@@ -399,8 +531,8 @@ export default {
399
531
  &:hover,
400
532
  &:focus,
401
533
  &:active {
402
- color: inherit;
403
- background-color: var(--el-bg-color-page);
534
+ color: inherit !important;
535
+ background-color: var(--el-fill-color-light) !important;
404
536
  }
405
537
 
406
538
  i {
@@ -410,7 +542,7 @@ export default {
410
542
  </style>
411
543
 
412
544
  <style lang="scss">
413
- .el-dropdown__popper {
545
+ .el-popper.el-dropdown__popper {
414
546
  font-family: Asap;
415
547
  font-size: 14px;
416
548
  font-weight: 400;
@@ -422,8 +554,38 @@ export default {
422
554
  min-width: 180px;
423
555
  width: fit-content;
424
556
 
425
- .el-button + .el-button {
426
- margin: 0;
557
+ .el-button {
558
+ background-color: transparent !important;
559
+ transition: all .25s ease;
560
+
561
+ > span {
562
+ pointer-events: none;
563
+ }
564
+
565
+ &:hover,
566
+ &:focus {
567
+ background-color: transparent !important;
568
+ box-shadow: none !important;
569
+ border: 0 none !important;
570
+ }
571
+
572
+ &:not([disabled]) {
573
+ &:hover,
574
+ &:focus {
575
+ background-color: #f3e6f9 !important;
576
+ }
577
+ }
578
+
579
+ + .el-button {
580
+ margin: 0;
581
+ }
582
+ }
583
+
584
+ // element plus's dropdown max-height has problem
585
+ .el-dropdown__list {
586
+ max-height: 350px;
587
+ overflow-y: auto;
588
+ scrollbar-width: thin;
427
589
  }
428
590
  }
429
591
 
@@ -433,6 +595,8 @@ export default {
433
595
  max-width: 240px;
434
596
  font-family: Asap;
435
597
  font-size: 12px;
598
+ word-break: break-word;
599
+ text-align: left;
436
600
  color: inherit;
437
601
  background: #f3ecf6 !important;
438
602
  border: 1px solid $app-primary-color;
@@ -173,7 +173,7 @@ export default {
173
173
  this.results = []
174
174
  this.loadingCards = false
175
175
  },
176
- openSearch: function (filter, search = '') {
176
+ openSearch: function (filter, search = '', option = { withSearch: true }) {
177
177
  this.searchInput = search
178
178
  this.resetPageNavigation()
179
179
  //Proceed normally if cascader is ready
@@ -192,14 +192,16 @@ export default {
192
192
  this.$refs.filtersRef.checkShowAllBoxes()
193
193
  this.resetSearch()
194
194
  } else if (this.filter) {
195
- this.searchAlgolia(this.filter, search)
195
+ if (option.withSearch) {
196
+ this.searchAlgolia(this.filter, search)
197
+ }
196
198
  this.$refs.filtersRef.setCascader(this.filter)
197
199
  }
198
200
  } else {
199
201
  //cascader is not ready, perform search if no filter is set,
200
202
  //otherwise waith for cascader to be ready
201
203
  this.filter = filter
202
- if (!filter || filter.length == 0) {
204
+ if ((!filter || filter.length == 0) && option.withSearch) {
203
205
  this.searchAlgolia(this.filter, search)
204
206
  }
205
207
  }
@@ -224,13 +226,12 @@ export default {
224
226
  this.openSearch(this.filter, this.searchInput)
225
227
  },
226
228
  clearSearchClicked: function () {
227
- this.searchInput = ''
228
- this.resetPageNavigation()
229
- this.searchAlgolia(this.filters, this.searchInput)
230
- this.$refs.searchHistory.selectValue = 'Search history'
229
+ this.searchInput = '';
230
+ this.searchAndFilterUpdate();
231
231
  },
232
232
  searchEvent: function (event = false) {
233
233
  if (event.keyCode === 13 || event instanceof MouseEvent) {
234
+ this.searchInput = this.searchInput.trim();
234
235
  this.searchAndFilterUpdate();
235
236
  }
236
237
  },
@@ -242,9 +243,23 @@ export default {
242
243
  type: 'filter-update',
243
244
  })
244
245
  },
246
+ /**
247
+ * Transform filters for third level items to perform search
248
+ * because cascader keeps adding it back.
249
+ */
250
+ transformFiltersBeforeSearch: function (filters) {
251
+ return filters.map((filter) => {
252
+ if (filter.facet2) {
253
+ filter.facet = filter.facet2;
254
+ delete filter.facet2;
255
+ }
256
+ return filter;
257
+ });
258
+ },
245
259
  searchAndFilterUpdate: function () {
246
260
  this.resetPageNavigation();
247
- this.searchAlgolia(this.filters, this.searchInput);
261
+ const transformedFilters = this.transformFiltersBeforeSearch(this.filters);
262
+ this.searchAlgolia(transformedFilters, this.searchInput);
248
263
  this.$refs.searchHistory.selectValue = 'Search history';
249
264
  // save history only if there has value
250
265
  if (this.filters.length || this.searchInput?.trim()) {
@@ -445,7 +460,9 @@ export default {
445
460
  searchHistorySearch: function (item) {
446
461
  this.searchInput = item.search
447
462
  this.filters = item.filters
448
- this.openSearch(item.filters, item.search)
463
+ this.searchAndFilterUpdate();
464
+ // withSearch: false to prevent algoliaSearch in openSearch
465
+ this.openSearch([...item.filters], item.search, { withSearch: false });
449
466
  },
450
467
  },
451
468
  mounted: function () {
@@ -493,6 +510,9 @@ export default {
493
510
  height: 100%;
494
511
  flex-flow: column;
495
512
  display: flex;
513
+ border: 0;
514
+ border-top-right-radius: 0;
515
+ border-bottom-right-radius: 0;
496
516
  }
497
517
 
498
518
  .step-item {
@@ -505,15 +525,16 @@ export default {
505
525
  width: 298px !important;
506
526
  height: 40px;
507
527
  padding-right: 14px;
508
- align-items: left;
528
+
529
+ :deep(.el-input__inner) {
530
+ font-family: inherit;
531
+ }
509
532
  }
510
533
 
511
534
  .header {
512
- border: solid 1px #292b66;
513
- background-color: #292b66;
514
- text-align: left;
515
-
516
535
  .el-button {
536
+ font-family: inherit;
537
+
517
538
  &:hover,
518
539
  &:focus {
519
540
  background: $app-primary-color;
@@ -566,6 +587,7 @@ export default {
566
587
  background-color: #ffffff;
567
588
  overflow-y: scroll;
568
589
  scrollbar-width: thin;
590
+ border-radius: var(--el-border-radius-base);
569
591
  }
570
592
 
571
593
  .content :deep(.el-loading-spinner .path) {
@@ -25,8 +25,6 @@ declare module 'vue' {
25
25
  ElIconArrowRight: typeof import('@element-plus/icons-vue')['ArrowRight']
26
26
  ElIconDelete: typeof import('@element-plus/icons-vue')['Delete']
27
27
  ElIconLocation: typeof import('@element-plus/icons-vue')['Location']
28
- ElIconStar: typeof import('@element-plus/icons-vue')['Star']
29
- ElIconStarFilled: typeof import('@element-plus/icons-vue')['StarFilled']
30
28
  ElIconWarning: typeof import('@element-plus/icons-vue')['Warning']
31
29
  ElIconWarnTriangleFilled: typeof import('@element-plus/icons-vue')['WarnTriangleFilled']
32
30
  ElInput: typeof import('element-plus/es')['ElInput']