mirror of
https://github.com/nagisa77/OpenIsle.git
synced 2026-08-19 09:40:58 +00:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6293f572d8 | |||
| 4a4c256568 | |||
| 3bb14ca6a3 | |||
| 4ed679c4f4 | |||
| 51819913a0 |
@@ -8,7 +8,12 @@
|
|||||||
:class="['base-tabs-item', { selected: modelValue === tab.key }]"
|
:class="['base-tabs-item', { selected: modelValue === tab.key }]"
|
||||||
@click="$emit('update:modelValue', tab.key)"
|
@click="$emit('update:modelValue', tab.key)"
|
||||||
>
|
>
|
||||||
<i v-if="tab.icon" :class="tab.icon"></i>
|
<component
|
||||||
|
v-if="tab.icon && (typeof tab.icon !== 'string' || !tab.icon.includes(' '))"
|
||||||
|
:is="tab.icon"
|
||||||
|
class="base-tabs-item-icon"
|
||||||
|
/>
|
||||||
|
<i v-else-if="tab.icon" :class="tab.icon"></i>
|
||||||
<div class="base-tabs-item-label">{{ tab.label }}</div>
|
<div class="base-tabs-item-label">{{ tab.label }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -72,6 +77,7 @@ function onTouchEnd(e) {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.base-tabs-item-icon,
|
||||||
.base-tabs-item i {
|
.base-tabs-item i {
|
||||||
margin-right: 6px;
|
margin-right: 6px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,12 @@
|
|||||||
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"
|
||||||
|
:size="16"
|
||||||
|
/>
|
||||||
<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 +44,12 @@
|
|||||||
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"
|
||||||
|
:size="16"
|
||||||
|
/>
|
||||||
<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 +57,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" />
|
||||||
</slot>
|
</slot>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
@@ -54,7 +66,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>
|
<search-icon class="search-icon" />
|
||||||
<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 +87,12 @@
|
|||||||
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"
|
||||||
|
:size="16"
|
||||||
|
/>
|
||||||
<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 +103,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>
|
<next class="back-icon" @click="close" />
|
||||||
<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>
|
<search-icon class="search-icon" />
|
||||||
<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 +129,12 @@
|
|||||||
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"
|
||||||
|
:size="16"
|
||||||
|
/>
|
||||||
<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 +273,10 @@ export default {
|
|||||||
return /^https?:\/\//.test(icon) || icon.startsWith('/')
|
return /^https?:\/\//.test(icon) || icon.startsWith('/')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const isIconComponent = (icon) => {
|
||||||
|
return typeof icon === 'string' && !icon.includes(' ')
|
||||||
|
}
|
||||||
|
|
||||||
expose({ toggle, close })
|
expose({ toggle, close })
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -263,6 +291,7 @@ export default {
|
|||||||
isSelected,
|
isSelected,
|
||||||
loading,
|
loading,
|
||||||
isImageIcon,
|
isImageIcon,
|
||||||
|
isIconComponent,
|
||||||
setSearch,
|
setSearch,
|
||||||
isMobile,
|
isMobile,
|
||||||
}
|
}
|
||||||
@@ -303,6 +332,10 @@ export default {
|
|||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dropdown-caret {
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
.selected-label {
|
.selected-label {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -326,6 +359,10 @@ export default {
|
|||||||
color: var(--text-color);
|
color: var(--text-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.search-icon {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
.dropdown-option {
|
.dropdown-option {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -376,6 +413,11 @@ export default {
|
|||||||
border-bottom: 1px solid var(--normal-border-color);
|
border-bottom: 1px solid var(--normal-border-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.back-icon {
|
||||||
|
transform: rotate(180deg);
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
.dropdown-mobile-menu {
|
.dropdown-mobile-menu {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
class="profile-page-header-subscribe-button"
|
class="profile-page-header-subscribe-button"
|
||||||
@click="subscribeUser"
|
@click="subscribeUser"
|
||||||
>
|
>
|
||||||
<i class="fas fa-user-plus"></i>
|
<add-user />
|
||||||
关注
|
关注
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
@@ -26,11 +26,11 @@
|
|||||||
class="profile-page-header-unsubscribe-button"
|
class="profile-page-header-unsubscribe-button"
|
||||||
@click="unsubscribeUser"
|
@click="unsubscribeUser"
|
||||||
>
|
>
|
||||||
<i class="fas fa-user-minus"></i>
|
<reduce-user />
|
||||||
取消关注
|
取消关注
|
||||||
</div>
|
</div>
|
||||||
<div v-if="!isMine" class="profile-page-header-subscribe-button" @click="sendMessage">
|
<div v-if="!isMine" class="profile-page-header-subscribe-button" @click="sendMessage">
|
||||||
<i class="fas fa-paper-plane"></i>
|
<message-one />
|
||||||
发私信
|
发私信
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
content="经验值可通过发帖、评论等操作获得,达到目标后即可提升等级,解锁更多功能。"
|
content="经验值可通过发帖、评论等操作获得,达到目标后即可提升等级,解锁更多功能。"
|
||||||
placement="bottom"
|
placement="bottom"
|
||||||
>
|
>
|
||||||
<i class="fas fa-info-circle profile-exp-info"></i>
|
<info class="profile-exp-info" />
|
||||||
</ToolTip>
|
</ToolTip>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -368,11 +368,11 @@ const selectedTab = ref(
|
|||||||
: 'summary',
|
: 'summary',
|
||||||
)
|
)
|
||||||
const tabs = [
|
const tabs = [
|
||||||
{ key: 'summary', label: '总结', icon: 'fas fa-chart-line' },
|
{ key: 'summary', label: '总结', icon: 'ChartLine' },
|
||||||
{ key: 'timeline', label: '时间线', icon: 'fas fa-clock' },
|
{ key: 'timeline', label: '时间线', icon: 'AlarmClock' },
|
||||||
{ key: 'following', label: '关注', icon: 'fas fa-user-plus' },
|
{ key: 'following', label: '关注', icon: 'AddUser' },
|
||||||
{ key: 'favorites', label: '收藏', icon: 'fas fa-bookmark' },
|
{ key: 'favorites', label: '收藏', icon: 'Bookmark' },
|
||||||
{ key: 'achievements', label: '勋章', icon: 'fas fa-medal' },
|
{ key: 'achievements', label: '勋章', icon: 'MedalOne' },
|
||||||
]
|
]
|
||||||
const followTab = ref('followers')
|
const followTab = ref('followers')
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,11 @@ import {
|
|||||||
Loading,
|
Loading,
|
||||||
Rss,
|
Rss,
|
||||||
MessageEmoji,
|
MessageEmoji,
|
||||||
|
AddUser,
|
||||||
|
ReduceUser,
|
||||||
|
MessageOne,
|
||||||
|
AlarmClock,
|
||||||
|
Bookmark,
|
||||||
} from '@icon-park/vue-next'
|
} from '@icon-park/vue-next'
|
||||||
|
|
||||||
export default defineNuxtPlugin((nuxtApp) => {
|
export default defineNuxtPlugin((nuxtApp) => {
|
||||||
@@ -65,4 +70,9 @@ export default defineNuxtPlugin((nuxtApp) => {
|
|||||||
nuxtApp.vueApp.component('Loading', Loading)
|
nuxtApp.vueApp.component('Loading', Loading)
|
||||||
nuxtApp.vueApp.component('Rss', Rss)
|
nuxtApp.vueApp.component('Rss', Rss)
|
||||||
nuxtApp.vueApp.component('MessageEmoji', MessageEmoji)
|
nuxtApp.vueApp.component('MessageEmoji', MessageEmoji)
|
||||||
|
nuxtApp.vueApp.component('AddUser', AddUser)
|
||||||
|
nuxtApp.vueApp.component('ReduceUser', ReduceUser)
|
||||||
|
nuxtApp.vueApp.component('MessageOne', MessageOne)
|
||||||
|
nuxtApp.vueApp.component('AlarmClock', AlarmClock)
|
||||||
|
nuxtApp.vueApp.component('Bookmark', Bookmark)
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user