Compare commits

...

1 Commits

Author SHA1 Message Date
Tim
bf169932b3 refactor: use iconpark in dropdown 2025-09-06 10:07:19 +08:00
2 changed files with 44 additions and 4 deletions

View File

@@ -19,6 +19,14 @@
class="option-icon" class="option-icon"
:alt="label.name" :alt="label.name"
/> />
<component
v-else-if="isIconComponent(label.icon)"
:is="label.icon"
class="option-icon"
theme="outline"
size="16"
fill="currentColor"
/>
<i v-else :class="['option-icon', label.icon]"></i> <i v-else :class="['option-icon', label.icon]"></i>
</template> </template>
<span>{{ label.name }}</span> <span>{{ label.name }}</span>
@@ -38,6 +46,14 @@
class="option-icon" class="option-icon"
:alt="selectedLabels[0].name" :alt="selectedLabels[0].name"
/> />
<component
v-else-if="isIconComponent(selectedLabels[0].icon)"
:is="selectedLabels[0].icon"
class="option-icon"
theme="outline"
size="16"
fill="currentColor"
/>
<i v-else :class="['option-icon', selectedLabels[0].icon]"></i> <i v-else :class="['option-icon', selectedLabels[0].icon]"></i>
</template> </template>
<span>{{ selectedLabels[0].name }}</span> <span>{{ selectedLabels[0].name }}</span>
@@ -45,7 +61,7 @@
</span> </span>
<span v-else class="placeholder">{{ placeholder }}</span> <span v-else class="placeholder">{{ placeholder }}</span>
</template> </template>
<i class="fas fa-caret-down dropdown-caret"></i> <Down class="dropdown-caret" theme="outline" size="16" fill="currentColor" />
</slot> </slot>
</div> </div>
<div <div
@@ -54,7 +70,7 @@
v-click-outside="close" v-click-outside="close"
> >
<div v-if="showSearch" class="dropdown-search"> <div v-if="showSearch" class="dropdown-search">
<i class="fas fa-search search-icon"></i> <SearchIcon class="search-icon" theme="outline" size="16" fill="currentColor" />
<input type="text" v-model="search" placeholder="搜索" /> <input type="text" v-model="search" placeholder="搜索" />
</div> </div>
<div v-if="loading" class="dropdown-loading"> <div v-if="loading" class="dropdown-loading">
@@ -75,6 +91,14 @@
class="option-icon" class="option-icon"
:alt="o.name" :alt="o.name"
/> />
<component
v-else-if="isIconComponent(o.icon)"
:is="o.icon"
class="option-icon"
theme="outline"
size="16"
fill="currentColor"
/>
<i v-else :class="['option-icon', o.icon]"></i> <i v-else :class="['option-icon', o.icon]"></i>
</template> </template>
<span>{{ o.name }}</span> <span>{{ o.name }}</span>
@@ -85,12 +109,12 @@
<Teleport to="body"> <Teleport to="body">
<div v-if="open && isMobile" class="dropdown-mobile-page"> <div v-if="open && isMobile" class="dropdown-mobile-page">
<div class="dropdown-mobile-header"> <div class="dropdown-mobile-header">
<i class="fas fa-arrow-left" @click="close"></i> <ArrowLeft @click="close" theme="outline" size="16" fill="currentColor" />
<span class="mobile-title">{{ placeholder }}</span> <span class="mobile-title">{{ placeholder }}</span>
</div> </div>
<div class="dropdown-mobile-menu"> <div class="dropdown-mobile-menu">
<div v-if="showSearch" class="dropdown-search"> <div v-if="showSearch" class="dropdown-search">
<i class="fas fa-search search-icon"></i> <SearchIcon class="search-icon" theme="outline" size="16" fill="currentColor" />
<input type="text" v-model="search" placeholder="搜索" /> <input type="text" v-model="search" placeholder="搜索" />
</div> </div>
<div v-if="loading" class="dropdown-loading"> <div v-if="loading" class="dropdown-loading">
@@ -111,6 +135,14 @@
class="option-icon" class="option-icon"
:alt="o.name" :alt="o.name"
/> />
<component
v-else-if="isIconComponent(o.icon)"
:is="o.icon"
class="option-icon"
theme="outline"
size="16"
fill="currentColor"
/>
<i v-else :class="['option-icon', o.icon]"></i> <i v-else :class="['option-icon', o.icon]"></i>
</template> </template>
<span>{{ o.name }}</span> <span>{{ o.name }}</span>
@@ -249,6 +281,11 @@ export default {
return /^https?:\/\//.test(icon) || icon.startsWith('/') return /^https?:\/\//.test(icon) || icon.startsWith('/')
} }
const isIconComponent = (icon) => {
if (!icon) return false
return !icon.includes(' ')
}
expose({ toggle, close }) expose({ toggle, close })
return { return {
@@ -263,6 +300,7 @@ export default {
isSelected, isSelected,
loading, loading,
isImageIcon, isImageIcon,
isIconComponent,
setSearch, setSearch,
isMobile, isMobile,
} }

View File

@@ -36,6 +36,7 @@ import {
MessageOne, MessageOne,
AlarmClock, AlarmClock,
Bookmark, Bookmark,
ArrowLeft,
} from '@icon-park/vue-next' } from '@icon-park/vue-next'
export default defineNuxtPlugin((nuxtApp) => { export default defineNuxtPlugin((nuxtApp) => {
@@ -75,4 +76,5 @@ export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.component('MessageOne', MessageOne) nuxtApp.vueApp.component('MessageOne', MessageOne)
nuxtApp.vueApp.component('AlarmClock', AlarmClock) nuxtApp.vueApp.component('AlarmClock', AlarmClock)
nuxtApp.vueApp.component('Bookmark', Bookmark) nuxtApp.vueApp.component('Bookmark', Bookmark)
nuxtApp.vueApp.component('ArrowLeft', ArrowLeft)
}) })